From 64c1dd2c1e962be5d800157a036c67236b0d6321 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 27 Feb 2014 17:11:17 -0500 Subject: [PATCH 001/310] CC-5701: Airtime File API Beginnings of fil rest api index, get, post actions working without authentication --- .../application/configs/application.ini | 3 + .../controllers/plugins/Acl_plugin.php | 7 + .../application/modules/rest/Bootstrap.php | 14 ++ .../rest/controllers/MediaController.php | 145 ++++++++++++++++++ .../rest/views/scripts/media/get.phtml | 0 .../rest/views/scripts/media/index.phtml | 0 .../rest/views/scripts/media/post.phtml | 0 7 files changed, 169 insertions(+) create mode 100644 airtime_mvc/application/modules/rest/Bootstrap.php create mode 100644 airtime_mvc/application/modules/rest/controllers/MediaController.php create mode 100644 airtime_mvc/application/modules/rest/views/scripts/media/get.phtml create mode 100644 airtime_mvc/application/modules/rest/views/scripts/media/index.phtml create mode 100644 airtime_mvc/application/modules/rest/views/scripts/media/post.phtml diff --git a/airtime_mvc/application/configs/application.ini b/airtime_mvc/application/configs/application.ini index c342ebda71..706beb2496 100644 --- a/airtime_mvc/application/configs/application.ini +++ b/airtime_mvc/application/configs/application.ini @@ -6,6 +6,9 @@ bootstrap.class = "Bootstrap" appnamespace = "Application" resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.params.displayExceptions = 0 +resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" +;load everything in the modules directory including models +resources.modules[] = "" resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" resources.view[] = resources.db.adapter = "Pdo_Pgsql" diff --git a/airtime_mvc/application/controllers/plugins/Acl_plugin.php b/airtime_mvc/application/controllers/plugins/Acl_plugin.php index 44555e5338..4cf9f97b5b 100644 --- a/airtime_mvc/application/controllers/plugins/Acl_plugin.php +++ b/airtime_mvc/application/controllers/plugins/Acl_plugin.php @@ -110,6 +110,13 @@ public function preDispatch(Zend_Controller_Request_Abstract $request) { $controller = strtolower($request->getControllerName()); + //Ignore authentication for all access to the rest API. We do auth via API keys for this + //and/or by OAuth. + if (strtolower($request->getModuleName()) == "rest") + { + return; + } + if (in_array($controller, array("api", "auth", "locale"))) { $this->setRoleName("G"); diff --git a/airtime_mvc/application/modules/rest/Bootstrap.php b/airtime_mvc/application/modules/rest/Bootstrap.php new file mode 100644 index 0000000000..904d05e4c4 --- /dev/null +++ b/airtime_mvc/application/modules/rest/Bootstrap.php @@ -0,0 +1,14 @@ +getRouter(); + + $restRoute = new Zend_Rest_Route($front, array(), array( + 'rest'=> array('media'))); + assert($router->addRoute('rest', $restRoute)); + } +} \ No newline at end of file diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php new file mode 100644 index 0000000000..e2759bd2ef --- /dev/null +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -0,0 +1,145 @@ +view->layout()->disableLayout(); + } + + public function indexAction() + { + if (!$this->verifyApiKey()) { + return; + } + $this->getResponse() + ->setHttpResponseCode(200) + ->appendBody(json_encode(CcFilesQuery::create()->find()->toArray())); + } + public function getAction() + { + if (!$this->verifyApiKey()) { + return; + } + $id = $this->getId(); + if (!$id) { + return; + } + + $file = CcFilesQuery::create()->findPk($id); + if ($file) { + $this->getResponse() + ->setHttpResponseCode(200) + ->appendBody(json_encode($file->toArray())); + } else { + $this->fileNotFoundResponse(); + } + } + + public function postAction() + { + if (!$this->verifyApiKey()) { + return; + } + //If we do get an ID on a POST, then that doesn't make any sense + //since POST is only for creating. + if ($id = $this->_getParam('id', false)) { + $resp = $this->getResponse(); + $resp->setHttpResponseCode(400); + $resp->appendBody("ERROR: ID should not be specified when using POST. POST is only used for show creation, and an ID will be chosen by Airtime"); + return; + } + + $file = new CcFiles(); + $file->fromArray($this->getRequest()->getPost()); + $file->save(); + + $resp = $this->getResponse(); + $resp->setHttpResponseCode(201); + $resp->appendBody(json_encode($file->toArray())); + } + + public function putAction() + { + if (!$this->verifyApiKey()) { + return; + } + $id = $this->getId(); + if (!$id) { + return; + } + + $file = CcFilesQuery::create()->findPk($id); + if ($show) + { + $show->importFrom('JSON', $this->getRequest()->getRawBody()); + $show->save(); + $this->getResponse() + ->appendBody("From putAction() updating the requested show"); + } else { + $this->showNotFoundResponse(); + } + } + + public function deleteAction() + { + if (!$this->verifyApiKey()) { + return; + } + $id = $this->getId(); + if (!$id) { + return; + } + $show = CcShowQuery::create()->$query->findPk($id); + if ($show) { + $show->delete(); + } else { + $this->showNotFoundResponse(); + } + } + + private function getId() + { + if (!$id = $this->_getParam('id', false)) { + $resp = $this->getResponse(); + $resp->setHttpResponseCode(400); + $resp->appendBody("ERROR: No show ID specified."); + return false; + } + return $id; + } + + private function verifyAPIKey() + { + //The API key is passed in via HTTP "basic authentication": + // http://en.wikipedia.org/wiki/Basic_access_authentication + + //TODO: Fetch the user's API key from the database to check against + $unencodedStoredApiKey = "foobar"; + $encodedStoredApiKey = base64_encode($unencodedStoredApiKey . ":"); + + //Decode the API key that was passed to us in the HTTP request. + $authHeader = $this->getRequest()->getHeader("Authorization"); + $encodedRequestApiKey = substr($authHeader, strlen("Basic ")); + + //if ($encodedRequestApiKey === $encodedStoredApiKey) + if (true) + { + return true; + } + else + { + $resp = $this->getResponse(); + $resp->setHttpResponseCode(401); + $resp->appendBody("ERROR: Incorrect API key."); + return false; + } + } + + private function fileNotFoundResponse() + { + $resp = $this->getResponse(); + $resp->setHttpResponseCode(404); + $resp->appendBody("ERROR: Show not found."); + } +} \ No newline at end of file diff --git a/airtime_mvc/application/modules/rest/views/scripts/media/get.phtml b/airtime_mvc/application/modules/rest/views/scripts/media/get.phtml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/airtime_mvc/application/modules/rest/views/scripts/media/index.phtml b/airtime_mvc/application/modules/rest/views/scripts/media/index.phtml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/airtime_mvc/application/modules/rest/views/scripts/media/post.phtml b/airtime_mvc/application/modules/rest/views/scripts/media/post.phtml new file mode 100644 index 0000000000..e69de29bb2 From aba2fb44d14ab0df412093ba4e6c5ff29a370a50 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 3 Mar 2014 11:21:25 -0500 Subject: [PATCH 002/310] CC-5701: Airtime File API -put and delete actions working --- .../application/configs/application.ini | 1 + .../rest/controllers/MediaController.php | 33 ++++++++++--------- .../rest/views/scripts/media/delete.phtml | 0 .../rest/views/scripts/media/put.phtml | 0 4 files changed, 19 insertions(+), 15 deletions(-) create mode 100644 airtime_mvc/application/modules/rest/views/scripts/media/delete.phtml create mode 100644 airtime_mvc/application/modules/rest/views/scripts/media/put.phtml diff --git a/airtime_mvc/application/configs/application.ini b/airtime_mvc/application/configs/application.ini index 706beb2496..71bcd5c46e 100644 --- a/airtime_mvc/application/configs/application.ini +++ b/airtime_mvc/application/configs/application.ini @@ -7,6 +7,7 @@ appnamespace = "Application" resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.params.displayExceptions = 0 resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" +resources.frontController.plugins.putHandler = "Zend_Controller_Plugin_PutHandler" ;load everything in the modules directory including models resources.modules[] = "" resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index e2759bd2ef..6c59e1c55a 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -54,11 +54,11 @@ public function postAction() $file->fromArray($this->getRequest()->getPost()); $file->save(); - $resp = $this->getResponse(); - $resp->setHttpResponseCode(201); - $resp->appendBody(json_encode($file->toArray())); + $this->getResponse() + ->setHttpResponseCode(201) + ->appendBody(json_encode($file->toArray())); } - + public function putAction() { if (!$this->verifyApiKey()) { @@ -70,17 +70,18 @@ public function putAction() } $file = CcFilesQuery::create()->findPk($id); - if ($show) + if ($file) { - $show->importFrom('JSON', $this->getRequest()->getRawBody()); - $show->save(); + $file->fromArray(json_decode($this->getRequest()->getRawBody(), true)); + $file->save(); $this->getResponse() - ->appendBody("From putAction() updating the requested show"); + ->setHttpResponseCode(200) + ->appendBody(json_encode($file->toArray())); } else { - $this->showNotFoundResponse(); + $this->fileNotFoundResponse(); } } - + public function deleteAction() { if (!$this->verifyApiKey()) { @@ -90,11 +91,13 @@ public function deleteAction() if (!$id) { return; } - $show = CcShowQuery::create()->$query->findPk($id); - if ($show) { - $show->delete(); + $file = CcFilesQuery::create()->findPk($id); + if ($file) { + $file->delete(); + $this->getResponse() + ->setHttpResponseCode(200); } else { - $this->showNotFoundResponse(); + $this->fileNotFoundResponse(); } } @@ -140,6 +143,6 @@ private function fileNotFoundResponse() { $resp = $this->getResponse(); $resp->setHttpResponseCode(404); - $resp->appendBody("ERROR: Show not found."); + $resp->appendBody("ERROR: Media not found."); } } \ No newline at end of file diff --git a/airtime_mvc/application/modules/rest/views/scripts/media/delete.phtml b/airtime_mvc/application/modules/rest/views/scripts/media/delete.phtml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/airtime_mvc/application/modules/rest/views/scripts/media/put.phtml b/airtime_mvc/application/modules/rest/views/scripts/media/put.phtml new file mode 100644 index 0000000000..e69de29bb2 From f33f49259dc484980afcf6ac8ec291f75438745f Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 3 Mar 2014 11:28:18 -0500 Subject: [PATCH 003/310] CC-5701: Airtime File API Fixed http response code for delete --- .../application/modules/rest/controllers/MediaController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 6c59e1c55a..304e113659 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -95,7 +95,7 @@ public function deleteAction() if ($file) { $file->delete(); $this->getResponse() - ->setHttpResponseCode(200); + ->setHttpResponseCode(204); } else { $this->fileNotFoundResponse(); } From b6dd2e31527216f7ac382789d245336c1e7c900f Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 3 Mar 2014 16:04:34 -0500 Subject: [PATCH 004/310] CC-5701: Airtime File API --- .../rest/controllers/MediaController.php | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 304e113659..14eb7c9b47 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -106,7 +106,7 @@ private function getId() if (!$id = $this->_getParam('id', false)) { $resp = $this->getResponse(); $resp->setHttpResponseCode(400); - $resp->appendBody("ERROR: No show ID specified."); + $resp->appendBody("ERROR: No file ID specified."); return false; } return $id; @@ -115,23 +115,15 @@ private function getId() private function verifyAPIKey() { //The API key is passed in via HTTP "basic authentication": - // http://en.wikipedia.org/wiki/Basic_access_authentication + // http://en.wikipedia.org/wiki/Basic_access_authentication - //TODO: Fetch the user's API key from the database to check against - $unencodedStoredApiKey = "foobar"; - $encodedStoredApiKey = base64_encode($unencodedStoredApiKey . ":"); + $CC_CONFIG = Config::getConfig(); - //Decode the API key that was passed to us in the HTTP request. $authHeader = $this->getRequest()->getHeader("Authorization"); - $encodedRequestApiKey = substr($authHeader, strlen("Basic ")); - //if ($encodedRequestApiKey === $encodedStoredApiKey) - if (true) - { + if (in_array($authHeader, $CC_CONFIG["apiKey"])) { return true; - } - else - { + } else { $resp = $this->getResponse(); $resp->setHttpResponseCode(401); $resp->appendBody("ERROR: Incorrect API key."); From a6a64a2b9e7f91b324221f0ade19b702dd270784 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 5 Mar 2014 12:15:25 -0500 Subject: [PATCH 005/310] CC-5709 / CC-5705 : Airtime Analyzer * Finished the skeleton of the airtime_analyzer service. * Basic round-robin, reliable AMQP messaging works. * Using multiprocess arch so the daemon survives analyzer crashes and avoids failures propagating to other nodes. * Basic metadata extractor using Mutagen is done. * HTTP requests to the File API to are next to come... --- python_apps/airtime_analyzer/MANIFEST.in | 1 + python_apps/airtime_analyzer/README.rst | 30 ++++++ .../airtime_analyzer/__init__.py | 2 + .../airtime_analyzer/airtime_analyzer.py | 41 +++++++ .../airtime_analyzer/analyzer.py | 10 ++ .../airtime_analyzer/analyzer_pipeline.py | 17 +++ .../airtime_analyzer/message_listener.py | 102 ++++++++++++++++++ .../airtime_analyzer/metadata_analyzer.py | 95 ++++++++++++++++ .../airtime_analyzer/replaygain_analyzer.py | 12 +++ .../airtime_analyzer/bin/airtime_analyzer | 21 ++++ python_apps/airtime_analyzer/setup.py | 20 ++++ .../airtime_analyzer/tests/__init__.py | 0 .../tests/airtime_analyzer_queue_tests.py | 12 +++ .../airtime_analyzer/tools/message_sender.php | 47 ++++++++ .../airtime_analyzer/tools/php-amqplib | 1 + 15 files changed, 411 insertions(+) create mode 100644 python_apps/airtime_analyzer/MANIFEST.in create mode 100644 python_apps/airtime_analyzer/README.rst create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/__init__.py create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/analyzer.py create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/message_listener.py create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py create mode 100755 python_apps/airtime_analyzer/bin/airtime_analyzer create mode 100644 python_apps/airtime_analyzer/setup.py create mode 100644 python_apps/airtime_analyzer/tests/__init__.py create mode 100644 python_apps/airtime_analyzer/tests/airtime_analyzer_queue_tests.py create mode 100644 python_apps/airtime_analyzer/tools/message_sender.php create mode 120000 python_apps/airtime_analyzer/tools/php-amqplib diff --git a/python_apps/airtime_analyzer/MANIFEST.in b/python_apps/airtime_analyzer/MANIFEST.in new file mode 100644 index 0000000000..9561fb1061 --- /dev/null +++ b/python_apps/airtime_analyzer/MANIFEST.in @@ -0,0 +1 @@ +include README.rst diff --git a/python_apps/airtime_analyzer/README.rst b/python_apps/airtime_analyzer/README.rst new file mode 100644 index 0000000000..a7704a2a50 --- /dev/null +++ b/python_apps/airtime_analyzer/README.rst @@ -0,0 +1,30 @@ + +Ghetto temporary installation instructions + +set up a virtualenv +activate it +pip install mutagen python-magic pika + +You will need to allow the "airtime" RabbitMQ user to access the airtime-uploads exchange and queue: + + sudo rabbitmqctl set_permissions -p /airtime airtime airtime-uploads airtime-uploads airtime-uploads + + +Developers +========== + +For development, you want to install AAQ system-wide but with everything symlinked back to the source +directory (for convenience), so run: + + $ sudo python setup.py develop + + + +Unit Tests +========== + +To run the unit tests, execute: + + $ nosetests + + diff --git a/python_apps/airtime_analyzer/airtime_analyzer/__init__.py b/python_apps/airtime_analyzer/airtime_analyzer/__init__.py new file mode 100644 index 0000000000..11fe8aa916 --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/__init__.py @@ -0,0 +1,2 @@ +from airtime_analyzer import AirtimeAnalyzerServer + diff --git a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py new file mode 100644 index 0000000000..eea4622b7c --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py @@ -0,0 +1,41 @@ +import ConfigParser +from metadata_analyzer import MetadataAnalyzer +from replaygain_analyzer import ReplayGainAnalyzer +from message_listener import MessageListener + + +class AirtimeAnalyzerServer: + + _CONFIG_PATH = '/etc/airtime/airtime.conf' + + def __init__(self): + + # Read our config file + rabbitmq_config = self.read_config_file() + + # Start listening for RabbitMQ messages telling us about newly + # uploaded files. + self._msg_listener = MessageListener(rabbitmq_config) + + def read_config_file(self): + config = ConfigParser.SafeConfigParser() + config_path = AirtimeAnalyzerServer._CONFIG_PATH + try: + config.readfp(open(config_path)) + except IOError as e: + print "Failed to open config file at " + config_path + ": " + e.strerror + exit(-1) + except Exception: + print e.strerror + exit(-1) + + return config + + +''' When being run from the command line, analyze a file passed + as an argument. ''' +if __name__ == "__main__": + import sys + analyzers = AnalyzerPipeline() + + diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py new file mode 100644 index 0000000000..de23a8e689 --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py @@ -0,0 +1,10 @@ + +class Analyzer: + + @staticmethod + def analyze(filename): + raise NotImplementedError + +class AnalyzerError(Exception): + def __init__(self): + super.__init__(self) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py new file mode 100644 index 0000000000..da3fbbc71d --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -0,0 +1,17 @@ +from metadata_analyzer import MetadataAnalyzer + +class AnalyzerPipeline: + + def __init__(self): + pass + + #TODO: Take a JSON message and perform the necessary analysis. + #TODO: Comment the shit out of this + @staticmethod + def run_analysis(json_msg, queue): + # TODO: Pass the JSON along to each analyzer?? + #print MetadataAnalyzer.analyze("foo.mp3") + #print ReplayGainAnalyzer.analyze("foo.mp3") + #raise Exception("Test Crash") + queue.put(MetadataAnalyzer.analyze("foo.mp3")) + diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py new file mode 100644 index 0000000000..e256fd7cca --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -0,0 +1,102 @@ +import sys +import pika +import multiprocessing +from analyzer_pipeline import AnalyzerPipeline + +EXCHANGE = "airtime-uploads" +EXCHANGE_TYPE = "topic" +ROUTING_KEY = "" #"airtime.analyzer.tasks" +QUEUE = "airtime-uploads" + + +''' TODO: Document me + - round robin messaging + - acking + - why we use the multiprocess architecture +''' +class MessageListener: + + def __init__(self, config): + + RMQ_CONFIG_SECTION = "rabbitmq" + if not config.has_section(RMQ_CONFIG_SECTION): + print "Error: rabbitmq section not found in config file at " + config_path + exit(-1) + + self._host = config.get(RMQ_CONFIG_SECTION, 'host') + self._port = config.getint(RMQ_CONFIG_SECTION, 'port') + self._username = config.get(RMQ_CONFIG_SECTION, 'user') + self._password = config.get(RMQ_CONFIG_SECTION, 'password') + self._vhost = config.get(RMQ_CONFIG_SECTION, 'vhost') + + self._connection = pika.BlockingConnection(pika.ConnectionParameters(host=self._host, + port=self._port, virtual_host=self._vhost, + credentials=pika.credentials.PlainCredentials(self._username, self._password))) + self._channel = self._connection.channel() + self._channel.exchange_declare(exchange=EXCHANGE, type=EXCHANGE_TYPE) + result = self._channel.queue_declare(queue=QUEUE, durable=True) + + self._channel.queue_bind(exchange=EXCHANGE, queue=QUEUE, routing_key=ROUTING_KEY) + + print " Listening for messages..." + self._channel.basic_consume(MessageListener.msg_received_callback, + queue=QUEUE, no_ack=False) + + try: + self._channel.start_consuming() + except KeyboardInterrupt: + self._channel.stop_consuming() + + self._connection.close() + + # consume callback function + @staticmethod + def msg_received_callback(channel, method_frame, header_frame, body): + print " - Received '%s' on routing_key '%s'" % (body, method_frame.routing_key) + + # Spin up a worker process. We use the multiprocessing module and multiprocessing.Queue + # to pass objects between the processes so that if the analyzer process crashes, it does not + # take down the rest of the daemon and we NACK that message so that it doesn't get + # propagated to other airtime_analyzer daemons (eg. running on other servers). + # We avoid cascading failure this way. + try: + MessageListener.spawn_analyzer_process(body) + except Exception: + #If ANY exception happens while processing a file, we're going to NACK to the + #messaging server and tell it to remove the message from the queue. + #(NACK is a negative acknowledgement. We could use ACK instead, but this might come + # in handy in the future.) + #Exceptions in this context are unexpected, unhandled errors. We try to recover + #from as many errors as possble in AnalyzerPipeline, but we're safeguarding ourselves + #here from any catastrophic or genuinely unexpected errors: + channel.basic_nack(delivery_tag=method_frame.delivery_tag, multiple=False, + requeue=False) #Important that it doesn't requeue the message + + #TODO: Report this as a failed upload to the File Upload REST API. + # + # + + else: + # ACK at the very end, after the message has been successfully processed. + # If we don't ack, then RabbitMQ will redeliver a message in the future. + channel.basic_ack(delivery_tag=method_frame.delivery_tag) + + # Anything else could happen here: + # Send an email alert, send an xmnp message, trigger another process, etc + + @staticmethod + def spawn_analyzer_process(json_msg): + + q = multiprocessing.Queue() + p = multiprocessing.Process(target=AnalyzerPipeline.run_analysis, args=(json_msg, q)) + p.start() + p.join() + if p.exitcode == 0: + results = q.get() + print "Server received results: " + print results + else: + print "Analyzer process terminated unexpectedly." + raise AnalyzerException() + + diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py new file mode 100644 index 0000000000..af7d81745a --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -0,0 +1,95 @@ +import mutagen +import magic # For MIME type detection +from analyzer import Analyzer + +class MetadataAnalyzer(Analyzer): + + def __init__(self): + pass + + @staticmethod + def analyze(filename): + + metadata = dict() + #Extract metadata from an audio file using mutagen + audio_file = mutagen.File(filename, easy=True) + + #Grab other file information that isn't encoded in a tag, but instead usually + #in the file header. Mutagen breaks that out into a separate "info" object: + info = audio_file.info + metadata["sample_rate"] = info.sample_rate + metadata["length_seconds"] = info.length + metadata["bitrate"] = info.bitrate + + #Use the python-magic module to get the MIME type. + mime_magic = magic.Magic(mime=True) + metadata["mime_type"] = mime_magic.from_file(filename) + + #We normalize the mutagen tags slightly here, so in case mutagen changes, + #we find the + mutagen_to_analyzer_mapping = { + 'title': 'title', + 'artist': 'artist', + 'album': 'album', + 'bpm': 'bpm', + 'composer': 'composer', + 'conductor': 'conductor', + 'copyright': 'copyright', + 'encoded_by': 'encoder', + 'genre': 'genre', + 'isrc': 'isrc', + 'label': 'label', + 'language': 'language', + 'last_modified':'last_modified', + 'mood': 'mood', + 'replay_gain': 'replaygain', + 'track_number': 'tracknumber', + 'track_total': 'tracktotal', + 'website': 'website', + 'year': 'year', + } + + for mutagen_tag, analyzer_tag in mutagen_to_analyzer_mapping.iteritems(): + try: + metadata[analyzer_tag] = audio_file[mutagen_tag] + + # Some tags are returned as lists because there could be multiple values. + # This is unusual so we're going to always just take the first item in the list. + if isinstance(metadata[analyzer_tag], list): + metadata[analyzer_tag] = metadata[analyzer_tag][0] + + except KeyError: + pass + + return metadata + + + +''' +For reference, the Airtime metadata fields are: + title + artist ("Creator" in Airtime) + album + bit rate + BPM + composer + conductor + copyright + cue in + cue out + encoded by + genre + ISRC + label + language + last modified + length + mime + mood + owner + replay gain + sample rate + track number + website + year +''' diff --git a/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py new file mode 100644 index 0000000000..cf10c0a44b --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py @@ -0,0 +1,12 @@ +from analyzer import Analyzer + +''' TODO: everything ''' +class ReplayGainAnalyzer(Analyzer): + + def __init__(self): + pass + + @staticmethod + def analyze(filename): + pass + diff --git a/python_apps/airtime_analyzer/bin/airtime_analyzer b/python_apps/airtime_analyzer/bin/airtime_analyzer new file mode 100755 index 0000000000..3b163ec490 --- /dev/null +++ b/python_apps/airtime_analyzer/bin/airtime_analyzer @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +import daemon +import argparse +import airtime_analyzer as aa + +VERSION = "1.0" + +print "Airtime Analyzer " + VERSION + +parser = argparse.ArgumentParser() +parser.add_argument("-d", "--daemon", help="run as a daemon", action="store_true") +args = parser.parse_args() + +if args.daemon: + with daemon.DaemonContext(): + analyzer = aa.AirtimeAnalyzerServer() +else: + # Run without daemonizing + analyzer = aa.AirtimeAnalyzerServer() + diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py new file mode 100644 index 0000000000..259696b8e4 --- /dev/null +++ b/python_apps/airtime_analyzer/setup.py @@ -0,0 +1,20 @@ +from setuptools import setup + +setup(name='airtime_analyzer', + version='0.1', + description='Airtime Analyzer Worker and File Importer', + url='http://github.com/sourcefabric/Airtime', + author='Albert Santoni', + author_email='albert.santoni@sourcefabric.org', + license='MIT', + packages=['airtime_analyzer'], + scripts=['bin/airtime_analyzer'], + install_requires=[ + 'mutagen', + 'python-magic', + 'pika', + 'nose', + 'python-daemon', + 'requests', + ], + zip_safe=False) diff --git a/python_apps/airtime_analyzer/tests/__init__.py b/python_apps/airtime_analyzer/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/python_apps/airtime_analyzer/tests/airtime_analyzer_queue_tests.py b/python_apps/airtime_analyzer/tests/airtime_analyzer_queue_tests.py new file mode 100644 index 0000000000..949033a5c5 --- /dev/null +++ b/python_apps/airtime_analyzer/tests/airtime_analyzer_queue_tests.py @@ -0,0 +1,12 @@ +from nose.tools import * +import airtime_analyzer_queue + +def setup(): + print "SETUP!" + +def teardown(): + print "TEAR DOWN!" + +def test_basic(): + print "I RAN!" + diff --git a/python_apps/airtime_analyzer/tools/message_sender.php b/python_apps/airtime_analyzer/tools/message_sender.php new file mode 100644 index 0000000000..d5c9171c17 --- /dev/null +++ b/python_apps/airtime_analyzer/tools/message_sender.php @@ -0,0 +1,47 @@ +channel(); + +// declare/create the queue +$channel->queue_declare($queue, false, true, false, false); + +// declare/create the exchange as a topic exchange. +$channel->exchange_declare($exchange, $exchangeType, false, false, false); + +$msg = new AMQPMessage($message, array("content_type" => "text/plain")); + +$channel->basic_publish($msg, $exchange, $routingKey); +print "Sent $message ($routingKey)\n"; +$channel->close(); +$connection->close(); + diff --git a/python_apps/airtime_analyzer/tools/php-amqplib b/python_apps/airtime_analyzer/tools/php-amqplib new file mode 120000 index 0000000000..68ef0b2236 --- /dev/null +++ b/python_apps/airtime_analyzer/tools/php-amqplib @@ -0,0 +1 @@ +../../../airtime_mvc/library/php-amqplib \ No newline at end of file From 59535850e26c7429bf943edeae97874378c6dae2 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 5 Mar 2014 22:43:47 -0500 Subject: [PATCH 006/310] CC-5709: Airtime Analyzer Queue * Added StatusReporter class to make HTTP requests back to Airtime * Handle even more errors now * Added proper logging and log rotation * Added --debug flag for increased logging. --- python_apps/airtime_analyzer/README.rst | 40 +++++++-- .../airtime_analyzer/airtime_analyzer.py | 37 +++++++- .../airtime_analyzer/analyzer_pipeline.py | 28 ++++-- .../airtime_analyzer/message_listener.py | 88 +++++++++++++------ .../airtime_analyzer/status_reporter.py | 29 ++++++ .../airtime_analyzer/bin/airtime_analyzer | 5 +- ...eue_tests.py => airtime_analyzer_tests.py} | 2 +- 7 files changed, 184 insertions(+), 45 deletions(-) create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py rename python_apps/airtime_analyzer/tests/{airtime_analyzer_queue_tests.py => airtime_analyzer_tests.py} (82%) diff --git a/python_apps/airtime_analyzer/README.rst b/python_apps/airtime_analyzer/README.rst index a7704a2a50..00067d643c 100644 --- a/python_apps/airtime_analyzer/README.rst +++ b/python_apps/airtime_analyzer/README.rst @@ -1,23 +1,49 @@ Ghetto temporary installation instructions +========== + + $ sudo python setup.py install + +You will need to allow the "airtime" RabbitMQ user to access all exchanges and queues within the /airtime vhost: + + sudo rabbitmqctl set_permissions -p /airtime airtime .* .* .* + + +Usage +========== + +To print usage instructions, run: -set up a virtualenv -activate it -pip install mutagen python-magic pika + $ airtime_analyzer --help -You will need to allow the "airtime" RabbitMQ user to access the airtime-uploads exchange and queue: +This application can be run as a daemon by running: + + $ airtime_analyzer -d - sudo rabbitmqctl set_permissions -p /airtime airtime airtime-uploads airtime-uploads airtime-uploads Developers ========== -For development, you want to install AAQ system-wide but with everything symlinked back to the source -directory (for convenience), so run: +For development, you want to install airtime_analyzer system-wide but with everything symlinked back to the source +directory for convenience. This is super easy to do, just run: $ sudo python setup.py develop +To send an test message to airtime_analyzer, you can use the message_sender.php script in the tools directory. +For example, run: + + $ php tools/message_sender.php '{ "tmp_file_path" : "foo.mp3" }' + + +Logging +========= + +By default, logs are saved to: + + /var/log/airtime/airtime_analyzer.log + +This application takes care of rotating logs for you. Unit Tests diff --git a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py index eea4622b7c..1bc2e05347 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py @@ -1,4 +1,7 @@ import ConfigParser +import logging +import logging.handlers +import sys from metadata_analyzer import MetadataAnalyzer from replaygain_analyzer import ReplayGainAnalyzer from message_listener import MessageListener @@ -6,16 +9,46 @@ class AirtimeAnalyzerServer: + # Constants _CONFIG_PATH = '/etc/airtime/airtime.conf' + _LOG_PATH = "/var/log/airtime/airtime_analyzer.log" + + # Variables + _log_level = logging.INFO + + def __init__(self, debug=False): + + # Configure logging + self.setup_logging(debug) - def __init__(self): - # Read our config file rabbitmq_config = self.read_config_file() # Start listening for RabbitMQ messages telling us about newly # uploaded files. self._msg_listener = MessageListener(rabbitmq_config) + + + def setup_logging(self, debug): + + if debug: + self._log_level = logging.DEBUG + #self.log = logging.getLogger(__name__) + + # Set up logging + logFormatter = logging.Formatter("%(asctime)s [%(module)s] [%(levelname)-5.5s] %(message)s") + rootLogger = logging.getLogger() + rootLogger.setLevel(self._log_level) + + fileHandler = logging.handlers.RotatingFileHandler(filename=self._LOG_PATH, maxBytes=1024*1024*30, + backupCount=8) + fileHandler.setFormatter(logFormatter) + rootLogger.addHandler(fileHandler) + + consoleHandler = logging.StreamHandler() + consoleHandler.setFormatter(logFormatter) + rootLogger.addHandler(consoleHandler) + def read_config_file(self): config = ConfigParser.SafeConfigParser() diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index da3fbbc71d..94700913b5 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -1,17 +1,31 @@ +import logging +import multiprocessing from metadata_analyzer import MetadataAnalyzer class AnalyzerPipeline: + # Constructor def __init__(self): pass - #TODO: Take a JSON message and perform the necessary analysis. - #TODO: Comment the shit out of this + # Take message dictionary and perform the necessary analysis. @staticmethod - def run_analysis(json_msg, queue): - # TODO: Pass the JSON along to each analyzer?? - #print MetadataAnalyzer.analyze("foo.mp3") + def run_analysis(queue, audio_file_path, final_directory): + + if not isinstance(queue, multiprocessing.queues.Queue): + raise TypeError("queue must be a multiprocessing.Queue()") + if not isinstance(audio_file_path, unicode): + raise TypeError("audio_file_path must be a string. Was of type " + type(audio_file_path).__name__ + " instead.") + if not isinstance(final_directory, unicode): + raise TypeError("final_directory must be a string. Was of type " + type(final_directory).__name__ + " instead.") + + + # Analyze the audio file we were told to analyze: + # First, we extract the ID3 tags and other metadata: + queue.put(MetadataAnalyzer.analyze(audio_file_path)) + + # Note that the queue we're putting the results into is our interprocess communication + # back to the main process. + #print ReplayGainAnalyzer.analyze("foo.mp3") - #raise Exception("Test Crash") - queue.put(MetadataAnalyzer.analyze("foo.mp3")) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index e256fd7cca..13209dc7d8 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -1,7 +1,11 @@ import sys import pika +import json +import time +import logging import multiprocessing from analyzer_pipeline import AnalyzerPipeline +from status_reporter import StatusReporter EXCHANGE = "airtime-uploads" EXCHANGE_TYPE = "topic" @@ -13,22 +17,39 @@ - round robin messaging - acking - why we use the multiprocess architecture + - in general, how it works and why it works this way ''' class MessageListener: def __init__(self, config): + # Read the RabbitMQ connection settings from the config file + # The exceptions throw here by default give good error messages. RMQ_CONFIG_SECTION = "rabbitmq" - if not config.has_section(RMQ_CONFIG_SECTION): - print "Error: rabbitmq section not found in config file at " + config_path - exit(-1) - self._host = config.get(RMQ_CONFIG_SECTION, 'host') self._port = config.getint(RMQ_CONFIG_SECTION, 'port') self._username = config.get(RMQ_CONFIG_SECTION, 'user') self._password = config.get(RMQ_CONFIG_SECTION, 'password') self._vhost = config.get(RMQ_CONFIG_SECTION, 'vhost') + while True: + try: + self.connect_to_messaging_server() + self.wait_for_messages() + except KeyboardInterrupt: + self.disconnect_from_messaging_server() + break + except pika.exceptions.AMQPError as e: + logging.error("Connection to message queue failed. ") + logging.error(e) + logging.info("Retrying in 5 seconds...") + time.sleep(5) + + self._connection.close() + + + def connect_to_messaging_server(self): + self._connection = pika.BlockingConnection(pika.ConnectionParameters(host=self._host, port=self._port, virtual_host=self._vhost, credentials=pika.credentials.PlainCredentials(self._username, self._password))) @@ -38,21 +59,21 @@ def __init__(self, config): self._channel.queue_bind(exchange=EXCHANGE, queue=QUEUE, routing_key=ROUTING_KEY) - print " Listening for messages..." + logging.info(" Listening for messages...") self._channel.basic_consume(MessageListener.msg_received_callback, queue=QUEUE, no_ack=False) - try: - self._channel.start_consuming() - except KeyboardInterrupt: - self._channel.stop_consuming() + def wait_for_messages(self): + self._channel.start_consuming() + + def disconnect_from_messaging_server(self): + self._channel.stop_consuming() - self._connection.close() # consume callback function @staticmethod def msg_received_callback(channel, method_frame, header_frame, body): - print " - Received '%s' on routing_key '%s'" % (body, method_frame.routing_key) + logging.info(" - Received '%s' on routing_key '%s'" % (body, method_frame.routing_key)) # Spin up a worker process. We use the multiprocessing module and multiprocessing.Queue # to pass objects between the processes so that if the analyzer process crashes, it does not @@ -60,8 +81,22 @@ def msg_received_callback(channel, method_frame, header_frame, body): # propagated to other airtime_analyzer daemons (eg. running on other servers). # We avoid cascading failure this way. try: - MessageListener.spawn_analyzer_process(body) - except Exception: + msg_dict = json.loads(body) + audio_file_path = msg_dict["tmp_file_path"] + final_directory = msg_dict["final_directory"] + callback_url = msg_dict["callback_url"] + api_key = msg_dict["api_key"] + + audio_metadata = MessageListener.spawn_analyzer_process(audio_file_path, final_directory) + StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) + + except KeyError as e: + logging.exception("A mandatory airtime_analyzer message field was missing from the message.") + # See the huge comment about NACK below. + channel.basic_nack(delivery_tag=method_frame.delivery_tag, multiple=False, + requeue=False) #Important that it doesn't requeue the message + + except Exception as e: #If ANY exception happens while processing a file, we're going to NACK to the #messaging server and tell it to remove the message from the queue. #(NACK is a negative acknowledgement. We could use ACK instead, but this might come @@ -72,31 +107,32 @@ def msg_received_callback(channel, method_frame, header_frame, body): channel.basic_nack(delivery_tag=method_frame.delivery_tag, multiple=False, requeue=False) #Important that it doesn't requeue the message - #TODO: Report this as a failed upload to the File Upload REST API. - # + # TODO: Report this as a failed upload to the File Upload REST API. # + # TODO: If the JSON was invalid, then don't report to the REST API + + StatusReporter.report_failure_to_callback_url(callback_url, api_key, error_status=1, + reason=u'An error occurred while importing this file') + + logging.error(e) else: # ACK at the very end, after the message has been successfully processed. - # If we don't ack, then RabbitMQ will redeliver a message in the future. + # If we don't ack, then RabbitMQ will redeliver the message in the future. channel.basic_ack(delivery_tag=method_frame.delivery_tag) - - # Anything else could happen here: - # Send an email alert, send an xmnp message, trigger another process, etc @staticmethod - def spawn_analyzer_process(json_msg): + def spawn_analyzer_process(audio_file_path, final_directory): q = multiprocessing.Queue() - p = multiprocessing.Process(target=AnalyzerPipeline.run_analysis, args=(json_msg, q)) + p = multiprocessing.Process(target=AnalyzerPipeline.run_analysis, + args=(q, audio_file_path, final_directory)) p.start() p.join() if p.exitcode == 0: results = q.get() - print "Server received results: " - print results + logging.info("Main process received results from child: ") + logging.info(results) else: - print "Analyzer process terminated unexpectedly." - raise AnalyzerException() - + raise Exception("Analyzer process terminated unexpectedly.") diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py new file mode 100644 index 0000000000..c8664df08e --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -0,0 +1,29 @@ +import requests +import json +import logging + +class StatusReporter(): + + _HTTP_REQUEST_TIMEOUT = 30 + + # Report the extracted metadata and status of the successfully imported file + # to the callback URL (which should be the Airtime File Upload API) + @classmethod + def report_success_to_callback_url(self, callback_url, api_key, audio_metadata): + + # Encode the audio metadata as JSON and post it back to the callback_url + post_payload = json.dumps(audio_metadata) + r = requests.put(callback_url, data=post_payload, + auth=requests.auth.HTTPBasicAuth(api_key, ''), + timeout=StatusReporter._HTTP_REQUEST_TIMEOUT) + logging.debug("HTTP request returned status: " + str(r.status_code)) + logging.debug(r.text) # Log the response body + r.raise_for_status() # Raise an exception if there was an HTTP error code returned + + #TODO: Queue up failed requests and try them again later. + + @classmethod + def report_failure_to_callback_url(self, callback_url, api_key, error_status, reason): + # TODO: Make error_status is an int? + pass + diff --git a/python_apps/airtime_analyzer/bin/airtime_analyzer b/python_apps/airtime_analyzer/bin/airtime_analyzer index 3b163ec490..eb1902c2cd 100755 --- a/python_apps/airtime_analyzer/bin/airtime_analyzer +++ b/python_apps/airtime_analyzer/bin/airtime_analyzer @@ -10,12 +10,13 @@ print "Airtime Analyzer " + VERSION parser = argparse.ArgumentParser() parser.add_argument("-d", "--daemon", help="run as a daemon", action="store_true") +parser.add_argument("--debug", help="log full debugging output", action="store_true") args = parser.parse_args() if args.daemon: with daemon.DaemonContext(): - analyzer = aa.AirtimeAnalyzerServer() + analyzer = aa.AirtimeAnalyzerServer(debug=args.debug) else: # Run without daemonizing - analyzer = aa.AirtimeAnalyzerServer() + analyzer = aa.AirtimeAnalyzerServer(debug=args.debug) diff --git a/python_apps/airtime_analyzer/tests/airtime_analyzer_queue_tests.py b/python_apps/airtime_analyzer/tests/airtime_analyzer_tests.py similarity index 82% rename from python_apps/airtime_analyzer/tests/airtime_analyzer_queue_tests.py rename to python_apps/airtime_analyzer/tests/airtime_analyzer_tests.py index 949033a5c5..f893365892 100644 --- a/python_apps/airtime_analyzer/tests/airtime_analyzer_queue_tests.py +++ b/python_apps/airtime_analyzer/tests/airtime_analyzer_tests.py @@ -1,5 +1,5 @@ from nose.tools import * -import airtime_analyzer_queue +import airtime_analyzer def setup(): print "SETUP!" From 4e39fce7018f42aeb8c4e7caab8ff4176ccc7a4a Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 6 Mar 2014 16:55:20 -0500 Subject: [PATCH 007/310] CC-5709: Airtime Analyzer * Basic HTTP reporting back to the File API works (PUT) * Use the database table names as JSON field names. * Fixed result returning bug in message_listener.py * Fixed API key verification to adhere with the HTTP Basic Auth spec --- .../rest/controllers/MediaController.php | 19 +++++---- .../airtime_analyzer/message_listener.py | 2 + .../airtime_analyzer/metadata_analyzer.py | 39 +++++++++++++------ .../airtime_analyzer/status_reporter.py | 5 ++- 4 files changed, 45 insertions(+), 20 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 14eb7c9b47..d9adaa12c6 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -14,8 +14,9 @@ public function indexAction() } $this->getResponse() ->setHttpResponseCode(200) - ->appendBody(json_encode(CcFilesQuery::create()->find()->toArray())); + ->appendBody(json_encode(CcFilesQuery::create()->find()->toArray(/*BasePeer::TYPE_FIELDNAME*/))); } + public function getAction() { if (!$this->verifyApiKey()) { @@ -30,7 +31,7 @@ public function getAction() if ($file) { $this->getResponse() ->setHttpResponseCode(200) - ->appendBody(json_encode($file->toArray())); + ->appendBody(json_encode($file->toArray(BasePeer::TYPE_FIELDNAME))); } else { $this->fileNotFoundResponse(); } @@ -56,7 +57,7 @@ public function postAction() $this->getResponse() ->setHttpResponseCode(201) - ->appendBody(json_encode($file->toArray())); + ->appendBody(json_encode($file->toArray(BasePeer::TYPE_FIELDNAME))); } public function putAction() @@ -72,11 +73,11 @@ public function putAction() $file = CcFilesQuery::create()->findPk($id); if ($file) { - $file->fromArray(json_decode($this->getRequest()->getRawBody(), true)); + $file->fromArray(json_decode($this->getRequest()->getRawBody(), true), BasePeer::TYPE_FIELDNAME); $file->save(); $this->getResponse() ->setHttpResponseCode(200) - ->appendBody(json_encode($file->toArray())); + ->appendBody(json_encode($file->toArray(BasePeer::TYPE_FIELDNAME))); } else { $this->fileNotFoundResponse(); } @@ -119,9 +120,13 @@ private function verifyAPIKey() $CC_CONFIG = Config::getConfig(); + //Decode the API key that was passed to us in the HTTP request. $authHeader = $this->getRequest()->getHeader("Authorization"); - - if (in_array($authHeader, $CC_CONFIG["apiKey"])) { + $encodedRequestApiKey = substr($authHeader, strlen("Basic ")); + $encodedStoredApiKey = base64_encode($CC_CONFIG["apiKey"][0] . ":"); + + if ($encodedRequestApiKey === $encodedStoredApiKey) + { return true; } else { $resp = $this->getResponse(); diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 13209dc7d8..83a53f9386 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -136,3 +136,5 @@ def spawn_analyzer_process(audio_file_path, final_directory): else: raise Exception("Analyzer process terminated unexpectedly.") + return results + diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index af7d81745a..fd1b8b1119 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -19,18 +19,34 @@ def analyze(filename): info = audio_file.info metadata["sample_rate"] = info.sample_rate metadata["length_seconds"] = info.length - metadata["bitrate"] = info.bitrate + metadata["bit_rate"] = info.bitrate + #metadata["channels"] = info.channels #Use the python-magic module to get the MIME type. mime_magic = magic.Magic(mime=True) metadata["mime_type"] = mime_magic.from_file(filename) + #Try to get the number of channels if mutagen can... + try: + #Special handling for getting the # of channels from MP3s. It's in the "mode" field + #which is 0=Stereo, 1=Joint Stereo, 2=Dual Channel, 3=Mono. Part of the ID3 spec... + if metadata["mime_type"] == "audio/mpeg": + if info.mode == 3: + metadata["channels"] = 1 + else: + metadata["channels"] = 2 + else: + metadata["channels"] = info.channels + except (AttributeError, KeyError): + #If mutagen can't figure out the number of channels, we'll just leave it out... + pass + #We normalize the mutagen tags slightly here, so in case mutagen changes, #we find the - mutagen_to_analyzer_mapping = { - 'title': 'title', - 'artist': 'artist', - 'album': 'album', + mutagen_to_airtime_mapping = { + 'title': 'track_title', + 'artist': 'artist_name', + 'album': 'album_title', 'bpm': 'bpm', 'composer': 'composer', 'conductor': 'conductor', @@ -43,20 +59,21 @@ def analyze(filename): 'last_modified':'last_modified', 'mood': 'mood', 'replay_gain': 'replaygain', - 'track_number': 'tracknumber', - 'track_total': 'tracktotal', + 'track_number': 'track_number', + 'track_total': 'track_total', 'website': 'website', 'year': 'year', + 'mime_type': 'mime', } - for mutagen_tag, analyzer_tag in mutagen_to_analyzer_mapping.iteritems(): + for mutagen_tag, airtime_tag in mutagen_to_airtime_mapping.iteritems(): try: - metadata[analyzer_tag] = audio_file[mutagen_tag] + metadata[airtime_tag] = audio_file[mutagen_tag] # Some tags are returned as lists because there could be multiple values. # This is unusual so we're going to always just take the first item in the list. - if isinstance(metadata[analyzer_tag], list): - metadata[analyzer_tag] = metadata[analyzer_tag][0] + if isinstance(metadata[airtime_tag], list): + metadata[airtime_tag] = metadata[airtime_tag][0] except KeyError: pass diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index c8664df08e..acc8ba81a8 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -12,8 +12,9 @@ class StatusReporter(): def report_success_to_callback_url(self, callback_url, api_key, audio_metadata): # Encode the audio metadata as JSON and post it back to the callback_url - post_payload = json.dumps(audio_metadata) - r = requests.put(callback_url, data=post_payload, + put_payload = json.dumps(audio_metadata) + logging.debug("Sending HTTP PUT with payload: " + put_payload) + r = requests.put(callback_url, data=put_payload, auth=requests.auth.HTTPBasicAuth(api_key, ''), timeout=StatusReporter._HTTP_REQUEST_TIMEOUT) logging.debug("HTTP request returned status: " + str(r.status_code)) From c0818682afad0bccb4e80be079e88d2fe2d66a12 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 6 Mar 2014 17:38:57 -0500 Subject: [PATCH 008/310] CC-5709: Airtime Analyzer * Fixed the /rest/media endpoint --- .../modules/rest/controllers/MediaController.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index d9adaa12c6..fd626c7967 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -12,9 +12,22 @@ public function indexAction() if (!$this->verifyApiKey()) { return; } + + $files_array = []; + foreach (CcFilesQuery::create()->find() as $file) + { + array_push($files_array, $file->toArray(BasePeer::TYPE_FIELDNAME)); + } + + $this->getResponse() + ->setHttpResponseCode(200) + ->appendBody(json_encode($files_array)); + + /** TODO: Use this simpler code instead after we upgrade to Propel 1.7 (Airtime 2.6.x branch): $this->getResponse() ->setHttpResponseCode(200) - ->appendBody(json_encode(CcFilesQuery::create()->find()->toArray(/*BasePeer::TYPE_FIELDNAME*/))); + ->appendBody(json_encode(CcFilesQuery::create()->find()->toArray(BasePeer::TYPE_FIELDNAME))); + */ } public function getAction() From 6d7117f670a5463b8b865a6d45edd1eb678602a8 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 10 Mar 2014 16:32:23 -0400 Subject: [PATCH 009/310] CC-5709: Airtime Analyzer * Added MetadataAnalyzer unit tests and test data * Improved debug logging and squashed pika logging * Implemented file moving * Extract the track number/total * Fixed mapping of mutagen to Airtime fields in a few spots. The mapping matches the DB column names now. * Fixed the bin/airtime_analyzer binary * Started work on PluploadController to make it work with the new File API --- .../controllers/PluploadController.php | 16 ++- python_apps/airtime_analyzer/README.rst | 5 + .../airtime_analyzer/__init__.py | 1 - .../airtime_analyzer/airtime_analyzer.py | 5 + .../airtime_analyzer/analyzer_pipeline.py | 12 +- .../airtime_analyzer/message_listener.py | 1 + .../airtime_analyzer/metadata_analyzer.py | 21 +++- .../airtime_analyzer/bin/airtime_analyzer | 2 +- .../tests/airtime_analyzer_tests.py | 6 +- .../tests/analyzer_pipeline_tests.py | 24 ++++ .../tests/metadata_analyzer_tests.py | 112 ++++++++++++++++++ .../test_data/44100Hz-16bit-dualmono.mp3 | Bin 0 -> 63436 bytes .../test_data/44100Hz-16bit-jointstereo.mp3 | Bin 0 -> 63436 bytes .../tests/test_data/44100Hz-16bit-mono.mp3 | Bin 0 -> 32298 bytes .../tests/test_data/44100Hz-16bit-mono.ogg | Bin 0 -> 36326 bytes .../test_data/44100Hz-16bit-simplestereo.mp3 | Bin 0 -> 63436 bytes .../test_data/44100Hz-16bit-stereo-utf8.mp3 | Bin 0 -> 63436 bytes .../tests/test_data/44100Hz-16bit-stereo.m4a | Bin 0 -> 51972 bytes .../tests/test_data/44100Hz-16bit-stereo.mp3 | Bin 0 -> 63436 bytes .../tests/test_data/44100Hz-16bit-stereo.ogg | Bin 0 -> 41081 bytes 20 files changed, 194 insertions(+), 11 deletions(-) create mode 100644 python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py create mode 100644 python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py create mode 100644 python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-dualmono.mp3 create mode 100644 python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-jointstereo.mp3 create mode 100644 python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-mono.mp3 create mode 100644 python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-mono.ogg create mode 100644 python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-simplestereo.mp3 create mode 100644 python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-stereo-utf8.mp3 create mode 100644 python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-stereo.m4a create mode 100644 python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-stereo.mp3 create mode 100644 python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-stereo.ogg diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index 9698b163aa..3c4c1048cb 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -35,6 +35,20 @@ public function uploadAction() $this->_helper->json->sendJson(array("jsonrpc" => "2.0", "tempfilepath" => $tempFileName)); } + public function uploadFinishedAction() + { + $upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; + $filename = $this->_getParam('name'); + $tempname = $this->_getParam('tempname'); + $result = Application_Model_StoredFile::importUploadedFile($upload_dir, $filename, $tempname); + if (!is_null($result)) + $this->_helper->json->sendJson(array("jsonrpc" => "2.0", "error" => $result)); + + $this->_helper->json->sendJson(array("jsonrpc" => "2.0")); + + } + /* FIXME: I renamed this guy to uploadFinishedAction and am just starting to rewrite it to use the new File API. + * -- Albert March 10, 2014 public function copyfileAction() { $upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; @@ -46,5 +60,5 @@ public function copyfileAction() $this->_helper->json->sendJson(array("jsonrpc" => "2.0", "error" => $result)); $this->_helper->json->sendJson(array("jsonrpc" => "2.0")); - } + }*/ } diff --git a/python_apps/airtime_analyzer/README.rst b/python_apps/airtime_analyzer/README.rst index 00067d643c..18b6e5aafc 100644 --- a/python_apps/airtime_analyzer/README.rst +++ b/python_apps/airtime_analyzer/README.rst @@ -53,4 +53,9 @@ To run the unit tests, execute: $ nosetests +If you care about seeing console output (stdout), like when you're debugging or developing +a test, run: + + $ nosetests -s + diff --git a/python_apps/airtime_analyzer/airtime_analyzer/__init__.py b/python_apps/airtime_analyzer/airtime_analyzer/__init__.py index 11fe8aa916..8b13789179 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/__init__.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/__init__.py @@ -1,2 +1 @@ -from airtime_analyzer import AirtimeAnalyzerServer diff --git a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py index 1bc2e05347..9c6f746e1f 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py @@ -33,6 +33,11 @@ def setup_logging(self, debug): if debug: self._log_level = logging.DEBUG + else: + #Disable most pika/rabbitmq logging: + pika_logger = logging.getLogger('pika') + pika_logger.setLevel(logging.CRITICAL) + #self.log = logging.getLogger(__name__) # Set up logging diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 94700913b5..c4a4d18a32 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -1,5 +1,7 @@ import logging import multiprocessing +import shutil +import os from metadata_analyzer import MetadataAnalyzer class AnalyzerPipeline: @@ -15,9 +17,9 @@ def run_analysis(queue, audio_file_path, final_directory): if not isinstance(queue, multiprocessing.queues.Queue): raise TypeError("queue must be a multiprocessing.Queue()") if not isinstance(audio_file_path, unicode): - raise TypeError("audio_file_path must be a string. Was of type " + type(audio_file_path).__name__ + " instead.") + raise TypeError("audio_file_path must be unicode. Was of type " + type(audio_file_path).__name__ + " instead.") if not isinstance(final_directory, unicode): - raise TypeError("final_directory must be a string. Was of type " + type(final_directory).__name__ + " instead.") + raise TypeError("final_directory must be unicode. Was of type " + type(final_directory).__name__ + " instead.") # Analyze the audio file we were told to analyze: @@ -29,3 +31,9 @@ def run_analysis(queue, audio_file_path, final_directory): #print ReplayGainAnalyzer.analyze("foo.mp3") + final_audio_file_path = final_directory + os.sep + os.path.basename(audio_file_path) + if os.path.exists(final_audio_file_path) and not os.path.samefile(audio_file_path, final_audio_file_path): + os.remove(final_audio_file_path) + + shutil.move(audio_file_path, final_audio_file_path) + diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 83a53f9386..64b1b8ea95 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -91,6 +91,7 @@ def msg_received_callback(channel, method_frame, header_frame, body): StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) except KeyError as e: + # A field in msg_dict that we needed was missing (eg. audio_file_path) logging.exception("A mandatory airtime_analyzer message field was missing from the message.") # See the huge comment about NACK below. channel.basic_nack(delivery_tag=method_frame.delivery_tag, multiple=False, diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index fd1b8b1119..266ded2fa3 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -40,6 +40,20 @@ def analyze(filename): except (AttributeError, KeyError): #If mutagen can't figure out the number of channels, we'll just leave it out... pass + + #Try to extract the number of tracks on the album if we can (the "track total") + try: + track_number = audio_file["tracknumber"] + if isinstance(track_number, list): # Sometimes tracknumber is a list, ugh + track_number = track_number[0] + track_number_tokens = track_number.split(u'/') + track_number = track_number_tokens[0] + metadata["track_number"] = track_number + track_total = track_number_tokens[1] + metadata["track_total"] = track_total + except (AttributeError, KeyError, IndexError): + #If we couldn't figure out the track_number or track_total, just ignore it... + pass #We normalize the mutagen tags slightly here, so in case mutagen changes, #we find the @@ -51,6 +65,7 @@ def analyze(filename): 'composer': 'composer', 'conductor': 'conductor', 'copyright': 'copyright', + 'comment': 'comment', 'encoded_by': 'encoder', 'genre': 'genre', 'isrc': 'isrc', @@ -59,10 +74,10 @@ def analyze(filename): 'last_modified':'last_modified', 'mood': 'mood', 'replay_gain': 'replaygain', - 'track_number': 'track_number', - 'track_total': 'track_total', + #'tracknumber': 'track_number', + #'track_total': 'track_total', 'website': 'website', - 'year': 'year', + 'date': 'year', 'mime_type': 'mime', } diff --git a/python_apps/airtime_analyzer/bin/airtime_analyzer b/python_apps/airtime_analyzer/bin/airtime_analyzer index eb1902c2cd..b90f4c7d94 100755 --- a/python_apps/airtime_analyzer/bin/airtime_analyzer +++ b/python_apps/airtime_analyzer/bin/airtime_analyzer @@ -2,7 +2,7 @@ import daemon import argparse -import airtime_analyzer as aa +import airtime_analyzer.airtime_analyzer as aa VERSION = "1.0" diff --git a/python_apps/airtime_analyzer/tests/airtime_analyzer_tests.py b/python_apps/airtime_analyzer/tests/airtime_analyzer_tests.py index f893365892..928e02b318 100644 --- a/python_apps/airtime_analyzer/tests/airtime_analyzer_tests.py +++ b/python_apps/airtime_analyzer/tests/airtime_analyzer_tests.py @@ -2,11 +2,11 @@ import airtime_analyzer def setup(): - print "SETUP!" + pass def teardown(): - print "TEAR DOWN!" + pass def test_basic(): - print "I RAN!" + pass diff --git a/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py b/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py new file mode 100644 index 0000000000..4ac1e49ea8 --- /dev/null +++ b/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py @@ -0,0 +1,24 @@ +from nose.tools import * +import multiprocessing +from airtime_analyzer.analyzer_pipeline import AnalyzerPipeline + +DEFAULT_AUDIO_FILE = u'tests/test_data/44100Hz-16bit-mono.mp3' + +def setup(): + pass + +def teardown(): + pass + +def test_basic(): + q = multiprocessing.Queue() + AnalyzerPipeline.run_analysis(q, DEFAULT_AUDIO_FILE, u'.') + results = q.get() + assert results['track_title'] == u'Test Title' + assert results['artist_name'] == u'Test Artist' + assert results['album_title'] == u'Test Album' + assert results['year'] == u'1999' + assert results['genre'] == u'Test Genre' + assert results['mime_type'] == 'audio/mpeg' # Not unicode because MIMEs aren't. + assert results['length_seconds'] == 3.90925 + diff --git a/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py b/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py new file mode 100644 index 0000000000..1107c078a2 --- /dev/null +++ b/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- +from nose.tools import * +from airtime_analyzer.metadata_analyzer import MetadataAnalyzer + +def setup(): + pass + +def teardown(): + pass + +def check_default_metadata(metadata): + assert metadata['track_title'] == u'Test Title' + assert metadata['artist_name'] == u'Test Artist' + assert metadata['album_title'] == u'Test Album' + assert metadata['year'] == u'1999' + assert metadata['genre'] == u'Test Genre' + assert metadata['track_number'] == u'1' + +def test_mp3_mono(): + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-mono.mp3') + check_default_metadata(metadata) + assert metadata['channels'] == 1 + assert metadata['bit_rate'] == 64000 + assert metadata['length_seconds'] == 3.90925 + assert metadata['mime_type'] == 'audio/mpeg' # Not unicode because MIMEs aren't. + assert metadata['track_total'] == u'10' # MP3s can have a track_total + #Mutagen doesn't extract comments from mp3s it seems + +def test_mp3_jointstereo(): + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-jointstereo.mp3') + check_default_metadata(metadata) + assert metadata['channels'] == 2 + assert metadata['bit_rate'] == 128000 + assert metadata['length_seconds'] == 3.90075 + assert metadata['mime_type'] == 'audio/mpeg' + assert metadata['track_total'] == u'10' # MP3s can have a track_total + +def test_mp3_simplestereo(): + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-simplestereo.mp3') + check_default_metadata(metadata) + assert metadata['channels'] == 2 + assert metadata['bit_rate'] == 128000 + assert metadata['length_seconds'] == 3.90075 + assert metadata['mime_type'] == 'audio/mpeg' + assert metadata['track_total'] == u'10' # MP3s can have a track_total + +def test_mp3_dualmono(): + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-dualmono.mp3') + check_default_metadata(metadata) + assert metadata['channels'] == 2 + assert metadata['bit_rate'] == 128000 + assert metadata['length_seconds'] == 3.90075 + assert metadata['mime_type'] == 'audio/mpeg' + assert metadata['track_total'] == u'10' # MP3s can have a track_total + + +def test_ogg_mono(): + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-mono.ogg') + check_default_metadata(metadata) + assert metadata['channels'] == 1 + assert metadata['bit_rate'] == 80000 + assert metadata['length_seconds'] == 3.8394104308390022 + assert metadata['mime_type'] == 'application/ogg' + assert metadata['comment'] == u'Test Comment' + +def test_ogg_stereo(): + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.ogg') + check_default_metadata(metadata) + assert metadata['channels'] == 2 + assert metadata['bit_rate'] == 112000 + assert metadata['length_seconds'] == 3.8394104308390022 + assert metadata['mime_type'] == 'application/ogg' + assert metadata['comment'] == u'Test Comment' + +''' faac and avconv can't seem to create a proper mono AAC file... ugh +def test_aac_mono(): + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-mono.m4a') + print "Mono AAC metadata:" + print metadata + check_default_metadata(metadata) + assert metadata['channels'] == 1 + assert metadata['bit_rate'] == 80000 + assert metadata['length_seconds'] == 3.8394104308390022 + assert metadata['mime_type'] == 'video/mp4' + assert metadata['comment'] == u'Test Comment' +''' + +def test_aac_stereo(): + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.m4a') + check_default_metadata(metadata) + assert metadata['channels'] == 2 + assert metadata['bit_rate'] == 102619 + assert metadata['length_seconds'] == 3.8626303854875284 + assert metadata['mime_type'] == 'video/mp4' + assert metadata['comment'] == u'Test Comment' + +def test_mp3_utf8(): + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo-utf8.mp3') + # Using a bunch of different UTF-8 codepages here. Test data is from: + # http://winrus.com/utf8-jap.htm + assert metadata['track_title'] == u'アイウエオカキクケコサシスセソタï¾ï¾‚テ' + assert metadata['artist_name'] == u'ã¦ã™ã¨' + assert metadata['album_title'] == u'Ä ä Ãœ ü ß' + assert metadata['year'] == u'1999' + assert metadata['genre'] == u'Я Б Г Д Ж Й' + assert metadata['track_number'] == u'1' + assert metadata['channels'] == 2 + assert metadata['bit_rate'] == 128000 + assert metadata['length_seconds'] == 3.90075 + assert metadata['mime_type'] == 'audio/mpeg' + assert metadata['track_total'] == u'10' # MP3s can have a track_total + diff --git a/python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-dualmono.mp3 b/python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-dualmono.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1e98b616ea4ab4c7f04e8af3f8eadf0b419d7946 GIT binary patch literal 63436 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®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 X2=e|PIssy`va^pIxk^ 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 literal 0 HcmV?d00001 diff --git a/python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-mono.mp3 b/python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-mono.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0c12b1b3964caf58d8cff9c75e629d43895a999e GIT binary patch literal 32298 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 z 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 z zkswe?7megnO#)Z;)gdTGkadVJ6wzgkjKmR)zKLu}%0A)03{5GDf95`aS>|zTH>Ry$ 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 literal 0 HcmV?d00001 diff --git a/python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-stereo.mp3 b/python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-stereo.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..649dc371db7aad4f184becdf6bc598ff4b38ab4c GIT binary patch literal 63436 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 literal 0 HcmV?d00001 diff --git a/python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-stereo.ogg b/python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-stereo.ogg new file mode 100644 index 0000000000000000000000000000000000000000..83bd04f77196dd97b560d5f857eea6f42bb632bf GIT binary patch literal 41081 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 Qp>}0kOFk-&I0c*fKa})KQUCw| literal 0 HcmV?d00001 From e6cbbdff3388dd368c60ed70f7c689ee99f3cffa Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 13 Mar 2014 11:14:30 -0400 Subject: [PATCH 010/310] CC-5709: Airtime Analyzer * Added session auth to the Media API (if you're logged in) * Started reworking our Plupload interaction with the server to be less awkward. * Basic uploading works with the Add Media page again, but messages aren't dispatched to airtime_analyzer yet (coming next...) --- .../controllers/LoginController.php | 2 +- .../controllers/PluploadController.php | 4 +- airtime_mvc/application/models/RabbitMq.php | 8 ++++ .../rest/controllers/MediaController.php | 45 ++++++++++++++++--- .../public/js/airtime/library/plupload.js | 22 +++++---- 5 files changed, 64 insertions(+), 17 deletions(-) diff --git a/airtime_mvc/application/controllers/LoginController.php b/airtime_mvc/application/controllers/LoginController.php index 4c58a6b576..ee4ced5e4b 100644 --- a/airtime_mvc/application/controllers/LoginController.php +++ b/airtime_mvc/application/controllers/LoginController.php @@ -65,7 +65,7 @@ public function indexAction() Application_Model_LoginAttempts::resetAttempts($_SERVER['REMOTE_ADDR']); Application_Model_Subjects::resetLoginAttempts($username); - + $tempSess = new Zend_Session_Namespace("referrer"); $tempSess->referrer = 'login'; diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index 3c4c1048cb..c7f4f29d94 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -6,8 +6,8 @@ class PluploadController extends Zend_Controller_Action public function init() { $ajaxContext = $this->_helper->getHelper('AjaxContext'); - $ajaxContext->addActionContext('upload', 'json') - ->addActionContext('copyfile', 'json') + $ajaxContext->addActionContext('upload', 'json') + ->addActionContext('uploadFinished', 'json') ->initContext(); } diff --git a/airtime_mvc/application/models/RabbitMq.php b/airtime_mvc/application/models/RabbitMq.php index 371fab0b9d..d14d8249f5 100644 --- a/airtime_mvc/application/models/RabbitMq.php +++ b/airtime_mvc/application/models/RabbitMq.php @@ -76,4 +76,12 @@ public static function SendMessageToShowRecorder($event_type) self::sendMessage($exchange, $data); } + + public static function SendMessageToAnalyzer() + { + $exchange = 'airtime-uploads'; + //$data = json_encode($md); + //TODO: Finish me + //self::sendMessage($exchange, $data); + } } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index fd626c7967..83269de35e 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -9,7 +9,7 @@ public function init() public function indexAction() { - if (!$this->verifyApiKey()) { + if (!$this->verifyApiKey() && !$this->verifySession()) { return; } @@ -32,7 +32,7 @@ public function indexAction() public function getAction() { - if (!$this->verifyApiKey()) { + if (!$this->verifyApiKey() && !$this->verifySession()) { return; } $id = $this->getId(); @@ -42,6 +42,8 @@ public function getAction() $file = CcFilesQuery::create()->findPk($id); if ($file) { + //TODO: Strip or sanitize the JSON output + $this->getResponse() ->setHttpResponseCode(200) ->appendBody(json_encode($file->toArray(BasePeer::TYPE_FIELDNAME))); @@ -52,7 +54,7 @@ public function getAction() public function postAction() { - if (!$this->verifyApiKey()) { + if (!$this->verifyApiKey() && !$this->verifySession()) { return; } //If we do get an ID on a POST, then that doesn't make any sense @@ -60,10 +62,13 @@ public function postAction() if ($id = $this->_getParam('id', false)) { $resp = $this->getResponse(); $resp->setHttpResponseCode(400); - $resp->appendBody("ERROR: ID should not be specified when using POST. POST is only used for show creation, and an ID will be chosen by Airtime"); + $resp->appendBody("ERROR: ID should not be specified when using POST. POST is only used for file creation, and an ID will be chosen by Airtime"); return; } + $this->processUpload(); + + //TODO: Strip or sanitize the JSON output $file = new CcFiles(); $file->fromArray($this->getRequest()->getPost()); $file->save(); @@ -75,7 +80,7 @@ public function postAction() public function putAction() { - if (!$this->verifyApiKey()) { + if (!$this->verifyApiKey() && !$this->verifySession()) { return; } $id = $this->getId(); @@ -86,6 +91,8 @@ public function putAction() $file = CcFilesQuery::create()->findPk($id); if ($file) { + //TODO: Strip or sanitize the JSON output + $file->fromArray(json_decode($this->getRequest()->getRawBody(), true), BasePeer::TYPE_FIELDNAME); $file->save(); $this->getResponse() @@ -98,7 +105,7 @@ public function putAction() public function deleteAction() { - if (!$this->verifyApiKey()) { + if (!$this->verifyApiKey() && !$this->verifySession()) { return; } $id = $this->getId(); @@ -107,6 +114,8 @@ public function deleteAction() } $file = CcFilesQuery::create()->findPk($id); if ($file) { + $storedFile = Application_Model_StoredFile($file); + $storedFile->delete(); //TODO: This checks your session permissions... Make it work without a session? $file->delete(); $this->getResponse() ->setHttpResponseCode(204); @@ -148,6 +157,20 @@ private function verifyAPIKey() return false; } } + + private function verifySession() + { + $auth = Zend_Auth::getInstance(); + if ($auth->hasIdentity()) + { + return true; + } + + //Token checking stub code. We'd need to change LoginController.php to generate a token too, but + //but luckily all the token code already exists and works. + //$auth = new Application_Model_Auth(); + //$auth->checkToken(Application_Model_Preference::getUserId(), $token); + } private function fileNotFoundResponse() { @@ -155,4 +178,14 @@ private function fileNotFoundResponse() $resp->setHttpResponseCode(404); $resp->appendBody("ERROR: Media not found."); } + + private function processUpload() + { + $upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; + $tempFilePath = Application_Model_StoredFile::uploadFile($upload_dir); + $tempFileName = basename($tempFilePath); + + //TODO: Dispatch a message to airtime_analyzer through RabbitMQ! + + } } \ No newline at end of file diff --git a/airtime_mvc/public/js/airtime/library/plupload.js b/airtime_mvc/public/js/airtime/library/plupload.js index 2d76b33832..2b27166c49 100644 --- a/airtime_mvc/public/js/airtime/library/plupload.js +++ b/airtime_mvc/public/js/airtime/library/plupload.js @@ -5,8 +5,9 @@ $(document).ready(function() { $("#plupload_files").pluploadQueue({ // General settings runtimes : 'gears, html5, html4', - url : baseUrl+'Plupload/upload/format/json', - chunk_size : '5mb', + //url : baseUrl+'Plupload/upload/format/json', + url : baseUrl+'rest/media', + //chunk_size : '5mb', //Disabling chunking since we're using the File Upload REST API now unique_names : 'true', multiple_queues : 'true', filters : [ @@ -17,16 +18,21 @@ $(document).ready(function() { uploader = $("#plupload_files").pluploadQueue(); uploader.bind('FileUploaded', function(up, file, json) { + + /* var j = jQuery.parseJSON(json.response); - - if(j.error !== undefined) { + + console.log(json.response); + if (j.error !== undefined) { var row = $("") .append('' + file.name +'') .append('' + j.error.message + ''); - + $("#plupload_error").find("table").append(row); $("#plupload_error table").css("display", "inline-table"); - }else{ + } else { + //FIXME: This should just update something in the GUI, not communicate with the backend -- Albert + /* var tempFileName = j.tempfilepath; $.get(baseUrl+'Plupload/copyfile/format/json/name/'+ encodeURIComponent(file.name)+'/tempname/' + @@ -35,12 +41,12 @@ $(document).ready(function() { var row = $("") .append('' + file.name +'') .append('' + jr.error.message + ''); - + $("#plupload_error").find("table").append(row); $("#plupload_error table").css("display", "inline-table"); } }); - } + }*/ }); var uploadProgress = false; From f4ea417b83a5463e8136e71b4eae1fb82c9b9514 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 13 Mar 2014 12:12:12 -0400 Subject: [PATCH 011/310] CC-5709: Airtime Analyzer * Renamed a function in MediaController for clarity * Updated airtime_analyzer README --- .../application/modules/rest/controllers/MediaController.php | 4 ++-- python_apps/airtime_analyzer/README.rst | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 83269de35e..d7bd9132c5 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -66,7 +66,7 @@ public function postAction() return; } - $this->processUpload(); + $this->processUploadedFile(); //TODO: Strip or sanitize the JSON output $file = new CcFiles(); @@ -179,7 +179,7 @@ private function fileNotFoundResponse() $resp->appendBody("ERROR: Media not found."); } - private function processUpload() + private function processUploadedFile() { $upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; $tempFilePath = Application_Model_StoredFile::uploadFile($upload_dir); diff --git a/python_apps/airtime_analyzer/README.rst b/python_apps/airtime_analyzer/README.rst index 18b6e5aafc..ffd0c8ef8c 100644 --- a/python_apps/airtime_analyzer/README.rst +++ b/python_apps/airtime_analyzer/README.rst @@ -33,8 +33,7 @@ directory for convenience. This is super easy to do, just run: To send an test message to airtime_analyzer, you can use the message_sender.php script in the tools directory. For example, run: - $ php tools/message_sender.php '{ "tmp_file_path" : "foo.mp3" }' - + $ php tools/message_sender.php '{ "tmp_file_path" : "foo.mp3", "final_directory" : ".", "callback_url" : "http://airtime.localhost/rest/media/1", "api_key" : "YOUR_API_KEY" }' Logging ========= From 451b19150ba18efe5b5c8d402ffb56b231590161 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 13 Mar 2014 13:35:48 -0400 Subject: [PATCH 012/310] CC-5709: Airtime Analyzer * Notify airtime_analyzer of new uploads with RabbitMQ * Use a durable exchange for airtime-uploads --- airtime_mvc/application/models/RabbitMq.php | 24 ++++++++++++------- .../rest/controllers/MediaController.php | 17 ++++++++++--- .../airtime_analyzer/message_listener.py | 2 +- .../airtime_analyzer/tools/message_sender.php | 2 +- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/airtime_mvc/application/models/RabbitMq.php b/airtime_mvc/application/models/RabbitMq.php index d14d8249f5..a178fb5856 100644 --- a/airtime_mvc/application/models/RabbitMq.php +++ b/airtime_mvc/application/models/RabbitMq.php @@ -13,7 +13,7 @@ public static function PushSchedule() self::$doPush = true; } - private static function sendMessage($exchange, $data) + private static function sendMessage($exchange, $exchangeType, $autoDeleteExchange, $data, $queue="") { $CC_CONFIG = Config::getConfig(); @@ -31,7 +31,9 @@ private static function sendMessage($exchange, $data) $channel->access_request($CC_CONFIG["rabbitmq"]["vhost"], false, false, true, true); - $channel->exchange_declare($exchange, 'direct', false, true); + //I'm pretty sure we DON'T want to autodelete ANY exchanges but I'm keeping the code + //the way it is just so I don't accidentally break anything when I add the Analyzer code in. -- Albert, March 13, 2014 + $channel->exchange_declare($exchange, $exchangeType, false, true, $autoDeleteExchange); $msg = new AMQPMessage($data, array('content_type' => 'text/plain')); @@ -46,7 +48,7 @@ public static function SendMessageToPypo($event_type, $md) $exchange = 'airtime-pypo'; $data = json_encode($md, JSON_FORCE_OBJECT); - self::sendMessage($exchange, $data); + self::sendMessage($exchange, 'direct', true, $data); } public static function SendMessageToMediaMonitor($event_type, $md) @@ -55,7 +57,7 @@ public static function SendMessageToMediaMonitor($event_type, $md) $exchange = 'airtime-media-monitor'; $data = json_encode($md); - self::sendMessage($exchange, $data); + self::sendMessage($exchange, 'direct', true, $data); } public static function SendMessageToShowRecorder($event_type) @@ -74,14 +76,18 @@ public static function SendMessageToShowRecorder($event_type) } $data = json_encode($temp); - self::sendMessage($exchange, $data); + self::sendMessage($exchange, 'direct', true, $data); } - public static function SendMessageToAnalyzer() + public static function SendMessageToAnalyzer($tmpFilePath, $finalDirectory, $callbackUrl, $apiKey) { $exchange = 'airtime-uploads'; - //$data = json_encode($md); - //TODO: Finish me - //self::sendMessage($exchange, $data); + $data['tmp_file_path'] = $tmpFilePath; + $data['final_directory'] = $finalDirectory; + $data['callback_url'] = $callbackUrl; + $data['api_key'] = $apiKey; + + $jsonData = json_encode($data); + self::sendMessage($exchange, 'topic', false, $jsonData, 'airtime-uploads'); } } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index d7bd9132c5..f0eaf7b53a 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -66,7 +66,7 @@ public function postAction() return; } - $this->processUploadedFile(); + $this->processUploadedFile($this->getRequest()->getRequestUri()); //TODO: Strip or sanitize the JSON output $file = new CcFiles(); @@ -179,13 +179,24 @@ private function fileNotFoundResponse() $resp->appendBody("ERROR: Media not found."); } - private function processUploadedFile() + private function processUploadedFile($callbackUrl) { + $CC_CONFIG = Config::getConfig(); + $apiKey = $CC_CONFIG["apiKey"][0]; + $upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; $tempFilePath = Application_Model_StoredFile::uploadFile($upload_dir); $tempFileName = basename($tempFilePath); - //TODO: Dispatch a message to airtime_analyzer through RabbitMQ! + //TODO: Remove copyFileToStor from StoredFile... + + $storDir = Application_Model_MusicDir::getStorDir(); + $finalDestinationDir = $storDir->getDirectory() . "/organize"; + + //Dispatch a message to airtime_analyzer through RabbitMQ, + //notifying it that there's a new upload to process! + Application_Model_RabbitMq::SendMessageToAnalyzer($tempFilePath, + $finalDestinationDir, $callbackUrl, $apiKey); } } \ No newline at end of file diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 64b1b8ea95..d25219ecd7 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -54,7 +54,7 @@ def connect_to_messaging_server(self): port=self._port, virtual_host=self._vhost, credentials=pika.credentials.PlainCredentials(self._username, self._password))) self._channel = self._connection.channel() - self._channel.exchange_declare(exchange=EXCHANGE, type=EXCHANGE_TYPE) + self._channel.exchange_declare(exchange=EXCHANGE, type=EXCHANGE_TYPE, durable=True) result = self._channel.queue_declare(queue=QUEUE, durable=True) self._channel.queue_bind(exchange=EXCHANGE, queue=QUEUE, routing_key=ROUTING_KEY) diff --git a/python_apps/airtime_analyzer/tools/message_sender.php b/python_apps/airtime_analyzer/tools/message_sender.php index d5c9171c17..59677673d7 100644 --- a/python_apps/airtime_analyzer/tools/message_sender.php +++ b/python_apps/airtime_analyzer/tools/message_sender.php @@ -36,7 +36,7 @@ $channel->queue_declare($queue, false, true, false, false); // declare/create the exchange as a topic exchange. -$channel->exchange_declare($exchange, $exchangeType, false, false, false); +$channel->exchange_declare($exchange, $exchangeType, false, true, false); $msg = new AMQPMessage($message, array("content_type" => "text/plain")); From c0aee37e37f80b6d13f43487e113f968b5b77296 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 13 Mar 2014 14:38:01 -0400 Subject: [PATCH 013/310] CC-5709: Airtime Analyzer * Fixed the RabbitMQ setup instructions in the README --- python_apps/airtime_analyzer/README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/README.rst b/python_apps/airtime_analyzer/README.rst index ffd0c8ef8c..2f0c9e133e 100644 --- a/python_apps/airtime_analyzer/README.rst +++ b/python_apps/airtime_analyzer/README.rst @@ -6,7 +6,7 @@ Ghetto temporary installation instructions You will need to allow the "airtime" RabbitMQ user to access all exchanges and queues within the /airtime vhost: - sudo rabbitmqctl set_permissions -p /airtime airtime .* .* .* + sudo rabbitmqctl set_permissions -p /airtime airtime .\* .\* .\* Usage From 9b390518b75da5dddb2b69f9518f3e60ef44c6b5 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 13 Mar 2014 14:59:48 -0400 Subject: [PATCH 014/310] CC-5709: Airtime Analyzer * Fix the callback URL * Imports files successfully now! --- .../modules/rest/controllers/MediaController.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index f0eaf7b53a..dd5f11da17 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -66,13 +66,14 @@ public function postAction() return; } - $this->processUploadedFile($this->getRequest()->getRequestUri()); - //TODO: Strip or sanitize the JSON output $file = new CcFiles(); $file->fromArray($this->getRequest()->getPost()); $file->save(); + $callbackUrl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getRequestUri() . "/" . $file->getPrimaryKey(); + $this->processUploadedFile($callbackUrl); + $this->getResponse() ->setHttpResponseCode(201) ->appendBody(json_encode($file->toArray(BasePeer::TYPE_FIELDNAME))); @@ -193,10 +194,11 @@ private function processUploadedFile($callbackUrl) $storDir = Application_Model_MusicDir::getStorDir(); $finalDestinationDir = $storDir->getDirectory() . "/organize"; - //Dispatch a message to airtime_analyzer through RabbitMQ, + //Dispatch a message to airtime_analyzer through RabbitMQ, //notifying it that there's a new upload to process! Application_Model_RabbitMq::SendMessageToAnalyzer($tempFilePath, $finalDestinationDir, $callbackUrl, $apiKey); } -} \ No newline at end of file +} + From 259edebadc6eb9e4f64bc3b13f77d0c6c0fe7b87 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 13 Mar 2014 16:52:11 -0400 Subject: [PATCH 015/310] CC-5709: Airtime Analyzer * Fixed import of length, MIME type, and bitrate into Airtime --- .../airtime_analyzer/metadata_analyzer.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index 266ded2fa3..4f262b9d3b 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -1,3 +1,5 @@ +import time +import datetime import mutagen import magic # For MIME type detection from analyzer import Analyzer @@ -18,19 +20,21 @@ def analyze(filename): #in the file header. Mutagen breaks that out into a separate "info" object: info = audio_file.info metadata["sample_rate"] = info.sample_rate - metadata["length_seconds"] = info.length + #Converting the length in seconds (float) to a formatted time string + track_length = datetime.timedelta(seconds=info.length) + metadata["length"] = str(track_length) #time.strftime("%H:%M:%S.%f", track_length) metadata["bit_rate"] = info.bitrate #metadata["channels"] = info.channels #Use the python-magic module to get the MIME type. mime_magic = magic.Magic(mime=True) - metadata["mime_type"] = mime_magic.from_file(filename) + metadata["mime"] = mime_magic.from_file(filename) #Try to get the number of channels if mutagen can... try: #Special handling for getting the # of channels from MP3s. It's in the "mode" field #which is 0=Stereo, 1=Joint Stereo, 2=Dual Channel, 3=Mono. Part of the ID3 spec... - if metadata["mime_type"] == "audio/mpeg": + if metadata["mime"] == "audio/mpeg": if info.mode == 3: metadata["channels"] = 1 else: @@ -70,6 +74,7 @@ def analyze(filename): 'genre': 'genre', 'isrc': 'isrc', 'label': 'label', + 'length': 'length', 'language': 'language', 'last_modified':'last_modified', 'mood': 'mood', @@ -78,7 +83,7 @@ def analyze(filename): #'track_total': 'track_total', 'website': 'website', 'date': 'year', - 'mime_type': 'mime', + #'mime_type': 'mime', } for mutagen_tag, airtime_tag in mutagen_to_airtime_mapping.iteritems(): @@ -91,7 +96,11 @@ def analyze(filename): metadata[airtime_tag] = metadata[airtime_tag][0] except KeyError: - pass + continue + + #Airtime <= 2.5.x nonsense: + metadata["ftype"] = "audioclip" + metadata["cueout"] = metadata["length"] return metadata From 6a68967f81a45dcd564eeaeac589cb4f4a67b70b Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 13 Mar 2014 17:00:15 -0400 Subject: [PATCH 016/310] CC-5734: RESTful API media ownership --- .../rest/controllers/MediaController.php | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index dd5f11da17..011f2eeffd 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -69,6 +69,7 @@ public function postAction() //TODO: Strip or sanitize the JSON output $file = new CcFiles(); $file->fromArray($this->getRequest()->getPost()); + $file->setDbOwnerId($this->getOwnerId()); $file->save(); $callbackUrl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getRequestUri() . "/" . $file->getPrimaryKey(); @@ -200,5 +201,28 @@ private function processUploadedFile($callbackUrl) $finalDestinationDir, $callbackUrl, $apiKey); } + + private function getOwnerId() + { + try { + if ($this->verifySession()) { + $service_user = new Application_Service_UserService(); + return $service_user->getCurrentUser()->getDbId(); + } else { + $defaultOwner = CcSubjsQuery::create() + ->filterByDbType('A') + ->orderByDbId() + ->findOne(); + if (!$defaultOwner) { + // what to do if there is no admin user? + // should we handle this case? + return null; + } + return $defaultOwner->getDbId(); + } + } catch(Exception $e) { + Logging::info($e->getMessage()); + } + } } From 820f7f257a01002a3cfc1f60544a784fa86056a1 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 14 Mar 2014 17:34:56 -0400 Subject: [PATCH 017/310] CC-5733: RESTful API data sanitization and validation Stripped out fields that are readonly to the RESTful API from the request data for POST and PUT. Stripped out fields that should never be visible outside of Airtime in response data. Set uploaded and modified timestamp on POST request. Set modified timestamp on PUT request. --- .../rest/controllers/MediaController.php | 77 ++++++++++++++++--- 1 file changed, 65 insertions(+), 12 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 011f2eeffd..6ad5d90cc6 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -2,6 +2,26 @@ class Rest_MediaController extends Zend_Rest_Controller { + //fields that are not modifiable via our RESTful API + private $blackList = array( + 'id', + 'file_exists', + 'hidden', + 'silan_check', + 'soundcloud_id', + 'is_scheduled', + 'is_playlist' + ); + + //fields we should never expose through our RESTful API + private $privateFields = array( + 'file_exists', + 'hidden', + 'silan_check', + 'is_scheduled', + 'is_playlist' + ); + public function init() { $this->view->layout()->disableLayout(); @@ -13,10 +33,10 @@ public function indexAction() return; } - $files_array = []; + $files_array = array(); foreach (CcFilesQuery::create()->find() as $file) { - array_push($files_array, $file->toArray(BasePeer::TYPE_FIELDNAME)); + array_push($files_array, $this->sanitize($file)); } $this->getResponse() @@ -42,11 +62,10 @@ public function getAction() $file = CcFilesQuery::create()->findPk($id); if ($file) { - //TODO: Strip or sanitize the JSON output $this->getResponse() ->setHttpResponseCode(200) - ->appendBody(json_encode($file->toArray(BasePeer::TYPE_FIELDNAME))); + ->appendBody(json_encode($this->sanitize($file))); } else { $this->fileNotFoundResponse(); } @@ -66,18 +85,20 @@ public function postAction() return; } - //TODO: Strip or sanitize the JSON output $file = new CcFiles(); - $file->fromArray($this->getRequest()->getPost()); + $file->fromArray($this->validateRequestData($this->getRequest()->getPost())); $file->setDbOwnerId($this->getOwnerId()); + $now = new DateTime("now", new DateTimeZone("UTC")); + $file->setDbUtime($now); + $file->setDbMtime($now); $file->save(); - + $callbackUrl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getRequestUri() . "/" . $file->getPrimaryKey(); $this->processUploadedFile($callbackUrl); - + $this->getResponse() ->setHttpResponseCode(201) - ->appendBody(json_encode($file->toArray(BasePeer::TYPE_FIELDNAME))); + ->appendBody(json_encode($this->sanitize($file))); } public function putAction() @@ -94,12 +115,13 @@ public function putAction() if ($file) { //TODO: Strip or sanitize the JSON output - - $file->fromArray(json_decode($this->getRequest()->getRawBody(), true), BasePeer::TYPE_FIELDNAME); + $file->fromArray($this->validateRequestData(json_decode($this->getRequest()->getRawBody(), true)), BasePeer::TYPE_FIELDNAME); + $now = new DateTime("now", new DateTimeZone("UTC")); + $file->setDbMtime($now); $file->save(); $this->getResponse() ->setHttpResponseCode(200) - ->appendBody(json_encode($file->toArray(BasePeer::TYPE_FIELDNAME))); + ->appendBody(json_encode($this->sanitize($file))); } else { $this->fileNotFoundResponse(); } @@ -224,5 +246,36 @@ private function getOwnerId() Logging::info($e->getMessage()); } } + + /** + * + * Strips out fields from incoming request data that should never be modified + * from outside of Airtime + * @param array $data + */ + private function validateRequestData($data) + { + foreach ($this->blackList as $key) { + unset($data[$key]); + } + + return $data; + } + + /** + * + * Strips out the private fields we do not want to send back in API responses + */ + //TODO: rename this function? + public function sanitize($file) + { + $response = $file->toArray(BasePeer::TYPE_FIELDNAME); + + foreach ($this->privateFields as $key) { + unset($response[$key]); + } + + return $response; + } } From 65ab49baee6657a86377c3571e4260c81bb5e31c Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 14 Mar 2014 17:53:03 -0400 Subject: [PATCH 018/310] CC-5733: RESTful API data sanitization and validation Renamed sanitize function to sanitizeResponse --- .../modules/rest/controllers/MediaController.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 6ad5d90cc6..80d3b16562 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -36,7 +36,7 @@ public function indexAction() $files_array = array(); foreach (CcFilesQuery::create()->find() as $file) { - array_push($files_array, $this->sanitize($file)); + array_push($files_array, $this->sanitizeResponse($file)); } $this->getResponse() @@ -65,7 +65,7 @@ public function getAction() $this->getResponse() ->setHttpResponseCode(200) - ->appendBody(json_encode($this->sanitize($file))); + ->appendBody(json_encode($this->sanitizeResponse($file))); } else { $this->fileNotFoundResponse(); } @@ -98,7 +98,7 @@ public function postAction() $this->getResponse() ->setHttpResponseCode(201) - ->appendBody(json_encode($this->sanitize($file))); + ->appendBody(json_encode($this->sanitizeResponse($file))); } public function putAction() @@ -114,14 +114,13 @@ public function putAction() $file = CcFilesQuery::create()->findPk($id); if ($file) { - //TODO: Strip or sanitize the JSON output $file->fromArray($this->validateRequestData(json_decode($this->getRequest()->getRawBody(), true)), BasePeer::TYPE_FIELDNAME); $now = new DateTime("now", new DateTimeZone("UTC")); $file->setDbMtime($now); $file->save(); $this->getResponse() ->setHttpResponseCode(200) - ->appendBody(json_encode($this->sanitize($file))); + ->appendBody(json_encode($this->sanitizeResponse($file))); } else { $this->fileNotFoundResponse(); } @@ -267,7 +266,7 @@ private function validateRequestData($data) * Strips out the private fields we do not want to send back in API responses */ //TODO: rename this function? - public function sanitize($file) + public function sanitizeResponse($file) { $response = $file->toArray(BasePeer::TYPE_FIELDNAME); From 50a42f12bb44d9f885ea562f42a93a02f8f08d91 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 17 Mar 2014 10:19:39 -0400 Subject: [PATCH 019/310] CC-5709: Airtime Analyzer * File import via the Add Media page now works! * Reworked StoredFile::copyFileToStor() because it's still needed. * Reworked the way file paths are reported in airtime_analyzer and in the RESTful media API --- airtime_mvc/application/models/RabbitMq.php | 8 +- airtime_mvc/application/models/StoredFile.php | 75 ++++++++++++------- .../rest/controllers/MediaController.php | 52 +++++++++++-- .../airtime_analyzer/analyzer_pipeline.py | 51 ++++++++++--- .../airtime_analyzer/message_listener.py | 10 ++- 5 files changed, 143 insertions(+), 53 deletions(-) diff --git a/airtime_mvc/application/models/RabbitMq.php b/airtime_mvc/application/models/RabbitMq.php index a178fb5856..7af846127c 100644 --- a/airtime_mvc/application/models/RabbitMq.php +++ b/airtime_mvc/application/models/RabbitMq.php @@ -78,12 +78,14 @@ public static function SendMessageToShowRecorder($event_type) self::sendMessage($exchange, 'direct', true, $data); } - - public static function SendMessageToAnalyzer($tmpFilePath, $finalDirectory, $callbackUrl, $apiKey) + + public static function SendMessageToAnalyzer($tmpFilePath, $importedStorageDirectory, $originalFilename, + $callbackUrl, $apiKey) { $exchange = 'airtime-uploads'; $data['tmp_file_path'] = $tmpFilePath; - $data['final_directory'] = $finalDirectory; + $data['import_directory'] = $importedStorageDirectory; + $data['original_filename'] = $originalFilename; $data['callback_url'] = $callbackUrl; $data['api_key'] = $apiKey; diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 0095726474..7f1aa7d690 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -988,48 +988,69 @@ public static function isEnoughDiskSpaceToCopy($destination_folder, $audio_file) return $freeSpace >= $fileSize; } - public static function copyFileToStor($p_targetDir, $fileName, $tempname) + /** + * Copy a newly uploaded audio file from its temporary upload directory + * on the local disk (like /tmp) over to Airtime's "stor" directory, + * which is where all ingested music/media live. + * + * This is done in PHP here on the web server rather than in airtime_analyzer because + * the airtime_analyzer might be running on a different physical computer than the web server, + * and it probably won't have access to the web server's /tmp folder. The stor/organize directory + * is, however, both accessible to the machines running airtime_analyzer and the web server + * on Airtime Pro. + * + * The file is actually copied to "stor/organize", which is a staging directory where files go + * before they're processed by airtime_analyzer, which then moves them to "stor/imported" in the final + * step. + * + * TODO: Implement better error handling here... + * + * @param string $tempFilePath + * @param string $originalFilename + * @throws Exception + * @return Ambigous + */ + public static function copyFileToStor($tempFilePath, $originalFilename) { - $audio_file = $p_targetDir . DIRECTORY_SEPARATOR . $tempname; + $audio_file = $tempFilePath; Logging::info('copyFileToStor: moving file '.$audio_file); - + $storDir = Application_Model_MusicDir::getStorDir(); $stor = $storDir->getDirectory(); // check if "organize" dir exists and if not create one if (!file_exists($stor."/organize")) { if (!mkdir($stor."/organize", 0777)) { - return array( - "code" => 109, - "message" => _("Failed to create 'organize' directory.")); + throw new Exception("Failed to create organize directory."); } } - + if (chmod($audio_file, 0644) === false) { Logging::info("Warning: couldn't change permissions of $audio_file to 0644"); } - + // Check if we have enough space before copying if (!self::isEnoughDiskSpaceToCopy($stor, $audio_file)) { $freeSpace = disk_free_space($stor); $fileSize = filesize($audio_file); - - return array("code" => 107, - "message" => sprintf(_("The file was not uploaded, there is " - ."%s MB of disk space left and the file you are " - ."uploading has a size of %s MB."), $freeSpace, $fileSize)); + + throw new Exception(sprintf(_("The file was not uploaded, there is " + ."%s MB of disk space left and the file you are " + ."uploading has a size of %s MB."), $freeSpace, $fileSize)); } - + // Check if liquidsoap can play this file + // TODO: Move this to airtime_analyzer if (!self::liquidsoapFilePlayabilityTest($audio_file)) { return array( - "code" => 110, - "message" => _("This file appears to be corrupted and will not " - ."be added to media library.")); + "code" => 110, + "message" => _("This file appears to be corrupted and will not " + ."be added to media library.")); } + // Did all the checks for real, now trying to copy $audio_stor = Application_Common_OsPath::join($stor, "organize", - $fileName); + $originalFilename); $user = Application_Model_User::getCurrentUser(); if (is_null($user)) { $uid = Application_Model_User::getFirstAdminId(); @@ -1044,7 +1065,7 @@ public static function copyFileToStor($p_targetDir, $fileName, $tempname) written)"); } else { Logging::info("Successfully written identification file for - uploaded '$audio_stor'"); + uploaded '$audio_stor'"); } //if the uploaded file is not UTF-8 encoded, let's encode it. Assuming source //encoding is ISO-8859-1 @@ -1059,18 +1080,14 @@ public static function copyFileToStor($p_targetDir, $fileName, $tempname) //is enough disk space . unlink($audio_file); //remove the file after failed rename unlink($id_file); // Also remove the identifier file - - return array( - "code" => 108, - "message" => _("The file was not uploaded, this error can occur if the computer " - ."hard drive does not have enough disk space or the stor " - ."directory does not have correct write permissions.")); + + throw new Exception("The file was not uploaded, this error can occur if the computer " + ."hard drive does not have enough disk space or the stor " + ."directory does not have correct write permissions."); } - // Now that we successfully added this file, we will add another tag - // file that will identify the user that owns it - return null; + return $audio_stor; } - + /* * Pass the file through Liquidsoap and test if it is readable. Return True if readable, and False otherwise. */ diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 011f2eeffd..e0f8939305 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -73,7 +73,7 @@ public function postAction() $file->save(); $callbackUrl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getRequestUri() . "/" . $file->getPrimaryKey(); - $this->processUploadedFile($callbackUrl); + $this->processUploadedFile($callbackUrl, $_FILES["file"]["name"], $this->getOwnerId()); $this->getResponse() ->setHttpResponseCode(201) @@ -95,7 +95,27 @@ public function putAction() { //TODO: Strip or sanitize the JSON output - $file->fromArray(json_decode($this->getRequest()->getRawBody(), true), BasePeer::TYPE_FIELDNAME); + $fileFromJson = json_decode($this->getRequest()->getRawBody(), true); + + //Our RESTful API takes "full_path" as a field, which we then split and translate to match + //our internal schema. Internally, file path is stored relative to a directory, with the directory + //as a foreign key to cc_music_dirs. + if ($fileFromJson["full_path"]) { + + $fullPath = $fileFromJson["full_path"]; + $storDir = Application_Model_MusicDir::getStorDir()->getDirectory(); + $pos = strpos($fullPath, $storDir); + + if ($pos !== FALSE) + { + assert($pos == 0); //Path must start with the stor directory path + + $filePathRelativeToStor = substr($fullPath, strlen($storDir)); + $fileFromJson["filepath"] = $filePathRelativeToStor; + $fileFromJson["directory"] = 1; //1 corresponds to the default stor/imported directory. + } + } + $file->fromArray($fileFromJson, BasePeer::TYPE_FIELDNAME); $file->save(); $this->getResponse() ->setHttpResponseCode(200) @@ -181,7 +201,7 @@ private function fileNotFoundResponse() $resp->appendBody("ERROR: Media not found."); } - private function processUploadedFile($callbackUrl) + private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) { $CC_CONFIG = Config::getConfig(); $apiKey = $CC_CONFIG["apiKey"][0]; @@ -192,14 +212,32 @@ private function processUploadedFile($callbackUrl) //TODO: Remove copyFileToStor from StoredFile... + //TODO: Remove uploadFileAction from ApiController.php **IMPORTANT** - It's used by the recorder daemon? + + $upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; + $tempFilePath = $upload_dir . "/" . $tempFileName; + $storDir = Application_Model_MusicDir::getStorDir(); - $finalDestinationDir = $storDir->getDirectory() . "/organize"; + //$finalFullFilePath = $storDir->getDirectory() . "/imported/" . $ownerId . "/" . $originalFilename; + $importedStorageDirectory = $storDir->getDirectory() . "/imported/" . $ownerId; + + try { + //Copy the temporary file over to the "organize" folder so that it's off our webserver + //and accessible by airtime_analyzer which could be running on a different machine. + $newTempFilePath = Application_Model_StoredFile::copyFileToStor($tempFilePath, $originalFilename); + } catch (Exception $e) { + Logging::error($e->getMessage()); + } + + //Logging::info("New temporary file path: " . $newTempFilePath); + //Logging::info("Final file path: " . $finalFullFilePath); + //Dispatch a message to airtime_analyzer through RabbitMQ, //notifying it that there's a new upload to process! - Application_Model_RabbitMq::SendMessageToAnalyzer($tempFilePath, - $finalDestinationDir, $callbackUrl, $apiKey); - + Application_Model_RabbitMq::SendMessageToAnalyzer($newTempFilePath, + $importedStorageDirectory, $originalFilename, + $callbackUrl, $apiKey); } private function getOwnerId() diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index c4a4d18a32..af880a735b 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -1,7 +1,7 @@ import logging import multiprocessing import shutil -import os +import os, errno from metadata_analyzer import MetadataAnalyzer class AnalyzerPipeline: @@ -12,28 +12,59 @@ def __init__(self): # Take message dictionary and perform the necessary analysis. @staticmethod - def run_analysis(queue, audio_file_path, final_directory): + def run_analysis(queue, audio_file_path, import_directory, original_filename): if not isinstance(queue, multiprocessing.queues.Queue): raise TypeError("queue must be a multiprocessing.Queue()") if not isinstance(audio_file_path, unicode): raise TypeError("audio_file_path must be unicode. Was of type " + type(audio_file_path).__name__ + " instead.") - if not isinstance(final_directory, unicode): - raise TypeError("final_directory must be unicode. Was of type " + type(final_directory).__name__ + " instead.") + if not isinstance(import_directory, unicode): + raise TypeError("import_directory must be unicode. Was of type " + type(import_directory).__name__ + " instead.") + if not isinstance(original_filename, unicode): + raise TypeError("original_filename must be unicode. Was of type " + type(original_filename).__name__ + " instead.") + #print ReplayGainAnalyzer.analyze("foo.mp3") # Analyze the audio file we were told to analyze: # First, we extract the ID3 tags and other metadata: - queue.put(MetadataAnalyzer.analyze(audio_file_path)) + results = MetadataAnalyzer.analyze(audio_file_path) # Note that the queue we're putting the results into is our interprocess communication # back to the main process. - #print ReplayGainAnalyzer.analyze("foo.mp3") + #Import the file over to it's final location. + + final_file_path = import_directory + if results.has_key("artist_name"): + final_file_path += "/" + results["artist_name"] + if results.has_key("album"): + final_file_path += "/" + results["album"] + final_file_path += "/" + original_filename + + #Ensure any redundant slashes are stripped + final_file_path = os.path.normpath(final_file_path) + + #final_audio_file_path = final_directory + os.sep + os.path.basename(audio_file_path) + if os.path.exists(final_file_path) and not os.path.samefile(audio_file_path, final_file_path): + raise Exception("File exists and will not be overwritten.") # by design + #Overwriting a file would mean Airtime's database has the wrong information... + + #Ensure the full path to the file exists + mkdir_p(os.path.dirname(final_file_path)) + + #Move the file into its final destination directory + shutil.move(audio_file_path, final_file_path) + + #Pass the full path back to Airtime + results["full_path"] = final_file_path + queue.put(results) - final_audio_file_path = final_directory + os.sep + os.path.basename(audio_file_path) - if os.path.exists(final_audio_file_path) and not os.path.samefile(audio_file_path, final_audio_file_path): - os.remove(final_audio_file_path) - shutil.move(audio_file_path, final_audio_file_path) +def mkdir_p(path): + try: + os.makedirs(path) + except OSError as exc: # Python >2.5 + if exc.errno == errno.EEXIST and os.path.isdir(path): + pass + else: raise diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index d25219ecd7..d1311a4683 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -83,11 +83,13 @@ def msg_received_callback(channel, method_frame, header_frame, body): try: msg_dict = json.loads(body) audio_file_path = msg_dict["tmp_file_path"] - final_directory = msg_dict["final_directory"] + #final_file_path = msg_dict["final_file_path"] + import_directory = msg_dict["import_directory"] + original_filename = msg_dict["original_filename"] callback_url = msg_dict["callback_url"] api_key = msg_dict["api_key"] - audio_metadata = MessageListener.spawn_analyzer_process(audio_file_path, final_directory) + audio_metadata = MessageListener.spawn_analyzer_process(audio_file_path, import_directory, original_filename) StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) except KeyError as e: @@ -123,11 +125,11 @@ def msg_received_callback(channel, method_frame, header_frame, body): channel.basic_ack(delivery_tag=method_frame.delivery_tag) @staticmethod - def spawn_analyzer_process(audio_file_path, final_directory): + def spawn_analyzer_process(audio_file_path, import_directory, original_filename): q = multiprocessing.Queue() p = multiprocessing.Process(target=AnalyzerPipeline.run_analysis, - args=(q, audio_file_path, final_directory)) + args=(q, audio_file_path, import_directory, original_filename)) p.start() p.join() if p.exitcode == 0: From f7cb923cebe65f1ef43d2d287c15e8cd9e6c362f Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 17 Mar 2014 10:25:26 -0400 Subject: [PATCH 020/310] CC-5709: Airtime Analyzer * Fixed breakage --- .../application/modules/rest/controllers/MediaController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 8a40b912f8..05f4af2591 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -115,7 +115,8 @@ public function putAction() $file = CcFilesQuery::create()->findPk($id); if ($file) { - $fileFromJson = json_decode($this->getRequest()->getRawBody(), true); + $fileFromJson = $file->fromArray($this->validateRequestData(json_decode($this->getRequest()->getRawBody(), true)), + BasePeer::TYPE_FIELDNAME); //Our RESTful API takes "full_path" as a field, which we then split and translate to match //our internal schema. Internally, file path is stored relative to a directory, with the directory @@ -136,7 +137,6 @@ public function putAction() } } - $file->fromArray($this->validateRequestData(json_decode($fileFromJson, true)), BasePeer::TYPE_FIELDNAME); $now = new DateTime("now", new DateTimeZone("UTC")); $file->setDbMtime($now); $file->save(); From 86a34635bbd025509cac9e7f0c5dd976ccbc0b90 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 17 Mar 2014 10:56:49 -0400 Subject: [PATCH 021/310] CC-5701: Airtime File API Fixed saving filepath and directory --- .../modules/rest/controllers/MediaController.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 05f4af2591..9bf4866a88 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -114,16 +114,16 @@ public function putAction() $file = CcFilesQuery::create()->findPk($id); if ($file) - { - $fileFromJson = $file->fromArray($this->validateRequestData(json_decode($this->getRequest()->getRawBody(), true)), - BasePeer::TYPE_FIELDNAME); - + { + $requestData = json_decode($this->getRequest()->getRawBody(), true); + $file->fromArray($this->validateRequestData($requestData), BasePeer::TYPE_FIELDNAME); + //Our RESTful API takes "full_path" as a field, which we then split and translate to match //our internal schema. Internally, file path is stored relative to a directory, with the directory //as a foreign key to cc_music_dirs. - if ($fileFromJson["full_path"]) { + if ($requestData["full_path"]) { - $fullPath = $fileFromJson["full_path"]; + $fullPath = $requestData["full_path"]; $storDir = Application_Model_MusicDir::getStorDir()->getDirectory(); $pos = strpos($fullPath, $storDir); @@ -132,8 +132,8 @@ public function putAction() assert($pos == 0); //Path must start with the stor directory path $filePathRelativeToStor = substr($fullPath, strlen($storDir)); - $fileFromJson["filepath"] = $filePathRelativeToStor; - $fileFromJson["directory"] = 1; //1 corresponds to the default stor/imported directory. + $file->setDbFilepath($filePathRelativeToStor); + $file->setDbDirectory(1); //1 corresponds to the default stor/imported directory. } } From 13a664207fc1cbeacd7182668a5de00415f212bb Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 17 Mar 2014 11:19:06 -0400 Subject: [PATCH 022/310] CC-5742: Airtime isn't handling caught exceptions properly --- airtime_mvc/public/index.php | 1 + 1 file changed, 1 insertion(+) diff --git a/airtime_mvc/public/index.php b/airtime_mvc/public/index.php index 7c6d5cfb46..5c4dcdae87 100644 --- a/airtime_mvc/public/index.php +++ b/airtime_mvc/public/index.php @@ -74,5 +74,6 @@ function exception_error_handler($errno, $errstr, $errfile, $errline) } else { Logging::info($e->getTrace()); } + throw $e; } From 16c56e6aff39211eb9c57f98447d89babbea6f87 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 17 Mar 2014 14:43:50 -0400 Subject: [PATCH 023/310] CC-5709: Airtime Analyzer * Fixed error in media API authentication * Improved documentation --- .../rest/controllers/MediaController.php | 49 +++++++++++++++---- python_apps/airtime_analyzer/README.rst | 11 +++++ .../airtime_analyzer/message_listener.py | 5 +- .../airtime_analyzer/status_reporter.py | 2 +- 4 files changed, 55 insertions(+), 12 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 9bf4866a88..ae10c6792e 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -1,5 +1,6 @@ view->layout()->disableLayout(); } - + public function indexAction() { - if (!$this->verifyApiKey() && !$this->verifySession()) { + if (!$this->verifyAuth(true, true)) + { return; } @@ -52,9 +54,11 @@ public function indexAction() public function getAction() { - if (!$this->verifyApiKey() && !$this->verifySession()) { + if (!$this->verifyAuth(true, true)) + { return; } + $id = $this->getId(); if (!$id) { return; @@ -73,9 +77,11 @@ public function getAction() public function postAction() { - if (!$this->verifyApiKey() && !$this->verifySession()) { + if (!$this->verifyAuth(true, true)) + { return; } + //If we do get an ID on a POST, then that doesn't make any sense //since POST is only for creating. if ($id = $this->_getParam('id', false)) { @@ -104,9 +110,11 @@ public function postAction() public function putAction() { - if (!$this->verifyApiKey() && !$this->verifySession()) { + if (!$this->verifyAuth(true, true)) + { return; } + $id = $this->getId(); if (!$id) { return; @@ -150,9 +158,11 @@ public function putAction() public function deleteAction() { - if (!$this->verifyApiKey() && !$this->verifySession()) { + if (!$this->verifyAuth(true, true)) + { return; } + $id = $this->getId(); if (!$id) { return; @@ -179,6 +189,27 @@ private function getId() } return $id; } + + private function verifyAuth($checkApiKey, $checkSession) + { + //Session takes precedence over API key for now: + if ($checkSession && $this->verifySession()) + { + return true; + } + + if ($checkApiKey && $this->verifyAPIKey()) + { + return true; + } + + $resp = $this->getResponse(); + $resp->setHttpResponseCode(401); + $resp->appendBody("ERROR: Incorrect API key."); + + return false; + } + private function verifyAPIKey() { @@ -196,11 +227,10 @@ private function verifyAPIKey() { return true; } else { - $resp = $this->getResponse(); - $resp->setHttpResponseCode(401); - $resp->appendBody("ERROR: Incorrect API key."); return false; } + + return false; } private function verifySession() @@ -210,6 +240,7 @@ private function verifySession() { return true; } + return false; //Token checking stub code. We'd need to change LoginController.php to generate a token too, but //but luckily all the token code already exists and works. diff --git a/python_apps/airtime_analyzer/README.rst b/python_apps/airtime_analyzer/README.rst index 2f0c9e133e..7b2ba335df 100644 --- a/python_apps/airtime_analyzer/README.rst +++ b/python_apps/airtime_analyzer/README.rst @@ -12,6 +12,15 @@ You will need to allow the "airtime" RabbitMQ user to access all exchanges and q Usage ========== +This program must run as a user with permissions to write to your Airtime music library +directory. For standard Airtime installations, run it as the www-data user: + + $ sudo -u www-data airtime_analyzer --debug + +Or during development, add the --debug flag for more verbose output: + + $ sudo -u www-data airtime_analyzer --debug + To print usage instructions, run: $ airtime_analyzer --help @@ -35,6 +44,8 @@ For example, run: $ php tools/message_sender.php '{ "tmp_file_path" : "foo.mp3", "final_directory" : ".", "callback_url" : "http://airtime.localhost/rest/media/1", "api_key" : "YOUR_API_KEY" }' + $ php tools/message_sender.php '{"tmp_file_path":"foo.mp3", "import_directory":"/srv/airtime/stor/imported/1","original_filename":"foo.mp3","callback_url": "http://airtime.localhost/rest/media/1", "api_key":"YOUR_API_KEY"}' + Logging ========= diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index d1311a4683..edde9c0838 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -112,12 +112,13 @@ def msg_received_callback(channel, method_frame, header_frame, body): # TODO: Report this as a failed upload to the File Upload REST API. # - # TODO: If the JSON was invalid, then don't report to the REST API + # TODO: If the JSON was invalid or the web server is down, + # then don't report that failure to the REST API StatusReporter.report_failure_to_callback_url(callback_url, api_key, error_status=1, reason=u'An error occurred while importing this file') - logging.error(e) + logging.exception(e) else: # ACK at the very end, after the message has been successfully processed. diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index acc8ba81a8..e91b246a89 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -19,9 +19,9 @@ def report_success_to_callback_url(self, callback_url, api_key, audio_metadata): timeout=StatusReporter._HTTP_REQUEST_TIMEOUT) logging.debug("HTTP request returned status: " + str(r.status_code)) logging.debug(r.text) # Log the response body - r.raise_for_status() # Raise an exception if there was an HTTP error code returned #TODO: Queue up failed requests and try them again later. + r.raise_for_status() # Raise an exception if there was an HTTP error code returned @classmethod def report_failure_to_callback_url(self, callback_url, api_key, error_status, reason): From 2b696dbee5e59c1f0d2f980722493f86a8f05d67 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 18 Mar 2014 13:04:06 -0400 Subject: [PATCH 024/310] CC-5741: Create a download action for the File API --- .../application/modules/rest/Bootstrap.php | 13 ++++++++++ .../rest/controllers/MediaController.php | 26 +++++++++++++++++++ .../rest/views/scripts/media/download.phtml | 0 3 files changed, 39 insertions(+) create mode 100644 airtime_mvc/application/modules/rest/views/scripts/media/download.phtml diff --git a/airtime_mvc/application/modules/rest/Bootstrap.php b/airtime_mvc/application/modules/rest/Bootstrap.php index 904d05e4c4..e7017ba167 100644 --- a/airtime_mvc/application/modules/rest/Bootstrap.php +++ b/airtime_mvc/application/modules/rest/Bootstrap.php @@ -10,5 +10,18 @@ protected function _initRouter() $restRoute = new Zend_Rest_Route($front, array(), array( 'rest'=> array('media'))); assert($router->addRoute('rest', $restRoute)); + + $downloadRoute = new Zend_Controller_Router_Route( + 'rest/media/:id/download', + array( + 'controller' => 'media', + 'action' => 'download', + 'module' => 'rest' + ), + array( + 'id' => '\d+' + ) + ); + $router->addRoute('download', $downloadRoute); } } \ No newline at end of file diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index ae10c6792e..7cd269c286 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -51,6 +51,32 @@ public function indexAction() ->appendBody(json_encode(CcFilesQuery::create()->find()->toArray(BasePeer::TYPE_FIELDNAME))); */ } + + public function downloadAction() + { + if (!$this->verifyAuth(true, true)) + { + return; + } + + $id = $this->getId(); + if (!$id) { + return; + } + + $file = CcFilesQuery::create()->findPk($id); + if ($file) { + $con = Propel::getConnection(); + $storedFile = new Application_Model_StoredFile($file, $con); + $baseUrl = Application_Common_OsPath::getBaseDir(); + + $this->getResponse() + ->setHttpResponseCode(200) + ->appendBody($this->_redirect($storedFile->getRelativeFileUrl($baseUrl).'/download/true')); + } else { + $this->fileNotFoundResponse(); + } + } public function getAction() { diff --git a/airtime_mvc/application/modules/rest/views/scripts/media/download.phtml b/airtime_mvc/application/modules/rest/views/scripts/media/download.phtml new file mode 100644 index 0000000000..e69de29bb2 From 7800cb1e15a869231827046ea47834bf5e3187cb Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 21 Mar 2014 09:50:03 -0400 Subject: [PATCH 025/310] SAAS-382: Reimplement Storage Quota Storing disk usage in cc_pref Add/subtract filesize to/from disk usage total when a file is uploaded or deleted TODO: Hook this into the ftp server --- .../controllers/LibraryController.php | 1 + airtime_mvc/application/models/Preference.php | 20 +++++++++++++++++++ .../rest/controllers/MediaController.php | 5 ++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index 2102a662ea..c241599d7a 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -356,6 +356,7 @@ public function deleteAction() if (isset($file)) { try { + Application_Model_Preference::updateDiskUsage(-1 * abs(filesize($file->getFilePath()))); $res = $file->delete(); } catch (FileNoPermissionException $e) { $message = $noPermissionMsg; diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php index 0bc4fc7ac4..749aa8e062 100644 --- a/airtime_mvc/application/models/Preference.php +++ b/airtime_mvc/application/models/Preference.php @@ -1415,4 +1415,24 @@ public static function SetHistoryFileTemplate($value) { public static function GetHistoryFileTemplate() { return self::getValue("history_file_template"); } + + public static function getDiskUsage() + { + return self::getValue("disk_usage"); + } + + public static function setDiskUsage($value) + { + self::setValue("disk_usage", $value); + } + + public static function updateDiskUsage($filesize) + { + $currentDiskUsage = self::getDiskUsage(); + if (empty($currentDiskUsage)) { + $currentDiskUsage = 0; + } + + self::setDiskUsage($currentDiskUsage + $filesize); + } } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 7cd269c286..0411787368 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -156,7 +156,8 @@ public function putAction() //our internal schema. Internally, file path is stored relative to a directory, with the directory //as a foreign key to cc_music_dirs. if ($requestData["full_path"]) { - + Application_Model_Preference::updateDiskUsage(filesize($requestData["full_path"])); + $fullPath = $requestData["full_path"]; $storDir = Application_Model_MusicDir::getStorDir()->getDirectory(); $pos = strpos($fullPath, $storDir); @@ -196,6 +197,7 @@ public function deleteAction() $file = CcFilesQuery::create()->findPk($id); if ($file) { $storedFile = Application_Model_StoredFile($file); + Application_Model_Preference::updateDiskUsage(-1 * abs(filesize($storedFile->getFilePath()))); $storedFile->delete(); //TODO: This checks your session permissions... Make it work without a session? $file->delete(); $this->getResponse() @@ -373,5 +375,6 @@ public function sanitizeResponse($file) return $response; } + } From 878dd11ccc44f36496be936e215b1498b4518d9f Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 21 Mar 2014 13:22:00 -0400 Subject: [PATCH 026/310] CC-5709: Airtime Analyzer * Overhauled Add Media screen, now shows state of recent uploads * Dropped old unused "state" column, added new file_import column to cc_files * New PluploadController methods * Save the filename as the track title for unprocessed uploads * Hide pending files from the library until they've been processed. * Don't overwrite files with duplicate names, we rename them instead. --- .../controllers/PluploadController.php | 63 +++++++++++-------- .../rest/controllers/MediaController.php | 6 +- .../views/scripts/plupload/index.phtml | 16 +++++ airtime_mvc/build/schema.xml | 2 +- .../public/js/airtime/library/plupload.js | 37 ++++++++++- .../airtime_analyzer/analyzer_pipeline.py | 35 ++++++++--- .../airtime_analyzer/metadata_analyzer.py | 2 + 7 files changed, 123 insertions(+), 38 deletions(-) diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index c7f4f29d94..daeacd7584 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -2,12 +2,11 @@ class PluploadController extends Zend_Controller_Action { - public function init() { $ajaxContext = $this->_helper->getHelper('AjaxContext'); $ajaxContext->addActionContext('upload', 'json') - ->addActionContext('uploadFinished', 'json') + ->addActionContext('recent-uploads', 'json') ->initContext(); } @@ -18,12 +17,14 @@ public function indexAction() $baseUrl = Application_Common_OsPath::getBaseDir(); $locale = Application_Model_Preference::GetLocale(); + $this->view->headScript()->appendFile($baseUrl.'js/datatables/js/jquery.dataTables.js?'.$CC_CONFIG['airtime_version'], 'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'js/plupload/plupload.full.min.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'js/plupload/jquery.plupload.queue.min.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'js/airtime/library/plupload.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'js/plupload/i18n/'.$locale.'.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headLink()->appendStylesheet($baseUrl.'css/plupload.queue.css?'.$CC_CONFIG['airtime_version']); + $this->view->headLink()->appendStylesheet($baseUrl.'css/addmedia.css?'.$CC_CONFIG['airtime_version']); } public function uploadAction() @@ -34,31 +35,43 @@ public function uploadAction() $this->_helper->json->sendJson(array("jsonrpc" => "2.0", "tempfilepath" => $tempFileName)); } - - public function uploadFinishedAction() + + public function recentUploadsAction() { - $upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; - $filename = $this->_getParam('name'); - $tempname = $this->_getParam('tempname'); - $result = Application_Model_StoredFile::importUploadedFile($upload_dir, $filename, $tempname); - if (!is_null($result)) - $this->_helper->json->sendJson(array("jsonrpc" => "2.0", "error" => $result)); + //$this->dis + //( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1' ) + $limit = isset($_GET['iDisplayLength']) ? $_GET['iDisplayLength'] : 10; + $rowStart = isset($_GET['iDisplayStart']) ? $_GET['iDisplayStart'] : 0; - $this->_helper->json->sendJson(array("jsonrpc" => "2.0")); + $recentUploads = CcFilesQuery::create()->filterByDbUtime(array('min' => time() - 30 * 24 * 60 * 60)) + ->orderByDbUtime(Criteria::DESC) + ->offset($rowStart) + ->limit($limit) + ->find(); + + $numRecentUploads = $limit; + + $numTotalRecentUploads = CcFilesQuery::create()->filterByDbUtime(array('min' => time() - 30 * 24 * 60 * 60)) + ->count(); + + //$this->_helper->json->sendJson(array("jsonrpc" => "2.0", "tempfilepath" => $tempFileName)); + + $uploadsArray = array(); + + foreach ($recentUploads as $upload) + { + $upload->toArray(BasePeer::TYPE_FIELDNAME); + //array_push($uploadsArray, $upload); //TODO: $this->sanitizeResponse($upload)); + + //$this->_helper->json->sendJson($upload->asJson()); + array_push($uploadsArray, $upload->toArray(BasePeer::TYPE_FIELDNAME)); + } - } - /* FIXME: I renamed this guy to uploadFinishedAction and am just starting to rewrite it to use the new File API. - * -- Albert March 10, 2014 - public function copyfileAction() - { - $upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; - $filename = $this->_getParam('name'); - $tempname = $this->_getParam('tempname'); - $result = Application_Model_StoredFile::copyFileToStor($upload_dir, - $filename, $tempname); - if (!is_null($result)) - $this->_helper->json->sendJson(array("jsonrpc" => "2.0", "error" => $result)); - $this->_helper->json->sendJson(array("jsonrpc" => "2.0")); - }*/ + $this->view->sEcho = intval($this->getRequest()->getParam('sEcho')); + $this->view->iTotalDisplayRecords = $numTotalRecentUploads; + //$this->view->iTotalDisplayRecords = $numRecentUploads; //$r["iTotalDisplayRecords"]; + $this->view->iTotalRecords = $numTotalRecentUploads; //$r["iTotalRecords"]; + $this->view->files = $uploadsArray; //$r["aaData"]; + } } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 7cd269c286..b850254daf 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -43,7 +43,7 @@ public function indexAction() $this->getResponse() ->setHttpResponseCode(200) - ->appendBody(json_encode($files_array)); + ->appendBody(json_encode($files_array)); /** TODO: Use this simpler code instead after we upgrade to Propel 1.7 (Airtime 2.6.x branch): $this->getResponse() @@ -121,8 +121,10 @@ public function postAction() $file->fromArray($this->validateRequestData($this->getRequest()->getPost())); $file->setDbOwnerId($this->getOwnerId()); $now = new DateTime("now", new DateTimeZone("UTC")); + $file->setDbTrackTitle($_FILES["file"]["name"]); $file->setDbUtime($now); $file->setDbMtime($now); + $file->setDbHidden(true); $file->save(); $callbackUrl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getRequestUri() . "/" . $file->getPrimaryKey(); @@ -170,7 +172,7 @@ public function putAction() $file->setDbDirectory(1); //1 corresponds to the default stor/imported directory. } } - + $now = new DateTime("now", new DateTimeZone("UTC")); $file->setDbMtime($now); $file->save(); diff --git a/airtime_mvc/application/views/scripts/plupload/index.phtml b/airtime_mvc/application/views/scripts/plupload/index.phtml index cf236b8d67..1c3f42e557 100644 --- a/airtime_mvc/application/views/scripts/plupload/index.phtml +++ b/airtime_mvc/application/views/scripts/plupload/index.phtml @@ -9,3 +9,19 @@

+ +
+
+ +
+
+ + + +
+
+

Recent Uploads

+
+
+
+
diff --git a/airtime_mvc/build/schema.xml b/airtime_mvc/build/schema.xml index d5ba765163..e614748bfc 100644 --- a/airtime_mvc/build/schema.xml +++ b/airtime_mvc/build/schema.xml @@ -18,7 +18,7 @@ - + diff --git a/airtime_mvc/public/js/airtime/library/plupload.js b/airtime_mvc/public/js/airtime/library/plupload.js index 2b27166c49..d1ac34ff78 100644 --- a/airtime_mvc/public/js/airtime/library/plupload.js +++ b/airtime_mvc/public/js/airtime/library/plupload.js @@ -1,6 +1,7 @@ $(document).ready(function() { var uploader; + var self = this; $("#plupload_files").pluploadQueue({ // General settings @@ -19,6 +20,13 @@ $(document).ready(function() { uploader.bind('FileUploaded', function(up, file, json) { + var j = jQuery.parseJSON(json.response); + console.log(j); + console.log(file.name); + + self.recentUploadsTable.fnDraw(); //Only works because we're using bServerSide + //In DataTables 1.10 and greater, we can use .fnAjaxReload() + /* var j = jQuery.parseJSON(json.response); @@ -52,7 +60,7 @@ $(document).ready(function() { var uploadProgress = false; uploader.bind('QueueChanged', function(){ - uploadProgress = (uploader.files.length > 0) + uploadProgress = (uploader.files.length > 0); }); uploader.bind('UploadComplete', function(){ @@ -65,5 +73,32 @@ $(document).ready(function() { "\n", "\n"); } }); + + self.setupRecentUploadsTable = function() { + return recentUploadsTable = $("#recent_uploads_table").dataTable({ + "bJQueryUI": true, + "bProcessing": false, + "bServerSide": true, + "sAjaxSource": '/Plupload/recent-uploads/format/json', + "sAjaxDataProp": 'files', + "bSearchable": false, + "bInfo": true, + "sScrollY": "200px", + "bFilter": false, + "bSort": false, + "sDom": '<"H"l>frtip', + "bPaginate" : true, + "sPaginationType": "full_numbers", + "aoColumns": [ + { "mData" : "artist_name", "sTitle" : $.i18n._("Creator") }, + { "mData" : "track_title", "sTitle" : $.i18n._("Title") }, + { "mData" : "state", "sTitle" : $.i18n._("Import Status")}, + { "mData" : "utime", "sTitle" : $.i18n._("Uploaded") } + ] + }); + }; + self.recentUploadsTable = self.setupRecentUploadsTable(); + + $("#recent_uploads_table.div.fg-toolbar").prepend('Custom tool bar! Text/images etc.'); }); diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index af880a735b..cdda6bd655 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -2,6 +2,8 @@ import multiprocessing import shutil import os, errno +import time +import uuid from metadata_analyzer import MetadataAnalyzer class AnalyzerPipeline: @@ -33,6 +35,9 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): # back to the main process. #Import the file over to it's final location. + #TODO: Move all this file moving stuff to its own Analyzer class. + # Also, handle the case where the move fails and write some code + # to possibly move the file to problem_files. final_file_path = import_directory if results.has_key("artist_name"): @@ -44,16 +49,28 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): #Ensure any redundant slashes are stripped final_file_path = os.path.normpath(final_file_path) - #final_audio_file_path = final_directory + os.sep + os.path.basename(audio_file_path) + #If a file with the same name already exists in the "import" directory, then + #we add a unique string to the end of this one. We never overwrite a file on import + #because if we did that, it would mean Airtime's database would have + #the wrong information for the file we just overwrote (eg. the song length would be wrong!) if os.path.exists(final_file_path) and not os.path.samefile(audio_file_path, final_file_path): - raise Exception("File exists and will not be overwritten.") # by design - #Overwriting a file would mean Airtime's database has the wrong information... - - #Ensure the full path to the file exists - mkdir_p(os.path.dirname(final_file_path)) - - #Move the file into its final destination directory - shutil.move(audio_file_path, final_file_path) + #If the final file path is the same as the file we've been told to import (which + #you often do when you're debugging), then don't move the file at all. + + base_file_path, file_extension = os.path.splitext(final_file_path) + final_file_path = "%s_%s%s" % (base_file_path, time.strftime("%m-%d-%Y-%H-%M-%S", time.localtime()), file_extension) + + #If THAT path exists, append a UUID instead: + while os.path.exists(final_file_path): + base_file_path, file_extension = os.path.splitext(final_file_path) + final_file_path = "%s_%s%s" % (base_file_path, str(uuid.uuid4()), file_extension) + + #Ensure the full path to the file exists + mkdir_p(os.path.dirname(final_file_path)) + + #Move the file into its final destination directory + shutil.move(audio_file_path, final_file_path) + #Pass the full path back to Airtime results["full_path"] = final_file_path diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index 4f262b9d3b..b2876119df 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -100,7 +100,9 @@ def analyze(filename): #Airtime <= 2.5.x nonsense: metadata["ftype"] = "audioclip" + #Other fields we'll want to set for Airtime: metadata["cueout"] = metadata["length"] + metadata["hidden"] = False return metadata From 8f7ecafcf639e0c40d66bdce1f06dad67dc51c6d Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 21 Mar 2014 14:03:17 -0400 Subject: [PATCH 027/310] CC-5709: Airtime Analyzer * A bunch of changes that somehow didn't make it into my last commit... * confused --- .../application/configs/airtime-conf.php | 10 +- .../controllers/PluploadController.php | 22 +++- .../models/airtime/map/CcFilesTableMap.php | 2 +- .../models/airtime/om/BaseCcFiles.php | 52 ++++---- .../models/airtime/om/BaseCcFilesPeer.php | 28 ++-- .../models/airtime/om/BaseCcFilesQuery.php | 37 ++++-- .../rest/controllers/MediaController.php | 3 +- airtime_mvc/build/build.properties | 2 +- airtime_mvc/build/sql/schema.sql | 2 +- .../public/js/airtime/library/plupload.js | 123 ++++++++++++------ .../upgrades/airtime-2.5.3/DbUpgrade.php | 24 ++++ .../airtime-2.5.3/airtime-upgrade.php | 8 ++ .../upgrades/airtime-2.5.3/data/upgrade.sql | 6 + python_apps/airtime_analyzer/README.rst | 2 +- 14 files changed, 212 insertions(+), 109 deletions(-) create mode 100644 install_minimal/upgrades/airtime-2.5.3/DbUpgrade.php create mode 100644 install_minimal/upgrades/airtime-2.5.3/airtime-upgrade.php create mode 100644 install_minimal/upgrades/airtime-2.5.3/data/upgrade.sql diff --git a/airtime_mvc/application/configs/airtime-conf.php b/airtime_mvc/application/configs/airtime-conf.php index aa69b61561..e767e18b83 100644 --- a/airtime_mvc/application/configs/airtime-conf.php +++ b/airtime_mvc/application/configs/airtime-conf.php @@ -1,6 +1,6 @@ array ( @@ -12,6 +12,14 @@ 'dsn' => 'pgsql:host=localhost;port=5432;dbname=airtime;user=airtime;password=airtime', ), ), + 'airtime_test' => + array ( + 'adapter' => 'pgsql', + 'connection' => + array ( + 'dsn' => 'pgsql:host=localhost;port=5432;dbname=airtime_test;user=airtime;password=airtime', + ), + ), 'default' => 'airtime', ), 'generator_version' => '1.5.2', diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index daeacd7584..37f856b8a0 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -38,19 +38,28 @@ public function uploadAction() public function recentUploadsAction() { - //$this->dis - //( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1' ) + if (isset($_GET['uploadFilter'])) { + $filter = $_GET['uploadFilter']; + } else { + $filter = "all"; + } + $limit = isset($_GET['iDisplayLength']) ? $_GET['iDisplayLength'] : 10; $rowStart = isset($_GET['iDisplayStart']) ? $_GET['iDisplayStart'] : 0; - $recentUploads = CcFilesQuery::create()->filterByDbUtime(array('min' => time() - 30 * 24 * 60 * 60)) + $recentUploadsQuery = CcFilesQuery::create()->filterByDbUtime(array('min' => time() - 30 * 24 * 60 * 60)) ->orderByDbUtime(Criteria::DESC) ->offset($rowStart) - ->limit($limit) - ->find(); + ->limit($limit); - $numRecentUploads = $limit; + if ($filter == "pending") { + $recentUploadsQuery->filterByDbImportStatus("1"); + } else if ($filter == "failed") { + $recentUploadsQuery->filterByDbImportStatus(array('min' => 100)); + } + $recentUploads = $recentUploadsQuery->find(); + $numRecentUploads = $limit; $numTotalRecentUploads = CcFilesQuery::create()->filterByDbUtime(array('min' => time() - 30 * 24 * 60 * 60)) ->count(); @@ -64,6 +73,7 @@ public function recentUploadsAction() //array_push($uploadsArray, $upload); //TODO: $this->sanitizeResponse($upload)); //$this->_helper->json->sendJson($upload->asJson()); + //TODO: Invoke sanitization here array_push($uploadsArray, $upload->toArray(BasePeer::TYPE_FIELDNAME)); } diff --git a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php index 6f9f414ddb..348d2482ed 100644 --- a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php @@ -44,7 +44,7 @@ public function initialize() $this->addColumn('FTYPE', 'DbFtype', 'VARCHAR', true, 128, ''); $this->addForeignKey('DIRECTORY', 'DbDirectory', 'INTEGER', 'cc_music_dirs', 'ID', false, null, null); $this->addColumn('FILEPATH', 'DbFilepath', 'LONGVARCHAR', false, null, ''); - $this->addColumn('STATE', 'DbState', 'VARCHAR', true, 128, 'empty'); + $this->addColumn('IMPORT_STATUS', 'DbImportStatus', 'INTEGER', true, null, 0); $this->addColumn('CURRENTLYACCESSING', 'DbCurrentlyaccessing', 'INTEGER', true, null, 0); $this->addForeignKey('EDITEDBY', 'DbEditedby', 'INTEGER', 'cc_subjs', 'ID', false, null, null); $this->addColumn('MTIME', 'DbMtime', 'TIMESTAMP', false, 6, null); diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php index 38d147c07f..59ea2b6c8a 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php @@ -65,11 +65,11 @@ abstract class BaseCcFiles extends BaseObject implements Persistent protected $filepath; /** - * The value for the state field. - * Note: this column has a database default value of: 'empty' - * @var string + * The value for the import_status field. + * Note: this column has a database default value of: 0 + * @var int */ - protected $state; + protected $import_status; /** * The value for the currentlyaccessing field. @@ -524,7 +524,7 @@ public function applyDefaultValues() $this->mime = ''; $this->ftype = ''; $this->filepath = ''; - $this->state = 'empty'; + $this->import_status = 0; $this->currentlyaccessing = 0; $this->length = '00:00:00'; $this->file_exists = true; @@ -607,13 +607,13 @@ public function getDbFilepath() } /** - * Get the [state] column value. + * Get the [import_status] column value. * - * @return string + * @return int */ - public function getDbState() + public function getDbImportStatus() { - return $this->state; + return $this->import_status; } /** @@ -1463,24 +1463,24 @@ public function setDbFilepath($v) } // setDbFilepath() /** - * Set the value of [state] column. + * Set the value of [import_status] column. * - * @param string $v new value + * @param int $v new value * @return CcFiles The current object (for fluent API support) */ - public function setDbState($v) + public function setDbImportStatus($v) { if ($v !== null) { - $v = (string) $v; + $v = (int) $v; } - if ($this->state !== $v || $this->isNew()) { - $this->state = $v; - $this->modifiedColumns[] = CcFilesPeer::STATE; + if ($this->import_status !== $v || $this->isNew()) { + $this->import_status = $v; + $this->modifiedColumns[] = CcFilesPeer::IMPORT_STATUS; } return $this; - } // setDbState() + } // setDbImportStatus() /** * Set the value of [currentlyaccessing] column. @@ -2892,7 +2892,7 @@ public function hasOnlyDefaultValues() return false; } - if ($this->state !== 'empty') { + if ($this->import_status !== 0) { return false; } @@ -2960,7 +2960,7 @@ public function hydrate($row, $startcol = 0, $rehydrate = false) $this->ftype = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; $this->directory = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; $this->filepath = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; - $this->state = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; + $this->import_status = ($row[$startcol + 6] !== null) ? (int) $row[$startcol + 6] : null; $this->currentlyaccessing = ($row[$startcol + 7] !== null) ? (int) $row[$startcol + 7] : null; $this->editedby = ($row[$startcol + 8] !== null) ? (int) $row[$startcol + 8] : null; $this->mtime = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; @@ -3502,7 +3502,7 @@ public function getByPosition($pos) return $this->getDbFilepath(); break; case 6: - return $this->getDbState(); + return $this->getDbImportStatus(); break; case 7: return $this->getDbCurrentlyaccessing(); @@ -3723,7 +3723,7 @@ public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColum $keys[3] => $this->getDbFtype(), $keys[4] => $this->getDbDirectory(), $keys[5] => $this->getDbFilepath(), - $keys[6] => $this->getDbState(), + $keys[6] => $this->getDbImportStatus(), $keys[7] => $this->getDbCurrentlyaccessing(), $keys[8] => $this->getDbEditedby(), $keys[9] => $this->getDbMtime(), @@ -3848,7 +3848,7 @@ public function setByPosition($pos, $value) $this->setDbFilepath($value); break; case 6: - $this->setDbState($value); + $this->setDbImportStatus($value); break; case 7: $this->setDbCurrentlyaccessing($value); @@ -4069,7 +4069,7 @@ public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) if (array_key_exists($keys[3], $arr)) $this->setDbFtype($arr[$keys[3]]); if (array_key_exists($keys[4], $arr)) $this->setDbDirectory($arr[$keys[4]]); if (array_key_exists($keys[5], $arr)) $this->setDbFilepath($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setDbState($arr[$keys[6]]); + if (array_key_exists($keys[6], $arr)) $this->setDbImportStatus($arr[$keys[6]]); if (array_key_exists($keys[7], $arr)) $this->setDbCurrentlyaccessing($arr[$keys[7]]); if (array_key_exists($keys[8], $arr)) $this->setDbEditedby($arr[$keys[8]]); if (array_key_exists($keys[9], $arr)) $this->setDbMtime($arr[$keys[9]]); @@ -4150,7 +4150,7 @@ public function buildCriteria() if ($this->isColumnModified(CcFilesPeer::FTYPE)) $criteria->add(CcFilesPeer::FTYPE, $this->ftype); if ($this->isColumnModified(CcFilesPeer::DIRECTORY)) $criteria->add(CcFilesPeer::DIRECTORY, $this->directory); if ($this->isColumnModified(CcFilesPeer::FILEPATH)) $criteria->add(CcFilesPeer::FILEPATH, $this->filepath); - if ($this->isColumnModified(CcFilesPeer::STATE)) $criteria->add(CcFilesPeer::STATE, $this->state); + if ($this->isColumnModified(CcFilesPeer::IMPORT_STATUS)) $criteria->add(CcFilesPeer::IMPORT_STATUS, $this->import_status); if ($this->isColumnModified(CcFilesPeer::CURRENTLYACCESSING)) $criteria->add(CcFilesPeer::CURRENTLYACCESSING, $this->currentlyaccessing); if ($this->isColumnModified(CcFilesPeer::EDITEDBY)) $criteria->add(CcFilesPeer::EDITEDBY, $this->editedby); if ($this->isColumnModified(CcFilesPeer::MTIME)) $criteria->add(CcFilesPeer::MTIME, $this->mtime); @@ -4280,7 +4280,7 @@ public function copyInto($copyObj, $deepCopy = false) $copyObj->setDbFtype($this->ftype); $copyObj->setDbDirectory($this->directory); $copyObj->setDbFilepath($this->filepath); - $copyObj->setDbState($this->state); + $copyObj->setDbImportStatus($this->import_status); $copyObj->setDbCurrentlyaccessing($this->currentlyaccessing); $copyObj->setDbEditedby($this->editedby); $copyObj->setDbMtime($this->mtime); @@ -5328,7 +5328,7 @@ public function clear() $this->ftype = null; $this->directory = null; $this->filepath = null; - $this->state = null; + $this->import_status = null; $this->currentlyaccessing = null; $this->editedby = null; $this->mtime = null; diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php index dbfbeaf066..dd2e9bec5e 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php @@ -49,8 +49,8 @@ abstract class BaseCcFilesPeer { /** the column name for the FILEPATH field */ const FILEPATH = 'cc_files.FILEPATH'; - /** the column name for the STATE field */ - const STATE = 'cc_files.STATE'; + /** the column name for the IMPORT_STATUS field */ + const IMPORT_STATUS = 'cc_files.IMPORT_STATUS'; /** the column name for the CURRENTLYACCESSING field */ const CURRENTLYACCESSING = 'cc_files.CURRENTLYACCESSING'; @@ -257,11 +257,11 @@ abstract class BaseCcFilesPeer { * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbState', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbState', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::NAME, self::MIME, self::FTYPE, self::DIRECTORY, self::FILEPATH, self::STATE, self::CURRENTLYACCESSING, self::EDITEDBY, self::MTIME, self::UTIME, self::LPTIME, self::MD5, self::TRACK_TITLE, self::ARTIST_NAME, self::BIT_RATE, self::SAMPLE_RATE, self::FORMAT, self::LENGTH, self::ALBUM_TITLE, self::GENRE, self::COMMENTS, self::YEAR, self::TRACK_NUMBER, self::CHANNELS, self::URL, self::BPM, self::RATING, self::ENCODED_BY, self::DISC_NUMBER, self::MOOD, self::LABEL, self::COMPOSER, self::ENCODER, self::CHECKSUM, self::LYRICS, self::ORCHESTRA, self::CONDUCTOR, self::LYRICIST, self::ORIGINAL_LYRICIST, self::RADIO_STATION_NAME, self::INFO_URL, self::ARTIST_URL, self::AUDIO_SOURCE_URL, self::RADIO_STATION_URL, self::BUY_THIS_URL, self::ISRC_NUMBER, self::CATALOG_NUMBER, self::ORIGINAL_ARTIST, self::COPYRIGHT, self::REPORT_DATETIME, self::REPORT_LOCATION, self::REPORT_ORGANIZATION, self::SUBJECT, self::CONTRIBUTOR, self::LANGUAGE, self::FILE_EXISTS, self::SOUNDCLOUD_ID, self::SOUNDCLOUD_ERROR_CODE, self::SOUNDCLOUD_ERROR_MSG, self::SOUNDCLOUD_LINK_TO_FILE, self::SOUNDCLOUD_UPLOAD_TIME, self::REPLAY_GAIN, self::OWNER_ID, self::CUEIN, self::CUEOUT, self::SILAN_CHECK, self::HIDDEN, self::IS_SCHEDULED, self::IS_PLAYLIST, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'STATE', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'state', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', ), + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbImportStatus', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbImportStatus', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', ), + BasePeer::TYPE_COLNAME => array (self::ID, self::NAME, self::MIME, self::FTYPE, self::DIRECTORY, self::FILEPATH, self::IMPORT_STATUS, self::CURRENTLYACCESSING, self::EDITEDBY, self::MTIME, self::UTIME, self::LPTIME, self::MD5, self::TRACK_TITLE, self::ARTIST_NAME, self::BIT_RATE, self::SAMPLE_RATE, self::FORMAT, self::LENGTH, self::ALBUM_TITLE, self::GENRE, self::COMMENTS, self::YEAR, self::TRACK_NUMBER, self::CHANNELS, self::URL, self::BPM, self::RATING, self::ENCODED_BY, self::DISC_NUMBER, self::MOOD, self::LABEL, self::COMPOSER, self::ENCODER, self::CHECKSUM, self::LYRICS, self::ORCHESTRA, self::CONDUCTOR, self::LYRICIST, self::ORIGINAL_LYRICIST, self::RADIO_STATION_NAME, self::INFO_URL, self::ARTIST_URL, self::AUDIO_SOURCE_URL, self::RADIO_STATION_URL, self::BUY_THIS_URL, self::ISRC_NUMBER, self::CATALOG_NUMBER, self::ORIGINAL_ARTIST, self::COPYRIGHT, self::REPORT_DATETIME, self::REPORT_LOCATION, self::REPORT_ORGANIZATION, self::SUBJECT, self::CONTRIBUTOR, self::LANGUAGE, self::FILE_EXISTS, self::SOUNDCLOUD_ID, self::SOUNDCLOUD_ERROR_CODE, self::SOUNDCLOUD_ERROR_MSG, self::SOUNDCLOUD_LINK_TO_FILE, self::SOUNDCLOUD_UPLOAD_TIME, self::REPLAY_GAIN, self::OWNER_ID, self::CUEIN, self::CUEOUT, self::SILAN_CHECK, self::HIDDEN, self::IS_SCHEDULED, self::IS_PLAYLIST, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'IMPORT_STATUS', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'import_status', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', ), BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, ) ); @@ -272,11 +272,11 @@ abstract class BaseCcFilesPeer { * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbState' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbState' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::NAME => 1, self::MIME => 2, self::FTYPE => 3, self::DIRECTORY => 4, self::FILEPATH => 5, self::STATE => 6, self::CURRENTLYACCESSING => 7, self::EDITEDBY => 8, self::MTIME => 9, self::UTIME => 10, self::LPTIME => 11, self::MD5 => 12, self::TRACK_TITLE => 13, self::ARTIST_NAME => 14, self::BIT_RATE => 15, self::SAMPLE_RATE => 16, self::FORMAT => 17, self::LENGTH => 18, self::ALBUM_TITLE => 19, self::GENRE => 20, self::COMMENTS => 21, self::YEAR => 22, self::TRACK_NUMBER => 23, self::CHANNELS => 24, self::URL => 25, self::BPM => 26, self::RATING => 27, self::ENCODED_BY => 28, self::DISC_NUMBER => 29, self::MOOD => 30, self::LABEL => 31, self::COMPOSER => 32, self::ENCODER => 33, self::CHECKSUM => 34, self::LYRICS => 35, self::ORCHESTRA => 36, self::CONDUCTOR => 37, self::LYRICIST => 38, self::ORIGINAL_LYRICIST => 39, self::RADIO_STATION_NAME => 40, self::INFO_URL => 41, self::ARTIST_URL => 42, self::AUDIO_SOURCE_URL => 43, self::RADIO_STATION_URL => 44, self::BUY_THIS_URL => 45, self::ISRC_NUMBER => 46, self::CATALOG_NUMBER => 47, self::ORIGINAL_ARTIST => 48, self::COPYRIGHT => 49, self::REPORT_DATETIME => 50, self::REPORT_LOCATION => 51, self::REPORT_ORGANIZATION => 52, self::SUBJECT => 53, self::CONTRIBUTOR => 54, self::LANGUAGE => 55, self::FILE_EXISTS => 56, self::SOUNDCLOUD_ID => 57, self::SOUNDCLOUD_ERROR_CODE => 58, self::SOUNDCLOUD_ERROR_MSG => 59, self::SOUNDCLOUD_LINK_TO_FILE => 60, self::SOUNDCLOUD_UPLOAD_TIME => 61, self::REPLAY_GAIN => 62, self::OWNER_ID => 63, self::CUEIN => 64, self::CUEOUT => 65, self::SILAN_CHECK => 66, self::HIDDEN => 67, self::IS_SCHEDULED => 68, self::IS_PLAYLIST => 69, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'STATE' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'state' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, ), + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbImportStatus' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbImportStatus' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, ), + BasePeer::TYPE_COLNAME => array (self::ID => 0, self::NAME => 1, self::MIME => 2, self::FTYPE => 3, self::DIRECTORY => 4, self::FILEPATH => 5, self::IMPORT_STATUS => 6, self::CURRENTLYACCESSING => 7, self::EDITEDBY => 8, self::MTIME => 9, self::UTIME => 10, self::LPTIME => 11, self::MD5 => 12, self::TRACK_TITLE => 13, self::ARTIST_NAME => 14, self::BIT_RATE => 15, self::SAMPLE_RATE => 16, self::FORMAT => 17, self::LENGTH => 18, self::ALBUM_TITLE => 19, self::GENRE => 20, self::COMMENTS => 21, self::YEAR => 22, self::TRACK_NUMBER => 23, self::CHANNELS => 24, self::URL => 25, self::BPM => 26, self::RATING => 27, self::ENCODED_BY => 28, self::DISC_NUMBER => 29, self::MOOD => 30, self::LABEL => 31, self::COMPOSER => 32, self::ENCODER => 33, self::CHECKSUM => 34, self::LYRICS => 35, self::ORCHESTRA => 36, self::CONDUCTOR => 37, self::LYRICIST => 38, self::ORIGINAL_LYRICIST => 39, self::RADIO_STATION_NAME => 40, self::INFO_URL => 41, self::ARTIST_URL => 42, self::AUDIO_SOURCE_URL => 43, self::RADIO_STATION_URL => 44, self::BUY_THIS_URL => 45, self::ISRC_NUMBER => 46, self::CATALOG_NUMBER => 47, self::ORIGINAL_ARTIST => 48, self::COPYRIGHT => 49, self::REPORT_DATETIME => 50, self::REPORT_LOCATION => 51, self::REPORT_ORGANIZATION => 52, self::SUBJECT => 53, self::CONTRIBUTOR => 54, self::LANGUAGE => 55, self::FILE_EXISTS => 56, self::SOUNDCLOUD_ID => 57, self::SOUNDCLOUD_ERROR_CODE => 58, self::SOUNDCLOUD_ERROR_MSG => 59, self::SOUNDCLOUD_LINK_TO_FILE => 60, self::SOUNDCLOUD_UPLOAD_TIME => 61, self::REPLAY_GAIN => 62, self::OWNER_ID => 63, self::CUEIN => 64, self::CUEOUT => 65, self::SILAN_CHECK => 66, self::HIDDEN => 67, self::IS_SCHEDULED => 68, self::IS_PLAYLIST => 69, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'IMPORT_STATUS' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'import_status' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, ), BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, ) ); @@ -355,7 +355,7 @@ public static function addSelectColumns(Criteria $criteria, $alias = null) $criteria->addSelectColumn(CcFilesPeer::FTYPE); $criteria->addSelectColumn(CcFilesPeer::DIRECTORY); $criteria->addSelectColumn(CcFilesPeer::FILEPATH); - $criteria->addSelectColumn(CcFilesPeer::STATE); + $criteria->addSelectColumn(CcFilesPeer::IMPORT_STATUS); $criteria->addSelectColumn(CcFilesPeer::CURRENTLYACCESSING); $criteria->addSelectColumn(CcFilesPeer::EDITEDBY); $criteria->addSelectColumn(CcFilesPeer::MTIME); @@ -426,7 +426,7 @@ public static function addSelectColumns(Criteria $criteria, $alias = null) $criteria->addSelectColumn($alias . '.FTYPE'); $criteria->addSelectColumn($alias . '.DIRECTORY'); $criteria->addSelectColumn($alias . '.FILEPATH'); - $criteria->addSelectColumn($alias . '.STATE'); + $criteria->addSelectColumn($alias . '.IMPORT_STATUS'); $criteria->addSelectColumn($alias . '.CURRENTLYACCESSING'); $criteria->addSelectColumn($alias . '.EDITEDBY'); $criteria->addSelectColumn($alias . '.MTIME'); diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php index 50a21a3327..e939859222 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php @@ -12,7 +12,7 @@ * @method CcFilesQuery orderByDbFtype($order = Criteria::ASC) Order by the ftype column * @method CcFilesQuery orderByDbDirectory($order = Criteria::ASC) Order by the directory column * @method CcFilesQuery orderByDbFilepath($order = Criteria::ASC) Order by the filepath column - * @method CcFilesQuery orderByDbState($order = Criteria::ASC) Order by the state column + * @method CcFilesQuery orderByDbImportStatus($order = Criteria::ASC) Order by the import_status column * @method CcFilesQuery orderByDbCurrentlyaccessing($order = Criteria::ASC) Order by the currentlyaccessing column * @method CcFilesQuery orderByDbEditedby($order = Criteria::ASC) Order by the editedby column * @method CcFilesQuery orderByDbMtime($order = Criteria::ASC) Order by the mtime column @@ -83,7 +83,7 @@ * @method CcFilesQuery groupByDbFtype() Group by the ftype column * @method CcFilesQuery groupByDbDirectory() Group by the directory column * @method CcFilesQuery groupByDbFilepath() Group by the filepath column - * @method CcFilesQuery groupByDbState() Group by the state column + * @method CcFilesQuery groupByDbImportStatus() Group by the import_status column * @method CcFilesQuery groupByDbCurrentlyaccessing() Group by the currentlyaccessing column * @method CcFilesQuery groupByDbEditedby() Group by the editedby column * @method CcFilesQuery groupByDbMtime() Group by the mtime column @@ -193,7 +193,7 @@ * @method CcFiles findOneByDbFtype(string $ftype) Return the first CcFiles filtered by the ftype column * @method CcFiles findOneByDbDirectory(int $directory) Return the first CcFiles filtered by the directory column * @method CcFiles findOneByDbFilepath(string $filepath) Return the first CcFiles filtered by the filepath column - * @method CcFiles findOneByDbState(string $state) Return the first CcFiles filtered by the state column + * @method CcFiles findOneByDbImportStatus(int $import_status) Return the first CcFiles filtered by the import_status column * @method CcFiles findOneByDbCurrentlyaccessing(int $currentlyaccessing) Return the first CcFiles filtered by the currentlyaccessing column * @method CcFiles findOneByDbEditedby(int $editedby) Return the first CcFiles filtered by the editedby column * @method CcFiles findOneByDbMtime(string $mtime) Return the first CcFiles filtered by the mtime column @@ -264,7 +264,7 @@ * @method array findByDbFtype(string $ftype) Return CcFiles objects filtered by the ftype column * @method array findByDbDirectory(int $directory) Return CcFiles objects filtered by the directory column * @method array findByDbFilepath(string $filepath) Return CcFiles objects filtered by the filepath column - * @method array findByDbState(string $state) Return CcFiles objects filtered by the state column + * @method array findByDbImportStatus(int $import_status) Return CcFiles objects filtered by the import_status column * @method array findByDbCurrentlyaccessing(int $currentlyaccessing) Return CcFiles objects filtered by the currentlyaccessing column * @method array findByDbEditedby(int $editedby) Return CcFiles objects filtered by the editedby column * @method array findByDbMtime(string $mtime) Return CcFiles objects filtered by the mtime column @@ -574,25 +574,34 @@ public function filterByDbFilepath($dbFilepath = null, $comparison = null) } /** - * Filter the query on the state column + * Filter the query on the import_status column * - * @param string $dbState The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) + * @param int|array $dbImportStatus The value to use as filter. + * Accepts an associative array('min' => $minValue, 'max' => $maxValue) * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL * * @return CcFilesQuery The current query, for fluid interface */ - public function filterByDbState($dbState = null, $comparison = null) + public function filterByDbImportStatus($dbImportStatus = null, $comparison = null) { - if (null === $comparison) { - if (is_array($dbState)) { + if (is_array($dbImportStatus)) { + $useMinMax = false; + if (isset($dbImportStatus['min'])) { + $this->addUsingAlias(CcFilesPeer::IMPORT_STATUS, $dbImportStatus['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbImportStatus['max'])) { + $this->addUsingAlias(CcFilesPeer::IMPORT_STATUS, $dbImportStatus['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbState)) { - $dbState = str_replace('*', '%', $dbState); - $comparison = Criteria::LIKE; } } - return $this->addUsingAlias(CcFilesPeer::STATE, $dbState, $comparison); + return $this->addUsingAlias(CcFilesPeer::IMPORT_STATUS, $dbImportStatus, $comparison); } /** diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index d96be32601..7d17b63a05 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -198,7 +198,8 @@ public function deleteAction() } $file = CcFilesQuery::create()->findPk($id); if ($file) { - $storedFile = Application_Model_StoredFile($file); + $con = Propel::getConnection(); + $storedFile = new Application_Model_StoredFile($file, $con); Application_Model_Preference::updateDiskUsage(-1 * abs(filesize($storedFile->getFilePath()))); $storedFile->delete(); //TODO: This checks your session permissions... Make it work without a session? $file->delete(); diff --git a/airtime_mvc/build/build.properties b/airtime_mvc/build/build.properties index de8c64cb5c..da4a768773 100644 --- a/airtime_mvc/build/build.properties +++ b/airtime_mvc/build/build.properties @@ -1,6 +1,6 @@ #Note: project.home is automatically generated by the propel-install script. #Any manual changes to this value will be overwritten. -project.home = /home/asantoni/airtime/airtime_mvc +project.home = /home/ubuntu/airtime/airtime_mvc project.build = ${project.home}/build #Database driver diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index 13d1654a56..8eb6388786 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -36,7 +36,7 @@ CREATE TABLE "cc_files" "ftype" VARCHAR(128) default '' NOT NULL, "directory" INTEGER, "filepath" TEXT default '', - "state" VARCHAR(128) default 'empty' NOT NULL, + "import_status" INTEGER default 0 NOT NULL, "currentlyaccessing" INTEGER default 0 NOT NULL, "editedby" INTEGER, "mtime" TIMESTAMP(6), diff --git a/airtime_mvc/public/js/airtime/library/plupload.js b/airtime_mvc/public/js/airtime/library/plupload.js index d1ac34ff78..e98e7f165b 100644 --- a/airtime_mvc/public/js/airtime/library/plupload.js +++ b/airtime_mvc/public/js/airtime/library/plupload.js @@ -2,11 +2,11 @@ $(document).ready(function() { var uploader; var self = this; + self.uploadFilter = "all"; $("#plupload_files").pluploadQueue({ // General settings runtimes : 'gears, html5, html4', - //url : baseUrl+'Plupload/upload/format/json', url : baseUrl+'rest/media', //chunk_size : '5mb', //Disabling chunking since we're using the File Upload REST API now unique_names : 'true', @@ -18,43 +18,11 @@ $(document).ready(function() { uploader = $("#plupload_files").pluploadQueue(); - uploader.bind('FileUploaded', function(up, file, json) { - - var j = jQuery.parseJSON(json.response); - console.log(j); - console.log(file.name); - + uploader.bind('FileUploaded', function(up, file, json) + { + //Refresh the upload table: self.recentUploadsTable.fnDraw(); //Only works because we're using bServerSide //In DataTables 1.10 and greater, we can use .fnAjaxReload() - - /* - var j = jQuery.parseJSON(json.response); - - console.log(json.response); - if (j.error !== undefined) { - var row = $("") - .append('' + file.name +'') - .append('' + j.error.message + ''); - - $("#plupload_error").find("table").append(row); - $("#plupload_error table").css("display", "inline-table"); - } else { - //FIXME: This should just update something in the GUI, not communicate with the backend -- Albert - /* - var tempFileName = j.tempfilepath; - $.get(baseUrl+'Plupload/copyfile/format/json/name/'+ - encodeURIComponent(file.name)+'/tempname/' + - encodeURIComponent(tempFileName), function(jr){ - if(jr.error !== undefined) { - var row = $("") - .append('' + file.name +'') - .append('' + jr.error.message + ''); - - $("#plupload_error").find("table").append(row); - $("#plupload_error table").css("display", "inline-table"); - } - }); - }*/ }); var uploadProgress = false; @@ -74,8 +42,49 @@ $(document).ready(function() { } }); + self.renderImportStatus = function ( data, type, full ) { + if (typeof data !== "number") { + console.log("Invalid data type for the import_status."); + return; + } + var statusStr = $.i18n._("Unknown"); + if (data == 0) + { + statusStr = $.i18n._("Successfully imported"); + } + else if (data == 1) + { + statusStr = $.i18n._("Pending import"); + } + + return statusStr; + }; + + self.renderFileActions = function ( data, type, full ) { + return '
Delete'; + }; + + $("#recent_uploads_table").on("click", "a.deleteFileAction", function () { + //Grab the file object for the row that was clicked. + // Some tips from the DataTables forums: + // fnGetData is used to get the object behind the row - you can also use + // fnGetPosition if you need to get the index instead + file = $("#recent_uploads_table").dataTable().fnGetData($(this).closest("tr")[0]); + + $.ajax({ + type: 'DELETE', + url: '/rest/media/' + file.id, + success: function(resp) { + self.recentUploadsTable.fnDraw(); + }, + error: function() { + alert($.i18n._("Error: The file could not be deleted. Please try again later.")); + } + }); + }); + self.setupRecentUploadsTable = function() { - return recentUploadsTable = $("#recent_uploads_table").dataTable({ + recentUploadsTable = $("#recent_uploads_table").dataTable({ "bJQueryUI": true, "bProcessing": false, "bServerSide": true, @@ -83,7 +92,7 @@ $(document).ready(function() { "sAjaxDataProp": 'files', "bSearchable": false, "bInfo": true, - "sScrollY": "200px", + //"sScrollY": "200px", "bFilter": false, "bSort": false, "sDom": '<"H"l>frtip', @@ -92,13 +101,41 @@ $(document).ready(function() { "aoColumns": [ { "mData" : "artist_name", "sTitle" : $.i18n._("Creator") }, { "mData" : "track_title", "sTitle" : $.i18n._("Title") }, - { "mData" : "state", "sTitle" : $.i18n._("Import Status")}, - { "mData" : "utime", "sTitle" : $.i18n._("Uploaded") } - ] + { "mData" : "import_status", "sTitle" : $.i18n._("Import Status"), + "mRender": self.renderImportStatus + }, + { "mData" : "utime", "sTitle" : $.i18n._("Uploaded") }, + { "mData" : "id", "sTitle" : $.i18n._("Actions"), + "mRender": self.renderFileActions + } + ], + "fnServerData": function ( sSource, aoData, fnCallback ) { + /* Add some extra data to the sender */ + aoData.push( { "name": "uploadFilter", "value": self.uploadFilter } ); + $.getJSON( sSource, aoData, function (json) { + fnCallback(json); + } ); + } }); + + return recentUploadsTable; }; - self.recentUploadsTable = self.setupRecentUploadsTable(); + + $("#upload_status_all").click(function() { + self.uploadFilter = "all"; + self.recentUploadsTable.fnDraw(); + }); + $("#upload_status_pending").click(function() { + self.uploadFilter = "pending"; + self.recentUploadsTable.fnDraw(); + }); + $("#upload_status_failed").click(function() { + self.uploadFilter = "failed"; + self.recentUploadsTable.fnDraw(); + }); - $("#recent_uploads_table.div.fg-toolbar").prepend('Custom tool bar! Text/images etc.'); + //Create the recent uploads table. + self.recentUploadsTable = self.setupRecentUploadsTable(); + //$("#recent_uploads_table.div.fg-toolbar").prepend('Custom tool bar! Text/images etc.'); }); diff --git a/install_minimal/upgrades/airtime-2.5.3/DbUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/DbUpgrade.php new file mode 100644 index 0000000000..dbfef98c58 --- /dev/null +++ b/install_minimal/upgrades/airtime-2.5.3/DbUpgrade.php @@ -0,0 +1,24 @@ +&1 | grep -v \"will create implicit index\""); + } +} diff --git a/install_minimal/upgrades/airtime-2.5.3/airtime-upgrade.php b/install_minimal/upgrades/airtime-2.5.3/airtime-upgrade.php new file mode 100644 index 0000000000..042b92d051 --- /dev/null +++ b/install_minimal/upgrades/airtime-2.5.3/airtime-upgrade.php @@ -0,0 +1,8 @@ + Date: Sat, 22 Mar 2014 02:12:03 -0400 Subject: [PATCH 028/310] CC-5709: Airtime Analyzer * Remove the "hidden" field from the REST blacklist, the analyzer needs to set it. * Added import_status column messages in the recent uploads table * Auto-refresh the recent uploads table while imports are pending * Moved the file moving stuff to its own analyzer in airtime_analyzer * Basic error reporting to the REST API in airtime_analyzer, needs hardeneing though * Fixed a bug with the number of recent uploads * Prevent airtime_analyzer from running if media_monitor is running --- .../controllers/PluploadController.php | 12 ++-- .../rest/controllers/MediaController.php | 2 - .../public/js/airtime/library/plupload.js | 62 ++++++++++++++++--- .../airtime_analyzer/analyzer.py | 2 +- .../airtime_analyzer/analyzer_pipeline.py | 62 +++---------------- .../airtime_analyzer/message_listener.py | 4 +- .../airtime_analyzer/metadata_analyzer.py | 7 ++- .../airtime_analyzer/status_reporter.py | 35 +++++++---- .../airtime_analyzer/bin/airtime_analyzer | 20 ++++++ 9 files changed, 118 insertions(+), 88 deletions(-) diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index 37f856b8a0..c919207b46 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -48,20 +48,20 @@ public function recentUploadsAction() $rowStart = isset($_GET['iDisplayStart']) ? $_GET['iDisplayStart'] : 0; $recentUploadsQuery = CcFilesQuery::create()->filterByDbUtime(array('min' => time() - 30 * 24 * 60 * 60)) - ->orderByDbUtime(Criteria::DESC) - ->offset($rowStart) - ->limit($limit); + ->orderByDbUtime(Criteria::DESC); + + $numTotalRecentUploads = $recentUploadsQuery->find()->count(); if ($filter == "pending") { $recentUploadsQuery->filterByDbImportStatus("1"); } else if ($filter == "failed") { $recentUploadsQuery->filterByDbImportStatus(array('min' => 100)); } - $recentUploads = $recentUploadsQuery->find(); + + $recentUploads = $recentUploadsQuery->offset($rowStart)->limit($limit)->find(); $numRecentUploads = $limit; - $numTotalRecentUploads = CcFilesQuery::create()->filterByDbUtime(array('min' => time() - 30 * 24 * 60 * 60)) - ->count(); + //CcFilesQuery::create()->filterByDbUtime(array('min' => time() - 30 * 24 * 60 * 60)) //$this->_helper->json->sendJson(array("jsonrpc" => "2.0", "tempfilepath" => $tempFileName)); diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 7d17b63a05..245da3b0b6 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -7,7 +7,6 @@ class Rest_MediaController extends Zend_Rest_Controller private $blackList = array( 'id', 'file_exists', - 'hidden', 'silan_check', 'soundcloud_id', 'is_scheduled', @@ -17,7 +16,6 @@ class Rest_MediaController extends Zend_Rest_Controller //fields we should never expose through our RESTful API private $privateFields = array( 'file_exists', - 'hidden', 'silan_check', 'is_scheduled', 'is_playlist' diff --git a/airtime_mvc/public/js/airtime/library/plupload.js b/airtime_mvc/public/js/airtime/library/plupload.js index e98e7f165b..6d50a25989 100644 --- a/airtime_mvc/public/js/airtime/library/plupload.js +++ b/airtime_mvc/public/js/airtime/library/plupload.js @@ -3,6 +3,16 @@ $(document).ready(function() { var uploader; var self = this; self.uploadFilter = "all"; + + self.IMPORT_STATUS_CODES = { + 0 : { message: $.i18n._("Successfully imported")}, + 1 : { message: $.i18n._("Pending import")}, + 2 : { message: $.i18n._("Import failed.")}, + UNKNOWN : { message: $.i18n._("Unknown")} + }; + if (Object.freeze) { + Object.freeze(self.IMPORT_STATUS_CODES); + } $("#plupload_files").pluploadQueue({ // General settings @@ -47,17 +57,13 @@ $(document).ready(function() { console.log("Invalid data type for the import_status."); return; } - var statusStr = $.i18n._("Unknown"); - if (data == 0) - { - statusStr = $.i18n._("Successfully imported"); - } - else if (data == 1) - { - statusStr = $.i18n._("Pending import"); - } + var statusStr = self.IMPORT_STATUS_CODES.UNKNOWN.message; + var importStatusCode = data; + if (self.IMPORT_STATUS_CODES[importStatusCode]) { + statusStr = self.IMPORT_STATUS_CODES[importStatusCode].message; + }; - return statusStr; + return statusStr; }; self.renderFileActions = function ( data, type, full ) { @@ -114,6 +120,23 @@ $(document).ready(function() { aoData.push( { "name": "uploadFilter", "value": self.uploadFilter } ); $.getJSON( sSource, aoData, function (json) { fnCallback(json); + if (json.files) { + var areAnyFileImportsPending = false; + for (var i = 0; i < json.files.length; i++) { + //console.log(file); + var file = json.files[i]; + if (file.import_status == 1) + { + areAnyFileImportsPending = true; + } + } + if (areAnyFileImportsPending) { + //alert("pending uploads, starting refresh on timer"); + self.startRefreshingRecentUploads(); + } else { + self.stopRefreshingRecentUploads(); + } + } } ); } }); @@ -121,6 +144,25 @@ $(document).ready(function() { return recentUploadsTable; }; + self.startRefreshingRecentUploads = function() + { + if (self.isRecentUploadsRefreshTimerActive()) { //Prevent multiple timers from running + return; + } + self.recentUploadsRefreshTimer = setTimeout("self.recentUploadsTable.fnDraw()", 3000); + }; + + self.isRecentUploadsRefreshTimerActive = function() + { + return (self.recentUploadsRefreshTimer != null); + }; + + self.stopRefreshingRecentUploads = function() + { + clearTimeout(self.recentUploadsRefreshTimer); + self.recentUploadsRefreshTimer = null; + }; + $("#upload_status_all").click(function() { self.uploadFilter = "all"; self.recentUploadsTable.fnDraw(); diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py index de23a8e689..d897b479bf 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py @@ -2,7 +2,7 @@ class Analyzer: @staticmethod - def analyze(filename): + def analyze(filename, results): raise NotImplementedError class AnalyzerError(Exception): diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index cdda6bd655..3a267280fd 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -1,10 +1,7 @@ import logging import multiprocessing -import shutil -import os, errno -import time -import uuid from metadata_analyzer import MetadataAnalyzer +from filemover_analyzer import FileMoverAnalyzer class AnalyzerPipeline: @@ -29,59 +26,16 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): # Analyze the audio file we were told to analyze: # First, we extract the ID3 tags and other metadata: - results = MetadataAnalyzer.analyze(audio_file_path) + metadata = dict() + metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) + metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) + metadata["import_status"] = 0 # imported # Note that the queue we're putting the results into is our interprocess communication # back to the main process. - #Import the file over to it's final location. - #TODO: Move all this file moving stuff to its own Analyzer class. - # Also, handle the case where the move fails and write some code - # to possibly move the file to problem_files. - - final_file_path = import_directory - if results.has_key("artist_name"): - final_file_path += "/" + results["artist_name"] - if results.has_key("album"): - final_file_path += "/" + results["album"] - final_file_path += "/" + original_filename + #Pass all the file metadata back to the main analyzer process, which then passes + #it back to the Airtime web application. + queue.put(metadata) - #Ensure any redundant slashes are stripped - final_file_path = os.path.normpath(final_file_path) - - #If a file with the same name already exists in the "import" directory, then - #we add a unique string to the end of this one. We never overwrite a file on import - #because if we did that, it would mean Airtime's database would have - #the wrong information for the file we just overwrote (eg. the song length would be wrong!) - if os.path.exists(final_file_path) and not os.path.samefile(audio_file_path, final_file_path): - #If the final file path is the same as the file we've been told to import (which - #you often do when you're debugging), then don't move the file at all. - - base_file_path, file_extension = os.path.splitext(final_file_path) - final_file_path = "%s_%s%s" % (base_file_path, time.strftime("%m-%d-%Y-%H-%M-%S", time.localtime()), file_extension) - - #If THAT path exists, append a UUID instead: - while os.path.exists(final_file_path): - base_file_path, file_extension = os.path.splitext(final_file_path) - final_file_path = "%s_%s%s" % (base_file_path, str(uuid.uuid4()), file_extension) - - #Ensure the full path to the file exists - mkdir_p(os.path.dirname(final_file_path)) - - #Move the file into its final destination directory - shutil.move(audio_file_path, final_file_path) - - - #Pass the full path back to Airtime - results["full_path"] = final_file_path - queue.put(results) - - -def mkdir_p(path): - try: - os.makedirs(path) - except OSError as exc: # Python >2.5 - if exc.errno == errno.EEXIST and os.path.isdir(path): - pass - else: raise diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index edde9c0838..5fc04058e8 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -114,8 +114,8 @@ def msg_received_callback(channel, method_frame, header_frame, body): # # TODO: If the JSON was invalid or the web server is down, # then don't report that failure to the REST API - - StatusReporter.report_failure_to_callback_url(callback_url, api_key, error_status=1, + #TODO: Catch exceptions from this HTTP request too: + StatusReporter.report_failure_to_callback_url(callback_url, api_key, import_status=2, reason=u'An error occurred while importing this file') logging.exception(e) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index b2876119df..a75c4815d5 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -10,9 +10,12 @@ def __init__(self): pass @staticmethod - def analyze(filename): + def analyze(filename, metadata): + if not isinstance(filename, unicode): + raise TypeError("filename must be unicode. Was of type " + type(filename).__name__) + if not isinstance(metadata, dict): + raise TypeError("metadata must be a dict. Was of type " + type(metadata).__name__) - metadata = dict() #Extract metadata from an audio file using mutagen audio_file = mutagen.File(filename, easy=True) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index e91b246a89..75769a6920 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -11,20 +11,33 @@ class StatusReporter(): @classmethod def report_success_to_callback_url(self, callback_url, api_key, audio_metadata): - # Encode the audio metadata as JSON and post it back to the callback_url + # encode the audio metadata as json and post it back to the callback_url put_payload = json.dumps(audio_metadata) - logging.debug("Sending HTTP PUT with payload: " + put_payload) + logging.debug("sending http put with payload: " + put_payload) r = requests.put(callback_url, data=put_payload, - auth=requests.auth.HTTPBasicAuth(api_key, ''), - timeout=StatusReporter._HTTP_REQUEST_TIMEOUT) - logging.debug("HTTP request returned status: " + str(r.status_code)) - logging.debug(r.text) # Log the response body + auth=requests.auth.httpbasicauth(api_key, ''), + timeout=statusreporter._http_request_timeout) + logging.debug("http request returned status: " + str(r.status_code)) + logging.debug(r.text) # log the response body - #TODO: Queue up failed requests and try them again later. - r.raise_for_status() # Raise an exception if there was an HTTP error code returned + #todo: queue up failed requests and try them again later. + r.raise_for_status() # raise an exception if there was an http error code returned @classmethod - def report_failure_to_callback_url(self, callback_url, api_key, error_status, reason): - # TODO: Make error_status is an int? - pass + def report_failure_to_callback_url(self, callback_url, api_key, import_status, reason): + # TODO: Make import_status is an int? + + logging.debug("Reporting import failure to Airtime REST API...") + audio_metadata["import_status"] = import_status + audio_metadata["comment"] = reason # hack attack + put_payload = json.dumps(audio_metadata) + logging.debug("sending http put with payload: " + put_payload) + r = requests.put(callback_url, data=put_payload, + auth=requests.auth.httpbasicauth(api_key, ''), + timeout=statusreporter._http_request_timeout) + logging.debug("http request returned status: " + str(r.status_code)) + logging.debug(r.text) # log the response body + + #todo: queue up failed requests and try them again later. + r.raise_for_status() # raise an exception if there was an http error code returned diff --git a/python_apps/airtime_analyzer/bin/airtime_analyzer b/python_apps/airtime_analyzer/bin/airtime_analyzer index b90f4c7d94..23865fdc65 100755 --- a/python_apps/airtime_analyzer/bin/airtime_analyzer +++ b/python_apps/airtime_analyzer/bin/airtime_analyzer @@ -2,6 +2,7 @@ import daemon import argparse +import os import airtime_analyzer.airtime_analyzer as aa VERSION = "1.0" @@ -13,6 +14,25 @@ parser.add_argument("-d", "--daemon", help="run as a daemon", action="store_true parser.add_argument("--debug", help="log full debugging output", action="store_true") args = parser.parse_args() +'''Ensure media_monitor isn't running before we start, because it'll move newly uploaded + files into the library on us and screw up the operation of airtime_analyzer. + media_monitor is deprecated. +''' +def check_if_media_monitor_is_running(): + pids = [pid for pid in os.listdir('/proc') if pid.isdigit()] + + for pid in pids: + try: + process_name = open(os.path.join('/proc', pid, 'cmdline'), 'rb').read() + if 'media_monitor.py' in process_name: + print "Error: This process conflicts with media_monitor, and media_monitor is running." + print " Please terminate the running media_monitor.py process and try again." + exit(1) + except IOError: # proc has already terminated + continue + +check_if_media_monitor_is_running() + if args.daemon: with daemon.DaemonContext(): analyzer = aa.AirtimeAnalyzerServer(debug=args.debug) From eb37b39406a0bf206f2b4c8dea0e30ec00093bc2 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 24 Mar 2014 13:03:20 -0400 Subject: [PATCH 029/310] CC-5709: Airtime Analyzer * Added missing FileMoverAnalyzer file that I forgot to commit --- .../airtime_analyzer/filemover_analyzer.py | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py diff --git a/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py new file mode 100644 index 0000000000..0920bb8ecd --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py @@ -0,0 +1,80 @@ +import logging +import os +import time +import shutil +import os, errno +import time +import uuid + +from analyzer import Analyzer + +class FileMoverAnalyzer(Analyzer): + + def __init__(self): + pass + + @staticmethod + def analyze(audio_file_path, metadata): + raise Exception("Use FileMoverAnalyzer.move() instead.") + + @staticmethod + def move(audio_file_path, import_directory, original_filename, metadata): + if not isinstance(audio_file_path, unicode): + raise TypeError("audio_file_path must be unicode. Was of type " + type(audio_file_path).__name__) + if not isinstance(import_directory, unicode): + raise TypeError("import_directory must be unicode. Was of type " + type(import_directory).__name__) + if not isinstance(original_filename, unicode): + raise TypeError("original_filename must be unicode. Was of type " + type(original_filename).__name__) + if not isinstance(metadata, dict): + raise TypeError("metadata must be a dict. Was of type " + type(metadata).__name__) + + #Import the file over to it's final location. + # TODO: Also, handle the case where the move fails and write some code + # to possibly move the file to problem_files. + + final_file_path = import_directory + if metadata.has_key("artist_name"): + final_file_path += "/" + metadata["artist_name"] + if metadata.has_key("album"): + final_file_path += "/" + metadata["album"] + final_file_path += "/" + original_filename + + #Ensure any redundant slashes are stripped + final_file_path = os.path.normpath(final_file_path) + + #If a file with the same name already exists in the "import" directory, then + #we add a unique string to the end of this one. We never overwrite a file on import + #because if we did that, it would mean Airtime's database would have + #the wrong information for the file we just overwrote (eg. the song length would be wrong!) + #If the final file path is the same as the file we've been told to import (which + #you often do when you're debugging), then don't move the file at all. + if os.path.exists(final_file_path): + if os.path.samefile(audio_file_path, final_file_path): + metadata["full_path"] = final_file_path + return metadata + base_file_path, file_extension = os.path.splitext(final_file_path) + final_file_path = "%s_%s%s" % (base_file_path, time.strftime("%m-%d-%Y-%H-%M-%S", time.localtime()), file_extension) + + #If THAT path exists, append a UUID instead: + while os.path.exists(final_file_path): + base_file_path, file_extension = os.path.splitext(final_file_path) + final_file_path = "%s_%s%s" % (base_file_path, str(uuid.uuid4()), file_extension) + + #Ensure the full path to the file exists + mkdir_p(os.path.dirname(final_file_path)) + + #Move the file into its final destination directory + logging.debug("Moving %s to %s" % (audio_file_path, final_file_path)) + shutil.move(audio_file_path, final_file_path) + + metadata["full_path"] = final_file_path + return metadata + +def mkdir_p(path): + try: + os.makedirs(path) + except OSError as exc: # Python >2.5 + if exc.errno == errno.EEXIST and os.path.isdir(path): + pass + else: raise + From 6952902b22404a23182459fc17c7998d7ca61db0 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 24 Mar 2014 16:05:53 -0400 Subject: [PATCH 030/310] CC-5709: Airtime Analyzer * Unbreak stuff --- .../modules/rest/controllers/MediaController.php | 2 +- .../airtime_analyzer/message_listener.py | 2 +- .../airtime_analyzer/status_reporter.py | 15 ++++++++------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 245da3b0b6..63d60d4b1f 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -155,7 +155,7 @@ public function putAction() //Our RESTful API takes "full_path" as a field, which we then split and translate to match //our internal schema. Internally, file path is stored relative to a directory, with the directory //as a foreign key to cc_music_dirs. - if ($requestData["full_path"]) { + if (isset($requestData["full_path"])) { Application_Model_Preference::updateDiskUsage(filesize($requestData["full_path"])); $fullPath = $requestData["full_path"]; diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 5fc04058e8..c5e4da373a 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -100,6 +100,7 @@ def msg_received_callback(channel, method_frame, header_frame, body): requeue=False) #Important that it doesn't requeue the message except Exception as e: + logging.exception(e) #If ANY exception happens while processing a file, we're going to NACK to the #messaging server and tell it to remove the message from the queue. #(NACK is a negative acknowledgement. We could use ACK instead, but this might come @@ -118,7 +119,6 @@ def msg_received_callback(channel, method_frame, header_frame, body): StatusReporter.report_failure_to_callback_url(callback_url, api_key, import_status=2, reason=u'An error occurred while importing this file') - logging.exception(e) else: # ACK at the very end, after the message has been successfully processed. diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index 75769a6920..2a0963dd92 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -15,9 +15,9 @@ def report_success_to_callback_url(self, callback_url, api_key, audio_metadata): put_payload = json.dumps(audio_metadata) logging.debug("sending http put with payload: " + put_payload) r = requests.put(callback_url, data=put_payload, - auth=requests.auth.httpbasicauth(api_key, ''), - timeout=statusreporter._http_request_timeout) - logging.debug("http request returned status: " + str(r.status_code)) + auth=requests.auth.HTTPBasicAuth(api_key, ''), + timeout=StatusReporter._HTTP_REQUEST_TIMEOUT) + logging.debug("HTTP request returned status: " + str(r.status_code)) logging.debug(r.text) # log the response body #todo: queue up failed requests and try them again later. @@ -28,16 +28,17 @@ def report_failure_to_callback_url(self, callback_url, api_key, import_status, r # TODO: Make import_status is an int? logging.debug("Reporting import failure to Airtime REST API...") + audio_metadata = dict() audio_metadata["import_status"] = import_status audio_metadata["comment"] = reason # hack attack put_payload = json.dumps(audio_metadata) logging.debug("sending http put with payload: " + put_payload) r = requests.put(callback_url, data=put_payload, - auth=requests.auth.httpbasicauth(api_key, ''), - timeout=statusreporter._http_request_timeout) - logging.debug("http request returned status: " + str(r.status_code)) + auth=requests.auth.HTTPBasicAuth(api_key, ''), + timeout=StatusReporter._HTTP_REQUEST_TIMEOUT) + logging.debug("HTTP request returned status: " + str(r.status_code)) logging.debug(r.text) # log the response body - #todo: queue up failed requests and try them again later. + #TODO: queue up failed requests and try them again later. r.raise_for_status() # raise an exception if there was an http error code returned From db2b52a1bfc4b1cf52df3d1ffd0c5939d5d37b8e Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 24 Mar 2014 17:14:04 -0400 Subject: [PATCH 031/310] CC-5709: Airtime Analyzer * Some cleanup and refactoring for file deletion in the Media REST API * Fix the refresh timer on the Add Media page when there's pending imports. --- .../controllers/LibraryController.php | 1 - airtime_mvc/application/models/MusicDir.php | 4 ++- airtime_mvc/application/models/StoredFile.php | 29 +++++++++++++++++-- .../rest/controllers/MediaController.php | 5 ++-- .../public/js/airtime/library/plupload.js | 4 +-- 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index c241599d7a..2102a662ea 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -356,7 +356,6 @@ public function deleteAction() if (isset($file)) { try { - Application_Model_Preference::updateDiskUsage(-1 * abs(filesize($file->getFilePath()))); $res = $file->delete(); } catch (FileNoPermissionException $e) { $message = $noPermissionMsg; diff --git a/airtime_mvc/application/models/MusicDir.php b/airtime_mvc/application/models/MusicDir.php index 08b2b26495..80f6cbe25e 100644 --- a/airtime_mvc/application/models/MusicDir.php +++ b/airtime_mvc/application/models/MusicDir.php @@ -301,7 +301,9 @@ public static function addWatchedDir($p_path, $userAddedWatchedDir=true, $nested public static function getDirByPK($pk) { $dir = CcMusicDirsQuery::create()->findPK($pk); - + if (!$dir) { + return null; + } $mus_dir = new Application_Model_MusicDir($dir); return $mus_dir; diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 7f1aa7d690..23247522c2 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -346,6 +346,21 @@ public function getPlaylists() return array(); } } + + /** + * Check if the file (on disk) corresponding to this class exists or not. + * @return boolean true if the file exists, false otherwise. + */ + public function existsOnDisk() + { + $exists = false; + try { + $exists = file_exists($this->getFilePath()); + } catch (Exception $e) { + return false; + } + return $exists; + } /** * Delete stored virtual file @@ -355,8 +370,11 @@ public function getPlaylists() */ public function delete() { - $filepath = $this->getFilePath(); + + //Update the user's disk usage + Application_Model_Preference::updateDiskUsage(-1 * abs(filesize($filepath))); + // Check if the file is scheduled to be played in the future if (Application_Model_Schedule::IsFileScheduledInTheFuture($this->getId())) { throw new DeleteScheduledFileException(); @@ -370,8 +388,10 @@ public function delete() } $music_dir = Application_Model_MusicDir::getDirByPK($this->_file->getDbDirectory()); + assert($music_dir); $type = $music_dir->getType(); - + + if (file_exists($filepath) && $type == "stor") { $data = array("filepath" => $filepath, "delete" => 1); try { @@ -473,8 +493,13 @@ public function getFileExtension() */ public function getFilePath() { + assert($this->_file); + $music_dir = Application_Model_MusicDir::getDirByPK($this-> _file->getDbDirectory()); + if (!$music_dir) { + throw new Exception("Invalid music_dir for file in database."); + } $directory = $music_dir->getDirectory(); $filepath = $this->_file->getDbFilepath(); diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 63d60d4b1f..f092574b38 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -198,8 +198,9 @@ public function deleteAction() if ($file) { $con = Propel::getConnection(); $storedFile = new Application_Model_StoredFile($file, $con); - Application_Model_Preference::updateDiskUsage(-1 * abs(filesize($storedFile->getFilePath()))); - $storedFile->delete(); //TODO: This checks your session permissions... Make it work without a session? + if ($storedFile->existsOnDisk()) { + $storedFile->delete(); //TODO: This checks your session permissions... Make it work without a session? + } $file->delete(); $this->getResponse() ->setHttpResponseCode(204); diff --git a/airtime_mvc/public/js/airtime/library/plupload.js b/airtime_mvc/public/js/airtime/library/plupload.js index 6d50a25989..9e67f7ad22 100644 --- a/airtime_mvc/public/js/airtime/library/plupload.js +++ b/airtime_mvc/public/js/airtime/library/plupload.js @@ -149,7 +149,7 @@ $(document).ready(function() { if (self.isRecentUploadsRefreshTimerActive()) { //Prevent multiple timers from running return; } - self.recentUploadsRefreshTimer = setTimeout("self.recentUploadsTable.fnDraw()", 3000); + self.recentUploadsRefreshTimer = setInterval("self.recentUploadsTable.fnDraw()", 3000); }; self.isRecentUploadsRefreshTimerActive = function() @@ -159,7 +159,7 @@ $(document).ready(function() { self.stopRefreshingRecentUploads = function() { - clearTimeout(self.recentUploadsRefreshTimer); + clearInterval(self.recentUploadsRefreshTimer); self.recentUploadsRefreshTimer = null; }; From 3bffb02bc058d0946185f1ae8eb469d7decb1995 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 24 Mar 2014 18:22:34 -0400 Subject: [PATCH 032/310] CC-5708: proftpd hook for new File API --- python_apps/airtime_analyzer/tools/ftp-upload-hook.sh | 3 +++ 1 file changed, 3 insertions(+) create mode 100755 python_apps/airtime_analyzer/tools/ftp-upload-hook.sh diff --git a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh new file mode 100755 index 0000000000..b753b917d4 --- /dev/null +++ b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh @@ -0,0 +1,3 @@ +#! /bin/bash + +php /home/denise/airtime/python_apps/airtime_analyzer/tools/message_sender.php '{"tmp_file_path":"/home/denise/uploads/01 - Larger Than Life.ogg", "import_directory":"/srv/airtime/stor/imported/1","original_filename":"01 - Larger Than Life.ogg","callback_url": "http://localhost/rest/media/1", "api_key":"3TQY7JASUNVZ8IGOZQXJ"}' From f8c221a61037afbd36d0297a129a72b70c72b7a1 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 25 Mar 2014 14:34:50 -0400 Subject: [PATCH 033/310] CC-5709: Airtime Analyzer * Fixed and updated the unit tests --- .../airtime_analyzer/analyzer.py | 2 +- .../airtime_analyzer/metadata_analyzer.py | 1 + .../tests/analyzer_pipeline_tests.py | 18 +++++++--- .../tests/metadata_analyzer_tests.py | 36 ++++++++++--------- 4 files changed, 35 insertions(+), 22 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py index d897b479bf..7fb00d8db4 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py @@ -2,7 +2,7 @@ class Analyzer: @staticmethod - def analyze(filename, results): + def analyze(filename, metadata): raise NotImplementedError class AnalyzerError(Exception): diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index a75c4815d5..12a792a314 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -23,6 +23,7 @@ def analyze(filename, metadata): #in the file header. Mutagen breaks that out into a separate "info" object: info = audio_file.info metadata["sample_rate"] = info.sample_rate + metadata["length_seconds"] = info.length #Converting the length in seconds (float) to a formatted time string track_length = datetime.timedelta(seconds=info.length) metadata["length"] = str(track_length) #time.strftime("%H:%M:%S.%f", track_length) diff --git a/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py b/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py index 4ac1e49ea8..cc5dc96b52 100644 --- a/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py +++ b/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py @@ -1,24 +1,34 @@ from nose.tools import * +import os +import shutil import multiprocessing +import datetime from airtime_analyzer.analyzer_pipeline import AnalyzerPipeline DEFAULT_AUDIO_FILE = u'tests/test_data/44100Hz-16bit-mono.mp3' +DEFAULT_IMPORT_DEST = u'Test Artist/44100Hz-16bit-mono.mp3' def setup(): pass def teardown(): - pass + #Move the file back + shutil.move(DEFAULT_IMPORT_DEST, DEFAULT_AUDIO_FILE) + assert os.path.exists(DEFAULT_AUDIO_FILE) def test_basic(): + filename = os.path.basename(DEFAULT_AUDIO_FILE) q = multiprocessing.Queue() - AnalyzerPipeline.run_analysis(q, DEFAULT_AUDIO_FILE, u'.') + #This actually imports the file into the "./Test Artist" directory. + AnalyzerPipeline.run_analysis(q, DEFAULT_AUDIO_FILE, u'.', filename) results = q.get() assert results['track_title'] == u'Test Title' assert results['artist_name'] == u'Test Artist' assert results['album_title'] == u'Test Album' assert results['year'] == u'1999' assert results['genre'] == u'Test Genre' - assert results['mime_type'] == 'audio/mpeg' # Not unicode because MIMEs aren't. - assert results['length_seconds'] == 3.90925 + assert results['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't. + assert results['length_seconds'] == 3.90925 + assert results["length"] == str(datetime.timedelta(seconds=results["length_seconds"])) + assert os.path.exists(DEFAULT_IMPORT_DEST) diff --git a/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py b/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py index 1107c078a2..01a2c3d779 100644 --- a/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py +++ b/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import datetime from nose.tools import * from airtime_analyzer.metadata_analyzer import MetadataAnalyzer @@ -15,61 +16,62 @@ def check_default_metadata(metadata): assert metadata['year'] == u'1999' assert metadata['genre'] == u'Test Genre' assert metadata['track_number'] == u'1' + assert metadata["length"] == str(datetime.timedelta(seconds=metadata["length_seconds"])) def test_mp3_mono(): - metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-mono.mp3') + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-mono.mp3', dict()) check_default_metadata(metadata) assert metadata['channels'] == 1 assert metadata['bit_rate'] == 64000 assert metadata['length_seconds'] == 3.90925 - assert metadata['mime_type'] == 'audio/mpeg' # Not unicode because MIMEs aren't. + assert metadata['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't. assert metadata['track_total'] == u'10' # MP3s can have a track_total #Mutagen doesn't extract comments from mp3s it seems def test_mp3_jointstereo(): - metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-jointstereo.mp3') + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-jointstereo.mp3', dict()) check_default_metadata(metadata) assert metadata['channels'] == 2 assert metadata['bit_rate'] == 128000 assert metadata['length_seconds'] == 3.90075 - assert metadata['mime_type'] == 'audio/mpeg' + assert metadata['mime'] == 'audio/mpeg' assert metadata['track_total'] == u'10' # MP3s can have a track_total def test_mp3_simplestereo(): - metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-simplestereo.mp3') + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-simplestereo.mp3', dict()) check_default_metadata(metadata) assert metadata['channels'] == 2 assert metadata['bit_rate'] == 128000 assert metadata['length_seconds'] == 3.90075 - assert metadata['mime_type'] == 'audio/mpeg' + assert metadata['mime'] == 'audio/mpeg' assert metadata['track_total'] == u'10' # MP3s can have a track_total def test_mp3_dualmono(): - metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-dualmono.mp3') + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-dualmono.mp3', dict()) check_default_metadata(metadata) assert metadata['channels'] == 2 assert metadata['bit_rate'] == 128000 assert metadata['length_seconds'] == 3.90075 - assert metadata['mime_type'] == 'audio/mpeg' + assert metadata['mime'] == 'audio/mpeg' assert metadata['track_total'] == u'10' # MP3s can have a track_total def test_ogg_mono(): - metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-mono.ogg') + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-mono.ogg', dict()) check_default_metadata(metadata) assert metadata['channels'] == 1 assert metadata['bit_rate'] == 80000 assert metadata['length_seconds'] == 3.8394104308390022 - assert metadata['mime_type'] == 'application/ogg' + assert metadata['mime'] == 'application/ogg' assert metadata['comment'] == u'Test Comment' def test_ogg_stereo(): - metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.ogg') + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.ogg', dict()) check_default_metadata(metadata) assert metadata['channels'] == 2 assert metadata['bit_rate'] == 112000 assert metadata['length_seconds'] == 3.8394104308390022 - assert metadata['mime_type'] == 'application/ogg' + assert metadata['mime'] == 'application/ogg' assert metadata['comment'] == u'Test Comment' ''' faac and avconv can't seem to create a proper mono AAC file... ugh @@ -81,21 +83,21 @@ def test_aac_mono(): assert metadata['channels'] == 1 assert metadata['bit_rate'] == 80000 assert metadata['length_seconds'] == 3.8394104308390022 - assert metadata['mime_type'] == 'video/mp4' + assert metadata['mime'] == 'video/mp4' assert metadata['comment'] == u'Test Comment' ''' def test_aac_stereo(): - metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.m4a') + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.m4a', dict()) check_default_metadata(metadata) assert metadata['channels'] == 2 assert metadata['bit_rate'] == 102619 assert metadata['length_seconds'] == 3.8626303854875284 - assert metadata['mime_type'] == 'video/mp4' + assert metadata['mime'] == 'video/mp4' assert metadata['comment'] == u'Test Comment' def test_mp3_utf8(): - metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo-utf8.mp3') + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo-utf8.mp3', dict()) # Using a bunch of different UTF-8 codepages here. Test data is from: # http://winrus.com/utf8-jap.htm assert metadata['track_title'] == u'アイウエオカキクケコサシスセソタï¾ï¾‚テ' @@ -107,6 +109,6 @@ def test_mp3_utf8(): assert metadata['channels'] == 2 assert metadata['bit_rate'] == 128000 assert metadata['length_seconds'] == 3.90075 - assert metadata['mime_type'] == 'audio/mpeg' + assert metadata['mime'] == 'audio/mpeg' assert metadata['track_total'] == u'10' # MP3s can have a track_total From 9e9e676b5432186b9b05031cccf00e924189243f Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 25 Mar 2014 15:35:50 -0400 Subject: [PATCH 034/310] CC-5709: Airtime Analyzer * Make the Recent Uplods file actions a bit clearer --- airtime_mvc/public/js/airtime/library/plupload.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/public/js/airtime/library/plupload.js b/airtime_mvc/public/js/airtime/library/plupload.js index 9e67f7ad22..71aff7336b 100644 --- a/airtime_mvc/public/js/airtime/library/plupload.js +++ b/airtime_mvc/public/js/airtime/library/plupload.js @@ -67,8 +67,15 @@ $(document).ready(function() { }; self.renderFileActions = function ( data, type, full ) { - return 'Delete'; - }; + if (full.import_status == 0) { + return '' + $.i18n._('Delete from Library') + ''; + } else if (full.import_status == 1) { + //No actions for pending files + return $.i18n._('N/A'); + } else { //Failed downloads + return '' + $.i18n._('Clear') + ''; + } + }; $("#recent_uploads_table").on("click", "a.deleteFileAction", function () { //Grab the file object for the row that was clicked. From 681fe4630b82eff8af3353ebac59ad7b66e83387 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 25 Mar 2014 18:09:47 -0400 Subject: [PATCH 035/310] CC-5708: proftpd hook for new File API url and API key are hard coded right now. Next task is to somehow decipher these with whatever ftp parameters we can pass in to the scipt. --- python_apps/airtime_analyzer/tools/ftp-upload-hook.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh index b753b917d4..4d8dc789a5 100755 --- a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh +++ b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh @@ -1,3 +1,5 @@ #! /bin/bash -php /home/denise/airtime/python_apps/airtime_analyzer/tools/message_sender.php '{"tmp_file_path":"/home/denise/uploads/01 - Larger Than Life.ogg", "import_directory":"/srv/airtime/stor/imported/1","original_filename":"01 - Larger Than Life.ogg","callback_url": "http://localhost/rest/media/1", "api_key":"3TQY7JASUNVZ8IGOZQXJ"}' +path=$1 +filename="${path##*/}" +curl http://localhost/rest/media -u 3188BDIMPJROQP89Z0OX: -X POST -F "file=@$path" -F "name=$filename" From 58a38ffd3a52a972a744af67c097f55c92408dde Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 26 Mar 2014 15:06:48 -0400 Subject: [PATCH 036/310] CC-5709: Airtime Analyzer * Added unit test coverage report stuff * Added more unit tests * 98% test coverage :-) * Fixed a few bugs and removed some dead code --- python_apps/airtime_analyzer/README.rst | 2 ++ .../airtime_analyzer/analyzer.py | 2 ++ .../airtime_analyzer/analyzer_pipeline.py | 4 --- .../airtime_analyzer/filemover_analyzer.py | 9 +++-- .../airtime_analyzer/metadata_analyzer.py | 6 ++-- python_apps/airtime_analyzer/setup.py | 2 ++ .../tests/analyzer_pipeline_tests.py | 19 +++++++++- .../tests/metadata_analyzer_tests.py | 35 +++++++++++++++++++ 8 files changed, 66 insertions(+), 13 deletions(-) diff --git a/python_apps/airtime_analyzer/README.rst b/python_apps/airtime_analyzer/README.rst index 0f6a12205f..e6a5a08b93 100644 --- a/python_apps/airtime_analyzer/README.rst +++ b/python_apps/airtime_analyzer/README.rst @@ -68,4 +68,6 @@ a test, run: $ nosetests -s +To run the unit tests and generate a code coverage report, run: + $ nosetests --with-coverage --cover-package=airtime_analyzer diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py index 7fb00d8db4..b47ebe0ab1 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py @@ -5,6 +5,8 @@ class Analyzer: def analyze(filename, metadata): raise NotImplementedError +''' class AnalyzerError(Exception): def __init__(self): super.__init__(self) +''' diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 3a267280fd..2266fb9a23 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -5,10 +5,6 @@ class AnalyzerPipeline: - # Constructor - def __init__(self): - pass - # Take message dictionary and perform the necessary analysis. @staticmethod def run_analysis(queue, audio_file_path, import_directory, original_filename): diff --git a/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py index 0920bb8ecd..ab12aad793 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py @@ -10,9 +10,6 @@ class FileMoverAnalyzer(Analyzer): - def __init__(self): - pass - @staticmethod def analyze(audio_file_path, metadata): raise Exception("Use FileMoverAnalyzer.move() instead.") @@ -35,8 +32,8 @@ def move(audio_file_path, import_directory, original_filename, metadata): final_file_path = import_directory if metadata.has_key("artist_name"): final_file_path += "/" + metadata["artist_name"] - if metadata.has_key("album"): - final_file_path += "/" + metadata["album"] + if metadata.has_key("album_title"): + final_file_path += "/" + metadata["album_title"] final_file_path += "/" + original_filename #Ensure any redundant slashes are stripped @@ -71,6 +68,8 @@ def move(audio_file_path, import_directory, original_filename, metadata): return metadata def mkdir_p(path): + if path == "": + return try: os.makedirs(path) except OSError as exc: # Python >2.5 diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index 12a792a314..fa0a88807c 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -6,9 +6,6 @@ class MetadataAnalyzer(Analyzer): - def __init__(self): - pass - @staticmethod def analyze(filename, metadata): if not isinstance(filename, unicode): @@ -33,6 +30,9 @@ def analyze(filename, metadata): #Use the python-magic module to get the MIME type. mime_magic = magic.Magic(mime=True) metadata["mime"] = mime_magic.from_file(filename) + + if isinstance(info, mutagen.mp3.MPEGInfo): + print "mode is: " + str(info.mode) #Try to get the number of channels if mutagen can... try: diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index 259696b8e4..5691676f34 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -14,6 +14,8 @@ 'python-magic', 'pika', 'nose', + 'coverage', + 'mock', 'python-daemon', 'requests', ], diff --git a/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py b/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py index cc5dc96b52..ba7b6f202e 100644 --- a/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py +++ b/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py @@ -2,11 +2,12 @@ import os import shutil import multiprocessing +import Queue import datetime from airtime_analyzer.analyzer_pipeline import AnalyzerPipeline DEFAULT_AUDIO_FILE = u'tests/test_data/44100Hz-16bit-mono.mp3' -DEFAULT_IMPORT_DEST = u'Test Artist/44100Hz-16bit-mono.mp3' +DEFAULT_IMPORT_DEST = u'Test Artist/Test Album/44100Hz-16bit-mono.mp3' def setup(): pass @@ -32,3 +33,19 @@ def test_basic(): assert results["length"] == str(datetime.timedelta(seconds=results["length_seconds"])) assert os.path.exists(DEFAULT_IMPORT_DEST) +@raises(TypeError) +def test_wrong_type_queue_param(): + AnalyzerPipeline.run_analysis(Queue.Queue(), u'', u'', u'') + +@raises(TypeError) +def test_wrong_type_string_param2(): + AnalyzerPipeline.run_analysis(multiprocessing.queues.Queue(), '', u'', u'') + +@raises(TypeError) +def test_wrong_type_string_param3(): + AnalyzerPipeline.run_analysis(multiprocessing.queues.Queue(), u'', '', u'') + +@raises(TypeError) +def test_wrong_type_string_param4(): + AnalyzerPipeline.run_analysis(multiprocessing.queues.Queue(), u'', u'', '') + diff --git a/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py b/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py index 01a2c3d779..8baad0c548 100644 --- a/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py +++ b/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- import datetime +import mutagen +import mock from nose.tools import * from airtime_analyzer.metadata_analyzer import MetadataAnalyzer @@ -112,3 +114,36 @@ def test_mp3_utf8(): assert metadata['mime'] == 'audio/mpeg' assert metadata['track_total'] == u'10' # MP3s can have a track_total +# Make sure the parameter checking works +@raises(TypeError) +def test_move_wrong_string_param1(): + not_unicode = 'asdfasdf' + MetadataAnalyzer.analyze(not_unicode, dict()) + +@raises(TypeError) +def test_move_wrong_metadata_dict(): + not_a_dict = list() + MetadataAnalyzer.analyze(u'asdfasdf', not_a_dict) + +# Test an mp3 file where the number of channels is invalid or missing: +def test_mp3_bad_channels(): + filename = u'tests/test_data/44100Hz-16bit-mono.mp3' + ''' + It'd be a pain in the ass to construct a real MP3 with an invalid number + of channels by hand because that value is stored in every MP3 frame in the file + ''' + print "testing bad channels..." + audio_file = mutagen.File(filename, easy=True) + audio_file.info.mode = 1777 + with mock.patch('airtime_analyzer.metadata_analyzer.mutagen') as mock_mutagen: + mock_mutagen.File.return_value = audio_file + #mock_mutagen.side_effect = lambda *args, **kw: audio_file #File(*args, **kw) + + metadata = MetadataAnalyzer.analyze(filename, dict()) + check_default_metadata(metadata) + assert metadata['channels'] == 1 + assert metadata['bit_rate'] == 64000 + assert metadata['length_seconds'] == 3.90925 + assert metadata['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't. + assert metadata['track_total'] == u'10' # MP3s can have a track_total + #Mutagen doesn't extract comments from mp3s it seems From ead1ec4795440dd97f17b552e4a2233c2b262ad6 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 27 Mar 2014 11:05:23 -0400 Subject: [PATCH 037/310] CC-5708: proftpd hook for new File API --- .../airtime_analyzer/tools/ftp-upload-hook.sh | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh index 4d8dc789a5..1e05ff8d6a 100755 --- a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh +++ b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh @@ -1,5 +1,28 @@ #! /bin/bash -path=$1 -filename="${path##*/}" -curl http://localhost/rest/media -u 3188BDIMPJROQP89Z0OX: -X POST -F "file=@$path" -F "name=$filename" +file_path=$1 +filename="${file_path##*/}" + +#base_instance_path and airtime_conf_path are common to all saas instances +base_instance_path=/mnt/airtimepro/instances/ +airtime_conf_path=/etc/airtime/airtime.conf + +#maps the instance_path to the url +vhost_file=/mnt/airtimepro/system/vhost.map + +#instance_path will look like 1/1384, for example +instance_path=$(echo $file_path | grep -Po "(?<=($base_instance_path)).*?(?=/srv)") + +#url to the airtime interface. bananas.airtime.pro, for example +url=http:// +url+=$(grep -E $instance_path ~/vhost.map | awk '{print $1;}') +url+=/rest/media +#url=$(grep -E $instance_path $vhost_file | awk '{print $1;}') + +#path to specific instance's airtime.conf +instance_conf_path=$base_instance_path$instance_path$airtime_conf_path + +api_key=$(sudo awk -F "=" '/api_key/ {print $2}' /etc/airtime/airtime.conf) +#api_key=$(sudo awk -F "=" '/api_key/ {print $2}' $instance_conf_path) + +#curl $url -u $api_key":" -X POST -F "file=@$file_path" -F "name=$filename" From 700b28ae38adcdc01ffb8c176a613d405960ae87 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 27 Mar 2014 11:09:18 -0400 Subject: [PATCH 038/310] CC-5708: proftpd hook for new File API removed testing lines --- python_apps/airtime_analyzer/tools/ftp-upload-hook.sh | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh index 1e05ff8d6a..9a98583472 100755 --- a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh +++ b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh @@ -13,16 +13,14 @@ vhost_file=/mnt/airtimepro/system/vhost.map #instance_path will look like 1/1384, for example instance_path=$(echo $file_path | grep -Po "(?<=($base_instance_path)).*?(?=/srv)") -#url to the airtime interface. bananas.airtime.pro, for example +#post request url - http://bananas.airtime.pro/rest/media, for example url=http:// -url+=$(grep -E $instance_path ~/vhost.map | awk '{print $1;}') +url+=$(grep -E $instance_path $vhost_file | awk '{print $1;}') url+=/rest/media -#url=$(grep -E $instance_path $vhost_file | awk '{print $1;}') #path to specific instance's airtime.conf instance_conf_path=$base_instance_path$instance_path$airtime_conf_path -api_key=$(sudo awk -F "=" '/api_key/ {print $2}' /etc/airtime/airtime.conf) -#api_key=$(sudo awk -F "=" '/api_key/ {print $2}' $instance_conf_path) +api_key=$(sudo awk -F "=" '/api_key/ {print $2}' $instance_conf_path) #curl $url -u $api_key":" -X POST -F "file=@$file_path" -F "name=$filename" From eb72f251511b31970416296da97c14866f1603c3 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 27 Mar 2014 11:11:10 -0400 Subject: [PATCH 039/310] CC-5708: proftpd hook for new File API uncomment curl command --- python_apps/airtime_analyzer/tools/ftp-upload-hook.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh index 9a98583472..de8e9c18d0 100755 --- a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh +++ b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh @@ -23,4 +23,4 @@ instance_conf_path=$base_instance_path$instance_path$airtime_conf_path api_key=$(sudo awk -F "=" '/api_key/ {print $2}' $instance_conf_path) -#curl $url -u $api_key":" -X POST -F "file=@$file_path" -F "name=$filename" +curl $url -u $api_key":" -X POST -F "file=@$file_path" -F "name=$filename" From 2bc37b9fea63c69ddb8005f85b2d17bd290c180b Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 27 Mar 2014 15:46:42 -0400 Subject: [PATCH 040/310] CC-5708: proftpd hook for new File API added handling for if the web server is down --- .../airtime_analyzer/tools/ftp-upload-hook.sh | 63 ++++++++++++------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh index de8e9c18d0..1fc5c85ef4 100755 --- a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh +++ b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh @@ -1,26 +1,41 @@ #! /bin/bash -file_path=$1 -filename="${file_path##*/}" - -#base_instance_path and airtime_conf_path are common to all saas instances -base_instance_path=/mnt/airtimepro/instances/ -airtime_conf_path=/etc/airtime/airtime.conf - -#maps the instance_path to the url -vhost_file=/mnt/airtimepro/system/vhost.map - -#instance_path will look like 1/1384, for example -instance_path=$(echo $file_path | grep -Po "(?<=($base_instance_path)).*?(?=/srv)") - -#post request url - http://bananas.airtime.pro/rest/media, for example -url=http:// -url+=$(grep -E $instance_path $vhost_file | awk '{print $1;}') -url+=/rest/media - -#path to specific instance's airtime.conf -instance_conf_path=$base_instance_path$instance_path$airtime_conf_path - -api_key=$(sudo awk -F "=" '/api_key/ {print $2}' $instance_conf_path) - -curl $url -u $api_key":" -X POST -F "file=@$file_path" -F "name=$filename" +post_file() { + #kill process after 30 minutes (360*5=30 minutes) + max_retry=360 + retry_count=0 + + file_path=$1 + filename="${file_path##*/}" + + #base_instance_path and airtime_conf_path are common to all saas instances + base_instance_path=/mnt/airtimepro/instances/ + airtime_conf_path=/etc/airtime/airtime.conf + + #maps the instance_path to the url + vhost_file=/mnt/airtimepro/system/vhost.map + + #instance_path will look like 1/1384, for example + instance_path=$(echo $file_path | grep -Po "(?<=($base_instance_path)).*?(?=/srv)") + + #post request url - http://bananas.airtime.pro/rest/media, for example + url=http:// + url+=$(grep -E $instance_path $vhost_file | awk '{print $1;}') + url+=/rest/media + + #path to specific instance's airtime.conf + instance_conf_path=$base_instance_path$instance_path$airtime_conf_path + + api_key=$(sudo awk -F "=" '/api_key/ {print $2}' $instance_conf_path) + + until curl --max-time 30 $url -u $api_key":" -X POST -F "file=@$file_path" -F "name=$filename" + do + retry_count=$[$retry_count+1] + if [ $retry_count -ge $max_retry ]; then + break + fi + sleep 5 + done +} + +post_file "$1" & From cc4e43a8b5e50c889b03a4a118e5979396afa81f Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 27 Mar 2014 16:48:27 -0400 Subject: [PATCH 041/310] CC-5708: proftpd hook for new File API variable escaping? --- python_apps/airtime_analyzer/tools/ftp-upload-hook.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh index 1fc5c85ef4..0eb334a228 100755 --- a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh +++ b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh @@ -5,7 +5,7 @@ post_file() { max_retry=360 retry_count=0 - file_path=$1 + file_path=${1} filename="${file_path##*/}" #base_instance_path and airtime_conf_path are common to all saas instances @@ -14,7 +14,7 @@ post_file() { #maps the instance_path to the url vhost_file=/mnt/airtimepro/system/vhost.map - + #instance_path will look like 1/1384, for example instance_path=$(echo $file_path | grep -Po "(?<=($base_instance_path)).*?(?=/srv)") @@ -27,8 +27,8 @@ post_file() { instance_conf_path=$base_instance_path$instance_path$airtime_conf_path api_key=$(sudo awk -F "=" '/api_key/ {print $2}' $instance_conf_path) - - until curl --max-time 30 $url -u $api_key":" -X POST -F "file=@$file_path" -F "name=$filename" + + until curl --max-time 30 $url -u $api_key":" -X POST -F "file=@${file_path}" -F "name=${filename}" do retry_count=$[$retry_count+1] if [ $retry_count -ge $max_retry ]; then @@ -38,4 +38,4 @@ post_file() { done } -post_file "$1" & +post_file "${1}" & From 2fdc4291e31b7dfe4b776f9ca519371427f772c7 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 27 Mar 2014 16:48:57 -0400 Subject: [PATCH 042/310] CC-5708: proftpd hook for new File API testing ftp hook script --- .../tools/test-hook-script.sh | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100755 python_apps/airtime_analyzer/tools/test-hook-script.sh diff --git a/python_apps/airtime_analyzer/tools/test-hook-script.sh b/python_apps/airtime_analyzer/tools/test-hook-script.sh new file mode 100755 index 0000000000..10d075506d --- /dev/null +++ b/python_apps/airtime_analyzer/tools/test-hook-script.sh @@ -0,0 +1,21 @@ +#! /bin/bash + +post_file() { + file_path=$1 + filename="${file_path##*/}" + + #kill process after 30 minutes (360*5=30 minutes) + max_retry=10 + retry_count=0 + + until curl --max-time 30 http://localhost/rest/media -u 3TQY7JASUNVZ8IGOZQXJ: -X POST -F "file=@${file_path}" -F "name=${filename}" + do + retry_count=$[$retry_count+1] + if [ $retry_count -ge $max_retry ]; then + break + fi + sleep 1 + done +} + +post_file "$1" & From 49996a99865df3af87087a14ab1b103876d616c7 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 28 Mar 2014 11:15:28 -0400 Subject: [PATCH 043/310] CC-5708: proftpd hook for new File API encased var in {} --- python_apps/airtime_analyzer/tools/ftp-upload-hook.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh index 0eb334a228..faf677a291 100755 --- a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh +++ b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh @@ -16,7 +16,7 @@ post_file() { vhost_file=/mnt/airtimepro/system/vhost.map #instance_path will look like 1/1384, for example - instance_path=$(echo $file_path | grep -Po "(?<=($base_instance_path)).*?(?=/srv)") + instance_path=$(echo ${file_path} | grep -Po "(?<=($base_instance_path)).*?(?=/srv)") #post request url - http://bananas.airtime.pro/rest/media, for example url=http:// From 82958a10ae5f8733596362f166d163478a4dc48b Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 28 Mar 2014 12:26:40 -0400 Subject: [PATCH 044/310] CC-5708: proftpd hook for new File API small fix for testing script --- python_apps/airtime_analyzer/tools/test-hook-script.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python_apps/airtime_analyzer/tools/test-hook-script.sh b/python_apps/airtime_analyzer/tools/test-hook-script.sh index 10d075506d..d3d0ab504f 100755 --- a/python_apps/airtime_analyzer/tools/test-hook-script.sh +++ b/python_apps/airtime_analyzer/tools/test-hook-script.sh @@ -1,14 +1,14 @@ #! /bin/bash post_file() { - file_path=$1 + file_path=${1} filename="${file_path##*/}" #kill process after 30 minutes (360*5=30 minutes) max_retry=10 retry_count=0 - until curl --max-time 30 http://localhost/rest/media -u 3TQY7JASUNVZ8IGOZQXJ: -X POST -F "file=@${file_path}" -F "name=${filename}" + until curl --max-time 30 http://localhost/rest/media -u 3188BDIMPJROQP89Z0OX: -X POST -F "file=@${file_path}" -F "name=${filename}" do retry_count=$[$retry_count+1] if [ $retry_count -ge $max_retry ]; then @@ -18,4 +18,4 @@ post_file() { done } -post_file "$1" & +post_file "${1}" & From 9eda78f8f9d760ef7e296fb6a8eba8b2321b77d2 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 31 Mar 2014 17:57:32 -0400 Subject: [PATCH 045/310] CC-5733: RESTful API data sanitization and validation Added more fields to the black list Using the "Edit Metadata" form for field validation on put requests --- .../rest/controllers/MediaController.php | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index f092574b38..33dd9a9f60 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -6,7 +6,13 @@ class Rest_MediaController extends Zend_Rest_Controller //fields that are not modifiable via our RESTful API private $blackList = array( 'id', + 'directory', + 'filepath', 'file_exists', + 'hidden', + 'mtime', + 'utime', + 'lptime', 'silan_check', 'soundcloud_id', 'is_scheduled', @@ -147,9 +153,18 @@ public function putAction() } $file = CcFilesQuery::create()->findPk($id); - if ($file) + //validate fields + $requestData = json_decode($this->getRequest()->getRawBody(), true); + //TODO: rename EditAudioMD form? + $fileForm = new Application_Form_EditAudioMD(); + $fileForm->startForm($file->getDbId()); + $fileForm->populate($requestData); + + if (!$fileForm->isValidPartial($requestData)) { + $file->setDbImportStatus(2)->save(); + $this->invalidDataResponse(); + } else if ($file) { - $requestData = json_decode($this->getRequest()->getRawBody(), true); $file->fromArray($this->validateRequestData($requestData), BasePeer::TYPE_FIELDNAME); //Our RESTful API takes "full_path" as a field, which we then split and translate to match @@ -179,6 +194,7 @@ public function putAction() ->setHttpResponseCode(200) ->appendBody(json_encode($this->sanitizeResponse($file))); } else { + $file->setDbImportStatus(2)->save(); $this->fileNotFoundResponse(); } } @@ -284,6 +300,13 @@ private function fileNotFoundResponse() $resp->setHttpResponseCode(404); $resp->appendBody("ERROR: Media not found."); } + + private function invalidDataResponse() + { + $resp = $this->getResponse(); + $resp->setHttpResponseCode(400); + $resp->appendBody("ERROR: Invalid data"); + } private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) { From 70228a675e81f4fc5dbf03fddc590881d1494e14 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 1 Apr 2014 11:28:33 -0400 Subject: [PATCH 046/310] Changed default import_status value on cc_files table to 1 (pending) --- .../application/models/airtime/map/CcFilesTableMap.php | 2 +- airtime_mvc/application/models/airtime/om/BaseCcFiles.php | 6 +++--- airtime_mvc/build/schema.xml | 2 +- airtime_mvc/build/sql/schema.sql | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php index 348d2482ed..e9ddfeb9af 100644 --- a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php @@ -44,7 +44,7 @@ public function initialize() $this->addColumn('FTYPE', 'DbFtype', 'VARCHAR', true, 128, ''); $this->addForeignKey('DIRECTORY', 'DbDirectory', 'INTEGER', 'cc_music_dirs', 'ID', false, null, null); $this->addColumn('FILEPATH', 'DbFilepath', 'LONGVARCHAR', false, null, ''); - $this->addColumn('IMPORT_STATUS', 'DbImportStatus', 'INTEGER', true, null, 0); + $this->addColumn('IMPORT_STATUS', 'DbImportStatus', 'INTEGER', true, null, 1); $this->addColumn('CURRENTLYACCESSING', 'DbCurrentlyaccessing', 'INTEGER', true, null, 0); $this->addForeignKey('EDITEDBY', 'DbEditedby', 'INTEGER', 'cc_subjs', 'ID', false, null, null); $this->addColumn('MTIME', 'DbMtime', 'TIMESTAMP', false, 6, null); diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php index 59ea2b6c8a..523e27e280 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php @@ -66,7 +66,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent /** * The value for the import_status field. - * Note: this column has a database default value of: 0 + * Note: this column has a database default value of: 1 * @var int */ protected $import_status; @@ -524,7 +524,7 @@ public function applyDefaultValues() $this->mime = ''; $this->ftype = ''; $this->filepath = ''; - $this->import_status = 0; + $this->import_status = 1; $this->currentlyaccessing = 0; $this->length = '00:00:00'; $this->file_exists = true; @@ -2892,7 +2892,7 @@ public function hasOnlyDefaultValues() return false; } - if ($this->import_status !== 0) { + if ($this->import_status !== 1) { return false; } diff --git a/airtime_mvc/build/schema.xml b/airtime_mvc/build/schema.xml index e614748bfc..8cf6e6987c 100644 --- a/airtime_mvc/build/schema.xml +++ b/airtime_mvc/build/schema.xml @@ -18,7 +18,7 @@ - + diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index 8eb6388786..a7a4c0d669 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -36,7 +36,7 @@ CREATE TABLE "cc_files" "ftype" VARCHAR(128) default '' NOT NULL, "directory" INTEGER, "filepath" TEXT default '', - "import_status" INTEGER default 0 NOT NULL, + "import_status" INTEGER default 1 NOT NULL, "currentlyaccessing" INTEGER default 0 NOT NULL, "editedby" INTEGER, "mtime" TIMESTAMP(6), From 12c16bc120eb151cfc7c132d9b593326974991dc Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 1 Apr 2014 12:28:40 -0400 Subject: [PATCH 047/310] CC-5709: Airtime Analyzer * Make the airtime_analyzer config path a runtime param --- .../airtime_analyzer/airtime_analyzer.py | 8 +++----- python_apps/airtime_analyzer/bin/airtime_analyzer | 11 +++++++++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py index 9c6f746e1f..66933f55a4 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py @@ -10,19 +10,18 @@ class AirtimeAnalyzerServer: # Constants - _CONFIG_PATH = '/etc/airtime/airtime.conf' _LOG_PATH = "/var/log/airtime/airtime_analyzer.log" # Variables _log_level = logging.INFO - def __init__(self, debug=False): + def __init__(self, config_path, debug=False): # Configure logging self.setup_logging(debug) # Read our config file - rabbitmq_config = self.read_config_file() + rabbitmq_config = self.read_config_file(config_path) # Start listening for RabbitMQ messages telling us about newly # uploaded files. @@ -55,9 +54,8 @@ def setup_logging(self, debug): rootLogger.addHandler(consoleHandler) - def read_config_file(self): + def read_config_file(self, config_path): config = ConfigParser.SafeConfigParser() - config_path = AirtimeAnalyzerServer._CONFIG_PATH try: config.readfp(open(config_path)) except IOError as e: diff --git a/python_apps/airtime_analyzer/bin/airtime_analyzer b/python_apps/airtime_analyzer/bin/airtime_analyzer index 23865fdc65..85266e9b09 100755 --- a/python_apps/airtime_analyzer/bin/airtime_analyzer +++ b/python_apps/airtime_analyzer/bin/airtime_analyzer @@ -6,12 +6,14 @@ import os import airtime_analyzer.airtime_analyzer as aa VERSION = "1.0" +DEFAULT_CONFIG_PATH = '/etc/airtime/airtime.conf' print "Airtime Analyzer " + VERSION parser = argparse.ArgumentParser() parser.add_argument("-d", "--daemon", help="run as a daemon", action="store_true") parser.add_argument("--debug", help="log full debugging output", action="store_true") +parser.add_argument("--rmq-config-file", help="specify a configuration file with RabbitMQ settings (default is /etc/airtime/airtime.conf)") args = parser.parse_args() '''Ensure media_monitor isn't running before we start, because it'll move newly uploaded @@ -33,10 +35,15 @@ def check_if_media_monitor_is_running(): check_if_media_monitor_is_running() +#Default config file path +config_path = DEFAULT_CONFIG_PATH +if args.rmq_config_file: + config_path = args.rmq_config_file + if args.daemon: with daemon.DaemonContext(): - analyzer = aa.AirtimeAnalyzerServer(debug=args.debug) + analyzer = aa.AirtimeAnalyzerServer(config_path=config_path, debug=args.debug) else: # Run without daemonizing - analyzer = aa.AirtimeAnalyzerServer(debug=args.debug) + analyzer = aa.AirtimeAnalyzerServer(config_path=config_path, debug=args.debug) From 19f231bd11eada4803befb664096cec3504054d8 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 1 Apr 2014 16:40:54 -0400 Subject: [PATCH 048/310] CC-5709: Airtime Analyzer * Add Media page CSS file that I forgot to commit ages ago --- airtime_mvc/public/css/addmedia.css | 66 +++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 airtime_mvc/public/css/addmedia.css diff --git a/airtime_mvc/public/css/addmedia.css b/airtime_mvc/public/css/addmedia.css new file mode 100644 index 0000000000..d53d8c4530 --- /dev/null +++ b/airtime_mvc/public/css/addmedia.css @@ -0,0 +1,66 @@ +@CHARSET "UTF-8"; + +#recent_uploads_wrapper +{ + width: 100%; +} + /* + position: absolute; + left: 5px; + right: 5px; + bottom: 5px; + margin: 0px; + height: 350px; +} +.dataTables_scrollHeadInner > table:nth-child(1) +{ + margin: 0px; +} +*/ + +#recent_uploads h2 +{ + font-size: 1.7em; +} + +#recent_uploads_table +{ + width: 100%; +} + +#recent_uploads_table_wrapper +{ + width: 100%; +} + +table#recent_uploads_table td +{ + cursor: auto; +} + +#recent_uploads_filter +{ + float: right; + margin-top: 10px; + margin-right: 3px; +} +#recent_uploads_table_length +{ + margin: 5px; +} + +/** Vertically align radio buttons with the labels */ +#recent_uploads_filter input[type='radio'] { + vertical-align: middle; + margin-top: -3px; +} + +#recent_uploads_filter label { + padding: 0px; +} + +#recent_uploads_table .deleteFileAction +{ + text-decoration: underline; + cursor: pointer; +} From 5ddbb4ddd1742dbc4fe8acc0cfc03bf834c3088e Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 2 Apr 2014 11:22:56 -0400 Subject: [PATCH 049/310] CC-5733: RESTful API data sanitization and validation Validate field types on post/put requests using the EditAudioMD form --- .../rest/controllers/MediaController.php | 78 ++++++++++++------- 1 file changed, 49 insertions(+), 29 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 33dd9a9f60..8e6da36978 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -9,7 +9,6 @@ class Rest_MediaController extends Zend_Rest_Controller 'directory', 'filepath', 'file_exists', - 'hidden', 'mtime', 'utime', 'lptime', @@ -122,22 +121,31 @@ public function postAction() } $file = new CcFiles(); - $file->fromArray($this->validateRequestData($this->getRequest()->getPost())); - $file->setDbOwnerId($this->getOwnerId()); - $now = new DateTime("now", new DateTimeZone("UTC")); - $file->setDbTrackTitle($_FILES["file"]["name"]); - $file->setDbUtime($now); - $file->setDbMtime($now); - $file->setDbHidden(true); - $file->save(); - - $callbackUrl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getRequestUri() . "/" . $file->getPrimaryKey(); + $whiteList = $this->removeBlacklistedFieldsFromRequestData($this->getRequest()->getPost()); - $this->processUploadedFile($callbackUrl, $_FILES["file"]["name"], $this->getOwnerId()); + if (!$this->validateRequestData($file, $whiteList)) { + $file->setDbTrackTitle($_FILES["file"]["name"]); + $file->setDbUtime(new DateTime("now", new DateTimeZone("UTC"))); + $file->setDbHidden(true); + $file->save(); + return; + } else { - $this->getResponse() - ->setHttpResponseCode(201) - ->appendBody(json_encode($this->sanitizeResponse($file))); + $file->fromArray($whiteList); + $file->setDbOwnerId($this->getOwnerId()); + $now = new DateTime("now", new DateTimeZone("UTC")); + $file->setDbTrackTitle($_FILES["file"]["name"]); + $file->setDbUtime($now); + $file->save(); + + $callbackUrl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getRequestUri() . "/" . $file->getPrimaryKey(); + + $this->processUploadedFile($callbackUrl, $_FILES["file"]["name"], $this->getOwnerId()); + + $this->getResponse() + ->setHttpResponseCode(201) + ->appendBody(json_encode($this->sanitizeResponse($file))); + } } public function putAction() @@ -153,19 +161,15 @@ public function putAction() } $file = CcFilesQuery::create()->findPk($id); - //validate fields + $requestData = json_decode($this->getRequest()->getRawBody(), true); - //TODO: rename EditAudioMD form? - $fileForm = new Application_Form_EditAudioMD(); - $fileForm->startForm($file->getDbId()); - $fileForm->populate($requestData); + $whiteList = $this->removeBlacklistedFieldsFromRequestData($requestData); - if (!$fileForm->isValidPartial($requestData)) { - $file->setDbImportStatus(2)->save(); - $this->invalidDataResponse(); - } else if ($file) - { - $file->fromArray($this->validateRequestData($requestData), BasePeer::TYPE_FIELDNAME); + if (!$this->validateRequestData($file, $whiteList)) { + $file->save(); + return; + } else if ($file) { + $file->fromArray($whiteList, BasePeer::TYPE_FIELDNAME); //Our RESTful API takes "full_path" as a field, which we then split and translate to match //our internal schema. Internally, file path is stored relative to a directory, with the directory @@ -307,7 +311,23 @@ private function invalidDataResponse() $resp->setHttpResponseCode(400); $resp->appendBody("ERROR: Invalid data"); } - + + private function validateRequestData($file, $whiteList) + { + // EditAudioMD form is used here for validation + $fileForm = new Application_Form_EditAudioMD(); + $fileForm->startForm($file->getDbId()); + $fileForm->populate($whiteList); + + if (!$fileForm->isValidPartial($whiteList)) { + $file->setDbImportStatus(2); + $file->setDbHidden(true); + $this->invalidDataResponse(); + return false; + } + return true; + } + private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) { $CC_CONFIG = Config::getConfig(); @@ -376,11 +396,11 @@ private function getOwnerId() * from outside of Airtime * @param array $data */ - private function validateRequestData($data) + private function removeBlacklistedFieldsFromRequestData($data) { foreach ($this->blackList as $key) { unset($data[$key]); - } + } return $data; } From 3c5b7b585362b58dae5541e090ffd8c11ebbacda Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 2 Apr 2014 11:33:47 -0400 Subject: [PATCH 050/310] CC-5733: RESTful API data sanitization and validation small fix - was setting the hidden flag twice --- .../application/modules/rest/controllers/MediaController.php | 1 - 1 file changed, 1 deletion(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 8e6da36978..3a364adda5 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -126,7 +126,6 @@ public function postAction() if (!$this->validateRequestData($file, $whiteList)) { $file->setDbTrackTitle($_FILES["file"]["name"]); $file->setDbUtime(new DateTime("now", new DateTimeZone("UTC"))); - $file->setDbHidden(true); $file->save(); return; } else { From f6369c02ee4e15a0b22ad0791620d4ae6e61f5ea Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 2 Apr 2014 16:47:24 -0400 Subject: [PATCH 051/310] CC-5709: Airtime Analyzer * Catch bad callback_url --- .../airtime_analyzer/airtime_analyzer/message_listener.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index c5e4da373a..e9f5cd0467 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -116,8 +116,9 @@ def msg_received_callback(channel, method_frame, header_frame, body): # TODO: If the JSON was invalid or the web server is down, # then don't report that failure to the REST API #TODO: Catch exceptions from this HTTP request too: - StatusReporter.report_failure_to_callback_url(callback_url, api_key, import_status=2, - reason=u'An error occurred while importing this file') + if callback_url: # If we got an invalid message, there might be no callback_url in the JSON + StatusReporter.report_failure_to_callback_url(callback_url, api_key, import_status=2, + reason=u'An error occurred while importing this file') else: From 2a172afe3e00131bd9ab74a3b9252b61614eabcd Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 2 Apr 2014 16:51:38 -0400 Subject: [PATCH 052/310] CC-5709: Even more slightly better exception handling --- .../airtime_analyzer/airtime_analyzer/message_listener.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index e9f5cd0467..41d6f7bd2b 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -74,6 +74,14 @@ def disconnect_from_messaging_server(self): @staticmethod def msg_received_callback(channel, method_frame, header_frame, body): logging.info(" - Received '%s' on routing_key '%s'" % (body, method_frame.routing_key)) + + #Declare all variables here so they exist in the exception handlers below, no matter what. + audio_file_path = "" + #final_file_path = "" + import_directory = "" + original_filename = "" + callback_url = "" + api_key = "" # Spin up a worker process. We use the multiprocessing module and multiprocessing.Queue # to pass objects between the processes so that if the analyzer process crashes, it does not From 2ca911616fab19d75aebb3689ac9f56d555d5974 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 3 Apr 2014 10:12:20 -0400 Subject: [PATCH 053/310] Setting hidden flag to true on post request --- .../application/modules/rest/controllers/MediaController.php | 1 + 1 file changed, 1 insertion(+) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 3a364adda5..230144ee68 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -135,6 +135,7 @@ public function postAction() $now = new DateTime("now", new DateTimeZone("UTC")); $file->setDbTrackTitle($_FILES["file"]["name"]); $file->setDbUtime($now); + $file->setDbHidden(true); $file->save(); $callbackUrl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getRequestUri() . "/" . $file->getPrimaryKey(); From 86b94b970ff7143edc50312b546d0582eed7dc0e Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 3 Apr 2014 11:34:57 -0400 Subject: [PATCH 054/310] CC-5709: Airtime Analyzer * Fix for incorrect length sometimes happening (VBR MP3?) --- .../airtime_analyzer/airtime_analyzer/metadata_analyzer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index fa0a88807c..1fa2690519 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -78,7 +78,7 @@ def analyze(filename, metadata): 'genre': 'genre', 'isrc': 'isrc', 'label': 'label', - 'length': 'length', + #'length': 'length', 'language': 'language', 'last_modified':'last_modified', 'mood': 'mood', From 95b369c54df86b92bd656f0b62ebb8e255581e8a Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 3 Apr 2014 16:13:26 -0400 Subject: [PATCH 055/310] CC-5709: Airtime Analyzer * Remove awful StoredFile::uploadFile() function * Massive airtime_analyzer commenting and cleanup * Cleaned up the upload code * Temporarily disabled the liquidsoap playability test. --- .../application/controllers/ApiController.php | 4 +- airtime_mvc/application/models/StoredFile.php | 104 +----------------- .../rest/controllers/MediaController.php | 17 ++- python_apps/airtime_analyzer/README.rst | 17 ++- .../airtime_analyzer/airtime_analyzer.py | 24 ++-- .../airtime_analyzer/analyzer.py | 5 +- .../airtime_analyzer/analyzer_pipeline.py | 33 ++++-- .../airtime_analyzer/filemover_analyzer.py | 16 ++- .../airtime_analyzer/message_listener.py | 89 +++++++++++---- .../airtime_analyzer/metadata_analyzer.py | 7 +- .../airtime_analyzer/replaygain_analyzer.py | 4 +- .../airtime_analyzer/status_reporter.py | 22 ++-- .../airtime_analyzer/bin/airtime_analyzer | 53 +++++---- 13 files changed, 204 insertions(+), 191 deletions(-) diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index 4ce7a55834..98ca2ce601 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -453,6 +453,8 @@ public function recordedShowsAction() public function uploadFileAction() { + Logging::error("FIXME: Change the show recorder to use the File Upload API and remove this function."); // Albert - April 3, 2014 + /** $upload_dir = ini_get("upload_tmp_dir"); $tempFilePath = Application_Model_StoredFile::uploadFile($upload_dir); $tempFileName = basename($tempFilePath); @@ -464,7 +466,7 @@ public function uploadFileAction() $this->_helper->json->sendJson( array("jsonrpc" => "2.0", "error" => array("code" => $result['code'], "message" => $result['message'])) ); - } + }*/ } public function uploadRecordedAction() diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 23247522c2..3199d1b1c9 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -899,107 +899,6 @@ public static function searchLibraryFiles($datatables) return $results; } - public static function uploadFile($p_targetDir) - { - // HTTP headers for no cache etc - header('Content-type: text/plain; charset=UTF-8'); - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - header("Cache-Control: no-store, no-cache, must-revalidate"); - header("Cache-Control: post-check=0, pre-check=0", false); - header("Pragma: no-cache"); - - // Settings - $cleanupTargetDir = false; // Remove old files - $maxFileAge = 60 * 60; // Temp file age in seconds - - // 5 minutes execution time - @set_time_limit(5 * 60); - // usleep(5000); - - // Get parameters - $chunk = isset($_REQUEST["chunk"]) ? $_REQUEST["chunk"] : 0; - $chunks = isset($_REQUEST["chunks"]) ? $_REQUEST["chunks"] : 0; - $fileName = isset($_REQUEST["name"]) ? $_REQUEST["name"] : ''; - # TODO : should not log __FILE__ itself. there is general logging for - # this - Logging::info(__FILE__.":uploadFile(): filename=$fileName to $p_targetDir"); - // Clean the fileName for security reasons - //this needs fixing for songs not in ascii. - //$fileName = preg_replace('/[^\w\._]+/', '', $fileName); - - // Create target dir - if (!file_exists($p_targetDir)) - @mkdir($p_targetDir); - - // Remove old temp files - if (is_dir($p_targetDir) && ($dir = opendir($p_targetDir))) { - while (($file = readdir($dir)) !== false) { - $filePath = $p_targetDir . DIRECTORY_SEPARATOR . $file; - - // Remove temp files if they are older than the max age - if (preg_match('/\.tmp$/', $file) && (filemtime($filePath) < time() - $maxFileAge)) - @unlink($filePath); - } - - closedir($dir); - } else - die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": _("Failed to open temp directory.")}, "id" : "id"}'); - - // Look for the content type header - if (isset($_SERVER["HTTP_CONTENT_TYPE"])) - $contentType = $_SERVER["HTTP_CONTENT_TYPE"]; - - if (isset($_SERVER["CONTENT_TYPE"])) - $contentType = $_SERVER["CONTENT_TYPE"]; - - // create temp file name (CC-3086) - // we are not using mktemp command anymore. - // plupload support unique_name feature. - $tempFilePath= $p_targetDir . DIRECTORY_SEPARATOR . $fileName; - - // Old IBM code... - if (strpos($contentType, "multipart") !== false) { - if (isset($_FILES['file']['tmp_name']) && is_uploaded_file($_FILES['file']['tmp_name'])) { - // Open temp file - $out = fopen($tempFilePath, $chunk == 0 ? "wb" : "ab"); - if ($out) { - // Read binary input stream and append it to temp file - $in = fopen($_FILES['file']['tmp_name'], "rb"); - - if ($in) { - while (($buff = fread($in, 4096))) - fwrite($out, $buff); - } else - die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": _("Failed to open input stream.")}, "id" : "id"}'); - - fclose($out); - unlink($_FILES['file']['tmp_name']); - } else - die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": _("Failed to open output stream.")}, "id" : "id"}'); - } else - die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": _("Failed to move uploaded file.")}, "id" : "id"}'); - } else { - // Open temp file - $out = fopen($tempFilePath, $chunk == 0 ? "wb" : "ab"); - if ($out) { - // Read binary input stream and append it to temp file - $in = fopen("php://input", "rb"); - - if ($in) { - while (($buff = fread($in, 4096))) - fwrite($out, $buff); - } else - die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": _("Failed to open input stream.")}, "id" : "id"}'); - - fclose($out); - } else - die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": _("Failed to open output stream.")}, "id" : "id"}'); - } - - return $tempFilePath; - } - /** * Check, using disk_free_space, the space available in the $destination_folder folder to see if it has * enough space to move the $audio_file into and report back to the user if not. @@ -1065,12 +964,13 @@ public static function copyFileToStor($tempFilePath, $originalFilename) // Check if liquidsoap can play this file // TODO: Move this to airtime_analyzer + /* if (!self::liquidsoapFilePlayabilityTest($audio_file)) { return array( "code" => 110, "message" => _("This file appears to be corrupted and will not " ."be added to media library.")); - } + }*/ // Did all the checks for real, now trying to copy diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 230144ee68..812d00bcce 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -333,22 +333,19 @@ private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) $CC_CONFIG = Config::getConfig(); $apiKey = $CC_CONFIG["apiKey"][0]; - $upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; - $tempFilePath = Application_Model_StoredFile::uploadFile($upload_dir); + //$upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; + //$tempFilePath = Application_Model_StoredFile::uploadFile($upload_dir); + + $tempFilePath = $_FILES['file']['tmp_name']; $tempFileName = basename($tempFilePath); //TODO: Remove copyFileToStor from StoredFile... //TODO: Remove uploadFileAction from ApiController.php **IMPORTANT** - It's used by the recorder daemon? - - $upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; - $tempFilePath = $upload_dir . "/" . $tempFileName; - + $storDir = Application_Model_MusicDir::getStorDir(); - //$finalFullFilePath = $storDir->getDirectory() . "/imported/" . $ownerId . "/" . $originalFilename; $importedStorageDirectory = $storDir->getDirectory() . "/imported/" . $ownerId; - try { //Copy the temporary file over to the "organize" folder so that it's off our webserver //and accessible by airtime_analyzer which could be running on a different machine. @@ -357,8 +354,8 @@ private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) Logging::error($e->getMessage()); } - //Logging::info("New temporary file path: " . $newTempFilePath); - //Logging::info("Final file path: " . $finalFullFilePath); + Logging::info($newTempFilePath); + //Logging::info("Old temp file path: " . $tempFilePath); //Dispatch a message to airtime_analyzer through RabbitMQ, //notifying it that there's a new upload to process! diff --git a/python_apps/airtime_analyzer/README.rst b/python_apps/airtime_analyzer/README.rst index e6a5a08b93..41881992e2 100644 --- a/python_apps/airtime_analyzer/README.rst +++ b/python_apps/airtime_analyzer/README.rst @@ -1,5 +1,14 @@ +airtime_analyzer +========== + +airtime_analyzer is a daemon that processes Airtime file uploads as background jobs. +It performs metadata extraction using Mutagen and moves uploads into Airtime's +music library directory (stor/imported). + +airtime_analyzer uses process isolation to make it resilient to crashes and runs in +a multi-tenant environment with no modifications. -Ghetto temporary installation instructions +Installation ========== $ sudo python setup.py install @@ -71,3 +80,9 @@ a test, run: To run the unit tests and generate a code coverage report, run: $ nosetests --with-coverage --cover-package=airtime_analyzer + + + History and Design Motivation + =========== + + \ No newline at end of file diff --git a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py index 66933f55a4..a87fc2b3d1 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py @@ -1,3 +1,5 @@ +"""Contains the main application class for airtime_analyzer. +""" import ConfigParser import logging import logging.handlers @@ -8,6 +10,8 @@ class AirtimeAnalyzerServer: + """A server for importing uploads to Airtime as background jobs. + """ # Constants _LOG_PATH = "/var/log/airtime/airtime_analyzer.log" @@ -29,7 +33,12 @@ def __init__(self, config_path, debug=False): def setup_logging(self, debug): - + """Set up nicely formatted logging and log rotation. + + Keyword arguments: + debug -- a boolean indicating whether to enable super verbose logging + to the screen and disk. + """ if debug: self._log_level = logging.DEBUG else: @@ -37,8 +46,6 @@ def setup_logging(self, debug): pika_logger = logging.getLogger('pika') pika_logger.setLevel(logging.CRITICAL) - #self.log = logging.getLogger(__name__) - # Set up logging logFormatter = logging.Formatter("%(asctime)s [%(module)s] [%(levelname)-5.5s] %(message)s") rootLogger = logging.getLogger() @@ -55,6 +62,7 @@ def setup_logging(self, debug): def read_config_file(self, config_path): + """Parse the application's config file located at config_path.""" config = ConfigParser.SafeConfigParser() try: config.readfp(open(config_path)) @@ -66,12 +74,4 @@ def read_config_file(self, config_path): exit(-1) return config - - -''' When being run from the command line, analyze a file passed - as an argument. ''' -if __name__ == "__main__": - import sys - analyzers = AnalyzerPipeline() - - + \ No newline at end of file diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py index b47ebe0ab1..4a58aa75d0 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py @@ -1,12 +1,13 @@ class Analyzer: - + """ Abstract base class fpr all "analyzers". + """ @staticmethod def analyze(filename, metadata): raise NotImplementedError ''' -class AnalyzerError(Exception): +class AnalyzerError(Error): def __init__(self): super.__init__(self) ''' diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 2266fb9a23..0ba5fb22e0 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -1,14 +1,35 @@ +""" Analyzes and imports an audio file into the Airtime library. +""" import logging import multiprocessing from metadata_analyzer import MetadataAnalyzer from filemover_analyzer import FileMoverAnalyzer class AnalyzerPipeline: - - # Take message dictionary and perform the necessary analysis. + """ Analyzes and imports an audio file into the Airtime library. + + This currently performs metadata extraction (eg. gets the ID3 tags from an MP3), + then moves the file to the Airtime music library (stor/imported), and returns + the results back to the parent process. This class is used in an isolated process + so that if it crashes, it does not kill the entire airtime_analyzer daemon and + the failure to import can be reported back to the web application. + """ + @staticmethod def run_analysis(queue, audio_file_path, import_directory, original_filename): - + """Analyze and import an audio file, and put all extracted metadata into queue. + + Keyword arguments: + queue: A multiprocessing.queues.Queue which will be used to pass the + extracted metadata back to the parent process. + audio_file_path: Path on disk to the audio file to analyze. + import_directory: Path to the final Airtime "import" directory where + we will move the file. + original_filename: The original filename of the file, which we'll try to + preserve. The file at audio_file_path typically has a + temporary randomly generated name, which is why we want + to know what the original name was. + """ if not isinstance(queue, multiprocessing.queues.Queue): raise TypeError("queue must be a multiprocessing.Queue()") if not isinstance(audio_file_path, unicode): @@ -18,8 +39,6 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): if not isinstance(original_filename, unicode): raise TypeError("original_filename must be unicode. Was of type " + type(original_filename).__name__ + " instead.") - #print ReplayGainAnalyzer.analyze("foo.mp3") - # Analyze the audio file we were told to analyze: # First, we extract the ID3 tags and other metadata: metadata = dict() @@ -30,8 +49,8 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): # Note that the queue we're putting the results into is our interprocess communication # back to the main process. - #Pass all the file metadata back to the main analyzer process, which then passes - #it back to the Airtime web application. + # Pass all the file metadata back to the main analyzer process, which then passes + # it back to the Airtime web application. queue.put(metadata) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py index ab12aad793..b0d94ee796 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py @@ -9,13 +9,26 @@ from analyzer import Analyzer class FileMoverAnalyzer(Analyzer): - + """This analyzer copies a file over from a temporary directory (stor/organize) + into the Airtime library (stor/imported). + """ @staticmethod def analyze(audio_file_path, metadata): + """Dummy method because we need more info than analyze gets passed to it""" raise Exception("Use FileMoverAnalyzer.move() instead.") @staticmethod def move(audio_file_path, import_directory, original_filename, metadata): + """Move the file at audio_file_path over into the import_directory/import, + renaming it to original_filename. + + Keyword arguments: + audio_file_path: Path to the file to be imported. + import_directory: Path to the "import" directory inside the Airtime stor directory. + (eg. /srv/airtime/stor/import) + original_filename: The filename of the file when it was uploaded to Airtime. + metadata: A dictionary where the "full_path" of where the file is moved to will be added. + """ if not isinstance(audio_file_path, unicode): raise TypeError("audio_file_path must be unicode. Was of type " + type(audio_file_path).__name__) if not isinstance(import_directory, unicode): @@ -68,6 +81,7 @@ def move(audio_file_path, import_directory, original_filename, metadata): return metadata def mkdir_p(path): + """ Make all directories in a tree (like mkdir -p)""" if path == "": return try: diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 41d6f7bd2b..0e33dbd3aa 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -9,19 +9,56 @@ EXCHANGE = "airtime-uploads" EXCHANGE_TYPE = "topic" -ROUTING_KEY = "" #"airtime.analyzer.tasks" +ROUTING_KEY = "" QUEUE = "airtime-uploads" -''' TODO: Document me - - round robin messaging - - acking - - why we use the multiprocess architecture - - in general, how it works and why it works this way -''' +""" A message listener class that waits for messages from Airtime through RabbitMQ + notifying us about new uploads. + + This is probably the most important class in this application. It connects + to RabbitMQ (or an AMQP server) and listens for messages that notify us + when a user uploads a new file to Airtime, either through the web interface + or via FTP (on Airtime Pro). When we get a notification, we spawn a child + process that extracts the uploaded audio file's metadata and moves it into + Airtime's music library directory. Lastly, the extracted metadata is + reported back to the Airtime web application. + + There's a couple of Very Important technical details and contraints that you + need to know if you're going to work on this code: + + 1) airtime_analyzer is designed so it doesn't have to run on the same + computer as the web server. It just needs access to your Airtime library + folder (stor). + 2) airtime_analyzer is multi-tenant - One process can be used for many + Airtime instances. It's designed NOT to know about whether it's running + in a single tenant or multi-tenant environment. All the information it + needs to import a file into an Airtime instance is passed in via those + RabbitMQ messages. + 3) We're using a "topic exchange" for the new upload notification RabbitMQ + messages. This means if we run several airtime_analyzer processes on + different computers, RabbitMQ will do round-robin dispatching of the + file notification. This is cheap, easy load balancing and + redundancy for us. You can even run multiple airtime_analyzer processes + on one machine if you want. + 4) We run the actual work (metadata analysis and file moving) in a separate + child process so that if it crashes, we can stop RabbitMQ from resending + the file notification message to another airtime_analyzer process (NACK), + which would otherwise cause cascading failure. We also do this so that we + can report the problem file to the Airtime web interface ("import failed"). + + So that is a quick overview of the design constraints for this application, and + why airtime_analyzer is written this way. +""" class MessageListener: def __init__(self, config): + ''' Start listening for file upload notification messages + from RabbitMQ + + Keyword arguments: + config: A ConfigParser object containing the [rabbitmq] configuration. + ''' # Read the RabbitMQ connection settings from the config file # The exceptions throw here by default give good error messages. @@ -49,7 +86,7 @@ def __init__(self, config): def connect_to_messaging_server(self): - + '''Connect to the RabbitMQ server and start listening for messages.''' self._connection = pika.BlockingConnection(pika.ConnectionParameters(host=self._host, port=self._port, virtual_host=self._vhost, credentials=pika.credentials.PlainCredentials(self._username, self._password))) @@ -64,15 +101,21 @@ def connect_to_messaging_server(self): queue=QUEUE, no_ack=False) def wait_for_messages(self): + '''Wait until we've received a RabbitMQ message.''' self._channel.start_consuming() def disconnect_from_messaging_server(self): + '''Stop consuming RabbitMQ messages and disconnect''' self._channel.stop_consuming() - # consume callback function @staticmethod def msg_received_callback(channel, method_frame, header_frame, body): + ''' A callback method that runs when a RabbitMQ message is received. + + Here we parse the message, spin up an analyzer process, and report the + metadata back to the Airtime web application (or report an error). + ''' logging.info(" - Received '%s' on routing_key '%s'" % (body, method_frame.routing_key)) #Declare all variables here so they exist in the exception handlers below, no matter what. @@ -83,11 +126,12 @@ def msg_received_callback(channel, method_frame, header_frame, body): callback_url = "" api_key = "" - # Spin up a worker process. We use the multiprocessing module and multiprocessing.Queue - # to pass objects between the processes so that if the analyzer process crashes, it does not - # take down the rest of the daemon and we NACK that message so that it doesn't get - # propagated to other airtime_analyzer daemons (eg. running on other servers). - # We avoid cascading failure this way. + ''' Spin up a worker process. We use the multiprocessing module and multiprocessing.Queue + to pass objects between the processes so that if the analyzer process crashes, it does not + take down the rest of the daemon and we NACK that message so that it doesn't get + propagated to other airtime_analyzer daemons (eg. running on other servers). + We avoid cascading failure this way. + ''' try: msg_dict = json.loads(body) audio_file_path = msg_dict["tmp_file_path"] @@ -109,13 +153,14 @@ def msg_received_callback(channel, method_frame, header_frame, body): except Exception as e: logging.exception(e) - #If ANY exception happens while processing a file, we're going to NACK to the - #messaging server and tell it to remove the message from the queue. - #(NACK is a negative acknowledgement. We could use ACK instead, but this might come - # in handy in the future.) - #Exceptions in this context are unexpected, unhandled errors. We try to recover - #from as many errors as possble in AnalyzerPipeline, but we're safeguarding ourselves - #here from any catastrophic or genuinely unexpected errors: + ''' If ANY exception happens while processing a file, we're going to NACK to the + messaging server and tell it to remove the message from the queue. + (NACK is a negative acknowledgement. We could use ACK instead, but this might come + in handy in the future.) + Exceptions in this context are unexpected, unhandled errors. We try to recover + from as many errors as possble in AnalyzerPipeline, but we're safeguarding ourselves + here from any catastrophic or genuinely unexpected errors: + ''' channel.basic_nack(delivery_tag=method_frame.delivery_tag, multiple=False, requeue=False) #Important that it doesn't requeue the message @@ -136,7 +181,7 @@ def msg_received_callback(channel, method_frame, header_frame, body): @staticmethod def spawn_analyzer_process(audio_file_path, import_directory, original_filename): - + ''' Spawn a child process to analyze and import a new audio file. ''' q = multiprocessing.Queue() p = multiprocessing.Process(target=AnalyzerPipeline.run_analysis, args=(q, audio_file_path, import_directory, original_filename)) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index 1fa2690519..471d6b592d 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -8,6 +8,12 @@ class MetadataAnalyzer(Analyzer): @staticmethod def analyze(filename, metadata): + ''' Extract audio metadata from tags embedded in the file (eg. ID3 tags) + + Keyword arguments: + filename: The path to the audio file to extract metadata from. + metadata: A dictionary that the extracted metadata will be added to. + ''' if not isinstance(filename, unicode): raise TypeError("filename must be unicode. Was of type " + type(filename).__name__) if not isinstance(metadata, dict): @@ -25,7 +31,6 @@ def analyze(filename, metadata): track_length = datetime.timedelta(seconds=info.length) metadata["length"] = str(track_length) #time.strftime("%H:%M:%S.%f", track_length) metadata["bit_rate"] = info.bitrate - #metadata["channels"] = info.channels #Use the python-magic module to get the MIME type. mime_magic = magic.Magic(mime=True) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py index cf10c0a44b..2d02518f29 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py @@ -1,6 +1,8 @@ from analyzer import Analyzer -''' TODO: everything ''' +''' TODO: ReplayGain is currently calculated by pypo but it should + be done here in the analyzer. +''' class ReplayGainAnalyzer(Analyzer): def __init__(self): diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index 2a0963dd92..4e1dccf2ca 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -3,15 +3,18 @@ import logging class StatusReporter(): - + ''' Reports the extracted audio file metadata and job status back to the + Airtime web application. + ''' _HTTP_REQUEST_TIMEOUT = 30 - # Report the extracted metadata and status of the successfully imported file - # to the callback URL (which should be the Airtime File Upload API) @classmethod def report_success_to_callback_url(self, callback_url, api_key, audio_metadata): - - # encode the audio metadata as json and post it back to the callback_url + ''' Report the extracted metadata and status of the successfully imported file + to the callback URL (which should be the Airtime File Upload API) + ''' + + # Encode the audio metadata as json and post it back to the callback_url put_payload = json.dumps(audio_metadata) logging.debug("sending http put with payload: " + put_payload) r = requests.put(callback_url, data=put_payload, @@ -20,13 +23,14 @@ def report_success_to_callback_url(self, callback_url, api_key, audio_metadata): logging.debug("HTTP request returned status: " + str(r.status_code)) logging.debug(r.text) # log the response body - #todo: queue up failed requests and try them again later. - r.raise_for_status() # raise an exception if there was an http error code returned + #TODO: queue up failed requests and try them again later. + r.raise_for_status() # Raise an exception if there was an http error code returned @classmethod def report_failure_to_callback_url(self, callback_url, api_key, import_status, reason): - # TODO: Make import_status is an int? - + if not isinstance(import_status, (int, long) ): + raise TypeError("import_status must be an integer. Was of type " + type(import_status).__name__) + logging.debug("Reporting import failure to Airtime REST API...") audio_metadata = dict() audio_metadata["import_status"] = import_status diff --git a/python_apps/airtime_analyzer/bin/airtime_analyzer b/python_apps/airtime_analyzer/bin/airtime_analyzer index 85266e9b09..8b45e775c7 100755 --- a/python_apps/airtime_analyzer/bin/airtime_analyzer +++ b/python_apps/airtime_analyzer/bin/airtime_analyzer @@ -1,3 +1,5 @@ +"""Runs the airtime_analyzer application. +""" #!/usr/bin/env python import daemon @@ -8,19 +10,37 @@ import airtime_analyzer.airtime_analyzer as aa VERSION = "1.0" DEFAULT_CONFIG_PATH = '/etc/airtime/airtime.conf' -print "Airtime Analyzer " + VERSION +def run(): + '''Entry-point for this application''' + print "Airtime Analyzer " + VERSION + parser = argparse.ArgumentParser() + parser.add_argument("-d", "--daemon", help="run as a daemon", action="store_true") + parser.add_argument("--debug", help="log full debugging output", action="store_true") + parser.add_argument("--rmq-config-file", help="specify a configuration file with RabbitMQ settings (default is /etc/airtime/airtime.conf)") + args = parser.parse_args() + + check_if_media_monitor_is_running() + + #Default config file path + config_path = DEFAULT_CONFIG_PATH + if args.rmq_config_file: + config_path = args.rmq_config_file + + if args.daemon: + with daemon.DaemonContext(): + aa.AirtimeAnalyzerServer(config_path=config_path, debug=args.debug) + else: + # Run without daemonizing + aa.AirtimeAnalyzerServer(config_path=config_path, debug=args.debug) -parser = argparse.ArgumentParser() -parser.add_argument("-d", "--daemon", help="run as a daemon", action="store_true") -parser.add_argument("--debug", help="log full debugging output", action="store_true") -parser.add_argument("--rmq-config-file", help="specify a configuration file with RabbitMQ settings (default is /etc/airtime/airtime.conf)") -args = parser.parse_args() -'''Ensure media_monitor isn't running before we start, because it'll move newly uploaded - files into the library on us and screw up the operation of airtime_analyzer. - media_monitor is deprecated. -''' def check_if_media_monitor_is_running(): + """Ensure media_monitor isn't running before we start. + + We do this because media_monitor will move newly uploaded + files into the library on us and screw up the operation of airtime_analyzer. + media_monitor is deprecated. + """ pids = [pid for pid in os.listdir('/proc') if pid.isdigit()] for pid in pids: @@ -33,17 +53,6 @@ def check_if_media_monitor_is_running(): except IOError: # proc has already terminated continue -check_if_media_monitor_is_running() - -#Default config file path -config_path = DEFAULT_CONFIG_PATH -if args.rmq_config_file: - config_path = args.rmq_config_file +run() -if args.daemon: - with daemon.DaemonContext(): - analyzer = aa.AirtimeAnalyzerServer(config_path=config_path, debug=args.debug) -else: - # Run without daemonizing - analyzer = aa.AirtimeAnalyzerServer(config_path=config_path, debug=args.debug) From 64a95c7c59c276ed61656ee739111735a206002c Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 3 Apr 2014 16:36:42 -0400 Subject: [PATCH 056/310] CC-5709: Airtime Analyzer * Nuked another unused function --- .../application/controllers/PluploadController.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index c919207b46..83b2fe715e 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -27,15 +27,6 @@ public function indexAction() $this->view->headLink()->appendStylesheet($baseUrl.'css/addmedia.css?'.$CC_CONFIG['airtime_version']); } - public function uploadAction() - { - $upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; - $tempFilePath = Application_Model_StoredFile::uploadFile($upload_dir); - $tempFileName = basename($tempFilePath); - - $this->_helper->json->sendJson(array("jsonrpc" => "2.0", "tempfilepath" => $tempFileName)); - } - public function recentUploadsAction() { if (isset($_GET['uploadFilter'])) { From cf492045ccb24707c656625391970ff7ae352506 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 4 Apr 2014 12:35:50 -0400 Subject: [PATCH 057/310] CC-5709: Airtime Analyzer * A bunch of cleanup and fix for metadata extraction on files mutagen can't read --- .../rest/controllers/MediaController.php | 11 +++-------- .../airtime_analyzer/metadata_analyzer.py | 19 ++++++++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 812d00bcce..09a605ccde 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -332,16 +332,11 @@ private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) { $CC_CONFIG = Config::getConfig(); $apiKey = $CC_CONFIG["apiKey"][0]; - - //$upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; - //$tempFilePath = Application_Model_StoredFile::uploadFile($upload_dir); - + $tempFilePath = $_FILES['file']['tmp_name']; $tempFileName = basename($tempFilePath); - - //TODO: Remove copyFileToStor from StoredFile... - - //TODO: Remove uploadFileAction from ApiController.php **IMPORTANT** - It's used by the recorder daemon? + + //TODO: Remove uploadFileAction from ApiController.php **IMPORTANT** - It's used by the recorder daemon... $storDir = Application_Model_MusicDir::getStorDir(); $importedStorageDirectory = $storDir->getDirectory() . "/imported/" . $ownerId; diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index 471d6b592d..c30c546e27 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -19,9 +19,20 @@ def analyze(filename, metadata): if not isinstance(metadata, dict): raise TypeError("metadata must be a dict. Was of type " + type(metadata).__name__) + #Airtime <= 2.5.x nonsense: + metadata["ftype"] = "audioclip" + #Other fields we'll want to set for Airtime: + metadata["cueout"] = metadata["length"] + metadata["hidden"] = False + #Extract metadata from an audio file using mutagen audio_file = mutagen.File(filename, easy=True) + #Bail if the file couldn't be parsed. The title should stay as the filename + #inside Airtime. + if not audio_file: + return metadata + #Grab other file information that isn't encoded in a tag, but instead usually #in the file header. Mutagen breaks that out into a separate "info" object: info = audio_file.info @@ -53,7 +64,7 @@ def analyze(filename, metadata): except (AttributeError, KeyError): #If mutagen can't figure out the number of channels, we'll just leave it out... pass - + #Try to extract the number of tracks on the album if we can (the "track total") try: track_number = audio_file["tracknumber"] @@ -107,12 +118,6 @@ def analyze(filename, metadata): except KeyError: continue - #Airtime <= 2.5.x nonsense: - metadata["ftype"] = "audioclip" - #Other fields we'll want to set for Airtime: - metadata["cueout"] = metadata["length"] - metadata["hidden"] = False - return metadata From 20b056c9f063255b9072338ddb191699ce5fd249 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 4 Apr 2014 19:08:57 -0400 Subject: [PATCH 058/310] CC-5709: Airtime Analyzer * Added upstart script for starting on bootup --- .../install/upstart/airtime_analyzer.conf | 11 ++++++++++ python_apps/airtime_analyzer/setup.py | 22 ++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf diff --git a/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf b/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf new file mode 100644 index 0000000000..a4837e50d1 --- /dev/null +++ b/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf @@ -0,0 +1,11 @@ +description "Airtime Analyzer" +author "help@sourcefabric.org" + +start on runlevel [2345] +stop on runlevel [!2345] + +expect daemon +respawn + +exec sudo -u www-data airtime_analyzer --daemon + diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index 5691676f34..5af60a3cd1 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -1,4 +1,14 @@ from setuptools import setup +from subprocess import call +import sys + +# Allows us to avoid installing the upstart init script when deploying airtime_analyzer +# on Airtime Pro: +if '--no-init-script' in sys.argv: + data_files = [] +else: + data_files = [('/etc/init', ['install/upstart/airtime_analyzer.conf'])] + print data_files setup(name='airtime_analyzer', version='0.1', @@ -19,4 +29,14 @@ 'python-daemon', 'requests', ], - zip_safe=False) + zip_safe=False, + data_files=data_files) + +# Reload the initctl config so that "service start airtime_analyzer" works +if data_files: + print "Reloading initctl configuration" + call(['initctl', 'reload-configuration']) + print "Run \"sudo service airtime_analyzer restart\" now." + + +# TODO: Should we start the analyzer here or not? From b02dc45a531f4f8d37ff81ee1ae2611cc1d9d608 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 4 Apr 2014 19:46:59 -0400 Subject: [PATCH 059/310] CC-5709: Airtime Analyzer * Fixed airtime_analyzer setup script --- python_apps/airtime_analyzer/setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index 5af60a3cd1..82c64d84cb 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -6,6 +6,7 @@ # on Airtime Pro: if '--no-init-script' in sys.argv: data_files = [] + sys.argv.remove('--no-init-script') # super hax else: data_files = [('/etc/init', ['install/upstart/airtime_analyzer.conf'])] print data_files From a756b6a9e4d0ccdebfbe0bbdd89b28a125ba048d Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 7 Apr 2014 11:37:30 -0400 Subject: [PATCH 060/310] CC-5781: Upgrade script for new storage quota implementation Created skeleton for upgrade script --- .../upgrades/airtime-2.5.3/StorageQuotaUpgrade.php | 14 ++++++++++++++ .../upgrades/airtime-2.5.3/airtime-upgrade.php | 2 ++ 2 files changed, 16 insertions(+) create mode 100644 install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php diff --git a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php new file mode 100644 index 0000000000..9cfdd2d632 --- /dev/null +++ b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php @@ -0,0 +1,14 @@ + Date: Mon, 7 Apr 2014 11:58:58 -0400 Subject: [PATCH 061/310] Included upgrade folder path for 2.5.3 so Airtime can upgrade from older versions --- install_minimal/include/airtime-upgrade.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/install_minimal/include/airtime-upgrade.php b/install_minimal/include/airtime-upgrade.php index a85fbeed0c..af9f971d42 100644 --- a/install_minimal/include/airtime-upgrade.php +++ b/install_minimal/include/airtime-upgrade.php @@ -102,4 +102,8 @@ function pause() passthru("php --php-ini $SCRIPTPATH/../airtime-php.ini $SCRIPTPATH/../upgrades/airtime-2.5.1/airtime-upgrade.php"); pause(); } +if (strcmp($version, "2.5.3") < 0) { + passthru("php --php-ini $SCRIPTPATH/../airtime-php.ini $SCRIPTPATH/../upgrades/airtime-2.5.3/airtime-upgrade.php"); + pause(); +} echo "******************************* Upgrade Complete *******************************".PHP_EOL; From 770a51dccd8033b7ed8e3c75bceb47b2cd6b6ee0 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 7 Apr 2014 12:14:49 -0400 Subject: [PATCH 062/310] Changed airtime version in necessary places --- CREDITS | 2 +- VERSION | 2 +- install_minimal/include/airtime-constants.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CREDITS b/CREDITS index 826799c992..b52ae289ef 100644 --- a/CREDITS +++ b/CREDITS @@ -2,7 +2,7 @@ CREDITS ======= -Version 2.5.1 +Version 2.5.3 Albert Santoni (albert.santoni@sourcefabric.org) Role: Developer Team Lead diff --git a/VERSION b/VERSION index 5a1ef0b728..b7fd8620d4 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ PRODUCT_ID=Airtime -PRODUCT_RELEASE=2.5.0 +PRODUCT_RELEASE=2.5.3 diff --git a/install_minimal/include/airtime-constants.php b/install_minimal/include/airtime-constants.php index 2a3bf95ee0..fd6240bd28 100644 --- a/install_minimal/include/airtime-constants.php +++ b/install_minimal/include/airtime-constants.php @@ -1,3 +1,3 @@ Date: Mon, 7 Apr 2014 14:11:31 -0400 Subject: [PATCH 063/310] CC-5781: Upgrade script for new storage quota implementation --- .../upgrades/airtime-2.5.3/StorageQuotaUpgrade.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php index 9cfdd2d632..33731a2d31 100644 --- a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php @@ -9,6 +9,15 @@ public static function startUpgrade() private static function setStorageUsage() { - + $musicDir = CcMusicDirsQuery::create() + ->filterByDbType('stor') + ->filterByDbExists(true) + ->findOne(); + $storPath = $musicDir->getDbDirectory(); + + $freeSpace = disk_free_space($storPath); + $totalSpace = disk_total_space($storPath); + + Application_Model_Preference::setDiskUsage($totalSpace - $freeSpace); } } \ No newline at end of file From c1cc3740f3839468c78a5fe879e527b45de0a1ec Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 7 Apr 2014 14:23:00 -0400 Subject: [PATCH 064/310] CC-5781: Upgrade script for new storage quota implementation Include propel library --- .../upgrades/airtime-2.5.3/StorageQuotaUpgrade.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php index 33731a2d31..b6c17b618e 100644 --- a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php @@ -1,4 +1,6 @@ Date: Mon, 7 Apr 2014 14:40:08 -0400 Subject: [PATCH 065/310] CC-5781: Upgrade script for new storage quota implementation add propel to include path --- .../airtime-2.5.3/StorageQuotaUpgrade.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php index b6c17b618e..6ac193e65f 100644 --- a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php @@ -1,5 +1,19 @@ Date: Mon, 7 Apr 2014 14:49:23 -0400 Subject: [PATCH 066/310] CC-5781: Upgrade script for new storage quota implementation --- .../upgrades/airtime-2.5.3/StorageQuotaUpgrade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php index 6ac193e65f..97bb2a1885 100644 --- a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php @@ -10,10 +10,10 @@ realpath(APPLICATION_PATH . '/../library') ))); -/*set_include_path(implode(PATH_SEPARATOR, array( +set_include_path(implode(PATH_SEPARATOR, array( get_include_path(), realpath(APPLICATION_PATH . '/../library/propel/runtime/lib') -)));*/ +))); class StorageQuotaUpgrade { From 10778fd88d2ef70ee06963959998e63a848bb41d Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 7 Apr 2014 14:52:55 -0400 Subject: [PATCH 067/310] CC-5781: Upgrade script for new storage quota implementation --- install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php index 97bb2a1885..dbef72e41c 100644 --- a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php @@ -15,6 +15,9 @@ realpath(APPLICATION_PATH . '/../library/propel/runtime/lib') ))); +//Propel classes. +set_include_path(APPLICATION_PATH . '/models' . PATH_SEPARATOR . get_include_path()); + class StorageQuotaUpgrade { public static function startUpgrade() From 6cd1ebb5eae3d2167e3048e89d9089a983113d12 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 7 Apr 2014 14:59:58 -0400 Subject: [PATCH 068/310] CC-5781: Upgrade script for new storage quota implementation --- .../upgrades/airtime-2.5.3/StorageQuotaUpgrade.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php index dbef72e41c..56a792f5ae 100644 --- a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php @@ -10,14 +10,11 @@ realpath(APPLICATION_PATH . '/../library') ))); -set_include_path(implode(PATH_SEPARATOR, array( - get_include_path(), - realpath(APPLICATION_PATH . '/../library/propel/runtime/lib') -))); - //Propel classes. set_include_path(APPLICATION_PATH . '/models' . PATH_SEPARATOR . get_include_path()); +require_once 'CcMusicDirsQuery.php'; + class StorageQuotaUpgrade { public static function startUpgrade() From b61fae77b3163caba3b05f56ab11715fcd45a0e7 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 7 Apr 2014 15:04:54 -0400 Subject: [PATCH 069/310] CC-5781: Upgrade script for new storage quota implementation --- install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php | 1 + 1 file changed, 1 insertion(+) diff --git a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php index 56a792f5ae..99ee2e8ddc 100644 --- a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php @@ -12,6 +12,7 @@ //Propel classes. set_include_path(APPLICATION_PATH . '/models' . PATH_SEPARATOR . get_include_path()); +set_include_path(APPLICATION_PATH . '/models/airtime' . PATH_SEPARATOR . get_include_path()); require_once 'CcMusicDirsQuery.php'; From 54868c9f6eb317c2165fdf7d5b3ae95950125b25 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 7 Apr 2014 15:07:42 -0400 Subject: [PATCH 070/310] CC-5781: Upgrade script for new storage quota implementation --- install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php | 1 + 1 file changed, 1 insertion(+) diff --git a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php index 99ee2e8ddc..0bfe3df1e1 100644 --- a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php @@ -12,6 +12,7 @@ //Propel classes. set_include_path(APPLICATION_PATH . '/models' . PATH_SEPARATOR . get_include_path()); +set_include_path(APPLICATION_PATH . '/models/om' . PATH_SEPARATOR . get_include_path()); set_include_path(APPLICATION_PATH . '/models/airtime' . PATH_SEPARATOR . get_include_path()); require_once 'CcMusicDirsQuery.php'; From aa531c882f4412d1e625af8ecaa5d3e0cc91cff0 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 7 Apr 2014 15:16:32 -0400 Subject: [PATCH 071/310] CC-5781: Upgrade script for new storage quota implementation --- .../upgrades/airtime-2.5.3/StorageQuotaUpgrade.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php index 0bfe3df1e1..d039df3814 100644 --- a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php @@ -12,10 +12,11 @@ //Propel classes. set_include_path(APPLICATION_PATH . '/models' . PATH_SEPARATOR . get_include_path()); -set_include_path(APPLICATION_PATH . '/models/om' . PATH_SEPARATOR . get_include_path()); -set_include_path(APPLICATION_PATH . '/models/airtime' . PATH_SEPARATOR . get_include_path()); +#set_include_path(APPLICATION_PATH . '/models/om' . PATH_SEPARATOR . get_include_path()); +#set_include_path(APPLICATION_PATH . '/models/airtime' . PATH_SEPARATOR . get_include_path()); require_once 'CcMusicDirsQuery.php'; +require_once 'BaseCcMusicDirsQuery.php'; class StorageQuotaUpgrade { From c18c4da629dba56976a7dd5f1d15f33c45935964 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 7 Apr 2014 15:18:33 -0400 Subject: [PATCH 072/310] CC-5781: Upgrade script for new storage quota implementation --- .../upgrades/airtime-2.5.3/StorageQuotaUpgrade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php index d039df3814..43c2e124c0 100644 --- a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php @@ -12,8 +12,8 @@ //Propel classes. set_include_path(APPLICATION_PATH . '/models' . PATH_SEPARATOR . get_include_path()); -#set_include_path(APPLICATION_PATH . '/models/om' . PATH_SEPARATOR . get_include_path()); -#set_include_path(APPLICATION_PATH . '/models/airtime' . PATH_SEPARATOR . get_include_path()); +set_include_path(APPLICATION_PATH . '/models/airtime' . PATH_SEPARATOR . get_include_path()); +set_include_path(APPLICATION_PATH . '/models/om' . PATH_SEPARATOR . get_include_path()); require_once 'CcMusicDirsQuery.php'; require_once 'BaseCcMusicDirsQuery.php'; From 70e660e7dae1bac300a228e3b401015811dc33ce Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 7 Apr 2014 15:26:56 -0400 Subject: [PATCH 073/310] CC-5781: Upgrade script for new storage quota implementation --- .../upgrades/airtime-2.5.3/StorageQuotaUpgrade.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php index 43c2e124c0..8574d4bee0 100644 --- a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php @@ -10,13 +10,19 @@ realpath(APPLICATION_PATH . '/../library') ))); +/*set_include_path(implode(PATH_SEPARATOR, array( + get_include_path(), + realpath(APPLICATION_PATH . '/../library/propel/runtime/lib') +)));*/ + //Propel classes. set_include_path(APPLICATION_PATH . '/models' . PATH_SEPARATOR . get_include_path()); set_include_path(APPLICATION_PATH . '/models/airtime' . PATH_SEPARATOR . get_include_path()); set_include_path(APPLICATION_PATH . '/models/om' . PATH_SEPARATOR . get_include_path()); +require_once 'propel/runtime/lib/Propel.php'; require_once 'CcMusicDirsQuery.php'; -require_once 'BaseCcMusicDirsQuery.php'; +#require_once 'BaseCcMusicDirsQuery.php'; class StorageQuotaUpgrade { From b8b913ff68a47f68d4ade640b7781b4744740a11 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 7 Apr 2014 16:19:44 -0400 Subject: [PATCH 074/310] CC-5709: Airtime Analyzer * Fixed daemonization stuff for upstart * Adding missing unit test files --- .../airtime_analyzer/bin/airtime_analyzer | 2 +- .../install/upstart/airtime_analyzer.conf | 3 +- .../airtime_analyzer/tests/analyzer_tests.py | 13 ++ .../tests/filemover_analyzer_tests.py | 112 ++++++++++++++++++ 4 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 python_apps/airtime_analyzer/tests/analyzer_tests.py create mode 100644 python_apps/airtime_analyzer/tests/filemover_analyzer_tests.py diff --git a/python_apps/airtime_analyzer/bin/airtime_analyzer b/python_apps/airtime_analyzer/bin/airtime_analyzer index 8b45e775c7..c74ad044c1 100755 --- a/python_apps/airtime_analyzer/bin/airtime_analyzer +++ b/python_apps/airtime_analyzer/bin/airtime_analyzer @@ -1,6 +1,6 @@ +#!/usr/bin/env python """Runs the airtime_analyzer application. """ -#!/usr/bin/env python import daemon import argparse diff --git a/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf b/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf index a4837e50d1..03bba725c6 100644 --- a/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf +++ b/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf @@ -4,8 +4,7 @@ author "help@sourcefabric.org" start on runlevel [2345] stop on runlevel [!2345] -expect daemon respawn -exec sudo -u www-data airtime_analyzer --daemon +exec su www-data -c "airtime_analyzer" diff --git a/python_apps/airtime_analyzer/tests/analyzer_tests.py b/python_apps/airtime_analyzer/tests/analyzer_tests.py new file mode 100644 index 0000000000..fc6fbc6848 --- /dev/null +++ b/python_apps/airtime_analyzer/tests/analyzer_tests.py @@ -0,0 +1,13 @@ +from nose.tools import * +from airtime_analyzer.analyzer import Analyzer + +def setup(): + pass + +def teardown(): + pass + +@raises(NotImplementedError) +def test_analyze(): + abstract_analyzer = Analyzer() + abstract_analyzer.analyze(u'foo', dict()) diff --git a/python_apps/airtime_analyzer/tests/filemover_analyzer_tests.py b/python_apps/airtime_analyzer/tests/filemover_analyzer_tests.py new file mode 100644 index 0000000000..7591442c04 --- /dev/null +++ b/python_apps/airtime_analyzer/tests/filemover_analyzer_tests.py @@ -0,0 +1,112 @@ +from nose.tools import * +import os +import shutil +import multiprocessing +import Queue +import time +import mock +from pprint import pprint +from airtime_analyzer.filemover_analyzer import FileMoverAnalyzer + +DEFAULT_AUDIO_FILE = u'tests/test_data/44100Hz-16bit-mono.mp3' +DEFAULT_IMPORT_DEST = u'Test Artist/Test Album/44100Hz-16bit-mono.mp3' + +def setup(): + pass + +def teardown(): + pass + +@raises(Exception) +def test_dont_use_analyze(): + FileMoverAnalyzer.analyze(u'foo', dict()) + +@raises(TypeError) +def test_move_wrong_string_param1(): + FileMoverAnalyzer.move('', u'', u'', dict()) + +@raises(TypeError) +def test_move_wrong_string_param2(): + FileMoverAnalyzer.move(u'', '', u'', dict()) + +@raises(TypeError) +def test_move_wrong_string_param3(): + FileMoverAnalyzer.move(u'', u'', '', dict()) + +@raises(TypeError) +def test_move_wrong_dict_param(): + FileMoverAnalyzer.move(u'', u'', u'', 12345) + +def test_basic(): + filename = os.path.basename(DEFAULT_AUDIO_FILE) + FileMoverAnalyzer.move(DEFAULT_AUDIO_FILE, u'.', filename, dict()) + #Move the file back + shutil.move("./" + filename, DEFAULT_AUDIO_FILE) + assert os.path.exists(DEFAULT_AUDIO_FILE) + +def test_basic_samefile(): + filename = os.path.basename(DEFAULT_AUDIO_FILE) + FileMoverAnalyzer.move(DEFAULT_AUDIO_FILE, u'tests/test_data', filename, dict()) + assert os.path.exists(DEFAULT_AUDIO_FILE) + +def test_duplicate_file(): + filename = os.path.basename(DEFAULT_AUDIO_FILE) + #Import the file once + FileMoverAnalyzer.move(DEFAULT_AUDIO_FILE, u'.', filename, dict()) + #Copy it back to the original location + shutil.copy("./" + filename, DEFAULT_AUDIO_FILE) + #Import it again. It shouldn't overwrite the old file and instead create a new + metadata = dict() + metadata = FileMoverAnalyzer.move(DEFAULT_AUDIO_FILE, u'.', filename, metadata) + #Cleanup: move the file (eg. 44100Hz-16bit-mono.mp3) back + shutil.move("./" + filename, DEFAULT_AUDIO_FILE) + #Remove the renamed duplicate, eg. 44100Hz-16bit-mono_03-26-2014-11-58.mp3 + os.remove(metadata["full_path"]) + assert os.path.exists(DEFAULT_AUDIO_FILE) + +''' If you import three copies of the same file, the behaviour is: + - The filename is of the first file preserved. + - The filename of the second file has the timestamp attached to it. + - The filename of the third file has a UUID placed after the timestamp, but ONLY IF + it's imported within 1 second of the second file (ie. if the timestamp is the same). +''' +def test_double_duplicate_files(): + # Here we use mock to patch out the time.localtime() function so that it + # always returns the same value. This allows us to consistently simulate this test cases + # where the last two of the three files are imported at the same time as the timestamp. + with mock.patch('airtime_analyzer.filemover_analyzer.time') as mock_time: + mock_time.localtime.return_value = time.localtime()#date(2010, 10, 8) + mock_time.side_effect = lambda *args, **kw: time(*args, **kw) + + filename = os.path.basename(DEFAULT_AUDIO_FILE) + #Import the file once + FileMoverAnalyzer.move(DEFAULT_AUDIO_FILE, u'.', filename, dict()) + #Copy it back to the original location + shutil.copy("./" + filename, DEFAULT_AUDIO_FILE) + #Import it again. It shouldn't overwrite the old file and instead create a new + first_dup_metadata = dict() + first_dup_metadata = FileMoverAnalyzer.move(DEFAULT_AUDIO_FILE, u'.', filename, + first_dup_metadata) + #Copy it back again! + shutil.copy("./" + filename, DEFAULT_AUDIO_FILE) + #Reimport for the third time, which should have the same timestamp as the second one + #thanks to us mocking out time.localtime() + second_dup_metadata = dict() + second_dup_metadata = FileMoverAnalyzer.move(DEFAULT_AUDIO_FILE, u'.', filename, + second_dup_metadata) + #Cleanup: move the file (eg. 44100Hz-16bit-mono.mp3) back + shutil.move("./" + filename, DEFAULT_AUDIO_FILE) + #Remove the renamed duplicate, eg. 44100Hz-16bit-mono_03-26-2014-11-58.mp3 + os.remove(first_dup_metadata["full_path"]) + os.remove(second_dup_metadata["full_path"]) + assert os.path.exists(DEFAULT_AUDIO_FILE) + +@raises(OSError) +def test_bad_permissions_destination_dir(): + filename = os.path.basename(DEFAULT_AUDIO_FILE) + dest_dir = u'/var/foobar' + FileMoverAnalyzer.move(DEFAULT_AUDIO_FILE, dest_dir, filename, dict()) + #Move the file back + shutil.move(os.path.join(dest_dir, filename), DEFAULT_AUDIO_FILE) + assert os.path.exists(DEFAULT_AUDIO_FILE) + From 3adaf8e3706b7c1af92b83a946c4918e1b8cba6a Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 8 Apr 2014 10:32:27 -0400 Subject: [PATCH 075/310] CC-5781: Upgrade script for new storage quota implementation Upgrade script for local installs SAAS requires a different script --- .../airtime-2.5.3/StorageQuotaUpgrade.php | 30 ++----------------- .../airtime-2.5.3/airtime-upgrade.php | 6 ++++ 2 files changed, 9 insertions(+), 27 deletions(-) diff --git a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php index 8574d4bee0..b734cc8c45 100644 --- a/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/StorageQuotaUpgrade.php @@ -1,29 +1,5 @@ filterByDbType('stor') - ->filterByDbExists(true) + ->filterByType('stor') + ->filterByExists(true) ->findOne(); - $storPath = $musicDir->getDbDirectory(); + $storPath = $musicDir->getDirectory(); $freeSpace = disk_free_space($storPath); $totalSpace = disk_total_space($storPath); diff --git a/install_minimal/upgrades/airtime-2.5.3/airtime-upgrade.php b/install_minimal/upgrades/airtime-2.5.3/airtime-upgrade.php index 31792eb7aa..09ecd7ed20 100644 --- a/install_minimal/upgrades/airtime-2.5.3/airtime-upgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/airtime-upgrade.php @@ -1,5 +1,11 @@ Date: Tue, 8 Apr 2014 14:16:07 -0400 Subject: [PATCH 076/310] CC-5709: Airtime Analyzer * Fixed metadata import, whoops --- .../airtime_analyzer/airtime_analyzer/metadata_analyzer.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index c30c546e27..1e29830d6d 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -22,7 +22,6 @@ def analyze(filename, metadata): #Airtime <= 2.5.x nonsense: metadata["ftype"] = "audioclip" #Other fields we'll want to set for Airtime: - metadata["cueout"] = metadata["length"] metadata["hidden"] = False #Extract metadata from an audio file using mutagen @@ -42,6 +41,9 @@ def analyze(filename, metadata): track_length = datetime.timedelta(seconds=info.length) metadata["length"] = str(track_length) #time.strftime("%H:%M:%S.%f", track_length) metadata["bit_rate"] = info.bitrate + + # Other fields for Airtime + metadata["cueout"] = metadata["length"] #Use the python-magic module to get the MIME type. mime_magic = magic.Magic(mime=True) From e4af3a5a0e46a457dc162e056315725015acd09c Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 8 Apr 2014 17:28:50 -0400 Subject: [PATCH 077/310] CC-5709: Airtime Analyzer * Better SIGTERM handling for airtime_analyzer * Nuke the .identifier files saved by Airtime --- airtime_mvc/application/models/StoredFile.php | 6 ++-- .../airtime_analyzer/airtime_analyzer.py | 5 +-- .../airtime_analyzer/message_listener.py | 31 +++++++++++++++---- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 3199d1b1c9..b1ece8bd69 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -982,6 +982,7 @@ public static function copyFileToStor($tempFilePath, $originalFilename) } else { $uid = $user->getId(); } + /* $id_file = "$audio_stor.identifier"; if (file_put_contents($id_file, $uid) === false) { Logging::info("Could not write file to identify user: '$uid'"); @@ -991,7 +992,8 @@ public static function copyFileToStor($tempFilePath, $originalFilename) } else { Logging::info("Successfully written identification file for uploaded '$audio_stor'"); - } + }*/ + //if the uploaded file is not UTF-8 encoded, let's encode it. Assuming source //encoding is ISO-8859-1 $audio_stor = mb_detect_encoding($audio_stor, "UTF-8") == "UTF-8" ? $audio_stor : utf8_encode($audio_stor); @@ -1004,7 +1006,7 @@ public static function copyFileToStor($tempFilePath, $originalFilename) //the file wasn't uploaded and they should check if there . //is enough disk space . unlink($audio_file); //remove the file after failed rename - unlink($id_file); // Also remove the identifier file + //unlink($id_file); // Also remove the identifier file throw new Exception("The file was not uploaded, this error can occur if the computer " ."hard drive does not have enough disk space or the stor " diff --git a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py index a87fc2b3d1..8fe25d0c57 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py @@ -4,6 +4,7 @@ import logging import logging.handlers import sys +from functools import partial from metadata_analyzer import MetadataAnalyzer from replaygain_analyzer import ReplayGainAnalyzer from message_listener import MessageListener @@ -26,7 +27,7 @@ def __init__(self, config_path, debug=False): # Read our config file rabbitmq_config = self.read_config_file(config_path) - + # Start listening for RabbitMQ messages telling us about newly # uploaded files. self._msg_listener = MessageListener(rabbitmq_config) @@ -74,4 +75,4 @@ def read_config_file(self, config_path): exit(-1) return config - \ No newline at end of file + diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 0e33dbd3aa..b2a0085172 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -2,6 +2,8 @@ import pika import json import time +import select +import signal import logging import multiprocessing from analyzer_pipeline import AnalyzerPipeline @@ -59,6 +61,8 @@ def __init__(self, config): Keyword arguments: config: A ConfigParser object containing the [rabbitmq] configuration. ''' + + self._shutdown = False # Read the RabbitMQ connection settings from the config file # The exceptions throw here by default give good error messages. @@ -68,21 +72,31 @@ def __init__(self, config): self._username = config.get(RMQ_CONFIG_SECTION, 'user') self._password = config.get(RMQ_CONFIG_SECTION, 'password') self._vhost = config.get(RMQ_CONFIG_SECTION, 'vhost') + + # Set up a signal handler so we can shutdown gracefully + # For some reason, this signal handler must be set up here. I'd rather + # put it in AirtimeAnalyzerServer, but it doesn't work there (something to do + # with pika's SIGTERM handler interfering with it, I think...) + signal.signal(signal.SIGTERM, self.graceful_shutdown) - while True: + while not self._shutdown: try: self.connect_to_messaging_server() self.wait_for_messages() - except KeyboardInterrupt: - self.disconnect_from_messaging_server() - break + except (KeyboardInterrupt, SystemExit): + break # Break out of the while loop and exit the application + except select.error: + pass except pika.exceptions.AMQPError as e: + if self._shutdown: + break logging.error("Connection to message queue failed. ") logging.error(e) logging.info("Retrying in 5 seconds...") time.sleep(5) - self._connection.close() + self.disconnect_from_messaging_server() + logging.info("Exiting cleanly.") def connect_to_messaging_server(self): @@ -107,7 +121,12 @@ def wait_for_messages(self): def disconnect_from_messaging_server(self): '''Stop consuming RabbitMQ messages and disconnect''' self._channel.stop_consuming() - + self._connection.close() + + def graceful_shutdown(self, signum, frame): + '''Disconnect and break out of the message listening loop''' + self._shutdown = True + self.disconnect_from_message_listener() @staticmethod def msg_received_callback(channel, method_frame, header_frame, body): From 1e62908e66a5c026ee645f14c963c91e8555c97c Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 9 Apr 2014 11:28:41 -0400 Subject: [PATCH 078/310] CC-5709: Airtime Analyzer * Bounce files with file extensions we don't support in MediaController * Added translation stuff for Recent Uploads --- .../rest/controllers/MediaController.php | 12 +- .../views/scripts/plupload/index.phtml | 8 +- .../locale/cs_CZ/LC_MESSAGES/airtime.po | 5121 ++++++++-------- .../locale/de_AT/LC_MESSAGES/airtime.po | 5142 ++++++++--------- .../locale/de_DE/LC_MESSAGES/airtime.po | 5138 ++++++++-------- .../locale/el_GR/LC_MESSAGES/airtime.po | 5121 ++++++++-------- .../locale/en_CA/LC_MESSAGES/airtime.po | 5119 ++++++++-------- .../locale/en_GB/LC_MESSAGES/airtime.po | 5119 ++++++++-------- .../locale/en_US/LC_MESSAGES/airtime.po | 5119 ++++++++-------- .../locale/es_ES/LC_MESSAGES/airtime.po | 4651 ++++++++------- .../locale/fr_FR/LC_MESSAGES/airtime.po | 5121 ++++++++-------- .../locale/hr_HR/LC_MESSAGES/airtime.po | 3915 ++++++------- .../locale/hu_HU/LC_MESSAGES/airtime.po | 5121 ++++++++-------- .../locale/it_IT/LC_MESSAGES/airtime.po | 4647 ++++++++------- .../locale/ko_KR/LC_MESSAGES/airtime.po | 4662 ++++++++------- .../locale/nl_NL/LC_MESSAGES/airtime.po | 3915 ++++++------- .../locale/pl_PL/LC_MESSAGES/airtime.po | 4651 ++++++++------- .../locale/pt_BR/LC_MESSAGES/airtime.po | 4651 ++++++++------- .../locale/ru_RU/LC_MESSAGES/airtime.po | 5121 ++++++++-------- .../locale/sr_RS/LC_MESSAGES/airtime.po | 3915 ++++++------- .../locale/sr_RS@latin/LC_MESSAGES/airtime.po | 3915 ++++++------- airtime_mvc/locale/template/airtime.po | 3932 +++++++------ .../locale/zh_CN/LC_MESSAGES/airtime.po | 5121 ++++++++-------- 23 files changed, 48645 insertions(+), 50592 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 09a605ccde..ad8cada08b 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -335,7 +335,15 @@ private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) $tempFilePath = $_FILES['file']['tmp_name']; $tempFileName = basename($tempFilePath); - + + //Only accept files with a file extension that we support. + $fileExtension = pathinfo($originalFilename, PATHINFO_EXTENSION); + if (!in_array(strtolower($fileExtension), explode(",", "ogg,mp3,oga,flac,wav,m4a,mp4,opus"))) + { + @unlink($tempFilePath); + throw new Exception("Bad file extension."); + } + //TODO: Remove uploadFileAction from ApiController.php **IMPORTANT** - It's used by the recorder daemon... $storDir = Application_Model_MusicDir::getStorDir(); @@ -346,7 +354,9 @@ private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) //and accessible by airtime_analyzer which could be running on a different machine. $newTempFilePath = Application_Model_StoredFile::copyFileToStor($tempFilePath, $originalFilename); } catch (Exception $e) { + @unlink($tempFilePath); Logging::error($e->getMessage()); + return; } Logging::info($newTempFilePath); diff --git a/airtime_mvc/application/views/scripts/plupload/index.phtml b/airtime_mvc/application/views/scripts/plupload/index.phtml index 1c3f42e557..4eec764389 100644 --- a/airtime_mvc/application/views/scripts/plupload/index.phtml +++ b/airtime_mvc/application/views/scripts/plupload/index.phtml @@ -15,12 +15,12 @@
- - - + + +
-

Recent Uploads

+

diff --git a/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po b/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po index ddb2ba683e..142a1dd71e 100644 --- a/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po @@ -1,35 +1,23 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # Sourcefabric , 2013 msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-01-29 15:10+0000\n" "Last-Translator: andrey.podshivalov\n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/airtime/language/cs_CZ/)\n" +"Language: cs_CZ\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime Copyright © Sourcefabric o.p.s. VÅ¡echna práva vyhrazena.%sSpravován a distribuován pod licencí GNU GPL v.3 od %sSourcefabric o.p.s.%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "Live stream" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -50,9 +38,9 @@ msgid "Stop" msgstr "Zastavit" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Cue in" @@ -61,9 +49,9 @@ msgid "Set Cue In" msgstr "Nastavit Cue In" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Cue out" @@ -85,1720 +73,1448 @@ msgstr "Pozvolné zesilování " msgid "Fade Out" msgstr "Pozvolné zeslabování" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "Název" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime Copyright © Sourcefabric o.p.s. VÅ¡echna práva vyhrazena.%sSpravován a distribuován pod licencí GNU GPL v.3 od %sSourcefabric o.p.s.%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "Tvůrce" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "Live stream" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "Povoleno:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "Délka" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "Typ streamu:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Žánr" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Bit frekvence:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "Nálada" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "Typ služby:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "OznaÄení " +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "Kanály:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "Skladatel" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Mono" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Stereo" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "Autorská práva" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Server" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Rok " +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Zadán neplatný znak " -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "Stopa" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "Port" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "Dirigent" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "Jsou povolena pouze Äísla." -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "Jazyk" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "Heslo" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "ÄŒas zaÄátku" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Žánr" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "ÄŒas konce" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "URL" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "PÅ™ehráno" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "Jméno" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "Soubor s nahrávkou neexistuje" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "Popis" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "Zobrazit nahraný soubor metadat" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Přípojný bod" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "Zobrazit na SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Uživatelské jméno" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Nahrát do SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "Administrátorské jméno" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "Znovu nahrát do SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "Administrátorské heslo" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Zobrazit obsah" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Získávání informací ze serveru..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "PÅ™idat / Odebrat obsah" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "Server nemůže být prázdný." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "Odstranit celý obsah" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "Port nemůže být prázdný." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "ZruÅ¡it aktuální vysílání" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "Mount nemůže být prázdný s Icecast serverem." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "Upravit " +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "Název:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "Upravit" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "Tvůrce:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "Upravit vysílání" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Album:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "Smazat" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Skladba:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "Odstranit tuto instanci" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Žánr:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "Odstranit tuto instanci a vÅ¡echny následující" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Rok:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "Přístup odepÅ™en" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "OznaÄení:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "Nelze pÅ™etáhnout opakujícící se vysílání" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "Skladatel:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "Nelze pÅ™esunout vysílání z minulosti" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "Dirigent:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "Nelze pÅ™esunout vysílání do minulosti" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "Nálada:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "Nelze nastavit pÅ™ekrývající se vysílání." +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "Nelze pÅ™esunout nahrané vysílání ménÄ› než 1 hodinu pÅ™ed tím, než bude znovu vysíláno." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "Autorská práva:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "Vysílání bylo vymazáno, protože nahrané vysílání neexistuje!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "ISRC Äíslo:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "Musíte poÄkat 1 hodinu pÅ™ed dalším vysíláním." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "Internetová stránka:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "Nastavení" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "Jazyk:" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Uložit" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "Správa složek médií" - -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "Nastavení Streamu" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "ZruÅ¡it" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Globální nastavení" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Uživatelské jméno:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "dB" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "Heslo:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "Nastavení výstupního streamu" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "Ověřit heslo:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Vyberte soubor" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "Jméno:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "Nastavit" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "Příjmení:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "AktuálnÄ› importovaný soubor:" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "E-mail:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "PÅ™idat" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Mobilní telefon:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "Znovu skenovat sledovaný adresář (Tato funkce je užiteÄná pokud se síť rozrůstá a nemusí být vÄas synchronizována s Airitme)" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "Odebrat sledovaný adresář" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "Nesledujete žádné mediální soubory." +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "Typ uživatele:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "Registrovat Airtime" +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "Host" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Pomozte vylepÅ¡it Airtime tím, že nám dáte vÄ›dÄ›t, jak ho používáte. Tyto informace se budou shromažÄovat pravidelnÄ› tak aby se zvýšil Váš uživatelský zážitek.%sKliknÄ›te na 'Ano, pomoci Airtime', a my vás ujiÅ¡Å¥ujeme, že funkce, které používáte, budou neustále zlepÅ¡ovány." +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "DJ" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "KliknÄ›te na políÄko níže pro inzerci váší stanice na %sSourcefabric.org%s. Pro podpoÅ™ení vaší stanice musí být povolena funkce 'Zaslat váš názor'. Tyto údaje budou navíc shromažÄovány na podporu zpÄ›tné vazby." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "Program manager" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(Požadováno)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(pouze pro ověřovací úÄely, nebude zveÅ™ejnÄ›no)" +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "Administrátor" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Poznámka: Cokoli vÄ›tšího než 600x600 bude zmenÅ¡eno." +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "PÅ™ihlaÅ¡ovací jméno není jedineÄné." -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Zobrazit co posílám " +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "Barva pozadí:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "Pravidla a podmínky" +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "Barva textu:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "Najít vysílání" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "Datum zahájení:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "Filtrovat dle vysílání:" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "Datum ukonÄení:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "Obnovit heslo" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Vysílání:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Možnosti Smart Blocku" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "VÅ¡echna má vysílání:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "nebo" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "dny" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "a" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "Den musí být zadán" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr " do " +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "ÄŒas musí být zadán" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "soubory splňují kritéria" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "Musíte poÄkat alespoň 1 hodinu pÅ™ed dalším vysíláním" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "soubor splňuje kritéria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "Importovaná složka:" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "PÅ™ipojovací URL: " +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "Sledované složky:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Pomozte Airtime vylepÅ¡it tím, že dáte Sourcefabric vÄ›dÄ›t, jak jej používáte. Tyto informace budeme pravidelnÄ› shromažÄovat, abychom zlepÅ¡ili váše uživatelské zkuÅ¡enosti.%sKliknÄ›te na odkaz 'Zaslat Váš názor' a my zajistíme, že se budou funkce, které používáte, neustále zlepÅ¡ovat." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "Neplatný adresář" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "KliknÄ›te na políÄko níže pro podporu své stanice na %s Sourcefabric.org %s ." +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "Hledat uživatele:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(Za úÄelem podpory vaší stanice musí být povolena funkce 'Zaslat Váš názor')." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "DJs:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Zásady ochrany osobních údajů Sourcefabric " +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "PÅ™ihlásit" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "Nastavení vstupního streamu" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "OpiÅ¡te znaky, které vidíte na obrázku níže." -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "URL pÅ™ipojení Master zdoje:" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Název stanice" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "PÅ™epsat" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "Defoltní nastavení doby plynulého pÅ™echodu" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "zadejte Äas v sekundách 0{.0}" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "Obnovit" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "PÅ™ednastavení Fade In:" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "URL pÅ™ipojení Show Source:" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "PÅ™ednastavení Fade Out:" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Vyberte dny:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "Povolit vzdáleným webovým stránkám přístup k \"rozpisu\" Info? %s (Povolit tuto funkci, aby front-end widgety fungovaly.)" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "Odstranit" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "Vypnuto" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Opakovat dny:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "Povoleno" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "Nastavení Email / Mail Serveru" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "Výchozí jazyk rozhraní" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "Nastavení SoundCloud " +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" +msgstr "ÄŒasové pásmo stanice" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "%s Nastavení" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "Týden zaÄíná" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" -msgstr "Vybrat instanci show" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "NedÄ›le" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "Žádné vysílání" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "PondÄ›lí" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "Najdi" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "Úterý" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "Stream " +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "StÅ™eda" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "DodateÄné možnosti" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "ÄŒtvrtek" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "Následující informace se zobrazí u posluchaÄů na jejich pÅ™ehrávaÄích:" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(Webová stránka vaší rádiové stanice)" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "Pátek" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "URL streamu: " +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Sobota" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "Filtrovat historii" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "Link:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Vítejte v Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "Typ opakování:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Zde je návod, jak můžete zaÄít používat Airtime pro automatizaci svého vysílání: " +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "týdnÄ›" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "ZaÄnÄ›te tím, že pÅ™idáte soubory do knihovny pomocí 'PÅ™idat média' tlaÄítka v menu. Můžete jednoduÅ¡e pÅ™etáhnout soubory do tohoto okna." +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "každé 2 týdny" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "VytvoÅ™te vysílání tím, že v menu půjdete do 'Kalendáře' a kliknete na ikonu '+ Show'. Může se jednat buÄ o jednorázové nebo opakující se vysílání. PÅ™idávat vysílání mohou pouze administrátoÅ™i a manažeÅ™i programu." +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "každé 3 týdny" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "Média pÅ™idáte do vysílání tak, že půjdete do svého vysílání v Plánovacím kalendáři a kliknutím na levé tlaÄítko myÅ¡i se vám otevÅ™ou možnosti z kterých si vyberte 'PÅ™idat / odstranit obsah'" +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "každé 4 týdny" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Vyberte si média z levého okna a pÅ™etáhnÄ›te je do svého vysílání v pravém oknÄ›." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "mÄ›síÄnÄ›" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "Pak můžete zaÄít!" +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Vyberte dny:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "Pro podrobnÄ›jší nápovÄ›du si pÅ™eÄtÄ›te %suživatelský manuál%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "Ne" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "O aplikaci" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "Po" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%s Airtime %s %s ,, open radio software pro plánování a řízení vzdálené stanice. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "Út" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%s Sourcefabric %s o.p.s. Airtime je distribuován podle %s GNU GPL v.3 %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "St" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "Sdílet" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "ÄŒt" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Vyberte stream:" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "Pá" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "vypnout zvuk" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "So" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "zapnout zvuk" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "Opakovat:" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "PÅ™ihlásit" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "den v mÄ›síci" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Vítejte v on-line demo verzi Airtime! Můžete se pÅ™ihlásit pomocí uživatelského jména 'admin' a hesla 'admin'." +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "den v týdnu" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "Prosím zadejte e-mailovou adresu ke svému úÄtu. Obdržíte e-mailem odkaz na vytvoÅ™ení nového hesla." +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "NekonÄí?" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "Odeslat e-mail" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "Datum ukonÄení musí být po poÄáteÄním datumu" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "E-mail byl odeslán" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "Prosím vyberte den opakování" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "ZpÄ›t na pÅ™ihlaÅ¡ovací stránku" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "PotvrÄte nové heslo" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "Nové heslo" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "Potvrzené heslo neodpovídá vaÅ¡emu heslu." -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "Prosím zadejte a potvrÄte své nové heslo v políÄkách níže." +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Získat nové heslo" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "Váše zkuÅ¡ební období vyprší " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "Vyberte kritéria" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "dny" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Album" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Kupte si svůj Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Kvalita (Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "Můj úÄet" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "PÅ™edchozí:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "Skladatel" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "Další:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "Dirigent" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "Zdrojové Streamy" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "Autorská práva" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "Hlavní zdroj" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "Tvůrce" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "Zobrazit zdroj" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Zakódováno" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "Naplánované vysílání" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "ON AIR" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "OznaÄení " -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "Poslech" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "Jazyk" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "ÄŒas stanice" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "Naposledy zmÄ›nÄ›no" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Zavřít" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "Naposledy vysíláno" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "PÅ™idat toto vysílání" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "Délka" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "Aktualizace vysílání" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Mime" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "Co" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "Nálada" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "Kdy" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "Vlastník" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "Vložení Live Streamu" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "Opakovat Gain" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "Nahrát a znovu vysílat" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "Vzorkovací frekvence (kHz)" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Kdo" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "Název" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Styl" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "Číslo stopy" -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "ZaÄátek" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "Nahráno" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "Servis" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "Internetové stránky" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "Stav" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Rok " -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "Doba provozuschopnosti" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "Vyberte modifikátor" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "CPU" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "obsahuje" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "Paměť" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "neobsahuje" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Airtime verze" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "je" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "Velikost disku" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "není" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "Probíhá importování souboru ..." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "zaÄíná s" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "Rozšířené možnosti hledání" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "konÄí s" -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "PoÄítaní posluchaÄů v Äase" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "je vÄ›tší než" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "Nový" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "je menší než" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "Nový Playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "se pohybuje v rozmezí" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "Nový Smart blok" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "hodiny" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "Nový webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "minuty" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "Zobrazit / upravit popis" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "položka" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "Popis" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "Nastavit chytrý typ bloku:" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "URL streamu:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "Statický" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "Defaultní délka:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "Dynamický" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "Žádný webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "Povolit Opakujte skladby:" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "Prázdný playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "Omezit na" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "Vymazat" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "Generovat obsah playlistu a uložit kritéria" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Promíchat Playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "Generovat" + +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "Promíchat obsah playlistu" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 #: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 msgid "Shuffle" msgstr "Promíchat" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Uložit playlist" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "Playlist crossfade" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "Zesílit: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Zeslabit: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "NeotevÅ™ený playlist" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "UKázat Waveform" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "Prázný obsah smart block." - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "Smart block není otevÅ™ený" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "Cue in: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(hh:mm:ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Cue out: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "Původní délka:" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "Rozšířit statický blok" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "Rozšířit dynamický blok" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "prázdný Smart blok" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "Prázdný playlist" - -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Defaultní aplikace Zend Frameworku " - -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "Stránka nebyla nalezena!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "Stránka, kterou hledáte, neexistuje!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "NápovÄ›da" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "pÅ™edchozí" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "pÅ™ehrát" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "pauza" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "další" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "stop" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "max. hlasitost" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "Nutná aktualizace" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "Chcete-li pÅ™ehrávat média, budete si muset buÄ nastavit svůj prohlížeÄ na nejnovÄ›jší verzi nebo aktualizovat svůj%sFlash plugin%s." - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "VytvoÅ™it soubor pÅ™ehledu nastavení" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "VytvoÅ™it vzor pÅ™ehledu logů" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "Jméno" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "PÅ™idat elementy" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "PÅ™idat nové pole" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "Nastavit defolní Å¡ablnu" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "Vzory pÅ™ehledu logů" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "Vzory pÅ™ehledu logů nejsou" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "Nastavit jako default" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "Nový vzor pÅ™ehledu logů" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "Limit nemůže být prázdný nebo menší než 0" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "Vzory pÅ™ehledu souboru" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "Limit nemůže být vÄ›tší než 24 hodin" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "Nový vzor pÅ™ehledu souboru" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "Hodnota by mÄ›la být celé Äíslo" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "Nový vzor pÅ™ehledu souboru" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "500 je max hodnota položky, kterou lze nastavit" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "Správa uživatelů" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "Musíte vybrat kritéria a modifikátor" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "Nový uživatel" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "'Délka' by mÄ›la být ve formátu '00:00:00'" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "id" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "Hodnota by mÄ›la být v Äasový formát (napÅ™. 0000-00-00 nebo 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Uživatelské jméno" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "Hodnota musí být Äíslo" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "Jméno" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "Hodnota by mÄ›la být menší než 2147483648" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "Příjmení" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "Hodnota by mÄ›la mít ménÄ› znaků než %s" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "Typ uživatele" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "Hodnota nemůže být prázdná" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "Název:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "Automatické pÅ™epínání vypnuto" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "Tvůrce:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "Automatické pÅ™epínání zapnuto" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Album:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "Prolnutí pÅ™i pÅ™epnutí (s)" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Skladba:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "Zadejte Äas v sekundách 00{0.000000}" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "Délka:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "Master uživatelské jméno" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "Vzorová frekvence:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "Master uživatelské jméno" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Bit frekvence:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "Master zdrojové URL pÅ™ipojení " -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "Nálada:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "Zobrazit zdrojové URL pÅ™ipojení" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Žánr:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "Hlavní zdrojový port" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Rok:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "Hlavní zdrojový přípojný bod" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "OznaÄení:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Zobrazit zdrojový port" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "Zobrazit zdrojový přípojný bod" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "Skladatel:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "Nemůžete použít stejný port jako Master DJ port." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "Dirigent:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "Port %s není k dispozici" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "Autorská práva:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Telefon:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "ISRC Äíslo" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "Webová stránka stanice:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "Internetová stránka:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "Stát:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "Jazyk:" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "MÄ›sto:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "Cesta souboru:" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "Popis stanice:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "Název:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Logo stanice:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "Popis:" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "Odeslat zpÄ›tnou vazbu" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Web Stream" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "Propagovat mou stanici na Sourcefabric.org" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "Dynamický Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "ZaÅ¡krtnutím tohoto políÄka potvrzuji, že souhlasím s podmínkami Sourcefabric %sv oblasti ochrany osobních údajů%s ." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "Statický Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "Musíte souhlasit se zásadami ochrany osobních údajů." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Audio stopa" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "Hodnota je požadována a nemůže zůstat prázdná" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "Obsah Playlistu: " +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "ÄŒas zaÄátku" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "Obsah statistického Smart Blocku: " +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "ÄŒas konce" + +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "Žádné vysílání" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "Kritéria dynamickeho Smart Blocku: " +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "Nahráno z Line In?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "Omezit na " +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "Vysílat znovu?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "URL" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Použít Airtime ověření:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "PÅ™ehled logu" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "Použít ověření uživatele:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "Shrnutí souboru" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "Uživatelské jméno" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "Shrnutí show" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "Uživatelské heslo" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "Vysílání může mít max. délku 24 hodin." +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "Uživatelské jméno musí být zadáno." -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "Datum/Äas ukonÄení nemůže být v minulosti" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "Heslo musí být zadáno." -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "Nelze naplánovat pÅ™ekrývající se vysílání.\nPoznámka:. ZmÄ›na velikosti opakujícího se vysílání ovlivňuje vÅ¡echny opakování tohoto vysílání." +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "E-mail" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "Nelze zmÄ›nit velikost již odvysílaného poÅ™adu." +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "Obnovení hesla" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "Jednotlivá vysílání by se nemÄ›la pÅ™ekrývat" +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "Hardware Audio výstup" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Vyberte zemi" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "Typ výstupu" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s je již sledován." +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Metadata Icecast Vorbis" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s obsahuje vložený sledovaný adresář: %s" +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "OznaÄení streamu:" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s je vložený do stávajícího sledovaného adresáře: %s" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "UmÄ›lec - Název" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s není platný adresář." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Vysílání - UmÄ›lec - Název" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s je již nastaveno jako aktuální uložiÅ¡tÄ› adresáře nebo ve sledovaném seznamu souborů." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Název stanice - Název vysílání" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s je již nastaven jako aktuální adresář úložiÅ¡tÄ› nebo v seznamu sledovaných složek." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "Off Air metadata" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s neexistuje v seznamu sledovaných." +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "Povolit Replay Gain" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "položka" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "Replay Gain Modifikátor" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "Cue in a cue out jsou prázné." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%hodnota%' není platná e-mailová adresa v základním formátu local-part@hostname" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "Nelze nastavit delší cue out než je délka souboru." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%hodnota%' neodpovídá formátu datumu '%formátu%'" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "Nelze nastavit vÄ›tší cue in než cue out." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%hodnota%' je kratší než požadovaných %min% znaků" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "Nelze nastavit menší cue out než je cue in." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%hodnota%' je více než %max% znaků dlouhá" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "Vyberte kritéria" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%hodnota%' není mezi '%min%' a '%max%', vÄetnÄ›" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Kvalita (Kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "Hesla se neshodují" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%hodnota%' nesedí formát Äasu 'HH:mm'" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Zakódováno" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "ZaÄátek datum/Äas:" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "Naposledy zmÄ›nÄ›no" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "Konec datum/Äas:" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "Naposledy vysíláno" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "Doba trvání:" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Mime" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "ÄŒasová zó" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "Vlastník" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "Opakovat?" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "Opakovat Gain" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "Nelze vytvoÅ™it vysílání v minulosti" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "Vzorkovací frekvence (kHz)" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "Nelze mÄ›nit datum/Äas vysílání, které bylo již spuÅ¡tÄ›no" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "Číslo stopy" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "Datum/Äas ukonÄení nemůže být v minulosti" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "Nahráno" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "Nelze mít dobu trvání < 0m" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "Internetové stránky" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "Nelze nastavit dobu trvání 00h 00m" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "Vyberte modifikátor" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "Nelze mít dobu trvání delší než 24 hodin" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "obsahuje" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "Nelze nastavit pÅ™ekrývající se vysílání." -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "neobsahuje" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "Název:" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "je" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "PoÅ™ad bez názvu" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "není" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "URL" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "zaÄíná s" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "Popis:" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "konÄí s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "Automaticky nahrát nahrané vysílání" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "je vÄ›tší než" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "Povolit SoundCloud nahrávání" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "je menší než" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "Automaticky oznaÄit soubory \"Ke stažení\" na SoundCloud" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "se pohybuje v rozmezí" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "SoundCloud Email" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "Délka musí být vÄ›tší než 0 minut" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "SoundCloud heslo" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "Délka by mÄ›la mít tvar \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "SoundCloud Tagy: (oddÄ›lit tagy mezerami)" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "URL by mÄ›la mít tvar \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "Výchozí žánr:" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "URL by mÄ›la mít 512 znaků nebo ménÄ›" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "Výchozí typ skladby:" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "Nenalezen žádný MIME typ pro webstream." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "Původní" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "Název webstreamu nemůže být prázdný" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "Remix" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "Nelze zpracovat XSPF playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "Live" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "Nelze zpracovat PLS playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "Záznam" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "Nelze zpracovat M3U playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "Mluvený" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "Neplatný webstream - tento vypadá jako stažení souboru." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "Podcast" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "Neznámý typ streamu: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Demo" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Ahoj %s , \n\nKliknÄ›te na tento odkaz pro obnovení vaÅ¡eho hesla: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "Práce v procesu" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Airtime obnovení hesla" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "Stem" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "Znovu odvysílat %s od %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "SmyÄka" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "Nemůže pÅ™esunout položky z linkovaných vysílání" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Zvukový efekt" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "Program, který si prohlížíte, je zastaralý!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "One Shot ukázka" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "Program který si prohlížíte je zastaralý!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Další" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "Program který si prohlížíte je zastaralý! " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "Výchozí licence:" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "Nemáte povoleno plánovat vysílání %s ." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "Práce je ve veÅ™ejné doménÄ›" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "Nemůžete pÅ™idávat soubory do nahrávaného vysílání." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "VÅ¡echna práva jsou vyhrazena" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "Vysílání %s skonÄilo a nemůže být nasazeno." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "Creative Commons oznaÄení" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "Vysílání %s bylo již dříve aktualizováno!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "Creative Commons nekomerÄní" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "Obsah v propojených show musí být zaÅ™azen pÅ™ed nebo po kterémkoliv, který je vysílaný " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "Creative Commons Nezasahujte do díla" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "Vybraný soubor neexistuje!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "Creative Commons Zachovejte licenci" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "NepodaÅ™ilo se vytvoÅ™it adresář 'organize'." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "Creative Commons nekomerÄní Nezasahujte do díla" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "Soubor nebyl nahrán. Máte k dispozici %s MB volného místa na disku a soubor který jste chtÄ›li nahrát má velikost %s MB." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "Creative Commons nekomerÄní Zachovejte licenci" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "Tento soubor se zdá být poÅ¡kozený a nebude pÅ™idán do knihovny médií." +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "ÄŒasové pásmo uživatelského rozhraní" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "Soubor nebyl nahrán. K této chybÄ› může dojít, pokud na pevném disku poÄítaÄe není dostatek místa nebo adresář nemá správná oprávnÄ›ní pro zápis." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "Povolit systému odesílat e-maily (Obnovení hesla)" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "Nemáte oprávnÄ›ní k odpojení zdroje." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "Odesílatel E-mailu Obnovení hesla" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "Neexistuje zdroj pÅ™ipojený k tomuto vstupu." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "Konfigurace poÅ¡tovního serveru" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "Nemáte oprávnÄ›ní ke zmÄ›nÄ› zdroje." +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "Vyžaduje ověření" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" -msgstr "Znovu spustit vysílaní %s od %s na %s" +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "PoÅ¡tovní server" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" -msgstr "Stáhnout" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "E-mailová adresa" #: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "Zkontrolujte prosím zda je správné administrátorské jméno/heslo v Systému->Streamovací stránka." -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "Nemáte udÄ›len přístup k tomuto zdroji." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Webstream bez názvu" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "Nemáte udÄ›len přístup k tomuto zdroji. " +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Webstream uložen." -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "Soubor v Airtime neexistuje." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "Neplatná forma hodnot." -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "Soubor v Airtime neexistuje." +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "Prosím, zadejte své uživatelské jméno a heslo" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "Soubor v Airtime neexistuje." +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "Zadali jste chybnÄ› uživatelské jméno nebo heslo. Prosím, zkuste zadat znovu." -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "Å patný požadavek. Žádný 'mode' parametr neproÅ¡el." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "E-mail se nepodaÅ™ilo odeslat. Zkontrolujte nastavení poÅ¡tovního serveru a ujistÄ›te se, že byl správnÄ› nakonfigurován." -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "Å patný požadavek. 'Mode' parametr je neplatný." +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "Zadaný e-mail nebyl nalezen." -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format -msgid "%s not found" -msgstr "%s nenalezen" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "NÄ›co je Å¡patnÄ›." - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "Náhled" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "PÅ™idat do Playlistu" - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "PÅ™idat do chytrého bloku" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "Upravit metadata" +msgid "Rebroadcast of show %s from %s at %s" +msgstr "Znovu spustit vysílaní %s od %s na %s" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "Duplikátní Playlist" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" +msgstr "Stáhnout" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "Uživatel byl úspěšnÄ› pÅ™idán!" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "Žádná akce není k dispozici" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "Uživatel byl úspěšnÄ› aktualizován!" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "Nemáte oprávnÄ›ní odstranit vybrané položky." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "Nastavení úspěšnÄ› aktualizováno!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "Nelze odstranit nÄ›které naplánované soubory." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "Stránka nebyla nalezena" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "Kopie %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Chyba aplikace" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1874,6 +1590,11 @@ msgstr "Můžete pÅ™idat pouze skladby, chytré bloky a webstreamy do playlistů msgid "Please select a cursor position on timeline." msgstr "Prosím vyberte si pozici kurzoru na Äasové ose." +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "Upravit metadata" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "PÅ™idat k vybranému vysílání" @@ -1920,6 +1641,7 @@ msgstr "Nahrávání ..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "VÅ¡e" @@ -1990,9 +1712,7 @@ msgstr "Vstup musí být ve formátu: hh:mm:ss.t" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "PrávÄ› nahráváte soubory. %sPÅ™echodem na jinou obrazovku zrušíte nahrávací proces. %sOpravdu chcete opustit tuto stránku?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2028,10 +1748,7 @@ msgid "Playlist shuffled" msgstr "Playlist zamíchán" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "Airtime si není jistý statusem souboru. To se může stát, když je soubor na vzdálené jednotce, která je nepřístupná nebo když je soubor v adresáři, který již není 'sledovaný'." #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2057,24 +1774,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "Obrázek musí být buÄ jpg, jpeg, png nebo gif" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "Statický chytrý blok uloží kritéria a vygeneruje obsah bloku okamžitÄ›. To vám umožní upravit a zobrazit je v knihovnÄ› pÅ™ed pÅ™idáním do vysílání." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "Dynamický chytrý blok bude ukládat pouze kritéria. Obsah bloku bude generován bÄ›hem pÅ™idání do vysílání. Nebudete moci prohlížet a upravovat obsah v knihovnÄ›." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "Požadované délky bloku nebude dosaženo pokud Airtime nenalezne dostatek unikátních skladeb, které odpovídají vaÅ¡im kritériím. Povolte tuto možnost, pokud chcete, aby byly skladby pÅ™idány do chytrého bloku vícekrát." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2105,7 +1813,14 @@ msgstr "Vyberte složku ke sledování" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "Jste si jisti, že chcete zmÄ›nit složku úložiÅ¡tÄ› ?\nTímto odstraníte soubry z vaší Airtime knihovny!" +msgstr "" +"Jste si jisti, že chcete zmÄ›nit složku úložiÅ¡tÄ› ?\n" +"Tímto odstraníte soubry z vaší Airtime knihovny!" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "Správa složek médií" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2117,9 +1832,7 @@ msgstr "Tato cesta není v souÄasné dobÄ› dostupná." #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "NÄ›které typy streamů vyžadují zvláštní konfiguraci. Detaily o přístupu %sAAC+ Support%s nebo %sOpus Support%s jsou poskytovány." #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2130,22 +1843,12 @@ msgstr "PÅ™ipojeno k streamovacímu serveru" msgid "The stream is disabled" msgstr "Stream je vypnut" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Získávání informací ze serveru..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "Nelze se pÅ™ipojit k streamovacímu serveru" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "Pokud je Airtime za routerem nebo firewall, budete možná muset nastavit pÅ™esmÄ›rování portu a tato informace pole budou nesprávná. V tomto případÄ› budete muset ruÄnÄ› aktualizovat pole tak, aby ukazovalo správnÄ› host/port/mount, do kterých se Váš DJ potÅ™ebuje pÅ™ipojit. Povolené rozpÄ›tí je mezi 1024 a 49151." #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2154,61 +1857,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "Pro více informací si prosím pÅ™eÄtÄ›te %s Airtime manuál %s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "ZaÅ¡krtnÄ›te tuto volbu pro zapnutí metadat OGG streamů (metadata streamu jsou název sklady, umÄ›lec a název vysílání, které se zobrazí v audio pÅ™ehrávaÄi). VLC a mpÅ™ehrávaÄ mají vážné chyby pÅ™i pÅ™ehrávání OGG/VORBIS streamu, který má povolené metadata informace: budou odpojena od streamu po každé písni. Pokud používáte stream OGG a vaÅ¡i posluchaÄi nevyžadují podporu tÄ›chto audio pÅ™ehrávaÄů, pak neváhejte a tuto možnost povolte." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "ZaÅ¡krtnÄ›te toto políÄko pro automatické vypnutí zdroje Master/Vysílání na odpojení zdroje." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "ZaÅ¡krtnÄ›te toto políÄko pro automatické zapnutí Master/Vysílání zdroj na pÅ™ipojení zdroje." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "Pokud váš Icecast server oÄekává uživatelské jméno 'zdroj', může toto pole zůstat prázdné." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "Pokud váš live streaming klient nepožádá o uživatelské jméno, toto pople bz mÄ›lo být 'zdroj'." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "Pokud zmÄ›níte jméno uživatele nebo heslo hodnoty povoleného streamu playout motor bude restartován a vaÅ¡i posluchaÄi uslyší ticho po dobu 5-10 sekund. ZmÄ›na následující pole nezpůsobí restartovaní: Stream Label (Globální nastavení) a Switch Transition Fade(s), Master Username, and Master Password (Nastavení vstupního streamu). Pokud Airtime poÅ™izuje záznam, a pokud zmÄ›na způsobí restart playoutu, nahrávaní bude pÅ™eruÅ¡eno." #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "Toto je administrátorské jméno a heslo pro Icecast / SHOUTcast k získání statistik poslechovosti." #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2216,9 +1894,7 @@ msgid "No result found" msgstr "Žádný výsledek nenalezen" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "Toto následuje stejný bezpeÄnostní vzor pro výsílání: pouze uživatelé pÅ™iÅ™azení k vysílání se mohou pÅ™ipojit." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2234,16 +1910,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "Varování: Vysílání nemohou být znovu linkována." #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "Propojením vaÅ¡ich opakujících se show, jakákoliv média zaÅ™azena v jakékoliv opakující se show bude také zaÅ™azena do dalších opakujících se show." #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "ÄŒasové pásmo je nastaveno v Äasovém pásmu stanice defoltnÄ›. Show v kalendáři bude zobrazena v lokálním Äase nastaveném Äasovým pásmem vaÅ¡eho uživatelského rozhraní ve vaÅ¡em uživatelském nastavení. " #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2391,87 +2062,16 @@ msgstr "dnes" msgid "day" msgstr "den" -#: airtime_mvc/application/controllers/LocaleController.php:238 -msgid "week" -msgstr "týden" - -#: airtime_mvc/application/controllers/LocaleController.php:239 -msgid "month" -msgstr "mÄ›síc" - -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "NedÄ›le" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "PondÄ›lí" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "Úterý" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "StÅ™eda" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "ÄŒtvrtek" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "Pátek" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Sobota" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "Ne" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "Po" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "Út" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "St" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "ÄŒt" - -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "Pá" - -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "So" +#: airtime_mvc/application/controllers/LocaleController.php:238 +msgid "week" +msgstr "týden" + +#: airtime_mvc/application/controllers/LocaleController.php:239 +msgid "month" +msgstr "mÄ›síc" #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Vysílání delší než naplánovaný Äas bude ukonÄeno zaÄátkem dalšího vysílání." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2499,6 +2099,11 @@ msgstr "Odstranit veÅ¡kerý obsah?" msgid "Delete selected item(s)?" msgstr "Odstranit vybranou položku(y)?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "ZaÄátek" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "Konec" @@ -2532,14 +2137,6 @@ msgstr "Posunutí 1 položky" msgid "Moving %s Items" msgstr "Posunutí %s položek" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "ZruÅ¡it" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "Fade Editor" @@ -2549,8 +2146,7 @@ msgid "Cue Editor" msgstr "Cue Editor" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "Prvky Waveform jsou k dispozici v prohlížeÄi podporující Web Audio API" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2577,1333 +2173,1627 @@ msgstr "PÅ™ejít na aktuálnÄ› pÅ™ehrávanou skladbu" msgid "Cancel current show" msgstr "ZruÅ¡it aktuální vysílání" -#: airtime_mvc/application/controllers/LocaleController.php:302 -msgid "Open library to add or remove content" -msgstr "Otevřít knihovnu pro pÅ™idání nebo odebrání obsahu" +#: airtime_mvc/application/controllers/LocaleController.php:302 +msgid "Open library to add or remove content" +msgstr "Otevřít knihovnu pro pÅ™idání nebo odebrání obsahu" + +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "PÅ™idat / Odebrat obsah" + +#: airtime_mvc/application/controllers/LocaleController.php:305 +msgid "in use" +msgstr "používá se" + +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "Disk" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "Podívat se" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "Otevřít" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "Hosté mohou dÄ›lat následující:" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "Zobrazit plán" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "Zobrazit obsah vysílání" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "DJ může dÄ›lat následující:" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "Spravovat pÅ™idÄ›lený obsah vysílání" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "Import media souborů" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "VytvoÅ™it playlisty, smart bloky a webstreamy" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "Spravovat obsah vlastní knihovny" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "Progam ManažeÅ™i může dÄ›lat následující:" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "Zobrazit a spravovat obsah vysílání" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "Plán ukazuje" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "Spravovat celý obsah knihovny" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "Správci mohou provést následující:" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "Správa pÅ™edvoleb" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "Správa uživatelů" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "Správa sledovaných složek" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "Zobrazit stav systému" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "Přístup playout historii" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "Zobrazit posluchaÄe statistiky" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "Zobrazit / skrýt sloupce" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "Z {z} do {do}" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "kbps" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "rrrr-mm-dd" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" +msgstr "hh:mm:ss.t" + +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" +msgstr "kHz" + +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" +msgstr "Ne" + +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" +msgstr "Po" + +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" +msgstr "Út" + +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" +msgstr "St" + +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" +msgstr "ÄŒt" + +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" +msgstr "Pá" + +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" +msgstr "So" + +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Zavřít" + +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" +msgstr "Hodina" + +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" +msgstr "Minuta" + +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" +msgstr "Hotovo" + +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" +msgstr "Vyberte soubory" + +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." +msgstr "PÅ™idejte soubory do fronty pro nahrávání a kliknÄ›te na tlaÄítko start." + +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "Stav" + +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" +msgstr "PÅ™idat soubory." + +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" +msgstr "Zastavit Nahrávání" + +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" +msgstr "ZaÄít nahrávat" + +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" +msgstr "PÅ™idat soubory" + +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" +msgstr "Nahráno %d / %d souborů" + +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" +msgstr "Nedostupné" + +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." +msgstr "Soubory pÅ™etáhnÄ›te zde." + +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." +msgstr "Chybná přípona souboru" + +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." +msgstr "Chybná velikost souboru." + +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." +msgstr "Chybný souÄet souborů." + +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." +msgstr "Chyba Init." -#: airtime_mvc/application/controllers/LocaleController.php:305 -msgid "in use" -msgstr "používá se" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." +msgstr "Chyba HTTP." -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" -msgstr "Disk" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." +msgstr "Chyba zabezpeÄení." -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" -msgstr "Podívat se" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." +msgstr "Obecná chyba. " -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" -msgstr "Otevřít" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." +msgstr "CHyba IO." -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "Administrátor" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" +msgstr "Soubor: %s" -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "DJ" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" +msgstr "%d souborů ve frontÄ›" -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "Program manager" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" +msgstr "Soubor: %f , velikost: %s , max. velikost souboru:% m" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "Host" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" +msgstr "PÅ™idané URL může být Å¡patné nebo neexistuje" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" -msgstr "Hosté mohou dÄ›lat následující:" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " +msgstr "Chyba: Soubor je příliÅ¡ velký: " -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" -msgstr "Zobrazit plán" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " +msgstr "Chyba: Neplatná přípona souboru: " -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" -msgstr "Zobrazit obsah vysílání" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "Nastavit jako default" -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" -msgstr "DJ může dÄ›lat následující:" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" +msgstr "VytvoÅ™it vstup" -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" -msgstr "Spravovat pÅ™idÄ›lený obsah vysílání" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" +msgstr "Editovat historii nahrávky" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" -msgstr "Import media souborů" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" +msgstr "Kopírovat %s řádků %s do schránky" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" -msgstr "VytvoÅ™it playlisty, smart bloky a webstreamy" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." +msgstr "%s náhled tisku %s k vytiÅ¡tÄ›ní této tabulky použijte funkci tisku ve vaÅ¡em prohlížeÄi. Po dokonÄení stisknÄ›te escape." -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" -msgstr "Spravovat obsah vlastní knihovny" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "Nemáte oprávnÄ›ní k odpojení zdroje." -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" -msgstr "Progam ManažeÅ™i může dÄ›lat následující:" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "Neexistuje zdroj pÅ™ipojený k tomuto vstupu." -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" -msgstr "Zobrazit a spravovat obsah vysílání" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "Nemáte oprávnÄ›ní ke zmÄ›nÄ› zdroje." -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" -msgstr "Plán ukazuje" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "Prohlížíte si starší verzi %s" -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" -msgstr "Spravovat celý obsah knihovny" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "Nemůžete pÅ™idávat skladby do dynamických bloků." -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" -msgstr "Správci mohou provést následující:" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%s nenalezen" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" -msgstr "Správa pÅ™edvoleb" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "Nemáte oprávnÄ›ní odstranit vybrané %s (s)." -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" -msgstr "Správa uživatelů" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "NÄ›co je Å¡patnÄ›." -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "Správa sledovaných složek" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "Můžete pouze pÅ™idat skladby do chytrého bloku." -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "Odeslat zpÄ›tnou vazbu" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "Playlist bez názvu" -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" -msgstr "Zobrazit stav systému" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Chytrý block bez názvu" -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" -msgstr "Přístup playout historii" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "Neznámý Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" -msgstr "Zobrazit posluchaÄe statistiky" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "Nemáte udÄ›len přístup k tomuto zdroji." -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" -msgstr "Zobrazit / skrýt sloupce" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "Nemáte udÄ›len přístup k tomuto zdroji. " -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" -msgstr "Z {z} do {do}" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "Soubor v Airtime neexistuje." -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" -msgstr "kbps" +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "Soubor v Airtime neexistuje." -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" -msgstr "rrrr-mm-dd" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "Soubor v Airtime neexistuje." -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" -msgstr "hh:mm:ss.t" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "Å patný požadavek. Žádný 'mode' parametr neproÅ¡el." -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" -msgstr "kHz" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "Å patný požadavek. 'Mode' parametr je neplatný." -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" -msgstr "Ne" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "Náhled" -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" -msgstr "Po" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "PÅ™idat do Playlistu" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" -msgstr "Út" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "PÅ™idat do chytrého bloku" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "Smazat" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" -msgstr "St" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "Duplikátní Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" -msgstr "ÄŒt" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "Upravit" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" -msgstr "Pá" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "Soundcloud" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" -msgstr "So" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "Zobrazit na SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" -msgstr "Hodina" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "Znovu nahrát do SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" -msgstr "Minuta" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Nahrát do SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" -msgstr "Hotovo" +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "Žádná akce není k dispozici" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" -msgstr "Vyberte soubory" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "Nemáte oprávnÄ›ní odstranit vybrané položky." -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." -msgstr "PÅ™idejte soubory do fronty pro nahrávání a kliknÄ›te na tlaÄítko start." +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "Nelze odstranit nÄ›které naplánované soubory." -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" -msgstr "PÅ™idat soubory." +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "Kopie %s" -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" -msgstr "Zastavit Nahrávání" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Vybrat kurzor" -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" -msgstr "ZaÄít nahrávat" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "Odstranit kurzor" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" -msgstr "PÅ™idat soubory" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "vysílání neexistuje" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" -msgstr "Nahráno %d / %d souborů" +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." +msgstr "Preference aktualizovány." -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" -msgstr "Nedostupné" +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." +msgstr "Podpora nastavení aktualizována." -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." -msgstr "Soubory pÅ™etáhnÄ›te zde." +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" +msgstr "Technická podpora" -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." -msgstr "Chybná přípona souboru" +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." +msgstr "Nastavení streamu aktualizováno." -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." -msgstr "Chybná velikost souboru." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" +msgstr "cesta by mÄ›la být specifikována" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." -msgstr "Chybný souÄet souborů." +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." +msgstr "Problém s Liquidsoap ..." -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." -msgstr "Chyba Init." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "PrávÄ› se pÅ™ehrává" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." -msgstr "Chyba HTTP." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "PÅ™idat média" -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." -msgstr "Chyba zabezpeÄení." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Knihovna" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." -msgstr "Obecná chyba. " +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "Kalendář" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." -msgstr "CHyba IO." +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "Systém" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" -msgstr "Soubor: %s" +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "Nastavení" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" -msgstr "%d souborů ve frontÄ›" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "Uživatelé" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" -msgstr "Soubor: %f , velikost: %s , max. velikost souboru:% m" +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Složky Médií" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" -msgstr "PÅ™idané URL může být Å¡patné nebo neexistuje" +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Streamy" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " -msgstr "Chyba: Soubor je příliÅ¡ velký: " +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "Statistiky poslechovost" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " -msgstr "Chyba: Neplatná přípona souboru: " +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "Historie" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" -msgstr "VytvoÅ™it vstup" +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "Historie odvysílaného" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" -msgstr "Editovat historii nahrávky" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "Historie nastavení" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" -msgstr "Kopírovat %s řádků %s do schránky" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "NápovÄ›da" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." -msgstr "%s náhled tisku %s k vytiÅ¡tÄ›ní této tabulky použijte funkci tisku ve vaÅ¡em prohlížeÄi. Po dokonÄení stisknÄ›te escape." +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "ZaÄínáme" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "Prosím, zadejte své uživatelské jméno a heslo" +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "Návod k obsluze" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "Zadali jste chybnÄ› uživatelské jméno nebo heslo. Prosím, zkuste zadat znovu." +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "O aplikaci" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "E-mail se nepodaÅ™ilo odeslat. Zkontrolujte nastavení poÅ¡tovního serveru a ujistÄ›te se, že byl správnÄ› nakonfigurován." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "Servis" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "Zadaný e-mail nebyl nalezen." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "Doba provozuschopnosti" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." -msgstr "Preference aktualizovány." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "CPU" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." -msgstr "Podpora nastavení aktualizována." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "Paměť" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" -msgstr "Technická podpora" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Airtime verze" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." -msgstr "Nastavení streamu aktualizováno." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "Velikost disku" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" -msgstr "cesta by mÄ›la být specifikována" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "Nastavení Email / Mail Serveru" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." -msgstr "Problém s Liquidsoap ..." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "Nastavení SoundCloud " -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Vybrat kurzor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Opakovat dny:" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "Odstranit kurzor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "Odstranit" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "vysílání neexistuje" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "PÅ™idat" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Webstream bez názvu" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "PÅ™ipojovací URL: " -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Webstream uložen." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "Nastavení vstupního streamu" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "Neplatná forma hodnot." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "URL pÅ™ipojení Master zdoje:" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "Prohlížíte si starší verzi %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "PÅ™epsat" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "Nemůžete pÅ™idávat skladby do dynamických bloků." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "OK" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "Nemáte oprávnÄ›ní odstranit vybrané %s (s)." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "Obnovit" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "Můžete pouze pÅ™idat skladby do chytrého bloku." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "URL pÅ™ipojení Show Source:" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "Playlist bez názvu" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(Požadováno)" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Chytrý block bez názvu" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "Registrovat Airtime" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "Neznámý Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Pomozte vylepÅ¡it Airtime tím, že nám dáte vÄ›dÄ›t, jak ho používáte. Tyto informace se budou shromažÄovat pravidelnÄ› tak aby se zvýšil Váš uživatelský zážitek.%sKliknÄ›te na 'Ano, pomoci Airtime', a my vás ujiÅ¡Å¥ujeme, že funkce, které používáte, budou neustále zlepÅ¡ovány." -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "Stránka nebyla nalezena" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "KliknÄ›te na políÄko níže pro inzerci váší stanice na %sSourcefabric.org%s. Pro podpoÅ™ení vaší stanice musí být povolena funkce 'Zaslat váš názor'. Tyto údaje budou navíc shromažÄovány na podporu zpÄ›tné vazby." -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Chyba aplikace" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(pouze pro ověřovací úÄely, nebude zveÅ™ejnÄ›no)" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "Uživatel byl úspěšnÄ› pÅ™idán!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Poznámka: Cokoli vÄ›tšího než 600x600 bude zmenÅ¡eno." -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "Uživatel byl úspěšnÄ› aktualizován!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Zobrazit co posílám " -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "Nastavení úspěšnÄ› aktualizováno!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "Pravidla a podmínky" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "Rok %s musí být v rozmezí 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "Obnovit heslo" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s - %s - %s není platné datum" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Vyberte soubor" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s : %s : %s není platný Äas" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "Nastavit" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "PoÅ™ad bez názvu" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "AktuálnÄ› importovaný soubor:" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "Importovaná složka:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "Znovu skenovat sledovaný adresář (Tato funkce je užiteÄná pokud se síť rozrůstá a nemusí být vÄas synchronizována s Airitme)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "Sledované složky:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "Odebrat sledovaný adresář" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "Neplatný adresář" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "Nesledujete žádné mediální soubory." -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Uživatelské jméno:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "Stream " -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "Heslo:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "DodateÄné možnosti" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "Ověřit heslo:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "Následující informace se zobrazí u posluchaÄů na jejich pÅ™ehrávaÄích:" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "Jméno:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(Webová stránka vaší rádiové stanice)" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "Příjmení:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "URL streamu: " -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "E-mail:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "Filtrovat historii" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Mobilní telefon:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "Najít vysílání" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "Filtrovat dle vysílání:" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "%s Nastavení" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "Typ uživatele:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Pomozte Airtime vylepÅ¡it tím, že dáte Sourcefabric vÄ›dÄ›t, jak jej používáte. Tyto informace budeme pravidelnÄ› shromažÄovat, abychom zlepÅ¡ili váše uživatelské zkuÅ¡enosti.%sKliknÄ›te na odkaz 'Zaslat Váš názor' a my zajistíme, že se budou funkce, které používáte, neustále zlepÅ¡ovat." -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "PÅ™ihlaÅ¡ovací jméno není jedineÄné." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "KliknÄ›te na políÄko níže pro podporu své stanice na %s Sourcefabric.org %s ." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "Automatické pÅ™epínání vypnuto" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(Za úÄelem podpory vaší stanice musí být povolena funkce 'Zaslat Váš názor')." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "Automatické pÅ™epínání zapnuto" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Zásady ochrany osobních údajů Sourcefabric " -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "Prolnutí pÅ™i pÅ™epnutí (s)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "Vybrat instanci show" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "Zadejte Äas v sekundách 00{0.000000}" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "Najdi" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "Master uživatelské jméno" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Vyberte dny:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "Master uživatelské jméno" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Možnosti Smart Blocku" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "Master zdrojové URL pÅ™ipojení " +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "nebo" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "Zobrazit zdrojové URL pÅ™ipojení" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "a" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "Hlavní zdrojový port" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr " do " -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "Jsou povolena pouze Äísla." +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "soubory splňují kritéria" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "Hlavní zdrojový přípojný bod" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "soubor splňuje kritéria" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Zadán neplatný znak " +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "VytvoÅ™it soubor pÅ™ehledu nastavení" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Zobrazit zdrojový port" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "VytvoÅ™it vzor pÅ™ehledu logů" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "Zobrazit zdrojový přípojný bod" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "PÅ™idat elementy" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "Nemůžete použít stejný port jako Master DJ port." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "PÅ™idat nové pole" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "Port %s není k dispozici" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "Nastavit defolní Å¡ablnu" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%hodnota%' nesedí formát Äasu 'HH:mm'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" +msgstr "Vzory pÅ™ehledu logů" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "ZaÄátek datum/Äas:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "Vzory pÅ™ehledu logů nejsou" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "Konec datum/Äas:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "Nový vzor pÅ™ehledu logů" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "Doba trvání:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" +msgstr "Vzory pÅ™ehledu souboru" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "ÄŒasová zó" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" +msgstr "Nový vzor pÅ™ehledu souboru" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "Opakovat?" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "Nový vzor pÅ™ehledu souboru" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "Nelze vytvoÅ™it vysílání v minulosti" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "Nový" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "Nelze mÄ›nit datum/Äas vysílání, které bylo již spuÅ¡tÄ›no" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "Nový Playlist" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "Nelze mít dobu trvání < 0m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "Nový Smart blok" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "Nelze nastavit dobu trvání 00h 00m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "Nový webstream" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "Nelze mít dobu trvání delší než 24 hodin" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "Zobrazit / upravit popis" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" -msgstr "Link:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "URL streamu:" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "Typ opakování:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "Defaultní délka:" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "týdnÄ›" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "Žádný webstream" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" -msgstr "každé 2 týdny" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "Nastavení Streamu" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" -msgstr "každé 3 týdny" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Globální nastavení" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" -msgstr "každé 4 týdny" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "dB" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "Nastavení výstupního streamu" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "mÄ›síÄnÄ›" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "Probíhá importování souboru ..." -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Vyberte dny:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "Rozšířené možnosti hledání" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "Opakovat:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "pÅ™edchozí" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "den v mÄ›síci" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "pÅ™ehrát" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "den v týdnu" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "pauza" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "Datum ukonÄení:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "další" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "NekonÄí?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "stop" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "Datum ukonÄení musí být po poÄáteÄním datumu" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "vypnout zvuk" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "Prosím vyberte den opakování" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "zapnout zvuk" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "Hodnota je požadována a nemůže zůstat prázdná" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "max. hlasitost" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "Heslo" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "Nutná aktualizace" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "PotvrÄte nové heslo" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "Chcete-li pÅ™ehrávat média, budete si muset buÄ nastavit svůj prohlížeÄ na nejnovÄ›jší verzi nebo aktualizovat svůj%sFlash plugin%s." -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "Potvrzené heslo neodpovídá vaÅ¡emu heslu." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "Délka:" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Získat nové heslo" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "Vzorová frekvence:" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Název stanice" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "ISRC Äíslo" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Telefon:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "Cesta souboru:" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "Webová stránka stanice:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Web Stream" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "Stát:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "Dynamický Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "MÄ›sto:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "Statický Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "Popis stanice:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Audio stopa" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Logo stanice:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "Obsah Playlistu: " -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "Propagovat mou stanici na Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "Obsah statistického Smart Blocku: " -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "ZaÅ¡krtnutím tohoto políÄka potvrzuji, že souhlasím s podmínkami Sourcefabric %sv oblasti ochrany osobních údajů%s ." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "Kritéria dynamickeho Smart Blocku: " -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "Musíte souhlasit se zásadami ochrany osobních údajů." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "Omezit na " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%hodnota%' není platná e-mailová adresa v základním formátu local-part@hostname" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%hodnota%' neodpovídá formátu datumu '%formátu%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%hodnota%' je kratší než požadovaných %min% znaků" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%hodnota%' je více než %max% znaků dlouhá" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "PoÄítaní posluchaÄů v Äase" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%hodnota%' není mezi '%min%' a '%max%', vÄetnÄ›" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Vítejte v Airtime!" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "Hesla se neshodují" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Zde je návod, jak můžete zaÄít používat Airtime pro automatizaci svého vysílání: " -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "Povoleno:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "ZaÄnÄ›te tím, že pÅ™idáte soubory do knihovny pomocí 'PÅ™idat média' tlaÄítka v menu. Můžete jednoduÅ¡e pÅ™etáhnout soubory do tohoto okna." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "Typ streamu:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "VytvoÅ™te vysílání tím, že v menu půjdete do 'Kalendáře' a kliknete na ikonu '+ Show'. Může se jednat buÄ o jednorázové nebo opakující se vysílání. PÅ™idávat vysílání mohou pouze administrátoÅ™i a manažeÅ™i programu." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "Typ služby:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "Média pÅ™idáte do vysílání tak, že půjdete do svého vysílání v Plánovacím kalendáři a kliknutím na levé tlaÄítko myÅ¡i se vám otevÅ™ou možnosti z kterých si vyberte 'PÅ™idat / odstranit obsah'" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "Kanály:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Vyberte si média z levého okna a pÅ™etáhnÄ›te je do svého vysílání v pravém oknÄ›." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "Pak můžete zaÄít!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "Pro podrobnÄ›jší nápovÄ›du si pÅ™eÄtÄ›te %suživatelský manuál%s." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Server" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "Sdílet" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "Port" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Vyberte stream:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "URL" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%s Airtime %s %s ,, open radio software pro plánování a řízení vzdálené stanice. %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Přípojný bod" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%s Sourcefabric %s o.p.s. Airtime je distribuován podle %s GNU GPL v.3 %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "Administrátorské jméno" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "Nové heslo" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "Administrátorské heslo" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "Prosím zadejte a potvrÄte své nové heslo v políÄkách níže." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "Server nemůže být prázdný." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "Prosím zadejte e-mailovou adresu ke svému úÄtu. Obdržíte e-mailem odkaz na vytvoÅ™ení nového hesla." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "Port nemůže být prázdný." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "Odeslat e-mail" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "Mount nemůže být prázdný s Icecast serverem." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "E-mail byl odeslán" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "Hardware Audio výstup" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "ZpÄ›t na pÅ™ihlaÅ¡ovací stránku" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "Typ výstupu" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "Vítejte v on-line demo verzi Airtime! Můžete se pÅ™ihlásit pomocí uživatelského jména 'admin' a hesla 'admin'." -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Metadata Icecast Vorbis" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "PÅ™edchozí:" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "OznaÄení streamu:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "Další:" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "UmÄ›lec - Název" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "Zdrojové Streamy" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Vysílání - UmÄ›lec - Název" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "Hlavní zdroj" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Název stanice - Název vysílání" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "Zobrazit zdroj" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "Off Air metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "Naplánované vysílání" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "Povolit Replay Gain" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "ON AIR" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "Replay Gain Modifikátor" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "Poslech" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "Hledat uživatele:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "ÄŒas stanice" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "Váše zkuÅ¡ební období vyprší " -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "Nahráno z Line In?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Kupte si svůj Airtime" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "Vysílat znovu?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "Můj úÄet" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "Povolit systému odesílat e-maily (Obnovení hesla)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "Správa uživatelů" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "Odesílatel E-mailu Obnovení hesla" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "Nový uživatel" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "Konfigurace poÅ¡tovního serveru" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "id" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "Vyžaduje ověření" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "Jméno" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "PoÅ¡tovní server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "Příjmení" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "E-mailová adresa" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "Typ uživatele" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "OpiÅ¡te znaky, které vidíte na obrázku níže." +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "PÅ™ehled logu" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "Den musí být zadán" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "Shrnutí souboru" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "ÄŒas musí být zadán" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "Shrnutí show" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "Musíte poÄkat alespoň 1 hodinu pÅ™ed dalším vysíláním" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Defaultní aplikace Zend Frameworku " -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Použít Airtime ověření:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "Stránka nebyla nalezena!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "Použít ověření uživatele:" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "Stránka, kterou hledáte, neexistuje!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "Uživatelské jméno" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "Rozšířit statický blok" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "Uživatelské heslo" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "Rozšířit dynamický blok" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "Uživatelské jméno musí být zadáno." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "prázdný Smart blok" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "Heslo musí být zadáno." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "Prázdný playlist" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "Datum zahájení:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" +msgstr "Prázdný playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "Defoltní nastavení doby plynulého pÅ™echodu" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" +msgstr "Vymazat" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "zadejte Äas v sekundách 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Promíchat Playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" -msgstr "PÅ™ednastavení Fade In:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Uložit playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" -msgstr "PÅ™ednastavení Fade Out:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "Playlist crossfade" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "Povolit vzdáleným webovým stránkám přístup k \"rozpisu\" Info? %s (Povolit tuto funkci, aby front-end widgety fungovaly.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "Zesílit: " -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "Vypnuto" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Zeslabit: " -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "Povoleno" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "NeotevÅ™ený playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "Výchozí jazyk rozhraní" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" +msgstr "Prázný obsah smart block." -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" -msgstr "ÄŒasové pásmo stanice" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(ss.t)" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "Týden zaÄíná" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "Smart block není otevÅ™ený" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" -msgstr "ÄŒasové pásmo uživatelského rozhraní" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" +msgstr "UKázat Waveform" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "Cue in: " -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "Obnovení hesla" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(hh:mm:ss.t)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "hodiny" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Cue out: " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "minuty" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "Původní délka:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "Nastavit chytrý typ bloku:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "PÅ™idat toto vysílání" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "Statický" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "Aktualizace vysílání" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "Dynamický" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "Co" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "Povolit Opakujte skladby:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "Kdy" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "Omezit na" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "Vložení Live Streamu" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "Generovat obsah playlistu a uložit kritéria" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "Nahrát a znovu vysílat" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "Generovat" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Kdo" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "Promíchat obsah playlistu" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Styl" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "Limit nemůže být prázdný nebo menší než 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "Znovu odvysílat %s od %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "Limit nemůže být vÄ›tší než 24 hodin" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Vyberte zemi" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "Hodnota by mÄ›la být celé Äíslo" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "Délka musí být vÄ›tší než 0 minut" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "500 je max hodnota položky, kterou lze nastavit" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "Délka by mÄ›la mít tvar \"00h 00m\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "Musíte vybrat kritéria a modifikátor" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "URL by mÄ›la mít tvar \"http://domain\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "'Délka' by mÄ›la být ve formátu '00:00:00'" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "URL by mÄ›la mít 512 znaků nebo ménÄ›" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "Hodnota by mÄ›la být v Äasový formát (napÅ™. 0000-00-00 nebo 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "Nenalezen žádný MIME typ pro webstream." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "Hodnota musí být Äíslo" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "Název webstreamu nemůže být prázdný" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "Hodnota by mÄ›la být menší než 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "Nelze zpracovat XSPF playlist" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "Hodnota by mÄ›la mít ménÄ› znaků než %s" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "Nelze zpracovat PLS playlist" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "Hodnota nemůže být prázdná" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "Nelze zpracovat M3U playlist" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Vysílání:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "Neplatný webstream - tento vypadá jako stažení souboru." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "VÅ¡echna má vysílání:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "Neznámý typ streamu: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "ISRC Äíslo:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s je již sledován." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "Automaticky nahrát nahrané vysílání" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s obsahuje vložený sledovaný adresář: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "Povolit SoundCloud nahrávání" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s je vložený do stávajícího sledovaného adresáře: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "Automaticky oznaÄit soubory \"Ke stažení\" na SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s není platný adresář." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "SoundCloud Email" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s je již nastaveno jako aktuální uložiÅ¡tÄ› adresáře nebo ve sledovaném seznamu souborů." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "SoundCloud heslo" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s je již nastaven jako aktuální adresář úložiÅ¡tÄ› nebo v seznamu sledovaných složek." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "SoundCloud Tagy: (oddÄ›lit tagy mezerami)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s neexistuje v seznamu sledovaných." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "Výchozí žánr:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "Nemůže pÅ™esunout položky z linkovaných vysílání" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "Výchozí typ skladby:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "Program, který si prohlížíte, je zastaralý!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "Původní" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "Program který si prohlížíte je zastaralý!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "Program který si prohlížíte je zastaralý! " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "Live" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "Nemáte povoleno plánovat vysílání %s ." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "Záznam" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "Nemůžete pÅ™idávat soubory do nahrávaného vysílání." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "Mluvený" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "Vysílání %s skonÄilo a nemůže být nasazeno." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "Vysílání %s bylo již dříve aktualizováno!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "Obsah v propojených show musí být zaÅ™azen pÅ™ed nebo po kterémkoliv, který je vysílaný " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "Práce v procesu" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "Vybraný soubor neexistuje!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "Stem" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "Cue in a cue out jsou prázné." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "SmyÄka" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "Nelze nastavit vÄ›tší cue in než cue out." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Zvukový efekt" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "Nelze nastavit delší cue out než je délka souboru." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "One Shot ukázka" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "Nelze nastavit menší cue out než je cue in." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Další" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "Soubor nebyl nahrán. Máte k dispozici %s MB volného místa na disku a soubor který jste chtÄ›li nahrát má velikost %s MB." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "Výchozí licence:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "Vysílání může mít max. délku 24 hodin." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "Práce je ve veÅ™ejné doménÄ›" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"Nelze naplánovat pÅ™ekrývající se vysílání.\n" +"Poznámka:. ZmÄ›na velikosti opakujícího se vysílání ovlivňuje vÅ¡echny opakování tohoto vysílání." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "VÅ¡echna práva jsou vyhrazena" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Ahoj %s , \n" +"\n" +"KliknÄ›te na tento odkaz pro obnovení vaÅ¡eho hesla: " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "Creative Commons oznaÄení" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Airtime obnovení hesla" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "Creative Commons nekomerÄní" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "Soubor s nahrávkou neexistuje" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "Creative Commons Nezasahujte do díla" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "Zobrazit nahraný soubor metadat" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "Creative Commons Zachovejte licenci" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Zobrazit obsah" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "Creative Commons nekomerÄní Nezasahujte do díla" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "Odstranit celý obsah" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "Creative Commons nekomerÄní Zachovejte licenci" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "ZruÅ¡it aktuální vysílání" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "Barva pozadí:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "Upravit " -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "Barva textu:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "Upravit vysílání" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "PrávÄ› se pÅ™ehrává" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "Odstranit tuto instanci" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "PÅ™idat média" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "Odstranit tuto instanci a vÅ¡echny následující" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Knihovna" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "Přístup odepÅ™en" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "Kalendář" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "Nelze pÅ™etáhnout opakujícící se vysílání" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "Systém" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "Nelze pÅ™esunout vysílání z minulosti" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "Uživatelé" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "Nelze pÅ™esunout vysílání do minulosti" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Složky Médií" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "Nelze pÅ™esunout nahrané vysílání ménÄ› než 1 hodinu pÅ™ed tím, než bude znovu vysíláno." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Streamy" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "Vysílání bylo vymazáno, protože nahrané vysílání neexistuje!" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "Statistiky poslechovost" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "Musíte poÄkat 1 hodinu pÅ™ed dalším vysíláním." -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" -msgstr "Historie" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" +msgstr "Stopa" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "Historie odvysílaného" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "PÅ™ehráno" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "Historie nastavení" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "Rok %s musí být v rozmezí 1753 - 9999" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "ZaÄínáme" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s - %s - %s není platné datum" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "Návod k obsluze" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s : %s : %s není platný Äas" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3912,3 +3802,18 @@ msgstr "Prosím vyberte si možnost" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "Žádné záznamy" + +#~ msgid "can't resize a past show" +#~ msgstr "Nelze zmÄ›nit velikost již odvysílaného poÅ™adu." + +#~ msgid "Should not overlap shows" +#~ msgstr "Jednotlivá vysílání by se nemÄ›la pÅ™ekrývat" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "NepodaÅ™ilo se vytvoÅ™it adresář 'organize'." + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "Tento soubor se zdá být poÅ¡kozený a nebude pÅ™idán do knihovny médií." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "Soubor nebyl nahrán. K této chybÄ› může dojít, pokud na pevném disku poÄítaÄe není dostatek místa nebo adresář nemá správná oprávnÄ›ní pro zápis." diff --git a/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po b/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po index 28661b50e8..ca16d4ccff 100644 --- a/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po @@ -1,7 +1,7 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # hoerich , 2014 # Sourcefabric , 2013 @@ -9,28 +9,16 @@ msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-02-11 20:10+0000\n" "Last-Translator: hoerich \n" "Language-Team: German (Austria) (http://www.transifex.com/projects/p/airtime/language/de_AT/)\n" +"Language: de_AT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: de_AT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime Copyright ©Sourcefabric o.p.s. Alle Rechte vorbehalten.%sGepflegt und vertrieben unter GNU GPL v.3 von %sSourcefabric o.p.s%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "Live Stream" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -51,9 +39,9 @@ msgid "Stop" msgstr "Stopp" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Cue In" @@ -62,9 +50,9 @@ msgid "Set Cue In" msgstr "Cue In setzen" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Cue Out" @@ -86,1620 +74,1418 @@ msgstr "Fade In" msgid "Fade Out" msgstr "Fade Out" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "Titel" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime Copyright ©Sourcefabric o.p.s. Alle Rechte vorbehalten.%sGepflegt und vertrieben unter GNU GPL v.3 von %sSourcefabric o.p.s%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "Interpret" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "Live Stream" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "Aktiviert:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "Dauer" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "Stream Typ:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Genre" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Bitrate:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "Stimmung" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "Service Typ:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "Label" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "Kanäle:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "Komponist" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Mono" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Stereo" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "Copyright" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Server" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Jahr" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Ungültiges Zeichen eingeben" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "Titel" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "Port" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "Dirigent" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "Es sind nur Zahlen erlaubt" -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "Sprache" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "Passwort" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "Beginn" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Genre" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "Ende" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "URL" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "Abgespielt" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "Name" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "Aufeichnung existiert nicht" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "Beschreibung" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "Metadaten der aufgezeichneten Datei ansehen" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Mount Point" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "Auf SoundCloud ansehen" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Benutzername" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Auf SoundCloud hochladen " +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "Admin Benutzer" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "Nochmal auf SoundCloud hochladen." +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "Admin Passwort" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Sendungsinhalt" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Erhalte Information vom Server..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "Inhalt hinzufügen / entfernen" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "Server darf nicht leer sein." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "Gesamten Inhalt entfernen" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "Port darf nicht leer sein." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "Aktuelle Sendung abbrechen" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "Mount darf nicht leer sein, wenn Icecast-Server verwendet wird." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "Diese Folge bearbeiten" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "Titel" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "Bearbeiten" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "Interpret:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "Sendung bearbeiten" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Album:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "Löschen" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Titelnummer:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "Lösche diese Folge" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Genre:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "Lösche diese Folge und alle Nachfolgenden" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Jahr:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "Zugriff verweigert" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "Label:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "Wiederkehrende Sendungen können nicht per Drag'n'Drop verschoben werden." +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "Komponist:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "Eine in der Vergangenheit liegende Sendung kann nicht verschoben werden." +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "Dirigent:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "Eine Sendung kann nicht in die Vergangenheit verschoben werden." +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "Stimmung:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "Sendungen können nicht überlappend geplant werden." +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "Eine aufgezeichnete Sendung kann nicht verschoben werden, wenn der Zeitpunkt der Wiederholung weniger als eine Stunde bevor liegt." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "Copyright:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "Die Sendung wurde gelöscht, weil die aufgezeichnete Sendung nicht existiert." +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "ISRC Nummer:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "Das Wiederholen einer Sendung ist erst nach einer Stunde Wartezeit möglich." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "Webseite:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "Einstellungen" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "Sprache:" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Speichern" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "Verwalte Medienverzeichnisse" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "Abbrechen" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "Stream Einstellungen" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Benutzername:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Globale Einstellungen" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "Passwort:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "dB" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "Passwort bestätigen:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "Stream-Ausgabe Einstellungen" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "Vorname:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Verzeichnis wählen" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "Nachname:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "Wählen" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "E-Mail:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "Aktuelles Import-Verzeichnis:" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Mobiltelefon:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "Hinzufügen" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "Ãœberwachte Verzeichnisse nochmals durchsuchen\n(Dies könnte nützlich sein, wenn Airtime beim Synchronisieren mit Netzlaufwerken Schwierigkeiten hat)" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "Ãœberwachten Ordner entfernen" +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "Benutzertyp:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "Sie überwachen keine Medienverzeichnisse." +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "Gast" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "Airtime registrieren" +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "DJ" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Helfen sie Airtime, indem sie uns erzählen, wie sie damit arbeiten. Diese Informationen werden regelmäßig gesammelt, um die Erfahrungswerte der Benutzer zu fördern.%sDrücken Sie auf 'Ja, Airtime helfen' und wir versichern, die von ihnen verwendeten Features laufend zu verbessern." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "Programm Manager" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "Mit Aktivierung des unteren Kästchens werben sie für ihre Radiostation auf %sSourcefabric.org%s. Dazu muss die Option 'Support Feedback senden' aktiviert sein. Diese Daten werden zusätzlich zum Support Feedback gesammelt." +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "Admin" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(Erforderlich)" +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "Benutzername ist nicht einmalig." -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(Ausschließlich zu Kontrollzwecken, wird nicht veröffentlicht)" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "Hintergrundfarbe:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Erinnerung: Sind Dateien größer als 600x600 Pixel, wird die Größe geändert." +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "Textfarbe:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Zeige mir was ich sende" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "Zeitpunkt Start:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "Geschäftsbedingungen und Rahmenverhältnisse" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "Zeitpunkt Ende:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "Sendungen suchen" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Sendung:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "Nach Sendung filtern:" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "Alle meine Sendungen:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "Passwort zurücksetzen" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "Tage" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Smart Block Optionen" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "Tag muß angegeben werden" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "oder" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "Zeit muß angegeben werden" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "and" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "Das Wiederholen einer Sendung ist erst nach einer Stunde Wartezeit möglich." -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr " bis " +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "Import Verzeichnis:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "Dateien entsprechen den Kriterien" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "Ãœberwachte Verzeichnisse:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "entspricht den Kriterien" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "Kein gültiges Verzeichnis" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "Verbindung URL:" +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "Benutzer suchen:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Helfen sie Airtime, indem sie uns erzählen, wie sie damit arbeiten. Diese Informationen werden regelmäßig gesammelt, um die Erfahrungswerte der Benutzer zu fördern.%sDrücken Sie auf 'Ja, Airtime helfen' und wir versichern, die von ihnen verwendeten Features laufend zu verbessern." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "DJs:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "Mit Aktivierung des unteren Kästchens werben sie für ihre Radiostation auf %sSourcefabric.org%s. Dazu muss die Option 'Support Feedback senden' aktiviert sein. Diese Daten werden zusätzlich zum Support Feedback gesammelt." +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "Anmeldung" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(Um ihre Radiostation bewerben zu können, muß 'Support Feedback senden' aktiviert sein)" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "Geben sie die Zeichen ein, die im darunter liegenden Bild zu sehen sind." -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Sourcefabric Datenschutzrichtlinie" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Sendername" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "Stream-Eingang Einstellungen" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "Standarddauer Crossfade (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "Master-Quelle Verbindungs-URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "Geben sie eine Zeit in Sekunden ein 0{.0}" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "Ãœbersteuern" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "Standard Fade In (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "Standard Fade Out (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "RESET" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "Erlaube Remote-Webseiten Zugriff auf \"Kalender\" Info?%s (Aktivierung ermöglicht die Verwendung von Front-End Widgets.)" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "Show-Quelle Verbindungs-URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "Deaktiviert" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Tag wählen:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "Aktiviert" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "Entfernen" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "Standardsprache" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Wiederholungstage:" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" +msgstr "Zeitzone Radiostation" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "E-Mail- / Mail-Server-Einstellungen" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "Woche startet mit " -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "SoundCloud Einstellungen" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "Sonntag" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "%s's Einstellungen" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "Montag" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" -msgstr "Folge wählen" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "Dienstag" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "Keine Sendung" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "Mittwoch" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "Finden" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "Donnerstag" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "Stream" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "Freitag" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "Erweiterte Optionen" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "Die Hörer werden folgende Information auf dem Display ihres Medien-Players sehen:" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(Webseite ihrer Radiostation)" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Samstag" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "Stream URL:" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "Verknüpfen:" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "Filter Verlauf" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "Wiederholungstyp:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Willkommen bei Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "Wöchentlich" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Starten sie hier, um die ersten Schritte für die Automation ihrer Radio Station zu erfahren." +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "jede Zweite Woche" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "Beginnen sie damit, Dateien ihrer Bibliothek hinzuzufügen. Verwenden sie dazu die Schaltfläche 'Medien Hinzufügen'. Dateien können auch via Drag'n'Drop hinzugefügt werden." +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "jede Dritte Woche" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "Erstellen sie eine Sendung, indem sie in der Menüzeile die Schaltfläche 'Kalender' betätigen und anschließend die Schaltfläche '+ Sendung' wählen. Dies kann eine einmalige oder sich wiederholende Sendung sein. Nur Administratoren und Programm Manager können Sendungen hinzufügen." +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "jede Vierte Woche" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "Fügen sie Mediendateien einer Show hinzu.\nÖffnen sie dazu die gewünschte Sendung durch einen Links-Klick darauf im Kalender und wählen sie 'Inhalt hinzufügen / entfernen'" +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "Monatlich" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Wählen sie Medien vom linken Feld und ziehen sie diese in ihre Sendung im rechten Feld." +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Tage wählen:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "Dann kann es auch schon los gehen!" +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "SO" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "Für weitere Hilfe bitte das %sBenutzerhandbuch%s lesen." +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "MO" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "Ãœber" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "DI" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sAirtime%s %s, die offene Radio Software für Planung und Remote-Station-Management. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "MI" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%sSourcefabric%s o.p.s. Airtime wird vertrieben unter %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "DO" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "Teilen" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "FR" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Stream wählen:" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "SA" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "Stumm schalten" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "Wiederholung am:" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "Laut schalten" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "Tag des Monats" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "Anmeldung" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "Tag der Woche" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Willkommen zur Online Artime Demo!\nSie können sich mit dem Benutzernamen 'admin' und dem Passwort 'admin' anmelden." +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "Kein Enddatum?" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "Bitte geben sie die E-Mail-Adresse ein, die in ihrem Benutzerkonto eingetragen ist. Sie erhalten einen Link um ein neues Passwort via E-Mail zu erstellen." +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "Enddatum muß nach Startdatum liegen." -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "E-Mail gesendet" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "Bitte Tag zum Wiederholen wählen" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "Ein E-Mail wurder gesendet" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "Neues Passwort bestätigen" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "Zurück zum Anmeldungsbildschirm" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "Passwortbestätigung stimmt nicht mit Passwort überein" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "Neues Passwort" +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Neues Passwort erhalten" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "Bitte in den nachstehenden Feldern das neue Passwort eingeben und bestätigen." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "Kriterien wählen" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "Die Probelaufzeit läuft ab in" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Album" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "Tage" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Bitrate (Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Kaufen sie eine Kopie von Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "Mein Konto" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "Komponist" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "Vorher:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "Dirigent" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "Danach:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "Copyright" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "Stream-Quellen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "Interpret" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "Master Quelle" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Encoded By" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "Show Quelle" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "Planmäßig Abspielen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "Label" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "ON AIR" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "Sprache" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "Hören" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "Zuletzt geändert" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "Uhrzeit" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "Zuletzt gespielt" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Schließen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "Dauer" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "Sendung hinzufügen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Mime" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "Sendung aktualisieren" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "Stimmung" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "Was" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "Besitzer" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "Wann" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "Replay Gain" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "Live-Stream Eingang" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "Sample Rate (KHz)" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "Aufzeichnen & Wiederholen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "Titel" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Wer" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "Titelnummer" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Style" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "Hochgeladen" -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "Beginn" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "Webseite" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "Dienst" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Jahr" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "Status" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "Wähle Modifikator" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "Betriebszeit" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "enthält" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "CPU" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "enthält nicht" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "Speicher" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "ist" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Airtime Version" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "ist nicht" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "Speicherplatz" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "beginnt mit" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "Datei-Import in Bearbeitung..." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "endet mit" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "Erweiterte Suchoptionen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "ist größer als" -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "Hörerzahl im Zeitraffer" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "ist kleiner als" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "Neu" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "ist im Bereich" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "Neue Playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "Stunden" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "Neuer Smart Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "Minuten" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "Neuer Webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "Objekte" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "Beschreibung ansehen / bearbeiten" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "Smart Block Typ festlegen:" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "Beschreibung" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "Statisch" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "Stream URL:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "Dynamisch" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "Standard Dauer:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "Erlaube Wiederholen von Titeln:" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "Kein Webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "Beschränkt auf " -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "Playlist leeren" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "Playlist-Inhalt erstellen und Kriterien speichern" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "Leeren" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "Erstellen" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Shuffle Playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "Shuffle Playlist-Inhalt (Durchmischen)" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 #: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 msgid "Shuffle" msgstr "Shuffle" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Playlist speichern" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "Playlist Crossfade" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "Fade In:" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Fade Out:" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "Keine Playlist geöffnet" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "Wellenform anzeigen" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "Smart Block leeren" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "Kein Smart Block geöffnet" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "Cue In:" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(hh:mm:ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Cue Out:" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "Original Dauer:" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "Statischen Block erweitern" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "Dynamischen Block erweitern" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "Smart Block leer" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "Playlist leer" - -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Zend Framework Default Application" - -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "Seite nicht gefunden!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "Scheinbar existiert die Seite die sie suchen nicht!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "Beschränkung kann nicht leer oder kleiner als 0 sein." -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "Hilfe" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "Beschränkung kann nicht größer als 24 Stunden sein" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "Zurück" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "Der Wert muß eine ganze Zahl sein." -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "Abspielen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "Die Anzahl der Objekte ist auf 500 beschränkt." -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "Pause" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "Sie müssen Kriterium und Modifikator bestimmen" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "Nächster" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "Die 'Dauer' muß im Format '00:00:00' eingegeben werden" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "Stopp" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "Der Wert muß im Timestamp-Format eingegeben werden (zB. 0000-00-00 oder 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "Maximale Lautstärke" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "Der eingegebene Wert muß aus Ziffern bestehen" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "Aktualisierung erforderlich" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "Der eingegebene Wert muß kleiner sein als 2147483648" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 #, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "Um diese Datei abspielen zu können muß entweder der Browser oder das %sFlash Plugin%s aktualisiert werden." - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "Erstelle Dateiübersichtsvorlage" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "Erstelle Protokollvorlage" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "Name" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "Weitere Elemente hinzufügen" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "Neues Feld hinzufügen" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "Standardvorlage festlegen" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "Protokollvorlagen" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "Keine Protokollvorlagen" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "Standard festlegen" +msgid "The value should be less than %s characters" +msgstr "Der eingegebene Wert muß aus weniger als %s Zeichen bestehen." -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "Neue Protokollvorlage" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "Wert kann nicht leer sein" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "Dateiübersichtsvorlagen" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "Automatisch abschalten" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "Keine Dateiübersichtsvorlagen" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "Automatisch einschalten" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "Neue Dateiübersichtsvorlage" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "Ãœbergang beim Umschalten (Fade in Sekunden)" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "Benutzer verwalten" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "Eingabe der Zeit in Sekunden 00{.000000}" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "Neuer Benutzer" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "Master Benutzername" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "ID" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "Master Passwort" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Benutzername" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "Master-Quelle Adresse (URL)" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "Vorname" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "Show-Quelle Adresse (URL)" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "Nachname" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "Master-Quelle Port" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "Benutzertyp" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "Master-Quelle Mount Point" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "Titel" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Show-Quelle Port" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "Interpret:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "Show-Quelle Mount Point" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Album:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "Sie können nicht denselben Port wie für die Master-Quelle verwenden." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Titelnummer:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "Port %s ist nicht verfügbar" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "Dauer:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Telefon:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "Samplerate:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "Sender-Webseite:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Bitrate:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "Land:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "Stimmung:" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "Stadt:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Genre:" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "Sender Beschreibung:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Jahr:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Sender Logo:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "Label:" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "Support Feedback senden" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "Meine Radio Station auf Sourcefabric.org bewerben" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "Komponist:" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "Hiermit akzeptiere ich Sourcefabric's %sDatenschutzrichtlinien%s." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "Dirigent:" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "Sie müssen die Datenschutzrichtlinien akzeptieren." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "Copyright:" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "Wert erforderlich. Feld darf nicht leer sein." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "ISRC Number:" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "Beginn" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "Webseite:" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "Ende" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "Sprache:" +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "Keine Sendung" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "Dateipfad:" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "Aufzeichnen von Line-In?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "Name:" +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "Wiederholen?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "Beschreibung:" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Airtime Authentifizierung:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Web Stream" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "Benutzerdefinierte Authentifizierung:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "Dynamischer Smart Block" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "Benutzerdefinierter Benutzername" + +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "Benutzerdefiniertes Passwort" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "Statischer Smart Block" +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "Das Feld Benutzername darf nicht leer sein." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Titel" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "Das Feld Passwort darf nicht leer sein." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "Playlist Inhalt:" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "E-Mail" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "Statischer Smart Block Inhalt:" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "Passwort wiederherstellen" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "Dynamische Smart Block Kriterien:" +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "Hardware Audioausgabe" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "Begrenzt auf " +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "Ausgabetyp" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "URL:" +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Icecast Vorbis Metadata" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "Protokoll" +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "Streambezeichnung:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "Dateiübersicht" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "Artist - Titel" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "Sendungsübersicht" +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Sendung - Interpret - Titel" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "Die Maximaldauer einer Sendung beträgt 24 Stunden." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Radiostation - Sendung" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "Enddatum / Endzeit darf nicht in der Vergangheit liegen." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "Off Air Metadata" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "Sendungen können nicht überlappend geplant werden.\nBeachte: Wird die Dauer einer wiederkehrenden Sendung verändert, wirkt sich das auch auf alle Wiederholungen aus." +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "Replay Gain aktivieren" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "Die Dauer einer vergangenen Sendung kann nicht verändert werden." +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "Replay Gain Modifikator" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "Sendungen sollten nicht überlappen." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%value%' ist keine gültige E-Mail-Adresse im Standardformat local-part@hostname" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Land wählen" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%' wurde nicht im erforderlichen Datumsformat '%format%' eingegeben" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s wird bereits überwacht." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%' ist kürzer als %min% Zeichen lang" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s enthält andere bereits überwachte Verzeichnisse: %s " +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%value%' ist mehr als %max% Zeichen lang" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s ist ein Unterverzeichnis eines bereits überwachten Verzeichnisses: %s" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%' liegt nicht zwischen '%min%' und '%max%'" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s ist kein gültiges Verzeichnis." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "Passwörter stimmen nicht überein" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s ist bereits als aktuelles Speicherverzeichnis bestimmt oder in der Liste überwachter Verzeichnisse." +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%value%' ist nicht im Format 'HH:mm'" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s ist bereits als aktuelles Speicherverzeichnis bestimmt oder in der Liste überwachter Verzeichnisse." +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "Datum/Zeit Start:" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s existiert nicht in der Liste überwachter Verzeichnisse." +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "Datum/Zeit Ende:" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "Objekte" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "Dauer:" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "Cue In und Cue Out sind Null." +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "Zeitzone:" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "Cue In darf nicht größer als die Gesamtdauer der Datei sein." +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "Wiederholungen?" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "Cue In darf nicht größer als Cue Out sein." +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "Eine Sendung kann nicht für einen bereits vergangenen Zeitpunkt geplant werden" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "Cue Out darf nicht kleiner als Cue In sein." +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "Beginn- & Endzeit einer bereits laufenden Sendung können nicht geändert werden" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "Kriterien wählen" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "Enddatum / Endzeit darf nicht in der Vergangheit liegen." -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Bitrate (Kbps)" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "Die Dauer einer Sendung kann nicht kürzer als 0 Minuten sein." -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "Die Dauer einer Sendung kann nicht 00h 00m sein" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Encoded By" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "Die Dauer einer Sendung kann nicht länger als 24h sein" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "Zuletzt geändert" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "Sendungen können nicht überlappend geplant werden." -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "Zuletzt gespielt" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "Name:" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Mime" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "Unbenannte Sendung" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "Besitzer" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "URL:" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "Replay Gain" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "Beschreibung:" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "Sample Rate (KHz)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "Automatisches Hochladen aufgezeichneter Sendungen" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "Titelnummer" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "Aktiviere SoundCloud Upload" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "Hochgeladen" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "Markiere Dateien auf SoundCloud automatisch als \"herunterladbar\"" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "Webseite" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "SoundCloud E-Mail" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "Wähle Modifikator" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "SoundCloud Passwort" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "enthält" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "SoundCloud Tags: (mehrere Tags durch Leertaste trennen)" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "enthält nicht" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "Standard Genre:" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "ist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "Standard Titel Typ:" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "ist nicht" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "Original" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "beginnt mit" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "Remix" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "endet mit" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "Live" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "ist größer als" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "Aufzeichnung" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "ist kleiner als" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "Talk" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "ist im Bereich" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "Podcast" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "Dauer muß länger als 0 Minuten sein." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Demo" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "Dauer im Format \"00h 00m\" eingeben." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "In Bearbeitung" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "URL im Format \"http://domain\" eingeben." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "Eindämmen" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "URL darf aus höchstens 512 Zeichen bestehen." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "Loop" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "Es konnte kein MIME-Typ für den Webstream gefunden werden." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Sound Effekt" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "Die Bezeichnung eines Webstreams darf nicht leer sein." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "One-Shot-Sample" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "XSPF-Playlist konnte nicht aufgeschlüsselt werden." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Sonstige" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "PLS-Playlist konnte nicht aufgeschlüsselt werden." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "Standard Lizenz:" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "M3U-Playlist konnte nicht aufgeschlüsselt werden." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "Das Werk ist in der öffentlichen Domäne" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "Ungültiger Webstream - Die eingegebene URL scheint ein Dateidownload zu sein." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "Alle Rechte vorbehalten" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "Unbekannter Stream-Typ: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "Creative Commons Zuordnung" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Hallo %s,\n\nKlicke auf diesen Link um dein Passwort zurückzusetzen:" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "Creative Commons Zuordnung Noncommercial" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Airtime Passwort Reset" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "Creative Commons Zuordnung No Derivative Works" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "Wiederholung von %s am %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "Creative Commons Zuordnung Share Alike" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "Objekte aus einer verknüpften Sendung können nicht verschoben werden." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "Creative Commons Zuordnung Noncommercial Non Derivate Works" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "Der Kalender den sie sehen ist nicht mehr aktuell! (Kalender falsch eingepasst)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "Creative Commons Zuordnung Noncommercial Share Alike" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "Der Kalender den sie sehen ist nicht mehr aktuell! (Objekt falsch eingepasst)" +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "Zeitzone Interface" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "Der Kalender den sie sehen ist nicht mehr aktuell." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "System E-Mails aktivieren (Passwort Reset)" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "Sie haben nicht die erforderliche Berechtigung einen Termin für die Sendung %s zu festzulegen." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "Reset Passwort 'From' E-Mail (Absenderbezeichnung)" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "Einer Sendungsaufzeichnung können keine Dateien hinzugefügt werden." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "Mail-Server konfigurieren" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "Die Sendung %s ist beendet und kann daher nicht festgelegt werden." +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "Authentifizierung erforderlich" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "Die Sendung %s wurde bereits aktualisiert." +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "Mail-Server" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "Eine verknüpfte Sendung kann nicht befüllt werden, während eine ihrer Instanzen ausgestrahlt wird." +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "E-Mail Adresse" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "Eine der gewählten Dateien existiert nicht!" +#: airtime_mvc/application/controllers/ListenerstatController.php:56 +msgid "Please make sure admin user/password is correct on System->Streams page." +msgstr "Bitte versichern Sie sich, dass Benutzer/Passwort unter System->Streams korrekt eingetragen ist." -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "Fehler beim Erstellen des Ordners 'organize'" +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Unbenannter Webstream" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "Die Datei konnte nicht hochgeladen werden. Es sind %s MB Speicherplatz frei und die Datei, die sie hochladen wollen, hat eine Größe von %s MB." +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Webstream gespeichert" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "Die Datei scheint fehlerhaft zu sein und wird der Bibliothek nicht hinzugefügt." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "Ungültiger Eingabewert" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "Die Datei konnte nicht hochgeladen werden. Dieser Fehler kann auftreten, wenn die Festplatte des Computers nicht genug Speicherplatz frei hat oder sie keine Schreibberechtigung für den Ordner 'stor' haben." +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "Bitte geben sie Benutzername und Passwort ein" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "Sie haben nicht die erforderliche Berechtigung die Quelle zu trennen." +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "Falscher Benutzername oder falsches Passwort eingegeben. Bitte versuchen sie es erneut." -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "Mit diesem Eingang ist keine Quelle verbunden." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "E-Mail konnte nicht gesendet werden. Ãœberprüfen sie die Einstellungen des Mail-Servers und versichern sie sich, daß dieser richtig konfiguriert ist." -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "Sie haben nicht die erforderliche Berechtigung die Quelle zu wechseln." +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "Vorgegebene E-Mail-Adresse konnte nicht gefunden werden." #: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format @@ -1711,95 +1497,25 @@ msgstr "Wiederholung der Sendung % s vom %s um %s" msgid "Download" msgstr "Herunterladen" -#: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." -msgstr "Bitte versichern Sie sich, dass Benutzer/Passwort unter System->Streams korrekt eingetragen ist." - -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "Sie haben nicht die erforderliche Berechtigung sich mit dieser Quelle zu verbinden." - -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "Sie haben nicht die erforderliche Berechtigung sich mit dieser Quelle zu verbinden." - -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "Datei existiert nicht in Airtime." - -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "Datei existiert nicht in Airtime." - -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "Datei existiert nicht in Airtime." - -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "Fehlerhafte Anfrage. Kein passender 'Mode'-Parameter." - -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "Fehlerhafte Anfrage. 'Mode'-Parameter ist ungültig." - -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 -#, php-format -msgid "%s not found" -msgstr "%s nicht gefunden" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "Etwas ist falsch gelaufen." - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "Vorschau" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "Zu Playlist hinzufügen" - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "Hinzufügen zu Smart Block" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "Metadaten bearbeiten" - -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "Playlist duplizieren" - -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "SoundCloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "Benutzer erfolgreich hinzugefügt!" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "Keine Aktion verfügbar" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "Benutzer erfolgreich aktualisiert!" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "Sie haben nicht die erforderliche Berechtigung die gewählten Objekte zu löschen." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "Einstellungen erfolgreich aktualisiert!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "Manche der festgelegten Dateien konnten nicht gelöscht werden." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "Seite nicht gefunden" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "Kopie von %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Anwendungsfehler" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1875,6 +1591,11 @@ msgstr "Sie können einer Playlist nur Titel, Smart Blocks und Webstreams hinzuf msgid "Please select a cursor position on timeline." msgstr "Bitte wählen Sie eine Cursor-Position auf der Zeitleiste." +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "Metadaten bearbeiten" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "Zu gewählter Sendung hinzufügen" @@ -1921,6 +1642,7 @@ msgstr "wird geladen..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "Alle" @@ -1991,9 +1713,7 @@ msgstr "Der Wert muß in folgendem Format eingegeben werden: hh:mm:ss.t" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "Sie laden im Augenblich Datein hoch. %sDas Wechseln der Seite würde diesen Prozess abbrechen. %sSind sie sicher, daß sie die Seite verlassen möchten?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2029,11 +1749,10 @@ msgid "Playlist shuffled" msgstr "Playlist durchgemischt" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." -msgstr "Airtime kann den Status dieser Datei nicht bestimmen.\nDas kann passieren, wenn die Datei auf einem nicht erreichbaren Netzlaufwerk liegt oder in einem Verzeichnis liegt, das nicht mehr überwacht wird." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." +msgstr "" +"Airtime kann den Status dieser Datei nicht bestimmen.\n" +"Das kann passieren, wenn die Datei auf einem nicht erreichbaren Netzlaufwerk liegt oder in einem Verzeichnis liegt, das nicht mehr überwacht wird." #: airtime_mvc/application/controllers/LocaleController.php:124 #, php-format @@ -2058,25 +1777,22 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "Ein Bild muß jpg, jpeg, png, oder gif sein." #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." -msgstr "Ein Statischer Smart Block speichert die Kriterien und erstellt den Block sofort.\nDadurch kann der Inhalt in der Bibliothek eingesehen und verändert werden bevor der Smart Block einer Sendung hinzugefügt wird." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." +msgstr "" +"Ein Statischer Smart Block speichert die Kriterien und erstellt den Block sofort.\n" +"Dadurch kann der Inhalt in der Bibliothek eingesehen und verändert werden bevor der Smart Block einer Sendung hinzugefügt wird." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." -msgstr "Ein Dynamischer Smart Block speichert nur die Kriterien.\nDabei wird der Inhalt erst erstellt, wenn der Smart Block einer Sendung hinzugefügt wird. Der Inhalt des Smart Blocks kann in der Bibliothek nicht eingesehen oder verändert werden." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." +msgstr "" +"Ein Dynamischer Smart Block speichert nur die Kriterien.\n" +"Dabei wird der Inhalt erst erstellt, wenn der Smart Block einer Sendung hinzugefügt wird. Der Inhalt des Smart Blocks kann in der Bibliothek nicht eingesehen oder verändert werden." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." -msgstr "Wenn Airtime nicht genug einzigartige Titel findet, kann die gewünschte Dauer des Smart Blocks nicht erreicht werden.\nAktivieren sie diese Option um das mehrfache Hinzufügen von Titel zum Smart Block zu erlauben." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." +msgstr "" +"Wenn Airtime nicht genug einzigartige Titel findet, kann die gewünschte Dauer des Smart Blocks nicht erreicht werden.\n" +"Aktivieren sie diese Option um das mehrfache Hinzufügen von Titel zum Smart Block zu erlauben." #: airtime_mvc/application/controllers/LocaleController.php:137 msgid "Smart block shuffled" @@ -2106,7 +1822,14 @@ msgstr "Wähle zu überwachendes Verzeichnis" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "Wollen sie wirklich das Storage-Verzeichnis ändern?\nDieser Vorgang entfernt alle Dateien der Airtime-Bibliothek!" +msgstr "" +"Wollen sie wirklich das Storage-Verzeichnis ändern?\n" +"Dieser Vorgang entfernt alle Dateien der Airtime-Bibliothek!" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "Verwalte Medienverzeichnisse" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2118,9 +1841,7 @@ msgstr "Dieser Pfad ist derzeit nicht erreichbar." #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "Manche Stream-Typen erfordern zusätzlich Konfiguration. Details zur Aktivierung von %sAAC+ Support%s oder %sOpus Support%s sind bereitgestellt." #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2131,23 +1852,15 @@ msgstr "Mit Streaming-Server verbunden" msgid "The stream is disabled" msgstr "Der Stream ist deaktiviert" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Erhalte Information vom Server..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "Verbindung mit Streaming-Server kann nicht hergestellt werden." #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." -msgstr "Falls sich Airtime hinter einem Router oder einer Firewall befindet, müssen sie gegebenenfalls eine Portweiterleitung konfigurieren. \nDer Wert sollte so geändert werden, daß host/port/mount den Zugangsdaten der DJ's entspricht. Der erlaubte Bereich liegt zwischen 1024 und 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." +msgstr "" +"Falls sich Airtime hinter einem Router oder einer Firewall befindet, müssen sie gegebenenfalls eine Portweiterleitung konfigurieren. \n" +"Der Wert sollte so geändert werden, daß host/port/mount den Zugangsdaten der DJ's entspricht. Der erlaubte Bereich liegt zwischen 1024 und 49151." #: airtime_mvc/application/controllers/LocaleController.php:167 #, php-format @@ -2155,61 +1868,41 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "Für weitere Information lesen sie bitte das %sAirtime Benutzerhandbuch%s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." -msgstr "Diese Option aktiviert Metadaten für Ogg-Streams.\n(Stream-Metadaten wie Titel, Interpret und Sendungsname können von Audioplayern angezeigt werden.)\nVLC und mplayer haben ernsthafte Probleme beim Abspielen von Ogg/Vorbis-Streams mit aktivierten Metadaten: Beide Anwendungen werden die Verbindung zum Stream nach jedem Titel verlieren. Sollten sie einen Ogg-Stream verwenden und ihre Hörer erwarten keinen Support für diese Audioplayer, können sie diese Option gerne aktivieren." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." +msgstr "" +"Diese Option aktiviert Metadaten für Ogg-Streams.\n" +"(Stream-Metadaten wie Titel, Interpret und Sendungsname können von Audioplayern angezeigt werden.)\n" +"VLC und mplayer haben ernsthafte Probleme beim Abspielen von Ogg/Vorbis-Streams mit aktivierten Metadaten: Beide Anwendungen werden die Verbindung zum Stream nach jedem Titel verlieren. Sollten sie einen Ogg-Stream verwenden und ihre Hörer erwarten keinen Support für diese Audioplayer, können sie diese Option gerne aktivieren." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "Aktivieren sie dieses Kästchen, um die Master-/Show-Quelle bei Unterbrechung der Leitung automatisch abzuschalten." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "Aktivieren sie dieses Kästchen, um die Master-/Show-Quelle bei Herstellung einer Leitung automatisch anzuschalten." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "Falls der Icecast-Server den Benutzernamen 'source' erwartet, kann dieses Feld leer gelassen werden." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "Falls der Live-Streaming-Client keinen Benutzernamen verlangt, sollte in dieses Feld 'source' eingetragen werden." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." -msgstr "Wenn sie Benutzername oder Passwort eines aktivierten Streams ändern, wird das Playout-System neu gestartet und die Hörer werden für 5-10 Sekunden Stille hören.\nDas Wechseln folgender Werte erfordert KEINEN Neustart: Stream Label (Globale Einstellungen), Master Ãœbergang beim Umschalten (Fade in Sekunden), Master Username und Master Passwort (Input Stream Einstellungen). Falls Airtime während eines Neustart des Dienstes eine Sendung aufzeichnet, wird die Aufzeichnung unterbrochen." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." +msgstr "" +"Wenn sie Benutzername oder Passwort eines aktivierten Streams ändern, wird das Playout-System neu gestartet und die Hörer werden für 5-10 Sekunden Stille hören.\n" +"Das Wechseln folgender Werte erfordert KEINEN Neustart: Stream Label (Globale Einstellungen), Master Ãœbergang beim Umschalten (Fade in Sekunden), Master Username und Master Passwort (Input Stream Einstellungen). Falls Airtime während eines Neustart des Dienstes eine Sendung aufzeichnet, wird die Aufzeichnung unterbrochen." #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "Das sind Admin Benutzername und Passwort, für die Hörerstatistiken von Icecast/SHOUTcast." #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "Warnung: Dieses Feld kann nicht geändert werden, während die Sendung wiedergegeben wird." #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2217,9 +1910,7 @@ msgid "No result found" msgstr "Kein Ergebnis gefunden" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "Diese Einstellung folgt den Sicherheitsvorlagen für Shows: Nur Benutzer denen diese Sendung zugewiesen wurde, können sich verbinden." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2235,16 +1926,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "Warnung: Sendungen können nicht erneut verknüpft werden." #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "Beim Verknüpfen von wiederkehrenden Sendungen werden jegliche Medien, die in einer wiederkehrenden Sendung geplant sind, auch in den anderen Sendungen geplant." #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "Die Zeitzone ist standardmäßig auf die Zeitzone der Radiostation eingestellt. Der Im Kalender werden die Sendungen in jener Ortszeit dargestellt, welche in den Benutzereinstellungen für das Interface festgelegt wurde." #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2392,87 +2078,16 @@ msgstr "Heute" msgid "day" msgstr "Tag" -#: airtime_mvc/application/controllers/LocaleController.php:238 -msgid "week" -msgstr "Woche" - -#: airtime_mvc/application/controllers/LocaleController.php:239 -msgid "month" -msgstr "Monat" - -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "Sonntag" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "Montag" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "Dienstag" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "Mittwoch" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "Donnerstag" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "Freitag" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Samstag" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "SO" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "MO" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "DI" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "MI" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "DO" - -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "FR" - -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "SA" +#: airtime_mvc/application/controllers/LocaleController.php:238 +msgid "week" +msgstr "Woche" + +#: airtime_mvc/application/controllers/LocaleController.php:239 +msgid "month" +msgstr "Monat" #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Wenn der Inhalt einer Sendung länger ist als die Sendung im Kalender geplant ist, wird das Ende durch eine nachfolgende Sendung abgeschnitten." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2500,6 +2115,11 @@ msgstr "Gesamten Inhalt entfernen?" msgid "Delete selected item(s)?" msgstr "Gewählte Objekte löschen?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "Beginn" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "Ende" @@ -2533,14 +2153,6 @@ msgstr "Verschiebe 1 Objekt" msgid "Moving %s Items" msgstr "Verschiebe %s Objekte" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "Abbrechen" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "Fade Editor" @@ -2550,8 +2162,7 @@ msgid "Cue Editor" msgstr "Cue Editor" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "Wellenform-Funktionen ist in Browsern möglich, welche die Web Audio API unterstützen" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2578,1333 +2189,1633 @@ msgstr "Springe zu aktuellem Titel" msgid "Cancel current show" msgstr "Aktuelle Sendung abbrechen" -#: airtime_mvc/application/controllers/LocaleController.php:302 -msgid "Open library to add or remove content" -msgstr "Um Inhalte hinzuzufügen oder zu entfernen muß die Bibliothek geöffnet werden" +#: airtime_mvc/application/controllers/LocaleController.php:302 +msgid "Open library to add or remove content" +msgstr "Um Inhalte hinzuzufügen oder zu entfernen muß die Bibliothek geöffnet werden" + +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "Inhalt hinzufügen / entfernen" + +#: airtime_mvc/application/controllers/LocaleController.php:305 +msgid "in use" +msgstr "In Verwendung" + +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "Disk" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "Suchen in" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "Öffnen" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "Gäste können folgendes tun:" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "Kalender betrachten" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "Sendungsinhalt betrachten" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "DJ's können folgendes tun:" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "Verwalten zugewiesener Sendungsinhalte" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "Mediendateien importieren" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "Erstellen von Playlisten, Smart Blöcken und Webstreams" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "Verwalten eigener Bibliotheksinhalte" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "Programm Manager können folgendes tun:" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "Sendungsinhalte betrachten und verwalten" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "Sendungen festlegen" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "Verwalten der gesamten Bibliothek" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "Admins können folgendes tun:" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "Einstellungen verwalten" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "Benutzer verwalten" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "Verwalten überwachter Ordner" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "System Status betrachten" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "Zugriff auf Playout Verlauf" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "Hörerstatistiken betrachten" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "Spalten zeigen / verbergen" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "Von {from} bis {to}" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "kbps" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "yyyy-mm-dd" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" +msgstr "hh:mm:ss.t" + +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" +msgstr "kHz" + +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" +msgstr "So" + +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" +msgstr "Mo" + +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" +msgstr "Di" + +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" +msgstr "Mi" + +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" +msgstr "Do" + +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" +msgstr "Fr" + +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" +msgstr "Sa" + +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Schließen" + +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" +msgstr "Stunde" + +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" +msgstr "Minute" + +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" +msgstr "Fertig" + +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" +msgstr "Dateien wählen" + +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." +msgstr "Fügen sie zum Hochladen Dateien der Warteschlange hinzu und drücken Sie auf Start." + +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "Status" + +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" +msgstr "Dateien hinzufügen" + +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" +msgstr "Hochladen stoppen" + +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" +msgstr "Hochladen starten" + +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" +msgstr "Dateien hinzufügen" + +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" +msgstr "%d/%d Dateien hochgeladen" + +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" +msgstr "Nicht Verfügbar" + +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." +msgstr "Dateien hierher ziehen" + +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." +msgstr "Dateierweiterungsfehler" + +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." +msgstr "Dateigrößenfehler" + +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." +msgstr "Dateianzahlfehler" + +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." +msgstr "Init Fehler" -#: airtime_mvc/application/controllers/LocaleController.php:305 -msgid "in use" -msgstr "In Verwendung" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." +msgstr "HTTP-Fehler" -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" -msgstr "Disk" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." +msgstr "Sicherheitsfehler" -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" -msgstr "Suchen in" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." +msgstr "Allgemeiner Fehler" -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" -msgstr "Öffnen" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." +msgstr "IO-Fehler" -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "Admin" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" +msgstr "Datei: %s" -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "DJ" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" +msgstr "%d Dateien in der Warteschlange" -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "Programm Manager" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" +msgstr "Datei: %f, Größe: %s, Maximale Dateigröße: %m" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "Gast" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" +msgstr "Upload-URL scheint falsch zu sein oder existiert nicht" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" -msgstr "Gäste können folgendes tun:" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " +msgstr "Fehler: Datei zu groß" -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" -msgstr "Kalender betrachten" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " +msgstr "Fehler: Ungültige Dateierweiterung:" -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" -msgstr "Sendungsinhalt betrachten" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "Standard festlegen" -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" -msgstr "DJ's können folgendes tun:" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" +msgstr "Eintrag erstellen" -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" -msgstr "Verwalten zugewiesener Sendungsinhalte" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" +msgstr "Verlaufsprotokoll bearbeiten" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" -msgstr "Mediendateien importieren" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" +msgstr "%s Reihen%s in die Zwischenablage kopiert" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" -msgstr "Erstellen von Playlisten, Smart Blöcken und Webstreams" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." +msgstr "%sPrint view%sBitte verwenden Sie zum Ausdrucken dieser Tabelle die Browser-interne Druckfunktion. Drücken Sie die Escape-Taste nach Fertigstellung." -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" -msgstr "Verwalten eigener Bibliotheksinhalte" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "Sie haben nicht die erforderliche Berechtigung die Quelle zu trennen." -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" -msgstr "Programm Manager können folgendes tun:" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "Mit diesem Eingang ist keine Quelle verbunden." -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" -msgstr "Sendungsinhalte betrachten und verwalten" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "Sie haben nicht die erforderliche Berechtigung die Quelle zu wechseln." -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" -msgstr "Sendungen festlegen" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "Sie betrachten eine ältere Version von %s" -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" -msgstr "Verwalten der gesamten Bibliothek" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "Sie können einem Dynamischen Smart Block keine einzelnen Titel hinzufügen." -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" -msgstr "Admins können folgendes tun:" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%s nicht gefunden" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" -msgstr "Einstellungen verwalten" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "Sie haben zum Löschen der gewählten %s (s) nicht die erforderliche Berechtigung. " -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" -msgstr "Benutzer verwalten" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "Etwas ist falsch gelaufen." -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "Verwalten überwachter Ordner" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "Sie können einem Smart Block nur Titel hinzufügen." -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "Support Feedback senden" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "Unbenannte Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" -msgstr "System Status betrachten" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Unbenannter Smart Block" -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" -msgstr "Zugriff auf Playout Verlauf" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "Unbenannte Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" -msgstr "Hörerstatistiken betrachten" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "Sie haben nicht die erforderliche Berechtigung sich mit dieser Quelle zu verbinden." -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" -msgstr "Spalten zeigen / verbergen" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "Sie haben nicht die erforderliche Berechtigung sich mit dieser Quelle zu verbinden." -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" -msgstr "Von {from} bis {to}" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "Datei existiert nicht in Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" -msgstr "kbps" +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "Datei existiert nicht in Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" -msgstr "yyyy-mm-dd" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "Datei existiert nicht in Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" -msgstr "hh:mm:ss.t" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "Fehlerhafte Anfrage. Kein passender 'Mode'-Parameter." -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" -msgstr "kHz" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "Fehlerhafte Anfrage. 'Mode'-Parameter ist ungültig." -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" -msgstr "So" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "Vorschau" -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" -msgstr "Mo" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "Zu Playlist hinzufügen" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" -msgstr "Di" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "Hinzufügen zu Smart Block" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "Löschen" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" -msgstr "Mi" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "Playlist duplizieren" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" -msgstr "Do" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "Bearbeiten" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" -msgstr "Fr" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" -msgstr "Sa" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "Auf SoundCloud ansehen" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" -msgstr "Stunde" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "Nochmal auf SoundCloud hochladen." -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" -msgstr "Minute" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Auf SoundCloud hochladen " -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" -msgstr "Fertig" +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "Keine Aktion verfügbar" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" -msgstr "Dateien wählen" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "Sie haben nicht die erforderliche Berechtigung die gewählten Objekte zu löschen." -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." -msgstr "Fügen sie zum Hochladen Dateien der Warteschlange hinzu und drücken Sie auf Start." +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "Manche der festgelegten Dateien konnten nicht gelöscht werden." -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" -msgstr "Dateien hinzufügen" +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "Kopie von %s" -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" -msgstr "Hochladen stoppen" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Cursor wählen" -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" -msgstr "Hochladen starten" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "Cursor entfernen" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" -msgstr "Dateien hinzufügen" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "Sendung existiert nicht." -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" -msgstr "%d/%d Dateien hochgeladen" +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." +msgstr "Einstellungen aktualisiert" -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" -msgstr "Nicht Verfügbar" +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." +msgstr "Support-Einstellungen aktualisiert." -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." -msgstr "Dateien hierher ziehen" +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" +msgstr "Support Feedback" -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." -msgstr "Dateierweiterungsfehler" +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." +msgstr "Stream-Einstellungen aktualisiert." -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." -msgstr "Dateigrößenfehler" +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" +msgstr "Pfad muß angegeben werden" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." -msgstr "Dateianzahlfehler" +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." +msgstr "Problem mit Liquidsoap..." -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." -msgstr "Init Fehler" +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "Jetzt" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." -msgstr "HTTP-Fehler" +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "Medien hinzufügen" -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." -msgstr "Sicherheitsfehler" +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Bibliothek" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." -msgstr "Allgemeiner Fehler" +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "Kalender" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." -msgstr "IO-Fehler" +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "System" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" -msgstr "Datei: %s" +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "Einstellungen" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" -msgstr "%d Dateien in der Warteschlange" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "Benutzer" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" -msgstr "Datei: %f, Größe: %s, Maximale Dateigröße: %m" +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Medienverzeichnisse" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" -msgstr "Upload-URL scheint falsch zu sein oder existiert nicht" +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Streams" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " -msgstr "Fehler: Datei zu groß" +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "Hörerstatistiken" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " -msgstr "Fehler: Ungültige Dateierweiterung:" +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "Verlauf" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" -msgstr "Eintrag erstellen" +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "Playout Verlauf" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" -msgstr "Verlaufsprotokoll bearbeiten" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "Verlaufsvorlagen" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" -msgstr "%s Reihen%s in die Zwischenablage kopiert" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "Hilfe" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." -msgstr "%sPrint view%sBitte verwenden Sie zum Ausdrucken dieser Tabelle die Browser-interne Druckfunktion. Drücken Sie die Escape-Taste nach Fertigstellung." +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "Kurzanleitung" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "Bitte geben sie Benutzername und Passwort ein" +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "Benutzerhandbuch" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "Falscher Benutzername oder falsches Passwort eingegeben. Bitte versuchen sie es erneut." +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "Ãœber" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "E-Mail konnte nicht gesendet werden. Ãœberprüfen sie die Einstellungen des Mail-Servers und versichern sie sich, daß dieser richtig konfiguriert ist." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "Dienst" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "Vorgegebene E-Mail-Adresse konnte nicht gefunden werden." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "Betriebszeit" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." -msgstr "Einstellungen aktualisiert" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "CPU" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." -msgstr "Support-Einstellungen aktualisiert." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "Speicher" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" -msgstr "Support Feedback" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Airtime Version" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." -msgstr "Stream-Einstellungen aktualisiert." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "Speicherplatz" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" -msgstr "Pfad muß angegeben werden" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "E-Mail- / Mail-Server-Einstellungen" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." -msgstr "Problem mit Liquidsoap..." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "SoundCloud Einstellungen" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Cursor wählen" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Wiederholungstage:" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "Cursor entfernen" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "Entfernen" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "Sendung existiert nicht." +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "Hinzufügen" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Unbenannter Webstream" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "Verbindung URL:" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Webstream gespeichert" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "Stream-Eingang Einstellungen" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "Ungültiger Eingabewert" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "Master-Quelle Verbindungs-URL:" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "Sie betrachten eine ältere Version von %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "Ãœbersteuern" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "Sie können einem Dynamischen Smart Block keine einzelnen Titel hinzufügen." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "OK" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "Sie haben zum Löschen der gewählten %s (s) nicht die erforderliche Berechtigung. " +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "RESET" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "Sie können einem Smart Block nur Titel hinzufügen." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "Show-Quelle Verbindungs-URL:" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "Unbenannte Playlist" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(Erforderlich)" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Unbenannter Smart Block" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "Airtime registrieren" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "Unbenannte Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Helfen sie Airtime, indem sie uns erzählen, wie sie damit arbeiten. Diese Informationen werden regelmäßig gesammelt, um die Erfahrungswerte der Benutzer zu fördern.%sDrücken Sie auf 'Ja, Airtime helfen' und wir versichern, die von ihnen verwendeten Features laufend zu verbessern." -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "Seite nicht gefunden" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "Mit Aktivierung des unteren Kästchens werben sie für ihre Radiostation auf %sSourcefabric.org%s. Dazu muss die Option 'Support Feedback senden' aktiviert sein. Diese Daten werden zusätzlich zum Support Feedback gesammelt." -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Anwendungsfehler" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(Ausschließlich zu Kontrollzwecken, wird nicht veröffentlicht)" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "Benutzer erfolgreich hinzugefügt!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Erinnerung: Sind Dateien größer als 600x600 Pixel, wird die Größe geändert." -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "Benutzer erfolgreich aktualisiert!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Zeige mir was ich sende" -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "Einstellungen erfolgreich aktualisiert!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "Geschäftsbedingungen und Rahmenverhältnisse" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "Das Jahr %s muß innerhalb des Bereichs von 1753 - 9999 liegen." +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "Passwort zurücksetzen" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s ist kein gültiges Datum" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Verzeichnis wählen" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s-%s-%s ist kein gültiger Zeitpunkt." +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "Wählen" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "Unbenannte Sendung" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "Aktuelles Import-Verzeichnis:" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "Import Verzeichnis:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "" +"Ãœberwachte Verzeichnisse nochmals durchsuchen\n" +"(Dies könnte nützlich sein, wenn Airtime beim Synchronisieren mit Netzlaufwerken Schwierigkeiten hat)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "Ãœberwachte Verzeichnisse:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "Ãœberwachten Ordner entfernen" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "Kein gültiges Verzeichnis" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "Sie überwachen keine Medienverzeichnisse." -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Benutzername:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "Stream" -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "Passwort:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "Erweiterte Optionen" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "Passwort bestätigen:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "Die Hörer werden folgende Information auf dem Display ihres Medien-Players sehen:" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "Vorname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(Webseite ihrer Radiostation)" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "Nachname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "Stream URL:" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "E-Mail:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "Filter Verlauf" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Mobiltelefon:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "Sendungen suchen" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "Nach Sendung filtern:" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "%s's Einstellungen" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "Benutzertyp:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Helfen sie Airtime, indem sie uns erzählen, wie sie damit arbeiten. Diese Informationen werden regelmäßig gesammelt, um die Erfahrungswerte der Benutzer zu fördern.%sDrücken Sie auf 'Ja, Airtime helfen' und wir versichern, die von ihnen verwendeten Features laufend zu verbessern." -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "Benutzername ist nicht einmalig." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "Mit Aktivierung des unteren Kästchens werben sie für ihre Radiostation auf %sSourcefabric.org%s. Dazu muss die Option 'Support Feedback senden' aktiviert sein. Diese Daten werden zusätzlich zum Support Feedback gesammelt." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "Automatisch abschalten" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(Um ihre Radiostation bewerben zu können, muß 'Support Feedback senden' aktiviert sein)" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "Automatisch einschalten" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Sourcefabric Datenschutzrichtlinie" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "Ãœbergang beim Umschalten (Fade in Sekunden)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "Folge wählen" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "Eingabe der Zeit in Sekunden 00{.000000}" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "Finden" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "Master Benutzername" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Tag wählen:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "Master Passwort" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Smart Block Optionen" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "Master-Quelle Adresse (URL)" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "oder" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "Show-Quelle Adresse (URL)" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "and" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "Master-Quelle Port" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr " bis " -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "Es sind nur Zahlen erlaubt" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "Dateien entsprechen den Kriterien" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "Master-Quelle Mount Point" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "entspricht den Kriterien" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Ungültiges Zeichen eingeben" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "Erstelle Dateiübersichtsvorlage" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Show-Quelle Port" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "Erstelle Protokollvorlage" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "Show-Quelle Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "Weitere Elemente hinzufügen" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "Sie können nicht denselben Port wie für die Master-Quelle verwenden." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "Neues Feld hinzufügen" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "Port %s ist nicht verfügbar" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "Standardvorlage festlegen" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%value%' ist nicht im Format 'HH:mm'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" +msgstr "Protokollvorlagen" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "Datum/Zeit Start:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "Keine Protokollvorlagen" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "Datum/Zeit Ende:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "Neue Protokollvorlage" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "Dauer:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" +msgstr "Dateiübersichtsvorlagen" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "Zeitzone:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" +msgstr "Keine Dateiübersichtsvorlagen" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "Wiederholungen?" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "Neue Dateiübersichtsvorlage" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "Eine Sendung kann nicht für einen bereits vergangenen Zeitpunkt geplant werden" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "Neu" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "Beginn- & Endzeit einer bereits laufenden Sendung können nicht geändert werden" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "Neue Playlist" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "Die Dauer einer Sendung kann nicht kürzer als 0 Minuten sein." +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "Neuer Smart Block" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "Die Dauer einer Sendung kann nicht 00h 00m sein" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "Neuer Webstream" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "Die Dauer einer Sendung kann nicht länger als 24h sein" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "Beschreibung ansehen / bearbeiten" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" -msgstr "Verknüpfen:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "Stream URL:" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "Wiederholungstyp:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "Standard Dauer:" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "Wöchentlich" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "Kein Webstream" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" -msgstr "jede Zweite Woche" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "Stream Einstellungen" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" -msgstr "jede Dritte Woche" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Globale Einstellungen" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" -msgstr "jede Vierte Woche" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "dB" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "Stream-Ausgabe Einstellungen" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "Monatlich" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "Datei-Import in Bearbeitung..." -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Tage wählen:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "Erweiterte Suchoptionen" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "Wiederholung am:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "Zurück" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "Tag des Monats" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "Abspielen" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "Tag der Woche" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "Pause" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "Zeitpunkt Ende:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "Nächster" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "Kein Enddatum?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "Stopp" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "Enddatum muß nach Startdatum liegen." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "Stumm schalten" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "Bitte Tag zum Wiederholen wählen" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "Laut schalten" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "Wert erforderlich. Feld darf nicht leer sein." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "Maximale Lautstärke" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "Passwort" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "Aktualisierung erforderlich" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "Neues Passwort bestätigen" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "Um diese Datei abspielen zu können muß entweder der Browser oder das %sFlash Plugin%s aktualisiert werden." -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "Passwortbestätigung stimmt nicht mit Passwort überein" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "Dauer:" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Neues Passwort erhalten" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "Samplerate:" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Sendername" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "ISRC Number:" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Telefon:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "Dateipfad:" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "Sender-Webseite:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Web Stream" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "Land:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "Dynamischer Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "Stadt:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "Statischer Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "Sender Beschreibung:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Titel" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Sender Logo:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "Playlist Inhalt:" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "Meine Radio Station auf Sourcefabric.org bewerben" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "Statischer Smart Block Inhalt:" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "Hiermit akzeptiere ich Sourcefabric's %sDatenschutzrichtlinien%s." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "Dynamische Smart Block Kriterien:" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "Sie müssen die Datenschutzrichtlinien akzeptieren." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "Begrenzt auf " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%value%' ist keine gültige E-Mail-Adresse im Standardformat local-part@hostname" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%' wurde nicht im erforderlichen Datumsformat '%format%' eingegeben" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%' ist kürzer als %min% Zeichen lang" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%value%' ist mehr als %max% Zeichen lang" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "Hörerzahl im Zeitraffer" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%' liegt nicht zwischen '%min%' und '%max%'" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Willkommen bei Airtime!" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "Passwörter stimmen nicht überein" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Starten sie hier, um die ersten Schritte für die Automation ihrer Radio Station zu erfahren." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "Aktiviert:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "Beginnen sie damit, Dateien ihrer Bibliothek hinzuzufügen. Verwenden sie dazu die Schaltfläche 'Medien Hinzufügen'. Dateien können auch via Drag'n'Drop hinzugefügt werden." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "Stream Typ:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "Erstellen sie eine Sendung, indem sie in der Menüzeile die Schaltfläche 'Kalender' betätigen und anschließend die Schaltfläche '+ Sendung' wählen. Dies kann eine einmalige oder sich wiederholende Sendung sein. Nur Administratoren und Programm Manager können Sendungen hinzufügen." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "Service Typ:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "" +"Fügen sie Mediendateien einer Show hinzu.\n" +"Öffnen sie dazu die gewünschte Sendung durch einen Links-Klick darauf im Kalender und wählen sie 'Inhalt hinzufügen / entfernen'" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "Kanäle:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Wählen sie Medien vom linken Feld und ziehen sie diese in ihre Sendung im rechten Feld." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "Dann kann es auch schon los gehen!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "Für weitere Hilfe bitte das %sBenutzerhandbuch%s lesen." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Server" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "Teilen" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "Port" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Stream wählen:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "URL" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sAirtime%s %s, die offene Radio Software für Planung und Remote-Station-Management. %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Mount Point" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%sSourcefabric%s o.p.s. Airtime wird vertrieben unter %sGNU GPL v.3%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "Admin Benutzer" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "Neues Passwort" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "Admin Passwort" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "Bitte in den nachstehenden Feldern das neue Passwort eingeben und bestätigen." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "Server darf nicht leer sein." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "Bitte geben sie die E-Mail-Adresse ein, die in ihrem Benutzerkonto eingetragen ist. Sie erhalten einen Link um ein neues Passwort via E-Mail zu erstellen." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "Port darf nicht leer sein." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "E-Mail gesendet" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "Mount darf nicht leer sein, wenn Icecast-Server verwendet wird." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "Ein E-Mail wurder gesendet" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "Hardware Audioausgabe" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "Zurück zum Anmeldungsbildschirm" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "Ausgabetyp" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "" +"Willkommen zur Online Artime Demo!\n" +"Sie können sich mit dem Benutzernamen 'admin' und dem Passwort 'admin' anmelden." -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Icecast Vorbis Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "Vorher:" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "Streambezeichnung:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "Danach:" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "Artist - Titel" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "Stream-Quellen" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Sendung - Interpret - Titel" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "Master Quelle" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Radiostation - Sendung" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "Show Quelle" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "Off Air Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "Planmäßig Abspielen" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "Replay Gain aktivieren" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "ON AIR" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "Replay Gain Modifikator" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "Hören" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "Benutzer suchen:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "Uhrzeit" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "Die Probelaufzeit läuft ab in" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "Aufzeichnen von Line-In?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Kaufen sie eine Kopie von Airtime" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "Wiederholen?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "Mein Konto" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "System E-Mails aktivieren (Passwort Reset)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "Benutzer verwalten" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "Reset Passwort 'From' E-Mail (Absenderbezeichnung)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "Neuer Benutzer" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "Mail-Server konfigurieren" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "ID" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "Authentifizierung erforderlich" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "Vorname" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "Mail-Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "Nachname" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "E-Mail Adresse" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "Benutzertyp" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "Geben sie die Zeichen ein, die im darunter liegenden Bild zu sehen sind." +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "Protokoll" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "Tag muß angegeben werden" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "Dateiübersicht" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "Zeit muß angegeben werden" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "Sendungsübersicht" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "Das Wiederholen einer Sendung ist erst nach einer Stunde Wartezeit möglich." +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Zend Framework Default Application" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Airtime Authentifizierung:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "Seite nicht gefunden!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "Benutzerdefinierte Authentifizierung:" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "Scheinbar existiert die Seite die sie suchen nicht!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "Benutzerdefinierter Benutzername" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "Statischen Block erweitern" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "Benutzerdefiniertes Passwort" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "Dynamischen Block erweitern" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "Das Feld Benutzername darf nicht leer sein." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "Smart Block leer" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "Das Feld Passwort darf nicht leer sein." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "Playlist leer" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "Zeitpunkt Start:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" +msgstr "Playlist leeren" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "Standarddauer Crossfade (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" +msgstr "Leeren" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "Geben sie eine Zeit in Sekunden ein 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Shuffle Playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" -msgstr "Standard Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Playlist speichern" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" -msgstr "Standard Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "Playlist Crossfade" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "Erlaube Remote-Webseiten Zugriff auf \"Kalender\" Info?%s (Aktivierung ermöglicht die Verwendung von Front-End Widgets.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "Fade In:" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "Deaktiviert" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Fade Out:" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "Aktiviert" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "Keine Playlist geöffnet" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "Standardsprache" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" +msgstr "Smart Block leeren" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" -msgstr "Zeitzone Radiostation" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(ss.t)" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "Woche startet mit " +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "Kein Smart Block geöffnet" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" -msgstr "Zeitzone Interface" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" +msgstr "Wellenform anzeigen" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "E-Mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "Cue In:" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "Passwort wiederherstellen" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(hh:mm:ss.t)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "Stunden" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Cue Out:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "Minuten" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "Original Dauer:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "Smart Block Typ festlegen:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "Sendung hinzufügen" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "Statisch" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "Sendung aktualisieren" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "Dynamisch" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "Was" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "Erlaube Wiederholen von Titeln:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "Wann" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "Beschränkt auf " +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "Live-Stream Eingang" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "Playlist-Inhalt erstellen und Kriterien speichern" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "Aufzeichnen & Wiederholen" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "Erstellen" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Wer" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "Shuffle Playlist-Inhalt (Durchmischen)" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Style" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "Beschränkung kann nicht leer oder kleiner als 0 sein." +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "Wiederholung von %s am %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "Beschränkung kann nicht größer als 24 Stunden sein" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Land wählen" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "Der Wert muß eine ganze Zahl sein." +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "Dauer muß länger als 0 Minuten sein." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "Die Anzahl der Objekte ist auf 500 beschränkt." +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "Dauer im Format \"00h 00m\" eingeben." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "Sie müssen Kriterium und Modifikator bestimmen" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "URL im Format \"http://domain\" eingeben." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "Die 'Dauer' muß im Format '00:00:00' eingegeben werden" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "URL darf aus höchstens 512 Zeichen bestehen." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "Der Wert muß im Timestamp-Format eingegeben werden (zB. 0000-00-00 oder 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "Es konnte kein MIME-Typ für den Webstream gefunden werden." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "Der eingegebene Wert muß aus Ziffern bestehen" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "Die Bezeichnung eines Webstreams darf nicht leer sein." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "Der eingegebene Wert muß kleiner sein als 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "XSPF-Playlist konnte nicht aufgeschlüsselt werden." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "Der eingegebene Wert muß aus weniger als %s Zeichen bestehen." +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "PLS-Playlist konnte nicht aufgeschlüsselt werden." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "Wert kann nicht leer sein" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "M3U-Playlist konnte nicht aufgeschlüsselt werden." -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Sendung:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "Ungültiger Webstream - Die eingegebene URL scheint ein Dateidownload zu sein." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "Alle meine Sendungen:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "Unbekannter Stream-Typ: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "ISRC Nummer:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s wird bereits überwacht." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "Automatisches Hochladen aufgezeichneter Sendungen" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s enthält andere bereits überwachte Verzeichnisse: %s " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "Aktiviere SoundCloud Upload" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s ist ein Unterverzeichnis eines bereits überwachten Verzeichnisses: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "Markiere Dateien auf SoundCloud automatisch als \"herunterladbar\"" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s ist kein gültiges Verzeichnis." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "SoundCloud E-Mail" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s ist bereits als aktuelles Speicherverzeichnis bestimmt oder in der Liste überwachter Verzeichnisse." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "SoundCloud Passwort" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s ist bereits als aktuelles Speicherverzeichnis bestimmt oder in der Liste überwachter Verzeichnisse." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "SoundCloud Tags: (mehrere Tags durch Leertaste trennen)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s existiert nicht in der Liste überwachter Verzeichnisse." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "Standard Genre:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "Objekte aus einer verknüpften Sendung können nicht verschoben werden." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "Standard Titel Typ:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "Der Kalender den sie sehen ist nicht mehr aktuell! (Kalender falsch eingepasst)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "Original" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "Der Kalender den sie sehen ist nicht mehr aktuell! (Objekt falsch eingepasst)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "Der Kalender den sie sehen ist nicht mehr aktuell." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "Live" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "Sie haben nicht die erforderliche Berechtigung einen Termin für die Sendung %s zu festzulegen." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "Aufzeichnung" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "Einer Sendungsaufzeichnung können keine Dateien hinzugefügt werden." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "Talk" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "Die Sendung %s ist beendet und kann daher nicht festgelegt werden." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "Die Sendung %s wurde bereits aktualisiert." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "Eine verknüpfte Sendung kann nicht befüllt werden, während eine ihrer Instanzen ausgestrahlt wird." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "In Bearbeitung" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "Eine der gewählten Dateien existiert nicht!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "Eindämmen" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "Cue In und Cue Out sind Null." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "Loop" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "Cue In darf nicht größer als Cue Out sein." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Sound Effekt" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "Cue In darf nicht größer als die Gesamtdauer der Datei sein." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "One-Shot-Sample" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "Cue Out darf nicht kleiner als Cue In sein." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Sonstige" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "Die Datei konnte nicht hochgeladen werden. Es sind %s MB Speicherplatz frei und die Datei, die sie hochladen wollen, hat eine Größe von %s MB." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "Standard Lizenz:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "Die Maximaldauer einer Sendung beträgt 24 Stunden." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "Das Werk ist in der öffentlichen Domäne" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"Sendungen können nicht überlappend geplant werden.\n" +"Beachte: Wird die Dauer einer wiederkehrenden Sendung verändert, wirkt sich das auch auf alle Wiederholungen aus." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "Alle Rechte vorbehalten" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Hallo %s,\n" +"\n" +"Klicke auf diesen Link um dein Passwort zurückzusetzen:" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "Creative Commons Zuordnung" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Airtime Passwort Reset" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "Creative Commons Zuordnung Noncommercial" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "Aufeichnung existiert nicht" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "Creative Commons Zuordnung No Derivative Works" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "Metadaten der aufgezeichneten Datei ansehen" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "Creative Commons Zuordnung Share Alike" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Sendungsinhalt" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "Creative Commons Zuordnung Noncommercial Non Derivate Works" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "Gesamten Inhalt entfernen" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "Creative Commons Zuordnung Noncommercial Share Alike" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "Aktuelle Sendung abbrechen" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "Hintergrundfarbe:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "Diese Folge bearbeiten" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "Textfarbe:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "Sendung bearbeiten" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "Jetzt" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "Lösche diese Folge" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "Medien hinzufügen" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "Lösche diese Folge und alle Nachfolgenden" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Bibliothek" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "Zugriff verweigert" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "Kalender" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "Wiederkehrende Sendungen können nicht per Drag'n'Drop verschoben werden." -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "System" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "Eine in der Vergangenheit liegende Sendung kann nicht verschoben werden." -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "Benutzer" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "Eine Sendung kann nicht in die Vergangenheit verschoben werden." -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Medienverzeichnisse" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "Eine aufgezeichnete Sendung kann nicht verschoben werden, wenn der Zeitpunkt der Wiederholung weniger als eine Stunde bevor liegt." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Streams" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "Die Sendung wurde gelöscht, weil die aufgezeichnete Sendung nicht existiert." -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "Hörerstatistiken" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "Das Wiederholen einer Sendung ist erst nach einer Stunde Wartezeit möglich." -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" -msgstr "Verlauf" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" +msgstr "Titel" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "Playout Verlauf" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "Abgespielt" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "Verlaufsvorlagen" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "Das Jahr %s muß innerhalb des Bereichs von 1753 - 9999 liegen." -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "Kurzanleitung" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s ist kein gültiges Datum" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "Benutzerhandbuch" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s-%s-%s ist kein gültiger Zeitpunkt." #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3913,3 +3824,18 @@ msgstr "Bitte eine Option wählen" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "Keine Aufzeichnungen" + +#~ msgid "can't resize a past show" +#~ msgstr "Die Dauer einer vergangenen Sendung kann nicht verändert werden." + +#~ msgid "Should not overlap shows" +#~ msgstr "Sendungen sollten nicht überlappen." + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "Fehler beim Erstellen des Ordners 'organize'" + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "Die Datei scheint fehlerhaft zu sein und wird der Bibliothek nicht hinzugefügt." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "Die Datei konnte nicht hochgeladen werden. Dieser Fehler kann auftreten, wenn die Festplatte des Computers nicht genug Speicherplatz frei hat oder sie keine Schreibberechtigung für den Ordner 'stor' haben." diff --git a/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po b/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po index 368321c48a..849999873d 100644 --- a/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po @@ -1,7 +1,7 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # danielhjames , 2014 # hoerich , 2014 @@ -10,28 +10,16 @@ msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-02-12 10:53+0000\n" "Last-Translator: danielhjames \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/airtime/language/de_DE/)\n" +"Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: de_DE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime Copyright ©Sourcefabric o.p.s. Alle Rechte vorbehalten.%sGepflegt und vertrieben unter GNU GPL v.3 von %sSourcefabric o.p.s%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "Live Stream" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -52,9 +40,9 @@ msgid "Stop" msgstr "Stop" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Cue In" @@ -63,9 +51,9 @@ msgid "Set Cue In" msgstr "Set Cue In" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Cue Out" @@ -87,1620 +75,1418 @@ msgstr "Fade In" msgid "Fade Out" msgstr "Fade Out" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "Titel" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime Copyright ©Sourcefabric o.p.s. Alle Rechte vorbehalten.%sGepflegt und vertrieben unter GNU GPL v.3 von %sSourcefabric o.p.s%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "Interpret" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "Live Stream" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "Aktiviert:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "Länge" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "Stream Typ:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Genre" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Bitrate:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "Stimmung" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "Service Typ:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "Label" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "Kanäle:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "Komponist" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Mono" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Stereo" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "Copyright" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Server" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Jahr" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Ungültiges Zeichen eingegeben" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "Titel" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "Port" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "Dirigent" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "Es sind nur Zahlen erlaubt" -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "Sprache" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "Passwort" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "Startzeit" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Genre" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "Endzeit" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "URL" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "Abgespielt" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "Name" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "Aufzeichnung existiert nicht" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "Beschreibung" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "Metadaten der aufgezeichneten Datei anzeigen" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Mount Point" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "Auf SoundCloud ansehen" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Benutzername" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Auf SoundCloud hochladen" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "Admin Benutzer" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "Erneut auf SoundCloud hochladen" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "Admin Passwort" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Sendungsinhalt" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Erhalte Information vom Server..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "Inhalt hinzufügen / entfernen" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "Server darf nicht leer sein." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "Gesamten Inhalt entfernen" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "Port darf nicht leer sein." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "Aktuelle Sendung abbrechen" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "Mount darf nicht leer sein, wenn Icecast-Server verwendet wird." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "Diese Folge bearbeiten" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "Titel:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "Ändern" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "Interpret:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "Sendung ändern" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Album:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "Löschen" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Titel-Nr.:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "Diese Folge löschen" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Genre:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "Diese Folge und alle folgenden löschen" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Jahr:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "Zugriff verweigert" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "Label:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "Wiederkehrende Sendungen können nicht per Drag'n'Drop verschoben werden." +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "Komponist:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "Eine in der Vergangenheit liegende Sendung kann nicht verschoben werden." +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "Dirigent:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "Eine Sendung kann nicht in die Vergangenheit verschoben werden." +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "Stimmung:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "Sendungen können nicht überlappend geplant werden." +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "Eine aufgezeichnete Sendung kann nicht verschoben werden, wenn der Zeitpunkt der Wiederholung weniger als eine Stunde bevor liegt." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "Copyright:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "Die Sendung wurde gelöscht, weil die aufgezeichnete Sendung nicht existiert!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "ISRC-Nr.:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "Das Wiederholen einer Sendung ist erst nach einer Stunde Wartezeit möglich." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "Webseite:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "Einstellungen" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "Sprache:" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Speichern" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "Medienverzeichnisse verwalten" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "Abbrechen" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "Stream Einstellungen" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Benutzername:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Globale Einstellungen" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "Passwort:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "dB" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "Passwort bestätigen:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "Stream-Ausgabe Einstellungen" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "Vorname:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Ordner wählen" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "Nachname:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "Festlegen" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "E-Mail:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "Aktueller Import Ordner:" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Mobiltelefon:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "Hinzufüg." +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "Ãœberwachte Verzeichnisse nochmals durchsuchen\n(Dies könnte nützlich sein, wenn Airtime beim Synchronisieren mit Netzlaufwerken Schwierigkeiten hat)" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "Ãœberwachten Ordner entfernen" +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "Benutzertyp:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "Sie überwachen keine Medienordner." +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "Gast" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "Airtime registrieren" +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "DJ" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Helfen sie Airtime, indem sie uns wissen lassen, wie sie es verwenden. Diese Informationen werden regelmäßig gesammelt, um Ihre Nutzererfahrung zu verbessern.%sDrücken sie auf 'Ja, Airtime helfen' und wir versichern, die von ihnen verwendeten Features laufend zu verbessern. " +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "Programm Manager" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "Mit Aktivierung des unteren Kästchens werben sie für ihre Radiostation auf %sSourcefabric.org%s. Dazu muss die Option 'Support Feedback senden' aktiviert sein. Diese Daten werden zusätzlich zum Support Feedback gesammelt." +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "Admin" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(Erforderlich)" +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "Benutzername ist bereits vorhanden." -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(Ausschließlich zu Kontrollzwecken, wird nicht veröffentlicht)" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "Hintergrundfarbe:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Hinweis: Grafiken, die größer als 600x600 sind, werden verkleinert." +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "Textfarbe:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Zeige mir was ich sende " +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "Zeitpunkt Beginn:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "Allgemeine Geschäftsbedingungen" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "Zeitpunkt Ende:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "Suche Sendungen" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Sendung:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "Filter nach Sendung:" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "Alle meine Sendungen:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "Passwort zurücksetzen" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "Tage" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Smart Block Optionen" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "Tag muß angegeben werden" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "oder" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "Zeit muß angegeben werden" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "und" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "Das Wiederholen einer Sendung ist erst nach einer Stunde Wartezeit möglich." -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr " bis " +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "Import Verzeichnis:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "Dateien entsprechen den Kriterien" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "Ãœberwachte Verzeichnisse:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "entspricht den Kriterien" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "Kein gültiges Verzeichnis" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "Verbindung URL:" +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "Suche Benutzer:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Helfen sie Airtime, indem sie uns erzählen, wie sie damit arbeiten. Diese Informationen werden regelmäßig gesammelt, um die Erfahrungswerte der Benutzer zu fördern.%sAktivieren sie die Option 'Support Feedback senden' und wir versichern, die von ihnen verwendeten Funktionen laufend zu verbessern." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "DJs:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "Mit Aktivierung des unteren Kästchens werben sie für ihre Radiostation auf %sSourcefabric.org%s. Dazu muss die Option 'Support Feedback senden' aktiviert sein. Diese Daten werden zusätzlich zum Support Feedback gesammelt." +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "Anmeldung" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(Um ihre Radiostation bewerben zu können, muß 'Support Feedback senden' aktiviert sein)" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "Geben sie die Zeichen aus dem Bild unten ein." -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Sourcefabric Datenschutzrichtlinie" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Sendername" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "Einstellungen Input Stream" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "Standard Crossfade Dauer (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "Master Source URL Verbindung:" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "Geben sie eine Zeit in Sekunden ein 0{.0}" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "Ãœberschreiben" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "Standard Fade In (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "Standard Fade Out (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "ZURÃœCKSETZEN" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "Anderen Webseiten den Zugriff auf \"Kalender\" Info?%s erlauben. (Aktivieren Sie diese Option, damit Frontend-Widgets funktionieren.)" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "Show Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "Deaktiviert" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Tage wählen:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "Aktiviert" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "Entfernen" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "Standardsprache" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Wiederholen Tage:" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" +msgstr "Sendestation Zeitzone" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "E-Mail / Mail-Server-Einstellungen" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "Woche beginnt am" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "SoundCloud Einstellungen" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "Sonntag" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "%s's Einstellungen" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "Montag" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" -msgstr "Folge wählen" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "Dienstag" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "Keine Sendung" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "Mittwoch" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "Finden" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "Donnerstag" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "Stream " +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "Freitag" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "Erweiterte Optionen" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "Die folgenden Informationen werden den Zuhörern in ihren Playern angezeigt:" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(Webseite Ihres Radiosenders)" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Samstag" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "Stream URL: " +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "Verknüpfen:" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "Filter Verlauf" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "Wiederholungstyp:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Willkommen bei Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "wöchentlich" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Starten sie hier, um die ersten Schritte für die Automation ihrer Radio Station zu erfahren." +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "jede zweite Woche" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "Beginnen sie damit, Dateien ihrer Bibliothek hinzuzufügen. Verwenden sie dazu die Schaltfläche 'Medien Hinzufügen'. Dateien können auch via Drag'n'Drop hinzugefügt werden." +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "jede dritte Woche" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "Erstellen sie eine Sendung, indem sie die Schaltfläche 'Kalender' betätigen und anschließend auf die Schaltfläche '+ Sendung' klicken. Dies kann eine einmalige oder sich wiederholende Sendung sein. Nur Administratoren und Programm Manager können Sendungen hinzufügen." +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "jede vierte Woche" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "Fügen sie Mediendateien einer Show hinzu.\nÖffnen sie dazu die gewünschte Sendung durch einen Links-Klick im Kalender und wählen sie 'Inhalt hinzufügen / entfernen'" +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "monatlich" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Wählen sie Medien vom linken Feld und ziehen sie es in ihre Sendung im rechten Feld." +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Tage wählen:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "Dann kann es auch schon los gehen!" +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "So." -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "Für weitere ausführliche Hilfe, lesen sie bitte das %sBenutzerhandbuch%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "Mo." -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "Ãœber" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "Di." -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sAirtime%s %s, die Open Source Radio Software für Programplanung und Remote Radioverwaltung. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "Mi." -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%sSourcefabric%s o.p.s. Airtime wird vertrieben unter %s GNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "Do." -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "Teilen" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "Fr." -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Stream wählen:" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "Sa." -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "Stummschalten" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "Wiederholung von:" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "Lautschalten" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "Tag des Monats" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "Anmeldung" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "Tag der Woche" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Willkommen zur Online Artime Demo!\nSie können sich mit dem Benutzernamen 'admin' und dem Passwort 'admin' anmelden." +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "Kein Enddatum?" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "Bitte geben sie die E-Mail-Adresse ein, die in ihrem Benutzerkonto eingetragen ist. sie erhalten einen Link um ein neues Passwort via E-Mail zu erstellen." +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "Enddatum muß nach dem Startdatum liegen" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "E-Mail gesendet" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "Bitte einen Tag zum Wiederholen wählen" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "Ein E-Mail wurder gesendet" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "Neues Passwort bestätigen" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "Zurück zum Anmeldebildschirm" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "Passwortbestätigung stimmt nicht mit Passwort überein." -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "Neues Passwort" +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Neues Passwort erhalten" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "Bitte geben sie Ihr neues Passwort ein und bestätigen es im folgenden Feld." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr " - Kriterien - " -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "Ihre Testperiode endet in" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Album" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "Tage" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Bit Rate (Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Kaufen sie eine Kopie von Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "Mein Konto" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "Komponist" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "Zuvor:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "Dirigent" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "Danach:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "Copyright" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "Source Streams" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "Interpret" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "Master Source" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Encoded By" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "Show Source" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "geplante Wiederg." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "Label" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "ON AIR" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "Sprache" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "Anhören" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "geändert am" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "Sender Zeit" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "Zuletzt gespielt" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Schließen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "Länge" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "Sendung hinzufügen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Mime" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "Sendung aktualisieren" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "Stimmung" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "Was" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "Besitzer" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "Wann" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "Replay Gain" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "Live Stream Input" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "Sample Rate (kHz)" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "Aufnahme & Wiederholung" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "Titel" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Wer" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "Titelnummer" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Farbe" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "Hochgeladen" -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "Beginn" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "Webseite" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "Dienst" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Jahr" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "Status" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr " - Attribut - " -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "Betriebszeit" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "enthält" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "CPU" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "enthält nicht" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "Speicher" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "ist" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Airtime Version" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "ist nicht" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "Speicherplatz" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "beginnt mit" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "Datei-Import in Bearbeitung..." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "endet mit" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "Erweiterte Suchoptionen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "ist größer als" -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "Hörerzahlen im Zeitraum" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "ist kleiner als" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "Neu" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "ist im Bereich" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "Neue Playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "Stunden" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "Neuer Smart Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "Minuten" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "Neuer Webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "Titel" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "Beschreibung ansehen/ändern" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "Smart Block Typ:" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "Beschreibung" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "Statisch" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "Stream URL:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "Dynamisch" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "Standard Dauer:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "Titel wiederholen:" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "Kein Webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "Beschränke auf" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "Playlist leeren" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "Playlist-Inhalt erstellen und Kriterien speichern" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "Leeren" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "Erstellen" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Playlist mischen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "Inhalt der Playlist Mischen" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 #: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 msgid "Shuffle" msgstr "Mischen" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Playlist speichern" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "Playlist Crossfade" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "Fade In: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Fade Out: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "Keine Playlist geöffnet" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "Wellenform anzeigen" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "Leerer Smart Block Inhalt" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "Kein Smart Block geöffnet" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "Cue In: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(hh:mm:ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Cue Out: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "Originallänge:" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "Statischen Block erweitern" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "Dynamischen Block erweitern" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "Smart Block leeren" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "Playlist leeren" - -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Zend Framework Default Application" - -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "Seite nicht gefunden!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "Scheinbar existiert die Seite die sie suchen nicht!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "Beschränkung kann nicht leer oder kleiner als 0 sein" -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "Hilfe" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "Beschränkung kann nicht größer als 24 Stunden sein" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "zurück" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "Der Wert muß eine ganze Zahl sein" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "Wiedergabe" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "Die Anzahl der Objekte ist auf 500 beschränkt" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "Pause" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "Sie müssen Kriterium und Modifikator bestimmen" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "weiter" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "Die 'Dauer' muß im Format '00:00:00' eingegeben werden" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "Stop" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "Der Wert muß im Timestamp-Format eingegeben werden (zB. 0000-00-00 oder 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "Maximale Lautstärke" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "Der eingegebene Wert muß aus Ziffern bestehen" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "Update erforderlich" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "Der eingegebene Wert muß kleiner sein als 2147483648" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 #, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "Um die Medien zu spielen, müssen sie entweder Ihren Browser oder Ihr %s Flash-Plugin %s aktualisieren." - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "Erstelle Dateiübersichtsvorlage" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "Erstelle Protokollvorlage" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "Name" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "Weitere Elemente hinzufügen" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "Neues Feld hinzufügen" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "Standardvorlage wählen" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "Protokollvorlagen" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "Keine Protokollvorlagen" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "Standard festlegen" +msgid "The value should be less than %s characters" +msgstr "Der eingegebene Wert muß aus weniger als %s Zeichen bestehen." -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "Neue Protokollvorlage" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "Der Wert darf nicht leer sein" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "Dateiübersichtsvorlagen" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "Automatisch abschalten" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "Keine Dateiübersichtsvorlagen" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "Automatisch anschalten" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "Neue Dateiübersichtsvorlage" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "Ãœbergang beim Umschalten (Fade in Sekunden)" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "Benutzer verwalten" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "Eingabe der Zeit in Sekunden 00{.000000}" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "Neuer Benutzer" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "Master Benutzername" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "ID" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "Master Passwort" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Benutzername" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "Master Source Connection-URL" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "Vorname" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "Show Source Connection URL" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "Nachname" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "Master Source Port" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "Benutzertyp" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "Master Source Mount Point" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "Titel:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Show Source Port" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "Interpret:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "Show Source Mount Point" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Album:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "Sie können nicht denselben Port als \"Master Source Port\" nutzen." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Titel-Nr.:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "Port %s ist nicht verfügbar" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "Länge:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Telefon:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "Samplerate:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "Sender-Webseite:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Bitrate:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "Land:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "Stimmung:" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "Stadt:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Genre:" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "Sender Beschreibung:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Jahr:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Sender Logo:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "Label:" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "Support Feedback senden" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "Sender auf Sourcefabric.org veröffentlichen" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "Komponist:" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "Hiermit akzeptiere ich die %sDatenschutzrichtlinien%s von Sourcefabric." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "Dirigent:" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "Sie müssen die Datenschutzrichtlinien akzeptieren." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "Copyright:" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "Wert ist erforderlich und darf nicht leer sein" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "ISRC-Nr.:" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "Startzeit" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "Webseite:" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "Endzeit" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "Sprache:" +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "Keine Sendung" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "Dateipfad:" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "Aufzeichnen von Line-In?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "Name:" +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "Wiederholen?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "Beschreibung:" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Verwende Airtime-Login:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Web Stream" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "Benutzerdefiniertes Login:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "Dynamischer Smart Block" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "Benutzerdefinierter Benutzername" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "Statischer Smart Block" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "Benutzerdefiniertes Passwort" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Titel-Nr." +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "Das Feld Benutzername darf nicht leer sein." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "Playlist Inhalt: " +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "Das Feld Passwort darf nicht leer sein." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "Statischer Smart Block Inhalt: " +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "E-Mail" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "Dynamische Smart Block Kriterien: " +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "Passwort wiederherstellen" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "Beschränken auf " +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "Hardware Audioausgabe" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "URL:" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "Ausgabetyp" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "Protokoll" +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Icecast Vorbis Metadata" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "Dateiübersicht" +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "Streambezeichnung:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "Sendungsübersicht" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "Artist - Titel" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "Die Maximaldauer einer Sendung beträgt 24 Stunden." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Sendung - Artist - Titel" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "Datum/Uhrzeit des Endes darf nicht in der Vergangenheit liegen" +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Sender - Sendung" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "Sendungen können nicht überlappend geplant werden.\nBeachte: Wird die Dauer einer wiederkehrenden Sendung verändert, wirkt sich das auch auf alle Wiederholungen aus." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "Off Air Metadaten" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "Die Länge einer vergangenen Sendung kann nicht verändert werden." +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "Replay Gain aktivieren" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "Sendungen sollten nicht überlappen" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "Replay Gain Modifikator" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Land wählen" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%value%' ist keine gültige E-Mail-Adresse im Format local-part@hostname" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s wird bereits überwacht." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%' entspricht nicht dem erforderlichen Datumsformat '%format%'" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s enthält andere bereits überwachte Verzeichnisse: %s " +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%' ist kürzer als %min% Zeichen lang" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s ist ein Unterverzeichnis eines bereits überwachten Verzeichnisses: %s" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%value%' ist mehr als %max% Zeichen lang" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s ist kein gültiges Verzeichnis." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%' liegt nicht zwischen '%min%' und '%max%'" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s ist bereits als aktuelles Speicherverzeichnis bestimmt oder in der Liste überwachter Verzeichnisse" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "Passwörter stimmen nicht überein" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s ist bereits als aktuelles Speicherverzeichnis bestimmt oder in der Liste überwachter Verzeichnisse." +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%value%' ist nicht im Format 'HH:mm'" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s existiert nicht in der Liste überwachter Verzeichnisse." +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "Datum/Zeit Beginn:" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "Titel" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "Datum/Uhrzeit Ende:" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "Cue In und Cue Out sind Null." +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "Dauer:" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "Cue In darf nicht größer als die Gesamtlänge der Datei sein." +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "Zeitzone:" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "Cue In darf nicht größer als Cue Out sein." +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "Wiederholungen?" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "Cue Out darf nicht kleiner als Cue In sein." +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "Es kann keine Sendung für einen vergangenen Zeitpunkt geplant werden" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr " - Kriterien - " +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "Startdatum/Zeit können nicht geändert werden, wenn die Sendung bereits begonnen hat." -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Bit Rate (Kbps)" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "Datum/Uhrzeit des Endes darf nicht in der Vergangenheit liegen" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "Die Dauer einer Sendung kann nicht kürzer als 0 Minuten sein." -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Encoded By" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "Die Dauer einer Sendung kann nicht 00h 00m sein" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "geändert am" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "Die Dauer einer Sendung kann nicht länger als 24h sein" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "Zuletzt gespielt" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "Sendungen können nicht überlappend geplant werden." -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Mime" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "Name:" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "Besitzer" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "Unbenannte Sendung" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "Replay Gain" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "URL:" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "Sample Rate (kHz)" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "Beschreibung:" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "Titelnummer" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "Automatisches Hochladen aufgezeichneter Sendungen" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "Hochgeladen" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "Aktiviere SoundCloud Upload" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "Webseite" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "Markiere Dateien auf SoundCloud automatisch als \"herunterladbar\"" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr " - Attribut - " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "SoundCloud E-Mail" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "enthält" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "SoundCloud Passwort" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "enthält nicht" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "SoundCloud Tags: (mehrere Tags mit Leerzeichen trennen)" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "ist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "Standard Genre:" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "ist nicht" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "Standard Titel Typ:" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "beginnt mit" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "Original" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "endet mit" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "Remix" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "ist größer als" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "Live" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "ist kleiner als" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "Aufnahme" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "ist im Bereich" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "Talk" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "Dauer muß länger als 0 Minuten sein." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "Podcast" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "Dauer im Format \"00h 00m\" eingeben." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Demo" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "URL im Format \"http://domain\" eingeben." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "In Bearbeitung" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "URL darf aus höchstens 512 Zeichen bestehen." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "Stem" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "Es konnte kein MIME-Typ für den Webstream gefunden werden." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "Loop" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "Die Bezeichnung eines Webstreams darf nicht leer sein." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Sound Effekt" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "Die XSPF Playlist konnte nicht eingelesen werden" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "One Shot Sample" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "Die PLS Playlist konnte nicht eingelesen werden" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Sonstige" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "Die M3U Playlist konnte nicht eingelesen werden" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "Standard Lizenz:" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "Ungültiger Webstream - Die eingegebene URL scheint ein Dateidownload zu sein." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "Die Rechte an dieser Arbeit sind gemeinfrei" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "Unbekannter Stream-Typ: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "Alle Rechte vorbehalten" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Hallo %s , \n\nKlicke auf diesen Link um dein Passwort zurückzusetzen: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "[CC-BY] Creative Commons Namensnennung" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Airtime Passwort zurücksetzen" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "[CC-BY-NC] Creative Commons Namensnennung, keine kommerzielle Nutzung" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "Wiederholung der Sendung %s von %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "[CC-BY-ND] Creative Commons Namensnennung, keine Bearbeitung" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "Inhalte aus verknüpften Sendungen können nicht verschoben werden" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "[CC-BY-SA] Creative Commons Namensnennung, Weitergabe unter gleichen Bedingungen" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "Der Kalender den sie sehen ist nicht mehr aktuell!(Kalender falsch zugeordnet)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "[CC-BY-NC-ND] Creative Commons Namensnennung, keine kommerzielle Nutzung, keine Bearbeitung" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "Der Kalender den sie sehen ist nicht mehr aktuell! (Instanz falsch zugeordnet)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "[CC-BY-NC-SA] Creative Commons Namensnennung, keine kommerzielle Nutzung, Weitergabe unter gleichen Bedingungen" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "Der Kalender den sie sehen ist nicht mehr aktuell!" +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "Interface Zeitzone:" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "Sie haben nicht die erforderliche Berechtigung einen Termin für die Sendung %s zu festzulegen." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "System E-Mails aktivieren (ermöglicht Passwort zurücksetzen)" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "Einer Sendungsaufzeichnung können keine Dateien hinzugefügt werden." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "'Von' Email (Passwort zurücksetzen Absender)" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "Die Sendung %s ist beendet und kann daher nicht verändert werden." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "Mailserver konfigurieren" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "Die Sendung %s wurde bereits aktualisiert!" +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "Erfordert Authentifizierung" + +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "Mail Server" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "Inhalte in verknüpften Sendungen können nicht während der Sendung geändert werden" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "E-Mail Adresse" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "Eine der gewählten Dateien existiert nicht!" +#: airtime_mvc/application/controllers/ListenerstatController.php:56 +msgid "Please make sure admin user/password is correct on System->Streams page." +msgstr "Bitte prüfen sie, ob der Admin Nutzer/Password unter System->Stream korrekt eingetragen ist." -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "Fehler beim Erstellen des Ordners 'organize'" +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Unbenannter Webstream" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "Die Datei konnte nicht hochgeladen werden. Es sind %s MB Speicherplatz frei und die Datei, die sie hochladen wollen, hat eine Größe von %s MB." +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Webstream gespeichert." -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "Die Datei scheint fehlerhaft zu sein und wird der Bibliothek nicht hinzugefügt." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "Ungültige Formularwerte." -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "Die Datei konnte nicht hochgeladen werden. Dieser Fehler kann auftreten, wenn die Festplatte des Computers nicht über genügend freien Speicherplatz verfügt oder das Ablageverzeichnis 'stor' keine Schreibrechte hat." +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "Bitte geben sie Benutzernamen und Passwort ein" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "Sie haben nicht die erforderliche Berechtigung, das Eingangssignal zu trennen." +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "Falscher Benutzername oder Passwort. Bitte versuchen sie es erneut." -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "Mit diesem Eingang ist kein Signal verbunden." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "E-Mail konnte nicht gesendet werden. Ãœberprüfen sie die Einstellungen des E-Mail-Servers und vergwissern sie sich, dass dieser richtig konfiguriert wurde." -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "Sie haben nicht die erforderliche Berechtigung, das Signal umzuschalten." +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "Angegebene E-Mail-Adresse konnte nicht gefunden." #: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format @@ -1712,95 +1498,25 @@ msgstr "Wiederholung der Sendung %s vom %s um %s" msgid "Download" msgstr "Download" -#: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." -msgstr "Bitte prüfen sie, ob der Admin Nutzer/Password unter System->Stream korrekt eingetragen ist." - -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "Sie sind nicht berechtigt, auf diese Resource zuzugreifen" - -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "Sie sind nicht berechtigt, auf diese Resource zuzugreifen. " - -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "Datei existiert nicht in Airtime." - -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "Datei existiert nicht in Airtime" - -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "Datei existiert nicht in Airtime." - -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "Fehlerhafte Anfrage. Es wurde kein 'mode' Parameter übergeben." - -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "Fehlerhafte Anfrage. 'Mode' Parameter ist ungültig" - -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 -#, php-format -msgid "%s not found" -msgstr "%s nicht gefunden" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "Etwas ist falsch gelaufen." - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "Vorschau" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "Zur Playlist hinzufügen" - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "Zum Smart Block hinzufügen" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "Metadaten ändern" - -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "Duplizierte Playlist" - -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "Benutzer erfolgreich hinzugefügt!" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "Keine Aktion verfügbar" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "Benutzer erfolgreich aktualisiert!" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "Sie haben nicht die erforderliche Berechtigung die gewählten Objekte zu löschen." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "Einstellungen erfolgreich aktualisiert!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "Einige im Programmplan enthaltene Dateien konnten nicht gelöscht werden." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "Seite nicht gefunden" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "Kopie von %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Anwendungsfehler" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1876,6 +1592,11 @@ msgstr "Sie können einer Playlist nur Titel, Smart Blocks und Webstreams hinzuf msgid "Please select a cursor position on timeline." msgstr "Bitte wählen sie eine Cursor-Position auf der Zeitleiste." +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "Metadaten ändern" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "Zur ausgewählten Sendungen hinzufügen" @@ -1922,6 +1643,7 @@ msgstr "wird geladen..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "Alle" @@ -1992,9 +1714,7 @@ msgstr "Der Wert muß in folgendem Format eingegeben werden: hh:mm:ss.t" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "Sie laden momentan Dateien hoch. %s Beim wechseln der Seite wird der Upload-Vorgang abgebrochen. %s Sind sie sicher, dass sie die Seite verlassen wollen?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2030,11 +1750,10 @@ msgid "Playlist shuffled" msgstr "Playliste gemischt" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." -msgstr "Airtime kann den Status dieser Datei nicht bestimmen.\nDas kann passieren, wenn die Datei auf einem nicht erreichbaren Netzlaufwerk liegt oder in einem Verzeichnis liegt, das nicht mehr überwacht wird." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." +msgstr "" +"Airtime kann den Status dieser Datei nicht bestimmen.\n" +"Das kann passieren, wenn die Datei auf einem nicht erreichbaren Netzlaufwerk liegt oder in einem Verzeichnis liegt, das nicht mehr überwacht wird." #: airtime_mvc/application/controllers/LocaleController.php:124 #, php-format @@ -2059,24 +1778,19 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "Ein Bild muß jpg, jpeg, png, oder gif sein" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." -msgstr "Ein Statischer Smart Block speichert die Kriterien und erstellt den Block sofort.\nDadurch kann der Inhalt in der Bibliothek eingesehen und verändert werden bevor der Smart Block einer Sendung hinzugefügt wird." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." +msgstr "" +"Ein Statischer Smart Block speichert die Kriterien und erstellt den Block sofort.\n" +"Dadurch kann der Inhalt in der Bibliothek eingesehen und verändert werden bevor der Smart Block einer Sendung hinzugefügt wird." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." -msgstr "Ein Dynamischer Smart Block speichert nur die Kriterien.\nDabei wird der Inhalt erst erstellt, wenn der Smart Block einer Sendung hinzugefügt wird. Der Inhalt des Smart Blocks kann daher nicht in der Bibliothek angezeigt oder bearbeitetet werden." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." +msgstr "" +"Ein Dynamischer Smart Block speichert nur die Kriterien.\n" +"Dabei wird der Inhalt erst erstellt, wenn der Smart Block einer Sendung hinzugefügt wird. Der Inhalt des Smart Blocks kann daher nicht in der Bibliothek angezeigt oder bearbeitetet werden." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "Wenn Airtime nicht genug einzigartige Titel findet, die Ihren Kriterien entsprechen, kann die gewünschte Länge des Smart Blocks nicht erreicht werden. Wenn sie möchten, dass Titel mehrfach zum Smart Block hinzugefügt werden können, aktivieren sie diese Option." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2107,7 +1821,14 @@ msgstr "Wähle zu überwachendes Verzeichnis" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "Sind sie sicher, dass sie den Speicher-Verzeichnis ändern wollen?\nDieser Vorgang entfernt alle Dateien der Airtime-Bibliothek!" +msgstr "" +"Sind sie sicher, dass sie den Speicher-Verzeichnis ändern wollen?\n" +"Dieser Vorgang entfernt alle Dateien der Airtime-Bibliothek!" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "Medienverzeichnisse verwalten" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2119,9 +1840,7 @@ msgstr "Dieser Pfad ist derzeit nicht erreichbar." #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "Manche Stream-Typen erfordern zusätzliche Konfiguration. Details zum Aktivieren von %sAAC+ Support%s oder %sOpus Support%s sind in der WIKI bereitgestellt." #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2132,23 +1851,15 @@ msgstr "Mit dem Streaming-Server verbunden" msgid "The stream is disabled" msgstr "Der Stream ist deaktiviert" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Erhalte Information vom Server..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "Verbindung mit Streaming-Server kann nicht hergestellt werden." #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." -msgstr "Falls sich Airtime hinter einem Router oder einer Firewall befindet, müssen sie gegebenenfalls eine Portweiterleitung konfigurieren. \nIn diesem Fall müssen sie die URL manuell eintragen, damit Ihren DJs der richtige Host/Port/Mount zur verbindung anzeigt wird. Der erlaubte Port-Bereich liegt zwischen 1024 und 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." +msgstr "" +"Falls sich Airtime hinter einem Router oder einer Firewall befindet, müssen sie gegebenenfalls eine Portweiterleitung konfigurieren. \n" +"In diesem Fall müssen sie die URL manuell eintragen, damit Ihren DJs der richtige Host/Port/Mount zur verbindung anzeigt wird. Der erlaubte Port-Bereich liegt zwischen 1024 und 49151." #: airtime_mvc/application/controllers/LocaleController.php:167 #, php-format @@ -2156,61 +1867,41 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "Für weitere Information lesen sie bitte das %sAirtime Benutzerhandbuch%s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." -msgstr "Diese Option aktiviert Metadaten für Ogg-Streams.\n(Stream-Metadaten wie Titel, Interpret und Sendungsname können von Audioplayern angezeigt werden.)\nVLC und mplayer haben ernsthafte Probleme beim Abspielen von Ogg/Vorbis-Streams mit aktivierten Metadaten: Beide Anwendungen werden die Verbindung zum Stream nach jedem Titel verlieren. Sollten sie einen Ogg-Stream verwenden und ihre Hörer keine Unterstützung für diese Audioplayer erwarten, können sie diese Option aktivieren." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." +msgstr "" +"Diese Option aktiviert Metadaten für Ogg-Streams.\n" +"(Stream-Metadaten wie Titel, Interpret und Sendungsname können von Audioplayern angezeigt werden.)\n" +"VLC und mplayer haben ernsthafte Probleme beim Abspielen von Ogg/Vorbis-Streams mit aktivierten Metadaten: Beide Anwendungen werden die Verbindung zum Stream nach jedem Titel verlieren. Sollten sie einen Ogg-Stream verwenden und ihre Hörer keine Unterstützung für diese Audioplayer erwarten, können sie diese Option aktivieren." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "Aktivieren sie dieses Kästchen, um die Master/Show-Source bei Unterbrechung der Leitung automatisch abzuschalten." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "Aktivieren sie dieses Kästchen, um automatisch bei Verbindung einer Streameingabe umzuschalten." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "Wenn Ihr Icecast Server den Benutzernamen 'source' erwartet, kann dieses Feld leer bleiben." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "Wenn Ihr Live-Streaming-Client nicht nach einem Benutzernamen fragt, sollten Sie hier 'source' eintragen." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." -msgstr "Wenn sie den Benutzernamen oder das Passwort für einen aktivierten Stream ändern, wird die Playout Engine neu gestartet und Ihre Zuhörer werden für 5-10 Sekunden Stille hören. \nWenn sie die folgenden Felder ändern, gibt es KEINEN Neustart: Stream Label (Allgemeine Einstellungen) und Master Ãœbergang beim Umschalten (Fade in Sekunden), Master Benutzername Passwort (Input Stream Einstellungen). Wenn Airtime aufnimmt und wenn die Änderung eine Playout Engine Neustart bewirkt, wird die Aufnahme unterbrochen." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." +msgstr "" +"Wenn sie den Benutzernamen oder das Passwort für einen aktivierten Stream ändern, wird die Playout Engine neu gestartet und Ihre Zuhörer werden für 5-10 Sekunden Stille hören. \n" +"Wenn sie die folgenden Felder ändern, gibt es KEINEN Neustart: Stream Label (Allgemeine Einstellungen) und Master Ãœbergang beim Umschalten (Fade in Sekunden), Master Benutzername Passwort (Input Stream Einstellungen). Wenn Airtime aufnimmt und wenn die Änderung eine Playout Engine Neustart bewirkt, wird die Aufnahme unterbrochen." #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "Admin Benutzer und Passwort, wird zur Abfrage der Zuhörerdaten in Icecast/SHOUTcast verwendet." #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2218,9 +1909,7 @@ msgid "No result found" msgstr "Kein Ergebnis gefunden" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "Diese Einstellung folgt den gleichen Sicherheitsvorlagen für Sendung: Nur Benutzer denen diese Sendung zugewiesen wurde, können sich verbinden." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2236,16 +1925,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "Warnung: Verknüpfte Sendungen können nicht erneut verknüpft werden" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "Beim Verknüpfen von wiederkehrenden Sendungen werden jegliche Medien, die in einer wiederkehrenden Sendung geplant sind, auch in den anderen Sendungen geplant." #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "Die Zeitzone ist standardmäßig auf die Zeitzone der Radiostation eingestellt. Der Im Kalender werden die Sendungen in jener Ortszeit dargestellt, welche in den Benutzereinstellungen für das Interface festgelegt wurde." #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2393,87 +2077,16 @@ msgstr "heute" msgid "day" msgstr "Tag" -#: airtime_mvc/application/controllers/LocaleController.php:238 -msgid "week" -msgstr "Woche" - -#: airtime_mvc/application/controllers/LocaleController.php:239 -msgid "month" -msgstr "Monat" - -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "Sonntag" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "Montag" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "Dienstag" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "Mittwoch" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "Donnerstag" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "Freitag" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Samstag" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "So." - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "Mo." - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "Di." - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "Mi." - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "Do." - -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "Fr." - -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "Sa." +#: airtime_mvc/application/controllers/LocaleController.php:238 +msgid "week" +msgstr "Woche" + +#: airtime_mvc/application/controllers/LocaleController.php:239 +msgid "month" +msgstr "Monat" #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Wenn der Inhalt einer Sendung länger ist als im Kalender festgelegt ist, wird das Ende durch eine nachfolgende Sendung abgschnitten." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2501,6 +2114,11 @@ msgstr "Gesamten Inhalt entfernen?" msgid "Delete selected item(s)?" msgstr "Gewählte Objekte löschen?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "Beginn" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "Ende" @@ -2534,14 +2152,6 @@ msgstr "Verschiebe 1 Objekt" msgid "Moving %s Items" msgstr "Verschiebe %s Objekte" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "Abbrechen" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "Fade Editor" @@ -2551,8 +2161,7 @@ msgid "Cue Editor" msgstr "Cue Editor" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "Wellenform-Funktionen ist nur in Browsern möglich, welche die Web Audio API unterstützen" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2579,1333 +2188,1633 @@ msgstr "Springe zu aktuellem Titel" msgid "Cancel current show" msgstr "Aktuelle Sendung abbrechen" -#: airtime_mvc/application/controllers/LocaleController.php:302 -msgid "Open library to add or remove content" -msgstr "Um Inhalte hinzuzufügen oder zu entfernen muß die Bibliothek geöffnet werden" +#: airtime_mvc/application/controllers/LocaleController.php:302 +msgid "Open library to add or remove content" +msgstr "Um Inhalte hinzuzufügen oder zu entfernen muß die Bibliothek geöffnet werden" + +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "Inhalt hinzufügen / entfernen" + +#: airtime_mvc/application/controllers/LocaleController.php:305 +msgid "in use" +msgstr "In Verwendung" + +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "Disk" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "Suchen in" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "Öffnen" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "Gäste können folgendes tun:" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "Kalender betrachten" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "Sendungsinhalt betrachten" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "DJs können folgendes tun:" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "Verwalten zugewiesener Sendungsinhalte" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "Mediendateien importieren" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "Erstellen von Playlisten, Smart Blöcken und Webstreams" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "Verwalten eigener Bibliotheksinhalte" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "Programm Manager können folgendes tun:" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "Sendungsinhalte betrachten und verwalten" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "Sendungen festlegen" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "Verwalten der gesamten Bibliothek" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "Admins können folgendes tun:" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "Einstellungen verwalten" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "Benutzer verwalten" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "Verwalten überwachter Verzeichnisse" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "System Status betrachten" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "Zugriff auf Playlist Verlauf" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "Hörerstatistiken betrachten" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "Spalten auswählen" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "Von {from} bis {to}" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "kbps" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "yyyy-mm-dd" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" +msgstr "hh:mm:ss.t" + +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" +msgstr "kHz" + +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" +msgstr "So" + +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" +msgstr "Mo" + +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" +msgstr "Di" + +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" +msgstr "Mi" + +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" +msgstr "Do" + +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" +msgstr "Fr" + +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" +msgstr "Sa" + +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Schließen" + +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" +msgstr "Stunde" + +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" +msgstr "Minute" + +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" +msgstr "Fertig" + +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" +msgstr "Dateien auswählen" + +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." +msgstr "Dateien zur Uploadliste hinzufügen und den Startbutton klicken." + +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "Status" + +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" +msgstr "Dateien hinzufügen" + +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" +msgstr "Upload stoppen" + +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" +msgstr "Upload starten" + +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" +msgstr "Dateien hinzufügen" + +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" +msgstr "%d/%d Dateien hochgeladen" + +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" +msgstr "N/A" + +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." +msgstr "Dateien in dieses Feld ziehen.(Drag & Drop)" + +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." +msgstr "Fehler in der Dateierweiterung." + +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." +msgstr "Fehler in der Dateigröße." + +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." +msgstr "Fehler in der Dateianzahl" + +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." +msgstr "Init Fehler." -#: airtime_mvc/application/controllers/LocaleController.php:305 -msgid "in use" -msgstr "In Verwendung" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." +msgstr "HTTP Fehler." -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" -msgstr "Disk" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." +msgstr "Sicherheitsfehler." -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" -msgstr "Suchen in" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." +msgstr "Allgemeiner Fehler." -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" -msgstr "Öffnen" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." +msgstr "IO Fehler." -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "Admin" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" +msgstr "Datei: %s" -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "DJ" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" +msgstr "%d Dateien in der Warteschlange" -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "Programm Manager" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" +msgstr "Datei: %f, Größe: %s, Maximale Dateigröße: %m" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "Gast" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" +msgstr "Upload-URL scheint falsch zu sein oder existiert nicht" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" -msgstr "Gäste können folgendes tun:" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " +msgstr "Fehler: Datei zu groß: " -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" -msgstr "Kalender betrachten" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " +msgstr "Fehler: ungültige Dateierweiterung: " -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" -msgstr "Sendungsinhalt betrachten" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "Standard festlegen" -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" -msgstr "DJs können folgendes tun:" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" +msgstr "Eintrag erstellen" -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" -msgstr "Verwalten zugewiesener Sendungsinhalte" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" +msgstr "Verlaufsprotokoll bearbeiten" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" -msgstr "Mediendateien importieren" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" +msgstr "%s Reihen%s in die Zwischenablage kopiert" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" -msgstr "Erstellen von Playlisten, Smart Blöcken und Webstreams" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." +msgstr "%sDruckansicht%sBenutzen sie bitte die Druckfunktion des Browsers, um diese Tabelle auszudrucken. Wenn sie fertig sind, drücken sie die Escape-Taste." -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" -msgstr "Verwalten eigener Bibliotheksinhalte" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "Sie haben nicht die erforderliche Berechtigung, das Eingangssignal zu trennen." -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" -msgstr "Programm Manager können folgendes tun:" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "Mit diesem Eingang ist kein Signal verbunden." -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" -msgstr "Sendungsinhalte betrachten und verwalten" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "Sie haben nicht die erforderliche Berechtigung, das Signal umzuschalten." -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" -msgstr "Sendungen festlegen" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "Sie betrachten eine ältere Version von %s" -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" -msgstr "Verwalten der gesamten Bibliothek" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "Sie können einem Dynamischen Smart Block keine Titel hinzufügen." -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" -msgstr "Admins können folgendes tun:" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%s nicht gefunden" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" -msgstr "Einstellungen verwalten" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "Sie haben zum Löschen der gewählten %s (s) nicht die erforderliche Berechtigung." -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" -msgstr "Benutzer verwalten" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "Etwas ist falsch gelaufen." -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "Verwalten überwachter Verzeichnisse" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "Sie können einem Smart Block nur Titel hinzufügen." -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "Support Feedback senden" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "Unbenannte Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" -msgstr "System Status betrachten" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Unbenannter Smart Block" -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" -msgstr "Zugriff auf Playlist Verlauf" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "Unbekannte Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" -msgstr "Hörerstatistiken betrachten" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "Sie sind nicht berechtigt, auf diese Resource zuzugreifen" -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" -msgstr "Spalten auswählen" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "Sie sind nicht berechtigt, auf diese Resource zuzugreifen. " -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" -msgstr "Von {from} bis {to}" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "Datei existiert nicht in Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" -msgstr "kbps" +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "Datei existiert nicht in Airtime" -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" -msgstr "yyyy-mm-dd" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "Datei existiert nicht in Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" -msgstr "hh:mm:ss.t" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "Fehlerhafte Anfrage. Es wurde kein 'mode' Parameter übergeben." -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" -msgstr "kHz" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "Fehlerhafte Anfrage. 'Mode' Parameter ist ungültig" -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" -msgstr "So" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "Vorschau" -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" -msgstr "Mo" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "Zur Playlist hinzufügen" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" -msgstr "Di" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "Zum Smart Block hinzufügen" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "Löschen" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" -msgstr "Mi" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "Duplizierte Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" -msgstr "Do" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "Ändern" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" -msgstr "Fr" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "Soundcloud" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" -msgstr "Sa" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "Auf SoundCloud ansehen" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" -msgstr "Stunde" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "Erneut auf SoundCloud hochladen" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" -msgstr "Minute" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Auf SoundCloud hochladen" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" -msgstr "Fertig" +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "Keine Aktion verfügbar" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" -msgstr "Dateien auswählen" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "Sie haben nicht die erforderliche Berechtigung die gewählten Objekte zu löschen." -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." -msgstr "Dateien zur Uploadliste hinzufügen und den Startbutton klicken." +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "Einige im Programmplan enthaltene Dateien konnten nicht gelöscht werden." -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" -msgstr "Dateien hinzufügen" +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "Kopie von %s" -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" -msgstr "Upload stoppen" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Cursor wählen" -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" -msgstr "Upload starten" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "Cursor entfernen" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" -msgstr "Dateien hinzufügen" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "Sendung existiert nicht" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" -msgstr "%d/%d Dateien hochgeladen" +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." +msgstr "Einstellungen aktualisiert." -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" -msgstr "N/A" +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." +msgstr "Support-Einstellungen aktualisiert." -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." -msgstr "Dateien in dieses Feld ziehen.(Drag & Drop)" +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" +msgstr "Support Feedback" -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." -msgstr "Fehler in der Dateierweiterung." +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." +msgstr "Stream-Einstellungen aktualisiert." -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." -msgstr "Fehler in der Dateigröße." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" +msgstr "Pfad muß angegeben werden" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." -msgstr "Fehler in der Dateianzahl" +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." +msgstr "Problem mit Liquidsoap ..." -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." -msgstr "Init Fehler." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "Jetzt" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." -msgstr "HTTP Fehler." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "Medien hinzufügen" -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." -msgstr "Sicherheitsfehler." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Bibliothek" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." -msgstr "Allgemeiner Fehler." +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "Kalender" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." -msgstr "IO Fehler." +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "System" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" -msgstr "Datei: %s" +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "Einstellungen" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" -msgstr "%d Dateien in der Warteschlange" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "Benutzer" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" -msgstr "Datei: %f, Größe: %s, Maximale Dateigröße: %m" +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Medienordner" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" -msgstr "Upload-URL scheint falsch zu sein oder existiert nicht" +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Streams" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " -msgstr "Fehler: Datei zu groß: " +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "Hörerstatistiken" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " -msgstr "Fehler: ungültige Dateierweiterung: " +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "Verlauf" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" -msgstr "Eintrag erstellen" +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "Playout Verlauf" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" -msgstr "Verlaufsprotokoll bearbeiten" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "Verlaufsvorlagen" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" -msgstr "%s Reihen%s in die Zwischenablage kopiert" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "Hilfe" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." -msgstr "%sDruckansicht%sBenutzen sie bitte die Druckfunktion des Browsers, um diese Tabelle auszudrucken. Wenn sie fertig sind, drücken sie die Escape-Taste." +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "Kurzanleitung" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "Bitte geben sie Benutzernamen und Passwort ein" +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "Benutzerhandbuch" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "Falscher Benutzername oder Passwort. Bitte versuchen sie es erneut." +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "Ãœber" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "E-Mail konnte nicht gesendet werden. Ãœberprüfen sie die Einstellungen des E-Mail-Servers und vergwissern sie sich, dass dieser richtig konfiguriert wurde." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "Dienst" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "Angegebene E-Mail-Adresse konnte nicht gefunden." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "Betriebszeit" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." -msgstr "Einstellungen aktualisiert." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "CPU" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." -msgstr "Support-Einstellungen aktualisiert." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "Speicher" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" -msgstr "Support Feedback" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Airtime Version" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." -msgstr "Stream-Einstellungen aktualisiert." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "Speicherplatz" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" -msgstr "Pfad muß angegeben werden" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "E-Mail / Mail-Server-Einstellungen" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." -msgstr "Problem mit Liquidsoap ..." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "SoundCloud Einstellungen" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Cursor wählen" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Wiederholen Tage:" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "Cursor entfernen" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "Entfernen" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "Sendung existiert nicht" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "Hinzufüg." -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Unbenannter Webstream" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "Verbindung URL:" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Webstream gespeichert." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "Einstellungen Input Stream" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "Ungültige Formularwerte." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "Master Source URL Verbindung:" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "Sie betrachten eine ältere Version von %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "Ãœberschreiben" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "Sie können einem Dynamischen Smart Block keine Titel hinzufügen." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "OK" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "Sie haben zum Löschen der gewählten %s (s) nicht die erforderliche Berechtigung." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "ZURÃœCKSETZEN" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "Sie können einem Smart Block nur Titel hinzufügen." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "Show Source Connection URL:" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "Unbenannte Playlist" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(Erforderlich)" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Unbenannter Smart Block" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "Airtime registrieren" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "Unbekannte Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Helfen sie Airtime, indem sie uns wissen lassen, wie sie es verwenden. Diese Informationen werden regelmäßig gesammelt, um Ihre Nutzererfahrung zu verbessern.%sDrücken sie auf 'Ja, Airtime helfen' und wir versichern, die von ihnen verwendeten Features laufend zu verbessern. " -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "Seite nicht gefunden" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "Mit Aktivierung des unteren Kästchens werben sie für ihre Radiostation auf %sSourcefabric.org%s. Dazu muss die Option 'Support Feedback senden' aktiviert sein. Diese Daten werden zusätzlich zum Support Feedback gesammelt." -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Anwendungsfehler" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(Ausschließlich zu Kontrollzwecken, wird nicht veröffentlicht)" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "Benutzer erfolgreich hinzugefügt!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Hinweis: Grafiken, die größer als 600x600 sind, werden verkleinert." -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "Benutzer erfolgreich aktualisiert!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Zeige mir was ich sende " -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "Einstellungen erfolgreich aktualisiert!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "Allgemeine Geschäftsbedingungen" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "Das Jahr %s muß im Bereich zwischen 1753 und 9999 sein" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "Passwort zurücksetzen" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s ist kein gültiges Datum" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Ordner wählen" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s-%s-%s ist kein gültiger Zeitpunkt." +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "Festlegen" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "Unbenannte Sendung" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "Aktueller Import Ordner:" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "Import Verzeichnis:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "" +"Ãœberwachte Verzeichnisse nochmals durchsuchen\n" +"(Dies könnte nützlich sein, wenn Airtime beim Synchronisieren mit Netzlaufwerken Schwierigkeiten hat)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "Ãœberwachte Verzeichnisse:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "Ãœberwachten Ordner entfernen" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "Kein gültiges Verzeichnis" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "Sie überwachen keine Medienordner." -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Benutzername:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "Stream " -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "Passwort:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "Erweiterte Optionen" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "Passwort bestätigen:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "Die folgenden Informationen werden den Zuhörern in ihren Playern angezeigt:" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "Vorname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(Webseite Ihres Radiosenders)" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "Nachname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "Stream URL: " -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "E-Mail:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "Filter Verlauf" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Mobiltelefon:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "Suche Sendungen" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "Filter nach Sendung:" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "%s's Einstellungen" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "Benutzertyp:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Helfen sie Airtime, indem sie uns erzählen, wie sie damit arbeiten. Diese Informationen werden regelmäßig gesammelt, um die Erfahrungswerte der Benutzer zu fördern.%sAktivieren sie die Option 'Support Feedback senden' und wir versichern, die von ihnen verwendeten Funktionen laufend zu verbessern." -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "Benutzername ist bereits vorhanden." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "Mit Aktivierung des unteren Kästchens werben sie für ihre Radiostation auf %sSourcefabric.org%s. Dazu muss die Option 'Support Feedback senden' aktiviert sein. Diese Daten werden zusätzlich zum Support Feedback gesammelt." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "Automatisch abschalten" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(Um ihre Radiostation bewerben zu können, muß 'Support Feedback senden' aktiviert sein)" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "Automatisch anschalten" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Sourcefabric Datenschutzrichtlinie" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "Ãœbergang beim Umschalten (Fade in Sekunden)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "Folge wählen" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "Eingabe der Zeit in Sekunden 00{.000000}" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "Finden" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "Master Benutzername" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Tage wählen:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "Master Passwort" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Smart Block Optionen" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "Master Source Connection-URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "oder" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "Show Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "und" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "Master Source Port" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr " bis " -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "Es sind nur Zahlen erlaubt" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "Dateien entsprechen den Kriterien" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "Master Source Mount Point" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "entspricht den Kriterien" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Ungültiges Zeichen eingegeben" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "Erstelle Dateiübersichtsvorlage" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Show Source Port" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "Erstelle Protokollvorlage" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "Show Source Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "Weitere Elemente hinzufügen" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "Sie können nicht denselben Port als \"Master Source Port\" nutzen." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "Neues Feld hinzufügen" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "Port %s ist nicht verfügbar" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "Standardvorlage wählen" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%value%' ist nicht im Format 'HH:mm'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" +msgstr "Protokollvorlagen" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "Datum/Zeit Beginn:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "Keine Protokollvorlagen" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "Datum/Uhrzeit Ende:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "Neue Protokollvorlage" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "Dauer:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" +msgstr "Dateiübersichtsvorlagen" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "Zeitzone:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" +msgstr "Keine Dateiübersichtsvorlagen" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "Wiederholungen?" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "Neue Dateiübersichtsvorlage" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "Es kann keine Sendung für einen vergangenen Zeitpunkt geplant werden" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "Neu" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "Startdatum/Zeit können nicht geändert werden, wenn die Sendung bereits begonnen hat." +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "Neue Playlist" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "Die Dauer einer Sendung kann nicht kürzer als 0 Minuten sein." +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "Neuer Smart Block" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "Die Dauer einer Sendung kann nicht 00h 00m sein" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "Neuer Webstream" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "Die Dauer einer Sendung kann nicht länger als 24h sein" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "Beschreibung ansehen/ändern" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" -msgstr "Verknüpfen:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "Stream URL:" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "Wiederholungstyp:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "Standard Dauer:" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "wöchentlich" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "Kein Webstream" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" -msgstr "jede zweite Woche" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "Stream Einstellungen" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" -msgstr "jede dritte Woche" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Globale Einstellungen" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" -msgstr "jede vierte Woche" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "dB" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "Stream-Ausgabe Einstellungen" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "monatlich" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "Datei-Import in Bearbeitung..." -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Tage wählen:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "Erweiterte Suchoptionen" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "Wiederholung von:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "zurück" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "Tag des Monats" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "Wiedergabe" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "Tag der Woche" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "Pause" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "Zeitpunkt Ende:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "weiter" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "Kein Enddatum?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "Stop" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "Enddatum muß nach dem Startdatum liegen" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "Stummschalten" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "Bitte einen Tag zum Wiederholen wählen" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "Lautschalten" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "Wert ist erforderlich und darf nicht leer sein" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "Maximale Lautstärke" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "Passwort" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "Update erforderlich" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "Neues Passwort bestätigen" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "Um die Medien zu spielen, müssen sie entweder Ihren Browser oder Ihr %s Flash-Plugin %s aktualisieren." -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "Passwortbestätigung stimmt nicht mit Passwort überein." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "Länge:" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Neues Passwort erhalten" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "Samplerate:" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Sendername" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "ISRC-Nr.:" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Telefon:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "Dateipfad:" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "Sender-Webseite:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Web Stream" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "Land:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "Dynamischer Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "Stadt:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "Statischer Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "Sender Beschreibung:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Titel-Nr." -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Sender Logo:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "Playlist Inhalt: " -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "Sender auf Sourcefabric.org veröffentlichen" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "Statischer Smart Block Inhalt: " -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "Hiermit akzeptiere ich die %sDatenschutzrichtlinien%s von Sourcefabric." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "Dynamische Smart Block Kriterien: " -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "Sie müssen die Datenschutzrichtlinien akzeptieren." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "Beschränken auf " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%value%' ist keine gültige E-Mail-Adresse im Format local-part@hostname" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%' entspricht nicht dem erforderlichen Datumsformat '%format%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%' ist kürzer als %min% Zeichen lang" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%value%' ist mehr als %max% Zeichen lang" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "Hörerzahlen im Zeitraum" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%' liegt nicht zwischen '%min%' und '%max%'" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Willkommen bei Airtime!" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "Passwörter stimmen nicht überein" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Starten sie hier, um die ersten Schritte für die Automation ihrer Radio Station zu erfahren." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "Aktiviert:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "Beginnen sie damit, Dateien ihrer Bibliothek hinzuzufügen. Verwenden sie dazu die Schaltfläche 'Medien Hinzufügen'. Dateien können auch via Drag'n'Drop hinzugefügt werden." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "Stream Typ:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "Erstellen sie eine Sendung, indem sie die Schaltfläche 'Kalender' betätigen und anschließend auf die Schaltfläche '+ Sendung' klicken. Dies kann eine einmalige oder sich wiederholende Sendung sein. Nur Administratoren und Programm Manager können Sendungen hinzufügen." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "Service Typ:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "" +"Fügen sie Mediendateien einer Show hinzu.\n" +"Öffnen sie dazu die gewünschte Sendung durch einen Links-Klick im Kalender und wählen sie 'Inhalt hinzufügen / entfernen'" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "Kanäle:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Wählen sie Medien vom linken Feld und ziehen sie es in ihre Sendung im rechten Feld." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "Dann kann es auch schon los gehen!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "Für weitere ausführliche Hilfe, lesen sie bitte das %sBenutzerhandbuch%s." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Server" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "Teilen" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "Port" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Stream wählen:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "URL" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sAirtime%s %s, die Open Source Radio Software für Programplanung und Remote Radioverwaltung. %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Mount Point" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%sSourcefabric%s o.p.s. Airtime wird vertrieben unter %s GNU GPL v.3%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "Admin Benutzer" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "Neues Passwort" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "Admin Passwort" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "Bitte geben sie Ihr neues Passwort ein und bestätigen es im folgenden Feld." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "Server darf nicht leer sein." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "Bitte geben sie die E-Mail-Adresse ein, die in ihrem Benutzerkonto eingetragen ist. sie erhalten einen Link um ein neues Passwort via E-Mail zu erstellen." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "Port darf nicht leer sein." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "E-Mail gesendet" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "Mount darf nicht leer sein, wenn Icecast-Server verwendet wird." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "Ein E-Mail wurder gesendet" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "Hardware Audioausgabe" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "Zurück zum Anmeldebildschirm" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "Ausgabetyp" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "" +"Willkommen zur Online Artime Demo!\n" +"Sie können sich mit dem Benutzernamen 'admin' und dem Passwort 'admin' anmelden." -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Icecast Vorbis Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "Zuvor:" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "Streambezeichnung:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "Danach:" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "Artist - Titel" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "Source Streams" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Sendung - Artist - Titel" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "Master Source" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Sender - Sendung" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "Show Source" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "Off Air Metadaten" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "geplante Wiederg." -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "Replay Gain aktivieren" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "ON AIR" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "Replay Gain Modifikator" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "Anhören" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "Suche Benutzer:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "Sender Zeit" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "Ihre Testperiode endet in" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "Aufzeichnen von Line-In?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Kaufen sie eine Kopie von Airtime" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "Wiederholen?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "Mein Konto" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "System E-Mails aktivieren (ermöglicht Passwort zurücksetzen)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "Benutzer verwalten" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "'Von' Email (Passwort zurücksetzen Absender)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "Neuer Benutzer" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "Mailserver konfigurieren" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "ID" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "Erfordert Authentifizierung" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "Vorname" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "Nachname" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "E-Mail Adresse" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "Benutzertyp" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "Geben sie die Zeichen aus dem Bild unten ein." +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "Protokoll" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "Tag muß angegeben werden" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "Dateiübersicht" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "Zeit muß angegeben werden" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "Sendungsübersicht" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "Das Wiederholen einer Sendung ist erst nach einer Stunde Wartezeit möglich." +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Zend Framework Default Application" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Verwende Airtime-Login:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "Seite nicht gefunden!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "Benutzerdefiniertes Login:" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "Scheinbar existiert die Seite die sie suchen nicht!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "Benutzerdefinierter Benutzername" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "Statischen Block erweitern" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "Benutzerdefiniertes Passwort" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "Dynamischen Block erweitern" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "Das Feld Benutzername darf nicht leer sein." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "Smart Block leeren" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "Das Feld Passwort darf nicht leer sein." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "Playlist leeren" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "Zeitpunkt Beginn:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" +msgstr "Playlist leeren" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "Standard Crossfade Dauer (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" +msgstr "Leeren" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "Geben sie eine Zeit in Sekunden ein 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Playlist mischen" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" -msgstr "Standard Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Playlist speichern" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" -msgstr "Standard Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "Playlist Crossfade" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "Anderen Webseiten den Zugriff auf \"Kalender\" Info?%s erlauben. (Aktivieren Sie diese Option, damit Frontend-Widgets funktionieren.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "Fade In: " -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "Deaktiviert" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Fade Out: " -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "Aktiviert" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "Keine Playlist geöffnet" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "Standardsprache" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" +msgstr "Leerer Smart Block Inhalt" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" -msgstr "Sendestation Zeitzone" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(ss.t)" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "Woche beginnt am" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "Kein Smart Block geöffnet" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" -msgstr "Interface Zeitzone:" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" +msgstr "Wellenform anzeigen" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "E-Mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "Cue In: " -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "Passwort wiederherstellen" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(hh:mm:ss.t)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "Stunden" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Cue Out: " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "Minuten" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "Originallänge:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "Smart Block Typ:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "Sendung hinzufügen" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "Statisch" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "Sendung aktualisieren" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "Dynamisch" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "Was" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "Titel wiederholen:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "Wann" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "Beschränke auf" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "Live Stream Input" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "Playlist-Inhalt erstellen und Kriterien speichern" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "Aufnahme & Wiederholung" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "Erstellen" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Wer" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "Inhalt der Playlist Mischen" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Farbe" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "Beschränkung kann nicht leer oder kleiner als 0 sein" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "Wiederholung der Sendung %s von %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "Beschränkung kann nicht größer als 24 Stunden sein" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Land wählen" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "Der Wert muß eine ganze Zahl sein" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "Dauer muß länger als 0 Minuten sein." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "Die Anzahl der Objekte ist auf 500 beschränkt" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "Dauer im Format \"00h 00m\" eingeben." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "Sie müssen Kriterium und Modifikator bestimmen" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "URL im Format \"http://domain\" eingeben." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "Die 'Dauer' muß im Format '00:00:00' eingegeben werden" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "URL darf aus höchstens 512 Zeichen bestehen." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "Der Wert muß im Timestamp-Format eingegeben werden (zB. 0000-00-00 oder 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "Es konnte kein MIME-Typ für den Webstream gefunden werden." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "Der eingegebene Wert muß aus Ziffern bestehen" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "Die Bezeichnung eines Webstreams darf nicht leer sein." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "Der eingegebene Wert muß kleiner sein als 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "Die XSPF Playlist konnte nicht eingelesen werden" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "Der eingegebene Wert muß aus weniger als %s Zeichen bestehen." +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "Die PLS Playlist konnte nicht eingelesen werden" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "Der Wert darf nicht leer sein" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "Die M3U Playlist konnte nicht eingelesen werden" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Sendung:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "Ungültiger Webstream - Die eingegebene URL scheint ein Dateidownload zu sein." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "Alle meine Sendungen:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "Unbekannter Stream-Typ: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "ISRC-Nr.:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s wird bereits überwacht." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "Automatisches Hochladen aufgezeichneter Sendungen" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s enthält andere bereits überwachte Verzeichnisse: %s " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "Aktiviere SoundCloud Upload" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s ist ein Unterverzeichnis eines bereits überwachten Verzeichnisses: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "Markiere Dateien auf SoundCloud automatisch als \"herunterladbar\"" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s ist kein gültiges Verzeichnis." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "SoundCloud E-Mail" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s ist bereits als aktuelles Speicherverzeichnis bestimmt oder in der Liste überwachter Verzeichnisse" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "SoundCloud Passwort" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s ist bereits als aktuelles Speicherverzeichnis bestimmt oder in der Liste überwachter Verzeichnisse." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "SoundCloud Tags: (mehrere Tags mit Leerzeichen trennen)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s existiert nicht in der Liste überwachter Verzeichnisse." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "Standard Genre:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "Inhalte aus verknüpften Sendungen können nicht verschoben werden" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "Standard Titel Typ:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "Der Kalender den sie sehen ist nicht mehr aktuell!(Kalender falsch zugeordnet)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "Original" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "Der Kalender den sie sehen ist nicht mehr aktuell! (Instanz falsch zugeordnet)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "Der Kalender den sie sehen ist nicht mehr aktuell!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "Live" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "Sie haben nicht die erforderliche Berechtigung einen Termin für die Sendung %s zu festzulegen." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "Aufnahme" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "Einer Sendungsaufzeichnung können keine Dateien hinzugefügt werden." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "Talk" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "Die Sendung %s ist beendet und kann daher nicht verändert werden." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "Die Sendung %s wurde bereits aktualisiert!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "Inhalte in verknüpften Sendungen können nicht während der Sendung geändert werden" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "In Bearbeitung" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "Eine der gewählten Dateien existiert nicht!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "Stem" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "Cue In und Cue Out sind Null." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "Loop" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "Cue In darf nicht größer als Cue Out sein." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Sound Effekt" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "Cue In darf nicht größer als die Gesamtlänge der Datei sein." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "One Shot Sample" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "Cue Out darf nicht kleiner als Cue In sein." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Sonstige" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "Die Datei konnte nicht hochgeladen werden. Es sind %s MB Speicherplatz frei und die Datei, die sie hochladen wollen, hat eine Größe von %s MB." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "Standard Lizenz:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "Die Maximaldauer einer Sendung beträgt 24 Stunden." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "Die Rechte an dieser Arbeit sind gemeinfrei" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"Sendungen können nicht überlappend geplant werden.\n" +"Beachte: Wird die Dauer einer wiederkehrenden Sendung verändert, wirkt sich das auch auf alle Wiederholungen aus." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "Alle Rechte vorbehalten" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Hallo %s , \n" +"\n" +"Klicke auf diesen Link um dein Passwort zurückzusetzen: " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "[CC-BY] Creative Commons Namensnennung" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Airtime Passwort zurücksetzen" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "[CC-BY-NC] Creative Commons Namensnennung, keine kommerzielle Nutzung" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "Aufzeichnung existiert nicht" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "[CC-BY-ND] Creative Commons Namensnennung, keine Bearbeitung" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "Metadaten der aufgezeichneten Datei anzeigen" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "[CC-BY-SA] Creative Commons Namensnennung, Weitergabe unter gleichen Bedingungen" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Sendungsinhalt" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "[CC-BY-NC-ND] Creative Commons Namensnennung, keine kommerzielle Nutzung, keine Bearbeitung" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "Gesamten Inhalt entfernen" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "[CC-BY-NC-SA] Creative Commons Namensnennung, keine kommerzielle Nutzung, Weitergabe unter gleichen Bedingungen" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "Aktuelle Sendung abbrechen" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "Hintergrundfarbe:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "Diese Folge bearbeiten" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "Textfarbe:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "Sendung ändern" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "Jetzt" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "Diese Folge löschen" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "Medien hinzufügen" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "Diese Folge und alle folgenden löschen" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Bibliothek" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "Zugriff verweigert" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "Kalender" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "Wiederkehrende Sendungen können nicht per Drag'n'Drop verschoben werden." -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "System" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "Eine in der Vergangenheit liegende Sendung kann nicht verschoben werden." -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "Benutzer" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "Eine Sendung kann nicht in die Vergangenheit verschoben werden." -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Medienordner" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "Eine aufgezeichnete Sendung kann nicht verschoben werden, wenn der Zeitpunkt der Wiederholung weniger als eine Stunde bevor liegt." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Streams" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "Die Sendung wurde gelöscht, weil die aufgezeichnete Sendung nicht existiert!" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "Hörerstatistiken" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "Das Wiederholen einer Sendung ist erst nach einer Stunde Wartezeit möglich." -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" -msgstr "Verlauf" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" +msgstr "Titel" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "Playout Verlauf" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "Abgespielt" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "Verlaufsvorlagen" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "Das Jahr %s muß im Bereich zwischen 1753 und 9999 sein" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "Kurzanleitung" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s ist kein gültiges Datum" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "Benutzerhandbuch" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s-%s-%s ist kein gültiger Zeitpunkt." #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3914,3 +3823,18 @@ msgstr "Bitte eine Option wählen" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "Keine Aufzeichnungen" + +#~ msgid "can't resize a past show" +#~ msgstr "Die Länge einer vergangenen Sendung kann nicht verändert werden." + +#~ msgid "Should not overlap shows" +#~ msgstr "Sendungen sollten nicht überlappen" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "Fehler beim Erstellen des Ordners 'organize'" + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "Die Datei scheint fehlerhaft zu sein und wird der Bibliothek nicht hinzugefügt." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "Die Datei konnte nicht hochgeladen werden. Dieser Fehler kann auftreten, wenn die Festplatte des Computers nicht über genügend freien Speicherplatz verfügt oder das Ablageverzeichnis 'stor' keine Schreibrechte hat." diff --git a/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po index 702bba41ee..4e9a00c774 100644 --- a/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po @@ -1,7 +1,7 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # KaterinaMic , 2014 # Sourcefabric , 2013 @@ -9,28 +9,16 @@ msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-02-04 10:31+0000\n" "Last-Translator: danielhjames \n" "Language-Team: Greek (Greece) (http://www.transifex.com/projects/p/airtime/language/el_GR/)\n" +"Language: el_GR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: el_GR\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime Copyright ©Sourcefabric o.p.s. ΔιατήÏηση όλων των δικαιωμάτων.%sΣυντήÏηση και διανομή από GNU GPL v.3 by %sSourcefabric o.p.s%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "Ζωντανό Stream" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -51,9 +39,9 @@ msgid "Stop" msgstr "ΠαÏση" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Cue In" @@ -62,9 +50,9 @@ msgid "Set Cue In" msgstr "ΡÏθμιση Cue In" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Cue Out" @@ -86,1720 +74,1448 @@ msgstr "Fade In" msgid "Fade Out" msgstr "Fade Out" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "Τίτλος" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime Copyright ©Sourcefabric o.p.s. ΔιατήÏηση όλων των δικαιωμάτων.%sΣυντήÏηση και διανομή από GNU GPL v.3 by %sSourcefabric o.p.s%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "ΔημιουÏγός" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "Ζωντανό Stream" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "ΕνεÏγοποιημένο" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "ΔιάÏκεια" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "ΤÏπος Stream:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Είδος" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Ρυθμός Δεδομένων:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "Διάθεση" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "ΤÏπος ΥπηÏεσίας:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "ΕταιÏεία" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "Κανάλια" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "Συνθέτης" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Mono" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Stereo" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "Copyright" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Διακομιστής" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Έτος" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Εισαγωγή άκυÏου χαÏακτήÏα" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "Κομμάτι" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "ΘÏÏα" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "ΕνοÏχήστÏωση" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "ΕπιτÏέπονται μόνο αÏιθμοί." -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "Γλώσσα" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "Κωδικός Ï€Ïόσβασης" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "ÎÏα ΈναÏξης" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Είδος" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "ÎÏα Τέλους" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "ΔιεÏθυνση URL:" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "Παίχτηκε" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "Ονομασία" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "Το αÏχείο δεν υπάÏχει" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "ΠεÏιγÏαφή" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "ΠÏοβολή εγγεγÏαμμένων ΑÏχείων Μεταδεδομένων " +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Σημείο ΠÏοσάÏτησης" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "ΠÏοβολή σε Soundcloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Όνομα ΧÏήστη" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Ανέβασμα σε SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "ΔιαχειÏιστής ΧÏήστης" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "ΕπαναφόÏτωση σε SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "Κωδικός Ï€Ïόσβασης ΔιαχειÏιστή" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Εμφάνιση ΠεÏιεχομένου" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Λήψη πληÏοφοÏιών από το διακομιστή..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "ΠÏοσθήκη / ΑφαίÏεση ΠεÏιεχομένου" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "Ο διακομιστής δεν μποÏεί να είναι κενός." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "ΑφαίÏεση Όλου του ΠεÏιεχομένου" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "Το Port δεν μποÏεί να είναι κενό." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "ΑκÏÏωση ΤÏέχουσας Εκπομπής" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "Η Ï€ÏοσάÏτηση δεν μποÏεί να είναι κενή με διακομιστή Icecast." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "ΕπεξεÏγασία της ΠαÏουσίας" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "Τίτλος:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "ΕπεξεÏγασία" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "ΔημιουÏγός:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "ΕπεξεÏγασία Εκπομπής" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Album:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "ΔιαγÏαφή" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Κομμάτι:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "ΔιαγÏαφή Της ΠαÏουσίας" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Είδος:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "ΔιαγÏαφή Της ΠαÏουσίας και Όλων των Ακόλουθών της" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Έτος" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "Δεν έχετε δικαίωμα Ï€Ïόσβασης" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "ΔισκογÏαφική:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "Δεν είναι δυνατό το drag and drop επαναλαμβανόμενων εκπομπών" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "Συνθέτης:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "Δεν είναι δυνατή η μετακίνηση πεÏασμένης εκπομπής" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "ΜαέστÏος:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "Δεν είναι δυνατή η μετακίνηση εκπομπής στο παÏελθόν" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "Διάθεση:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "Δεν είναι δυνατός ο Ï€ÏογÏαμματισμός αλληλοεπικαλυπτόμενων εκπομπών" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "Δεν είναι δυνατή η μετακίνηση ηχογÏαφημένης εκπομπής σε λιγότεÏο από 1 ÏŽÏα Ï€Ïιν από την αναμετάδοση της." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "Copyright:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "Η εκπομπή διεγÏάφη επειδή δεν υπάÏχει ηχογÏαφημένη εκπομπή!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "ΑÏιθμός ISRC:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "ΠÏέπει να πεÏιμένετε 1 ÏŽÏα για την αναμετάδοση." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "Ιστοσελίδα:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "ΠÏοτιμήσεις" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "Γλώσσα:" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Αποθήκευση" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "ΔιαχείÏιση Φακέλων Πολυμέσων" - -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "Ρυθμίσεις Stream" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "ΑκÏÏωση" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Γενικές Ïυθμίσεις" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Όνομα ΧÏήστη:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "βΔ" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "Κωδικός Ï€Ïόσβασης:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "Ρυθμίσεις Stream Εξόδου" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "Επαλήθευση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Επιλέξτε φάκελο" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "Όνομα:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "ΟÏισμός" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "Επώνυμο:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "ΤÏέχων Φάκελος Εισαγωγής:" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "Email:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "ΠÏοσθήκη" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Κινητό Τηλέφωνο:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "ΕπανασάÏωση Ï€Ïοβεβλημμένου ευÏετηÏίου (Αυτό είναι χÏήσιμο αν το δίκτυο στήÏιξης είναι εκτός συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î¼Îµ το Airtime)" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "ΑφαίÏεση Ï€Ïοβεβλημμένου ευÏετηÏίου" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "Δεν παÏακολουθείτε κανέναν φάκελο πολυμέσων." +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "ΤÏπος ΧÏήστη:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "ΕγγÏαφή σε Airtime" +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "Επισκέπτης" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Βοηθείστε στη βελτίωση του Airtime, ενημεÏώνοντας μας για την χÏήση που του κάνετε. Αυτές οι πληÏοφοÏίες θα συλλέγονται τακτικά, Ï€Ïοκειμένου να ενισχÏσουν την εμπειÏία των χÏηστών σας. %sΚάντε κλικ στο κουμπί 'Îαι, βοηθώ το Airtime' και θα βεβαιωθείτε ότι οι λειτουÏγίες που χÏησιμοποιείτε συνεχώς βελτιώνεται." +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "DJ" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "Κάντε κλικ στο παÏακάτω πλαίσιο για να διαφημίσετε το σταθμό σας στην ιστοσελίδα %s Sourcefabric.org %s . ΠÏοκειμένου να το κάνετε Ï€Ïέπει η επιλογή 'Αποστολή σχολίων υποστήÏιξης» να είναι ενεÏγοποιημένη. Αυτά τα δεδομένα θα συλλέγονται μαζί με Ï„o feedback σας." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "Διευθυντής ΠÏογÏάμματος" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(Απαιτείται)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(Μόνο για σκοποÏÏ‚ επαλήθευσης, δεν θα δημοσιευθεί)" +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "ΔιαχειÏιστής" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Σημείωση: Οτιδήποτε μεγαλÏτεÏο από 600x600 θα αλλάξει μέγεθος." +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "Το όνομα εισόδου δεν είναι μοναδικό." -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Δείξε μου τι στέλνω " +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "ΧÏώμα Φόντου:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "ÎŒÏοι και ΠÏοϋποθέσεις" +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "ΧÏώμα Κειμένου:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "ΕÏÏεση Εκπομπών" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "ΗμεÏομηνία ΈναÏξης:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "ΦιλτÏάÏισμα βάσει Εκπομπών:" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "ΗμεÏομηνία Λήξης:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Εκπομπή:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Επιλογές Smart Block" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "Όλες οι Εκπομπές μου:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "ή" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "ημέÏες" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "και" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "Η μέÏα Ï€Ïέπει να Ï€ÏοσδιοÏιστεί" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr " να " +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "Η ÏŽÏα Ï€Ïέπει να Ï€ÏοσδιοÏιστεί" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "τα αÏχεία πληÏοÏν τα κÏιτήÏια" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "ΠÏέπει να πεÏιμένετε τουλάχιστον 1 ÏŽÏα για την αναμετάδοση" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "το αÏχείο πληÏεί τα κÏιτήÏια" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "Εισαγωγή Φακέλου:" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "URL ΣÏνδεσης: " +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "ΠαÏοβεβλημμένοι Φάκελοι:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Βοηθείστε το Airtime ενημεÏώνοντας τη Sourcefabric για τη χÏήση που του κάνετε. Αυτές οι πληÏοφοÏίες θα συλλέγονται τακτικά, Ï€Ïοκειμένου να ενισχÏσουν την εμπειÏία των χÏηστών σας. %s Κάντε κλικ στο πλαίσιο Αποστολή σχολίων υποστήÏιξης» και θα βεβαιωθείτε ότι οι λειτουÏγίες που χÏησιμοποιείτε βελτιώνοται συνεχώς." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "Μη έγκυÏο ΕυÏετήÏιο" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "Κάντε κλικ στο παÏακάτω πλαίσιο για να Ï€Ïοωθήσετε τον σταθμό σας στην ιστοσελίδα %sSourcefabric.org%s ." +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "Αναζήτηση ΧÏηστών:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(Για να Ï€Ïοωθήσετε τον σταθμό σας, η 'Αποστολή σχολίων υποστήÏιξης» Ï€Ïέπει να είναι ενεÏγοποιημένη)." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "DJs:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Πολιτική ΠÏοστασίας ΠÏοσωπικών Δεδομένων της Sourcefabric" +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "ΣÏνδεση" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "Ρυθμίσεις Stream Εισόδου" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "ΠληκτÏολογήστε τους χαÏακτήÏες που βλέπετε στην παÏακάτω εικόνα." -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "URL ΣÏνδεσης ΚυÏίαÏχης Πηγής:" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Όνομα ΣταθμοÏ" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "ΠαÏάκαμψη" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "ΠÏοεπιλεγμένη ΔιάÏκεια Crossfade (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "ΟΚ" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "εισάγετε ένα χÏόνο σε δευτεÏόλεπτα 0{.0}" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "ΕΠΑÎΑΦΟΡΑ" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "ΠÏοεπιλεγμένο Fade In (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "Εμφάνιση Πηγής URL ΣÏνδεσης:" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "ΠÏοεπιλεγμένο Fade Out (s):" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Επιλέξτε ΗμέÏες:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "ΕπιτÏέψτε την ΠÏόσβαση \"ΠÏόγÏαμμα\" ΠληÏοφοÏίες;%s σε Ιστοσελίδες με ΑπομακÏυσμένη ΠÏόσβαση (ΕνεÏγοποιήστε το για να λειτουÏγήσουν τα front-end widgets.)" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "ΑφαίÏεση" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "ΑπενεÏγοποιημένο" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Επανάληψη ΗμεÏών:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "ΕνεÏγοποιημένο" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "Ρυθμίσεις Δακομιστή Email / ΑλληλογÏαφίας" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "ΠÏοεπιλογή Γλώσσας Interface" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "Ρυθμίσεις SoundCloud" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" +msgstr "Ζώνη ÎÏας ΣταθμοÏ" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "%s's Ρυθμίσεις" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "Η Εβδομάδα αÏχίζει " -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" -msgstr "Επιλογή ΠαÏουσίας Εκπομπής" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "ΚυÏιακή" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "Καμία Εκπομπή" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "ΔευτέÏα" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "ΕÏÏεση" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "ΤÏίτη" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "Stream " +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "ΤετάÏτη" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "ΠÏόσθετες επιλογές" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "Πέμπτη" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "Η παÏακάτω πληÏοφοÏία θα εμφανίζεται στις συσκευές αναπαÏαγωγής πολυμέσων των ακÏοατών σας:" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(Ιστοσελίδα του Î¡Î±Î´Î¹Î¿Ï†Ï‰Î½Î¹ÎºÎ¿Ï ÏƒÏ„Î±Î¸Î¼Î¿Ï)" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "ΠαÏασκευή" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "URL Stream: " +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Σάββατο" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "ΦιλτÏάÏισμα ΙστοÏίας" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "ΣÏνδεσμος" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Καλώς ήÏθατε στο Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "ΤÏπος Επανάληψης:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Διαβάστε τις οδηγίες για να ξεκινήσετε να χÏησιμοποιείται το Airtime, για την αυτοματοποίηση των εκπομπών σας: " +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "εβδομαδιαία" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "Ξεκινήστε με την Ï€Ïοσθήκη αÏχείων στη βιβλιοθήκη επιλέγοντας 'ΠÏοσθήκη Πολυμέσων' στο μενοÏ. ΜποÏείτε να κάνετε και drag-and-drop στα αÏχεία σας σε αυτό το παÏάθυÏο." +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "κάθε 2 εβδομάδες" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "ΔημιουÏγήστε μια εκπομπή πηγαίνοντας στο «ΗμεÏολόγιο» και στη συνέχεια κάνοντας κλικ στο εικονίδιο '+Εκπομπή'. Αυτό μποÏεί να είναι είτε μια ή επαναλαμβανόμενες εκπομπές. Μόνο οι διαχειÏιστές και οι μουσικοί παÏαγωγοί μποÏοÏν να επεξεÏγαστοÏν την εκπομπή." +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "κάθε 3 εβδομάδες" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "ΠÏοσθέστε πολυμέσα στην εκπομπή σας πηγαίνοντας στο ΗμεÏολόγιο Ï€ÏογÏαμματισμοÏ, κάνοντας αÏιστεÏÏŒ κλικ πάνω στην εκπομπή και επιλέγοντας 'ΠÏοσθήκη / ΑφαίÏεση ΠεÏιεχομένου'" +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "κάθε 4 εβδομάδες" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Επιλέξτε τα πολυμέσα σας από το αÏιστεÏÏŒ τμήμα του παÏαθÏÏου και σÏÏετέ τα στην εκπομπή σας στο δεξιό τμήμα." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "μηνιαία" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "Και είστε έτοιμοι!" +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Επιλέξτε ΗμέÏες:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "Για πεÏισσότεÏες αναλυτικές οδηγίες, διαβάστε το %sεγχειÏίδιο%s ." +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "ΚυÏ" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "Σχετικά" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "Δευ" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sΤο Airtime%s %s, το Î±Î½Î¿Î¹ÎºÏ„Î¿Ï ÎºÏŽÎ´Î¹ÎºÎ± λογισμικό για Ï€ÏογÏαμματισμό και διαχείÏιση Ïαδιοφωνικών σταθμών εξ αποστάσεως. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "ΤÏι" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%s Sourcefabric%s o.p.s. Το Airtime διανέμεται υπό %s GNU GPL v.3 %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "Τετ" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "ΜοιÏαστείτε" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "Πεμ" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Επιλέξτε stream:" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "ΠαÏ" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "Σίγαση" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "Σαβ" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "ΚατάÏγηση σίγασης" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "Επανάληψη από:" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "ΣÏνδεση" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "ημέÏα του μήνα" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Καλώς ήÏθατε στο online demo του Airtime! ΜποÏείτε να συνδεθείτε χÏησιμοποιώντας το όνομα χÏήστη «admin» και τον κωδικό Ï€Ïόσβασης «admin»." +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "ημέÏα της εβδομάδας" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "ΠαÏακαλώ εισάγετε τη διεÏθυνση e-mail σας. Θα λάβετε ένα σÏνδεσμο για να δημιουÏγήσετε έναν νέο κωδικό Ï€Ïόσβασης μέσω e-mail." +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "ΧωÏίς Τέλος;" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "Το e-mail εστάλη" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "Η ημεÏομηνία λήξης Ï€Ïέπει να είναι μετά την ημεÏομηνία έναÏξης" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "Το e-mail εστάλη" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "Επιλέξτε ημέÏα επανάληψης" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "ΕπιστÏοφή στην σελίδα εισόδου" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "Επιβεβαίωση νέου ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "Îέος κωδικός Ï€Ïόσβασης" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "Η επιβεβαίωση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î´ÎµÎ½ ταιÏιάζει με τον κωδικό Ï€Ïόσβασής σας." -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "ΠαÏακαλώ εισάγετε και επαληθεÏστε τον νέο κωδικό Ï€Ïόσβασής σας στα παÏακάτω πεδία. " +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Αποκτήστε νέο κωδικό Ï€Ïόσβασης" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "Το δοκιμαστικό λήγει σε" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "Επιλέξτε κÏιτήÏια" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "ημέÏες" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Album" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "ΑγοÏάστε το δικό σας αντίγÏαφο του Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Bit Rate (Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "Ο λογαÏιασμός μου" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "ΠÏοηγοÏμενο" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "Συνθέτης" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "Επόμενο" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "ΕνοÏχήστÏωση" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "Πηγή Streams" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "Copyright" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "ΚÏÏια Πηγή " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "ΔημιουÏγός" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "Εμφάνιση Πηγής " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Κωδικοποιήθηκε από" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "ΠÏόγÏαμμα" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "ON AIR" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "ΕταιÏεία" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "ΑκοÏστε!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "Γλώσσα" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "ΧÏόνος σταθμοÏ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "Τελευταία Ï„Ïοποποίηση" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Κλείσιμο" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "Τελευταία αναπαÏαγωγή" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "ΠÏοσθήκη αυτής της εκπομπής " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "ΔιάÏκεια" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "ΕνημέÏωση εκπομπής" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Μίμος" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "Τι" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "Διάθεση" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "Πότε" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "Ιδιοκτήτης" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "Είσοδος Live Stream " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "ΚέÏδος Επανάληψης" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "ΕγγÏαφή και Αναμετάδοση" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "Ρυθμός Δειγματοληψίας (kHz)" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Ποιός" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "Τίτλος" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Στυλ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "ΑÏιθμός ΚομματιοÏ" -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "ΈναÏξη" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "ΦοÏτώθηκε" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "ΕξυπηÏέτηση" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "Ιστοσελίδα" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "Κατάσταση" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Έτος" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "ΧÏόνος λειτουÏγίας" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "Επιλέξτε Ï„Ïοποποιητή" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "CPU" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "πεÏιέχει" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "Μνήμη" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "δεν πεÏιέχει" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Έκδοση Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "είναι" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "ΧώÏος δίσκου" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "δεν είναι" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "Εισαγωγή αÏχείου σε εξέλιξη..." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "ξεκινά με" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "ΠÏοηγμένες Επιλογές Αναζήτησης" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "τελειώνει με" -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "ΚαταμέτÏηση ΑκÏοατών με την ΠάÏοδου ΧÏόνου" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "είναι μεγαλÏτεÏος από" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "Îέο" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "είναι μικÏότεÏος από" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "Îέα λίστα αναπαÏαγωγής" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "είναι στην κλίμακα" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "Îέο Smart Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "ÏŽÏες" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "Îέο Webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "λεπτά" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "ΠÏοβολή / επεξεÏγασία πεÏιγÏαφής" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "στοιχεία" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "ΠεÏιγÏαφή" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "ΟÏισμός Ï„Ïπου smart block:" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "URL Stream:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "Στατικό" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "ΠÏοεπιλεγμένη ΔιάÏκεια:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "Δυναμικό" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "Κανένα webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "ΕπιτÏέψτε την επανάληψη κομματιών:" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "Άδειασμα πεÏιεχομένου λίστας αναπαÏαγωγής" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "ÎŒÏιο για" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "ΕκκαθάÏιση" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "ΔημιουÏγία λίστας αναπαÏαγωγής πεÏιεχομένου και αποθήκευση κÏιτηÏίων" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Shuffle λίστα αναπαÏαγωγής" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "ΔημιουÏγία" + +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "ΠεÏιεχόμενο λίστας Shuffle " -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 #: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 msgid "Shuffle" msgstr "Shuffle" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Αποθήκευση λίστας αναπαÏαγωγής" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "Crossfade λίστας αναπαÏαγωγής" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "Fade in: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Fade out: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "Καμία ανοικτή λίστα αναπαÏαγωγής" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "Εμφάνιση κυμματοειδοÏÏ‚ μοÏφής" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(Ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "ΕκκαθάÏιση πεÏιεχομένου του smart block" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "Κανένα ανοικτό smart block " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "Cue In: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(ωω:λλ:δδ.t)" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Cue Out: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "ΑÏχική ΔιάÏκεια:" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "Επέκταση Στατικών Block" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "Επέκταση Δυναμικών Block" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "Άδειασμα smart block" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "Άδειασμα λίστας αναπαÏαγωγής" - -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "ΕφαÏμογή ΠÏοεπιλεγμένου Πλαισίου Zend " - -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "Η σελίδα δεν βÏέθηκε!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "Η σελίδα που ψάχνατε δεν υπάÏχει!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "Βοήθεια" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "Ï€ÏοηγοÏμενο" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "αναπαÏαγωγή" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "παÏση" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "επόμενο" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "στάση" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "μέγιστη ένταση" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "Απαιτείται ΕνημέÏωση " - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "Για να παίξετε τα πολυμέσα θα Ï€Ïέπει είτε να αναβαθμίστε το Ï€ÏόγÏαμμα πεÏιήγησηής σας σε μια Ï€Ïόσφατη έκδοση ή να ενημέÏώσετε το %sFlash plugin %s σας." - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "ΔημιουÏγία ΑÏχείου ΠεÏίληψης Template " - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "ΔημιουÏγία Template ΦόÏμας ΣÏνδεσης" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "Ονομασία" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "ΠÏοσθήκη πεÏισσότεÏων στοιχείων" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "ΠÏοσθήκη Îέου Πεδίου" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "ΟÏισμός ΠÏοεπιλεγμένου Template " - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "Template ΦόÏμας ΣÏνδεσης" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "Κανένα Template ΦόÏμας ΣÏνδεσης" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "Ως ΠÏοεπιλογή" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "Îέο Template ΦόÏμας ΣÏνδεσης" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "Το ÏŒÏιο δεν μποÏεί να είναι κενό ή μικÏότεÏο από 0" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "Template ΠεÏίληψης ΑÏχείου" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "Το ÏŒÏιο δεν μποÏεί να είναι ξεπεÏνάει τις 24 ÏŽÏες" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "Κανένα Template ΠεÏίληψης ΑÏχείου" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "Η τιμή Ï€Ïέπει να είναι ακέÏαιος αÏιθμός" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "Îέο Template ΠεÏίληψης ΑÏχείου" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "Το 500 είναι η μέγιστη οÏιακή τιμή σημείου, που μποÏείτε να οÏίσετε" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "ΔιαχείÏιση ΧÏηστών" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "Θα Ï€Ïέπει να επιλέξετε ΚÏιτήÏια και ΤÏοποποιητή" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "Îέος ΧÏήστης" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "Το «Μήκος» θα Ï€Ïέπει να είναι σε υπό μοÏφής '00:00:00'" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "ταυτότητα" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "Η τιμή θα Ï€Ïέπει να είναι υπο μοÏφής ÏŽÏας (Ï€.χ. 0000-00-00 ή 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Όνομα ΧÏήστη" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "Η τιμή Ï€Ïέπει να είναι αÏιθμός" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "Όνομα" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "Η τιμή Ï€Ïέπει να είναι μικÏότεÏη από 2147483648" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "Επώνυμο" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "Η τιμή Ï€Ïέπει να είναι μικÏότεÏη από %s χαÏακτήÏες" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "ΤÏπος ΧÏήστη" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "Η αξία δεν μποÏεί να είναι κενή" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "Τίτλος:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "Αυτόματη ΑπενεÏγοποίηση" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "ΔημιουÏγός:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "Αυτόματη ΕνεÏγοποίηση" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Album:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "Διακόπτης Fade Μετάβασης (s)" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Κομμάτι:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "εισάγετε την ÏŽÏα σε δευτεÏόλεπτα 00{.000000}" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "ΔιάÏκεια:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "ΚÏÏιο Όνομα ΧÏήστη" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "Ρυθμός δειγματοληψίας:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "ΚÏÏιος Κωδικός ΠÏόσβασης" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Ρυθμός Δεδομένων:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "URL ΣÏνδεσης ΚÏÏιας Πηγής " -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "Διάθεση:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "Εμφάνιση URL ΣÏνδεσης Πηγής " -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Είδος:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "ΚÏÏιο Port Πηγής" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Έτος" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "ΚÏÏιο Σημείο ΠÏοσάÏτησης Πηγής" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "ΔισκογÏαφική:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Εμφάνιση Port Πηγής" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "Εμφάνιση Σημείου ΠÏοσάÏτησης Πηγής" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "Συνθέτης:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "Δεν μποÏείτε να χÏησιμοποιήσετε το ίδιο port ως Master DJ Show port." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "ΜαέστÏος:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "Μη διαθέσιμο Port %s " -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "Copyright:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Τηλέφωνο:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "ΑÏιθμός ISRC:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "Ιστοσελίδα ΣταθμοÏ:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "Ιστοσελίδα:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "ΧώÏα" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "Γλώσσα:" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "Πόλη" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "ΔιαδÏομή ΑÏχείου" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "ΠεÏιγÏαφή ΣταθμοÏ:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "Όνομα:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Λογότυπο ΣταθμοÏ:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "ΠεÏιγÏαφή:" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "Αποστολή Σχολίων ΥποστήÏιξης" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Web Stream" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "ΠÏοώθηση του ÏƒÏ„Î±Î¸Î¼Î¿Ï Î¼Î¿Ï… στην ιστοσελίδα Sourcefabric.org" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "Δυναμικά Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "Με την επιλογή του πλαισίου, συμφωνώ με την %sπολιτική αποÏÏήτου%s της Sourcefabric." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "Στατικά Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "ΠÏέπει να συμφωνείτε με την πολιτική Ï€Ïοστασίας Ï€Ïοσωπικών δεδομένων." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Κομμάτι Ήχου" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "Απαιτείται αξία και δεν μποÏεί να είναι κενή" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "ΠεÏιεχόμενα Λίστας ΑναπαÏαγωγής: " +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "ÎÏα ΈναÏξης" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "ΠεÏιεχόμενα Στατικών Smart Block : " +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "ÎÏα Τέλους" + +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "Καμία Εκπομπή" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "ΚÏιτήÏια Δυναμικών Smart Block: " +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "ΗχογÏάφηση από Line In;" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "ÎŒÏιο για " +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "Αναμετάδοση;" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "ΔιεÏθυνση URL:" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Ταυτοποίηση ΧÏήστη Airtime:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "Σελίδα ΣÏνδεσης" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "ΧÏήση ΠÏοσαÏμοσμένης Ταυτοποίησης:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "ΠεÏίληψη ΑÏχείων" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "ΠÏοσαÏμοσμένο Όνομα ΧÏήστη" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "ΠÏοβολή ΠεÏίληψης" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "ΠÏοσαÏμοσμένος Κωδικός ΠÏόσβασης" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "Η μέγιστη διάÏκει εκπομπών είναι 24 ÏŽÏες." +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "Το πεδίο 'Όνομα ΧÏήστη' δεν μποÏεί να είναι κενό." -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "Η λήξη ημεÏομηνίας/χÏόνου δεν μποÏεί να είναι στο παÏελθόν" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "Το πεδίο 'Κωδικός ΠÏόσβασης' δεν μποÏεί να είναι κενό." -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "Δεν είναι δυνατός ο Ï€ÏογÏαμματισμός αλληλοεπικαλυπτώμενων εκπομπών.\n Σημείωση: Η αλλαγή μεγέθους μιας εκπομπής επηÏεάζει όλες τις επαναλήψεις της." +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "E-mail" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "Δεν είναι δυνατή η αλλαγή μεγέθους παÏελθοντικής εκπομπής" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "ΑδÏνατη η αλληλοεπικάλυψη εκπομπών" +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "Έξοδος Hardware Ήχου" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Επιλέξτε ΧώÏα" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "ΤÏπος Εξόδου" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s έχει ήδη Ï€Ïοβληθεί." +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Μεταδεδομένα Icecast Vorbis " -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s πεÏιέχει ένθετο ευÏετήÏιο Ï€Ïοβεβλημένων: %s" +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "Stream Label:" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s βÏίσκεται σε υποκατηγοÏία υπάÏχωντος ευÏετηÏίου Ï€Ïοβεβλημμένων: %s" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "Καλλιτέχνης - Τίτλος" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s μη έγκυÏο ευÏετήÏιο." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Εκπομπή - Καλλιτέχνης - Τίτλος" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s έχει ήδη οÏιστεί ως το Ï„Ïέχον ευÏετήÏιο αποθήκευσης ή βÏίσκεται στη λίστα Ï€Ïοβεβλημένων φακέλων" +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Όνομα Î£Ï„Î±Î¸Î¼Î¿Ï - Όνομα Εκπομπής" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s έχει ήδη οÏιστεί ως το Ï„Ïέχον ευÏετήÏιο αποθήκευσης ή βÏίσκεται στη λίστα Ï€Ïοβεβλημένων φακέλων." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "Μεταδεδομένα Off Air" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s δεν υπάÏχει στη λίστα Ï€Ïοβεβλημένων." +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "ΕνεÏγοποίηση Επανάληψη ΚέÏδους" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "στοιχεία" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "ΤÏοποποιητής Επανάληψης ΚέÏδους" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "Cue in και cue out είναι μηδέν." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%value%' δεν αποτελεί έγκυÏη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου στη βασική μοÏφή local-part@hostname" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "Το cue out δεν μποÏεί να είναι μεγαλÏτεÏο από το μήκος του αÏχείου." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%' δεν ταιÏιάζει με τη μοÏφή ημεÏομηνίας '%format%'" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "Το cue in δεν μποÏεί να είναι μεγαλÏτεÏης διάÏκειας από το cue out." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%' είναι λιγότεÏο από %min% χαÏακτήÏες " -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "Το cue out δεν μποÏεί να είναι μικÏότεÏο από το cue in." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%value%' είναι πεÏισσότεÏο από %max% χαÏακτήÏες " -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "Επιλέξτε κÏιτήÏια" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%' δεν είναι Î¼ÎµÏ„Î±Î¾Ï '%min%' και '%max%', συνολικά" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Bit Rate (Kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "Οι κωδικοί Ï€Ïόσβασης δεν συμπίπτουν" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%value%' δεν ταιÏιάζει με τη μοÏφή της ÏŽÏας 'ΩΩ:λλ'" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Κωδικοποιήθηκε από" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "ΗμεÏομηνία/ÎÏα ΈναÏξης:" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "Τελευταία Ï„Ïοποποίηση" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "ΗμεÏομηνία/ÎÏα Λήξης:" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "Τελευταία αναπαÏαγωγή" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "ΔιάÏκεια:" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Μίμος" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "Ζώνη ÎÏας" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "Ιδιοκτήτης" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "Επαναλήψεις;" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "ΚέÏδος Επανάληψης" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "Δεν είναι δυνατή η δημιουÏγία εκπομπής στο παÏελθόν" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "Ρυθμός Δειγματοληψίας (kHz)" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "ΑδÏνατη η Ï„Ïοποποίηση ημεÏομηνίας/ÏŽÏας έναÏξης της εκπομπής που έχει ήδη αÏχίσει" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "ΑÏιθμός ΚομματιοÏ" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "Η λήξη ημεÏομηνίας/χÏόνου δεν μποÏεί να είναι στο παÏελθόν" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "ΦοÏτώθηκε" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "Δεν μποÏεί να έχει διάÏκεια < 0m" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "Ιστοσελίδα" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "Δεν μποÏεί να έχει διάÏκεια 00h 00m" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "Επιλέξτε Ï„Ïοποποιητή" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "Δεν μποÏεί να έχει διάÏκεια μεγαλÏτεÏη από 24 ÏŽÏες" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "πεÏιέχει" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "Δεν είναι δυνατός ο Ï€ÏογÏαμματισμός αλληλοεπικαλυπτόμενων εκπομπών" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "δεν πεÏιέχει" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "Όνομα:" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "είναι" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "Εκπομπή χωÏίς Τίτλο" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "δεν είναι" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "ΔιεÏθυνση URL:" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "ξεκινά με" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "ΠεÏιγÏαφή:" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "τελειώνει με" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "Αυτόματο Ανέβασμα ΗχογÏαφημένων Εκπομπών" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "είναι μεγαλÏτεÏος από" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "ΕνεÏγοποίηση Ανεβάσματος SoundCloud" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "είναι μικÏότεÏος από" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "Αυτόματη Σήμανση ΑÏχείων \"για λήψη \" στο SoundCloud" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "είναι στην κλίμακα" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "SoundCloud Email" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "Το μήκος Ï€Ïέπει να είναι μεγαλÏτεÏο από 0 λεπτά" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "Κωδικός Ï€Ïόσβασης SoundCloud" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "Το μήκος Ï€Ïέπει να είναι υπό μοÏφής \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "SoundCloud Ετικέτες: (διαχωÏίσετε ετικέτες με κενά)" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "Το URL θα Ï€Ïέπει να είναι υπό μοÏφής \"http://domain \"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "ΠÏοεπιλεγμένο Είδος:" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "Το URL Ï€Ïέπει να αποτελέιται από μέχÏι και 512 χαÏακτήÏες " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "ΠÏοεπιλεγμένος ΤÏπος ΚομματιοÏ:" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "Δεν βÏέθηκε Ï„Ïπος MIME για webstream." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "ΠÏώτυπο" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "Το όνομα του webstream δεν μποÏεί να είναι κενό" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "Remix" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "Δεν ήταν δυνατή η ανάλυση της λίστας αναπαÏαγωγής XSPF " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "Live" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "Αδυναμία ανάλυσης λίστας αναπαÏαγωγής PLS" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "ΕγγÏαφή" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "Δεν ήταν δυνατή η ανάλυση της λίστας αναπαÏαγωγής M3U" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "ΟμιλοÏμενο" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "Μη έγκυÏο webstream - Αυτό φαίνεται να αποτελεί αÏχείο λήψης." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "Podcast" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "Άγνωστος Ï„Ïπος stream: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Demo" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Γεια σας %s , \n\nΠατήστε αυτόν τον σÏνδεσμο για να επαναφέÏετε τον κωδικό Ï€Ïόσβασής σας: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "ΕÏγασία σε εξέλιξη" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης Airtime" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "Στέλεχος" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "Αναμετάδοση του %s από %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "Loop" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "Η μετακίνηση στοιχείων εκτός συνδεδεμένων εκπομπών είναι αδÏνατη." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Εφέ Ήχου" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "Το Ï€ÏόγÏαμμα που βλέπετε δεν είναι έγκυÏο! (αναντιστοιχία Ï€ÏογÏάμματος)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "Δείγμα Shot" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "Το Ï€ÏόγÏαμμα που βλέπετε δεν είναι ενημεÏωμένο! (αναντιστοιχία παÏαδείγματος)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Άλλο" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "Το Ï€ÏόγÏαμμα που βλέπετε δεν είναι ενημεÏωμένο!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "ΠÏοεπιλεγμένη Άδεια :" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "Δεν έχετε δικαίωμα Ï€ÏογÏÎ±Î¼Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï ÎµÎºÏ€Î¿Î¼Ï€Î®Ï‚%s.." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "ΕÏγασία δημόσιας χÏήσης" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "Δεν μποÏείτε να Ï€Ïοσθεσετε αÏχεία σε ηχογÏαφημένες εκπομπές." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "ΔιατήÏηση όλων των δικαιωμάτων" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "Η εκπομπή %s έχει τελειώσει και δεν μποÏεί να Ï€ÏογÏαμματιστεί." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "Απόδοση Creative Commons" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "Η εκπομπή %s έχει ενημεÏωθεί Ï€Ïόσφατα!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "Απόδοση Creative Commons Μη ΕμποÏική ΧÏήση" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "Το πεÏιεχόμενο συνδεδεμένων εκπομπών Ï€Ïέπει να να Ï€ÏογÏαμματιστεί Ï€Ïιν ή μετά την αναμετάδοσή τους" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "Απόδοση Creative Commons Όχι ΠαÏάγωγα ΈÏγα" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "Ένα επιλεγμένο αÏχείο δεν υπάÏχει!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "Απόδοση Creative Commons Share Alike" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "Αποτυχία δημιουÏγίας «οÏγάνωση» directory." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "Απόδοση Creative Commons Μη ΕμποÏική ΧÏήση Όχι ΠαÏάγωγα ΈÏγα" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "Το αÏχείο δεν ανέβηκε, υπάÏχει %s MB ελεÏθεÏου χώÏου στο δίσκο και το αÏχείο που ανεβάζετε έχει μέγεθος %s MB." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "Απόδοση Creative Commons Μη ΕμποÏική ΧÏήση Share Alike" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "Αυτό το αÏχείο φαίνεται να είναι κατεστÏαμμένο και δεν θα Ï€Ïοστεθεί στη βιβλιοθήκη πολυμέσων." +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "Interface Ζώνης ÏŽÏας:" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "Το αÏχείο δεν ανέβηκε, αυτό το σφάλμα μποÏεί να Ï€ÏοκÏψει είτε διότι ο σκληÏός δίσκος του υπολογιστή δεν έχει αÏκετό χώÏο ή διότι ο directory αποθήκευσης δεν έχει έγγυÏες άδειες εγγÏαφής." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "ΕνεÏγοποίηση Emails Συστήματος (ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης)" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "Δεν έχετε άδεια για αποσÏνδεση πηγής." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "ΕπαναφοÏά ÎšÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης 'Από' E-mail" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "Δεν υπάÏχει καμία πηγή που είναι συνδεδεμένη σε αυτή την είσοδο." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "ΔιαμόÏφωση Διακομιστή ΑλληλογÏαφίας" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "Δεν έχετε άδεια για αλλαγή πηγής." +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "Απαιτείται Έλεγχος Ταυτότητας" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" -msgstr "Αναμετάδοση της εκπομπής %s από %s σε %s" +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "Διακομιστής ΑλληλογÏαφίας" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" -msgstr "Λήψη" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "ΔιεÏθυνση ΗλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Î¤Î±Ï‡Ï…Î´Ïομείου" #: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "ΠαÏακαλοÏμε σιγουÏευτείτε ότι ο χÏήστης/κωδικός Ï€Ïόσβασης διαχειÏιστή είναι σωστός στη σελίδα ΣÏστημα>Streams." -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "Δεν έχετε δικαίωμα Ï€Ïόσβασης σε αυτό το βοήθημα" +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Webstream χωÏίς Τίτλο" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "Δεν έχετε δικαίωμα Ï€Ïόσβασης σε αυτό το βοήθημα. " +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Το Webstream αποθηκεÏτηκε." -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "Το αÏχείο δεν υπάÏχει στο Airtime." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "ΆκυÏες μοÏφές αξίας." -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "Το αÏχείο δεν υπάÏχει στο Airtime" +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "ΠαÏακαλώ εισάγετε το όνομα χÏήστη και τον κωδικό Ï€Ïόσβασής σας" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "Το αÏχείο δεν υπάÏχει στο Airtime." +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "ΆκυÏο όνομα χÏήστη ή κωδικός Ï€Ïόσβασης. ΠαÏακαλώ δοκιμάστε ξανά." -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "Λανθασμένο αίτημα. Η παÏάμετÏος «κατάσταση» δεν πέÏασε." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "Το e-mail δεν μπόÏεσε να σταλεί. Ελέγξτε τις Ïυθμίσεις email του διακομιστή σας και βεβαιωθείτε ότι έχει Ïυθμιστεί σωστά." -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "Λανθασμένο αίτημα. Η παÏάμετÏος «κατάσταση» δεν είναι έγκυÏη" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "Το email δεν βÏέθηκε." -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format -msgid "%s not found" -msgstr "%s δεν βÏέθηκε" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "Κάτι πήγε στÏαβά." - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "ΠÏοεπισκόπηση" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "ΠÏοσθήκη στη λίστα αναπαÏαγωγής" - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "ΠÏοσθήκη στο Smart Block" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "ΕπεξεÏγασία Μεταδεδομένων" +msgid "Rebroadcast of show %s from %s at %s" +msgstr "Αναμετάδοση της εκπομπής %s από %s σε %s" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "ΑντιγÏαφή Λίστας ΑναπαÏαγωγής" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" +msgstr "Λήψη" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "Ο χÏήστης Ï€Ïοστέθηκε επιτυχώς!" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "Καμία διαθέσιμη δÏάση" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "Ο χÏήστης ενημεÏώθηκε με επιτυχία!" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "Δεν έχετε άδεια διαγÏαφής των επιλεγμένων στοιχείων." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "Οι Ïυθμίσεις ενημεÏώθηκαν επιτυχώς!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "Δεν ήταν δυνατή η διαγÏαφή οÏισμένων Ï€ÏογÏαμματισμένων αÏχείων." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "Η σελίδα δεν βÏέθηκε" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "ΑντιγÏαφή από %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Σφάλμα εφαÏμογής" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1875,6 +1591,11 @@ msgstr "ΜποÏείτε να Ï€Ïοσθέσετε μόνο κομμάτια, sm msgid "Please select a cursor position on timeline." msgstr "ΠαÏακαλοÏμε επιλέξτε μια θέση δÏομέα στο χÏονοδιάγÏαμμα." +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "ΕπεξεÏγασία Μεταδεδομένων" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "ΠÏοσθήκη στην επιλεγμένη εκπομπή" @@ -1921,6 +1642,7 @@ msgstr "ΦόÏτωση..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "Όλα" @@ -1991,9 +1713,7 @@ msgstr "Το input Ï€Ïέπει να είναι υπό μοÏφής: ωω: λλ: #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "ΠÏος το παÏόν ανεβάζετε αÏχεία. %sΠηγαίνοντας σε μια άλλη οθόνη θα ακυÏώσετε τη διαδικασία του ανεβάσματος.%sΕίστε σίγουÏοι ότι θέλετε να εγκαταλείψετε τη σελίδα;" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2029,10 +1749,7 @@ msgid "Playlist shuffled" msgstr "Ανασχηματισμός λίστας αναπαÏαγωγής" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "To Airtime είναι αβέβαιο για την κατάσταση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… αÏχείου. Αυτό μποÏεί να συμβεί όταν το αÏχείο είναι σε μια απομακÏυσμένη μονάδα δίσκου που είναι απÏοσπέλαστη ή το αÏχείο είναι σε ευÏετήÏιο που δεν «πÏοβάλλεται» πια." #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2058,24 +1775,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "Η εικόνα Ï€Ïέπει να είναι jpg, jpeg, png ή gif " #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "Ένα στατικό smart block θα αποθηκεÏσει τα κÏιτήÏια και θα δημιουÏγήσει αμέσως το πεÏιεχόμενο του block. Αυτό σας επιτÏέπει να το επεξεÏγαστείτε και να το Ï€Ïοβάλεται στη Βιβλιοθήκη Ï€Ïιν το Ï€Ïοσθέσετε σε μια εκπομπή." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "Ένα στατικό smart block θα αποθηκεÏσει μόνο τα κÏιτήÏια. Το πεÏιεχόμενο του block θα δημιουÏγηθεί κατά την Ï€Ïοσθήκη του σε μια εκπομπή. Δεν θα μποÏείτε να δείτε και να επεξεÏγαστείτε το πεÏιεχόμενο στη Βιβλιοθήκη." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "Η επιθυμητή διάÏκεια του block δεν θα επιτευχθεί αν το Airtime δεν μποÏέσει να βÏεί αÏκετά μοναδικά κομμάτια που να ταιÏιάζουν στα κÏιτήÏιά σας. ΕνεÏγοποιήστε αυτή την επιλογή αν θέλετε να επιτÏέψετε την πολλαπλή Ï€Ïοσθήκη κομματιών στο smart block." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2106,7 +1814,14 @@ msgstr "Επιλογή Φακέλου για ΠÏοβολή" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "Είστε βέβαιοι ότι θέλετε να αλλάξετε το φάκελο αποθήκευσης;\nΑυτό θα αφαιÏέσει τα αÏχεία από τη βιβλιοθήκη του Airtime!" +msgstr "" +"Είστε βέβαιοι ότι θέλετε να αλλάξετε το φάκελο αποθήκευσης;\n" +"Αυτό θα αφαιÏέσει τα αÏχεία από τη βιβλιοθήκη του Airtime!" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "ΔιαχείÏιση Φακέλων Πολυμέσων" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2118,9 +1833,7 @@ msgstr "Αυτή η διαδÏομή δεν είναι Ï€Ïος το παÏόν #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "Κάποιοι Ï„Ïποι stream απαιτοÏν επιπλέον Ïυθμίσεις. ΛεπτομέÏειες για την ενεÏγοποίηση %sAAC+ Support%s ή %sOpus Support%s παÏέχονται." #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2131,22 +1844,12 @@ msgstr "Συνδέθηκε με τον διακομιστή streaming " msgid "The stream is disabled" msgstr "Το stream είναι απενεÏγοποιημένο" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Λήψη πληÏοφοÏιών από το διακομιστή..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "ΑδÏνατη η σÏνδεση με τον διακομιστή streaming " #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "Αν το Airtime είναι πίσω από ένα τείχος Ï€Ïοστασίας ή router, ίσως χÏειαστεί να Ïυθμίσετε την Ï€Ïοώθηση port και οι πληÏοφοÏίες πεδίου θα είναι λανθασμένες. Σε αυτή την πεÏίπτωση θα Ï€Ïέπει να ενημεÏώσετε αυτό το πεδίο, ώστε να δείχνει το σωστό host/port/mount που χÏειάζονται οι DJ σας για να συνδεθοÏν. Το επιτÏεπόμενο εÏÏος είναι Î¼ÎµÏ„Î±Î¾Ï 1024 και 49151." #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2155,61 +1858,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "Για πεÏισσότεÏες λεπτομέÏειες, παÏακαλοÏμε διαβάστε το %sAirtime ΕγχειÏίδιο%s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "ΤσεκάÏετε αυτή την επιλογή για να ενεÏγοποιήσετε τα μεταδεδομένα για OGG streams (τα stream μεταδεδομένα είναι ο τίτλος του ÎºÎ¿Î¼Î¼Î±Ï„Î¹Î¿Ï ÎºÎ±Î¹ του καλλιτέχνη, που εμφανίζονται σε ένα audio player). VLC και mplayer Ï€ÏοκαλοÏν βλάβες κατά την αναπαÏαγωγή ενός OGG / Vorbis stream, το οποίο έχει ενεÏγοποιημένες τις πληÏοφοÏίες μεταδεδομένων: θα αποσυνδέονται από το stream μετά από κάθε κομμάτι. Εάν χÏησιμοποιείτε ένα OGG stream και οι ακÏοατές σας δεν απαιτοÏν υποστήÏιξη για αυτές τις συσκευές αναπαÏαγωγής ήχου, τότε μποÏείτε να ενεÏγοποιήσετε αυτή την επιλογή." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "Επιλέξτε αυτό το πλαίσιο για να σβήσει αυτόματα η ΚÏÏια/Εμφάνιση πηγής κατά την αποσÏνδεση πηγής." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "Επιλέξτε αυτό το πλαίσιο για να ενεÏγοποιηθεί αυτόματα η η ΚÏÏια/Εμφάνιση πηγής κατά την σÏνδεση πηγής." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "Εάν ο διακομιστής Icecast πεÏιμένει ένα όνομα χÏήστη από την «πηγή», αυτό το πεδίο μποÏεί να μείνει κενό." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "Εάν ο live streaming πελάτη σας δεν ζητά ένα όνομα χÏήστη, το πεδίο αυτό θα Ï€Ïέπει να είναι η «πηγή»." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "Εάν αλλάξετε το όνομα χÏήστη ή τον κωδικό Ï€Ïόσβασης για ένα ενεÏγοποιημένο stream, η μηχανή playout θα Ï€Ïαγματοποιήσει επανεκκίνηση και οι ακÏοατές σας θα ακοÏσουν σιωπή για 5-10 δευτεÏόλεπτα. Με την αλλαγή των παÏακάτω πεδίων ΔΕΠθα Ï€Ïοκληθεί επανεκκίνηση: Stream Label (Γενικές Ρυθμίσεις), και Εναλλαγή Fade(s) Μετάβασης, ΚÏÏιο Όνομα χÏήστη και ΚÏÏιος Κωδικός Ï€Ïόσβασης (Ρυθμίσεις Stream Εισόδου). Αν το Airtime ηχογÏαφεί και αν η αλλαγή Ï€Ïοκαλέσει επανεκκίνηση της μηχανής playout, η ηχογÏάφηση θα διακοπεί." #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "Αυτό είναι το Icecast/SHOUTcast όνομα χÏήστη και ο κωδικός Ï€Ïόσβασης διαχειÏιστή για τις στατιστικές ακÏοατών." #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "ΠÏοειδοποίηση: Δεν μποÏείτε να κάνετε αλλαγές κατά την διάÏκεια της εκπομπής " #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2217,9 +1895,7 @@ msgid "No result found" msgstr "Δεν βÏέθηκαν αποτελέσματα" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "Αυτό ακολουθεί το ίδιο Ï€Ïότυπο ασφαλείας για τις εκπομπές: μόνο οι χÏήστες της συγκεκÏιμένης εκπομπής μποÏοÏν να συνδεθοÏν." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2235,16 +1911,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "ΠÏοειδοποίηση: οι εκπομπές δεν μποÏοÏν να συνδεθοÏν εκ νέου" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "Κατά τη διασÏνδεση επαναλαμβανόμενων εκπομπών, όλα τα Ï€ÏογÏαμματισμένα στοιχεία πολυμέσων κάθε εκπομπής θα Ï€ÏογÏαμματιστοÏν σε όλες τις επαναλαμβανόμενες εκπομπές" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "Η ζώνη ÏŽÏας είναι Ïυθμισμένη ανάλογα με τη τοποθεσία του σταθμοÏ. Οι εκμπομπές θα μεταδίδονται στην τοπική ÏŽÏα, Ïυθμισμένη από το Interface Ζώνης ÏŽÏας στις Ïυθμίσεις χÏήστη " #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2392,87 +2063,16 @@ msgstr "σήμεÏα" msgid "day" msgstr "ημέÏα" -#: airtime_mvc/application/controllers/LocaleController.php:238 -msgid "week" -msgstr "εβδομάδα" - -#: airtime_mvc/application/controllers/LocaleController.php:239 -msgid "month" -msgstr "μήνας" - -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "ΚυÏιακή" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "ΔευτέÏα" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "ΤÏίτη" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "ΤετάÏτη" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "Πέμπτη" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "ΠαÏασκευή" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Σάββατο" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "ΚυÏ" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "Δευ" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "ΤÏι" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "Τετ" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "Πεμ" - -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "ΠαÏ" - -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "Σαβ" +#: airtime_mvc/application/controllers/LocaleController.php:238 +msgid "week" +msgstr "εβδομάδα" + +#: airtime_mvc/application/controllers/LocaleController.php:239 +msgid "month" +msgstr "μήνας" #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Εκπομπές μεγαλÏτεÏες από την Ï€ÏογÏαμματισμένη διάÏκειά τους θα διακόπτονται από την επόμενη εκπομπή." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2500,6 +2100,11 @@ msgstr "ΑφαίÏεση όλου του πεÏιεχομένου;" msgid "Delete selected item(s)?" msgstr "ΔιαγÏαφή επιλεγμένου στοιχείου/ων;" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "ΈναÏξη" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "Τέλος" @@ -2533,14 +2138,6 @@ msgstr "Μετακίνηση 1 Στοιχείου" msgid "Moving %s Items" msgstr "Μετακίνηση Στοιχείων %s" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "ΑκÏÏωση" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "ΕπεξεÏγαστής Fade" @@ -2550,8 +2147,7 @@ msgid "Cue Editor" msgstr "ΕπεξεÏγαστής Cue" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "Τα χαÏακτηÏιστικά της κυμματοειδοÏÏ‚ μοÏφής είναι διαθέσιμα σε Ï€ÏόγÏαμμα πλοήγησης που υποστηÏίζει Web Audio API" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2578,1333 +2174,1627 @@ msgstr "Μετάβαση στο Ï„Ïέχον κομμάτι " msgid "Cancel current show" msgstr "ΑκÏÏωση Ï„Ïέχουσας εκπομπής" -#: airtime_mvc/application/controllers/LocaleController.php:302 -msgid "Open library to add or remove content" -msgstr "Άνοιγμα βιβλιοθήκης για Ï€Ïοσθήκη ή αφαίÏεση πεÏιεχομένου" +#: airtime_mvc/application/controllers/LocaleController.php:302 +msgid "Open library to add or remove content" +msgstr "Άνοιγμα βιβλιοθήκης για Ï€Ïοσθήκη ή αφαίÏεση πεÏιεχομένου" + +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "ΠÏοσθήκη / ΑφαίÏεση ΠεÏιεχομένου" + +#: airtime_mvc/application/controllers/LocaleController.php:305 +msgid "in use" +msgstr "σε χÏήση" + +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "Δίσκος" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "Κοιτάξτε σε" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "Άνοιγμα" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "Οι επισκέπτες μποÏοÏν να κάνουν τα παÏακάτω" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "ΠÏοβολή ΠÏογÏάμματος" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "ΠÏοβολή πεÏιεχομένου εκπομπής" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "Οι DJ μποÏοÏν να κάνουν τα παÏακάτω" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "ΔιαχείÏιση ανατεθημένου πεÏιεχομένου εκπομπής" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "Εισαγωγή αÏχείων πολυμέσων" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "ΔημιουÏγία λιστών αναπαÏαγωγής, smart blocks, και webstreams " + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "ΔιαχείÏιση Î´Î¹ÎºÎ¿Ï Ï„Î¿Ï…Ï‚ πεÏιεχομένου βιβλιοθήκης" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "Οι ÎœÎ¬Î½Î±Ï„Î¶ÎµÏ Î ÏογÏάμματος μποÏοÏν να κάνουν τα παÏακάτω:" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "ΠÏοβολή και διαχείÏιση πεÏιεχομένου εκπομπής" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "ΠÏόγÏαμμα εκπομπών" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "ΔιαχείÏιση όλου του πεÏιεχομένου βιβλιοθήκης" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "ΟΙ ΔιαχειÏιστές μποÏοÏν να κάνουν τα παÏακάτω:" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "ΔιαχείÏιση Ï€Ïοτιμήσεων" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "ΔιαχείÏιση ΧÏηστών" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "ΔιαχείÏιση Ï€Ïοβεβλημένων φακέλων " + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "ΠÏοβολή κατάστασης συστήματος" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "ΠÏόσβαση στην ιστοÏία playout" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "ΠÏοβολή στατιστικών των ακÏοατών" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "Εμφάνιση / απόκÏυψη στηλών" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "Από {από} σε {σε}" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "Kbps" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "εεεε-μμ-ηη" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" +msgstr "ωω:λλ:δδ.t" + +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" +msgstr "kHz" + +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" +msgstr "Κυ" + +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" +msgstr "Δε" + +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" +msgstr "ΤÏ" + +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" +msgstr "Τε" + +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" +msgstr "Πε" + +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" +msgstr "Πα" + +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" +msgstr "Σα" + +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Κλείσιμο" + +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" +msgstr "ÎÏα" + +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" +msgstr "Λεπτό" + +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" +msgstr "ΟλοκληÏώθηκε" + +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" +msgstr "Επιλογή αÏχείων" + +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." +msgstr "ΠÏοσθέστε αÏχεία στην ουÏά ανεβάσματος και κάντε κλίκ στο κουμπί έναÏξης" + +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "Κατάσταση" + +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" +msgstr "ΠÏοσθήκη ΑÏχείων" + +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" +msgstr "Στάση Ανεβάσματος" + +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" +msgstr "ΈναÏξη ανεβάσματος" + +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" +msgstr "ΠÏοσθήκη αÏχείων" + +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" +msgstr "Ανέβηκαν %d/%d αÏχεία" + +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" +msgstr "N/A" + +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." +msgstr "ΣÏÏετε αÏχεία εδώ." + +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." +msgstr "Σφάλμα επέκτασης αÏχείου." + +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." +msgstr "Σφάλμα μεγέθους αÏχείου." + +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." +msgstr "Σφάλμα μέτÏησης αÏχείων." + +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." +msgstr "Σφάλμα αÏχικοποίησης." -#: airtime_mvc/application/controllers/LocaleController.php:305 -msgid "in use" -msgstr "σε χÏήση" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." +msgstr "Σφάλμα HTTP." -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" -msgstr "Δίσκος" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." +msgstr "Σφάλμα ασφάλειας." -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" -msgstr "Κοιτάξτε σε" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." +msgstr "Γενικό σφάλμα." -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" -msgstr "Άνοιγμα" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." +msgstr "Σφάλμα IO" -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "ΔιαχειÏιστής" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" +msgstr "ΑÏχείο: %s" -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "DJ" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" +msgstr "%d αÏχεία σε αναμονή" -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "Διευθυντής ΠÏογÏάμματος" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" +msgstr "ΑÏχείο: %f, μέγεθος: %s, μέγιστο μέγεθος αÏχείου: %m" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "Επισκέπτης" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" +msgstr "Το URL είτε είναι λάθος ή δεν υφίσταται" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" -msgstr "Οι επισκέπτες μποÏοÏν να κάνουν τα παÏακάτω" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " +msgstr "Σφάλμα: Î Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿ αÏχείο: " -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" -msgstr "ΠÏοβολή ΠÏογÏάμματος" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " +msgstr "Σφάλμα: Μη έγκυÏη Ï€Ïοέκταση αÏχείου: " -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" -msgstr "ΠÏοβολή πεÏιεχομένου εκπομπής" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "Ως ΠÏοεπιλογή" -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" -msgstr "Οι DJ μποÏοÏν να κάνουν τα παÏακάτω" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" +msgstr "ΔημιουÏγία Εισόδου" -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" -msgstr "ΔιαχείÏιση ανατεθημένου πεÏιεχομένου εκπομπής" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" +msgstr "ΕπεξεÏγασία ΙστοÏικοÏ" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" -msgstr "Εισαγωγή αÏχείων πολυμέσων" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" +msgstr "ΑντιγÏάφηκαν %s σειÏές%s στο Ï€ÏόχειÏο" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" -msgstr "ΔημιουÏγία λιστών αναπαÏαγωγής, smart blocks, και webstreams " +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." +msgstr "%sΕκτÏπωση Ï€Ïοβολής%sΠαÏακαλοÏμε να χÏησιμοποιείσετε την λειτουÏγία εκτÏπωσης του πεÏιηγητή σας για να τυπώσετε τον πίνακα. Όταν τελειώσετε πατήστε escape" -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" -msgstr "ΔιαχείÏιση Î´Î¹ÎºÎ¿Ï Ï„Î¿Ï…Ï‚ πεÏιεχομένου βιβλιοθήκης" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "Δεν έχετε άδεια για αποσÏνδεση πηγής." -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" -msgstr "Οι ÎœÎ¬Î½Î±Ï„Î¶ÎµÏ Î ÏογÏάμματος μποÏοÏν να κάνουν τα παÏακάτω:" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "Δεν υπάÏχει καμία πηγή που είναι συνδεδεμένη σε αυτή την είσοδο." -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" -msgstr "ΠÏοβολή και διαχείÏιση πεÏιεχομένου εκπομπής" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "Δεν έχετε άδεια για αλλαγή πηγής." -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" -msgstr "ΠÏόγÏαμμα εκπομπών" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "Βλέπετε μια παλαιότεÏη έκδοση του %s" -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" -msgstr "ΔιαχείÏιση όλου του πεÏιεχομένου βιβλιοθήκης" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "Δεν μποÏείτε να Ï€Ïοσθέσετε κομμάτια σε δυναμικά blocks." -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" -msgstr "ΟΙ ΔιαχειÏιστές μποÏοÏν να κάνουν τα παÏακάτω:" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%s δεν βÏέθηκε" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" -msgstr "ΔιαχείÏιση Ï€Ïοτιμήσεων" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "Δεν έχετε άδεια διαγÏαφής επιλεγμένων %s(s)." -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" -msgstr "ΔιαχείÏιση ΧÏηστών" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "Κάτι πήγε στÏαβά." -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "ΔιαχείÏιση Ï€Ïοβεβλημένων φακέλων " +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "ΜποÏείτε να Ï€Ïοσθέσετε κομμάτια μόνο σε smart block." -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "Αποστολή Σχολίων ΥποστήÏιξης" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "Λίστα ΑναπαÏαγωγλης χωÏίς Τίτλο" -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" -msgstr "ΠÏοβολή κατάστασης συστήματος" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Smart Block χωÏίς Τίτλο" -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" -msgstr "ΠÏόσβαση στην ιστοÏία playout" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "Άγνωστη λίστα αναπαÏαγωγής" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" -msgstr "ΠÏοβολή στατιστικών των ακÏοατών" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "Δεν έχετε δικαίωμα Ï€Ïόσβασης σε αυτό το βοήθημα" -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" -msgstr "Εμφάνιση / απόκÏυψη στηλών" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "Δεν έχετε δικαίωμα Ï€Ïόσβασης σε αυτό το βοήθημα. " -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" -msgstr "Από {από} σε {σε}" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "Το αÏχείο δεν υπάÏχει στο Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" -msgstr "Kbps" +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "Το αÏχείο δεν υπάÏχει στο Airtime" -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" -msgstr "εεεε-μμ-ηη" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "Το αÏχείο δεν υπάÏχει στο Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" -msgstr "ωω:λλ:δδ.t" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "Λανθασμένο αίτημα. Η παÏάμετÏος «κατάσταση» δεν πέÏασε." -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" -msgstr "kHz" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "Λανθασμένο αίτημα. Η παÏάμετÏος «κατάσταση» δεν είναι έγκυÏη" -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" -msgstr "Κυ" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "ΠÏοεπισκόπηση" -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" -msgstr "Δε" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "ΠÏοσθήκη στη λίστα αναπαÏαγωγής" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" -msgstr "ΤÏ" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "ΠÏοσθήκη στο Smart Block" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "ΔιαγÏαφή" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" -msgstr "Τε" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "ΑντιγÏαφή Λίστας ΑναπαÏαγωγής" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" -msgstr "Πε" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "ΕπεξεÏγασία" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" -msgstr "Πα" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "Soundcloud" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" -msgstr "Σα" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "ΠÏοβολή σε Soundcloud" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" -msgstr "ÎÏα" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "ΕπαναφόÏτωση σε SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" -msgstr "Λεπτό" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Ανέβασμα σε SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" -msgstr "ΟλοκληÏώθηκε" +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "Καμία διαθέσιμη δÏάση" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" -msgstr "Επιλογή αÏχείων" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "Δεν έχετε άδεια διαγÏαφής των επιλεγμένων στοιχείων." -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." -msgstr "ΠÏοσθέστε αÏχεία στην ουÏά ανεβάσματος και κάντε κλίκ στο κουμπί έναÏξης" +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "Δεν ήταν δυνατή η διαγÏαφή οÏισμένων Ï€ÏογÏαμματισμένων αÏχείων." -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" -msgstr "ΠÏοσθήκη ΑÏχείων" +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "ΑντιγÏαφή από %s" -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" -msgstr "Στάση Ανεβάσματος" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Επιλέξτε cursor" -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" -msgstr "ΈναÏξη ανεβάσματος" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "ΑφαίÏεση cursor" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" -msgstr "ΠÏοσθήκη αÏχείων" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "η εκπομπή δεν υπάÏχει" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" -msgstr "Ανέβηκαν %d/%d αÏχεία" +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." +msgstr "Οι Ï€Ïοτιμήσεις ενημεÏώθηκαν." -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" -msgstr "N/A" +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." +msgstr "Η ÏÏθμιση υποστήÏιξης ενημεÏώθηκε." -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." -msgstr "ΣÏÏετε αÏχεία εδώ." +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" +msgstr "Σχόλια ΥποστήÏιξης" -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." -msgstr "Σφάλμα επέκτασης αÏχείου." +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." +msgstr "Η ΡÏθμιση Stream ΕνημεÏώθηκε." -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." -msgstr "Σφάλμα μεγέθους αÏχείου." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" +msgstr "η διαδÏομή Ï€Ïέπει να καθοÏιστεί" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." -msgstr "Σφάλμα μέτÏησης αÏχείων." +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." +msgstr "ΠÏόβλημα με Liquidsoap ..." -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." -msgstr "Σφάλμα αÏχικοποίησης." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "ΑναπαÏαγωγή σε Εξέλιξη" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." -msgstr "Σφάλμα HTTP." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "ΠÏοσθήκη Πολυμέσων" -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." -msgstr "Σφάλμα ασφάλειας." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Βιβλιοθήκη" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." -msgstr "Γενικό σφάλμα." +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "ΗμεÏολόγιο" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." -msgstr "Σφάλμα IO" +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "ΣÏστημα" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" -msgstr "ΑÏχείο: %s" +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "ΠÏοτιμήσεις" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" -msgstr "%d αÏχεία σε αναμονή" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "XÏήστες" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" -msgstr "ΑÏχείο: %f, μέγεθος: %s, μέγιστο μέγεθος αÏχείου: %m" +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Φάκελοι Πολυμέσων" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" -msgstr "Το URL είτε είναι λάθος ή δεν υφίσταται" +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Streams" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " -msgstr "Σφάλμα: Î Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿ αÏχείο: " +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "Στατιστικές ΑκÏοατών" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " -msgstr "Σφάλμα: Μη έγκυÏη Ï€Ïοέκταση αÏχείου: " +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "ΙστοÏικό" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" -msgstr "ΔημιουÏγία Εισόδου" +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "ΙστοÏικό Playout" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" -msgstr "ΕπεξεÏγασία ΙστοÏικοÏ" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "ΙστοÏικό Template" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" -msgstr "ΑντιγÏάφηκαν %s σειÏές%s στο Ï€ÏόχειÏο" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "Βοήθεια" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." -msgstr "%sΕκτÏπωση Ï€Ïοβολής%sΠαÏακαλοÏμε να χÏησιμοποιείσετε την λειτουÏγία εκτÏπωσης του πεÏιηγητή σας για να τυπώσετε τον πίνακα. Όταν τελειώσετε πατήστε escape" +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "ΈναÏξη" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "ΠαÏακαλώ εισάγετε το όνομα χÏήστη και τον κωδικό Ï€Ïόσβασής σας" +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "ΕγχειÏίδιο ΧÏήστη" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "ΆκυÏο όνομα χÏήστη ή κωδικός Ï€Ïόσβασης. ΠαÏακαλώ δοκιμάστε ξανά." +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "Σχετικά" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "Το e-mail δεν μπόÏεσε να σταλεί. Ελέγξτε τις Ïυθμίσεις email του διακομιστή σας και βεβαιωθείτε ότι έχει Ïυθμιστεί σωστά." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "ΕξυπηÏέτηση" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "Το email δεν βÏέθηκε." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "ΧÏόνος λειτουÏγίας" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." -msgstr "Οι Ï€Ïοτιμήσεις ενημεÏώθηκαν." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "CPU" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." -msgstr "Η ÏÏθμιση υποστήÏιξης ενημεÏώθηκε." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "Μνήμη" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" -msgstr "Σχόλια ΥποστήÏιξης" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Έκδοση Airtime" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." -msgstr "Η ΡÏθμιση Stream ΕνημεÏώθηκε." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "ΧώÏος δίσκου" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" -msgstr "η διαδÏομή Ï€Ïέπει να καθοÏιστεί" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "Ρυθμίσεις Δακομιστή Email / ΑλληλογÏαφίας" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." -msgstr "ΠÏόβλημα με Liquidsoap ..." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "Ρυθμίσεις SoundCloud" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Επιλέξτε cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Επανάληψη ΗμεÏών:" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "ΑφαίÏεση cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "ΑφαίÏεση" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "η εκπομπή δεν υπάÏχει" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "ΠÏοσθήκη" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Webstream χωÏίς Τίτλο" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "URL ΣÏνδεσης: " -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Το Webstream αποθηκεÏτηκε." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "Ρυθμίσεις Stream Εισόδου" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "ΆκυÏες μοÏφές αξίας." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "URL ΣÏνδεσης ΚυÏίαÏχης Πηγής:" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "Βλέπετε μια παλαιότεÏη έκδοση του %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "ΠαÏάκαμψη" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "Δεν μποÏείτε να Ï€Ïοσθέσετε κομμάτια σε δυναμικά blocks." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "ΟΚ" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "Δεν έχετε άδεια διαγÏαφής επιλεγμένων %s(s)." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "ΕΠΑÎΑΦΟΡΑ" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "ΜποÏείτε να Ï€Ïοσθέσετε κομμάτια μόνο σε smart block." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "Εμφάνιση Πηγής URL ΣÏνδεσης:" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "Λίστα ΑναπαÏαγωγλης χωÏίς Τίτλο" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(Απαιτείται)" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Smart Block χωÏίς Τίτλο" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "ΕγγÏαφή σε Airtime" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "Άγνωστη λίστα αναπαÏαγωγής" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Βοηθείστε στη βελτίωση του Airtime, ενημεÏώνοντας μας για την χÏήση που του κάνετε. Αυτές οι πληÏοφοÏίες θα συλλέγονται τακτικά, Ï€Ïοκειμένου να ενισχÏσουν την εμπειÏία των χÏηστών σας. %sΚάντε κλικ στο κουμπί 'Îαι, βοηθώ το Airtime' και θα βεβαιωθείτε ότι οι λειτουÏγίες που χÏησιμοποιείτε συνεχώς βελτιώνεται." -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "Η σελίδα δεν βÏέθηκε" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "Κάντε κλικ στο παÏακάτω πλαίσιο για να διαφημίσετε το σταθμό σας στην ιστοσελίδα %s Sourcefabric.org %s . ΠÏοκειμένου να το κάνετε Ï€Ïέπει η επιλογή 'Αποστολή σχολίων υποστήÏιξης» να είναι ενεÏγοποιημένη. Αυτά τα δεδομένα θα συλλέγονται μαζί με Ï„o feedback σας." -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Σφάλμα εφαÏμογής" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(Μόνο για σκοποÏÏ‚ επαλήθευσης, δεν θα δημοσιευθεί)" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "Ο χÏήστης Ï€Ïοστέθηκε επιτυχώς!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Σημείωση: Οτιδήποτε μεγαλÏτεÏο από 600x600 θα αλλάξει μέγεθος." -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "Ο χÏήστης ενημεÏώθηκε με επιτυχία!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Δείξε μου τι στέλνω " -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "Οι Ïυθμίσεις ενημεÏώθηκαν επιτυχώς!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "ÎŒÏοι και ΠÏοϋποθέσεις" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "Το έτος %s Ï€Ïέπει να είναι εντός του εÏÏους 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s δεν αποτελεί έγκυÏη ημεÏομηνία" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Επιλέξτε φάκελο" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s : %s : %s δεν αποτελεί έγκυÏη ÏŽÏα" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "ΟÏισμός" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "Εκπομπή χωÏίς Τίτλο" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "ΤÏέχων Φάκελος Εισαγωγής:" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "Εισαγωγή Φακέλου:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "ΕπανασάÏωση Ï€Ïοβεβλημμένου ευÏετηÏίου (Αυτό είναι χÏήσιμο αν το δίκτυο στήÏιξης είναι εκτός συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î¼Îµ το Airtime)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "ΠαÏοβεβλημμένοι Φάκελοι:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "ΑφαίÏεση Ï€Ïοβεβλημμένου ευÏετηÏίου" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "Μη έγκυÏο ΕυÏετήÏιο" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "Δεν παÏακολουθείτε κανέναν φάκελο πολυμέσων." -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Όνομα ΧÏήστη:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "Stream " -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "Κωδικός Ï€Ïόσβασης:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "ΠÏόσθετες επιλογές" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "Επαλήθευση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "Η παÏακάτω πληÏοφοÏία θα εμφανίζεται στις συσκευές αναπαÏαγωγής πολυμέσων των ακÏοατών σας:" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "Όνομα:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(Ιστοσελίδα του Î¡Î±Î´Î¹Î¿Ï†Ï‰Î½Î¹ÎºÎ¿Ï ÏƒÏ„Î±Î¸Î¼Î¿Ï)" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "Επώνυμο:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "URL Stream: " -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "Email:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "ΦιλτÏάÏισμα ΙστοÏίας" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Κινητό Τηλέφωνο:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "ΕÏÏεση Εκπομπών" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "ΦιλτÏάÏισμα βάσει Εκπομπών:" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "%s's Ρυθμίσεις" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "ΤÏπος ΧÏήστη:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Βοηθείστε το Airtime ενημεÏώνοντας τη Sourcefabric για τη χÏήση που του κάνετε. Αυτές οι πληÏοφοÏίες θα συλλέγονται τακτικά, Ï€Ïοκειμένου να ενισχÏσουν την εμπειÏία των χÏηστών σας. %s Κάντε κλικ στο πλαίσιο Αποστολή σχολίων υποστήÏιξης» και θα βεβαιωθείτε ότι οι λειτουÏγίες που χÏησιμοποιείτε βελτιώνοται συνεχώς." -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "Το όνομα εισόδου δεν είναι μοναδικό." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "Κάντε κλικ στο παÏακάτω πλαίσιο για να Ï€Ïοωθήσετε τον σταθμό σας στην ιστοσελίδα %sSourcefabric.org%s ." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "Αυτόματη ΑπενεÏγοποίηση" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(Για να Ï€Ïοωθήσετε τον σταθμό σας, η 'Αποστολή σχολίων υποστήÏιξης» Ï€Ïέπει να είναι ενεÏγοποιημένη)." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "Αυτόματη ΕνεÏγοποίηση" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Πολιτική ΠÏοστασίας ΠÏοσωπικών Δεδομένων της Sourcefabric" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "Διακόπτης Fade Μετάβασης (s)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "Επιλογή ΠαÏουσίας Εκπομπής" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "εισάγετε την ÏŽÏα σε δευτεÏόλεπτα 00{.000000}" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "ΕÏÏεση" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "ΚÏÏιο Όνομα ΧÏήστη" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Επιλέξτε ΗμέÏες:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "ΚÏÏιος Κωδικός ΠÏόσβασης" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Επιλογές Smart Block" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "URL ΣÏνδεσης ΚÏÏιας Πηγής " +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "ή" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "Εμφάνιση URL ΣÏνδεσης Πηγής " +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "και" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "ΚÏÏιο Port Πηγής" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr " να " -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "ΕπιτÏέπονται μόνο αÏιθμοί." +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "τα αÏχεία πληÏοÏν τα κÏιτήÏια" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "ΚÏÏιο Σημείο ΠÏοσάÏτησης Πηγής" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "το αÏχείο πληÏεί τα κÏιτήÏια" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Εισαγωγή άκυÏου χαÏακτήÏα" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "ΔημιουÏγία ΑÏχείου ΠεÏίληψης Template " -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Εμφάνιση Port Πηγής" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "ΔημιουÏγία Template ΦόÏμας ΣÏνδεσης" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "Εμφάνιση Σημείου ΠÏοσάÏτησης Πηγής" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "ΠÏοσθήκη πεÏισσότεÏων στοιχείων" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "Δεν μποÏείτε να χÏησιμοποιήσετε το ίδιο port ως Master DJ Show port." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "ΠÏοσθήκη Îέου Πεδίου" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "Μη διαθέσιμο Port %s " +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "ΟÏισμός ΠÏοεπιλεγμένου Template " -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%value%' δεν ταιÏιάζει με τη μοÏφή της ÏŽÏας 'ΩΩ:λλ'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" +msgstr "Template ΦόÏμας ΣÏνδεσης" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "ΗμεÏομηνία/ÎÏα ΈναÏξης:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "Κανένα Template ΦόÏμας ΣÏνδεσης" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "ΗμεÏομηνία/ÎÏα Λήξης:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "Îέο Template ΦόÏμας ΣÏνδεσης" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "ΔιάÏκεια:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" +msgstr "Template ΠεÏίληψης ΑÏχείου" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "Ζώνη ÎÏας" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" +msgstr "Κανένα Template ΠεÏίληψης ΑÏχείου" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "Επαναλήψεις;" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "Îέο Template ΠεÏίληψης ΑÏχείου" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "Δεν είναι δυνατή η δημιουÏγία εκπομπής στο παÏελθόν" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "Îέο" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "ΑδÏνατη η Ï„Ïοποποίηση ημεÏομηνίας/ÏŽÏας έναÏξης της εκπομπής που έχει ήδη αÏχίσει" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "Îέα λίστα αναπαÏαγωγής" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "Δεν μποÏεί να έχει διάÏκεια < 0m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "Îέο Smart Block" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "Δεν μποÏεί να έχει διάÏκεια 00h 00m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "Îέο Webstream" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "Δεν μποÏεί να έχει διάÏκεια μεγαλÏτεÏη από 24 ÏŽÏες" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "ΠÏοβολή / επεξεÏγασία πεÏιγÏαφής" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" -msgstr "ΣÏνδεσμος" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "URL Stream:" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "ΤÏπος Επανάληψης:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "ΠÏοεπιλεγμένη ΔιάÏκεια:" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "εβδομαδιαία" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "Κανένα webstream" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" -msgstr "κάθε 2 εβδομάδες" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "Ρυθμίσεις Stream" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" -msgstr "κάθε 3 εβδομάδες" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Γενικές Ïυθμίσεις" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" -msgstr "κάθε 4 εβδομάδες" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "βΔ" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "Ρυθμίσεις Stream Εξόδου" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "μηνιαία" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "Εισαγωγή αÏχείου σε εξέλιξη..." -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Επιλέξτε ΗμέÏες:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "ΠÏοηγμένες Επιλογές Αναζήτησης" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "Επανάληψη από:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "Ï€ÏοηγοÏμενο" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "ημέÏα του μήνα" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "αναπαÏαγωγή" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "ημέÏα της εβδομάδας" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "παÏση" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "ΗμεÏομηνία Λήξης:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "επόμενο" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "ΧωÏίς Τέλος;" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "στάση" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "Η ημεÏομηνία λήξης Ï€Ïέπει να είναι μετά την ημεÏομηνία έναÏξης" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "Σίγαση" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "Επιλέξτε ημέÏα επανάληψης" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "ΚατάÏγηση σίγασης" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "Απαιτείται αξία και δεν μποÏεί να είναι κενή" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "μέγιστη ένταση" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "Κωδικός Ï€Ïόσβασης" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "Απαιτείται ΕνημέÏωση " -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "Επιβεβαίωση νέου ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "Για να παίξετε τα πολυμέσα θα Ï€Ïέπει είτε να αναβαθμίστε το Ï€ÏόγÏαμμα πεÏιήγησηής σας σε μια Ï€Ïόσφατη έκδοση ή να ενημέÏώσετε το %sFlash plugin %s σας." -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "Η επιβεβαίωση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î´ÎµÎ½ ταιÏιάζει με τον κωδικό Ï€Ïόσβασής σας." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "ΔιάÏκεια:" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Αποκτήστε νέο κωδικό Ï€Ïόσβασης" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "Ρυθμός δειγματοληψίας:" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Όνομα ΣταθμοÏ" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "ΑÏιθμός ISRC:" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Τηλέφωνο:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "ΔιαδÏομή ΑÏχείου" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "Ιστοσελίδα ΣταθμοÏ:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Web Stream" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "ΧώÏα" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "Δυναμικά Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "Πόλη" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "Στατικά Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "ΠεÏιγÏαφή ΣταθμοÏ:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Κομμάτι Ήχου" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Λογότυπο ΣταθμοÏ:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "ΠεÏιεχόμενα Λίστας ΑναπαÏαγωγής: " -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "ΠÏοώθηση του ÏƒÏ„Î±Î¸Î¼Î¿Ï Î¼Î¿Ï… στην ιστοσελίδα Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "ΠεÏιεχόμενα Στατικών Smart Block : " -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "Με την επιλογή του πλαισίου, συμφωνώ με την %sπολιτική αποÏÏήτου%s της Sourcefabric." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "ΚÏιτήÏια Δυναμικών Smart Block: " -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "ΠÏέπει να συμφωνείτε με την πολιτική Ï€Ïοστασίας Ï€Ïοσωπικών δεδομένων." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "ÎŒÏιο για " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%value%' δεν αποτελεί έγκυÏη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου στη βασική μοÏφή local-part@hostname" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%' δεν ταιÏιάζει με τη μοÏφή ημεÏομηνίας '%format%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%' είναι λιγότεÏο από %min% χαÏακτήÏες " +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%value%' είναι πεÏισσότεÏο από %max% χαÏακτήÏες " +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "ΚαταμέτÏηση ΑκÏοατών με την ΠάÏοδου ΧÏόνου" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%' δεν είναι Î¼ÎµÏ„Î±Î¾Ï '%min%' και '%max%', συνολικά" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Καλώς ήÏθατε στο Airtime!" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "Οι κωδικοί Ï€Ïόσβασης δεν συμπίπτουν" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Διαβάστε τις οδηγίες για να ξεκινήσετε να χÏησιμοποιείται το Airtime, για την αυτοματοποίηση των εκπομπών σας: " -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "ΕνεÏγοποιημένο" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "Ξεκινήστε με την Ï€Ïοσθήκη αÏχείων στη βιβλιοθήκη επιλέγοντας 'ΠÏοσθήκη Πολυμέσων' στο μενοÏ. ΜποÏείτε να κάνετε και drag-and-drop στα αÏχεία σας σε αυτό το παÏάθυÏο." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "ΤÏπος Stream:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "ΔημιουÏγήστε μια εκπομπή πηγαίνοντας στο «ΗμεÏολόγιο» και στη συνέχεια κάνοντας κλικ στο εικονίδιο '+Εκπομπή'. Αυτό μποÏεί να είναι είτε μια ή επαναλαμβανόμενες εκπομπές. Μόνο οι διαχειÏιστές και οι μουσικοί παÏαγωγοί μποÏοÏν να επεξεÏγαστοÏν την εκπομπή." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "ΤÏπος ΥπηÏεσίας:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "ΠÏοσθέστε πολυμέσα στην εκπομπή σας πηγαίνοντας στο ΗμεÏολόγιο Ï€ÏογÏαμματισμοÏ, κάνοντας αÏιστεÏÏŒ κλικ πάνω στην εκπομπή και επιλέγοντας 'ΠÏοσθήκη / ΑφαίÏεση ΠεÏιεχομένου'" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "Κανάλια" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Επιλέξτε τα πολυμέσα σας από το αÏιστεÏÏŒ τμήμα του παÏαθÏÏου και σÏÏετέ τα στην εκπομπή σας στο δεξιό τμήμα." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "Και είστε έτοιμοι!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "Για πεÏισσότεÏες αναλυτικές οδηγίες, διαβάστε το %sεγχειÏίδιο%s ." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Διακομιστής" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "ΜοιÏαστείτε" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "ΘÏÏα" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Επιλέξτε stream:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "ΔιεÏθυνση URL:" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sΤο Airtime%s %s, το Î±Î½Î¿Î¹ÎºÏ„Î¿Ï ÎºÏŽÎ´Î¹ÎºÎ± λογισμικό για Ï€ÏογÏαμματισμό και διαχείÏιση Ïαδιοφωνικών σταθμών εξ αποστάσεως. %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Σημείο ΠÏοσάÏτησης" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%s Sourcefabric%s o.p.s. Το Airtime διανέμεται υπό %s GNU GPL v.3 %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "ΔιαχειÏιστής ΧÏήστης" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "Îέος κωδικός Ï€Ïόσβασης" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "Κωδικός Ï€Ïόσβασης ΔιαχειÏιστή" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "ΠαÏακαλώ εισάγετε και επαληθεÏστε τον νέο κωδικό Ï€Ïόσβασής σας στα παÏακάτω πεδία. " -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "Ο διακομιστής δεν μποÏεί να είναι κενός." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "ΠαÏακαλώ εισάγετε τη διεÏθυνση e-mail σας. Θα λάβετε ένα σÏνδεσμο για να δημιουÏγήσετε έναν νέο κωδικό Ï€Ïόσβασης μέσω e-mail." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "Το Port δεν μποÏεί να είναι κενό." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "Το e-mail εστάλη" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "Η Ï€ÏοσάÏτηση δεν μποÏεί να είναι κενή με διακομιστή Icecast." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "Το e-mail εστάλη" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "Έξοδος Hardware Ήχου" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "ΕπιστÏοφή στην σελίδα εισόδου" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "ΤÏπος Εξόδου" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "Καλώς ήÏθατε στο online demo του Airtime! ΜποÏείτε να συνδεθείτε χÏησιμοποιώντας το όνομα χÏήστη «admin» και τον κωδικό Ï€Ïόσβασης «admin»." -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Μεταδεδομένα Icecast Vorbis " +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "ΠÏοηγοÏμενο" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "Stream Label:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "Επόμενο" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "Καλλιτέχνης - Τίτλος" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "Πηγή Streams" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Εκπομπή - Καλλιτέχνης - Τίτλος" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "ΚÏÏια Πηγή " -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Όνομα Î£Ï„Î±Î¸Î¼Î¿Ï - Όνομα Εκπομπής" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "Εμφάνιση Πηγής " -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "Μεταδεδομένα Off Air" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "ΠÏόγÏαμμα" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "ΕνεÏγοποίηση Επανάληψη ΚέÏδους" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "ON AIR" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "ΤÏοποποιητής Επανάληψης ΚέÏδους" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "ΑκοÏστε!" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "Αναζήτηση ΧÏηστών:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "ΧÏόνος σταθμοÏ" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "Το δοκιμαστικό λήγει σε" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "ΗχογÏάφηση από Line In;" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "ΑγοÏάστε το δικό σας αντίγÏαφο του Airtime" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "Αναμετάδοση;" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "Ο λογαÏιασμός μου" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "ΕνεÏγοποίηση Emails Συστήματος (ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "ΔιαχείÏιση ΧÏηστών" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "ΕπαναφοÏά ÎšÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης 'Από' E-mail" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "Îέος ΧÏήστης" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "ΔιαμόÏφωση Διακομιστή ΑλληλογÏαφίας" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "ταυτότητα" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "Απαιτείται Έλεγχος Ταυτότητας" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "Όνομα" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "Διακομιστής ΑλληλογÏαφίας" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "Επώνυμο" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "ΔιεÏθυνση ΗλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Î¤Î±Ï‡Ï…Î´Ïομείου" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "ΤÏπος ΧÏήστη" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "ΠληκτÏολογήστε τους χαÏακτήÏες που βλέπετε στην παÏακάτω εικόνα." +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "Σελίδα ΣÏνδεσης" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "Η μέÏα Ï€Ïέπει να Ï€ÏοσδιοÏιστεί" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "ΠεÏίληψη ΑÏχείων" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "Η ÏŽÏα Ï€Ïέπει να Ï€ÏοσδιοÏιστεί" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "ΠÏοβολή ΠεÏίληψης" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "ΠÏέπει να πεÏιμένετε τουλάχιστον 1 ÏŽÏα για την αναμετάδοση" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "ΕφαÏμογή ΠÏοεπιλεγμένου Πλαισίου Zend " -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Ταυτοποίηση ΧÏήστη Airtime:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "Η σελίδα δεν βÏέθηκε!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "ΧÏήση ΠÏοσαÏμοσμένης Ταυτοποίησης:" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "Η σελίδα που ψάχνατε δεν υπάÏχει!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "ΠÏοσαÏμοσμένο Όνομα ΧÏήστη" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "Επέκταση Στατικών Block" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "ΠÏοσαÏμοσμένος Κωδικός ΠÏόσβασης" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "Επέκταση Δυναμικών Block" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "Το πεδίο 'Όνομα ΧÏήστη' δεν μποÏεί να είναι κενό." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "Άδειασμα smart block" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "Το πεδίο 'Κωδικός ΠÏόσβασης' δεν μποÏεί να είναι κενό." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "Άδειασμα λίστας αναπαÏαγωγής" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "ΗμεÏομηνία ΈναÏξης:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" +msgstr "Άδειασμα πεÏιεχομένου λίστας αναπαÏαγωγής" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "ΠÏοεπιλεγμένη ΔιάÏκεια Crossfade (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" +msgstr "ΕκκαθάÏιση" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "εισάγετε ένα χÏόνο σε δευτεÏόλεπτα 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Shuffle λίστα αναπαÏαγωγής" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" -msgstr "ΠÏοεπιλεγμένο Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Αποθήκευση λίστας αναπαÏαγωγής" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" -msgstr "ΠÏοεπιλεγμένο Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "Crossfade λίστας αναπαÏαγωγής" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "ΕπιτÏέψτε την ΠÏόσβαση \"ΠÏόγÏαμμα\" ΠληÏοφοÏίες;%s σε Ιστοσελίδες με ΑπομακÏυσμένη ΠÏόσβαση (ΕνεÏγοποιήστε το για να λειτουÏγήσουν τα front-end widgets.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "Fade in: " -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "ΑπενεÏγοποιημένο" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Fade out: " -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "ΕνεÏγοποιημένο" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "Καμία ανοικτή λίστα αναπαÏαγωγής" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "ΠÏοεπιλογή Γλώσσας Interface" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" +msgstr "ΕκκαθάÏιση πεÏιεχομένου του smart block" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" -msgstr "Ζώνη ÎÏας ΣταθμοÏ" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(Ss.t)" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "Η Εβδομάδα αÏχίζει " +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "Κανένα ανοικτό smart block " -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" -msgstr "Interface Ζώνης ÏŽÏας:" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" +msgstr "Εμφάνιση κυμματοειδοÏÏ‚ μοÏφής" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "Cue In: " -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(ωω:λλ:δδ.t)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "ÏŽÏες" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Cue Out: " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "λεπτά" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "ΑÏχική ΔιάÏκεια:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "ΟÏισμός Ï„Ïπου smart block:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "ΠÏοσθήκη αυτής της εκπομπής " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "Στατικό" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "ΕνημέÏωση εκπομπής" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "Δυναμικό" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "Τι" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "ΕπιτÏέψτε την επανάληψη κομματιών:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "Πότε" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "ÎŒÏιο για" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "Είσοδος Live Stream " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "ΔημιουÏγία λίστας αναπαÏαγωγής πεÏιεχομένου και αποθήκευση κÏιτηÏίων" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "ΕγγÏαφή και Αναμετάδοση" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "ΔημιουÏγία" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Ποιός" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "ΠεÏιεχόμενο λίστας Shuffle " +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Στυλ" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "Το ÏŒÏιο δεν μποÏεί να είναι κενό ή μικÏότεÏο από 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "Αναμετάδοση του %s από %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "Το ÏŒÏιο δεν μποÏεί να είναι ξεπεÏνάει τις 24 ÏŽÏες" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Επιλέξτε ΧώÏα" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "Η τιμή Ï€Ïέπει να είναι ακέÏαιος αÏιθμός" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "Το μήκος Ï€Ïέπει να είναι μεγαλÏτεÏο από 0 λεπτά" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "Το 500 είναι η μέγιστη οÏιακή τιμή σημείου, που μποÏείτε να οÏίσετε" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "Το μήκος Ï€Ïέπει να είναι υπό μοÏφής \"00h 00m\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "Θα Ï€Ïέπει να επιλέξετε ΚÏιτήÏια και ΤÏοποποιητή" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "Το URL θα Ï€Ïέπει να είναι υπό μοÏφής \"http://domain \"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "Το «Μήκος» θα Ï€Ïέπει να είναι σε υπό μοÏφής '00:00:00'" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "Το URL Ï€Ïέπει να αποτελέιται από μέχÏι και 512 χαÏακτήÏες " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "Η τιμή θα Ï€Ïέπει να είναι υπο μοÏφής ÏŽÏας (Ï€.χ. 0000-00-00 ή 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "Δεν βÏέθηκε Ï„Ïπος MIME για webstream." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "Η τιμή Ï€Ïέπει να είναι αÏιθμός" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "Το όνομα του webstream δεν μποÏεί να είναι κενό" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "Η τιμή Ï€Ïέπει να είναι μικÏότεÏη από 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "Δεν ήταν δυνατή η ανάλυση της λίστας αναπαÏαγωγής XSPF " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "Η τιμή Ï€Ïέπει να είναι μικÏότεÏη από %s χαÏακτήÏες" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "Αδυναμία ανάλυσης λίστας αναπαÏαγωγής PLS" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "Η αξία δεν μποÏεί να είναι κενή" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "Δεν ήταν δυνατή η ανάλυση της λίστας αναπαÏαγωγής M3U" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Εκπομπή:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "Μη έγκυÏο webstream - Αυτό φαίνεται να αποτελεί αÏχείο λήψης." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "Όλες οι Εκπομπές μου:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "Άγνωστος Ï„Ïπος stream: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "ΑÏιθμός ISRC:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s έχει ήδη Ï€Ïοβληθεί." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "Αυτόματο Ανέβασμα ΗχογÏαφημένων Εκπομπών" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s πεÏιέχει ένθετο ευÏετήÏιο Ï€Ïοβεβλημένων: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "ΕνεÏγοποίηση Ανεβάσματος SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s βÏίσκεται σε υποκατηγοÏία υπάÏχωντος ευÏετηÏίου Ï€Ïοβεβλημμένων: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "Αυτόματη Σήμανση ΑÏχείων \"για λήψη \" στο SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s μη έγκυÏο ευÏετήÏιο." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "SoundCloud Email" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s έχει ήδη οÏιστεί ως το Ï„Ïέχον ευÏετήÏιο αποθήκευσης ή βÏίσκεται στη λίστα Ï€Ïοβεβλημένων φακέλων" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "Κωδικός Ï€Ïόσβασης SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s έχει ήδη οÏιστεί ως το Ï„Ïέχον ευÏετήÏιο αποθήκευσης ή βÏίσκεται στη λίστα Ï€Ïοβεβλημένων φακέλων." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "SoundCloud Ετικέτες: (διαχωÏίσετε ετικέτες με κενά)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s δεν υπάÏχει στη λίστα Ï€Ïοβεβλημένων." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "ΠÏοεπιλεγμένο Είδος:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "Η μετακίνηση στοιχείων εκτός συνδεδεμένων εκπομπών είναι αδÏνατη." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "ΠÏοεπιλεγμένος ΤÏπος ΚομματιοÏ:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "Το Ï€ÏόγÏαμμα που βλέπετε δεν είναι έγκυÏο! (αναντιστοιχία Ï€ÏογÏάμματος)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "ΠÏώτυπο" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "Το Ï€ÏόγÏαμμα που βλέπετε δεν είναι ενημεÏωμένο! (αναντιστοιχία παÏαδείγματος)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "Το Ï€ÏόγÏαμμα που βλέπετε δεν είναι ενημεÏωμένο!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "Live" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "Δεν έχετε δικαίωμα Ï€ÏογÏÎ±Î¼Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï ÎµÎºÏ€Î¿Î¼Ï€Î®Ï‚%s.." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "ΕγγÏαφή" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "Δεν μποÏείτε να Ï€Ïοσθεσετε αÏχεία σε ηχογÏαφημένες εκπομπές." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "ΟμιλοÏμενο" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "Η εκπομπή %s έχει τελειώσει και δεν μποÏεί να Ï€ÏογÏαμματιστεί." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "Η εκπομπή %s έχει ενημεÏωθεί Ï€Ïόσφατα!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "Το πεÏιεχόμενο συνδεδεμένων εκπομπών Ï€Ïέπει να να Ï€ÏογÏαμματιστεί Ï€Ïιν ή μετά την αναμετάδοσή τους" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "ΕÏγασία σε εξέλιξη" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "Ένα επιλεγμένο αÏχείο δεν υπάÏχει!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "Στέλεχος" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "Cue in και cue out είναι μηδέν." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "Loop" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "Το cue in δεν μποÏεί να είναι μεγαλÏτεÏης διάÏκειας από το cue out." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Εφέ Ήχου" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "Το cue out δεν μποÏεί να είναι μεγαλÏτεÏο από το μήκος του αÏχείου." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "Δείγμα Shot" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "Το cue out δεν μποÏεί να είναι μικÏότεÏο από το cue in." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Άλλο" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "Το αÏχείο δεν ανέβηκε, υπάÏχει %s MB ελεÏθεÏου χώÏου στο δίσκο και το αÏχείο που ανεβάζετε έχει μέγεθος %s MB." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "ΠÏοεπιλεγμένη Άδεια :" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "Η μέγιστη διάÏκει εκπομπών είναι 24 ÏŽÏες." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "ΕÏγασία δημόσιας χÏήσης" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"Δεν είναι δυνατός ο Ï€ÏογÏαμματισμός αλληλοεπικαλυπτώμενων εκπομπών.\n" +" Σημείωση: Η αλλαγή μεγέθους μιας εκπομπής επηÏεάζει όλες τις επαναλήψεις της." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "ΔιατήÏηση όλων των δικαιωμάτων" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Γεια σας %s , \n" +"\n" +"Πατήστε αυτόν τον σÏνδεσμο για να επαναφέÏετε τον κωδικό Ï€Ïόσβασής σας: " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "Απόδοση Creative Commons" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης Airtime" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "Απόδοση Creative Commons Μη ΕμποÏική ΧÏήση" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "Το αÏχείο δεν υπάÏχει" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "Απόδοση Creative Commons Όχι ΠαÏάγωγα ΈÏγα" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "ΠÏοβολή εγγεγÏαμμένων ΑÏχείων Μεταδεδομένων " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "Απόδοση Creative Commons Share Alike" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Εμφάνιση ΠεÏιεχομένου" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "Απόδοση Creative Commons Μη ΕμποÏική ΧÏήση Όχι ΠαÏάγωγα ΈÏγα" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "ΑφαίÏεση Όλου του ΠεÏιεχομένου" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "Απόδοση Creative Commons Μη ΕμποÏική ΧÏήση Share Alike" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "ΑκÏÏωση ΤÏέχουσας Εκπομπής" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "ΧÏώμα Φόντου:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "ΕπεξεÏγασία της ΠαÏουσίας" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "ΧÏώμα Κειμένου:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "ΕπεξεÏγασία Εκπομπής" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "ΑναπαÏαγωγή σε Εξέλιξη" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "ΔιαγÏαφή Της ΠαÏουσίας" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "ΠÏοσθήκη Πολυμέσων" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "ΔιαγÏαφή Της ΠαÏουσίας και Όλων των Ακόλουθών της" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Βιβλιοθήκη" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "Δεν έχετε δικαίωμα Ï€Ïόσβασης" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "ΗμεÏολόγιο" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "Δεν είναι δυνατό το drag and drop επαναλαμβανόμενων εκπομπών" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "ΣÏστημα" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "Δεν είναι δυνατή η μετακίνηση πεÏασμένης εκπομπής" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "XÏήστες" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "Δεν είναι δυνατή η μετακίνηση εκπομπής στο παÏελθόν" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Φάκελοι Πολυμέσων" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "Δεν είναι δυνατή η μετακίνηση ηχογÏαφημένης εκπομπής σε λιγότεÏο από 1 ÏŽÏα Ï€Ïιν από την αναμετάδοση της." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Streams" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "Η εκπομπή διεγÏάφη επειδή δεν υπάÏχει ηχογÏαφημένη εκπομπή!" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "Στατιστικές ΑκÏοατών" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "ΠÏέπει να πεÏιμένετε 1 ÏŽÏα για την αναμετάδοση." -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" -msgstr "ΙστοÏικό" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" +msgstr "Κομμάτι" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "ΙστοÏικό Playout" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "Παίχτηκε" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "ΙστοÏικό Template" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "Το έτος %s Ï€Ïέπει να είναι εντός του εÏÏους 1753 - 9999" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "ΈναÏξη" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s δεν αποτελεί έγκυÏη ημεÏομηνία" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "ΕγχειÏίδιο ΧÏήστη" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s : %s : %s δεν αποτελεί έγκυÏη ÏŽÏα" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3913,3 +3803,18 @@ msgstr "ΠαÏακαλοÏμε επιλέξτε μια επιλογή" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "Κανένα ΑÏχείο" + +#~ msgid "can't resize a past show" +#~ msgstr "Δεν είναι δυνατή η αλλαγή μεγέθους παÏελθοντικής εκπομπής" + +#~ msgid "Should not overlap shows" +#~ msgstr "ΑδÏνατη η αλληλοεπικάλυψη εκπομπών" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "Αποτυχία δημιουÏγίας «οÏγάνωση» directory." + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "Αυτό το αÏχείο φαίνεται να είναι κατεστÏαμμένο και δεν θα Ï€Ïοστεθεί στη βιβλιοθήκη πολυμέσων." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "Το αÏχείο δεν ανέβηκε, αυτό το σφάλμα μποÏεί να Ï€ÏοκÏψει είτε διότι ο σκληÏός δίσκος του υπολογιστή δεν έχει αÏκετό χώÏο ή διότι ο directory αποθήκευσης δεν έχει έγγυÏες άδειες εγγÏαφής." diff --git a/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po index eef1015ca8..9079c05e97 100644 --- a/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po @@ -1,7 +1,7 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # danielhjames , 2014 # Sourcefabric , 2012 @@ -9,28 +9,16 @@ msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-01-29 17:12+0000\n" "Last-Translator: danielhjames \n" "Language-Team: English (Canada) (http://www.transifex.com/projects/p/airtime/language/en_CA/)\n" +"Language: en_CA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: en_CA\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "Live stream" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -51,9 +39,9 @@ msgid "Stop" msgstr "Stop" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Cue In" @@ -62,9 +50,9 @@ msgid "Set Cue In" msgstr "Set Cue In" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Cue Out" @@ -86,1720 +74,1448 @@ msgstr "Fade In" msgid "Fade Out" msgstr "Fade Out" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "Title" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "Creator" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "Live stream" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "Enabled:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "Length" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "Stream Type:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Genre" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Bit Rate:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "Mood" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "Service Type:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "Label" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "Channels:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "Composer" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Mono" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Stereo" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "Copyright" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Server" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Year" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Invalid character entered" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "Track" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "Port" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "Conductor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "Only numbers are allowed." -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "Language" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "Password" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "Start Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Genre" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "End Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "URL" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "Played" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "Name" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "Record file doesn't exist" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "Description" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "View Recorded File Metadata" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Mount Point" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "View on Soundcloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Username" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "Admin User" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "Re-upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "Admin Password" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Show Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Getting information from the server..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "Add / Remove Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "Server cannot be empty." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "Remove All Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "Port cannot be empty." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "Cancel Current Show" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "Mount cannot be empty with Icecast server." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "Edit This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "Title:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "Edit" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "Creator:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "Edit Show" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Album:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "Delete" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Track:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "Delete This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Genre:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "Delete This Instance and All Following" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Year:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "Permission denied" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "Label:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "Can't drag and drop repeating shows" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "Composer:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "Can't move a past show" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "Conductor:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "Can't move show into past" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "Mood:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "Cannot schedule overlapping shows" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "Can't move a recorded show less than 1 hour before its rebroadcasts." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "Copyright:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "Show was deleted because recorded show does not exist!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "ISRC Number:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "Must wait 1 hour to rebroadcast." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "Website:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "Preferences" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "Language:" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Save" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "Manage Media Folders" - -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "Stream Settings" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "Cancel" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Global Settings" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Username:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "dB" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "Password:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "Output Stream Settings" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "Verify Password:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Choose folder" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "First name:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "Set" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "Last name:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "Current Import Folder:" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "Email:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "Add" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Mobile Phone:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "Remove watched directory" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "You are not watching any media folders." +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "User Type:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "Register Airtime" +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "Guest" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "DJ" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "Program Manager" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(Required)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(for verification purposes only, will not be published)" +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "Admin" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Note: Anything larger than 600x600 will be resized." +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "Login name is not unique." -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Show me what I am sending " +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "Background Colour:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "Terms and Conditions" +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "Text Colour:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "Find Shows" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "Date Start:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "Filter By Show:" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "Date End:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "Reset password" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Show:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Smart Block Options" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "All My Shows:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "or" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "days" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "and" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "Day must be specified" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr " to " +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "Time must be specified" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "files meet the criteria" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "Must wait at least 1 hour to rebroadcast" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "file meet the criteria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "Import Folder:" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "Connection URL: " +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "Watched Folders:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "Not a valid Directory" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "Click the box below to promote your station on %sSourcefabric.org%s." +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "Search Users:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(In order to promote your station, 'Send support feedback' must be enabled)." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "DJs:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Sourcefabric Privacy Policy" +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "Login" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "Input Stream Settings" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "Type the characters you see in the picture below." -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "Master Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Station Name" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "Override" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "Default Crossfade Duration (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "enter a time in seconds 0{.0}" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "RESET" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "Default Fade In (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "Show Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "Default Fade Out (s):" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Choose Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "Remove" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "Disabled" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Repeat Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "Enabled" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "Email / Mail Server Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "Default Interface Language" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "SoundCloud Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" +msgstr "Station Timezone" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "%s's Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "Week Starts On" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" -msgstr "Choose Show Instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "Sunday" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "No Show" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "Monday" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "Find" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "Tuesday" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "Stream " +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "Wednesday" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "Additional Options" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "Thursday" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "The following info will be displayed to listeners in their media player:" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(Your radio station website)" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "Friday" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "Stream URL: " +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Saturday" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "Filter History" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "Link:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Welcome to Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "Repeat Type:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Here's how you can get started using Airtime to automate your broadcasts: " +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "weekly" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "every 2 weeks" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "every 3 weeks" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "every 4 weeks" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Select your media from the left pane and drag them to your show in the right pane." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "monthly" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "Then you're good to go!" +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Select Days:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "For more detailed help, read the %suser manual%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "Sun" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "About" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "Mon" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "Tue" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "Wed" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "Share" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "Thu" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Select stream:" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "Fri" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "mute" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "Sat" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "unmute" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "Repeat By:" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "Login" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "day of the month" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "day of the week" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "No End?" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "Email sent" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "End date must be after start date" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "An email has been sent" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "Please select a repeat day" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "Back to login screen" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "Confirm new password" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "New password" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "Password confirmation does not match your password." -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "Please enter and confirm your new password in the fields below." +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Get new password" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "Your trial expires in" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "Select criteria" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "days" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Album" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Purchase your copy of Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Bit Rate (Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "My Account" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "Previous:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "Composer" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "Next:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "Conductor" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "Source Streams" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "Copyright" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "Master Source" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "Creator" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "Show Source" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Encoded By" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "Scheduled Play" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "ON AIR" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "Label" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "Listen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "Language" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "Station time" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "Last Modified" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Close" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "Last Played" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "Add this show" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "Length" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "Update show" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Mime" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "What" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "Mood" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "When" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "Owner" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "Live Stream Input" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "Replay Gain" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "Record & Rebroadcast" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "Sample Rate (kHz)" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Who" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "Title" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Style" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "Track Number" -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "Start" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "Uploaded" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "Service" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "Website" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "Status" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Year" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "Uptime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "Select modifier" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "CPU" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "contains" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "Memory" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "does not contain" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Airtime Version" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "is" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "Disk Space" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "is not" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "File import in progress..." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "starts with" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "Advanced Search Options" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "ends with" -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "Listener Count Over Time" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "is greater than" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "New" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "is less than" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "New Playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "is in the range" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "New Smart Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "hours" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "New Webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "minutes" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "View / edit description" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "items" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "Description" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "Set smart block type:" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "Stream URL:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "Static" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "Default Length:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "Dynamic" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "No webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "Allow Repeat Tracks:" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "Empty playlist content" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "Limit to" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "Clear" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "Generate playlist content and save criteria" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Shuffle playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "Generate" + +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "Shuffle playlist content" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 #: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 msgid "Shuffle" msgstr "Shuffle" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Save playlist" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "Playlist crossfade" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "Fade in: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Fade out: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "No open playlist" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "Show Waveform" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "Empty smart block content" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "No open smart block" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "Cue In: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(hh:mm:ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Cue Out: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "Original Length:" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "Expand Static Block" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "Expand Dynamic Block" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "Empty smart block" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "Empty playlist" - -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Zend Framework Default Application" - -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "Page not found!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "Looks like the page you were looking for doesn't exist!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "Help" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "previous" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "play" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "pause" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "next" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "stop" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "max volume" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "Update Required" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "Creating File Summary Template" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "Creating Log Sheet Template" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "Name" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "Add more elements" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "Add New Field" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "Set Default Template" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "Log Sheet Templates" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "No Log Sheet Templates" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "Set Default" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "New Log Sheet Template" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "Limit cannot be empty or smaller than 0" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "No File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "Limit cannot be more than 24 hrs" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "New File Summary Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "The value should be an integer" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "Manage Users" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "500 is the max item limit value you can set" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "New User" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "You must select Criteria and Modifier" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "id" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "'Length' should be in '00:00:00' format" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Username" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "First Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "The value has to be numeric" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "Last Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "The value should be less then 2147483648" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "User Type" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "The value should be less than %s characters" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "Title:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "Value cannot be empty" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "Creator:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "Auto Switch Off" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Album:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "Auto Switch On" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Track:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "Switch Transition Fade (s)" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "Length:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "enter a time in seconds 00{.000000}" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "Sample Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "Master Username" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Bit Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "Master Password" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "Mood:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "Master Source Connection URL" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Genre:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "Show Source Connection URL" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Year:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "Master Source Port" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "Label:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "Master Source Mount Point" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Show Source Port" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "Composer:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "Show Source Mount Point" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "Conductor:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "You cannot use same port as Master DJ port." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "Copyright:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "Port %s is not available" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "Isrc Number:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Phone:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "Website:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "Station Web Site:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "Language:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "Country:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "File Path:" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "City:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "Name:" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "Station Description:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "Description:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Station Logo:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Web Stream" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "Send support feedback" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "Dynamic Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "Promote my station on Sourcefabric.org" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "Static Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Audio Track" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "You have to agree to privacy policy." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "Playlist Contents: " +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "Value is required and can't be empty" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "Static Smart Block Contents: " +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "Start Time" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "Dynamic Smart Block Criteria: " +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "End Time" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "Limit to " +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "No Show" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "URL:" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "Record from Line In?" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "Log Sheet" +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "Rebroadcast?" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "File Summary" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Use Airtime Authentication:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "Show Summary" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "Use Custom Authentication:" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "Shows can have a max length of 24 hours." +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "Custom Username" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "End date/time cannot be in the past" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "Custom Password" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "Cannot schedule overlapping shows.\nNote: Resizing a repeating show affects all of its repeats." +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "Username field cannot be empty." -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "can't resize a past show" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "Password field cannot be empty." -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "Should not overlap shows" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "E-mail" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Select Country" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "Restore password" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s is already watched." +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "Hardware Audio Output" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s contains nested watched directory: %s" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "Output Type" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s is nested within existing watched directory: %s" +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Icecast Vorbis Metadata" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s is not a valid directory." +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "Stream Label:" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s is already set as the current storage dir or in the watched folders list" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "Artist - Title" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s is already set as the current storage dir or in the watched folders list." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Show - Artist - Title" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s doesn't exist in the watched list." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Station name - Show name" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "items" +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "Off Air Metadata" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "Cue in and cue out are null." +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "Enable Replay Gain" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "Can't set cue out to be greater than file length." +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "Replay Gain Modifier" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "Can't set cue in to be larger than cue out." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%value%' is no valid email address in the basic format local-part@hostname" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "Can't set cue out to be smaller than cue in." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%' does not fit the date format '%format%'" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "Select criteria" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%' is less than %min% characters long" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Bit Rate (Kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%value%' is more than %max% characters long" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%' is not between '%min%' and '%max%', inclusively" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Encoded By" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "Passwords do not match" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "Last Modified" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%value%' does not fit the time format 'HH:mm'" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "Last Played" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "Date/Time Start:" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Mime" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "Date/Time End:" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "Owner" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "Duration:" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "Replay Gain" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "Timezone:" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "Sample Rate (kHz)" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "Repeats?" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "Track Number" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "Cannot create show in the past" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "Uploaded" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "Cannot modify start date/time of the show that is already started" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "Website" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "End date/time cannot be in the past" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "Select modifier" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "Cannot have duration < 0m" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "contains" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "Cannot have duration 00h 00m" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "does not contain" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "Cannot have duration greater than 24h" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "is" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "Cannot schedule overlapping shows" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "is not" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "Name:" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "starts with" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "Untitled Show" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "ends with" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "URL:" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "is greater than" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "Description:" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "is less than" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "Automatically Upload Recorded Shows" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "is in the range" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "Enable SoundCloud Upload" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "Length needs to be greater than 0 minutes" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "Automatically Mark Files \"Downloadable\" on SoundCloud" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "Length should be of form \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "SoundCloud Email" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "URL should be of form \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "SoundCloud Password" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "URL should be 512 characters or less" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "SoundCloud Tags: (separate tags with spaces)" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "No MIME type found for webstream." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "Default Genre:" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "Webstream name cannot be empty" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "Default Track Type:" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "Could not parse XSPF playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "Original" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "Could not parse PLS playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "Remix" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "Could not parse M3U playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "Live" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "Invalid webstream - This appears to be a file download." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "Recording" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "Unrecognized stream type: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "Spoken" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Hi %s, \n\nClick this link to reset your password: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "Podcast" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Airtime Password Reset" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Demo" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "Rebroadcast of %s from %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "Work in progress" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "Cannot move items out of linked shows" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "Stem" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "The schedule you're viewing is out of date! (sched mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "Loop" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "The schedule you're viewing is out of date! (instance mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Sound Effect" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "The schedule you're viewing is out of date!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "One Shot Sample" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "You are not allowed to schedule show %s." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Other" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "You cannot add files to recording shows." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "Default License:" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "The show %s is over and cannot be scheduled." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "The work is in the public domain" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "The show %s has been previously updated!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "All rights are reserved" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "Content in linked shows must be scheduled before or after any one is broadcasted" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "Creative Commons Attribution" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "A selected File does not exist!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "Creative Commons Attribution Noncommercial" + +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "Creative Commons Attribution No Derivative Works" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "Failed to create 'organize' directory." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "Creative Commons Attribution Share Alike" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "Creative Commons Attribution Noncommercial Non Derivate Works" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "This file appears to be corrupted and will not be added to media library." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "Creative Commons Attribution Noncommercial Share Alike" + +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "Interface Timezone:" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "Enable System Emails (Password Reset)" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "You don't have permission to disconnect source." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "Reset Password 'From' Email" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "There is no source connected to this input." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "Configure Mail Server" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "You don't have permission to switch source." +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "Requires Authentication" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" -msgstr "Rebroadcast of show %s from %s at %s" +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "Mail Server" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" -msgstr "Download" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "Email Address" #: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "Please make sure Admin User and Admin Password for the streaming server are present and correct under Stream -> Additional Options on the System -> Streams page." -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "You are not allowed to access this resource." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Untitled Webstream" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "You are not allowed to access this resource. " +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Webstream saved." -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "File does not exist in Airtime." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "Invalid form values." -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "File does not exist in Airtime" +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "Please enter your user name and password" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "File doesn't exist in Airtime." +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "Wrong username or password provided. Please try again." -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "Bad request. no 'mode' parameter passed." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "Email could not be sent. Check your mail server settings and ensure it has been configured properly." -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "Bad request. 'mode' parameter is invalid" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "Given email not found." -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format -msgid "%s not found" -msgstr "%s not found" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "Something went wrong." - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "Preview" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "Add to Playlist" - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "Add to Smart Block" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "Edit Metadata" +msgid "Rebroadcast of show %s from %s at %s" +msgstr "Rebroadcast of show %s from %s at %s" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "Duplicate Playlist" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" +msgstr "Download" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "User added successfully!" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "No action available" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "User updated successfully!" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "You don't have permission to delete selected items." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "Settings updated successfully!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "Could not delete some scheduled files." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "Page not found" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "Copy of %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Application error" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1875,6 +1591,11 @@ msgstr "You can only add tracks, smart blocks, and webstreams to playlists." msgid "Please select a cursor position on timeline." msgstr "Please select a cursor position on timeline." +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "Edit Metadata" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "Add to selected show" @@ -1921,6 +1642,7 @@ msgstr "Loading..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "All" @@ -1991,9 +1713,7 @@ msgstr "Input must be in the format: hh:mm:ss.t" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2029,10 +1749,7 @@ msgid "Playlist shuffled" msgstr "Playlist shuffled" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2058,24 +1775,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "Image must be one of jpg, jpeg, png, or gif" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2106,7 +1814,14 @@ msgstr "Choose Folder to Watch" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "Are you sure you want to change the storage folder?\nThis will remove the files from your Airtime library!" +msgstr "" +"Are you sure you want to change the storage folder?\n" +"This will remove the files from your Airtime library!" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "Manage Media Folders" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2118,9 +1833,7 @@ msgstr "This path is currently not accessible." #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2131,22 +1844,12 @@ msgstr "Connected to the streaming server" msgid "The stream is disabled" msgstr "The stream is disabled" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Getting information from the server..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "Can not connect to the streaming server" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2155,61 +1858,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "For more details, please read the %sAirtime Manual%s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "Check this box to automatically switch off Master/Show source upon source disconnection." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "Check this box to automatically switch on Master/Show source upon source connection." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "If your Icecast server expects a username of 'source', this field can be left blank." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "If your live streaming client does not ask for a username, this field should be 'source'." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "Warning: You cannot change this field while the show is currently playing" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2217,9 +1895,7 @@ msgid "No result found" msgstr "No result found" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "This follows the same security pattern for the shows: only users assigned to the show can connect." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2235,16 +1911,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "Warning: Shows cannot be re-linked" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2386,93 +2057,22 @@ msgstr "Dec" #: airtime_mvc/application/controllers/LocaleController.php:236 msgid "today" -msgstr "today" - -#: airtime_mvc/application/controllers/LocaleController.php:237 -msgid "day" -msgstr "day" - -#: airtime_mvc/application/controllers/LocaleController.php:238 -msgid "week" -msgstr "week" - -#: airtime_mvc/application/controllers/LocaleController.php:239 -msgid "month" -msgstr "month" - -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "Sunday" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "Monday" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "Tuesday" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "Wednesday" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "Thursday" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "Friday" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Saturday" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "Sun" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "Mon" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "Tue" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "Wed" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "Thu" +msgstr "today" -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "Fri" +#: airtime_mvc/application/controllers/LocaleController.php:237 +msgid "day" +msgstr "day" -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "Sat" +#: airtime_mvc/application/controllers/LocaleController.php:238 +msgid "week" +msgstr "week" + +#: airtime_mvc/application/controllers/LocaleController.php:239 +msgid "month" +msgstr "month" #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Shows longer than their scheduled time will be cut off by a following show." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2500,6 +2100,11 @@ msgstr "Remove all content?" msgid "Delete selected item(s)?" msgstr "Delete selected item(s)?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "Start" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "End" @@ -2533,14 +2138,6 @@ msgstr "Moving 1 Item" msgid "Moving %s Items" msgstr "Moving %s Items" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "Cancel" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "Fade Editor" @@ -2550,8 +2147,7 @@ msgid "Cue Editor" msgstr "Cue Editor" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "Waveform features are available in a browser supporting the Web Audio API" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2582,1329 +2178,1623 @@ msgstr "Cancel current show" msgid "Open library to add or remove content" msgstr "Open library to add or remove content" +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "Add / Remove Content" + #: airtime_mvc/application/controllers/LocaleController.php:305 msgid "in use" msgstr "in use" -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" -msgstr "Disk" +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "Disk" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "Look in" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "Open" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "Guests can do the following:" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "View schedule" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "View show content" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "DJs can do the following:" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "Manage assigned show content" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "Import media files" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "Create playlists, smart blocks, and webstreams" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "Manage their own library content" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "Progam Managers can do the following:" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "View and manage show content" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "Schedule shows" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "Manage all library content" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "Admins can do the following:" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "Manage preferences" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "Manage users" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "Manage watched folders" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "View system status" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "Access playout history" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "View listener stats" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "Show / hide columns" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "From {from} to {to}" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "kbps" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "yyyy-mm-dd" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" +msgstr "hh:mm:ss.t" + +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" +msgstr "kHz" + +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" +msgstr "Su" + +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" +msgstr "Mo" + +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" +msgstr "Tu" + +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" +msgstr "We" + +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" +msgstr "Th" + +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" +msgstr "Fr" + +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" +msgstr "Sa" + +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Close" + +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" +msgstr "Hour" + +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" +msgstr "Minute" + +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" +msgstr "Done" + +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" +msgstr "Select files" + +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." +msgstr "Add files to the upload queue and click the start button." + +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "Status" + +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" +msgstr "Add Files" + +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" +msgstr "Stop Upload" + +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" +msgstr "Start upload" + +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" +msgstr "Add files" + +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" +msgstr "Uploaded %d/%d files" + +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" +msgstr "N/A" + +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." +msgstr "Drag files here." + +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." +msgstr "File extension error." + +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." +msgstr "File size error." + +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." +msgstr "File count error." + +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." +msgstr "Init error." -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" -msgstr "Look in" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." +msgstr "HTTP Error." -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" -msgstr "Open" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." +msgstr "Security error." -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "Admin" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." +msgstr "Generic error." -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "DJ" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." +msgstr "IO error." -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "Program Manager" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" +msgstr "File: %s" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "Guest" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" +msgstr "%d files queued" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" -msgstr "Guests can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" +msgstr "File: %f, size: %s, max file size: %m" -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" -msgstr "View schedule" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" +msgstr "Upload URL might be wrong or doesn't exist" -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" -msgstr "View show content" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " +msgstr "Error: File too large: " -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" -msgstr "DJs can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " +msgstr "Error: Invalid file extension: " -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" -msgstr "Manage assigned show content" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "Set Default" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" -msgstr "Import media files" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" +msgstr "Create Entry" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" -msgstr "Create playlists, smart blocks, and webstreams" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" +msgstr "Edit History Record" -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" -msgstr "Manage their own library content" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" +msgstr "Copied %s row%s to the clipboard" -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" -msgstr "Progam Managers can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." +msgstr "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" -msgstr "View and manage show content" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "You don't have permission to disconnect source." -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" -msgstr "Schedule shows" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "There is no source connected to this input." -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" -msgstr "Manage all library content" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "You don't have permission to switch source." -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" -msgstr "Admins can do the following:" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "You are viewing an older version of %s" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" -msgstr "Manage preferences" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "You cannot add tracks to dynamic blocks." -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" -msgstr "Manage users" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%s not found" -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "Manage watched folders" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "You don't have permission to delete selected %s(s)." -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "Send support feedback" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "Something went wrong." -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" -msgstr "View system status" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "You can only add tracks to smart block." -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" -msgstr "Access playout history" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "Untitled Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" -msgstr "View listener stats" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Untitled Smart Block" -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" -msgstr "Show / hide columns" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "Unknown Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" -msgstr "From {from} to {to}" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "You are not allowed to access this resource." -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" -msgstr "kbps" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "You are not allowed to access this resource. " -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" -msgstr "yyyy-mm-dd" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "File does not exist in Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" -msgstr "hh:mm:ss.t" +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "File does not exist in Airtime" -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" -msgstr "kHz" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "File doesn't exist in Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" -msgstr "Su" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "Bad request. no 'mode' parameter passed." -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" -msgstr "Mo" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "Bad request. 'mode' parameter is invalid" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" -msgstr "Tu" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "Preview" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" -msgstr "We" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "Add to Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" -msgstr "Th" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "Add to Smart Block" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "Delete" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" -msgstr "Fr" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "Duplicate Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" -msgstr "Sa" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "Edit" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" -msgstr "Hour" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "Soundcloud" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" -msgstr "Minute" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "View on Soundcloud" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" -msgstr "Done" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "Re-upload to SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" -msgstr "Select files" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Upload to SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." -msgstr "Add files to the upload queue and click the start button." +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "No action available" -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" -msgstr "Add Files" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "You don't have permission to delete selected items." -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" -msgstr "Stop Upload" +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "Could not delete some scheduled files." -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" -msgstr "Start upload" +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "Copy of %s" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" -msgstr "Add files" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Select cursor" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" -msgstr "Uploaded %d/%d files" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "Remove cursor" -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" -msgstr "N/A" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "show does not exist" -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." -msgstr "Drag files here." +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." +msgstr "Preferences updated." -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." -msgstr "File extension error." +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." +msgstr "Support setting updated." -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." -msgstr "File size error." +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" +msgstr "Support Feedback" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." -msgstr "File count error." +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." +msgstr "Stream Setting Updated." -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." -msgstr "Init error." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" +msgstr "path should be specified" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." -msgstr "HTTP Error." +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." +msgstr "Problem with Liquidsoap..." -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." -msgstr "Security error." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "Now Playing" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." -msgstr "Generic error." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "Add Media" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." -msgstr "IO error." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Library" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" -msgstr "File: %s" +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "Calendar" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" -msgstr "%d files queued" +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "System" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" -msgstr "File: %f, size: %s, max file size: %m" +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "Preferences" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" -msgstr "Upload URL might be wrong or doesn't exist" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "Users" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " -msgstr "Error: File too large: " +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Media Folders" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " -msgstr "Error: Invalid file extension: " +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Streams" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" -msgstr "Create Entry" +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "Listener Stats" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" -msgstr "Edit History Record" +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "History" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" -msgstr "Copied %s row%s to the clipboard" +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "Playout History" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." -msgstr "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "History Templates" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "Please enter your user name and password" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "Help" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "Wrong username or password provided. Please try again." +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "Getting Started" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "User Manual" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "Given email not found." +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "About" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." -msgstr "Preferences updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "Service" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." -msgstr "Support setting updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "Uptime" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" -msgstr "Support Feedback" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "CPU" + +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "Memory" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." -msgstr "Stream Setting Updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Airtime Version" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" -msgstr "path should be specified" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "Disk Space" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." -msgstr "Problem with Liquidsoap..." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "Email / Mail Server Settings" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Select cursor" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "SoundCloud Settings" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "Remove cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Repeat Days:" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "show does not exist" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "Remove" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Untitled Webstream" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "Add" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Webstream saved." +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "Connection URL: " -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "Invalid form values." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "Input Stream Settings" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "You are viewing an older version of %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "Master Source Connection URL:" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "You cannot add tracks to dynamic blocks." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "Override" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "You don't have permission to delete selected %s(s)." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "OK" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "You can only add tracks to smart block." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "RESET" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "Untitled Playlist" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "Show Source Connection URL:" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Untitled Smart Block" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(Required)" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "Unknown Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "Register Airtime" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "Page not found" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Application error" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "User added successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(for verification purposes only, will not be published)" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "User updated successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Note: Anything larger than 600x600 will be resized." -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "Settings updated successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Show me what I am sending " -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "The year %s must be within the range of 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "Terms and Conditions" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s is not a valid date" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "Reset password" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s:%s:%s is not a valid time" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Choose folder" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "Untitled Show" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "Set" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "Import Folder:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "Current Import Folder:" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "Watched Folders:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "Not a valid Directory" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "Remove watched directory" -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Username:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "You are not watching any media folders." -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "Stream " -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "Verify Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "Additional Options" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "First name:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "The following info will be displayed to listeners in their media player:" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "Last name:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(Your radio station website)" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "Email:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "Stream URL: " -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Mobile Phone:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "Filter History" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "Find Shows" + +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "Filter By Show:" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "%s's Settings" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "User Type:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "Login name is not unique." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "Click the box below to promote your station on %sSourcefabric.org%s." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "Auto Switch Off" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(In order to promote your station, 'Send support feedback' must be enabled)." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "Auto Switch On" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Sourcefabric Privacy Policy" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "Switch Transition Fade (s)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "Choose Show Instance" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "enter a time in seconds 00{.000000}" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "Find" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "Master Username" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Choose Days:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "Master Password" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Smart Block Options" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "Master Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "or" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "Show Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "and" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "Master Source Port" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr " to " -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "Only numbers are allowed." +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "files meet the criteria" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "Master Source Mount Point" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "file meet the criteria" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Invalid character entered" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "Creating File Summary Template" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Show Source Port" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "Creating Log Sheet Template" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "Show Source Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "Add more elements" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "You cannot use same port as Master DJ port." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "Add New Field" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "Port %s is not available" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "Set Default Template" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%value%' does not fit the time format 'HH:mm'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" +msgstr "Log Sheet Templates" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "Date/Time Start:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "No Log Sheet Templates" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "Date/Time End:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "New Log Sheet Template" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "Duration:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" +msgstr "File Summary Templates" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "Timezone:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" +msgstr "No File Summary Templates" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "Repeats?" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "New File Summary Template" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "Cannot create show in the past" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "New" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "Cannot modify start date/time of the show that is already started" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "New Playlist" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "Cannot have duration < 0m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "New Smart Block" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "Cannot have duration 00h 00m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "New Webstream" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "Cannot have duration greater than 24h" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "View / edit description" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" -msgstr "Link:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "Stream URL:" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "Repeat Type:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "Default Length:" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "weekly" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "No webstream" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" -msgstr "every 2 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "Stream Settings" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" -msgstr "every 3 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Global Settings" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" -msgstr "every 4 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "dB" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "monthly" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "Output Stream Settings" -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Select Days:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "File import in progress..." -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "Repeat By:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "Advanced Search Options" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "day of the month" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "previous" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "day of the week" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "play" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "Date End:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "pause" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "No End?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "next" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "End date must be after start date" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "stop" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "Please select a repeat day" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "mute" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "Value is required and can't be empty" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "unmute" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "Password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "max volume" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "Confirm new password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "Update Required" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "Password confirmation does not match your password." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Get new password" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "Length:" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Station Name" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "Sample Rate:" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Phone:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "Isrc Number:" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "Station Web Site:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "File Path:" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "Country:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Web Stream" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "City:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "Dynamic Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "Station Description:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "Static Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Station Logo:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Audio Track" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "Promote my station on Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "Playlist Contents: " -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "Static Smart Block Contents: " -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "You have to agree to privacy policy." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "Dynamic Smart Block Criteria: " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%value%' is no valid email address in the basic format local-part@hostname" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "Limit to " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%' does not fit the date format '%format%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%' is less than %min% characters long" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%value%' is more than %max% characters long" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%' is not between '%min%' and '%max%', inclusively" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "Listener Count Over Time" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "Passwords do not match" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Welcome to Airtime!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "Enabled:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Here's how you can get started using Airtime to automate your broadcasts: " -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "Stream Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "Service Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "Channels:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Select your media from the left pane and drag them to your show in the right pane." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "Then you're good to go!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Server" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "For more detailed help, read the %suser manual%s." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "Port" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "Share" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "URL" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Select stream:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Mount Point" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "Admin User" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "Admin Password" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "New password" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "Server cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "Please enter and confirm your new password in the fields below." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "Port cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "Mount cannot be empty with Icecast server." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "Email sent" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "Hardware Audio Output" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "An email has been sent" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "Output Type" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "Back to login screen" -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Icecast Vorbis Metadata" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "Stream Label:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "Previous:" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "Next:" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Show - Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "Source Streams" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Station name - Show name" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "Master Source" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "Off Air Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "Show Source" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "Enable Replay Gain" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "Scheduled Play" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "Replay Gain Modifier" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "ON AIR" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "Search Users:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "Listen" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "Station time" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "Record from Line In?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "Your trial expires in" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "Rebroadcast?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Purchase your copy of Airtime" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "Enable System Emails (Password Reset)" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "My Account" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "Reset Password 'From' Email" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "Manage Users" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "Configure Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "New User" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "Requires Authentication" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "id" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "First Name" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "Email Address" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "Last Name" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "Type the characters you see in the picture below." +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "User Type" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "Day must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "Log Sheet" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "Time must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "File Summary" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "Must wait at least 1 hour to rebroadcast" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "Show Summary" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Use Airtime Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Zend Framework Default Application" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "Use Custom Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "Page not found!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "Custom Username" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "Looks like the page you were looking for doesn't exist!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "Custom Password" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "Expand Static Block" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "Username field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "Expand Dynamic Block" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "Password field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "Empty smart block" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "Date Start:" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "Empty playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "Default Crossfade Duration (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" +msgstr "Empty playlist content" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "enter a time in seconds 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" +msgstr "Clear" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" -msgstr "Default Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Shuffle playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" -msgstr "Default Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Save playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "Playlist crossfade" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "Disabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "Fade in: " + +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Fade out: " -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "Enabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "No open playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "Default Interface Language" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" +msgstr "Empty smart block content" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" -msgstr "Station Timezone" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(ss.t)" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "Week Starts On" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "No open smart block" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" -msgstr "Interface Timezone:" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" +msgstr "Show Waveform" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "Cue In: " -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "Restore password" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(hh:mm:ss.t)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "hours" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Cue Out: " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "minutes" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "Original Length:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "Set smart block type:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "Add this show" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "Static" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "Update show" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "Dynamic" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "What" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "Allow Repeat Tracks:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "When" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "Limit to" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "Live Stream Input" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "Generate playlist content and save criteria" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "Record & Rebroadcast" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "Generate" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Who" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "Shuffle playlist content" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Style" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "Limit cannot be empty or smaller than 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "Rebroadcast of %s from %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "Limit cannot be more than 24 hrs" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Select Country" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "The value should be an integer" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "Length needs to be greater than 0 minutes" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "500 is the max item limit value you can set" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "Length should be of form \"00h 00m\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "You must select Criteria and Modifier" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "URL should be of form \"http://domain\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "'Length' should be in '00:00:00' format" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "URL should be 512 characters or less" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "No MIME type found for webstream." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "The value has to be numeric" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "Webstream name cannot be empty" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "The value should be less then 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "Could not parse XSPF playlist" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "The value should be less than %s characters" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "Could not parse PLS playlist" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "Value cannot be empty" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "Could not parse M3U playlist" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Show:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "Invalid webstream - This appears to be a file download." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "All My Shows:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "Unrecognized stream type: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "ISRC Number:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s is already watched." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "Automatically Upload Recorded Shows" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s contains nested watched directory: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "Enable SoundCloud Upload" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s is nested within existing watched directory: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "Automatically Mark Files \"Downloadable\" on SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s is not a valid directory." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "SoundCloud Email" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s is already set as the current storage dir or in the watched folders list" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "SoundCloud Password" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s is already set as the current storage dir or in the watched folders list." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "SoundCloud Tags: (separate tags with spaces)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s doesn't exist in the watched list." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "Default Genre:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "Cannot move items out of linked shows" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "Default Track Type:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "The schedule you're viewing is out of date! (sched mismatch)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "Original" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "The schedule you're viewing is out of date! (instance mismatch)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "The schedule you're viewing is out of date!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "Live" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "You are not allowed to schedule show %s." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "Recording" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "You cannot add files to recording shows." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "Spoken" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "The show %s is over and cannot be scheduled." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "The show %s has been previously updated!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "Content in linked shows must be scheduled before or after any one is broadcasted" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "Work in progress" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "A selected File does not exist!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "Stem" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "Cue in and cue out are null." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "Loop" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "Can't set cue in to be larger than cue out." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Sound Effect" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "Can't set cue out to be greater than file length." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "One Shot Sample" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "Can't set cue out to be smaller than cue in." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Other" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "Default License:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "Shows can have a max length of 24 hours." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "The work is in the public domain" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "All rights are reserved" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Airtime Password Reset" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "Creative Commons Attribution Noncommercial" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "Record file doesn't exist" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "Creative Commons Attribution No Derivative Works" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "View Recorded File Metadata" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "Creative Commons Attribution Share Alike" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Show Content" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "Creative Commons Attribution Noncommercial Non Derivate Works" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "Remove All Content" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "Creative Commons Attribution Noncommercial Share Alike" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "Cancel Current Show" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "Background Colour:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "Edit This Instance" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "Text Colour:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "Edit Show" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "Now Playing" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "Delete This Instance" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "Add Media" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "Delete This Instance and All Following" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Library" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "Permission denied" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "Calendar" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "Can't drag and drop repeating shows" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "System" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "Can't move a past show" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "Users" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "Can't move show into past" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Media Folders" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "Can't move a recorded show less than 1 hour before its rebroadcasts." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Streams" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "Show was deleted because recorded show does not exist!" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "Listener Stats" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "Must wait 1 hour to rebroadcast." -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" -msgstr "History" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" +msgstr "Track" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "Playout History" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "Played" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "History Templates" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "The year %s must be within the range of 1753 - 9999" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "Getting Started" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s is not a valid date" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "User Manual" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s:%s:%s is not a valid time" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3913,3 +3803,18 @@ msgstr "Please select an option" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "No Records" + +#~ msgid "can't resize a past show" +#~ msgstr "can't resize a past show" + +#~ msgid "Should not overlap shows" +#~ msgstr "Should not overlap shows" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "Failed to create 'organize' directory." + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "This file appears to be corrupted and will not be added to media library." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." diff --git a/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po index 016edf5cdf..5d4b2d210e 100644 --- a/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po @@ -1,7 +1,7 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # danielhjames , 2014 # danielhjames , 2014 @@ -10,28 +10,16 @@ msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-01-29 15:09+0000\n" "Last-Translator: andrey.podshivalov\n" "Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/airtime/language/en_GB/)\n" +"Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "Live stream" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -52,9 +40,9 @@ msgid "Stop" msgstr "Stop" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Cue In" @@ -63,9 +51,9 @@ msgid "Set Cue In" msgstr "Set Cue In" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Cue Out" @@ -87,1720 +75,1448 @@ msgstr "Fade In" msgid "Fade Out" msgstr "Fade Out" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "Title" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "Creator" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "Live stream" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "Enabled:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "Length" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "Stream Type:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Genre" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Bit Rate:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "Mood" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "Service Type:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "Label" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "Channels:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "Composer" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Mono" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Stereo" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "Copyright" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Server" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Year" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Invalid character entered" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "Track" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "Port" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "Conductor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "Only numbers are allowed." -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "Language" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "Password" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "Start Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Genre" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "End Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "URL" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "Played" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "Name" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "Record file doesn't exist" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "Description" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "View Recorded File Metadata" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Mount Point" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "View on SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Username" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "Admin User" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "Re-upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "Admin Password" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Show Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Getting information from the server..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "Add / Remove Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "Server cannot be empty." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "Remove All Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "Port cannot be empty." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "Cancel Current Show" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "Mount cannot be empty with Icecast server." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "Edit This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "Title:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "Edit" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "Creator:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "Edit Show" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Album:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "Delete" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Track:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "Delete This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Genre:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "Delete This Instance and All Following" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Year:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "Permission denied" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "Label:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "Can't drag and drop repeating shows" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "Composer:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "Can't move a past show" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "Conductor:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "Can't move show into past" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "Mood:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "Cannot schedule overlapping shows" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "Can't move a recorded show less than 1 hour before its rebroadcasts." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "Copyright:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "Show was deleted because recorded show does not exist!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "ISRC Number:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "Must wait 1 hour to rebroadcast." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "Website:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "Preferences" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "Language:" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Save" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "Manage Media Folders" - -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "Stream Settings" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "Cancel" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Global Settings" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Username:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "dB" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "Password:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "Output Stream Settings" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "Verify Password:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Choose folder" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "Firstname:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "Set" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "Lastname:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "Current Import Folder:" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "Email:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "Add" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Mobile Phone:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "Remove watched directory" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "You are not watching any media folders." +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "User Type:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "Register Airtime" +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "Guest" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "DJ" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "Program Manager" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(Required)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(for verification purposes only, will not be published)" +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "Admin" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Note: Anything larger than 600x600 will be resized." +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "Login name is not unique." -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Show me what I am sending " +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "Background Colour:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "Terms and Conditions" +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "Text Colour:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "Find Shows" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "Date Start:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "Filter By Show:" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "Date End:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "Reset password" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Show:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Smart Block Options" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "All My Shows:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "or" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "days" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "and" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "Day must be specified" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr " to " +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "Time must be specified" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "files meet the criteria" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "Must wait at least 1 hour to rebroadcast" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "file meet the criteria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "Import Folder:" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "Connection URL: " +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "Watched Folders:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "Not a valid Directory" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "Click the box below to promote your station on %sSourcefabric.org%s." +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "Search Users:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(In order to promote your station, 'Send support feedback' must be enabled)." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "DJs:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Sourcefabric Privacy Policy" +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "Login" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "Input Stream Settings" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "Type the characters you see in the picture below." -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "Master Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Station Name" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "Override" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "Default Crossfade Duration (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "enter a time in seconds 0{.0}" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "RESET" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "Default Fade In (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "Show Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "Default Fade Out (s):" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Choose Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "Remove" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "Disabled" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Repeat Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "Enabled" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "Email / Mail Server Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "Default Interface Language" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "SoundCloud Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" +msgstr "Station Timezone" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "%s's Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "Week Starts On" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" -msgstr "Choose Show Instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "Sunday" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "No Show" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "Monday" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "Find" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "Tuesday" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "Stream " +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "Wednesday" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "Additional Options" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "Thursday" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "The following info will be displayed to listeners in their media player:" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(Your radio station website)" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "Friday" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "Stream URL: " +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Saturday" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "Filter History" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "Link:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Welcome to Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "Repeat Type:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Here's how you can get started using Airtime to automate your broadcasts: " +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "weekly" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "every 2 weeks" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "every 3 weeks" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "every 4 weeks" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Select your media from the left pane and drag them to your show in the right pane." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "monthly" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "Then you're ready to broadcast!" +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Select Days:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "For more detailed help, read the %suser manual%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "Sun" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "About" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "Mon" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "Tue" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "Wed" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "Share" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "Thu" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Select stream:" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "Fri" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "mute" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "Sat" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "unmute" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "Repeat By:" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "Login" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "day of the month" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "day of the week" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "No End?" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "Email sent" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "End date must be after start date" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "An email has been sent" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "Please select a repeat day" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "Back to login screen" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "Confirm new password" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "New password" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "Password confirmation does not match your password." -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "Please enter and confirm your new password in the fields below." +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Get new password" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "Your trial expires in" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "Select criteria" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "days" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Album" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Purchase your copy of Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Bit Rate (Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "My Account" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "Previous:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "Composer" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "Next:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "Conductor" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "Source Streams" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "Copyright" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "Master Source" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "Creator" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "Show Source" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Encoded By" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "Scheduled Play" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "ON AIR" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "Label" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "Listen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "Language" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "Station time" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "Last Modified" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Close" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "Last Played" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "Add this show" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "Length" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "Update show" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Mime" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "What" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "Mood" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "When" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "Owner" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "Live Stream Input" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "Replay Gain" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "Record & Rebroadcast" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "Sample Rate (kHz)" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Who" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "Title" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Style" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "Track Number" -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "Start" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "Uploaded" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "Service" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "Website" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "Status" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Year" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "Uptime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "Select modifier" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "CPU" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "contains" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "Memory" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "does not contain" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Airtime Version" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "is" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "Disk Space" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "is not" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "File import in progress..." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "starts with" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "Advanced Search Options" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "ends with" -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "Listener Count Over Time" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "is greater than" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "New" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "is less than" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "New Playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "is in the range" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "New Smart Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "hours" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "New Webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "minutes" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "View / edit description" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "items" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "Description" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "Set smart block type:" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "Stream URL:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "Static" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "Default Length:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "Dynamic" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "No webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "Allow Repeat Tracks:" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "Empty playlist content" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "Limit to" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "Clear" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "Generate playlist content and save criteria" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Shuffle playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "Generate" + +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "Shuffle playlist content" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 #: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 msgid "Shuffle" msgstr "Shuffle" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Save playlist" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "Playlist crossfade" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "Fade in: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Fade out: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "No open playlist" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "Show Waveform" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "Empty smart block content" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "No open smart block" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "Cue In: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(hh:mm:ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Cue Out: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "Original Length:" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "Expand Static Block" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "Expand Dynamic Block" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "Empty smart block" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "Empty playlist" - -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Zend Framework Default Application" - -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "Page not found!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "Looks like the page you were looking for doesn't exist!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "Help" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "previous" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "play" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "pause" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "next" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "stop" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "max volume" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "Update Required" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "Creating File Summary Template" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "Creating Log Sheet Template" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "Name" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "Add more elements" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "Add New Field" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "Set Default Template" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "Log Sheet Templates" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "No Log Sheet Templates" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "Set Default" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "New Log Sheet Template" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "Limit cannot be empty or smaller than 0" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "No File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "Limit cannot be more than 24 hrs" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "New File Summary Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "The value should be an integer" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "Manage Users" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "500 is the max item limit value you can set" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "New User" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "You must select Criteria and Modifier" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "id" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "'Length' should be in '00:00:00' format" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Username" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "First Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "The value has to be numeric" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "Last Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "The value should be less then 2147483648" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "User Type" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "The value should be less than %s characters" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "Title:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "Value cannot be empty" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "Creator:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "Auto Switch Off" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Album:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "Auto Switch On" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Track:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "Switch Transition Fade (s)" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "Length:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "enter a time in seconds 00{.000000}" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "Sample Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "Master Username" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Bit Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "Master Password" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "Mood:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "Master Source Connection URL" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Genre:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "Show Source Connection URL" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Year:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "Master Source Port" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "Label:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "Master Source Mount Point" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Show Source Port" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "Composer:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "Show Source Mount Point" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "Conductor:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "You cannot use same port as Master DJ port." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "Copyright:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "Port %s is not available" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "Isrc Number:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Phone:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "Website:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "Station Web Site:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "Language:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "Country:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "File Path:" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "City:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "Name:" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "Station Description:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "Description:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Station Logo:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Web Stream" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "Send support feedback" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "Dynamic Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "Promote my station on Sourcefabric.org" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "Static Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Audio Track" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "You have to agree to privacy policy." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "Playlist Contents: " +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "Value is required and can't be empty" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "Static Smart Block Contents: " +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "Start Time" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "Dynamic Smart Block Criteria: " +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "End Time" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "Limit to " +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "No Show" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "URL:" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "Record from Line In?" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "Log Sheet" +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "Rebroadcast?" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "File Summary" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Use Airtime Authentication:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "Show Summary" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "Use Custom Authentication:" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "Shows can have a max length of 24 hours." +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "Custom Username" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "End date/time cannot be in the past" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "Custom Password" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "Cannot schedule overlapping shows.\nNote: Resizing a repeating show affects all of its repeats." +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "Username field cannot be empty." -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "can't resize a past show" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "Password field cannot be empty." -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "Should not overlap shows" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "E-mail" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Select Country" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "Restore password" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s is already watched." +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "Hardware Audio Output" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s contains nested watched directory: %s" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "Output Type" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s is nested within existing watched directory: %s" +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Icecast Vorbis Metadata" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s is not a valid directory." +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "Stream Label:" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s is already set as the current storage dir or in the watched folders list" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "Artist - Title" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s is already set as the current storage dir or in the watched folders list." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Show - Artist - Title" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s doesn't exist in the watched list." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Station name - Show name" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "items" +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "Off Air Metadata" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "Cue in and cue out are null." +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "Enable Replay Gain" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "Can't set cue out to be greater than file length." +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "Replay Gain Modifier" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "Can't set cue in to be larger than cue out." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%value%' is no valid email address in the basic format local-part@hostname" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "Can't set cue out to be smaller than cue in." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%' does not fit the date format '%format%'" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "Select criteria" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%' is less than %min% characters long" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Bit Rate (Kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%value%' is more than %max% characters long" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%' is not between '%min%' and '%max%', inclusively" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Encoded By" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "Passwords do not match" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "Last Modified" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%value%' does not fit the time format 'HH:mm'" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "Last Played" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "Date/Time Start:" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Mime" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "Date/Time End:" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "Owner" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "Duration:" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "Replay Gain" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "Timezone:" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "Sample Rate (kHz)" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "Repeats?" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "Track Number" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "Cannot create show in the past" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "Uploaded" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "Cannot modify start date/time of the show that is already started" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "Website" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "End date/time cannot be in the past" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "Select modifier" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "Cannot have duration < 0m" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "contains" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "Cannot have duration 00h 00m" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "does not contain" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "Cannot have duration greater than 24h" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "is" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "Cannot schedule overlapping shows" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "is not" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "Name:" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "starts with" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "Untitled Show" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "ends with" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "URL:" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "is greater than" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "Description:" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "is less than" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "Automatically Upload Recorded Shows" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "is in the range" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "Enable SoundCloud Upload" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "Length needs to be greater than 0 minutes" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "Automatically Mark Files \"Downloadable\" on SoundCloud" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "Length should be of form \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "SoundCloud Email" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "URL should be of form \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "SoundCloud Password" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "URL should be 512 characters or less" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "SoundCloud Tags: (separate tags with spaces)" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "No MIME type found for webstream." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "Default Genre:" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "Webstream name cannot be empty" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "Default Track Type:" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "Could not parse XSPF playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "Original" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "Could not parse PLS playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "Remix" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "Could not parse M3U playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "Live" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "Invalid webstream - This appears to be a file download." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "Recording" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "Unrecognised stream type: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "Spoken" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Hi %s, \n\nClick this link to reset your password: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "Podcast" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Airtime Password Reset" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Demo" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "Rebroadcast of %s from %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "Work in progress" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "Cannot move items out of linked shows" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "Stem" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "The schedule you're viewing is out of date! (sched mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "Loop" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "The schedule you're viewing is out of date! (instance mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Sound Effect" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "The schedule you're viewing is out of date!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "One Shot Sample" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "You are not allowed to schedule show %s." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Other" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "You cannot add files to recording shows." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "Default License:" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "The show %s is over and cannot be scheduled." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "The work is in the public domain" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "The show %s has been previously updated!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "All rights are reserved" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "Content in linked shows must be scheduled before or after any one is broadcasted" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "Creative Commons Attribution" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "A selected File does not exist!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "Creative Commons Attribution Noncommercial" + +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "Creative Commons Attribution No Derivative Works" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "Failed to create 'organise' directory." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "Creative Commons Attribution Share Alike" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "Creative Commons Attribution Noncommercial Non Derivate Works" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "This file appears to be corrupted and will not be added to media library." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "Creative Commons Attribution Noncommercial Share Alike" + +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "Interface Timezone:" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "Enable System Emails (Password Reset)" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "You don't have permission to disconnect source." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "Reset Password 'From' Email" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "There is no source connected to this input." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "Configure Mail Server" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "You don't have permission to switch source." +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "Requires Authentication" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" -msgstr "Rebroadcast of show %s from %s at %s" +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "Mail Server" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" -msgstr "Download" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "Email Address" #: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "Please make sure admin user/password is correct on System->Streams page." -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "You are not allowed to access this resource." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Untitled Webstream" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "You are not allowed to access this resource. " +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Webstream saved." -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "File does not exist in Airtime." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "Invalid form values." -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "File does not exist in Airtime" +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "Please enter your user name and password" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "File doesn't exist in Airtime." +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "Wrong username or password provided. Please try again." -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "Bad request. no 'mode' parameter passed." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "Email could not be sent. Check your mail server settings and ensure it has been configured properly." -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "Bad request. 'mode' parameter is invalid" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "Given email not found." -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format -msgid "%s not found" -msgstr "%s not found" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "Something went wrong." - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "Preview" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "Add to Playlist" - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "Add to Smart Block" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "Edit Metadata" +msgid "Rebroadcast of show %s from %s at %s" +msgstr "Rebroadcast of show %s from %s at %s" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "Duplicate Playlist" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" +msgstr "Download" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "SoundCloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "User added successfully!" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "No action available" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "User updated successfully!" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "You don't have permission to delete selected items." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "Settings updated successfully!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "Could not delete some scheduled files." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "Page not found" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "Copy of %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Application error" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1876,6 +1592,11 @@ msgstr "You can only add tracks, smart blocks, and webstreams to playlists." msgid "Please select a cursor position on timeline." msgstr "Please select a cursor position on timeline." +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "Edit Metadata" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "Add to selected show" @@ -1922,6 +1643,7 @@ msgstr "Loading..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "All" @@ -1992,9 +1714,7 @@ msgstr "Input must be in the format: hh:mm:ss.t" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2030,10 +1750,7 @@ msgid "Playlist shuffled" msgstr "Playlist shuffled" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2059,24 +1776,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "Image must be one of jpg, jpeg, png, or gif" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2107,7 +1815,14 @@ msgstr "Choose Folder to Watch" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "Are you sure you want to change the storage folder?\nThis will remove the files from your Airtime library!" +msgstr "" +"Are you sure you want to change the storage folder?\n" +"This will remove the files from your Airtime library!" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "Manage Media Folders" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2119,9 +1834,7 @@ msgstr "This path is currently not accessible." #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2132,22 +1845,12 @@ msgstr "Connected to the streaming server" msgid "The stream is disabled" msgstr "The stream is disabled" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Getting information from the server..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "Can not connect to the streaming server" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2156,61 +1859,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "For more details, please read the %sAirtime Manual%s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "Check this box to automatically switch off Master/Show source upon source disconnection." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "Check this box to automatically switch on Master/Show source upon source connection." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "If your Icecast server expects a username of 'source', this field can be left blank." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "If your live streaming client does not ask for a username, this field should be 'source'." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "Warning: You cannot change this field while the show is currently playing" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2218,9 +1896,7 @@ msgid "No result found" msgstr "No result found" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "This follows the same security pattern for the shows: only users assigned to the show can connect." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2236,16 +1912,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "Warning: Shows cannot be re-linked" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2387,93 +2058,22 @@ msgstr "Dec" #: airtime_mvc/application/controllers/LocaleController.php:236 msgid "today" -msgstr "today" - -#: airtime_mvc/application/controllers/LocaleController.php:237 -msgid "day" -msgstr "day" - -#: airtime_mvc/application/controllers/LocaleController.php:238 -msgid "week" -msgstr "week" - -#: airtime_mvc/application/controllers/LocaleController.php:239 -msgid "month" -msgstr "month" - -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "Sunday" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "Monday" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "Tuesday" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "Wednesday" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "Thursday" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "Friday" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Saturday" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "Sun" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "Mon" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "Tue" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "Wed" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "Thu" +msgstr "today" -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "Fri" +#: airtime_mvc/application/controllers/LocaleController.php:237 +msgid "day" +msgstr "day" -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "Sat" +#: airtime_mvc/application/controllers/LocaleController.php:238 +msgid "week" +msgstr "week" + +#: airtime_mvc/application/controllers/LocaleController.php:239 +msgid "month" +msgstr "month" #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Shows longer than their scheduled time will be cut off by a following show." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2501,6 +2101,11 @@ msgstr "Remove all content?" msgid "Delete selected item(s)?" msgstr "Delete selected item(s)?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "Start" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "End" @@ -2534,14 +2139,6 @@ msgstr "Moving 1 Item" msgid "Moving %s Items" msgstr "Moving %s Items" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "Cancel" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "Fade Editor" @@ -2551,8 +2148,7 @@ msgid "Cue Editor" msgstr "Cue Editor" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "Waveform features are available in a browser supporting the Web Audio API" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2583,1329 +2179,1623 @@ msgstr "Cancel current show" msgid "Open library to add or remove content" msgstr "Open library to add or remove content" +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "Add / Remove Content" + #: airtime_mvc/application/controllers/LocaleController.php:305 msgid "in use" msgstr "in use" -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" -msgstr "Disk" +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "Disk" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "Look in" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "Open" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "Guests can do the following:" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "View schedule" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "View show content" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "DJs can do the following:" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "Manage assigned show content" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "Import media files" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "Create playlists, smart blocks, and webstreams" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "Manage their own library content" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "Progam Managers can do the following:" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "View and manage show content" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "Schedule shows" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "Manage all library content" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "Admins can do the following:" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "Manage preferences" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "Manage users" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "Manage watched folders" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "View system status" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "Access playout history" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "View listener stats" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "Show / hide columns" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "From {from} to {to}" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "kbps" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "yyyy-mm-dd" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" +msgstr "hh:mm:ss.t" + +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" +msgstr "kHz" + +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" +msgstr "Su" + +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" +msgstr "Mo" + +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" +msgstr "Tu" + +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" +msgstr "We" + +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" +msgstr "Th" + +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" +msgstr "Fr" + +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" +msgstr "Sa" + +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Close" + +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" +msgstr "Hour" + +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" +msgstr "Minute" + +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" +msgstr "Done" + +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" +msgstr "Select files" + +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." +msgstr "Add files to the upload queue and click the start button." + +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "Status" + +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" +msgstr "Add Files" + +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" +msgstr "Stop Upload" + +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" +msgstr "Start upload" + +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" +msgstr "Add files" + +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" +msgstr "Uploaded %d/%d files" + +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" +msgstr "N/A" + +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." +msgstr "Drag files here." + +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." +msgstr "File extension error." + +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." +msgstr "File size error." + +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." +msgstr "File count error." + +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." +msgstr "Init error." -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" -msgstr "Look in" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." +msgstr "HTTP Error." -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" -msgstr "Open" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." +msgstr "Security error." -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "Admin" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." +msgstr "Generic error." -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "DJ" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." +msgstr "IO error." -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "Program Manager" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" +msgstr "File: %s" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "Guest" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" +msgstr "%d files queued" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" -msgstr "Guests can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" +msgstr "File: %f, size: %s, max file size: %m" -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" -msgstr "View schedule" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" +msgstr "Upload URL might be wrong or doesn't exist" -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" -msgstr "View show content" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " +msgstr "Error: File too large: " -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" -msgstr "DJs can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " +msgstr "Error: Invalid file extension: " -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" -msgstr "Manage assigned show content" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "Set Default" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" -msgstr "Import media files" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" +msgstr "Create Entry" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" -msgstr "Create playlists, smart blocks, and webstreams" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" +msgstr "Edit History Record" -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" -msgstr "Manage their own library content" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" +msgstr "Copied %s row%s to the clipboard" -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" -msgstr "Progam Managers can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." +msgstr "%sPrint view%sPlease use your browser's print function to print this table. Press the Escape key when finished." -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" -msgstr "View and manage show content" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "You don't have permission to disconnect source." -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" -msgstr "Schedule shows" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "There is no source connected to this input." -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" -msgstr "Manage all library content" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "You don't have permission to switch source." -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" -msgstr "Admins can do the following:" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "You are viewing an older version of %s" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" -msgstr "Manage preferences" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "You cannot add tracks to dynamic blocks." -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" -msgstr "Manage users" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%s not found" -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "Manage watched folders" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "You don't have permission to delete selected %s(s)." -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "Send support feedback" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "Something went wrong." -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" -msgstr "View system status" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "You can only add tracks to smart block." -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" -msgstr "Access playout history" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "Untitled Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" -msgstr "View listener stats" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Untitled Smart Block" -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" -msgstr "Show / hide columns" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "Unknown Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" -msgstr "From {from} to {to}" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "You are not allowed to access this resource." -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" -msgstr "kbps" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "You are not allowed to access this resource. " -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" -msgstr "yyyy-mm-dd" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "File does not exist in Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" -msgstr "hh:mm:ss.t" +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "File does not exist in Airtime" -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" -msgstr "kHz" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "File doesn't exist in Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" -msgstr "Su" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "Bad request. no 'mode' parameter passed." -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" -msgstr "Mo" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "Bad request. 'mode' parameter is invalid" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" -msgstr "Tu" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "Preview" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" -msgstr "We" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "Add to Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" -msgstr "Th" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "Add to Smart Block" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "Delete" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" -msgstr "Fr" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "Duplicate Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" -msgstr "Sa" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "Edit" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" -msgstr "Hour" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" -msgstr "Minute" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "View on SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" -msgstr "Done" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "Re-upload to SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" -msgstr "Select files" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Upload to SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." -msgstr "Add files to the upload queue and click the start button." +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "No action available" -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" -msgstr "Add Files" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "You don't have permission to delete selected items." -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" -msgstr "Stop Upload" +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "Could not delete some scheduled files." -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" -msgstr "Start upload" +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "Copy of %s" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" -msgstr "Add files" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Select cursor" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" -msgstr "Uploaded %d/%d files" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "Remove cursor" -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" -msgstr "N/A" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "show does not exist" -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." -msgstr "Drag files here." +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." +msgstr "Preferences updated." -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." -msgstr "File extension error." +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." +msgstr "Support setting updated." -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." -msgstr "File size error." +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" +msgstr "Support Feedback" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." -msgstr "File count error." +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." +msgstr "Stream Setting Updated." -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." -msgstr "Init error." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" +msgstr "path should be specified" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." -msgstr "HTTP Error." +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." +msgstr "Problem with Liquidsoap..." -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." -msgstr "Security error." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "Now Playing" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." -msgstr "Generic error." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "Add Media" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." -msgstr "IO error." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Library" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" -msgstr "File: %s" +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "Calendar" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" -msgstr "%d files queued" +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "System" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" -msgstr "File: %f, size: %s, max file size: %m" +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "Preferences" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" -msgstr "Upload URL might be wrong or doesn't exist" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "Users" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " -msgstr "Error: File too large: " +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Media Folders" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " -msgstr "Error: Invalid file extension: " +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Streams" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" -msgstr "Create Entry" +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "Listener Stats" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" -msgstr "Edit History Record" +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "History" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" -msgstr "Copied %s row%s to the clipboard" +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "Playout History" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." -msgstr "%sPrint view%sPlease use your browser's print function to print this table. Press the Escape key when finished." +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "History Templates" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "Please enter your user name and password" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "Help" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "Wrong username or password provided. Please try again." +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "Getting Started" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "User Manual" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "Given email not found." +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "About" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." -msgstr "Preferences updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "Service" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." -msgstr "Support setting updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "Uptime" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" -msgstr "Support Feedback" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "CPU" + +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "Memory" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." -msgstr "Stream Setting Updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Airtime Version" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" -msgstr "path should be specified" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "Disk Space" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." -msgstr "Problem with Liquidsoap..." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "Email / Mail Server Settings" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Select cursor" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "SoundCloud Settings" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "Remove cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Repeat Days:" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "show does not exist" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "Remove" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Untitled Webstream" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "Add" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Webstream saved." +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "Connection URL: " -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "Invalid form values." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "Input Stream Settings" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "You are viewing an older version of %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "Master Source Connection URL:" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "You cannot add tracks to dynamic blocks." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "Override" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "You don't have permission to delete selected %s(s)." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "OK" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "You can only add tracks to smart block." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "RESET" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "Untitled Playlist" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "Show Source Connection URL:" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Untitled Smart Block" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(Required)" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "Unknown Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "Register Airtime" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "Page not found" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Application error" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "User added successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(for verification purposes only, will not be published)" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "User updated successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Note: Anything larger than 600x600 will be resized." -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "Settings updated successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Show me what I am sending " -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "The year %s must be within the range of 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "Terms and Conditions" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s is not a valid date" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "Reset password" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s:%s:%s is not a valid time" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Choose folder" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "Untitled Show" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "Set" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "Import Folder:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "Current Import Folder:" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "Watched Folders:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "Not a valid Directory" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "Remove watched directory" -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Username:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "You are not watching any media folders." -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "Stream " -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "Verify Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "Additional Options" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "Firstname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "The following info will be displayed to listeners in their media player:" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "Lastname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(Your radio station website)" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "Email:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "Stream URL: " -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Mobile Phone:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "Filter History" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "Find Shows" + +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "Filter By Show:" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "%s's Settings" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "User Type:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "Login name is not unique." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "Click the box below to promote your station on %sSourcefabric.org%s." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "Auto Switch Off" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(In order to promote your station, 'Send support feedback' must be enabled)." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "Auto Switch On" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Sourcefabric Privacy Policy" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "Switch Transition Fade (s)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "Choose Show Instance" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "enter a time in seconds 00{.000000}" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "Find" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "Master Username" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Choose Days:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "Master Password" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Smart Block Options" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "Master Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "or" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "Show Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "and" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "Master Source Port" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr " to " -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "Only numbers are allowed." +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "files meet the criteria" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "Master Source Mount Point" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "file meet the criteria" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Invalid character entered" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "Creating File Summary Template" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Show Source Port" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "Creating Log Sheet Template" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "Show Source Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "Add more elements" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "You cannot use same port as Master DJ port." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "Add New Field" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "Port %s is not available" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "Set Default Template" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%value%' does not fit the time format 'HH:mm'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" +msgstr "Log Sheet Templates" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "Date/Time Start:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "No Log Sheet Templates" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "Date/Time End:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "New Log Sheet Template" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "Duration:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" +msgstr "File Summary Templates" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "Timezone:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" +msgstr "No File Summary Templates" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "Repeats?" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "New File Summary Template" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "Cannot create show in the past" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "New" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "Cannot modify start date/time of the show that is already started" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "New Playlist" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "Cannot have duration < 0m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "New Smart Block" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "Cannot have duration 00h 00m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "New Webstream" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "Cannot have duration greater than 24h" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "View / edit description" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" -msgstr "Link:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "Stream URL:" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "Repeat Type:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "Default Length:" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "weekly" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "No webstream" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" -msgstr "every 2 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "Stream Settings" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" -msgstr "every 3 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Global Settings" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" -msgstr "every 4 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "dB" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "monthly" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "Output Stream Settings" -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Select Days:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "File import in progress..." -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "Repeat By:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "Advanced Search Options" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "day of the month" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "previous" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "day of the week" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "play" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "Date End:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "pause" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "No End?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "next" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "End date must be after start date" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "stop" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "Please select a repeat day" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "mute" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "Value is required and can't be empty" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "unmute" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "Password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "max volume" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "Confirm new password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "Update Required" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "Password confirmation does not match your password." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Get new password" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "Length:" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Station Name" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "Sample Rate:" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Phone:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "Isrc Number:" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "Station Web Site:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "File Path:" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "Country:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Web Stream" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "City:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "Dynamic Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "Station Description:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "Static Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Station Logo:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Audio Track" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "Promote my station on Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "Playlist Contents: " -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "Static Smart Block Contents: " -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "You have to agree to privacy policy." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "Dynamic Smart Block Criteria: " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%value%' is no valid email address in the basic format local-part@hostname" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "Limit to " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%' does not fit the date format '%format%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%' is less than %min% characters long" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%value%' is more than %max% characters long" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%' is not between '%min%' and '%max%', inclusively" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "Listener Count Over Time" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "Passwords do not match" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Welcome to Airtime!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "Enabled:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Here's how you can get started using Airtime to automate your broadcasts: " -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "Stream Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "Service Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "Channels:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Select your media from the left pane and drag them to your show in the right pane." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "Then you're ready to broadcast!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Server" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "For more detailed help, read the %suser manual%s." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "Port" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "Share" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "URL" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Select stream:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Mount Point" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "Admin User" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "Admin Password" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "New password" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "Server cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "Please enter and confirm your new password in the fields below." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "Port cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "Mount cannot be empty with Icecast server." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "Email sent" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "Hardware Audio Output" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "An email has been sent" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "Output Type" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "Back to login screen" -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Icecast Vorbis Metadata" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "Stream Label:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "Previous:" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "Next:" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Show - Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "Source Streams" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Station name - Show name" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "Master Source" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "Off Air Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "Show Source" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "Enable Replay Gain" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "Scheduled Play" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "Replay Gain Modifier" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "ON AIR" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "Search Users:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "Listen" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "Station time" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "Record from Line In?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "Your trial expires in" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "Rebroadcast?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Purchase your copy of Airtime" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "Enable System Emails (Password Reset)" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "My Account" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "Reset Password 'From' Email" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "Manage Users" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "Configure Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "New User" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "Requires Authentication" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "id" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "First Name" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "Email Address" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "Last Name" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "Type the characters you see in the picture below." +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "User Type" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "Day must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "Log Sheet" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "Time must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "File Summary" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "Must wait at least 1 hour to rebroadcast" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "Show Summary" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Use Airtime Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Zend Framework Default Application" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "Use Custom Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "Page not found!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "Custom Username" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "Looks like the page you were looking for doesn't exist!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "Custom Password" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "Expand Static Block" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "Username field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "Expand Dynamic Block" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "Password field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "Empty smart block" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "Date Start:" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "Empty playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "Default Crossfade Duration (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" +msgstr "Empty playlist content" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "enter a time in seconds 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" +msgstr "Clear" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" -msgstr "Default Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Shuffle playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" -msgstr "Default Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Save playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "Playlist crossfade" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "Disabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "Fade in: " + +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Fade out: " -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "Enabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "No open playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "Default Interface Language" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" +msgstr "Empty smart block content" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" -msgstr "Station Timezone" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(ss.t)" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "Week Starts On" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "No open smart block" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" -msgstr "Interface Timezone:" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" +msgstr "Show Waveform" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "Cue In: " -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "Restore password" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(hh:mm:ss.t)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "hours" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Cue Out: " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "minutes" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "Original Length:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "Set smart block type:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "Add this show" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "Static" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "Update show" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "Dynamic" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "What" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "Allow Repeat Tracks:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "When" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "Limit to" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "Live Stream Input" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "Generate playlist content and save criteria" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "Record & Rebroadcast" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "Generate" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Who" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "Shuffle playlist content" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Style" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "Limit cannot be empty or smaller than 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "Rebroadcast of %s from %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "Limit cannot be more than 24 hrs" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Select Country" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "The value should be an integer" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "Length needs to be greater than 0 minutes" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "500 is the max item limit value you can set" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "Length should be of form \"00h 00m\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "You must select Criteria and Modifier" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "URL should be of form \"http://domain\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "'Length' should be in '00:00:00' format" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "URL should be 512 characters or less" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "No MIME type found for webstream." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "The value has to be numeric" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "Webstream name cannot be empty" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "The value should be less then 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "Could not parse XSPF playlist" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "The value should be less than %s characters" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "Could not parse PLS playlist" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "Value cannot be empty" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "Could not parse M3U playlist" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Show:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "Invalid webstream - This appears to be a file download." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "All My Shows:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "Unrecognised stream type: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "ISRC Number:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s is already watched." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "Automatically Upload Recorded Shows" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s contains nested watched directory: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "Enable SoundCloud Upload" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s is nested within existing watched directory: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "Automatically Mark Files \"Downloadable\" on SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s is not a valid directory." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "SoundCloud Email" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s is already set as the current storage dir or in the watched folders list" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "SoundCloud Password" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s is already set as the current storage dir or in the watched folders list." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "SoundCloud Tags: (separate tags with spaces)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s doesn't exist in the watched list." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "Default Genre:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "Cannot move items out of linked shows" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "Default Track Type:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "The schedule you're viewing is out of date! (sched mismatch)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "Original" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "The schedule you're viewing is out of date! (instance mismatch)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "The schedule you're viewing is out of date!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "Live" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "You are not allowed to schedule show %s." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "Recording" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "You cannot add files to recording shows." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "Spoken" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "The show %s is over and cannot be scheduled." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "The show %s has been previously updated!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "Content in linked shows must be scheduled before or after any one is broadcasted" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "Work in progress" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "A selected File does not exist!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "Stem" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "Cue in and cue out are null." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "Loop" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "Can't set cue in to be larger than cue out." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Sound Effect" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "Can't set cue out to be greater than file length." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "One Shot Sample" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "Can't set cue out to be smaller than cue in." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Other" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "Default License:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "Shows can have a max length of 24 hours." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "The work is in the public domain" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "All rights are reserved" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Airtime Password Reset" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "Creative Commons Attribution Noncommercial" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "Record file doesn't exist" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "Creative Commons Attribution No Derivative Works" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "View Recorded File Metadata" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "Creative Commons Attribution Share Alike" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Show Content" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "Creative Commons Attribution Noncommercial Non Derivate Works" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "Remove All Content" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "Creative Commons Attribution Noncommercial Share Alike" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "Cancel Current Show" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "Background Colour:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "Edit This Instance" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "Text Colour:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "Edit Show" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "Now Playing" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "Delete This Instance" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "Add Media" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "Delete This Instance and All Following" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Library" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "Permission denied" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "Calendar" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "Can't drag and drop repeating shows" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "System" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "Can't move a past show" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "Users" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "Can't move show into past" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Media Folders" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "Can't move a recorded show less than 1 hour before its rebroadcasts." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Streams" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "Show was deleted because recorded show does not exist!" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "Listener Stats" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "Must wait 1 hour to rebroadcast." -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" -msgstr "History" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" +msgstr "Track" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "Playout History" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "Played" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "History Templates" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "The year %s must be within the range of 1753 - 9999" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "Getting Started" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s is not a valid date" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "User Manual" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s:%s:%s is not a valid time" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3914,3 +3804,18 @@ msgstr "Please select an option" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "No Records" + +#~ msgid "can't resize a past show" +#~ msgstr "can't resize a past show" + +#~ msgid "Should not overlap shows" +#~ msgstr "Should not overlap shows" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "Failed to create 'organise' directory." + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "This file appears to be corrupted and will not be added to media library." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." diff --git a/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po index b4ca5a7db5..446125e6ea 100644 --- a/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po @@ -1,7 +1,7 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # danielhjames , 2014 # Sourcefabric , 2012 @@ -9,28 +9,16 @@ msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-01-29 17:06+0000\n" "Last-Translator: danielhjames \n" "Language-Team: English (United States) (http://www.transifex.com/projects/p/airtime/language/en_US/)\n" +"Language: en_US\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: en_US\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "Live stream" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -51,9 +39,9 @@ msgid "Stop" msgstr "Stop" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Cue In" @@ -62,9 +50,9 @@ msgid "Set Cue In" msgstr "Set Cue In" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Cue Out" @@ -86,1720 +74,1448 @@ msgstr "Fade In" msgid "Fade Out" msgstr "Fade Out" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "Title" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "Creator" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "Live stream" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "Enabled:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "Length" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "Stream Type:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Genre" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Bit Rate:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "Mood" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "Service Type:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "Label" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "Channels:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "Composer" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Mono" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Stereo" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "Copyright" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Server" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Year" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Invalid character entered" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "Track" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "Port" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "Conductor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "Only numbers are allowed." -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "Language" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "Password" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "Start Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Genre" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "End Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "URL" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "Played" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "Name" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "Record file doesn't exist" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "Description" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "View Recorded File Metadata" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Mount Point" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "View on SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Username" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "Admin User" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "Re-upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "Admin Password" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Show Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Getting information from the server..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "Add / Remove Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "Server cannot be empty." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "Remove All Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "Port cannot be empty." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "Cancel Current Show" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "Mount cannot be empty with Icecast server." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "Edit This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "Title:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "Edit" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "Creator:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "Edit Show" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Album:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "Delete" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Track:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "Delete This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Genre:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "Delete This Instance and All Following" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Year:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "Permission denied" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "Label:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "Can't drag and drop repeating shows" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "Composer:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "Can't move a past show" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "Conductor:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "Can't move show into past" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "Mood:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "Cannot schedule overlapping shows" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "Can't move a recorded show less than 1 hour before its rebroadcasts." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "Copyright:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "Show was deleted because recorded show does not exist!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "ISRC Number:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "Must wait 1 hour to rebroadcast." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "Website:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "Preferences" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "Language:" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Save" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "Manage Media Folders" - -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "Stream Settings" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "Cancel" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Global Settings" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Username:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "dB" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "Password:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "Output Stream Settings" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "Verify Password:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Choose folder" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "Firstname:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "Set" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "Lastname:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "Current Import Folder:" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "Email:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "Add" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Mobile Phone:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "Remove watched directory" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "You are not watching any media folders." +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "User Type:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "Register Airtime" +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "Guest" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "DJ" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "Program Manager" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(Required)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(for verification purposes only, will not be published)" +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "Admin" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Note: Anything larger than 600x600 will be resized." +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "Login name is not unique." -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Show me what I am sending " +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "Background Color:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "Terms and Conditions" +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "Text Color:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "Find Shows" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "Date Start:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "Filter By Show:" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "Date End:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "Reset password" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Show:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Smart Block Options" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "All My Shows:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "or" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "days" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "and" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "Day must be specified" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr " to " +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "Time must be specified" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "files meet the criteria" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "Must wait at least 1 hour to rebroadcast" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "file meet the criteria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "Import Folder:" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "Connection URL: " +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "Watched Folders:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "Not a valid Directory" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "Click the box below to promote your station on %sSourcefabric.org%s." +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "Search Users:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(In order to promote your station, 'Send support feedback' must be enabled)." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "DJs:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Sourcefabric Privacy Policy" +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "Login" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "Input Stream Settings" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "Type the characters you see in the picture below." -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "Master Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Station Name" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "Override" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "Default Crossfade Duration (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "enter a time in seconds 0{.0}" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "RESET" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "Default Fade In (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "Show Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "Default Fade Out (s):" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Choose Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "Remove" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "Disabled" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Repeat Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "Enabled" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "Email / Mail Server Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "Default Interface Language" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "SoundCloud Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" +msgstr "Station Timezone" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "%s's Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "Week Starts On" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" -msgstr "Choose Show Instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "Sunday" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "No Show" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "Monday" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "Find" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "Tuesday" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "Stream " +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "Wednesday" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "Additional Options" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "Thursday" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "The following info will be displayed to listeners in their media player:" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(Your radio station website)" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "Friday" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "Stream URL: " +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Saturday" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "Filter History" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "Link:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Welcome to Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "Repeat Type:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Here's how you can get started using Airtime to automate your broadcasts: " +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "weekly" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "every 2 weeks" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "every 3 weeks" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "every 4 weeks" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Select your media from the left pane and drag them to your show in the right pane." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "monthly" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "Then you're good to go!" +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Select Days:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "For more detailed help, read the %suser manual%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "Sun" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "About" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "Mon" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "Tue" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "Wed" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "Share" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "Thu" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Select stream:" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "Fri" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "mute" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "Sat" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "unmute" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "Repeat By:" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "Login" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "day of the month" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "day of the week" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "No End?" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "Email sent" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "End date must be after start date" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "An email has been sent" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "Please select a repeat day" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "Back to login screen" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "Confirm new password" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "New password" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "Password confirmation does not match your password." -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "Please enter and confirm your new password in the fields below." +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Get new password" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "Your trial expires in" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "Select criteria" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "days" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Album" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Purchase your copy of Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Bit Rate (Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "My Account" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "Previous:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "Composer" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "Next:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "Conductor" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "Source Streams" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "Copyright" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "Master Source" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "Creator" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "Show Source" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Encoded By" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "Scheduled Play" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "ON AIR" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "Label" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "Listen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "Language" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "Station time" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "Last Modified" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Close" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "Last Played" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "Add this show" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "Length" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "Update show" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Mime" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "What" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "Mood" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "When" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "Owner" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "Live Stream Input" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "Replay Gain" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "Record & Rebroadcast" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "Sample Rate (kHz)" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Who" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "Title" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Style" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "Track Number" -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "Start" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "Uploaded" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "Service" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "Website" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "Status" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Year" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "Uptime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "Select modifier" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "CPU" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "contains" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "Memory" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "does not contain" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Airtime Version" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "is" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "Disk Space" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "is not" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "File import in progress..." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "starts with" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "Advanced Search Options" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "ends with" -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "Listener Count Over Time" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "is greater than" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "New" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "is less than" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "New Playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "is in the range" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "New Smart Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "hours" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "New Webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "minutes" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "View / edit description" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "items" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "Description" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "Set smart block type:" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "Stream URL:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "Static" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "Default Length:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "Dynamic" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "No webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "Allow Repeat Tracks:" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "Empty playlist content" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "Limit to" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "Clear" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "Generate playlist content and save criteria" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Shuffle playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "Generate" + +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "Shuffle playlist content" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 #: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 msgid "Shuffle" msgstr "Shuffle" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Save playlist" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "Playlist crossfade" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "Fade in: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Fade out: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "No open playlist" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "Show Waveform" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "Empty smart block content" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "No open smart block" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "Cue In: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(hh:mm:ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Cue Out: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "Original Length:" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "Expand Static Block" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "Expand Dynamic Block" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "Empty smart block" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "Empty playlist" - -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Zend Framework Default Application" - -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "Page not found!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "Looks like the page you were looking for doesn't exist!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "Help" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "previous" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "play" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "pause" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "next" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "stop" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "max volume" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "Update Required" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "Creating File Summary Template" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "Creating Log Sheet Template" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "Name" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "Add more elements" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "Add New Field" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "Set Default Template" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "Log Sheet Templates" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "No Log Sheet Templates" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "Set Default" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "New Log Sheet Template" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "Limit cannot be empty or smaller than 0" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "No File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "Limit cannot be more than 24 hrs" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "New File Summary Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "The value should be an integer" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "Manage Users" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "500 is the max item limit value you can set" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "New User" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "You must select Criteria and Modifier" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "id" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "'Length' should be in '00:00:00' format" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Username" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "First Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "The value has to be numeric" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "Last Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "The value should be less then 2147483648" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "User Type" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "The value should be less than %s characters" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "Title:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "Value cannot be empty" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "Creator:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "Auto Switch Off" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Album:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "Auto Switch On" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Track:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "Switch Transition Fade (s)" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "Length:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "enter a time in seconds 00{.000000}" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "Sample Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "Master Username" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Bit Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "Master Password" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "Mood:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "Master Source Connection URL" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Genre:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "Show Source Connection URL" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Year:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "Master Source Port" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "Label:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "Master Source Mount Point" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Show Source Port" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "Composer:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "Show Source Mount Point" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "Conductor:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "You cannot use same port as Master DJ port." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "Copyright:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "Port %s is not available" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "Isrc Number:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Phone:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "Website:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "Station Web Site:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "Language:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "Country:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "File Path:" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "City:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "Name:" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "Station Description:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "Description:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Station Logo:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Web Stream" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "Send support feedback" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "Dynamic Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "Promote my station on Sourcefabric.org" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "Static Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Audio Track" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "You have to agree to privacy policy." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "Playlist Contents: " +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "Value is required and can't be empty" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "Static Smart Block Contents: " +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "Start Time" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "Dynamic Smart Block Criteria: " +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "End Time" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "Limit to " +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "No Show" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "URL:" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "Record from Line In?" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "Log Sheet" +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "Rebroadcast?" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "File Summary" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Use Airtime Authentication:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "Show Summary" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "Use Custom Authentication:" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "Shows can have a max length of 24 hours." +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "Custom Username" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "End date/time cannot be in the past" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "Custom Password" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "Cannot schedule overlapping shows.\nNote: Resizing a repeating show affects all of its repeats." +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "Username field cannot be empty." -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "can't resize a past show" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "Password field cannot be empty." -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "Should not overlap shows" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "E-mail" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Select Country" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "Restore password" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s is already watched." +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "Hardware Audio Output" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s contains nested watched directory: %s" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "Output Type" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s is nested within existing watched directory: %s" +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Icecast Vorbis Metadata" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s is not a valid directory." +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "Stream Label:" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s is already set as the current storage dir or in the watched folders list" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "Artist - Title" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s is already set as the current storage dir or in the watched folders list." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Show - Artist - Title" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s doesn't exist in the watched list." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Station name - Show name" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "items" +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "Off Air Metadata" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "Cue in and cue out are null." +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "Enable Replay Gain" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "Can't set cue out to be greater than file length." +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "Replay Gain Modifier" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "Can't set cue in to be larger than cue out." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%value%' is no valid email address in the basic format local-part@hostname" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "Can't set cue out to be smaller than cue in." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%' does not fit the date format '%format%'" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "Select criteria" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%' is less than %min% characters long" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Bit Rate (Kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%value%' is more than %max% characters long" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%' is not between '%min%' and '%max%', inclusively" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Encoded By" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "Passwords do not match" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "Last Modified" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%value%' does not fit the time format 'HH:mm'" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "Last Played" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "Date/Time Start:" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Mime" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "Date/Time End:" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "Owner" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "Duration:" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "Replay Gain" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "Timezone:" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "Sample Rate (kHz)" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "Repeats?" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "Track Number" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "Cannot create show in the past" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "Uploaded" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "Cannot modify start date/time of the show that is already started" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "Website" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "End date/time cannot be in the past" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "Select modifier" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "Cannot have duration < 0m" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "contains" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "Cannot have duration 00h 00m" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "does not contain" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "Cannot have duration greater than 24h" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "is" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "Cannot schedule overlapping shows" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "is not" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "Name:" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "starts with" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "Untitled Show" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "ends with" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "URL:" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "is greater than" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "Description:" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "is less than" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "Automatically Upload Recorded Shows" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "is in the range" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "Enable SoundCloud Upload" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "Length needs to be greater than 0 minutes" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "Automatically Mark Files \"Downloadable\" on SoundCloud" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "Length should be of form \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "SoundCloud Email" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "URL should be of form \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "SoundCloud Password" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "URL should be 512 characters or less" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "SoundCloud Tags: (separate tags with spaces)" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "No MIME type found for webstream." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "Default Genre:" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "Webstream name cannot be empty" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "Default Track Type:" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "Could not parse XSPF playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "Original" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "Could not parse PLS playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "Remix" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "Could not parse M3U playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "Live" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "Invalid webstream - This appears to be a file download." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "Recording" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "Unrecognized stream type: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "Spoken" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Hi %s, \n\nClick this link to reset your password: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "Podcast" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Airtime Password Reset" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Demo" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "Rebroadcast of %s from %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "Work in progress" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "Cannot move items out of linked shows" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "Stem" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "The schedule you're viewing is out of date! (sched mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "Loop" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "The schedule you're viewing is out of date! (instance mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Sound Effect" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "The schedule you're viewing is out of date!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "One Shot Sample" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "You are not allowed to schedule show %s." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Other" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "You cannot add files to recording shows." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "Default License:" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "The show %s is over and cannot be scheduled." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "The work is in the public domain" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "The show %s has been previously updated!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "All rights are reserved" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "Content in linked shows must be scheduled before or after any one is broadcasted" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "Creative Commons Attribution" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "A selected File does not exist!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "Creative Commons Attribution Noncommercial" + +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "Creative Commons Attribution No Derivative Works" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "Failed to create 'organize' directory." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "Creative Commons Attribution Share Alike" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "Creative Commons Attribution Noncommercial Non Derivate Works" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "This file appears to be corrupted and will not be added to media library." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "Creative Commons Attribution Noncommercial Share Alike" + +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "Interface Timezone:" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "Enable System Emails (Password Reset)" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "You don't have permission to disconnect source." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "Reset Password 'From' Email" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "There is no source connected to this input." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "Configure Mail Server" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "You don't have permission to switch source." +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "Requires Authentication" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" -msgstr "Rebroadcast of show %s from %s at %s" +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "Mail Server" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" -msgstr "Download" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "Email Address" #: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "Please make sure admin user/password is correct on System->Streams page." -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "You are not allowed to access this resource." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Untitled Webstream" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "You are not allowed to access this resource. " +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Webstream saved." -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "File does not exist in Airtime." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "Invalid form values." -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "File does not exist in Airtime" +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "Please enter your user name and password" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "File doesn't exist in Airtime." +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "Wrong username or password provided. Please try again." -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "Bad request. no 'mode' parameter passed." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "Email could not be sent. Check your mail server settings and ensure it has been configured properly." -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "Bad request. 'mode' parameter is invalid" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "Given email not found." -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format -msgid "%s not found" -msgstr "%s not found" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "Something went wrong." - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "Preview" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "Add to Playlist" - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "Add to Smart Block" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "Edit Metadata" +msgid "Rebroadcast of show %s from %s at %s" +msgstr "Rebroadcast of show %s from %s at %s" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "Duplicate Playlist" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" +msgstr "Download" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "User added successfully!" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "No action available" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "User updated successfully!" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "You don't have permission to delete selected items." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "Settings updated successfully!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "Could not delete some scheduled files." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "Page not found" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "Copy of %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Application error" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1875,6 +1591,11 @@ msgstr "You can only add tracks, smart blocks, and webstreams to playlists." msgid "Please select a cursor position on timeline." msgstr "Please select a cursor position on timeline." +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "Edit Metadata" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "Add to selected show" @@ -1921,6 +1642,7 @@ msgstr "Loading..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "All" @@ -1991,9 +1713,7 @@ msgstr "Input must be in the format: hh:mm:ss.t" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2029,10 +1749,7 @@ msgid "Playlist shuffled" msgstr "Playlist shuffled" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2058,24 +1775,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "Image must be one of jpg, jpeg, png, or gif" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2106,7 +1814,14 @@ msgstr "Choose Folder to Watch" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "Are you sure you want to change the storage folder?\nThis will remove the files from your Airtime library!" +msgstr "" +"Are you sure you want to change the storage folder?\n" +"This will remove the files from your Airtime library!" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "Manage Media Folders" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2118,9 +1833,7 @@ msgstr "This path is currently not accessible." #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2131,22 +1844,12 @@ msgstr "Connected to the streaming server" msgid "The stream is disabled" msgstr "The stream is disabled" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Getting information from the server..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "Can not connect to the streaming server" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2155,61 +1858,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "For more details, please read the %sAirtime Manual%s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "Check this box to automatically switch off Master/Show source upon source disconnection." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "Check this box to automatically switch on Master/Show source upon source connection." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "If your Icecast server expects a username of 'source', this field can be left blank." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "If your live streaming client does not ask for a username, this field should be 'source'." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "Warning: You cannot change this field while the show is currently playing" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2217,9 +1895,7 @@ msgid "No result found" msgstr "No result found" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "This follows the same security pattern for the shows: only users assigned to the show can connect." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2235,16 +1911,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "Warning: Shows cannot be re-linked" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2386,93 +2057,22 @@ msgstr "Dec" #: airtime_mvc/application/controllers/LocaleController.php:236 msgid "today" -msgstr "today" - -#: airtime_mvc/application/controllers/LocaleController.php:237 -msgid "day" -msgstr "day" - -#: airtime_mvc/application/controllers/LocaleController.php:238 -msgid "week" -msgstr "week" - -#: airtime_mvc/application/controllers/LocaleController.php:239 -msgid "month" -msgstr "month" - -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "Sunday" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "Monday" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "Tuesday" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "Wednesday" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "Thursday" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "Friday" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Saturday" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "Sun" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "Mon" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "Tue" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "Wed" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "Thu" +msgstr "today" -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "Fri" +#: airtime_mvc/application/controllers/LocaleController.php:237 +msgid "day" +msgstr "day" -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "Sat" +#: airtime_mvc/application/controllers/LocaleController.php:238 +msgid "week" +msgstr "week" + +#: airtime_mvc/application/controllers/LocaleController.php:239 +msgid "month" +msgstr "month" #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Shows longer than their scheduled time will be cut off by a following show." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2500,6 +2100,11 @@ msgstr "Remove all content?" msgid "Delete selected item(s)?" msgstr "Delete selected item(s)?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "Start" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "End" @@ -2533,14 +2138,6 @@ msgstr "Moving 1 Item" msgid "Moving %s Items" msgstr "Moving %s Items" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "Cancel" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "Fade Editor" @@ -2550,8 +2147,7 @@ msgid "Cue Editor" msgstr "Cue Editor" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "Waveform features are available in a browser supporting the Web Audio API" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2582,1329 +2178,1623 @@ msgstr "Cancel current show" msgid "Open library to add or remove content" msgstr "Open library to add or remove content" +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "Add / Remove Content" + #: airtime_mvc/application/controllers/LocaleController.php:305 msgid "in use" msgstr "in use" -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" -msgstr "Disk" +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "Disk" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "Look in" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "Open" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "Guests can do the following:" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "View schedule" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "View show content" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "DJs can do the following:" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "Manage assigned show content" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "Import media files" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "Create playlists, smart blocks, and webstreams" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "Manage their own library content" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "Progam Managers can do the following:" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "View and manage show content" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "Schedule shows" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "Manage all library content" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "Admins can do the following:" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "Manage preferences" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "Manage users" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "Manage watched folders" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "View system status" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "Access playout history" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "View listener stats" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "Show / hide columns" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "From {from} to {to}" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "kbps" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "yyyy-mm-dd" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" +msgstr "hh:mm:ss.t" + +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" +msgstr "kHz" + +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" +msgstr "Su" + +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" +msgstr "Mo" + +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" +msgstr "Tu" + +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" +msgstr "We" + +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" +msgstr "Th" + +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" +msgstr "Fr" + +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" +msgstr "Sa" + +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Close" + +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" +msgstr "Hour" + +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" +msgstr "Minute" + +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" +msgstr "Done" + +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" +msgstr "Select files" + +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." +msgstr "Add files to the upload queue and click the start button." + +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "Status" + +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" +msgstr "Add Files" + +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" +msgstr "Stop Upload" + +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" +msgstr "Start upload" + +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" +msgstr "Add files" + +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" +msgstr "Uploaded %d/%d files" + +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" +msgstr "N/A" + +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." +msgstr "Drag files here." + +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." +msgstr "File extension error." + +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." +msgstr "File size error." + +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." +msgstr "File count error." + +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." +msgstr "Init error." -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" -msgstr "Look in" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." +msgstr "HTTP Error." -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" -msgstr "Open" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." +msgstr "Security error." -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "Admin" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." +msgstr "Generic error." -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "DJ" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." +msgstr "IO error." -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "Program Manager" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" +msgstr "File: %s" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "Guest" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" +msgstr "%d files queued" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" -msgstr "Guests can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" +msgstr "File: %f, size: %s, max file size: %m" -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" -msgstr "View schedule" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" +msgstr "Upload URL might be wrong or doesn't exist" -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" -msgstr "View show content" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " +msgstr "Error: File too large: " -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" -msgstr "DJs can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " +msgstr "Error: Invalid file extension: " -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" -msgstr "Manage assigned show content" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "Set Default" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" -msgstr "Import media files" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" +msgstr "Create Entry" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" -msgstr "Create playlists, smart blocks, and webstreams" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" +msgstr "Edit History Record" -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" -msgstr "Manage their own library content" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" +msgstr "Copied %s row%s to the clipboard" -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" -msgstr "Progam Managers can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." +msgstr "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" -msgstr "View and manage show content" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "You don't have permission to disconnect source." -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" -msgstr "Schedule shows" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "There is no source connected to this input." -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" -msgstr "Manage all library content" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "You don't have permission to switch source." -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" -msgstr "Admins can do the following:" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "You are viewing an older version of %s" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" -msgstr "Manage preferences" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "You cannot add tracks to dynamic blocks." -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" -msgstr "Manage users" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%s not found" -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "Manage watched folders" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "You don't have permission to delete selected %s(s)." -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "Send support feedback" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "Something went wrong." -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" -msgstr "View system status" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "You can only add tracks to smart block." -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" -msgstr "Access playout history" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "Untitled Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" -msgstr "View listener stats" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Untitled Smart Block" -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" -msgstr "Show / hide columns" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "Unknown Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" -msgstr "From {from} to {to}" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "You are not allowed to access this resource." -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" -msgstr "kbps" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "You are not allowed to access this resource. " -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" -msgstr "yyyy-mm-dd" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "File does not exist in Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" -msgstr "hh:mm:ss.t" +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "File does not exist in Airtime" -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" -msgstr "kHz" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "File doesn't exist in Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" -msgstr "Su" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "Bad request. no 'mode' parameter passed." -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" -msgstr "Mo" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "Bad request. 'mode' parameter is invalid" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" -msgstr "Tu" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "Preview" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" -msgstr "We" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "Add to Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" -msgstr "Th" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "Add to Smart Block" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "Delete" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" -msgstr "Fr" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "Duplicate Playlist" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" -msgstr "Sa" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "Edit" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" -msgstr "Hour" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "Soundcloud" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" -msgstr "Minute" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "View on SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" -msgstr "Done" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "Re-upload to SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" -msgstr "Select files" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Upload to SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." -msgstr "Add files to the upload queue and click the start button." +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "No action available" -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" -msgstr "Add Files" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "You don't have permission to delete selected items." -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" -msgstr "Stop Upload" +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "Could not delete some scheduled files." -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" -msgstr "Start upload" +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "Copy of %s" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" -msgstr "Add files" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Select cursor" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" -msgstr "Uploaded %d/%d files" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "Remove cursor" -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" -msgstr "N/A" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "show does not exist" -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." -msgstr "Drag files here." +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." +msgstr "Preferences updated." -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." -msgstr "File extension error." +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." +msgstr "Support setting updated." -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." -msgstr "File size error." +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" +msgstr "Support Feedback" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." -msgstr "File count error." +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." +msgstr "Stream Setting Updated." -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." -msgstr "Init error." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" +msgstr "path should be specified" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." -msgstr "HTTP Error." +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." +msgstr "Problem with Liquidsoap..." -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." -msgstr "Security error." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "Now Playing" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." -msgstr "Generic error." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "Add Media" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." -msgstr "IO error." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Library" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" -msgstr "File: %s" +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "Calendar" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" -msgstr "%d files queued" +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "System" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" -msgstr "File: %f, size: %s, max file size: %m" +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "Preferences" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" -msgstr "Upload URL might be wrong or doesn't exist" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "Users" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " -msgstr "Error: File too large: " +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Media Folders" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " -msgstr "Error: Invalid file extension: " +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Streams" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" -msgstr "Create Entry" +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "Listener Stats" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" -msgstr "Edit History Record" +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "History" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" -msgstr "Copied %s row%s to the clipboard" +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "Playout History" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." -msgstr "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "History Templates" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "Please enter your user name and password" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "Help" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "Wrong username or password provided. Please try again." +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "Getting Started" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "User Manual" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "Given email not found." +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "About" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." -msgstr "Preferences updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "Service" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." -msgstr "Support setting updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "Uptime" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" -msgstr "Support Feedback" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "CPU" + +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "Memory" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." -msgstr "Stream Setting Updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Airtime Version" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" -msgstr "path should be specified" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "Disk Space" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." -msgstr "Problem with Liquidsoap..." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "Email / Mail Server Settings" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Select cursor" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "SoundCloud Settings" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "Remove cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Repeat Days:" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "show does not exist" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "Remove" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Untitled Webstream" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "Add" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Webstream saved." +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "Connection URL: " -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "Invalid form values." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "Input Stream Settings" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "You are viewing an older version of %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "Master Source Connection URL:" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "You cannot add tracks to dynamic blocks." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "Override" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "You don't have permission to delete selected %s(s)." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "OK" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "You can only add tracks to smart block." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "RESET" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "Untitled Playlist" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "Show Source Connection URL:" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Untitled Smart Block" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(Required)" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "Unknown Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "Register Airtime" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "Page not found" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Application error" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "User added successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(for verification purposes only, will not be published)" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "User updated successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Note: Anything larger than 600x600 will be resized." -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "Settings updated successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Show me what I am sending " -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "The year %s must be within the range of 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "Terms and Conditions" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s is not a valid date" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "Reset password" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s:%s:%s is not a valid time" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Choose folder" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "Untitled Show" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "Set" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "Import Folder:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "Current Import Folder:" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "Watched Folders:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "Not a valid Directory" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "Remove watched directory" -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Username:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "You are not watching any media folders." -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "Stream " -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "Verify Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "Additional Options" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "Firstname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "The following info will be displayed to listeners in their media player:" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "Lastname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(Your radio station website)" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "Email:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "Stream URL: " -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Mobile Phone:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "Filter History" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "Find Shows" + +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "Filter By Show:" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "%s's Settings" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "User Type:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "Login name is not unique." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "Click the box below to promote your station on %sSourcefabric.org%s." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "Auto Switch Off" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(In order to promote your station, 'Send support feedback' must be enabled)." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "Auto Switch On" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Sourcefabric Privacy Policy" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "Switch Transition Fade (s)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "Choose Show Instance" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "enter a time in seconds 00{.000000}" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "Find" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "Master Username" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Choose Days:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "Master Password" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Smart Block Options" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "Master Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "or" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "Show Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "and" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "Master Source Port" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr " to " -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "Only numbers are allowed." +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "files meet the criteria" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "Master Source Mount Point" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "file meet the criteria" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Invalid character entered" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "Creating File Summary Template" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Show Source Port" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "Creating Log Sheet Template" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "Show Source Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "Add more elements" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "You cannot use same port as Master DJ port." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "Add New Field" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "Port %s is not available" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "Set Default Template" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%value%' does not fit the time format 'HH:mm'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" +msgstr "Log Sheet Templates" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "Date/Time Start:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "No Log Sheet Templates" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "Date/Time End:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "New Log Sheet Template" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "Duration:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" +msgstr "File Summary Templates" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "Timezone:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" +msgstr "No File Summary Templates" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "Repeats?" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "New File Summary Template" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "Cannot create show in the past" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "New" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "Cannot modify start date/time of the show that is already started" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "New Playlist" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "Cannot have duration < 0m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "New Smart Block" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "Cannot have duration 00h 00m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "New Webstream" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "Cannot have duration greater than 24h" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "View / edit description" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" -msgstr "Link:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "Stream URL:" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "Repeat Type:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "Default Length:" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "weekly" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "No webstream" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" -msgstr "every 2 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "Stream Settings" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" -msgstr "every 3 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Global Settings" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" -msgstr "every 4 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "dB" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "monthly" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "Output Stream Settings" -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Select Days:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "File import in progress..." -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "Repeat By:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "Advanced Search Options" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "day of the month" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "previous" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "day of the week" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "play" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "Date End:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "pause" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "No End?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "next" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "End date must be after start date" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "stop" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "Please select a repeat day" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "mute" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "Value is required and can't be empty" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "unmute" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "Password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "max volume" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "Confirm new password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "Update Required" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "Password confirmation does not match your password." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Get new password" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "Length:" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Station Name" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "Sample Rate:" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Phone:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "Isrc Number:" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "Station Web Site:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "File Path:" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "Country:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Web Stream" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "City:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "Dynamic Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "Station Description:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "Static Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Station Logo:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Audio Track" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "Promote my station on Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "Playlist Contents: " -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "Static Smart Block Contents: " -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "You have to agree to privacy policy." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "Dynamic Smart Block Criteria: " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%value%' is no valid email address in the basic format local-part@hostname" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "Limit to " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%' does not fit the date format '%format%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%' is less than %min% characters long" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%value%' is more than %max% characters long" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%' is not between '%min%' and '%max%', inclusively" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "Listener Count Over Time" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "Passwords do not match" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Welcome to Airtime!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "Enabled:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Here's how you can get started using Airtime to automate your broadcasts: " -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "Stream Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "Service Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "Channels:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Select your media from the left pane and drag them to your show in the right pane." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "Then you're good to go!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Server" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "For more detailed help, read the %suser manual%s." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "Port" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "Share" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "URL" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Select stream:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Mount Point" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "Admin User" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "Admin Password" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "New password" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "Server cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "Please enter and confirm your new password in the fields below." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "Port cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "Mount cannot be empty with Icecast server." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "Email sent" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "Hardware Audio Output" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "An email has been sent" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "Output Type" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "Back to login screen" -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Icecast Vorbis Metadata" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "Stream Label:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "Previous:" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "Next:" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Show - Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "Source Streams" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Station name - Show name" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "Master Source" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "Off Air Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "Show Source" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "Enable Replay Gain" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "Scheduled Play" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "Replay Gain Modifier" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "ON AIR" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "Search Users:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "Listen" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "Station time" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "Record from Line In?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "Your trial expires in" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "Rebroadcast?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Purchase your copy of Airtime" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "Enable System Emails (Password Reset)" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "My Account" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "Reset Password 'From' Email" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "Manage Users" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "Configure Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "New User" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "Requires Authentication" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "id" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "First Name" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "Email Address" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "Last Name" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "Type the characters you see in the picture below." +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "User Type" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "Day must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "Log Sheet" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "Time must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "File Summary" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "Must wait at least 1 hour to rebroadcast" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "Show Summary" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Use Airtime Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Zend Framework Default Application" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "Use Custom Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "Page not found!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "Custom Username" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "Looks like the page you were looking for doesn't exist!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "Custom Password" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "Expand Static Block" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "Username field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "Expand Dynamic Block" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "Password field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "Empty smart block" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "Date Start:" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "Empty playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "Default Crossfade Duration (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" +msgstr "Empty playlist content" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "enter a time in seconds 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" +msgstr "Clear" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" -msgstr "Default Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Shuffle playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" -msgstr "Default Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Save playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "Playlist crossfade" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "Disabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "Fade in: " + +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Fade out: " -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "Enabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "No open playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "Default Interface Language" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" +msgstr "Empty smart block content" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" -msgstr "Station Timezone" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(ss.t)" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "Week Starts On" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "No open smart block" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" -msgstr "Interface Timezone:" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" +msgstr "Show Waveform" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "Cue In: " -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "Restore password" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(hh:mm:ss.t)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "hours" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Cue Out: " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "minutes" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "Original Length:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "Set smart block type:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "Add this show" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "Static" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "Update show" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "Dynamic" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "What" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "Allow Repeat Tracks:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "When" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "Limit to" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "Live Stream Input" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "Generate playlist content and save criteria" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "Record & Rebroadcast" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "Generate" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Who" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "Shuffle playlist content" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Style" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "Limit cannot be empty or smaller than 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "Rebroadcast of %s from %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "Limit cannot be more than 24 hrs" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Select Country" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "The value should be an integer" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "Length needs to be greater than 0 minutes" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "500 is the max item limit value you can set" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "Length should be of form \"00h 00m\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "You must select Criteria and Modifier" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "URL should be of form \"http://domain\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "'Length' should be in '00:00:00' format" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "URL should be 512 characters or less" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "No MIME type found for webstream." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "The value has to be numeric" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "Webstream name cannot be empty" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "The value should be less then 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "Could not parse XSPF playlist" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "The value should be less than %s characters" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "Could not parse PLS playlist" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "Value cannot be empty" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "Could not parse M3U playlist" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Show:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "Invalid webstream - This appears to be a file download." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "All My Shows:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "Unrecognized stream type: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "ISRC Number:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s is already watched." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "Automatically Upload Recorded Shows" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s contains nested watched directory: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "Enable SoundCloud Upload" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s is nested within existing watched directory: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "Automatically Mark Files \"Downloadable\" on SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s is not a valid directory." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "SoundCloud Email" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s is already set as the current storage dir or in the watched folders list" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "SoundCloud Password" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s is already set as the current storage dir or in the watched folders list." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "SoundCloud Tags: (separate tags with spaces)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s doesn't exist in the watched list." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "Default Genre:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "Cannot move items out of linked shows" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "Default Track Type:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "The schedule you're viewing is out of date! (sched mismatch)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "Original" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "The schedule you're viewing is out of date! (instance mismatch)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "The schedule you're viewing is out of date!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "Live" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "You are not allowed to schedule show %s." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "Recording" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "You cannot add files to recording shows." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "Spoken" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "The show %s is over and cannot be scheduled." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "The show %s has been previously updated!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "Content in linked shows must be scheduled before or after any one is broadcasted" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "Work in progress" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "A selected File does not exist!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "Stem" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "Cue in and cue out are null." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "Loop" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "Can't set cue in to be larger than cue out." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Sound Effect" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "Can't set cue out to be greater than file length." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "One Shot Sample" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "Can't set cue out to be smaller than cue in." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Other" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "Default License:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "Shows can have a max length of 24 hours." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "The work is in the public domain" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "All rights are reserved" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Airtime Password Reset" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "Creative Commons Attribution Noncommercial" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "Record file doesn't exist" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "Creative Commons Attribution No Derivative Works" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "View Recorded File Metadata" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "Creative Commons Attribution Share Alike" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Show Content" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "Creative Commons Attribution Noncommercial Non Derivate Works" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "Remove All Content" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "Creative Commons Attribution Noncommercial Share Alike" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "Cancel Current Show" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "Background Color:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "Edit This Instance" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "Text Color:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "Edit Show" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "Now Playing" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "Delete This Instance" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "Add Media" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "Delete This Instance and All Following" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Library" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "Permission denied" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "Calendar" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "Can't drag and drop repeating shows" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "System" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "Can't move a past show" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "Users" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "Can't move show into past" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Media Folders" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "Can't move a recorded show less than 1 hour before its rebroadcasts." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Streams" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "Show was deleted because recorded show does not exist!" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "Listener Stats" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "Must wait 1 hour to rebroadcast." -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" -msgstr "History" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" +msgstr "Track" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "Playout History" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "Played" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "History Templates" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "The year %s must be within the range of 1753 - 9999" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "Getting Started" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s is not a valid date" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "User Manual" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s:%s:%s is not a valid time" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3913,3 +3803,18 @@ msgstr "Please select an option" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "No Records" + +#~ msgid "can't resize a past show" +#~ msgstr "can't resize a past show" + +#~ msgid "Should not overlap shows" +#~ msgstr "Should not overlap shows" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "Failed to create 'organize' directory." + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "This file appears to be corrupted and will not be added to media library." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." diff --git a/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po b/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po index 332bbc4fc8..dac435d986 100644 --- a/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po @@ -1,35 +1,23 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # Sourcefabric , 2012 msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-01-29 15:11+0000\n" "Last-Translator: andrey.podshivalov\n" "Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/airtime/language/es_ES/)\n" +"Language: es_ES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: es_ES\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime Copyright ©Sourcefabric o.p.s. Todos los derechos reservados.%sMantenido y distribuido bajo GNU GPL v.3 por %sSourcefabric o.p.s%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "Stream en vivo" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -50,9 +38,9 @@ msgid "Stop" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Cue in" @@ -61,9 +49,9 @@ msgid "Set Cue In" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Cue out" @@ -85,1620 +73,1418 @@ msgstr "Fade In" msgid "Fade Out" msgstr "Fade out" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "Título" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime Copyright ©Sourcefabric o.p.s. Todos los derechos reservados.%sMantenido y distribuido bajo GNU GPL v.3 por %sSourcefabric o.p.s%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "Creador" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "Stream en vivo" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Ãlbum" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "Activado:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "Duración:" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "Tipo de stream:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Género" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Tasa de bits:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "Estado de ánimo/estilo (mood)" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "Tipo de servicio:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "Sello" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "Canales:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "Compositor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Mono" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Estéreo" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "Derechos de autor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Servidor" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Año" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Se introdujo un caracter inválido" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "Puerto" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "Conductor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "Solo se permiten números." -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "Idioma" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "Contraseña" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Género" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "URL" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "Reproducido" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "Nombre" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "Descripción" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "Ver los metadatos del archivo grabado" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Punto de instalación" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "Ver en SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Usuario" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Cargar a SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "Usuario administrativo" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "Recargar a SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "Contraseña administrativa" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Mostrar contenido" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Obteniendo información desde el servidor..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "Agregar / eliminar contenido" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "El servidor no puede estar vacío." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "Eliminar todo el contenido" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "El puerto no puede estar vacío." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "Cancelar el show actual" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "La instalación no puede estar vacía con el servidor Icecast." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "Título:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "Editar" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "Creador:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "Editar show" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Ãlbum:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "Eliminar" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Pista:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "Eliminar esta instancia" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Género:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "Eliminar esta instancia y todas las que siguen" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Año:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "Sello:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "No es posible arrastrar y soltar shows que se repiten" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "Compositor:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "No puedes mover un show pasado" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "Conductor:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "No puedes mover un show al pasado" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "Estilo (mood):" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "No puedes programar shows traslapados" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "No puedes mover shows grabados menos de 1 hora antes de su retransmisión." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "Derechos de autor:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "El show se eliminó porque el show grabado no existe." +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "Número ISRC:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "Debes esperar 1 hora para retransmitir" +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "Sitio web:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "Preferencias" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "Idioma:" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Guardar" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "Administrar las Carpetas de Medios" - -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "Configuración del stream" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "Cancelar" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Configuración global" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Usuario:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "dB" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "Contraseña:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "Configuración de los streams de salida" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "Verificar contraseña:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Elige carpeta" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "Nombre:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "Crear" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "Apellido:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "Carpeta actual de importación:" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "Correo electrónico" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "Añadir:" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Celular:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "Re escanear el directorio monitoreado (esto es útil si está instalado en una red o si no está sincronizado con Airtime)" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "Remover el directorio monitoreado" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "No estás monitoreando ninguna carpeta de medios." +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "Tipo de usuario:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "Registra Airtime" +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "Invitado" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Ayuda a Airtime dándonos a conocer cómo lo estas usado. Esta información se recopila con regularidad para mejorar la experiencia de los usuarios.%s Da clic a 'Sí, ayudar a Airtime' y nos aseguraremos de que las funciones que más utilizas se mantengan bajo constante mejora." +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "DJ" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "Acepta la siguiente opción para anunciar tu estación en %sSourcefabric.org%s. A fin de promover tu estación debes activar la opción de 'Enviar retroalimentación de soporte'. Estos datos se recopilarán además de dichos comentarios." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "Administrador de programa" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(Requerido)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(únicamente para fines de verificación, no será publicado)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Nota: cualquier cosa mayor a 600x600 será redimensionada." - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Muéstrame lo que estoy enviando" +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "Admin" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "Términos y condiciones" +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "Tu usuario no es único." -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "Encontrar shows" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "Color de fondo:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "Filtrar ppor show:" +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "Color del texto:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "Restablecer contraseña" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "Fecha de Inicio:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Opciones del bloque inteligente" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "Fecha de Finalización:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Show:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "Todos mis shows:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr "para" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "días" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "los archivos si cumplen con los criterios" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "Se debe especificar un día" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "los archivos si cumplen con los criterios" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "Se debe especificar una hora" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "URL de conexión:" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "Debes esperar al menos 1 hora para reprogramar" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Ayuda a mejorar Airtime informando a Sourcefabric sobre cómo lo estás usando. Esta información se recolectará regularmente para mejorar tu experiencia como usuario. %sHaz clic en la casilla 'Send support feedback' (Enviar retroalimentación de soporte) y procuraremos que las funciones que usas mejoren constantemente." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "Carpeta de importación:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "Haz clic en la casilla de abajo para promocionar tu estación en %sSourcefabric.org%s." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "Carpetas monitoreadas:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(Para poder promocionar tu estación, 'Send support feedback' (Enviar retroalimentación de soporte) debe estar activado)." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "No es un directorio válido" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Política de privacidad de Sourcefabric" +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "Búsqueda de usuarios:" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "Configuración del stream de entrada" +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "DJs:" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "URL de la conexión de la fuente maestra:" +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "Ingreso" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "Anular" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "Digita los caracteres que ves en la gráfica que aparece a continuación." -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Nombre de la estación" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "RESTABLECER" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "URL de la conexión de la fuente del show" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "ingresa el tiempo en segundos 0{.0}" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Elige los días:" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "Elimina" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Días en que se repite:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "Permitir a sitios web remotos acceder a \"Schedule\" Info?%s (Activa esto para que los widgets públicos funcionen.)" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "Correo electrónico / Configuración del servidor de correo" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "Desactivado" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "Configuración de SoundCloud" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "Activado" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "Configuraciones de %s's" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "Idioma de la interfaz por defecto" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "La semana empieza el" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "domingo" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "Stream" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "lunes" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "Optiones adicionales" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "martes" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "La siguiente información se desplegará a los oyentes en sus reproductores:" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "miércoles" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(El sitio web de tu estación)" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "jueves" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "URL del stream:" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "Viernes" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "Filtrar historial" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Sábado" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "¡Bienvenido a Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Aprende aquí como usar Airtime para automatizar tus transmisiones:" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "Repetir tipo:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "Comienza agregando tus archivos a la biblioteca usando el botón 'Add Media' (Agregar Pistas). También puedes arrastrar y soltar tus archivos a esta ventana." +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "semanal" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "Crea un show ubicándote en 'Calendar' (Calendario) en la barra de menú, y luego haciendo clic en el ícono '+ Show' (agregar show). Este puede ser un show único o periódico. Solo los administradores y los administradores de programa pueden agregar shows." +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "Agrega pistas al show ubicándote en tu show en el calendario de programación. Presiona clic izquierdo sobre él y selecciona 'Add / Remove Content' (Agregar / Quitar Contenido)" +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Selecciona tus pistas del panel izquierdo y arrástralas a tu programa en el panel derecho." +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "¡Estas listo para comenzar!" +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "mensual" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "Para una ayuda más detallada, lee el manual%s del %susuario." +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Seleccione días:" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "Sobre nosotros" +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "Dom" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sAirtime%s %s, el software de código abierto para programar y administrar estaciones de radio de forma remota. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "Lun" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%sSourcefabric%s o.p.s. Airtime se distribuye bajo la %sGNE GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "Mar" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "Compartir" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "Miér" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Seleccionar stream:" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "Jue" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "silenciar" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "Vier" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "desactivar silencio" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "Sab" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "Ingreso" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "¡Bienvenido al demo de Airtime en línea! Puedes ingresar usando el nombre de usuario 'admin' y la contraseña 'admin'." +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "Por favor ingresa el correo electrónico con el que te suscribiste. Recibirás por ese medio un enlace para crear una nueva contraseña." +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "Correo enviado" +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "¿Sin fin?" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "Se envió un correo electrónico" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "La fecha de finalización debe ser posterior a la inicio" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "De vuelta a la pantalla ingreso" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "Nueva contraseña" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "Confirma nueva contraseña" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "Por favor ingrese y confirme una nueva cotnraseña en los campos que aparecen a continuación." +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "La confirmación de la contraseña no concuerda con tu contraseña." -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "Tu prueba expira el" +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Obtener nueva contraseña" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "días" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "Seleccionar criterio" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Adquiere tu copia de Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Ãlbum" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "Mi cuenta" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Tasa de bits (Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "Previamente:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "Próximamente:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "Compositor" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "Streams fuente" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "Conductor" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "Fuente maestra " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "Derechos de autor" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "Fuente del show" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "Creador" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "Contenido programado" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Codificado por" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "AL AIRE" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "Escuchar" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "Nombre de la estación" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Cerrar" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "Añadir este show" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "Actualizar show" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "Que" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "Cuando" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "Entrada de stream en vivo" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "Grabar y retransmitir" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Quien" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Estilo" - -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "Inicio" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "Servicio" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "Estatus" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "Tiempo de actividad (uptime)" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "CPU" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "Memoria" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Versión de Airtime" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "Espacio en disco" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "Importación del archivo en progreso..." - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "Opciones de búsqueda avanzada" - -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "Conteo de oyentes a lo largo del tiempo" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "Nuevo" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "Nueva lista de reproducción" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "Nuevo bloque inteligente" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "Nuevo webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "Ver / editar descripción" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "Sello" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "Descripción" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "Idioma" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "URL del stream:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "Último modificado" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "Duración por defecto:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "Último reproducido" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "No existe un webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "Duración:" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Mime" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "Estado de ánimo/estilo (mood)" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Lista de reproducción aleatoria" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "Propietario" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 -msgid "Shuffle" -msgstr "Reproducción aleatoria" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "Ganancia en la repetición" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Almacenar lista de reproducción" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "Tasa de muestreo (kHz)" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "Transición (crossfade) de la lista de reproducción" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "Título" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "Fade in:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "Número de registro" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Fade out:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "Cargado" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "No hay listas de reproducción abiertas" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "Sitio web" -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Año" -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "Elige un modificador" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "contiene" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "No hay bloques inteligentes abiertos" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "no contiene" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "Cue in:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "es" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(hh:mm:ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "no es" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Cue out:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "empieza con" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "Duración original:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "termina con" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "Expandir bloque estático" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "es mayor que" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "Expandir bloque dinámico" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "es menor que" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "Vaciar bloque inteligente" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "está en el rango de" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "Lista de reproducción vacía" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "horas" -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Aplicación de Zend Framework por defecto" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "minutos" -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "¡Página no encontrada!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "items" -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "¡Parece que la página que buscas no existe!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "Configura un tipo de bloque inteligente:" -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "Ayuda" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "Estático" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "previo" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "Dinámico" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "reproducir" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "Permitir repetición de pistas:" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "pausa" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "Limitar a" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "próximo" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "Generar contenido para la lista de reproducción y guardar criterios" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "parar" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "Generar" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "volumen máximo" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "Reproducir de forma aleatoria los contenidos de la lista de reproducción" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "Se requiere actualizar" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle" +msgstr "Reproducción aleatoria" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "Para reproducir estas pistas necesitarás actualizar tu navegador a una versión más reciente o atualizar tus plugin%s de %sFlash" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "El límite no puede estar vacío o ser menor que 0" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "El límite no puede ser mayor a 24 horas" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "El valor debe ser un número entero" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "Nombre" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "500 es el valor máximo de ítems que se pueden configurar" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "Debes elegir Criterios y Modificador" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "'Length' (la duración) debe establecerse e un formato de '00:00:00' " -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "El valor debe estar en un formato de tiempo (e.g. 0000-00-00 or 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "El valor debe ser numérico" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "El valor debe ser menor a 2147483648" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "El valor debe ser menor que los caracteres %s" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "El valor no se puede vaciar" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "Apagado automático" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "Encendido automático" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "Cambiar el Fade (s) de Transición" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "Administrar usuarios" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "ingresa un tiempo en segundos 00{.000000}" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "Nuevo usuario" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "Usuario master" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "id" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "Contraseña master" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Usuario" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "URL de la conexión de la fuente maestra" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "Nombre" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "URL de la conexión de la fuente del show" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "Apellido" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "Puerto de la fuente maestra" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "Tipo de usuario" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "Punto maestro de instalación de la fuente" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "Título:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Mostrar puerto de la fuente" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "Creador:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "Mostrar punto de instalación de la fuente" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Ãlbum:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "No puedes usar el mismo puerto que el del DJ maestro" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Pista:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "El puerto %s no está disponible" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "Duración:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Teléfono:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "Tasa de muestreo:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "Sitio web de la estación:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Tasa de bits:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "País:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "Estilo (mood):" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "Ciudad:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Género:" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "Descripción de la estación:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Año:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Logo de la estación:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "Sello:" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "Enviar retroalimentación respecto al soporte técnico" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "Promover mi estación en Sourcefabric.org" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "Compositor:" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "Al seleccionar esta opción, acepto las %spolíticas de privacidad%s de Sourcefabric." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "Conductor:" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "Debes aceptar las políticas de privacidad." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "Derechos de autor:" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "El valor es necesario y no puede estar vacío" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "Número ISRC" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "Sitio web:" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "Idioma:" +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "Ruta del archivo:" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "¿Grabar desde la entrada (line in)?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "Nombre:" +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "¿Reprogramar?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "Descripción:" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Use la autenticación de Airtime:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Stream web" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "Use la autenticación personalizada:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "Bloque inteligente dinámico" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "Usuario personalizado" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "Bloque inteligente estático" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "Contraseña personalizada" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Pista de audio" +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "El campo de usuario no puede estar vacío." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "Contenido de la lista de reproducción:" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "El campo de contraseña no puede estar vacío." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "Contenido del bloque inteligente estático:" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "Correo electrónico" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "Criterios del bloque inteligente dinámico:" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "Restablecer contraseña" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "Límite hasta" +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "Salida del equipo de audio" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "URL:" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "Tipo de salida" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "" +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Metadata Icecast Vorbis" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "" +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "Sello del stream:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "Artísta - Título" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "Los shows pueden tener una duración máxima de 24 horas." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Show - Artista - Título" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "La fecha/hora de finalización no puede estar en el pasado." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Nombre de la estación - nombre del show" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "No se pueden programar shows traslapados.\nNota: Cambiar el tamaño de un show periódico afecta todas sus repeticiones." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "Metadata fuera del aire" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "No puedes cambiar la duración de un show pasado" +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "Activar ajuste del volumen" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "No debes traslapar shows" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "Modificar ajuste de volumen" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Seleccionar país" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%value%' no es una dirección de correo electrónico válida en el formato básico local-part@hostname" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s ya está siendo monitoreado." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%' no se ajusta al formato de fecha '%format%'" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s contiene un directorio anidado monitoreado: %s" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%' tiene menos de %min% caracteres" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s está anidado dentro de un directorio monitoreado existente: %s" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%value%' tiene más de %max% caracteres" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s no es un directorio válido." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%' no está entre '%min%' y '%max%', inclusive" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s ya está asignado como el directorio actual de almacenamiento o en la lista de carpetas monitoreadas." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "Las contraseñas no coinciden" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s ya está asignado como el directorio actual de almacenamiento o en la lista de carpetas monitoreadas." +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%value%' no concuerda con el formato de tiempo 'HH:mm'" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s no existe en la lista de monitoreo." +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "Fecha/hora de inicio:" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "items" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "Fecha/hora de finalización:" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "Cue in y cue out son nulos." +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "Duración:" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "No se puede asignar un cue out mayor que la duración del archivo." +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "Huso horario:" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "No se puede asignar un cue in mayor al cue out." +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "¿Se repite?" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "No se puede asignar un cue out menor que el cue in." +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "No puedes crear un show en el pasado" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "Seleccionar criterio" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "No puedes modificar la hora/fecha de inicio de un show que ya empezó" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Tasa de bits (Kbps)" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "La fecha/hora de finalización no puede estar en el pasado." -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "No puede tener una duración < 0m" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Codificado por" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "No puede tener una duración 00h 00m" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "Último modificado" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "No puede tener una duración mayor a 24 horas" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "Último reproducido" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "No puedes programar shows traslapados" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Mime" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "Nombre:" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "Propietario" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "Show sin nombre" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "Ganancia en la repetición" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "URL:" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "Tasa de muestreo (kHz)" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "Descripción:" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "Número de registro" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "Subir automáticamente los shows grabados" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "Cargado" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "Activar la carga a SoundCloud" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "Sitio web" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "Marcar automáticamente los archivos \"Downloadable\" en SoundCloud" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "Elige un modificador" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "Correo electrónico SoundCloud" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "contiene" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "Contraseña SoundCloud" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "no contiene" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "Etiquetas SoundCloud: (separadas con espacios)" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "es" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "Género por defecto:" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "no es" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "Tipo de pista por defecto:" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "empieza con" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "Original" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "termina con" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "Mezcla" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "es mayor que" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "En vivo" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "es menor que" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "Grabando" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "está en el rango de" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "Hablado" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "La duración debe ser mayor de 0 minutos" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "Podcast" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "La duración debe estar en el formato \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Demo" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "El URL debe estar en el formato \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "Trabajo en progreso" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "El URL debe ser de 512 caracteres o menos" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "Stem" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "No se encontró ningún tipo MIME para el webstream." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "Loop" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "El nombre del webstream no puede estar vacío" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Efecto de sonido" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "No se pudo procesar el XSPF de la lista de reproducción" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "Muestreo de una toma " -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "No se pudo procesar el XSPF de la lista de reproducción" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Otro" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "No se pudo procesar el M3U de la lista de reproducción" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "Licencia por defecto:" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "Webstream inválido - Esto parece ser una descarga de archivo." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "El trabajo es de dominio público" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "Tipo de stream no reconocido: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "Todos los derechos reservados" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Hola %s, \n\nHaz clic en este enlace para restablecer tu contraseña: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "Atribución Creative Commons" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Restablecer contraseña de Airtime" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "Atribución-NoComercial Creative Commons" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "Retransmisión de %s desde %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "Atribución-sinDerivadas Creative Commons" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "Atribución-CompartirIgual Creative Commons" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "¡El calendario que tienes a la vista no está actualizado! (sched mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "Atribución-NoComercial-SinDerivadas Creative Commons" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "¡La programación que estás viendo está desactualizada! (desfase de instancia)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "Atribución-NoComercial-CompartirIgual Creative Commons" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "¡La programación que estás viendo está desactualizada!" +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "No tienes permiso para programar el show %s." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "Activar Correos elctrónicos del Sistema (Restablecer Contraseña)" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "No puedes agregar pistas a shows en grabación." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "Restablecer la contraseña del correo electrónico del 'Emisor' ('From')" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "El show %s terminó y no puede ser programado." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "Configurar el servidor de correo" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "¡El show %s ha sido actualizado previamente!" +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "Requiere autenticación" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "" +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "Servidor de correo" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "¡Un Archivo seleccionado no existe!" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "Correo electrónico" + +#: airtime_mvc/application/controllers/ListenerstatController.php:56 +msgid "Please make sure admin user/password is correct on System->Streams page." +msgstr "Verifica que la contraseña del usuario admin. esté correcta en Sistema->página de streams." -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "Falló la creación del directorio 'organize' (organizar)" +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Webstream si nombre" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "El archivo no se cargó, solo queda %s MB de espacio en disco y el archivo que intentas cargar mide %s MB." +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Se almacenó el webstream" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "Este archivo parece estar corrupto y no se agregará a la biblioteca de pistas." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "Los valores en el formulario son inválidos." -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "El archivo no se cargó. Este error puede ocurrir si el disco duro de la computadora no tiene suficiente espacio o el directorio stor no tiene los permisos correctos para escritura." +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "Por favor ingresa tu usuario y contraseña" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "No tienes permiso para desconectar la fuente." +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "El usuario o la contraseña son incorrectos. Por favor intenta de nuevo." -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "No hay fuente conectada a esta entrada." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "No fue posible enviar el correo electrónico. Revisa tu configuración de correo y asegúrate de que sea correcta." -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "No tienes permiso para prender/apagar la fuente." +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "No se encontró ese correo electrónico." #: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format @@ -1710,95 +1496,25 @@ msgstr "Retransmitir el show %s de %s a %s " msgid "Download" msgstr "Descargar" -#: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." -msgstr "Verifica que la contraseña del usuario admin. esté correcta en Sistema->página de streams." - -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "No tienes permiso para acceder a esta fuente." - -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "No tienes permiso para acceder a esta fuente." - -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "El archivo no existe en Airtime." - -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "El archivo no existe en Airtime" - -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "El archivo no existe en Airtime." - -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "Solicitud errónea. Ningún parámetro 'mode' pasó." - -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "Solicitud errónea. El parámetro 'mode' es inválido" - -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 -#, php-format -msgid "%s not found" -msgstr "No se encontró %s" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "Algo falló." - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "Previsualizar" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "Agregar a lista de reproducción." - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "Agregar un bloque inteligente" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "Editar metadata" - -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "Lista de reproducción duplicada" - -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "SoundCloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "Se agregó exitosamente el usuario." -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "No una acción disponible" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "Se actualizó exitosamente el usuario." -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "No tienes permiso para eliminar los ítems seleccionados." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "¡Configuraciones actualizadas con éxito!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "No se pudo eliminar algunos de los archivos programados." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "No se encontró esa página" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "Copia de %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Error de la aplicación" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1874,6 +1590,11 @@ msgstr "solo puedes añadir pistas, bloques inteligentes y webstreams a listas d msgid "Please select a cursor position on timeline." msgstr "Indica tu selección en la lista de reproducción actual." +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "Editar metadata" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "Añadir al show seleccionado" @@ -1920,6 +1641,7 @@ msgstr "Cargando..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "Todo" @@ -1990,9 +1712,7 @@ msgstr "La entrada debe estar en el siguiente formato: hh:mm:ss.t" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "Actualmente estas subiendo archivos. %sSi cambias de pantalla el proceso de carga se cancelará. %s¿De verdad quieres dejar esta página e ir a otra?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2028,10 +1748,7 @@ msgid "Playlist shuffled" msgstr "Se mezclaron las listas de reproducción." #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "Airtime no está seguro del estatus de este archivo. Esto puede ocurrir cuando el archivo está en un disco remoto que no está accesible o el archivo está en un directorio que ya no está 'monitoreado'." #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2057,24 +1774,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "La imagen debe ser jpg, jpeg, png, o gif" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "Un bloque inteligente estático almacenará los criterios y generará el contenido del bloque inmediatamente. Esto te permite editarlo y verlo en la biblioteca antes de agregarlo a un show." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "Un bloque inteligente dinámico sólo guardará los criterios. El contenido del bloque será generado al agregarlo a un show. No podrás ver ni editar el contenido en la Biblioteca." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "La duración deseada para el bloque no se alcanzará si Airtime no puede encontrar suficientes pistas únicas que se ajusten a tus criterios. Activa esta opción si deseas que se agreguen pistas varias veces al bloque inteligente." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2105,7 +1813,14 @@ msgstr "Elegir carpeta para monitorear" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "¿Estás seguro de querer cambiar la carpeta de almacenamiento?\n ¡Esto eliminará los archivos de tu biblioteca de Airtime!" +msgstr "" +"¿Estás seguro de querer cambiar la carpeta de almacenamiento?\n" +" ¡Esto eliminará los archivos de tu biblioteca de Airtime!" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "Administrar las Carpetas de Medios" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2117,9 +1832,7 @@ msgstr "Esta ruta actualmente está inaccesible." #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2130,22 +1843,12 @@ msgstr "Conectado al servidor de streaming" msgid "The stream is disabled" msgstr "Se desactivó el stream" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Obteniendo información desde el servidor..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "No es posible conectar el servidor de streaming" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "Si Airtime está detrás de un router o firewall, posiblemente tengas que configurar una redirección en el puerto (port forwarding) y esta información de campo será incorrecta. En este caso necesitarás actualizar manualmente el campo pra que muestre el host/port/mount correcto al que tus DJs necesitan conectarse. El rango permitido es entre 1024 y 49151. " #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2154,61 +1857,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "Para más detalles, por favor lee el Manual%s de %sAirtime" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "Elige esta opción para activar los metadatos de los streams OGG (los metadatos del stream incluyen información de la pista como título, artista y nombre del show, los cuales se desplegarán en el reproductor de audio). VLC y mplayer muestran un bug serio cuando reproducen streams OGG/VORBIS que tienen los metadatos activados: se desconectarán del stream después de cada pista. Si eestas usando un stream OGG y tus oyentes no requieren soporte para estos reproductores de audio, entonces activa esta opción." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "Elige esta opción para desactivar automáticamente la fuente maestra/del show cuando ocurra una desconexión de la fuente." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "Elige esta opción para activar automáticamente la fuente maestra/del show cuando ocurra una desconexión de la fuente." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "Si tu servidor de Icecast te pide un usuario para la 'source' (fuente), puedes dejar este campo en blanco." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "Si tu cliente de streaming en vivo no te pide un usuario, este campo debe ser la 'source' (fuente)." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "Si cambias los valores del usuario o contraseña para un stream activado el motor de reproducción se reiniciará y tus oyentes escucharán silencio por 5-10 segundos. Cambiar los siguientes campos NO provocará un reinicio del sistema: sello del stream (configuración global), Switch en el fade (s) de transición, usuario maestro y contraseña maestra (configuración del stream de entrada). Si Airtime está grabando y si el cambio provoca el reinicio del motor de reproducció, la grabación se interrumpirá." #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "Este es el usuario y contraseña administrativa de Icecast/SHOUTcast para obtener las estadísticas de oyentes." #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2216,9 +1894,7 @@ msgid "No result found" msgstr "Sin resultados" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "Esto sigue el mismo patrón de seguridad de los shows: solo los usuarios asignados al show se pueden conectar." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2234,16 +1910,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2399,79 +2070,8 @@ msgstr "semana" msgid "month" msgstr "mes" -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "domingo" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "lunes" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "martes" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "miércoles" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "jueves" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "Viernes" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Sábado" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "Dom" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "Lun" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "Mar" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "Miér" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "Jue" - -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "Vier" - -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "Sab" - #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Los shows que sean más largos que su segmento programado serán cortados por el show que continúe." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2499,6 +2099,11 @@ msgstr "¿Eliminar todo el contenido?" msgid "Delete selected item(s)?" msgstr "¿Eliminar los ítems seleccionados?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "Inicio" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "Final" @@ -2532,14 +2137,6 @@ msgstr "Moviendo 1 ítem" msgid "Moving %s Items" msgstr "Moviendo %s ítems." -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "Cancelar" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "" @@ -2549,8 +2146,7 @@ msgid "Cue Editor" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2581,6 +2177,13 @@ msgstr "Cancelar el show actual" msgid "Open library to add or remove content" msgstr "Abrir biblioteca para agregar o eliminar contenido" +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "Agregar / eliminar contenido" + #: airtime_mvc/application/controllers/LocaleController.php:305 msgid "in use" msgstr "en uso" @@ -2597,26 +2200,6 @@ msgstr "Buscar en" msgid "Open" msgstr "Abrir" -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "Admin" - -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "DJ" - -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "Administrador de programa" - -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "Invitado" - #: airtime_mvc/application/controllers/LocaleController.php:316 msgid "Guests can do the following:" msgstr "Los invitados pueden hacer lo siguiente:" @@ -2675,17 +2258,11 @@ msgstr "Administrar preferencias" #: airtime_mvc/application/controllers/LocaleController.php:330 msgid "Manage users" -msgstr "Administrar usuarios" - -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "Administrar folders monitoreados" - -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "Enviar retroalimentación respecto al soporte técnico" +msgstr "Administrar usuarios" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "Administrar folders monitoreados" #: airtime_mvc/application/controllers/LocaleController.php:333 msgid "View system status" @@ -2751,6 +2328,12 @@ msgstr "Vier" msgid "Sa" msgstr "Sáb" +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Cerrar" + #: airtime_mvc/application/controllers/LocaleController.php:355 msgid "Hour" msgstr "Hora" @@ -2772,6 +2355,14 @@ msgstr "Seleccione los archivos" msgid "Add files to the upload queue and click the start button." msgstr "Añade los archivos a la cola de carga y haz clic en el botón de iniciar." +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "Estatus" + #: airtime_mvc/application/controllers/LocaleController.php:365 msgid "Add Files" msgstr "Añadir archivos" @@ -2859,6 +2450,12 @@ msgstr "Error: el archivo es demasiado grande:" msgid "Error: Invalid file extension: " msgstr "Error: extensión de archivo inválida:" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:389 msgid "Create Entry" msgstr "" @@ -2874,28 +2471,179 @@ msgstr "Se copiaron %s celda%s al portapapeles" #: airtime_mvc/application/controllers/LocaleController.php:394 #, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." msgstr "Vista%s de %simpresión Por favor usa tu navegador para imprimir esta tabla. Presiona escape cuando termines." -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "Por favor ingresa tu usuario y contraseña" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "No tienes permiso para desconectar la fuente." -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "El usuario o la contraseña son incorrectos. Por favor intenta de nuevo." +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "No hay fuente conectada a esta entrada." -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "No fue posible enviar el correo electrónico. Revisa tu configuración de correo y asegúrate de que sea correcta." +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "No tienes permiso para prender/apagar la fuente." -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "No se encontró ese correo electrónico." +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "Estas viendo una versión antigua de %s" + +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "No puedes añadir pistas a los bloques dinámicos." + +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "No se encontró %s" + +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "No tienes permiso para eliminar los %s(s) seleccionados." + +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "Algo falló." + +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "Solo puedes añadir pistas a los bloques inteligentes." + +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "Lista de reproducción sin nombre" + +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Bloque inteligente sin nombre" + +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "Lista de reproducción desconocida" + +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "No tienes permiso para acceder a esta fuente." + +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "No tienes permiso para acceder a esta fuente." + +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "El archivo no existe en Airtime." + +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "El archivo no existe en Airtime" + +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "El archivo no existe en Airtime." + +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "Solicitud errónea. Ningún parámetro 'mode' pasó." + +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "Solicitud errónea. El parámetro 'mode' es inválido" + +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "Previsualizar" + +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "Agregar a lista de reproducción." + +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "Agregar un bloque inteligente" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "Eliminar" + +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "Lista de reproducción duplicada" + +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "Editar" + +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "Ver en SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "Recargar a SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Cargar a SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "No una acción disponible" + +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "No tienes permiso para eliminar los ítems seleccionados." + +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "No se pudo eliminar algunos de los archivos programados." + +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "Copia de %s" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Elegir cursor" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "Eliminar cursor" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "El show no existe" #: airtime_mvc/application/controllers/PreferenceController.php:74 msgid "Preferences updated." @@ -2922,988 +2670,1130 @@ msgstr "se debe especificar la ruta" msgid "Problem with Liquidsoap..." msgstr "Hay un problema con Liquidsoap..." -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Elegir cursor" +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "Reproduciéndose ahora" + +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "Añadir pistas" + +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Biblioteca" + +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "Calendario" + +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "Sistema" + +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "Preferencias" + +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "Usuarios" + +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Carpetas de medios" + +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Streams" + +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "Estadísticas de oyentes" + +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "" + +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "Historial de reproducción" + +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "" + +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "Ayuda" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "Eliminar cursor" +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "Cómo iniciar" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "El show no existe" +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "Manual para el usuario" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Webstream si nombre" +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "Sobre nosotros" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Se almacenó el webstream" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "Servicio" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "Los valores en el formulario son inválidos." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "Tiempo de actividad (uptime)" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "Estas viendo una versión antigua de %s" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "CPU" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "No puedes añadir pistas a los bloques dinámicos." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "Memoria" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "No tienes permiso para eliminar los %s(s) seleccionados." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Versión de Airtime" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "Solo puedes añadir pistas a los bloques inteligentes." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "Espacio en disco" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "Lista de reproducción sin nombre" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "Correo electrónico / Configuración del servidor de correo" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Bloque inteligente sin nombre" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "Configuración de SoundCloud" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "Lista de reproducción desconocida" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Días en que se repite:" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "No se encontró esa página" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "Elimina" -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Error de la aplicación" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "Añadir:" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "Se agregó exitosamente el usuario." +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "URL de conexión:" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "Se actualizó exitosamente el usuario." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "Configuración del stream de entrada" -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "¡Configuraciones actualizadas con éxito!" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "URL de la conexión de la fuente maestra:" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "El año %s debe estar dentro del rango de 1753-9999" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "Anular" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s no es una fecha válida" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "OK" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s:%s:%s no es una hora válida" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "RESTABLECER" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "Show sin nombre" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "URL de la conexión de la fuente del show" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "Carpeta de importación:" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(Requerido)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "Carpetas monitoreadas:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "Registra Airtime" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "No es un directorio válido" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Ayuda a Airtime dándonos a conocer cómo lo estas usado. Esta información se recopila con regularidad para mejorar la experiencia de los usuarios.%s Da clic a 'Sí, ayudar a Airtime' y nos aseguraremos de que las funciones que más utilizas se mantengan bajo constante mejora." -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Usuario:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "Acepta la siguiente opción para anunciar tu estación en %sSourcefabric.org%s. A fin de promover tu estación debes activar la opción de 'Enviar retroalimentación de soporte'. Estos datos se recopilarán además de dichos comentarios." -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "Contraseña:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(únicamente para fines de verificación, no será publicado)" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "Verificar contraseña:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Nota: cualquier cosa mayor a 600x600 será redimensionada." -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "Nombre:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Muéstrame lo que estoy enviando" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "Apellido:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "Términos y condiciones" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "Correo electrónico" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "Restablecer contraseña" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Celular:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Elige carpeta" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "Crear" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "Carpeta actual de importación:" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "Tipo de usuario:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "Re escanear el directorio monitoreado (esto es útil si está instalado en una red o si no está sincronizado con Airtime)" -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "Tu usuario no es único." +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "Remover el directorio monitoreado" + +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "No estás monitoreando ninguna carpeta de medios." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "Apagado automático" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "Stream" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "Encendido automático" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "Optiones adicionales" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "Cambiar el Fade (s) de Transición" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "La siguiente información se desplegará a los oyentes en sus reproductores:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "ingresa un tiempo en segundos 00{.000000}" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(El sitio web de tu estación)" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "Usuario master" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "URL del stream:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "Contraseña master" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "Filtrar historial" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "URL de la conexión de la fuente maestra" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "Encontrar shows" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "URL de la conexión de la fuente del show" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "Filtrar ppor show:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "Puerto de la fuente maestra" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "Configuraciones de %s's" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "Solo se permiten números." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Ayuda a mejorar Airtime informando a Sourcefabric sobre cómo lo estás usando. Esta información se recolectará regularmente para mejorar tu experiencia como usuario. %sHaz clic en la casilla 'Send support feedback' (Enviar retroalimentación de soporte) y procuraremos que las funciones que usas mejoren constantemente." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "Punto maestro de instalación de la fuente" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "Haz clic en la casilla de abajo para promocionar tu estación en %sSourcefabric.org%s." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Se introdujo un caracter inválido" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(Para poder promocionar tu estación, 'Send support feedback' (Enviar retroalimentación de soporte) debe estar activado)." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Mostrar puerto de la fuente" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Política de privacidad de Sourcefabric" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "Mostrar punto de instalación de la fuente" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "No puedes usar el mismo puerto que el del DJ maestro" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "El puerto %s no está disponible" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Elige los días:" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%value%' no concuerda con el formato de tiempo 'HH:mm'" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Opciones del bloque inteligente" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "Fecha/hora de inicio:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "Fecha/hora de finalización:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "Duración:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr "para" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "Huso horario:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "los archivos si cumplen con los criterios" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "¿Se repite?" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "los archivos si cumplen con los criterios" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "No puedes crear un show en el pasado" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "No puedes modificar la hora/fecha de inicio de un show que ya empezó" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "No puede tener una duración < 0m" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "No puede tener una duración 00h 00m" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "No puede tener una duración mayor a 24 horas" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "Repetir tipo:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "semanal" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "mensual" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "Nuevo" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "Nueva lista de reproducción" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "Nuevo bloque inteligente" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "Nuevo webstream" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "Ver / editar descripción" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "URL del stream:" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "Duración por defecto:" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "No existe un webstream" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "Configuración del stream" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Configuración global" -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Seleccione días:" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "dB" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "Configuración de los streams de salida" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "Importación del archivo en progreso..." -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "Opciones de búsqueda avanzada" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "Fecha de Finalización:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "previo" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "¿Sin fin?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "reproducir" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "La fecha de finalización debe ser posterior a la inicio" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "pausa" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "próximo" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "El valor es necesario y no puede estar vacío" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "parar" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "Contraseña" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "silenciar" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "Confirma nueva contraseña" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "desactivar silencio" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "La confirmación de la contraseña no concuerda con tu contraseña." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "volumen máximo" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Obtener nueva contraseña" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "Se requiere actualizar" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Nombre de la estación" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "Para reproducir estas pistas necesitarás actualizar tu navegador a una versión más reciente o atualizar tus plugin%s de %sFlash" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Teléfono:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "Duración:" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "Sitio web de la estación:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "Tasa de muestreo:" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "País:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "Número ISRC" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "Ciudad:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "Ruta del archivo:" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "Descripción de la estación:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Stream web" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Logo de la estación:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "Bloque inteligente dinámico" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "Promover mi estación en Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "Bloque inteligente estático" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "Al seleccionar esta opción, acepto las %spolíticas de privacidad%s de Sourcefabric." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Pista de audio" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "Debes aceptar las políticas de privacidad." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "Contenido de la lista de reproducción:" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%value%' no es una dirección de correo electrónico válida en el formato básico local-part@hostname" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "Contenido del bloque inteligente estático:" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%' no se ajusta al formato de fecha '%format%'" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "Criterios del bloque inteligente dinámico:" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%' tiene menos de %min% caracteres" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "Límite hasta" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%value%' tiene más de %max% caracteres" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%' no está entre '%min%' y '%max%', inclusive" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "Las contraseñas no coinciden" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "Activado:" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "Conteo de oyentes a lo largo del tiempo" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "Tipo de stream:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "¡Bienvenido a Airtime!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "Tipo de servicio:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Aprende aquí como usar Airtime para automatizar tus transmisiones:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "Canales:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "Comienza agregando tus archivos a la biblioteca usando el botón 'Add Media' (Agregar Pistas). También puedes arrastrar y soltar tus archivos a esta ventana." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "Crea un show ubicándote en 'Calendar' (Calendario) en la barra de menú, y luego haciendo clic en el ícono '+ Show' (agregar show). Este puede ser un show único o periódico. Solo los administradores y los administradores de programa pueden agregar shows." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Estéreo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "Agrega pistas al show ubicándote en tu show en el calendario de programación. Presiona clic izquierdo sobre él y selecciona 'Add / Remove Content' (Agregar / Quitar Contenido)" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Servidor" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Selecciona tus pistas del panel izquierdo y arrástralas a tu programa en el panel derecho." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "Puerto" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "¡Estas listo para comenzar!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "URL" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "Para una ayuda más detallada, lee el manual%s del %susuario." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Punto de instalación" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "Compartir" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "Usuario administrativo" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Seleccionar stream:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "Contraseña administrativa" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sAirtime%s %s, el software de código abierto para programar y administrar estaciones de radio de forma remota. %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "El servidor no puede estar vacío." +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%sSourcefabric%s o.p.s. Airtime se distribuye bajo la %sGNE GPL v.3%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "El puerto no puede estar vacío." +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "Nueva contraseña" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "La instalación no puede estar vacía con el servidor Icecast." +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "Por favor ingrese y confirme una nueva cotnraseña en los campos que aparecen a continuación." -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "Salida del equipo de audio" +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "Por favor ingresa el correo electrónico con el que te suscribiste. Recibirás por ese medio un enlace para crear una nueva contraseña." -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "Tipo de salida" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "Correo enviado" -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Metadata Icecast Vorbis" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "Se envió un correo electrónico" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "Sello del stream:" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "De vuelta a la pantalla ingreso" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "Artísta - Título" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "¡Bienvenido al demo de Airtime en línea! Puedes ingresar usando el nombre de usuario 'admin' y la contraseña 'admin'." -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Show - Artista - Título" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "Previamente:" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Nombre de la estación - nombre del show" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "Próximamente:" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "Metadata fuera del aire" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "Streams fuente" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "Activar ajuste del volumen" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "Fuente maestra " -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "Modificar ajuste de volumen" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "Fuente del show" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "Búsqueda de usuarios:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "Contenido programado" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "AL AIRE" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "¿Grabar desde la entrada (line in)?" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "Escuchar" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "¿Reprogramar?" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "Nombre de la estación" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "Activar Correos elctrónicos del Sistema (Restablecer Contraseña)" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "Tu prueba expira el" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "Restablecer la contraseña del correo electrónico del 'Emisor' ('From')" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Adquiere tu copia de Airtime" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "Configurar el servidor de correo" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "Mi cuenta" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "Requiere autenticación" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "Administrar usuarios" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "Servidor de correo" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "Nuevo usuario" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "Correo electrónico" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "id" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "Digita los caracteres que ves en la gráfica que aparece a continuación." +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "Nombre" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "Se debe especificar un día" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "Apellido" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "Se debe especificar una hora" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "Tipo de usuario" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "Debes esperar al menos 1 hora para reprogramar" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Use la autenticación de Airtime:" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "Use la autenticación personalizada:" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "Usuario personalizado" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Aplicación de Zend Framework por defecto" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "Contraseña personalizada" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "¡Página no encontrada!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "El campo de usuario no puede estar vacío." +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "¡Parece que la página que buscas no existe!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "El campo de contraseña no puede estar vacío." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "Expandir bloque estático" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "Fecha de Inicio:" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "Expandir bloque dinámico" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "Vaciar bloque inteligente" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "ingresa el tiempo en segundos 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "Lista de reproducción vacía" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "Permitir a sitios web remotos acceder a \"Schedule\" Info?%s (Activa esto para que los widgets públicos funcionen.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Lista de reproducción aleatoria" + +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Almacenar lista de reproducción" + +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "Transición (crossfade) de la lista de reproducción" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "Desactivado" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "Fade in:" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "Activado" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Fade out:" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "Idioma de la interfaz por defecto" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "No hay listas de reproducción abiertas" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "La semana empieza el" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(ss.t)" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "No hay bloques inteligentes abiertos" + +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "Correo electrónico" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "Cue in:" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "Restablecer contraseña" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(hh:mm:ss.t)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "horas" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Cue out:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "minutos" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "Duración original:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "Configura un tipo de bloque inteligente:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "Añadir este show" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "Estático" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "Actualizar show" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "Dinámico" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "Que" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "Permitir repetición de pistas:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "Cuando" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "Limitar a" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "Entrada de stream en vivo" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "Generar contenido para la lista de reproducción y guardar criterios" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "Grabar y retransmitir" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "Generar" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Quien" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "Reproducir de forma aleatoria los contenidos de la lista de reproducción" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Estilo" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "El límite no puede estar vacío o ser menor que 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "Retransmisión de %s desde %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "El límite no puede ser mayor a 24 horas" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Seleccionar país" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "El valor debe ser un número entero" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "La duración debe ser mayor de 0 minutos" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "500 es el valor máximo de ítems que se pueden configurar" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "La duración debe estar en el formato \"00h 00m\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "Debes elegir Criterios y Modificador" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "El URL debe estar en el formato \"http://domain\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "'Length' (la duración) debe establecerse e un formato de '00:00:00' " +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "El URL debe ser de 512 caracteres o menos" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "El valor debe estar en un formato de tiempo (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "No se encontró ningún tipo MIME para el webstream." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "El valor debe ser numérico" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "El nombre del webstream no puede estar vacío" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "El valor debe ser menor a 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "No se pudo procesar el XSPF de la lista de reproducción" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "El valor debe ser menor que los caracteres %s" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "No se pudo procesar el XSPF de la lista de reproducción" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "El valor no se puede vaciar" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "No se pudo procesar el M3U de la lista de reproducción" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Show:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "Webstream inválido - Esto parece ser una descarga de archivo." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "Todos mis shows:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "Tipo de stream no reconocido: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "Número ISRC:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s ya está siendo monitoreado." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "Subir automáticamente los shows grabados" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s contiene un directorio anidado monitoreado: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "Activar la carga a SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s está anidado dentro de un directorio monitoreado existente: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "Marcar automáticamente los archivos \"Downloadable\" en SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s no es un directorio válido." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "Correo electrónico SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s ya está asignado como el directorio actual de almacenamiento o en la lista de carpetas monitoreadas." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "Contraseña SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s ya está asignado como el directorio actual de almacenamiento o en la lista de carpetas monitoreadas." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "Etiquetas SoundCloud: (separadas con espacios)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s no existe en la lista de monitoreo." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "Género por defecto:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "Tipo de pista por defecto:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "¡El calendario que tienes a la vista no está actualizado! (sched mismatch)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "Original" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "¡La programación que estás viendo está desactualizada! (desfase de instancia)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "Mezcla" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "¡La programación que estás viendo está desactualizada!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "En vivo" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "No tienes permiso para programar el show %s." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "Grabando" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "No puedes agregar pistas a shows en grabación." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "Hablado" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "El show %s terminó y no puede ser programado." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "¡El show %s ha sido actualizado previamente!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "Trabajo en progreso" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "¡Un Archivo seleccionado no existe!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "Stem" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "Cue in y cue out son nulos." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "Loop" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "No se puede asignar un cue in mayor al cue out." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Efecto de sonido" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "No se puede asignar un cue out mayor que la duración del archivo." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "Muestreo de una toma " +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "No se puede asignar un cue out menor que el cue in." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Otro" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "El archivo no se cargó, solo queda %s MB de espacio en disco y el archivo que intentas cargar mide %s MB." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "Licencia por defecto:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "Los shows pueden tener una duración máxima de 24 horas." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "El trabajo es de dominio público" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"No se pueden programar shows traslapados.\n" +"Nota: Cambiar el tamaño de un show periódico afecta todas sus repeticiones." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "Todos los derechos reservados" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Hola %s, \n" +"\n" +"Haz clic en este enlace para restablecer tu contraseña: " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "Atribución Creative Commons" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Restablecer contraseña de Airtime" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "Atribución-NoComercial Creative Commons" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "Atribución-sinDerivadas Creative Commons" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "Ver los metadatos del archivo grabado" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "Atribución-CompartirIgual Creative Commons" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Mostrar contenido" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "Atribución-NoComercial-SinDerivadas Creative Commons" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "Eliminar todo el contenido" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "Atribución-NoComercial-CompartirIgual Creative Commons" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "Cancelar el show actual" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "Color de fondo:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "Color del texto:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "Editar show" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "Reproduciéndose ahora" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "Eliminar esta instancia" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "Añadir pistas" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "Eliminar esta instancia y todas las que siguen" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Biblioteca" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "Calendario" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "No es posible arrastrar y soltar shows que se repiten" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "Sistema" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "No puedes mover un show pasado" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "Usuarios" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "No puedes mover un show al pasado" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Carpetas de medios" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "No puedes mover shows grabados menos de 1 hora antes de su retransmisión." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Streams" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "El show se eliminó porque el show grabado no existe." -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "Estadísticas de oyentes" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "Debes esperar 1 hora para retransmitir" -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" msgstr "" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "Historial de reproducción" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "Reproducido" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "El año %s debe estar dentro del rango de 1753-9999" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "Cómo iniciar" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s no es una fecha válida" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "Manual para el usuario" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s:%s:%s no es una hora válida" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3912,3 +3802,18 @@ msgstr "Por favor elige una opción" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "No hay registros" + +#~ msgid "can't resize a past show" +#~ msgstr "No puedes cambiar la duración de un show pasado" + +#~ msgid "Should not overlap shows" +#~ msgstr "No debes traslapar shows" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "Falló la creación del directorio 'organize' (organizar)" + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "Este archivo parece estar corrupto y no se agregará a la biblioteca de pistas." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "El archivo no se cargó. Este error puede ocurrir si el disco duro de la computadora no tiene suficiente espacio o el directorio stor no tiene los permisos correctos para escritura." diff --git a/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po index 366f22f5e5..08f3beac0b 100644 --- a/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po @@ -1,35 +1,23 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # Sourcefabric , 2012 msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-01-29 15:10+0000\n" "Last-Translator: andrey.podshivalov\n" "Language-Team: French (France) (http://www.transifex.com/projects/p/airtime/language/fr_FR/)\n" +"Language: fr_FR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: fr_FR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime Copyright ©Sourcefabric o.p.s. Tous droits réservés.%sMaintenu et distribué sous la GNU GPL v.3 par %sSourcefabric o.p.s%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "Flux Live" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -50,9 +38,9 @@ msgid "Stop" msgstr "Stop" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Point d'Entré" @@ -61,9 +49,9 @@ msgid "Set Cue In" msgstr "Placer le Point d'Entré" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Point de Sorti" @@ -85,1720 +73,1448 @@ msgstr "fondu en Entré" msgid "Fade Out" msgstr "Fondu en Sorti" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "Titre" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime Copyright ©Sourcefabric o.p.s. Tous droits réservés.%sMaintenu et distribué sous la GNU GPL v.3 par %sSourcefabric o.p.s%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "Créateur" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "Flux Live" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "Activé:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "Durée" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "Type de Flux:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Genre" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Débit:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "Mood" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "Type de service:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "Label" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "Cannaux:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "Compositeur" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Mono" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Stereo" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "Droit d'Auteur" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Serveur" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Année" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Caractère Invalide saisi" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "Morceau" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "Port" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "Conducteur" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "Seuls les chiffres sont autorisés." -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "Langue" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "Mot de Passe" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "Heure de Début" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Genre" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "Heure de Fin" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "URL" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "Joué" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "Nom" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "L'enregistrement du fichier n'existe pas" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "Description" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "Afficher les métadonnées du fichier enregistré" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Point de Montage" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "Voir sur SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Utilisateur" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Téléverser vers SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "Utilisateur Admin" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "Re-Téléverser vers SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "Mot de Passe Admin" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Contenu Emission" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Obtention des informations à partir du serveur ..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "Ajouter/Supprimer Contenu" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "Le Serveur ne peut être vide." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "Supprimer tous les contenus" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "Le Port ne peut être vide." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "Annuler l'émission en cours" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "Le Point de Montage ne peut être vide avec un serveur Icecast." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "Editer cette instance" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "Titre:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "Edition" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "Créateur:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "Edition de l'Emission" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Album:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "Effacer" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Piste:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "Suppression de l'instance" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Genre:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "Suppression de l'instance et des suivantes" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Année:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "Permission refusée" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "Label:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "Vous ne pouvez pas faire glisser et déposer des émissions en répétition" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "Compositeur:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "Ne peux pas déplacer une émission diffusée" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "Conducteur:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "Ne peux pas déplacer une émission dans le passé" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "Atmosphère:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "Ne peux pas programmer des émissions qui se chevauchent" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "Impossible de déplacer une émission enregistrée à moins d'1 heure avant ses rediffusions." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "Copyright:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "L'Emission a été éffacée parce que l'enregistrement de l'émission n'existe pas!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "Numéro ISRC:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "Doit attendre 1 heure pour retransmettre." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "Site Internet:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "Préférences" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "Langue" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Sauvegarder" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "Gérer les Répertoires des Médias" - -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "Réglages des Flux" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "Annuler" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Réglages Globaux" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Utilisateur:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "dB" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "Mot de Passe:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "Réglages flux de sortie" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "Vérification du Mot de Passe:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Choisir le répertoire" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "Prénom:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "Installer" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "Nom:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "Répertoire d'Import en Cours:" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "Courriel:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "Ajouter" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Numéro de Mobile:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "Rescanner le répertoire surveillé (Peut être utile si c'est un montage réseau et est peut être désynchronisé avec Airtime)" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "Supprimer le répertoire surveillé" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "Vous ne surveillez pas les dossiers médias." +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "Type d'Utilisateur:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "Enregistrez Airtime" +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "Invité" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Aidez Airtime à s' améliorer en nous faisant savoir comment vous l'utilisez. Cette information sera recueillie régulièrement afin d'améliorer votre expérience utilisateur.%sClickez «Oui, aidez Airtime» et nous nous assurerons que les fonctions que vous utilisez soient en constante amélioration." +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "DeaJee" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "Cliquez sur la case ci-dessous pour annoncer votre station sur %sSourcefabric.org%s. Afin de promouvoir votre station, 'Envoyez vos remarques au support \"doit être activé. Ces données seront recueillies en plus des retours d'informations." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "Programmateur" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(Requis)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(à des fins de vérification uniquement, ne sera pas publié)" +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "Administrateur" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Remarque: Tout ce qui est plus grand que 600x600 sera redimensionné." +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "Le Nom de connexion n'est pas unique." -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Montrez-moi ce que je vais envoyer" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "Couleur de Fond:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "Termes et Conditions." +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "Couleur du Texte:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "Trouver Emissions" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "Date de Début:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "Filtrer par émission" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "Date de Fin:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "Réinitialisation du Mot de Passe" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Emission:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Options de Bloc Intelligent" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "Toutes Mes Emissions:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "ou" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "jours" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "et" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "Le Jour doit être spécifié" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr "à" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "La durée doit être spécifiée" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "fichiers répondent aux critères" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "Vous devez attendre au moins 1 heure pour retransmettre" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "Le fichier doit correspondre aux crtères" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "répertoire d'Import:" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "URL de Connexion:" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "Répertoires Suveillés:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Aide Airtime à s'améliorer en laissant Sourcefabric savoir comment vous l'utilisez. Ces informations seront recueillies régulièrement afin d'améliorer votre expérience utilisateur.%sCochez la case 'Envoyer un retour d'information au support' et nous ferons en sorte que les fonctions que vous utilisez s'améliorent constamment." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "N'est pas un Répertoire valide" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "Cliquez sur la case ci-dessous pour la promotion de votre station sur %sSourcefabric.org%s." +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "Recherche d'Utilisateurs:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(Pour la promotion de votre station, 'Envoyez vos remarques au support' doit être activé)." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "v" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Politique de Confidentialité Sourcefabric" +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "Connexion" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "Réglages de Flux en Entrée" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "Saisissez les caractères que vous voyez dans l'image ci-dessous." -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "URL de Connexion de la Source Maitre:" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Nom de la Station" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "Outrepasser" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "Durée du fondu enchaîné " -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "Entrez une durée en secondes 0{.0}" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "Remise à Zéro" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "Fondu en Entrée par défaut (s):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "URL de Connexion de la Source Emission:" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "Fondu en Sorti par défaut (s):" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Choix des Jours:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "Autoriser les sites internet à acceder aux informations de la Programmation ?%s (Activer cette option permettra aux widgets de fonctionner.)" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "Enlever" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "Désactivé" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Jours de Répétition:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "Activé" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "Courriel / Réglages du Serveur de Courriels" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "Langue de l'interface par défaut" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "Réglages SoundCloud" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" +msgstr "Fuseau horaire de la Station" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "%s's Réglages" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "La Semaine Commence Le" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" -msgstr "Choisissez Afficher instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "Dimanche" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "Pas d'émission" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "Lundi" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "Trouver" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "Mardi" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "Flux" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "Mercredi" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "options supplémentaires" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "Jeudi" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "Les informations suivantes seront affichées aux auditeurs dans leur lecteur multimédia:" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(Site Internet de la Station de Radio)" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "Vendredi" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "URL du Flux:" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Samedi" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "Filtre de l'Historique" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "Lien:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Bienvenue à Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "Type de Répétition:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Voici comment vous pouvez commencer à utiliser Airtime pour automatiser vos diffusions:" +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "hebdomadaire" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "Commencez par ajouter vos fichiers à l'aide du menu \"Ajouter un média\". Vous pouvez faire glisser et déposer vos fichiers sur la fenêtre." +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "Toutes les 2 semaines" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "Créer une émission en allant sur «Calendrier» dans la barre de menus, puis en cliquant sur l'icône 'Emission + \". Il peut s'agir d'une seule fois ou d'une émission en répétition. Seuls les administrateurs et les gestionnaires de programmation peuvent ajouter des émissions." +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "Toutes les 3 semaines" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "Ajouter des médias à votre émission en cliquant sur votre émission dans le calendrier, Clic gauche dessus et selectionnez 'Ajouter / Supprimer Contenu'" +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "Toutes les 4 semaines" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Sélectionnez votre média dans le cadre de gauche et glissez-les dans votre émission dans le cadre de droite." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "mensuel" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "Alors vous êtes prêt à démarrer!" +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Selection des Jours:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "Pour une aide plus détaillée, lisez le %smanuel utilisateur%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "Dim" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "A propos" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "Lun" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sAirtime%s %s, est un logiciel libre pour la gestion et l'automation d'une station de radio distante. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "Mar" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%sSourcefabric%s o.p.s. Airtime est distribué sous la licence %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "Mer" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "Partager" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "Jeu" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Selection du Flux:" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "Ven" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "sourdine" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "Sam" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "désactiver" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "Répétition par:" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "Connexion" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "jour du mois" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Bienvenue à la démonstration en ligne d'Airtime! Vous pouvez vous connecter en utilisant \"admin\" comme nom d'utilisateur et «admin» comme mot de passe." +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "jour de la semaine" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "S'il vous plaît saisissez votre adresse de courriel. Vous recevrez un lien pour créer un nouveau mot de passe par courriel." +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "Sans Fin?" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "Courriel envoyé" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "La Date de Fin doit être postérieure à la Date de Début" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "Un courriel a été envoyé" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "SVP, selectionnez un jour de répétition" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "Retour à l'écran de connexion" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "Confirmez le nouveau mot de passe" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "Nouveau mot de passe" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "La confirmation mot de passe ne correspond pas à votre mot de passe." -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "S'il vous plaît saisir et confirmer votre nouveau mot de passe dans les champs ci-dessous." +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Récuperer un nouveau mot de passe" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "Votre période d'éssai expire dans" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "Selectionner le critère" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "jours" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Album" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Achetez votre copie d'Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Taux d'Echantillonage (Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "Mon Compte" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "Précédent:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "Compositeur" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "Prochain:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "Conducteur" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "Sources des Flux" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "Droit d'Auteur" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "Source Maitre" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "Créateur" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "Source Emission" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Encodé Par" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "Lecture Programmée" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "DIRECT" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "Label" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "Ecouter" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "Langue" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "Heure de la Station" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "Dernier Modifié" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Fermer" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "Dernier Joué" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "Ajouter cette Emission" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "Durée" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "Mettre à jour l'émission" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Mime" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "Quoi" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "Mood" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "Quand" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "Propriétaire" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "Entrée du Flux Direct" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "Replay Gain" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "Enregistrement & Rediffusion" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "Taux d'Echantillonage (Khz)" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Qui" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "Titre" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Style" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "Numéro de la Piste" -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "Début" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "Téléversé" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "Service" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "Site Internet" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "Status" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Année" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "Durée de Fonctionnement" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "Sélectionnez modification" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "Proc." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "contient" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "Mémoire" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "ne contitent pas" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Version d'Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "est" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "Espace Disque" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "n'est pas" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "Import du Fichier en cours..." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "commence par" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "Options Avancées de Recherche" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "fini par" -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "Nombre d'auditeur au fil du temps" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "est plus grand que" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "Nouveau" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "est plus petit que" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "Nouvelle Liste de Lecture" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "est dans le champ" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "Nouveau Bloc Intelligent" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "heures" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "Nouveau Flux Web" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "minutes" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "Voir / Editer la description" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "éléments" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "Description" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "Définir le type de Bloc Intelligent:" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "URL du Flux:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "Statique" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "Durée par Défaut:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "Dynamique" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "Aucun Flux Web" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "Permettre la Répétition des Pistes:" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "Vider le contenu de la Liste de Lecture" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "Limiter à" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "Vider" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "Génération de la liste de lecture et sauvegarde des crières" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Liste de Lecture Aléatoire" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "Générer" + +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "Contenu de la liste de lecture alèatoire" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 #: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 msgid "Shuffle" msgstr "Aléatoire" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Sauvegarde de la Liste de Lecture" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "Fondu enchainé de la Liste de Lecture" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "Fondu en entrée:" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Fondu en sortie:" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "Pas de Liste de Lecture Ouverte" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "Montrer la Forme d'Onde" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "Vider le contenu du bloc intelligent" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "Pas de Bloc Intelligent Ouvert" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "Point d'Entrée" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(hh:mm:ss.t)" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Point de Sortie:" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "Durée Originale:" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "Ettendre le bloc Statique" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "Ettendre le Bloc Dynamique" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "Bloc Intelligent Vide" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "Liste de Lecture Vide" - -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Application par défaut du Framework Zend" - -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "Page non trouvée!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "On dirait que la page que vous cherchez n'existe pas!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "Aide" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "précédent" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "jouer" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "pause" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "suivant" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "stop" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "Volume max" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "Mise à Jour Requise" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "Pour lire le média, vous devrez mettre à jour votre navigateur vers une version récente ou mettre à jour votre %sPlugin Flash%s." - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "Création du fichier Modèle d'Historique" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "Création du modèle de fichier de Log" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "Nom" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "Ajouter plus d'éléments" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "Ajouter un nouveau champs" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "Definir le modèle par défaut" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "Modèles de fichiers de Log" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "Aucun modèles de fichiers de Log" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "Définir par défaut" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "Nouveau modèle de fichier de Log" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "La Limite ne peut être vide ou plus petite que 0" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "Modèle de fichier d'historique" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "La Limite ne peut être supérieure à 24 heures" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "aucun modèle de fichier d'Historique" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "La valeur doit être un entier" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "Nouveau modèle de fichier d'Historique" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "500 est la valeur maximale de l'élément que vous pouvez définir" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "Gérer les Utilisateurs" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "Vous devez sélectionner Critères et Modification" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "Nouvel Utilisateur" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "La 'Durée' doit être au format '00:00:00'" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "id" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "La valeur doit être en format d'horodatage (par exemple 0000-00-00 ou 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Utilisateur" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "La valeur doit être numérique" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "Prénom" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "La valeur doit être inférieure à 2147483648" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "Nom" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "La valeur doit être inférieure à %s caractères" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "Type d'Utilisateur" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "La Valeur ne peut pas être vide" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "Titre:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "Auto commutateur Arrété" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "Créateur:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "Auto Commutateur Activé" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Album:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "fondu(s) de Transition du Commutateur" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Piste:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "Saisissez une durée en secondes 00{.000000}" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "Durée:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "Nom Utilisateur Maître" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "Fréquence d'Echantillonnage" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "Mot de Passe Maître" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Débit:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "URL de Connexion de la Source Maître" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "Atmosphère:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "URL de connexion de la Source Emission" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Genre:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "Port de la Source Maitre" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Année:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "Point de Montage de la Source Maitre" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "Label:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Port de la Source Emission" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "Point de Montage de la Source Emission" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "Compositeur:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "Vous ne pouvez pas utiliser le même port que le port Maitre DJ." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "Conducteur:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "Le Port %s n'est pas disponible" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "Copyright:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Téléphone" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "Numéro ISRC:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "Site Internet de la Station" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "Site Internet:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "Pays:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "Langue" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "Ville:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "Chemin du fichier:" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "Description de la Station:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "Nom:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Logo de la Station:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "Description:" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "Envoyez vos remarques au support" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Flux Web" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "Promouvoir ma station sur Sourcefabric.org" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "Bloc Intelligent Dynamique" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "En cochant cette case, j'accepte la %spolitique de confidentialité%s de Sourcefabric ." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "Bloc Intélligent Statique" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "Vous devez accepter la politique de confidentialité." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Piste Audio" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "Une Valeur est requise, ne peut pas être vide" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "Contenus de la Liste de Lecture:" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "Heure de Début" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "Contenus du Bloc Intelligent Statique:" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "Heure de Fin" + +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "Pas d'émission" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "Critère(s) du Bloc Intelligent Dynamique:" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "Enregistrer à partir de 'Line In'?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "Limité à" +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "Rediffusion?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "URL:" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Utiliser l'authentification d'Airtime:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "Fichier de Log" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "Utiliser l'authentification personnalisée:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "Résumé du fichier" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "Nom d'utilisateur personnalisé" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "Historique Emision" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "Mot de Passe personnalisé" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "Les Emissions peuvent avoir une durée maximale de 24 heures." +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "Le Champ Nom d'Utilisateur ne peut pas être vide." -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "La date/heure de Fin ne peut être dans le passé" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "Le Champ Mot de Passe ne peut être vide." -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "Ne peux pas programmer des émissions qui se chevauchent. \nRemarque: Le redimensionnement d'une émission répétée affecte l'ensemble de ses répétitions." +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "Courriel" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "Ne peux pas redimmensionner une émission diffusée" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "Récuperer le mot de passe" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "Les émissions ne doivent pas se chevaucher" +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "Sortie Audio Matérielle" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Selectionner le Pays" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "Type de Sortie" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s déjà examiné(s)." +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Icecast Metadata Vorbis" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s contient un répertoire surveillé imbriqué: %s" +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "Label du Flux:" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s est imbriqué avec un répertoire surveillé existant: %s" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "Artiste - Titre" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s n'est pas un répertoire valide." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Emission - Artiste - Titre" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s est déjà défini comme le répertoire de stockage courant ou dans la liste des dossiers surveillés" +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Nom de la Station - Nom de l'Emission" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s est déjà défini comme espace de stockage courant ou dans la liste des répertoires surveillés." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "Métadonnées Hors Antenne" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s n'existe pas dans la liste surveillée" +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "Activer" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "éléments" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "Modifier le Niveau du Gain" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "Le Point d'entré et le point de sortie sont nul." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%value%' n'est pas une adresse de courriel valide dans le format de type partie-locale@nomdedomaine" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "Ne peut pas fixer un point de sortie plus grand que la durée du fichier." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%' ne correspond pas au format de la date '%format%'" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "Impossible de définir un point d'entrée plus grand que le point de sortie." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%' est inférieur à %min% charactères" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "Ne peux pas fixer un point de sortie plus petit que le point d'entrée." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%value%' est plus grand de %min% charactères" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "Selectionner le critère" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%' n'est pas entre '%min%' et '%max%', inclusivement" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Taux d'Echantillonage (Kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "Les mots de passe ne correspondent pas" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%value%' ne correspond pas au format de durée 'HH:mm'" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Encodé Par" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "Date/Heure de Début:" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "Dernier Modifié" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "Date/Heure de Fin:" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "Dernier Joué" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "Durée:" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Mime" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "Fuseau horaire:" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "Propriétaire" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "Répétitions?" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "Replay Gain" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "Impossible de créer un émission dans le passé" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "Taux d'Echantillonage (Khz)" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "Vous ne pouvez pas modifier la date / heure de début de l'émission qui a déjà commencé" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "Numéro de la Piste" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "La date/heure de Fin ne peut être dans le passé" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "Téléversé" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "Ne peut pas avoir une durée <0m" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "Site Internet" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "Ne peut pas avoir une durée de 00h 00m" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "Sélectionnez modification" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "Ne peut pas avoir une durée supérieure à 24h" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "contient" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "Ne peux pas programmer des émissions qui se chevauchent" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "ne contitent pas" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "Nom:" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "est" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "Emission sans Titre" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "n'est pas" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "URL:" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "commence par" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "Description:" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "fini par" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "Téléverser Automatiquement les Emissions Enregistrées" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "est plus grand que" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "Activer le Téléversement SoundCloud" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "est plus petit que" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "Marquer automatiquement les fichiers \"téléchargeable\" sur SoundCloud" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "est dans le champ" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "Courriel SoundCloud" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "La durée doit être supérieure à 0 minute" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "Mot de Passe SoundCloud" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "La durée doit être de la forme \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "Tags SoundCloud: (séparer les tags avec des espaces)" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "URL doit être de la forme \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "Genre par Défaut:" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "L'URL doit être de 512 caractères ou moins" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "Type de Piste par Défaut:" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "Aucun type MIME trouvé pour le Flux Web." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "Original" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "Le Nom du Flux Web ne peut être vide" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "Remix" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "Impossible d'analyser la Sélection XSPF" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "Direct" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "Impossible d'analyser la Sélection PLS" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "Enregistrement" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "Impossible d'analyser la Séléction M3U" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "Parlé" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "Flux Web Invalide - Ceci semble être un fichier téléchargeable." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "Ballado-diffusion" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "Type de flux non reconnu: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Démo" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Bonjour %s, \n\nCliquez sur ce lien pour réinitialiser votre mot de passe:" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "travail en cours" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Mot de passe Airtime Réinitialisé" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "Contenir" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "Rediffusion de %s à %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "Boucle" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "Vous ne pouvez pas déplacer les éléments sur les émissions liées" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Effet Sonore" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "Le calendrier que vous consultez n'est pas à jour! (décalage calendaire)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "Un Court Echantillon" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "La programmation que vous consultez n'est pas à jour! (décalage d'instance)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Autre" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "Le calendrier que vous consultez n'est pas à jour!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "Licence par Défaut:" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "Vous n'êtes pas autorisé à programme l'émission %s." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "Ce travail est dans le domaine public" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "Vous ne pouvez pas ajouter des fichiers à des emissions enregistrées." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "Tous droits réservés" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "L émission %s est terminé et ne peut pas être programmé." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "Creative Commons Attribution" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "L'émission %s a été précédement mise à jour!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "Creative Commons Attribution Non Commercial" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "Le contenu des émissions liés doit être programmé avant ou après sa diffusion" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "Creative Commons Attribution Pas de Travaux Dérivés" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "Un fichier séléctionné n'existe pas!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "Creative Commons Attribution Distribution à l'Identique" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "Impossible de créer le répertoire \"organize\"." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "Creative Commons Attribution Non Commercial Pas de Travaux Dérivés" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "Le fichier n'a pas été téléchargé, il y a %s Mo d'espace libre sur le disque et le fichier que vous téléchargez a une taille de %s MB." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "Creative Commons Attribution Non Commercial Distribution à l'Identique" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "Ce fichier semble être endommagé et ne sera pas ajouté à la médiathèque." +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "Fuseau horaire de l'Interface:" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "Le fichier n'a pas été téléchargé, cette erreur peut se produire si le disque dur de l'ordinateur ne dispose pas de suffisamment d'espace libre ou le répertoire stockage ne dispose pas des autorisations d'écriture correctes." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "Activer les courriels système (Réinitialisation du mot de passe)" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "Vous n'avez pas la permission de déconnecter la source." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "Réinitialisation du mot de passe Courriel 'De'" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "Il n'y a pas de source connectée à cette entrée." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "Configuration du Serveur de Courriels" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "Vous n'avez pas la permission de changer de source." +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "Requier une authentification" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" -msgstr "Rediffusion de l'émission %s de %s à %s" +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "Serveur de Courriel" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" -msgstr "Téléchargement" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "Adresse de Courriel" #: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "S'il vous plaît assurez-vous que l'utilisateur admin a un mot de passe correct sur le système-> page flux." -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "Vous n'êtes pas autorisé à acceder à cette ressource." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Flux Web sans Titre" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "Vous n'êtes pas autorisé à acceder à cette ressource." +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Flux Web sauvegardé" -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "Le fichier n'existe pas dans Airtime" +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "Valeurs du formulaire non valides." -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "Le fichier n'existe pas dans Airtime" +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "S'il vous plaît saisissez votre nom d'utilisateur et mot de passe" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "Le fichier n'existe pas dans Airtime" +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "Mauvais Nom d'utilisateur ou mot de passe fourni. S'il vous plaît essayez de nouveau." -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "Mauvaise requête. pas de \"mode\" paramètre passé." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "Le Courriel n'a pas pu être envoyé. Vérifiez vos paramètres du serveur de messagerie et s'assurez vous qu'il a été correctement configuré." -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "Mauvaise requête.paramètre 'mode' invalide" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "Courriel donné non trouvé" -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format -msgid "%s not found" -msgstr "%s non trouvé" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "Quelque chose s'est mal passé." - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "Pré-Visualisation" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "Ajouter une" - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "Ajouter un bloc Intelligent" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "Edition des Méta-Données" +msgid "Rebroadcast of show %s from %s at %s" +msgstr "Rediffusion de l'émission %s de %s à %s" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "dupliquer la Liste de lecture" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" +msgstr "Téléchargement" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "SoundCloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "Utilisateur ajouté avec succès!" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "Aucune action disponible" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "Utilisateur mis à jour avec succès!" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "Vous n'avez pas la permission de supprimer les éléments sélectionnés." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "Paramètres mis à jour avec succès!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "Impossible de supprimer certains fichiers programmés." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "Page non trouvée" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "Copie de %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Erreur de l'application" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1874,6 +1590,11 @@ msgstr "Vous pouvez uniquement ajouter des pistes, des blocs intelligents et flu msgid "Please select a cursor position on timeline." msgstr "S'il vous plaît sélectionner un curseur sur la timeline." +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "Edition des Méta-Données" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "Ajouter à l'émission selectionnée" @@ -1920,6 +1641,7 @@ msgstr "Chargement..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "Tous" @@ -1990,9 +1712,7 @@ msgstr "L'entrée doit être au format suivant: hh:mm:ss.t" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "Vous êtes en train de téléverser des fichiers. %s Aller vers un autre écran pour annuler le processus de téléversement. %s Êtes-vous sûr de vouloir quitter la page?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2028,10 +1748,7 @@ msgid "Playlist shuffled" msgstr "liste de lecture mélangée" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "Airtime n'est pas sûr de l'état de ce fichier. Cela peut arriver lorsque le fichier se trouve sur un lecteur distant qui est inaccessible ou si le fichier est dans un répertoire qui n'est pas plus «sruveillé»." #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2057,24 +1774,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "L'Image doit être du type jpg, jpeg, png, ou gif" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "Un bloc statique intelligent permettra d'économiser les critères et générera le contenu du bloc immédiatement. Cela vous permet d'éditer et de le voir dans la médiathèque avant de l'ajouter à une émission." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "Un bloc dynamique intelligent enregistre uniquement les critères. Le contenu du bloc que vous obtiendrez sera généré lors de l'ajout à l'émission. Vous ne serez pas en mesure d'afficher et de modifier le contenu de la médiathèque." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "La longueur du bloc souhaité ne sera pas atteint si de temps d'antenne ne peut pas trouver suffisamment de pistes uniques en fonction de vos critères. Activez cette option si vous souhaitez autoriser les pistes à s'ajouter plusieurs fois dans le bloc intelligent." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2105,7 +1813,14 @@ msgstr "Choisir un Répertoire à Surveiller" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "Etes-vous sûr que vous voulez changer le répertoire de stockage? \nCela supprimera les fichiers de votre médiathèque Airtime!" +msgstr "" +"Etes-vous sûr que vous voulez changer le répertoire de stockage? \n" +"Cela supprimera les fichiers de votre médiathèque Airtime!" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "Gérer les Répertoires des Médias" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2117,9 +1832,7 @@ msgstr "Ce chemin n'est pas accessible." #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "Certains types de flux nécessitent une configuration supplémentaire. Les détails sur l'activation de l' %sAAC+ Support%s ou %sOpus Support%s sont prévus." #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2130,22 +1843,12 @@ msgstr "Connecté au serveur de flux" msgid "The stream is disabled" msgstr "Le flux est désactivé" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Obtention des informations à partir du serveur ..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "Impossible de se connecter au serveur de flux" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "Si Airtime est derrière un routeur ou un pare-feu, vous devrez peut-être configurer la redirection de port et ce champ d'information sera alors incorrect.Dans ce cas, vous devrez mettre à jour manuellement ce champ de sorte qu'il affiche l'hôte/le port /le point de montage correct dont le DJ a besoin pour s'y connecter. La plage autorisée est comprise entre 1024 et 49151." #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2154,61 +1857,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "Pour plus de détails, s'il vous plaît lire le %sManuel d'Airtime%s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "Cochez cette option pour activer les métadonnées pour les flux OGG (les métadonnées du flux est le titre de la piste, l'artiste et le nom de émission qui est affiché dans un lecteur audio). VLC et mplayer ont un sérieux bogue lors de la lecture d'un flux Ogg / Vorbis qui affiche les informations de métadonnées: ils se déconnecteront après chaque chanson. Si vous utilisez un flux OGG et vos auditeurs n'utilisent pas ces lecteurs audio, alors n'hésitez pas à activer cette option." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "Cochez cette case arrête automatiquement la source Maître/Emission lors de la déconnexion." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "Cochez cette case démarre automatiquement la source Maître/Emission lors de la connexion." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "Si votre serveur Icecast s'attend à ce que le nom d'utilisateur soit «source», ce champ peut être laissé vide." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "Si votre client de flux audio ne demande pas un nom d'utilisateur, ce champ doit être «source»." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "Si vous modifiez les valeurs du nom d'utilisateur ou du mot de passe pour un flux activé le moteur diffusion sera redémarré et vos auditeurs entendront un silence pendant 5-10 secondes. Changer les champs suivants ne provoqueront pas un redémarrage: Label du Flux (Paramètres globaux), et Commutateur de transition du fondu (s), Nom d'Utilisateur Maître, et le Mot de passe Maître (Paramètres du flux d'entrée). Si Airtime enregistre, et si la modification entraîne un redémarrage du moteur, l'enregistrement sera interrompu." #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "C'est le nom d'utilisateur administrateur et mot de passe pour icecast / shoutcast qui permet obtenir les statistiques d'écoute." #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2216,9 +1894,7 @@ msgid "No result found" msgstr "aucun résultat trouvé" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "Cela suit le même modèle de sécurité que pour les émissions: seuls les utilisateurs affectés à l' émission peuvent se connecter." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2234,16 +1910,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "Attention: Les émissions ne peuvent pas être re-liés" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "En liant vos émissions répétées chaques éléments multimédias programmés dans n'importe quelle émission répétitée seront également programmées dans les autres émissions répétées" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "Le fuseau horaire est fixé au fuseau horaire de la Station par défaut. les émissions dans le calendrier seront affichés dans votre heure locale définie par le fuseau horaire de l'interface dans vos paramètres utilisateur." #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2391,87 +2062,16 @@ msgstr "aujourd'hui" msgid "day" msgstr "jour" -#: airtime_mvc/application/controllers/LocaleController.php:238 -msgid "week" -msgstr "semaine" - -#: airtime_mvc/application/controllers/LocaleController.php:239 -msgid "month" -msgstr "mois" - -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "Dimanche" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "Lundi" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "Mardi" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "Mercredi" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "Jeudi" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "Vendredi" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Samedi" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "Dim" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "Lun" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "Mar" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "Mer" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "Jeu" - -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "Ven" - -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "Sam" +#: airtime_mvc/application/controllers/LocaleController.php:238 +msgid "week" +msgstr "semaine" + +#: airtime_mvc/application/controllers/LocaleController.php:239 +msgid "month" +msgstr "mois" #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Les émissions qui dépassent leur programmation seront coupés par les émissions suivantes." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2499,6 +2099,11 @@ msgstr "Enlever tous les contenus?" msgid "Delete selected item(s)?" msgstr "Selectionner le(s) élément(s)?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "Début" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "Fin" @@ -2532,14 +2137,6 @@ msgstr "Déplacer 1 élément" msgid "Moving %s Items" msgstr "Déplacer %s éléments" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "Annuler" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "Editeur de Fondu" @@ -2549,8 +2146,7 @@ msgid "Cue Editor" msgstr "Editeur de Point d'E/S" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "Les caractéristiques de la forme d'onde sont disponibles dans un navigateur supportant l'API Web Audio" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2577,1333 +2173,1627 @@ msgstr "Aller à la piste en cours de lecture" msgid "Cancel current show" msgstr "Annuler l'émission en cours" -#: airtime_mvc/application/controllers/LocaleController.php:302 -msgid "Open library to add or remove content" -msgstr "Ouvrir la Médiathèque pour ajouter ou supprimer du contenu" +#: airtime_mvc/application/controllers/LocaleController.php:302 +msgid "Open library to add or remove content" +msgstr "Ouvrir la Médiathèque pour ajouter ou supprimer du contenu" + +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "Ajouter/Supprimer Contenu" + +#: airtime_mvc/application/controllers/LocaleController.php:305 +msgid "in use" +msgstr "en utilisation" + +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "Disque" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "Regarder à l'intérieur" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "Ouvrir" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "Les Invités peuvent effectuer les opérations suivantes:" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "Voir le calendrier" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "Voir le contenu des émissions" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "Les DJs peuvent effectuer les opérations suivantes:" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "Gérer le contenu des émissions attribué" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "Importer des fichiers multimédias" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "Créez des listes de lectures, des blocs intelligents et des flux web" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "Gérer le contenu de leur propre audiotheque" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "Les gestionnaires pouvent effectuer les opérations suivantes:" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "Afficher et gérer le contenu des émissions" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "Programmer des émissions" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "Gérez tout le contenu de l'audiotheque" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "Les Administrateurs peuvent effectuer les opérations suivantes:" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "Gérer les préférences" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "Gérer les utilisateurs" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "Gérer les dossiers surveillés" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "Voir l'état du système" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "Accédez à l'historique diffusion" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "Voir les statistiques des auditeurs" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "Montrer / cacher les colonnes" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "De {from} à {to}" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "kbps" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "aaaa-mm-jj" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" +msgstr "hh:mm:ss.t" + +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" +msgstr "kHz" + +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" +msgstr "Di" + +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" +msgstr "Lu" + +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" +msgstr "Ma" + +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" +msgstr "Me" + +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" +msgstr "Je" + +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" +msgstr "Ve" + +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" +msgstr "Sa" + +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Fermer" + +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" +msgstr "Heure" + +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" +msgstr "Minute" + +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" +msgstr "Fait" + +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" +msgstr "Sélectionnez les fichiers" + +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." +msgstr "Ajouter des fichiers à la file d'attente de téléversement, puis cliquez sur le bouton Démarrer." + +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "Status" + +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" +msgstr "Ajouter des fichiers" + +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" +msgstr "Arreter le Téléversement" + +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" +msgstr "Démarrer le Téléversement" + +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" +msgstr "Ajouter des fichiers" + +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" +msgstr "Téléversement de %d/%d fichiers" + +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" +msgstr "N/A" + +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." +msgstr "Faites glisser les fichiers ici." + +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." +msgstr "Erreur d'extension du fichier." + +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." +msgstr "Erreur de la Taille de Fichier." + +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." +msgstr "Erreur de comptage des fichiers." + +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." +msgstr "Erreur d'Initialisation." -#: airtime_mvc/application/controllers/LocaleController.php:305 -msgid "in use" -msgstr "en utilisation" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." +msgstr "Erreur HTTP." -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" -msgstr "Disque" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." +msgstr "Erreur de sécurité." -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" -msgstr "Regarder à l'intérieur" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." +msgstr "Erreur générique." -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" -msgstr "Ouvrir" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." +msgstr "Erreur d'E/S." -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "Administrateur" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" +msgstr "Fichier: %s" -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "DeaJee" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" +msgstr "%d fichiers en file d'attente" -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "Programmateur" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" +msgstr "Fichier:%f, taille: %s, taille de fichier maximale: %m" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "Invité" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" +msgstr "l'URL de Téléversement est peut être erronée ou inexistante" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" -msgstr "Les Invités peuvent effectuer les opérations suivantes:" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " +msgstr "Erreur: Fichier trop grand:" -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" -msgstr "Voir le calendrier" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " +msgstr "Erreur: extension de fichier non valide:" -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" -msgstr "Voir le contenu des émissions" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "Définir par défaut" -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" -msgstr "Les DJs peuvent effectuer les opérations suivantes:" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" +msgstr "créer une entrée" -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" -msgstr "Gérer le contenu des émissions attribué" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" +msgstr "Éditer l'enregistrement de l'historique" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" -msgstr "Importer des fichiers multimédias" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" +msgstr "Copié %s ligne(s)%s dans le presse papier" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" -msgstr "Créez des listes de lectures, des blocs intelligents et des flux web" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." +msgstr "%sVue Imprimante%s Veuillez utiliser la fonction d'impression de votre navigateur pour imprimer ce tableau. Appuyez sur échapper lorsque vous avez terminé." -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" -msgstr "Gérer le contenu de leur propre audiotheque" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "Vous n'avez pas la permission de déconnecter la source." -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" -msgstr "Les gestionnaires pouvent effectuer les opérations suivantes:" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "Il n'y a pas de source connectée à cette entrée." -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" -msgstr "Afficher et gérer le contenu des émissions" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "Vous n'avez pas la permission de changer de source." -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" -msgstr "Programmer des émissions" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "Vous visualisez l'ancienne version de %s" -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" -msgstr "Gérez tout le contenu de l'audiotheque" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "Vous ne pouvez pas ajouter de pistes aux blocs dynamiques." -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" -msgstr "Les Administrateurs peuvent effectuer les opérations suivantes:" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%s non trouvé" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" -msgstr "Gérer les préférences" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "Vous n'avez pas la permission de supprimer la sélection %s(s)." -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" -msgstr "Gérer les utilisateurs" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "Quelque chose s'est mal passé." -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "Gérer les dossiers surveillés" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "Vous pouvez seulement ajouter des pistes au bloc intelligent." -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "Envoyez vos remarques au support" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "Liste de Lecture Sans Titre" -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" -msgstr "Voir l'état du système" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Bloc Intelligent Sans Titre" -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" -msgstr "Accédez à l'historique diffusion" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "Liste de Lecture Inconnue" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" -msgstr "Voir les statistiques des auditeurs" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "Vous n'êtes pas autorisé à acceder à cette ressource." -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" -msgstr "Montrer / cacher les colonnes" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "Vous n'êtes pas autorisé à acceder à cette ressource." -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" -msgstr "De {from} à {to}" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "Le fichier n'existe pas dans Airtime" -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" -msgstr "kbps" +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "Le fichier n'existe pas dans Airtime" -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" -msgstr "aaaa-mm-jj" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "Le fichier n'existe pas dans Airtime" -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" -msgstr "hh:mm:ss.t" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "Mauvaise requête. pas de \"mode\" paramètre passé." -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" -msgstr "kHz" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "Mauvaise requête.paramètre 'mode' invalide" -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" -msgstr "Di" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "Pré-Visualisation" -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" -msgstr "Lu" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "Ajouter une" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" -msgstr "Ma" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "Ajouter un bloc Intelligent" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "Effacer" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" -msgstr "Me" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "dupliquer la Liste de lecture" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" -msgstr "Je" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "Edition" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" -msgstr "Ve" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" -msgstr "Sa" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "Voir sur SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" -msgstr "Heure" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "Re-Téléverser vers SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" -msgstr "Minute" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Téléverser vers SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" -msgstr "Fait" +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "Aucune action disponible" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" -msgstr "Sélectionnez les fichiers" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "Vous n'avez pas la permission de supprimer les éléments sélectionnés." -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." -msgstr "Ajouter des fichiers à la file d'attente de téléversement, puis cliquez sur le bouton Démarrer." +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "Impossible de supprimer certains fichiers programmés." -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" -msgstr "Ajouter des fichiers" +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "Copie de %s" -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" -msgstr "Arreter le Téléversement" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Selectionner le Curseur" -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" -msgstr "Démarrer le Téléversement" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "Enlever le Curseur" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" -msgstr "Ajouter des fichiers" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "L'Emission n'existe pas" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" -msgstr "Téléversement de %d/%d fichiers" +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." +msgstr "Préférences mises à jour." -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" -msgstr "N/A" +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." +msgstr "Régalges su Support mis à jour." -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." -msgstr "Faites glisser les fichiers ici." +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" +msgstr "Remarques au support" -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." -msgstr "Erreur d'extension du fichier." +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." +msgstr "Réglages du Flux mis à jour." -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." -msgstr "Erreur de la Taille de Fichier." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" +msgstr "le chemin doit être spécifié" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." -msgstr "Erreur de comptage des fichiers." +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." +msgstr "Problème ave Liquidsoap..." -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." -msgstr "Erreur d'Initialisation." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "En Lecture" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." -msgstr "Erreur HTTP." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "Ajouter un Media" -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." -msgstr "Erreur de sécurité." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Audiothèque" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." -msgstr "Erreur générique." +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "Calendrier" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." -msgstr "Erreur d'E/S." +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "Système" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" -msgstr "Fichier: %s" +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "Préférences" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" -msgstr "%d fichiers en file d'attente" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "Utilisateurs" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" -msgstr "Fichier:%f, taille: %s, taille de fichier maximale: %m" +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Répertoires des Médias" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" -msgstr "l'URL de Téléversement est peut être erronée ou inexistante" +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Flux" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " -msgstr "Erreur: Fichier trop grand:" +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "Statistiques des Auditeurs" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " -msgstr "Erreur: extension de fichier non valide:" +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "Historique" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" -msgstr "créer une entrée" +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "Historique de Diffusion" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" -msgstr "Éditer l'enregistrement de l'historique" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "Modèle d'historique" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" -msgstr "Copié %s ligne(s)%s dans le presse papier" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "Aide" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." -msgstr "%sVue Imprimante%s Veuillez utiliser la fonction d'impression de votre navigateur pour imprimer ce tableau. Appuyez sur échapper lorsque vous avez terminé." +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "Mise en route" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "S'il vous plaît saisissez votre nom d'utilisateur et mot de passe" +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "Manuel Utilisateur" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "Mauvais Nom d'utilisateur ou mot de passe fourni. S'il vous plaît essayez de nouveau." +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "A propos" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "Le Courriel n'a pas pu être envoyé. Vérifiez vos paramètres du serveur de messagerie et s'assurez vous qu'il a été correctement configuré." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "Service" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "Courriel donné non trouvé" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "Durée de Fonctionnement" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." -msgstr "Préférences mises à jour." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "Proc." -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." -msgstr "Régalges su Support mis à jour." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "Mémoire" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" -msgstr "Remarques au support" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Version d'Airtime" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." -msgstr "Réglages du Flux mis à jour." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "Espace Disque" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" -msgstr "le chemin doit être spécifié" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "Courriel / Réglages du Serveur de Courriels" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." -msgstr "Problème ave Liquidsoap..." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "Réglages SoundCloud" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Selectionner le Curseur" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Jours de Répétition:" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "Enlever le Curseur" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "Enlever" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "L'Emission n'existe pas" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "Ajouter" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Flux Web sans Titre" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "URL de Connexion:" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Flux Web sauvegardé" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "Réglages de Flux en Entrée" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "Valeurs du formulaire non valides." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "URL de Connexion de la Source Maitre:" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "Vous visualisez l'ancienne version de %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "Outrepasser" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "Vous ne pouvez pas ajouter de pistes aux blocs dynamiques." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "OK" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "Vous n'avez pas la permission de supprimer la sélection %s(s)." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "Remise à Zéro" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "Vous pouvez seulement ajouter des pistes au bloc intelligent." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "URL de Connexion de la Source Emission:" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "Liste de Lecture Sans Titre" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(Requis)" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Bloc Intelligent Sans Titre" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "Enregistrez Airtime" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "Liste de Lecture Inconnue" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Aidez Airtime à s' améliorer en nous faisant savoir comment vous l'utilisez. Cette information sera recueillie régulièrement afin d'améliorer votre expérience utilisateur.%sClickez «Oui, aidez Airtime» et nous nous assurerons que les fonctions que vous utilisez soient en constante amélioration." -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "Page non trouvée" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "Cliquez sur la case ci-dessous pour annoncer votre station sur %sSourcefabric.org%s. Afin de promouvoir votre station, 'Envoyez vos remarques au support \"doit être activé. Ces données seront recueillies en plus des retours d'informations." -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Erreur de l'application" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(à des fins de vérification uniquement, ne sera pas publié)" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "Utilisateur ajouté avec succès!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Remarque: Tout ce qui est plus grand que 600x600 sera redimensionné." -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "Utilisateur mis à jour avec succès!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Montrez-moi ce que je vais envoyer" -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "Paramètres mis à jour avec succès!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "Termes et Conditions." -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "L'année %s doit être comprise entre 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "Réinitialisation du Mot de Passe" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s n'est pas une date valide" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Choisir le répertoire" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s:%s:%s n'est pas une durée valide" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "Installer" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "Emission sans Titre" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "Répertoire d'Import en Cours:" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "répertoire d'Import:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "Rescanner le répertoire surveillé (Peut être utile si c'est un montage réseau et est peut être désynchronisé avec Airtime)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "Répertoires Suveillés:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "Supprimer le répertoire surveillé" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "N'est pas un Répertoire valide" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "Vous ne surveillez pas les dossiers médias." -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Utilisateur:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "Flux" -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "Mot de Passe:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "options supplémentaires" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "Vérification du Mot de Passe:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "Les informations suivantes seront affichées aux auditeurs dans leur lecteur multimédia:" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "Prénom:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(Site Internet de la Station de Radio)" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "Nom:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "URL du Flux:" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "Courriel:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "Filtre de l'Historique" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Numéro de Mobile:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "Trouver Emissions" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "Filtrer par émission" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "%s's Réglages" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "Type d'Utilisateur:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Aide Airtime à s'améliorer en laissant Sourcefabric savoir comment vous l'utilisez. Ces informations seront recueillies régulièrement afin d'améliorer votre expérience utilisateur.%sCochez la case 'Envoyer un retour d'information au support' et nous ferons en sorte que les fonctions que vous utilisez s'améliorent constamment." -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "Le Nom de connexion n'est pas unique." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "Cliquez sur la case ci-dessous pour la promotion de votre station sur %sSourcefabric.org%s." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "Auto commutateur Arrété" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(Pour la promotion de votre station, 'Envoyez vos remarques au support' doit être activé)." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "Auto Commutateur Activé" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Politique de Confidentialité Sourcefabric" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "fondu(s) de Transition du Commutateur" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "Choisissez Afficher instance" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "Saisissez une durée en secondes 00{.000000}" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "Trouver" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "Nom Utilisateur Maître" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Choix des Jours:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "Mot de Passe Maître" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Options de Bloc Intelligent" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "URL de Connexion de la Source Maître" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "ou" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "URL de connexion de la Source Emission" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "et" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "Port de la Source Maitre" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr "à" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "Seuls les chiffres sont autorisés." +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "fichiers répondent aux critères" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "Point de Montage de la Source Maitre" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "Le fichier doit correspondre aux crtères" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Caractère Invalide saisi" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "Création du fichier Modèle d'Historique" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Port de la Source Emission" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "Création du modèle de fichier de Log" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "Point de Montage de la Source Emission" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "Ajouter plus d'éléments" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "Vous ne pouvez pas utiliser le même port que le port Maitre DJ." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "Ajouter un nouveau champs" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "Le Port %s n'est pas disponible" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "Definir le modèle par défaut" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%value%' ne correspond pas au format de durée 'HH:mm'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" +msgstr "Modèles de fichiers de Log" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "Date/Heure de Début:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "Aucun modèles de fichiers de Log" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "Date/Heure de Fin:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "Nouveau modèle de fichier de Log" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "Durée:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" +msgstr "Modèle de fichier d'historique" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "Fuseau horaire:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" +msgstr "aucun modèle de fichier d'Historique" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "Répétitions?" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "Nouveau modèle de fichier d'Historique" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "Impossible de créer un émission dans le passé" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "Nouveau" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "Vous ne pouvez pas modifier la date / heure de début de l'émission qui a déjà commencé" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "Nouvelle Liste de Lecture" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "Ne peut pas avoir une durée <0m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "Nouveau Bloc Intelligent" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "Ne peut pas avoir une durée de 00h 00m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "Nouveau Flux Web" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "Ne peut pas avoir une durée supérieure à 24h" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "Voir / Editer la description" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" -msgstr "Lien:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "URL du Flux:" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "Type de Répétition:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "Durée par Défaut:" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "hebdomadaire" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "Aucun Flux Web" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" -msgstr "Toutes les 2 semaines" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "Réglages des Flux" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" -msgstr "Toutes les 3 semaines" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Réglages Globaux" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" -msgstr "Toutes les 4 semaines" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "dB" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "Réglages flux de sortie" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "mensuel" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "Import du Fichier en cours..." -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Selection des Jours:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "Options Avancées de Recherche" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "Répétition par:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "précédent" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "jour du mois" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "jouer" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "jour de la semaine" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "pause" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "Date de Fin:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "suivant" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "Sans Fin?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "stop" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "La Date de Fin doit être postérieure à la Date de Début" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "sourdine" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "SVP, selectionnez un jour de répétition" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "désactiver" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "Une Valeur est requise, ne peut pas être vide" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "Volume max" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "Mot de Passe" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "Mise à Jour Requise" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "Confirmez le nouveau mot de passe" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "Pour lire le média, vous devrez mettre à jour votre navigateur vers une version récente ou mettre à jour votre %sPlugin Flash%s." -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "La confirmation mot de passe ne correspond pas à votre mot de passe." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "Durée:" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Récuperer un nouveau mot de passe" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "Fréquence d'Echantillonnage" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Nom de la Station" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "Numéro ISRC:" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Téléphone" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "Chemin du fichier:" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "Site Internet de la Station" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Flux Web" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "Pays:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "Bloc Intelligent Dynamique" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "Ville:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "Bloc Intélligent Statique" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "Description de la Station:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Piste Audio" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Logo de la Station:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "Contenus de la Liste de Lecture:" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "Promouvoir ma station sur Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "Contenus du Bloc Intelligent Statique:" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "En cochant cette case, j'accepte la %spolitique de confidentialité%s de Sourcefabric ." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "Critère(s) du Bloc Intelligent Dynamique:" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "Vous devez accepter la politique de confidentialité." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "Limité à" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%value%' n'est pas une adresse de courriel valide dans le format de type partie-locale@nomdedomaine" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%' ne correspond pas au format de la date '%format%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%' est inférieur à %min% charactères" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%value%' est plus grand de %min% charactères" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "Nombre d'auditeur au fil du temps" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%' n'est pas entre '%min%' et '%max%', inclusivement" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Bienvenue à Airtime!" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "Les mots de passe ne correspondent pas" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Voici comment vous pouvez commencer à utiliser Airtime pour automatiser vos diffusions:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "Activé:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "Commencez par ajouter vos fichiers à l'aide du menu \"Ajouter un média\". Vous pouvez faire glisser et déposer vos fichiers sur la fenêtre." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "Type de Flux:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "Créer une émission en allant sur «Calendrier» dans la barre de menus, puis en cliquant sur l'icône 'Emission + \". Il peut s'agir d'une seule fois ou d'une émission en répétition. Seuls les administrateurs et les gestionnaires de programmation peuvent ajouter des émissions." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "Type de service:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "Ajouter des médias à votre émission en cliquant sur votre émission dans le calendrier, Clic gauche dessus et selectionnez 'Ajouter / Supprimer Contenu'" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "Cannaux:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Sélectionnez votre média dans le cadre de gauche et glissez-les dans votre émission dans le cadre de droite." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "Alors vous êtes prêt à démarrer!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "Pour une aide plus détaillée, lisez le %smanuel utilisateur%s." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Serveur" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "Partager" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "Port" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Selection du Flux:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "URL" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sAirtime%s %s, est un logiciel libre pour la gestion et l'automation d'une station de radio distante. %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Point de Montage" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%sSourcefabric%s o.p.s. Airtime est distribué sous la licence %sGNU GPL v.3%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "Utilisateur Admin" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "Nouveau mot de passe" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "Mot de Passe Admin" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "S'il vous plaît saisir et confirmer votre nouveau mot de passe dans les champs ci-dessous." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "Le Serveur ne peut être vide." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "S'il vous plaît saisissez votre adresse de courriel. Vous recevrez un lien pour créer un nouveau mot de passe par courriel." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "Le Port ne peut être vide." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "Courriel envoyé" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "Le Point de Montage ne peut être vide avec un serveur Icecast." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "Un courriel a été envoyé" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "Sortie Audio Matérielle" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "Retour à l'écran de connexion" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "Type de Sortie" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "Bienvenue à la démonstration en ligne d'Airtime! Vous pouvez vous connecter en utilisant \"admin\" comme nom d'utilisateur et «admin» comme mot de passe." -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Icecast Metadata Vorbis" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "Précédent:" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "Label du Flux:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "Prochain:" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "Artiste - Titre" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "Sources des Flux" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Emission - Artiste - Titre" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "Source Maitre" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Nom de la Station - Nom de l'Emission" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "Source Emission" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "Métadonnées Hors Antenne" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "Lecture Programmée" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "Activer" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "DIRECT" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "Modifier le Niveau du Gain" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "Ecouter" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "Recherche d'Utilisateurs:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "Heure de la Station" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "v" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "Votre période d'éssai expire dans" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "Enregistrer à partir de 'Line In'?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Achetez votre copie d'Airtime" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "Rediffusion?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "Mon Compte" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "Activer les courriels système (Réinitialisation du mot de passe)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "Gérer les Utilisateurs" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "Réinitialisation du mot de passe Courriel 'De'" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "Nouvel Utilisateur" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "Configuration du Serveur de Courriels" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "id" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "Requier une authentification" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "Prénom" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "Serveur de Courriel" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "Nom" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "Adresse de Courriel" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "Type d'Utilisateur" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "Saisissez les caractères que vous voyez dans l'image ci-dessous." +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "Fichier de Log" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "Le Jour doit être spécifié" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "Résumé du fichier" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "La durée doit être spécifiée" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "Historique Emision" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "Vous devez attendre au moins 1 heure pour retransmettre" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Application par défaut du Framework Zend" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Utiliser l'authentification d'Airtime:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "Page non trouvée!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "Utiliser l'authentification personnalisée:" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "On dirait que la page que vous cherchez n'existe pas!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "Nom d'utilisateur personnalisé" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "Ettendre le bloc Statique" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "Mot de Passe personnalisé" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "Ettendre le Bloc Dynamique" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "Le Champ Nom d'Utilisateur ne peut pas être vide." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "Bloc Intelligent Vide" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "Le Champ Mot de Passe ne peut être vide." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "Liste de Lecture Vide" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "Date de Début:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" +msgstr "Vider le contenu de la Liste de Lecture" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "Durée du fondu enchaîné " +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" +msgstr "Vider" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "Entrez une durée en secondes 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Liste de Lecture Aléatoire" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" -msgstr "Fondu en Entrée par défaut (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Sauvegarde de la Liste de Lecture" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" -msgstr "Fondu en Sorti par défaut (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "Fondu enchainé de la Liste de Lecture" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "Autoriser les sites internet à acceder aux informations de la Programmation ?%s (Activer cette option permettra aux widgets de fonctionner.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "Fondu en entrée:" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "Désactivé" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Fondu en sortie:" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "Activé" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "Pas de Liste de Lecture Ouverte" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "Langue de l'interface par défaut" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" +msgstr "Vider le contenu du bloc intelligent" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" -msgstr "Fuseau horaire de la Station" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(ss.t)" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "La Semaine Commence Le" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "Pas de Bloc Intelligent Ouvert" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" -msgstr "Fuseau horaire de l'Interface:" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" +msgstr "Montrer la Forme d'Onde" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "Courriel" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "Point d'Entrée" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "Récuperer le mot de passe" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(hh:mm:ss.t)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "heures" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Point de Sortie:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "minutes" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "Durée Originale:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "Définir le type de Bloc Intelligent:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "Ajouter cette Emission" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "Statique" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "Mettre à jour l'émission" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "Dynamique" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "Quoi" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "Permettre la Répétition des Pistes:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "Quand" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "Limiter à" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "Entrée du Flux Direct" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "Génération de la liste de lecture et sauvegarde des crières" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "Enregistrement & Rediffusion" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "Générer" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Qui" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "Contenu de la liste de lecture alèatoire" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Style" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "La Limite ne peut être vide ou plus petite que 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "Rediffusion de %s à %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "La Limite ne peut être supérieure à 24 heures" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Selectionner le Pays" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "La valeur doit être un entier" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "La durée doit être supérieure à 0 minute" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "500 est la valeur maximale de l'élément que vous pouvez définir" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "La durée doit être de la forme \"00h 00m\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "Vous devez sélectionner Critères et Modification" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "URL doit être de la forme \"http://domain\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "La 'Durée' doit être au format '00:00:00'" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "L'URL doit être de 512 caractères ou moins" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "La valeur doit être en format d'horodatage (par exemple 0000-00-00 ou 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "Aucun type MIME trouvé pour le Flux Web." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "La valeur doit être numérique" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "Le Nom du Flux Web ne peut être vide" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "La valeur doit être inférieure à 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "Impossible d'analyser la Sélection XSPF" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "La valeur doit être inférieure à %s caractères" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "Impossible d'analyser la Sélection PLS" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "La Valeur ne peut pas être vide" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "Impossible d'analyser la Séléction M3U" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Emission:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "Flux Web Invalide - Ceci semble être un fichier téléchargeable." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "Toutes Mes Emissions:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "Type de flux non reconnu: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "Numéro ISRC:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s déjà examiné(s)." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "Téléverser Automatiquement les Emissions Enregistrées" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s contient un répertoire surveillé imbriqué: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "Activer le Téléversement SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s est imbriqué avec un répertoire surveillé existant: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "Marquer automatiquement les fichiers \"téléchargeable\" sur SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s n'est pas un répertoire valide." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "Courriel SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s est déjà défini comme le répertoire de stockage courant ou dans la liste des dossiers surveillés" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "Mot de Passe SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s est déjà défini comme espace de stockage courant ou dans la liste des répertoires surveillés." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "Tags SoundCloud: (séparer les tags avec des espaces)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s n'existe pas dans la liste surveillée" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "Genre par Défaut:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "Vous ne pouvez pas déplacer les éléments sur les émissions liées" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "Type de Piste par Défaut:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "Le calendrier que vous consultez n'est pas à jour! (décalage calendaire)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "Original" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "La programmation que vous consultez n'est pas à jour! (décalage d'instance)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "Le calendrier que vous consultez n'est pas à jour!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "Direct" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "Vous n'êtes pas autorisé à programme l'émission %s." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "Enregistrement" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "Vous ne pouvez pas ajouter des fichiers à des emissions enregistrées." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "Parlé" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "L émission %s est terminé et ne peut pas être programmé." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "Ballado-diffusion" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "L'émission %s a été précédement mise à jour!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Démo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "Le contenu des émissions liés doit être programmé avant ou après sa diffusion" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "travail en cours" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "Un fichier séléctionné n'existe pas!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "Contenir" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "Le Point d'entré et le point de sortie sont nul." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "Boucle" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "Impossible de définir un point d'entrée plus grand que le point de sortie." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Effet Sonore" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "Ne peut pas fixer un point de sortie plus grand que la durée du fichier." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "Un Court Echantillon" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "Ne peux pas fixer un point de sortie plus petit que le point d'entrée." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Autre" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "Le fichier n'a pas été téléchargé, il y a %s Mo d'espace libre sur le disque et le fichier que vous téléchargez a une taille de %s MB." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "Licence par Défaut:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "Les Emissions peuvent avoir une durée maximale de 24 heures." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "Ce travail est dans le domaine public" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"Ne peux pas programmer des émissions qui se chevauchent. \n" +"Remarque: Le redimensionnement d'une émission répétée affecte l'ensemble de ses répétitions." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "Tous droits réservés" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Bonjour %s, \n" +"\n" +"Cliquez sur ce lien pour réinitialiser votre mot de passe:" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Mot de passe Airtime Réinitialisé" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "Creative Commons Attribution Non Commercial" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "L'enregistrement du fichier n'existe pas" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "Creative Commons Attribution Pas de Travaux Dérivés" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "Afficher les métadonnées du fichier enregistré" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "Creative Commons Attribution Distribution à l'Identique" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Contenu Emission" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "Creative Commons Attribution Non Commercial Pas de Travaux Dérivés" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "Supprimer tous les contenus" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "Creative Commons Attribution Non Commercial Distribution à l'Identique" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "Annuler l'émission en cours" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "Couleur de Fond:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "Editer cette instance" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "Couleur du Texte:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "Edition de l'Emission" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "En Lecture" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "Suppression de l'instance" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "Ajouter un Media" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "Suppression de l'instance et des suivantes" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Audiothèque" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "Permission refusée" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "Calendrier" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "Vous ne pouvez pas faire glisser et déposer des émissions en répétition" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "Système" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "Ne peux pas déplacer une émission diffusée" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "Utilisateurs" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "Ne peux pas déplacer une émission dans le passé" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Répertoires des Médias" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "Impossible de déplacer une émission enregistrée à moins d'1 heure avant ses rediffusions." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Flux" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "L'Emission a été éffacée parce que l'enregistrement de l'émission n'existe pas!" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "Statistiques des Auditeurs" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "Doit attendre 1 heure pour retransmettre." -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" -msgstr "Historique" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" +msgstr "Morceau" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "Historique de Diffusion" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "Joué" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "Modèle d'historique" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "L'année %s doit être comprise entre 1753 - 9999" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "Mise en route" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s n'est pas une date valide" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "Manuel Utilisateur" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s:%s:%s n'est pas une durée valide" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3912,3 +3802,18 @@ msgstr "S'il vous plait, selectionnez une option" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "Aucun Enregistrements" + +#~ msgid "can't resize a past show" +#~ msgstr "Ne peux pas redimmensionner une émission diffusée" + +#~ msgid "Should not overlap shows" +#~ msgstr "Les émissions ne doivent pas se chevaucher" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "Impossible de créer le répertoire \"organize\"." + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "Ce fichier semble être endommagé et ne sera pas ajouté à la médiathèque." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "Le fichier n'a pas été téléchargé, cette erreur peut se produire si le disque dur de l'ordinateur ne dispose pas de suffisamment d'espace libre ou le répertoire stockage ne dispose pas des autorisations d'écriture correctes." diff --git a/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po index 91ca3001bd..a52c0f66b1 100644 --- a/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po @@ -1,34 +1,22 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-02-04 13:38+0000\n" "Last-Translator: andrey.podshivalov\n" "Language-Team: Croatian (Croatia) (http://www.transifex.com/projects/p/airtime/language/hr_HR/)\n" +"Language: hr_HR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: hr_HR\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -49,9 +37,9 @@ msgid "Stop" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "" @@ -60,9 +48,9 @@ msgid "Set Cue In" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "" @@ -84,1719 +72,1447 @@ msgstr "" msgid "Fade Out" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" msgstr "" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" msgstr "" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" msgstr "" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" msgstr "" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "" - -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 -msgid "Shuffle" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" msgstr "" - -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " + +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" msgstr "" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" msgstr "" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" msgstr "" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" msgstr "" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" msgstr "" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" msgstr "" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." msgstr "" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." msgstr "" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" msgstr "" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" msgstr "" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" msgstr "" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" msgstr "" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" msgstr "" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" msgstr "" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" msgstr "" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" msgstr "" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" msgstr "" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" msgstr "" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" msgstr "" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" msgstr "" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" msgstr "" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" msgstr "" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" msgstr "" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" msgstr "" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" msgstr "" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" msgstr "" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" msgstr "" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" msgstr "" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" msgstr "" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" msgstr "" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" msgstr "" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" msgstr "" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" msgstr "" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" msgstr "" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" msgstr "" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" msgstr "" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" msgstr "" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" msgstr "" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" msgstr "" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" msgstr "" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" msgstr "" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" msgstr "" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" msgstr "" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" msgstr "" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" msgstr "" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" msgstr "" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" msgstr "" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" msgstr "" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" msgstr "" -#: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." +#: airtime_mvc/application/controllers/ListenerstatController.php:56 +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 -#, php-format -msgid "%s not found" +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" +#: airtime_mvc/application/controllers/ScheduleController.php:350 +#, php-format +msgid "Rebroadcast of show %s from %s at %s" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:32 @@ -1873,6 +1589,11 @@ msgstr "" msgid "Please select a cursor position on timeline." msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "" @@ -1919,6 +1640,7 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "" @@ -1989,9 +1711,7 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2027,10 +1747,7 @@ msgid "Playlist shuffled" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2056,24 +1773,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2106,6 +1814,11 @@ msgid "" "This will remove the files from your Airtime library!" msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" msgstr "" @@ -2116,9 +1829,7 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2129,22 +1840,12 @@ msgstr "" msgid "The stream is disabled" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "" - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2153,61 +1854,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2215,9 +1891,7 @@ msgid "No result found" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2233,16 +1907,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2398,1510 +2067,1724 @@ msgstr "" msgid "month" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" +#: airtime_mvc/application/controllers/LocaleController.php:254 +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" +#: airtime_mvc/application/controllers/LocaleController.php:255 +msgid "Cancel Current Show?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" +#: airtime_mvc/application/controllers/LocaleController.php:256 +#: airtime_mvc/application/controllers/LocaleController.php:300 +msgid "Stop recording current show?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" +#: airtime_mvc/application/controllers/LocaleController.php:257 +msgid "Ok" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" +#: airtime_mvc/application/controllers/LocaleController.php:258 +msgid "Contents of Show" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" +#: airtime_mvc/application/controllers/LocaleController.php:261 +msgid "Remove all content?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" +#: airtime_mvc/application/controllers/LocaleController.php:263 +msgid "Delete selected item(s)?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" +#: airtime_mvc/application/controllers/LocaleController.php:265 +msgid "End" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" +#: airtime_mvc/application/controllers/LocaleController.php:266 +msgid "Duration" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" +#: airtime_mvc/application/controllers/LocaleController.php:276 +msgid "Show Empty" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" +#: airtime_mvc/application/controllers/LocaleController.php:277 +msgid "Recording From Line In" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" +#: airtime_mvc/application/controllers/LocaleController.php:278 +msgid "Track preview" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:282 +msgid "Cannot schedule outside a show." +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:283 +msgid "Moving 1 Item" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:284 +#, php-format +msgid "Moving %s Items" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:287 +msgid "Fade Editor" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:288 +msgid "Cue Editor" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:289 +msgid "Waveform features are available in a browser supporting the Web Audio API" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:292 +msgid "Select all" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:293 +msgid "Select none" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:294 +msgid "Remove overbooked tracks" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:295 +msgid "Remove selected scheduled items" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:296 +msgid "Jump to the current playing track" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:297 +msgid "Cancel current show" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:302 +msgid "Open library to add or remove content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:305 +msgid "in use" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:255 -msgid "Cancel Current Show?" +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:256 -#: airtime_mvc/application/controllers/LocaleController.php:300 -msgid "Stop recording current show?" +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:257 -msgid "Ok" +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:258 -msgid "Contents of Show" +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:261 -msgid "Remove all content?" +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:263 -msgid "Delete selected item(s)?" +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:265 -msgid "End" +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:266 -msgid "Duration" +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:276 -msgid "Show Empty" +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:277 -msgid "Recording From Line In" +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:278 -msgid "Track preview" +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:282 -msgid "Cannot schedule outside a show." +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:283 -msgid "Moving 1 Item" +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:284 -#, php-format -msgid "Moving %s Items" +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:287 -msgid "Fade Editor" +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:288 -msgid "Cue Editor" +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:292 -msgid "Select all" +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:293 -msgid "Select none" +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:294 -msgid "Remove overbooked tracks" +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:295 -msgid "Remove selected scheduled items" +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:296 -msgid "Jump to the current playing track" +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:297 -msgid "Cancel current show" +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:302 -msgid "Open library to add or remove content" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:305 -msgid "in use" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "" + +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." msgstr "" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" msgstr "" -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." msgstr "" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " msgstr "" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" msgstr "" -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" msgstr "" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " msgstr "" -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " msgstr "" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." msgstr "" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." msgstr "" -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" msgstr "" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" msgstr "" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" msgstr "" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" msgstr "" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" msgstr "" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" msgstr "" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" msgstr "" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" msgstr "" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" msgstr "" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." msgstr "" -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" msgstr "" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" msgstr "" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" msgstr "" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" msgstr "" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" msgstr "" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" msgstr "" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" msgstr "" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" msgstr "" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." msgstr "" -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" msgstr "" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." msgstr "" -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" msgstr "" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" msgstr "" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" msgstr "" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" msgstr "" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" msgstr "" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 diff --git a/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po index 906d6b38aa..14f4e9f65c 100644 --- a/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po @@ -1,35 +1,23 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # Sourcefabric , 2012 msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-01-29 15:11+0000\n" "Last-Translator: andrey.podshivalov\n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/airtime/language/hu_HU/)\n" +"Language: hu_HU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: hu_HU\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime SzerzÅ‘i & másolási jog;Sourcefabric o.p.s. Minden jog fenntartva.%sFejleszti és forgalmazza GNU GPL v.3 alatt a %sSourcefabric o.p.s%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "ÉlÅ‘ adásfolyam" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -50,9 +38,9 @@ msgid "Stop" msgstr "Leállítás" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Felkeverés" @@ -61,9 +49,9 @@ msgid "Set Cue In" msgstr "Felkeverés Beállítása" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Lekeverés" @@ -85,1720 +73,1448 @@ msgstr "Felúsztatás" msgid "Fade Out" msgstr "Leúsztatás" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "Cím" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime SzerzÅ‘i & másolási jog;Sourcefabric o.p.s. Minden jog fenntartva.%sFejleszti és forgalmazza GNU GPL v.3 alatt a %sSourcefabric o.p.s%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "SzerzÅ‘" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "ÉlÅ‘ adásfolyam" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "Engedélyezett:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "Hossz" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "Adatfolyam Típus:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Műfaj" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Bitráta:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "Hangulat" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "Kiszolgálói Típus:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "Címke" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "Csatornák:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "HangszerkesztÅ‘" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Monó" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Sztereó" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "SzerzÅ‘i jog" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Szerver" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Év" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Érvénytelen bevitt karakterek" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "Szám" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "Port" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "Karmester" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "Csak számok adhatók meg." -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "Nyelv" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "Jelszó" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "Kezdési IdÅ‘" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Műfaj" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "Fejezési IdÅ‘" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "URL" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "Lejátszva" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "Név" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "Rögzített fájl nem létezik" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "Leírás" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "A Rögzített Fájl Metaadatai" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Csatolási Pont" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "Megtekintés a SoundCloud-on" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Felhasználónév" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Feltöltés a SoundCloud-ra" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "Admin Felhasználó" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "Újra-feltöltés a SoundCloud-ra" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "Admin Jelszó" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Műsor Tartalom" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Információk lekérdezése a kiszolgálóról..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "Elemek Hozzáadása / Eltávolítása" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "A szerver nem lehet üres." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "Minden Tartalom Eltávolítása" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "A port nem lehet üres." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "Jelenlegi Műsor Megszakítása" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "A csatolási pont nem lehet üres Icecast szerver esetében." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "Szerkesztés Ebben az Esetben" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "Cím:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "Szerkeszt" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "SzerzÅ‘:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "Műsor Szerkesztése" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Album:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "Törlés" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Sorszám:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "Törlés Ebben az Esetben" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Műfaj:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "Törlés Ebben és Minden Más Esetben" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Év:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "Engedély megtagadva" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "Kiadó:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "Nem lehet megismételni a fogd és vidd típusú műsorokat" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "ZeneszerzÅ‘:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "Az elhangzott műsort nem lehet áthelyezni" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "VezénylÅ‘:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "A műsort nem lehet a múltba áthelyezni" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "Hangulat:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "Nem fedhetik egymást a műsorok" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "A rögzített műsort, 1 óránál korábban nem lehet újra közvetíteni." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "SzerzÅ‘i jog:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "A műsor törlésre került, mert a rögzített műsor nem létezik!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "ISRC Szám:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "Az adás újbóli közvetítésére 1 órát kell várni." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "Honlap:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "Beállítások" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "Nyelv:" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Mentés" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "Média Mappák Kezelése" - -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "Adásfolyam/Patak Beállítások" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "Mégse" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Ãltalános Beállítások" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Felhasználónév:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "dB" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "Jelszó:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "KimenÅ‘ Adásfolyam Beállítások" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "Jelszó EllenÅ‘rzés:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Válasszon mappát" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "Vezetéknév:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "Beállítás" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "Keresztnév:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "Jelenlegi Tároló Mappa:" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "E-mail:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "Hozzáadás" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Mobiltelefon:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "A vizsgált mappa újraellenÅ‘rzése (Ez akkor hasznos, ha a hálózati csatolás nincs szinkronban az Airtime-al)" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "A vizsgált mappa eltávolítása" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "Ön nem figyel minden média mappát." +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "Felhasználói Típus:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "Airtime Regisztráció" +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "Vendég" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Segítsen az Airtime fejlesztésében, tudassa velünk az ötleteit. Az információk gyűjtése fokozza a felhasználás élményét.%sKlikk 'Igen, segítek az Airtime-nak' fejlesztésében, és igyekszek folyamatosan a funkciók használatának javításán fáradozni. " +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "DJ" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "Kattintson az alábbi mezÅ‘be, hogy hírdetni szeretném az állomásomat a %sSourcefabric.org%s-on. Annak érdekében, hogy támogassák az Ön állomását, a 'Támogatás Visszajelzés Küldését' engedélyeznie kell." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "ProgramkezelÅ‘" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(KötelezÅ‘)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(csupán ellenÅ‘rzés céljából, nem kerül közzétételre)" +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "Admin" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Megjegyzés: Bármi, ami kisebb nagyobb, mint 600x600, átméretezésre kerül." +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "A login név nem egyedi." -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Mutasd meg, hogy mit küldök" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "Háttérszín:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "Felhasználási Feltételek" +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "Szövegszín:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "Műsorok Keresése" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "Kezdés Ideje:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "Műsor Alapján:" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "Végzés Ideje:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "A jelszó visszaállítása" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Műsor:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Smart Block Beállításai" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "Összes Műsorom:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "vagy" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "napok" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "és" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "A napot meg kell határoznia" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr "-hoz/-hez/-höz" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "Az idÅ‘t meg kell határoznia" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "fájl megfelel a kritériumoknak" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "Az újraközvetítésre legalább 1 órát kell várni" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "a fájl megfelenek a kritériumoknak" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "Tároló Mappa:" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "Kapcsolati URL:" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "Vizsgált Mappák:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Segítse az Airtime fejlesztését azáltal, hogy a Sourcefabric tudja, hogy Ön, hogyan használja azt. Információk összegyűjtése céljából, rendszerezve azokat, hogy fokozza a felhasználás élményét.%sKlikk a 'Támogatási Visszajelzés Küldése' mezÅ‘be és gyÅ‘zÅ‘djön meg arról, hogy a funkciók használatának minÅ‘sége folyamatosan javul." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "Érvénytelen Könyvtár" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "Kattintson az alábbi mezÅ‘be, hogy hírdesse a saját állomását %sSourcefabric.org%s." +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "Felhasználók Keresése:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(Annak érdekében, hogy hírdetni tudja az állomását, a 'Támogatási Visszajelzés Küldését' engedélyeznie kell.)" +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "DJ-k:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Sourcefabric Adatvédelem" +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "Bejelentkezés" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "Bemeneti Adásfolyam Beállítások" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "Gépelje be a képen látható karaktereket." -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "Mester Kapcsolati Forrás URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Ãllomás Név" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "Felülírás" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "Alapértelmezett Ãttünési IdÅ‘tartam (mp):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "adja meg másodpercben 0{0,0}" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "NULLÃZÃS" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "Alapértelmezett Felúsztatás (mp)" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "Műsor Kapcsolati Forrás URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "Alapértelmezett Leúsztatás (mp)" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Válasszon Napot:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "Távoli Weboldalak Engedélyezése \"Ãœtemzés\" Info?%s (Engedélyezi vele a front-end kütyü munkát.)" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "Eltávolítás" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "Letiltva" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Ismétlések Napjai:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "Engedélyezve" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "E-mail / Levelezési Kiszolgáló Beállítások" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "Alapértelmezett Nyelvi Felület" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "SoundCloud Beállítások" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" +msgstr "Ãllomási IdÅ‘zóna:" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "%s Beállítások" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "A Hét Indul" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" -msgstr "Adjon hozzá több elemet" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "Vasárnap" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "Nincs Műsor" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "HétfÅ‘" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "Találat" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "Kedd" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "Adásfolyam" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "Szerda" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "További LehetÅ‘ségek" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "Csütörtök" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "A következÅ‘ információk megjelennek a hallgatók számára, a saját média lejátszóikban:" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(A rádióállomás honlapja)" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "Péntek" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "Adásfolyam URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Szombat" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "ElÅ‘zmények Szűrése" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "Hivatkozás:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Ãœdvözöljük az Airtime-nál!" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "Ismétlés Típusa:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Itt van pár tipp, hogy hogyan is automatizálhatja adásait az Airtime segítségével:" +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "hetente" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "Kezdje médiafájlok hozzáadásával a 'Média Hozzáadása' menü gombon. A hozd és vidd fájlokat ugyanebben az ablakban szerkesztheti." +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "minden második héten" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "Hozzon létre egy műsort a 'Naptár' menüsorban, majd kattintson a '+ Műsor' ikonra. Ez lehet egyszeri vagy ismétlÅ‘dÅ‘ műsor. Csak az adminisztrátorok és a programok vezetÅ‘i adhatnak hozzá műsort." +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "minden harmadik héten" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "Adjon hozzá médiát, hogy a műsora futni tudjon, az Ãœtemezett naptárban, bal egérgombbal kattintva, és itt válassza ki a 'Tartalom Hozzáadása/Eltávolítása' opciót" +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "minden negyedik héten" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Válassza ki a média tartalmat a bal oldali panelen, és húzza azt a műsorba, a jobb oldali panelre." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "havonta" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "És már készen is van!" +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Napok Kiválasztása:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "További segítségért, olvassa el a %shasználati útmutatót%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "Va" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "Rólunk" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "Hé" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sAirtime%s %s, a nyitott rádiós szoftver, az ütemezett és távoli állomás menedzsment. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "Ke" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%sSourcefabric%s o.p.s. az Airtime forgalmazója %sGNU GPL v.3%s alatt" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "Sz" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "Megosztás" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "Cs" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Adásfolyam:" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "Pé" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "elnémítás" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "Sz" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "elnémítás megszüntetése" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "Ãltal Ismételt:" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "Bejelentkezés" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "a hónap napja" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Ãœdvözöljük az online Airtime demó változatában! Jelentkezzen be 'admin' felhasználónévvel és 'admin' jelszóval." +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "a hét napja" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "Kérjük, írja be a fiókja e-mail címét. Kap majd egy linket, új jelszó létrehozásához, e-mailen keresztül." +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "Nincs Vége?" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "E-mail elküldve" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "A befejezési idÅ‘ után kell, hogy legyen kezdési idÅ‘ is." -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "Egy e-mailt elküldtünk" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "Kérjük, válasszon egy ismétlési napot" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "Vissza a belépéshez" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "Új jelszó megerÅ‘sítése" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "Új jelszó" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "A megadott jelszavak nem egyeznek meg." -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "Kérjük, adja meg és erÅ‘sítse meg az új jelszavát az alábbi mezÅ‘kben." +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Új jelszó igénylése" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "Az Ön próba ideje lejár" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "A feltételek megadása" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "napok" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Album" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Vásárolja meg az Ön Airtime másolatát" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Bitráta (Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "Saját Fiókom" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "ElÅ‘zÅ‘:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "HangszerkesztÅ‘" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "KövetkezÅ‘:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "Karmester" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "Az Adásfolyam Forrásai" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "SzerzÅ‘i jog" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "Mester Forrás" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "SzerzÅ‘" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "Műsor Forrás" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Kódolva" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "Ãœtemezett Lejátszás" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "ADÃSBAN" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "Címke" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "Hallgat" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "Nyelv" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "Ãllomás idÅ‘" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "Utoljára Módosítva" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Bezárás" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "Utoljára Játszott" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "Adja hozzá ezt a műsort" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "Hossz" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "A műsor frissítése" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Mime" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "Mi" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "Hangulat" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "Mikor" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "Tulajdonos" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "ÉlÅ‘ Adásfolyam Bemenet" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "Replay Gain" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "Rögzítés & Újrasugárzás" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "Mintavételi Ráta (kHz)" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Ki" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "Cím" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Stílus" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "Műsorszám Sorszáma" -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "Kezdése" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "Feltöltve" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "Szolgáltatás" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "Honlap" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "Ãllapot" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Év" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "ÃœzemidÅ‘" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "Módosítás választása" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "CPU" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "tartalmaz" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "Memória" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "nem tartalmaz" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Airtime Verzió" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "az" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "Lemezterület" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "nem az" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "Fájl importálása folyamatban..." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "vele kezdÅ‘dik" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "Speciális Keresési Beállítások" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "vele végzÅ‘dik" -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "Hallgatói Statisztika" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "több, mint" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "Új" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "kevesebb, mint" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "Új Lejátszási Lista" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "közötti tartományban" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "Új Smart Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "órák" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "Új Adásfolyam" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "percek" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "A leíás megtekíntése / szerkesztése" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "elemek" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "Leírás" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "Smart Block típusa:" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "Adásfolyam URL:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "Statikus" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "Alapértelmezett Hossz:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "Dinamikus" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "Nincs adásfolyam" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "A Számok IsmétlÅ‘dhetnek:" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "Ãœres lejátszási lista tartalom" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "Korlátozva" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "Törlés" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "Lejátszási lista tartalom létrehozása és kritériumok mentése" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Véletlenszerű lejátszási lista" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "Létrehozás" + +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "Véletlenszerű lejátszási lista tartalom" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 #: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 msgid "Shuffle" msgstr "Véletlenszerű" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Lejátszási lista mentése" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "Lejátszási lista átúsztatása" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "Felúsztatás:" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Leúsztatás:" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "Nincs megnyitott lejátszási lista" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "Mutasd a Hullámalakot" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(mm.t)" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "Ãœres smart block tartalom" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "Nincs megnyitott smart block" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "Felkeverés:" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(óó:pp:mm.t)" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Lekeverés:" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "Eredeti Hossz:" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "Statikus Block KibÅ‘vítése" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "Dinamikus Block KibÅ‘vítése" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "Ãœres smart block" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "Ãœres lejátszási lista" - -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Zend Keretrendszeres Alapértelmezett Alkalmazás" - -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "Az oldal nem található!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "Úgy néz ki, az oldal, amit keresett nem létezik!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "Segítség" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "elÅ‘zÅ‘" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "lejátszás" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "szünet" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "következÅ‘" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "leállítás" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "max hangerÅ‘" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "Frissítés Szükséges" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "A lejátszáshoz média szükséges, és frissítenie kell a böngészÅ‘jét egy újabb verzióra, vagy frissítse a %sFlash bÅ‘vítményt%s." - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "Összegzési Sablon Fájl Létrehozása" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "Bejelentkezési Adatlap Sablon Létrehozása" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "Név" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "Adjon hozzá több elemet" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "Új MezÅ‘ Hozzáadása" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "Alapértelmezett Sablon" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "Bejelentkezési Adatlap Sablonok" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "Nincsenek Bejelentkezési Adatlap Sablonok" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "Alapértelmezett" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "Nincs Bejelentkezési Adatlap Sablon" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "A határérték nem lehet üres vagy kisebb, mint 0" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "Összegzési Sablon Fájlok" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "A határérték nem lehet hosszabb, mint 24 óra" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "Nincsenek Összegzési Sablon Fájlok" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "Az érték csak egész szám lehet" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "Új Összegzési Sablon Fájl" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "Maximum 500 elem állítható be" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "A Felhasználók Kezelése" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "Ki kell választania a Kritériumot és a Módosítót" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "Új Felhasználó" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "'Hosszúság' '00:00:00' formában lehet" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "id" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "Az értéknek az alábbi idÅ‘bélyeg formátumban kell lennie (pl. 0000-00-00 vagy 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Felhasználónév" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "Az értéknek numerikusnak kell lennie" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "Vezetéknév" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "Az érték lehet kevesebb, mint 2147483648" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "Keresztnév" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "Az értéknek rövidebb kell lennie, mint %s karakter" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "Felhasználói Típus" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "Az érték nem lehet üres" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "Cím:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "Auto Kikapcs." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "SzerzÅ‘:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "Auto Bekapcs." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Album:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "Úsztatási Ãtmenet Kapcsoló" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Sorszám:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "adja meg az idÅ‘t másodpercekben 00{.000000}" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "Hossz:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "Mester Felhasználónév" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "Mintavételi Ráta:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "Mester Jelszó" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Bitráta:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "Mester Csatlakozás Forrása URL" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "Hangulat:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "Műsor Csatlakozás Forrása URL" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Műfaj:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "Mester Forrás Portja" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Év:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "Mester Csatolási Pont Forrása" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "Kiadó:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Műsor Forrás Portja" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "Műsor Csatolási Pont Forrása" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "ZeneszerzÅ‘:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "Nem használhatja ugyanazt a portot, mint a Master DJ." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "VezénylÅ‘:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "A Port %s jelenleg nem elérhetÅ‘" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "SzerzÅ‘i jog:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Telefon:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "Isrc Szám:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "Az Ãllomás Honlapja:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "Honlap:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "Ország:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "Nyelv:" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "Város:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "Fájl Elérési Útvonal:" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "Ãllomás Leírás:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "Név:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Ãllomás Logó:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "Leírás:" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "Támogatási Visszajelzés Küldése" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Adásfolyam" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "Az állomásom közzététele a Sourcefabric.org-on" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "Dinamikus Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "A mezÅ‘ bejelölésével, elfogadom a Sourcefabric %sadatvédelmi irányelveit%s." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "Statikus Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "El kell fogadnia az adatvédelmi irányelveket." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Audió Sáv" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "Adjon meg egy értéket, nem lehet üres" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "Lejátszási Lista Tartalmak:" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "Kezdési IdÅ‘" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "Statikus Smart Block Tartalmak:" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "Fejezési IdÅ‘" + +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "Nincs Műsor" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "Dinamikus Smart Block Kritériumok:" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "Felvétel a vonalbemenetrÅ‘l?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "Korlátozva" +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "Újraközvetítés?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "URL:" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Airtime Hitelesítés Használata:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "Belépési Adatlap" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "Egyéni Hitelesítés Használata:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "Fájl Összegzés" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "Egyéni Felhasználónév" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "Műsor Összegzés" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "Egyéni Jelszó" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "A műsorok maximum 24 óra hosszúságúak lehetnek." +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "A felhasználónév nem lehet üres." -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "A befejezési dátum/idÅ‘ nem lehet a múltban" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "A jelszó nem lehet üres." -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "Az ütemzés nem fedheti át a műsorokat.\nMegjegyzés: Az ismételt műsorok átméretezése kavarodást okozhat." +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "E-mail" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "elhangzott adást nem lehet átméretezni" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "Jelszó visszaállítás" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "Nem kellene, hogy a műsorok fedjék egymást" +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "Hardver Hangkimenet" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Ország Kiválasztása" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "Kimenet Típusa" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s már megvizsgált." +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Icecast Vorbis Metaadatok" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s tartalmazza a beágyazott vizsgált könyvtárat: %s" +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "Adás Címke:" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s beágyazva a létezÅ‘ vizsgált mappán belül: %s" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "ElÅ‘adó - Cím" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s nem létezÅ‘ könyvtár." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Műsor - ElÅ‘adó - Cím" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s már be van állítva, mint a jelenlegi tároló elérési útvonala vagy a vizsgált mappák listája" +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Ãllomásnév - Műsornév" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s már be van állítva, mint jelenlegi tároló elérési útvonala vagy, a vizsgált mappák listájában." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "Adáson Kívüli - Metaadat" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s nem szerepel a vizsgáltak listáján." +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "Replay Gain Engedélyezése" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "elemek" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "Replay Gain Módosító" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "A fel- és a lekeverés értékei nullák." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%value%' érvénytelen formátum (név@hosztnév)" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "Nem lehet beállítani, mert a lekeverési idÅ‘ nem lehet nagyobb a fájl hosszánál." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%' nem illeszkedik a dátum formához '%format%'" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "Nem lehet beállítani, hogy a felkeverés hosszabb legyen, mint a lekeverés." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%' rövidebb, mint %min% karakter" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "Nem lehet a lekeverés rövidebb, mint a felkeverés." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'% value%' több mint, a %max% karakter" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "A feltételek megadása" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%' nem szerepel '%min%' és '%max%', értékek között" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Bitráta (Kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "A jelszavak nem egyeznek meg" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%value%' az idÅ‘formátum nem illeszkedik 'ÓÓ:pp'" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Kódolva" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "Dátum/IdÅ‘ Kezdés:" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "Utoljára Módosítva" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "Dátum/IdÅ‘ Végzés:" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "Utoljára Játszott" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "IdÅ‘tartam:" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Mime" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "IdÅ‘zóna:" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "Tulajdonos" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "Ismétlések?" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "Replay Gain" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "Műsort nem lehet a múltban létrehozni" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "Mintavételi Ráta (kHz)" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "Nem lehet módosítani a műsor kezdési idÅ‘pontját, ha a műsor már elindult" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "Műsorszám Sorszáma" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "A befejezési dátum/idÅ‘ nem lehet a múltban" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "Feltöltve" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "Nem lehet <0p idÅ‘tartam" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "Honlap" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "Nem lehet 00ó 00p idÅ‘tartam" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "Módosítás választása" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "Nem tarthat tovább, mint 24h" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "tartalmaz" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "Nem fedhetik egymást a műsorok" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "nem tartalmaz" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "Név:" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "az" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "Névtelen Műsor" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "nem az" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "URL:" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "vele kezdÅ‘dik" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "Leírás:" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "vele végzÅ‘dik" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "Rögzített Műsorok Automatikus Feltöltése" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "több, mint" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "SoundCloud Feltöltés Engedélyezése" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "kevesebb, mint" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "Automatikusan Megjelölt Fájlok \"LetölthetÅ‘ek\" a SoundCloud-on" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "közötti tartományban" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "SoundCloud E-mail" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "A hosszúság értékének nagyobb kell lennie, mint 0 perc" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "SoundCloud Jelszó" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "A hosszúság formája \"00ó 00p\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "SoundCloud Címkék: (a címkék elválasztása szóközökkel)" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "Az URL-nek így kell kinéznie \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "Alapértelmezett Műfaj:" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "Az URL-nek rövidebbnek kell lennie 512 karakternél" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "Alapértelmezett Szám Típus:" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "Nem található MIME típus az adásfolyamhoz." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "Eredeti" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "Az adásfolyam neve maradhat üresen" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "Kevert" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "Nem sikerült értelmezni a XSDF lejátszási listát" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "ÉlÅ‘" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "Nem sikerült értelmezni a PLS lejátszási listát" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "Rögzített" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "Nem sikerült értelmezni a M3U lejátszási listát" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "Beszélt" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "Érvénytelen adásfolyam - Úgy néz ki, hogy ez egy fájl letöltés." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "Híresség" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "Ismeretlen típusú adásfolyam: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Demó" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Ãœdv. %s, \n\nErre a hivatkozásra kattintva visszaállíthatja a jelszavát: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "Munka folyamatban" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Airtime Jelszó Visszaállítása" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "Eredet" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "Úrjaközvetítés %s -tól/-tÅ‘l %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "Hurok" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "Nem tud áthelyezni elemeket a kapcsolódó műsorokból" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Hang Hatás" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "A megtekintett ütemterv elavult! (ütem eltérés)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "Egy Lövés Minta" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "A megtekintett ütemterv elavult! (például eltérés)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Más egyéb" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "A megtekintett ütemterv idÅ‘pontja elavult!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "Alapértelmezett Liszensz:" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "Nincs jogosultsága az ütemezett műsorhoz %s." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "A munka a nyilvános felületen folyik" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "Nem adhat hozzá fájlokat a rögzített műsorokhoz." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "Minden jog fenntartva" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "A műsor %s véget ért és nem lehet ütemezni." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "Creative Commons Attribution" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "A műsor %s már korábban frissítve lett!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "Creative Commons Attribution Noncommercial" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "A kapcsolódó műsorok tartalmait bármelyik adás elÅ‘tt vagy után kell ütemezni" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "Creative Commons Attribution No Derivative Works" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "A kiválasztott fájl nem létezik!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "Creative Commons Attribution Share Alike" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "Nem sikerült létrehozni 'szervezÅ‘' könyvtárat." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "Creative Commons Attribution Noncommercial Non Derivate Works" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "A fájl feltöltése sikertelen, mert a szabad lemezterület már csak %s MB a feltöltött fájl mérete pedig %s MB." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "Creative Commons Attribution Noncommercial Share Alike" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "A fájl úgy tűnik sérült, nem került be a médiatárba." +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "Felületi IdÅ‘zóna:" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "A fájl feltöltése sikertelen, valószínű, hogy a számítógép merevlemezén nincs elég hely, vagy a tárolási könyvtár nem rendelkezik megfelelÅ‘ írási engedélyekkel." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "E-mail Rendszer Engedélyezése (Jelszó Visszaállítás)" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "Nincs jogosúltsága a forrás bontásához." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "Jelszó Visszaállítási E-mail" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "Nem csatlakozik forrás az alábbi bemenethez." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "Levelezési Kiszolgáló Beállítása" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "Nincs jogosúltsága a forrás megváltoztatásához." +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "Hitelesítést Igényel" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" -msgstr "A műsor újraközvetítése %s -tól/-tÅ‘l %s a %s" +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "Levelezési Kiszolgáló" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" -msgstr "Letöltés" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "E-mail Cím" #: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "Kérjük, gyÅ‘zÅ‘djön meg arról, hogy az admin felhasználónév/jelszó helyes-e a Rendszer-> Adásfolyamok oldalon." -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "Az Ön számára nem érhetÅ‘ el az alábbi erÅ‘forrás." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Névtelen Adásfolyam" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "Az Ön számára nem érhetÅ‘ el az alábbi erÅ‘forrás." +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Adásfolyam mentve." -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "A fájl nem található az Airtime-ban." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "Érvénytelen érték forma." -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "A fájl nem található az Airtime-ban." +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "Kérjük, adja meg felhasználónevét és jelszavát" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "A fájl nem létezik az Airtime-ban." +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "Hibás felhasználónév vagy jelszó. Kérjük, próbálja meg újra." -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "Helytelen kérés. nincs 'mód' paraméter lett átadva." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "Az e-mailt nem lehetett elküldeni. EllenÅ‘rizze a levelezÅ‘ kiszolgáló beállításait." -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "Helytelen kérés. 'mód' paraméter érvénytelen." +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "Tekintve, hogy e-mail nem található." -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format -msgid "%s not found" -msgstr "%s nem található" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "Valami hiba történt." - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "ElÅ‘nézet" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "Hozzáadás a Lejátszási listához" - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "Hozzáadás a Smart Block-hoz" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "Metaadatok Szerkesztése" +msgid "Rebroadcast of show %s from %s at %s" +msgstr "A műsor újraközvetítése %s -tól/-tÅ‘l %s a %s" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "Lejátszási lista duplikálása" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" +msgstr "Letöltés" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "Felhasználó sikeresen hozzáadva!" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "Nincs elérhetÅ‘ művelet" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "Felhasználó sikeresen módosítva!" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "Nincs engedélye, hogy törölje a kiválasztott elemeket." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "Beállítások sikeresen módosítva!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "Nem sikerült törölni néhány ütemezett fájlt." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "Az oldal nem található" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "Másolás %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Alkalmazás hiba" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1874,6 +1590,11 @@ msgstr "Csak számokat, smart block-okat és adásfolyamokat adhatunk a lejátsz msgid "Please select a cursor position on timeline." msgstr "Kérjük, válasszon kurzor pozíciót az idÅ‘vonalon." +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "Metaadatok Szerkesztése" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "Adja hozzá a kiválasztott műsort" @@ -1920,6 +1641,7 @@ msgstr "Betöltés..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "Összes" @@ -1990,9 +1712,7 @@ msgstr "A bemenet formája lehet: óó:pp:mm.t" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "Ön jelenleg fájlokat tölt fel. %sHa másik ablakot nyit meg, akkor a feltöltési folyamat megszakad. %sBiztos benne, hogy elhagyja az oldalt?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2028,10 +1748,7 @@ msgid "Playlist shuffled" msgstr "Lejátszási lista megkeverve" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "Az Airtime bizonytalan a fájl állapotával kapcsolatban. Lehetséges, hogy a tárhely már nem elérhetÅ‘, vagy a 'vizsgált' mappa útvonala megváltozott." #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2057,24 +1774,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "A képek lehetnek: jpg, jpeg, png, vagy gif" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "A statikus smart block elmenti a kritériumokat és azonnal létre is hozza a block tartalmát is. Ez lehetÅ‘vé teszi, hogy módosítsuk és lássuk a könyvtár tartalmát még a műsor közvetítése elÅ‘tt." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "A dinamikus smart block csak elmenti a kritériumokat. A block-ot szerkesztés után lehet hozzáadni a műsorhoz. KésÅ‘bb a tartalmát sem megtekinteni, sem módosítani nem lehet." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "A kívánt blokkhosszúság nem elérhetÅ‘, mert az Airtime nem talál elég egyedi műsorszámot, ami megfelelne a kritériumoknak. Engedélyezze ezt az opciót, ha azt szeretné, hogy egyes számok ismétlÅ‘djenek." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2105,7 +1813,14 @@ msgstr "Válasszon Vizsgált Mappát" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "Biztos benne, hogy meg akarja változtatni a tároló mappát?\nEzzel eltávolítja a fájlokat az Airtime médiatárából!" +msgstr "" +"Biztos benne, hogy meg akarja változtatni a tároló mappát?\n" +"Ezzel eltávolítja a fájlokat az Airtime médiatárából!" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "Média Mappák Kezelése" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2117,9 +1832,7 @@ msgstr "Ez az útvonal jelenleg nem elérhetÅ‘." #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "Egyes patak típusokhoz extra beállítások szükségesek. További részletek: a %sAAC+ Támogatással%s vagy a %sOpus Támogatással%s kapcsolatban." #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2130,22 +1843,12 @@ msgstr "Csatlakozva az adás kiszolgálóhoz" msgid "The stream is disabled" msgstr "Az adásfolyam ki van kapcsolva" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Információk lekérdezése a kiszolgálóról..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "Nem lehet kapcsolódni az adásfolyam kiszolgálójához" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "Ha az Airtime mögött van egy router vagy egy tűzfal, akkor be kell állítani a továbbító porot, mert ezen a területen az információ helytelen lesz. Ebben az esetben manuálisan kell frissíteni ezen a területen, hogy mutassa a hosztot / portot / csatolási pontot, amelyre a DJ-k csatlakozhatnak. A megengedett tartomány 1024 és 49151 között van." #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2154,61 +1857,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "A további részletekért, kérjük, olvassa el az %sAirtime Kézikönyvét%s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "Jelölje be és ellenÅ‘rizze ezt az opciót: metaadatok engedélyezése OGG-os adásfolyamra (adatfolyam metaadatok: a műsorszám címe, elÅ‘adó, műsornév, amely megjelenik egy audió lejátszóban). A VLC és mplayer lejátszóknál súlyos hibák elÅ‘fordulhatnak, OGG/Vorbis adatfolyam játszásakor, amelynél a metaadatok küldése engedélyezett: ilyenkor akadozik az adatfolyam. Ha az OGG-os adatfolyam és a hallgatói nem igényelnek támogatást az ilyen jellegű audió lejátszókhoz, akkor nyugodtan engedélyezze ezt az opciót." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "Jelölje be ezt a négyzetet, hogy automatikusan kikapcsol a Mester/Műsor a forrás megszakítása után." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "Jelölje be ezt a négyzetet, hogy automatikusan bekapcsol a Mester/Műsor a forrás csatlakozását követÅ‘en." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "Lehet, hogy az Ön Icecast kiszolgálója nem igényli a 'forrás' felhasználónevét, ez a mezÅ‘ üresen maradhat." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "Ha az Ön élÅ‘ adásfolyam kliense nem igényel felhasználónevet, akkor meg kell adnia a 'forrást'." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "Ha megváltoztatja a felhasználónév vagy a jelszó értékeit, az engedélyezett adatfolyam és a lejátszási motor újraindul, és a hallgatók 5-10 másodpercig csendet fognak hallani. Módosítása az alábbi mezÅ‘ket, ez NEM okoz újraindítást: Adásfolyam Címke (Ãltalános Beállítások), és a Úsztatási Ãtmenet Kapcsoló, Mester Felhasználónév, Mester Jelszó (BejövÅ‘ Adatfolyam Beállítások). Ha az Airtime éppen rögzít, és ha a változás miatt újra kell indítani a lejátszási motort, akkor a vételezés megszakad." #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "Ez az admin felhasználónév és jelszó az Icecast/SHOUTcast hallgató statisztikához szükségesek." #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2216,9 +1894,7 @@ msgid "No result found" msgstr "Nem volt találat" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "Ezt követi ugyanolyan biztonsági műsor-minta: csak a hozzárendelt felhasználók csatlakozhatnak a műsorhoz." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2234,16 +1910,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "Figyelem: a Műsorokat nem lehet újra-linkelni" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "Az ismétlÅ‘dÅ‘ műsorok összekötésével, minden ütemezett médiai elem, az összes ismétlÅ‘dÅ‘ műsorban, ugyanazt a sorrendet kapja, mint a többi ismétlÅ‘dÅ‘ műsorban" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "Az idÅ‘zóna az Ãllomási IdÅ‘zóna szerint van alapértelmezetten beállítva. A naptárban megjelenÅ‘ helyi idÅ‘t a Felületi IdÅ‘zóna menüpontban módosíthatja, a felhasználói beállításoknál." #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2391,87 +2062,16 @@ msgstr "ma" msgid "day" msgstr "nap" -#: airtime_mvc/application/controllers/LocaleController.php:238 -msgid "week" -msgstr "hét" - -#: airtime_mvc/application/controllers/LocaleController.php:239 -msgid "month" -msgstr "hónap" - -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "Vasárnap" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "HétfÅ‘" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "Kedd" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "Szerda" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "Csütörtök" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "Péntek" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Szombat" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "Va" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "Hé" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "Ke" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "Sz" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "Cs" - -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "Pé" - -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "Sz" +#: airtime_mvc/application/controllers/LocaleController.php:238 +msgid "week" +msgstr "hét" + +#: airtime_mvc/application/controllers/LocaleController.php:239 +msgid "month" +msgstr "hónap" #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Ha egy műsor hosszabb az ütemezett idÅ‘nél, meg lesz vágva és követi azt a következÅ‘ műsor." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2499,6 +2099,11 @@ msgstr "Az összes tartalom eltávolítása?" msgid "Delete selected item(s)?" msgstr "Törli a kiválasztott elem(ek)et?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "Kezdése" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "Vége" @@ -2532,14 +2137,6 @@ msgstr "1 Elem Ãthelyezése" msgid "Moving %s Items" msgstr "%s Elemek Ãthelyezése" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "Mégse" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "Úsztatási SzerkesztÅ‘" @@ -2549,8 +2146,7 @@ msgid "Cue Editor" msgstr "Keverési SzerkesztÅ‘" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "Hullámalak funkciók állnak rendelkezésre a böngészÅ‘ben, támogatja a Web Audio API-t" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2577,1333 +2173,1627 @@ msgstr "Ugrás a jelenleg hallható számra" msgid "Cancel current show" msgstr "A jelenlegi műsor megszakítása" -#: airtime_mvc/application/controllers/LocaleController.php:302 -msgid "Open library to add or remove content" -msgstr "A médiatár megnyitása az elemek hozzáadásához vagy eltávolításához" +#: airtime_mvc/application/controllers/LocaleController.php:302 +msgid "Open library to add or remove content" +msgstr "A médiatár megnyitása az elemek hozzáadásához vagy eltávolításához" + +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "Elemek Hozzáadása / Eltávolítása" + +#: airtime_mvc/application/controllers/LocaleController.php:305 +msgid "in use" +msgstr "használatban van" + +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "Lemez" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "Nézze meg" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "Megnyitás" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "A vendégek a kÅ‘vetkezÅ‘ket tehetik:" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "Az ütemezés megtekintése" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "A műsor tartalmának megtekintése" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "A DJ-k a következÅ‘ket tehetik:" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "Minden kijelölt műsor tartalom kezelése" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "Médiafájlok hozzáadása" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "Lejátszási listák, smart block-ok és adatfolyamok létrehozása" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "Saját médiatár tartalmának kezelése" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "A Program VezetÅ‘k a következÅ‘ket tehetik:" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "Minden tartalom megtekintése és kezelése" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "A műsorok ütemzései" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "A teljes médiatár tartalmának kezelése" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "Az Adminok a következÅ‘ket tehetik:" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "Beállítások kezelései" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "A felhasználók kezelése" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "A vizsgált mappák kezelése" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "A rendszer állapot megtekitnése" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "Hozzáférés lejátszási elÅ‘zményekhez" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "A hallgatói statisztikák megtekintése" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "Az oszlopok megjelenítése/elrejtése" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "{from} -tól/-tÅ‘l {to} -ig" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "kbps" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "éééé-hh-nn" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" +msgstr "óó:pp:mm.t" + +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" +msgstr "kHz" + +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" +msgstr "Va" + +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" +msgstr "Hé" + +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" +msgstr "Ke" + +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" +msgstr "Sze" + +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" +msgstr "Cs" + +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" +msgstr "Pé" + +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" +msgstr "Szo" + +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Bezárás" + +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" +msgstr "Óra" + +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" +msgstr "Perc" + +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" +msgstr "Kész" + +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" +msgstr "Fájlok kiválasztása" + +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." +msgstr "Adja meg a fájlokat feltöltési sorrendben, majd kattintson a gombra." + +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "Ãllapot" + +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" +msgstr "Fájlok Hozzáadása" + +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" +msgstr "Feltöltés Megszakítása" + +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" +msgstr "Feltöltés indítása" + +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" +msgstr "Fájlok hozzáadása" + +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" +msgstr "Feltöltve %d/%d fájl" + +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" +msgstr "N/A" + +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." +msgstr "Húzza a fájlokat ide." + +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." +msgstr "Fájlkiterjesztési hiba." + +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." +msgstr "Fájlméreti hiba." + +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." +msgstr "Fájl számi hiba." + +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." +msgstr "Init hiba." -#: airtime_mvc/application/controllers/LocaleController.php:305 -msgid "in use" -msgstr "használatban van" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." +msgstr "HTTP Hiba." -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" -msgstr "Lemez" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." +msgstr "Biztonsági hiba." -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" -msgstr "Nézze meg" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." +msgstr "Ãltalános hiba." -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" -msgstr "Megnyitás" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." +msgstr "IO hiba." -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "Admin" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" +msgstr "Fájl: %s" -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "DJ" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" +msgstr "%d várakozó fájl" -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "ProgramkezelÅ‘" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" +msgstr "Fájl: %f,méret: %s, max fájl méret: %m" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "Vendég" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" +msgstr "URL feltöltése esetén, felléphet hiba, esetleg nem létezik" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" -msgstr "A vendégek a kÅ‘vetkezÅ‘ket tehetik:" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " +msgstr "Hiba: A fájl túl nagy:" -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" -msgstr "Az ütemezés megtekintése" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " +msgstr "Hiba: Érvénytelen fájl kiterjesztés:" -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" -msgstr "A műsor tartalmának megtekintése" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "Alapértelmezett" -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" -msgstr "A DJ-k a következÅ‘ket tehetik:" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" +msgstr "Belépés Létrehozása" -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" -msgstr "Minden kijelölt műsor tartalom kezelése" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" +msgstr "ElÅ‘zmények Szerkesztése" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" -msgstr "Médiafájlok hozzáadása" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" +msgstr "%s sor%s van másolva a vágólapra" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" -msgstr "Lejátszási listák, smart block-ok és adatfolyamok létrehozása" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." +msgstr "%sNyomtatási elÅ‘nézet%sKérjük, használja böngészÅ‘je nyomtatási beállításait. Nyomja meg az Esc-t ha végzett." -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" -msgstr "Saját médiatár tartalmának kezelése" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "Nincs jogosúltsága a forrás bontásához." -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" -msgstr "A Program VezetÅ‘k a következÅ‘ket tehetik:" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "Nem csatlakozik forrás az alábbi bemenethez." -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" -msgstr "Minden tartalom megtekintése és kezelése" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "Nincs jogosúltsága a forrás megváltoztatásához." -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" -msgstr "A műsorok ütemzései" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "Ön egy régebbi verziót tekint meg %s" -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" -msgstr "A teljes médiatár tartalmának kezelése" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "Nem adhat számokat dinamikus block-okhoz." -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" -msgstr "Az Adminok a következÅ‘ket tehetik:" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%s nem található" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" -msgstr "Beállítások kezelései" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "Nincs engedélye, hogy törölje a kiválasztott %s." -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" -msgstr "A felhasználók kezelése" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "Valami hiba történt." -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "A vizsgált mappák kezelése" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "Csak számokat lehet hozzáadni smart block-hoz." -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "Támogatási Visszajelzés Küldése" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "Névtelen Lejátszási Lista" -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" -msgstr "A rendszer állapot megtekitnése" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Névtelen Smart Block" -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" -msgstr "Hozzáférés lejátszási elÅ‘zményekhez" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "Ismeretlen Lejátszási Lista" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" -msgstr "A hallgatói statisztikák megtekintése" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "Az Ön számára nem érhetÅ‘ el az alábbi erÅ‘forrás." -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" -msgstr "Az oszlopok megjelenítése/elrejtése" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "Az Ön számára nem érhetÅ‘ el az alábbi erÅ‘forrás." -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" -msgstr "{from} -tól/-tÅ‘l {to} -ig" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "A fájl nem található az Airtime-ban." -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" -msgstr "kbps" +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "A fájl nem található az Airtime-ban." -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" -msgstr "éééé-hh-nn" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "A fájl nem létezik az Airtime-ban." -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" -msgstr "óó:pp:mm.t" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "Helytelen kérés. nincs 'mód' paraméter lett átadva." -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" -msgstr "kHz" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "Helytelen kérés. 'mód' paraméter érvénytelen." -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" -msgstr "Va" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "ElÅ‘nézet" -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" -msgstr "Hé" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "Hozzáadás a Lejátszási listához" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" -msgstr "Ke" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "Hozzáadás a Smart Block-hoz" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "Törlés" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" -msgstr "Sze" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "Lejátszási lista duplikálása" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" -msgstr "Cs" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "Szerkeszt" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" -msgstr "Pé" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "Soundcloud" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" -msgstr "Szo" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "Megtekintés a SoundCloud-on" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" -msgstr "Óra" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "Újra-feltöltés a SoundCloud-ra" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" -msgstr "Perc" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Feltöltés a SoundCloud-ra" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" -msgstr "Kész" +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "Nincs elérhetÅ‘ művelet" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" -msgstr "Fájlok kiválasztása" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "Nincs engedélye, hogy törölje a kiválasztott elemeket." -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." -msgstr "Adja meg a fájlokat feltöltési sorrendben, majd kattintson a gombra." +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "Nem sikerült törölni néhány ütemezett fájlt." -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" -msgstr "Fájlok Hozzáadása" +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "Másolás %s" -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" -msgstr "Feltöltés Megszakítása" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Kurzor kiválasztása" -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" -msgstr "Feltöltés indítása" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "Kurzor eltávolítása" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" -msgstr "Fájlok hozzáadása" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "a műsor nem található" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" -msgstr "Feltöltve %d/%d fájl" +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." +msgstr "Beállítások frissítve." -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" -msgstr "N/A" +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." +msgstr "Támogatási beállítások frissítve." -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." -msgstr "Húzza a fájlokat ide." +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" +msgstr "Támogatási Visszajelzés" -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." -msgstr "Fájlkiterjesztési hiba." +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." +msgstr "Adásfolyam Beállítások Frissítve." -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." -msgstr "Fájlméreti hiba." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" +msgstr "az útvonalat meg kell határozni" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." -msgstr "Fájl számi hiba." +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." +msgstr "Probléma lépett fel a Liquidsoap-al..." -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." -msgstr "Init hiba." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "Most Játszott" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." -msgstr "HTTP Hiba." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "Média Hozzáadása" -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." -msgstr "Biztonsági hiba." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Médiatár" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." -msgstr "Ãltalános hiba." +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "Naptár" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." -msgstr "IO hiba." +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "Rendszer" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" -msgstr "Fájl: %s" +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "Beállítások" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" -msgstr "%d várakozó fájl" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "Felhasználók" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" -msgstr "Fájl: %f,méret: %s, max fájl méret: %m" +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Média Mappák" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" -msgstr "URL feltöltése esetén, felléphet hiba, esetleg nem létezik" +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Adásfolyamok" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " -msgstr "Hiba: A fájl túl nagy:" +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "Hallgatói Statisztikák" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " -msgstr "Hiba: Érvénytelen fájl kiterjesztés:" +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "ElÅ‘zmények" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" -msgstr "Belépés Létrehozása" +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "Lejátszási ElÅ‘zmények" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" -msgstr "ElÅ‘zmények Szerkesztése" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "ElÅ‘zményi Sablonok" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" -msgstr "%s sor%s van másolva a vágólapra" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "Segítség" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." -msgstr "%sNyomtatási elÅ‘nézet%sKérjük, használja böngészÅ‘je nyomtatási beállításait. Nyomja meg az Esc-t ha végzett." +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "ElsÅ‘ Lépések" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "Kérjük, adja meg felhasználónevét és jelszavát" +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "Felhasználói Kézikönyv" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "Hibás felhasználónév vagy jelszó. Kérjük, próbálja meg újra." +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "Rólunk" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "Az e-mailt nem lehetett elküldeni. EllenÅ‘rizze a levelezÅ‘ kiszolgáló beállításait." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "Szolgáltatás" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "Tekintve, hogy e-mail nem található." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "ÃœzemidÅ‘" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." -msgstr "Beállítások frissítve." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "CPU" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." -msgstr "Támogatási beállítások frissítve." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "Memória" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" -msgstr "Támogatási Visszajelzés" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Airtime Verzió" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." -msgstr "Adásfolyam Beállítások Frissítve." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "Lemezterület" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" -msgstr "az útvonalat meg kell határozni" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "E-mail / Levelezési Kiszolgáló Beállítások" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." -msgstr "Probléma lépett fel a Liquidsoap-al..." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "SoundCloud Beállítások" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Kurzor kiválasztása" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Ismétlések Napjai:" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "Kurzor eltávolítása" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "Eltávolítás" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "a műsor nem található" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "Hozzáadás" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Névtelen Adásfolyam" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "Kapcsolati URL:" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Adásfolyam mentve." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "Bemeneti Adásfolyam Beállítások" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "Érvénytelen érték forma." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "Mester Kapcsolati Forrás URL:" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "Ön egy régebbi verziót tekint meg %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "Felülírás" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "Nem adhat számokat dinamikus block-okhoz." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "OK" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "Nincs engedélye, hogy törölje a kiválasztott %s." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "NULLÃZÃS" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "Csak számokat lehet hozzáadni smart block-hoz." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "Műsor Kapcsolati Forrás URL:" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "Névtelen Lejátszási Lista" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(KötelezÅ‘)" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Névtelen Smart Block" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "Airtime Regisztráció" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "Ismeretlen Lejátszási Lista" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Segítsen az Airtime fejlesztésében, tudassa velünk az ötleteit. Az információk gyűjtése fokozza a felhasználás élményét.%sKlikk 'Igen, segítek az Airtime-nak' fejlesztésében, és igyekszek folyamatosan a funkciók használatának javításán fáradozni. " -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "Az oldal nem található" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "Kattintson az alábbi mezÅ‘be, hogy hírdetni szeretném az állomásomat a %sSourcefabric.org%s-on. Annak érdekében, hogy támogassák az Ön állomását, a 'Támogatás Visszajelzés Küldését' engedélyeznie kell." -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Alkalmazás hiba" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(csupán ellenÅ‘rzés céljából, nem kerül közzétételre)" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "Felhasználó sikeresen hozzáadva!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Megjegyzés: Bármi, ami kisebb nagyobb, mint 600x600, átméretezésre kerül." -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "Felhasználó sikeresen módosítva!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Mutasd meg, hogy mit küldök" -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "Beállítások sikeresen módosítva!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "Felhasználási Feltételek" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "Az évnek %s 1753 - 9999 közötti tartományban kell lennie" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "A jelszó visszaállítása" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s érvénytelen dátum" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Válasszon mappát" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s:%s:%s érvénytelen idÅ‘pont" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "Beállítás" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "Névtelen Műsor" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "Jelenlegi Tároló Mappa:" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "Tároló Mappa:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "A vizsgált mappa újraellenÅ‘rzése (Ez akkor hasznos, ha a hálózati csatolás nincs szinkronban az Airtime-al)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "Vizsgált Mappák:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "A vizsgált mappa eltávolítása" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "Érvénytelen Könyvtár" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "Ön nem figyel minden média mappát." -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Felhasználónév:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "Adásfolyam" -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "Jelszó:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "További LehetÅ‘ségek" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "Jelszó EllenÅ‘rzés:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "A következÅ‘ információk megjelennek a hallgatók számára, a saját média lejátszóikban:" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "Vezetéknév:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(A rádióállomás honlapja)" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "Keresztnév:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "Adásfolyam URL:" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "E-mail:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "ElÅ‘zmények Szűrése" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Mobiltelefon:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "Műsorok Keresése" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "Műsor Alapján:" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "%s Beállítások" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "Felhasználói Típus:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Segítse az Airtime fejlesztését azáltal, hogy a Sourcefabric tudja, hogy Ön, hogyan használja azt. Információk összegyűjtése céljából, rendszerezve azokat, hogy fokozza a felhasználás élményét.%sKlikk a 'Támogatási Visszajelzés Küldése' mezÅ‘be és gyÅ‘zÅ‘djön meg arról, hogy a funkciók használatának minÅ‘sége folyamatosan javul." -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "A login név nem egyedi." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "Kattintson az alábbi mezÅ‘be, hogy hírdesse a saját állomását %sSourcefabric.org%s." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "Auto Kikapcs." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(Annak érdekében, hogy hírdetni tudja az állomását, a 'Támogatási Visszajelzés Küldését' engedélyeznie kell.)" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "Auto Bekapcs." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Sourcefabric Adatvédelem" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "Úsztatási Ãtmenet Kapcsoló" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "Adjon hozzá több elemet" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "adja meg az idÅ‘t másodpercekben 00{.000000}" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "Találat" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "Mester Felhasználónév" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Válasszon Napot:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "Mester Jelszó" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Smart Block Beállításai" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "Mester Csatlakozás Forrása URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "vagy" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "Műsor Csatlakozás Forrása URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "és" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "Mester Forrás Portja" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr "-hoz/-hez/-höz" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "Csak számok adhatók meg." +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "fájl megfelel a kritériumoknak" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "Mester Csatolási Pont Forrása" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "a fájl megfelenek a kritériumoknak" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Érvénytelen bevitt karakterek" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "Összegzési Sablon Fájl Létrehozása" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Műsor Forrás Portja" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "Bejelentkezési Adatlap Sablon Létrehozása" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "Műsor Csatolási Pont Forrása" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "Adjon hozzá több elemet" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "Nem használhatja ugyanazt a portot, mint a Master DJ." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "Új MezÅ‘ Hozzáadása" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "A Port %s jelenleg nem elérhetÅ‘" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "Alapértelmezett Sablon" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%value%' az idÅ‘formátum nem illeszkedik 'ÓÓ:pp'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" +msgstr "Bejelentkezési Adatlap Sablonok" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "Dátum/IdÅ‘ Kezdés:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "Nincsenek Bejelentkezési Adatlap Sablonok" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "Dátum/IdÅ‘ Végzés:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "Nincs Bejelentkezési Adatlap Sablon" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "IdÅ‘tartam:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" +msgstr "Összegzési Sablon Fájlok" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "IdÅ‘zóna:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" +msgstr "Nincsenek Összegzési Sablon Fájlok" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "Ismétlések?" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "Új Összegzési Sablon Fájl" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "Műsort nem lehet a múltban létrehozni" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "Új" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "Nem lehet módosítani a műsor kezdési idÅ‘pontját, ha a műsor már elindult" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "Új Lejátszási Lista" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "Nem lehet <0p idÅ‘tartam" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "Új Smart Block" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "Nem lehet 00ó 00p idÅ‘tartam" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "Új Adásfolyam" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "Nem tarthat tovább, mint 24h" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "A leíás megtekíntése / szerkesztése" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" -msgstr "Hivatkozás:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "Adásfolyam URL:" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "Ismétlés Típusa:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "Alapértelmezett Hossz:" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "hetente" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "Nincs adásfolyam" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" -msgstr "minden második héten" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "Adásfolyam/Patak Beállítások" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" -msgstr "minden harmadik héten" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Ãltalános Beállítások" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" -msgstr "minden negyedik héten" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "dB" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "KimenÅ‘ Adásfolyam Beállítások" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "havonta" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "Fájl importálása folyamatban..." -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Napok Kiválasztása:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "Speciális Keresési Beállítások" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "Ãltal Ismételt:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "elÅ‘zÅ‘" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "a hónap napja" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "lejátszás" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "a hét napja" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "szünet" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "Végzés Ideje:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "következÅ‘" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "Nincs Vége?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "leállítás" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "A befejezési idÅ‘ után kell, hogy legyen kezdési idÅ‘ is." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "elnémítás" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "Kérjük, válasszon egy ismétlési napot" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "elnémítás megszüntetése" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "Adjon meg egy értéket, nem lehet üres" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "max hangerÅ‘" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "Jelszó" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "Frissítés Szükséges" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "Új jelszó megerÅ‘sítése" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "A lejátszáshoz média szükséges, és frissítenie kell a böngészÅ‘jét egy újabb verzióra, vagy frissítse a %sFlash bÅ‘vítményt%s." -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "A megadott jelszavak nem egyeznek meg." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "Hossz:" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Új jelszó igénylése" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "Mintavételi Ráta:" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Ãllomás Név" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "Isrc Szám:" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Telefon:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "Fájl Elérési Útvonal:" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "Az Ãllomás Honlapja:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Adásfolyam" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "Ország:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "Dinamikus Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "Város:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "Statikus Smart Block" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "Ãllomás Leírás:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Audió Sáv" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Ãllomás Logó:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "Lejátszási Lista Tartalmak:" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "Az állomásom közzététele a Sourcefabric.org-on" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "Statikus Smart Block Tartalmak:" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "A mezÅ‘ bejelölésével, elfogadom a Sourcefabric %sadatvédelmi irányelveit%s." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "Dinamikus Smart Block Kritériumok:" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "El kell fogadnia az adatvédelmi irányelveket." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "Korlátozva" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%value%' érvénytelen formátum (név@hosztnév)" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%' nem illeszkedik a dátum formához '%format%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%' rövidebb, mint %min% karakter" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'% value%' több mint, a %max% karakter" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "Hallgatói Statisztika" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%' nem szerepel '%min%' és '%max%', értékek között" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Ãœdvözöljük az Airtime-nál!" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "A jelszavak nem egyeznek meg" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Itt van pár tipp, hogy hogyan is automatizálhatja adásait az Airtime segítségével:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "Engedélyezett:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "Kezdje médiafájlok hozzáadásával a 'Média Hozzáadása' menü gombon. A hozd és vidd fájlokat ugyanebben az ablakban szerkesztheti." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "Adatfolyam Típus:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "Hozzon létre egy műsort a 'Naptár' menüsorban, majd kattintson a '+ Műsor' ikonra. Ez lehet egyszeri vagy ismétlÅ‘dÅ‘ műsor. Csak az adminisztrátorok és a programok vezetÅ‘i adhatnak hozzá műsort." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "Kiszolgálói Típus:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "Adjon hozzá médiát, hogy a műsora futni tudjon, az Ãœtemezett naptárban, bal egérgombbal kattintva, és itt válassza ki a 'Tartalom Hozzáadása/Eltávolítása' opciót" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "Csatornák:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Válassza ki a média tartalmat a bal oldali panelen, és húzza azt a műsorba, a jobb oldali panelre." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Monó" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "És már készen is van!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Sztereó" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "További segítségért, olvassa el a %shasználati útmutatót%s." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Szerver" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "Megosztás" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "Port" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Adásfolyam:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "URL" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sAirtime%s %s, a nyitott rádiós szoftver, az ütemezett és távoli állomás menedzsment. %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Csatolási Pont" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%sSourcefabric%s o.p.s. az Airtime forgalmazója %sGNU GPL v.3%s alatt" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "Admin Felhasználó" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "Új jelszó" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "Admin Jelszó" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "Kérjük, adja meg és erÅ‘sítse meg az új jelszavát az alábbi mezÅ‘kben." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "A szerver nem lehet üres." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "Kérjük, írja be a fiókja e-mail címét. Kap majd egy linket, új jelszó létrehozásához, e-mailen keresztül." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "A port nem lehet üres." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "E-mail elküldve" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "A csatolási pont nem lehet üres Icecast szerver esetében." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "Egy e-mailt elküldtünk" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "Hardver Hangkimenet" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "Vissza a belépéshez" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "Kimenet Típusa" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "Ãœdvözöljük az online Airtime demó változatában! Jelentkezzen be 'admin' felhasználónévvel és 'admin' jelszóval." -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Icecast Vorbis Metaadatok" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "ElÅ‘zÅ‘:" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "Adás Címke:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "KövetkezÅ‘:" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "ElÅ‘adó - Cím" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "Az Adásfolyam Forrásai" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Műsor - ElÅ‘adó - Cím" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "Mester Forrás" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Ãllomásnév - Műsornév" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "Műsor Forrás" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "Adáson Kívüli - Metaadat" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "Ãœtemezett Lejátszás" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "Replay Gain Engedélyezése" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "ADÃSBAN" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "Replay Gain Módosító" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "Hallgat" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "Felhasználók Keresése:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "Ãllomás idÅ‘" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "DJ-k:" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "Az Ön próba ideje lejár" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "Felvétel a vonalbemenetrÅ‘l?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Vásárolja meg az Ön Airtime másolatát" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "Újraközvetítés?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "Saját Fiókom" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "E-mail Rendszer Engedélyezése (Jelszó Visszaállítás)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "A Felhasználók Kezelése" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "Jelszó Visszaállítási E-mail" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "Új Felhasználó" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "Levelezési Kiszolgáló Beállítása" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "id" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "Hitelesítést Igényel" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "Vezetéknév" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "Levelezési Kiszolgáló" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "Keresztnév" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "E-mail Cím" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "Felhasználói Típus" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "Gépelje be a képen látható karaktereket." +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "Belépési Adatlap" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "A napot meg kell határoznia" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "Fájl Összegzés" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "Az idÅ‘t meg kell határoznia" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "Műsor Összegzés" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "Az újraközvetítésre legalább 1 órát kell várni" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Zend Keretrendszeres Alapértelmezett Alkalmazás" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Airtime Hitelesítés Használata:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "Az oldal nem található!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "Egyéni Hitelesítés Használata:" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "Úgy néz ki, az oldal, amit keresett nem létezik!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "Egyéni Felhasználónév" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "Statikus Block KibÅ‘vítése" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "Egyéni Jelszó" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "Dinamikus Block KibÅ‘vítése" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "A felhasználónév nem lehet üres." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "Ãœres smart block" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "A jelszó nem lehet üres." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "Ãœres lejátszási lista" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "Kezdés Ideje:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" +msgstr "Ãœres lejátszási lista tartalom" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "Alapértelmezett Ãttünési IdÅ‘tartam (mp):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" +msgstr "Törlés" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "adja meg másodpercben 0{0,0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Véletlenszerű lejátszási lista" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" -msgstr "Alapértelmezett Felúsztatás (mp)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Lejátszási lista mentése" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" -msgstr "Alapértelmezett Leúsztatás (mp)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "Lejátszási lista átúsztatása" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "Távoli Weboldalak Engedélyezése \"Ãœtemzés\" Info?%s (Engedélyezi vele a front-end kütyü munkát.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "Felúsztatás:" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "Letiltva" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Leúsztatás:" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "Engedélyezve" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "Nincs megnyitott lejátszási lista" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "Alapértelmezett Nyelvi Felület" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" +msgstr "Ãœres smart block tartalom" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" -msgstr "Ãllomási IdÅ‘zóna:" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(mm.t)" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "A Hét Indul" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "Nincs megnyitott smart block" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" -msgstr "Felületi IdÅ‘zóna:" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" +msgstr "Mutasd a Hullámalakot" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "Felkeverés:" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "Jelszó visszaállítás" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(óó:pp:mm.t)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "órák" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Lekeverés:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "percek" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "Eredeti Hossz:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "Smart Block típusa:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "Adja hozzá ezt a műsort" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "Statikus" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "A műsor frissítése" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "Dinamikus" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "Mi" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "A Számok IsmétlÅ‘dhetnek:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "Mikor" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "Korlátozva" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "ÉlÅ‘ Adásfolyam Bemenet" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "Lejátszási lista tartalom létrehozása és kritériumok mentése" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "Rögzítés & Újrasugárzás" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "Létrehozás" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Ki" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "Véletlenszerű lejátszási lista tartalom" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Stílus" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "A határérték nem lehet üres vagy kisebb, mint 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "Úrjaközvetítés %s -tól/-tÅ‘l %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "A határérték nem lehet hosszabb, mint 24 óra" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Ország Kiválasztása" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "Az érték csak egész szám lehet" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "A hosszúság értékének nagyobb kell lennie, mint 0 perc" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "Maximum 500 elem állítható be" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "A hosszúság formája \"00ó 00p\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "Ki kell választania a Kritériumot és a Módosítót" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "Az URL-nek így kell kinéznie \"http://domain\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "'Hosszúság' '00:00:00' formában lehet" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "Az URL-nek rövidebbnek kell lennie 512 karakternél" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "Az értéknek az alábbi idÅ‘bélyeg formátumban kell lennie (pl. 0000-00-00 vagy 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "Nem található MIME típus az adásfolyamhoz." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "Az értéknek numerikusnak kell lennie" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "Az adásfolyam neve maradhat üresen" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "Az érték lehet kevesebb, mint 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "Nem sikerült értelmezni a XSDF lejátszási listát" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "Az értéknek rövidebb kell lennie, mint %s karakter" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "Nem sikerült értelmezni a PLS lejátszási listát" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "Az érték nem lehet üres" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "Nem sikerült értelmezni a M3U lejátszási listát" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Műsor:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "Érvénytelen adásfolyam - Úgy néz ki, hogy ez egy fájl letöltés." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "Összes Műsorom:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "Ismeretlen típusú adásfolyam: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "ISRC Szám:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s már megvizsgált." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "Rögzített Műsorok Automatikus Feltöltése" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s tartalmazza a beágyazott vizsgált könyvtárat: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "SoundCloud Feltöltés Engedélyezése" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s beágyazva a létezÅ‘ vizsgált mappán belül: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "Automatikusan Megjelölt Fájlok \"LetölthetÅ‘ek\" a SoundCloud-on" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s nem létezÅ‘ könyvtár." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "SoundCloud E-mail" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s már be van állítva, mint a jelenlegi tároló elérési útvonala vagy a vizsgált mappák listája" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "SoundCloud Jelszó" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s már be van állítva, mint jelenlegi tároló elérési útvonala vagy, a vizsgált mappák listájában." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "SoundCloud Címkék: (a címkék elválasztása szóközökkel)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s nem szerepel a vizsgáltak listáján." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "Alapértelmezett Műfaj:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "Nem tud áthelyezni elemeket a kapcsolódó műsorokból" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "Alapértelmezett Szám Típus:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "A megtekintett ütemterv elavult! (ütem eltérés)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "Eredeti" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "A megtekintett ütemterv elavult! (például eltérés)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "Kevert" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "A megtekintett ütemterv idÅ‘pontja elavult!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "ÉlÅ‘" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "Nincs jogosultsága az ütemezett műsorhoz %s." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "Rögzített" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "Nem adhat hozzá fájlokat a rögzített műsorokhoz." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "Beszélt" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "A műsor %s véget ért és nem lehet ütemezni." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "Híresség" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "A műsor %s már korábban frissítve lett!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Demó" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "A kapcsolódó műsorok tartalmait bármelyik adás elÅ‘tt vagy után kell ütemezni" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "Munka folyamatban" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "A kiválasztott fájl nem létezik!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "Eredet" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "A fel- és a lekeverés értékei nullák." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "Hurok" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "Nem lehet beállítani, hogy a felkeverés hosszabb legyen, mint a lekeverés." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Hang Hatás" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "Nem lehet beállítani, mert a lekeverési idÅ‘ nem lehet nagyobb a fájl hosszánál." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "Egy Lövés Minta" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "Nem lehet a lekeverés rövidebb, mint a felkeverés." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Más egyéb" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "A fájl feltöltése sikertelen, mert a szabad lemezterület már csak %s MB a feltöltött fájl mérete pedig %s MB." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "Alapértelmezett Liszensz:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "A műsorok maximum 24 óra hosszúságúak lehetnek." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "A munka a nyilvános felületen folyik" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"Az ütemzés nem fedheti át a műsorokat.\n" +"Megjegyzés: Az ismételt műsorok átméretezése kavarodást okozhat." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "Minden jog fenntartva" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Ãœdv. %s, \n" +"\n" +"Erre a hivatkozásra kattintva visszaállíthatja a jelszavát: " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Airtime Jelszó Visszaállítása" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "Creative Commons Attribution Noncommercial" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "Rögzített fájl nem létezik" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "Creative Commons Attribution No Derivative Works" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "A Rögzített Fájl Metaadatai" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "Creative Commons Attribution Share Alike" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Műsor Tartalom" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "Creative Commons Attribution Noncommercial Non Derivate Works" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "Minden Tartalom Eltávolítása" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "Creative Commons Attribution Noncommercial Share Alike" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "Jelenlegi Műsor Megszakítása" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "Háttérszín:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "Szerkesztés Ebben az Esetben" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "Szövegszín:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "Műsor Szerkesztése" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "Most Játszott" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "Törlés Ebben az Esetben" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "Média Hozzáadása" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "Törlés Ebben és Minden Más Esetben" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Médiatár" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "Engedély megtagadva" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "Naptár" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "Nem lehet megismételni a fogd és vidd típusú műsorokat" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "Rendszer" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "Az elhangzott műsort nem lehet áthelyezni" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "Felhasználók" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "A műsort nem lehet a múltba áthelyezni" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Média Mappák" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "A rögzített műsort, 1 óránál korábban nem lehet újra közvetíteni." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Adásfolyamok" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "A műsor törlésre került, mert a rögzített műsor nem létezik!" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "Hallgatói Statisztikák" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "Az adás újbóli közvetítésére 1 órát kell várni." -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" -msgstr "ElÅ‘zmények" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" +msgstr "Szám" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "Lejátszási ElÅ‘zmények" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "Lejátszva" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "ElÅ‘zményi Sablonok" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "Az évnek %s 1753 - 9999 közötti tartományban kell lennie" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "ElsÅ‘ Lépések" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s érvénytelen dátum" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "Felhasználói Kézikönyv" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s:%s:%s érvénytelen idÅ‘pont" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3912,3 +3802,18 @@ msgstr "Kérjük, válasszon egy lehetÅ‘séget" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "Nincsennek Nyilvántartások" + +#~ msgid "can't resize a past show" +#~ msgstr "elhangzott adást nem lehet átméretezni" + +#~ msgid "Should not overlap shows" +#~ msgstr "Nem kellene, hogy a műsorok fedjék egymást" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "Nem sikerült létrehozni 'szervezÅ‘' könyvtárat." + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "A fájl úgy tűnik sérült, nem került be a médiatárba." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "A fájl feltöltése sikertelen, valószínű, hogy a számítógép merevlemezén nincs elég hely, vagy a tárolási könyvtár nem rendelkezik megfelelÅ‘ írási engedélyekkel." diff --git a/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po b/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po index d1e1ab52cd..585a87c34f 100644 --- a/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po @@ -1,7 +1,7 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # danse , 2014 # Sourcefabric , 2012 @@ -9,28 +9,16 @@ msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-02-04 20:40+0000\n" "Last-Translator: danse \n" "Language-Team: Italian (Italy) (http://www.transifex.com/projects/p/airtime/language/it_IT/)\n" +"Language: it_IT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: it_IT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime Copyright ©Sourcefabric o.p.s.Tutti i diritti riservati.%sMantenuto e distribuito sotto GNU GPL v.3 da %sSourcefabric o.p.s%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "Live stream" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -51,9 +39,9 @@ msgid "Stop" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Cue In" @@ -62,9 +50,9 @@ msgid "Set Cue In" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Cue Out" @@ -86,1720 +74,1448 @@ msgstr "Dissolvenza in entrata" msgid "Fade Out" msgstr "Dissolvenza in uscita" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "Titolo" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime Copyright ©Sourcefabric o.p.s.Tutti i diritti riservati.%sMantenuto e distribuito sotto GNU GPL v.3 da %sSourcefabric o.p.s%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "Creatore" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "Live stream" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "Attiva:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "Lunghezza" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "Tipo di stream:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Genere" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Velocità di trasmissione: " -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "Genere (Mood)" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "Tipo di servizio:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "Etichetta" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "Canali:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "Compositore" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Mono" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Stereo" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "Copyright" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Server" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Anno" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Carattere inserito non valido" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "Port" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "Conduttore" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "Solo numeri." -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "Lingua" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "Password" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Genere" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "URL" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "Riprodotti" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "Nome" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "Descrizione" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "Vedi file registrati Metadata" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Mount Point" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "Vedi su SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Nome utente" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Carica su SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "Carica su SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Contenuto show" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Ottenere informazioni dal server..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "Aggiungi/Rimuovi contenuto" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "Il server non è libero." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "Rimuovi il contenuto" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "Il port non può essere libero." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "Cancella show attuale" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "Mount non può essere vuoto con il server Icecast." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "Titolo:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "Edita" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "Creatore:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "Edita show" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Album:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "Cancella" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Traccia:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "Cancella esempio" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Genere:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "Cancella esempio e tutto il seguito" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Anno:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "Etichetta:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "Non puoi spostare show ripetuti" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "Compositore:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "Non puoi spostare uno show passato" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "Conduttore:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "Non puoi spostare uno show nel passato" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "Umore:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "Non puoi sovrascrivere gli show" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "Non puoi spostare uno show registrato meno di un'ora prima che sia ritrasmesso." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "Copyright:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "Lo show è stato cancellato perché lo show registrato non esiste!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "Numero ISRC :" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "Devi aspettare un'ora prima di ritrasmettere." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "Sito web:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "Preferenze" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "Lingua:" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Salva" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "Gestisci cartelle media" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "Cancella" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "Impostazioni Stream" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Username:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Setting globale" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "Password:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "Impostazioni Output Stream" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "Nome:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Scegli cartella" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "Cognome:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "Imposta" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "E-mail:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "Importa cartelle:" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Cellulare:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "Aggiungi " +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "Ripeti elenco visionato (Questo è utile se c'è da eseguire montaggio di rete e può essere fuori sincronizzazione con Airtime)" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "Rimuovi elenco visionato" +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "tipo di utente:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "Sta guardando i cataloghi media." +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "Ospite" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "Registro Airtime" +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "DJ" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Aiuti Airtime a migliorare facendoci sapere come lo sta usando. Questa informazione sarà raccolta regolarmente per migliorare.%sClicchi 'Si, aiuta Airtime e noi ci assicureremo che i servizi da lei usati migliorino." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "Programma direttore" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "Clicchi sotto per pubblicare la sua stazione su %sSourcefabric.org%s. Per promuovere la sua stazione, 'Spedisca aderenza feedback' deve essere abilitato. Questi dati saranno raccolti." +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "Amministratore " -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(Richiesto)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(per scopi di verifica, non ci saranno pubblicazioni)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Note: La lunghezze superiori a 600x600 saranno ridimensionate." - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Mostra cosa sto inviando" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "Termini e condizioni" - -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "Trova Shows" +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "Il nome utente esiste già ." -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "Filtri Show:" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "Colore sfondo:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "Reimposta password" +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "Colore testo:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Opzioni di blocco intelligente" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "Data inizio:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "Data fine:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Show:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr "a" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "Tutti i miei show:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "Files e criteri" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "giorni" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "File e criteri" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "Il giorno deve essere specificato" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "Connessioni URL:" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "L'ora dev'essere specificata" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Aiuti Airtime a migliorare facendo sapere a Sourcefabric come lo sta usandolo. Queste informazioni saranno raccolte regolarmente per migliorare. %s Clicchi su 'Spedisca aderenza feedback'e noi ci assicureremo che i servizi da lei usati stanno migliorando." +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "Aspettare almeno un'ora prima di ritrasmettere" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "Clicchi sotto per promuovere la sua Stazione su %sSourcefabric.org%s." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "Importa Folder:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(Per promuovere la sua stazione, 'Spedisca aderenza feedback' deve essere abilitato)." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "Folder visionati:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Trattamento dati Sourcefabric" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "Catalogo non valido" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "Impostazioni Input Stream" +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "Cerca utenti:" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "Domini di connessione alla fonte URL:" +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "Dj:" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "Sovrascrivi" +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "Accedi" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "Ok" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "Digita le parole del riquadro." -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "Azzera" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Nome stazione" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "Mostra connessioni alla fonte URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Scegli giorni:" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "inserisci il tempo in secondi 0{.0}" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "Rimuovi" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Ripeti giorni:" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "Impostazioni sistema di servizio e-mail / posta" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "Permetti alla connessione remota dei siti di accedere\"Programma\" Info? %s(Abilita i widgets frontali.)" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "Impostazioni SoundCloud" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "Disattivato" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "Abilitato" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "La settimana inizia il" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "Stream" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "Domenica" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "Opzioni aggiuntive" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "Lunedì" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "La seguente informazione sarà esposta agli ascoltatori nelle loro eseguzione:" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "Martedì" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(Il sito della tua radio)" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "Mercoledì" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "Stream URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "Giovedì" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "Filtra storia" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "Venerdì" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Benvenuti in Airtime!" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Sabato" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Può cominciato ad usare tAirtime per automatizzare le sue trasmissioni:" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "Cominci aggiungendo i suoi file alla biblioteca usando 'Aggiunga Media'. Può trascinare e trasportare i suoi file in questa finestra." +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "Ripeti tipo:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "Crea show cliccando su 'Calendario' nel menu e cliccando l'icona 'Show'. Questo può essere uno show di una volta o a ripetizione. Solamente l'amministratore e il direttore del programma possono aggiungere show." +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "settimanalmente" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "Aggiunga media allo show selezionando il suo show nel calendario, cliccando sul sinistro e selezionando 'Aggiungi/Rimuovi Contenuto'" +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Selezioni i suoi media dal pannello sinistro e trascini al suo show nel pannello destro." +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "Può andare!" +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "Per aiuto dettagliato, legga %suser manual%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "mensilmente" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "Chi siamo" +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Seleziona giorni:" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sAirtime%s %s, il software di radio aperto per elencare e gestione di stazione remota. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "Dom" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%sSourcefabric%s o.p.s. Airtime è distribuito da %sGNU GPL v.%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "Lun" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "Mar" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Seleziona stream:" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "Mer" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "disattiva microfono" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "Gio" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "attiva microfono" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "Ven" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "Accedi" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "Sab" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Benvenuti al demo online Airtime! Può accedere usando l'username 'consenti' e la password 'consenti'." +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "Prego inserire la sua e-mail. Riceverà un link per creare una nuova password via e-mail-" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "E-mail inviata" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "Una e-mail è stata inviata" +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "Ripeti all'infinito?" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "Indietro a schermo login" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "La data di fine deve essere posteriore a quella di inizio" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "Nuova password" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "Prego inserire e confermare la sua nuova password nel seguente spazio." +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "Conferma nuova password" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "La sua versione di prova scade entro" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "La password di conferma non corrisponde con la sua password." -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "giorni" +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Inserisci nuova password" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Acquisti la sua copia Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "Seleziona criteri" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "Account personale" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Album" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "Precedente:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Bit Rate (kbps)" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "Successivo:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "Source Streams" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "Compositore" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "Fonte principale" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "Conduttore" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "Mostra fonte" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "Copyright" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "Programmazione play" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "Creatore" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "IN ONDA" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Codificato da" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "Ascolta" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "Orario di stazione" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Chiudi" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "Aggiungi show" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "Aggiorna show" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "Cosa" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "Quando" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "Ingresso Stream diretta" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "Registra e ritrasmetti" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Chi" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Stile" - -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "Start" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "Servizi" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "Stato" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "Durata" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "CPU" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "Memoria" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Versione Airtime" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "Spazio disco" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "File importato in corso..." - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "Opzioni di ricerca avanzate" - -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "Programma in ascolto troppo lungo" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "Nuovo" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "Nuova playlist" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "Nuovo blocca intelligente " - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "Nuove produzioni web" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "Vedi/edita descrizione" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "Descrizione" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "Stream URL:" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "Lunghezza predefinita:" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "No webstream" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Riproduzione casuale" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 -msgid "Shuffle" -msgstr "Casuale" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Salva playlist" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "Playlist crossfade" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "Dissolvenza in entrata:" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Dissolvenza in chiusura:" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "Non aprire playlist" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "Etichetta" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "Lingua" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "Non aprire blocco intelligente" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "Ultima modifica" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "Cue in:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "Ultima esecuzione" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(hh:mm:ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "Lunghezza" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Cue Out:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Formato (Mime)" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "Lunghezza originale:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "Genere (Mood)" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "Espandi blocco statico" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "Proprietario" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "Espandi blocco dinamico " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "Ripeti" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "Blocco intelligente vuoto" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "Velocità campione (kHz)" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "Playlist vuota" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "Titolo" -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Zend Framework Default Application" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "Numero traccia" -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "Pagina non trovata!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "Caricato" -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "La pagina che stai cercando non esiste! " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "Sito web" -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "Aiuto" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Anno" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "precedente" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "Seleziona modificatore" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "riproduci" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "contiene" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "pausa" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "non contiene" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "next" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "è " -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "stop" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "non è" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "volume massimo" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "inizia con" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "Aggiornamenti richiesti" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "finisce con" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "Per riproduzione media, avrà bisogno di aggiornare il suo browser ad una recente versione o aggiornare il suo %sFlash plugin%s." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "è più di" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "è meno di" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "nella seguenza" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "Nome" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "ore" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "minuti" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "elementi" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "Inserisci blocco intelligente" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "Statico" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "Dinamico" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "Permetti ripetizione tracce" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "Limitato a " -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "Genera contenuto playlist e salva criteri" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "Genere" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "Eseguzione casuale playlist" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "Gestione utenti" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle" +msgstr "Casuale" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "Nuovo Utente" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "Il margine non può essere vuoto o più piccolo di 0" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "id" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "Il margine non può superare le 24ore" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Nome utente" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "Il valore deve essere un numero intero" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "Nome" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "500 è il limite massimo di elementi che può inserire" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "Cognome" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "Devi selezionare da Criteri e Modifica" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "Tipo di utente" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "La lunghezza deve essere nel formato '00:00:00'" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "Titolo:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "Il valore deve essere nel formato (es. 0000-00-00 o 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "Creatore:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "Il valore deve essere numerico" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Album:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "Il valore deve essere inferiore a 2147483648" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Traccia:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "Il valore deve essere inferiore a %s caratteri" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "Lunghezza" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "Il valore non deve essere vuoto" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "Percentuale" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "Spegnimento automatico" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Velocità di trasmissione: " +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "Accensione automatica" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "Umore:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "Cambia dissolvenza di transizione " -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Genere:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "inserisci il tempo in secondi" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Anno:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "Username principale" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "Etichetta:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "Password principale" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "Principale fonte di connessione URL" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "Compositore:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "Mostra la connessione fonte URL" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "Conduttore:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "Principale fonte Port" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "Copyright:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "Fonte principale Mount Point" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "Numero ISRC:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Mostra fonte Port" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "Sito web:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "Mostra fonte Mount Point" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "Lingua:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "Non può usare lo stesso port del principale Dj port." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "Port %s non disponibile" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "Nome:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Telefono:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "Descrizione:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "Stazione sito web:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Web Stream" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "Paese:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "Blocco intelligente e dinamico" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "Città :" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "Blocco intelligente e statico" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "Descrizione stazione:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Traccia audio" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Logo stazione: " -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "Contenuti playlist:" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "Invia supporto feedback:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "Contenuto di blocco intelligente e statico:" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "Promuovi la mia stazione su Sourcefabric.org" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "Criteri di blocco intelligenti e dinamici:" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "Spuntando questo box, acconsento il trattamento dei miei dati personali attraverso la %sprivacy policy%s di Sourcefabric." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "Limiti" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "Autorizzo il trattamento dei miei dati personali." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "URL:" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "Il calore richiesto non può rimanere vuoto" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" msgstr "" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "Gli show possono avere una lunghezza massima di 24 ore." +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "Registra da Line In?" + +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "Ritrasmetti?" + +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Usa autenticazione Airtime:" + +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "Usa autenticazione clienti:" + +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "Personalizza nome utente " -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "L'ora e la data finale non possono precedere quelle iniziali" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "Personalizza Password" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "Non si possono programmare show sovrapposti.\n Note: Ridimensionare uno slot a ripetizione colpisce tutte le sue ripetizioni." +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "Il campo nome utente non può rimanere vuoto." -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "Non puoi ridimensionare uno show passato" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "Il campo della password non può rimanere vuoto." -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "Non si devono sovrapporre gli show" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "E-mail" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Seleziona paese" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "Ripristina password" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s è già stato visionato." +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "Produzione Audio dell'hardware" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s contiene una sotto directory già visionata: %s" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "Tipo di Output" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s annidato con una directory già visionata: %s" +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Icecast Vorbis Metadata" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s non è una directory valida." +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "Etichetta Stream:" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s è già impostato come attuale cartella archivio o appartiene alle cartelle visionate" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "Artista - Titolo" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s è già impostato come attuale cartella archivio o appartiene alle cartelle visionate." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Show - Artista - Titolo" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s non esiste nella lista delle cartelle visionate." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Nome stazione - Nome show" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "elementi" +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "Cue in e cue out sono nulli." +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "Il cue out non può essere più grande della lunghezza del file." +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "Il cue in non può essere più grande del cue out." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%value%' non è valido l'indirizzo e-mail nella forma base local-part@hostname" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "Il cue out non può essere più piccolo del cue in." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%' non va bene con il formato data '%formato%'" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "Seleziona criteri" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%' è più corto di %min% caratteri" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Bit Rate (kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%value%' è più lungo di %max% caratteri" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%' non è tra '%min%' e '%max%' compresi" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Codificato da" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "Ultima modifica" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%value%' non si adatta al formato dell'ora 'HH:mm'" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "Ultima esecuzione" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "Data/Ora inizio:" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Formato (Mime)" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "Data/Ora fine:" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "Proprietario" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "Durata:" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "Ripeti" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "Velocità campione (kHz)" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "Ripetizioni?" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "Numero traccia" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "Non creare show al passato" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "Caricato" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "Non modificare data e ora di inizio degli slot in eseguzione" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "Sito web" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "L'ora e la data finale non possono precedere quelle iniziali" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "Seleziona modificatore" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "Non ci può essere una durata <0m" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "contiene" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "Non ci può essere una durata 00h 00m" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "non contiene" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "Non ci può essere una durata superiore a 24h" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "è " +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "Non puoi sovrascrivere gli show" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "non è" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "Nome:" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "inizia con" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "Show senza nome" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "finisce con" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "URL:" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "è più di" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "Descrizione:" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "è meno di" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "Caricamento automatico Show registrati" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "nella seguenza" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "Abilità caricamento SoudCloud" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "La lunghezza deve superare 0 minuti" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "File contrassegnati automaticamente\"Scaricabili\" da SoundCloud" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "La lunghezza deve essere nella forma \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "E-mail SoudCloud" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "URL deve essere nella forma \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "Password SoudCloud" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "URL dove essere di 512 caratteri o meno" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "Tag SoundCloud: (separare i tag con uno spazio)" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "Nessun MIME type trovato per le webstream." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "Impostazione predefinita genere:" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "Webstream non può essere vuoto" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "Impostazione predefinita tipo di traccia:" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "Non è possibile analizzare le playlist XSPF " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "Originale" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "Non è possibile analizzare le playlist PLS" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "Remix" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "Non è possibile analizzare le playlist M3U" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "Live" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "Webstream non valido - Questo potrebbe essere un file scaricato." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "Registra" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "Tipo di stream sconosciuto: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "Parlato" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Ciao %s, \n\n Clicca questo link per reimpostare la tua password:" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "Podcast" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Reimposta la password di Airtime" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Demo" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "Ritrasmetti da %s a %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "Elaborazione in corso" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "Origine" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "Il programma che sta visionando è fuori data! (disadattamento dell'orario)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr " Riprodurre a ciclo continuo" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "Il programma che sta visionando è fuori data! (disadattamento dell'esempio)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Effetto sonoro" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "Il programma che sta visionando è fuori data!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "Campione singolo" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "Non è abilitato all'elenco degli show%s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Altro" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "Non può aggiungere file a show registrati." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "Licenza predefinita:" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "Lo show % supera la lunghezza massima e non può essere programmato." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "Il lavoro è nel dominio pubblico" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "Lo show %s è già stato aggiornato! " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "Tutti i diritti riservati" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "Creative Commons Attribution" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "Il File selezionato non esiste!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "Creative Commons Attribution Noncommercial" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "Impossibile creare 'organize' directory." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "Creative Commons Attribution No Derivate Works" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "Il file non è stato caricato, sono rimasti %s MB di spazio ed il file in caricamento ha una lunghezza di %s MB." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "Creative Commons Attribution Share Alike" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "Il file risulta corrotto e non sarà aggiunto nella biblioteca." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "Creative Commons Attribution Noncommercial Non Derivate Works" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "Il file non è stato caricato, l'errore si può ripresentare se il disco rigido del computer non ha abbastanza spazio o il catalogo degli archivi non ha i giusti permessi." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "Creative Commons Attribution Noncommercial Share Alike" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "Non è consentito disconnettersi dalla fonte." +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "Nessuna fonte connessa a questo ingresso." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "Abilita E-mail di Sistema (reimposta password)" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "Non ha il permesso per cambiare fonte." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "Reimposta password dalla E-mail" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" -msgstr "Ritrasmetti show %s da %s a %s" +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "Configura Mail del Server" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" -msgstr "Scarica" +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "Richiede l'autentificazione" + +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "Mail Server" + +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "Indirizzo e-mail" #: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "Non è permesso l'accesso alla risorsa." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Webstream senza titolo" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "Non è permesso l'accesso alla risorsa." +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Webstream salvate." -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "Il file non esiste in Airtime." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "Valori non validi." -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "Il file non esiste in Airtime" +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "Inserisca per favore il suo nome utente e password" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "Il file non esiste in Airtime." +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "Nome utente o password forniti errati. Per favore riprovi." -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "Richiesta errata. 'modalità ' parametro non riuscito." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "L' e-mail non può essere inviata. Controlli le impostazioni della sua mail e si accerti che è stata configurata correttamente." -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "Richiesta errata. 'modalità ' parametro non valido" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "E-mail inserita non trovata." -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format -msgid "%s not found" -msgstr "%s non trovato" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "Qualcosa è andato storto." - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "Anteprima" +msgid "Rebroadcast of show %s from %s at %s" +msgstr "Ritrasmetti show %s da %s a %s" -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "Aggiungi a playlist" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" +msgstr "Scarica" -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "Aggiungi al blocco intelligente" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "User aggiunto con successo!" -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "Edita Metadata" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "User aggiornato con successo!" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "SoundCloud" - -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "Nessuna azione disponibile" - -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "Non ha il permesso per cancellare gli elementi selezionati." - -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "Non può cancellare i file programmati." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "Pagina non trovata" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Errore applicazione " #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1875,6 +1591,11 @@ msgstr "Puoi solo aggiungere tracce, blocchi intelligenti, e webstreams alle pla msgid "Please select a cursor position on timeline." msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "Edita Metadata" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "Aggiungi agli show selezionati" @@ -1921,6 +1642,7 @@ msgstr "Caricamento..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "Tutto" @@ -1991,9 +1713,7 @@ msgstr "L'ingresso deve essere nel formato : hh:mm:ss.t" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "Stai attualmente scaricando file. %sCambiando schermata cancellerà il processo di caricamento. %sSei sicuro di voler abbandonare la pagina?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2029,10 +1749,7 @@ msgid "Playlist shuffled" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "Airtime è insicuro sullo stato del file. °Questo può accadere quando il file è su un drive remoto che non è accessibile o il file è su un elenco che non viene più visionato." #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2058,24 +1775,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "L'immagine deve essere in formato jpg, jpeg, png, oppure gif" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "Uno statico blocco intelligente salverà i criteri e genererà il blocco del contenuto immediatamente. Questo permette di modificare e vedere la biblioteca prima di aggiungerla allo show." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "Un dinamico blocco intelligente salverà i criteri. Il contenuto del blocco sarà generato per aggiungerlo ad un show. Non riuscirà a vedere e modificare il contenuto della Biblioteca." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "Alla lunghezza di blocco desiderata non si arriverà se Airtime non può trovare abbastanza tracce uniche per accoppiare i suoi criteri.Abiliti questa scelta se desidera permettere alle tracce di essere aggiunte molteplici volte al blocco intelligente." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2106,7 +1814,14 @@ msgstr "Scelga le cartelle da guardare" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "E' sicuro di voler cambiare l'archivio delle cartelle?\n Questo rimuoverà i file dal suo archivio Airtime!" +msgstr "" +"E' sicuro di voler cambiare l'archivio delle cartelle?\n" +" Questo rimuoverà i file dal suo archivio Airtime!" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "Gestisci cartelle media" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2118,9 +1833,7 @@ msgstr "Questo percorso non è accessibile attualmente." #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2131,22 +1844,12 @@ msgstr "Connesso al server di streaming." msgid "The stream is disabled" msgstr "Stream disattivato" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Ottenere informazioni dal server..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "Non può connettersi al server di streaming" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "Se Airtime è dietro un router o firewall, può avere bisogno di configurare il trasferimento e queste informazioni di campo saranno incorrette. In questo caso avrò bisogno di aggiornare manualmente questo campo per mostrare ospite/trasferimento/installa di cui il suo Dj ha bisogno per connettersi. La serie permessa è tra 1024 e 49151." #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2155,61 +1858,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "Per maggiori informazioni, legga per favore il %sManuale Airtime%s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "Controllo questa opzione per abilitare metadata per le stream OGG (lo stream metadata è il titolo della traccia,artista, e nome dello show esposto in un audio player). VLC e mplayer riscontrano un grave errore nel eseguire le stream OGG/VORBIS che ha abilitata l'informazione metadata:si disconnetterà lo stream dopo ogni canzone. Se sta usando uno stream OGG ed i suoi ascoltatori non richiedono supporto nelle eseguzionu audio, può scegliere di abilitare questa opzione." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "Controlli questo spazio per uscire automaticamente dalla fonte Master/Show." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "Controlli questo spazio per accendere automaticamente alla fonte di Master / Show su collegamento di fonte." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "Se il suo server Icecast si aspetta un nome utente di 'fonte', questo spazio può essere lasciato in bianco." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "Se la live stream non risponde al nome utente, questo campo dovrebbe essere 'fonte'." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "Se cambia in nome utente o la password per uno stream il playout sarà riavviato ed i suoi ascoltatori sentiranno silenzio per 5-10 secondi.Cambiando i seguenti campi non ci sarà un riavvio: Etichetta Stream (Impostazioni Globali), e Cambia dissolvenza di transizione, Nome utente e Password (Impostazioni Stream di immissione).Se Airtime sta registrando, e se il cambio provoca un nuovo inizio di motore di emissione, la registrazione sarà interrotta" #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2217,9 +1895,7 @@ msgid "No result found" msgstr "Nessun risultato trovato" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "Questo segue lo stesso modello di sicurezza per gli show: solo gli utenti assegnati allo show possono connettersi." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2235,16 +1911,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2400,79 +2071,8 @@ msgstr "settimana" msgid "month" msgstr "mese" -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "Domenica" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "Lunedì" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "Martedì" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "Mercoledì" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "Giovedì" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "Venerdì" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Sabato" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "Dom" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "Lun" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "Mar" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "Mer" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "Gio" - -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "Ven" - -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "Sab" - #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Gli show più lunghi del tempo programmato saranno tagliati dallo show successivo." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2500,6 +2100,11 @@ msgstr "Rimuovere tutto il contenuto?" msgid "Delete selected item(s)?" msgstr "Cancellare la/e voce/i selezionata/e?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "Start" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "Fine" @@ -2533,14 +2138,6 @@ msgstr "Spostamento di un elemento in corso" msgid "Moving %s Items" msgstr "Spostamento degli elementi %s in corso" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "Cancella" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "" @@ -2550,8 +2147,7 @@ msgid "Cue Editor" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2582,6 +2178,13 @@ msgstr "Cancella show attuale" msgid "Open library to add or remove content" msgstr "Apri biblioteca per aggiungere o rimuovere contenuto" +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "Aggiungi/Rimuovi contenuto" + #: airtime_mvc/application/controllers/LocaleController.php:305 msgid "in use" msgstr "in uso" @@ -2594,29 +2197,9 @@ msgstr "Disco" msgid "Look in" msgstr "Cerca in" -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" -msgstr "Apri" - -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "Amministratore " - -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "DJ" - -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "Programma direttore" - -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "Ospite" +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "Apri" #: airtime_mvc/application/controllers/LocaleController.php:316 msgid "Guests can do the following:" @@ -2682,12 +2265,6 @@ msgstr "" msgid "Manage watched folders" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "Invia supporto feedback:" - #: airtime_mvc/application/controllers/LocaleController.php:333 msgid "View system status" msgstr "" @@ -2752,6 +2329,12 @@ msgstr "Ven" msgid "Sa" msgstr "Sab" +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Chiudi" + #: airtime_mvc/application/controllers/LocaleController.php:355 msgid "Hour" msgstr "Ore" @@ -2773,6 +2356,14 @@ msgstr "" msgid "Add files to the upload queue and click the start button." msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "Stato" + #: airtime_mvc/application/controllers/LocaleController.php:365 msgid "Add Files" msgstr "" @@ -2860,6 +2451,12 @@ msgstr "" msgid "Error: Invalid file extension: " msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:389 msgid "Create Entry" msgstr "" @@ -2875,28 +2472,179 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:394 #, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "Inserisca per favore il suo nome utente e password" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "Non è consentito disconnettersi dalla fonte." -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "Nome utente o password forniti errati. Per favore riprovi." +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "Nessuna fonte connessa a questo ingresso." -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "L' e-mail non può essere inviata. Controlli le impostazioni della sua mail e si accerti che è stata configurata correttamente." +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "Non ha il permesso per cambiare fonte." -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "E-mail inserita non trovata." +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "Sta visualizzando una versione precedente di %s" + +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "Non può aggiungere tracce al blocco dinamico." + +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%s non trovato" + +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "Non ha i permessi per cancellare la selezione %s(s)." + +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "Qualcosa è andato storto." + +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "Può solo aggiungere tracce al blocco intelligente." + +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "Playlist senza nome" + +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Blocco intelligente senza nome" + +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "Playlist sconosciuta" + +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "Non è permesso l'accesso alla risorsa." + +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "Non è permesso l'accesso alla risorsa." + +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "Il file non esiste in Airtime." + +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "Il file non esiste in Airtime" + +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "Il file non esiste in Airtime." + +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "Richiesta errata. 'modalità ' parametro non riuscito." + +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "Richiesta errata. 'modalità ' parametro non valido" + +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "Anteprima" + +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "Aggiungi a playlist" + +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "Aggiungi al blocco intelligente" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "Cancella" + +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "" + +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "Edita" + +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "Vedi su SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "Carica su SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Carica su SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "Nessuna azione disponibile" + +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "Non ha il permesso per cancellare gli elementi selezionati." + +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "Non può cancellare i file programmati." + +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Seleziona cursore" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "Rimuovere il cursore" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "lo show non esiste" #: airtime_mvc/application/controllers/PreferenceController.php:74 msgid "Preferences updated." @@ -2923,988 +2671,1130 @@ msgstr "il percorso deve essere specificato" msgid "Problem with Liquidsoap..." msgstr "Problemi con Liquidsoap..." -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Seleziona cursore" +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "In esecuzione" + +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "Aggiungi Media" + +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Biblioteca" + +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "Calendario" + +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "Sistema" + +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "Preferenze" + +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "Utenti" + +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Cartelle dei Media" + +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Streams" + +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "Statistiche ascolto" + +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "" + +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "Storico playlist" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "Rimuovere il cursore" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "lo show non esiste" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "Aiuto" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Webstream senza titolo" +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "Iniziare" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Webstream salvate." +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "Manuale utente" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "Valori non validi." +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "Chi siamo" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "Sta visualizzando una versione precedente di %s" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "Servizi" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "Non può aggiungere tracce al blocco dinamico." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "Durata" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "Non ha i permessi per cancellare la selezione %s(s)." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "CPU" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "Può solo aggiungere tracce al blocco intelligente." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "Memoria" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "Playlist senza nome" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Versione Airtime" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Blocco intelligente senza nome" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "Spazio disco" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "Playlist sconosciuta" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "Impostazioni sistema di servizio e-mail / posta" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "Pagina non trovata" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "Impostazioni SoundCloud" -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Errore applicazione " +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Ripeti giorni:" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "User aggiunto con successo!" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "Rimuovi" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "User aggiornato con successo!" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "Aggiungi " -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "Connessioni URL:" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "L'anno %s deve essere compreso nella serie 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "Impostazioni Input Stream" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s non è una data valida" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "Domini di connessione alla fonte URL:" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s:%s:%s non è un ora valida" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "Sovrascrivi" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "Show senza nome" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "Ok" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "Importa Folder:" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "Azzera" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "Folder visionati:" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "Mostra connessioni alla fonte URL:" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "Catalogo non valido" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(Richiesto)" -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Username:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "Registro Airtime" -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "Password:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Aiuti Airtime a migliorare facendoci sapere come lo sta usando. Questa informazione sarà raccolta regolarmente per migliorare.%sClicchi 'Si, aiuta Airtime e noi ci assicureremo che i servizi da lei usati migliorino." -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "Clicchi sotto per pubblicare la sua stazione su %sSourcefabric.org%s. Per promuovere la sua stazione, 'Spedisca aderenza feedback' deve essere abilitato. Questi dati saranno raccolti." -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "Nome:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(per scopi di verifica, non ci saranno pubblicazioni)" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "Cognome:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Note: La lunghezze superiori a 600x600 saranno ridimensionate." -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "E-mail:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Mostra cosa sto inviando" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Cellulare:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "Termini e condizioni" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype:" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "Reimposta password" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Scegli cartella" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "tipo di utente:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "Imposta" -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "Il nome utente esiste già ." +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "Importa cartelle:" + +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "Ripeti elenco visionato (Questo è utile se c'è da eseguire montaggio di rete e può essere fuori sincronizzazione con Airtime)" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "Spegnimento automatico" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "Rimuovi elenco visionato" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "Accensione automatica" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "Sta guardando i cataloghi media." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "Cambia dissolvenza di transizione " +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "Stream" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "inserisci il tempo in secondi" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "Opzioni aggiuntive" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "Username principale" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "La seguente informazione sarà esposta agli ascoltatori nelle loro eseguzione:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "Password principale" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(Il sito della tua radio)" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "Principale fonte di connessione URL" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "Stream URL:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "Mostra la connessione fonte URL" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "Filtra storia" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "Principale fonte Port" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "Trova Shows" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "Solo numeri." +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "Filtri Show:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "Fonte principale Mount Point" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Carattere inserito non valido" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Aiuti Airtime a migliorare facendo sapere a Sourcefabric come lo sta usandolo. Queste informazioni saranno raccolte regolarmente per migliorare. %s Clicchi su 'Spedisca aderenza feedback'e noi ci assicureremo che i servizi da lei usati stanno migliorando." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Mostra fonte Port" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "Clicchi sotto per promuovere la sua Stazione su %sSourcefabric.org%s." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "Mostra fonte Mount Point" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(Per promuovere la sua stazione, 'Spedisca aderenza feedback' deve essere abilitato)." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "Non può usare lo stesso port del principale Dj port." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Trattamento dati Sourcefabric" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "Port %s non disponibile" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%value%' non si adatta al formato dell'ora 'HH:mm'" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "Data/Ora inizio:" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Scegli giorni:" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "Data/Ora fine:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Opzioni di blocco intelligente" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "Durata:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "Ripetizioni?" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr "a" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "Non creare show al passato" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "Files e criteri" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "Non modificare data e ora di inizio degli slot in eseguzione" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "File e criteri" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "Non ci può essere una durata <0m" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "Non ci può essere una durata 00h 00m" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "Non ci può essere una durata superiore a 24h" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "Ripeti tipo:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "settimanalmente" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" +msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "mensilmente" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" +msgstr "" + +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "Nuovo" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "Nuova playlist" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "Nuovo blocca intelligente " + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "Nuove produzioni web" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "Vedi/edita descrizione" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "Stream URL:" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "Lunghezza predefinita:" -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Seleziona giorni:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "No webstream" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "Impostazioni Stream" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Setting globale" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "Data fine:" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "Impostazioni Output Stream" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "Ripeti all'infinito?" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "File importato in corso..." -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "La data di fine deve essere posteriore a quella di inizio" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "Opzioni di ricerca avanzate" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "precedente" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "Il calore richiesto non può rimanere vuoto" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "riproduci" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "Password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "pausa" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "Conferma nuova password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "next" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "La password di conferma non corrisponde con la sua password." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "stop" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Inserisci nuova password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "disattiva microfono" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Nome stazione" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "attiva microfono" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Telefono:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "volume massimo" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "Stazione sito web:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "Aggiornamenti richiesti" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "Paese:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "Per riproduzione media, avrà bisogno di aggiornare il suo browser ad una recente versione o aggiornare il suo %sFlash plugin%s." -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "Città :" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "Lunghezza" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "Descrizione stazione:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "Percentuale" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Logo stazione: " +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "Numero ISRC:" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "Promuovi la mia stazione su Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "Spuntando questo box, acconsento il trattamento dei miei dati personali attraverso la %sprivacy policy%s di Sourcefabric." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Web Stream" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "Autorizzo il trattamento dei miei dati personali." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "Blocco intelligente e dinamico" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%value%' non è valido l'indirizzo e-mail nella forma base local-part@hostname" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "Blocco intelligente e statico" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%' non va bene con il formato data '%formato%'" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Traccia audio" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%' è più corto di %min% caratteri" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "Contenuti playlist:" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%value%' è più lungo di %max% caratteri" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "Contenuto di blocco intelligente e statico:" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%' non è tra '%min%' e '%max%' compresi" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "Criteri di blocco intelligenti e dinamici:" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "Limiti" + +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "Attiva:" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "Tipo di stream:" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "Tipo di servizio:" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "Programma in ascolto troppo lungo" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "Canali:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Benvenuti in Airtime!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Può cominciato ad usare tAirtime per automatizzare le sue trasmissioni:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "Cominci aggiungendo i suoi file alla biblioteca usando 'Aggiunga Media'. Può trascinare e trasportare i suoi file in questa finestra." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Server" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "Crea show cliccando su 'Calendario' nel menu e cliccando l'icona 'Show'. Questo può essere uno show di una volta o a ripetizione. Solamente l'amministratore e il direttore del programma possono aggiungere show." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "Port" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "Aggiunga media allo show selezionando il suo show nel calendario, cliccando sul sinistro e selezionando 'Aggiungi/Rimuovi Contenuto'" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "URL" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Selezioni i suoi media dal pannello sinistro e trascini al suo show nel pannello destro." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Mount Point" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "Può andare!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "Per aiuto dettagliato, legga %suser manual%s." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "Il server non è libero." +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Seleziona stream:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "Il port non può essere libero." +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sAirtime%s %s, il software di radio aperto per elencare e gestione di stazione remota. %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "Mount non può essere vuoto con il server Icecast." +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%sSourcefabric%s o.p.s. Airtime è distribuito da %sGNU GPL v.%s" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "Produzione Audio dell'hardware" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "Nuova password" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "Tipo di Output" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "Prego inserire e confermare la sua nuova password nel seguente spazio." -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Icecast Vorbis Metadata" +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "Prego inserire la sua e-mail. Riceverà un link per creare una nuova password via e-mail-" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "Etichetta Stream:" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "E-mail inviata" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "Artista - Titolo" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "Una e-mail è stata inviata" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Show - Artista - Titolo" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "Indietro a schermo login" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Nome stazione - Nome show" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "Benvenuti al demo online Airtime! Può accedere usando l'username 'consenti' e la password 'consenti'." -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "Precedente:" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "Successivo:" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "Source Streams" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "Cerca utenti:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "Fonte principale" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "Dj:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "Mostra fonte" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "Registra da Line In?" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "Programmazione play" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "Ritrasmetti?" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "IN ONDA" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "Abilita E-mail di Sistema (reimposta password)" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "Ascolta" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "Reimposta password dalla E-mail" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "Orario di stazione" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "Configura Mail del Server" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "La sua versione di prova scade entro" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "Richiede l'autentificazione" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Acquisti la sua copia Airtime" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "Mail Server" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "Account personale" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "Indirizzo e-mail" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "Gestione utenti" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "Digita le parole del riquadro." +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "Nuovo Utente" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "Il giorno deve essere specificato" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "id" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "L'ora dev'essere specificata" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "Nome" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "Aspettare almeno un'ora prima di ritrasmettere" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "Cognome" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Usa autenticazione Airtime:" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "Tipo di utente" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "Usa autenticazione clienti:" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "Personalizza nome utente " +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "Personalizza Password" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "Il campo nome utente non può rimanere vuoto." +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Zend Framework Default Application" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "Il campo della password non può rimanere vuoto." +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "Pagina non trovata!" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "Data inizio:" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "La pagina che stai cercando non esiste! " -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "Espandi blocco statico" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "inserisci il tempo in secondi 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "Espandi blocco dinamico " -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "Blocco intelligente vuoto" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "Playlist vuota" + +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "Permetti alla connessione remota dei siti di accedere\"Programma\" Info? %s(Abilita i widgets frontali.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Riproduzione casuale" + +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Salva playlist" + +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "Playlist crossfade" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "Disattivato" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "Dissolvenza in entrata:" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "Abilitato" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Dissolvenza in chiusura:" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "Non aprire playlist" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "La settimana inizia il" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(ss.t)" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "Non aprire blocco intelligente" + +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "Cue in:" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "Ripristina password" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(hh:mm:ss.t)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "ore" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Cue Out:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "minuti" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "Lunghezza originale:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "Inserisci blocco intelligente" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "Aggiungi show" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "Statico" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "Aggiorna show" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "Dinamico" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "Cosa" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "Permetti ripetizione tracce" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "Quando" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "Limitato a " +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "Ingresso Stream diretta" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "Genera contenuto playlist e salva criteri" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "Registra e ritrasmetti" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "Genere" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Chi" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "Eseguzione casuale playlist" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Stile" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "Il margine non può essere vuoto o più piccolo di 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "Ritrasmetti da %s a %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "Il margine non può superare le 24ore" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Seleziona paese" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "Il valore deve essere un numero intero" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "La lunghezza deve superare 0 minuti" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "500 è il limite massimo di elementi che può inserire" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "La lunghezza deve essere nella forma \"00h 00m\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "Devi selezionare da Criteri e Modifica" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "URL deve essere nella forma \"http://domain\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "La lunghezza deve essere nel formato '00:00:00'" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "URL dove essere di 512 caratteri o meno" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "Il valore deve essere nel formato (es. 0000-00-00 o 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "Nessun MIME type trovato per le webstream." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "Il valore deve essere numerico" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "Webstream non può essere vuoto" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "Il valore deve essere inferiore a 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "Non è possibile analizzare le playlist XSPF " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "Il valore deve essere inferiore a %s caratteri" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "Non è possibile analizzare le playlist PLS" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "Il valore non deve essere vuoto" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "Non è possibile analizzare le playlist M3U" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Show:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "Webstream non valido - Questo potrebbe essere un file scaricato." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "Tutti i miei show:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "Tipo di stream sconosciuto: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "Numero ISRC :" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s è già stato visionato." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "Caricamento automatico Show registrati" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s contiene una sotto directory già visionata: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "Abilità caricamento SoudCloud" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s annidato con una directory già visionata: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "File contrassegnati automaticamente\"Scaricabili\" da SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s non è una directory valida." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "E-mail SoudCloud" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s è già impostato come attuale cartella archivio o appartiene alle cartelle visionate" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "Password SoudCloud" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s è già impostato come attuale cartella archivio o appartiene alle cartelle visionate." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "Tag SoundCloud: (separare i tag con uno spazio)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s non esiste nella lista delle cartelle visionate." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "Impostazione predefinita genere:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "Impostazione predefinita tipo di traccia:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "Il programma che sta visionando è fuori data! (disadattamento dell'orario)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "Originale" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "Il programma che sta visionando è fuori data! (disadattamento dell'esempio)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "Il programma che sta visionando è fuori data!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "Live" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "Non è abilitato all'elenco degli show%s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "Registra" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "Non può aggiungere file a show registrati." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "Parlato" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "Lo show % supera la lunghezza massima e non può essere programmato." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "Lo show %s è già stato aggiornato! " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "Elaborazione in corso" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "Il File selezionato non esiste!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "Origine" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "Cue in e cue out sono nulli." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr " Riprodurre a ciclo continuo" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "Il cue in non può essere più grande del cue out." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Effetto sonoro" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "Il cue out non può essere più grande della lunghezza del file." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "Campione singolo" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "Il cue out non può essere più piccolo del cue in." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Altro" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "Il file non è stato caricato, sono rimasti %s MB di spazio ed il file in caricamento ha una lunghezza di %s MB." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "Licenza predefinita:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "Gli show possono avere una lunghezza massima di 24 ore." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "Il lavoro è nel dominio pubblico" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"Non si possono programmare show sovrapposti.\n" +" Note: Ridimensionare uno slot a ripetizione colpisce tutte le sue ripetizioni." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "Tutti i diritti riservati" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Ciao %s, \n" +"\n" +" Clicca questo link per reimpostare la tua password:" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Reimposta la password di Airtime" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "Creative Commons Attribution Noncommercial" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "Creative Commons Attribution No Derivate Works" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "Vedi file registrati Metadata" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "Creative Commons Attribution Share Alike" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Contenuto show" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "Creative Commons Attribution Noncommercial Non Derivate Works" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "Rimuovi il contenuto" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "Creative Commons Attribution Noncommercial Share Alike" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "Cancella show attuale" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "Colore sfondo:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "Colore testo:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "Edita show" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "In esecuzione" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "Cancella esempio" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "Aggiungi Media" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "Cancella esempio e tutto il seguito" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Biblioteca" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "Calendario" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "Non puoi spostare show ripetuti" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "Sistema" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "Non puoi spostare uno show passato" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "Utenti" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "Non puoi spostare uno show nel passato" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Cartelle dei Media" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "Non puoi spostare uno show registrato meno di un'ora prima che sia ritrasmesso." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Streams" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "Lo show è stato cancellato perché lo show registrato non esiste!" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "Statistiche ascolto" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "Devi aspettare un'ora prima di ritrasmettere." -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" msgstr "" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "Storico playlist" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "Riprodotti" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "L'anno %s deve essere compreso nella serie 1753 - 9999" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "Iniziare" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s non è una data valida" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "Manuale utente" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s:%s:%s non è un ora valida" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3913,3 +3803,18 @@ msgstr "Seleziona opzioni" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "No registrazione" + +#~ msgid "can't resize a past show" +#~ msgstr "Non puoi ridimensionare uno show passato" + +#~ msgid "Should not overlap shows" +#~ msgstr "Non si devono sovrapporre gli show" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "Impossibile creare 'organize' directory." + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "Il file risulta corrotto e non sarà aggiunto nella biblioteca." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "Il file non è stato caricato, l'errore si può ripresentare se il disco rigido del computer non ha abbastanza spazio o il catalogo degli archivi non ha i giusti permessi." diff --git a/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po index b60b3f8bda..41dfe32c69 100644 --- a/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po @@ -1,35 +1,23 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # Sourcefabric , 2012 msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-01-29 15:11+0000\n" "Last-Translator: andrey.podshivalov\n" "Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/airtime/language/ko_KR/)\n" +"Language: ko_KR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ko_KR\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "ë¼ì´ë¸Œ 스트림" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -50,9 +38,9 @@ msgid "Stop" msgstr "정지" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "í ì¸" @@ -61,9 +49,9 @@ msgid "Set Cue In" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "í 아웃" @@ -85,1720 +73,1448 @@ msgstr "페ì´ë“œ ì¸" msgid "Fade Out" msgstr "패ì´ë“œ 아웃" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "제목" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "제작ìž" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "ë¼ì´ë¸Œ 스트림" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "앨범" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "사용:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "길ì´" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "스트림 타입:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "장르" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "비트 ë ˆì´íŠ¸:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "무드" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "서비스 타입:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "ë ˆì´ë¸”" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "채ë„:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "작곡가" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - 모노" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - 스테레오" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "저작권" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "서버" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "ë…„ë„" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "허용ë˜ì§€ 않는 문ìžìž…니다" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "í¬íŠ¸" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "지휘ìž" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "숫ìžë§Œ 허용 ë©ë‹ˆë‹¤" -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "언어" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "암호" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "장르" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "방송ë¨" - -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "ì´ë¦„" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "ë…¹ìŒëœ 파ì¼ì˜ 메타ë°ì´íƒ€ 보기" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "설명" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "Soundcloud 보기" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "마운트 지ì " -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Soundcloudì— ì—…ë¡œë“œ" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "ì•„ì´ë””" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "Soundcloudì— ë‹¤ì‹œ 업로드" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "ê´€ë¦¬ìž ì•„ì´ë””" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "쇼 ë‚´ìš© 보기" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "ê´€ë¦¬ìž ì•”í˜¸" -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "ë‚´ìš© 추가/제거" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "서버ì—ì„œ 정보를 받는중..." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "ë‚´ìš© ëª¨ë‘ ì‚­ì œ" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "서버를 지정해주세요" -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "현재 쇼 취소" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "í¬íŠ¸ë¥¼ 지정해주세요" -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "Icecast 서버는 마운트 지ì ì„ 지정해야 합니다" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "수정" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "제목:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "쇼 수정" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "제작ìž:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "ì‚­ì œ" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "앨범:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "ì´ ì¸ìŠ¤í„´ìŠ¤ ì‚­ì œ" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "트랙:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "ì´ ì¸ìŠ¤í„´ìŠ¤ì™€ ì´í›„ì— ëª¨ë“  ì¸ìŠ¤í„´ìŠ¤ ì‚­ì œ" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "장르:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "ë…„ë„:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "반복쇼는 드래그 앤 드롭 할수 없습니다" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "ìƒí‘œ:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "지난 쇼는 ì´ë™í• ìˆ˜ 없습니다" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "작곡가:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "과거로 쇼를 ì´ë™í• ìˆ˜ 없습니다" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "지휘ìž" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "쇼를 중복ë˜ê²Œ 스케쥴할수 없습니다" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "무드" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "녹화 쇼를 재방송 시작 1시간 안으로 ì´ë™í• ìˆ˜ 없습니다" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "녹화 쇼가 없으로 쇼가 ì‚­ì œ ë˜ì—ˆìŠµë‹ˆë‹¤" +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "저작권:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "녹화 쇼와 재방송 사ì´ì—는 1ì‹œê°„ì˜ ê°„ê²©ì´ í•„ìš”í•©ë‹ˆë‹¤ " +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "ISRC 넘버" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "설정" +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "웹사ì´íŠ¸" + +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "언어" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "저장" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "미디어 í´ë” 관리" - -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "ë½ìŠ¤íŠ¸ë¦¼ 설정" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "취소" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "ì „ì—­ 설정" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "ì•„ì´ë””: " -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "암호: " -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "출력 스트림 설정" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "암호 확ì¸:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "í´ë” ì„ íƒ" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "ì´ë¦„:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "저장" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "성:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "현재 저장 í´ë”:" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "ì´ë©”ì¼" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "추가" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "휴대전화:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë” 다시 검색(ë„¤íŠ¸ì›Œí¬ ë“œë¼ì´ë¸Œë¥¼ 모니터중ì¼ë–„, Airtimeê³¼ ë™ê¸°í™” 실패시 사용)" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "스카입:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë”를 리스트ì—ì„œ ì‚­ì œ" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë”ê°€ 없습니다" +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "유저 타입" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "Airtime 등ë¡" +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "ì†ë‹˜" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Airtime 사용ìžë“¤ 께서 í”¼ë“œë°±ì„ ë³´ë‚´ì£¼ì‹œë©´, 그걸 기본으로 사용ìžë“¤ì´ ì›í•˜ëŠ” 방향으로 나아가는Airtimeì´ ë˜ê² ìŠµë‹ˆë‹¤. %s'Airtime ë„와주기' í´ë¦­í•˜ì—¬ í”¼ë“œë°±ì„ ë³´ë‚´ì£¼ì„¸ìš”" +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "%sSourcefabric.org%sì— ë°©ì†¡êµ­ì„ í™ë³´ 하시려면 ì²´í¬ í•˜ì„¸ìš”. ì²´í¬ í•˜ê¸° 위해선 '피드백 보내기'를 ì²´í¬ í•˜ì…”ì•¼ 합니다" +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "프로그램 매니저" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(*)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(확ì¸ì„ 위한것입니다, ì´ ì •ë³´ëŠ” ì–´ë””ì—ë„ ê²Œì‹œ ë˜ì§€ 않습니다)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "주ì˜: 600*600보다 í° ì´ë¯¸ì§€ëŠ” 사ì´ì¦ˆê°€ 수정 ë©ë‹ˆë‹¤" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "보내지는 ë°ì´íƒ€ 보기" +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "관리ìž" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "ì‚¬ìš©ìž ì•½ê´€" +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "사용할수 없는 ì•„ì´ë”” 입니다" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "쇼 찾기" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "ë°°ê²½ 색:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "쇼 í•„í„°" +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "ê¸€ìž ìƒ‰:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "암호 초기화" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "시작" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "스마트 ë¸”ë¡ ì˜µì…˜" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "종료" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "쇼: " -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "ë‚´ 쇼:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr " 부터 " +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "ì¼" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "ê°œì˜ íŒŒì¼ë“¤" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "날짜를 설정하세요" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "ê°œì˜ íŒŒì¼ë“¤" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "ì‹œê°„ì„ ì„¤ì •í•˜ì„¸ìš”" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "ì ‘ì† URL:" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "재방송 설정까지 1시간 ê¸°ê°„ì´ í•„ìš”í•©ë‹ˆë‹¤" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Airtime 사용ìžë“¤ 께서 í”¼ë“œë°±ì„ ë³´ë‚´ì£¼ì‹œë©´, 그걸 기본으로 사용ìžë“¤ì´ ì›í•˜ëŠ” 방향으로 나아가는Airtimeì´ ë˜ê² ìŠµë‹ˆë‹¤. %s'Airtime ë„와주기' í´ë¦­í•˜ì—¬ í”¼ë“œë°±ì„ ë³´ë‚´ì£¼ì„¸ìš”" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "í´ë” 가져오기" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "%sSourcefabric.org%sì— ë°©ì†¡êµ­ì„ í™ë³´ 하시려면 ì²´í¬ í•˜ì„¸ìš”." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë”" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(ì²´í¬ í•˜ê¸° 위해선 '피드백 보내기'를 ì²´í¬ í•˜ì…”ì•¼ 합니다)" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "옳치 ì•Šì€ í´ë” 입니다" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Sourcefabric ì´ìš© 약관" +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "ì‚¬ìš©ìž ê²€ìƒ‰:" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "ìž…ë ¥ 스트림 설정" +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "DJ들:" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "마스터 소스 ì ‘ì† URL:" +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "로그ì¸" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "ë®ì–´ì“°ê¸°" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "ë°‘ì— ë³´ì´ëŠ” ê·¸ë¦¼ì— ë‚˜ì˜¨ 문ìžë¥¼ 입력하세요" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "확ì¸" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "방송국 ì´ë¦„" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "초기화" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "기본 í¬ë¡œìŠ¤íŽ˜ì´ë“œ 길ì´(s)" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "쇼 소스 ì ‘ì† URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "초단위를 입력해주세요 0{.0}" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "날짜 ì„ íƒ" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "기본 페ì´ë“œ ì¸(s)" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "제거" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "기본 페ì´ë“œ 아웃(s)" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "반복 날짜:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "리모트 웹사ì´íŠ¸ì—ì„œ 스케쥴 ì •ë³´ì— ì ‘ê·¼ì„ í—ˆìš©? %s (ìœ„ì ¯ì„ ì‚¬ìš©í•˜ë ¤ë©´ ì²´í¬ í•˜ì„¸ìš”)" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "ì´ë©”ì¼/ë©”ì¼ ì„œë²„ 설정" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "미사용" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "SoundCloud 설정" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "사용" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "%sì˜ ì„¤ì •" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "기본 ì¸í„°íŽ˜ì´ìŠ¤ 언어" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "주 시작ì¼" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "ì¼ìš”ì¼" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "스트림 " +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "월요ì¼" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "추가 설정" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "화요ì¼" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "ë°‘ì— ì •ë³´ë“¤ì€ ì²­ì·¨ìžì— 플래ì´ì–´ì— 표시 ë©ë‹ˆë‹¤:" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "수요ì¼" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(방송국 웹사ì´íŠ¸ 주소)" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "스트림 URL: " - -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "í•„í„° 히스토리" - -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Airtimeì— ì˜¤ì‹ ê±¸ 환ì˜í•©ë‹ˆë‹¤" - -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Airtimeì„ ì´ìš©í•˜ì—¬ ë°©ì†¡ì„ ìžë™í™” 할수 있는 기본 ê°€ì´ë“œ 입니다:" - -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "미디어 추가 페ì´ì§€ë¡œ 가셔서 ì›í•˜ëŠ” 파ì¼ì„ 드래그 앤 ë“œëž í•˜ì‹­ì‹œì˜¤. ë¼ì´ë¸ŒëŸ¬ë¦¬ 페ì´ì§€ë¥¼ 가시면 ì—…ë¡œë“œëœ íŒŒì¼ì„ í™•ì¸ í• ìˆ˜ 있습니다." +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "목요ì¼" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "스케쥴 페ì´ì§€ì— 가셔서 ì›í•˜ëŠ” ë‚ ì§œì— ë”블í´ë¦­ 하셔서 쇼를 ìƒì„± 하십시오. 관지ìžì™€ 프로그램 매니저만 쇼를 ìƒì„±í• ìˆ˜ 있는 ê¶Œí•œì´ ìžˆìŠµë‹ˆë‹¤" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "금요ì¼" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "만드신 ì‡¼ì— í´ë¦­ì„ í•˜ì‹ ë‹¤ìŒ 'ë‚´ìš© 추가/제거' 를 í´ë¦­í•˜ì‹­ì‹œì˜¤." +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "토요ì¼" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "왼쪽 ë¼ì´ë¸ŒëŸ¬ë¦¬ 스í¬ë¦°ì—ì„œ 오른쪽 쇼 ë‚´ìš© 패ë„ë¡œ 드래그 앤 ë“œëž í•˜ë©° 미디어를 추가 합니다" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "ë§í¬:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "첫 번째 쇼를 성공ì ìœ¼ë¡œ ìƒì„± 하였습니다." +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "반복 유형:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "ë” ìžì„¸í•œ ë„ì›€ì„ ì›í•˜ì‹œë©´, ë©”ë‰´ì–¼ì„ ì°¸ê³  하여 주세요. %suser manual%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "주간" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "ì •ë³´" +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "공유" +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "월간" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "스트림 ì„ íƒ" +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "날짜 ì„ íƒ" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "ìŒì†Œê±°" +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "ì¼" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "ìŒì†Œê±° í•´ì œ" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "ì›”" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "로그ì¸" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "í™”" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Airtime ë°ëª¨ì— 오신건 환ì˜í•©ë‹ˆë‹¤! admin/admin으로 ë¡œê·¸ì¸ í•˜ì‹­ì‹œì˜¤." +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "수" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "ì‚¬ìš©ìž ê³„ì •ì˜ ì´ë©”ì¼ì„ 입력해 주세요. 새로 암호를 설정할수 있는 ë§í¬ê°€ í¬í•¨ëœ ì´ë©”ì¼ì´ 전송 ë©ë‹ˆë‹¤" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "목" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "ì´ë©”ì¼ì´ 전송 ë˜ì—ˆìŠµë‹ˆë‹¤" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "금" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "ì´ë©”ì¼ì´ 전송 ë˜ì—ˆìŠµë‹ˆë‹¤" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "토" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "ë¡œê·¸ì¸ íŽ˜ì´ì§€ë¡œ 가기" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "새 암호" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "월중 날짜" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "새 암호 확ì¸" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "주중 날짜" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr " " +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "무한 반복?" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "ì¼" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "종료 ì¼ì´ ì‹œìž‘ì¼ ë³´ë‹¤ 먼져 입니다." -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Airtimeì„ êµ¬ìž…í•˜ì„¸ìš”" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "ë‚´ 계정" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "새 암호 확ì¸" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "ì´ì „:" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "암호와 암호 í™•ì¸ ê°’ì´ ì¼ì¹˜ 하지 않습니다." -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "다ìŒ:" +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "새 암호 받기" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "소스 스트림" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "기준 ì„ íƒ" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "마스터 소스" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "앨범" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "쇼 소스" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "비트 ë ˆì´íŠ¸(Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "스케쥴" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "방송중" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "작곡가" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "듣기" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "지휘ìž" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "방송국 시간" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "저작권" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "닫기" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "쇼 추가" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "쇼 ì—…ë°ì´íŠ¸" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "무엇" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "언제" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "ë¼ì´ë¸Œ 스트림" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "ë…¹ìŒ & 재방송" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "누구" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "스타ì¼" - -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "시작" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "서비스" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "ìƒíƒœ" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "업타임" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "제작ìž" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" msgstr "" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "메모리" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Airtime 버전" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "ë””ìŠ¤í¬ ê³µê°„" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "íŒŒì¼ ê°€ì ¸ì˜¤ê¸° 진행중" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "고급 검색 옵션" - -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "시간 ê²½ê³¼ì— ë”°ë¥¸ ì²­ì·¨ìž ìˆ«ìž " - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "새로 만들기" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "새 ìž¬ìƒ ëª©ë¡" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "새 스마트 블ë¡" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "새 웹스트림" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "설명 보기/수정" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "설명" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "스트림 URL:" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "기본 길ì´:" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "열린 웹스트림 ì—†ìŒ" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "ìž¬ìƒ ëª©ë¡ ë¹„ìš°ê¸°" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "지우기" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "ìž¬ìƒ ëª©ë¡ ì…”í”Œ" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 -msgid "Shuffle" -msgstr "셔플" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "ìž¬ìƒ ëª©ë¡ ì €ìž¥" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "ìž¬ìƒ ëª©ë¡ í¬ë¡œìŠ¤íŽ˜ì´ë“œ" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "페ì´ë“œ ì¸: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "페ì´ë“œ 아웃:" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "열린 ìž¬ìƒ ëª©ë¡ ì—†ìŒ" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "웨ì´ë¸Œ í¼ ë³´ê¸°" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "스마트 ë¸”ë½ ë‚´ìš© 지우기" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "ë ˆì´ë¸”" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "열린 스마트 ë¸”ë¡ ì—†ìŒ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "언어" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "í ì¸:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "마지막 수정ì¼" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "마지막 방송ì¼" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "í 아웃:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "길ì´" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "오리지날 길ì´" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "ì •ì  ë¸”ë¡ í™•ìž¥" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "무드" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "ë™ì  ë¸”ë¡ í™•ìž¥" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "소유ìž" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "내용물 ì—†ìŒ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "ë¦¬í”Œë ˆì´ ê²Œì¸" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "내용물 ì—†ìŒ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "샘플 ë ˆì´íŠ¸" -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "제목" -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "페ì´ì§€ë¥¼ ì°¾ì„수 없습니다!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "트랙 번호" -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "찾는 페ì´ì§€ê°€ 존재 하지 않습니다!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "업로드 날짜" -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "ë„움" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "웹싸ì´íŠ¸" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "ì´ì „" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "ë…„ë„" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "재ìƒ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "모디파ì´ì–´ ì„ íƒ" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "중지" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "다ìŒì„ í¬í•©" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "다ìŒ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "다ìŒì„ í¬í•¨í•˜ì§€ 않는" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "정지" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "다ìŒê³¼ ê°™ìŒ" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "최대 ìŒëŸ‰ " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "다ìŒê³¼ 같지 ì•ŠìŒ" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "ì—…ë°ì´íŠ¸ê°€ 필요함" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "다ìŒìœ¼ë¡œ 시작" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "미디어를 재ìƒí•˜ê¸° 위해선, 브ë¼ìš°ì €ë¥¼ 최신 버젼으로 ì—…ë°ì´íŠ¸ 하시고, %sFlash plugin%së„ ì—…ë°ì´íŠ¸ 해주세요" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "다ìŒìœ¼ë¡œ ë남" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "ë‹¤ìŒ ë³´ë‹¤ í°" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "ë‹¤ìŒ ë³´íƒ€ ìž‘ì€" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "ì´ë¦„" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "ë‹¤ìŒ ë²”ìœ„ ì•ˆì— ìžˆëŠ” " -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "시간" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "분" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "ì•„ì´í…œ" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "스마트 ë¸”ë¡ ìœ í˜•" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "ì •ì (Static)" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "ë™ì (Dynamic)" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "반복ì ì¸ 트랙 허용:" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "ê¸¸ì´ ì œí•œ" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "ìž¬ìƒ ëª©ë¡ ë‚´ìš© ìƒì„±í›„ 설정 저장" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "ìƒì„±" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "ì‚¬ìš©ìž ê´€ë¦¬" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "ìž¬ìƒ ëª©ë¡ ë‚´ìš© 셔플하기" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "새 사용ìž" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle" +msgstr "셔플" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "ì•„ì´ë””" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "ê¸¸ì´ ì œí•œì€ ë¹„ì–´ë‘거나 0으로 설정할수 없습니다" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "ì•„ì´ë””" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "ê¸¸ì´ ì œí•œì€ 24h 보다 í´ìˆ˜ 없습니다" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "ì´ë¦„" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "ì´ ê°’ì€ ì •ìˆ˜(integer) 입니다" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "성" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "ì•„ì´í…œ ê³—ìˆ˜ì˜ ìµœëŒ€ê°’ì€ 500 입니다" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "ì‚¬ìš©ìž ìœ í˜•" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "기준과 모디파ì´ì–´ë¥¼ 골ë¼ì£¼ì„¸ìš”" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "제목:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "길ì´ëŠ” 00:00:00 형태로 입력하세요" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "제작ìž:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "ì´ ê°’ì€ timestamp 형태 (e.g. 0000-00-00 or 0000-00-00 00:00:00) ë¡œ 입력해주세요" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "앨범:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "ì´ ê°’ì€ ìˆ«ìžë§Œ 허용 ë©ë‹ˆë‹¤" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "트랙:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "ì´ ê°’ì€ 2147483648보다 ìž‘ì€ ìˆ˜ë§Œ 허용 ë©ë‹ˆë‹¤" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "길ì´:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "ì´ ê°’ì€ %s 문ìžë³´ë‹¤ ìž‘ì€ ê¸¸ì´ë§Œ 허용 ë©ë‹ˆë‹¤" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "샘플 ë ˆì´íŠ¸:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "ì´ ê°’ì€ ë¹„ì–´ë‘˜ìˆ˜ 없습니다" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "비트 ë ˆì´íŠ¸:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "ìžë™ 스위치 ë„기" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "무드" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "ìžë™ 스위치 켜기" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "장르:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "스위치 페ì´ë”©" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "ë…„ë„:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "ì´ˆ 단위를 입력해 주세요 00{.000000}" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "ìƒí‘œ:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "마스터 ì•„ì´ë””" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "마스터 암호" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "작곡가:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "마스터 소스 ì ‘ì† URL" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "지휘ìž" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "쇼 소스 ì ‘ì† URL" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "저작권:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "마스터 소스 í¬íŠ¸" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "ISRC 넘버:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "마스터 소스 마운트 지ì " -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "웹사ì´íŠ¸" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "쇼 소스 í¬íŠ¸" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "언어" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "쇼 소스 마운트 지ì " -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "íŒŒì¼ ìœ„ì¹˜:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "마스터 소스 í¬íŠ¸ì™€ ê°™ì€ í¬íŠ¸ë¥¼ 사용할수 없스니다" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "ì´ë¦„:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "í¬íŠ¸ %s는 ì´ìš© 할수 없습니다" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "설명:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "ì „í™”" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "웹스트림" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "방송국 웹사ì´íŠ¸" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "ë™ì  스마트 블ë¡" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "나ë¼" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "ì •ì  ìŠ¤ë§ˆíŠ¸ 블ë¡" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "ë„ì‹œ" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "오디오 트랙" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "방송국 설명" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "재ìƒëª©ë¡ ë‚´ìš©" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "방송국 로고" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "ì •ì  ìŠ¤ë§ˆíŠ¸ ë¸”ë¡ ë‚´ìš©: " +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "ì‚¬ìš©ìž í”¼ë“œë°±ì„ ë³´ëƒ„" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "ë™ì  스마트 ë¸”ë¡ ë‚´ìš©: " +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "ë‚´ ë°©ì†¡êµ­ì„ Sourcefabric.orgì— í™ë³´" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "ê¸¸ì´ ì œí•œ " +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "ì´ ë°•ìŠ¤ì— ì²´í¬í•¨ìœ¼ë¡œ, Sourcefabric's %sprivacy policy%sì— ë™ì˜í•©ë‹ˆë‹¤." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "ì‚¬ìš©ìž ì•½ê´€ì— ë™ì˜ 하십시오" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "ì´ í•„ë“œëŠ” 비워둘수 없습니다." -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" msgstr "" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "쇼 길ì´ëŠ” 24ì‹œê°„ì„ ë„˜ì„수 없습니다." +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "종료 날짜/ì‹œê°„ì„ ê³¼ê±°ë¡œ 설정할수 없습니다" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "Line In으로 ë…¹ìŒ" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "쇼를 중복ë˜ê²Œ 스케줄 할수 없습니다.\n주ì˜: 반복 ì‡¼ì˜ í¬ê¸°ë¥¼ 조정하면, 모든 반복 ì‡¼ì˜ í¬ê¸°ê°€ ë°”ë€ë‹ˆë‹¤." +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "재방송?" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "지난 쇼는 사ì´ì¦ˆë¥¼ 조정할수 없습니다 " +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Airtime ì¸ì¦ 사용" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "중복 ìŠ¤ì¼€ì¥´ì„ í• ìˆ˜ 없스니다" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "Custom ì¸ì¦ 사용" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "êµ­ê°€ ì„ íƒ" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "Custom ì•„ì´ë””" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s는 ì´ë¯¸ 모니터 중입니다 " +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "Custom 암호" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s는 ì´ë¯¸ ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë”를 í¬í•¨í•˜ê³  있습니다: %s" +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "ì•„ì´ë””를 입력해주세요" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s를 í¬í•¨í•˜ëŠ” í´ë”를 ì´ë¯¸ 모니터 중입니다: %s" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "암호를 입력해주세요" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s는 ì˜³ì€ ê²½ë¡œê°€ 아닙니다." +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "ì´ë©”ì¼" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s는 ì´ë¯¸ 현재 저장 í´ë”ë¡œ ì§€ì •ì´ ë˜ì—ˆê±°ë‚˜ ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë” 입니다." +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "암호 ë³µì›" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s는 ì´ë¯¸ 현재 저장 í´ë”ë¡œ ì§€ì •ì´ ë˜ì—ˆê±°ë‚˜ ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë” 입니다." +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "하드ì—ì–´ 오디오 출력" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%sê°€ 모니터 목ë¡ì— 없습니다" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "출력 유형" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "ì•„ì´í…œ" +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Icecast Vorbis 메타ë°ì´íƒ€" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "í-ì¸ ê³¼ í -아웃 ì´ null 입니다" +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "스트림 ë ˆì´ë¸”" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "í-아웃 ê°’ì€ íŒŒì¼ ê¸¸ì´ë³´ë‹¤ í´ìˆ˜ 없습니다" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "아티스트 - 제목" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "í-ì¸ ê°’ì€ í-아웃 값보다 í´ìˆ˜ 없습니다." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "쇼 - 아티스트 - 제목" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "í-아웃 ê°’ì€ í-ì¸ ê°’ë³´ë‹¤ ìž‘ì„수 없습니다." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "방송국 ì´ë¦„ - 쇼 ì´ë¦„" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "기준 ì„ íƒ" +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "오프 ì—ì–´ 메타ë°ì´íƒ€" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "비트 ë ˆì´íŠ¸(Kbps)" +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "ë¦¬í”Œë ˆì´ ê²Œì¸ í™œì„±í™”" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "ë¦¬í”Œë ˆì´ ê²Œì¸ ì„¤ì •" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%value%'ì€ ë§žì§€ 않는 ì´ë©”ì¼ í˜•ì‹ ìž…ë‹ˆë‹¤." -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "마지막 수정ì¼" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%'ì€ ë‚ ì§œ 형ì‹('%format%')ì— ë§žì§€ 않습니다." -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "마지막 방송ì¼" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%'는 %min%ê¸€ìž ë³´ë‹¤ 짧ì„수 없습니다" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%value%'는 %max%ê¸€ìž ë³´ë‹¤ 길수 없습니다" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "소유ìž" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%'ì€ '%min%'와 '%max%' 사ì´ì— 있지 않습니다." -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "ë¦¬í”Œë ˆì´ ê²Œì¸" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "암호가 맞지 않습니다" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "샘플 ë ˆì´íŠ¸" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%value%'ì€ ì‹œê°„ 형ì‹('HH:mm')ì— ë§žì§€ 않습니다." -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "트랙 번호" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "날짜/시간 시작:" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "업로드 날짜" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "날짜/시간 종료:" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "웹싸ì´íŠ¸" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "길ì´:" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "모디파ì´ì–´ ì„ íƒ" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "시간대:" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "다ìŒì„ í¬í•©" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "반복?" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "다ìŒì„ í¬í•¨í•˜ì§€ 않는" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "쇼를 ê³¼ê±°ì— ìƒì„± 할수 없습니다" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "다ìŒê³¼ ê°™ìŒ" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "ì´ë¯¸ 시작한 ì‡¼ì˜ ì‹œìž‘ 날짜/ì‹œê°„ì„ ë°”ê¿€ìˆ˜ 없습니다" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "다ìŒê³¼ 같지 ì•ŠìŒ" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "종료 날짜/ì‹œê°„ì„ ê³¼ê±°ë¡œ 설정할수 없습니다" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "다ìŒìœ¼ë¡œ 시작" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "길ì´ê°€ 0m 보다 ìž‘ì„수 없습니다" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "다ìŒìœ¼ë¡œ ë남" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "길ì´ê°€ 00h 00mì¸ ì‡¼ë¥¼ ìƒì„± 할수 없습니다" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "ë‹¤ìŒ ë³´ë‹¤ í°" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "ì‡¼ì˜ ê¸¸ì´ê°€ 24h를 넘ì„수 없습니다" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "ë‹¤ìŒ ë³´íƒ€ ìž‘ì€" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "쇼를 중복ë˜ê²Œ 스케쥴할수 없습니다" + +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "ì´ë¦„:" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "ë‹¤ìŒ ë²”ìœ„ ì•ˆì— ìžˆëŠ” " +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "ì´ë¦„없는 쇼" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "길ì´ê°€ 0분 보다 길어야 합니다" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "길ì´ëŠ” \"00h 00m\"ì˜ í˜•íƒœ 여야 합니다 " +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "설명:" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "URLì€ \"http://domain\" 형태여야 합니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "ìžë™ìœ¼ë¡œ ë…¹ìŒëœ 쇼 업로드 하기" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "URLì€ 512ìºë¦­í„° 까지 허용합니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "Soundcloud 업로드 사용" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "웹 ìŠ¤íŠ¸ë¦¼ì˜ MIME íƒ€ìž…ì„ ì°¾ì„수 없습니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "Soundcloudì— ìžë™ìœ¼ë¡œ 파ì¼ì„ \"Downloadable\"ë¡œ 마í¬" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "ì›¹ìŠ¤íŠ¸ë¦¼ì˜ ì´ë¦„ì„ ì§€ì •í•˜ì‹­ì‹œì˜¤" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "SoundCloud ì´ë©”ì¼" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "XSPF 재ìƒëª©ë¡ì„ ë¶„ì„ í• ìˆ˜ 없습니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "SoundCloud 암호" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "PLS 재ìƒëª©ë¡ì„ ë¶„ì„ í• ìˆ˜ 없습니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "SoundCloud 태그: (여려 태그 입력시 ë„어쓰기로 구분)" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "M3U 재ìƒëª©ë¡ì„ 분ì„할수 없습니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "기본 장르:" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "ìž˜ëª»ëœ ì›¹ìŠ¤íŠ¸ë¦¼ - ì›¹ìŠ¤íŠ¸ë¦¼ì´ ì•„ë‹ˆê³  íŒŒì¼ ë‹¤ìš´ë¡œë“œ ë§í¬ìž…니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "기본 트랙 타입:" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "알수 없는 스트림 타입: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "오리지날" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "안녕하세요 %s님, \n암호 ìž¬ì„¤ì •ì„ í•˜ì‹œë ¤ë©´ ë§í¬ë¥¼ í´ë¦­í•˜ì„¸ìš”: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "리믹스" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Airtime 암호 초기화" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "ë¼ì´ë¸Œ" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "%s 재방송( %sì— ì‹œìž‘) " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "ë…¹ìŒ" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "ë§í¬ 쇼ì—ì„œ ì•„ì´í…œì„ 분리 할수 없습니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "ì¸í„°ë·°" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "현재 ë³´ê³  계신 ìŠ¤ì¼€ì¥´ì´ ë§žì§€ 않습니다(sched mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "í¬ë“œìºìŠ¤íŠ¸" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "현재 ë³´ê³  계신 ìŠ¤ì¼€ì¥´ì´ ë§žì§€ 않습니다(instance mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "ë°ëª¨" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "현재 ë³´ê³  계신 ìŠ¤ì¼€ì¥´ì´ ë§žì§€ 않습니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "진행중" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "쇼를 스케쥴 할수 있는 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤ %s." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "녹화 쇼ì—는 파ì¼ì„ 추가 할수 없습니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "지난 쇼(%s)ì— ë”ì´ìƒ ìŠ¤ì¼€ì¥´ì„ í• ìˆ˜ 없스니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "쇼 %s ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "ë§í¬ ì‡¼ì˜ ë‚´ìš©ì€ ì´ë¯¸ ë°©ì†¡ëœ ì‡¼ì˜ ì „í›„ì—만 스케쥴 할수 있습니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "ì„ íƒí•˜ì‹  파ì¼ì´ 존재 하지 않습니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "기본 ë¼ì´ì„¼ìŠ¤:" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "스마트 블ë¡" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "íŒŒì¼ ì—…ë¡œë“œë¥¼ 실패 하였습니다. ë‚¨ì€ diskê³µê°„ì´ %s MB ì´ê³ , íŒŒì¼ í¬ê¸°ê°€ %s MB 입니다." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "파ì¼ì´ ì†ìƒë˜ì—ˆìœ¼ë¯€ë¡œ, ë¼ì´ë¸ŒëŸ¬ë¦¬ì— 추가 ë˜ì§€ 않습니다." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "파ì¼ì´ 업로드 ë˜ì§€ 않았습니다. ì´ ì—러는 하드 디스í¬ì— ê³µê°„ì´ ì¶©ë¶„ì¹˜ 않거나, ê¶Œí•œì´ ë¶€ì¡±í•˜ì—¬ ìƒê¸¸ìˆ˜ 있습니다." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "소스를 ëŠì„수 있는 ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "ì—°ê²°ëœ ì†ŒìŠ¤ê°€ 없습니다" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "소스를 바꿀수 있는 ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" -msgstr "%sì˜ ìž¬ë°©ì†¡ %s부터 %s까지" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" -msgstr "다운로드" +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "" -#: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." -msgstr "시스템->스트림 ì—ì„œ ê´€ë¦¬ìž ì•„ì´ë””/암호를 다시 확ì¸í•˜ì„¸ìš”." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "시스템 ì´ë©”ì¼ ì‚¬ìš©(암호 리셋)" -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤" +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "암호 ì´ˆê¸°í™”ì— ë³´ë‚¸ì´ ì´ë©”ì¼ ì£¼ì†Œ" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤" +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "ë©”ì¼ ì„œë²„ 설정" -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "파ì¼ì´ 존재 하지 않습니다" +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "ì¸ì¦ í•„ìš”" -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "파ì¼ì´ 존재 하지 않습니다" +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "ë©”ì¼ ì„œë²„" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "파ì¼ì´ 존재 하지 않습니다" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "ì´ë©”ì¼ ì£¼ì†Œ" -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "" +#: airtime_mvc/application/controllers/ListenerstatController.php:56 +msgid "Please make sure admin user/password is correct on System->Streams page." +msgstr "시스템->스트림 ì—ì„œ ê´€ë¦¬ìž ì•„ì´ë””/암호를 다시 확ì¸í•˜ì„¸ìš”." -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "" +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "제목없는 웹스트림" -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 -#, php-format -msgid "%s not found" -msgstr "%s를 ì°¾ì„수 없습니다" +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "ì›¹ìŠ¤íŠ¸ë¦¼ì´ ì €ìž¥ ë˜ì—ˆìŠµë‹ˆë‹¤" -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "알수없는 ì—러." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "ìž˜ëª»ëœ ê°’ìž…ë‹ˆë‹¤" -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "프리뷰" +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "ì•„ì´ë””와 암호를 입력해주세요" -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "ìž¬ìƒ ëª©ë¡ì— 추가" +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "ì•„ì´ë””와 암호가 맞지 않습니다. 다시 ì‹œë„해주세요" -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "스마트 블ë¡ì— 추가" +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "ì´ë©”ì¼ì„ 전송 할수 없습니다. ë©”ì¼ ì„œë²„ ì„¸íŒ…ì„ ë‹¤ì‹œ í™•ì¸ í•˜ì—¬ 주세요" -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "메타ë°ì´íƒ€ 수정" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "ì´ë©”ì¼ì„ ì°¾ì„수 없습니다" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "ì¤‘ë³µëœ í”Œë ˆì´ ë¦¬ìŠ¤íŠ¸" +#: airtime_mvc/application/controllers/ScheduleController.php:350 +#, php-format +msgid "Rebroadcast of show %s from %s at %s" +msgstr "%sì˜ ìž¬ë°©ì†¡ %s부터 %s까지" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" +msgstr "다운로드" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "ì•¡ì…˜ ì—†ìŒ" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "사용ìžê°€ 추가 ë˜ì—ˆìŠµë‹ˆë‹¤!" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "ì„ íƒëœ ì•„ì´í…œì„ 지울수 있는 ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤." +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "ì‚¬ìš©ìž ì •ë³´ê°€ ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "ìŠ¤ì¼€ì¥´ëœ ì•„ì´í…œë“¤ì€ ì‚­ì œ 할수 없습니다" +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "ì„¸íŒ…ì´ ì„±ê³µì ìœ¼ë¡œ ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤!" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "%sì˜ ì‚¬ë³¸" +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "페ì´ì§€ë¥¼ ì°¾ì„수 없습니다" + +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Application 애러" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1874,6 +1590,11 @@ msgstr "ìž¬ìƒ ëª°ë¡ì—는 파ì¼, 스마트 블ë¡, 웹스트림만 추가 ê°€ msgid "Please select a cursor position on timeline." msgstr "타임 ë¼ì¸ì—ì„œ 커서를 먼져 ì„ íƒ í•˜ì—¬ 주세요." +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "메타ë°ì´íƒ€ 수정" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "ì„ íƒëœ ì‡¼ì— ì¶”ê°€" @@ -1920,6 +1641,7 @@ msgstr "로딩..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "ì „ì²´" @@ -1990,9 +1712,7 @@ msgstr "hh:mm:ss.tì˜ í˜•íƒœë¡œ 입력해주세요" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "현재 파ì¼ì´ 업로드 중입니다. %s다른 화면으로 ì´ë™í•˜ë©´ 현재까지 업로드한 프로세스가 취소ë©ë‹ˆë‹¤. %sì´ë™í•˜ê² ìŠµë‹ˆê¹Œ?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2028,10 +1748,7 @@ msgid "Playlist shuffled" msgstr "í”Œë ˆì´ ë¦¬ìŠ¤íŠ¸ê°€ 셔플 ë˜ì—ˆìŠµë‹ˆë‹¤" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "Airtimeì´ íŒŒì¼ì— 대해 정확히 알수 없습니다. ì´ ê²½ìš°ëŠ” 파ì¼ì´ 접근할수 없는 리모트 ë“œë¼ì´ë¸Œì— 있거나, 파ì¼ì´ 있는 í´ë”ê°€ ë”ì´ìƒ 모니터 ë˜ì§€ ì•Šì„ë•Œ ì¼ì–´ë‚ ìˆ˜ 있습니다." #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2057,24 +1774,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "í—ˆìš©ëœ ì´ë¯¸ì§€ íŒŒì¼ íƒ€ìž…ì€ jpg, jpeg, png ë˜ëŠ” gif 입니다" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "ì •ì  ìŠ¤ë§ˆíŠ¸ 블ë¡ì€ í¬ë¼ì´í…Œë¦¬ì•„를 저장하고 ë‚´ìš©ì„ ìƒì„± 합니다. 그러므로 ì‡¼ì— ì¶”ê°€ í•˜ê¸°ì „ì— ë‚´ìš©ì„ ìˆ˜ì •í•˜ì‹¤ìˆ˜ 있습니다 " #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "ë™ì  스마트 블ë¡ì€ í¬ë¼ì´í…Œë¦¬ì•„만 저장하고 ë‚´ìš©ì€ ì‡¼ì— ì¶”ê°€ 할때까지 ìƒì„±í•˜ì§€ 않습니다. ì´ëŠ” ë™ì  스마트 블ë¡ì„ ì‡¼ì— ì¶”ê°€ 할때마다 다른 ë‚´ìš©ì„ ì¶”ê°€í•˜ê²Œ ë©ë‹ˆë‹¤." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "ë¸”ë¡ ìƒì„±ì‹œ 충분한 파ì¼ì„ 찾지 못하면, ë¸”ë¡ ê¸¸ì´ê°€ ì›í•˜ëŠ” 길ì´ë³´ë‹¤ 짧아 질수 있습니다. ì´ ì˜µì…˜ì„ ì„ íƒí•˜ì‹œë©´,Airtimeì´ íŠ¸ëž™ì„ ë°˜ë³µì ìœ¼ë¡œ 사용하여 길ì´ë¥¼ 채ì›ë‹ˆë‹¤." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2107,6 +1815,11 @@ msgid "" "This will remove the files from your Airtime library!" msgstr "저장 í´ë”를 수정하길 ì›í•˜ì‹­ë‹ˆê¹Œ? 수정시 모든 파ì¼ì´ ë¼ì´ë¸ŒëŸ¬ë¦¬ì—ì„œ 사ë¼ì§‘니다." +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "미디어 í´ë” 관리" + #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" msgstr "ì„ íƒí•˜ì‹  í´ë”를 모니터 리스트ì—ì„œ ì‚­ì œ 하시겠습ㄴ지까?" @@ -2117,9 +1830,7 @@ msgstr "ê²½ë¡œì— ì ‘ê·¼í• ìˆ˜ 없습니다" #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "ì–´ë–¤ ìŠ¤íŠ¸ë¦¼ì€ ì¶”ê°€ ì„¤ì •ì´ í•„ìš”í•©ë‹ˆë‹¤. %sAAC+ 지ì›%s ë˜ëŠ” %sOpus 지ì›%s 설명" #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2130,22 +1841,12 @@ msgstr "ìŠ¤íŠ¸ë¦¬ë° ì„œë²„ì— ì ‘ì†ë¨" msgid "The stream is disabled" msgstr "ìŠ¤íŠ¸ë¦¼ì´ ì‚¬ìš©ë˜ì§€ ì•ŠìŒ" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "서버ì—ì„œ 정보를 받는중..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "ìŠ¤íŠ¸ë¦¬ë° ì„œë²„ì— ì ‘ì† í• ìˆ˜ ì—†ìŒ" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "Airtimeì´ ë°©í™”ë²½ ë’¤ì— ì„¤ì¹˜ ë˜ì—ˆë‹¤ë©´, í¬íŠ¸ í¬ì›Œë”©ì„ 설정해야 í• ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. ì´ ê²½ìš°ì—” ìžë™ìœ¼ë¡œ ìƒì„±ëœ ì´ ì •ë³´ê°€ 틀릴수 있습니다. 수ë™ì ìœ¼ë¡œ ì´ í•„ë“œë¥¼ 수정하여 DJë“¤ì´ ì ‘ì†í•´ì•¼ 하는서버/마운트/í¬íŠ¸ ë“±ì„ ê³µì§€ 하십시오. í¬íŠ¸ 범위는 1024~49151 입니다." #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2154,61 +1855,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "ë” ìžì„¸í•œ 정보는 %sAirtime Manual%sì—ì„œ 찾으실수 있습니다" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "OGG ìŠ¤íŠ¸ë¦¼ì˜ ë©”íƒ€ë°ì´íƒ€ë¥¼ 사용하고 싶으시면, ì´ ì˜µì…˜ì„ ì²´í¬ í•´ì£¼ì„¸ìš”. VLC나 mplayer ê°™ì€ í”Œëž˜ì´ì–´ë“¤ì—ì„œ 버그가 발견ë˜ì–´ OGG ìŠ¤íŠ¸ë¦¼ì„ ë©”íƒ€ë°ì´íƒ€ì™€ í•¨ê¼ ì‚¬ìš©ì‹œ, ê° íŒŒì¼ ì¢…ë£Œì‹œ ìŠ¤íŠ¸ë¦¼ì„ ëŠì–´ë²„립니다." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "마스터/쇼 소스가 ëŠì–´ì¡Œì„ë•Œ ìžë™ìœ¼ë¡œ 스위치를 ë”." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "마스터/쇼 소스가 ì ‘ì† ë˜ì—ˆì„ë•Œ ìžë™ìœ¼ë¡œ 스위를 켬." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "Icecast 서버 ì¸ì¦ ì•„ì´ë””ê°€ sourceë¡œ ì„¤ì •ì´ ë˜ì–´ìžˆë‹¤ë©´, ì´ í•„ë“œëŠ” ìž…ë µ 하실필요 없습니다." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "현재 사용중ì´ì‹  ë¼ì´ë¸Œ ìŠ¤íŠ¸ë¦¬ë° í´ë¼ì´ì–¸íŠ¸ì— ì‚¬ìš©ìž í•„ë“œê°€ 없다면, ì´ í•„ë“œì— 'source'ë¼ê³  ìž…ë ¥ 해주세요." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "스트림 ë˜ê³  있는 ìŠ¤íŠ¸ë¦¼ì— ì•„ì´ë””나 암호를 수정한다면, í”Œë ˆì´ ì•„ì›ƒ ì—”ì§„ì´ ë‹¤ì‹œ 시작ë˜ë©°, ì²­ì·¨ìžë“¤ì´ 5~10ì´ˆ ì •ë„ ì •ì ì´ 들릴것입니다. ë‹¤ìŒ í•„ë“œë“¤ì„ ìˆ˜ì •í•˜ëŠ”ê²ƒì€ ì—”ì§„ì„ ë‹¤ì‹œ 시작 하지 않습니다: (스트림 ë ˆì´ë¸”, 스위치 페ì´ë”©, 마스터 마ì´ë””, 마스터 암호). Airtimeì´ í˜„ìž¬ ë…¹ìŒ ì¤‘ì´ê³  ì—”ì§„ì´ ìž¬ì‹œìž‘ ë˜ë©´ ë…¹ìŒì´ 중단 ë©ë‹ˆë‹¤" #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "ê´€ë¦¬ìž ì•„ì´ë””/암호는 Icecast와 SHOUTcastì—ì„œ ì²­ì·¨ìž í†µê³„ë¥¼ 얻기 위해 필요합니다" #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2216,9 +1892,7 @@ msgid "No result found" msgstr "ê²°ê³¼ ì—†ìŒ" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "ì‡¼ì— ì§€ì •ëœ ì‚¬ëžŒë“¤ë§Œ ì ‘ì† í• ìˆ˜ 있습니다" #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2234,16 +1908,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "주ì˜: 쇼는 다시 ë§í¬ ë ìˆ˜ 없습니다" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "반복 ë˜ëŠ” 쇼를 ë§í¬í•˜ë©´, 반복 ì‡¼ì— ìŠ¤ì¼€ì¥´ëœ ì•„ì´í…œë“¤ì´ 다른 반복 쇼ì—ë„ ìŠ¤ì¼€ì¥´ì´ ë©ë‹ˆë‹¤" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2399,79 +2068,8 @@ msgstr "주별" msgid "month" msgstr "월별" -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "ì¼ìš”ì¼" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "월요ì¼" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "화요ì¼" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "수요ì¼" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "목요ì¼" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "금요ì¼" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "토요ì¼" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "ì¼" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "ì›”" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "í™”" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "수" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "목" - -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "금" - -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "토" - #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "쇼가 ìžì‹ ì˜ 길ì´ë³´ë‹¤ ë” ê¸¸ê²Œ 스케쥴 ë˜ì—ˆë‹¤ë©´, 쇼 길ì´ì— 맞게 짤ë¼ì§€ë©°, ë‹¤ìŒ ì‡¼ê°€ 시작 ë©ë‹ˆë‹¤" #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2499,6 +2097,11 @@ msgstr "모든 내용물 삭제하시겠습까?" msgid "Delete selected item(s)?" msgstr "ì„ íƒí•œ ì•„ì´í…œì„ ì‚­ì œ 하시겠습니까?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "시작" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "종료" @@ -2532,14 +2135,6 @@ msgstr "ì•„ì´í…œ 1ê°œ ì´ë™" msgid "Moving %s Items" msgstr "ì•„ì´í…œ %sê°œ ì´ë™" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "취소" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "페ì´ë“œ ì—디터" @@ -2549,8 +2144,7 @@ msgid "Cue Editor" msgstr "í ì—디터" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "웨ì´ë¸Œ í¼ ê¸°ëŠ¥ì€ Web Audio API를 지ì›í•˜ë©´ 브ë¼ìš°ì €ì—서만 사용 가능합니다" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2581,6 +2175,13 @@ msgstr "현재 쇼 취소" msgid "Open library to add or remove content" msgstr "ë¼ì´ë¸ŒëŸ¬ë¦¬ 열기" +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "ë‚´ìš© 추가/제거" + #: airtime_mvc/application/controllers/LocaleController.php:305 msgid "in use" msgstr "사용중" @@ -2597,26 +2198,6 @@ msgstr "경로" msgid "Open" msgstr "열기" -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "관리ìž" - -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "" - -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "프로그램 매니저" - -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "ì†ë‹˜" - #: airtime_mvc/application/controllers/LocaleController.php:316 msgid "Guests can do the following:" msgstr "ì†ë‹˜ì˜ 권한:" @@ -2681,12 +2262,6 @@ msgstr "ì‚¬ìš©ìž ê´€ë¦¬" msgid "Manage watched folders" msgstr "모니터 í´í„° 관리" -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "ì‚¬ìš©ìž í”¼ë“œë°±ì„ ë³´ëƒ„" - #: airtime_mvc/application/controllers/LocaleController.php:333 msgid "View system status" msgstr "ì´ì‹œìŠ¤í…œ ìƒí™© 보기" @@ -2751,6 +2326,12 @@ msgstr "금" msgid "Sa" msgstr "토" +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "닫기" + #: airtime_mvc/application/controllers/LocaleController.php:355 msgid "Hour" msgstr "ì‹œ" @@ -2772,6 +2353,14 @@ msgstr "íŒŒì¼ ì„ íƒ" msgid "Add files to the upload queue and click the start button." msgstr "업로드를 ì›í•˜ëŠ” 파ì¼ì„ ì„ íƒí•˜ì‹ í›„ 시작 ë²„í‹‘ì„ ëˆŒëŸ¬ì£¼ì„¸ìš”." +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "ìƒíƒœ" + #: airtime_mvc/application/controllers/LocaleController.php:365 msgid "Add Files" msgstr "íŒŒì¼ ì¶”ê°€" @@ -2859,6 +2448,12 @@ msgstr "ì—러: 파ì¼ì´ 너무 í½ë‹ˆë‹¤:" msgid "Error: Invalid file extension: " msgstr "ì—러: 지ì›í•˜ì§€ 않는 확장ìž:" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:389 msgid "Create Entry" msgstr "" @@ -2874,28 +2469,179 @@ msgstr "%s row %s를 í´ë¦½ë³´ë“œë¡œ 복사 하였습니다" #: airtime_mvc/application/controllers/LocaleController.php:394 #, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." msgstr "%sPrint view%s프린트를 하려면 브ë¼ìš°ì €ì˜ 프린트 ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ì—¬ì£¼ì„¸ìš”. 종료를 ì›í•˜ì‹œë©´ ESC키를 누르세요" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "ì•„ì´ë””와 암호를 입력해주세요" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "소스를 ëŠì„수 있는 ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "ì•„ì´ë””와 암호가 맞지 않습니다. 다시 ì‹œë„해주세요" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "ì—°ê²°ëœ ì†ŒìŠ¤ê°€ 없습니다" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "ì´ë©”ì¼ì„ 전송 할수 없습니다. ë©”ì¼ ì„œë²„ ì„¸íŒ…ì„ ë‹¤ì‹œ í™•ì¸ í•˜ì—¬ 주세요" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "소스를 바꿀수 있는 ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "ì´ë©”ì¼ì„ ì°¾ì„수 없습니다" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "ì˜¤ëž˜ëœ %s를 ë³´ê³  있습니다" + +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "ë™ì ì¸ 스마트 블ë¡ì—는 íŠ¸ëž™ì„ ì¶”ê°€ 할수 없습니다" + +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%s를 ì°¾ì„수 없습니다" + +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "ì„ íƒí•˜ì‹  %s를 ì‚­ì œ 할수 있는 ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤." + +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "알수없는 ì—러." + +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "스마트 블ë¡ì—는 트랙만 추가 가능합니다" + +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "제목없는 재ìƒëª©ë¡" + +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "제목없는 스마트 블ë¡" + +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "모르는 재ìƒëª©ë¡" + +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤" + +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤" + +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "파ì¼ì´ 존재 하지 않습니다" + +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "파ì¼ì´ 존재 하지 않습니다" + +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "파ì¼ì´ 존재 하지 않습니다" + +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "" + +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "" + +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "프리뷰" + +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "ìž¬ìƒ ëª©ë¡ì— 추가" + +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "스마트 블ë¡ì— 추가" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "ì‚­ì œ" + +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "ì¤‘ë³µëœ í”Œë ˆì´ ë¦¬ìŠ¤íŠ¸" + +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "수정" + +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "" + +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "Soundcloud 보기" + +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "Soundcloudì— ë‹¤ì‹œ 업로드" + +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Soundcloudì— ì—…ë¡œë“œ" + +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "ì•¡ì…˜ ì—†ìŒ" + +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "ì„ íƒëœ ì•„ì´í…œì„ 지울수 있는 ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤." + +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "ìŠ¤ì¼€ì¥´ëœ ì•„ì´í…œë“¤ì€ ì‚­ì œ 할수 없습니다" + +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "%sì˜ ì‚¬ë³¸" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "커서 ì„ íƒ" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "커서 제거" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "쇼가 존재 하지 ì•ŠìŒ" #: airtime_mvc/application/controllers/PreferenceController.php:74 msgid "Preferences updated." @@ -2910,1000 +2656,1141 @@ msgstr "ì§€ì› ì„¤ì •ì´ ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤" msgid "Support Feedback" msgstr "ì‚¬ìš©ìž í”¼ë“œë°±" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." -msgstr "스트림 ì„¤ì •ì´ ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤" +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." +msgstr "스트림 ì„¤ì •ì´ ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤" + +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" +msgstr "경로를 입력해주세요" + +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." +msgstr "Liquidsoap 문제..." + +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "방송중" + +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "미디어 추가" + +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "ë¼ì´ë¸ŒëŸ¬ë¦¬" + +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "스케쥴" + +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "시스템" + +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "설정" + +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "계정" + +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "미디어 í´ë”" + +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "스트림" + +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "ì²­ì·¨ìž í†µê³„" + +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "" + +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "방송 기ë¡" + +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "" + +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "ë„움" + +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "ì´ˆë³´ìž ê°€ì´ë“œ" + +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "ì‚¬ìš©ìž ë©”ë‰´ì–¼" + +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "ì •ë³´" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" -msgstr "경로를 입력해주세요" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "서비스" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." -msgstr "Liquidsoap 문제..." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "업타임" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "커서 ì„ íƒ" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "커서 제거" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "메모리" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "쇼가 존재 하지 ì•ŠìŒ" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Airtime 버전" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "제목없는 웹스트림" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "ë””ìŠ¤í¬ ê³µê°„" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "ì›¹ìŠ¤íŠ¸ë¦¼ì´ ì €ìž¥ ë˜ì—ˆìŠµë‹ˆë‹¤" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "ì´ë©”ì¼/ë©”ì¼ ì„œë²„ 설정" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "ìž˜ëª»ëœ ê°’ìž…ë‹ˆë‹¤" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "SoundCloud 설정" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "ì˜¤ëž˜ëœ %s를 ë³´ê³  있습니다" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "반복 날짜:" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "ë™ì ì¸ 스마트 블ë¡ì—는 íŠ¸ëž™ì„ ì¶”ê°€ 할수 없습니다" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "제거" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "ì„ íƒí•˜ì‹  %s를 ì‚­ì œ 할수 있는 ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤." +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "추가" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "스마트 블ë¡ì—는 트랙만 추가 가능합니다" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "ì ‘ì† URL:" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "제목없는 재ìƒëª©ë¡" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "ìž…ë ¥ 스트림 설정" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "제목없는 스마트 블ë¡" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "마스터 소스 ì ‘ì† URL:" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "모르는 재ìƒëª©ë¡" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "ë®ì–´ì“°ê¸°" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "페ì´ì§€ë¥¼ ì°¾ì„수 없습니다" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "확ì¸" -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Application 애러" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "초기화" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "사용ìžê°€ 추가 ë˜ì—ˆìŠµë‹ˆë‹¤!" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "쇼 소스 ì ‘ì† URL:" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "ì‚¬ìš©ìž ì •ë³´ê°€ ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤!" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(*)" -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "ì„¸íŒ…ì´ ì„±ê³µì ìœ¼ë¡œ ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "Airtime 등ë¡" -#: airtime_mvc/application/common/DateHelper.php:213 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 #, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "ë…„ë„ ê°’ì€ %s 1753 - 9999 입니다" +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Airtime 사용ìžë“¤ 께서 í”¼ë“œë°±ì„ ë³´ë‚´ì£¼ì‹œë©´, 그걸 기본으로 사용ìžë“¤ì´ ì›í•˜ëŠ” 방향으로 나아가는Airtimeì´ ë˜ê² ìŠµë‹ˆë‹¤. %s'Airtime ë„와주기' í´ë¦­í•˜ì—¬ í”¼ë“œë°±ì„ ë³´ë‚´ì£¼ì„¸ìš”" -#: airtime_mvc/application/common/DateHelper.php:216 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 #, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s는 맞지 않는 날짜 입니다" +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "%sSourcefabric.org%sì— ë°©ì†¡êµ­ì„ í™ë³´ 하시려면 ì²´í¬ í•˜ì„¸ìš”. ì²´í¬ í•˜ê¸° 위해선 '피드백 보내기'를 ì²´í¬ í•˜ì…”ì•¼ 합니다" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s:%s:%s는 맞지 않는 시간 입니다" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(확ì¸ì„ 위한것입니다, ì´ ì •ë³´ëŠ” ì–´ë””ì—ë„ ê²Œì‹œ ë˜ì§€ 않습니다)" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "ì´ë¦„없는 쇼" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "주ì˜: 600*600보다 í° ì´ë¯¸ì§€ëŠ” 사ì´ì¦ˆê°€ 수정 ë©ë‹ˆë‹¤" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "í´ë” 가져오기" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "보내지는 ë°ì´íƒ€ 보기" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë”" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "ì‚¬ìš©ìž ì•½ê´€" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "옳치 ì•Šì€ í´ë” 입니다" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "암호 초기화" -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "ì•„ì´ë””: " +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "í´ë” ì„ íƒ" -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "암호: " +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "저장" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "암호 확ì¸:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "현재 저장 í´ë”:" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "ì´ë¦„:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë” 다시 검색(ë„¤íŠ¸ì›Œí¬ ë“œë¼ì´ë¸Œë¥¼ 모니터중ì¼ë–„, Airtimeê³¼ ë™ê¸°í™” 실패시 사용)" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "성:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë”를 리스트ì—ì„œ ì‚­ì œ" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "ì´ë©”ì¼" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë”ê°€ 없습니다" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "휴대전화:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "스트림 " + +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "추가 설정" + +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "ë°‘ì— ì •ë³´ë“¤ì€ ì²­ì·¨ìžì— 플래ì´ì–´ì— 표시 ë©ë‹ˆë‹¤:" + +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(방송국 웹사ì´íŠ¸ 주소)" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "스카입:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "스트림 URL: " -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "í•„í„° 히스토리" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "유저 타입" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "쇼 찾기" -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "사용할수 없는 ì•„ì´ë”” 입니다" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "쇼 í•„í„°" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "ìžë™ 스위치 ë„기" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "%sì˜ ì„¤ì •" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "ìžë™ 스위치 켜기" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Airtime 사용ìžë“¤ 께서 í”¼ë“œë°±ì„ ë³´ë‚´ì£¼ì‹œë©´, 그걸 기본으로 사용ìžë“¤ì´ ì›í•˜ëŠ” 방향으로 나아가는Airtimeì´ ë˜ê² ìŠµë‹ˆë‹¤. %s'Airtime ë„와주기' í´ë¦­í•˜ì—¬ í”¼ë“œë°±ì„ ë³´ë‚´ì£¼ì„¸ìš”" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "스위치 페ì´ë”©" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "%sSourcefabric.org%sì— ë°©ì†¡êµ­ì„ í™ë³´ 하시려면 ì²´í¬ í•˜ì„¸ìš”." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "ì´ˆ 단위를 입력해 주세요 00{.000000}" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(ì²´í¬ í•˜ê¸° 위해선 '피드백 보내기'를 ì²´í¬ í•˜ì…”ì•¼ 합니다)" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "마스터 ì•„ì´ë””" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Sourcefabric ì´ìš© 약관" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "마스터 암호" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "마스터 소스 ì ‘ì† URL" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "쇼 소스 ì ‘ì† URL" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "날짜 ì„ íƒ" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "마스터 소스 í¬íŠ¸" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "스마트 ë¸”ë¡ ì˜µì…˜" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "숫ìžë§Œ 허용 ë©ë‹ˆë‹¤" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "마스터 소스 마운트 지ì " +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "허용ë˜ì§€ 않는 문ìžìž…니다" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr " 부터 " -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "쇼 소스 í¬íŠ¸" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "ê°œì˜ íŒŒì¼ë“¤" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "쇼 소스 마운트 지ì " +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "ê°œì˜ íŒŒì¼ë“¤" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "마스터 소스 í¬íŠ¸ì™€ ê°™ì€ í¬íŠ¸ë¥¼ 사용할수 없스니다" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "í¬íŠ¸ %s는 ì´ìš© 할수 없습니다" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%value%'ì€ ì‹œê°„ 형ì‹('HH:mm')ì— ë§žì§€ 않습니다." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "날짜/시간 시작:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "날짜/시간 종료:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "길ì´:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "시간대:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "반복?" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "쇼를 ê³¼ê±°ì— ìƒì„± 할수 없습니다" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "ì´ë¯¸ 시작한 ì‡¼ì˜ ì‹œìž‘ 날짜/ì‹œê°„ì„ ë°”ê¿€ìˆ˜ 없습니다" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "길ì´ê°€ 0m 보다 ìž‘ì„수 없습니다" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "길ì´ê°€ 00h 00mì¸ ì‡¼ë¥¼ ìƒì„± 할수 없습니다" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "새로 만들기" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "ì‡¼ì˜ ê¸¸ì´ê°€ 24h를 넘ì„수 없습니다" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "새 ìž¬ìƒ ëª©ë¡" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" -msgstr "ë§í¬:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "새 스마트 블ë¡" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "반복 유형:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "새 웹스트림" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "주간" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "설명 보기/수정" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" -msgstr "" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "스트림 URL:" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" -msgstr "" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "기본 길ì´:" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" -msgstr "" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "열린 웹스트림 ì—†ìŒ" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "월간" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "ë½ìŠ¤íŠ¸ë¦¼ 설정" -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "날짜 ì„ íƒ" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "ì „ì—­ 설정" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "월중 날짜" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "출력 스트림 설정" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "주중 날짜" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "íŒŒì¼ ê°€ì ¸ì˜¤ê¸° 진행중" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "종료" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "고급 검색 옵션" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "무한 반복?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "ì´ì „" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "종료 ì¼ì´ ì‹œìž‘ì¼ ë³´ë‹¤ 먼져 입니다." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "재ìƒ" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "중지" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "ì´ í•„ë“œëŠ” 비워둘수 없습니다." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "다ìŒ" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "암호" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "정지" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "새 암호 확ì¸" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "ìŒì†Œê±°" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "암호와 암호 í™•ì¸ ê°’ì´ ì¼ì¹˜ 하지 않습니다." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "ìŒì†Œê±° í•´ì œ" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "새 암호 받기" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "최대 ìŒëŸ‰ " -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "방송국 ì´ë¦„" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "ì—…ë°ì´íŠ¸ê°€ 필요함" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "ì „í™”" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "미디어를 재ìƒí•˜ê¸° 위해선, 브ë¼ìš°ì €ë¥¼ 최신 버젼으로 ì—…ë°ì´íŠ¸ 하시고, %sFlash plugin%së„ ì—…ë°ì´íŠ¸ 해주세요" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "방송국 웹사ì´íŠ¸" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "길ì´:" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "나ë¼" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "샘플 ë ˆì´íŠ¸:" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "ë„ì‹œ" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "ISRC 넘버:" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "방송국 설명" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "íŒŒì¼ ìœ„ì¹˜:" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "방송국 로고" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "웹스트림" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "ë‚´ ë°©ì†¡êµ­ì„ Sourcefabric.orgì— í™ë³´" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "ë™ì  스마트 블ë¡" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "ì´ ë°•ìŠ¤ì— ì²´í¬í•¨ìœ¼ë¡œ, Sourcefabric's %sprivacy policy%sì— ë™ì˜í•©ë‹ˆë‹¤." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "ì •ì  ìŠ¤ë§ˆíŠ¸ 블ë¡" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "ì‚¬ìš©ìž ì•½ê´€ì— ë™ì˜ 하십시오" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "오디오 트랙" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%value%'ì€ ë§žì§€ 않는 ì´ë©”ì¼ í˜•ì‹ ìž…ë‹ˆë‹¤." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "재ìƒëª©ë¡ ë‚´ìš©" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%'ì€ ë‚ ì§œ 형ì‹('%format%')ì— ë§žì§€ 않습니다." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "ì •ì  ìŠ¤ë§ˆíŠ¸ ë¸”ë¡ ë‚´ìš©: " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%'는 %min%ê¸€ìž ë³´ë‹¤ 짧ì„수 없습니다" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "ë™ì  스마트 ë¸”ë¡ ë‚´ìš©: " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%value%'는 %max%ê¸€ìž ë³´ë‹¤ 길수 없습니다" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "ê¸¸ì´ ì œí•œ " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%'ì€ '%min%'와 '%max%' 사ì´ì— 있지 않습니다." +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "암호가 맞지 않습니다" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "사용:" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "스트림 타입:" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "시간 ê²½ê³¼ì— ë”°ë¥¸ ì²­ì·¨ìž ìˆ«ìž " -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "서비스 타입:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Airtimeì— ì˜¤ì‹ ê±¸ 환ì˜í•©ë‹ˆë‹¤" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "채ë„:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Airtimeì„ ì´ìš©í•˜ì—¬ ë°©ì†¡ì„ ìžë™í™” 할수 있는 기본 ê°€ì´ë“œ 입니다:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - 모노" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "미디어 추가 페ì´ì§€ë¡œ 가셔서 ì›í•˜ëŠ” 파ì¼ì„ 드래그 앤 ë“œëž í•˜ì‹­ì‹œì˜¤. ë¼ì´ë¸ŒëŸ¬ë¦¬ 페ì´ì§€ë¥¼ 가시면 ì—…ë¡œë“œëœ íŒŒì¼ì„ í™•ì¸ í• ìˆ˜ 있습니다." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - 스테레오" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "스케쥴 페ì´ì§€ì— 가셔서 ì›í•˜ëŠ” ë‚ ì§œì— ë”블í´ë¦­ 하셔서 쇼를 ìƒì„± 하십시오. 관지ìžì™€ 프로그램 매니저만 쇼를 ìƒì„±í• ìˆ˜ 있는 ê¶Œí•œì´ ìžˆìŠµë‹ˆë‹¤" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "서버" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "만드신 ì‡¼ì— í´ë¦­ì„ í•˜ì‹ ë‹¤ìŒ 'ë‚´ìš© 추가/제거' 를 í´ë¦­í•˜ì‹­ì‹œì˜¤." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "í¬íŠ¸" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "왼쪽 ë¼ì´ë¸ŒëŸ¬ë¦¬ 스í¬ë¦°ì—ì„œ 오른쪽 쇼 ë‚´ìš© 패ë„ë¡œ 드래그 앤 ë“œëž í•˜ë©° 미디어를 추가 합니다" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "첫 번째 쇼를 성공ì ìœ¼ë¡œ ìƒì„± 하였습니다." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "마운트 지ì " +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "ë” ìžì„¸í•œ ë„ì›€ì„ ì›í•˜ì‹œë©´, ë©”ë‰´ì–¼ì„ ì°¸ê³  하여 주세요. %suser manual%s" + +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "공유" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "ê´€ë¦¬ìž ì•„ì´ë””" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "스트림 ì„ íƒ" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "ê´€ë¦¬ìž ì•”í˜¸" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "서버를 지정해주세요" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "í¬íŠ¸ë¥¼ 지정해주세요" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "새 암호" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "Icecast 서버는 마운트 지ì ì„ 지정해야 합니다" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "새 암호 확ì¸" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "하드ì—ì–´ 오디오 출력" +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "ì‚¬ìš©ìž ê³„ì •ì˜ ì´ë©”ì¼ì„ 입력해 주세요. 새로 암호를 설정할수 있는 ë§í¬ê°€ í¬í•¨ëœ ì´ë©”ì¼ì´ 전송 ë©ë‹ˆë‹¤" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "출력 유형" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "ì´ë©”ì¼ì´ 전송 ë˜ì—ˆìŠµë‹ˆë‹¤" -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Icecast Vorbis 메타ë°ì´íƒ€" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "ì´ë©”ì¼ì´ 전송 ë˜ì—ˆìŠµë‹ˆë‹¤" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "스트림 ë ˆì´ë¸”" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "ë¡œê·¸ì¸ íŽ˜ì´ì§€ë¡œ 가기" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "아티스트 - 제목" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "Airtime ë°ëª¨ì— 오신건 환ì˜í•©ë‹ˆë‹¤! admin/admin으로 ë¡œê·¸ì¸ í•˜ì‹­ì‹œì˜¤." -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "쇼 - 아티스트 - 제목" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "ì´ì „:" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "방송국 ì´ë¦„ - 쇼 ì´ë¦„" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "다ìŒ:" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "오프 ì—ì–´ 메타ë°ì´íƒ€" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "소스 스트림" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "ë¦¬í”Œë ˆì´ ê²Œì¸ í™œì„±í™”" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "마스터 소스" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "ë¦¬í”Œë ˆì´ ê²Œì¸ ì„¤ì •" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "쇼 소스" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "ì‚¬ìš©ìž ê²€ìƒ‰:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "스케쥴" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "DJ들:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "방송중" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "Line In으로 ë…¹ìŒ" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "듣기" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "재방송?" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "방송국 시간" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "시스템 ì´ë©”ì¼ ì‚¬ìš©(암호 리셋)" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr " " -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "암호 ì´ˆê¸°í™”ì— ë³´ë‚¸ì´ ì´ë©”ì¼ ì£¼ì†Œ" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Airtimeì„ êµ¬ìž…í•˜ì„¸ìš”" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "ë©”ì¼ ì„œë²„ 설정" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "ë‚´ 계정" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "ì¸ì¦ í•„ìš”" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "ì‚¬ìš©ìž ê´€ë¦¬" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "ë©”ì¼ ì„œë²„" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "새 사용ìž" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "ì´ë©”ì¼ ì£¼ì†Œ" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "ì•„ì´ë””" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "ë°‘ì— ë³´ì´ëŠ” ê·¸ë¦¼ì— ë‚˜ì˜¨ 문ìžë¥¼ 입력하세요" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "ì´ë¦„" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "날짜를 설정하세요" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "성" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "ì‹œê°„ì„ ì„¤ì •í•˜ì„¸ìš”" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "ì‚¬ìš©ìž ìœ í˜•" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "재방송 설정까지 1시간 ê¸°ê°„ì´ í•„ìš”í•©ë‹ˆë‹¤" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Airtime ì¸ì¦ 사용" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "Custom ì¸ì¦ 사용" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "Custom ì•„ì´ë””" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "Custom 암호" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "페ì´ì§€ë¥¼ ì°¾ì„수 없습니다!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "ì•„ì´ë””를 입력해주세요" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "찾는 페ì´ì§€ê°€ 존재 하지 않습니다!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "암호를 입력해주세요" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "ì •ì  ë¸”ë¡ í™•ìž¥" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "시작" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "ë™ì  ë¸”ë¡ í™•ìž¥" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "기본 í¬ë¡œìŠ¤íŽ˜ì´ë“œ 길ì´(s)" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "내용물 ì—†ìŒ" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "초단위를 입력해주세요 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "내용물 ì—†ìŒ" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" -msgstr "기본 페ì´ë“œ ì¸(s)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" +msgstr "ìž¬ìƒ ëª©ë¡ ë¹„ìš°ê¸°" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" -msgstr "기본 페ì´ë“œ 아웃(s)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" +msgstr "지우기" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "리모트 웹사ì´íŠ¸ì—ì„œ 스케쥴 ì •ë³´ì— ì ‘ê·¼ì„ í—ˆìš©? %s (ìœ„ì ¯ì„ ì‚¬ìš©í•˜ë ¤ë©´ ì²´í¬ í•˜ì„¸ìš”)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "ìž¬ìƒ ëª©ë¡ ì…”í”Œ" + +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "ìž¬ìƒ ëª©ë¡ ì €ìž¥" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "미사용" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "ìž¬ìƒ ëª©ë¡ í¬ë¡œìŠ¤íŽ˜ì´ë“œ" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "사용" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "페ì´ë“œ ì¸: " -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "기본 ì¸í„°íŽ˜ì´ìŠ¤ 언어" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "페ì´ë“œ 아웃:" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" -msgstr "" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "열린 ìž¬ìƒ ëª©ë¡ ì—†ìŒ" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "주 시작ì¼" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" +msgstr "스마트 ë¸”ë½ ë‚´ìš© 지우기" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "ì´ë©”ì¼" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "열린 스마트 ë¸”ë¡ ì—†ìŒ" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "암호 ë³µì›" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" +msgstr "웨ì´ë¸Œ í¼ ë³´ê¸°" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "시간" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "í ì¸:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "분" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "스마트 ë¸”ë¡ ìœ í˜•" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "í 아웃:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "ì •ì (Static)" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "오리지날 길ì´" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "ë™ì (Dynamic)" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "쇼 추가" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "반복ì ì¸ 트랙 허용:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "쇼 ì—…ë°ì´íŠ¸" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "ê¸¸ì´ ì œí•œ" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "무엇" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "ìž¬ìƒ ëª©ë¡ ë‚´ìš© ìƒì„±í›„ 설정 저장" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "언제" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "ìƒì„±" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "ë¼ì´ë¸Œ 스트림" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "ìž¬ìƒ ëª©ë¡ ë‚´ìš© 셔플하기" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "ë…¹ìŒ & 재방송" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "ê¸¸ì´ ì œí•œì€ ë¹„ì–´ë‘거나 0으로 설정할수 없습니다" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "누구" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "ê¸¸ì´ ì œí•œì€ 24h 보다 í´ìˆ˜ 없습니다" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "스타ì¼" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "ì´ ê°’ì€ ì •ìˆ˜(integer) 입니다" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "%s 재방송( %sì— ì‹œìž‘) " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "ì•„ì´í…œ ê³—ìˆ˜ì˜ ìµœëŒ€ê°’ì€ 500 입니다" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "êµ­ê°€ ì„ íƒ" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "기준과 모디파ì´ì–´ë¥¼ 골ë¼ì£¼ì„¸ìš”" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "길ì´ê°€ 0분 보다 길어야 합니다" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "길ì´ëŠ” 00:00:00 형태로 입력하세요" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "길ì´ëŠ” \"00h 00m\"ì˜ í˜•íƒœ 여야 합니다 " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "ì´ ê°’ì€ timestamp 형태 (e.g. 0000-00-00 or 0000-00-00 00:00:00) ë¡œ 입력해주세요" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "URLì€ \"http://domain\" 형태여야 합니다" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "ì´ ê°’ì€ ìˆ«ìžë§Œ 허용 ë©ë‹ˆë‹¤" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "URLì€ 512ìºë¦­í„° 까지 허용합니다" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "ì´ ê°’ì€ 2147483648보다 ìž‘ì€ ìˆ˜ë§Œ 허용 ë©ë‹ˆë‹¤" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "웹 ìŠ¤íŠ¸ë¦¼ì˜ MIME íƒ€ìž…ì„ ì°¾ì„수 없습니다" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "ì´ ê°’ì€ %s 문ìžë³´ë‹¤ ìž‘ì€ ê¸¸ì´ë§Œ 허용 ë©ë‹ˆë‹¤" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "ì›¹ìŠ¤íŠ¸ë¦¼ì˜ ì´ë¦„ì„ ì§€ì •í•˜ì‹­ì‹œì˜¤" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "ì´ ê°’ì€ ë¹„ì–´ë‘˜ìˆ˜ 없습니다" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "XSPF 재ìƒëª©ë¡ì„ ë¶„ì„ í• ìˆ˜ 없습니다" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "쇼: " +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "PLS 재ìƒëª©ë¡ì„ ë¶„ì„ í• ìˆ˜ 없습니다" -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "ë‚´ 쇼:" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "M3U 재ìƒëª©ë¡ì„ 분ì„할수 없습니다" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "ISRC 넘버" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "ìž˜ëª»ëœ ì›¹ìŠ¤íŠ¸ë¦¼ - ì›¹ìŠ¤íŠ¸ë¦¼ì´ ì•„ë‹ˆê³  íŒŒì¼ ë‹¤ìš´ë¡œë“œ ë§í¬ìž…니다" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "ìžë™ìœ¼ë¡œ ë…¹ìŒëœ 쇼 업로드 하기" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "알수 없는 스트림 타입: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "Soundcloud 업로드 사용" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s는 ì´ë¯¸ 모니터 중입니다 " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "Soundcloudì— ìžë™ìœ¼ë¡œ 파ì¼ì„ \"Downloadable\"ë¡œ 마í¬" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s는 ì´ë¯¸ ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë”를 í¬í•¨í•˜ê³  있습니다: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "SoundCloud ì´ë©”ì¼" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s를 í¬í•¨í•˜ëŠ” í´ë”를 ì´ë¯¸ 모니터 중입니다: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "SoundCloud 암호" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s는 ì˜³ì€ ê²½ë¡œê°€ 아닙니다." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "SoundCloud 태그: (여려 태그 입력시 ë„어쓰기로 구분)" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s는 ì´ë¯¸ 현재 저장 í´ë”ë¡œ ì§€ì •ì´ ë˜ì—ˆê±°ë‚˜ ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë” 입니다." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "기본 장르:" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s는 ì´ë¯¸ 현재 저장 í´ë”ë¡œ ì§€ì •ì´ ë˜ì—ˆê±°ë‚˜ ëª¨ë‹ˆí„°ì¤‘ì¸ í´ë” 입니다." + +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%sê°€ 모니터 목ë¡ì— 없습니다" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "기본 트랙 타입:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "ë§í¬ 쇼ì—ì„œ ì•„ì´í…œì„ 분리 할수 없습니다" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "오리지날" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "현재 ë³´ê³  계신 ìŠ¤ì¼€ì¥´ì´ ë§žì§€ 않습니다(sched mismatch)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "리믹스" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "현재 ë³´ê³  계신 ìŠ¤ì¼€ì¥´ì´ ë§žì§€ 않습니다(instance mismatch)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "ë¼ì´ë¸Œ" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "현재 ë³´ê³  계신 ìŠ¤ì¼€ì¥´ì´ ë§žì§€ 않습니다" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "ë…¹ìŒ" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "쇼를 스케쥴 할수 있는 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤ %s." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "ì¸í„°ë·°" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "녹화 쇼ì—는 파ì¼ì„ 추가 할수 없습니다" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "í¬ë“œìºìŠ¤íŠ¸" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "지난 쇼(%s)ì— ë”ì´ìƒ ìŠ¤ì¼€ì¥´ì„ í• ìˆ˜ 없스니다" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "ë°ëª¨" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "쇼 %s ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "진행중" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "ë§í¬ ì‡¼ì˜ ë‚´ìš©ì€ ì´ë¯¸ ë°©ì†¡ëœ ì‡¼ì˜ ì „í›„ì—만 스케쥴 할수 있습니다" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "ì„ íƒí•˜ì‹  파ì¼ì´ 존재 하지 않습니다" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "í-ì¸ ê³¼ í -아웃 ì´ null 입니다" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "í-ì¸ ê°’ì€ í-아웃 값보다 í´ìˆ˜ 없습니다." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "í-아웃 ê°’ì€ íŒŒì¼ ê¸¸ì´ë³´ë‹¤ í´ìˆ˜ 없습니다" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "í-아웃 ê°’ì€ í-ì¸ ê°’ë³´ë‹¤ ìž‘ì„수 없습니다." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "기본 ë¼ì´ì„¼ìŠ¤:" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "íŒŒì¼ ì—…ë¡œë“œë¥¼ 실패 하였습니다. ë‚¨ì€ diskê³µê°„ì´ %s MB ì´ê³ , íŒŒì¼ í¬ê¸°ê°€ %s MB 입니다." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "쇼 길ì´ëŠ” 24ì‹œê°„ì„ ë„˜ì„수 없습니다." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." msgstr "" +"쇼를 중복ë˜ê²Œ 스케줄 할수 없습니다.\n" +"주ì˜: 반복 ì‡¼ì˜ í¬ê¸°ë¥¼ 조정하면, 모든 반복 ì‡¼ì˜ í¬ê¸°ê°€ ë°”ë€ë‹ˆë‹¤." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " msgstr "" +"안녕하세요 %s님, \n" +"암호 ìž¬ì„¤ì •ì„ í•˜ì‹œë ¤ë©´ ë§í¬ë¥¼ í´ë¦­í•˜ì„¸ìš”: " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Airtime 암호 초기화" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "ë…¹ìŒëœ 파ì¼ì˜ 메타ë°ì´íƒ€ 보기" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "쇼 ë‚´ìš© 보기" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "ë‚´ìš© ëª¨ë‘ ì‚­ì œ" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "ë°°ê²½ 색:" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "현재 쇼 취소" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "ê¸€ìž ìƒ‰:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "방송중" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "쇼 수정" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "미디어 추가" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "ì´ ì¸ìŠ¤í„´ìŠ¤ ì‚­ì œ" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "ë¼ì´ë¸ŒëŸ¬ë¦¬" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "ì´ ì¸ìŠ¤í„´ìŠ¤ì™€ ì´í›„ì— ëª¨ë“  ì¸ìŠ¤í„´ìŠ¤ ì‚­ì œ" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "스케쥴" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "ê¶Œí•œì´ ë¶€ì¡±í•©ë‹ˆë‹¤" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "시스템" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "반복쇼는 드래그 앤 드롭 할수 없습니다" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "계정" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "지난 쇼는 ì´ë™í• ìˆ˜ 없습니다" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "미디어 í´ë”" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "과거로 쇼를 ì´ë™í• ìˆ˜ 없습니다" -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "스트림" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "녹화 쇼를 재방송 시작 1시간 안으로 ì´ë™í• ìˆ˜ 없습니다" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "ì²­ì·¨ìž í†µê³„" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "녹화 쇼가 없으로 쇼가 ì‚­ì œ ë˜ì—ˆìŠµë‹ˆë‹¤" -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "녹화 쇼와 재방송 사ì´ì—는 1ì‹œê°„ì˜ ê°„ê²©ì´ í•„ìš”í•©ë‹ˆë‹¤ " + +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" msgstr "" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "방송 기ë¡" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "방송ë¨" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "ë…„ë„ ê°’ì€ %s 1753 - 9999 입니다" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "ì´ˆë³´ìž ê°€ì´ë“œ" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s는 맞지 않는 날짜 입니다" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "ì‚¬ìš©ìž ë©”ë‰´ì–¼" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s:%s:%s는 맞지 않는 시간 입니다" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3912,3 +3799,18 @@ msgstr "ì˜µì…˜ì„ ì„ íƒ í•´ì£¼ì„¸ìš”" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "레코드 ì—†ìŒ" + +#~ msgid "can't resize a past show" +#~ msgstr "지난 쇼는 사ì´ì¦ˆë¥¼ 조정할수 없습니다 " + +#~ msgid "Should not overlap shows" +#~ msgstr "중복 ìŠ¤ì¼€ì¥´ì„ í• ìˆ˜ 없스니다" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "스마트 블ë¡" + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "파ì¼ì´ ì†ìƒë˜ì—ˆìœ¼ë¯€ë¡œ, ë¼ì´ë¸ŒëŸ¬ë¦¬ì— 추가 ë˜ì§€ 않습니다." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "파ì¼ì´ 업로드 ë˜ì§€ 않았습니다. ì´ ì—러는 하드 디스í¬ì— ê³µê°„ì´ ì¶©ë¶„ì¹˜ 않거나, ê¶Œí•œì´ ë¶€ì¡±í•˜ì—¬ ìƒê¸¸ìˆ˜ 있습니다." diff --git a/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po b/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po index fff86a8457..c4b7e6a5bb 100644 --- a/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po @@ -1,35 +1,23 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # terwey , 2014 msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-02-04 11:29+0000\n" "Last-Translator: terwey \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/airtime/language/nl_NL/)\n" +"Language: nl_NL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: nl_NL\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -50,9 +38,9 @@ msgid "Stop" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "" @@ -61,9 +49,9 @@ msgid "Set Cue In" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "" @@ -85,1719 +73,1447 @@ msgstr "" msgid "Fade Out" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" msgstr "" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" msgstr "" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" msgstr "" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" msgstr "" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "" - -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 -msgid "Shuffle" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" msgstr "" - -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " + +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" msgstr "" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" msgstr "" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" msgstr "" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" msgstr "" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" msgstr "" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" msgstr "" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." msgstr "" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." msgstr "" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" msgstr "" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" msgstr "" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" msgstr "" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" msgstr "" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" msgstr "" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" msgstr "" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" msgstr "" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" msgstr "" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" msgstr "" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" msgstr "" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" msgstr "" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" msgstr "" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" msgstr "" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" msgstr "" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" msgstr "" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" msgstr "" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" msgstr "" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" msgstr "" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" msgstr "" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" msgstr "" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" msgstr "" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" msgstr "" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" msgstr "" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" msgstr "" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" msgstr "" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" msgstr "" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" msgstr "" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" msgstr "" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" msgstr "" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" msgstr "" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" msgstr "" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" msgstr "" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" msgstr "" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" msgstr "" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" msgstr "" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" msgstr "" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" msgstr "" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" msgstr "" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" msgstr "" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" msgstr "" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" msgstr "" -#: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." +#: airtime_mvc/application/controllers/ListenerstatController.php:56 +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 -#, php-format -msgid "%s not found" +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" +#: airtime_mvc/application/controllers/ScheduleController.php:350 +#, php-format +msgid "Rebroadcast of show %s from %s at %s" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:32 @@ -1874,6 +1590,11 @@ msgstr "" msgid "Please select a cursor position on timeline." msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "" @@ -1920,6 +1641,7 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "" @@ -1990,9 +1712,7 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2028,10 +1748,7 @@ msgid "Playlist shuffled" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2057,24 +1774,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2107,6 +1815,11 @@ msgid "" "This will remove the files from your Airtime library!" msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" msgstr "" @@ -2117,9 +1830,7 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2130,22 +1841,12 @@ msgstr "" msgid "The stream is disabled" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "" - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2154,61 +1855,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2216,9 +1892,7 @@ msgid "No result found" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2234,16 +1908,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2399,1510 +2068,1724 @@ msgstr "" msgid "month" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" +#: airtime_mvc/application/controllers/LocaleController.php:254 +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" +#: airtime_mvc/application/controllers/LocaleController.php:255 +msgid "Cancel Current Show?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" +#: airtime_mvc/application/controllers/LocaleController.php:256 +#: airtime_mvc/application/controllers/LocaleController.php:300 +msgid "Stop recording current show?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" +#: airtime_mvc/application/controllers/LocaleController.php:257 +msgid "Ok" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" +#: airtime_mvc/application/controllers/LocaleController.php:258 +msgid "Contents of Show" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" +#: airtime_mvc/application/controllers/LocaleController.php:261 +msgid "Remove all content?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" +#: airtime_mvc/application/controllers/LocaleController.php:263 +msgid "Delete selected item(s)?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" +#: airtime_mvc/application/controllers/LocaleController.php:265 +msgid "End" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" +#: airtime_mvc/application/controllers/LocaleController.php:266 +msgid "Duration" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" +#: airtime_mvc/application/controllers/LocaleController.php:276 +msgid "Show Empty" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" +#: airtime_mvc/application/controllers/LocaleController.php:277 +msgid "Recording From Line In" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" +#: airtime_mvc/application/controllers/LocaleController.php:278 +msgid "Track preview" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:282 +msgid "Cannot schedule outside a show." +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:283 +msgid "Moving 1 Item" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:284 +#, php-format +msgid "Moving %s Items" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:287 +msgid "Fade Editor" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:288 +msgid "Cue Editor" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:289 +msgid "Waveform features are available in a browser supporting the Web Audio API" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:292 +msgid "Select all" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:293 +msgid "Select none" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:294 +msgid "Remove overbooked tracks" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:295 +msgid "Remove selected scheduled items" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:296 +msgid "Jump to the current playing track" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:297 +msgid "Cancel current show" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:302 +msgid "Open library to add or remove content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:305 +msgid "in use" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:255 -msgid "Cancel Current Show?" +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:256 -#: airtime_mvc/application/controllers/LocaleController.php:300 -msgid "Stop recording current show?" +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:257 -msgid "Ok" +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:258 -msgid "Contents of Show" +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:261 -msgid "Remove all content?" +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:263 -msgid "Delete selected item(s)?" +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:265 -msgid "End" +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:266 -msgid "Duration" +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:276 -msgid "Show Empty" +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:277 -msgid "Recording From Line In" +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:278 -msgid "Track preview" +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:282 -msgid "Cannot schedule outside a show." +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:283 -msgid "Moving 1 Item" +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:284 -#, php-format -msgid "Moving %s Items" +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:287 -msgid "Fade Editor" +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:288 -msgid "Cue Editor" +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:292 -msgid "Select all" +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:293 -msgid "Select none" +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:294 -msgid "Remove overbooked tracks" +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:295 -msgid "Remove selected scheduled items" +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:296 -msgid "Jump to the current playing track" +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:297 -msgid "Cancel current show" +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:302 -msgid "Open library to add or remove content" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:305 -msgid "in use" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "" + +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." msgstr "" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" msgstr "" -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." msgstr "" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " msgstr "" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" msgstr "" -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" msgstr "" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " msgstr "" -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " msgstr "" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." msgstr "" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." msgstr "" -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" msgstr "" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" msgstr "" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" msgstr "" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" msgstr "" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" msgstr "" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" msgstr "" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" msgstr "" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" msgstr "" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" msgstr "" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." msgstr "" -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" msgstr "" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" msgstr "" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" msgstr "" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" msgstr "" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" msgstr "" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" msgstr "" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" msgstr "" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" msgstr "" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." msgstr "" -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" msgstr "" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." msgstr "" -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" msgstr "" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" msgstr "" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" msgstr "" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" msgstr "" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" msgstr "" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 diff --git a/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po b/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po index 599d8a161c..cc27ccd7d5 100644 --- a/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po @@ -1,35 +1,23 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # Sourcefabric , 2012 msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-01-29 15:11+0000\n" "Last-Translator: andrey.podshivalov\n" "Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/airtime/language/pl_PL/)\n" +"Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: pl_PL\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime Copyright ©Sourcefabric o.p.s. Wszelkie prawa zastrzeżone.%sUżytkowany i udostÄ™pniany na podstawie licencji GNU GPL v.3 by %sSourcefabric o.p.s%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "Transmisja na żywo" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -50,9 +38,9 @@ msgid "Stop" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Cue In" @@ -61,9 +49,9 @@ msgid "Set Cue In" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Cue out" @@ -85,1620 +73,1418 @@ msgstr "ZgÅ‚aÅ›nianie [Fade In]" msgid "Fade Out" msgstr "Wyciszanie [Fade out]" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "TytuÅ‚" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime Copyright ©Sourcefabric o.p.s. Wszelkie prawa zastrzeżone.%sUżytkowany i udostÄ™pniany na podstawie licencji GNU GPL v.3 by %sSourcefabric o.p.s%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "Twórca" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "Transmisja na żywo" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "WÅ‚Ä…czony:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "DÅ‚ugość" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "Typ strumienia:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Gatunek" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Bit Rate:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "Nastrój" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "Typ usÅ‚ugi:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "Wydawnictwo" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "KanaÅ‚y:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "Kompozytor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Mono" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Stereo" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "Prawa autorskie" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Serwer" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Rok" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Wprowadzony znak jest nieprawidÅ‚owy" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "Port" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "Dyrygent/Pod batutÄ…" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "Możliwe sÄ… tylko cyfry." -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "JÄ™zyk" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "HasÅ‚o" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Gatunek" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "adres URL" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "Odtwarzane" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "Nazwa" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "Opis" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "PrzeglÄ…daj metadane nagrania" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Punkt montowania" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "Zobacz na Soundcloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Nazwa użytkownika" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "PrzeÅ›lij do SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "Login Administratora" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "PrzeÅ›lij ponownie do SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "HasÅ‚o Administratora" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Zawartość audycji" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Pobieranie informacji z serwera..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "Dodaj/usuÅ„ zawartość" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "Serwer nie może być pusty." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "UsuÅ„ caÅ‚Ä… zawartość" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "Port nie może być pusty." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "Skasuj obecnÄ… audycjÄ™" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "Punkt montowania nie może być pusty dla serwera Icecast." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "TytuÅ‚:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "Edytuj" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "Autor:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "Edytuj audycjÄ™" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Album:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "UsuÅ„" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Utwór:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "UsuÅ„ tÄ… instancjÄ™" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Rodzaj:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "UsuÅ„ ten i wszystkie inne instancje" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Rok:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "Wydawnictwo:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "Nie można użyć metody 'przeciÄ…gnij i upuść' dla powtórek audycji." +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "Kompozytor:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "Nie można przenieść audycji archiwalnej" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "Dyrygent/Pod batutÄ…:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "Nie można przenieść audycji w przeszÅ‚ość" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "Nastrój:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "Nie można planować nakÅ‚adajÄ…cych siÄ™ audycji" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "Nagrywana audycja nie może zostać przeniesiona na mniej niż 1h przed jej powtórkÄ…." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "Prawa autorskie:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "Audycja zostaÅ‚a usuniÄ™ta, ponieważ nagranie nie istnieje!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "Numer ISRC:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "Należy odczekać 1 godzinÄ™ przed ponownym odtworzeniem." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "Strona internetowa:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "Preferencje" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "JÄ™zyk:" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Zapisz" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "ZarzÄ…dzaj folderami mediów" - -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "Ustawienia strumienia" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "Anuluj" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Ustawienia ogólne" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Nazwa użytkownika:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "dB" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "HasÅ‚o:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "Ustawienia strumienia wyjÅ›ciowego" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "Potwierdź hasÅ‚o:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Wybierz folder" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "ImiÄ™:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "Ustaw" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "Nazwisko:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "Aktualny folder importu:" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "Email:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "Dodaj" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Telefon:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "Przeskanuj ponownie obserwowany katalog (Przydatne w przypadku rozsynchronizowanego dysku sieciowego)." +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "UsuÅ„ obserwowany katalog." +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "Nie obserwujesz w tej chwili żadnych folderów" +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "Typ użytkownika:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "Zarejestruj Airtime" +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "Gość" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "W celu udoskonalenia programu Airtime, prosimy o przesÅ‚anie informacji zwrotnej o sposobie uzytkowania. Informacje takie bÄ™dÄ… zbierane regualrnie w celu poprawienia jakoÅ›ci uzytkowania. %s Kliknij \"Tak, chcÄ™ wesprzeć Airtime\", doÅ‚ożymy staraÅ„, by funkcje, których używasz, byÅ‚y stale ulepszane." +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "ProwadzÄ…cy" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "Kliknij w poniższe pole w celu umieszczenia reklamy twojej radiostacji na %s Sourfabric.org%s. Należy przy tym udostÄ™pnić opcjÄ™ 'WyÅ›lij informacjÄ™ zwrotnÄ…'. Informacje te bÄ™dÄ… pozyskiwane razem z informacjÄ… zwrotnÄ…." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "Menedżer programowy" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(Wymagane)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(tylko dla celów weryfikacji, dane nie bÄ™dÄ… rozpowszechniane)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Uwaga: każdy plik o rozmiarze wiÄ™kszym niż 600x600 zostanie zmniejszony" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Pokazuj, co wysyÅ‚am" +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "Administrator" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "Zasady i warunki" +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "Nazwa użytkownika musi być unikalna." -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "Znajdź audycjÄ™" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "Kolor tÅ‚a:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "Filtruj wg audycji" +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "Kolor tekstu:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "Resetuj hasÅ‚o" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "Data rozpoczÄ™cia:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Opcje smart blocku" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "Data zakoÅ„czenia:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Audycja:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "Wszystkie moje audycje:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr "do" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "dni" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "pliki speÅ‚niajÄ… kryteria" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "Należy okreÅ›lić dzieÅ„" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "plik speÅ‚nia kryteria" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "Należy okreÅ›lić czas" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "PoÅ‚aczenie URL:" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "Należy odczekać przynajmniej 1 godzinÄ™ przed ponownym odtworzeniem" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "W celu udoskonalenia programu Airtime, prosimy o przesÅ‚anie informacji zwrotnej o sposobie uzytkowania. Informacje takie bÄ™dÄ… zbierane regualrnie w celu poprawienia jakoÅ›ci uzytkowania. %s Kliknij \"Tak, chcÄ™ wesprzeć Airtime\", doÅ‚ożymy staraÅ„, by funkcje, których używasz, byÅ‚y stale ulepszane." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "Katalog importu:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "Kliknij w poniższe pole w celu zareklamowania swojej stacji na %sSourcefabric.org%s." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "Katalogi obserwowane:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(Aby promowac stacjÄ™, należy udostepnić funkcjÄ™ \"wyÅ›lij informacjÄ™ zwrotnÄ…\")" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "NieprawidÅ‚owy katalog" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Polityka prywatnoÅ›ci Sourcefabric" +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "Szukaj Użytkowników:" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "Ustawienia strumienia wejÅ›ciowego" +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "ProwadzÄ…cy:" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "Adres URL poÅ‚Ä…cznia dla ŹródÅ‚a NadrzÄ™dnego" +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "Zaloguj" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "ZastÄ…p" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "Wpisz znaki, które widzisz na obrazku poniżej." -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Nazwa stacji" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "RESETUJ" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "Adres URL poÅ‚Ä…czenia dla Å»ródÅ‚a audycji" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "wprowadź czas w sekundach 0{.0}" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Wybierz dni:" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "UsuÅ„" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Dni powtarzania:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "Umożliwienie zdalnego dostÄ™pu z innych stron \"Plan\" Info?%s (WÅ‚Ä…cz, aby zewnÄ™trzne widgety dziaÅ‚aÅ‚y.)" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "Ustawienia Email/Serwera pocztowego" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "WyÅ‚Ä…czone" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "Ustawienia SoundCloud" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "WÅ‚Ä…czone" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "ustawienia %s's " +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "DomyÅ›lny jÄ™zyk" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "TydzieÅ„ zaczynaj od" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "Niedziela" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "StrumieÅ„" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "PoniedziaÅ‚ek" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "Opcje dodatkowe" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "Wtorek" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "W odtwarzaczu sÅ‚uchacza wyÅ›wietli sie nastepujaca informacja:" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "Åšroda" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(Strona internetowa Twojej stacji)" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "Czwartek" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "URL strumienia:" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "PiÄ…tek" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "Filtruj HistoriÄ™" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Sobota" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Witamy w Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Dowiedz siÄ™ jak rozpocząć użytkowanie Airtime'a, aby zautomatyzować transmisje radiowe:" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "Typ powtarzania:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "Zacznij od dodania swoich plików do biblioteki używajÄ…c przycisku \"dodaj media\" w menu programu\". Możesz także przeciÄ…gnąć pliki do tego okna." +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "tygodniowo" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "Utwórz audycjÄ™ przechodzÄ…c do '\"kalendarza\" w pasku \"menu\" a nastÄ™pnie klikajÄ…c w ikonÄ™ \"+ Audycja\". Można utworzyć audycjÄ™ do jednorazowego bÄ…dź wielokrotnego odtwarzania. Jedynie administratorzy i zarzÄ…dzajÄ…cy audycjami mogÄ… je dodawać." +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "Dodaj media do audycji przez przejÅ›cie do audycji w kalendarzu, kliknij na niego lewym przyciskiem myszki wybierajÄ…c opcjÄ™ 'dodaj/usuÅ„ zawartość'" +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Wybierz media z lewego okna i przeciÄ…gnij do utworzonej audyji w prawym oknie" +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "Gotowe!" +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "miesiÄ™cznie" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "W celu uzyskania szczegółowej pomocy, skorzystaj z %suser manual%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Wybierz dni:" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "Informacje" +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "Nie" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sAirtime%s %s otwarte oprogramowanie radiowe do planowania i zdalnego zarzÄ…dzania stacjÄ…. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "Pon" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%sSourcefabric%s o.p.s. Airtime jest rozpowszechniany na podstawie %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "Wt" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "Podziel siÄ™" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "Åšr" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Wybierz strumieÅ„:" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "Czw" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "wycisz" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "Pt" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "wÅ‚Ä…cz gÅ‚os" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "Sob" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "Zaloguj" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Witamy w internetowej wersji demonstracyjnej programu Airtime. Możesz siÄ™ zalogować, wpisujÄ…c login 'admin' oraz hasÅ‚o 'admin'" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "Wprowadź adres swojego konta e-mail, na który zostanie przesÅ‚any link w celu utworzenia nowego hasÅ‚a. " +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "Email zostaÅ‚ wysÅ‚any" +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "Bez czasu koÅ„cowego?" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "E-mail zostaÅ‚ wysÅ‚any" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "Data koÅ„cowa musi wystÄ™pować po dacie poczÄ…tkowej" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "Powrót do okna logowania" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "Nowe hasÅ‚o" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "Potwierdź nowe hasÅ‚o" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "Wprowadź i potwierdź swoje hasÅ‚o w poniższych polach" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "HasÅ‚a muszÄ… siÄ™ zgadzać." -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "Twoja próba wygasa" +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Uzyskaj nowe hasÅ‚o" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "dni" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "Wybierz kryteria" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Zakup kopiÄ™ Airtime'a" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Album" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "Moje konto" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Bit Rate (Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "Poprzedni:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "NastÄ™pny:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "Kompozytor" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "Strumienie źródÅ‚owe" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "Dyrygent/Pod batutÄ…" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "ŹródÅ‚o NadrzÄ™dne" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "Prawa autorskie" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "ŹródÅ‚o audycji" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "Twórca" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "Planowane odtwarzanie" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Kodowane przez" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "Na antenie" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "SÅ‚uchaj" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "Czas stacji" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Zamknij" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "Dodaj audycjÄ™" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "Aktualizuj audycjÄ™" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "Co" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "Kiedy" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "WejÅ›cie Strumienia \"Na żywo\"" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "Nagrywaj i odtwarzaj ponownie" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Kto" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Styl" - -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "Rozpocznij" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "UsÅ‚uga" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "Status" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "Czas pracy" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "CPU" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "Pamięć" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Wersja Airtime" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "Miejsce na dysku " - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "Importowanie plików w toku..." - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "Zaawansowane opcje wyszukiwania" - -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "Licznik sÅ‚uchaczy na przestrzeni czasu" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "Nowy" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "Nowa lista odtwarzania" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "Nowy Smartblock" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "Nowy webstream" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "Zobacz/edytuj opis" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "Wydawnictwo" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "Opis" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "JÄ™zyk" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "URL strumienia:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "Ostatnio zmodyfikowany" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "DomyÅ›lna dÅ‚ugość:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "Ostatnio odtwarzany" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "Brak webstreamu" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "DÅ‚ugość" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Podobne do" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "Nastrój" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Wymieszaj listÄ™ odtwarzania" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "WÅ‚aÅ›ciciel" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 -msgid "Shuffle" -msgstr "Przemieszaj" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "Normalizacja gÅ‚oÅ›noÅ›ci (Replay Gain)" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Zapisz listÄ™ odtwarzania" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "CzÄ™stotliwość próbkowania (kHz)" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "PÅ‚ynne przenikanie utworów na liÅ›cie dotwarzania" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "TytuÅ‚" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "ZgÅ‚aÅ›nianie [fade in]:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "Numer utworu" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Wyciszanie [fade out]:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "PrzesÅ‚ano" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "Brak otwartej listy odtwarzania" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "Strona internetowa" -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Rok" -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "Wybierz modyfikator" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "zawiera" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "Brak otwartego smartblocka" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "nie zawiera" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "ZgÅ‚aÅ›nianie [Cue in]:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "to" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(hh:mm:ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "to nie" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Wyciszanie [Cue out]:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "zaczyna siÄ™ od" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "Oryginalna dÅ‚ugość:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "koÅ„czy siÄ™" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "ZwiÄ™ksz bok statyczny" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "jest wiÄ™ksza niż" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "ZwiÄ™ksz blok dynamiczny" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "jest mniejsza niż" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "Pusty smart block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "mieÅ›ci siÄ™ w zakresie" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "Pusta playlista" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "godzin(y)" -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Aplikacja domyÅ›lna Zend Framework" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "minut(y)" -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "Nie znaleziono strony!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "elementy" -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "WyglÄ…da na to, że strona, której szukasz nie istnieje" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "Ustaw typ smart blocku:" -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "Pomoc" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "Statyczny" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "poprzedni" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "Dynamiczny" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "play" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "Zezwól na powtarzanie utworów:" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "pauza" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "Ogranicz do" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "nastÄ™pny" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "Tworzenie zawartoÅ›ci listy odtwarzania i zapisz kryteria" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "stop" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "Utwórz" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "maksymalna gÅ‚oÅ›ność" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "Losowa kolejność odtwarzania" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "Wymagana aktualizacja" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle" +msgstr "Przemieszaj" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "By odtworzyć medium, należy zaktualizować przeglÄ…darkÄ™ do najnowszej wersji bÄ…dź zainstalowac aktualizacjÄ™ %sFlash plugin%s" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "Limit nie może być pusty oraz mniejszy od 0" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "Limit nie może być wiÄ™kszy niż 24 godziny" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "Wartość powinna być liczbÄ… caÅ‚kowitÄ…" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "Nazwa" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "Maksymalna liczba elementów do ustawienia to 500" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "Należy wybrać kryteria i modyfikator" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "DÅ‚ugość powinna być wprowadzona w formacie '00:00:00'" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "Wartość powinna byc zapisana w formacie timestamp (np. 0000-00-00 lub 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "Wartość musi być liczbÄ…" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "Wartość powinna być mniejsza niż 2147483648" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "Wartość powinna posiadać mniej niż %s znaków" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "Wartość nie może być pusta" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "Automatyczne wyÅ‚Ä…czanie" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "Automatyczne wÅ‚Ä…czanie" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "ZmieÅ„ dÅ‚ugość przenikania siÄ™ utworów" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "ZarzÄ…dzaj Użytkownikami" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "wprowadź czas w sekundach 00{.000000}" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "Nowy Użytkownik" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "Nazwa użytkownika nadrzÄ™dnego" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "id" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "HasÅ‚o użytkownika nadrzÄ™dnego" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Nazwa użytkownika" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "Adres URL do źródÅ‚a nadrzÄ™dnego" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "ImiÄ™" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "Adres URL dostÄ™pu do źródÅ‚a audycji" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "Nazwisko" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "NadrzÄ™dny port źródÅ‚owy" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "Typ użytkownika" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "NadrzÄ™dny punkt montowania źródÅ‚a" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "TytuÅ‚:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Port źródÅ‚owy audycji" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "Autor:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "ŹródÅ‚owy punkt montowania audycji" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Album:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "Nie można użyć tego samego portu co źródÅ‚o nadrzÄ™dne" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Utwór:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "Port %s nie jest dostÄ™pny" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "DÅ‚ugość: " +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Telefon:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "CzÄ™stotliwość próbkowania:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "Strona internetowa stacji:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Bit Rate:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "Kraj:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "Nastrój:" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "Miasto:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Rodzaj:" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "Opis stacji:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Rok:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Logo stacji:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "Wydawnictwo:" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "WyÅ›lij informacjÄ™ zwrotnÄ…" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "Promuj mojÄ… stacjÄ™ na Sourcefabric.org" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "Kompozytor:" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "ZanaczajÄ…c to pole, akceptujesz %spolitykÄ™ prywatnoÅ›ci%s Sourcefabric." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "Dyrygent/Pod batutÄ…:" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "Wymagana jest akceptacja polityki prywatnoÅ›ci." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "Prawa autorskie:" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "Pole jest wymagane i nie może być puste" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "Numer Isrc:" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "Strona internetowa:" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "JÄ™zyk:" +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "Åšcieżka pliku:" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "Nagrywać z wejÅ›cia liniowego?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "Nazwa:" +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "Odtwarzać ponownie?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "Opis:" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Zastosuj uwierzytelnienie Airtime:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Web Stream" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "Zastosuj wÅ‚asne uwierzytelnienie:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "Smart block dynamiczny" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "Nazwa użytkownika" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "Smart block statyczny" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "HasÅ‚o" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Åšcieżka audio" +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "Pole nazwy użytkownika nie może być puste." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "Zawartość listy odtwarzania:" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "Pole hasÅ‚a nie może być puste." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "Zawartość statycznego Smart Blocka:" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "E-mail" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "Kryteria dynamicznego Smart Blocku " +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "Przywracanie hasÅ‚a" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "Ogranicz(enie) do:" +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "SprzÄ™towe wyjÅ›cie audio" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "Adres URL" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "Typ wyjÅ›cia" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "" +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Metadane Icecast Vorbis" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "" +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "Nazwa strumienia:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "Artysta - TytuÅ‚" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "Audycje mogÄ… mieć maksymalnÄ… dÅ‚ugość 24 godzin." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Audycja - Artysta -TytuÅ‚" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "Data lub czas zakoÅ„czenia nie może być z przeszÅ‚oÅ›ci." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Nazwa stacji - Nazwa audycji" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "Nie można planować audycji nakÅ‚adajÄ…cych siÄ™ na siebie.\nUwaga: zmiana audycji powoduje automatycznÄ… zmianÄ™ wszystkich jej powtórzeÅ„." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "Metadane Off Air" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "nie można zmienić rozmiaru przeszÅ‚ej audycji" +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "WÅ‚Ä…cz normalizacjÄ™ gÅ‚oÅ›noÅ›ci (Replay Gain)" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "Audycje nie powinny nakÅ‚adać siÄ™." +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "Modyfikator normalizacji gÅ‚oÅ›noÅ›ci" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Wybierz kraj" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%value%' nie jest poprawnym adresem email w podstawowym formacie local-part@hostname" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s jest już obserwowny." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%' nie pasuje do formatu daty '%format%'" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s zawiera obserwowany katalog zagnieżdzony: %s" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%' zawiera mniej niż %min% znaków" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s jest zagnieżdzony w istniejÄ…cym, aktualnie obserwowanym katalogu: %s" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%value%' zawiera wiÄ™cej niż %max% znaków" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s nie jest poprawnym katalogiem." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%' nie zawiera siÄ™ w przedziale od '%min%' do '%max%'" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s jest już ustawiony jako katalog główny bÄ…dź znajduje siÄ™ na liÅ›cie katalogów obserwowanych" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "HasÅ‚a muszÄ… siÄ™ zgadzać" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s jest już ustawiony jako katalog główny bÄ…dź znajduje siÄ™ na liÅ›cie katalogów obserwowanych." +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "%value% nie odpowiada formatowi 'HH:mm'" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s nie wystÄ™puje na liÅ›cie katalogów obserwowanych." +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "Data/Czas rozpoczÄ™cia:" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "elementy" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "Data/Czas zakoÅ„czenia:" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "Cue-in i cue-out majÄ… wartość zerowÄ…." +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "Czas trwania:" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "Wartość cue-out nie może być wiÄ™ksza niż dÅ‚ugość pliku." +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "Strefa czasowa:" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "Wartość cue-in nie może być wiÄ™ksza niż cue-out." +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "Powtarzanie?" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "Wartość cue-out nie może być mniejsza od cue-in." +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "Nie można utworzyć audycji w przeszÅ‚oÅ›ci" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "Wybierz kryteria" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "Nie mozna zmienić daty/czasu audycji, która siÄ™ już rozpoczęła" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Bit Rate (Kbps)" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "Data lub czas zakoÅ„czenia nie może być z przeszÅ‚oÅ›ci." -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "Czas trwania nie może być mniejszy niż 0m" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Kodowane przez" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "Czas trwania nie może wynosić 00h 00m" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "Ostatnio zmodyfikowany" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "Czas trwania nie może być dÅ‚uższy niż 24h" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "Ostatnio odtwarzany" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "Nie można planować nakÅ‚adajÄ…cych siÄ™ audycji" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Podobne do" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "Nazwa:" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "WÅ‚aÅ›ciciel" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "Audycja bez nazwy" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "Normalizacja gÅ‚oÅ›noÅ›ci (Replay Gain)" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "Adres URL" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "CzÄ™stotliwość próbkowania (kHz)" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "Opis:" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "Numer utworu" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "Automatycznie dodawaj nagrane audycje" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "PrzesÅ‚ano" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "WÅ‚Ä…cz wysyÅ‚anie do SoundCloud" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "Strona internetowa" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "Automatycznie oznaczaj pliki jako \"Do pobrania\" na SoundCloud" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "Wybierz modyfikator" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "Email SoundCloud" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "zawiera" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "HasÅ‚o SoundCloud" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "nie zawiera" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "Tagi SoundCloud: (oddzielaj tagi spacjÄ…)" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "to" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "DomyÅ›lny gatunek:" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "to nie" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "DomyÅ›lny typ utworu:" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "zaczyna siÄ™ od" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "Oryginalny" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "koÅ„czy siÄ™" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "Remix" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "jest wiÄ™ksza niż" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "Na żywo" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "jest mniejsza niż" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "Nagranie" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "mieÅ›ci siÄ™ w zakresie" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "Mówiony" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "DÅ‚ugość musi być wiÄ™ksza niż 0 minut" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "Podcast" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "DÅ‚ugość powinna mieć postać \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Demo" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "URL powinien mieć postać \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "Praca w toku" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "URL powinien mieć 512 znaków lub mniej" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "RdzeÅ„" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "Nie znaleziono typu MIME dla webstreamu" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "PÄ™tla" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "Nazwa webstreamu nie może być pusta" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Efekt dźwiÄ™kowy" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "Nie można przeanalizować playlisty XSPF" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "Próbka one-shot" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "Nie można przeanalizować playlisty PLS" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Inne" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "Nie można przeanalizować playlisty M3U" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "DomyÅ›lna licencja:" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "NieprawidÅ‚owy webstream, prawdopodobnie trwa pobieranie pliku." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "Utwór w domenie publicznej" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "Nie rozpoznano typu strumienia: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "Wszelkie prawa zastrzeżone" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Witaj %s, \n\nKliknij w ten link aby zresetować swoje hasÅ‚o:" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "Uznanie autorstwa wg licencji Creative Commons " -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Resetowanie hasÅ‚a Airtime" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "Użycie niekomercyjne wg Creative Commons " -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "Retransmisja z %s do %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "Uznanie Autorstwa Bez Utworów Zależnych wg Creative Commons" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "Uznanie a Na Tych Samych Warunkach wg Creative Commons " -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "Harmonogram, który przeglÄ…dasz jest nieaktualny! (bÅ‚Ä™dne dopasowanie harmonogramu)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "Uznanie Autorstwa Bez Utworów Zależnych wg Creative Commons" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "Harmonogram, który przeglÄ…dasz jest nieaktualny! (bÅ‚Ä™dne dopasowanie instancji)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "Uznanie a Na Tych Samych Warunkach wg Creative Commons " -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "Harmonogram, który przeglÄ…dasz jest nieaktualny!" +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "Nie posiadasz uprawnieÅ„, aby zaplanować audycjÄ™ %s." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "WÅ‚Ä…cz Emaile Systemowe (Resetowanie hasÅ‚a)" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "Nie można dodawać plików do nagrywanych audycji." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "Adres nadawcy Emaila" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "Audycja %s przekracza dopuszczalnÄ… dÅ‚ugość i nie może zostać zaplanowana." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "Skonfiguruj serwer pocztowy" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "Audycja %s zostaÅ‚a zaktualizowana wczeÅ›niej!" +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "Wymagana autoryzacja" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "" +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "Serwer Email" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "Wybrany plik nie istnieje!" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "Adres Email" + +#: airtime_mvc/application/controllers/ListenerstatController.php:56 +msgid "Please make sure admin user/password is correct on System->Streams page." +msgstr "Upewnij siÄ™, że nazwa użytkownika i hasÅ‚o sÄ… poprawne w System->Strumienie." -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "Katalog 'organize' nie może zostać utworzony." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Webstream bez nazwy" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "Plik nie zostaÅ‚ przesÅ‚any, na dysku pozostaÅ‚o %s MB wolnego miejsca, a plik który próbujesz przesÅ‚ać ma %s MB." +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Zapisano webstream" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "Ten plik jest prawdopodobnie uszkodzony i nie można go dodać do biblioteki mediów." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "NieprawidÅ‚owe wartoÅ›ci formularzy" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "Plik nie zostaÅ‚ dodany, bÅ‚Ä…d ten może wystÄ™pować w przypadku, kiedy nie ma wystarczajÄ…cej iloÅ›ci wolnego miejsca na dysku lub katalog przechowywania nie posiada odpowiednich uprawnieÅ„ do zapisu." +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "ProszÄ™ wpisać nazwÄ™ użytkownika i hasÅ‚o" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "Nie masz uprawnieÅ„ do odÅ‚Ä…czenia żródÅ‚a" +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "BÅ‚Ä™dna nazwa użytkownika lub hasÅ‚o. Spróbuj ponownie." -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "ŹródÅ‚o nie jest podÅ‚Ä…czone do tego wyjÅ›cia." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "Email nie zostaÅ‚ wysÅ‚any. Sprawdź swoje ustawienia serwera pocztowego i upewnij siÄ™, że zostaÅ‚ skonfigurowany poprawnie." -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "Nie masz uprawnieÅ„ do przeÅ‚Ä…czenia źródÅ‚a." +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "Podany adres email nie zostaÅ‚ odnaleziony." #: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format @@ -1710,95 +1496,25 @@ msgstr "Retransmisja audycji %s z %s o %s" msgid "Download" msgstr "Pobierz" -#: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." -msgstr "Upewnij siÄ™, że nazwa użytkownika i hasÅ‚o sÄ… poprawne w System->Strumienie." - -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "Nie masz dostÄ™pu do tej lokalizacji" - -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "Nie masz dostÄ™pu do tej lokalizacji." - -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "Plik nie istnieje w Airtime." - -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "Plik nie istnieje w Airtime" - -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "Plik nie istnieje w Airtime." - -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "ZÅ‚e zapytanie. Nie zaakceprtowano parametru 'mode'" - -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "ZÅ‚e zapytanie. Parametr 'mode' jest nieprawidÅ‚owy" - -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 -#, php-format -msgid "%s not found" -msgstr "nie znaleziono %s" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "WystapiÅ‚ bÅ‚Ä…d" - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "PodglÄ…d" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "Dodaj do listy odtwarzania" - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "Dodaj do smartblocku" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "Edytuj Metadane." - -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "Skopiuj listÄ™ odtwarzania" - -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "Użytkownik zostaÅ‚ dodany poprawnie!" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "Brak dostepnych czynnoÅ›ci" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "Użytkownik zostaÅ‚ poprawnie zaktualizowany!" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "Nie masz uprawnieÅ„ do usuniÄ™cia wybranych elementów" +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "Ustawienia zostaÅ‚y poprawnie zaktualizowane!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "Nie można skasować niektórych plików z harmonogramu." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "Nie odnaleziono strony" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "Kopia %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "BÅ‚Ä…d aplikacji" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1874,6 +1590,11 @@ msgstr "Do list odtwarzania można dodawać tylko utwory, smart blocki i webstre msgid "Please select a cursor position on timeline." msgstr "ProszÄ™ wybrać pozycjÄ™ kursora na osi czasu." +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "Edytuj Metadane." + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "Dodaj do wybranej audycji" @@ -1920,6 +1641,7 @@ msgstr "Åadowanie" #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "Wszystko" @@ -1990,9 +1712,7 @@ msgstr "Podana wartość musi mieć format hh:mm:ss.t" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "Aktualnie dodajesz pliki. %sPrzejÅ›cie do innej strony przerwie ten proces. %sCzy na pewno chcesz przejść do innej strony?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2028,10 +1748,7 @@ msgid "Playlist shuffled" msgstr "Playlista zostaÅ‚a przemieszana" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "Airtime nie może odczytać statusu pliku. Może siÄ™ tak zdarzyć, gdy plik znajduje siÄ™ na zdalnym dysku, do którego aktualnie nie ma dostÄ™pu lub znajduje siÄ™ w katalogu, który nie jest już \"obserwowany\"." #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2057,24 +1774,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "Obraz musi mieć format jpg, jpeg, png lub gif" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "Statyczny smart block bÄ™dzie zapisywaÅ‚ kryteria i zawartość bezpoÅ›rednio, co umożliwia edycjÄ™ i wyÅ›wietlanie go w bibliotece, przed dodaniem do audycji." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "Dynamiczny smart block zapisuje tylko kryteria. Jego zawartość bÄ™dzie generowana automatycznie po dodaniu go do audycji. Nie bÄ™dzie można go wyÅ›wietlać i edytować w zawartoÅ›ci biblioteki." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "Pożądana dÅ‚ugość bloku nie zostanie osiÄ…gniÄ™ta jesli airtime nie znajdzie wystarczajÄ…cej liczby oryginalnych Å›cieżek speÅ‚niajÄ…cych kryteria wyszukiwania. WÅ‚Ä…cz tÄ™ opcjÄ™ jesli chcesz, żeby Å›cieżki zostaÅ‚y wielokrotnie dodane do smart blocku." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2105,7 +1813,14 @@ msgstr "Wybierz katalog do obserwacji" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "Czy na pewno chcesz zamienić Å›cieżkÄ™ do katalogu importu\nWszystkie pliki z biblioteki Airtime zostanÄ… usuniÄ™te." +msgstr "" +"Czy na pewno chcesz zamienić Å›cieżkÄ™ do katalogu importu\n" +"Wszystkie pliki z biblioteki Airtime zostanÄ… usuniÄ™te." + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "ZarzÄ…dzaj folderami mediów" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2117,9 +1832,7 @@ msgstr "Åšciezka jest obecnie niedostepna." #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2130,22 +1843,12 @@ msgstr "PoÅ‚Ä…czono z serwerem streamingu" msgid "The stream is disabled" msgstr "StrumieÅ„ jest odÅ‚Ä…czony" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Pobieranie informacji z serwera..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "Nie można poÅ‚Ä…czyć z serwerem streamujÄ…cym" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "Jesli Airtime korzysta z routera bÄ…dź firewalla, może być konieczna konfiguracja przekierowywania portu i informacja w tym polu bÄ™dzie nieprawidÅ‚owa. W takim wypadku należy dokonac rÄ™cznej aktualizacji pola, tak żeby wyÅ›wietliÅ‚ siÄ™ prawidÅ‚owy host/ port/ mount, do którego mógÅ‚by podÅ‚Ä…czyć siÄ™ prowadzÄ…cy. Dopuszczalny zakres to 1024 i 49151." #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2154,61 +1857,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "W celu uzyskania wiecej informacji, należy zapoznać siÄ™ z %sAirtime Manual%s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "Zaznacz tÄ™ opcjÄ™ w celu wÅ‚Ä…czenia metadanych dla strumieni OGG (metadane strumieniowe to tytuÅ‚ Å›cieżki, artysta i nazwa audycji, ktróre wyÅ›wietlajÄ… siÄ™ w odtwarzaczu audio). VLC oraz mplayer majÄ… problem z odtwarzaniem strumienia OGG/Vorbis, których metadane zostaÅ‚y udostÄ™pnione- odÅ‚Ä…czajÄ… siÄ™ one od strumenia po każdej piosence. JeÅ›li używasz strumeinia OGG, a sÅ‚uchacze nie żądajÄ… mozliwoÅ›ci odtwarzania w tych odtwarzaczach, wówczas można udostepnić tÄ™ opcjÄ™" #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "To pole sÅ‚uży do automatycznego wyÅ‚Ä…czenia źródÅ‚a nadrzÄ™dnego/źródÅ‚a audycji po jego odÅ‚Ä…czeniu." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "To pole sÅ‚uży automatycznego uruchomienia źródÅ‚a nadrzÄ™dnego/źródÅ‚a audycji na poÅ‚Ä…czeniu źródÅ‚owym" #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "Jesli serwer Icecast wymaga nazwy użytkownika \"source\", pole to może zostać puste" #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "JeÅ›li klient nie żąda nazwy uzytkownika, zawartoÅ›c tego pola powinna być \"source\"" #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "JeÅ›li nazwa użytkownika bÄ…dź hasÅ‚o zostanÄ… zmienione na wÅ‚Ä…czonym strumieniu, urzÄ…dzenie zostanie uruchomione ponownie i nastÄ…pi 5-10 sekundowa cisza. Zmiany w nastÄ™pujÄ…cych polach NIE spowodujÄ… ponownego uruchomienia: Nazwa Strumienia (ustawienia globalne), Zmiana Czasu Zanikania, Nazwa Użytkownika NadrzÄ™dnego (Ustawienia Strumienia WyjÅ›ciowego). JeÅ›li Airtime jest w trakcie nagrywania programu, a zmiany spowodujÄ… ponowne uruchomienie urzÄ…dzenia, nagrywanie zostanie przerwane." #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "Nazwa uzytkownika i hasÅ‚o administartora w programie Icecast/ SHOUTcast w celu uzyskania dostÄ™pu do statystyki sÅ‚uchalnoÅ›ci" #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2216,9 +1894,7 @@ msgid "No result found" msgstr "Nie znaleziono wyników" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "Ta funkcja dziaÅ‚a w programach wg tych samych zasad bezpiezeÅ„stwa: jedynie użytkownicy przypisani do audcyji mogÄ… siÄ™ podÅ‚Ä…czyć." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2234,16 +1910,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2399,79 +2070,8 @@ msgstr "tydzieÅ„" msgid "month" msgstr "miesiąć" -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "Niedziela" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "PoniedziaÅ‚ek" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "Wtorek" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "Åšroda" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "Czwartek" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "PiÄ…tek" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Sobota" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "Nie" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "Pon" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "Wt" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "Åšr" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "Czw" - -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "Pt" - -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "Sob" - #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Audycje o czasie dÅ‚uższym niż zaplanowany bÄ™dÄ… przerywane przez nastÄ™pne ." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2499,6 +2099,11 @@ msgstr "Usunąć caÅ‚Ä… zawartość?" msgid "Delete selected item(s)?" msgstr "Skasować wybrane elementy?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "Rozpocznij" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "ZakoÅ„cz" @@ -2532,14 +2137,6 @@ msgstr "Przenoszenie 1 elementu" msgid "Moving %s Items" msgstr "Przenoszenie %s elementów" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "Anuluj" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "" @@ -2549,8 +2146,7 @@ msgid "Cue Editor" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2581,6 +2177,13 @@ msgstr "Skasuj obecnÄ… audycjÄ™" msgid "Open library to add or remove content" msgstr "Otwóz bibliotekÄ™ w celu dodania bÄ…dź usuniÄ™cia zawartoÅ›ci" +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "Dodaj/usuÅ„ zawartość" + #: airtime_mvc/application/controllers/LocaleController.php:305 msgid "in use" msgstr "W użyciu" @@ -2597,26 +2200,6 @@ msgstr "Sprawdź" msgid "Open" msgstr "Otwórz" -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "Administrator" - -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "ProwadzÄ…cy" - -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "Menedżer programowy" - -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "Gość" - #: airtime_mvc/application/controllers/LocaleController.php:316 msgid "Guests can do the following:" msgstr "GoÅ›cie majÄ… mozliwość:" @@ -2675,17 +2258,11 @@ msgstr "ZarzÄ…dzać preferencjami" #: airtime_mvc/application/controllers/LocaleController.php:330 msgid "Manage users" -msgstr "ZarzÄ…dzać użytkownikami" - -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "ZarzÄ…dzać przeglÄ…danymi katalogami" - -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "WyÅ›lij informacjÄ™ zwrotnÄ…" +msgstr "ZarzÄ…dzać użytkownikami" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "ZarzÄ…dzać przeglÄ…danymi katalogami" #: airtime_mvc/application/controllers/LocaleController.php:333 msgid "View system status" @@ -2751,6 +2328,12 @@ msgstr "Pt" msgid "Sa" msgstr "So" +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Zamknij" + #: airtime_mvc/application/controllers/LocaleController.php:355 msgid "Hour" msgstr "Godzina" @@ -2772,6 +2355,14 @@ msgstr "Wybierz pliki" msgid "Add files to the upload queue and click the start button." msgstr "Dodaj pliki do kolejki i wciÅ›nij \"start\"" +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "Status" + #: airtime_mvc/application/controllers/LocaleController.php:365 msgid "Add Files" msgstr "Dodaj pliki" @@ -2859,6 +2450,12 @@ msgstr "BÅ‚Ä…d: plik jest za duży:" msgid "Error: Invalid file extension: " msgstr "BÅ‚Ä…d: nieprawidÅ‚owe rozszerzenie pliku:" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:389 msgid "Create Entry" msgstr "" @@ -2874,28 +2471,179 @@ msgstr "Skopiowano %srow%s do schowka" #: airtime_mvc/application/controllers/LocaleController.php:394 #, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." msgstr "%sPrint view%s Użyj j funkcji drukowania na swojej wyszykiwarce. By zakoÅ„czyć, wciÅ›nij 'escape'." -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "ProszÄ™ wpisać nazwÄ™ użytkownika i hasÅ‚o" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "Nie masz uprawnieÅ„ do odÅ‚Ä…czenia żródÅ‚a" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "BÅ‚Ä™dna nazwa użytkownika lub hasÅ‚o. Spróbuj ponownie." +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "ŹródÅ‚o nie jest podÅ‚Ä…czone do tego wyjÅ›cia." -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "Email nie zostaÅ‚ wysÅ‚any. Sprawdź swoje ustawienia serwera pocztowego i upewnij siÄ™, że zostaÅ‚ skonfigurowany poprawnie." +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "Nie masz uprawnieÅ„ do przeÅ‚Ä…czenia źródÅ‚a." -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "Podany adres email nie zostaÅ‚ odnaleziony." +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "PrzeglÄ…dasz starszÄ… wersjÄ™ %s" + +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "Nie można dodać Å›cieżek do bloków dynamicznych" + +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "nie znaleziono %s" + +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "Nie masz pozwolenia na usuniÄ™cie wybranych %s(s)" + +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "WystapiÅ‚ bÅ‚Ä…d" + +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "Utwory mogÄ… być dodane tylko do smartblocku" + +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "Lista odtwarzania bez tytuÅ‚u" + +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Smartblock bez tytuÅ‚u" + +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "Nieznana playlista" + +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "Nie masz dostÄ™pu do tej lokalizacji" + +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "Nie masz dostÄ™pu do tej lokalizacji." + +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "Plik nie istnieje w Airtime." + +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "Plik nie istnieje w Airtime" + +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "Plik nie istnieje w Airtime." + +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "ZÅ‚e zapytanie. Nie zaakceprtowano parametru 'mode'" + +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "ZÅ‚e zapytanie. Parametr 'mode' jest nieprawidÅ‚owy" + +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "PodglÄ…d" + +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "Dodaj do listy odtwarzania" + +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "Dodaj do smartblocku" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "UsuÅ„" + +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "Skopiuj listÄ™ odtwarzania" + +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "Edytuj" + +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "Soundcloud" + +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "Zobacz na Soundcloud" + +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "PrzeÅ›lij ponownie do SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "PrzeÅ›lij do SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "Brak dostepnych czynnoÅ›ci" + +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "Nie masz uprawnieÅ„ do usuniÄ™cia wybranych elementów" + +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "Nie można skasować niektórych plików z harmonogramu." + +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "Kopia %s" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Wybierz kursor" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "UsuÅ„ kursor" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "audycja nie istnieje" #: airtime_mvc/application/controllers/PreferenceController.php:74 msgid "Preferences updated." @@ -2922,988 +2670,1130 @@ msgstr "należy okreslić Å›cieżkÄ™" msgid "Problem with Liquidsoap..." msgstr "Problem z Liquidsoap..." -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Wybierz kursor" +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "Aktualnie odtwarzane" + +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "Dodaj media" + +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Biblioteka" + +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "Kalendarz" + +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "System" + +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "Preferencje" + +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "Użytkownicy" + +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Foldery mediów" + +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Strumienie" + +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "Statystyki sÅ‚uchaczy" + +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "" + +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "Historia odtwarzania" + +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "" + +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "Pomoc" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "UsuÅ„ kursor" +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "Jak zacząć" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "audycja nie istnieje" +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "Instrukcja użytkowania" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Webstream bez nazwy" +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "Informacje" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Zapisano webstream" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "UsÅ‚uga" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "NieprawidÅ‚owe wartoÅ›ci formularzy" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "Czas pracy" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "PrzeglÄ…dasz starszÄ… wersjÄ™ %s" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "CPU" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "Nie można dodać Å›cieżek do bloków dynamicznych" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "Pamięć" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "Nie masz pozwolenia na usuniÄ™cie wybranych %s(s)" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Wersja Airtime" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "Utwory mogÄ… być dodane tylko do smartblocku" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "Miejsce na dysku " -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "Lista odtwarzania bez tytuÅ‚u" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "Ustawienia Email/Serwera pocztowego" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Smartblock bez tytuÅ‚u" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "Ustawienia SoundCloud" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "Nieznana playlista" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Dni powtarzania:" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "Nie odnaleziono strony" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "UsuÅ„" -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "BÅ‚Ä…d aplikacji" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "Dodaj" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "Użytkownik zostaÅ‚ dodany poprawnie!" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "PoÅ‚aczenie URL:" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "Użytkownik zostaÅ‚ poprawnie zaktualizowany!" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "Ustawienia strumienia wejÅ›ciowego" -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "Ustawienia zostaÅ‚y poprawnie zaktualizowane!" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "Adres URL poÅ‚Ä…cznia dla ŹródÅ‚a NadrzÄ™dnego" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "Rok %s musi być w przedziale od 1753 do 9999" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "ZastÄ…p" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s nie jest poprawnÄ… datÄ…" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "OK" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s:%s:%s nie jest prawidÅ‚owym czasem" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "RESETUJ" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "Audycja bez nazwy" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "Adres URL poÅ‚Ä…czenia dla Å»ródÅ‚a audycji" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "Katalog importu:" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(Wymagane)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "Katalogi obserwowane:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "Zarejestruj Airtime" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "NieprawidÅ‚owy katalog" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "W celu udoskonalenia programu Airtime, prosimy o przesÅ‚anie informacji zwrotnej o sposobie uzytkowania. Informacje takie bÄ™dÄ… zbierane regualrnie w celu poprawienia jakoÅ›ci uzytkowania. %s Kliknij \"Tak, chcÄ™ wesprzeć Airtime\", doÅ‚ożymy staraÅ„, by funkcje, których używasz, byÅ‚y stale ulepszane." -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Nazwa użytkownika:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "Kliknij w poniższe pole w celu umieszczenia reklamy twojej radiostacji na %s Sourfabric.org%s. Należy przy tym udostÄ™pnić opcjÄ™ 'WyÅ›lij informacjÄ™ zwrotnÄ…'. Informacje te bÄ™dÄ… pozyskiwane razem z informacjÄ… zwrotnÄ…." -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "HasÅ‚o:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(tylko dla celów weryfikacji, dane nie bÄ™dÄ… rozpowszechniane)" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "Potwierdź hasÅ‚o:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Uwaga: każdy plik o rozmiarze wiÄ™kszym niż 600x600 zostanie zmniejszony" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "ImiÄ™:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Pokazuj, co wysyÅ‚am" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "Nazwisko:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "Zasady i warunki" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "Email:" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "Resetuj hasÅ‚o" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Telefon:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Wybierz folder" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "Ustaw" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "Aktualny folder importu:" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "Typ użytkownika:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "Przeskanuj ponownie obserwowany katalog (Przydatne w przypadku rozsynchronizowanego dysku sieciowego)." -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "Nazwa użytkownika musi być unikalna." +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "UsuÅ„ obserwowany katalog." + +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "Nie obserwujesz w tej chwili żadnych folderów" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "Automatyczne wyÅ‚Ä…czanie" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "StrumieÅ„" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "Automatyczne wÅ‚Ä…czanie" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "Opcje dodatkowe" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "ZmieÅ„ dÅ‚ugość przenikania siÄ™ utworów" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "W odtwarzaczu sÅ‚uchacza wyÅ›wietli sie nastepujaca informacja:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "wprowadź czas w sekundach 00{.000000}" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(Strona internetowa Twojej stacji)" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "Nazwa użytkownika nadrzÄ™dnego" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "URL strumienia:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "HasÅ‚o użytkownika nadrzÄ™dnego" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "Filtruj HistoriÄ™" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "Adres URL do źródÅ‚a nadrzÄ™dnego" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "Znajdź audycjÄ™" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "Adres URL dostÄ™pu do źródÅ‚a audycji" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "Filtruj wg audycji" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "NadrzÄ™dny port źródÅ‚owy" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "ustawienia %s's " -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "Możliwe sÄ… tylko cyfry." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "W celu udoskonalenia programu Airtime, prosimy o przesÅ‚anie informacji zwrotnej o sposobie uzytkowania. Informacje takie bÄ™dÄ… zbierane regualrnie w celu poprawienia jakoÅ›ci uzytkowania. %s Kliknij \"Tak, chcÄ™ wesprzeć Airtime\", doÅ‚ożymy staraÅ„, by funkcje, których używasz, byÅ‚y stale ulepszane." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "NadrzÄ™dny punkt montowania źródÅ‚a" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "Kliknij w poniższe pole w celu zareklamowania swojej stacji na %sSourcefabric.org%s." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Wprowadzony znak jest nieprawidÅ‚owy" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(Aby promowac stacjÄ™, należy udostepnić funkcjÄ™ \"wyÅ›lij informacjÄ™ zwrotnÄ…\")" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Port źródÅ‚owy audycji" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Polityka prywatnoÅ›ci Sourcefabric" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "ŹródÅ‚owy punkt montowania audycji" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "Nie można użyć tego samego portu co źródÅ‚o nadrzÄ™dne" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "Port %s nie jest dostÄ™pny" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Wybierz dni:" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "%value% nie odpowiada formatowi 'HH:mm'" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Opcje smart blocku" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "Data/Czas rozpoczÄ™cia:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "Data/Czas zakoÅ„czenia:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "Czas trwania:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr "do" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "Strefa czasowa:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "pliki speÅ‚niajÄ… kryteria" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "Powtarzanie?" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "plik speÅ‚nia kryteria" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "Nie można utworzyć audycji w przeszÅ‚oÅ›ci" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "Nie mozna zmienić daty/czasu audycji, która siÄ™ już rozpoczęła" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "Czas trwania nie może być mniejszy niż 0m" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "Czas trwania nie może wynosić 00h 00m" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "Czas trwania nie może być dÅ‚uższy niż 24h" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "Typ powtarzania:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "tygodniowo" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "miesiÄ™cznie" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "Nowy" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "Nowa lista odtwarzania" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "Nowy Smartblock" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "Nowy webstream" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "Zobacz/edytuj opis" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "URL strumienia:" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "DomyÅ›lna dÅ‚ugość:" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "Brak webstreamu" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "Ustawienia strumienia" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Ustawienia ogólne" -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Wybierz dni:" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "dB" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "Ustawienia strumienia wyjÅ›ciowego" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "Importowanie plików w toku..." -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "Zaawansowane opcje wyszukiwania" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "Data zakoÅ„czenia:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "poprzedni" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "Bez czasu koÅ„cowego?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "play" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "Data koÅ„cowa musi wystÄ™pować po dacie poczÄ…tkowej" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "pauza" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "nastÄ™pny" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "Pole jest wymagane i nie może być puste" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "stop" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "HasÅ‚o" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "wycisz" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "Potwierdź nowe hasÅ‚o" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "wÅ‚Ä…cz gÅ‚os" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "HasÅ‚a muszÄ… siÄ™ zgadzać." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "maksymalna gÅ‚oÅ›ność" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Uzyskaj nowe hasÅ‚o" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "Wymagana aktualizacja" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Nazwa stacji" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "By odtworzyć medium, należy zaktualizować przeglÄ…darkÄ™ do najnowszej wersji bÄ…dź zainstalowac aktualizacjÄ™ %sFlash plugin%s" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Telefon:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "DÅ‚ugość: " -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "Strona internetowa stacji:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "CzÄ™stotliwość próbkowania:" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "Kraj:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "Numer Isrc:" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "Miasto:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "Åšcieżka pliku:" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "Opis stacji:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Web Stream" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Logo stacji:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "Smart block dynamiczny" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "Promuj mojÄ… stacjÄ™ na Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "Smart block statyczny" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "ZanaczajÄ…c to pole, akceptujesz %spolitykÄ™ prywatnoÅ›ci%s Sourcefabric." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Åšcieżka audio" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "Wymagana jest akceptacja polityki prywatnoÅ›ci." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "Zawartość listy odtwarzania:" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%value%' nie jest poprawnym adresem email w podstawowym formacie local-part@hostname" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "Zawartość statycznego Smart Blocka:" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%' nie pasuje do formatu daty '%format%'" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "Kryteria dynamicznego Smart Blocku " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%' zawiera mniej niż %min% znaków" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "Ogranicz(enie) do:" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%value%' zawiera wiÄ™cej niż %max% znaków" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%' nie zawiera siÄ™ w przedziale od '%min%' do '%max%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "HasÅ‚a muszÄ… siÄ™ zgadzać" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "WÅ‚Ä…czony:" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "Licznik sÅ‚uchaczy na przestrzeni czasu" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "Typ strumienia:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Witamy w Airtime!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "Typ usÅ‚ugi:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Dowiedz siÄ™ jak rozpocząć użytkowanie Airtime'a, aby zautomatyzować transmisje radiowe:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "KanaÅ‚y:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "Zacznij od dodania swoich plików do biblioteki używajÄ…c przycisku \"dodaj media\" w menu programu\". Możesz także przeciÄ…gnąć pliki do tego okna." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "Utwórz audycjÄ™ przechodzÄ…c do '\"kalendarza\" w pasku \"menu\" a nastÄ™pnie klikajÄ…c w ikonÄ™ \"+ Audycja\". Można utworzyć audycjÄ™ do jednorazowego bÄ…dź wielokrotnego odtwarzania. Jedynie administratorzy i zarzÄ…dzajÄ…cy audycjami mogÄ… je dodawać." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "Dodaj media do audycji przez przejÅ›cie do audycji w kalendarzu, kliknij na niego lewym przyciskiem myszki wybierajÄ…c opcjÄ™ 'dodaj/usuÅ„ zawartość'" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Serwer" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Wybierz media z lewego okna i przeciÄ…gnij do utworzonej audyji w prawym oknie" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "Port" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "Gotowe!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "adres URL" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "W celu uzyskania szczegółowej pomocy, skorzystaj z %suser manual%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Punkt montowania" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "Podziel siÄ™" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "Login Administratora" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Wybierz strumieÅ„:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "HasÅ‚o Administratora" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sAirtime%s %s otwarte oprogramowanie radiowe do planowania i zdalnego zarzÄ…dzania stacjÄ…. %s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "Serwer nie może być pusty." +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%sSourcefabric%s o.p.s. Airtime jest rozpowszechniany na podstawie %sGNU GPL v.3%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "Port nie może być pusty." +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "Nowe hasÅ‚o" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "Punkt montowania nie może być pusty dla serwera Icecast." +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "Wprowadź i potwierdź swoje hasÅ‚o w poniższych polach" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "SprzÄ™towe wyjÅ›cie audio" +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "Wprowadź adres swojego konta e-mail, na który zostanie przesÅ‚any link w celu utworzenia nowego hasÅ‚a. " -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "Typ wyjÅ›cia" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "Email zostaÅ‚ wysÅ‚any" -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Metadane Icecast Vorbis" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "E-mail zostaÅ‚ wysÅ‚any" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "Nazwa strumienia:" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "Powrót do okna logowania" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "Artysta - TytuÅ‚" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "Witamy w internetowej wersji demonstracyjnej programu Airtime. Możesz siÄ™ zalogować, wpisujÄ…c login 'admin' oraz hasÅ‚o 'admin'" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Audycja - Artysta -TytuÅ‚" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "Poprzedni:" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Nazwa stacji - Nazwa audycji" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "NastÄ™pny:" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "Metadane Off Air" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "Strumienie źródÅ‚owe" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "WÅ‚Ä…cz normalizacjÄ™ gÅ‚oÅ›noÅ›ci (Replay Gain)" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "ŹródÅ‚o NadrzÄ™dne" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "Modyfikator normalizacji gÅ‚oÅ›noÅ›ci" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "ŹródÅ‚o audycji" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "Szukaj Użytkowników:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "Planowane odtwarzanie" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "ProwadzÄ…cy:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "Na antenie" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "Nagrywać z wejÅ›cia liniowego?" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "SÅ‚uchaj" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "Odtwarzać ponownie?" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "Czas stacji" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "WÅ‚Ä…cz Emaile Systemowe (Resetowanie hasÅ‚a)" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "Twoja próba wygasa" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "Adres nadawcy Emaila" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Zakup kopiÄ™ Airtime'a" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "Skonfiguruj serwer pocztowy" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "Moje konto" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "Wymagana autoryzacja" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "ZarzÄ…dzaj Użytkownikami" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "Serwer Email" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "Nowy Użytkownik" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "Adres Email" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "id" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "Wpisz znaki, które widzisz na obrazku poniżej." +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "ImiÄ™" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "Należy okreÅ›lić dzieÅ„" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "Nazwisko" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "Należy okreÅ›lić czas" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "Typ użytkownika" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "Należy odczekać przynajmniej 1 godzinÄ™ przed ponownym odtworzeniem" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Zastosuj uwierzytelnienie Airtime:" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "Zastosuj wÅ‚asne uwierzytelnienie:" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "Nazwa użytkownika" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Aplikacja domyÅ›lna Zend Framework" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "HasÅ‚o" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "Nie znaleziono strony!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "Pole nazwy użytkownika nie może być puste." +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "WyglÄ…da na to, że strona, której szukasz nie istnieje" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "Pole hasÅ‚a nie może być puste." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "ZwiÄ™ksz bok statyczny" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "Data rozpoczÄ™cia:" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "ZwiÄ™ksz blok dynamiczny" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "Pusty smart block" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "wprowadź czas w sekundach 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "Pusta playlista" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "Umożliwienie zdalnego dostÄ™pu z innych stron \"Plan\" Info?%s (WÅ‚Ä…cz, aby zewnÄ™trzne widgety dziaÅ‚aÅ‚y.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Wymieszaj listÄ™ odtwarzania" + +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Zapisz listÄ™ odtwarzania" + +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "PÅ‚ynne przenikanie utworów na liÅ›cie dotwarzania" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "WyÅ‚Ä…czone" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "ZgÅ‚aÅ›nianie [fade in]:" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "WÅ‚Ä…czone" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Wyciszanie [fade out]:" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "DomyÅ›lny jÄ™zyk" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "Brak otwartej listy odtwarzania" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "TydzieÅ„ zaczynaj od" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(ss.t)" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "Brak otwartego smartblocka" + +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "ZgÅ‚aÅ›nianie [Cue in]:" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "Przywracanie hasÅ‚a" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(hh:mm:ss.t)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "godzin(y)" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Wyciszanie [Cue out]:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "minut(y)" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "Oryginalna dÅ‚ugość:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "Ustaw typ smart blocku:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "Dodaj audycjÄ™" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "Statyczny" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "Aktualizuj audycjÄ™" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "Dynamiczny" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "Co" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "Zezwól na powtarzanie utworów:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "Kiedy" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "Ogranicz do" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "WejÅ›cie Strumienia \"Na żywo\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "Tworzenie zawartoÅ›ci listy odtwarzania i zapisz kryteria" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "Nagrywaj i odtwarzaj ponownie" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "Utwórz" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Kto" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "Losowa kolejność odtwarzania" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Styl" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "Limit nie może być pusty oraz mniejszy od 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "Retransmisja z %s do %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "Limit nie może być wiÄ™kszy niż 24 godziny" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Wybierz kraj" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "Wartość powinna być liczbÄ… caÅ‚kowitÄ…" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "DÅ‚ugość musi być wiÄ™ksza niż 0 minut" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "Maksymalna liczba elementów do ustawienia to 500" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "DÅ‚ugość powinna mieć postać \"00h 00m\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "Należy wybrać kryteria i modyfikator" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "URL powinien mieć postać \"http://domain\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "DÅ‚ugość powinna być wprowadzona w formacie '00:00:00'" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "URL powinien mieć 512 znaków lub mniej" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "Wartość powinna byc zapisana w formacie timestamp (np. 0000-00-00 lub 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "Nie znaleziono typu MIME dla webstreamu" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "Wartość musi być liczbÄ…" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "Nazwa webstreamu nie może być pusta" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "Wartość powinna być mniejsza niż 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "Nie można przeanalizować playlisty XSPF" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "Wartość powinna posiadać mniej niż %s znaków" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "Nie można przeanalizować playlisty PLS" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "Wartość nie może być pusta" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "Nie można przeanalizować playlisty M3U" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Audycja:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "NieprawidÅ‚owy webstream, prawdopodobnie trwa pobieranie pliku." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "Wszystkie moje audycje:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "Nie rozpoznano typu strumienia: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "Numer ISRC:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s jest już obserwowny." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "Automatycznie dodawaj nagrane audycje" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s zawiera obserwowany katalog zagnieżdzony: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "WÅ‚Ä…cz wysyÅ‚anie do SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s jest zagnieżdzony w istniejÄ…cym, aktualnie obserwowanym katalogu: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "Automatycznie oznaczaj pliki jako \"Do pobrania\" na SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s nie jest poprawnym katalogiem." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "Email SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s jest już ustawiony jako katalog główny bÄ…dź znajduje siÄ™ na liÅ›cie katalogów obserwowanych" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "HasÅ‚o SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s jest już ustawiony jako katalog główny bÄ…dź znajduje siÄ™ na liÅ›cie katalogów obserwowanych." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "Tagi SoundCloud: (oddzielaj tagi spacjÄ…)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s nie wystÄ™puje na liÅ›cie katalogów obserwowanych." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "DomyÅ›lny gatunek:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "DomyÅ›lny typ utworu:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "Harmonogram, który przeglÄ…dasz jest nieaktualny! (bÅ‚Ä™dne dopasowanie harmonogramu)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "Oryginalny" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "Harmonogram, który przeglÄ…dasz jest nieaktualny! (bÅ‚Ä™dne dopasowanie instancji)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "Harmonogram, który przeglÄ…dasz jest nieaktualny!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "Na żywo" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "Nie posiadasz uprawnieÅ„, aby zaplanować audycjÄ™ %s." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "Nagranie" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "Nie można dodawać plików do nagrywanych audycji." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "Mówiony" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "Audycja %s przekracza dopuszczalnÄ… dÅ‚ugość i nie może zostać zaplanowana." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "Audycja %s zostaÅ‚a zaktualizowana wczeÅ›niej!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "Praca w toku" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "Wybrany plik nie istnieje!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "RdzeÅ„" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "Cue-in i cue-out majÄ… wartość zerowÄ…." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "PÄ™tla" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "Wartość cue-in nie może być wiÄ™ksza niż cue-out." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Efekt dźwiÄ™kowy" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "Wartość cue-out nie może być wiÄ™ksza niż dÅ‚ugość pliku." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "Próbka one-shot" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "Wartość cue-out nie może być mniejsza od cue-in." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Inne" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "Plik nie zostaÅ‚ przesÅ‚any, na dysku pozostaÅ‚o %s MB wolnego miejsca, a plik który próbujesz przesÅ‚ać ma %s MB." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "DomyÅ›lna licencja:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "Audycje mogÄ… mieć maksymalnÄ… dÅ‚ugość 24 godzin." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "Utwór w domenie publicznej" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"Nie można planować audycji nakÅ‚adajÄ…cych siÄ™ na siebie.\n" +"Uwaga: zmiana audycji powoduje automatycznÄ… zmianÄ™ wszystkich jej powtórzeÅ„." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "Wszelkie prawa zastrzeżone" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Witaj %s, \n" +"\n" +"Kliknij w ten link aby zresetować swoje hasÅ‚o:" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "Uznanie autorstwa wg licencji Creative Commons " +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Resetowanie hasÅ‚a Airtime" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "Użycie niekomercyjne wg Creative Commons " +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "Uznanie Autorstwa Bez Utworów Zależnych wg Creative Commons" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "PrzeglÄ…daj metadane nagrania" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "Uznanie a Na Tych Samych Warunkach wg Creative Commons " +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Zawartość audycji" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "Uznanie Autorstwa Bez Utworów Zależnych wg Creative Commons" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "UsuÅ„ caÅ‚Ä… zawartość" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "Uznanie a Na Tych Samych Warunkach wg Creative Commons " +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "Skasuj obecnÄ… audycjÄ™" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "Kolor tÅ‚a:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "Kolor tekstu:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "Edytuj audycjÄ™" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "Aktualnie odtwarzane" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "UsuÅ„ tÄ… instancjÄ™" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "Dodaj media" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "UsuÅ„ ten i wszystkie inne instancje" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Biblioteka" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "Kalendarz" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "Nie można użyć metody 'przeciÄ…gnij i upuść' dla powtórek audycji." -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "System" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "Nie można przenieść audycji archiwalnej" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "Użytkownicy" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "Nie można przenieść audycji w przeszÅ‚ość" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Foldery mediów" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "Nagrywana audycja nie może zostać przeniesiona na mniej niż 1h przed jej powtórkÄ…." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Strumienie" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "Audycja zostaÅ‚a usuniÄ™ta, ponieważ nagranie nie istnieje!" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "Statystyki sÅ‚uchaczy" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "Należy odczekać 1 godzinÄ™ przed ponownym odtworzeniem." -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" msgstr "" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "Historia odtwarzania" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "Odtwarzane" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "Rok %s musi być w przedziale od 1753 do 9999" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "Jak zacząć" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s nie jest poprawnÄ… datÄ…" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "Instrukcja użytkowania" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s:%s:%s nie jest prawidÅ‚owym czasem" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3912,3 +3802,18 @@ msgstr "Wybierz opcjÄ™" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "Brak danych" + +#~ msgid "can't resize a past show" +#~ msgstr "nie można zmienić rozmiaru przeszÅ‚ej audycji" + +#~ msgid "Should not overlap shows" +#~ msgstr "Audycje nie powinny nakÅ‚adać siÄ™." + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "Katalog 'organize' nie może zostać utworzony." + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "Ten plik jest prawdopodobnie uszkodzony i nie można go dodać do biblioteki mediów." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "Plik nie zostaÅ‚ dodany, bÅ‚Ä…d ten może wystÄ™pować w przypadku, kiedy nie ma wystarczajÄ…cej iloÅ›ci wolnego miejsca na dysku lub katalog przechowywania nie posiada odpowiednich uprawnieÅ„ do zapisu." diff --git a/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po index 5891e00248..902d1ad5cc 100644 --- a/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po @@ -1,35 +1,23 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # Sourcefabric , 2012 msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-01-29 15:11+0000\n" "Last-Translator: andrey.podshivalov\n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/airtime/language/pt_BR/)\n" +"Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime Copyright ©Sourcefabric o.p.s. Todos od direitos reservados.%sMantido e distribuído sob licença GNU GPL v.3 by %sSourcefabric o.p.s%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "Fluxo ao vivo" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -50,9 +38,9 @@ msgid "Stop" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Cue Entrada" @@ -61,9 +49,9 @@ msgid "Set Cue In" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Cue Saída" @@ -85,1620 +73,1418 @@ msgstr "Fade Entrada" msgid "Fade Out" msgstr "Fade Saída" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "Título" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime Copyright ©Sourcefabric o.p.s. Todos od direitos reservados.%sMantido e distribuído sob licença GNU GPL v.3 by %sSourcefabric o.p.s%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "Criador" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "Fluxo ao vivo" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Ãlbum" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "Habilitado:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "Duração" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "Tipo de Fluxo:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Gênero" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Bitrate:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "Humor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "Tipo de Serviço:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "Legenda" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "Canais:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "Compositor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Mono" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Stéreo" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "Copyright" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Servidor" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Ano" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Caracter inválido informado" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "Porta" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "Maestro" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "Somente números são permitidos." -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "Idioma" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "Senha" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Gênero" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "URL" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "Executado" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "Nome" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "Descrição" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "Visualizar Metadados do Arquivo Gravado" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Ponto de Montagem" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "Visualizar no SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Usuário" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Enviar para SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "Usuário Administrador" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "Re-enviar para SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "Senha do Administrador" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Exibir Conteúdo" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Obtendo informações do servidor..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "Adicionar / Remover Conteúdo" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "Servidor não pode estar em branco." -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "Remover Todo o Conteúdo" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "Porta não pode estar em branco." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "Cancelar Programa em Exibição" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "Ponto de montagem deve ser informada em servidor Icecast." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "Título:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "Editar" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "Criador:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "Editar Programa" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Ãlbum:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "Excluir" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Faixa:" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "Excluir esta Instância" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Gênero:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "Excluir esta Instância e todas as seguintes" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Ano:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "Legenda:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "Não é possível arrastar e soltar programas repetidos" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "Compositor:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "Não é possível mover um programa anterior" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "Maestro:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "Não é possível mover um programa anterior" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "Humor:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "Não é permitido agendar programas sobrepostos" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "Não é possível mover um programa gravado menos de 1 hora antes de suas retransmissões." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "Copyright:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "O programa foi excluído porque a gravação prévia não existe!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "Número ISRC:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "É necessário aguardar 1 hora antes de retransmitir." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "Website:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "Preferências" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "Idioma:" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Salvar" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "Gerenciar Diretórios de Mídia" - -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "Configurações de Fluxo" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "Cancelar" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Configurações Globais" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Usuário:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "dB" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "Senha:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "Configurações do Fluxo de Saída" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "Confirmar Senha:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Selecione o diretório" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "Primeiro nome:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "Definir" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "Último nome:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "Diretório de Importação Atual:" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "Email:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "Adicionar" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Celular:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "Verificar novamente diretório monitorado (Isso pode ser útil em caso de montagem de volume em rede e este estiver fora de sincronia com o Airtime)" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "Remover diretório monitorado" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "Você não está monitorando nenhum diretório." +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "Perfil do Usuário:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "Registrar Airtime" +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "Visitante" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Colabore com a evolução do Airtime, permitindo à Sourcefabric conhecer como você está usando o produto. Essas informações serão colhidas regularmente, a fim de melhorar a sua experiência como usuário.%s Clique na opção \"Enviar Comentário de Apoio\" e nós garantiremos a evolução contínua das funcionalidade que você utiliza." +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "DJ" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "Clique na oção abaixo para divulgar sua estação em %sSourcefabric.org%s." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "Gerente de Programação" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(Obrigatório)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(somente para efeito de verificação, não será publicado)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Nota: qualquer arquivo maior que 600x600 será redimensionado" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Mostrar quais informações estou enviando" +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "Administrador" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "Termos e Condições" +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "Usuário já existe." -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "Encontrar Programas" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "Cor de Fundo:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "Filtrar por Programa:" +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "Cor da Fonte:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "Redefinir senha" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "Data de Início:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Opções de Bloco" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "Data de Fim:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Programa:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "Meus Programas:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr "para" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "dias" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "arquivos correspondem ao critério" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "O dia precisa ser especificado" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "arquivo corresponde ao critério" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "O horário deve ser especificado" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "URL de Conexão:" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "É preciso aguardar uma hora para retransmitir" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Colabore com a evolução do Airtime, permitindo à Sourcefabric conhecer como você está usando o produto. Essas informações serão colhidas regularmente, a fim de melhorar a sua experiência como usuário.%s Clique na opção \"Enviar Comentário de Apoio\" e nós garantiremos a evolução contínua das funcionalidade que você utiliza." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "Diretório de Importação:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "Clique na oção abaixo para divulgar sua estação em %sSourcefabric.org%s." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "Diretórios Monitorados: " -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(para divulgação de sua estação, a opção 'Enviar Informações de Suporte\" precisa estar habilitada)" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "Não é um diretório válido" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Política de Privacidade Sourcefabric" +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "Procurar Usuários:" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "Configurações do Fluxo de Entrada" +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "DJs:" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "URL de Conexão da Fonte Master:" +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "Acessar" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "Soprebor" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "Digite os caracteres que você vê na imagem abaixo." -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Nome da Estação" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "REDEFINIR" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "URL de Conexão da Fonte do Programa:" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "informe o tempo em segundos 0{.0}" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Selecione os Dias:" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "Remover" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Dias para reexibir:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "Permitir que sites remotos acessem as informações sobre \"Programação\"?%s (Habilite para fazer com que widgets externos funcionem.)" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "Configurações de Email" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "Inativo" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "Configurações do SoundCloud" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "Ativo" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "Configurações de %s" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "Idioma Padrão da Interface" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "Semana Inicia Em" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "Domingo" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "Fluxo" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "Segunda" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "Opções Adicionais" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "Terça" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "A informação a seguir será exibida para os ouvintes em seu player de mídia:" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "Quarta" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(O website de sua estação de rádio)" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "Quinta" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "URL do Fluxo:" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "Sexta" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "Histórico de Filtros" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Sábado" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Benvindo ao Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Saiba como utilizar o Airtime para automatizar suas transmissões:" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "Tipo de Reexibição:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "Comece adicionando seus arquivos à biblioteca usando o botão \"Adicionar Mídia\" . Você também pode arrastar e soltar os arquivos dentro da página." +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "semanal" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "Crie um programa, através do 'Calendário' , clicando no ícone '+Programa'. Este pode ser um programa inédito ou retransmitido. Apenas administradores e gerentes de programação podem adicionar programas." +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "Adicione conteúdos ao seu programa, através do link Calendário, clique com o botão esquerdo do mouse sobre o programa e selecione \"Adicionar / Remover Conteúdo\"" +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Selecione seu conteúdo a partir da lista , no painel esquerdo, e arraste-o para o seu programa, no painel da direita." +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "Você já está pronto para começar!" +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "mensal" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "Para obter ajuda mais detalhada, leia o %smanual do usuário%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Selecione os Dias:" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "Sobre" +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "Dom" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sAirtime%s %s, um software livre para automação e gestão remota de estação de rádio. % s" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "Seg" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%sSourcefabric%s o.p.s. Airtime é distribuído sob a licença %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "Ter" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "Compartilhar" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "Qua" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Selecionar fluxo:" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "Qui" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "Mudo" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "Sex" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "retirar mudo" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "Sab" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "Acessar" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Bem-vindo à demonstração online do Airtime! Autentique-se com usuário 'admin' e senha \"admin\"." +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "Digite seu endereço de email. Você receberá uma mensagem contendo um link para criar sua senha." +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "Email enviado" +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "Sem fim?" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "Um email foi enviado" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "A data de fim deve ser posterior à data de início" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "Voltar à tela de login" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "Nova senha" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "Confirmar nova senha" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "Por favor informe e confirme sua nova senha nos campos abaixo." +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "A senha de confirmação não confere." -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "Seu período de teste termina em" +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Obter nova senha" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "dias" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "Selecione um critério" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Adquira sua cópia do Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Ãlbum" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "Minha Conta" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Bitrate (Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "Anterior:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "Próximo:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "Compositor" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "Fontes de Fluxo" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "Maestro" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "Master" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "Copyright" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "Programa" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "Criador" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "Programação" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Convertido por" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "NO AR" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "Ouvir" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "Hora Local" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Fechar" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "Adicionar este programa" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "Atualizar programa" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "O que" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "Quando" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "Fluxo de entrada ao vivo" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "Gravar & Retransmitir" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Quem" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Aparência" - -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "Início" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "Serviço" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "Estado" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "Uptime" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "CPU" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "Memória" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Versão do Airtime" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "Espaço em Disco" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "Importação de arquivo em progresso..." - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "Opções da Busca Avançada" - -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "Número de ouvintes durante a exibição" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "Novo" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "Nova Lista" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "Novo Bloco" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "Novo Fluxo Web" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "Ver / editar descrição" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "Legenda" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "Descrição" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "Idioma" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "URL do Fluxo:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "Última Ateração" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "Duração Padrão:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "Última Execução" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "Nenhum fluxo web" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "Duração" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Mime" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "Humor" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Embaralhar Lista" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "Prorietário" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 -msgid "Shuffle" -msgstr "Embaralhar" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "Ganho de Reprodução" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Salvar Lista" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "Taxa de Amostragem (khz)" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "Crossfade da Lista" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "Título" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "Fade de entrada" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "Número de Faixa" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Fade de saída" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "Adicionado" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "Nenhuma lista aberta" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "Website" -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Ano" -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(ss,t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "Selecionar modificador" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "contém" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "Nenhum bloco aberto" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "não contém" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "Cue entrada:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "é" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(hh:mm:ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "não é" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Cue Saída:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "começa com" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "Duração Original:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "termina com" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "Expandir Bloco Estático" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "é maior que" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "Expandir Bloco Dinâmico" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "é menor que" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "Bloco vazio" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "está no intervalo" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "Lista vazia" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "horas" -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Aplicativo Padrão Zend Framework" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "minutos" -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "Página não encontrada!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "itens" -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "A página que você procura não existe!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "Definir tipo de bloco:" -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "Ajuda" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "Estático" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "anterior" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "Dinâmico" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "play" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "Permitir Repetição de Faixas:" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "pause" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "Limitar em" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "próximo" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "Gerar conteúdo da lista e salvar critério" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "stop" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "Gerar" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "volume máximo" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "Embaralhar conteúdo da lista" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "Atualização Necessária" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle" +msgstr "Embaralhar" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "Para reproduzir a mídia que você terá que quer atualizar seu navegador para uma versão recente ou atualizar seu %sFlash plugin%s." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "O limite não pode ser vazio ou menor que 0" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "O limite não pode ser maior que 24 horas" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "O valor deve ser um número inteiro" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "Nome" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "O número máximo de itens é 500" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "Você precisa selecionar Critério e Modificador " -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "A duração deve ser informada no formato '00:00:00'" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "O valor deve estar no formato timestamp (ex. 0000-00-00 ou 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "O valor deve ser numérico" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "O valor precisa ser menor que 2147483648" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "O valor deve conter no máximo %s caracteres" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "O valor não pode estar em branco" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "Desligar Auto Switch" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "Ligar Auto Switch" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "Fade de Transição do Switch:" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "Gerenciar Usuários" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "informe o tempo em segundo 00{.000000}" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "Novo Usuário" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "Usuário Master" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "id" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "Senha Master" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Usuário" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "URL de Conexão da Fonte Master" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "Primeiro Nome" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "URL de Conexão da Fonte Programa" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "Último Nome" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "Porta da Fonte Master" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "Tipo de Usuário" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "Ponto de Montagem da Fonte Master" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "Título:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Porta da Fonte Programa" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "Criador:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "Ponto de Montagem da Fonte Programa" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Ãlbum:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "Você não pode utilizar a mesma porta do Master DJ." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Faixa:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "Porta %s indisponível." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "Duração:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Fone:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "Taxa de Amostragem:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "Website da Estação:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Bitrate:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "País:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "Humor:" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "Cidade:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Gênero:" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "Descrição da Estação:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Ano:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Logo da Estação:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "Legenda:" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "Enviar informações de suporte" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "Divulgue minha estação em Sourcefabric.org" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "Compositor:" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "Clicando nesta caixa, eu concordo com a %spolitica de privacidade%s da Sourcefabric." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "Maestro:" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "Você precisa concordar com a política de privacidade." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "Copyright:" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "Valor é obrigatório e não poder estar em branco." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "Número Isrc:" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "Website:" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "Idioma:" +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "Caminho do Arquivo:" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "Gravar a partir do Line In?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "Nome:" +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "Retransmitir?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "Descrição:" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "Usar Autenticação do Airtime:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Fluxo Web" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "Usar Autenticação Personalizada:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "Bloco Inteligente Dinâmico" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "Definir Usuário:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "Bloco Inteligente Estático" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "Definir Senha:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Faixa de Ãudio" +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "O usuário não pode estar em branco." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "Conteúdos da Lista de Reprodução:" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "A senha não pode estar em branco." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "Conteúdo do Bloco Inteligente Estático:" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "Email" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "Critério para Bloco Inteligente Dinâmico:" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "Redefinir senha" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "Limitar em" +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "Hardware para Saída de Ãudio" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "URL:" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "Tipo de Saída" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "" +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Metadados Icecast Vorbis" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "" +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "Legenda do Fluxo:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "Artista - Título" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "Os programas podem ter duração máxima de 24 horas." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Programa - Artista - Título" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "Data e horário finais não podem ser definidos no passado." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Nome da Estação - Nome do Programa" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "Não é possível agendar programas sobrepostos.\nNota: Redimensionar um programa repetitivo afeta todas as suas repetições." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "Metadados Off Air" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "Não é permitido redimensionar um programa anterior" +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "Habilitar Ganho de Reprodução" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "Os programas não devem ser sobrepostos" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "Modificador de Ganho de Reprodução" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Selecione o País" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "%value%' não é um enderçeo de email válido" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s já está monitorado." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%' não corresponde a uma data válida '%format%'" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s contém o diretório monitorado:% s" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%' is menor que comprimento mínimo %min% de caracteres" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s está contido dentro de diretório já monitorado: %s" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%value%' is maior que o número máximo %max% de caracteres" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s não é um diretório válido." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%' não está compreendido entre '%min%' e '%max%', inclusive" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s já está definido como armazenamento atual ou está na lista de diretórios monitorados" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "Senhas não conferem" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s já está definido como armazenamento atual ou está na lista de diretórios monitorados." +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%value%' não corresponde ao formato 'HH:mm'" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s não existe na lista de diretórios monitorados." +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "Data/Horário de Início:" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "itens" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "Data/Horário de Fim:" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "Cue de entrada e saída são nulos." +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "Duração:" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "O ponto de saída não pode ser maior que a duração do arquivo" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "Fuso Horário:" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "A duração do ponto de entrada não pode ser maior que a do ponto de saída." +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "Reexibir?" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "A duração do ponto de saída não pode ser menor que a do ponto de entrada." +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "Não é possível criar um programa no passado." -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "Selecione um critério" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "Não é possível alterar o início de um programa que está em execução" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Bitrate (Kbps)" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "Data e horário finais não podem ser definidos no passado." -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "Não pode ter duração < 0m" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Convertido por" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "Não pode ter duração 00h 00m" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "Última Ateração" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "Não pode ter duração maior que 24 horas" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "Última Execução" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "Não é permitido agendar programas sobrepostos" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Mime" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "Nome:" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "Prorietário" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "Programa Sem Título" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "Ganho de Reprodução" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "URL:" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "Taxa de Amostragem (khz)" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "Descrição:" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "Número de Faixa" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "Enviar programas gravados automaticamente" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "Adicionado" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "Habilitar envio para SoundCloud" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "Website" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "Permitir download dos arquivos no SoundCloud" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "Selecionar modificador" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "Email do SoundCloud" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "contém" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "Senha do SoundCloud" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "não contém" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "Tags do SoundCloud: (separados por espaços)" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "é" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "Gênero Padrão:" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "não é" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "Tipo de Faixa Padrão:" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "começa com" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "Original" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "termina com" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "Remix" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "é maior que" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "Ao Vivo" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "é menor que" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "Gravando" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "está no intervalo" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "Falado" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "A duração precisa ser maior que 0 minuto" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "Podcast" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "A duração deve ser informada no formato \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Demo" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "A URL deve estar no formato \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "Trabalho am andamento" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "A URL de conter no máximo 512 caracteres" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "Base" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "Nenhum tipo MIME encontrado para o fluxo." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "Loop" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "O nome do fluxo não pode estar vazio" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Efeito de Ãudio" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "Não foi possível analisar a lista XSPF" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "Amostra 'One Shot'" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "Não foi possível analisar a lista PLS" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Outro" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "Não foi possível analisar a lista M3U" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "Licença Padrão:" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "Fluxo web inválido. A URL parece tratar-se de download de arquivo." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "O trabalho é de domínio público" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "Tipo de fluxo não reconhecido: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "Todos os direitos são reservados" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Olá %s, \n\nClique neste link para redefinir sua senha: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "Creative Commons Attribution" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Redefinição de Senha do Airtime" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "Creative Commons Attribution Noncommercial" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "Retransmissão de %s a partir de %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "Creative Commons Attribution No Derivative Works" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "Creative Commons Attribution Share Alike" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "A programação que você está vendo está desatualizada! (programação incompatível)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "Creative Commons Attribution Noncommercial Non Derivate Works" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "A programação que você está vendo está desatualizada! (instância incompatível)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "Creative Commons Attribution Noncommercial Share Alike" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "A programação que você está vendo está desatualizada!" +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "Você não tem permissão para agendar programa %s." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "Ativar Envio de Emails (Recuperação de Senha)" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "Você não pode adicionar arquivos para gravação de programas." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "Remetente de Email para Recuperação de Senha" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "O programa %s terminou e não pode ser agendado." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "Configurar Servidor de Email" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "O programa %s foi previamente atualizado!" +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "Requer Autenticação" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "" +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "Servidor de Email" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "Um dos arquivos selecionados não existe!" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "Endereço de Email" + +#: airtime_mvc/application/controllers/ListenerstatController.php:56 +msgid "Please make sure admin user/password is correct on System->Streams page." +msgstr "Confirme se o nome de usuário / senha do administrador estão corretos na página Sistema > Fluxos." -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "Falha ao criar diretório 'organize'" +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Fluxo Sem Título" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "O arquivo não foi transferido, há %s MB de espaço livre em disco e o arquivo que você está enviando tem um tamanho de %s MB." +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Fluxo gravado." -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "Este arquivo parece estar corrompido e não será adicionado à biblioteca de mídia." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "Valores do formulário inválidos." -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "O arquivo não foi transferido, esse erro pode ocorrer se o computador não tem espaço suficiente em disco ou o diretório stor não tem as permissões de gravação corretas." +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "Por favor informe seu usuário e senha" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "Você não tem permissão para desconectar a fonte." +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "Usuário ou senha inválidos. Tente novamente." -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "Não há fonte conectada a esta entrada." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "O email não pôde ser enviado. Verifique as definições do servidor de email e certifique-se de que esteja corretamente configurado." -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "Você não tem permissão para alternar entre as fontes." +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "O email informado não foi localizado." #: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format @@ -1710,95 +1496,25 @@ msgstr "Retransmissão do programa %s de %s as %s" msgid "Download" msgstr "Download" -#: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." -msgstr "Confirme se o nome de usuário / senha do administrador estão corretos na página Sistema > Fluxos." - -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "Você não tem permissão para acessar esta funcionalidade." - -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "Você não tem permissão para acessar esta funcionalidade." - -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "Arquivo não existe no Airtime." - -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "Arquivo não existe no Airtime." - -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "Arquivo não existe no Airtime." - -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "Requisição inválida. Parâmetro não informado." - -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "Requisição inválida. Parâmetro informado é inválido." - -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 -#, php-format -msgid "%s not found" -msgstr "%s não encontrado" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "Ocorreu algo errado." - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "Visualizar" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "Adicionar à Lista" - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "Adicionar ao Bloco" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "Editar Metadados" - -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "Duplicar Lista" - -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "SoundCloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "Usuário adicionado com sucesso!" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "Nenhuma ação disponível" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "Usuário atualizado com sucesso!" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "Você não tem permissão para excluir os itens selecionados." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "Configurações atualizadas com sucesso!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "Não foi possível excluir alguns arquivos, por estarem com execução agendada." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "Página não encontrada" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "Cópia de %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Erro na aplicação" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1874,6 +1590,11 @@ msgstr "Você pode adicionar apenas faixas, blocos e fluxos às listas de reprod msgid "Please select a cursor position on timeline." msgstr "Por favor selecione um posição do cursor na linha do tempo." +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "Editar Metadados" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "Adicionar ao programa selecionado" @@ -1920,6 +1641,7 @@ msgstr "Carregando..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "Todos" @@ -1990,9 +1712,7 @@ msgstr "A entrada deve estar no formato hh:mm:ss.t" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "Você está fazendo upload de arquivos neste momento. %s Ir a outra tela cancelará o processo de upload. %sTem certeza de que deseja sair desta página?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2028,10 +1748,7 @@ msgid "Playlist shuffled" msgstr "A lista foi embaralhada" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "O Airtime não pôde determinar o status do arquivo. Isso pode acontecer quando o arquivo está armazenado em uma unidade remota atualmente inacessível ou está em um diretório que deixou de ser 'monitorado'." #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2057,24 +1774,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "A imagem precisa conter extensão jpg, jpeg, png ou gif" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "Um bloco estático salvará os critérios e gerará o conteúdo imediatamente. Isso permite que você edite e visualize-o na Biblioteca antes de adicioná-lo a um programa." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "Um bloco dinâmico apenas conterá critérios. O conteúdo do bloco será gerado após adicioná-lo a um programa. Você não será capaz de ver ou editar o conteúdo na Biblioteca." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "A duração desejada do bloco não será completada se o Airtime não localizar faixas únicas suficientes que correspondem aos critérios informados. Ative esta opção se você deseja permitir que as mesmas faixas sejam adicionadas várias vezes num bloco inteligente." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2105,7 +1813,14 @@ msgstr "Selecione o Diretório para Monitoramento" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "Tem certeza de que deseja alterar o diretório de armazenamento? \nIsto irá remover os arquivos de sua biblioteca Airtime!" +msgstr "" +"Tem certeza de que deseja alterar o diretório de armazenamento? \n" +"Isto irá remover os arquivos de sua biblioteca Airtime!" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "Gerenciar Diretórios de Mídia" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2117,9 +1832,7 @@ msgstr "O caminho está inacessível no momento." #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2130,22 +1843,12 @@ msgstr "Conectado ao servidor de fluxo" msgid "The stream is disabled" msgstr "O fluxo está desabilitado" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Obtendo informações do servidor..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "Não é possível conectar ao servidor de streaming" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "Se o Airtime estiver atrás de um roteador ou firewall, pode ser necessário configurar o redirecionamento de portas e esta informação de campo ficará incorreta. Neste caso, você terá de atualizar manualmente este campo para que ele exiba o corretamente o host / porta / ponto de montagem necessários para seu DJ para se conectar. O intervalo permitido é entre 1024 e 49151." #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2154,61 +1857,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "Para mais informações, leia o %sManual do Airtime%s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "Marque esta opção para habilitar metadados para fluxos OGG (metadados fluxo são o título da faixa, artista e nome doprograma que é exibido em um player de áudio). VLC e MPlayer tem um bug sério quando executam fluxos Ogg / Vorbis, que possuem o recurso de metadados habilitado: eles vão desconectar do fluxo depois de cada faixa. Se você estiver transmitindo um fluxo no formato OGG e seus ouvintes não precisem de suporte para esses players de áudio, sinta-se à vontade para ativar essa opção." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "Marque esta caixa para desligar automaticamente as fontes Mestre / Programa, após a desconexão de uma fonte." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "Marque esta caixa para ligar automaticamente as fontes Mestre / Programa, após a conexão de uma fonte." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "Se o servidor Icecast esperar por um usuário 'source', este campo poderá permanecer em branco." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "Se o cliente de fluxo ao vivo não solicitar um usuário, este campo deve ser \"source\"." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "Se você alterar os campos de usuário ou senha de um fluxo ativo, o mecanismo de saída será reiniciado e seus ouvintes ouvirão um silêncio por 5-10 segundos. Alterando os seguintes campos não causará reinicialização: Legenda do Fluxo (Configurações Globais), e Mudar Fade(s) de Transição, Usuário Master e Senha Master (Configurações de fluxo de entrada). Se o Airtime estiver gravando e, se a mudança fizer com que uma reinicialização de mecanismo de saída seja necessária, a gravação será interrompida." #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "Este é o usuário e senha de servidores Icecast / SHOUTcast, para obter estatísticas de ouvintes." #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2216,9 +1894,7 @@ msgid "No result found" msgstr "Nenhum resultado encontrado" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "Este segue o mesmo padrão de segurança para os programas: apenas usuários designados para o programa poderão se conectar." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2234,16 +1910,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2399,79 +2070,8 @@ msgstr "semana" msgid "month" msgstr "mês" -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "Domingo" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "Segunda" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "Terça" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "Quarta" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "Quinta" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "Sexta" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Sábado" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "Dom" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "Seg" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "Ter" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "Qua" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "Qui" - -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "Sex" - -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "Sab" - #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Um programa com tempo maior que a duração programada será cortado pelo programa seguinte." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2499,6 +2099,11 @@ msgstr "Remover todos os conteúdos?" msgid "Delete selected item(s)?" msgstr "Excluir item(ns) selecionado(s)?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "Início" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "Fim" @@ -2532,14 +2137,6 @@ msgstr "Movendo 1 item" msgid "Moving %s Items" msgstr "Movendo %s itens" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "Cancelar" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "" @@ -2549,8 +2146,7 @@ msgid "Cue Editor" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2581,6 +2177,13 @@ msgstr "Cancelar programa atual" msgid "Open library to add or remove content" msgstr "Abrir biblioteca para adicionar ou remover conteúdo" +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "Adicionar / Remover Conteúdo" + #: airtime_mvc/application/controllers/LocaleController.php:305 msgid "in use" msgstr "em uso" @@ -2597,26 +2200,6 @@ msgstr "Explorar" msgid "Open" msgstr "Abrir" -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "Administrador" - -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "DJ" - -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "Gerente de Programação" - -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "Visitante" - #: airtime_mvc/application/controllers/LocaleController.php:316 msgid "Guests can do the following:" msgstr "Visitantes podem fazer o seguinte:" @@ -2675,17 +2258,11 @@ msgstr "Gerenciar configurações" #: airtime_mvc/application/controllers/LocaleController.php:330 msgid "Manage users" -msgstr "Gerenciar usuários" - -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "Gerenciar diretórios monitorados" - -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "Enviar informações de suporte" +msgstr "Gerenciar usuários" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "Gerenciar diretórios monitorados" #: airtime_mvc/application/controllers/LocaleController.php:333 msgid "View system status" @@ -2751,6 +2328,12 @@ msgstr "Se" msgid "Sa" msgstr "Sa" +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Fechar" + #: airtime_mvc/application/controllers/LocaleController.php:355 msgid "Hour" msgstr "Hora" @@ -2772,6 +2355,14 @@ msgstr "Selecionar arquivos" msgid "Add files to the upload queue and click the start button." msgstr "Adicione arquivos para a fila de upload e pressione o botão iniciar " +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "Estado" + #: airtime_mvc/application/controllers/LocaleController.php:365 msgid "Add Files" msgstr "Adicionar Arquivos" @@ -2859,6 +2450,12 @@ msgstr "Erro: Arquivo muito grande:" msgid "Error: Invalid file extension: " msgstr "Erro: Extensão de arquivo inválida." +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:389 msgid "Create Entry" msgstr "" @@ -2874,28 +2471,179 @@ msgstr "%s linhas%s copiadas para a área de transferência" #: airtime_mvc/application/controllers/LocaleController.php:394 #, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." msgstr "%sVisualizar impressão%sUse a função de impressão do navegador para imprimir esta tabela. Pressione ESC quando terminar." -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "Por favor informe seu usuário e senha" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "Você não tem permissão para desconectar a fonte." -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "Usuário ou senha inválidos. Tente novamente." +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "Não há fonte conectada a esta entrada." -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "O email não pôde ser enviado. Verifique as definições do servidor de email e certifique-se de que esteja corretamente configurado." +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "Você não tem permissão para alternar entre as fontes." -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "O email informado não foi localizado." +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "Você está vendo uma versão obsoleta de %s" + +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "Você não pode adicionar faixas a um bloco dinâmico" + +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%s não encontrado" + +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "Você não tem permissão para excluir os %s(s) selecionados." + +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "Ocorreu algo errado." + +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "Você pode somente adicionar faixas um bloco inteligente." + +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "Lista Sem Título" + +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Bloco Sem Título" + +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "Lista Desconhecida" + +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "Você não tem permissão para acessar esta funcionalidade." + +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "Você não tem permissão para acessar esta funcionalidade." + +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "Arquivo não existe no Airtime." + +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "Arquivo não existe no Airtime." + +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "Arquivo não existe no Airtime." + +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "Requisição inválida. Parâmetro não informado." + +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "Requisição inválida. Parâmetro informado é inválido." + +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "Visualizar" + +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "Adicionar à Lista" + +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "Adicionar ao Bloco" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "Excluir" + +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "Duplicar Lista" + +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "Editar" + +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "Visualizar no SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "Re-enviar para SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Enviar para SoundCloud" + +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "Nenhuma ação disponível" + +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "Você não tem permissão para excluir os itens selecionados." + +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "Não foi possível excluir alguns arquivos, por estarem com execução agendada." + +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "Cópia de %s" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Selecione o cursor" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "Remover o cursor" + +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "programa inexistente" #: airtime_mvc/application/controllers/PreferenceController.php:74 msgid "Preferences updated." @@ -2922,988 +2670,1130 @@ msgstr "o caminho precisa ser informado" msgid "Problem with Liquidsoap..." msgstr "Problemas com o Liquidsoap..." -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Selecione o cursor" +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "Tocando agora" + +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "Adicionar Mídia" + +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Biblioteca" + +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "Calendário" + +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "Sistema" + +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "Preferências" + +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "Usuários" + +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Diretórios de Mídia" + +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Fluxos" + +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "Estatísticas de Ouvintes" + +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "" + +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "Histórico da Programação" + +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "" + +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "Ajuda" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "Remover o cursor" +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "Iniciando" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "programa inexistente" +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "Manual do Usuário" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Fluxo Sem Título" +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "Sobre" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Fluxo gravado." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "Serviço" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "Valores do formulário inválidos." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "Uptime" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "Você está vendo uma versão obsoleta de %s" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "CPU" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "Você não pode adicionar faixas a um bloco dinâmico" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "Memória" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "Você não tem permissão para excluir os %s(s) selecionados." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Versão do Airtime" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "Você pode somente adicionar faixas um bloco inteligente." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "Espaço em Disco" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "Lista Sem Título" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "Configurações de Email" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Bloco Sem Título" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "Configurações do SoundCloud" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "Lista Desconhecida" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Dias para reexibir:" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "Página não encontrada" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "Remover" -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Erro na aplicação" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "Adicionar" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "Usuário adicionado com sucesso!" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "URL de Conexão:" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "Usuário atualizado com sucesso!" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "Configurações do Fluxo de Entrada" -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "Configurações atualizadas com sucesso!" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "URL de Conexão da Fonte Master:" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "O ano % s deve estar compreendido no intervalo entre 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "Soprebor" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s não é uma data válida" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "OK" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s:%s:%s não é um horário válido" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "REDEFINIR" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "Programa Sem Título" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "URL de Conexão da Fonte do Programa:" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "Diretório de Importação:" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(Obrigatório)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "Diretórios Monitorados: " +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "Registrar Airtime" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "Não é um diretório válido" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Colabore com a evolução do Airtime, permitindo à Sourcefabric conhecer como você está usando o produto. Essas informações serão colhidas regularmente, a fim de melhorar a sua experiência como usuário.%s Clique na opção \"Enviar Comentário de Apoio\" e nós garantiremos a evolução contínua das funcionalidade que você utiliza." -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Usuário:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "Clique na oção abaixo para divulgar sua estação em %sSourcefabric.org%s." -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "Senha:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(somente para efeito de verificação, não será publicado)" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "Confirmar Senha:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Nota: qualquer arquivo maior que 600x600 será redimensionado" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "Primeiro nome:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Mostrar quais informações estou enviando" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "Último nome:" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "Termos e Condições" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "Email:" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "Redefinir senha" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Celular:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Selecione o diretório" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "Definir" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "Diretório de Importação Atual:" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "Perfil do Usuário:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "Verificar novamente diretório monitorado (Isso pode ser útil em caso de montagem de volume em rede e este estiver fora de sincronia com o Airtime)" -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "Usuário já existe." +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "Remover diretório monitorado" + +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "Você não está monitorando nenhum diretório." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "Desligar Auto Switch" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "Fluxo" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "Ligar Auto Switch" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "Opções Adicionais" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "Fade de Transição do Switch:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "A informação a seguir será exibida para os ouvintes em seu player de mídia:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "informe o tempo em segundo 00{.000000}" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(O website de sua estação de rádio)" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "Usuário Master" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "URL do Fluxo:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "Senha Master" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "Histórico de Filtros" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "URL de Conexão da Fonte Master" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "Encontrar Programas" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "URL de Conexão da Fonte Programa" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "Filtrar por Programa:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "Porta da Fonte Master" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "Configurações de %s" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "Somente números são permitidos." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Colabore com a evolução do Airtime, permitindo à Sourcefabric conhecer como você está usando o produto. Essas informações serão colhidas regularmente, a fim de melhorar a sua experiência como usuário.%s Clique na opção \"Enviar Comentário de Apoio\" e nós garantiremos a evolução contínua das funcionalidade que você utiliza." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "Ponto de Montagem da Fonte Master" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "Clique na oção abaixo para divulgar sua estação em %sSourcefabric.org%s." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Caracter inválido informado" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(para divulgação de sua estação, a opção 'Enviar Informações de Suporte\" precisa estar habilitada)" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Porta da Fonte Programa" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Política de Privacidade Sourcefabric" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "Ponto de Montagem da Fonte Programa" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "Você não pode utilizar a mesma porta do Master DJ." +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "Porta %s indisponível." +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Selecione os Dias:" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%value%' não corresponde ao formato 'HH:mm'" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Opções de Bloco" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "Data/Horário de Início:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "Data/Horário de Fim:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "Duração:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr "para" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "Fuso Horário:" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "arquivos correspondem ao critério" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "Reexibir?" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "arquivo corresponde ao critério" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "Não é possível criar um programa no passado." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "Não é possível alterar o início de um programa que está em execução" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "Não pode ter duração < 0m" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "Não pode ter duração 00h 00m" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "Não pode ter duração maior que 24 horas" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "Tipo de Reexibição:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "semanal" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "mensal" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "Novo" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "Nova Lista" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "Novo Bloco" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "Novo Fluxo Web" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "Ver / editar descrição" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "URL do Fluxo:" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "Duração Padrão:" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "Nenhum fluxo web" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "Configurações de Fluxo" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Configurações Globais" -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Selecione os Dias:" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "dB" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "Configurações do Fluxo de Saída" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "Importação de arquivo em progresso..." -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "Opções da Busca Avançada" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "Data de Fim:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "anterior" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "Sem fim?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "play" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "A data de fim deve ser posterior à data de início" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "pause" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "próximo" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "Valor é obrigatório e não poder estar em branco." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "stop" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "Senha" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "Mudo" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "Confirmar nova senha" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "retirar mudo" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "A senha de confirmação não confere." +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "volume máximo" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Obter nova senha" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "Atualização Necessária" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Nome da Estação" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "Para reproduzir a mídia que você terá que quer atualizar seu navegador para uma versão recente ou atualizar seu %sFlash plugin%s." -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Fone:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "Duração:" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "Website da Estação:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "Taxa de Amostragem:" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "País:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "Número Isrc:" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "Cidade:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "Caminho do Arquivo:" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "Descrição da Estação:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Fluxo Web" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Logo da Estação:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "Bloco Inteligente Dinâmico" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "Divulgue minha estação em Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "Bloco Inteligente Estático" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "Clicando nesta caixa, eu concordo com a %spolitica de privacidade%s da Sourcefabric." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Faixa de Ãudio" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "Você precisa concordar com a política de privacidade." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "Conteúdos da Lista de Reprodução:" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "%value%' não é um enderçeo de email válido" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "Conteúdo do Bloco Inteligente Estático:" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%' não corresponde a uma data válida '%format%'" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "Critério para Bloco Inteligente Dinâmico:" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%' is menor que comprimento mínimo %min% de caracteres" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "Limitar em" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%value%' is maior que o número máximo %max% de caracteres" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%' não está compreendido entre '%min%' e '%max%', inclusive" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "Senhas não conferem" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "Habilitado:" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "Número de ouvintes durante a exibição" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "Tipo de Fluxo:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Benvindo ao Airtime!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "Tipo de Serviço:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Saiba como utilizar o Airtime para automatizar suas transmissões:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "Canais:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "Comece adicionando seus arquivos à biblioteca usando o botão \"Adicionar Mídia\" . Você também pode arrastar e soltar os arquivos dentro da página." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "Crie um programa, através do 'Calendário' , clicando no ícone '+Programa'. Este pode ser um programa inédito ou retransmitido. Apenas administradores e gerentes de programação podem adicionar programas." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Stéreo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "Adicione conteúdos ao seu programa, através do link Calendário, clique com o botão esquerdo do mouse sobre o programa e selecione \"Adicionar / Remover Conteúdo\"" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Servidor" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Selecione seu conteúdo a partir da lista , no painel esquerdo, e arraste-o para o seu programa, no painel da direita." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "Porta" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "Você já está pronto para começar!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "URL" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "Para obter ajuda mais detalhada, leia o %smanual do usuário%s." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Ponto de Montagem" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "Compartilhar" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "Usuário Administrador" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Selecionar fluxo:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "Senha do Administrador" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sAirtime%s %s, um software livre para automação e gestão remota de estação de rádio. % s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "Servidor não pode estar em branco." +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%sSourcefabric%s o.p.s. Airtime é distribuído sob a licença %sGNU GPL v.3%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "Porta não pode estar em branco." +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "Nova senha" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "Ponto de montagem deve ser informada em servidor Icecast." +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "Por favor informe e confirme sua nova senha nos campos abaixo." -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "Hardware para Saída de Ãudio" +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "Digite seu endereço de email. Você receberá uma mensagem contendo um link para criar sua senha." -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "Tipo de Saída" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "Email enviado" -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Metadados Icecast Vorbis" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "Um email foi enviado" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "Legenda do Fluxo:" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "Voltar à tela de login" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "Artista - Título" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "Bem-vindo à demonstração online do Airtime! Autentique-se com usuário 'admin' e senha \"admin\"." -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Programa - Artista - Título" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "Anterior:" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Nome da Estação - Nome do Programa" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "Próximo:" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "Metadados Off Air" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "Fontes de Fluxo" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "Habilitar Ganho de Reprodução" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "Master" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "Modificador de Ganho de Reprodução" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "Programa" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "Procurar Usuários:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "Programação" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "NO AR" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "Gravar a partir do Line In?" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "Ouvir" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "Retransmitir?" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "Hora Local" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "Ativar Envio de Emails (Recuperação de Senha)" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "Seu período de teste termina em" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "Remetente de Email para Recuperação de Senha" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Adquira sua cópia do Airtime" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "Configurar Servidor de Email" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "Minha Conta" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "Requer Autenticação" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "Gerenciar Usuários" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "Servidor de Email" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "Novo Usuário" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "Endereço de Email" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "id" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "Digite os caracteres que você vê na imagem abaixo." +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "Primeiro Nome" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "O dia precisa ser especificado" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "Último Nome" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "O horário deve ser especificado" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "Tipo de Usuário" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "É preciso aguardar uma hora para retransmitir" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "Usar Autenticação do Airtime:" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "Usar Autenticação Personalizada:" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "Definir Usuário:" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Aplicativo Padrão Zend Framework" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "Definir Senha:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "Página não encontrada!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "O usuário não pode estar em branco." +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "A página que você procura não existe!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "A senha não pode estar em branco." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "Expandir Bloco Estático" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "Data de Início:" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "Expandir Bloco Dinâmico" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "Bloco vazio" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "informe o tempo em segundos 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "Lista vazia" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "Permitir que sites remotos acessem as informações sobre \"Programação\"?%s (Habilite para fazer com que widgets externos funcionem.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Embaralhar Lista" + +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Salvar Lista" + +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "Crossfade da Lista" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "Inativo" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "Fade de entrada" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "Ativo" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Fade de saída" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "Idioma Padrão da Interface" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "Nenhuma lista aberta" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "Semana Inicia Em" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(ss,t)" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "Nenhum bloco aberto" + +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "Email" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "Cue entrada:" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "Redefinir senha" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(hh:mm:ss.t)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "horas" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Cue Saída:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "minutos" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "Duração Original:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "Definir tipo de bloco:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "Adicionar este programa" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "Estático" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "Atualizar programa" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "Dinâmico" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "O que" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "Permitir Repetição de Faixas:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "Quando" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "Limitar em" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "Fluxo de entrada ao vivo" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "Gerar conteúdo da lista e salvar critério" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "Gravar & Retransmitir" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "Gerar" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Quem" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "Embaralhar conteúdo da lista" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Aparência" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "O limite não pode ser vazio ou menor que 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "Retransmissão de %s a partir de %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "O limite não pode ser maior que 24 horas" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Selecione o País" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "O valor deve ser um número inteiro" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "A duração precisa ser maior que 0 minuto" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "O número máximo de itens é 500" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "A duração deve ser informada no formato \"00h 00m\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "Você precisa selecionar Critério e Modificador " +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "A URL deve estar no formato \"http://domain\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "A duração deve ser informada no formato '00:00:00'" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "A URL de conter no máximo 512 caracteres" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "O valor deve estar no formato timestamp (ex. 0000-00-00 ou 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "Nenhum tipo MIME encontrado para o fluxo." -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "O valor deve ser numérico" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "O nome do fluxo não pode estar vazio" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "O valor precisa ser menor que 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "Não foi possível analisar a lista XSPF" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "O valor deve conter no máximo %s caracteres" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "Não foi possível analisar a lista PLS" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "O valor não pode estar em branco" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "Não foi possível analisar a lista M3U" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Programa:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "Fluxo web inválido. A URL parece tratar-se de download de arquivo." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "Meus Programas:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "Tipo de fluxo não reconhecido: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "Número ISRC:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s já está monitorado." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "Enviar programas gravados automaticamente" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s contém o diretório monitorado:% s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "Habilitar envio para SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s está contido dentro de diretório já monitorado: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "Permitir download dos arquivos no SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s não é um diretório válido." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "Email do SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s já está definido como armazenamento atual ou está na lista de diretórios monitorados" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "Senha do SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s já está definido como armazenamento atual ou está na lista de diretórios monitorados." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "Tags do SoundCloud: (separados por espaços)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s não existe na lista de diretórios monitorados." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "Gênero Padrão:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "Tipo de Faixa Padrão:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "A programação que você está vendo está desatualizada! (programação incompatível)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "Original" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "A programação que você está vendo está desatualizada! (instância incompatível)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "A programação que você está vendo está desatualizada!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "Ao Vivo" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "Você não tem permissão para agendar programa %s." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "Gravando" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "Você não pode adicionar arquivos para gravação de programas." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "Falado" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "O programa %s terminou e não pode ser agendado." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "O programa %s foi previamente atualizado!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "Trabalho am andamento" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "Um dos arquivos selecionados não existe!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "Base" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "Cue de entrada e saída são nulos." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "Loop" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "A duração do ponto de entrada não pode ser maior que a do ponto de saída." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Efeito de Ãudio" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "O ponto de saída não pode ser maior que a duração do arquivo" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "Amostra 'One Shot'" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "A duração do ponto de saída não pode ser menor que a do ponto de entrada." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Outro" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "O arquivo não foi transferido, há %s MB de espaço livre em disco e o arquivo que você está enviando tem um tamanho de %s MB." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "Licença Padrão:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "Os programas podem ter duração máxima de 24 horas." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "O trabalho é de domínio público" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"Não é possível agendar programas sobrepostos.\n" +"Nota: Redimensionar um programa repetitivo afeta todas as suas repetições." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "Todos os direitos são reservados" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Olá %s, \n" +"\n" +"Clique neste link para redefinir sua senha: " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Redefinição de Senha do Airtime" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "Creative Commons Attribution Noncommercial" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "Creative Commons Attribution No Derivative Works" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "Visualizar Metadados do Arquivo Gravado" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "Creative Commons Attribution Share Alike" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Exibir Conteúdo" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "Creative Commons Attribution Noncommercial Non Derivate Works" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "Remover Todo o Conteúdo" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "Creative Commons Attribution Noncommercial Share Alike" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "Cancelar Programa em Exibição" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "Cor de Fundo:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "Cor da Fonte:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "Editar Programa" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "Tocando agora" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "Excluir esta Instância" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "Adicionar Mídia" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "Excluir esta Instância e todas as seguintes" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Biblioteca" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "Calendário" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "Não é possível arrastar e soltar programas repetidos" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "Sistema" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "Não é possível mover um programa anterior" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "Usuários" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "Não é possível mover um programa anterior" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Diretórios de Mídia" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "Não é possível mover um programa gravado menos de 1 hora antes de suas retransmissões." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Fluxos" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "O programa foi excluído porque a gravação prévia não existe!" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "Estatísticas de Ouvintes" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "É necessário aguardar 1 hora antes de retransmitir." -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" msgstr "" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "Histórico da Programação" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "Executado" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "O ano % s deve estar compreendido no intervalo entre 1753 - 9999" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "Iniciando" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s não é uma data válida" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "Manual do Usuário" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s:%s:%s não é um horário válido" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3912,3 +3802,18 @@ msgstr "Por favor selecione uma opção" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "Não há gravações" + +#~ msgid "can't resize a past show" +#~ msgstr "Não é permitido redimensionar um programa anterior" + +#~ msgid "Should not overlap shows" +#~ msgstr "Os programas não devem ser sobrepostos" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "Falha ao criar diretório 'organize'" + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "Este arquivo parece estar corrompido e não será adicionado à biblioteca de mídia." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "O arquivo não foi transferido, esse erro pode ocorrer se o computador não tem espaço suficiente em disco ou o diretório stor não tem as permissões de gravação corretas." diff --git a/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po index 4ff0cd0351..3768748ed0 100644 --- a/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po @@ -1,7 +1,7 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # andrey.podshivalov, 2014 # Ðндрей Подшивалов, 2014 @@ -12,28 +12,16 @@ msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-02-04 17:30+0000\n" "Last-Translator: andrey.podshivalov\n" "Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/airtime/language/ru_RU/)\n" +"Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ru_RU\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "ÐвторÑкое право Airtime ©Sourcefabric o.p.s. Ð’Ñе права защищены. %sПоддерживаетÑÑ Ð¸ раÑпроÑтранÑетÑÑ Ð¿Ð¾Ð´ лицензией GNU GPL v.3 от %sSourcefabric o.p.s.%s" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "Потоковый режим" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -54,9 +42,9 @@ msgid "Stop" msgstr "Стоп" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "Ðачало звучаниÑ" @@ -65,9 +53,9 @@ msgid "Set Cue In" msgstr "УÑтановить начало звучаниÑ" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "Окончание звучаниÑ" @@ -89,1720 +77,1448 @@ msgstr "УÑиление" msgid "Fade Out" msgstr "Затухание" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "Заголовок" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "ÐвторÑкое право Airtime ©Sourcefabric o.p.s. Ð’Ñе права защищены. %sПоддерживаетÑÑ Ð¸ раÑпроÑтранÑетÑÑ Ð¿Ð¾Ð´ лицензией GNU GPL v.3 от %sSourcefabric o.p.s.%s" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "Создатель" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "Потоковый режим" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "Ðльбом" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "Ðктивировано:" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "Длина" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "Тип потока:" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "Жанр" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "Ð‘Ð¸Ñ‚Ð¾Ð²Ð°Ñ ÑкороÑÑ‚ÑŒ:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "ÐаÑтроение" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "Тип уÑлуги:" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "Ярлык " +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "Каналы:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "Композитор" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - Моно" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - Стерео" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "ÐвторÑкое право" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "Сервер" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "Год" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "Ðеверно введенный Ñимвол" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "Трек" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "Порт" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "ИÑполнитель" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "Разрешены только чиÑла." -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "Язык" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "Пароль" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñтарта" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "Жанр" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "URL" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "Проиграно" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "ИмÑ" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "ЗапиÑанный файл не найден" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "ОпиÑание" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "ПроÑмотр метаданных запиÑанного файла" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "Точка монтированиÑ" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "ВзглÑд на Soundcloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "Загрузить на SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "ÐдминиÑтратор" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "Повторно загрузить на SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "Пароль админиÑтратора" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "Показать Ñодержимое" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "Получение информации Ñ Ñервера ..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "Добавить / удалить Ñодержимое" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "Сервер не может быть пуÑтым" -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "Удалить вÑе Ñодержимое" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "Порт не может быть пуÑтым." -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "Отмена текущей программы" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "Монтирование не может быть пуÑтым Ñ Icecast Ñервер." -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "Редактировать" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "Заголовок:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "Редактировать" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "Создатель:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "Редактировать программу" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "Ðльбом:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "Удалить" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "Дорожка" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "Удалить Ñтот выпуÑк" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "Жанр:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "Удалить Ñтот выпуÑк и вÑе поÑледующие" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "Год:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "Ðет доÑтупа" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "Метка:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "Ðевозможно перетащить повторÑющиеÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "Композитор:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "Ðевозможно перемеÑтить прошлую программу" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "ИÑполнитель:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "Ðевозможно перемеÑтить программу в прошедший период" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "ÐаÑтроение:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "Ðевозможно поÑтавить в раÑпиÑание переÑекающиеÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "BPM:" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "Ðевозможно перемеÑтить запиÑанную программу менее, чем за 1 Ñ‡Ð°Ñ Ð´Ð¾ ее ретранÑлÑции." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "ÐвторÑкое право:" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "Программа была удалена, потому что запиÑÐ°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° не ÑущеÑтвует!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "ISRC номер:" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "До ретранÑлÑции необходимо ожидать 1 чаÑ." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "ВебÑайт:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "УÑтановки пользователÑ" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "Язык: " +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "Сохранить" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "Управление папками медиа-файлов" - -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "ÐаÑтройки потоковой передачи " +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "Отменить" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "Общие наÑтройки" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "Логин:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "дБ" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "Пароль:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "ÐаÑтройки выходного потока" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "Повторите пароль:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "Выбрать" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "ИмÑ" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "УÑтановка" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "ФамилиÑ" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° импорта:" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "Email:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "Добавить" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "Тел:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "Повторно Ñканировать проÑмотренную папку (Это полезно, еÑли Ñто ÑÐµÑ‚ÐµÐ²Ð°Ñ Ñборка, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не Ñинхронна Ñ Airtime)" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skype:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "Удалить проÑмотренную папку" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabber:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "Ð’Ñ‹ не проÑматриваете никакие папки медиа-файлов." +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "Тип пользователÑ:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Airtime " +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "ГоÑÑ‚ÑŒ" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "Помогите улучшить Airtime, раÑÑказав нам, как вы работаете Ñ Ð½Ð¸Ð¼. Мы будем Ñобирать Ñту информацию регулÑрно. %s Ðажмите кнопку \"Да, помочь Airtime\" и мы позаботимÑÑ Ð¾ том, чтобы те опции, которые вы иÑпользуете, поÑтоÑнно ÑовершенÑтвовалиÑÑŒ." +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "Диджей" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "Щелкните поле ниже, чтобы рекламировать Ñвою Ñтанцию на %s Sourcefabric.org %s . Ð’ целÑÑ… ÑодейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐµÐ¹ Ñтанции, Ð¾Ð¿Ñ†Ð¸Ñ 'Отправить отзыв о поддержке »должна быть включена. Эти данные будут ÑобиратьÑÑ Ð² дополнение к отзывам о поддержке." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "Менеджер программы" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(ОбÑзательно)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(Только Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸, не будет опубликовано)" +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "ÐдминиÑтратор" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "Примечание: вÑе, что превыÑит размеры 600x600, будет изменено." +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ ÑвлÑетÑÑ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼." -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "Покажите мне, что Ñ Ð¿Ð¾Ñылаю " +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "Цвет фона:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "ПоÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ уÑловиÑ" +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "Цвет текÑта:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "Ðайти программы" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "Дата начала:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "Фильтр по программе:" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "Дата окончаниÑ:" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "Сменить пароль" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "Программа:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "Параметры умного блока" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "Ð’Ñе мои программы:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "или" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "дней" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "и" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "День должен быть указан" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr " к " +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ быть указано" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "Файлы отвечают критериÑм" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "Должны ждать по крайней мере 1 Ñ‡Ð°Ñ Ð´Ð¾ ретранÑлÑции" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "файл отвечает критериÑм" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "Импорт папки:" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "URL подключеніÑ:" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "ПроÑматриваемые папки:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "Помогите улучшить Airtime, раÑÑказав нам, как вы работаете Ñ Ð½Ð¸Ð¼. Мы будем Ñобирать Ñту информацию регулÑрно. %sÐажмите \"ПоÑлать отзывы\" и мы позаботимÑÑ Ð¾ том, чтобы те опции, которые вы иÑпользуете, поÑтоÑнно ÑовершенÑтвовалиÑÑŒ." +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "Ðе ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимой папкой" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "Щелкните поле ниже, чтобы рекламировать вашу Ñтанцию на %s Sourcefabric.org %s ." +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "ПоиÑк пользователей:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(Ð’ целÑÑ… Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ¹ Ñтанции, Ð¾Ð¿Ñ†Ð¸Ñ 'Отправить отзывы о поддержке' должна быть включена)." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "Диджеи:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Политика конфиденциальноÑти Sourcefabric " +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "Войти" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "ÐаÑтройки входного потока" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "Введите Ñимволы, которые вы видите на картинке ниже." -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "URL Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Master:" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "Ðазвание Ñтанции" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "Заменить" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "Введите Ð²Ñ€ÐµÐ¼Ñ Ð² Ñекундах 0 {0,0}" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "ВОССТÐÐОВИТЬ" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "ВозраÑтание по умолчанию:" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "URL Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº программе:" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "Затухание по умолчанию:" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "Выберите дни:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "Разрешить удаленным вебÑайтам доÑтуп к \"РаÑпиÑание \" информациÑ? %s (Ðктивировать Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ виджетов интерфейÑа)." -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "Удалить" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "Отключено" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "Повторить дні:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "Ðктивировано" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "ÐаÑтройки Email / почтового Ñервера" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "Язык по умолчанию" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "ÐаÑтройки SoundCloud " +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" +msgstr "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð¾Ð½Ð° Ñтанции" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "%s's ÐаÑтройки" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "Ðачало недели" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" -msgstr "Выберите программу" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "ВоÑкреÑенье" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "Ðет Show" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "Понедельник" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "Ðайти" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "Вторник" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "Поток " +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "Среда" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "Дополнительные параметры" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "Четверг" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ отображатьÑÑ Ð´Ð»Ñ Ñлушателей в их медиа-плейере:" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(Веб-Ñайт вашей радиоÑтанции)" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "ПÑтница" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "URL потока: " +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "Суббота" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "Фильтровать иÑторию" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "СÑылка:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "Добро пожаловать в Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "Тип повтора:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "Вот как вы можете начать иÑпользовать Airtime Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ð·Ð°Ñ†Ð¸Ð¸ вещаниÑ: " +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "Еженедельно" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "Ðачните Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² в библиотеку Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки \"Добавить медиа-файлы\". Ð’Ñ‹ также можете перетащить файлы в Ñто окно." +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "каждые 2 недели" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "Создайте программу в разделе 'Календарь' и кликните \"+ Show '. Это может быть Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ Ð¸Ð»Ð¸ повторÑющаÑÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð°. Только админиÑтраторы и менеджеры могут добавить программу." +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "каждые 3 недели" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "Добавить медиа-файлы программы в Календаре, кликнув левой кнопкой и выбрав \"Добавить/Удалить контент\" в выпадающем меню" +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "каждые 4 недели" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "Выберите медиа-файлы на левой панели и перетащите их в вашу программу на правой панели." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "ежемеÑÑчно" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "Ð’Ñ‹ готовы!" +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "Выберите дни:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "Ð”Ð»Ñ Ð±Ð¾Ð»ÐµÐµ подробной Ñправки читать %sруководÑтво пользователÑ%s ." +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "Ð’Ñ" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "О программе" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "Пн" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sAirtime%s %s, открытое программное обеÑпечение Ð´Ð»Ñ Ñ€Ð°Ð´Ð¸Ð¾ Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ удаленного ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñтанцией.%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "Ð’Ñ‚" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%sSourcefabric%s o.p.s. Airtime раÑпроÑтранÑетÑÑ Ð² ÑоответÑтвии Ñ %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "Ср" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "ПоделитьÑÑ" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "Чт" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "Выбор потока:" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "Пт" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "отключить звук" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "Сб" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "включить звук" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "Войти" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "день меÑÑца" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "Добро пожаловать в онлайн демо-верÑию Airtime! Ð’Ñ‹ можете войти, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð»Ð¾Ð³Ð¸Ð½ \"admin\" и пароль \"admin\"." +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "день недели" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "ПожалуйÑта, введите email Ñвоей учетной запиÑи. Ð’Ñ‹ получите ÑÑылку, чтобы Ñоздать новый пароль." +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "Ðет окончаниÑ?" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "E-mail отправлен" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть поÑле даты начала" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "Сообщение было отправлено" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "ВернутьÑÑ Ð½Ð° Ñтраницу входа" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "Подтвердить новый пароль" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "Ðовый пароль" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "Подтверждение Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ðµ Ñовпадает Ñ Ð²Ð°ÑˆÐ¸Ð¼ паролем." -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "ПожалуйÑта, введите и подтвердите новый пароль ниже." +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "Получить новый пароль" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "Ð»Ð¸Ð·ÐµÐ½Ð·Ð¸Ñ Ð¸Ñтекает через" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "Выбрать критерии" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "дней" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "Ðльбом" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "Купить копию Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "Ð‘Ð¸Ñ‚Ð¾Ð²Ð°Ñ ÑкороÑÑ‚ÑŒ (Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "ÐœÐ¾Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "BPM" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "ПредыдущаÑ:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "Композитор" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "СледующаÑ:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "ИÑполнитель" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "ИÑходные потоки" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "ÐвторÑкое право" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "ИÑточник Master " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "Создатель" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "ИÑточник Show" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "Закодировано в" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "Из календарÑ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRC" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "Ð’ Ñфире" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "Ярлык " -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "Слушать" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "Язык" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñтанции" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "ПоÑледние изменениÑ" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "Закрыть" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "ПоÑледнее проигрывание" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "Добавить Ñту программу" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "Длина" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "Обновить программу" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "Mime" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "Что" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "ÐаÑтроение" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "Когда" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "Владелец" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "Потоковый ввод" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "Выравнивание громкоÑти" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "ЗапиÑÑŒ и РетранÑлÑциÑ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "ЧаÑтота диÑкретизации (кГц)" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "Кто" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "Заголовок" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "Стиль" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "Ðомер дорожки" -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "Ðачало" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "Загружено" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "УÑлуги" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "ВебÑайт" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "СтатуÑ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "Год" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "Выберите модификатор" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "ЦП" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "Ñодержит" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "ПамÑÑ‚ÑŒ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "не Ñодержит:" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "ВерÑÐ¸Ñ Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "ÑвлÑетÑÑ" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "ДиÑковое проÑтранÑтво" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "не ÑвлÑетÑÑ" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "Импорт файлов в процеÑÑе ..." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "начинаетÑÑ Ñ" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "Дополнительные параметры поиÑка" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "заканчиваетÑÑ" -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "Слушатель граф Ñ Ñ‚ÐµÑ‡ÐµÐ½Ð¸ÐµÐ¼ времени" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "больше, чем" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "Ðовый" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "меньше, чем" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "Ðовый плейлиÑÑ‚" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "находитÑÑ Ð² диапазоне" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "Ðовый умный блок" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "чаÑов" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "Ðовый веб-поток" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "минут" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "ПроÑмотр / редактирование опиÑаниÑ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "Ñлементы" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "ОпиÑание" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "УÑтановка типа умного блока:" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "URL потока:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "СтатичеÑкий" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "Длина по умолчанию:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "ДинамичеÑкий" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "Ðет веб-потока" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "Разрешить повтор треков:" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "ОчиÑтить плейлиÑÑ‚" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "Ограничить до" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "ОчиÑтить" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "Создать Ñодержание плейлиÑта и Ñохранить критерии" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "Перемешать плейлиÑÑ‚" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "Создать" + +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "Перемешать Ñодержание плейлиÑта" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 #: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 msgid "Shuffle" msgstr "Перемешать" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "Сохранить плейлиÑÑ‚" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "ПерекреÑтное затухание композиций плейлиÑта" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "УÑиление: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "Затухание: " - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "Ðет открытых плейлиÑтов" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "Показать трек" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(ÑÑ)" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "ОчиÑтить умный блок" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "Ðет открытых умных блоков" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "Ðачало звучаниÑ: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(чч: мм: ÑÑ)" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "Окончание звучаниÑ: " - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð°:" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "Развернуть ÑтатичеÑкий блок" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "Развернуть динамичеÑкий блок" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "ОчиÑтить умный блок" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "ОчиÑтить плейлиÑÑ‚" - -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Приложение по умолчанию Zend Framework " - -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "Страница не найдена!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "Похоже, что Ñтраница, которую вы ищете, не ÑущеÑтвует!" - -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "Справка" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "предыдущаÑ" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "играть" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "пауза" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "ÑледующаÑ" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "Ñтоп" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾ÑÑ‚ÑŒ" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "ТребуетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð¸Ð³Ñ€Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÐ´Ð¸Ð°-файла необходимо либо обновить браузер до поÑледней верÑии или обновить %sфлÑш-плагина%s." - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "Создание шаблона по файлам" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "Создание шаблона лога" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "ИмÑ" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "Добавить еще Ñлементы" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "Добавить поле" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "УÑтановить шаблон по умолчанию" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "Шаблоны лога" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "Ðет шаблона лога" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "УÑтановить по умолчанию" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "Ограничение не может быть пуÑтым или менее 0" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "Ограничение не может быть более 24 чаÑов" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "Значение должно быть целым чиÑлом" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "500 ÑвлÑетÑÑ Ð¼Ð°ÐºÑимально допуÑтимым значением Ñлемента" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "Управление пользователÑми" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "Ð’Ñ‹ должны выбрать критерии и модификаторы" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "Ðовый пользователь" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "\"Длина\" должна быть в формате '00:00:00'" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "id" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "Значение должно быть в формате временной метки (например, 0000-00-00 или 0000-00-00 00:00:00)" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "Значение должно быть чиÑлом" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "ИмÑ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "Значение должно быть меньше, чем 2147483648" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "ФамилиÑ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "Значение должно быть меньше, чем %s Ñимволов" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "Тип пользователÑ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "Значение не может быть пуÑтым" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "Заголовок:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "ÐвтоматичеÑкое выключение" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "Создатель:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "ÐвтоматичеÑкое включение" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "Ðльбом:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "Переключение переходов Ð·Ð°Ñ‚ÑƒÑ…Ð°Ð½Ð¸Ñ (s)" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "Дорожка" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "Введите Ð²Ñ€ÐµÐ¼Ñ Ð² Ñекундах, 00{0,000000}" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "Длина:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Master " -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "ЧаÑтота диÑкретизации:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "Пароль Master" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "Ð‘Ð¸Ñ‚Ð¾Ð²Ð°Ñ ÑкороÑÑ‚ÑŒ:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "URL Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº иÑточнику Master" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "ÐаÑтроение:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "URL Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº иÑточнику Show" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "Жанр:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "Порт иÑточника Master " -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "Год:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "Точка Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ñточника Master" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "Метка:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "Порт иÑточника Show" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "Точка Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ñточника Show" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "Композитор:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "Ð’Ñ‹ не можете иÑпользовать порт, иÑпользуемый Master DJ." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "ИÑполнитель:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "Порт %s не доÑтупен." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "ÐвторÑкое право:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "Телефон:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "ISRC номер:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "ВебÑайт Ñтанции:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "ВебÑайт:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "Страна:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "Язык: " +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "Город" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "ОпиÑание Ñтанции:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "ИмÑ:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "Логотип Ñтанции:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "ОпиÑание:" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "Отправить отзыв о поддержке" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "Веб-поток" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "Поддержать мою Ñтанцию на Sourcefabric.org" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "ДинамичеÑкий умный блок" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "УÑтановив Ñтот флажок, Ñ ÑоглашаюÑÑŒ Ñ %sполитикой конфиденциальноÑти%s Sourcefabric." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "СтатичеÑкий умный блок" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "Ð’Ñ‹ должны ÑоглаÑитьÑÑ Ñ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ¾Ð¹ конфиденциальноÑти." -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "Ðудио-дорожка" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "Значение ÑвлÑетÑÑ Ð¾Ð±Ñзательным и не может быть пуÑтым" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "Содержание плейлиÑта: " +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñтарта" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "Содержание ÑтатичеÑкого умного блока: " +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ" + +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "Ðет Show" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "Критерии динамичеÑкого умного блока: " +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "ЗапиÑÑŒ Ñ Ð»Ð¸Ð½ÐµÐ¹Ð½Ð¾Ð³Ð¾ входа?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "Ограничение до " +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "РетранÑлÑциÑ?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "URL:" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "ИÑпользование идентификации Airtime:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "ИÑпользование пользовательÑкой идентификации:" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "ПользовательÑкие Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "Данные по прграмме" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "ПользовательÑкий пароль" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ программы 24 чаÑа." +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ может быть пуÑтым." -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "Дата/Ð²Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð½Ðµ могут быть прошедшими" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "Пароль не может быть пуÑтым." -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ переÑекающиеÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹.\nПримечание: изменение размера повторÑющейÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ влиÑет на вÑе ее повторы." +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "E-mail" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "невозможно изменить размеры программы прошлого периода" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "ВоÑÑтановить пароль" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÑекать программы" +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "СредÑтва аудиовыхода" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "Выберите Ñтрану" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "Тип выхода" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s уже проÑматривают." +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Метаданные Icecast Vorbis " -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s Ñодержит вложенную проÑматриваемую папку: %s" +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "Метка потока:" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s вложено в ÑущеÑтвующую проÑматриваемую папку: %s" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "ИÑполнитель - Ðазвание" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимой папкой." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "Программа - ИÑполнитель - Ðазвание" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s уже уÑтановлена в качеÑтве текущей папки Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ в ÑпиÑке проÑматриваемых папок" +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "Ðазвание Ñтанции - Ðазвание программы" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s уже уÑтановлен в качеÑтве текущей папки Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ в ÑпиÑке проÑматриваемых папок." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "Отключить мета-данные" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "%s не ÑущеÑтвует в проÑматриваемом ÑпиÑке" +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "Ñлементы" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° и Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð·Ð²ÑƒÑ‡Ð°Ð½Ð¸Ñ Ñ‚Ñ€ÐµÐºÐ° не заполнены." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'% значение%' не ÑвлÑетÑÑ Ð´ÐµÐ¹Ñтвительным адреÑом Ñлектронной почты в формате local-part@hostname" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð·Ð²ÑƒÑ‡Ð°Ð½Ð¸Ñ Ð½Ðµ может превышать длину трека." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%значение%' не ÑоответÑтвует формату даты '%формат%'" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° Ð·Ð²ÑƒÑ‡Ð°Ð½Ð¸Ñ Ð½Ðµ может быть больше времени окончаниÑ. " +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%значение%' имеет менее %min% Ñимволов" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð·Ð²ÑƒÑ‡Ð°Ð½Ð¸Ñ Ð½Ðµ может быть меньше времени начала." +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%значение%' имеет более %max% Ñимволов" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "Выбрать критерии" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%значение%' не входит в промежуток '%min%' и '%maxÑ% включительно" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "Ð‘Ð¸Ñ‚Ð¾Ð²Ð°Ñ ÑкороÑÑ‚ÑŒ (Kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "Пароли не Ñовпадают" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "BPM" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%значение%' не ÑоответÑтвует формату времени 'ЧЧ:мм'" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "Закодировано в" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "Дата /Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°:" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "ПоÑледние изменениÑ" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "Дата / Ð²Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ:" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "ПоÑледнее проигрывание" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "ДлительноÑÑ‚ÑŒ:" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "Mime" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð¾Ð½Ð°:" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "Владелец" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "Повторы?" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "Выравнивание громкоÑти" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "Ðевозможно Ñоздать программу в прошедшем периоде" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "ЧаÑтота диÑкретизации (кГц)" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "Ðевозможно изменить дату/Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° программы, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑƒÐ¶Ðµ началаÑÑŒ" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "Ðомер дорожки" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "Дата/Ð²Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð½Ðµ могут быть прошедшими" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "Загружено" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "Ðе может иметь длительноÑÑ‚ÑŒ <0м" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "ВебÑайт" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "Ðе может иметь длительноÑÑ‚ÑŒ 00ч 00м" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "Выберите модификатор" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "Ðе может иметь длительноÑÑ‚ÑŒ более 24 чаÑов" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "Ñодержит" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "Ðевозможно поÑтавить в раÑпиÑание переÑекающиеÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "не Ñодержит:" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "ИмÑ:" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "ÑвлÑетÑÑ" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "Программа без названиÑ" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "не ÑвлÑетÑÑ" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "URL:" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "начинаетÑÑ Ñ" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "ОпиÑание:" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "заканчиваетÑÑ" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "ÐвтоматичеÑки загружать запиÑанные программы" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "больше, чем" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "Включить загрузку SoundCloud" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "меньше, чем" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "ÐвтоматичеÑки отмечать файлы \"Загружаемые\" на SoundCloud" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "находитÑÑ Ð² диапазоне" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "SoundCloud e-mail" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "Длина должна быть более 0 минут" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "SoundCloud пароль" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "Длину указать в формате \"00ч 00мин \"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "SoundCloud теги: (отдельные метки Ñ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð°Ð¼Ð¸)" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "URL указать в формате \"http://домен\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "Жанр по умолчанию:" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "URL должен быть 512 Ñимволов или менее" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "Тип трека по умолчанию:" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "Ð”Ð»Ñ Ð²ÐµÐ±-потока не найдено MIME type" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "Оригинал" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "Ðазвание вебпотока должно быть заполнено" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "РемикÑ" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "Ðе удалоÑÑŒ анализировать XSPF плейлиÑÑ‚" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "ПрÑмой Ñфир" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "Ðе удалоÑÑŒ анализировать PLS плейлиÑÑ‚" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "ЗапиÑÑŒ" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "Ðе удалоÑÑŒ анализировать M3U плейлиÑÑ‚" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "Разговорный" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "Ðеверный вебпоток - Ñто загрузка файла." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "ПодкаÑÑ‚" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "ÐеизвеÑтный тип потока: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "Демо" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "Привет %s, \n\n Ðажмите ÑÑылку Ð´Ð»Ñ ÑброÑа паролÑ: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "ÐÐµÐ·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ð°Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Airtime" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "ОÑнова" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "РетранÑлÑÑ†Ð¸Ñ %s из %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "Цикл" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "Звуковой Ñффект" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "РаÑпиÑание, которое вы проÑматриваете, уÑтарело! (неÑоответÑтвие раÑпиÑаниÑ)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "Единичный ÑÑмпл" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "РаÑпиÑание, которое вы проÑматриваете, уÑтарело! (неÑоответÑтвие выпуÑков)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "Другое" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "РаÑпиÑание, которое вы проÑматриваете, уÑтарело!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð¿Ð¾ умолчанию:" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ %s ." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "Работа находитÑÑ Ð² публичном домене" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "Ð’Ñ‹ не можете добавлÑÑ‚ÑŒ файлы в запиÑываемую программу" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "Ð’Ñе права защищены" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "Программа %s окончилаÑÑŒ и не может быть поÑтавлена в раÑпиÑание." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Creative Commons Attribution" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "Программа %s была обновлена ранее!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "ÐекоммерчеÑÐºÐ°Ñ Creative Commons Attribution" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "Creative Commons Attribution без производных продуктов" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "Выбранный файл не ÑущеÑтвует!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "Creative Commons Attribution в равных долÑÑ…" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "Ðе удалоÑÑŒ Ñоздать папку organize." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "Creative Commons Attribution Non ÐекоммерчеÑкое производных работ" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "Файл не был загружен, размер Ñвободного диÑкового проÑтранÑтва %s МБ, а размер загружаемого файла %s МБ." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "Creative Commons Attribution некоммерчеÑÐºÐ°Ñ Ð² равных долÑÑ…" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "Этот файл по-видимому поврежден и не будет добавлен к медиа-библиотеке." +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð¾Ð½Ð° (броузер)" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "Загрузка не удалаÑÑŒ. Эта ошибка возможна, еÑли на жеÑтком диÑке компьютера не хватает меÑта или папка не имеет необходимых разрешений запиÑи." +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "Включение ÑиÑтемы Ñлектронной почты (Ñмена паролÑ)" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¾Ñ‚Ñоединить иÑточник." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ 'От' E-mail" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "Ðет иÑточника, подключенного к Ñтому входу." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "ÐаÑтройка почтового Ñервера" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ñточника." +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "ТребуетÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° подлинноÑти" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" -msgstr "РетранÑлÑÑ†Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ %s от %s в %s" +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "Почтовый Ñервер" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" -msgstr "Загрузить" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты" #: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "Ð’Ñ‹ не имеете доÑтупа к Ñтому реÑурÑу." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "Веб-поток без названиÑ" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "Ð’Ñ‹ не имеете доÑтупа к Ñтому реÑурÑу." +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "Веб-поток Ñохранен." -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "Файл не ÑущеÑтвует в Airtime." +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "ÐедопуÑтимые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ñ‹." -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "Файл не ÑущеÑтвует в Airtime" +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "ПожалуйÑта, введите ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "Файл не ÑущеÑтвует в Airtime." +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ пароль. ПожалуйÑта, попробуйте еще раз." -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "Ðеверный запроÑ. параметр 'режим' не прошел." +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "E-mail не может быть отправлен. Проверьте наÑтройки почтового Ñервера и убедитеÑÑŒ, что он был наÑтроен должным образом." -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "Ðеверный запроÑ. параметр 'режим' ÑвлÑетÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимым" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "Данный email не найден." -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format -msgid "%s not found" -msgstr "%s не найден" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "Что-то пошло не так." - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "Предварительный проÑмотр" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "Добавить в плейлиÑÑ‚" - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "Добавить в умный блок" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "Редактировать метаданные" +msgid "Rebroadcast of show %s from %s at %s" +msgstr "РетранÑлÑÑ†Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ %s от %s в %s" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "Дублировать плейлиÑÑ‚" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" +msgstr "Загрузить" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "Пользователь уÑпешно добавлен!" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "Ðет доÑтупных дейÑтвий" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "Пользователь уÑпешно обновлен!" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° удаление выбранных Ñлементов." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² наÑтройках Ñохранены!" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "Ðе удаетÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ некоторые запланированные файлы." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "Страница не найдена" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "ÐšÐ¾Ð¿Ð¸Ñ %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "Ошибка приложениÑ" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1878,6 +1594,11 @@ msgstr "Ð’Ñ‹ можете добавить только треки, умные msgid "Please select a cursor position on timeline." msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "Редактировать метаданные" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "Добавить в избранную программу" @@ -1924,6 +1645,7 @@ msgstr "Загрузка..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "Ð’Ñе" @@ -1994,9 +1716,7 @@ msgstr "Вход должен быть в формате: чч: мм: ÑÑ" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "Ð’Ñ‹ загружаете файлы. %sПереход на другой Ñкран отменит процеÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸. %sÐ’Ñ‹ уверены, что хотите покинуть Ñтраницу?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2032,10 +1752,7 @@ msgid "Playlist shuffled" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "Airtime не уверен в ÑтатуÑе Ñтого файла. Это возможно, еÑли файл находитÑÑ Ð½Ð° удаленном недоÑтупном диÑке или в папке, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±Ð¾Ð»ÐµÐµ не \"проÑматриваетÑÑ\"." #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2061,24 +1778,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "Изображение должно быть в любом из Ñледующих форматов: jpg, jpeg, png или gif" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "СтатичеÑкий умный блок Ñохранит критерии и немедленно ÑоздаÑÑ‚ контент блока. Это позволÑет редактировать и проÑматривать его в библиотеке, прежде чем добавить его в программу." #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "ДинамичеÑкий умный блок Ñохранит только критерии. Ð¡Ð¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ° будете Ñгенерировано поÑле Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ в программу. Ð’Ñ‹ не Ñможете проÑматривать и редактировать Ñодержимое в библиотеке." #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "Ð–ÐµÐ»Ð°ÐµÐ¼Ð°Ñ Ð´Ð»Ð¸Ð½Ð° блока не будет доÑтигнута, еÑли Airtime не найдет уникальных треков, ÑоответÑтвующих вашим критериÑм. Ðктивируйте Ñту опцию, еÑли хотите неоднократного Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ñ€ÐµÐºÐ¾Ð² в умный блок." #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2109,7 +1817,14 @@ msgstr "Выберите папку Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "Ð’Ñ‹ уверены, что хотите изменить папку хранениÑ? \n Файлы из вашей библиотеки будут удалены!" +msgstr "" +"Ð’Ñ‹ уверены, что хотите изменить папку хранениÑ? \n" +" Файлы из вашей библиотеки будут удалены!" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "Управление папками медиа-файлов" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2121,9 +1836,7 @@ msgstr "Этот путь в наÑтоÑщий момент недоÑтупе #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2134,22 +1847,12 @@ msgstr "Подключено к потоковому Ñерверу" msgid "The stream is disabled" msgstr "Поток отключен" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "Получение информации Ñ Ñервера ..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº потоковому Ñерверу" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "ЕÑли Airtime находитÑÑ Ð·Ð° маршрутизатором или брандмауÑром, вам может потребоватьÑÑ Ð½Ð°Ñтроить переадреÑацию портов, и Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð² Ñтом поле будет неверной. Ð’ Ñтом Ñлучае вам нужно будет вручную обновлÑÑ‚ÑŒ Ñто поле так, чтобы оно показывало верный хоÑÑ‚ / порт / Ñборку, к которым должен подключитьÑÑ Ð²Ð°Ñˆ диджей. ДопуÑтимый диапазон: от 1024 до 49151." #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2158,61 +1861,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "Ð”Ð»Ñ Ð±Ð¾Ð»ÐµÐµ подробной информации, пожалуйÑта, прочитайте %sРуководÑтво Airtime %s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "Отметьте Ñту опцию Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ метаданных OGG потока (метаданные потока Ñто название композиции, Ð¸Ð¼Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»Ñ Ð¸ название шоу, которое отображаетÑÑ Ð² аудио-плейере). Ð’ VLC и mplayer наблюдаетÑÑ ÑÐµÑ€ÑŒÐµÐ·Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° при воÑпроизведении потоков OGG/VORBIS, в которых метаданные включены: они будут отключатьÑÑ Ð¾Ñ‚ потока поÑле каждой пеÑни. ЕÑли вы иÑпользуете поток OGG и ваши Ñлушатели не требуют поддержки Ñтих аудиоплееров, то не ÑтеÑнÑйтеÑÑŒ включить Ñту опцию." #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "Выберите Ñту опцию Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ñточника Master / Show поÑле Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ñточника." #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "Выберите Ñту опцию Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ñточника Master / Show поÑле ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð¸Ñточником." #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "ЕÑли ваш Ñервер Icecast ожидает Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"иÑточника\", Ñто поле можно оÑтавить пуÑтым." #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "ЕÑли ваш клиент потокового режима не запроÑит Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, то Ñто поле должно быть 'иÑточником'." #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "ЕÑли вы измените Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ пароль Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ потока, механизм воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ перезагружен, а в Ñфире в течение 5-10 Ñекунд будет звучать тишина. Изменение Ñледующих полей ÐЕ вызовет перезагрузки: Метка потока (Общие наÑтройки), Переключение переходов затуханиÑ, ПользовательÑкое Ð¸Ð¼Ñ Master, Пароль Master (ÐаÑтройки входÑщих потоков). ЕÑли Airtime ведет запиÑÑŒ, и еÑли Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð·Ð¾Ð²ÑƒÑ‚ перезапуÑк механизма воÑпроизведениÑ, запиÑÑŒ будет оÑтановлена." #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2220,9 +1898,7 @@ msgid "No result found" msgstr "Результатов не найдено" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "ДейÑтвует та же Ñхема безопаÑноÑти программы: только пользователи, назначенные Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹, могут подключитьÑÑ." #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2238,16 +1914,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2384,98 +2055,27 @@ msgid "Nov" msgstr "ноÑб" #: airtime_mvc/application/controllers/LocaleController.php:235 -msgid "Dec" -msgstr "дек" - -#: airtime_mvc/application/controllers/LocaleController.php:236 -msgid "today" -msgstr "ÑегоднÑ" - -#: airtime_mvc/application/controllers/LocaleController.php:237 -msgid "day" -msgstr "день" - -#: airtime_mvc/application/controllers/LocaleController.php:238 -msgid "week" -msgstr "неделÑ" - -#: airtime_mvc/application/controllers/LocaleController.php:239 -msgid "month" -msgstr "меÑÑц" - -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "ВоÑкреÑенье" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "Понедельник" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "Вторник" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "Среда" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "Четверг" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "ПÑтница" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "Суббота" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "Ð’Ñ" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "Пн" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "Ð’Ñ‚" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "Ср" +msgid "Dec" +msgstr "дек" -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "Чт" +#: airtime_mvc/application/controllers/LocaleController.php:236 +msgid "today" +msgstr "ÑегоднÑ" -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "Пт" +#: airtime_mvc/application/controllers/LocaleController.php:237 +msgid "day" +msgstr "день" -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "Сб" +#: airtime_mvc/application/controllers/LocaleController.php:238 +msgid "week" +msgstr "неделÑ" + +#: airtime_mvc/application/controllers/LocaleController.php:239 +msgid "month" +msgstr "меÑÑц" #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "Программы, превышающие времÑ, запланированное в раÑпиÑании, будут обрезаны Ñледующей программой." #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2503,6 +2103,11 @@ msgstr "Удалить вÑе Ñодержание?" msgid "Delete selected item(s)?" msgstr "Удалить выбранный Ñлемент(Ñ‹)?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "Ðачало" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "Конец" @@ -2536,14 +2141,6 @@ msgstr "Перемещение 1 Ñлемента" msgid "Moving %s Items" msgstr "Перемещение %s Ñлементов" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "Отменить" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "Редактор затуханиÑ" @@ -2553,8 +2150,7 @@ msgid "Cue Editor" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2585,1329 +2181,1623 @@ msgstr "Отмена текущей программы" msgid "Open library to add or remove content" msgstr "Открыть библиотеку, чтобы добавить или удалить Ñодержимое" -#: airtime_mvc/application/controllers/LocaleController.php:305 -msgid "in use" -msgstr "иÑпользуетÑÑ" +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "Добавить / удалить Ñодержимое" + +#: airtime_mvc/application/controllers/LocaleController.php:305 +msgid "in use" +msgstr "иÑпользуетÑÑ" + +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "ДиÑк" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "ЗаглÑнуть" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "Открыть" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "Показать календарь" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "Показать программу" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "Импорт медиа-файлов" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "Редактировать программу" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "Планировать программу" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "ÐдминиÑтраторы могут:" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "ÐаÑтроить предпочтениÑ" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "СиÑтемный ÑтатуÑ" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "ДоÑтуп к иÑтории плейлиÑта" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "СтатиÑтика Ñлушателей" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "Показать / Ñкрыть Ñтолбцы" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "С {Ñ} до {до}" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "кбит" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "гггг-мм-дд" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" +msgstr "чч: мм: ÑÑ" + +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" +msgstr "кГц" + +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" +msgstr "Ð’Ñ" + +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" +msgstr "Пн" + +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" +msgstr "Ð’Ñ‚" + +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" +msgstr "Ср" + +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" +msgstr "Чт" + +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" +msgstr "Пт" + +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" +msgstr "Сб" + +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "Закрыть" + +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" +msgstr "ЧаÑов" + +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" +msgstr "Минут" + +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" +msgstr "Сделано" + +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" +msgstr "Выбрать файлы" + +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "СтатуÑ" + +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" +msgstr "Добавить файлы" + +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" +msgstr "ОÑтановить загрузку" + +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" +msgstr "Ðачать загрузку" + +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" +msgstr "Добавить файлы" + +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" +msgstr "Загружено файлов: %d/%d " + +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" +msgstr "н/о" + +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." +msgstr "Перетащите Ñюда файлы." + +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." +msgstr "Ðеверное раÑширение файла." -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" -msgstr "ДиÑк" +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." +msgstr "Ðевереный размер файла." -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" -msgstr "ЗаглÑнуть" +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." +msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" -msgstr "Открыть" +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." +msgstr "Ошибка инициализации." -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "ÐдминиÑтратор" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." +msgstr "Ошибка HTTP." -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "Диджей" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." +msgstr "Ошибка безопаÑноÑти." -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "Менеджер программы" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." +msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°." -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "ГоÑÑ‚ÑŒ" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." +msgstr "Ошибка запиÑи/чтениÑ." -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" -msgstr "Показать календарь" - -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" -msgstr "Показать программу" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" +msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" -msgstr "Импорт медиа-файлов" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " +msgstr "Ошибка: Файл Ñлишком большой:" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "УÑтановить по умолчанию" + +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" +msgstr "Создать" + +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" +msgstr "Редактировать иÑторию" + +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" -msgstr "Редактировать программу" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¾Ñ‚Ñоединить иÑточник." -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" -msgstr "Планировать программу" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "Ðет иÑточника, подключенного к Ñтому входу." -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" -msgstr "" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ñточника." -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" -msgstr "ÐдминиÑтраторы могут:" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "Ð’Ñ‹ проÑматриваете Ñтарые верÑии %s" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" -msgstr "ÐаÑтроить предпочтениÑ" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "Ð’Ñ‹ не можете добавить треки в динамичеÑкие блоки." -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" -msgstr "" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%s не найден" -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° удаление выбранных %s(s)." -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "Отправить отзыв о поддержке" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "Что-то пошло не так." -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" -msgstr "СиÑтемный ÑтатуÑ" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "Ð’Ñ‹ можете добавить треки только в умный блок." -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" -msgstr "ДоÑтуп к иÑтории плейлиÑта" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "ПлейлиÑÑ‚ без названиÑ" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" -msgstr "СтатиÑтика Ñлушателей" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "Умный блок без названиÑ" -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" -msgstr "Показать / Ñкрыть Ñтолбцы" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "ÐеизвеÑтный плейлиÑÑ‚" -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" -msgstr "С {Ñ} до {до}" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "Ð’Ñ‹ не имеете доÑтупа к Ñтому реÑурÑу." -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" -msgstr "кбит" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "Ð’Ñ‹ не имеете доÑтупа к Ñтому реÑурÑу." -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" -msgstr "гггг-мм-дд" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "Файл не ÑущеÑтвует в Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" -msgstr "чч: мм: ÑÑ" +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "Файл не ÑущеÑтвует в Airtime" -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" -msgstr "кГц" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "Файл не ÑущеÑтвует в Airtime." -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" -msgstr "Ð’Ñ" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "Ðеверный запроÑ. параметр 'режим' не прошел." -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" -msgstr "Пн" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "Ðеверный запроÑ. параметр 'режим' ÑвлÑетÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимым" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" -msgstr "Ð’Ñ‚" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "Предварительный проÑмотр" + +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "Добавить в плейлиÑÑ‚" + +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "Добавить в умный блок" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "Удалить" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" -msgstr "Ср" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "Дублировать плейлиÑÑ‚" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" -msgstr "Чт" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "Редактировать" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" -msgstr "Пт" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "Soundcloud" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" -msgstr "Сб" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "ВзглÑд на Soundcloud" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" -msgstr "ЧаÑов" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "Повторно загрузить на SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" -msgstr "Минут" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "Загрузить на SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" -msgstr "Сделано" +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "Ðет доÑтупных дейÑтвий" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" -msgstr "Выбрать файлы" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° удаление выбранных Ñлементов." -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." -msgstr "" +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "Ðе удаетÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ некоторые запланированные файлы." -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" -msgstr "Добавить файлы" +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "ÐšÐ¾Ð¿Ð¸Ñ %s" -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" -msgstr "ОÑтановить загрузку" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "Выбрать курÑор" -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" -msgstr "Ðачать загрузку" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "Удалить курÑор" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" -msgstr "Добавить файлы" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "Программа не ÑущеÑтвует" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" -msgstr "Загружено файлов: %d/%d " +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." +msgstr "УÑтановки Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ñ‹." -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" -msgstr "н/о" +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." +msgstr "ÐаÑтройка поддержки обновлена." -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." -msgstr "Перетащите Ñюда файлы." +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" +msgstr "Отзывы о поддержке" -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." -msgstr "Ðеверное раÑширение файла." +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." +msgstr "ÐаÑтройки потока обновлены." -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." -msgstr "Ðевереный размер файла." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" +msgstr "Путь должен быть указан" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." -msgstr "" +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." +msgstr "Проблема Ñ Liquidsoap ..." -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." -msgstr "Ошибка инициализации." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð² Ñфире" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." -msgstr "Ошибка HTTP." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "Добавить медиа-файлы" -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." -msgstr "Ошибка безопаÑноÑти." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "Библиотека" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." -msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°." +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "Календарь" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." -msgstr "Ошибка запиÑи/чтениÑ." +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "СиÑтема" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" -msgstr "" +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "УÑтановки пользователÑ" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" -msgstr "" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "Пользователи" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" -msgstr "" +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "Папки медиа-файлов" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" -msgstr "" +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "Потоки" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " -msgstr "Ошибка: Файл Ñлишком большой:" +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "СтатиÑтика Ñлушателей" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " -msgstr "" +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "ИÑториÑ" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" -msgstr "Создать" +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð²Ð¾ÑпроизведениÑ" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" -msgstr "Редактировать иÑторию" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "Шаблоны иÑтории" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" -msgstr "" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "Справка" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." -msgstr "" +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "С чего начать" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "ПожалуйÑта, введите ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль" +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "РуководÑтво пользователÑ" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ пароль. ПожалуйÑта, попробуйте еще раз." +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "О программе" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "E-mail не может быть отправлен. Проверьте наÑтройки почтового Ñервера и убедитеÑÑŒ, что он был наÑтроен должным образом." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "УÑлуги" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "Данный email не найден." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." -msgstr "УÑтановки Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ñ‹." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "ЦП" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." -msgstr "ÐаÑтройка поддержки обновлена." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "ПамÑÑ‚ÑŒ" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" -msgstr "Отзывы о поддержке" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "ВерÑÐ¸Ñ Airtime" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." -msgstr "ÐаÑтройки потока обновлены." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "ДиÑковое проÑтранÑтво" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" -msgstr "Путь должен быть указан" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "ÐаÑтройки Email / почтового Ñервера" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." -msgstr "Проблема Ñ Liquidsoap ..." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "ÐаÑтройки SoundCloud " -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "Выбрать курÑор" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "Повторить дні:" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "Удалить курÑор" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "Удалить" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "Программа не ÑущеÑтвует" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "Добавить" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "Веб-поток без названиÑ" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "URL подключеніÑ:" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "Веб-поток Ñохранен." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "ÐаÑтройки входного потока" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "ÐедопуÑтимые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ñ‹." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "URL Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Master:" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "Ð’Ñ‹ проÑматриваете Ñтарые верÑии %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "Заменить" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "Ð’Ñ‹ не можете добавить треки в динамичеÑкие блоки." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "OK" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° удаление выбранных %s(s)." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "ВОССТÐÐОВИТЬ" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "Ð’Ñ‹ можете добавить треки только в умный блок." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "URL Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº программе:" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "ПлейлиÑÑ‚ без названиÑ" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(ОбÑзательно)" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "Умный блок без названиÑ" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Airtime " -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "ÐеизвеÑтный плейлиÑÑ‚" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "Помогите улучшить Airtime, раÑÑказав нам, как вы работаете Ñ Ð½Ð¸Ð¼. Мы будем Ñобирать Ñту информацию регулÑрно. %s Ðажмите кнопку \"Да, помочь Airtime\" и мы позаботимÑÑ Ð¾ том, чтобы те опции, которые вы иÑпользуете, поÑтоÑнно ÑовершенÑтвовалиÑÑŒ." -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "Страница не найдена" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "Щелкните поле ниже, чтобы рекламировать Ñвою Ñтанцию на %s Sourcefabric.org %s . Ð’ целÑÑ… ÑодейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐµÐ¹ Ñтанции, Ð¾Ð¿Ñ†Ð¸Ñ 'Отправить отзыв о поддержке »должна быть включена. Эти данные будут ÑобиратьÑÑ Ð² дополнение к отзывам о поддержке." -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "Ошибка приложениÑ" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(Только Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸, не будет опубликовано)" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "Пользователь уÑпешно добавлен!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "Примечание: вÑе, что превыÑит размеры 600x600, будет изменено." -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "Пользователь уÑпешно обновлен!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "Покажите мне, что Ñ Ð¿Ð¾Ñылаю " -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² наÑтройках Ñохранены!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "ПоÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ уÑловиÑ" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "Год %s должен быть в пределах 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "Сменить пароль" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s - %s - %s не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимой датой" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "Выбрать" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s : %s : %s не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым временем" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "УÑтановка" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "Программа без названиÑ" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° импорта:" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "Импорт папки:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "Повторно Ñканировать проÑмотренную папку (Это полезно, еÑли Ñто ÑÐµÑ‚ÐµÐ²Ð°Ñ Ñборка, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не Ñинхронна Ñ Airtime)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "ПроÑматриваемые папки:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "Удалить проÑмотренную папку" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "Ðе ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимой папкой" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "Ð’Ñ‹ не проÑматриваете никакие папки медиа-файлов." -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "Логин:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "Поток " -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "Пароль:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "Дополнительные параметры" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "Повторите пароль:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ отображатьÑÑ Ð´Ð»Ñ Ñлушателей в их медиа-плейере:" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "ИмÑ" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(Веб-Ñайт вашей радиоÑтанции)" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "ФамилиÑ" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "URL потока: " -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "Email:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "Фильтровать иÑторию" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "Тел:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "Ðайти программы" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skype:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "Фильтр по программе:" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabber:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "%s's ÐаÑтройки" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "Тип пользователÑ:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "Помогите улучшить Airtime, раÑÑказав нам, как вы работаете Ñ Ð½Ð¸Ð¼. Мы будем Ñобирать Ñту информацию регулÑрно. %sÐажмите \"ПоÑлать отзывы\" и мы позаботимÑÑ Ð¾ том, чтобы те опции, которые вы иÑпользуете, поÑтоÑнно ÑовершенÑтвовалиÑÑŒ." -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ ÑвлÑетÑÑ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "Щелкните поле ниже, чтобы рекламировать вашу Ñтанцию на %s Sourcefabric.org %s ." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "ÐвтоматичеÑкое выключение" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(Ð’ целÑÑ… Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ¹ Ñтанции, Ð¾Ð¿Ñ†Ð¸Ñ 'Отправить отзывы о поддержке' должна быть включена)." -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "ÐвтоматичеÑкое включение" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Политика конфиденциальноÑти Sourcefabric " -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "Переключение переходов Ð·Ð°Ñ‚ÑƒÑ…Ð°Ð½Ð¸Ñ (s)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "Выберите программу" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "Введите Ð²Ñ€ÐµÐ¼Ñ Ð² Ñекундах, 00{0,000000}" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "Ðайти" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Master " +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "Выберите дни:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "Пароль Master" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "Параметры умного блока" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "URL Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº иÑточнику Master" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "или" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "URL Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº иÑточнику Show" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "и" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "Порт иÑточника Master " +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr " к " -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "Разрешены только чиÑла." +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "Файлы отвечают критериÑм" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "Точка Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ñточника Master" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "файл отвечает критериÑм" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "Ðеверно введенный Ñимвол" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "Создание шаблона по файлам" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "Порт иÑточника Show" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "Создание шаблона лога" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "Точка Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ñточника Show" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "Добавить еще Ñлементы" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "Ð’Ñ‹ не можете иÑпользовать порт, иÑпользуемый Master DJ." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "Добавить поле" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "Порт %s не доÑтупен." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "УÑтановить шаблон по умолчанию" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%значение%' не ÑоответÑтвует формату времени 'ЧЧ:мм'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" +msgstr "Шаблоны лога" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "Дата /Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "Ðет шаблона лога" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "Дата / Ð²Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "ДлительноÑÑ‚ÑŒ:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð¾Ð½Ð°:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "Повторы?" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "Ðевозможно Ñоздать программу в прошедшем периоде" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "Ðовый" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "Ðевозможно изменить дату/Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° программы, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑƒÐ¶Ðµ началаÑÑŒ" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "Ðовый плейлиÑÑ‚" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "Ðе может иметь длительноÑÑ‚ÑŒ <0м" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "Ðовый умный блок" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "Ðе может иметь длительноÑÑ‚ÑŒ 00ч 00м" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "Ðовый веб-поток" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "Ðе может иметь длительноÑÑ‚ÑŒ более 24 чаÑов" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "ПроÑмотр / редактирование опиÑаниÑ" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" -msgstr "СÑылка:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "URL потока:" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "Тип повтора:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "Длина по умолчанию:" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "Еженедельно" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "Ðет веб-потока" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" -msgstr "каждые 2 недели" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "ÐаÑтройки потоковой передачи " -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" -msgstr "каждые 3 недели" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "Общие наÑтройки" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" -msgstr "каждые 4 недели" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "дБ" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "ÐаÑтройки выходного потока" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "ежемеÑÑчно" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "Импорт файлов в процеÑÑе ..." -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "Выберите дни:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "Дополнительные параметры поиÑка" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "предыдущаÑ" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "день меÑÑца" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "играть" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "день недели" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "пауза" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "Дата окончаниÑ:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "ÑледующаÑ" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "Ðет окончаниÑ?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "Ñтоп" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть поÑле даты начала" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "отключить звук" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "включить звук" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "Значение ÑвлÑетÑÑ Ð¾Ð±Ñзательным и не может быть пуÑтым" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾ÑÑ‚ÑŒ" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "Пароль" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "ТребуетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "Подтвердить новый пароль" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð¸Ð³Ñ€Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÐ´Ð¸Ð°-файла необходимо либо обновить браузер до поÑледней верÑии или обновить %sфлÑш-плагина%s." -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "Подтверждение Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ðµ Ñовпадает Ñ Ð²Ð°ÑˆÐ¸Ð¼ паролем." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "Длина:" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "Получить новый пароль" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "ЧаÑтота диÑкретизации:" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "Ðазвание Ñтанции" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "ISRC номер:" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "Телефон:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "ВебÑайт Ñтанции:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "Веб-поток" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "Страна:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "ДинамичеÑкий умный блок" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "Город" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "СтатичеÑкий умный блок" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "ОпиÑание Ñтанции:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "Ðудио-дорожка" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "Логотип Ñтанции:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "Содержание плейлиÑта: " -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "Поддержать мою Ñтанцию на Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "Содержание ÑтатичеÑкого умного блока: " -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "УÑтановив Ñтот флажок, Ñ ÑоглашаюÑÑŒ Ñ %sполитикой конфиденциальноÑти%s Sourcefabric." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "Критерии динамичеÑкого умного блока: " -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "Ð’Ñ‹ должны ÑоглаÑитьÑÑ Ñ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ¾Ð¹ конфиденциальноÑти." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "Ограничение до " -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'% значение%' не ÑвлÑетÑÑ Ð´ÐµÐ¹Ñтвительным адреÑом Ñлектронной почты в формате local-part@hostname" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%значение%' не ÑоответÑтвует формату даты '%формат%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%значение%' имеет менее %min% Ñимволов" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%значение%' имеет более %max% Ñимволов" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "Слушатель граф Ñ Ñ‚ÐµÑ‡ÐµÐ½Ð¸ÐµÐ¼ времени" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%значение%' не входит в промежуток '%min%' и '%maxÑ% включительно" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "Добро пожаловать в Airtime!" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "Пароли не Ñовпадают" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "Вот как вы можете начать иÑпользовать Airtime Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ð·Ð°Ñ†Ð¸Ð¸ вещаниÑ: " -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "Ðктивировано:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "Ðачните Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² в библиотеку Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки \"Добавить медиа-файлы\". Ð’Ñ‹ также можете перетащить файлы в Ñто окно." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "Тип потока:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "Создайте программу в разделе 'Календарь' и кликните \"+ Show '. Это может быть Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ Ð¸Ð»Ð¸ повторÑющаÑÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð°. Только админиÑтраторы и менеджеры могут добавить программу." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "Тип уÑлуги:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "Добавить медиа-файлы программы в Календаре, кликнув левой кнопкой и выбрав \"Добавить/Удалить контент\" в выпадающем меню" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "Каналы:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "Выберите медиа-файлы на левой панели и перетащите их в вашу программу на правой панели." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - Моно" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "Ð’Ñ‹ готовы!" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - Стерео" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "Ð”Ð»Ñ Ð±Ð¾Ð»ÐµÐµ подробной Ñправки читать %sруководÑтво пользователÑ%s ." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "Сервер" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "ПоделитьÑÑ" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "Порт" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "Выбор потока:" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "URL" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sAirtime%s %s, открытое программное обеÑпечение Ð´Ð»Ñ Ñ€Ð°Ð´Ð¸Ð¾ Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ удаленного ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñтанцией.%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "Точка монтированиÑ" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%sSourcefabric%s o.p.s. Airtime раÑпроÑтранÑетÑÑ Ð² ÑоответÑтвии Ñ %sGNU GPL v.3%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "ÐдминиÑтратор" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "Ðовый пароль" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "Пароль админиÑтратора" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "ПожалуйÑта, введите и подтвердите новый пароль ниже." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "Сервер не может быть пуÑтым" +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "ПожалуйÑта, введите email Ñвоей учетной запиÑи. Ð’Ñ‹ получите ÑÑылку, чтобы Ñоздать новый пароль." -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "Порт не может быть пуÑтым." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "E-mail отправлен" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "Монтирование не может быть пуÑтым Ñ Icecast Ñервер." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "Сообщение было отправлено" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "СредÑтва аудиовыхода" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "ВернутьÑÑ Ð½Ð° Ñтраницу входа" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "Тип выхода" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "Добро пожаловать в онлайн демо-верÑию Airtime! Ð’Ñ‹ можете войти, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð»Ð¾Ð³Ð¸Ð½ \"admin\" и пароль \"admin\"." -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Метаданные Icecast Vorbis " +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "ПредыдущаÑ:" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "Метка потока:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "СледующаÑ:" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "ИÑполниÑ‚ель - Ðазвание" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "ИÑходные потоки" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "Программа - ИÑполнитель - Ðазвание" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "ИÑточник Master " -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "Ðазвание Ñтанции - Ðазвание программы" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "ИÑточник Show" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "Отключить мета-данные" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "Из календарÑ" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "Ð’ Ñфире" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "Слушать" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "ПоиÑк пользователей:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñтанции" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "Диджеи:" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "Ð»Ð¸Ð·ÐµÐ½Ð·Ð¸Ñ Ð¸Ñтекает через" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "ЗапиÑÑŒ Ñ Ð»Ð¸Ð½ÐµÐ¹Ð½Ð¾Ð³Ð¾ входа?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "Купить копию Airtime" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "РетранÑлÑциÑ?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "ÐœÐ¾Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "Включение ÑиÑтемы Ñлектронной почты (Ñмена паролÑ)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "Управление пользователÑми" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ 'От' E-mail" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "Ðовый пользователь" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "ÐаÑтройка почтового Ñервера" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "id" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "ТребуетÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° подлинноÑти" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "ИмÑ" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "Почтовый Ñервер" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "ФамилиÑ" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "Тип пользователÑ" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "Введите Ñимволы, которые вы видите на картинке ниже." +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "День должен быть указан" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ быть указано" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "Данные по прграмме" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "Должны ждать по крайней мере 1 Ñ‡Ð°Ñ Ð´Ð¾ ретранÑлÑции" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Приложение по умолчанию Zend Framework " -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "ИÑпользование идентификации Airtime:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "Страница не найдена!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "ИÑпользование пользовательÑкой идентификации:" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "Похоже, что Ñтраница, которую вы ищете, не ÑущеÑтвует!" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "ПользовательÑкие Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "Развернуть ÑтатичеÑкий блок" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "ПользовательÑкий пароль" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "Развернуть динамичеÑкий блок" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ может быть пуÑтым." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "ОчиÑтить умный блок" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "Пароль не может быть пуÑтым." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "ОчиÑтить плейлиÑÑ‚" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "Дата начала:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" +msgstr "ОчиÑтить плейлиÑÑ‚" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" +msgstr "ОчиÑтить" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "Введите Ð²Ñ€ÐµÐ¼Ñ Ð² Ñекундах 0 {0,0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "Перемешать плейлиÑÑ‚" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" -msgstr "ВозраÑтание по умолчанию:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "Сохранить плейлиÑÑ‚" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" -msgstr "Затухание по умолчанию:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "ПерекреÑтное затухание композиций плейлиÑта" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "Разрешить удаленным вебÑайтам доÑтуп к \"РаÑпиÑание \" информациÑ? %s (Ðктивировать Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ виджетов интерфейÑа)." +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "УÑиление: " -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "Отключено" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "Затухание: " -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "Ðктивировано" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "Ðет открытых плейлиÑтов" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "Язык по умолчанию" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" +msgstr "ОчиÑтить умный блок" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" -msgstr "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð¾Ð½Ð° Ñтанции" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(ÑÑ)" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "Ðачало недели" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "Ðет открытых умных блоков" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" -msgstr "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð¾Ð½Ð° (броузер)" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" +msgstr "Показать трек" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "Ðачало звучаниÑ: " -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "ВоÑÑтановить пароль" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(чч: мм: ÑÑ)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "чаÑов" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "Окончание звучаниÑ: " -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "минут" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð°:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "УÑтановка типа умного блока:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "Добавить Ñту программу" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "СтатичеÑкий" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "Обновить программу" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "ДинамичеÑкий" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "Что" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "Разрешить повтор треков:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "Когда" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "Ограничить до" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "Потоковый ввод" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "Создать Ñодержание плейлиÑта и Ñохранить критерии" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "ЗапиÑÑŒ и РетранÑлÑциÑ" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "Создать" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "Кто" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "Перемешать Ñодержание плейлиÑта" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "Стиль" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "Ограничение не может быть пуÑтым или менее 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "РетранÑлÑÑ†Ð¸Ñ %s из %s" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "Ограничение не может быть более 24 чаÑов" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "Выберите Ñтрану" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "Значение должно быть целым чиÑлом" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "Длина должна быть более 0 минут" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "500 ÑвлÑетÑÑ Ð¼Ð°ÐºÑимально допуÑтимым значением Ñлемента" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "Длину указать в формате \"00ч 00мин \"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "Ð’Ñ‹ должны выбрать критерии и модификаторы" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "URL указать в формате \"http://домен\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "\"Длина\" должна быть в формате '00:00:00'" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "URL должен быть 512 Ñимволов или менее" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "Значение должно быть в формате временной метки (например, 0000-00-00 или 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "Ð”Ð»Ñ Ð²ÐµÐ±-потока не найдено MIME type" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "Значение должно быть чиÑлом" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "Ðазвание вебпотока должно быть заполнено" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "Значение должно быть меньше, чем 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "Ðе удалоÑÑŒ анализировать XSPF плейлиÑÑ‚" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "Значение должно быть меньше, чем %s Ñимволов" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "Ðе удалоÑÑŒ анализировать PLS плейлиÑÑ‚" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "Значение не может быть пуÑтым" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "Ðе удалоÑÑŒ анализировать M3U плейлиÑÑ‚" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "Программа:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "Ðеверный вебпоток - Ñто загрузка файла." -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "Ð’Ñе мои программы:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "ÐеизвеÑтный тип потока: %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "ISRC номер:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s уже проÑматривают." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "ÐвтоматичеÑки загружать запиÑанные программы" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s Ñодержит вложенную проÑматриваемую папку: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "Включить загрузку SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s вложено в ÑущеÑтвующую проÑматриваемую папку: %s" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "ÐвтоматичеÑки отмечать файлы \"Загружаемые\" на SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимой папкой." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "SoundCloud e-mail" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s уже уÑтановлена в качеÑтве текущей папки Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ в ÑпиÑке проÑматриваемых папок" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "SoundCloud пароль" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s уже уÑтановлен в качеÑтве текущей папки Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ в ÑпиÑке проÑматриваемых папок." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "SoundCloud теги: (отдельные метки Ñ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð°Ð¼Ð¸)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "%s не ÑущеÑтвует в проÑматриваемом ÑпиÑке" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "Жанр по умолчанию:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "Тип трека по умолчанию:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "РаÑпиÑание, которое вы проÑматриваете, уÑтарело! (неÑоответÑтвие раÑпиÑаниÑ)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "Оригинал" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "РаÑпиÑание, которое вы проÑматриваете, уÑтарело! (неÑоответÑтвие выпуÑков)" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "РемикÑ" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "РаÑпиÑание, которое вы проÑматриваете, уÑтарело!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "ПрÑмой Ñфир" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ %s ." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "ЗапиÑÑŒ" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "Ð’Ñ‹ не можете добавлÑÑ‚ÑŒ файлы в запиÑываемую программу" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "Разговорный" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "Программа %s окончилаÑÑŒ и не может быть поÑтавлена в раÑпиÑание." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "ПодкаÑÑ‚" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "Программа %s была обновлена ранее!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "Демо" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "ÐÐµÐ·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ð°Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "Выбранный файл не ÑущеÑтвует!" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "ОÑнова" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° и Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð·Ð²ÑƒÑ‡Ð°Ð½Ð¸Ñ Ñ‚Ñ€ÐµÐºÐ° не заполнены." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "Цикл" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° Ð·Ð²ÑƒÑ‡Ð°Ð½Ð¸Ñ Ð½Ðµ может быть больше времени окончаниÑ. " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "Звуковой Ñффект" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð·Ð²ÑƒÑ‡Ð°Ð½Ð¸Ñ Ð½Ðµ может превышать длину трека." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "Единичный ÑÑмпл" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð·Ð²ÑƒÑ‡Ð°Ð½Ð¸Ñ Ð½Ðµ может быть меньше времени начала." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "Другое" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "Файл не был загружен, размер Ñвободного диÑкового проÑтранÑтва %s МБ, а размер загружаемого файла %s МБ." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð¿Ð¾ умолчанию:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ программы 24 чаÑа." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "Работа находитÑÑ Ð² публичном домене" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ переÑекающиеÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹.\n" +"Примечание: изменение размера повторÑющейÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ влиÑет на вÑе ее повторы." -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "Ð’Ñе права защищены" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"Привет %s, \n" +"\n" +" Ðажмите ÑÑылку Ð´Ð»Ñ ÑброÑа паролÑ: " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Airtime" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "ÐекоммерчеÑÐºÐ°Ñ Creative Commons Attribution" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "ЗапиÑанный файл не найден" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "Creative Commons Attribution без производных продуктов" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "ПроÑмотр метаданных запиÑанного файла" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "Creative Commons Attribution в равных долÑÑ…" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "Показать Ñодержимое" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "Creative Commons Attribution Non ÐекоммерчеÑкое производных работ" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "Удалить вÑе Ñодержимое" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "Creative Commons Attribution некоммерчеÑÐºÐ°Ñ Ð² равных долÑÑ…" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "Отмена текущей программы" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "Цвет фона:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "Редактировать" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "Цвет текÑта:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "Редактировать программу" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð² Ñфире" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "Удалить Ñтот выпуÑк" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "Добавить медиа-файлы" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "Удалить Ñтот выпуÑк и вÑе поÑледующие" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "Библиотека" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "Ðет доÑтупа" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "Календарь" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "Ðевозможно перетащить повторÑющиеÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "СиÑтема" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "Ðевозможно перемеÑтить прошлую программу" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "Пользователи" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "Ðевозможно перемеÑтить программу в прошедший период" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "Папки медиа-файлов" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "Ðевозможно перемеÑтить запиÑанную программу менее, чем за 1 Ñ‡Ð°Ñ Ð´Ð¾ ее ретранÑлÑции." -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "Потоки" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "Программа была удалена, потому что запиÑÐ°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° не ÑущеÑтвует!" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "СтатиÑтика Ñлушателей" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "До ретранÑлÑции необходимо ожидать 1 чаÑ." -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" -msgstr "ИÑториÑ" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" +msgstr "Трек" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð²Ð¾ÑпроизведениÑ" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "Проиграно" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "Шаблоны иÑтории" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "Год %s должен быть в пределах 1753 - 9999" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "С чего начать" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s - %s - %s не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимой датой" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "РуководÑтво пользователÑ" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s : %s : %s не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым временем" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3916,3 +3806,18 @@ msgstr "ПожалуйÑта, выбор опции" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "Ðет запиÑей" + +#~ msgid "can't resize a past show" +#~ msgstr "невозможно изменить размеры программы прошлого периода" + +#~ msgid "Should not overlap shows" +#~ msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÑекать программы" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "Ðе удалоÑÑŒ Ñоздать папку organize." + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "Этот файл по-видимому поврежден и не будет добавлен к медиа-библиотеке." + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "Загрузка не удалаÑÑŒ. Эта ошибка возможна, еÑли на жеÑтком диÑке компьютера не хватает меÑта или папка не имеет необходимых разрешений запиÑи." diff --git a/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po b/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po index 519dba4f76..858aad41da 100644 --- a/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po @@ -1,34 +1,22 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-02-04 13:52+0000\n" "Last-Translator: andrey.podshivalov\n" "Language-Team: Serbian (Serbia) (http://www.transifex.com/projects/p/airtime/language/sr_RS/)\n" +"Language: sr_RS\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: sr_RS\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -49,9 +37,9 @@ msgid "Stop" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "" @@ -60,9 +48,9 @@ msgid "Set Cue In" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "" @@ -84,1719 +72,1447 @@ msgstr "" msgid "Fade Out" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" msgstr "" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" msgstr "" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" msgstr "" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" msgstr "" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "" - -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 -msgid "Shuffle" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" msgstr "" - -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " + +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" msgstr "" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" msgstr "" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" msgstr "" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" msgstr "" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" msgstr "" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" msgstr "" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." msgstr "" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." msgstr "" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" msgstr "" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" msgstr "" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" msgstr "" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" msgstr "" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" msgstr "" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" msgstr "" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" msgstr "" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" msgstr "" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" msgstr "" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" msgstr "" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" msgstr "" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" msgstr "" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" msgstr "" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" msgstr "" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" msgstr "" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" msgstr "" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" msgstr "" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" msgstr "" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" msgstr "" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" msgstr "" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" msgstr "" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" msgstr "" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" msgstr "" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" msgstr "" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" msgstr "" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" msgstr "" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" msgstr "" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" msgstr "" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" msgstr "" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" msgstr "" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" msgstr "" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" msgstr "" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" msgstr "" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" msgstr "" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" msgstr "" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" msgstr "" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" msgstr "" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" msgstr "" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" msgstr "" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" msgstr "" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" msgstr "" -#: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." +#: airtime_mvc/application/controllers/ListenerstatController.php:56 +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 -#, php-format -msgid "%s not found" +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" +#: airtime_mvc/application/controllers/ScheduleController.php:350 +#, php-format +msgid "Rebroadcast of show %s from %s at %s" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:32 @@ -1873,6 +1589,11 @@ msgstr "" msgid "Please select a cursor position on timeline." msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "" @@ -1919,6 +1640,7 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "" @@ -1989,9 +1711,7 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2027,10 +1747,7 @@ msgid "Playlist shuffled" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2056,24 +1773,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2106,6 +1814,11 @@ msgid "" "This will remove the files from your Airtime library!" msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" msgstr "" @@ -2116,9 +1829,7 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2129,22 +1840,12 @@ msgstr "" msgid "The stream is disabled" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "" - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2153,61 +1854,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2215,9 +1891,7 @@ msgid "No result found" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2233,16 +1907,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2398,1510 +2067,1724 @@ msgstr "" msgid "month" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" +#: airtime_mvc/application/controllers/LocaleController.php:254 +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" +#: airtime_mvc/application/controllers/LocaleController.php:255 +msgid "Cancel Current Show?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" +#: airtime_mvc/application/controllers/LocaleController.php:256 +#: airtime_mvc/application/controllers/LocaleController.php:300 +msgid "Stop recording current show?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" +#: airtime_mvc/application/controllers/LocaleController.php:257 +msgid "Ok" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" +#: airtime_mvc/application/controllers/LocaleController.php:258 +msgid "Contents of Show" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" +#: airtime_mvc/application/controllers/LocaleController.php:261 +msgid "Remove all content?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" +#: airtime_mvc/application/controllers/LocaleController.php:263 +msgid "Delete selected item(s)?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" +#: airtime_mvc/application/controllers/LocaleController.php:265 +msgid "End" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" +#: airtime_mvc/application/controllers/LocaleController.php:266 +msgid "Duration" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" +#: airtime_mvc/application/controllers/LocaleController.php:276 +msgid "Show Empty" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" +#: airtime_mvc/application/controllers/LocaleController.php:277 +msgid "Recording From Line In" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" +#: airtime_mvc/application/controllers/LocaleController.php:278 +msgid "Track preview" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:282 +msgid "Cannot schedule outside a show." +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:283 +msgid "Moving 1 Item" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:284 +#, php-format +msgid "Moving %s Items" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:287 +msgid "Fade Editor" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:288 +msgid "Cue Editor" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:289 +msgid "Waveform features are available in a browser supporting the Web Audio API" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:292 +msgid "Select all" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:293 +msgid "Select none" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:294 +msgid "Remove overbooked tracks" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:295 +msgid "Remove selected scheduled items" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:296 +msgid "Jump to the current playing track" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:297 +msgid "Cancel current show" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:302 +msgid "Open library to add or remove content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:305 +msgid "in use" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:255 -msgid "Cancel Current Show?" +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:256 -#: airtime_mvc/application/controllers/LocaleController.php:300 -msgid "Stop recording current show?" +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:257 -msgid "Ok" +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:258 -msgid "Contents of Show" +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:261 -msgid "Remove all content?" +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:263 -msgid "Delete selected item(s)?" +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:265 -msgid "End" +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:266 -msgid "Duration" +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:276 -msgid "Show Empty" +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:277 -msgid "Recording From Line In" +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:278 -msgid "Track preview" +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:282 -msgid "Cannot schedule outside a show." +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:283 -msgid "Moving 1 Item" +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:284 -#, php-format -msgid "Moving %s Items" +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:287 -msgid "Fade Editor" +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:288 -msgid "Cue Editor" +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:292 -msgid "Select all" +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:293 -msgid "Select none" +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:294 -msgid "Remove overbooked tracks" +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:295 -msgid "Remove selected scheduled items" +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:296 -msgid "Jump to the current playing track" +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:297 -msgid "Cancel current show" +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:302 -msgid "Open library to add or remove content" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:305 -msgid "in use" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "" + +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." msgstr "" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" msgstr "" -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." msgstr "" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " msgstr "" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" msgstr "" -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" msgstr "" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " msgstr "" -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " msgstr "" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." msgstr "" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." msgstr "" -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" msgstr "" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" msgstr "" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" msgstr "" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" msgstr "" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" msgstr "" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" msgstr "" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" msgstr "" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" msgstr "" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" msgstr "" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." msgstr "" -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" msgstr "" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" msgstr "" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" msgstr "" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" msgstr "" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" msgstr "" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" msgstr "" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" msgstr "" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" msgstr "" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." msgstr "" -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" msgstr "" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." msgstr "" -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" msgstr "" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" msgstr "" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" msgstr "" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" msgstr "" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" msgstr "" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 diff --git a/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po b/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po index 3266abcca7..4c8a6dfb43 100644 --- a/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po @@ -1,34 +1,22 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-02-04 13:52+0000\n" "Last-Translator: andrey.podshivalov\n" "Language-Team: Serbian (Latin) (Serbia) (http://www.transifex.com/projects/p/airtime/language/sr_RS@latin/)\n" +"Language: sr_RS@latin\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: sr_RS@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -49,9 +37,9 @@ msgid "Stop" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "" @@ -60,9 +48,9 @@ msgid "Set Cue In" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "" @@ -84,1719 +72,1447 @@ msgstr "" msgid "Fade Out" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" msgstr "" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" msgstr "" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" msgstr "" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" msgstr "" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "" - -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 -msgid "Shuffle" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" msgstr "" - -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " + +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" msgstr "" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" msgstr "" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" msgstr "" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" msgstr "" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" msgstr "" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" msgstr "" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." msgstr "" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." msgstr "" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" msgstr "" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" msgstr "" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" msgstr "" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" msgstr "" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" msgstr "" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" msgstr "" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" msgstr "" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" msgstr "" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" msgstr "" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" msgstr "" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" msgstr "" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" msgstr "" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" msgstr "" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" msgstr "" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" msgstr "" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" msgstr "" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" msgstr "" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" msgstr "" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" msgstr "" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" msgstr "" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" msgstr "" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" msgstr "" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" msgstr "" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" msgstr "" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" msgstr "" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" msgstr "" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" msgstr "" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" msgstr "" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" msgstr "" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" msgstr "" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" msgstr "" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" msgstr "" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" msgstr "" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" msgstr "" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" msgstr "" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" msgstr "" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" msgstr "" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" msgstr "" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" msgstr "" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" msgstr "" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" msgstr "" -#: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." +#: airtime_mvc/application/controllers/ListenerstatController.php:56 +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 -#, php-format -msgid "%s not found" +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" +#: airtime_mvc/application/controllers/ScheduleController.php:350 +#, php-format +msgid "Rebroadcast of show %s from %s at %s" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:32 @@ -1873,6 +1589,11 @@ msgstr "" msgid "Please select a cursor position on timeline." msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "" @@ -1919,6 +1640,7 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "" @@ -1989,9 +1711,7 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2027,10 +1747,7 @@ msgid "Playlist shuffled" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2056,24 +1773,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2106,6 +1814,11 @@ msgid "" "This will remove the files from your Airtime library!" msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" msgstr "" @@ -2116,9 +1829,7 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2129,22 +1840,12 @@ msgstr "" msgid "The stream is disabled" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "" - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2153,61 +1854,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2215,9 +1891,7 @@ msgid "No result found" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2233,16 +1907,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2398,1510 +2067,1724 @@ msgstr "" msgid "month" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" +#: airtime_mvc/application/controllers/LocaleController.php:254 +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" +#: airtime_mvc/application/controllers/LocaleController.php:255 +msgid "Cancel Current Show?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" +#: airtime_mvc/application/controllers/LocaleController.php:256 +#: airtime_mvc/application/controllers/LocaleController.php:300 +msgid "Stop recording current show?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" +#: airtime_mvc/application/controllers/LocaleController.php:257 +msgid "Ok" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" +#: airtime_mvc/application/controllers/LocaleController.php:258 +msgid "Contents of Show" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" +#: airtime_mvc/application/controllers/LocaleController.php:261 +msgid "Remove all content?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" +#: airtime_mvc/application/controllers/LocaleController.php:263 +msgid "Delete selected item(s)?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" +#: airtime_mvc/application/controllers/LocaleController.php:265 +msgid "End" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" +#: airtime_mvc/application/controllers/LocaleController.php:266 +msgid "Duration" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" +#: airtime_mvc/application/controllers/LocaleController.php:276 +msgid "Show Empty" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" +#: airtime_mvc/application/controllers/LocaleController.php:277 +msgid "Recording From Line In" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" +#: airtime_mvc/application/controllers/LocaleController.php:278 +msgid "Track preview" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:282 +msgid "Cannot schedule outside a show." +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:283 +msgid "Moving 1 Item" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:284 +#, php-format +msgid "Moving %s Items" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:287 +msgid "Fade Editor" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:288 +msgid "Cue Editor" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:289 +msgid "Waveform features are available in a browser supporting the Web Audio API" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:292 +msgid "Select all" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:293 +msgid "Select none" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:294 +msgid "Remove overbooked tracks" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:295 +msgid "Remove selected scheduled items" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:296 +msgid "Jump to the current playing track" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:297 +msgid "Cancel current show" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:302 +msgid "Open library to add or remove content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:305 +msgid "in use" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:255 -msgid "Cancel Current Show?" +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:256 -#: airtime_mvc/application/controllers/LocaleController.php:300 -msgid "Stop recording current show?" +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:257 -msgid "Ok" +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:258 -msgid "Contents of Show" +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:261 -msgid "Remove all content?" +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:263 -msgid "Delete selected item(s)?" +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:265 -msgid "End" +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:266 -msgid "Duration" +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:276 -msgid "Show Empty" +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:277 -msgid "Recording From Line In" +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:278 -msgid "Track preview" +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:282 -msgid "Cannot schedule outside a show." +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:283 -msgid "Moving 1 Item" +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:284 -#, php-format -msgid "Moving %s Items" +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:287 -msgid "Fade Editor" +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:288 -msgid "Cue Editor" +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:292 -msgid "Select all" +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:293 -msgid "Select none" +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:294 -msgid "Remove overbooked tracks" +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:295 -msgid "Remove selected scheduled items" +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:296 -msgid "Jump to the current playing track" +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:297 -msgid "Cancel current show" +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:302 -msgid "Open library to add or remove content" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:305 -msgid "in use" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "" + +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." msgstr "" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" msgstr "" -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." msgstr "" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " msgstr "" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" msgstr "" -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" msgstr "" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " msgstr "" -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " msgstr "" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." msgstr "" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." msgstr "" -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" msgstr "" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" msgstr "" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" msgstr "" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" msgstr "" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" msgstr "" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" msgstr "" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" msgstr "" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" msgstr "" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" msgstr "" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." msgstr "" -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" msgstr "" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" msgstr "" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" msgstr "" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" msgstr "" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" msgstr "" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" msgstr "" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" msgstr "" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" msgstr "" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." msgstr "" -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" msgstr "" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." msgstr "" -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" msgstr "" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" msgstr "" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" msgstr "" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" msgstr "" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" msgstr "" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 diff --git a/airtime_mvc/locale/template/airtime.po b/airtime_mvc/locale/template/airtime.po index f54718a0a5..529a84b68d 100644 --- a/airtime_mvc/locale/template/airtime.po +++ b/airtime_mvc/locale/template/airtime.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Airtime 2.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,16 +17,6 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -47,9 +37,9 @@ msgid "Stop" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "" @@ -58,9 +48,9 @@ msgid "Set Cue In" msgstr "" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "" @@ -82,1674 +72,1447 @@ msgstr "" msgid "Fade Out" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" msgstr "" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." msgstr "" -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" msgstr "" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" msgstr "" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" msgstr "" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" msgstr "" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" msgstr "" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" msgstr "" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" msgstr "" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" msgstr "" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." msgstr "" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "" - -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" msgstr "" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" msgstr "" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" msgstr "" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "The following info will be displayed to listeners in their media player:" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" msgstr "" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" msgstr "" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "Here's how you can get started using Airtime to automate your broadcasts: " +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "Select your media from the left pane and drag them to your show in the right pane." +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" msgstr "" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" msgstr "" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." msgstr "" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" msgstr "" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" msgstr "" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "" - -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "" - -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "" - -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "" - -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "" - -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "" - -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 -msgid "Shuffle" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" msgstr "" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" + +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" msgstr "" -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" msgstr "" -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" msgstr "" -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" msgstr "" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." msgstr "" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" msgstr "" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" msgstr "" -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" msgstr "" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" msgstr "" -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" msgstr "" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" msgstr "" -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" msgstr "" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." msgstr "" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." msgstr "" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "%s is already set as the current storage dir or in the watched folders list" +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "%s is already set as the current storage dir or in the watched folders list." +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" msgstr "" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" msgstr "" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" msgstr "" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" msgstr "" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" msgstr "" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" msgstr "" -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" msgstr "" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" msgstr "" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" msgstr "" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" msgstr "" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" msgstr "" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" msgstr "" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" msgstr "" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" msgstr "" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "" + +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" msgstr "" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" msgstr "" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" msgstr "" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" msgstr "" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" msgstr "" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" msgstr "" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" msgstr "" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" msgstr "" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" msgstr "" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" msgstr "" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" msgstr "" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" msgstr "" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" msgstr "" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" msgstr "" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" msgstr "" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" msgstr "" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" msgstr "" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" msgstr "" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" msgstr "" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" msgstr "" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" msgstr "" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" msgstr "" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" msgstr "" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" msgstr "" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" msgstr "" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" msgstr "" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" msgstr "" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "This file appears to be corrupted and will not be added to media library." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" msgstr "" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" msgstr "" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" msgstr "" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" msgstr "" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" msgstr "" -#: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "Please make sure admin user/password is correct on System->Streams page." +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." +#: airtime_mvc/application/controllers/ListenerstatController.php:56 +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" msgstr "" -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 -#, php-format -msgid "%s not found" +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" +#: airtime_mvc/application/controllers/ScheduleController.php:350 +#, php-format +msgid "Rebroadcast of show %s from %s at %s" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" msgstr "" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:32 @@ -1826,6 +1589,11 @@ msgstr "" msgid "Please select a cursor position on timeline." msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "" @@ -1872,6 +1640,7 @@ msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "" @@ -2045,6 +1814,11 @@ msgid "" "This will remove the files from your Airtime library!" msgstr "" +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "" + #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" msgstr "" @@ -2066,11 +1840,6 @@ msgstr "" msgid "The stream is disabled" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "" - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "" @@ -2137,1660 +1906,1885 @@ msgstr "" msgid "Warning: Shows cannot be re-linked" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" +#: airtime_mvc/application/controllers/LocaleController.php:187 +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:188 +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:192 +msgid "Show" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:193 +msgid "Show is empty" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:194 +msgid "1m" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:195 +msgid "5m" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:196 +msgid "10m" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:197 +msgid "15m" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:198 +msgid "30m" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:199 +msgid "60m" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:201 +msgid "Retreiving data from the server..." +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:207 +msgid "This show has no scheduled content." +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:208 +msgid "This show is not completely filled with content." +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:212 +msgid "January" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:213 +msgid "February" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:214 +msgid "March" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:215 +msgid "April" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:216 +#: airtime_mvc/application/controllers/LocaleController.php:228 +msgid "May" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:217 +msgid "June" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:218 +msgid "July" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:219 +msgid "August" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:220 +msgid "September" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:221 +msgid "October" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:222 +msgid "November" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:223 +msgid "December" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:224 +msgid "Jan" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:225 +msgid "Feb" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:226 +msgid "Mar" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:227 +msgid "Apr" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:229 +msgid "Jun" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:230 +msgid "Jul" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:231 +msgid "Aug" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:232 +msgid "Sep" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:233 +msgid "Oct" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:234 +msgid "Nov" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:235 +msgid "Dec" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:236 +msgid "today" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:237 +msgid "day" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:238 +msgid "week" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:239 +msgid "month" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:254 +msgid "Shows longer than their scheduled time will be cut off by a following show." +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:255 +msgid "Cancel Current Show?" +msgstr "" + +#: airtime_mvc/application/controllers/LocaleController.php:256 +#: airtime_mvc/application/controllers/LocaleController.php:300 +msgid "Stop recording current show?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." +#: airtime_mvc/application/controllers/LocaleController.php:257 +msgid "Ok" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:192 -msgid "Show" +#: airtime_mvc/application/controllers/LocaleController.php:258 +msgid "Contents of Show" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:193 -msgid "Show is empty" +#: airtime_mvc/application/controllers/LocaleController.php:261 +msgid "Remove all content?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:194 -msgid "1m" +#: airtime_mvc/application/controllers/LocaleController.php:263 +msgid "Delete selected item(s)?" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:195 -msgid "5m" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:196 -msgid "10m" +#: airtime_mvc/application/controllers/LocaleController.php:265 +msgid "End" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:197 -msgid "15m" +#: airtime_mvc/application/controllers/LocaleController.php:266 +msgid "Duration" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:198 -msgid "30m" +#: airtime_mvc/application/controllers/LocaleController.php:276 +msgid "Show Empty" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:199 -msgid "60m" +#: airtime_mvc/application/controllers/LocaleController.php:277 +msgid "Recording From Line In" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:201 -msgid "Retreiving data from the server..." +#: airtime_mvc/application/controllers/LocaleController.php:278 +msgid "Track preview" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:207 -msgid "This show has no scheduled content." +#: airtime_mvc/application/controllers/LocaleController.php:282 +msgid "Cannot schedule outside a show." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:208 -msgid "This show is not completely filled with content." +#: airtime_mvc/application/controllers/LocaleController.php:283 +msgid "Moving 1 Item" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:212 -msgid "January" +#: airtime_mvc/application/controllers/LocaleController.php:284 +#, php-format +msgid "Moving %s Items" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:213 -msgid "February" +#: airtime_mvc/application/controllers/LocaleController.php:287 +msgid "Fade Editor" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:214 -msgid "March" +#: airtime_mvc/application/controllers/LocaleController.php:288 +msgid "Cue Editor" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:215 -msgid "April" +#: airtime_mvc/application/controllers/LocaleController.php:289 +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:216 -#: airtime_mvc/application/controllers/LocaleController.php:228 -msgid "May" +#: airtime_mvc/application/controllers/LocaleController.php:292 +msgid "Select all" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:217 -msgid "June" +#: airtime_mvc/application/controllers/LocaleController.php:293 +msgid "Select none" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:218 -msgid "July" +#: airtime_mvc/application/controllers/LocaleController.php:294 +msgid "Remove overbooked tracks" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:219 -msgid "August" +#: airtime_mvc/application/controllers/LocaleController.php:295 +msgid "Remove selected scheduled items" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:220 -msgid "September" +#: airtime_mvc/application/controllers/LocaleController.php:296 +msgid "Jump to the current playing track" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:221 -msgid "October" +#: airtime_mvc/application/controllers/LocaleController.php:297 +msgid "Cancel current show" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:222 -msgid "November" +#: airtime_mvc/application/controllers/LocaleController.php:302 +msgid "Open library to add or remove content" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:223 -msgid "December" +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:224 -msgid "Jan" +#: airtime_mvc/application/controllers/LocaleController.php:305 +msgid "in use" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:225 -msgid "Feb" +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:226 -msgid "Mar" +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:227 -msgid "Apr" +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:229 -msgid "Jun" +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:230 -msgid "Jul" +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:231 -msgid "Aug" +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:232 -msgid "Sep" +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:233 -msgid "Oct" +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:234 -msgid "Nov" +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:235 -msgid "Dec" +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:236 -msgid "today" +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:237 -msgid "day" +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:238 -msgid "week" +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:239 -msgid "month" +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "Shows longer than their scheduled time will be cut off by a following show." +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:255 -msgid "Cancel Current Show?" +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:256 -#: airtime_mvc/application/controllers/LocaleController.php:300 -msgid "Stop recording current show?" +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:257 -msgid "Ok" +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:258 -msgid "Contents of Show" +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:261 -msgid "Remove all content?" +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:263 -msgid "Delete selected item(s)?" +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:265 -msgid "End" +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:266 -msgid "Duration" +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:276 -msgid "Show Empty" +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:277 -msgid "Recording From Line In" +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:278 -msgid "Track preview" +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:282 -msgid "Cannot schedule outside a show." +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:283 -msgid "Moving 1 Item" +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:284 -#, php-format -msgid "Moving %s Items" +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:287 -msgid "Fade Editor" +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:288 -msgid "Cue Editor" +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "Waveform features are available in a browser supporting the Web Audio API" +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:292 -msgid "Select all" +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:293 -msgid "Select none" +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:294 -msgid "Remove overbooked tracks" +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:295 -msgid "Remove selected scheduled items" +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:296 -msgid "Jump to the current playing track" +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:297 -msgid "Cancel current show" +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:302 -msgid "Open library to add or remove content" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:305 -msgid "in use" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" msgstr "" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" msgstr "" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" msgstr "" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" msgstr "" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" msgstr "" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" msgstr "" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." msgstr "" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." msgstr "" -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" msgstr "" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." msgstr "" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " msgstr "" -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" msgstr "" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" msgstr "" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" msgstr "" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." msgstr "" -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " msgstr "" -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " msgstr "" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" msgstr "" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." msgstr "" -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" msgstr "" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "" + +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" msgstr "" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" msgstr "" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" msgstr "" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" msgstr "" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " msgstr "" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "'%value%' is no valid email address in the basic format local-part@hostname" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" msgstr "" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" msgstr "" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" msgstr "" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" msgstr "" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" msgstr "" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" msgstr "" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" msgstr "" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" msgstr "" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" msgstr "" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" msgstr "" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" msgstr "" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" msgstr "" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" msgstr "" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " msgstr "" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" msgstr "" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" msgstr "" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." msgstr "" -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" msgstr "" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" msgstr "" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" msgstr "" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" msgstr "" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" msgstr "" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" msgstr "" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" msgstr "" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" msgstr "" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" msgstr "" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" msgstr "" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." msgstr "" -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" msgstr "" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." msgstr "" -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" msgstr "" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" msgstr "" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" msgstr "" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" msgstr "" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" msgstr "" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 diff --git a/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po b/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po index 860c117c02..24dd379144 100644 --- a/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po @@ -1,35 +1,23 @@ # LANGUAGE (xx_XX) translation for Airtime. # Copyright (C) 2012 Sourcefabric # This file is distributed under the same license as the Airtime package. -# +# # Translators: # Sourcefabric , 2012 msgid "" msgstr "" "Project-Id-Version: Airtime\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-13 12:58-0500\n" +"POT-Creation-Date: 2014-04-09 11:22-0400\n" "PO-Revision-Date: 2014-01-29 15:10+0000\n" "Last-Translator: andrey.podshivalov\n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/airtime/language/zh_CN/)\n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: airtime_mvc/application/layouts/scripts/login.phtml:16 -#, php-format -msgid "" -"Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained" -" and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" -msgstr "Airtime éµå¾ªGPL第三版å议,%sç”±%sSourcefabric o.p.s%s版æƒæ‰€æœ‰ã€‚" - -#: airtime_mvc/application/layouts/scripts/bare.phtml:5 -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 -msgid "Live stream" -msgstr "æ’æ’­æµ" - #: airtime_mvc/application/layouts/scripts/audio-player.phtml:5 #: airtime_mvc/application/controllers/LocaleController.php:30 msgid "Audio Player" @@ -50,9 +38,9 @@ msgid "Stop" msgstr "æš‚åœ" #: airtime_mvc/application/layouts/scripts/layout.phtml:47 -#: airtime_mvc/application/models/Block.php:1347 -#: airtime_mvc/application/controllers/LocaleController.php:272 #: airtime_mvc/application/forms/SmartBlockCriteria.php:55 +#: airtime_mvc/application/controllers/LocaleController.php:272 +#: airtime_mvc/application/models/Block.php:1347 msgid "Cue In" msgstr "切入" @@ -61,9 +49,9 @@ msgid "Set Cue In" msgstr "设为切入时间" #: airtime_mvc/application/layouts/scripts/layout.phtml:54 -#: airtime_mvc/application/models/Block.php:1348 -#: airtime_mvc/application/controllers/LocaleController.php:273 #: airtime_mvc/application/forms/SmartBlockCriteria.php:56 +#: airtime_mvc/application/controllers/LocaleController.php:273 +#: airtime_mvc/application/models/Block.php:1348 msgid "Cue Out" msgstr "切出" @@ -85,1720 +73,1448 @@ msgstr "æ·¡å…¥" msgid "Fade Out" msgstr "淡出" -#: airtime_mvc/application/services/HistoryService.php:1105 -#: airtime_mvc/application/services/HistoryService.php:1145 -#: airtime_mvc/application/services/HistoryService.php:1162 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 -#: airtime_mvc/application/models/Block.php:1363 -#: airtime_mvc/application/controllers/LocaleController.php:66 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 -msgid "Title" -msgstr "标题" +#: airtime_mvc/application/layouts/scripts/login.phtml:16 +#, php-format +msgid "Airtime Copyright ©Sourcefabric o.p.s. All rights reserved.%sMaintained and distributed under GNU GPL v.3 by %sSourcefabric o.p.s%s" +msgstr "Airtime éµå¾ªGPL第三版å议,%sç”±%sSourcefabric o.p.s%s版æƒæ‰€æœ‰ã€‚" -#: airtime_mvc/application/services/HistoryService.php:1106 -#: airtime_mvc/application/services/HistoryService.php:1146 -#: airtime_mvc/application/services/HistoryService.php:1163 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 -#: airtime_mvc/application/models/Block.php:1349 -#: airtime_mvc/application/controllers/LocaleController.php:67 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 -msgid "Creator" -msgstr "作者" +#: airtime_mvc/application/layouts/scripts/livestream.phtml:9 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2 +msgid "Live stream" +msgstr "æ’æ’­æµ" -#: airtime_mvc/application/services/HistoryService.php:1107 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 -#: airtime_mvc/application/models/Block.php:1341 -#: airtime_mvc/application/controllers/LocaleController.php:68 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 -msgid "Album" -msgstr "专辑" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 +msgid "Enabled:" +msgstr "å¯ç”¨ï¼š" -#: airtime_mvc/application/services/HistoryService.php:1108 -#: airtime_mvc/application/services/HistoryService.php:1165 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 -#: airtime_mvc/application/models/Block.php:1357 -#: airtime_mvc/application/controllers/LocaleController.php:81 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 -msgid "Length" -msgstr "时长" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 +msgid "Stream Type:" +msgstr "æµæ ¼å¼ï¼š" -#: airtime_mvc/application/services/HistoryService.php:1109 -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 -#: airtime_mvc/application/models/Block.php:1351 -#: airtime_mvc/application/controllers/LocaleController.php:75 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 -msgid "Genre" -msgstr "风格" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 +msgid "Bit Rate:" +msgstr "比特率:" -#: airtime_mvc/application/services/HistoryService.php:1110 -#: airtime_mvc/application/models/Block.php:1359 -#: airtime_mvc/application/controllers/LocaleController.php:83 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 -msgid "Mood" -msgstr "风格" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 +msgid "Service Type:" +msgstr "æœåŠ¡ç±»åž‹ï¼š" -#: airtime_mvc/application/services/HistoryService.php:1111 -#: airtime_mvc/application/models/Block.php:1353 -#: airtime_mvc/application/controllers/LocaleController.php:77 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 -msgid "Label" -msgstr "标签" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 +msgid "Channels:" +msgstr "声é“:" -#: airtime_mvc/application/services/HistoryService.php:1112 -#: airtime_mvc/application/services/HistoryService.php:1166 -#: airtime_mvc/application/models/Block.php:1344 -#: airtime_mvc/application/controllers/LocaleController.php:71 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 -msgid "Composer" -msgstr "作曲" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "1 - Mono" +msgstr "1 - å•å£°é“" -#: airtime_mvc/application/services/HistoryService.php:1113 -#: airtime_mvc/application/models/Block.php:1352 -#: airtime_mvc/application/controllers/LocaleController.php:76 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 -msgid "ISRC" -msgstr "ISRCç " +#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 +msgid "2 - Stereo" +msgstr "2 - 立体声" -#: airtime_mvc/application/services/HistoryService.php:1114 -#: airtime_mvc/application/services/HistoryService.php:1167 -#: airtime_mvc/application/models/Block.php:1346 -#: airtime_mvc/application/controllers/LocaleController.php:73 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 -msgid "Copyright" -msgstr "版æƒ" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 +msgid "Server" +msgstr "æœåŠ¡å™¨" -#: airtime_mvc/application/services/HistoryService.php:1115 -#: airtime_mvc/application/models/Block.php:1367 -#: airtime_mvc/application/controllers/LocaleController.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 -msgid "Year" -msgstr "年代" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 +#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 +#: airtime_mvc/application/forms/ShowBuilder.php:37 +#: airtime_mvc/application/forms/ShowBuilder.php:65 +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 +#: airtime_mvc/application/forms/DateRange.php:35 +#: airtime_mvc/application/forms/DateRange.php:63 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 +msgid "Invalid character entered" +msgstr "输入的字符ä¸åˆè¦æ±‚" -#: airtime_mvc/application/services/HistoryService.php:1116 -msgid "Track" -msgstr "曲目" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 +#: airtime_mvc/application/forms/EmailServerPreferences.php:100 +msgid "Port" +msgstr "端å£å·" -#: airtime_mvc/application/services/HistoryService.php:1117 -#: airtime_mvc/application/models/Block.php:1345 -#: airtime_mvc/application/controllers/LocaleController.php:72 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 -msgid "Conductor" -msgstr "指挥" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 +msgid "Only numbers are allowed." +msgstr "åªå…许输入数字" -#: airtime_mvc/application/services/HistoryService.php:1118 -#: airtime_mvc/application/models/Block.php:1354 -#: airtime_mvc/application/controllers/LocaleController.php:78 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 -msgid "Language" -msgstr "语ç§" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 +#: airtime_mvc/application/forms/PasswordChange.php:17 +#: airtime_mvc/application/forms/EmailServerPreferences.php:82 +msgid "Password" +msgstr "密ç " -#: airtime_mvc/application/services/HistoryService.php:1143 -#: airtime_mvc/application/forms/EditHistoryItem.php:32 -msgid "Start Time" -msgstr "开始时间" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:132 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:59 +#: airtime_mvc/application/controllers/LocaleController.php:75 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:10 +#: airtime_mvc/application/models/Block.php:1351 +#: airtime_mvc/application/services/HistoryService.php:1112 +msgid "Genre" +msgstr "风格" -#: airtime_mvc/application/services/HistoryService.php:1144 -#: airtime_mvc/application/forms/EditHistoryItem.php:44 -msgid "End Time" -msgstr "结æŸæ—¶é—´" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 +msgid "URL" +msgstr "链接地å€" -#: airtime_mvc/application/services/HistoryService.php:1164 -msgid "Played" -msgstr "已播放" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 +msgid "Name" +msgstr "åå­—" -#: airtime_mvc/application/services/CalendarService.php:50 -msgid "Record file doesn't exist" -msgstr "录制文件ä¸å­˜åœ¨" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 +msgid "Description" +msgstr "æè¿°" -#: airtime_mvc/application/services/CalendarService.php:54 -msgid "View Recorded File Metadata" -msgstr "查看录制文件的元数æ®" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 +msgid "Mount Point" +msgstr "加载点" -#: airtime_mvc/application/services/CalendarService.php:65 -#: airtime_mvc/application/controllers/LibraryController.php:282 -msgid "View on Soundcloud" -msgstr "在Soundcloud中查看" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 +#: airtime_mvc/application/forms/PasswordRestore.php:25 +#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 +msgid "Username" +msgstr "用户å" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:288 -msgid "Upload to SoundCloud" -msgstr "上传到SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 +msgid "Admin User" +msgstr "管ç†å‘˜ç”¨æˆ·å" -#: airtime_mvc/application/services/CalendarService.php:70 -#: airtime_mvc/application/controllers/LibraryController.php:286 -msgid "Re-upload to SoundCloud" -msgstr "é‡æ–°ä¸Šä¼ åˆ°SoundCloud" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 +msgid "Admin Password" +msgstr "管ç†å‘˜å¯†ç " -#: airtime_mvc/application/services/CalendarService.php:77 -#: airtime_mvc/application/services/CalendarService.php:121 -msgid "Show Content" -msgstr "显示内容" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 +#: airtime_mvc/application/controllers/LocaleController.php:163 +msgid "Getting information from the server..." +msgstr "从æœåŠ¡å™¨åŠ è½½ä¸­..." -#: airtime_mvc/application/services/CalendarService.php:93 -#: airtime_mvc/application/services/CalendarService.php:100 -#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 -#: airtime_mvc/application/controllers/LocaleController.php:303 -msgid "Add / Remove Content" -msgstr "添加 / 删除内容" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 +msgid "Server cannot be empty." +msgstr "请填写“æœåŠ¡å™¨â€ã€‚" -#: airtime_mvc/application/services/CalendarService.php:111 -msgid "Remove All Content" -msgstr "清空全部内容" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 +msgid "Port cannot be empty." +msgstr "请填写“端å£â€ã€‚" -#: airtime_mvc/application/services/CalendarService.php:131 -#: airtime_mvc/application/services/CalendarService.php:135 -msgid "Cancel Current Show" -msgstr "å–消当å‰èŠ‚ç›®" +#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 +msgid "Mount cannot be empty with Icecast server." +msgstr "请填写“加载点â€ã€‚" -#: airtime_mvc/application/services/CalendarService.php:152 -#: airtime_mvc/application/services/CalendarService.php:167 -msgid "Edit This Instance" -msgstr "编辑此节目" +#: airtime_mvc/application/forms/EditAudioMD.php:19 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 +msgid "Title:" +msgstr "歌曲å:" -#: airtime_mvc/application/services/CalendarService.php:157 -#: airtime_mvc/application/controllers/LibraryController.php:241 -#: airtime_mvc/application/controllers/LibraryController.php:263 -msgid "Edit" -msgstr "编辑" +#: airtime_mvc/application/forms/EditAudioMD.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 +msgid "Creator:" +msgstr "作者:" -#: airtime_mvc/application/services/CalendarService.php:162 -#: airtime_mvc/application/services/CalendarService.php:173 -msgid "Edit Show" -msgstr "编辑节目" +#: airtime_mvc/application/forms/EditAudioMD.php:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 +msgid "Album:" +msgstr "专辑å:" -#: airtime_mvc/application/services/CalendarService.php:186 -#: airtime_mvc/application/services/CalendarService.php:201 -#: airtime_mvc/application/services/CalendarService.php:206 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 -#: airtime_mvc/application/controllers/LibraryController.php:217 -#: airtime_mvc/application/controllers/LibraryController.php:246 -#: airtime_mvc/application/controllers/LibraryController.php:265 -#: airtime_mvc/application/controllers/ShowbuilderController.php:202 -msgid "Delete" -msgstr "删除" +#: airtime_mvc/application/forms/EditAudioMD.php:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 +msgid "Track:" +msgstr "曲目编å·ï¼š" -#: airtime_mvc/application/services/CalendarService.php:191 -msgid "Delete This Instance" -msgstr "删除当å‰èŠ‚ç›®" +#: airtime_mvc/application/forms/EditAudioMD.php:47 +#: airtime_mvc/application/forms/AddShowWhat.php:45 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 +msgid "Genre:" +msgstr "风格:" -#: airtime_mvc/application/services/CalendarService.php:196 -msgid "Delete This Instance and All Following" -msgstr "删除当å‰ä»¥åŠéšåŽçš„系列节目" +#: airtime_mvc/application/forms/EditAudioMD.php:55 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 +msgid "Year:" +msgstr "年份:" -#: airtime_mvc/application/services/CalendarService.php:250 -msgid "Permission denied" -msgstr "没有编辑æƒé™" +#: airtime_mvc/application/forms/EditAudioMD.php:67 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 +msgid "Label:" +msgstr "标签:" -#: airtime_mvc/application/services/CalendarService.php:254 -msgid "Can't drag and drop repeating shows" -msgstr "系列中的节目无法拖拽" +#: airtime_mvc/application/forms/EditAudioMD.php:74 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 +msgid "Composer:" +msgstr "编曲:" -#: airtime_mvc/application/services/CalendarService.php:263 -msgid "Can't move a past show" -msgstr "å·²ç»ç»“æŸçš„节目无法更改时间" +#: airtime_mvc/application/forms/EditAudioMD.php:81 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 +msgid "Conductor:" +msgstr "制作:" -#: airtime_mvc/application/services/CalendarService.php:281 -msgid "Can't move show into past" -msgstr "节目ä¸èƒ½è®¾ç½®åˆ°å·²è¿‡åŽ»çš„时间点" +#: airtime_mvc/application/forms/EditAudioMD.php:88 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 +msgid "Mood:" +msgstr "情怀:" -#: airtime_mvc/application/services/CalendarService.php:288 -#: airtime_mvc/application/forms/AddShowWhen.php:280 -#: airtime_mvc/application/forms/AddShowWhen.php:294 -#: airtime_mvc/application/forms/AddShowWhen.php:318 -#: airtime_mvc/application/forms/AddShowWhen.php:324 -#: airtime_mvc/application/forms/AddShowWhen.php:329 -msgid "Cannot schedule overlapping shows" -msgstr "节目时间设置与其他节目有冲çª" +#: airtime_mvc/application/forms/EditAudioMD.php:96 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 +msgid "BPM:" +msgstr "æ‹å­ï¼ˆBPM):" -#: airtime_mvc/application/services/CalendarService.php:301 -msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." -msgstr "录音和é‡æ’­èŠ‚目之间的间隔必须大于等于1å°æ—¶ã€‚" +#: airtime_mvc/application/forms/EditAudioMD.php:105 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 +msgid "Copyright:" +msgstr "版æƒï¼š" -#: airtime_mvc/application/services/CalendarService.php:311 -msgid "Show was deleted because recorded show does not exist!" -msgstr "录音节目ä¸å­˜åœ¨ï¼ŒèŠ‚目已删除ï¼" +#: airtime_mvc/application/forms/EditAudioMD.php:112 +msgid "ISRC Number:" +msgstr "ISRCç¼–å·ï¼š" -#: airtime_mvc/application/services/CalendarService.php:318 -msgid "Must wait 1 hour to rebroadcast." -msgstr "é‡æ’­èŠ‚目必须设置于1å°æ—¶ä¹‹åŽã€‚" +#: airtime_mvc/application/forms/EditAudioMD.php:119 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 +msgid "Website:" +msgstr "网站:" -#: airtime_mvc/application/views/scripts/preference/index.phtml:2 -#: airtime_mvc/application/configs/navigation.php:45 -msgid "Preferences" -msgstr "系统属性" +#: airtime_mvc/application/forms/EditAudioMD.php:126 +#: airtime_mvc/application/forms/Login.php:48 +#: airtime_mvc/application/forms/EditUser.php:114 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 +msgid "Language:" +msgstr "语言:" +#: airtime_mvc/application/forms/EditAudioMD.php:135 +#: airtime_mvc/application/forms/AddUser.php:106 +#: airtime_mvc/application/forms/EditHistory.php:131 +#: airtime_mvc/application/forms/SupportSettings.php:158 +#: airtime_mvc/application/controllers/LocaleController.php:285 +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/preference/index.phtml:6 #: airtime_mvc/application/views/scripts/preference/index.phtml:14 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:6 #: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:115 -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:160 -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:16 #: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 #: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:24 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:85 -#: airtime_mvc/application/controllers/LocaleController.php:285 -#: airtime_mvc/application/forms/AddUser.php:106 -#: airtime_mvc/application/forms/SupportSettings.php:158 -#: airtime_mvc/application/forms/EditHistory.php:131 -#: airtime_mvc/application/forms/EditAudioMD.php:135 msgid "Save" msgstr "ä¿å­˜" -#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 -#: airtime_mvc/application/controllers/LocaleController.php:156 -msgid "Manage Media Folders" -msgstr "管ç†åª’体文件夹" - -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 -msgid "Stream Settings" -msgstr "æµè®¾å®š" +#: airtime_mvc/application/forms/EditAudioMD.php:145 +#: airtime_mvc/application/forms/EditHistory.php:141 +#: airtime_mvc/application/forms/PasswordRestore.php:46 +#: airtime_mvc/application/controllers/LocaleController.php:286 +#: airtime_mvc/application/controllers/LocaleController.php:309 +msgid "Cancel" +msgstr "å–消" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 -msgid "Global Settings" -msgstr "全局设定" +#: airtime_mvc/application/forms/AddUser.php:25 +#: airtime_mvc/application/forms/Login.php:19 +#: airtime_mvc/application/forms/EditUser.php:32 +msgid "Username:" +msgstr "用户å:" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 -msgid "dB" -msgstr "分è´" +#: airtime_mvc/application/forms/AddUser.php:34 +#: airtime_mvc/application/forms/Login.php:34 +#: airtime_mvc/application/forms/EditUser.php:43 +msgid "Password:" +msgstr "密ç ï¼š" -#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 -msgid "Output Stream Settings" -msgstr "输出æµè®¾å®š" +#: airtime_mvc/application/forms/AddUser.php:42 +#: airtime_mvc/application/forms/EditUser.php:52 +msgid "Verify Password:" +msgstr "å†æ¬¡è¾“入密ç ï¼š" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 -msgid "Choose folder" -msgstr "选择文件夹" +#: airtime_mvc/application/forms/AddUser.php:51 +#: airtime_mvc/application/forms/EditUser.php:62 +msgid "Firstname:" +msgstr "å:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 -msgid "Set" -msgstr "设置" +#: airtime_mvc/application/forms/AddUser.php:57 +#: airtime_mvc/application/forms/EditUser.php:70 +msgid "Lastname:" +msgstr "姓:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 -msgid "Current Import Folder:" -msgstr "当å‰çš„导入文件夹:" +#: airtime_mvc/application/forms/AddUser.php:63 +#: airtime_mvc/application/forms/SupportSettings.php:46 +#: airtime_mvc/application/forms/RegisterAirtime.php:51 +#: airtime_mvc/application/forms/EditUser.php:78 +msgid "Email:" +msgstr "电邮:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 -msgid "Add" -msgstr "添加" +#: airtime_mvc/application/forms/AddUser.php:72 +#: airtime_mvc/application/forms/EditUser.php:89 +msgid "Mobile Phone:" +msgstr "手机:" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 -msgid "" -"Rescan watched directory (This is useful if it is network mount and may be " -"out of sync with Airtime)" -msgstr "é‡æ–°æ‰«æ监控的文件夹(针对于需è¦æ‰‹åŠ¨æ›´æ–°çš„网络存储路径)" +#: airtime_mvc/application/forms/AddUser.php:78 +#: airtime_mvc/application/forms/EditUser.php:97 +msgid "Skype:" +msgstr "Skypeå¸å·ï¼š" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 -msgid "Remove watched directory" -msgstr "移除监控文件夹" +#: airtime_mvc/application/forms/AddUser.php:84 +#: airtime_mvc/application/forms/EditUser.php:105 +msgid "Jabber:" +msgstr "Jabberå¸å·ï¼š" -#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 -msgid "You are not watching any media folders." -msgstr "你没有正在监控的文件夹。" +#: airtime_mvc/application/forms/AddUser.php:91 +msgid "User Type:" +msgstr "用户类型:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 -msgid "Register Airtime" -msgstr "注册Airtime" +#: airtime_mvc/application/forms/AddUser.php:95 +#: airtime_mvc/application/controllers/LocaleController.php:315 +msgid "Guest" +msgstr "游客" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 -#, php-format -msgid "" -"Help Airtime improve by letting us know how you are using it. This info will" -" be collected regularly in order to enhance your user experience.%sClick " -"'Yes, help Airtime' and we'll make sure the features you use are constantly " -"improving." -msgstr "通过告诉我们您使用Airtimeçš„æ–¹å¼ï¼Œå¯ä»¥å¸®åŠ©æˆ‘们改进Airtime。这些信æ¯ä¼šå‘¨æœŸæ€§çš„收集起æ¥ï¼Œå¹¶ä¸”æ高您的用户体验。%s点击‘是的,帮助Airtime’,就能让我们确ä¿ä½ æ‰€ä½¿ç”¨çš„功能æŒç»­åœ°å¾—到改进。" +#: airtime_mvc/application/forms/AddUser.php:96 +#: airtime_mvc/application/controllers/LocaleController.php:313 +msgid "DJ" +msgstr "节目编辑" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 -#, php-format -msgid "" -"Click the box below to advertise your station on %sSourcefabric.org%s. In " -"order to promote your station, 'Send support feedback' must be enabled. This" -" data will be collected in addition to the support feedback." -msgstr "勾选下é¢çš„选项,就å¯ä»¥åœ¨%sSourcefabric.org%s上推广您的电å°ã€‚å‰æ是‘å‘é€æ”¯æŒå馈’选项已ç»å¯ç”¨ã€‚这些数æ®å°†ä¼šè¢«æ”¶é›†èµ·æ¥ä»¥ä½œä¸ºæ”¯æŒå馈的信æ¯ã€‚" +#: airtime_mvc/application/forms/AddUser.php:97 +#: airtime_mvc/application/controllers/LocaleController.php:314 +msgid "Program Manager" +msgstr "节目主管" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 -#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 -#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 -#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 -msgid "(Required)" -msgstr "(必填)" - -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 -msgid "(for verification purposes only, will not be published)" -msgstr "(仅作为验è¯ç›®çš„使用,ä¸ä¼šç”¨äºŽå‘布)" +#: airtime_mvc/application/forms/AddUser.php:98 +#: airtime_mvc/application/controllers/LocaleController.php:312 +msgid "Admin" +msgstr "系统管ç†å‘˜" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 -msgid "Note: Anything larger than 600x600 will be resized." -msgstr "注æ„:大于600x600的图片将会被缩放" +#: airtime_mvc/application/forms/AddUser.php:116 +#: airtime_mvc/application/forms/EditUser.php:135 +msgid "Login name is not unique." +msgstr "å¸å·é‡å。" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 -msgid "Show me what I am sending " -msgstr "显示我所å‘é€çš„ä¿¡æ¯" +#: airtime_mvc/application/forms/AddShowStyle.php:10 +msgid "Background Colour:" +msgstr "背景色:" -#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 -msgid "Terms and Conditions" -msgstr "使用æ¡æ¬¾" +#: airtime_mvc/application/forms/AddShowStyle.php:29 +msgid "Text Colour:" +msgstr "文字颜色:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 -msgid "Find Shows" -msgstr "查找节目" +#: airtime_mvc/application/forms/ShowBuilder.php:18 +#: airtime_mvc/application/forms/DateRange.php:16 +msgid "Date Start:" +msgstr "开始日期:" -#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 -msgid "Filter By Show:" -msgstr "节目过滤器" +#: airtime_mvc/application/forms/ShowBuilder.php:46 +#: airtime_mvc/application/forms/DateRange.php:44 +#: airtime_mvc/application/forms/AddShowRepeats.php:56 +msgid "Date End:" +msgstr "结æŸæ—¥æœŸï¼š" -#: airtime_mvc/application/views/scripts/form/login.phtml:34 -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 -msgid "Reset password" -msgstr "é‡ç½®å¯†ç " +#: airtime_mvc/application/forms/ShowBuilder.php:72 +msgid "Show:" +msgstr "节目:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 -msgid "Smart Block Options" -msgstr "智能模å—选项" +#: airtime_mvc/application/forms/ShowBuilder.php:80 +msgid "All My Shows:" +msgstr "我的全部节目:" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 -msgid "or" -msgstr "或" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 +msgid "days" +msgstr "天" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 -msgid "and" -msgstr "å’Œ" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 +msgid "Day must be specified" +msgstr "请指定天" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 -msgid " to " -msgstr "到" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 +msgid "Time must be specified" +msgstr "请指定时间" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 -msgid "files meet the criteria" -msgstr "个文件符åˆæ¡ä»¶" +#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 +#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 +msgid "Must wait at least 1 hour to rebroadcast" +msgstr "至少间隔一个å°æ—¶" -#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 -msgid "file meet the criteria" -msgstr "个文件符åˆæ¡ä»¶" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 +msgid "Import Folder:" +msgstr "导入文件夹:" -#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 -msgid "Connection URL: " -msgstr "链接地å€ï¼š" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 +msgid "Watched Folders:" +msgstr "监控文件夹:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 -#, php-format -msgid "" -"Help Airtime improve by letting Sourcefabric know how you are using it. This" -" information will be collected regularly in order to enhance your user " -"experience.%sClick the 'Send support feedback' box and we'll make sure the " -"features you use are constantly improving." -msgstr "通过告诉Sourcefabric您是如何使用Airtime的,å¯ä»¥å¸®åŠ©æˆ‘们改进Airtime。这些信æ¯å°†ä¼šè¢«æ‰‹æœºèµ·æ¥ç”¨äºŽæ高您的客户体验。%såªè¦å‹¾é€‰â€˜å‘é€æ”¯æŒå馈’,就能确ä¿è®©æˆ‘们æŒç»­æ”¹è¿›æ‚¨æ‰€ä½¿ç”¨" +#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 +msgid "Not a valid Directory" +msgstr "无效的路径" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 -#, php-format -msgid "Click the box below to promote your station on %sSourcefabric.org%s." -msgstr "勾选éšåŽçš„选项就å¯ä»¥åœ¨%sSourcefabric.org%s上推广您的电å°ã€‚" +#: airtime_mvc/application/forms/AddShowWho.php:10 +msgid "Search Users:" +msgstr "查找用户:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 -msgid "" -"(In order to promote your station, 'Send support feedback' must be enabled)." -msgstr "(为了推广您的电å°ï¼Œè¯·å¯ç”¨â€˜å‘é€æ”¯æŒå馈’)" +#: airtime_mvc/application/forms/AddShowWho.php:24 +msgid "DJs:" +msgstr "选择节目编辑:" -#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 -msgid "Sourcefabric Privacy Policy" -msgstr "Sourcefabricéšç§ç­–ç•¥" +#: airtime_mvc/application/forms/Login.php:65 +#: airtime_mvc/application/views/scripts/login/index.phtml:3 +msgid "Login" +msgstr "登录" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 -msgid "Input Stream Settings" -msgstr "输入æµè®¾ç½®" +#: airtime_mvc/application/forms/Login.php:83 +msgid "Type the characters you see in the picture below." +msgstr "请输入图åƒé‡Œçš„字符。" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 -msgid "Master Source Connection URL:" -msgstr "主输入æµçš„链接地å€ï¼š" +#: airtime_mvc/application/forms/GeneralPreferences.php:21 +#: airtime_mvc/application/forms/SupportSettings.php:21 +#: airtime_mvc/application/forms/RegisterAirtime.php:30 +msgid "Station Name" +msgstr "电å°å称" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 -msgid "Override" -msgstr "覆盖" +#: airtime_mvc/application/forms/GeneralPreferences.php:33 +msgid "Default Crossfade Duration (s):" +msgstr "默认混åˆæ·¡å…¥æ·¡å‡ºæ•ˆæžœï¼ˆç§’):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "OK" -msgstr "确定" +#: airtime_mvc/application/forms/GeneralPreferences.php:40 +#: airtime_mvc/application/forms/GeneralPreferences.php:59 +#: airtime_mvc/application/forms/GeneralPreferences.php:78 +msgid "enter a time in seconds 0{.0}" +msgstr "请输入秒数,格å¼ä¸º0{.0}" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 -msgid "RESET" -msgstr "é‡ç½®" +#: airtime_mvc/application/forms/GeneralPreferences.php:52 +msgid "Default Fade In (s):" +msgstr "默认淡入效果(秒):" -#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 -msgid "Show Source Connection URL:" -msgstr "节目定制输入æµçš„链接地å€ï¼š" +#: airtime_mvc/application/forms/GeneralPreferences.php:71 +msgid "Default Fade Out (s):" +msgstr "默认淡出效果(秒):" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 -msgid "Choose Days:" -msgstr "选择天数:" +#: airtime_mvc/application/forms/GeneralPreferences.php:89 +#, php-format +msgid "Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make front-end widgets work.)" +msgstr "å…许远程访问节目表信æ¯ï¼Ÿ%s (此项å¯ç”¨åŽæ‰èƒ½ä½¿ç”¨â€œå°å·¥å…·â€ï¼Œæ—¢widgets)" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 -msgid "Remove" -msgstr "移除" +#: airtime_mvc/application/forms/GeneralPreferences.php:90 +msgid "Disabled" +msgstr "ç¦ç”¨" -#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 -msgid "Repeat Days:" -msgstr "é‡å¤å¤©æ•°ï¼š" +#: airtime_mvc/application/forms/GeneralPreferences.php:91 +msgid "Enabled" +msgstr "å¯ç”¨" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 -msgid "Email / Mail Server Settings" -msgstr "邮件æœåŠ¡å™¨è®¾ç½®" +#: airtime_mvc/application/forms/GeneralPreferences.php:97 +msgid "Default Interface Language" +msgstr "ç•Œé¢çš„默认语言" -#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 -msgid "SoundCloud Settings" -msgstr "SoundCloud设置" +#: airtime_mvc/application/forms/GeneralPreferences.php:105 +msgid "Station Timezone" +msgstr "系统使用的时区" -#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 -#, php-format -msgid "%s's Settings" -msgstr "%s设置" +#: airtime_mvc/application/forms/GeneralPreferences.php:113 +msgid "Week Starts On" +msgstr "一周开始于" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 -msgid "Choose Show Instance" -msgstr "选择节目项" +#: airtime_mvc/application/forms/GeneralPreferences.php:123 +#: airtime_mvc/application/controllers/LocaleController.php:240 +msgid "Sunday" +msgstr "周日" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 -#: airtime_mvc/application/controllers/LocaleController.php:391 -#: airtime_mvc/application/forms/EditHistoryItem.php:57 -msgid "No Show" -msgstr "无节目" +#: airtime_mvc/application/forms/GeneralPreferences.php:124 +#: airtime_mvc/application/controllers/LocaleController.php:241 +msgid "Monday" +msgstr "周一" -#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 -msgid "Find" -msgstr "查找" +#: airtime_mvc/application/forms/GeneralPreferences.php:125 +#: airtime_mvc/application/controllers/LocaleController.php:242 +msgid "Tuesday" +msgstr "周二" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 -msgid "Stream " -msgstr "æµ" +#: airtime_mvc/application/forms/GeneralPreferences.php:126 +#: airtime_mvc/application/controllers/LocaleController.php:243 +msgid "Wednesday" +msgstr "周三" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 -msgid "Additional Options" -msgstr "附属选项" +#: airtime_mvc/application/forms/GeneralPreferences.php:127 +#: airtime_mvc/application/controllers/LocaleController.php:244 +msgid "Thursday" +msgstr "周四" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 -msgid "" -"The following info will be displayed to listeners in their media player:" -msgstr "以下内容将会在å¬ä¼—的媒体播放器上显示:" - -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 -msgid "(Your radio station website)" -msgstr "(你电å°çš„网站)" +#: airtime_mvc/application/forms/GeneralPreferences.php:128 +#: airtime_mvc/application/controllers/LocaleController.php:245 +msgid "Friday" +msgstr "周五" -#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 -msgid "Stream URL: " -msgstr "æµçš„链接地å€ï¼š" +#: airtime_mvc/application/forms/GeneralPreferences.php:129 +#: airtime_mvc/application/controllers/LocaleController.php:246 +msgid "Saturday" +msgstr "周六" -#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 -msgid "Filter History" -msgstr "历å²è®°å½•è¿‡æ»¤" +#: airtime_mvc/application/forms/AddShowRepeats.php:10 +msgid "Link:" +msgstr "绑定:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 -msgid "Welcome to Airtime!" -msgstr "欢迎使用Airtimeï¼" +#: airtime_mvc/application/forms/AddShowRepeats.php:16 +msgid "Repeat Type:" +msgstr "类型:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 -msgid "" -"Here's how you can get started using Airtime to automate your broadcasts: " -msgstr "简å•ä»‹ç»å¦‚何使用Airtimeæ¥è‡ªåŠ¨å®Œæˆæ’­æ”¾ï¼š" +#: airtime_mvc/application/forms/AddShowRepeats.php:19 +msgid "weekly" +msgstr "æ¯å‘¨" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 -msgid "" -"Begin by adding your files to the library using the 'Add Media' menu button." -" You can drag and drop your files to this window too." -msgstr "首先把你的媒体文件通过‘添加媒体’导入到媒体库中。你也å¯ä»¥ç®€å•çš„拖拽文件到本窗å£" +#: airtime_mvc/application/forms/AddShowRepeats.php:20 +msgid "every 2 weeks" +msgstr "æ¯éš”2周" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 -msgid "" -"Create a show by going to 'Calendar' in the menu bar, and then clicking the " -"'+ Show' icon. This can be either a one-time or repeating show. Only admins " -"and program managers can add shows." -msgstr "ä½ å¯ä»¥åˆ›å»ºä¸€ä¸ªèŠ‚目,从èœå•æ æ‰“开页é¢â€˜æ—¥ç¨‹è¡¨â€™ï¼Œç‚¹å‡»æŒ‰é’®â€˜+ 节目’。这个节目å¯ä»¥æ˜¯ä¸€æ¬¡æ€§çš„,也å¯ä»¥æ˜¯ç³»åˆ—性的。åªæœ‰ç³»ç»Ÿç®¡ç†å‘˜" +#: airtime_mvc/application/forms/AddShowRepeats.php:21 +msgid "every 3 weeks" +msgstr "æ¯éš”3周" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 -msgid "" -"Add media to the show by going to your show in the Schedule calendar, left-" -"clicking on it and selecting 'Add / Remove Content'" -msgstr "然åŽç»™ä½ çš„节目添加内容,在日程表页é¢ä¸­é€‰ä¸­èŠ‚目,左键å•å‡»ï¼Œåœ¨å‡ºçŽ°çš„èœå•ä¸Šé€‰æ‹©â€˜æ·»åŠ /删除内容’" +#: airtime_mvc/application/forms/AddShowRepeats.php:22 +msgid "every 4 weeks" +msgstr "æ¯éš”4周" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 -msgid "" -"Select your media from the left pane and drag them to your show in the right" -" pane." -msgstr "在页é¢å·¦åŠéƒ¨åˆ†é€‰æ‹©åª’体文件,然åŽæ‹–拽到å³åŠéƒ¨åˆ†ã€‚" +#: airtime_mvc/application/forms/AddShowRepeats.php:23 +msgid "monthly" +msgstr "æ¯æœˆ" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 -msgid "Then you're good to go!" -msgstr "然åŽå°±å¤§åŠŸå‘Šæˆå•¦ï¼" +#: airtime_mvc/application/forms/AddShowRepeats.php:32 +msgid "Select Days:" +msgstr "选择天数:" -#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 -#, php-format -msgid "For more detailed help, read the %suser manual%s." -msgstr "详细的指导,å¯ä»¥å‚考%s用户手册%s。" +#: airtime_mvc/application/forms/AddShowRepeats.php:35 +#: airtime_mvc/application/controllers/LocaleController.php:247 +msgid "Sun" +msgstr "周日" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 -#: airtime_mvc/application/configs/navigation.php:130 -msgid "About" -msgstr "关于" +#: airtime_mvc/application/forms/AddShowRepeats.php:36 +#: airtime_mvc/application/controllers/LocaleController.php:248 +msgid "Mon" +msgstr "周一" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 -#, php-format -msgid "" -"%sAirtime%s %s, the open radio software for scheduling and remote station " -"management. %s" -msgstr "%sAirtime%s %s, æ供内容编排åŠè¿œç¨‹ç®¡ç†çš„å¼€æºç”µå°è½¯ä»¶ã€‚%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:37 +#: airtime_mvc/application/controllers/LocaleController.php:249 +msgid "Tue" +msgstr "周二" -#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 -#, php-format -msgid "" -"%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" -msgstr "%sSourcefabric%s o.p.s. Airtimeéµå¾ª%sGNU GPL v.3%s" +#: airtime_mvc/application/forms/AddShowRepeats.php:38 +#: airtime_mvc/application/controllers/LocaleController.php:250 +msgid "Wed" +msgstr "周三" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 -msgid "Share" -msgstr "共享" +#: airtime_mvc/application/forms/AddShowRepeats.php:39 +#: airtime_mvc/application/controllers/LocaleController.php:251 +msgid "Thu" +msgstr "周四" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 -msgid "Select stream:" -msgstr "选择æµï¼š" +#: airtime_mvc/application/forms/AddShowRepeats.php:40 +#: airtime_mvc/application/controllers/LocaleController.php:252 +msgid "Fri" +msgstr "周五" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 -msgid "mute" -msgstr "é™éŸ³" +#: airtime_mvc/application/forms/AddShowRepeats.php:41 +#: airtime_mvc/application/controllers/LocaleController.php:253 +msgid "Sat" +msgstr "周六" -#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 -msgid "unmute" -msgstr "å–消é™éŸ³" +#: airtime_mvc/application/forms/AddShowRepeats.php:47 +msgid "Repeat By:" +msgstr "é‡å¤ç±»åž‹ï¼š" -#: airtime_mvc/application/views/scripts/login/index.phtml:3 -#: airtime_mvc/application/forms/Login.php:65 -msgid "Login" -msgstr "登录" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the month" +msgstr "按月的åŒä¸€æ—¥æœŸ" -#: airtime_mvc/application/views/scripts/login/index.phtml:7 -msgid "" -"Welcome to the online Airtime demo! You can log in using the username " -"'admin' and the password 'admin'." -msgstr "欢迎æ¥åˆ°åœ¨çº¿Airtime演示ï¼ä½ å¯ä»¥ç”¨â€˜admin’和‘admin’作为用户å和密ç ç™»å½•ã€‚" +#: airtime_mvc/application/forms/AddShowRepeats.php:50 +msgid "day of the week" +msgstr "一个星期的åŒä¸€æ—¥å­" -#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 -msgid "" -"Please enter your account e-mail address. You will receive a link to create " -"a new password via e-mail." -msgstr "请输入你å¸å·çš„邮件地å€ï¼Œç„¶åŽä½ å°†æ”¶åˆ°ä¸€å°é‚®ä»¶ï¼Œå…¶ä¸­æœ‰ä¸€ä¸ªé“¾æŽ¥ï¼Œç”¨æ¥åˆ›å»ºä½ çš„新密ç ã€‚" +#: airtime_mvc/application/forms/AddShowRepeats.php:69 +msgid "No End?" +msgstr "无休止?" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 -msgid "Email sent" -msgstr "邮件已å‘é€" +#: airtime_mvc/application/forms/AddShowRepeats.php:106 +msgid "End date must be after start date" +msgstr "结æŸæ—¥æœŸåº”晚于开始日期" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 -msgid "An email has been sent" -msgstr "邮件已ç»å‘出" +#: airtime_mvc/application/forms/AddShowRepeats.php:113 +msgid "Please select a repeat day" +msgstr "请选择在哪一天é‡å¤" -#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 -msgid "Back to login screen" -msgstr "返回登录页é¢" +#: airtime_mvc/application/forms/PasswordChange.php:28 +msgid "Confirm new password" +msgstr "确认新密ç " -#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 -msgid "New password" -msgstr "新密ç " +#: airtime_mvc/application/forms/PasswordChange.php:36 +msgid "Password confirmation does not match your password." +msgstr "新密ç ä¸åŒ¹é…" -#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 -msgid "Please enter and confirm your new password in the fields below." -msgstr "请å†æ¬¡è¾“入你的新密ç ã€‚" +#: airtime_mvc/application/forms/PasswordChange.php:43 +msgid "Get new password" +msgstr "获å–新密ç " -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 -msgid "Your trial expires in" -msgstr "你的试用天数还剩" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 +#: airtime_mvc/application/models/Block.php:1340 +msgid "Select criteria" +msgstr "选择属性" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:6 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:15 -msgid "days" -msgstr "天" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:49 +#: airtime_mvc/application/controllers/LocaleController.php:68 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:8 +#: airtime_mvc/application/models/Block.php:1341 +#: airtime_mvc/application/services/HistoryService.php:1110 +msgid "Album" +msgstr "专辑" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "Purchase your copy of Airtime" -msgstr "购买你使用的Airtime" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 +#: airtime_mvc/application/models/Block.php:1342 +msgid "Bit Rate (Kbps)" +msgstr "比特率(Kbps)" -#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 -msgid "My Account" -msgstr "我的账户" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 +#: airtime_mvc/application/controllers/LocaleController.php:70 +#: airtime_mvc/application/models/Block.php:1343 +msgid "BPM" +msgstr "æ¯åˆ†é’Ÿæ‹å­æ•°" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 -msgid "Previous:" -msgstr "之å‰çš„:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:52 +#: airtime_mvc/application/controllers/LocaleController.php:71 +#: airtime_mvc/application/models/Block.php:1344 +#: airtime_mvc/application/services/HistoryService.php:1115 +#: airtime_mvc/application/services/HistoryService.php:1169 +msgid "Composer" +msgstr "作曲" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 -msgid "Next:" -msgstr "之åŽçš„:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:53 +#: airtime_mvc/application/controllers/LocaleController.php:72 +#: airtime_mvc/application/models/Block.php:1345 +#: airtime_mvc/application/services/HistoryService.php:1120 +msgid "Conductor" +msgstr "指挥" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 -msgid "Source Streams" -msgstr "输入æµ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:54 +#: airtime_mvc/application/controllers/LocaleController.php:73 +#: airtime_mvc/application/models/Block.php:1346 +#: airtime_mvc/application/services/HistoryService.php:1117 +#: airtime_mvc/application/services/HistoryService.php:1170 +msgid "Copyright" +msgstr "版æƒ" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 -msgid "Master Source" -msgstr "主输入æµ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:67 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:7 +#: airtime_mvc/application/models/Block.php:1349 +#: airtime_mvc/application/services/HistoryService.php:1109 +#: airtime_mvc/application/services/HistoryService.php:1149 +#: airtime_mvc/application/services/HistoryService.php:1166 +msgid "Creator" +msgstr "作者" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 -msgid "Show Source" -msgstr "节目定制的输入æµ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 +#: airtime_mvc/application/controllers/LocaleController.php:74 +#: airtime_mvc/application/models/Block.php:1350 +msgid "Encoded By" +msgstr "编曲" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 -msgid "Scheduled Play" -msgstr "预先安排的节目æµ" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:60 +#: airtime_mvc/application/controllers/LocaleController.php:76 +#: airtime_mvc/application/models/Block.php:1352 +#: airtime_mvc/application/services/HistoryService.php:1116 +msgid "ISRC" +msgstr "ISRCç " -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 -msgid "ON AIR" -msgstr "直播中" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:61 +#: airtime_mvc/application/controllers/LocaleController.php:77 +#: airtime_mvc/application/models/Block.php:1353 +#: airtime_mvc/application/services/HistoryService.php:1114 +msgid "Label" +msgstr "标签" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 -msgid "Listen" -msgstr "收å¬" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:62 +#: airtime_mvc/application/controllers/LocaleController.php:78 +#: airtime_mvc/application/models/Block.php:1354 +#: airtime_mvc/application/services/HistoryService.php:1121 +msgid "Language" +msgstr "语ç§" -#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 -msgid "Station time" -msgstr "电å°å½“å‰æ—¶é—´" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 +#: airtime_mvc/application/controllers/LocaleController.php:79 +#: airtime_mvc/application/models/Block.php:1355 +msgid "Last Modified" +msgstr "最近更新于" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 -#: airtime_mvc/application/controllers/LocaleController.php:353 -#: airtime_mvc/application/controllers/LocaleController.php:381 -msgid "Close" -msgstr "关闭" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 +#: airtime_mvc/application/controllers/LocaleController.php:80 +#: airtime_mvc/application/models/Block.php:1356 +msgid "Last Played" +msgstr "上次播放于" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Add this show" -msgstr "添加此节目" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:65 +#: airtime_mvc/application/controllers/LocaleController.php:81 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:9 +#: airtime_mvc/application/models/Block.php:1357 +#: airtime_mvc/application/services/HistoryService.php:1111 +#: airtime_mvc/application/services/HistoryService.php:1168 +msgid "Length" +msgstr "时长" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 -msgid "Update show" -msgstr "更新节目" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 +#: airtime_mvc/application/controllers/LocaleController.php:82 +#: airtime_mvc/application/models/Block.php:1358 +msgid "Mime" +msgstr "MIMEä¿¡æ¯" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 -msgid "What" -msgstr "å称" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:67 +#: airtime_mvc/application/controllers/LocaleController.php:83 +#: airtime_mvc/application/models/Block.php:1359 +#: airtime_mvc/application/services/HistoryService.php:1113 +msgid "Mood" +msgstr "风格" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "When" -msgstr "时间" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 +#: airtime_mvc/application/controllers/LocaleController.php:84 +#: airtime_mvc/application/models/Block.php:1360 +msgid "Owner" +msgstr "所有者" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 -msgid "Live Stream Input" -msgstr "输入æµè®¾ç½®" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 +#: airtime_mvc/application/controllers/LocaleController.php:85 +#: airtime_mvc/application/models/Block.php:1361 +msgid "Replay Gain" +msgstr "回放增益" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 -msgid "Record & Rebroadcast" -msgstr "录制与é‡æ’­" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 +#: airtime_mvc/application/models/Block.php:1362 +msgid "Sample Rate (kHz)" +msgstr "样本率(KHz)" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 -msgid "Who" -msgstr "管ç†å’Œç¼–辑" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:71 +#: airtime_mvc/application/controllers/LocaleController.php:66 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:6 +#: airtime_mvc/application/models/Block.php:1363 +#: airtime_mvc/application/services/HistoryService.php:1108 +#: airtime_mvc/application/services/HistoryService.php:1148 +#: airtime_mvc/application/services/HistoryService.php:1165 +msgid "Title" +msgstr "标题" -#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 -msgid "Style" -msgstr "风格" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 +#: airtime_mvc/application/controllers/LocaleController.php:87 +#: airtime_mvc/application/models/Block.php:1364 +msgid "Track Number" +msgstr "曲目" -#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 -#: airtime_mvc/application/controllers/LocaleController.php:264 -msgid "Start" -msgstr "开始" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 +#: airtime_mvc/application/controllers/LocaleController.php:88 +#: airtime_mvc/application/models/Block.php:1365 +msgid "Uploaded" +msgstr "上传于" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 -msgid "Service" -msgstr "æœåŠ¡å称" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 +#: airtime_mvc/application/controllers/LocaleController.php:89 +#: airtime_mvc/application/models/Block.php:1366 +msgid "Website" +msgstr "网å€" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 -#: airtime_mvc/application/controllers/LocaleController.php:363 -#: airtime_mvc/application/controllers/LocaleController.php:364 -#: airtime_mvc/application/configs/navigation.php:76 -msgid "Status" -msgstr "系统状æ€" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:75 +#: airtime_mvc/application/controllers/LocaleController.php:90 +#: airtime_mvc/application/models/Block.php:1367 +#: airtime_mvc/application/services/HistoryService.php:1118 +msgid "Year" +msgstr "年代" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 -msgid "Uptime" -msgstr "在线时间" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 +#: airtime_mvc/application/controllers/LocaleController.php:141 +#: airtime_mvc/application/models/Block.php:1371 +msgid "Select modifier" +msgstr "选择æ“作符" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 -msgid "CPU" -msgstr "处ç†å™¨" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 +#: airtime_mvc/application/controllers/LocaleController.php:142 +#: airtime_mvc/application/models/Block.php:1372 +msgid "contains" +msgstr "包å«" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 -msgid "Memory" -msgstr "内存" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 +#: airtime_mvc/application/controllers/LocaleController.php:143 +#: airtime_mvc/application/models/Block.php:1373 +msgid "does not contain" +msgstr "ä¸åŒ…å«" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 -msgid "Airtime Version" -msgstr "Airtime版本" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 +#: airtime_mvc/application/controllers/LocaleController.php:144 +#: airtime_mvc/application/models/Block.php:1374 +#: airtime_mvc/application/models/Block.php:1378 +msgid "is" +msgstr "是" -#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 -msgid "Disk Space" -msgstr "ç£ç›˜ç©ºé—´" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 +#: airtime_mvc/application/controllers/LocaleController.php:145 +#: airtime_mvc/application/models/Block.php:1375 +#: airtime_mvc/application/models/Block.php:1379 +msgid "is not" +msgstr "ä¸æ˜¯" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 -#: airtime_mvc/application/views/scripts/library/library.phtml:3 -msgid "File import in progress..." -msgstr "导入文件进行中..." +#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 +#: airtime_mvc/application/controllers/LocaleController.php:146 +#: airtime_mvc/application/models/Block.php:1376 +msgid "starts with" +msgstr "起始于" -#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 -#: airtime_mvc/application/views/scripts/library/library.phtml:10 -msgid "Advanced Search Options" -msgstr "高级查询选项" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 +#: airtime_mvc/application/controllers/LocaleController.php:147 +#: airtime_mvc/application/models/Block.php:1377 +msgid "ends with" +msgstr "结æŸäºŽ" -#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 -msgid "Listener Count Over Time" -msgstr "å¬ä¼—统计报告" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 +#: airtime_mvc/application/controllers/LocaleController.php:148 +#: airtime_mvc/application/models/Block.php:1380 +msgid "is greater than" +msgstr "大于" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 -msgid "New" -msgstr "新建" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 +#: airtime_mvc/application/controllers/LocaleController.php:149 +#: airtime_mvc/application/models/Block.php:1381 +msgid "is less than" +msgstr "å°äºŽ" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 -msgid "New Playlist" -msgstr "新建播放列表" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 +#: airtime_mvc/application/controllers/LocaleController.php:150 +#: airtime_mvc/application/models/Block.php:1382 +msgid "is in the range" +msgstr "处于" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 -msgid "New Smart Block" -msgstr "新建智能模å—" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 +msgid "hours" +msgstr "å°æ—¶" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 -msgid "New Webstream" -msgstr "新建网络æµåª’体" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 +msgid "minutes" +msgstr "分钟" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 -msgid "View / edit description" -msgstr "查看/编辑æè¿°" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 +#: airtime_mvc/application/models/Block.php:333 +msgid "items" +msgstr "个数" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:41 -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:55 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:57 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:162 -msgid "Description" -msgstr "æè¿°" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 +msgid "Set smart block type:" +msgstr "设置智能模å—类型:" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 -msgid "Stream URL:" -msgstr "æµçš„链接地å€ï¼š" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 +msgid "Static" +msgstr "é™æ€" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 -msgid "Default Length:" -msgstr "默认长度:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 +msgid "Dynamic" +msgstr "动æ€" -#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 -msgid "No webstream" -msgstr "没有网络æµåª’体" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 +msgid "Allow Repeat Tracks:" +msgstr "å…许é‡å¤é€‰æ‹©æ­Œæ›²ï¼š" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -msgid "Empty playlist content" -msgstr "播放列表无内容" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 +msgid "Limit to" +msgstr "é™åˆ¶åœ¨" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Clear" -msgstr "清除" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 +msgid "Generate playlist content and save criteria" +msgstr "ä¿å­˜æ¡ä»¶è®¾ç½®å¹¶ç”Ÿæˆæ’­æ”¾åˆ—表内容" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 -msgid "Shuffle playlist" -msgstr "éšæœºæ‰“乱播放列表" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 +msgid "Generate" +msgstr "开始生æˆ" + +#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 +msgid "Shuffle playlist content" +msgstr "éšæœºæ‰“乱歌曲次åº" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 #: airtime_mvc/application/forms/SmartBlockCriteria.php:334 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 msgid "Shuffle" msgstr "éšæœº" -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 -msgid "Save playlist" -msgstr "ä¿å­˜æ’­æ”¾åˆ—表" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 -msgid "Playlist crossfade" -msgstr "播放列表交错淡入淡出效果" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -msgid "Fade in: " -msgstr "淡入:" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "Fade out: " -msgstr "淡出:" - -#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 -msgid "No open playlist" -msgstr "没有打开的播放列表" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 -msgid "Show Waveform" -msgstr "显示波形图" - -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 -#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 -msgid "(ss.t)" -msgstr "(秒.分秒)" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 -msgid "Empty smart block content" -msgstr "智能模å—无内容" - -#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 -msgid "No open smart block" -msgstr "没有打开的智能模å—" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -msgid "Cue In: " -msgstr "切入:" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "(hh:mm:ss.t)" -msgstr "(时:分:秒.分秒)" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 -msgid "Cue Out: " -msgstr "切出:" - -#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 -msgid "Original Length:" -msgstr "原始长度:" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 -msgid "Expand Static Block" -msgstr "展开é™æ€æ™ºèƒ½æ¨¡å—" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 -msgid "Expand Dynamic Block" -msgstr "展开动æ€æ™ºèƒ½æ¨¡å—" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 -msgid "Empty smart block" -msgstr "无内容的智能模å—" - -#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 -msgid "Empty playlist" -msgstr "无内容的播放列表" - -#: airtime_mvc/application/views/scripts/error/error.phtml:6 -msgid "Zend Framework Default Application" -msgstr "Zend框架默认程åº" - -#: airtime_mvc/application/views/scripts/error/error.phtml:10 -msgid "Page not found!" -msgstr "页é¢ä¸å­˜åœ¨ï¼" - -#: airtime_mvc/application/views/scripts/error/error.phtml:11 -msgid "Looks like the page you were looking for doesn't exist!" -msgstr "你所寻找的页é¢ä¸å­˜åœ¨ï¼" - -#: airtime_mvc/application/views/scripts/error/error.phtml:13 -#: airtime_mvc/application/configs/navigation.php:113 -msgid "Help" -msgstr "帮助" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 -msgid "previous" -msgstr "å¾€å‰" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 -msgid "play" -msgstr "播放" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 -msgid "pause" -msgstr "æš‚åœ" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 -msgid "next" -msgstr "å¾€åŽ" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 -msgid "stop" -msgstr "åœæ­¢" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 -msgid "max volume" -msgstr "最大音é‡" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 -msgid "Update Required" -msgstr "需è¦æ›´æ–°å‡çº§" - -#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 -#, php-format -msgid "" -"To play the media you will need to either update your browser to a recent " -"version or update your %sFlash plugin%s." -msgstr "想è¦æ’­æ”¾åª’体,需è¦æ›´æ–°ä½ çš„æµè§ˆå™¨åˆ°æœ€æ–°çš„版本,或者更新你的%sFalshæ’件%s。" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 -msgid "Creating File Summary Template" -msgstr "创建文件播放记录模æ¿" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 -msgid "Creating Log Sheet Template" -msgstr "创建历å²è®°å½•è¡¨å•æ¨¡æ¿" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:9 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:153 -msgid "Name" -msgstr "åå­—" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 -msgid "Add more elements" -msgstr "增加更多元素" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 -msgid "Add New Field" -msgstr "添加新项目" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 -msgid "Set Default Template" -msgstr "设为默认模æ¿" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 -msgid "Log Sheet Templates" -msgstr "历å²è®°å½•è¡¨å•æ¨¡æ¿" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 -msgid "No Log Sheet Templates" -msgstr "无历å²è®°å½•è¡¨å•æ¨¡æ¿" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 -#: airtime_mvc/application/controllers/LocaleController.php:388 -msgid "Set Default" -msgstr "设为默认" - -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 -msgid "New Log Sheet Template" -msgstr "新建历å²è®°å½•æ¨¡æ¿" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 +msgid "Limit cannot be empty or smaller than 0" +msgstr "é™åˆ¶çš„设置ä¸èƒ½æ¯”0å°" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 -msgid "File Summary Templates" -msgstr "文件播放记录模æ¿åˆ—表" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 +msgid "Limit cannot be more than 24 hrs" +msgstr "é™åˆ¶çš„设置ä¸èƒ½å¤§äºŽ24å°æ—¶" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 -msgid "No File Summary Templates" -msgstr "无文件播放记录模æ¿" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 +msgid "The value should be an integer" +msgstr "值åªèƒ½ä¸ºæ•´æ•°" -#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 -msgid "New File Summary Template" -msgstr "新建文件播放记录模æ¿" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 +msgid "500 is the max item limit value you can set" +msgstr "最多åªèƒ½å…许500æ¡å†…容" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 -msgid "Manage Users" -msgstr "用户管ç†" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 +msgid "You must select Criteria and Modifier" +msgstr "æ¡ä»¶å’Œæ“作符ä¸èƒ½ä¸ºç©º" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 -msgid "New User" -msgstr "新建用户" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 +msgid "'Length' should be in '00:00:00' format" +msgstr "‘长度’格å¼åº”该为‘00:00:00’" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 -msgid "id" -msgstr "ç¼–å·" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 +#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 +msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)" +msgstr "时间格å¼é”™è¯¯ï¼Œåº”该为形如0000-00-00 或 0000-00-00 00:00:00çš„æ ¼å¼" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:18 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:183 -#: airtime_mvc/application/forms/PasswordRestore.php:25 -msgid "Username" -msgstr "用户å" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 +msgid "The value has to be numeric" +msgstr "应该为数字" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 -msgid "First Name" -msgstr "å" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 +msgid "The value should be less then 2147483648" +msgstr "ä¸èƒ½å¤§äºŽ2147483648" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 -msgid "Last Name" -msgstr "姓" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 +#, php-format +msgid "The value should be less than %s characters" +msgstr "ä¸èƒ½å°äºŽ%s个字符" -#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 -msgid "User Type" -msgstr "用户类型" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 +msgid "Value cannot be empty" +msgstr "ä¸èƒ½ä¸ºç©º" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:9 -#: airtime_mvc/application/forms/EditAudioMD.php:19 -msgid "Title:" -msgstr "歌曲å:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 +msgid "Auto Switch Off" +msgstr "当输入æµæ–­å¼€æ—¶è‡ªåŠ¨å…³é—­" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:10 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:34 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:148 -#: airtime_mvc/application/forms/EditAudioMD.php:26 -msgid "Creator:" -msgstr "作者:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 +msgid "Auto Switch On" +msgstr "当输入æµè¿žæŽ¥æ—¶è‡ªåŠ¨æ‰“å¼€" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:11 -#: airtime_mvc/application/forms/EditAudioMD.php:33 -msgid "Album:" -msgstr "专辑å:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 +msgid "Switch Transition Fade (s)" +msgstr "切æ¢æ—¶çš„淡入淡出效果(秒)" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12 -#: airtime_mvc/application/forms/EditAudioMD.php:40 -msgid "Track:" -msgstr "曲目编å·ï¼š" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 +msgid "enter a time in seconds 00{.000000}" +msgstr "请输入秒数00{.000000}" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 -msgid "Length:" -msgstr "长度:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 +msgid "Master Username" +msgstr "主输入æµçš„用户å" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 -msgid "Sample Rate:" -msgstr "样本率:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 +msgid "Master Password" +msgstr "主输入æµçš„密ç " -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:67 -msgid "Bit Rate:" -msgstr "比特率:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 +msgid "Master Source Connection URL" +msgstr "主输入æµçš„链接地å€" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:16 -#: airtime_mvc/application/forms/EditAudioMD.php:88 -msgid "Mood:" -msgstr "情怀:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 +msgid "Show Source Connection URL" +msgstr "节目定制输入æµçš„链接地å€" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:17 -#: airtime_mvc/application/forms/AddShowWhat.php:45 -#: airtime_mvc/application/forms/EditAudioMD.php:47 -msgid "Genre:" -msgstr "风格:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 +msgid "Master Source Port" +msgstr "主输入æµçš„端å£" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18 -#: airtime_mvc/application/forms/EditAudioMD.php:55 -msgid "Year:" -msgstr "年份:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 +msgid "Master Source Mount Point" +msgstr "主输入æµçš„加载点" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:19 -#: airtime_mvc/application/forms/EditAudioMD.php:67 -msgid "Label:" -msgstr "标签:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 +msgid "Show Source Port" +msgstr "节目定制输入æµçš„端å£" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:20 -#: airtime_mvc/application/forms/EditAudioMD.php:96 -msgid "BPM:" -msgstr "æ‹å­ï¼ˆBPM):" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 +msgid "Show Source Mount Point" +msgstr "节目定制输入æµçš„加载点" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:21 -#: airtime_mvc/application/forms/EditAudioMD.php:74 -msgid "Composer:" -msgstr "编曲:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 +msgid "You cannot use same port as Master DJ port." +msgstr "端å£è®¾ç½®ä¸èƒ½é‡å¤" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:22 -#: airtime_mvc/application/forms/EditAudioMD.php:81 -msgid "Conductor:" -msgstr "制作:" +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 +#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 +#, php-format +msgid "Port %s is not available" +msgstr "%s端å£å·²è¢«å ç”¨" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:23 -#: airtime_mvc/application/forms/EditAudioMD.php:105 -msgid "Copyright:" -msgstr "版æƒï¼š" +#: airtime_mvc/application/forms/SupportSettings.php:34 +#: airtime_mvc/application/forms/RegisterAirtime.php:39 +msgid "Phone:" +msgstr "电è¯ï¼š" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 -msgid "Isrc Number:" -msgstr "ISRCç¼–å·ï¼š" +#: airtime_mvc/application/forms/SupportSettings.php:57 +#: airtime_mvc/application/forms/RegisterAirtime.php:62 +msgid "Station Web Site:" +msgstr "电å°ç½‘å€ï¼š" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25 -#: airtime_mvc/application/forms/EditAudioMD.php:119 -msgid "Website:" -msgstr "网站:" +#: airtime_mvc/application/forms/SupportSettings.php:68 +#: airtime_mvc/application/forms/RegisterAirtime.php:73 +msgid "Country:" +msgstr "国家:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:26 -#: airtime_mvc/application/forms/Login.php:48 -#: airtime_mvc/application/forms/EditUser.php:114 -#: airtime_mvc/application/forms/EditAudioMD.php:126 -msgid "Language:" -msgstr "语言:" +#: airtime_mvc/application/forms/SupportSettings.php:79 +#: airtime_mvc/application/forms/RegisterAirtime.php:84 +msgid "City:" +msgstr "城市:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 -msgid "File Path:" -msgstr "文件路径:" +#: airtime_mvc/application/forms/SupportSettings.php:91 +#: airtime_mvc/application/forms/RegisterAirtime.php:96 +msgid "Station Description:" +msgstr "电å°æ述:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 -#: airtime_mvc/application/forms/AddShowWhat.php:26 -msgid "Name:" -msgstr "å字:" +#: airtime_mvc/application/forms/SupportSettings.php:101 +#: airtime_mvc/application/forms/RegisterAirtime.php:106 +msgid "Station Logo:" +msgstr "电å°æ ‡å¿—:" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 -#: airtime_mvc/application/forms/AddShowWhat.php:54 -msgid "Description:" -msgstr "æ述:" +#: airtime_mvc/application/forms/SupportSettings.php:112 +#: airtime_mvc/application/forms/RegisterAirtime.php:116 +#: airtime_mvc/application/controllers/LocaleController.php:332 +msgid "Send support feedback" +msgstr "æ交å馈æ„è§" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 -msgid "Web Stream" -msgstr "网络æµåª’体" +#: airtime_mvc/application/forms/SupportSettings.php:122 +#: airtime_mvc/application/forms/RegisterAirtime.php:126 +msgid "Promote my station on Sourcefabric.org" +msgstr "在Sourcefabric.org上推广我的电å°" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 -msgid "Dynamic Smart Block" -msgstr "动æ€æ™ºèƒ½æ¨¡å—" +#: airtime_mvc/application/forms/SupportSettings.php:148 +#: airtime_mvc/application/forms/RegisterAirtime.php:149 +#, php-format +msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." +msgstr "我åŒæ„Sourcefabricçš„%séšç§ç­–ç•¥%s" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 -msgid "Static Smart Block" -msgstr "é™æ€æ™ºèƒ½æ¨¡å—" +#: airtime_mvc/application/forms/SupportSettings.php:171 +#: airtime_mvc/application/forms/RegisterAirtime.php:166 +msgid "You have to agree to privacy policy." +msgstr "请先接å—éšç§ç­–ç•¥" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 -msgid "Audio Track" -msgstr "音频文件" +#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 +msgid "Value is required and can't be empty" +msgstr "ä¸èƒ½ä¸ºç©º" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 -msgid "Playlist Contents: " -msgstr "播放列表内容:" +#: airtime_mvc/application/forms/EditHistoryItem.php:32 +#: airtime_mvc/application/services/HistoryService.php:1146 +msgid "Start Time" +msgstr "开始时间" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 -msgid "Static Smart Block Contents: " -msgstr "é™æ€æ™ºèƒ½æ¨¡å—æ¡ä»¶ï¼š" +#: airtime_mvc/application/forms/EditHistoryItem.php:44 +#: airtime_mvc/application/services/HistoryService.php:1147 +msgid "End Time" +msgstr "结æŸæ—¶é—´" + +#: airtime_mvc/application/forms/EditHistoryItem.php:57 +#: airtime_mvc/application/controllers/LocaleController.php:391 +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:53 +msgid "No Show" +msgstr "无节目" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 -msgid "Dynamic Smart Block Criteria: " -msgstr "动æ€æ™ºèƒ½æ¨¡å—æ¡ä»¶ï¼š" +#: airtime_mvc/application/forms/AddShowRR.php:10 +msgid "Record from Line In?" +msgstr "从线路输入录制?" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 -msgid "Limit to " -msgstr "é™åˆ¶åˆ°" +#: airtime_mvc/application/forms/AddShowRR.php:16 +msgid "Rebroadcast?" +msgstr "é‡æ’­ï¼Ÿ" -#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 -#: airtime_mvc/application/forms/AddShowWhat.php:36 -msgid "URL:" -msgstr "链接地å€ï¼š" +#: airtime_mvc/application/forms/AddShowLiveStream.php:10 +msgid "Use Airtime Authentication:" +msgstr "使用Airtime的用户认è¯ï¼š" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 -msgid "Log Sheet" -msgstr "历å²è®°å½•è¡¨å•" +#: airtime_mvc/application/forms/AddShowLiveStream.php:16 +msgid "Use Custom Authentication:" +msgstr "使用自定义的用户认è¯ï¼š" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 -msgid "File Summary" -msgstr "文件播放记录" +#: airtime_mvc/application/forms/AddShowLiveStream.php:26 +msgid "Custom Username" +msgstr "自定义用户å" -#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 -msgid "Show Summary" -msgstr "节目播放记录" +#: airtime_mvc/application/forms/AddShowLiveStream.php:39 +msgid "Custom Password" +msgstr "自定义密ç " -#: airtime_mvc/application/models/Show.php:180 -msgid "Shows can have a max length of 24 hours." -msgstr "节目时长åªèƒ½è®¾ç½®åœ¨24å°æ—¶ä»¥å†…" +#: airtime_mvc/application/forms/AddShowLiveStream.php:63 +msgid "Username field cannot be empty." +msgstr "请填写用户å" -#: airtime_mvc/application/models/Show.php:278 -#: airtime_mvc/application/forms/AddShowWhen.php:141 -msgid "End date/time cannot be in the past" -msgstr "节目结æŸçš„时间或日期ä¸èƒ½è®¾ç½®ä¸ºè¿‡åŽ»çš„时间" +#: airtime_mvc/application/forms/AddShowLiveStream.php:68 +msgid "Password field cannot be empty." +msgstr "请填写密ç " -#: airtime_mvc/application/models/Show.php:289 -msgid "" -"Cannot schedule overlapping shows.\n" -"Note: Resizing a repeating show affects all of its repeats." -msgstr "节目时间设置于其他的节目有冲çªã€‚\næ示:修改系列节目中的一个,将影å“整个节目系列" +#: airtime_mvc/application/forms/PasswordRestore.php:14 +msgid "E-mail" +msgstr "电邮地å€" -#: airtime_mvc/application/models/ShowInstance.php:257 -msgid "can't resize a past show" -msgstr "已结æŸçš„节目ä¸èƒ½è°ƒæ•´æ—¶é•¿" +#: airtime_mvc/application/forms/PasswordRestore.php:36 +msgid "Restore password" +msgstr "找回密ç " -#: airtime_mvc/application/models/ShowInstance.php:279 -msgid "Should not overlap shows" -msgstr "节目时间ä¸èƒ½æœ‰é‡åˆ" +#: airtime_mvc/application/forms/StreamSetting.php:22 +msgid "Hardware Audio Output" +msgstr "硬件声音输出" -#: airtime_mvc/application/models/Preference.php:655 -msgid "Select Country" -msgstr "选择国家" +#: airtime_mvc/application/forms/StreamSetting.php:33 +msgid "Output Type" +msgstr "输出类型" -#: airtime_mvc/application/models/MusicDir.php:160 -#, php-format -msgid "%s is already watched." -msgstr "%s å·²ç»ç›‘控" +#: airtime_mvc/application/forms/StreamSetting.php:44 +msgid "Icecast Vorbis Metadata" +msgstr "Icecastçš„Vorbis元数æ®" -#: airtime_mvc/application/models/MusicDir.php:164 -#, php-format -msgid "%s contains nested watched directory: %s" -msgstr "%s 所å«çš„å­æ–‡ä»¶å¤¹ %s å·²ç»è¢«ç›‘控" +#: airtime_mvc/application/forms/StreamSetting.php:54 +msgid "Stream Label:" +msgstr "æµæ ‡ç­¾ï¼š" -#: airtime_mvc/application/models/MusicDir.php:168 -#, php-format -msgid "%s is nested within existing watched directory: %s" -msgstr "%s 无法监控,因为父文件夹 %s å·²ç»ç›‘控" +#: airtime_mvc/application/forms/StreamSetting.php:55 +msgid "Artist - Title" +msgstr "歌手 - æ­Œå" -#: airtime_mvc/application/models/MusicDir.php:189 -#: airtime_mvc/application/models/MusicDir.php:368 -#, php-format -msgid "%s is not a valid directory." -msgstr "%s ä¸æ˜¯æ–‡ä»¶å¤¹ã€‚" +#: airtime_mvc/application/forms/StreamSetting.php:56 +msgid "Show - Artist - Title" +msgstr "节目 - 歌手 - æ­Œå" -#: airtime_mvc/application/models/MusicDir.php:232 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list" -msgstr "%s å·²ç»è®¾ç½®æˆåª’体存储文件夹,或者监控文件夹。" +#: airtime_mvc/application/forms/StreamSetting.php:57 +msgid "Station name - Show name" +msgstr "电å°å - 节目å" -#: airtime_mvc/application/models/MusicDir.php:386 -#, php-format -msgid "" -"%s is already set as the current storage dir or in the watched folders list." -msgstr "%s å·²ç»è®¾ç½®æˆåª’体存储文件夹,或者监控文件夹。" +#: airtime_mvc/application/forms/StreamSetting.php:63 +msgid "Off Air Metadata" +msgstr "éžç›´æ’­çŠ¶æ€ä¸‹çš„输出æµå…ƒæ•°æ®" -#: airtime_mvc/application/models/MusicDir.php:429 -#, php-format -msgid "%s doesn't exist in the watched list." -msgstr "监控文件夹åå•é‡Œä¸å­˜åœ¨ %s " +#: airtime_mvc/application/forms/StreamSetting.php:69 +msgid "Enable Replay Gain" +msgstr "å¯ç”¨å›žæ”¾å¢žç›Š" -#: airtime_mvc/application/models/Block.php:333 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:120 -msgid "items" -msgstr "个数" +#: airtime_mvc/application/forms/StreamSetting.php:75 +msgid "Replay Gain Modifier" +msgstr "回放增益调整" -#: airtime_mvc/application/models/Block.php:833 -#: airtime_mvc/application/models/Playlist.php:812 -msgid "Cue in and cue out are null." -msgstr "切入点和切出点å‡ä¸ºç©º" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 +msgid "'%value%' is no valid email address in the basic format local-part@hostname" +msgstr "'%value%' ä¸æ˜¯åˆæ³•çš„电邮地å€ï¼Œåº”该类似于 local-part@hostname" -#: airtime_mvc/application/models/Block.php:868 -#: airtime_mvc/application/models/Block.php:924 -#: airtime_mvc/application/models/Playlist.php:851 -#: airtime_mvc/application/models/Playlist.php:895 -msgid "Can't set cue out to be greater than file length." -msgstr "切出点ä¸èƒ½è¶…出文件原长度" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 +msgid "'%value%' does not fit the date format '%format%'" +msgstr "'%value%' ä¸ç¬¦åˆæ ¼å¼è¦æ±‚: '%format%'" -#: airtime_mvc/application/models/Block.php:879 -#: airtime_mvc/application/models/Block.php:900 -#: airtime_mvc/application/models/Playlist.php:843 -#: airtime_mvc/application/models/Playlist.php:868 -msgid "Can't set cue in to be larger than cue out." -msgstr "切入点ä¸èƒ½æ™šäºŽåˆ‡å‡ºç‚¹" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 +msgid "'%value%' is less than %min% characters long" +msgstr "'%value%' å°äºŽæœ€å°é•¿åº¦è¦æ±‚ %min% " -#: airtime_mvc/application/models/Block.php:935 -#: airtime_mvc/application/models/Playlist.php:887 -msgid "Can't set cue out to be smaller than cue in." -msgstr "切出点ä¸èƒ½æ—©äºŽåˆ‡å…¥ç‚¹" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 +msgid "'%value%' is more than %max% characters long" +msgstr "'%value%' 大于最大长度è¦æ±‚ %max%" -#: airtime_mvc/application/models/Block.php:1340 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:48 -msgid "Select criteria" -msgstr "选择属性" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 +msgid "'%value%' is not between '%min%' and '%max%', inclusively" +msgstr "'%value%' 应该介于 '%min%' å’Œ '%max%'之间" -#: airtime_mvc/application/models/Block.php:1342 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:50 -msgid "Bit Rate (Kbps)" -msgstr "比特率(Kbps)" +#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 +msgid "Passwords do not match" +msgstr "两次密ç è¾“å…¥ä¸åŒ¹é…" -#: airtime_mvc/application/models/Block.php:1343 -#: airtime_mvc/application/controllers/LocaleController.php:70 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:51 -msgid "BPM" -msgstr "æ¯åˆ†é’Ÿæ‹å­æ•°" +#: airtime_mvc/application/forms/AddShowWhen.php:16 +msgid "'%value%' does not fit the time format 'HH:mm'" +msgstr "'%value%' ä¸ç¬¦åˆå½¢å¦‚ 'å°æ—¶:分'çš„æ ¼å¼è¦æ±‚,例如,‘01:59’" -#: airtime_mvc/application/models/Block.php:1350 -#: airtime_mvc/application/controllers/LocaleController.php:74 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:58 -msgid "Encoded By" -msgstr "编曲" +#: airtime_mvc/application/forms/AddShowWhen.php:22 +msgid "Date/Time Start:" +msgstr "开始日期/时间" -#: airtime_mvc/application/models/Block.php:1355 -#: airtime_mvc/application/controllers/LocaleController.php:79 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:63 -msgid "Last Modified" -msgstr "最近更新于" +#: airtime_mvc/application/forms/AddShowWhen.php:49 +msgid "Date/Time End:" +msgstr "结æŸæ—¥æœŸ/时间" -#: airtime_mvc/application/models/Block.php:1356 -#: airtime_mvc/application/controllers/LocaleController.php:80 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:64 -msgid "Last Played" -msgstr "上次播放于" +#: airtime_mvc/application/forms/AddShowWhen.php:74 +msgid "Duration:" +msgstr "时长:" -#: airtime_mvc/application/models/Block.php:1358 -#: airtime_mvc/application/controllers/LocaleController.php:82 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:66 -msgid "Mime" -msgstr "MIMEä¿¡æ¯" +#: airtime_mvc/application/forms/AddShowWhen.php:83 +msgid "Timezone:" +msgstr "时区" -#: airtime_mvc/application/models/Block.php:1360 -#: airtime_mvc/application/controllers/LocaleController.php:84 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:68 -msgid "Owner" -msgstr "所有者" +#: airtime_mvc/application/forms/AddShowWhen.php:92 +msgid "Repeats?" +msgstr "是å¦è®¾ç½®ä¸ºç³»åˆ—节目?" -#: airtime_mvc/application/models/Block.php:1361 -#: airtime_mvc/application/controllers/LocaleController.php:85 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:69 -msgid "Replay Gain" -msgstr "回放增益" +#: airtime_mvc/application/forms/AddShowWhen.php:124 +msgid "Cannot create show in the past" +msgstr "节目ä¸èƒ½è®¾ç½®ä¸ºè¿‡åŽ»çš„时间" -#: airtime_mvc/application/models/Block.php:1362 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:70 -msgid "Sample Rate (kHz)" -msgstr "样本率(KHz)" +#: airtime_mvc/application/forms/AddShowWhen.php:132 +msgid "Cannot modify start date/time of the show that is already started" +msgstr "节目已ç»å¯åŠ¨ï¼Œæ— æ³•ä¿®æ”¹å¼€å§‹æ—¶é—´/日期" -#: airtime_mvc/application/models/Block.php:1364 -#: airtime_mvc/application/controllers/LocaleController.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:72 -msgid "Track Number" -msgstr "曲目" +#: airtime_mvc/application/forms/AddShowWhen.php:141 +#: airtime_mvc/application/models/Show.php:278 +msgid "End date/time cannot be in the past" +msgstr "节目结æŸçš„时间或日期ä¸èƒ½è®¾ç½®ä¸ºè¿‡åŽ»çš„时间" -#: airtime_mvc/application/models/Block.php:1365 -#: airtime_mvc/application/controllers/LocaleController.php:88 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:73 -msgid "Uploaded" -msgstr "上传于" +#: airtime_mvc/application/forms/AddShowWhen.php:149 +msgid "Cannot have duration < 0m" +msgstr "节目时长ä¸èƒ½å°äºŽ0" -#: airtime_mvc/application/models/Block.php:1366 -#: airtime_mvc/application/controllers/LocaleController.php:89 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:74 -msgid "Website" -msgstr "网å€" +#: airtime_mvc/application/forms/AddShowWhen.php:153 +msgid "Cannot have duration 00h 00m" +msgstr "节目时长ä¸èƒ½ä¸º0" -#: airtime_mvc/application/models/Block.php:1371 -#: airtime_mvc/application/controllers/LocaleController.php:141 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:87 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:103 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:251 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:366 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:404 -msgid "Select modifier" -msgstr "选择æ“作符" +#: airtime_mvc/application/forms/AddShowWhen.php:160 +msgid "Cannot have duration greater than 24h" +msgstr "节目时长ä¸èƒ½è¶…过24å°æ—¶" -#: airtime_mvc/application/models/Block.php:1372 -#: airtime_mvc/application/controllers/LocaleController.php:142 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:88 -msgid "contains" -msgstr "包å«" +#: airtime_mvc/application/forms/AddShowWhen.php:287 +#: airtime_mvc/application/forms/AddShowWhen.php:301 +#: airtime_mvc/application/forms/AddShowWhen.php:325 +#: airtime_mvc/application/forms/AddShowWhen.php:331 +#: airtime_mvc/application/forms/AddShowWhen.php:336 +#: airtime_mvc/application/services/CalendarService.php:305 +msgid "Cannot schedule overlapping shows" +msgstr "节目时间设置与其他节目有冲çª" -#: airtime_mvc/application/models/Block.php:1373 -#: airtime_mvc/application/controllers/LocaleController.php:143 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:89 -msgid "does not contain" -msgstr "ä¸åŒ…å«" +#: airtime_mvc/application/forms/AddShowWhat.php:26 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:33 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:146 +msgid "Name:" +msgstr "å字:" -#: airtime_mvc/application/models/Block.php:1374 -#: airtime_mvc/application/models/Block.php:1378 -#: airtime_mvc/application/controllers/LocaleController.php:144 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:90 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:104 -msgid "is" -msgstr "是" +#: airtime_mvc/application/forms/AddShowWhat.php:30 +msgid "Untitled Show" +msgstr "未命å节目" -#: airtime_mvc/application/models/Block.php:1375 -#: airtime_mvc/application/models/Block.php:1379 -#: airtime_mvc/application/controllers/LocaleController.php:145 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:91 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:105 -msgid "is not" -msgstr "ä¸æ˜¯" +#: airtime_mvc/application/forms/AddShowWhat.php:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:150 +msgid "URL:" +msgstr "链接地å€ï¼š" -#: airtime_mvc/application/models/Block.php:1376 -#: airtime_mvc/application/controllers/LocaleController.php:146 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:92 -msgid "starts with" -msgstr "起始于" +#: airtime_mvc/application/forms/AddShowWhat.php:54 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:40 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:149 +msgid "Description:" +msgstr "æ述:" -#: airtime_mvc/application/models/Block.php:1377 -#: airtime_mvc/application/controllers/LocaleController.php:147 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:93 -msgid "ends with" -msgstr "结æŸäºŽ" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 +msgid "Automatically Upload Recorded Shows" +msgstr "自动上传录制节目的内容" -#: airtime_mvc/application/models/Block.php:1380 -#: airtime_mvc/application/controllers/LocaleController.php:148 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:106 -msgid "is greater than" -msgstr "大于" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 +msgid "Enable SoundCloud Upload" +msgstr "å¯ç”¨ä¸Šä¼ åˆ°SoundCloud功能" -#: airtime_mvc/application/models/Block.php:1381 -#: airtime_mvc/application/controllers/LocaleController.php:149 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:107 -msgid "is less than" -msgstr "å°äºŽ" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 +msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" +msgstr "自动把上传到SoundCloud的文件标识为“Downloadableâ€" -#: airtime_mvc/application/models/Block.php:1382 -#: airtime_mvc/application/controllers/LocaleController.php:150 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:108 -msgid "is in the range" -msgstr "处于" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 +msgid "SoundCloud Email" +msgstr "SoundCloud邮件地å€" -#: airtime_mvc/application/models/Webstream.php:157 -msgid "Length needs to be greater than 0 minutes" -msgstr "节目时长必须大于0分钟" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 +msgid "SoundCloud Password" +msgstr "SoundCloud密ç " -#: airtime_mvc/application/models/Webstream.php:162 -msgid "Length should be of form \"00h 00m\"" -msgstr "时间的格å¼åº”该是 \"00h 00m\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 +msgid "SoundCloud Tags: (separate tags with spaces)" +msgstr "SoundCloud标签:(以空格分隔ä¸åŒæ ‡ç­¾ï¼‰" -#: airtime_mvc/application/models/Webstream.php:175 -msgid "URL should be of form \"http://domain\"" -msgstr "地å€çš„æ ¼å¼åº”该是 \"http://domain\"" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 +msgid "Default Genre:" +msgstr "默认风格:" -#: airtime_mvc/application/models/Webstream.php:178 -msgid "URL should be 512 characters or less" -msgstr "地å€çš„最大长度ä¸èƒ½è¶…过512字节" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 +msgid "Default Track Type:" +msgstr "默认声音文件类型:" -#: airtime_mvc/application/models/Webstream.php:184 -msgid "No MIME type found for webstream." -msgstr "这个媒体æµä¸å­˜åœ¨MIME属性,无法添加" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 +msgid "Original" +msgstr "原版" -#: airtime_mvc/application/models/Webstream.php:200 -msgid "Webstream name cannot be empty" -msgstr "媒体æµçš„åå­—ä¸èƒ½ä¸ºç©º" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 +msgid "Remix" +msgstr "é‡ç¼–版" -#: airtime_mvc/application/models/Webstream.php:269 -msgid "Could not parse XSPF playlist" -msgstr "å‘现XSPFæ ¼å¼çš„播放列表,但是格å¼é”™è¯¯" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 +msgid "Live" +msgstr "实况" -#: airtime_mvc/application/models/Webstream.php:281 -msgid "Could not parse PLS playlist" -msgstr "å‘现PLSæ ¼å¼çš„播放列表,但是格å¼é”™è¯¯" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 +msgid "Recording" +msgstr "录制" -#: airtime_mvc/application/models/Webstream.php:300 -msgid "Could not parse M3U playlist" -msgstr "å‘现M3Uæ ¼å¼çš„播放列表,但是格å¼é”™è¯¯" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 +msgid "Spoken" +msgstr "è°ˆè¯" -#: airtime_mvc/application/models/Webstream.php:314 -msgid "Invalid webstream - This appears to be a file download." -msgstr "媒体æµæ ¼å¼é”™è¯¯ï¼Œå½“å‰â€œåª’体æµâ€åªæ˜¯ä¸€ä¸ªå¯ä¸‹è½½çš„文件" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 +msgid "Podcast" +msgstr "播客" -#: airtime_mvc/application/models/Webstream.php:318 -#, php-format -msgid "Unrecognized stream type: %s" -msgstr "未知的媒体æµæ ¼å¼ï¼š %s" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 +msgid "Demo" +msgstr "å°æ ·" -#: airtime_mvc/application/models/Auth.php:33 -#, php-format -msgid "" -"Hi %s, \n" -"\n" -"Click this link to reset your password: " -msgstr "%s 你好, \n\n 请点击链接以é‡ç½®ä½ çš„密ç ï¼š " +#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 +msgid "Work in progress" +msgstr "未完æˆ" -#: airtime_mvc/application/models/Auth.php:36 -msgid "Airtime Password Reset" -msgstr "Airtime密ç é‡ç½®" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 +msgid "Stem" +msgstr "主干" -#: airtime_mvc/application/models/ShowBuilder.php:212 -#, php-format -msgid "Rebroadcast of %s from %s" -msgstr "%s是%sçš„é‡æ’­" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 +msgid "Loop" +msgstr "循环" -#: airtime_mvc/application/models/Scheduler.php:73 -msgid "Cannot move items out of linked shows" -msgstr "ä¸èƒ½ä»Žç»‘定的节目系列里移出项目" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 +msgid "Sound Effect" +msgstr "声效" -#: airtime_mvc/application/models/Scheduler.php:119 -msgid "The schedule you're viewing is out of date! (sched mismatch)" -msgstr "当å‰èŠ‚目内容表(内容部分)需è¦åˆ·æ–°" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 +msgid "One Shot Sample" +msgstr "样本" -#: airtime_mvc/application/models/Scheduler.php:124 -msgid "The schedule you're viewing is out of date! (instance mismatch)" -msgstr "当å‰èŠ‚目内容表(节目已更改)需è¦åˆ·æ–°" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 +msgid "Other" +msgstr "其他" -#: airtime_mvc/application/models/Scheduler.php:132 -#: airtime_mvc/application/models/Scheduler.php:444 -#: airtime_mvc/application/models/Scheduler.php:482 -msgid "The schedule you're viewing is out of date!" -msgstr "当å‰èŠ‚目内容需è¦åˆ·æ–°ï¼" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 +msgid "Default License:" +msgstr "默认版æƒç­–略:" -#: airtime_mvc/application/models/Scheduler.php:142 -#, php-format -msgid "You are not allowed to schedule show %s." -msgstr "没有赋予修改节目 %s çš„æƒé™ã€‚" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 +msgid "The work is in the public domain" +msgstr "公开" -#: airtime_mvc/application/models/Scheduler.php:146 -msgid "You cannot add files to recording shows." -msgstr "录音节目ä¸èƒ½æ·»åŠ åˆ«çš„内容。" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 +msgid "All rights are reserved" +msgstr "版æƒæ‰€æœ‰" -#: airtime_mvc/application/models/Scheduler.php:152 -#, php-format -msgid "The show %s is over and cannot be scheduled." -msgstr "节目%s已结æŸï¼Œä¸èƒ½åœ¨æ·»åŠ ä»»ä½•å†…容。" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 +msgid "Creative Commons Attribution" +msgstr "知识共享署å" -#: airtime_mvc/application/models/Scheduler.php:159 -#, php-format -msgid "The show %s has been previously updated!" -msgstr "节目%så·²ç»æ›´æ”¹ï¼Œéœ€è¦åˆ·æ–°åŽå†å°è¯•ã€‚" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 +msgid "Creative Commons Attribution Noncommercial" +msgstr "知识共享署å-éžå•†ä¸šåº”用" -#: airtime_mvc/application/models/Scheduler.php:178 -msgid "" -"Content in linked shows must be scheduled before or after any one is " -"broadcasted" -msgstr "绑定的节目è¦ä¹ˆæå‰è®¾ç½®å¥½ï¼Œè¦ä¹ˆç­‰å¾…其中的任何一个节目结æŸåŽæ‰èƒ½ç¼–辑内容" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 +msgid "Creative Commons Attribution No Derivative Works" +msgstr "知识共享署å-ä¸å…许è¡ç”Ÿ" -#: airtime_mvc/application/models/Scheduler.php:200 -#: airtime_mvc/application/models/Scheduler.php:289 -msgid "A selected File does not exist!" -msgstr "æŸä¸ªé€‰ä¸­çš„文件ä¸å­˜åœ¨ã€‚" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 +msgid "Creative Commons Attribution Share Alike" +msgstr "知识共享署å-相åŒæ–¹å¼å…±äº«" -#: airtime_mvc/application/models/StoredFile.php:1003 -msgid "Failed to create 'organize' directory." -msgstr "创建‘organize’目录失败" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 +msgid "Creative Commons Attribution Noncommercial Non Derivate Works" +msgstr "知识共享署å-éžå•†ä¸šåº”用且ä¸å…许è¡ç”Ÿ" -#: airtime_mvc/application/models/StoredFile.php:1017 -#, php-format -msgid "" -"The file was not uploaded, there is %s MB of disk space left and the file " -"you are uploading has a size of %s MB." -msgstr "ç£ç›˜ç©ºé—´ä¸è¶³ï¼Œæ–‡ä»¶ä¸Šä¼ å¤±è´¥ï¼Œå‰©ä½™ç©ºé—´åªæœ‰ %s 兆,å°è¯•ä¸Šä¼  %s 兆的文件" +#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 +msgid "Creative Commons Attribution Noncommercial Share Alike" +msgstr "知识共享署å-éžå•†ä¸šåº”用且相åŒæ–¹å¼å…±äº«" -#: airtime_mvc/application/models/StoredFile.php:1026 -msgid "" -"This file appears to be corrupted and will not be added to media library." -msgstr "媒体文件ä¸ç¬¦åˆåª’体库è¦æ±‚或者已ç»æŸå,该文件将ä¸ä¼šä¸Šä¼ åˆ°åª’体库" +#: airtime_mvc/application/forms/EditUser.php:121 +msgid "Interface Timezone:" +msgstr "用户界é¢ä½¿ç”¨çš„时区:" -#: airtime_mvc/application/models/StoredFile.php:1065 -msgid "" -"The file was not uploaded, this error can occur if the computer hard drive " -"does not have enough disk space or the stor directory does not have correct " -"write permissions." -msgstr "文件上传失败,å¯èƒ½çš„原因:ç£ç›˜ç©ºé—´ä¸è¶³ç›®å½•æƒé™è®¾ç½®é”™è¯¯" +#: airtime_mvc/application/forms/EmailServerPreferences.php:17 +msgid "Enable System Emails (Password Reset)" +msgstr "为密ç é‡ç½®å¯ç”¨é‚®ä»¶åŠŸèƒ½" -#: airtime_mvc/application/controllers/DashboardController.php:36 -#: airtime_mvc/application/controllers/DashboardController.php:85 -msgid "You don't have permission to disconnect source." -msgstr "你没有断开输入æºçš„æƒé™ã€‚" +#: airtime_mvc/application/forms/EmailServerPreferences.php:27 +msgid "Reset Password 'From' Email" +msgstr "密ç é‡ç½®é‚®ä»¶å‘é€äºŽ" -#: airtime_mvc/application/controllers/DashboardController.php:38 -#: airtime_mvc/application/controllers/DashboardController.php:87 -msgid "There is no source connected to this input." -msgstr "没有连接上的输入æºã€‚" +#: airtime_mvc/application/forms/EmailServerPreferences.php:34 +msgid "Configure Mail Server" +msgstr "邮件æœåŠ¡å™¨" -#: airtime_mvc/application/controllers/DashboardController.php:82 -msgid "You don't have permission to switch source." -msgstr "你没有切æ¢çš„æƒé™ã€‚" +#: airtime_mvc/application/forms/EmailServerPreferences.php:43 +msgid "Requires Authentication" +msgstr "需è¦èº«ä»½éªŒè¯" -#: airtime_mvc/application/controllers/ScheduleController.php:350 -#, php-format -msgid "Rebroadcast of show %s from %s at %s" -msgstr "节目%s是节目%sçš„é‡æ’­ï¼Œæ—¶é—´æ˜¯%s" +#: airtime_mvc/application/forms/EmailServerPreferences.php:53 +msgid "Mail Server" +msgstr "邮件æœåŠ¡å™¨åœ°å€" -#: airtime_mvc/application/controllers/ScheduleController.php:624 -#: airtime_mvc/application/controllers/LibraryController.php:222 -msgid "Download" -msgstr "下载" +#: airtime_mvc/application/forms/EmailServerPreferences.php:67 +msgid "Email Address" +msgstr "邮件地å€" #: airtime_mvc/application/controllers/ListenerstatController.php:56 -msgid "" -"Please make sure admin user/password is correct on System->Streams page." +msgid "Please make sure admin user/password is correct on System->Streams page." msgstr "请检查系统->媒体æµè®¾ç½®ä¸­ï¼Œç®¡ç†å‘˜ç”¨æˆ·/密ç çš„设置是å¦æ­£ç¡®ã€‚" -#: airtime_mvc/application/controllers/ApiController.php:60 -msgid "You are not allowed to access this resource." -msgstr "你没有访问该资æºçš„æƒé™" +#: airtime_mvc/application/controllers/WebstreamController.php:29 +#: airtime_mvc/application/controllers/WebstreamController.php:33 +msgid "Untitled Webstream" +msgstr "未命å的网络æµåª’体" -#: airtime_mvc/application/controllers/ApiController.php:314 -#: airtime_mvc/application/controllers/ApiController.php:376 -msgid "You are not allowed to access this resource. " -msgstr "你没有访问该资æºçš„æƒé™" +#: airtime_mvc/application/controllers/WebstreamController.php:138 +msgid "Webstream saved." +msgstr "网络æµåª’体已ä¿å­˜ã€‚" -#: airtime_mvc/application/controllers/ApiController.php:555 -msgid "File does not exist in Airtime." -msgstr "Airtime中ä¸å­˜åœ¨è¯¥æ–‡ä»¶ã€‚" +#: airtime_mvc/application/controllers/WebstreamController.php:146 +msgid "Invalid form values." +msgstr "无效的表格内容。" -#: airtime_mvc/application/controllers/ApiController.php:575 -msgid "File does not exist in Airtime" -msgstr "Airtime中ä¸å­˜åœ¨è¯¥æ–‡ä»¶ã€‚" +#: airtime_mvc/application/controllers/LoginController.php:34 +msgid "Please enter your user name and password" +msgstr "请输入用户å和密ç " -#: airtime_mvc/application/controllers/ApiController.php:587 -msgid "File doesn't exist in Airtime." -msgstr "Airtime中ä¸å­˜åœ¨è¯¥æ–‡ä»¶ã€‚" +#: airtime_mvc/application/controllers/LoginController.php:77 +msgid "Wrong username or password provided. Please try again." +msgstr "用户å或密ç é”™è¯¯ï¼Œè¯·é‡è¯•ã€‚" -#: airtime_mvc/application/controllers/ApiController.php:638 -msgid "Bad request. no 'mode' parameter passed." -msgstr "请求错误。没有æ供‘模å¼â€™å‚数。" +#: airtime_mvc/application/controllers/LoginController.php:142 +msgid "Email could not be sent. Check your mail server settings and ensure it has been configured properly." +msgstr "邮件å‘é€å¤±è´¥ã€‚请检查邮件æœåŠ¡å™¨è®¾ç½®ï¼Œå¹¶ç¡®å®šè®¾ç½®æ— è¯¯ã€‚" -#: airtime_mvc/application/controllers/ApiController.php:648 -msgid "Bad request. 'mode' parameter is invalid" -msgstr "请求错误。æ供的‘模å¼â€™å‚数无效。" +#: airtime_mvc/application/controllers/LoginController.php:145 +msgid "Given email not found." +msgstr "邮件地å€æ²¡æœ‰æ‰¾åˆ°ã€‚" -#: airtime_mvc/application/controllers/LibraryController.php:125 -#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/ScheduleController.php:350 #, php-format -msgid "%s not found" -msgstr "%sä¸å­˜åœ¨" - -#: airtime_mvc/application/controllers/LibraryController.php:134 -#: airtime_mvc/application/controllers/PlaylistController.php:151 -msgid "Something went wrong." -msgstr "未知错误。" - -#: airtime_mvc/application/controllers/LibraryController.php:189 -#: airtime_mvc/application/controllers/ShowbuilderController.php:194 -msgid "Preview" -msgstr "预览" - -#: airtime_mvc/application/controllers/LibraryController.php:210 -#: airtime_mvc/application/controllers/LibraryController.php:234 -#: airtime_mvc/application/controllers/LibraryController.php:257 -msgid "Add to Playlist" -msgstr "添加到播放列表" - -#: airtime_mvc/application/controllers/LibraryController.php:212 -msgid "Add to Smart Block" -msgstr "添加到智能模å—" - -#: airtime_mvc/application/controllers/LibraryController.php:218 -#: airtime_mvc/application/controllers/LocaleController.php:57 -msgid "Edit Metadata" -msgstr "编辑元数æ®" +msgid "Rebroadcast of show %s from %s at %s" +msgstr "节目%s是节目%sçš„é‡æ’­ï¼Œæ—¶é—´æ˜¯%s" -#: airtime_mvc/application/controllers/LibraryController.php:226 -msgid "Duplicate Playlist" -msgstr "å¤åˆ¶æ’­æ”¾åˆ—表" +#: airtime_mvc/application/controllers/ScheduleController.php:624 +#: airtime_mvc/application/controllers/LibraryController.php:222 +msgid "Download" +msgstr "下载" -#: airtime_mvc/application/controllers/LibraryController.php:276 -msgid "Soundcloud" -msgstr "Soundcloud" +#: airtime_mvc/application/controllers/UserController.php:82 +msgid "User added successfully!" +msgstr "用户已添加æˆåŠŸï¼" -#: airtime_mvc/application/controllers/LibraryController.php:295 -msgid "No action available" -msgstr "没有æ“作选择" +#: airtime_mvc/application/controllers/UserController.php:84 +msgid "User updated successfully!" +msgstr "用于已æˆåŠŸæ›´æ–°ï¼" -#: airtime_mvc/application/controllers/LibraryController.php:315 -msgid "You don't have permission to delete selected items." -msgstr "你没有删除选定项目的æƒé™ã€‚" +#: airtime_mvc/application/controllers/UserController.php:154 +msgid "Settings updated successfully!" +msgstr "设置更新æˆåŠŸï¼" -#: airtime_mvc/application/controllers/LibraryController.php:364 -msgid "Could not delete some scheduled files." -msgstr "部分已ç»å®‰æŽ’的节目内容ä¸èƒ½åˆ é™¤ã€‚" +#: airtime_mvc/application/controllers/ErrorController.php:17 +msgid "Page not found" +msgstr "页é¢ä¸å­˜åœ¨" -#: airtime_mvc/application/controllers/LibraryController.php:404 -#, php-format -msgid "Copy of %s" -msgstr "%s的副本" +#: airtime_mvc/application/controllers/ErrorController.php:22 +msgid "Application error" +msgstr "应用程åºé”™è¯¯" #: airtime_mvc/application/controllers/LocaleController.php:32 msgid "Recording:" @@ -1874,6 +1590,11 @@ msgstr "播放列表åªèƒ½æ·»åŠ å£°éŸ³æ–‡ä»¶ï¼Œåªèƒ½æ¨¡å—和网络æµåª’体。 msgid "Please select a cursor position on timeline." msgstr "请在å³éƒ¨çš„时间表视图中选择一个游标ä½ç½®ã€‚" +#: airtime_mvc/application/controllers/LocaleController.php:57 +#: airtime_mvc/application/controllers/LibraryController.php:218 +msgid "Edit Metadata" +msgstr "编辑元数æ®" + #: airtime_mvc/application/controllers/LocaleController.php:58 msgid "Add to selected show" msgstr "添加到所选的节目" @@ -1920,6 +1641,7 @@ msgstr "加载中..." #: airtime_mvc/application/controllers/LocaleController.php:92 #: airtime_mvc/application/controllers/LocaleController.php:392 +#: airtime_mvc/application/views/scripts/plupload/index.phtml:18 msgid "All" msgstr "全部" @@ -1990,9 +1712,7 @@ msgstr "输入格å¼åº”为:时:分:秒 (hh:mm:ss.t)" #: airtime_mvc/application/controllers/LocaleController.php:111 #, php-format -msgid "" -"You are currently uploading files. %sGoing to another screen will cancel the" -" upload process. %sAre you sure you want to leave the page?" +msgid "You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?" msgstr "你正在上传文件。%s如果离开此页,上传过程将被打断。%s确定离开å—?" #: airtime_mvc/application/controllers/LocaleController.php:113 @@ -2028,10 +1748,7 @@ msgid "Playlist shuffled" msgstr "播放列表已ç»éšæœºåŒ–" #: airtime_mvc/application/controllers/LocaleController.php:122 -msgid "" -"Airtime is unsure about the status of this file. This can happen when the " -"file is on a remote drive that is unaccessible or the file is in a directory" -" that isn't 'watched' anymore." +msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore." msgstr "文件的状æ€ä¸å¯çŸ¥ã€‚è¿™å¯èƒ½æ˜¯ç”±äºŽæ–‡ä»¶ä½äºŽè¿œç¨‹å­˜å‚¨ä½ç½®ï¼Œæˆ–者所在的文件夹已ç»ä¸å†ç›‘控。" #: airtime_mvc/application/controllers/LocaleController.php:124 @@ -2057,24 +1774,15 @@ msgid "Image must be one of jpg, jpeg, png, or gif" msgstr "图åƒæ–‡ä»¶æ ¼å¼åªèƒ½æ˜¯jpg,jpeg,png或者gif" #: airtime_mvc/application/controllers/LocaleController.php:132 -msgid "" -"A static smart block will save the criteria and generate the block content " -"immediately. This allows you to edit and view it in the Library before " -"adding it to a show." +msgid "A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show." msgstr "é™æ€çš„智能模å—将会ä¿å­˜æ¡ä»¶è®¾ç½®å¹¶ä¸”马上生æˆæ‰€æœ‰å†…容。这样就å¯ä»¥è®©ä½ åœ¨æ·»åŠ åˆ°èŠ‚目中å‰ï¼Œè¿˜å¯ä»¥ç¼–辑和预览该智能模å—。" #: airtime_mvc/application/controllers/LocaleController.php:134 -msgid "" -"A dynamic smart block will only save the criteria. The block content will " -"get generated upon adding it to a show. You will not be able to view and " -"edit the content in the Library." +msgid "A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library." msgstr "动æ€çš„智能模å—å°†åªä¿å­˜æ¡ä»¶è®¾ç½®ã€‚而模å—的内容将在æ¯æ¬¡æ·»åŠ åˆ°èŠ‚目中是动æ€ç”Ÿæˆã€‚在媒体库中,你ä¸èƒ½ç›´æŽ¥ç¼–辑和预览动æ€æ™ºèƒ½æ¨¡å—。" #: airtime_mvc/application/controllers/LocaleController.php:136 -msgid "" -"The desired block length will not be reached if Airtime cannot find enough " -"unique tracks to match your criteria. Enable this option if you wish to " -"allow tracks to be added multiple times to the smart block." +msgid "The desired block length will not be reached if Airtime cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block." msgstr "因为满足æ¡ä»¶çš„声音文件数é‡æœ‰é™ï¼Œåªèƒ½æ’­æ”¾åˆ—表指定的时长å¯èƒ½æ— æ³•è¾¾æˆã€‚如果你ä¸ä»‹æ„出现é‡å¤çš„项目,你å¯ä»¥å¯ç”¨æ­¤é¡¹ã€‚" #: airtime_mvc/application/controllers/LocaleController.php:137 @@ -2105,7 +1813,14 @@ msgstr "选择监控的文件夹" msgid "" "Are you sure you want to change the storage folder?\n" "This will remove the files from your Airtime library!" -msgstr "确定更改存储路径?\n这项æ“作将从媒体库中删除所有文件ï¼" +msgstr "" +"确定更改存储路径?\n" +"这项æ“作将从媒体库中删除所有文件ï¼" + +#: airtime_mvc/application/controllers/LocaleController.php:156 +#: airtime_mvc/application/views/scripts/preference/directory-config.phtml:2 +msgid "Manage Media Folders" +msgstr "管ç†åª’体文件夹" #: airtime_mvc/application/controllers/LocaleController.php:157 msgid "Are you sure you want to remove the watched folder?" @@ -2117,9 +1832,7 @@ msgstr "指定的路径无法访问。" #: airtime_mvc/application/controllers/LocaleController.php:160 #, php-format -msgid "" -"Some stream types require extra configuration. Details about enabling %sAAC+" -" Support%s or %sOpus Support%s are provided." +msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided." msgstr "æŸäº›ç±»åž‹çš„输出æµéœ€è¦ç¬¬ä¸‰æ–¹è½¯ä»¶çš„设置,具体步骤如下:%sAAC+%s å’Œ %sOpus%s。" #: airtime_mvc/application/controllers/LocaleController.php:161 @@ -2130,22 +1843,12 @@ msgstr "æµæœåŠ¡å™¨å·²è¿žæŽ¥" msgid "The stream is disabled" msgstr "输出æµå·²ç¦ç”¨" -#: airtime_mvc/application/controllers/LocaleController.php:163 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:218 -msgid "Getting information from the server..." -msgstr "从æœåŠ¡å™¨åŠ è½½ä¸­..." - #: airtime_mvc/application/controllers/LocaleController.php:164 msgid "Can not connect to the streaming server" msgstr "无法连接æµæœåŠ¡å™¨" #: airtime_mvc/application/controllers/LocaleController.php:166 -msgid "" -"If Airtime is behind a router or firewall, you may need to configure port " -"forwarding and this field information will be incorrect. In this case you " -"will need to manually update this field so it shows the correct " -"host/port/mount that your DJ's need to connect to. The allowed range is " -"between 1024 and 49151." +msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151." msgstr "如果Airtimeé…置在路由器或者防ç«å¢™ä¹‹åŽï¼Œä½ å¯èƒ½éœ€è¦é…置端å£è½¬å‘,所以当å‰æ–‡æœ¬æ¡†å†…çš„ä¿¡æ¯éœ€è¦è°ƒæ•´ã€‚在这ç§æƒ…况下,就需è¦äººå·¥æŒ‡å®šè¯¥ä¿¡æ¯ä»¥ç¡®å®šæ‰€æ˜¾ç¤ºçš„主机å/端å£/加载点的正确性,从而让节目编辑能连接的上。端å£æ‰€å…许的范围,介于1024到49151之间。" #: airtime_mvc/application/controllers/LocaleController.php:167 @@ -2154,61 +1857,36 @@ msgid "For more details, please read the %sAirtime Manual%s" msgstr "更多的细节å¯ä»¥å‚阅%sAirtime用户手册%s" #: airtime_mvc/application/controllers/LocaleController.php:169 -msgid "" -"Check this option to enable metadata for OGG streams (stream metadata is the" -" track title, artist, and show name that is displayed in an audio player). " -"VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that " -"has metadata information enabled: they will disconnect from the stream after" -" every song. If you are using an OGG stream and your listeners do not " -"require support for these audio players, then feel free to enable this " -"option." +msgid "Check this option to enable metadata for OGG streams (stream metadata is the track title, artist, and show name that is displayed in an audio player). VLC and mplayer have a serious bug when playing an OGG/VORBIS stream that has metadata information enabled: they will disconnect from the stream after every song. If you are using an OGG stream and your listeners do not require support for these audio players, then feel free to enable this option." msgstr "勾选此项会å¯ç”¨OGGæ ¼å¼æµåª’体的元数æ®ï¼ˆæµçš„元数æ®åŒ…括歌曲å,歌手/作者,节目å,这些都会显示在音频播放器中。)VLCå’Œmplayer有个已知的问题,他们在播放OGG/VORBIS媒体æµæ—¶ï¼Œå¦‚果该æµå·²å¯ç”¨å…ƒæ•°æ®ï¼Œé‚£ä¹ˆåœ¨æ¯é¦–歌的间隙都会断开æµã€‚所以,如果你使用OGG媒体æµï¼ŒåŒæ—¶ä½ çš„å¬ä¼—ä¸ä½¿ç”¨ä¸Šè¿°åª’体播放器的è¯ï¼Œä½ å¯ä»¥éšæ„地勾选此项。" #: airtime_mvc/application/controllers/LocaleController.php:170 -msgid "" -"Check this box to automatically switch off Master/Show source upon source " -"disconnection." +msgid "Check this box to automatically switch off Master/Show source upon source disconnection." msgstr "勾选此项åŽï¼Œåœ¨è¾“å…¥æµæ–­å¼€æ—¶ï¼Œä¸»è¾“å…¥æºå’ŒèŠ‚目定制输入æºå°†ä¼šè‡ªåŠ¨åˆ‡æ¢ä¸ºå…³é—­çŠ¶æ€ã€‚" #: airtime_mvc/application/controllers/LocaleController.php:171 -msgid "" -"Check this box to automatically switch on Master/Show source upon source " -"connection." +msgid "Check this box to automatically switch on Master/Show source upon source connection." msgstr "勾选此项åŽï¼Œåœ¨è¾“å…¥æµè¿žæŽ¥ä¸Šæ—¶ï¼Œä¸»è¾“å…¥æºå’ŒèŠ‚目定制输入æºå°†ä¼šè‡ªåŠ¨åˆ‡æ¢åˆ°å¼€å¯çŠ¶æ€ã€‚" #: airtime_mvc/application/controllers/LocaleController.php:172 -msgid "" -"If your Icecast server expects a username of 'source', this field can be " -"left blank." +msgid "If your Icecast server expects a username of 'source', this field can be left blank." msgstr "如果你的IcecastæœåŠ¡å™¨æ‰€è¦æ±‚的用户å是‘source’,那么当å‰é¡¹å¯ä»¥ç•™ç©ºã€‚" #: airtime_mvc/application/controllers/LocaleController.php:173 #: airtime_mvc/application/controllers/LocaleController.php:184 -msgid "" -"If your live streaming client does not ask for a username, this field should" -" be 'source'." +msgid "If your live streaming client does not ask for a username, this field should be 'source'." msgstr "如果你的æµå®¢æˆ·ç«¯ä¸éœ€è¦ç”¨æˆ·å,那么当å‰é¡¹å¯ä»¥ç•™ç©º" #: airtime_mvc/application/controllers/LocaleController.php:175 -msgid "" -"If you change the username or password values for an enabled stream the " -"playout engine will be rebooted and your listeners will hear silence for " -"5-10 seconds. Changing the following fields will NOT cause a reboot: Stream " -"Label (Global Settings), and Switch Transition Fade(s), Master Username, and" -" Master Password (Input Stream Settings). If Airtime is recording, and if " -"the change causes a playout engine restart, the recording will be " -"interrupted." +msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted." msgstr "如果你更改了一个已ç»å¯ç”¨äº†çš„输出æµçš„用户å或者密ç ï¼Œé‚£ä¹ˆå†…置的播放输出引擎模å—将会é‡å¯ï¼Œä½ çš„å¬ä¼—将会å¬åˆ°ä¸€æ®µæ—¶é—´çš„空白,大概æŒç»­5到10秒。而改å˜å¦‚下的模å—å°†ä¸ä¼šå¯¼è‡´è¯¥æ¨¡å—é‡å¯ï¼šæµæ ‡ç­¾ï¼ˆå…¨å±€è®¾ç½®é‡Œï¼‰å’Œæµåˆ‡æ¢æ·¡å…¥æ·¡å‡ºæ•ˆæžœï¼ˆç§’),主输入æµç”¨æˆ·å和密ç ï¼ˆè¾“å…¥æµè®¾ç½®ï¼‰ã€‚如果Airtime正在录制过程中,而且改å˜è®¾ç½®å¯¼è‡´å¼•æ“Žæ¨¡å—é‡å¯åŽï¼Œå½“å‰çš„录制进程将会被打断。" #: airtime_mvc/application/controllers/LocaleController.php:176 -msgid "" -"This is the admin username and password for Icecast/SHOUTcast to get " -"listener statistics." +msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics." msgstr "此处填写Icecast或者SHOUTcast的管ç†å‘˜ç”¨æˆ·å和密ç ï¼Œç”¨äºŽèŽ·å–收å¬æ•°æ®çš„统计。" #: airtime_mvc/application/controllers/LocaleController.php:180 -msgid "" -"Warning: You cannot change this field while the show is currently playing" +msgid "Warning: You cannot change this field while the show is currently playing" msgstr "" #: airtime_mvc/application/controllers/LocaleController.php:181 @@ -2216,9 +1894,7 @@ msgid "No result found" msgstr "æœç´¢æ— ç»“æžœ" #: airtime_mvc/application/controllers/LocaleController.php:182 -msgid "" -"This follows the same security pattern for the shows: only users assigned to" -" the show can connect." +msgid "This follows the same security pattern for the shows: only users assigned to the show can connect." msgstr "当å‰éµå¾ªä¸ŽèŠ‚ç›®åŒæ ·çš„安全模å¼ï¼šåªæœ‰æŒ‡å®šåˆ°å½“å‰èŠ‚目的用户æ‰èƒ½è¿žæŽ¥çš„上。" #: airtime_mvc/application/controllers/LocaleController.php:183 @@ -2234,16 +1910,11 @@ msgid "Warning: Shows cannot be re-linked" msgstr "注æ„:节目å–消绑定åŽæ— æ³•å†æ¬¡ç»‘定" #: airtime_mvc/application/controllers/LocaleController.php:187 -msgid "" -"By linking your repeating shows any media items scheduled in any repeat show" -" will also get scheduled in the other repeat shows" +msgid "By linking your repeating shows any media items scheduled in any repeat show will also get scheduled in the other repeat shows" msgstr "系列节目勾选绑定åŽï¼Œæ‰€æœ‰èŠ‚目的内容都会一模一样,对任何未开始节目的更改都会影å“到其他节目。" #: airtime_mvc/application/controllers/LocaleController.php:188 -msgid "" -"Timezone is set to the station timezone by default. Shows in the calendar " -"will be displayed in your local time defined by the Interface Timezone in " -"your user settings." +msgid "Timezone is set to the station timezone by default. Shows in the calendar will be displayed in your local time defined by the Interface Timezone in your user settings." msgstr "此时区设定的默认值是系统的时区设置。日程表中的节目时间则已用户定义的界é¢æ˜¾ç¤ºæ—¶åŒºä¸ºå‡†ï¼Œä¸¤è€…å¯èƒ½æœ‰æ‰€ä¸åŒã€‚" #: airtime_mvc/application/controllers/LocaleController.php:192 @@ -2391,87 +2062,16 @@ msgstr "今天" msgid "day" msgstr "æ—¥" -#: airtime_mvc/application/controllers/LocaleController.php:238 -msgid "week" -msgstr "星期" - -#: airtime_mvc/application/controllers/LocaleController.php:239 -msgid "month" -msgstr "月" - -#: airtime_mvc/application/controllers/LocaleController.php:240 -#: airtime_mvc/application/forms/GeneralPreferences.php:123 -msgid "Sunday" -msgstr "周日" - -#: airtime_mvc/application/controllers/LocaleController.php:241 -#: airtime_mvc/application/forms/GeneralPreferences.php:124 -msgid "Monday" -msgstr "周一" - -#: airtime_mvc/application/controllers/LocaleController.php:242 -#: airtime_mvc/application/forms/GeneralPreferences.php:125 -msgid "Tuesday" -msgstr "周二" - -#: airtime_mvc/application/controllers/LocaleController.php:243 -#: airtime_mvc/application/forms/GeneralPreferences.php:126 -msgid "Wednesday" -msgstr "周三" - -#: airtime_mvc/application/controllers/LocaleController.php:244 -#: airtime_mvc/application/forms/GeneralPreferences.php:127 -msgid "Thursday" -msgstr "周四" - -#: airtime_mvc/application/controllers/LocaleController.php:245 -#: airtime_mvc/application/forms/GeneralPreferences.php:128 -msgid "Friday" -msgstr "周五" - -#: airtime_mvc/application/controllers/LocaleController.php:246 -#: airtime_mvc/application/forms/GeneralPreferences.php:129 -msgid "Saturday" -msgstr "周六" - -#: airtime_mvc/application/controllers/LocaleController.php:247 -#: airtime_mvc/application/forms/AddShowRepeats.php:35 -msgid "Sun" -msgstr "周日" - -#: airtime_mvc/application/controllers/LocaleController.php:248 -#: airtime_mvc/application/forms/AddShowRepeats.php:36 -msgid "Mon" -msgstr "周一" - -#: airtime_mvc/application/controllers/LocaleController.php:249 -#: airtime_mvc/application/forms/AddShowRepeats.php:37 -msgid "Tue" -msgstr "周二" - -#: airtime_mvc/application/controllers/LocaleController.php:250 -#: airtime_mvc/application/forms/AddShowRepeats.php:38 -msgid "Wed" -msgstr "周三" - -#: airtime_mvc/application/controllers/LocaleController.php:251 -#: airtime_mvc/application/forms/AddShowRepeats.php:39 -msgid "Thu" -msgstr "周四" - -#: airtime_mvc/application/controllers/LocaleController.php:252 -#: airtime_mvc/application/forms/AddShowRepeats.php:40 -msgid "Fri" -msgstr "周五" - -#: airtime_mvc/application/controllers/LocaleController.php:253 -#: airtime_mvc/application/forms/AddShowRepeats.php:41 -msgid "Sat" -msgstr "周六" +#: airtime_mvc/application/controllers/LocaleController.php:238 +msgid "week" +msgstr "星期" + +#: airtime_mvc/application/controllers/LocaleController.php:239 +msgid "month" +msgstr "月" #: airtime_mvc/application/controllers/LocaleController.php:254 -msgid "" -"Shows longer than their scheduled time will be cut off by a following show." +msgid "Shows longer than their scheduled time will be cut off by a following show." msgstr "超出的节目内容将被éšåŽçš„节目所å–代。" #: airtime_mvc/application/controllers/LocaleController.php:255 @@ -2499,6 +2099,11 @@ msgstr "清空全部内容?" msgid "Delete selected item(s)?" msgstr "删除选定的项目?" +#: airtime_mvc/application/controllers/LocaleController.php:264 +#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5 +msgid "Start" +msgstr "开始" + #: airtime_mvc/application/controllers/LocaleController.php:265 msgid "End" msgstr "结æŸ" @@ -2532,14 +2137,6 @@ msgstr "移动1个项目" msgid "Moving %s Items" msgstr "移动%s个项目" -#: airtime_mvc/application/controllers/LocaleController.php:286 -#: airtime_mvc/application/controllers/LocaleController.php:309 -#: airtime_mvc/application/forms/EditHistory.php:141 -#: airtime_mvc/application/forms/PasswordRestore.php:46 -#: airtime_mvc/application/forms/EditAudioMD.php:145 -msgid "Cancel" -msgstr "å–消" - #: airtime_mvc/application/controllers/LocaleController.php:287 msgid "Fade Editor" msgstr "淡入淡出编辑器" @@ -2549,8 +2146,7 @@ msgid "Cue Editor" msgstr "切入切出编辑器" #: airtime_mvc/application/controllers/LocaleController.php:289 -msgid "" -"Waveform features are available in a browser supporting the Web Audio API" +msgid "Waveform features are available in a browser supporting the Web Audio API" msgstr "想è¦å¯ç”¨æ³¢å½¢å›¾åŠŸèƒ½ï¼Œéœ€è¦æ”¯æŒWeb Audio APIçš„æµè§ˆå™¨ã€‚" #: airtime_mvc/application/controllers/LocaleController.php:292 @@ -2577,1333 +2173,1627 @@ msgstr "跳转到当å‰æ’­æ”¾çš„项目" msgid "Cancel current show" msgstr "å–消当å‰çš„节目" -#: airtime_mvc/application/controllers/LocaleController.php:302 -msgid "Open library to add or remove content" -msgstr "打开媒体库,添加或者删除节目内容" +#: airtime_mvc/application/controllers/LocaleController.php:302 +msgid "Open library to add or remove content" +msgstr "打开媒体库,添加或者删除节目内容" + +#: airtime_mvc/application/controllers/LocaleController.php:303 +#: airtime_mvc/application/views/scripts/showbuilder/index.phtml:15 +#: airtime_mvc/application/services/CalendarService.php:93 +#: airtime_mvc/application/services/CalendarService.php:100 +msgid "Add / Remove Content" +msgstr "添加 / 删除内容" + +#: airtime_mvc/application/controllers/LocaleController.php:305 +msgid "in use" +msgstr "使用中" + +#: airtime_mvc/application/controllers/LocaleController.php:306 +msgid "Disk" +msgstr "ç£ç›˜" + +#: airtime_mvc/application/controllers/LocaleController.php:308 +msgid "Look in" +msgstr "查询" + +#: airtime_mvc/application/controllers/LocaleController.php:310 +msgid "Open" +msgstr "打开" + +#: airtime_mvc/application/controllers/LocaleController.php:316 +msgid "Guests can do the following:" +msgstr "游客的æƒé™åŒ…括:" + +#: airtime_mvc/application/controllers/LocaleController.php:317 +msgid "View schedule" +msgstr "显示节目日程" + +#: airtime_mvc/application/controllers/LocaleController.php:318 +msgid "View show content" +msgstr "显示节目内容" + +#: airtime_mvc/application/controllers/LocaleController.php:319 +msgid "DJs can do the following:" +msgstr "节目编辑的æƒé™åŒ…括:" + +#: airtime_mvc/application/controllers/LocaleController.php:320 +msgid "Manage assigned show content" +msgstr "为指派的节目管ç†èŠ‚目内容" + +#: airtime_mvc/application/controllers/LocaleController.php:321 +msgid "Import media files" +msgstr "导入媒体文件" + +#: airtime_mvc/application/controllers/LocaleController.php:322 +msgid "Create playlists, smart blocks, and webstreams" +msgstr "创建播放列表,智能模å—和网络æµåª’体" + +#: airtime_mvc/application/controllers/LocaleController.php:323 +msgid "Manage their own library content" +msgstr "管ç†åª’体库中属于自己的内容" + +#: airtime_mvc/application/controllers/LocaleController.php:324 +msgid "Progam Managers can do the following:" +msgstr "节目主管的æƒé™æ˜¯ï¼š" + +#: airtime_mvc/application/controllers/LocaleController.php:325 +msgid "View and manage show content" +msgstr "查看和管ç†èŠ‚目内容" + +#: airtime_mvc/application/controllers/LocaleController.php:326 +msgid "Schedule shows" +msgstr "安排节目日程" + +#: airtime_mvc/application/controllers/LocaleController.php:327 +msgid "Manage all library content" +msgstr "管ç†åª’体库的所有内容" + +#: airtime_mvc/application/controllers/LocaleController.php:328 +msgid "Admins can do the following:" +msgstr "管ç†å‘˜çš„æƒé™åŒ…括:" + +#: airtime_mvc/application/controllers/LocaleController.php:329 +msgid "Manage preferences" +msgstr "属性管ç†" + +#: airtime_mvc/application/controllers/LocaleController.php:330 +msgid "Manage users" +msgstr "管ç†ç”¨æˆ·" + +#: airtime_mvc/application/controllers/LocaleController.php:331 +msgid "Manage watched folders" +msgstr "管ç†ç›‘控文件夹" + +#: airtime_mvc/application/controllers/LocaleController.php:333 +msgid "View system status" +msgstr "显示系统状æ€" + +#: airtime_mvc/application/controllers/LocaleController.php:334 +msgid "Access playout history" +msgstr "查看播放历å²" + +#: airtime_mvc/application/controllers/LocaleController.php:335 +msgid "View listener stats" +msgstr "显示收å¬ç»Ÿè®¡æ•°æ®" + +#: airtime_mvc/application/controllers/LocaleController.php:337 +msgid "Show / hide columns" +msgstr "显示/éšè—æ " + +#: airtime_mvc/application/controllers/LocaleController.php:339 +msgid "From {from} to {to}" +msgstr "从{from}到{to}" + +#: airtime_mvc/application/controllers/LocaleController.php:340 +msgid "kbps" +msgstr "åƒæ¯”特æ¯ç§’" + +#: airtime_mvc/application/controllers/LocaleController.php:341 +msgid "yyyy-mm-dd" +msgstr "å¹´-月-æ—¥" + +#: airtime_mvc/application/controllers/LocaleController.php:342 +msgid "hh:mm:ss.t" +msgstr "æ—¶:分:秒" + +#: airtime_mvc/application/controllers/LocaleController.php:343 +msgid "kHz" +msgstr "åƒèµ«å…¹" + +#: airtime_mvc/application/controllers/LocaleController.php:346 +msgid "Su" +msgstr "周天" + +#: airtime_mvc/application/controllers/LocaleController.php:347 +msgid "Mo" +msgstr "周一" + +#: airtime_mvc/application/controllers/LocaleController.php:348 +msgid "Tu" +msgstr "周二" + +#: airtime_mvc/application/controllers/LocaleController.php:349 +msgid "We" +msgstr "周三" + +#: airtime_mvc/application/controllers/LocaleController.php:350 +msgid "Th" +msgstr "周四" + +#: airtime_mvc/application/controllers/LocaleController.php:351 +msgid "Fr" +msgstr "周五" + +#: airtime_mvc/application/controllers/LocaleController.php:352 +msgid "Sa" +msgstr "周六" + +#: airtime_mvc/application/controllers/LocaleController.php:353 +#: airtime_mvc/application/controllers/LocaleController.php:381 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:3 +msgid "Close" +msgstr "关闭" + +#: airtime_mvc/application/controllers/LocaleController.php:355 +msgid "Hour" +msgstr "å°æ—¶" + +#: airtime_mvc/application/controllers/LocaleController.php:356 +msgid "Minute" +msgstr "分钟" + +#: airtime_mvc/application/controllers/LocaleController.php:357 +msgid "Done" +msgstr "设定" + +#: airtime_mvc/application/controllers/LocaleController.php:360 +msgid "Select files" +msgstr "选择文件" + +#: airtime_mvc/application/controllers/LocaleController.php:361 +#: airtime_mvc/application/controllers/LocaleController.php:362 +msgid "Add files to the upload queue and click the start button." +msgstr "添加需è¦ä¸Šä¼ çš„文件到传输队列中,然åŽç‚¹å‡»å¼€å§‹ä¸Šä¼ ã€‚" + +#: airtime_mvc/application/controllers/LocaleController.php:363 +#: airtime_mvc/application/controllers/LocaleController.php:364 +#: airtime_mvc/application/configs/navigation.php:76 +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:5 +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:8 +msgid "Status" +msgstr "系统状æ€" + +#: airtime_mvc/application/controllers/LocaleController.php:365 +msgid "Add Files" +msgstr "添加文件" + +#: airtime_mvc/application/controllers/LocaleController.php:366 +msgid "Stop Upload" +msgstr "åœæ­¢ä¸Šä¼ " + +#: airtime_mvc/application/controllers/LocaleController.php:367 +msgid "Start upload" +msgstr "开始上传" + +#: airtime_mvc/application/controllers/LocaleController.php:368 +msgid "Add files" +msgstr "添加文件" + +#: airtime_mvc/application/controllers/LocaleController.php:369 +#, php-format +msgid "Uploaded %d/%d files" +msgstr "å·²ç»ä¸Šä¼ %d/%d个文件" + +#: airtime_mvc/application/controllers/LocaleController.php:370 +msgid "N/A" +msgstr "未知" + +#: airtime_mvc/application/controllers/LocaleController.php:371 +msgid "Drag files here." +msgstr "拖拽文件到此处。" + +#: airtime_mvc/application/controllers/LocaleController.php:372 +msgid "File extension error." +msgstr "文件åŽç¼€å出错。" + +#: airtime_mvc/application/controllers/LocaleController.php:373 +msgid "File size error." +msgstr "文件大å°å‡ºé”™ã€‚" + +#: airtime_mvc/application/controllers/LocaleController.php:374 +msgid "File count error." +msgstr "å‘生文件统计错误。" + +#: airtime_mvc/application/controllers/LocaleController.php:375 +msgid "Init error." +msgstr "å‘生åˆå§‹åŒ–错误。" -#: airtime_mvc/application/controllers/LocaleController.php:305 -msgid "in use" -msgstr "使用中" +#: airtime_mvc/application/controllers/LocaleController.php:376 +msgid "HTTP Error." +msgstr "å‘生HTTP类型的错误" -#: airtime_mvc/application/controllers/LocaleController.php:306 -msgid "Disk" -msgstr "ç£ç›˜" +#: airtime_mvc/application/controllers/LocaleController.php:377 +msgid "Security error." +msgstr "å‘生安全性错误。" -#: airtime_mvc/application/controllers/LocaleController.php:308 -msgid "Look in" -msgstr "查询" +#: airtime_mvc/application/controllers/LocaleController.php:378 +msgid "Generic error." +msgstr "å‘生通用类型的错误。" -#: airtime_mvc/application/controllers/LocaleController.php:310 -msgid "Open" -msgstr "打开" +#: airtime_mvc/application/controllers/LocaleController.php:379 +msgid "IO error." +msgstr "输入输出错误。" -#: airtime_mvc/application/controllers/LocaleController.php:312 -#: airtime_mvc/application/forms/AddUser.php:98 -msgid "Admin" -msgstr "系统管ç†å‘˜" +#: airtime_mvc/application/controllers/LocaleController.php:380 +#, php-format +msgid "File: %s" +msgstr "文件:%s" -#: airtime_mvc/application/controllers/LocaleController.php:313 -#: airtime_mvc/application/forms/AddUser.php:96 -msgid "DJ" -msgstr "节目编辑" +#: airtime_mvc/application/controllers/LocaleController.php:382 +#, php-format +msgid "%d files queued" +msgstr "队列中有%d个文件" -#: airtime_mvc/application/controllers/LocaleController.php:314 -#: airtime_mvc/application/forms/AddUser.php:97 -msgid "Program Manager" -msgstr "节目主管" +#: airtime_mvc/application/controllers/LocaleController.php:383 +msgid "File: %f, size: %s, max file size: %m" +msgstr "文件:%f,大å°ï¼š%s,最大的文件大å°ï¼š%m" -#: airtime_mvc/application/controllers/LocaleController.php:315 -#: airtime_mvc/application/forms/AddUser.php:95 -msgid "Guest" -msgstr "游客" +#: airtime_mvc/application/controllers/LocaleController.php:384 +msgid "Upload URL might be wrong or doesn't exist" +msgstr "用于上传的地å€æœ‰è¯¯æˆ–者ä¸å­˜åœ¨" -#: airtime_mvc/application/controllers/LocaleController.php:316 -msgid "Guests can do the following:" -msgstr "游客的æƒé™åŒ…括:" +#: airtime_mvc/application/controllers/LocaleController.php:385 +msgid "Error: File too large: " +msgstr "错误:文件过大:" -#: airtime_mvc/application/controllers/LocaleController.php:317 -msgid "View schedule" -msgstr "显示节目日程" +#: airtime_mvc/application/controllers/LocaleController.php:386 +msgid "Error: Invalid file extension: " +msgstr "错误:无效的文件åŽç¼€å:" -#: airtime_mvc/application/controllers/LocaleController.php:318 -msgid "View show content" -msgstr "显示节目内容" +#: airtime_mvc/application/controllers/LocaleController.php:388 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:25 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:56 +msgid "Set Default" +msgstr "设为默认" -#: airtime_mvc/application/controllers/LocaleController.php:319 -msgid "DJs can do the following:" -msgstr "节目编辑的æƒé™åŒ…括:" +#: airtime_mvc/application/controllers/LocaleController.php:389 +msgid "Create Entry" +msgstr "创建项目" -#: airtime_mvc/application/controllers/LocaleController.php:320 -msgid "Manage assigned show content" -msgstr "为指派的节目管ç†èŠ‚目内容" +#: airtime_mvc/application/controllers/LocaleController.php:390 +msgid "Edit History Record" +msgstr "编辑历å²è®°å½•" -#: airtime_mvc/application/controllers/LocaleController.php:321 -msgid "Import media files" -msgstr "导入媒体文件" +#: airtime_mvc/application/controllers/LocaleController.php:393 +#, php-format +msgid "Copied %s row%s to the clipboard" +msgstr "å¤åˆ¶%sè¡Œ%s到剪贴æ¿" -#: airtime_mvc/application/controllers/LocaleController.php:322 -msgid "Create playlists, smart blocks, and webstreams" -msgstr "创建播放列表,智能模å—和网络æµåª’体" +#: airtime_mvc/application/controllers/LocaleController.php:394 +#, php-format +msgid "%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished." +msgstr "%s打å°é¢„览%s请使用æµè§ˆå™¨çš„打å°åŠŸèƒ½è¿›è¡Œæ‰“å°ã€‚按下Escé”®å¯ä»¥é€€å‡ºå½“å‰çŠ¶æ€ã€‚" -#: airtime_mvc/application/controllers/LocaleController.php:323 -msgid "Manage their own library content" -msgstr "管ç†åª’体库中属于自己的内容" +#: airtime_mvc/application/controllers/DashboardController.php:36 +#: airtime_mvc/application/controllers/DashboardController.php:85 +msgid "You don't have permission to disconnect source." +msgstr "你没有断开输入æºçš„æƒé™ã€‚" -#: airtime_mvc/application/controllers/LocaleController.php:324 -msgid "Progam Managers can do the following:" -msgstr "节目主管的æƒé™æ˜¯ï¼š" +#: airtime_mvc/application/controllers/DashboardController.php:38 +#: airtime_mvc/application/controllers/DashboardController.php:87 +msgid "There is no source connected to this input." +msgstr "没有连接上的输入æºã€‚" -#: airtime_mvc/application/controllers/LocaleController.php:325 -msgid "View and manage show content" -msgstr "查看和管ç†èŠ‚目内容" +#: airtime_mvc/application/controllers/DashboardController.php:82 +msgid "You don't have permission to switch source." +msgstr "你没有切æ¢çš„æƒé™ã€‚" -#: airtime_mvc/application/controllers/LocaleController.php:326 -msgid "Schedule shows" -msgstr "安排节目日程" +#: airtime_mvc/application/controllers/PlaylistController.php:48 +#, php-format +msgid "You are viewing an older version of %s" +msgstr "你所查看的%s已更改" -#: airtime_mvc/application/controllers/LocaleController.php:327 -msgid "Manage all library content" -msgstr "管ç†åª’体库的所有内容" +#: airtime_mvc/application/controllers/PlaylistController.php:123 +msgid "You cannot add tracks to dynamic blocks." +msgstr "动æ€æ™ºèƒ½æ¨¡å—ä¸èƒ½æ·»åŠ å£°éŸ³æ–‡ä»¶ã€‚" -#: airtime_mvc/application/controllers/LocaleController.php:328 -msgid "Admins can do the following:" -msgstr "管ç†å‘˜çš„æƒé™åŒ…括:" +#: airtime_mvc/application/controllers/PlaylistController.php:130 +#: airtime_mvc/application/controllers/LibraryController.php:125 +#, php-format +msgid "%s not found" +msgstr "%sä¸å­˜åœ¨" -#: airtime_mvc/application/controllers/LocaleController.php:329 -msgid "Manage preferences" -msgstr "属性管ç†" +#: airtime_mvc/application/controllers/PlaylistController.php:144 +#, php-format +msgid "You don't have permission to delete selected %s(s)." +msgstr "你没有删除所选%sçš„æƒé™ã€‚" -#: airtime_mvc/application/controllers/LocaleController.php:330 -msgid "Manage users" -msgstr "管ç†ç”¨æˆ·" +#: airtime_mvc/application/controllers/PlaylistController.php:151 +#: airtime_mvc/application/controllers/LibraryController.php:134 +msgid "Something went wrong." +msgstr "未知错误。" -#: airtime_mvc/application/controllers/LocaleController.php:331 -msgid "Manage watched folders" -msgstr "管ç†ç›‘控文件夹" +#: airtime_mvc/application/controllers/PlaylistController.php:157 +msgid "You can only add tracks to smart block." +msgstr "智能模å—åªèƒ½æ·»åŠ åª’体文件。" -#: airtime_mvc/application/controllers/LocaleController.php:332 -#: airtime_mvc/application/forms/SupportSettings.php:112 -#: airtime_mvc/application/forms/RegisterAirtime.php:116 -msgid "Send support feedback" -msgstr "æ交å馈æ„è§" +#: airtime_mvc/application/controllers/PlaylistController.php:175 +msgid "Untitled Playlist" +msgstr "未命å的播放列表" -#: airtime_mvc/application/controllers/LocaleController.php:333 -msgid "View system status" -msgstr "显示系统状æ€" +#: airtime_mvc/application/controllers/PlaylistController.php:177 +msgid "Untitled Smart Block" +msgstr "未命å的智能模å—" -#: airtime_mvc/application/controllers/LocaleController.php:334 -msgid "Access playout history" -msgstr "查看播放历å²" +#: airtime_mvc/application/controllers/PlaylistController.php:495 +msgid "Unknown Playlist" +msgstr "ä½ç½®æ’­æ”¾åˆ—表" -#: airtime_mvc/application/controllers/LocaleController.php:335 -msgid "View listener stats" -msgstr "显示收å¬ç»Ÿè®¡æ•°æ®" +#: airtime_mvc/application/controllers/ApiController.php:60 +#: airtime_mvc/application/controllers/Apiv2Controller.php:77 +msgid "You are not allowed to access this resource." +msgstr "你没有访问该资æºçš„æƒé™" -#: airtime_mvc/application/controllers/LocaleController.php:337 -msgid "Show / hide columns" -msgstr "显示/éšè—æ " +#: airtime_mvc/application/controllers/ApiController.php:315 +#: airtime_mvc/application/controllers/ApiController.php:377 +msgid "You are not allowed to access this resource. " +msgstr "你没有访问该资æºçš„æƒé™" -#: airtime_mvc/application/controllers/LocaleController.php:339 -msgid "From {from} to {to}" -msgstr "从{from}到{to}" +#: airtime_mvc/application/controllers/ApiController.php:558 +msgid "File does not exist in Airtime." +msgstr "Airtime中ä¸å­˜åœ¨è¯¥æ–‡ä»¶ã€‚" -#: airtime_mvc/application/controllers/LocaleController.php:340 -msgid "kbps" -msgstr "åƒæ¯”特æ¯ç§’" +#: airtime_mvc/application/controllers/ApiController.php:578 +msgid "File does not exist in Airtime" +msgstr "Airtime中ä¸å­˜åœ¨è¯¥æ–‡ä»¶ã€‚" -#: airtime_mvc/application/controllers/LocaleController.php:341 -msgid "yyyy-mm-dd" -msgstr "å¹´-月-æ—¥" +#: airtime_mvc/application/controllers/ApiController.php:590 +msgid "File doesn't exist in Airtime." +msgstr "Airtime中ä¸å­˜åœ¨è¯¥æ–‡ä»¶ã€‚" -#: airtime_mvc/application/controllers/LocaleController.php:342 -msgid "hh:mm:ss.t" -msgstr "æ—¶:分:秒" +#: airtime_mvc/application/controllers/ApiController.php:641 +msgid "Bad request. no 'mode' parameter passed." +msgstr "请求错误。没有æ供‘模å¼â€™å‚数。" -#: airtime_mvc/application/controllers/LocaleController.php:343 -msgid "kHz" -msgstr "åƒèµ«å…¹" +#: airtime_mvc/application/controllers/ApiController.php:651 +msgid "Bad request. 'mode' parameter is invalid" +msgstr "请求错误。æ供的‘模å¼â€™å‚数无效。" -#: airtime_mvc/application/controllers/LocaleController.php:346 -msgid "Su" -msgstr "周天" +#: airtime_mvc/application/controllers/LibraryController.php:189 +#: airtime_mvc/application/controllers/ShowbuilderController.php:194 +msgid "Preview" +msgstr "预览" -#: airtime_mvc/application/controllers/LocaleController.php:347 -msgid "Mo" -msgstr "周一" +#: airtime_mvc/application/controllers/LibraryController.php:210 +#: airtime_mvc/application/controllers/LibraryController.php:234 +#: airtime_mvc/application/controllers/LibraryController.php:257 +msgid "Add to Playlist" +msgstr "添加到播放列表" -#: airtime_mvc/application/controllers/LocaleController.php:348 -msgid "Tu" -msgstr "周二" +#: airtime_mvc/application/controllers/LibraryController.php:212 +msgid "Add to Smart Block" +msgstr "添加到智能模å—" + +#: airtime_mvc/application/controllers/LibraryController.php:217 +#: airtime_mvc/application/controllers/LibraryController.php:246 +#: airtime_mvc/application/controllers/LibraryController.php:265 +#: airtime_mvc/application/controllers/ShowbuilderController.php:202 +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:19 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:30 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:27 +#: airtime_mvc/application/services/CalendarService.php:186 +#: airtime_mvc/application/services/CalendarService.php:201 +#: airtime_mvc/application/services/CalendarService.php:206 +msgid "Delete" +msgstr "删除" -#: airtime_mvc/application/controllers/LocaleController.php:349 -msgid "We" -msgstr "周三" +#: airtime_mvc/application/controllers/LibraryController.php:226 +msgid "Duplicate Playlist" +msgstr "å¤åˆ¶æ’­æ”¾åˆ—表" -#: airtime_mvc/application/controllers/LocaleController.php:350 -msgid "Th" -msgstr "周四" +#: airtime_mvc/application/controllers/LibraryController.php:241 +#: airtime_mvc/application/controllers/LibraryController.php:263 +#: airtime_mvc/application/services/CalendarService.php:157 +msgid "Edit" +msgstr "编辑" -#: airtime_mvc/application/controllers/LocaleController.php:351 -msgid "Fr" -msgstr "周五" +#: airtime_mvc/application/controllers/LibraryController.php:276 +msgid "Soundcloud" +msgstr "Soundcloud" -#: airtime_mvc/application/controllers/LocaleController.php:352 -msgid "Sa" -msgstr "周六" +#: airtime_mvc/application/controllers/LibraryController.php:282 +#: airtime_mvc/application/services/CalendarService.php:65 +msgid "View on Soundcloud" +msgstr "在Soundcloud中查看" -#: airtime_mvc/application/controllers/LocaleController.php:355 -msgid "Hour" -msgstr "å°æ—¶" +#: airtime_mvc/application/controllers/LibraryController.php:286 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Re-upload to SoundCloud" +msgstr "é‡æ–°ä¸Šä¼ åˆ°SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:356 -msgid "Minute" -msgstr "分钟" +#: airtime_mvc/application/controllers/LibraryController.php:288 +#: airtime_mvc/application/services/CalendarService.php:70 +msgid "Upload to SoundCloud" +msgstr "上传到SoundCloud" -#: airtime_mvc/application/controllers/LocaleController.php:357 -msgid "Done" -msgstr "设定" +#: airtime_mvc/application/controllers/LibraryController.php:295 +msgid "No action available" +msgstr "没有æ“作选择" -#: airtime_mvc/application/controllers/LocaleController.php:360 -msgid "Select files" -msgstr "选择文件" +#: airtime_mvc/application/controllers/LibraryController.php:315 +msgid "You don't have permission to delete selected items." +msgstr "你没有删除选定项目的æƒé™ã€‚" -#: airtime_mvc/application/controllers/LocaleController.php:361 -#: airtime_mvc/application/controllers/LocaleController.php:362 -msgid "Add files to the upload queue and click the start button." -msgstr "添加需è¦ä¸Šä¼ çš„文件到传输队列中,然åŽç‚¹å‡»å¼€å§‹ä¸Šä¼ ã€‚" +#: airtime_mvc/application/controllers/LibraryController.php:364 +msgid "Could not delete some scheduled files." +msgstr "部分已ç»å®‰æŽ’的节目内容ä¸èƒ½åˆ é™¤ã€‚" -#: airtime_mvc/application/controllers/LocaleController.php:365 -msgid "Add Files" -msgstr "添加文件" +#: airtime_mvc/application/controllers/LibraryController.php:404 +#, php-format +msgid "Copy of %s" +msgstr "%s的副本" -#: airtime_mvc/application/controllers/LocaleController.php:366 -msgid "Stop Upload" -msgstr "åœæ­¢ä¸Šä¼ " +#: airtime_mvc/application/controllers/ShowbuilderController.php:196 +msgid "Select cursor" +msgstr "选择游标" -#: airtime_mvc/application/controllers/LocaleController.php:367 -msgid "Start upload" -msgstr "开始上传" +#: airtime_mvc/application/controllers/ShowbuilderController.php:197 +msgid "Remove cursor" +msgstr "删除游标" -#: airtime_mvc/application/controllers/LocaleController.php:368 -msgid "Add files" -msgstr "添加文件" +#: airtime_mvc/application/controllers/ShowbuilderController.php:216 +msgid "show does not exist" +msgstr "节目ä¸å­˜åœ¨" -#: airtime_mvc/application/controllers/LocaleController.php:369 -#, php-format -msgid "Uploaded %d/%d files" -msgstr "å·²ç»ä¸Šä¼ %d/%d个文件" +#: airtime_mvc/application/controllers/PreferenceController.php:74 +msgid "Preferences updated." +msgstr "属性已更新。" -#: airtime_mvc/application/controllers/LocaleController.php:370 -msgid "N/A" -msgstr "未知" +#: airtime_mvc/application/controllers/PreferenceController.php:125 +msgid "Support setting updated." +msgstr "支æŒè®¾å®šå·²æ›´æ–°ã€‚" -#: airtime_mvc/application/controllers/LocaleController.php:371 -msgid "Drag files here." -msgstr "拖拽文件到此处。" +#: airtime_mvc/application/controllers/PreferenceController.php:137 +#: airtime_mvc/application/configs/navigation.php:70 +msgid "Support Feedback" +msgstr "æ„è§å馈" -#: airtime_mvc/application/controllers/LocaleController.php:372 -msgid "File extension error." -msgstr "文件åŽç¼€å出错。" +#: airtime_mvc/application/controllers/PreferenceController.php:332 +msgid "Stream Setting Updated." +msgstr "æµè®¾ç½®å·²æ›´æ–°ã€‚" -#: airtime_mvc/application/controllers/LocaleController.php:373 -msgid "File size error." -msgstr "文件大å°å‡ºé”™ã€‚" +#: airtime_mvc/application/controllers/PreferenceController.php:365 +msgid "path should be specified" +msgstr "请指定路径" -#: airtime_mvc/application/controllers/LocaleController.php:374 -msgid "File count error." -msgstr "å‘生文件统计错误。" +#: airtime_mvc/application/controllers/PreferenceController.php:460 +msgid "Problem with Liquidsoap..." +msgstr "Liquidsoap出错..." -#: airtime_mvc/application/controllers/LocaleController.php:375 -msgid "Init error." -msgstr "å‘生åˆå§‹åŒ–错误。" +#: airtime_mvc/application/configs/navigation.php:12 +msgid "Now Playing" +msgstr "直播室" -#: airtime_mvc/application/controllers/LocaleController.php:376 -msgid "HTTP Error." -msgstr "å‘生HTTP类型的错误" +#: airtime_mvc/application/configs/navigation.php:19 +msgid "Add Media" +msgstr "添加媒体" -#: airtime_mvc/application/controllers/LocaleController.php:377 -msgid "Security error." -msgstr "å‘生安全性错误。" +#: airtime_mvc/application/configs/navigation.php:26 +msgid "Library" +msgstr "媒体库" -#: airtime_mvc/application/controllers/LocaleController.php:378 -msgid "Generic error." -msgstr "å‘生通用类型的错误。" +#: airtime_mvc/application/configs/navigation.php:33 +msgid "Calendar" +msgstr "节目日程" -#: airtime_mvc/application/controllers/LocaleController.php:379 -msgid "IO error." -msgstr "输入输出错误。" +#: airtime_mvc/application/configs/navigation.php:40 +msgid "System" +msgstr "系统" -#: airtime_mvc/application/controllers/LocaleController.php:380 -#, php-format -msgid "File: %s" -msgstr "文件:%s" +#: airtime_mvc/application/configs/navigation.php:45 +#: airtime_mvc/application/views/scripts/preference/index.phtml:2 +msgid "Preferences" +msgstr "系统属性" -#: airtime_mvc/application/controllers/LocaleController.php:382 -#, php-format -msgid "%d files queued" -msgstr "队列中有%d个文件" +#: airtime_mvc/application/configs/navigation.php:50 +msgid "Users" +msgstr "用户管ç†" -#: airtime_mvc/application/controllers/LocaleController.php:383 -msgid "File: %f, size: %s, max file size: %m" -msgstr "文件:%f,大å°ï¼š%s,最大的文件大å°ï¼š%m" +#: airtime_mvc/application/configs/navigation.php:57 +msgid "Media Folders" +msgstr "存储路径" -#: airtime_mvc/application/controllers/LocaleController.php:384 -msgid "Upload URL might be wrong or doesn't exist" -msgstr "用于上传的地å€æœ‰è¯¯æˆ–者ä¸å­˜åœ¨" +#: airtime_mvc/application/configs/navigation.php:64 +msgid "Streams" +msgstr "媒体æµè®¾ç½®" -#: airtime_mvc/application/controllers/LocaleController.php:385 -msgid "Error: File too large: " -msgstr "错误:文件过大:" +#: airtime_mvc/application/configs/navigation.php:83 +msgid "Listener Stats" +msgstr "收å¬çŠ¶æ€" -#: airtime_mvc/application/controllers/LocaleController.php:386 -msgid "Error: Invalid file extension: " -msgstr "错误:无效的文件åŽç¼€å:" +#: airtime_mvc/application/configs/navigation.php:92 +msgid "History" +msgstr "历å²è®°å½•" -#: airtime_mvc/application/controllers/LocaleController.php:389 -msgid "Create Entry" -msgstr "创建项目" +#: airtime_mvc/application/configs/navigation.php:97 +msgid "Playout History" +msgstr "播出历å²" -#: airtime_mvc/application/controllers/LocaleController.php:390 -msgid "Edit History Record" -msgstr "编辑历å²è®°å½•" +#: airtime_mvc/application/configs/navigation.php:104 +msgid "History Templates" +msgstr "历å²è®°å½•æ¨¡æ¿" -#: airtime_mvc/application/controllers/LocaleController.php:393 -#, php-format -msgid "Copied %s row%s to the clipboard" -msgstr "å¤åˆ¶%sè¡Œ%s到剪贴æ¿" +#: airtime_mvc/application/configs/navigation.php:113 +#: airtime_mvc/application/views/scripts/error/error.phtml:13 +msgid "Help" +msgstr "帮助" -#: airtime_mvc/application/controllers/LocaleController.php:394 -#, php-format -msgid "" -"%sPrint view%sPlease use your browser's print function to print this table. " -"Press escape when finished." -msgstr "%s打å°é¢„览%s请使用æµè§ˆå™¨çš„打å°åŠŸèƒ½è¿›è¡Œæ‰“å°ã€‚按下Escé”®å¯ä»¥é€€å‡ºå½“å‰çŠ¶æ€ã€‚" +#: airtime_mvc/application/configs/navigation.php:118 +msgid "Getting Started" +msgstr "基本用法" -#: airtime_mvc/application/controllers/LoginController.php:34 -msgid "Please enter your user name and password" -msgstr "请输入用户å和密ç " +#: airtime_mvc/application/configs/navigation.php:125 +msgid "User Manual" +msgstr "用户手册" -#: airtime_mvc/application/controllers/LoginController.php:77 -msgid "Wrong username or password provided. Please try again." -msgstr "用户å或密ç é”™è¯¯ï¼Œè¯·é‡è¯•ã€‚" +#: airtime_mvc/application/configs/navigation.php:130 +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:2 +msgid "About" +msgstr "关于" -#: airtime_mvc/application/controllers/LoginController.php:142 -msgid "" -"Email could not be sent. Check your mail server settings and ensure it has " -"been configured properly." -msgstr "邮件å‘é€å¤±è´¥ã€‚请检查邮件æœåŠ¡å™¨è®¾ç½®ï¼Œå¹¶ç¡®å®šè®¾ç½®æ— è¯¯ã€‚" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4 +msgid "Service" +msgstr "æœåŠ¡å称" -#: airtime_mvc/application/controllers/LoginController.php:145 -msgid "Given email not found." -msgstr "邮件地å€æ²¡æœ‰æ‰¾åˆ°ã€‚" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:6 +msgid "Uptime" +msgstr "在线时间" -#: airtime_mvc/application/controllers/PreferenceController.php:74 -msgid "Preferences updated." -msgstr "属性已更新。" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:7 +msgid "CPU" +msgstr "处ç†å™¨" -#: airtime_mvc/application/controllers/PreferenceController.php:125 -msgid "Support setting updated." -msgstr "支æŒè®¾å®šå·²æ›´æ–°ã€‚" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:8 +msgid "Memory" +msgstr "内存" -#: airtime_mvc/application/controllers/PreferenceController.php:137 -#: airtime_mvc/application/configs/navigation.php:70 -msgid "Support Feedback" -msgstr "æ„è§å馈" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14 +msgid "Airtime Version" +msgstr "Airtime版本" -#: airtime_mvc/application/controllers/PreferenceController.php:332 -msgid "Stream Setting Updated." -msgstr "æµè®¾ç½®å·²æ›´æ–°ã€‚" +#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30 +msgid "Disk Space" +msgstr "ç£ç›˜ç©ºé—´" -#: airtime_mvc/application/controllers/PreferenceController.php:365 -msgid "path should be specified" -msgstr "请指定路径" +#: airtime_mvc/application/views/scripts/form/preferences.phtml:5 +msgid "Email / Mail Server Settings" +msgstr "邮件æœåŠ¡å™¨è®¾ç½®" -#: airtime_mvc/application/controllers/PreferenceController.php:460 -msgid "Problem with Liquidsoap..." -msgstr "Liquidsoap出错..." +#: airtime_mvc/application/views/scripts/form/preferences.phtml:10 +msgid "SoundCloud Settings" +msgstr "SoundCloud设置" -#: airtime_mvc/application/controllers/ShowbuilderController.php:196 -msgid "Select cursor" -msgstr "选择游标" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:4 +msgid "Repeat Days:" +msgstr "é‡å¤å¤©æ•°ï¼š" -#: airtime_mvc/application/controllers/ShowbuilderController.php:197 -msgid "Remove cursor" -msgstr "删除游标" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:18 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:18 +msgid "Remove" +msgstr "移除" -#: airtime_mvc/application/controllers/ShowbuilderController.php:216 -msgid "show does not exist" -msgstr "节目ä¸å­˜åœ¨" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:28 +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40 +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:75 +msgid "Add" +msgstr "添加" -#: airtime_mvc/application/controllers/WebstreamController.php:29 -#: airtime_mvc/application/controllers/WebstreamController.php:33 -msgid "Untitled Webstream" -msgstr "未命å的网络æµåª’体" +#: airtime_mvc/application/views/scripts/form/add-show-live-stream.phtml:53 +msgid "Connection URL: " +msgstr "链接地å€ï¼š" -#: airtime_mvc/application/controllers/WebstreamController.php:138 -msgid "Webstream saved." -msgstr "网络æµåª’体已ä¿å­˜ã€‚" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:2 +msgid "Input Stream Settings" +msgstr "输入æµè®¾ç½®" -#: airtime_mvc/application/controllers/WebstreamController.php:146 -msgid "Invalid form values." -msgstr "无效的表格内容。" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:109 +msgid "Master Source Connection URL:" +msgstr "主输入æµçš„链接地å€ï¼š" -#: airtime_mvc/application/controllers/PlaylistController.php:48 -#, php-format -msgid "You are viewing an older version of %s" -msgstr "你所查看的%s已更改" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:115 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:159 +msgid "Override" +msgstr "覆盖" -#: airtime_mvc/application/controllers/PlaylistController.php:123 -msgid "You cannot add tracks to dynamic blocks." -msgstr "动æ€æ™ºèƒ½æ¨¡å—ä¸èƒ½æ·»åŠ å£°éŸ³æ–‡ä»¶ã€‚" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "OK" +msgstr "确定" -#: airtime_mvc/application/controllers/PlaylistController.php:144 -#, php-format -msgid "You don't have permission to delete selected %s(s)." -msgstr "你没有删除所选%sçš„æƒé™ã€‚" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:120 +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:164 +msgid "RESET" +msgstr "é‡ç½®" -#: airtime_mvc/application/controllers/PlaylistController.php:157 -msgid "You can only add tracks to smart block." -msgstr "智能模å—åªèƒ½æ·»åŠ åª’体文件。" +#: airtime_mvc/application/views/scripts/form/preferences_livestream.phtml:153 +msgid "Show Source Connection URL:" +msgstr "节目定制输入æµçš„链接地å€ï¼š" -#: airtime_mvc/application/controllers/PlaylistController.php:175 -msgid "Untitled Playlist" -msgstr "未命å的播放列表" +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:74 +#: airtime_mvc/application/views/scripts/form/preferences_email_server.phtml:90 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:44 +#: airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml:59 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:47 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:34 +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:48 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:46 +#: airtime_mvc/application/views/scripts/form/preferences_general.phtml:97 +msgid "(Required)" +msgstr "(必填)" -#: airtime_mvc/application/controllers/PlaylistController.php:177 -msgid "Untitled Smart Block" -msgstr "未命å的智能模å—" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:1 +msgid "Register Airtime" +msgstr "注册Airtime" -#: airtime_mvc/application/controllers/PlaylistController.php:495 -msgid "Unknown Playlist" -msgstr "ä½ç½®æ’­æ”¾åˆ—表" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:6 +#, php-format +msgid "Help Airtime improve by letting us know how you are using it. This info will be collected regularly in order to enhance your user experience.%sClick 'Yes, help Airtime' and we'll make sure the features you use are constantly improving." +msgstr "通过告诉我们您使用Airtimeçš„æ–¹å¼ï¼Œå¯ä»¥å¸®åŠ©æˆ‘们改进Airtime。这些信æ¯ä¼šå‘¨æœŸæ€§çš„收集起æ¥ï¼Œå¹¶ä¸”æ高您的用户体验。%s点击‘是的,帮助Airtime’,就能让我们确ä¿ä½ æ‰€ä½¿ç”¨çš„功能æŒç»­åœ°å¾—到改进。" -#: airtime_mvc/application/controllers/ErrorController.php:17 -msgid "Page not found" -msgstr "页é¢ä¸å­˜åœ¨" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:25 +#, php-format +msgid "Click the box below to advertise your station on %sSourcefabric.org%s. In order to promote your station, 'Send support feedback' must be enabled. This data will be collected in addition to the support feedback." +msgstr "勾选下é¢çš„选项,就å¯ä»¥åœ¨%sSourcefabric.org%s上推广您的电å°ã€‚å‰æ是‘å‘é€æ”¯æŒå馈’选项已ç»å¯ç”¨ã€‚这些数æ®å°†ä¼šè¢«æ”¶é›†èµ·æ¥ä»¥ä½œä¸ºæ”¯æŒå馈的信æ¯ã€‚" -#: airtime_mvc/application/controllers/ErrorController.php:22 -msgid "Application error" -msgstr "应用程åºé”™è¯¯" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:65 +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:79 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:61 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:76 +msgid "(for verification purposes only, will not be published)" +msgstr "(仅作为验è¯ç›®çš„使用,ä¸ä¼šç”¨äºŽå‘布)" -#: airtime_mvc/application/controllers/UserController.php:82 -msgid "User added successfully!" -msgstr "用户已添加æˆåŠŸï¼" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:150 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:151 +msgid "Note: Anything larger than 600x600 will be resized." +msgstr "注æ„:大于600x600的图片将会被缩放" -#: airtime_mvc/application/controllers/UserController.php:84 -msgid "User updated successfully!" -msgstr "用于已æˆåŠŸæ›´æ–°ï¼" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:164 +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:164 +msgid "Show me what I am sending " +msgstr "显示我所å‘é€çš„ä¿¡æ¯" -#: airtime_mvc/application/controllers/UserController.php:154 -msgid "Settings updated successfully!" -msgstr "设置更新æˆåŠŸï¼" +#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:178 +msgid "Terms and Conditions" +msgstr "使用æ¡æ¬¾" -#: airtime_mvc/application/common/DateHelper.php:213 -#, php-format -msgid "The year %s must be within the range of 1753 - 9999" -msgstr "1753 - 9999 是å¯ä»¥æŽ¥å—的年代值,而ä¸æ˜¯â€œ%sâ€" +#: airtime_mvc/application/views/scripts/form/login.phtml:34 +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:3 +msgid "Reset password" +msgstr "é‡ç½®å¯†ç " -#: airtime_mvc/application/common/DateHelper.php:216 -#, php-format -msgid "%s-%s-%s is not a valid date" -msgstr "%s-%s-%s采用了错误的日期格å¼" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9 +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27 +msgid "Choose folder" +msgstr "选择文件夹" -#: airtime_mvc/application/common/DateHelper.php:240 -#, php-format -msgid "%s:%s:%s is not a valid time" -msgstr "%s:%s:%s 采用了错误的时间格å¼" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10 +msgid "Set" +msgstr "设置" -#: airtime_mvc/application/forms/AddShowWhat.php:30 -msgid "Untitled Show" -msgstr "未命å节目" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:19 +msgid "Current Import Folder:" +msgstr "当å‰çš„导入文件夹:" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:14 -msgid "Import Folder:" -msgstr "导入文件夹:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43 +msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)" +msgstr "é‡æ–°æ‰«æ监控的文件夹(针对于需è¦æ‰‹åŠ¨æ›´æ–°çš„网络存储路径)" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:25 -msgid "Watched Folders:" -msgstr "监控文件夹:" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44 +msgid "Remove watched directory" +msgstr "移除监控文件夹" -#: airtime_mvc/application/forms/WatchedDirPreferences.php:40 -msgid "Not a valid Directory" -msgstr "无效的路径" +#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:50 +msgid "You are not watching any media folders." +msgstr "你没有正在监控的文件夹。" -#: airtime_mvc/application/forms/AddUser.php:25 -#: airtime_mvc/application/forms/Login.php:19 -#: airtime_mvc/application/forms/EditUser.php:32 -msgid "Username:" -msgstr "用户å:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:4 +msgid "Stream " +msgstr "æµ" -#: airtime_mvc/application/forms/AddUser.php:34 -#: airtime_mvc/application/forms/Login.php:34 -#: airtime_mvc/application/forms/EditUser.php:43 -msgid "Password:" -msgstr "密ç ï¼š" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:77 +msgid "Additional Options" +msgstr "附属选项" -#: airtime_mvc/application/forms/AddUser.php:42 -#: airtime_mvc/application/forms/EditUser.php:52 -msgid "Verify Password:" -msgstr "å†æ¬¡è¾“入密ç ï¼š" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:137 +msgid "The following info will be displayed to listeners in their media player:" +msgstr "以下内容将会在å¬ä¼—的媒体播放器上显示:" -#: airtime_mvc/application/forms/AddUser.php:51 -#: airtime_mvc/application/forms/EditUser.php:62 -msgid "Firstname:" -msgstr "å:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:170 +msgid "(Your radio station website)" +msgstr "(你电å°çš„网站)" -#: airtime_mvc/application/forms/AddUser.php:57 -#: airtime_mvc/application/forms/EditUser.php:70 -msgid "Lastname:" -msgstr "姓:" +#: airtime_mvc/application/views/scripts/form/stream-setting-form.phtml:208 +msgid "Stream URL: " +msgstr "æµçš„链接地å€ï¼š" -#: airtime_mvc/application/forms/AddUser.php:63 -#: airtime_mvc/application/forms/SupportSettings.php:46 -#: airtime_mvc/application/forms/EditUser.php:78 -#: airtime_mvc/application/forms/RegisterAirtime.php:51 -msgid "Email:" -msgstr "电邮:" +#: airtime_mvc/application/views/scripts/form/daterange.phtml:6 +msgid "Filter History" +msgstr "历å²è®°å½•è¿‡æ»¤" -#: airtime_mvc/application/forms/AddUser.php:72 -#: airtime_mvc/application/forms/EditUser.php:89 -msgid "Mobile Phone:" -msgstr "手机:" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:7 +msgid "Find Shows" +msgstr "查找节目" -#: airtime_mvc/application/forms/AddUser.php:78 -#: airtime_mvc/application/forms/EditUser.php:97 -msgid "Skype:" -msgstr "Skypeå¸å·ï¼š" +#: airtime_mvc/application/views/scripts/form/showbuilder.phtml:12 +msgid "Filter By Show:" +msgstr "节目过滤器" -#: airtime_mvc/application/forms/AddUser.php:84 -#: airtime_mvc/application/forms/EditUser.php:105 -msgid "Jabber:" -msgstr "Jabberå¸å·ï¼š" +#: airtime_mvc/application/views/scripts/form/edit-user.phtml:1 +#, php-format +msgid "%s's Settings" +msgstr "%s设置" -#: airtime_mvc/application/forms/AddUser.php:91 -msgid "User Type:" -msgstr "用户类型:" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:5 +#, php-format +msgid "Help Airtime improve by letting Sourcefabric know how you are using it. This information will be collected regularly in order to enhance your user experience.%sClick the 'Send support feedback' box and we'll make sure the features you use are constantly improving." +msgstr "通过告诉Sourcefabric您是如何使用Airtime的,å¯ä»¥å¸®åŠ©æˆ‘们改进Airtime。这些信æ¯å°†ä¼šè¢«æ‰‹æœºèµ·æ¥ç”¨äºŽæ高您的客户体验。%såªè¦å‹¾é€‰â€˜å‘é€æ”¯æŒå馈’,就能确ä¿è®©æˆ‘们æŒç»­æ”¹è¿›æ‚¨æ‰€ä½¿ç”¨" -#: airtime_mvc/application/forms/AddUser.php:116 -#: airtime_mvc/application/forms/EditUser.php:135 -msgid "Login name is not unique." -msgstr "å¸å·é‡å。" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23 +#, php-format +msgid "Click the box below to promote your station on %sSourcefabric.org%s." +msgstr "勾选éšåŽçš„选项就å¯ä»¥åœ¨%sSourcefabric.org%s上推广您的电å°ã€‚" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:19 -msgid "Auto Switch Off" -msgstr "当输入æµæ–­å¼€æ—¶è‡ªåŠ¨å…³é—­" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41 +msgid "(In order to promote your station, 'Send support feedback' must be enabled)." +msgstr "(为了推广您的电å°ï¼Œè¯·å¯ç”¨â€˜å‘é€æ”¯æŒå馈’)" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:26 -msgid "Auto Switch On" -msgstr "当输入æµè¿žæŽ¥æ—¶è‡ªåŠ¨æ‰“å¼€" +#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186 +msgid "Sourcefabric Privacy Policy" +msgstr "Sourcefabricéšç§ç­–ç•¥" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:33 -msgid "Switch Transition Fade (s)" -msgstr "切æ¢æ—¶çš„淡入淡出效果(秒)" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:45 +msgid "Choose Show Instance" +msgstr "选择节目项" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:36 -msgid "enter a time in seconds 00{.000000}" -msgstr "请输入秒数00{.000000}" +#: airtime_mvc/application/views/scripts/form/edit-history-item.phtml:56 +msgid "Find" +msgstr "查找" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:45 -msgid "Master Username" -msgstr "主输入æµçš„用户å" +#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:4 +msgid "Choose Days:" +msgstr "选择天数:" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:62 -msgid "Master Password" -msgstr "主输入æµçš„密ç " +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:3 +msgid "Smart Block Options" +msgstr "智能模å—选项" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:70 -msgid "Master Source Connection URL" -msgstr "主输入æµçš„链接地å€" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:39 +msgid "or" +msgstr "或" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:78 -msgid "Show Source Connection URL" -msgstr "节目定制输入æµçš„链接地å€" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:40 +msgid "and" +msgstr "å’Œ" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:87 -msgid "Master Source Port" -msgstr "主输入æµçš„端å£" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:63 +msgid " to " +msgstr "到" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:90 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:109 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:112 -msgid "Only numbers are allowed." -msgstr "åªå…许输入数字" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:120 +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:133 +msgid "files meet the criteria" +msgstr "个文件符åˆæ¡ä»¶" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:96 -msgid "Master Source Mount Point" -msgstr "主输入æµçš„加载点" +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:127 +msgid "file meet the criteria" +msgstr "个文件符åˆæ¡ä»¶" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:99 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:118 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:100 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:123 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:144 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:174 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:186 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:198 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:210 -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:26 -#: airtime_mvc/application/forms/DateRange.php:35 -#: airtime_mvc/application/forms/DateRange.php:63 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:31 -#: airtime_mvc/application/forms/ShowBuilder.php:37 -#: airtime_mvc/application/forms/ShowBuilder.php:65 -msgid "Invalid character entered" -msgstr "输入的字符ä¸åˆè¦æ±‚" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:2 +msgid "Creating File Summary Template" +msgstr "创建文件播放记录模æ¿" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:106 -msgid "Show Source Port" -msgstr "节目定制输入æµçš„端å£" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:4 +msgid "Creating Log Sheet Template" +msgstr "创建历å²è®°å½•è¡¨å•æ¨¡æ¿" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:115 -msgid "Show Source Mount Point" -msgstr "节目定制输入æµçš„加载点" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:46 +msgid "Add more elements" +msgstr "增加更多元素" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:153 -msgid "You cannot use same port as Master DJ port." -msgstr "端å£è®¾ç½®ä¸èƒ½é‡å¤" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:67 +msgid "Add New Field" +msgstr "添加新项目" -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:164 -#: airtime_mvc/application/forms/LiveStreamingPreferences.php:182 -#, php-format -msgid "Port %s is not available" -msgstr "%s端å£å·²è¢«å ç”¨" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/template-contents.phtml:83 +msgid "Set Default Template" +msgstr "设为默认模æ¿" -#: airtime_mvc/application/forms/AddShowWhen.php:16 -msgid "'%value%' does not fit the time format 'HH:mm'" -msgstr "'%value%' ä¸ç¬¦åˆå½¢å¦‚ 'å°æ—¶:分'çš„æ ¼å¼è¦æ±‚,例如,‘01:59’" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:4 +msgid "Log Sheet Templates" +msgstr "历å²è®°å½•è¡¨å•æ¨¡æ¿" -#: airtime_mvc/application/forms/AddShowWhen.php:22 -msgid "Date/Time Start:" -msgstr "开始日期/时间" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:7 +msgid "No Log Sheet Templates" +msgstr "无历å²è®°å½•è¡¨å•æ¨¡æ¿" -#: airtime_mvc/application/forms/AddShowWhen.php:49 -msgid "Date/Time End:" -msgstr "结æŸæ—¥æœŸ/时间" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:31 +msgid "New Log Sheet Template" +msgstr "新建历å²è®°å½•æ¨¡æ¿" -#: airtime_mvc/application/forms/AddShowWhen.php:74 -msgid "Duration:" -msgstr "时长:" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:35 +msgid "File Summary Templates" +msgstr "文件播放记录模æ¿åˆ—表" -#: airtime_mvc/application/forms/AddShowWhen.php:83 -msgid "Timezone:" -msgstr "时区" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:38 +msgid "No File Summary Templates" +msgstr "无文件播放记录模æ¿" -#: airtime_mvc/application/forms/AddShowWhen.php:92 -msgid "Repeats?" -msgstr "是å¦è®¾ç½®ä¸ºç³»åˆ—节目?" +#: airtime_mvc/application/views/scripts/playouthistorytemplate/index.phtml:62 +msgid "New File Summary Template" +msgstr "新建文件播放记录模æ¿" -#: airtime_mvc/application/forms/AddShowWhen.php:124 -msgid "Cannot create show in the past" -msgstr "节目ä¸èƒ½è®¾ç½®ä¸ºè¿‡åŽ»çš„时间" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11 +msgid "New" +msgstr "新建" -#: airtime_mvc/application/forms/AddShowWhen.php:132 -msgid "Cannot modify start date/time of the show that is already started" -msgstr "节目已ç»å¯åŠ¨ï¼Œæ— æ³•ä¿®æ”¹å¼€å§‹æ—¶é—´/日期" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:8 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:14 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:14 +msgid "New Playlist" +msgstr "新建播放列表" -#: airtime_mvc/application/forms/AddShowWhen.php:149 -msgid "Cannot have duration < 0m" -msgstr "节目时长ä¸èƒ½å°äºŽ0" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:9 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:15 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:15 +msgid "New Smart Block" +msgstr "新建智能模å—" -#: airtime_mvc/application/forms/AddShowWhen.php:153 -msgid "Cannot have duration 00h 00m" -msgstr "节目时长ä¸èƒ½ä¸º0" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:10 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:16 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:16 +msgid "New Webstream" +msgstr "新建网络æµåª’体" -#: airtime_mvc/application/forms/AddShowWhen.php:160 -msgid "Cannot have duration greater than 24h" -msgstr "节目时长ä¸èƒ½è¶…过24å°æ—¶" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:39 +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:53 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:55 +msgid "View / edit description" +msgstr "查看/编辑æè¿°" -#: airtime_mvc/application/forms/AddShowRepeats.php:10 -msgid "Link:" -msgstr "绑定:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:52 +msgid "Stream URL:" +msgstr "æµçš„链接地å€ï¼š" -#: airtime_mvc/application/forms/AddShowRepeats.php:16 -msgid "Repeat Type:" -msgstr "类型:" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:57 +msgid "Default Length:" +msgstr "默认长度:" -#: airtime_mvc/application/forms/AddShowRepeats.php:19 -msgid "weekly" -msgstr "æ¯å‘¨" +#: airtime_mvc/application/views/scripts/webstream/webstream.phtml:64 +msgid "No webstream" +msgstr "没有网络æµåª’体" -#: airtime_mvc/application/forms/AddShowRepeats.php:20 -msgid "every 2 weeks" -msgstr "æ¯éš”2周" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:2 +msgid "Stream Settings" +msgstr "æµè®¾å®š" -#: airtime_mvc/application/forms/AddShowRepeats.php:21 -msgid "every 3 weeks" -msgstr "æ¯éš”3周" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:12 +msgid "Global Settings" +msgstr "全局设定" -#: airtime_mvc/application/forms/AddShowRepeats.php:22 -msgid "every 4 weeks" -msgstr "æ¯éš”4周" +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:87 +msgid "dB" +msgstr "分è´" + +#: airtime_mvc/application/views/scripts/preference/stream-setting.phtml:106 +msgid "Output Stream Settings" +msgstr "输出æµè®¾å®š" -#: airtime_mvc/application/forms/AddShowRepeats.php:23 -msgid "monthly" -msgstr "æ¯æœˆ" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:3 +#: airtime_mvc/application/views/scripts/library/library.phtml:3 +msgid "File import in progress..." +msgstr "导入文件进行中..." -#: airtime_mvc/application/forms/AddShowRepeats.php:32 -msgid "Select Days:" -msgstr "选择天数:" +#: airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml:5 +#: airtime_mvc/application/views/scripts/library/library.phtml:10 +msgid "Advanced Search Options" +msgstr "高级查询选项" -#: airtime_mvc/application/forms/AddShowRepeats.php:47 -msgid "Repeat By:" -msgstr "é‡å¤ç±»åž‹ï¼š" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:23 +msgid "previous" +msgstr "å¾€å‰" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the month" -msgstr "按月的åŒä¸€æ—¥æœŸ" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:28 +msgid "play" +msgstr "播放" -#: airtime_mvc/application/forms/AddShowRepeats.php:50 -msgid "day of the week" -msgstr "一个星期的åŒä¸€æ—¥å­" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:32 +msgid "pause" +msgstr "æš‚åœ" -#: airtime_mvc/application/forms/AddShowRepeats.php:56 -#: airtime_mvc/application/forms/DateRange.php:44 -#: airtime_mvc/application/forms/ShowBuilder.php:46 -msgid "Date End:" -msgstr "结æŸæ—¥æœŸï¼š" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:37 +msgid "next" +msgstr "å¾€åŽ" -#: airtime_mvc/application/forms/AddShowRepeats.php:69 -msgid "No End?" -msgstr "无休止?" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:42 +msgid "stop" +msgstr "åœæ­¢" -#: airtime_mvc/application/forms/AddShowRepeats.php:106 -msgid "End date must be after start date" -msgstr "结æŸæ—¥æœŸåº”晚于开始日期" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:60 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:90 +msgid "mute" +msgstr "é™éŸ³" -#: airtime_mvc/application/forms/AddShowRepeats.php:113 -msgid "Please select a repeat day" -msgstr "请选择在哪一天é‡å¤" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:63 +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:91 +msgid "unmute" +msgstr "å–消é™éŸ³" -#: airtime_mvc/application/forms/customvalidators/ConditionalNotEmpty.php:26 -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:8 -msgid "Value is required and can't be empty" -msgstr "ä¸èƒ½ä¸ºç©º" +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:69 +msgid "max volume" +msgstr "最大音é‡" -#: airtime_mvc/application/forms/PasswordChange.php:17 -#: airtime_mvc/application/forms/StreamSettingSubForm.php:120 -#: airtime_mvc/application/forms/EmailServerPreferences.php:82 -msgid "Password" -msgstr "密ç " +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:79 +msgid "Update Required" +msgstr "需è¦æ›´æ–°å‡çº§" -#: airtime_mvc/application/forms/PasswordChange.php:28 -msgid "Confirm new password" -msgstr "确认新密ç " +#: airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml:80 +#, php-format +msgid "To play the media you will need to either update your browser to a recent version or update your %sFlash plugin%s." +msgstr "想è¦æ’­æ”¾åª’体,需è¦æ›´æ–°ä½ çš„æµè§ˆå™¨åˆ°æœ€æ–°çš„版本,或者更新你的%sFalshæ’件%s。" -#: airtime_mvc/application/forms/PasswordChange.php:36 -msgid "Password confirmation does not match your password." -msgstr "新密ç ä¸åŒ¹é…" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:13 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:36 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:38 +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:147 +msgid "Length:" +msgstr "长度:" -#: airtime_mvc/application/forms/PasswordChange.php:43 -msgid "Get new password" -msgstr "获å–新密ç " +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:14 +msgid "Sample Rate:" +msgstr "样本率:" -#: airtime_mvc/application/forms/SupportSettings.php:21 -#: airtime_mvc/application/forms/GeneralPreferences.php:21 -#: airtime_mvc/application/forms/RegisterAirtime.php:30 -msgid "Station Name" -msgstr "电å°å称" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24 +msgid "Isrc Number:" +msgstr "ISRCç¼–å·ï¼š" -#: airtime_mvc/application/forms/SupportSettings.php:34 -#: airtime_mvc/application/forms/RegisterAirtime.php:39 -msgid "Phone:" -msgstr "电è¯ï¼š" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27 +msgid "File Path:" +msgstr "文件路径:" -#: airtime_mvc/application/forms/SupportSettings.php:57 -#: airtime_mvc/application/forms/RegisterAirtime.php:62 -msgid "Station Web Site:" -msgstr "电å°ç½‘å€ï¼š" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:45 +msgid "Web Stream" +msgstr "网络æµåª’体" -#: airtime_mvc/application/forms/SupportSettings.php:68 -#: airtime_mvc/application/forms/RegisterAirtime.php:73 -msgid "Country:" -msgstr "国家:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:46 +msgid "Dynamic Smart Block" +msgstr "动æ€æ™ºèƒ½æ¨¡å—" -#: airtime_mvc/application/forms/SupportSettings.php:79 -#: airtime_mvc/application/forms/RegisterAirtime.php:84 -msgid "City:" -msgstr "城市:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:47 +msgid "Static Smart Block" +msgstr "é™æ€æ™ºèƒ½æ¨¡å—" -#: airtime_mvc/application/forms/SupportSettings.php:91 -#: airtime_mvc/application/forms/RegisterAirtime.php:96 -msgid "Station Description:" -msgstr "电å°æ述:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:48 +msgid "Audio Track" +msgstr "音频文件" -#: airtime_mvc/application/forms/SupportSettings.php:101 -#: airtime_mvc/application/forms/RegisterAirtime.php:106 -msgid "Station Logo:" -msgstr "电å°æ ‡å¿—:" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:63 +msgid "Playlist Contents: " +msgstr "播放列表内容:" -#: airtime_mvc/application/forms/SupportSettings.php:122 -#: airtime_mvc/application/forms/RegisterAirtime.php:126 -msgid "Promote my station on Sourcefabric.org" -msgstr "在Sourcefabric.org上推广我的电å°" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:65 +msgid "Static Smart Block Contents: " +msgstr "é™æ€æ™ºèƒ½æ¨¡å—æ¡ä»¶ï¼š" -#: airtime_mvc/application/forms/SupportSettings.php:148 -#: airtime_mvc/application/forms/RegisterAirtime.php:149 -#, php-format -msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s." -msgstr "我åŒæ„Sourcefabricçš„%séšç§ç­–ç•¥%s" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:104 +msgid "Dynamic Smart Block Criteria: " +msgstr "动æ€æ™ºèƒ½æ¨¡å—æ¡ä»¶ï¼š" -#: airtime_mvc/application/forms/SupportSettings.php:171 -#: airtime_mvc/application/forms/RegisterAirtime.php:166 -msgid "You have to agree to privacy policy." -msgstr "请先接å—éšç§ç­–ç•¥" +#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:137 +msgid "Limit to " +msgstr "é™åˆ¶åˆ°" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:19 -msgid "" -"'%value%' is no valid email address in the basic format local-part@hostname" -msgstr "'%value%' ä¸æ˜¯åˆæ³•çš„电邮地å€ï¼Œåº”该类似于 local-part@hostname" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:19 +msgid "Failed" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:33 -msgid "'%value%' does not fit the date format '%format%'" -msgstr "'%value%' ä¸ç¬¦åˆæ ¼å¼è¦æ±‚: '%format%'" +#: airtime_mvc/application/views/scripts/plupload/index.phtml:20 +msgid "Pending" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:59 -msgid "'%value%' is less than %min% characters long" -msgstr "'%value%' å°äºŽæœ€å°é•¿åº¦è¦æ±‚ %min% " +#: airtime_mvc/application/views/scripts/plupload/index.phtml:23 +msgid "Recent Uploads" +msgstr "" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:64 -msgid "'%value%' is more than %max% characters long" -msgstr "'%value%' 大于最大长度è¦æ±‚ %max%" +#: airtime_mvc/application/views/scripts/listenerstat/index.phtml:2 +msgid "Listener Count Over Time" +msgstr "å¬ä¼—统计报告" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:76 -msgid "'%value%' is not between '%min%' and '%max%', inclusively" -msgstr "'%value%' 应该介于 '%min%' å’Œ '%max%'之间" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3 +msgid "Welcome to Airtime!" +msgstr "欢迎使用Airtimeï¼" -#: airtime_mvc/application/forms/helpers/ValidationTypes.php:89 -msgid "Passwords do not match" -msgstr "两次密ç è¾“å…¥ä¸åŒ¹é…" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4 +msgid "Here's how you can get started using Airtime to automate your broadcasts: " +msgstr "简å•ä»‹ç»å¦‚何使用Airtimeæ¥è‡ªåŠ¨å®Œæˆæ’­æ”¾ï¼š" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:48 -msgid "Enabled:" -msgstr "å¯ç”¨ï¼š" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7 +msgid "Begin by adding your files to the library using the 'Add Media' menu button. You can drag and drop your files to this window too." +msgstr "首先把你的媒体文件通过‘添加媒体’导入到媒体库中。你也å¯ä»¥ç®€å•çš„拖拽文件到本窗å£" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:57 -msgid "Stream Type:" -msgstr "æµæ ¼å¼ï¼š" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8 +msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows." +msgstr "ä½ å¯ä»¥åˆ›å»ºä¸€ä¸ªèŠ‚目,从èœå•æ æ‰“开页é¢â€˜æ—¥ç¨‹è¡¨â€™ï¼Œç‚¹å‡»æŒ‰é’®â€˜+ 节目’。这个节目å¯ä»¥æ˜¯ä¸€æ¬¡æ€§çš„,也å¯ä»¥æ˜¯ç³»åˆ—性的。åªæœ‰ç³»ç»Ÿç®¡ç†å‘˜" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:77 -msgid "Service Type:" -msgstr "æœåŠ¡ç±»åž‹ï¼š" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9 +msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'" +msgstr "然åŽç»™ä½ çš„节目添加内容,在日程表页é¢ä¸­é€‰ä¸­èŠ‚目,左键å•å‡»ï¼Œåœ¨å‡ºçŽ°çš„èœå•ä¸Šé€‰æ‹©â€˜æ·»åŠ /删除内容’" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:87 -msgid "Channels:" -msgstr "声é“:" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:10 +msgid "Select your media from the left pane and drag them to your show in the right pane." +msgstr "在页é¢å·¦åŠéƒ¨åˆ†é€‰æ‹©åª’体文件,然åŽæ‹–拽到å³åŠéƒ¨åˆ†ã€‚" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "1 - Mono" -msgstr "1 - å•å£°é“" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:12 +msgid "Then you're good to go!" +msgstr "然åŽå°±å¤§åŠŸå‘Šæˆå•¦ï¼" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:88 -msgid "2 - Stereo" -msgstr "2 - 立体声" +#: airtime_mvc/application/views/scripts/dashboard/help.phtml:13 +#, php-format +msgid "For more detailed help, read the %suser manual%s." +msgstr "详细的指导,å¯ä»¥å‚考%s用户手册%s。" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:97 -msgid "Server" -msgstr "æœåŠ¡å™¨" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:3 +msgid "Share" +msgstr "共享" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:109 -#: airtime_mvc/application/forms/EmailServerPreferences.php:100 -msgid "Port" -msgstr "端å£å·" +#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:64 +msgid "Select stream:" +msgstr "选择æµï¼š" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:141 -msgid "URL" -msgstr "链接地å€" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:5 +#, php-format +msgid "%sAirtime%s %s, the open radio software for scheduling and remote station management. %s" +msgstr "%sAirtime%s %s, æ供内容编排åŠè¿œç¨‹ç®¡ç†çš„å¼€æºç”µå°è½¯ä»¶ã€‚%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:171 -msgid "Mount Point" -msgstr "加载点" +#: airtime_mvc/application/views/scripts/dashboard/about.phtml:13 +#, php-format +msgid "%sSourcefabric%s o.p.s. Airtime is distributed under the %sGNU GPL v.3%s" +msgstr "%sSourcefabric%s o.p.s. Airtimeéµå¾ª%sGNU GPL v.3%s" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:195 -msgid "Admin User" -msgstr "管ç†å‘˜ç”¨æˆ·å" +#: airtime_mvc/application/views/scripts/login/password-change.phtml:3 +msgid "New password" +msgstr "新密ç " -#: airtime_mvc/application/forms/StreamSettingSubForm.php:207 -msgid "Admin Password" -msgstr "管ç†å‘˜å¯†ç " +#: airtime_mvc/application/views/scripts/login/password-change.phtml:6 +msgid "Please enter and confirm your new password in the fields below." +msgstr "请å†æ¬¡è¾“入你的新密ç ã€‚" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:232 -msgid "Server cannot be empty." -msgstr "请填写“æœåŠ¡å™¨â€ã€‚" +#: airtime_mvc/application/views/scripts/login/password-restore.phtml:7 +msgid "Please enter your account e-mail address. You will receive a link to create a new password via e-mail." +msgstr "请输入你å¸å·çš„邮件地å€ï¼Œç„¶åŽä½ å°†æ”¶åˆ°ä¸€å°é‚®ä»¶ï¼Œå…¶ä¸­æœ‰ä¸€ä¸ªé“¾æŽ¥ï¼Œç”¨æ¥åˆ›å»ºä½ çš„新密ç ã€‚" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:237 -msgid "Port cannot be empty." -msgstr "请填写“端å£â€ã€‚" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3 +msgid "Email sent" +msgstr "邮件已å‘é€" -#: airtime_mvc/application/forms/StreamSettingSubForm.php:243 -msgid "Mount cannot be empty with Icecast server." -msgstr "请填写“加载点â€ã€‚" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:6 +msgid "An email has been sent" +msgstr "邮件已ç»å‘出" -#: airtime_mvc/application/forms/StreamSetting.php:22 -msgid "Hardware Audio Output" -msgstr "硬件声音输出" +#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:7 +msgid "Back to login screen" +msgstr "返回登录页é¢" -#: airtime_mvc/application/forms/StreamSetting.php:33 -msgid "Output Type" -msgstr "输出类型" +#: airtime_mvc/application/views/scripts/login/index.phtml:7 +msgid "Welcome to the online Airtime demo! You can log in using the username 'admin' and the password 'admin'." +msgstr "欢迎æ¥åˆ°åœ¨çº¿Airtime演示ï¼ä½ å¯ä»¥ç”¨â€˜admin’和‘admin’作为用户å和密ç ç™»å½•ã€‚" -#: airtime_mvc/application/forms/StreamSetting.php:44 -msgid "Icecast Vorbis Metadata" -msgstr "Icecastçš„Vorbis元数æ®" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3 +msgid "Previous:" +msgstr "之å‰çš„:" -#: airtime_mvc/application/forms/StreamSetting.php:54 -msgid "Stream Label:" -msgstr "æµæ ‡ç­¾ï¼š" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:10 +msgid "Next:" +msgstr "之åŽçš„:" -#: airtime_mvc/application/forms/StreamSetting.php:55 -msgid "Artist - Title" -msgstr "歌手 - æ­Œå" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:24 +msgid "Source Streams" +msgstr "输入æµ" -#: airtime_mvc/application/forms/StreamSetting.php:56 -msgid "Show - Artist - Title" -msgstr "节目 - 歌手 - æ­Œå" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:29 +msgid "Master Source" +msgstr "主输入æµ" -#: airtime_mvc/application/forms/StreamSetting.php:57 -msgid "Station name - Show name" -msgstr "电å°å - 节目å" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:38 +msgid "Show Source" +msgstr "节目定制的输入æµ" -#: airtime_mvc/application/forms/StreamSetting.php:63 -msgid "Off Air Metadata" -msgstr "éžç›´æ’­çŠ¶æ€ä¸‹çš„输出æµå…ƒæ•°æ®" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45 +msgid "Scheduled Play" +msgstr "预先安排的节目æµ" -#: airtime_mvc/application/forms/StreamSetting.php:69 -msgid "Enable Replay Gain" -msgstr "å¯ç”¨å›žæ”¾å¢žç›Š" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54 +msgid "ON AIR" +msgstr "直播中" -#: airtime_mvc/application/forms/StreamSetting.php:75 -msgid "Replay Gain Modifier" -msgstr "回放增益调整" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:55 +msgid "Listen" +msgstr "收å¬" -#: airtime_mvc/application/forms/AddShowWho.php:10 -msgid "Search Users:" -msgstr "查找用户:" +#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59 +msgid "Station time" +msgstr "电å°å½“å‰æ—¶é—´" -#: airtime_mvc/application/forms/AddShowWho.php:24 -msgid "DJs:" -msgstr "选择节目编辑:" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3 +msgid "Your trial expires in" +msgstr "你的试用天数还剩" -#: airtime_mvc/application/forms/AddShowRR.php:10 -msgid "Record from Line In?" -msgstr "从线路输入录制?" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "Purchase your copy of Airtime" +msgstr "购买你使用的Airtime" -#: airtime_mvc/application/forms/AddShowRR.php:16 -msgid "Rebroadcast?" -msgstr "é‡æ’­ï¼Ÿ" +#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9 +msgid "My Account" +msgstr "我的账户" -#: airtime_mvc/application/forms/EmailServerPreferences.php:17 -msgid "Enable System Emails (Password Reset)" -msgstr "为密ç é‡ç½®å¯ç”¨é‚®ä»¶åŠŸèƒ½" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:3 +msgid "Manage Users" +msgstr "用户管ç†" -#: airtime_mvc/application/forms/EmailServerPreferences.php:27 -msgid "Reset Password 'From' Email" -msgstr "密ç é‡ç½®é‚®ä»¶å‘é€äºŽ" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:10 +msgid "New User" +msgstr "新建用户" -#: airtime_mvc/application/forms/EmailServerPreferences.php:34 -msgid "Configure Mail Server" -msgstr "邮件æœåŠ¡å™¨" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:17 +msgid "id" +msgstr "ç¼–å·" -#: airtime_mvc/application/forms/EmailServerPreferences.php:43 -msgid "Requires Authentication" -msgstr "需è¦èº«ä»½éªŒè¯" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:19 +msgid "First Name" +msgstr "å" -#: airtime_mvc/application/forms/EmailServerPreferences.php:53 -msgid "Mail Server" -msgstr "邮件æœåŠ¡å™¨åœ°å€" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:20 +msgid "Last Name" +msgstr "姓" -#: airtime_mvc/application/forms/EmailServerPreferences.php:67 -msgid "Email Address" -msgstr "邮件地å€" +#: airtime_mvc/application/views/scripts/user/add-user.phtml:21 +msgid "User Type" +msgstr "用户类型" -#: airtime_mvc/application/forms/Login.php:83 -msgid "Type the characters you see in the picture below." -msgstr "请输入图åƒé‡Œçš„字符。" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:7 +msgid "Log Sheet" +msgstr "历å²è®°å½•è¡¨å•" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:66 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:71 -msgid "Day must be specified" -msgstr "请指定天" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:8 +msgid "File Summary" +msgstr "文件播放记录" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:71 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:76 -msgid "Time must be specified" -msgstr "请指定时间" +#: airtime_mvc/application/views/scripts/playouthistory/index.phtml:10 +msgid "Show Summary" +msgstr "节目播放记录" -#: airtime_mvc/application/forms/AddShowAbsoluteRebroadcastDates.php:94 -#: airtime_mvc/application/forms/AddShowRebroadcastDates.php:103 -msgid "Must wait at least 1 hour to rebroadcast" -msgstr "至少间隔一个å°æ—¶" +#: airtime_mvc/application/views/scripts/error/error.phtml:6 +msgid "Zend Framework Default Application" +msgstr "Zend框架默认程åº" -#: airtime_mvc/application/forms/AddShowLiveStream.php:10 -msgid "Use Airtime Authentication:" -msgstr "使用Airtime的用户认è¯ï¼š" +#: airtime_mvc/application/views/scripts/error/error.phtml:10 +msgid "Page not found!" +msgstr "页é¢ä¸å­˜åœ¨ï¼" -#: airtime_mvc/application/forms/AddShowLiveStream.php:16 -msgid "Use Custom Authentication:" -msgstr "使用自定义的用户认è¯ï¼š" +#: airtime_mvc/application/views/scripts/error/error.phtml:11 +msgid "Looks like the page you were looking for doesn't exist!" +msgstr "你所寻找的页é¢ä¸å­˜åœ¨ï¼" -#: airtime_mvc/application/forms/AddShowLiveStream.php:26 -msgid "Custom Username" -msgstr "自定义用户å" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:54 +msgid "Expand Static Block" +msgstr "展开é™æ€æ™ºèƒ½æ¨¡å—" -#: airtime_mvc/application/forms/AddShowLiveStream.php:39 -msgid "Custom Password" -msgstr "自定义密ç " +#: airtime_mvc/application/views/scripts/playlist/update.phtml:59 +msgid "Expand Dynamic Block" +msgstr "展开动æ€æ™ºèƒ½æ¨¡å—" -#: airtime_mvc/application/forms/AddShowLiveStream.php:63 -msgid "Username field cannot be empty." -msgstr "请填写用户å" +#: airtime_mvc/application/views/scripts/playlist/update.phtml:135 +msgid "Empty smart block" +msgstr "无内容的智能模å—" -#: airtime_mvc/application/forms/AddShowLiveStream.php:68 -msgid "Password field cannot be empty." -msgstr "请填写密ç " +#: airtime_mvc/application/views/scripts/playlist/update.phtml:137 +msgid "Empty playlist" +msgstr "无内容的播放列表" -#: airtime_mvc/application/forms/DateRange.php:16 -#: airtime_mvc/application/forms/ShowBuilder.php:18 -msgid "Date Start:" -msgstr "开始日期:" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +msgid "Empty playlist content" +msgstr "播放列表无内容" -#: airtime_mvc/application/forms/GeneralPreferences.php:33 -msgid "Default Crossfade Duration (s):" -msgstr "默认混åˆæ·¡å…¥æ·¡å‡ºæ•ˆæžœï¼ˆç§’):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Clear" +msgstr "清除" -#: airtime_mvc/application/forms/GeneralPreferences.php:40 -#: airtime_mvc/application/forms/GeneralPreferences.php:59 -#: airtime_mvc/application/forms/GeneralPreferences.php:78 -msgid "enter a time in seconds 0{.0}" -msgstr "请输入秒数,格å¼ä¸º0{.0}" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24 +msgid "Shuffle playlist" +msgstr "éšæœºæ‰“乱播放列表" -#: airtime_mvc/application/forms/GeneralPreferences.php:52 -msgid "Default Fade In (s):" -msgstr "默认淡入效果(秒):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27 +msgid "Save playlist" +msgstr "ä¿å­˜æ’­æ”¾åˆ—表" -#: airtime_mvc/application/forms/GeneralPreferences.php:71 -msgid "Default Fade Out (s):" -msgstr "默认淡出效果(秒):" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:34 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:31 +msgid "Playlist crossfade" +msgstr "播放列表交错淡入淡出效果" -#: airtime_mvc/application/forms/GeneralPreferences.php:89 -#, php-format -msgid "" -"Allow Remote Websites To Access \"Schedule\" Info?%s (Enable this to make " -"front-end widgets work.)" -msgstr "å…许远程访问节目表信æ¯ï¼Ÿ%s (此项å¯ç”¨åŽæ‰èƒ½ä½¿ç”¨â€œå°å·¥å…·â€ï¼Œæ—¢widgets)" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "Fade in: " +msgstr "淡入:" -#: airtime_mvc/application/forms/GeneralPreferences.php:90 -msgid "Disabled" -msgstr "ç¦ç”¨" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +msgid "Fade out: " +msgstr "淡出:" -#: airtime_mvc/application/forms/GeneralPreferences.php:91 -msgid "Enabled" -msgstr "å¯ç”¨" +#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:85 +msgid "No open playlist" +msgstr "没有打开的播放列表" -#: airtime_mvc/application/forms/GeneralPreferences.php:97 -msgid "Default Interface Language" -msgstr "ç•Œé¢çš„默认语言" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21 +msgid "Empty smart block content" +msgstr "智能模å—无内容" -#: airtime_mvc/application/forms/GeneralPreferences.php:105 -msgid "Station Timezone" -msgstr "系统使用的时区" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72 +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6 +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19 +msgid "(ss.t)" +msgstr "(秒.分秒)" -#: airtime_mvc/application/forms/GeneralPreferences.php:113 -msgid "Week Starts On" -msgstr "一周开始于" +#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:90 +msgid "No open smart block" +msgstr "没有打开的智能模å—" -#: airtime_mvc/application/forms/EditUser.php:121 -msgid "Interface Timezone:" -msgstr "用户界é¢ä½¿ç”¨çš„时区:" +#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3 +msgid "Show Waveform" +msgstr "显示波形图" -#: airtime_mvc/application/forms/PasswordRestore.php:14 -msgid "E-mail" -msgstr "电邮地å€" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +msgid "Cue In: " +msgstr "切入:" -#: airtime_mvc/application/forms/PasswordRestore.php:36 -msgid "Restore password" -msgstr "找回密ç " +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:5 +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "(hh:mm:ss.t)" +msgstr "(时:分:秒.分秒)" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:118 -msgid "hours" -msgstr "å°æ—¶" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:12 +msgid "Cue Out: " +msgstr "切出:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:119 -msgid "minutes" -msgstr "分钟" +#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:19 +msgid "Original Length:" +msgstr "原始长度:" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:167 -msgid "Set smart block type:" -msgstr "设置智能模å—类型:" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Add this show" +msgstr "添加此节目" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:170 -msgid "Static" -msgstr "é™æ€" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6 +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40 +msgid "Update show" +msgstr "更新节目" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:171 -msgid "Dynamic" -msgstr "动æ€" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10 +msgid "What" +msgstr "å称" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:285 -msgid "Allow Repeat Tracks:" -msgstr "å…许é‡å¤é€‰æ‹©æ­Œæ›²ï¼š" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 +msgid "When" +msgstr "时间" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:302 -msgid "Limit to" -msgstr "é™åˆ¶åœ¨" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:19 +msgid "Live Stream Input" +msgstr "输入æµè®¾ç½®" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:324 -msgid "Generate playlist content and save criteria" -msgstr "ä¿å­˜æ¡ä»¶è®¾ç½®å¹¶ç”Ÿæˆæ’­æ”¾åˆ—表内容" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:23 +msgid "Record & Rebroadcast" +msgstr "录制与é‡æ’­" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:326 -msgid "Generate" -msgstr "开始生æˆ" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:29 +msgid "Who" +msgstr "管ç†å’Œç¼–辑" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:332 -msgid "Shuffle playlist content" -msgstr "éšæœºæ‰“乱歌曲次åº" +#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33 +msgid "Style" +msgstr "风格" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:500 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:512 -msgid "Limit cannot be empty or smaller than 0" -msgstr "é™åˆ¶çš„设置ä¸èƒ½æ¯”0å°" +#: airtime_mvc/application/models/ShowBuilder.php:212 +#, php-format +msgid "Rebroadcast of %s from %s" +msgstr "%s是%sçš„é‡æ’­" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:505 -msgid "Limit cannot be more than 24 hrs" -msgstr "é™åˆ¶çš„设置ä¸èƒ½å¤§äºŽ24å°æ—¶" +#: airtime_mvc/application/models/Preference.php:657 +msgid "Select Country" +msgstr "选择国家" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:515 -msgid "The value should be an integer" -msgstr "值åªèƒ½ä¸ºæ•´æ•°" +#: airtime_mvc/application/models/Webstream.php:157 +msgid "Length needs to be greater than 0 minutes" +msgstr "节目时长必须大于0分钟" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:518 -msgid "500 is the max item limit value you can set" -msgstr "最多åªèƒ½å…许500æ¡å†…容" +#: airtime_mvc/application/models/Webstream.php:162 +msgid "Length should be of form \"00h 00m\"" +msgstr "时间的格å¼åº”该是 \"00h 00m\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:529 -msgid "You must select Criteria and Modifier" -msgstr "æ¡ä»¶å’Œæ“作符ä¸èƒ½ä¸ºç©º" +#: airtime_mvc/application/models/Webstream.php:175 +msgid "URL should be of form \"http://domain\"" +msgstr "地å€çš„æ ¼å¼åº”该是 \"http://domain\"" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:536 -msgid "'Length' should be in '00:00:00' format" -msgstr "‘长度’格å¼åº”该为‘00:00:00’" +#: airtime_mvc/application/models/Webstream.php:178 +msgid "URL should be 512 characters or less" +msgstr "地å€çš„最大长度ä¸èƒ½è¶…过512字节" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:541 -#: airtime_mvc/application/forms/SmartBlockCriteria.php:554 -msgid "" -"The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 " -"00:00:00)" -msgstr "时间格å¼é”™è¯¯ï¼Œåº”该为形如0000-00-00 或 0000-00-00 00:00:00çš„æ ¼å¼" +#: airtime_mvc/application/models/Webstream.php:184 +msgid "No MIME type found for webstream." +msgstr "这个媒体æµä¸å­˜åœ¨MIME属性,无法添加" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:568 -msgid "The value has to be numeric" -msgstr "应该为数字" +#: airtime_mvc/application/models/Webstream.php:200 +msgid "Webstream name cannot be empty" +msgstr "媒体æµçš„åå­—ä¸èƒ½ä¸ºç©º" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:573 -msgid "The value should be less then 2147483648" -msgstr "ä¸èƒ½å¤§äºŽ2147483648" +#: airtime_mvc/application/models/Webstream.php:269 +msgid "Could not parse XSPF playlist" +msgstr "å‘现XSPFæ ¼å¼çš„播放列表,但是格å¼é”™è¯¯" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:578 -#, php-format -msgid "The value should be less than %s characters" -msgstr "ä¸èƒ½å°äºŽ%s个字符" +#: airtime_mvc/application/models/Webstream.php:281 +msgid "Could not parse PLS playlist" +msgstr "å‘现PLSæ ¼å¼çš„播放列表,但是格å¼é”™è¯¯" -#: airtime_mvc/application/forms/SmartBlockCriteria.php:585 -msgid "Value cannot be empty" -msgstr "ä¸èƒ½ä¸ºç©º" +#: airtime_mvc/application/models/Webstream.php:300 +msgid "Could not parse M3U playlist" +msgstr "å‘现M3Uæ ¼å¼çš„播放列表,但是格å¼é”™è¯¯" -#: airtime_mvc/application/forms/ShowBuilder.php:72 -msgid "Show:" -msgstr "节目:" +#: airtime_mvc/application/models/Webstream.php:314 +msgid "Invalid webstream - This appears to be a file download." +msgstr "媒体æµæ ¼å¼é”™è¯¯ï¼Œå½“å‰â€œåª’体æµâ€åªæ˜¯ä¸€ä¸ªå¯ä¸‹è½½çš„文件" -#: airtime_mvc/application/forms/ShowBuilder.php:80 -msgid "All My Shows:" -msgstr "我的全部节目:" +#: airtime_mvc/application/models/Webstream.php:318 +#, php-format +msgid "Unrecognized stream type: %s" +msgstr "未知的媒体æµæ ¼å¼ï¼š %s" -#: airtime_mvc/application/forms/EditAudioMD.php:112 -msgid "ISRC Number:" -msgstr "ISRCç¼–å·ï¼š" +#: airtime_mvc/application/models/MusicDir.php:160 +#, php-format +msgid "%s is already watched." +msgstr "%s å·²ç»ç›‘控" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:16 -msgid "Automatically Upload Recorded Shows" -msgstr "自动上传录制节目的内容" +#: airtime_mvc/application/models/MusicDir.php:164 +#, php-format +msgid "%s contains nested watched directory: %s" +msgstr "%s 所å«çš„å­æ–‡ä»¶å¤¹ %s å·²ç»è¢«ç›‘控" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:26 -msgid "Enable SoundCloud Upload" -msgstr "å¯ç”¨ä¸Šä¼ åˆ°SoundCloud功能" +#: airtime_mvc/application/models/MusicDir.php:168 +#, php-format +msgid "%s is nested within existing watched directory: %s" +msgstr "%s 无法监控,因为父文件夹 %s å·²ç»ç›‘控" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:36 -msgid "Automatically Mark Files \"Downloadable\" on SoundCloud" -msgstr "自动把上传到SoundCloud的文件标识为“Downloadableâ€" +#: airtime_mvc/application/models/MusicDir.php:189 +#: airtime_mvc/application/models/MusicDir.php:370 +#, php-format +msgid "%s is not a valid directory." +msgstr "%s ä¸æ˜¯æ–‡ä»¶å¤¹ã€‚" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:47 -msgid "SoundCloud Email" -msgstr "SoundCloud邮件地å€" +#: airtime_mvc/application/models/MusicDir.php:232 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list" +msgstr "%s å·²ç»è®¾ç½®æˆåª’体存储文件夹,或者监控文件夹。" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:67 -msgid "SoundCloud Password" -msgstr "SoundCloud密ç " +#: airtime_mvc/application/models/MusicDir.php:388 +#, php-format +msgid "%s is already set as the current storage dir or in the watched folders list." +msgstr "%s å·²ç»è®¾ç½®æˆåª’体存储文件夹,或者监控文件夹。" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:87 -msgid "SoundCloud Tags: (separate tags with spaces)" -msgstr "SoundCloud标签:(以空格分隔ä¸åŒæ ‡ç­¾ï¼‰" +#: airtime_mvc/application/models/MusicDir.php:431 +#, php-format +msgid "%s doesn't exist in the watched list." +msgstr "监控文件夹åå•é‡Œä¸å­˜åœ¨ %s " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:99 -msgid "Default Genre:" -msgstr "默认风格:" +#: airtime_mvc/application/models/Scheduler.php:73 +msgid "Cannot move items out of linked shows" +msgstr "ä¸èƒ½ä»Žç»‘定的节目系列里移出项目" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:109 -msgid "Default Track Type:" -msgstr "默认声音文件类型:" +#: airtime_mvc/application/models/Scheduler.php:119 +msgid "The schedule you're viewing is out of date! (sched mismatch)" +msgstr "当å‰èŠ‚目内容表(内容部分)需è¦åˆ·æ–°" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:113 -msgid "Original" -msgstr "原版" +#: airtime_mvc/application/models/Scheduler.php:124 +msgid "The schedule you're viewing is out of date! (instance mismatch)" +msgstr "当å‰èŠ‚目内容表(节目已更改)需è¦åˆ·æ–°" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:114 -msgid "Remix" -msgstr "é‡ç¼–版" +#: airtime_mvc/application/models/Scheduler.php:132 +#: airtime_mvc/application/models/Scheduler.php:444 +#: airtime_mvc/application/models/Scheduler.php:482 +msgid "The schedule you're viewing is out of date!" +msgstr "当å‰èŠ‚目内容需è¦åˆ·æ–°ï¼" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:115 -msgid "Live" -msgstr "实况" +#: airtime_mvc/application/models/Scheduler.php:142 +#, php-format +msgid "You are not allowed to schedule show %s." +msgstr "没有赋予修改节目 %s çš„æƒé™ã€‚" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:116 -msgid "Recording" -msgstr "录制" +#: airtime_mvc/application/models/Scheduler.php:146 +msgid "You cannot add files to recording shows." +msgstr "录音节目ä¸èƒ½æ·»åŠ åˆ«çš„内容。" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:117 -msgid "Spoken" -msgstr "è°ˆè¯" +#: airtime_mvc/application/models/Scheduler.php:152 +#, php-format +msgid "The show %s is over and cannot be scheduled." +msgstr "节目%s已结æŸï¼Œä¸èƒ½åœ¨æ·»åŠ ä»»ä½•å†…容。" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:118 -msgid "Podcast" -msgstr "播客" +#: airtime_mvc/application/models/Scheduler.php:159 +#, php-format +msgid "The show %s has been previously updated!" +msgstr "节目%så·²ç»æ›´æ”¹ï¼Œéœ€è¦åˆ·æ–°åŽå†å°è¯•ã€‚" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:119 -msgid "Demo" -msgstr "å°æ ·" +#: airtime_mvc/application/models/Scheduler.php:178 +msgid "Content in linked shows must be scheduled before or after any one is broadcasted" +msgstr "绑定的节目è¦ä¹ˆæå‰è®¾ç½®å¥½ï¼Œè¦ä¹ˆç­‰å¾…其中的任何一个节目结æŸåŽæ‰èƒ½ç¼–辑内容" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:120 -msgid "Work in progress" -msgstr "未完æˆ" +#: airtime_mvc/application/models/Scheduler.php:200 +#: airtime_mvc/application/models/Scheduler.php:289 +msgid "A selected File does not exist!" +msgstr "æŸä¸ªé€‰ä¸­çš„文件ä¸å­˜åœ¨ã€‚" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:121 -msgid "Stem" -msgstr "主干" +#: airtime_mvc/application/models/Playlist.php:812 +#: airtime_mvc/application/models/Block.php:833 +msgid "Cue in and cue out are null." +msgstr "切入点和切出点å‡ä¸ºç©º" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:122 -msgid "Loop" -msgstr "循环" +#: airtime_mvc/application/models/Playlist.php:843 +#: airtime_mvc/application/models/Playlist.php:868 +#: airtime_mvc/application/models/Block.php:879 +#: airtime_mvc/application/models/Block.php:900 +msgid "Can't set cue in to be larger than cue out." +msgstr "切入点ä¸èƒ½æ™šäºŽåˆ‡å‡ºç‚¹" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:123 -msgid "Sound Effect" -msgstr "声效" +#: airtime_mvc/application/models/Playlist.php:851 +#: airtime_mvc/application/models/Playlist.php:895 +#: airtime_mvc/application/models/Block.php:868 +#: airtime_mvc/application/models/Block.php:924 +msgid "Can't set cue out to be greater than file length." +msgstr "切出点ä¸èƒ½è¶…出文件原长度" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:124 -msgid "One Shot Sample" -msgstr "样本" +#: airtime_mvc/application/models/Playlist.php:887 +#: airtime_mvc/application/models/Block.php:935 +msgid "Can't set cue out to be smaller than cue in." +msgstr "切出点ä¸èƒ½æ—©äºŽåˆ‡å…¥ç‚¹" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:125 -msgid "Other" -msgstr "其他" +#: airtime_mvc/application/models/StoredFile.php:960 +#, php-format +msgid "The file was not uploaded, there is %s MB of disk space left and the file you are uploading has a size of %s MB." +msgstr "ç£ç›˜ç©ºé—´ä¸è¶³ï¼Œæ–‡ä»¶ä¸Šä¼ å¤±è´¥ï¼Œå‰©ä½™ç©ºé—´åªæœ‰ %s 兆,å°è¯•ä¸Šä¼  %s 兆的文件" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:133 -msgid "Default License:" -msgstr "默认版æƒç­–略:" +#: airtime_mvc/application/models/Show.php:180 +msgid "Shows can have a max length of 24 hours." +msgstr "节目时长åªèƒ½è®¾ç½®åœ¨24å°æ—¶ä»¥å†…" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:137 -msgid "The work is in the public domain" -msgstr "公开" +#: airtime_mvc/application/models/Show.php:289 +msgid "" +"Cannot schedule overlapping shows.\n" +"Note: Resizing a repeating show affects all of its repeats." +msgstr "" +"节目时间设置于其他的节目有冲çªã€‚\n" +"æ示:修改系列节目中的一个,将影å“整个节目系列" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:138 -msgid "All rights are reserved" -msgstr "版æƒæ‰€æœ‰" +#: airtime_mvc/application/models/Auth.php:33 +#, php-format +msgid "" +"Hi %s, \n" +"\n" +"Click this link to reset your password: " +msgstr "" +"%s 你好, \n" +"\n" +" 请点击链接以é‡ç½®ä½ çš„密ç ï¼š " -#: airtime_mvc/application/forms/SoundcloudPreferences.php:139 -msgid "Creative Commons Attribution" -msgstr "知识共享署å" +#: airtime_mvc/application/models/Auth.php:36 +msgid "Airtime Password Reset" +msgstr "Airtime密ç é‡ç½®" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:140 -msgid "Creative Commons Attribution Noncommercial" -msgstr "知识共享署å-éžå•†ä¸šåº”用" +#: airtime_mvc/application/services/CalendarService.php:50 +msgid "Record file doesn't exist" +msgstr "录制文件ä¸å­˜åœ¨" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:141 -msgid "Creative Commons Attribution No Derivative Works" -msgstr "知识共享署å-ä¸å…许è¡ç”Ÿ" +#: airtime_mvc/application/services/CalendarService.php:54 +msgid "View Recorded File Metadata" +msgstr "查看录制文件的元数æ®" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:142 -msgid "Creative Commons Attribution Share Alike" -msgstr "知识共享署å-相åŒæ–¹å¼å…±äº«" +#: airtime_mvc/application/services/CalendarService.php:77 +#: airtime_mvc/application/services/CalendarService.php:121 +msgid "Show Content" +msgstr "显示内容" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:143 -msgid "Creative Commons Attribution Noncommercial Non Derivate Works" -msgstr "知识共享署å-éžå•†ä¸šåº”用且ä¸å…许è¡ç”Ÿ" +#: airtime_mvc/application/services/CalendarService.php:111 +msgid "Remove All Content" +msgstr "清空全部内容" -#: airtime_mvc/application/forms/SoundcloudPreferences.php:144 -msgid "Creative Commons Attribution Noncommercial Share Alike" -msgstr "知识共享署å-éžå•†ä¸šåº”用且相åŒæ–¹å¼å…±äº«" +#: airtime_mvc/application/services/CalendarService.php:131 +#: airtime_mvc/application/services/CalendarService.php:135 +msgid "Cancel Current Show" +msgstr "å–消当å‰èŠ‚ç›®" -#: airtime_mvc/application/forms/AddShowStyle.php:10 -msgid "Background Colour:" -msgstr "背景色:" +#: airtime_mvc/application/services/CalendarService.php:152 +#: airtime_mvc/application/services/CalendarService.php:167 +msgid "Edit This Instance" +msgstr "编辑此节目" -#: airtime_mvc/application/forms/AddShowStyle.php:29 -msgid "Text Colour:" -msgstr "文字颜色:" +#: airtime_mvc/application/services/CalendarService.php:162 +#: airtime_mvc/application/services/CalendarService.php:173 +msgid "Edit Show" +msgstr "编辑节目" -#: airtime_mvc/application/configs/navigation.php:12 -msgid "Now Playing" -msgstr "直播室" +#: airtime_mvc/application/services/CalendarService.php:191 +msgid "Delete This Instance" +msgstr "删除当å‰èŠ‚ç›®" -#: airtime_mvc/application/configs/navigation.php:19 -msgid "Add Media" -msgstr "添加媒体" +#: airtime_mvc/application/services/CalendarService.php:196 +msgid "Delete This Instance and All Following" +msgstr "删除当å‰ä»¥åŠéšåŽçš„系列节目" -#: airtime_mvc/application/configs/navigation.php:26 -msgid "Library" -msgstr "媒体库" +#: airtime_mvc/application/services/CalendarService.php:250 +msgid "Permission denied" +msgstr "没有编辑æƒé™" -#: airtime_mvc/application/configs/navigation.php:33 -msgid "Calendar" -msgstr "节目日程" +#: airtime_mvc/application/services/CalendarService.php:254 +msgid "Can't drag and drop repeating shows" +msgstr "系列中的节目无法拖拽" -#: airtime_mvc/application/configs/navigation.php:40 -msgid "System" -msgstr "系统" +#: airtime_mvc/application/services/CalendarService.php:263 +msgid "Can't move a past show" +msgstr "å·²ç»ç»“æŸçš„节目无法更改时间" -#: airtime_mvc/application/configs/navigation.php:50 -msgid "Users" -msgstr "用户管ç†" +#: airtime_mvc/application/services/CalendarService.php:298 +msgid "Can't move show into past" +msgstr "节目ä¸èƒ½è®¾ç½®åˆ°å·²è¿‡åŽ»çš„时间点" -#: airtime_mvc/application/configs/navigation.php:57 -msgid "Media Folders" -msgstr "存储路径" +#: airtime_mvc/application/services/CalendarService.php:318 +msgid "Can't move a recorded show less than 1 hour before its rebroadcasts." +msgstr "录音和é‡æ’­èŠ‚目之间的间隔必须大于等于1å°æ—¶ã€‚" -#: airtime_mvc/application/configs/navigation.php:64 -msgid "Streams" -msgstr "媒体æµè®¾ç½®" +#: airtime_mvc/application/services/CalendarService.php:328 +msgid "Show was deleted because recorded show does not exist!" +msgstr "录音节目ä¸å­˜åœ¨ï¼ŒèŠ‚目已删除ï¼" -#: airtime_mvc/application/configs/navigation.php:83 -msgid "Listener Stats" -msgstr "收å¬çŠ¶æ€" +#: airtime_mvc/application/services/CalendarService.php:335 +msgid "Must wait 1 hour to rebroadcast." +msgstr "é‡æ’­èŠ‚目必须设置于1å°æ—¶ä¹‹åŽã€‚" -#: airtime_mvc/application/configs/navigation.php:92 -msgid "History" -msgstr "历å²è®°å½•" +#: airtime_mvc/application/services/HistoryService.php:1119 +msgid "Track" +msgstr "曲目" -#: airtime_mvc/application/configs/navigation.php:97 -msgid "Playout History" -msgstr "播出历å²" +#: airtime_mvc/application/services/HistoryService.php:1167 +msgid "Played" +msgstr "已播放" -#: airtime_mvc/application/configs/navigation.php:104 -msgid "History Templates" -msgstr "历å²è®°å½•æ¨¡æ¿" +#: airtime_mvc/application/common/DateHelper.php:213 +#, php-format +msgid "The year %s must be within the range of 1753 - 9999" +msgstr "1753 - 9999 是å¯ä»¥æŽ¥å—的年代值,而ä¸æ˜¯â€œ%sâ€" -#: airtime_mvc/application/configs/navigation.php:118 -msgid "Getting Started" -msgstr "基本用法" +#: airtime_mvc/application/common/DateHelper.php:216 +#, php-format +msgid "%s-%s-%s is not a valid date" +msgstr "%s-%s-%s采用了错误的日期格å¼" -#: airtime_mvc/application/configs/navigation.php:125 -msgid "User Manual" -msgstr "用户手册" +#: airtime_mvc/application/common/DateHelper.php:240 +#, php-format +msgid "%s:%s:%s is not a valid time" +msgstr "%s:%s:%s 采用了错误的时间格å¼" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:512 msgid "Please selection an option" @@ -3912,3 +3802,18 @@ msgstr "请选择一项" #: airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php:531 msgid "No Records" msgstr "无记录" + +#~ msgid "can't resize a past show" +#~ msgstr "已结æŸçš„节目ä¸èƒ½è°ƒæ•´æ—¶é•¿" + +#~ msgid "Should not overlap shows" +#~ msgstr "节目时间ä¸èƒ½æœ‰é‡åˆ" + +#~ msgid "Failed to create 'organize' directory." +#~ msgstr "创建‘organize’目录失败" + +#~ msgid "This file appears to be corrupted and will not be added to media library." +#~ msgstr "媒体文件ä¸ç¬¦åˆåª’体库è¦æ±‚或者已ç»æŸå,该文件将ä¸ä¼šä¸Šä¼ åˆ°åª’体库" + +#~ msgid "The file was not uploaded, this error can occur if the computer hard drive does not have enough disk space or the stor directory does not have correct write permissions." +#~ msgstr "文件上传失败,å¯èƒ½çš„原因:ç£ç›˜ç©ºé—´ä¸è¶³ç›®å½•æƒé™è®¾ç½®é”™è¯¯" From 4fe9fc189a4694bd16a545fac979ccd988a7dd64 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 9 Apr 2014 14:57:30 -0400 Subject: [PATCH 079/310] CC-5709: Airtime Analyzer * CC-5772: Recent Upload table times should be shown in local time --- .../application/controllers/PluploadController.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index 83b2fe715e..0695f0defb 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -60,12 +60,17 @@ public function recentUploadsAction() foreach ($recentUploads as $upload) { - $upload->toArray(BasePeer::TYPE_FIELDNAME); - //array_push($uploadsArray, $upload); //TODO: $this->sanitizeResponse($upload)); + $upload = $upload->toArray(BasePeer::TYPE_FIELDNAME); + //TODO: $this->sanitizeResponse($upload)); + $utcTimezone = new DateTimeZone("UTC"); + $displayTimezone = new DateTimeZone(Application_Model_Preference::GetUserTimezone()); + $upload['utime'] = new DateTime($upload['utime'], $utcTimezone); + $upload['utime']->setTimeZone($displayTimezone); + $upload['utime'] = $upload['utime']->format('Y-m-d H:i:s'); //$this->_helper->json->sendJson($upload->asJson()); //TODO: Invoke sanitization here - array_push($uploadsArray, $upload->toArray(BasePeer::TYPE_FIELDNAME)); + array_push($uploadsArray, $upload); } From 5971f51b53b18413bcf226c19c3fb7e00712edc7 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 10 Apr 2014 07:12:31 -0400 Subject: [PATCH 080/310] CC-5781: Upgrade script for new storage quota implementation First draft of an upgrade controller --- airtime_mvc/application/configs/ACL.php | 4 +- .../controllers/UpgradeController.php | 69 +++++++++++++++++++ .../upgrade_sql/airtime_2.5.3/upgrade.sql | 6 ++ .../airtime-2.5.3/airtime-upgrade.php | 6 -- 4 files changed, 78 insertions(+), 7 deletions(-) create mode 100644 airtime_mvc/application/controllers/UpgradeController.php create mode 100644 airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.3/upgrade.sql diff --git a/airtime_mvc/application/configs/ACL.php b/airtime_mvc/application/configs/ACL.php index 83cba4b081..8427780654 100644 --- a/airtime_mvc/application/configs/ACL.php +++ b/airtime_mvc/application/configs/ACL.php @@ -28,7 +28,8 @@ ->add(new Zend_Acl_Resource('usersettings')) ->add(new Zend_Acl_Resource('audiopreview')) ->add(new Zend_Acl_Resource('webstream')) - ->add(new Zend_Acl_Resource('locale')); + ->add(new Zend_Acl_Resource('locale')) + ->add(new Zend_Acl_Resource('upgrade')); /** Creating permissions */ $ccAcl->allow('G', 'index') @@ -42,6 +43,7 @@ ->allow('G', 'audiopreview') ->allow('G', 'webstream') ->allow('G', 'locale') + ->allow('G', 'upgrade') ->allow('H', 'preference', 'is-import-in-progress') ->allow('H', 'usersettings') ->allow('H', 'plupload') diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php new file mode 100644 index 0000000000..e1606b98dd --- /dev/null +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -0,0 +1,69 @@ +view->layout()->disableLayout(); + $this->_helper->viewRenderer->setNoRender(true); + + //TODO: check api key + //The API key is passed in via HTTP "basic authentication": + //http://en.wikipedia.org/wiki/Basic_access_authentication + + $CC_CONFIG = Config::getConfig(); + + //Decode the API key that was passed to us in the HTTP request. + $authHeader = $this->getRequest()->getHeader("Authorization"); + $encodedRequestApiKey = substr($authHeader, strlen("Basic ")); + $encodedStoredApiKey = base64_encode($CC_CONFIG["apiKey"][0] . ":"); + + if (!$encodedRequestApiKey === $encodedStoredApiKey) + { + $this->getResponse() + ->setHttpResponseCode(401) + ->appendBody("Bad Authorization."); + return; + } + + //check current airtime version + $airtime_version = Application_Model_Preference::GetAirtimeVersion(); + if ($airtime_version != '2.5.2') { + $this->getResponse() + ->setHttpResponseCode(400) + ->appendBody("Upgrade to Airtime 2.5.3 FAILED. You must be using Airtime 2.5.2 to upgrade."); + return; + } + + $filename = "/etc/airtime/airtime.conf"; + $values = parse_ini_file($filename, true); + + $username = $values['database']['dbuser']; + $password = $values['database']['dbpass']; + $host = $values['database']['host']; + $database = $values['database']['dbname']; + $dir = __DIR__; + + passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_$airtime_version/upgrade.sql $database 2>&1 | grep -v \"will create implicit index\""); + + + $musicDir = CcMusicDirsQuery::create() + ->filterByType('stor') + ->filterByExists(true) + ->findOne(); + $storPath = $musicDir->getDirectory(); + + $freeSpace = disk_free_space($storPath); + $totalSpace = disk_total_space($storPath); + + Application_Model_Preference::setDiskUsage($totalSpace - $freeSpace); + + $this->getResponse() + ->setHttpResponseCode(200) + ->appendBody("Upgrade to Airtime 2.5.3 OK"); + } + + +} \ No newline at end of file diff --git a/airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.3/upgrade.sql b/airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.3/upgrade.sql new file mode 100644 index 0000000000..6c79809839 --- /dev/null +++ b/airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.3/upgrade.sql @@ -0,0 +1,6 @@ +DELETE FROM cc_pref WHERE keystr = 'system_version'; +INSERT INTO cc_pref (keystr, valstr) VALUES ('system_version', '2.5.3'); + +ALTER TABLE cc_files DROP COLUMN state; +ALTER TABLE cc_files ADD import_status integer default 1; -- Default is "pending" +UPDATE cc_files SET import_status=0; -- Existing files are already "imported" diff --git a/install_minimal/upgrades/airtime-2.5.3/airtime-upgrade.php b/install_minimal/upgrades/airtime-2.5.3/airtime-upgrade.php index 09ecd7ed20..31792eb7aa 100644 --- a/install_minimal/upgrades/airtime-2.5.3/airtime-upgrade.php +++ b/install_minimal/upgrades/airtime-2.5.3/airtime-upgrade.php @@ -1,11 +1,5 @@ Date: Thu, 10 Apr 2014 09:28:23 -0400 Subject: [PATCH 081/310] CC-5781: Upgrade script for new storage quota implementation Returns error if API key is incorrect Set the upgrade controller to skip login authentication --- airtime_mvc/application/controllers/UpgradeController.php | 8 ++++---- .../application/controllers/plugins/Acl_plugin.php | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index e1606b98dd..a01eb5ecab 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -17,10 +17,11 @@ public function indexAction() //Decode the API key that was passed to us in the HTTP request. $authHeader = $this->getRequest()->getHeader("Authorization"); + $encodedRequestApiKey = substr($authHeader, strlen("Basic ")); $encodedStoredApiKey = base64_encode($CC_CONFIG["apiKey"][0] . ":"); - - if (!$encodedRequestApiKey === $encodedStoredApiKey) + + if ($encodedRequestApiKey !== $encodedStoredApiKey) { $this->getResponse() ->setHttpResponseCode(401) @@ -46,8 +47,7 @@ public function indexAction() $database = $values['database']['dbname']; $dir = __DIR__; - passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_$airtime_version/upgrade.sql $database 2>&1 | grep -v \"will create implicit index\""); - + passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_$airtime_upgrade_version/upgrade.sql $database 2>&1 | grep -v \"will create implicit index\""); $musicDir = CcMusicDirsQuery::create() ->filterByType('stor') diff --git a/airtime_mvc/application/controllers/plugins/Acl_plugin.php b/airtime_mvc/application/controllers/plugins/Acl_plugin.php index 4cf9f97b5b..c5dc4b9f4d 100644 --- a/airtime_mvc/application/controllers/plugins/Acl_plugin.php +++ b/airtime_mvc/application/controllers/plugins/Acl_plugin.php @@ -117,7 +117,7 @@ public function preDispatch(Zend_Controller_Request_Abstract $request) return; } - if (in_array($controller, array("api", "auth", "locale"))) { + if (in_array($controller, array("api", "auth", "locale", "upgrade"))) { $this->setRoleName("G"); } elseif (!Zend_Auth::getInstance()->hasIdentity()) { From 819862c37bf456be2f16816c0d35c9e3455dc0c3 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 10 Apr 2014 10:55:47 -0400 Subject: [PATCH 082/310] CC-5781: Upgrade script for new storage quota implementation cleaned up upgrade controller --- .../controllers/UpgradeController.php | 67 ++++++++++++------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index a01eb5ecab..bad83f4098 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -9,35 +9,15 @@ public function indexAction() $this->view->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); - //TODO: check api key - //The API key is passed in via HTTP "basic authentication": - //http://en.wikipedia.org/wiki/Basic_access_authentication - - $CC_CONFIG = Config::getConfig(); - - //Decode the API key that was passed to us in the HTTP request. - $authHeader = $this->getRequest()->getHeader("Authorization"); - - $encodedRequestApiKey = substr($authHeader, strlen("Basic ")); - $encodedStoredApiKey = base64_encode($CC_CONFIG["apiKey"][0] . ":"); - - if ($encodedRequestApiKey !== $encodedStoredApiKey) - { - $this->getResponse() - ->setHttpResponseCode(401) - ->appendBody("Bad Authorization."); - return; + if (!$this->verifyAuth()) { + retrun; } - //check current airtime version - $airtime_version = Application_Model_Preference::GetAirtimeVersion(); - if ($airtime_version != '2.5.2') { - $this->getResponse() - ->setHttpResponseCode(400) - ->appendBody("Upgrade to Airtime 2.5.3 FAILED. You must be using Airtime 2.5.2 to upgrade."); + if (!$this->verifyAirtimeVersion()) { return; } + //Begin upgrade $filename = "/etc/airtime/airtime.conf"; $values = parse_ini_file($filename, true); @@ -65,5 +45,42 @@ public function indexAction() ->appendBody("Upgrade to Airtime 2.5.3 OK"); } - + private function verifyAuth() + { + //The API key is passed in via HTTP "basic authentication": + //http://en.wikipedia.org/wiki/Basic_access_authentication + + $CC_CONFIG = Config::getConfig(); + + //Decode the API key that was passed to us in the HTTP request. + $authHeader = $this->getRequest()->getHeader("Authorization"); + + $encodedRequestApiKey = substr($authHeader, strlen("Basic ")); + $encodedStoredApiKey = base64_encode($CC_CONFIG["apiKey"][0] . ":"); + + if ($encodedRequestApiKey !== $encodedStoredApiKey) + { + $this->getResponse() + ->setHttpResponseCode(401) + ->appendBody("Error: Incorrect API key."); + return false; + } + return true; + } + + private function verifyAirtimeVersion() + { + $pref = CcPrefQuery::create() + ->filterByKeystr('system_version') + ->findOne(); + $airtime_version = $pref->getValStr(); + + if ($airtime_version != '2.5.2') { + $this->getResponse() + ->setHttpResponseCode(400) + ->appendBody("Upgrade to Airtime 2.5.3 FAILED. You must be using Airtime 2.5.2 to upgrade."); + return false; + } + return true; + } } \ No newline at end of file From 7fbd285dd0523be5870bd7d85f8f9b552984ce71 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 10 Apr 2014 15:55:21 -0400 Subject: [PATCH 083/310] Fix typo --- airtime_mvc/application/controllers/UpgradeController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index bad83f4098..4a745b6577 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -10,7 +10,7 @@ public function indexAction() $this->_helper->viewRenderer->setNoRender(true); if (!$this->verifyAuth()) { - retrun; + return; } if (!$this->verifyAirtimeVersion()) { From 4add0f0b7bbc95dc5baf1a3944629751a01190f4 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 14 Apr 2014 11:24:39 -0400 Subject: [PATCH 084/310] CC-5786: Quota Enforcement in the File Upload API --- .../controllers/PluploadController.php | 5 ++++ .../rest/controllers/MediaController.php | 23 ++++++++++++++++++- .../views/scripts/plupload/index.phtml | 11 +++++++-- airtime_mvc/public/css/styles.css | 2 ++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index 0695f0defb..a121bd7ec2 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -25,6 +25,11 @@ public function indexAction() $this->view->headLink()->appendStylesheet($baseUrl.'css/plupload.queue.css?'.$CC_CONFIG['airtime_version']); $this->view->headLink()->appendStylesheet($baseUrl.'css/addmedia.css?'.$CC_CONFIG['airtime_version']); + + $this->view->quotaLimitReached = false; + if (Application_Model_Preference::getDiskUsage() > Application_Model_Preference::getDiskQuota()) { + $this->view->quotaLimitReached = true; + } } public function recentUploadsAction() diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index ad8cada08b..ffe09ba89e 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -110,7 +110,7 @@ public function postAction() { return; } - + //If we do get an ID on a POST, then that doesn't make any sense //since POST is only for creating. if ($id = $this->_getParam('id', false)) { @@ -120,6 +120,13 @@ public function postAction() return; } + if (!$this->isEnoughDiskSpace()) { + $this->getResponse() + ->setHttpResponseCode(400) + ->appendBody("ERROR: Disk Quota limit reached."); + return; + } + $file = new CcFiles(); $whiteList = $this->removeBlacklistedFieldsFromRequestData($this->getRequest()->getPost()); @@ -423,5 +430,19 @@ public function sanitizeResponse($file) return $response; } + /** + * + * Checks if there is enough disk space to upload the file in question + * We allow one file to exceed to the disk quota so it is possible for the + * disk usage to be greater than the disk usage value + */ + private function isEnoughDiskSpace() + { + if (Application_Model_Preference::getDiskUsage() < Application_Model_Preference::GetDiskQuota()) { + return true; + } + return false; + } + } diff --git a/airtime_mvc/application/views/scripts/plupload/index.phtml b/airtime_mvc/application/views/scripts/plupload/index.phtml index 4eec764389..bd25abe61d 100644 --- a/airtime_mvc/application/views/scripts/plupload/index.phtml +++ b/airtime_mvc/application/views/scripts/plupload/index.phtml @@ -2,8 +2,15 @@ #plupload_files input[type="file"] { font-size: 200px !important; } - -
+ +quotaLimitReached) { ?> +
+ Disk quota exceeded. You cannot upload files until you upgrade your storage. +
+ +quotaLimitReached) { ?> class="hidden" >
diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index a63f4975e1..8cdf058917 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -3087,3 +3087,5 @@ dd .stream-status { #popup-share-link { width: 320px; } +.quota-reached { + font-size: 14px !important; From 63e2eda64b082cc7af854f9e10a5cb4cf0c0b7e6 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 14 Apr 2014 12:09:15 -0400 Subject: [PATCH 085/310] CC-5786: Quota Enforcement in the File Upload API Tweaked this so it will work on self-hosted instances --- .../application/controllers/PluploadController.php | 2 +- airtime_mvc/application/models/Systemstatus.php | 12 ++++++++++++ .../modules/rest/controllers/MediaController.php | 12 +++--------- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index a121bd7ec2..abd03afc36 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -27,7 +27,7 @@ public function indexAction() $this->view->headLink()->appendStylesheet($baseUrl.'css/addmedia.css?'.$CC_CONFIG['airtime_version']); $this->view->quotaLimitReached = false; - if (Application_Model_Preference::getDiskUsage() > Application_Model_Preference::getDiskQuota()) { + if (Application_Model_Systemstatus::isDiskOverQuota()) { $this->view->quotaLimitReached = true; } } diff --git a/airtime_mvc/application/models/Systemstatus.php b/airtime_mvc/application/models/Systemstatus.php index 4a0480a048..1185609f2a 100644 --- a/airtime_mvc/application/models/Systemstatus.php +++ b/airtime_mvc/application/models/Systemstatus.php @@ -235,4 +235,16 @@ public static function GetDiskInfo() return array_values($partitions); } + + public static function isDiskOverQuota() + { + $diskInfo = self::GetDiskInfo(); + $diskInfo = $diskInfo[0]; + $diskUsage = $diskInfo->totalSpace - $diskInfo->totalFreeSpace; + if ($diskUsage > $diskInfo->totalSpace) { + return true; + } + + return false; + } } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index ffe09ba89e..72fc067b14 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -120,7 +120,7 @@ public function postAction() return; } - if (!$this->isEnoughDiskSpace()) { + if (!$this->isDiskOverQuota()) { $this->getResponse() ->setHttpResponseCode(400) ->appendBody("ERROR: Disk Quota limit reached."); @@ -430,15 +430,9 @@ public function sanitizeResponse($file) return $response; } - /** - * - * Checks if there is enough disk space to upload the file in question - * We allow one file to exceed to the disk quota so it is possible for the - * disk usage to be greater than the disk usage value - */ - private function isEnoughDiskSpace() + private function isDiskOverQuota() { - if (Application_Model_Preference::getDiskUsage() < Application_Model_Preference::GetDiskQuota()) { + if (Application_Model_Systemstatus::isDiskOverQuota()) { return true; } return false; From acf91bc627b8feadb146229032455fa1e13c2ea1 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 14 Apr 2014 12:13:48 -0400 Subject: [PATCH 086/310] CC-5786: Quota Enforcement in the File Upload API Small refactor --- .../modules/rest/controllers/MediaController.php | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 72fc067b14..ecd538a126 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -120,10 +120,10 @@ public function postAction() return; } - if (!$this->isDiskOverQuota()) { + if (Application_Model_Systemstatus::isDiskOverQuota()) { $this->getResponse() ->setHttpResponseCode(400) - ->appendBody("ERROR: Disk Quota limit reached."); + ->appendBody("ERROR: Disk Quota reached."); return; } @@ -430,13 +430,5 @@ public function sanitizeResponse($file) return $response; } - private function isDiskOverQuota() - { - if (Application_Model_Systemstatus::isDiskOverQuota()) { - return true; - } - return false; - } - } From 53ffa29b6bd4c711f8549e96f38f8fed1fa4022f Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 14 Apr 2014 12:21:59 -0400 Subject: [PATCH 087/310] CC-5786: Quota Enforcement in the File Upload API small fix --- airtime_mvc/application/models/Systemstatus.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/models/Systemstatus.php b/airtime_mvc/application/models/Systemstatus.php index 1185609f2a..05e69bc345 100644 --- a/airtime_mvc/application/models/Systemstatus.php +++ b/airtime_mvc/application/models/Systemstatus.php @@ -241,7 +241,7 @@ public static function isDiskOverQuota() $diskInfo = self::GetDiskInfo(); $diskInfo = $diskInfo[0]; $diskUsage = $diskInfo->totalSpace - $diskInfo->totalFreeSpace; - if ($diskUsage > $diskInfo->totalSpace) { + if ($diskUsage >= $diskInfo->totalSpace) { return true; } From 7aba416c3b47b1fbbf899bcd342f8501a3fc149a Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 16 Apr 2014 10:54:55 -0400 Subject: [PATCH 088/310] Small fix to ftp hook script. Removed space that was getting added to the api key --- python_apps/airtime_analyzer/tools/ftp-upload-hook.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh index faf677a291..e456d8be95 100755 --- a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh +++ b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh @@ -26,7 +26,7 @@ post_file() { #path to specific instance's airtime.conf instance_conf_path=$base_instance_path$instance_path$airtime_conf_path - api_key=$(sudo awk -F "=" '/api_key/ {print $2}' $instance_conf_path) + api_key=$(awk -F "= " '/api_key/ {print $2}' $instance_conf_path) until curl --max-time 30 $url -u $api_key":" -X POST -F "file=@${file_path}" -F "name=${filename}" do From f49121116709c95e188f3d3559e911293b56d71d Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 16 Apr 2014 11:10:06 -0400 Subject: [PATCH 089/310] CC-5709: Airtime Analyzer * Retry HTTP requests (kinda crappy, should find a better design pattern to solve this) - CC-5775 * Persist failed HTTP requests at shutdown --- python_apps/airtime_analyzer/README.rst | 13 +- .../airtime_analyzer/airtime_analyzer.py | 12 +- .../airtime_analyzer/message_listener.py | 2 +- .../airtime_analyzer/status_reporter.py | 149 +++++++++++++++++- .../airtime_analyzer/bin/airtime_analyzer | 19 ++- 5 files changed, 181 insertions(+), 14 deletions(-) diff --git a/python_apps/airtime_analyzer/README.rst b/python_apps/airtime_analyzer/README.rst index 41881992e2..8ae0bdcacb 100644 --- a/python_apps/airtime_analyzer/README.rst +++ b/python_apps/airtime_analyzer/README.rst @@ -38,6 +38,9 @@ This application can be run as a daemon by running: $ airtime_analyzer -d +Other runtime flags can be listed by running: + + $ airtime_analyzer --help Developers @@ -81,8 +84,12 @@ To run the unit tests and generate a code coverage report, run: $ nosetests --with-coverage --cover-package=airtime_analyzer + +Running in a Multi-Tenant Environment +=========== + - History and Design Motivation - =========== +History and Design Motivation +=========== + - \ No newline at end of file diff --git a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py index 8fe25d0c57..39f3039f44 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py @@ -7,6 +7,7 @@ from functools import partial from metadata_analyzer import MetadataAnalyzer from replaygain_analyzer import ReplayGainAnalyzer +from status_reporter import StatusReporter from message_listener import MessageListener @@ -20,17 +21,22 @@ class AirtimeAnalyzerServer: # Variables _log_level = logging.INFO - def __init__(self, config_path, debug=False): + def __init__(self, rmq_config_path, http_retry_queue_path, debug=False): # Configure logging self.setup_logging(debug) # Read our config file - rabbitmq_config = self.read_config_file(config_path) - + rabbitmq_config = self.read_config_file(rmq_config_path) + + # Start up the StatusReporter process + StatusReporter.start_child_process(http_retry_queue_path) + # Start listening for RabbitMQ messages telling us about newly # uploaded files. self._msg_listener = MessageListener(rabbitmq_config) + + StatusReporter.stop_child_process() def setup_logging(self, debug): diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index b2a0085172..b39a7f805d 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -183,12 +183,12 @@ def msg_received_callback(channel, method_frame, header_frame, body): channel.basic_nack(delivery_tag=method_frame.delivery_tag, multiple=False, requeue=False) #Important that it doesn't requeue the message - # TODO: Report this as a failed upload to the File Upload REST API. # # TODO: If the JSON was invalid or the web server is down, # then don't report that failure to the REST API #TODO: Catch exceptions from this HTTP request too: if callback_url: # If we got an invalid message, there might be no callback_url in the JSON + # Report this as a failed upload to the File Upload REST API. StatusReporter.report_failure_to_callback_url(callback_url, api_key, import_status=2, reason=u'An error occurred while importing this file') diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index 4e1dccf2ca..ee5062943c 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -1,19 +1,157 @@ import requests import json import logging +import collections +import Queue +import signal +import multiprocessing +import pickle +import threading + +class PicklableHttpRequest: + def __init__(self, method, url, data, api_key): + self.method = method + self.url = url + self.data = data + self.api_key = api_key + + def create_request(self): + return requests.Request(method=self.method, url=self.url, data=self.data, + auth=requests.auth.HTTPBasicAuth(self.api_key, '')) + +def process_http_requests(ipc_queue, http_retry_queue_path): + ''' Runs in a separate process and performs all the HTTP requests where we're + reporting extracted audio file metadata or errors back to the Airtime web application. + + This process also checks every 5 seconds if there's failed HTTP requests that we + need to retry. We retry failed HTTP requests so that we don't lose uploads if the + web server is temporarily down. + + ''' + + # Store any failed requests (eg. due to web server errors or downtime) to be + # retried later: + retry_queue = collections.deque() + shutdown = False + + # Unpickle retry_queue from disk so that we won't have lost any uploads + # if airtime_analyzer is shut down while the web server is down or unreachable, + # and there were failed HTTP requests pending, waiting to be retried. + try: + with open(http_retry_queue_path, 'rb') as pickle_file: + retry_queue = pickle.load(pickle_file) + except IOError as e: + if e.errno == 2: + pass + else: + raise e + + while not shutdown: + try: + request = ipc_queue.get(block=True, timeout=5) + if isinstance(request, str) and request == "shutdown": # Bit of a cheat + shutdown = True + break + if not isinstance(request, PicklableHttpRequest): + raise TypeError("request must be a PicklableHttpRequest. Was of type " + type(request).__name__) + except Queue.Empty: + request = None + + # If there's no new HTTP request we need to execute, let's check our "retry + # queue" and see if there's any failed HTTP requests we can retry: + if request: + send_http_request(request, retry_queue) + else: + # Using a for loop instead of while so we only iterate over all the requests once! + for i in range(len(retry_queue)): + request = retry_queue.popleft() + send_http_request(request, retry_queue) + + logging.info("Shutting down status_reporter") + # Pickle retry_queue to disk so that we don't lose uploads if we're shut down while + # while the web server is down or unreachable. + with open(http_retry_queue_path, 'wb') as pickle_file: + pickle.dump(retry_queue, pickle_file) + +def send_http_request(picklable_request, retry_queue): + if not isinstance(picklable_request, PicklableHttpRequest): + raise TypeError("picklable_request must be a PicklableHttpRequest. Was of type " + type(picklable_request).__name__) + try: + prepared_request = picklable_request.create_request() + prepared_request = prepared_request.prepare() + s = requests.Session() + r = s.send(prepared_request, timeout=StatusReporter._HTTP_REQUEST_TIMEOUT) + r.raise_for_status() # Raise an exception if there was an http error code returned + logging.info("HTTP request sent successfully.") + except requests.exceptions.RequestException as e: + # If the web server is having problems, retry the request later: + logging.error("HTTP request failed. Retrying later! Exception was: %s" % str(e)) + retry_queue.append(picklable_request) + except Exception as e: + logging.error("HTTP request failed with unhandled exception. %s" % str(e)) + # Don't put the request into the retry queue, just give up on this one. + # I'm doing this to protect against us getting some pathological request + # that breaks our code. I don't want us having + + class StatusReporter(): ''' Reports the extracted audio file metadata and job status back to the Airtime web application. ''' _HTTP_REQUEST_TIMEOUT = 30 + + ''' We use multiprocessing.Process again here because we need a thread for this stuff + anyways, and Python gives us process isolation for free (crash safety). + ''' + _ipc_queue = multiprocessing.Queue() + #_request_process = multiprocessing.Process(target=process_http_requests, + # args=(_ipc_queue,)) + _request_process = None + + @classmethod + def start_child_process(self, http_retry_queue_path): + StatusReporter._request_process = threading.Thread(target=process_http_requests, + args=(StatusReporter._ipc_queue,http_retry_queue_path)) + StatusReporter._request_process.start() + + @classmethod + def stop_child_process(self): + logging.info("Terminating status_reporter process") + #StatusReporter._request_process.terminate() # Triggers SIGTERM on the child process + StatusReporter._ipc_queue.put("shutdown") # Special trigger + StatusReporter._request_process.join() + + @classmethod + def _send_http_request(self, request): + StatusReporter._ipc_queue.put(request) @classmethod def report_success_to_callback_url(self, callback_url, api_key, audio_metadata): ''' Report the extracted metadata and status of the successfully imported file to the callback URL (which should be the Airtime File Upload API) ''' - + put_payload = json.dumps(audio_metadata) + #r = requests.Request(method='PUT', url=callback_url, data=put_payload, + # auth=requests.auth.HTTPBasicAuth(api_key, '')) + ''' + r = requests.Request(method='PUT', url=callback_url, data=put_payload, + auth=requests.auth.HTTPBasicAuth(api_key, '')) + + StatusReporter._send_http_request(r) + ''' + + StatusReporter._send_http_request(PicklableHttpRequest(method='PUT', url=callback_url, + data=put_payload, api_key=api_key)) + + ''' + try: + r.raise_for_status() # Raise an exception if there was an http error code returned + except requests.exceptions.RequestException: + StatusReporter._ipc_queue.put(r.prepare()) + ''' + + ''' # Encode the audio metadata as json and post it back to the callback_url put_payload = json.dumps(audio_metadata) logging.debug("sending http put with payload: " + put_payload) @@ -25,6 +163,7 @@ def report_success_to_callback_url(self, callback_url, api_key, audio_metadata): #TODO: queue up failed requests and try them again later. r.raise_for_status() # Raise an exception if there was an http error code returned + ''' @classmethod def report_failure_to_callback_url(self, callback_url, api_key, import_status, reason): @@ -36,13 +175,19 @@ def report_failure_to_callback_url(self, callback_url, api_key, import_status, r audio_metadata["import_status"] = import_status audio_metadata["comment"] = reason # hack attack put_payload = json.dumps(audio_metadata) - logging.debug("sending http put with payload: " + put_payload) + #logging.debug("sending http put with payload: " + put_payload) + ''' r = requests.put(callback_url, data=put_payload, auth=requests.auth.HTTPBasicAuth(api_key, ''), timeout=StatusReporter._HTTP_REQUEST_TIMEOUT) + ''' + StatusReporter._send_http_request(PicklableHttpRequest(method='PUT', url=callback_url, + data=put_payload, api_key=api_key)) + ''' logging.debug("HTTP request returned status: " + str(r.status_code)) logging.debug(r.text) # log the response body #TODO: queue up failed requests and try them again later. r.raise_for_status() # raise an exception if there was an http error code returned + ''' diff --git a/python_apps/airtime_analyzer/bin/airtime_analyzer b/python_apps/airtime_analyzer/bin/airtime_analyzer index c74ad044c1..6e8eab367f 100755 --- a/python_apps/airtime_analyzer/bin/airtime_analyzer +++ b/python_apps/airtime_analyzer/bin/airtime_analyzer @@ -9,6 +9,7 @@ import airtime_analyzer.airtime_analyzer as aa VERSION = "1.0" DEFAULT_CONFIG_PATH = '/etc/airtime/airtime.conf' +DEFAULT_HTTP_RETRY_PATH = '/tmp/airtime_analyzer_http_retries' def run(): '''Entry-point for this application''' @@ -16,22 +17,30 @@ def run(): parser = argparse.ArgumentParser() parser.add_argument("-d", "--daemon", help="run as a daemon", action="store_true") parser.add_argument("--debug", help="log full debugging output", action="store_true") - parser.add_argument("--rmq-config-file", help="specify a configuration file with RabbitMQ settings (default is /etc/airtime/airtime.conf)") + parser.add_argument("--rmq-config-file", help="specify a configuration file with RabbitMQ settings (default is %s)" % DEFAULT_CONFIG_PATH) + parser.add_argument("--http-retry-queue-file", help="specify where incompleted HTTP requests will be serialized (default is %s)" % DEFAULT_HTTP_RETRY_PATH) args = parser.parse_args() check_if_media_monitor_is_running() #Default config file path - config_path = DEFAULT_CONFIG_PATH + rmq_config_path = DEFAULT_CONFIG_PATH + http_retry_queue_path = DEFAULT_HTTP_RETRY_PATH if args.rmq_config_file: - config_path = args.rmq_config_file + rmq_config_path = args.rmq_config_file + if args.http_retry_queue_file: + http_retry_queue_path = args.http_retry_queue_file if args.daemon: with daemon.DaemonContext(): - aa.AirtimeAnalyzerServer(config_path=config_path, debug=args.debug) + aa.AirtimeAnalyzerServer(rmq_config_path=rmq_config_path, + http_retry_queue_path=http_retry_queue_path, + debug=args.debug) else: # Run without daemonizing - aa.AirtimeAnalyzerServer(config_path=config_path, debug=args.debug) + aa.AirtimeAnalyzerServer(rmq_config_path=rmq_config_path, + http_retry_queue_path=http_retry_queue_path, + debug=args.debug) def check_if_media_monitor_is_running(): From f5a2e59b6dc11e68efd1147168c7cc14f9c54761 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 16 Apr 2014 12:15:34 -0400 Subject: [PATCH 090/310] Removed disk space check from StoredFile. This is now done in the Media controller --- airtime_mvc/application/models/StoredFile.php | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index b1ece8bd69..866e8327f9 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -899,19 +899,6 @@ public static function searchLibraryFiles($datatables) return $results; } - /** - * Check, using disk_free_space, the space available in the $destination_folder folder to see if it has - * enough space to move the $audio_file into and report back to the user if not. - **/ - public static function isEnoughDiskSpaceToCopy($destination_folder, $audio_file) - { - //check to see if we have enough space in the /organize directory to copy the file - $freeSpace = disk_free_space($destination_folder); - $fileSize = filesize($audio_file); - - return $freeSpace >= $fileSize; - } - /** * Copy a newly uploaded audio file from its temporary upload directory * on the local disk (like /tmp) over to Airtime's "stor" directory, @@ -952,16 +939,6 @@ public static function copyFileToStor($tempFilePath, $originalFilename) Logging::info("Warning: couldn't change permissions of $audio_file to 0644"); } - // Check if we have enough space before copying - if (!self::isEnoughDiskSpaceToCopy($stor, $audio_file)) { - $freeSpace = disk_free_space($stor); - $fileSize = filesize($audio_file); - - throw new Exception(sprintf(_("The file was not uploaded, there is " - ."%s MB of disk space left and the file you are " - ."uploading has a size of %s MB."), $freeSpace, $fileSize)); - } - // Check if liquidsoap can play this file // TODO: Move this to airtime_analyzer /* From b0670f5f478b94bdaca1acf6259050d940afcf25 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 16 Apr 2014 13:05:02 -0400 Subject: [PATCH 091/310] CC-5709: Airtime Analyzer * Log tracebacks from child process --- .../airtime_analyzer/analyzer_pipeline.py | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 0ba5fb22e0..3a1465b7b5 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -30,27 +30,33 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): temporary randomly generated name, which is why we want to know what the original name was. """ - if not isinstance(queue, multiprocessing.queues.Queue): - raise TypeError("queue must be a multiprocessing.Queue()") - if not isinstance(audio_file_path, unicode): - raise TypeError("audio_file_path must be unicode. Was of type " + type(audio_file_path).__name__ + " instead.") - if not isinstance(import_directory, unicode): - raise TypeError("import_directory must be unicode. Was of type " + type(import_directory).__name__ + " instead.") - if not isinstance(original_filename, unicode): - raise TypeError("original_filename must be unicode. Was of type " + type(original_filename).__name__ + " instead.") + try: + if not isinstance(queue, multiprocessing.queues.Queue): + raise TypeError("queue must be a multiprocessing.Queue()") + if not isinstance(audio_file_path, unicode): + raise TypeError("audio_file_path must be unicode. Was of type " + type(audio_file_path).__name__ + " instead.") + if not isinstance(import_directory, unicode): + raise TypeError("import_directory must be unicode. Was of type " + type(import_directory).__name__ + " instead.") + if not isinstance(original_filename, unicode): + raise TypeError("original_filename must be unicode. Was of type " + type(original_filename).__name__ + " instead.") - # Analyze the audio file we were told to analyze: - # First, we extract the ID3 tags and other metadata: - metadata = dict() - metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) - metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) - metadata["import_status"] = 0 # imported - # Note that the queue we're putting the results into is our interprocess communication - # back to the main process. + # Analyze the audio file we were told to analyze: + # First, we extract the ID3 tags and other metadata: + metadata = dict() + metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) + metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) + metadata["import_status"] = 0 # imported - # Pass all the file metadata back to the main analyzer process, which then passes - # it back to the Airtime web application. - queue.put(metadata) + # Note that the queue we're putting the results into is our interprocess communication + # back to the main process. + + # Pass all the file metadata back to the main analyzer process, which then passes + # it back to the Airtime web application. + queue.put(metadata) + except Exception as e: + # Ensures the traceback for this child process gets written to our log files: + logging.exception(e) + raise e From 9a3c88f00974d4c2ba1174ece48b73ddfaa1adf7 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 16 Apr 2014 15:33:02 -0400 Subject: [PATCH 092/310] CC-5709: Airtime Analyzer * Explicitly set the locale in upstart conf to avoid UTF-8/unicode errors from python. Fixes CC-5794. --- .../airtime_analyzer/install/upstart/airtime_analyzer.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf b/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf index 03bba725c6..6fccc21c90 100644 --- a/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf +++ b/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf @@ -6,5 +6,8 @@ stop on runlevel [!2345] respawn +env LANG='en_US.UTF-8' +env LC_ALL='en_US.UTF-8' + exec su www-data -c "airtime_analyzer" From cdce4ca10457ef0961d9b3f868200142392a855a Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 16 Apr 2014 16:42:37 -0400 Subject: [PATCH 093/310] CC-5709: Airtime Analyzer * Fixed the unit tests * Improved length testing because it seems to fluctuate a bit with your mutagen version (great, eh?) --- .../airtime_analyzer/metadata_analyzer.py | 3 --- .../tests/analyzer_pipeline_tests.py | 18 +++++++------- .../tests/metadata_analyzer_tests.py | 24 +++++++++++-------- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index 1e29830d6d..71462c45d2 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -49,9 +49,6 @@ def analyze(filename, metadata): mime_magic = magic.Magic(mime=True) metadata["mime"] = mime_magic.from_file(filename) - if isinstance(info, mutagen.mp3.MPEGInfo): - print "mode is: " + str(info.mode) - #Try to get the number of channels if mutagen can... try: #Special handling for getting the # of channels from MP3s. It's in the "mode" field diff --git a/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py b/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py index ba7b6f202e..cafa07b47f 100644 --- a/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py +++ b/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py @@ -22,15 +22,15 @@ def test_basic(): q = multiprocessing.Queue() #This actually imports the file into the "./Test Artist" directory. AnalyzerPipeline.run_analysis(q, DEFAULT_AUDIO_FILE, u'.', filename) - results = q.get() - assert results['track_title'] == u'Test Title' - assert results['artist_name'] == u'Test Artist' - assert results['album_title'] == u'Test Album' - assert results['year'] == u'1999' - assert results['genre'] == u'Test Genre' - assert results['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't. - assert results['length_seconds'] == 3.90925 - assert results["length"] == str(datetime.timedelta(seconds=results["length_seconds"])) + metadata = q.get() + assert metadata['track_title'] == u'Test Title' + assert metadata['artist_name'] == u'Test Artist' + assert metadata['album_title'] == u'Test Album' + assert metadata['year'] == u'1999' + assert metadata['genre'] == u'Test Genre' + assert metadata['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't. + assert abs(metadata['length_seconds'] - 3.9) < 0.1 + assert metadata["length"] == str(datetime.timedelta(seconds=metadata["length_seconds"])) assert os.path.exists(DEFAULT_IMPORT_DEST) @raises(TypeError) diff --git a/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py b/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py index 8baad0c548..6e59ae15ab 100644 --- a/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py +++ b/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py @@ -25,7 +25,7 @@ def test_mp3_mono(): check_default_metadata(metadata) assert metadata['channels'] == 1 assert metadata['bit_rate'] == 64000 - assert metadata['length_seconds'] == 3.90925 + assert abs(metadata['length_seconds'] - 3.9) < 0.1 assert metadata['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't. assert metadata['track_total'] == u'10' # MP3s can have a track_total #Mutagen doesn't extract comments from mp3s it seems @@ -35,7 +35,7 @@ def test_mp3_jointstereo(): check_default_metadata(metadata) assert metadata['channels'] == 2 assert metadata['bit_rate'] == 128000 - assert metadata['length_seconds'] == 3.90075 + assert abs(metadata['length_seconds'] - 3.9) < 0.1 assert metadata['mime'] == 'audio/mpeg' assert metadata['track_total'] == u'10' # MP3s can have a track_total @@ -44,7 +44,7 @@ def test_mp3_simplestereo(): check_default_metadata(metadata) assert metadata['channels'] == 2 assert metadata['bit_rate'] == 128000 - assert metadata['length_seconds'] == 3.90075 + assert abs(metadata['length_seconds'] - 3.9) < 0.1 assert metadata['mime'] == 'audio/mpeg' assert metadata['track_total'] == u'10' # MP3s can have a track_total @@ -53,7 +53,7 @@ def test_mp3_dualmono(): check_default_metadata(metadata) assert metadata['channels'] == 2 assert metadata['bit_rate'] == 128000 - assert metadata['length_seconds'] == 3.90075 + assert abs(metadata['length_seconds'] - 3.9) < 0.1 assert metadata['mime'] == 'audio/mpeg' assert metadata['track_total'] == u'10' # MP3s can have a track_total @@ -63,7 +63,7 @@ def test_ogg_mono(): check_default_metadata(metadata) assert metadata['channels'] == 1 assert metadata['bit_rate'] == 80000 - assert metadata['length_seconds'] == 3.8394104308390022 + assert abs(metadata['length_seconds'] - 3.8) < 0.1 assert metadata['mime'] == 'application/ogg' assert metadata['comment'] == u'Test Comment' @@ -72,7 +72,7 @@ def test_ogg_stereo(): check_default_metadata(metadata) assert metadata['channels'] == 2 assert metadata['bit_rate'] == 112000 - assert metadata['length_seconds'] == 3.8394104308390022 + assert abs(metadata['length_seconds'] - 3.8) < 0.1 assert metadata['mime'] == 'application/ogg' assert metadata['comment'] == u'Test Comment' @@ -84,7 +84,7 @@ def test_aac_mono(): check_default_metadata(metadata) assert metadata['channels'] == 1 assert metadata['bit_rate'] == 80000 - assert metadata['length_seconds'] == 3.8394104308390022 + assert abs(metadata['length_seconds'] - 3.8) < 0.1 assert metadata['mime'] == 'video/mp4' assert metadata['comment'] == u'Test Comment' ''' @@ -94,7 +94,7 @@ def test_aac_stereo(): check_default_metadata(metadata) assert metadata['channels'] == 2 assert metadata['bit_rate'] == 102619 - assert metadata['length_seconds'] == 3.8626303854875284 + assert abs(metadata['length_seconds'] - 3.8) < 0.1 assert metadata['mime'] == 'video/mp4' assert metadata['comment'] == u'Test Comment' @@ -110,7 +110,7 @@ def test_mp3_utf8(): assert metadata['track_number'] == u'1' assert metadata['channels'] == 2 assert metadata['bit_rate'] == 128000 - assert metadata['length_seconds'] == 3.90075 + assert abs(metadata['length_seconds'] - 3.9) < 0.1 assert metadata['mime'] == 'audio/mpeg' assert metadata['track_total'] == u'10' # MP3s can have a track_total @@ -143,7 +143,11 @@ def test_mp3_bad_channels(): check_default_metadata(metadata) assert metadata['channels'] == 1 assert metadata['bit_rate'] == 64000 - assert metadata['length_seconds'] == 3.90925 + print metadata['length_seconds'] + assert abs(metadata['length_seconds'] - 3.9) < 0.1 assert metadata['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't. assert metadata['track_total'] == u'10' # MP3s can have a track_total #Mutagen doesn't extract comments from mp3s it seems + +def test_unparsable_file(): + MetadataAnalyzer.analyze(u'README.rst', dict()) From a3be55fd6028e26ed063e6ec63749e84bf31f48a Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 16 Apr 2014 17:24:02 -0400 Subject: [PATCH 094/310] CC-5781: Upgrade script for new storage quota implementation Changed airtime conf file path so it works for saas or self-hosted users --- airtime_mvc/application/controllers/UpgradeController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index 4a745b6577..3e92ed2b26 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -18,7 +18,7 @@ public function indexAction() } //Begin upgrade - $filename = "/etc/airtime/airtime.conf"; + $filename = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf"; $values = parse_ini_file($filename, true); $username = $values['database']['dbuser']; From df9482f2ff9e0d939b87a7d042d73085b156c12b Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 17 Apr 2014 16:08:02 -0400 Subject: [PATCH 095/310] CC-5795: Airtime Analyzer: "Delete file" in Library doesnt remove it from path Media monitor was still being used to delete the file from stor --- airtime_mvc/application/models/StoredFile.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 866e8327f9..87cbe07047 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -393,9 +393,8 @@ public function delete() if (file_exists($filepath) && $type == "stor") { - $data = array("filepath" => $filepath, "delete" => 1); try { - Application_Model_RabbitMq::SendMessageToMediaMonitor("file_delete", $data); + unlink($filepath); } catch (Exception $e) { Logging::error($e->getMessage()); return; From 6a86a75ceea36508dafb125f3dfdc800f1d09e3b Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 21 Apr 2014 17:50:10 -0400 Subject: [PATCH 096/310] CC-5709: Airtime Analyzer * Fixed CC-5799: Incorrect Mime on import --- .../airtime_analyzer/airtime_analyzer/metadata_analyzer.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index 71462c45d2..4e4139be07 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -46,8 +46,11 @@ def analyze(filename, metadata): metadata["cueout"] = metadata["length"] #Use the python-magic module to get the MIME type. - mime_magic = magic.Magic(mime=True) - metadata["mime"] = mime_magic.from_file(filename) + if audio_file.mime: + metadata["mime"] = audio_file.mime[0] + else: + mime_magic = magic.Magic(mime=True) + metadata["mime"] = mime_magic.from_file(filename) #Try to get the number of channels if mutagen can... try: From d77f107df5a6116cef179d3f006bf07eae84d27f Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 22 Apr 2014 15:03:46 -0400 Subject: [PATCH 097/310] CC-5808: Fixed breakage at shutdown --- .../airtime_analyzer/airtime_analyzer/message_listener.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index b39a7f805d..9939f11bce 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -126,7 +126,7 @@ def disconnect_from_messaging_server(self): def graceful_shutdown(self, signum, frame): '''Disconnect and break out of the message listening loop''' self._shutdown = True - self.disconnect_from_message_listener() + self.disconnect_from_messaging_server() @staticmethod def msg_received_callback(channel, method_frame, header_frame, body): From dc27465b2169e9a1a7654ae867e3c4138c4abd5f Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 22 Apr 2014 15:27:43 -0400 Subject: [PATCH 098/310] Fix config parsing for dev_env Conflicts: airtime_mvc/application/configs/conf.php --- airtime_mvc/application/configs/conf.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/airtime_mvc/application/configs/conf.php b/airtime_mvc/application/configs/conf.php index 903b845c2e..cf2033d8d3 100644 --- a/airtime_mvc/application/configs/conf.php +++ b/airtime_mvc/application/configs/conf.php @@ -35,6 +35,11 @@ public static function loadConfig() { $CC_CONFIG['baseUrl'] = $values['general']['base_url']; $CC_CONFIG['basePort'] = $values['general']['base_port']; $CC_CONFIG['phpDir'] = $values['general']['airtime_dir']; + if (isset($values['general']['dev_env'])) { + $CC_CONFIG['dev_env'] == $values['general']['dev_env']; + } else { + $CC_CONFIG['dev_env'] = 'production'; + } $CC_CONFIG['cache_ahead_hours'] = $values['general']['cache_ahead_hours']; From e7482e52f71c7c3ffdd3a090d0578e640629c321 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 22 Apr 2014 15:56:29 -0400 Subject: [PATCH 099/310] Double equals typo *ducks* --- airtime_mvc/application/configs/conf.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/configs/conf.php b/airtime_mvc/application/configs/conf.php index cf2033d8d3..4063747c5b 100644 --- a/airtime_mvc/application/configs/conf.php +++ b/airtime_mvc/application/configs/conf.php @@ -36,7 +36,7 @@ public static function loadConfig() { $CC_CONFIG['basePort'] = $values['general']['base_port']; $CC_CONFIG['phpDir'] = $values['general']['airtime_dir']; if (isset($values['general']['dev_env'])) { - $CC_CONFIG['dev_env'] == $values['general']['dev_env']; + $CC_CONFIG['dev_env'] = $values['general']['dev_env']; } else { $CC_CONFIG['dev_env'] = 'production'; } From 41e2b5d84024c4be6afc0507669aef2f56f24267 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 23 Apr 2014 11:52:10 -0400 Subject: [PATCH 100/310] Fix the failed uploads view --- airtime_mvc/application/controllers/PluploadController.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index abd03afc36..5b45a59246 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -49,9 +49,10 @@ public function recentUploadsAction() $numTotalRecentUploads = $recentUploadsQuery->find()->count(); if ($filter == "pending") { - $recentUploadsQuery->filterByDbImportStatus("1"); + $recentUploadsQuery->filterByDbImportStatus(1); } else if ($filter == "failed") { - $recentUploadsQuery->filterByDbImportStatus(array('min' => 100)); + $recentUploadsQuery->filterByDbImportStatus(2); + //TODO: Consider using array('min' => 200)) or something if we have multiple errors codes for failure. } $recentUploads = $recentUploadsQuery->offset($rowStart)->limit($limit)->find(); From b920ed2598c875a8665f65b42e2b60a771c4b9d9 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 23 Apr 2014 12:21:39 -0400 Subject: [PATCH 101/310] Fixed a bunch of installer stuff for Naomi --- install_minimal/airtime-install | 12 +++++++-- install_minimal/include/airtime-copy-files.sh | 6 +++-- install_minimal/include/airtime-upgrade.php | 3 +++ utils/airtime-check-system.php | 27 ++++++++++--------- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/install_minimal/airtime-install b/install_minimal/airtime-install index 833cb447e0..25423119f3 100755 --- a/install_minimal/airtime-install +++ b/install_minimal/airtime-install @@ -38,6 +38,7 @@ rabbitmq_install () { rabbitmqctl add_vhost $RABBITMQ_VHOST rabbitmqctl add_user $RABBITMQ_USER $RABBITMQ_PASSWORD rabbitmqctl set_permissions -p $RABBITMQ_VHOST $RABBITMQ_USER "$EXCHANGES" "$EXCHANGES" "$EXCHANGES" + rabbitmqctl set_permissions -p $RABBITMQ_VHOST $RABBITMQ_USER .\* .\* .\* export RABBITMQ_USER export RABBITMQ_PASSWORD @@ -49,6 +50,7 @@ preserve="f" nodb="f" reinstall="f" mediamonitor="f" +airtime_analyzer="f" pypo="f" showrecorder="f" web="f" @@ -64,6 +66,7 @@ do (-n|--no-db) nodb="t";; (-r|--reinstall) reinstall="t";; (-m|--media-monitor) mediamonitor="t";; + (-a|--airtime-analyzer) airtime_analyzer="t";; (-y|--pypo) pypo="t";; (-w|--web) web="t";; (-d|--disable-deb-check) disable_deb_check="t";; @@ -75,11 +78,12 @@ do shift done -if [ "$mediamonitor" = "f" -a "$pypo" = "f" -a "$web" = "f" ]; then +if [ "$mediamonitor" = "f" -a "$pypo" = "f" -a "$web" = "f" -a "$airtime_analyzer" = "f" ]; then #none of these install parameters were specified, so by default we install all of them - mediamonitor="t" + mediamonitor="f" # FIXME: Remove media_monitor! -- Albert pypo="t" showrecorder="t" + airtime_analyzer="t" web="t" fi @@ -181,6 +185,7 @@ fi #export these variables to make them available in sub bash scripts export DO_UPGRADE export mediamonitor +export airtime_analyzer export pypo export showrecorder export web @@ -236,6 +241,9 @@ if [ "$mediamonitor" = "t" -o "$pypo" = "t" ]; then deactivate fi +# Restart airtime_analyzer (or start it) +service airtime_analyzer restart + #An attempt to force apache to realize that files are updated on upgrade... touch /usr/share/airtime/public/index.php diff --git a/install_minimal/include/airtime-copy-files.sh b/install_minimal/include/airtime-copy-files.sh index ced1786ded..8f26b7d3f5 100755 --- a/install_minimal/include/airtime-copy-files.sh +++ b/install_minimal/include/airtime-copy-files.sh @@ -64,8 +64,10 @@ echo "* Creating /usr/lib/airtime" if [ "$python_service" -eq "0" ]; then python $AIRTIMEROOT/python_apps/api_clients/install/api_client_install.py - if [ "$mediamonitor" = "t" ]; then - python $AIRTIMEROOT/python_apps/media-monitor/install/media-monitor-copy-files.py + if [ "$airtime_analyzer" = "t" ]; then + pushd $AIRTIMEROOT/python_apps/airtime_analyzer/ + python setup.py install + popd fi if [ "$pypo" = "t" ]; then python $AIRTIMEROOT/python_apps/pypo/install/pypo-copy-files.py diff --git a/install_minimal/include/airtime-upgrade.php b/install_minimal/include/airtime-upgrade.php index af9f971d42..5e8754ec5c 100644 --- a/install_minimal/include/airtime-upgrade.php +++ b/install_minimal/include/airtime-upgrade.php @@ -65,6 +65,9 @@ function pause() exit(1); } +// Stop media-monitor +service media-monitor stop-with-monit + //convert strings like 1.9.0-devel to 1.9.0 $version = substr($version, 0, 5); diff --git a/utils/airtime-check-system.php b/utils/airtime-check-system.php index 3a4816dcf2..76e313c742 100644 --- a/utils/airtime-check-system.php +++ b/utils/airtime-check-system.php @@ -195,19 +195,20 @@ public static function PrintStatus($p_baseUrl, $p_basePort, $p_status){ $log = "/var/log/airtime/pypo-liquidsoap/ls_script.log"; self::show_log_file($log); } - if (isset($services->media_monitor) && $services->media_monitor->process_id != "FAILED") { - self::output_status("MEDIA_MONITOR_PROCESS_ID", $data->services->media_monitor->process_id); - self::output_status("MEDIA_MONITOR_RUNNING_SECONDS", $data->services->media_monitor->uptime_seconds); - self::output_status("MEDIA_MONITOR_MEM_PERC", $data->services->media_monitor->memory_perc); - self::output_status("MEDIA_MONITOR_CPU_PERC", $data->services->media_monitor->cpu_perc); - } else { - self::output_status("MEDIA_MONITOR_PROCESS_ID", "FAILED"); - self::output_status("MEDIA_MONITOR_RUNNING_SECONDS", "0"); - self::output_status("MEDIA_MONITOR_MEM_PERC", "0%"); - self::output_status("MEDIA_MONITOR_CPU_PERC", "0%"); - $log = "/var/log/airtime/media-monitor/media-monitor.log"; - self::show_log_file($log); - } + + #if (isset($services->media_monitor) && $services->media_monitor->process_id != "FAILED") { + # self::output_status("MEDIA_MONITOR_PROCESS_ID", $data->services->media_monitor->process_id); + # self::output_status("MEDIA_MONITOR_RUNNING_SECONDS", $data->services->media_monitor->uptime_seconds); + # self::output_status("MEDIA_MONITOR_MEM_PERC", $data->services->media_monitor->memory_perc); + # self::output_status("MEDIA_MONITOR_CPU_PERC", $data->services->media_monitor->cpu_perc); + #} else { + # self::output_status("MEDIA_MONITOR_PROCESS_ID", "FAILED"); + # self::output_status("MEDIA_MONITOR_RUNNING_SECONDS", "0"); + # self::output_status("MEDIA_MONITOR_MEM_PERC", "0%"); + # self::output_status("MEDIA_MONITOR_CPU_PERC", "0%"); + # $log = "/var/log/airtime/media-monitor/media-monitor.log"; + # self::show_log_file($log); + #} } if (self::$AIRTIME_STATUS_OK){ From 3e34f1cf96984ad59c6d6c1d35701aa39f354da3 Mon Sep 17 00:00:00 2001 From: Naomi Date: Wed, 23 Apr 2014 12:53:43 -0400 Subject: [PATCH 102/310] fixing up some datatables queries, propel usage. --- .../controllers/PluploadController.php | 53 +++++++++---------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index 5b45a59246..84e1289c94 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -34,56 +34,53 @@ public function indexAction() public function recentUploadsAction() { - if (isset($_GET['uploadFilter'])) { - $filter = $_GET['uploadFilter']; - } else { - $filter = "all"; - } - - $limit = isset($_GET['iDisplayLength']) ? $_GET['iDisplayLength'] : 10; - $rowStart = isset($_GET['iDisplayStart']) ? $_GET['iDisplayStart'] : 0; + $request = $this->getRequest(); + + $filter = $request->getParam('uploadFilter', "all"); + $limit = intval($request->getParam('iDisplayLength', 10)); + $rowStart = intval($request->getParam('iDisplayStart', 0)); - $recentUploadsQuery = CcFilesQuery::create()->filterByDbUtime(array('min' => time() - 30 * 24 * 60 * 60)) - ->orderByDbUtime(Criteria::DESC); + $recentUploadsQuery = CcFilesQuery::create(); + //old propel 1.5 to reuse this query item (for counts/finds) + $recentUploadsQuery->keepQuery(true); - $numTotalRecentUploads = $recentUploadsQuery->find()->count(); + $numTotalRecentUploads = $recentUploadsQuery->count(); + $numTotalDisplayUploads = $numTotalRecentUploads; if ($filter == "pending") { $recentUploadsQuery->filterByDbImportStatus(1); + $numTotalDisplayUploads = $recentUploadsQuery->count(); } else if ($filter == "failed") { - $recentUploadsQuery->filterByDbImportStatus(2); + $recentUploadsQuery->filterByDbImportStatus(2); + $numTotalDisplayUploads = $recentUploadsQuery->count(); //TODO: Consider using array('min' => 200)) or something if we have multiple errors codes for failure. } - $recentUploads = $recentUploadsQuery->offset($rowStart)->limit($limit)->find(); - - $numRecentUploads = $limit; - //CcFilesQuery::create()->filterByDbUtime(array('min' => time() - 30 * 24 * 60 * 60)) - - //$this->_helper->json->sendJson(array("jsonrpc" => "2.0", "tempfilepath" => $tempFileName)); + $recentUploads = $recentUploadsQuery + ->orderByDbUtime(Criteria::DESC) + ->offset($rowStart) + ->limit($limit) + ->find(); $uploadsArray = array(); + $utcTimezone = new DateTimeZone("UTC"); + $displayTimezone = new DateTimeZone(Application_Model_Preference::GetUserTimezone()); foreach ($recentUploads as $upload) { $upload = $upload->toArray(BasePeer::TYPE_FIELDNAME); //TODO: $this->sanitizeResponse($upload)); - $utcTimezone = new DateTimeZone("UTC"); - $displayTimezone = new DateTimeZone(Application_Model_Preference::GetUserTimezone()); $upload['utime'] = new DateTime($upload['utime'], $utcTimezone); $upload['utime']->setTimeZone($displayTimezone); $upload['utime'] = $upload['utime']->format('Y-m-d H:i:s'); - - //$this->_helper->json->sendJson($upload->asJson()); + //TODO: Invoke sanitization here array_push($uploadsArray, $upload); } - - $this->view->sEcho = intval($this->getRequest()->getParam('sEcho')); - $this->view->iTotalDisplayRecords = $numTotalRecentUploads; - //$this->view->iTotalDisplayRecords = $numRecentUploads; //$r["iTotalDisplayRecords"]; - $this->view->iTotalRecords = $numTotalRecentUploads; //$r["iTotalRecords"]; - $this->view->files = $uploadsArray; //$r["aaData"]; + $this->view->sEcho = intval($request->getParam('sEcho')); + $this->view->iTotalDisplayRecords = $numTotalDisplayUploads; + $this->view->iTotalRecords = $numTotalRecentUploads; + $this->view->files = $uploadsArray; } } From 4f3298b9869c63eddad7e1714978903db7bb3fda Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 23 Apr 2014 14:17:58 -0400 Subject: [PATCH 103/310] Installer fix --- install_minimal/include/airtime-initialize.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/install_minimal/include/airtime-initialize.sh b/install_minimal/include/airtime-initialize.sh index 63a7c55a26..05978955f0 100755 --- a/install_minimal/include/airtime-initialize.sh +++ b/install_minimal/include/airtime-initialize.sh @@ -42,7 +42,9 @@ fi chmod 600 /etc/monit/conf.d/monit-airtime-generic.cfg chmod 600 /etc/monit/conf.d/monit-airtime-liquidsoap.cfg -chmod 600 /etc/monit/conf.d/monit-airtime-media-monitor.cfg +if [ "$mediamonitor" = "t" ]; then + chmod 600 /etc/monit/conf.d/monit-airtime-media-monitor.cfg +fi chmod 600 /etc/monit/conf.d/monit-airtime-playout.cfg chmod 600 /etc/monit/conf.d/monit-airtime-liquidsoap.cfg From f2ce77fecb9f610a590dfdda38462368477e749c Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 23 Apr 2014 14:20:48 -0400 Subject: [PATCH 104/310] Remove python-magic --- .../airtime_analyzer/airtime_analyzer/metadata_analyzer.py | 6 +----- python_apps/airtime_analyzer/setup.py | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index 4e4139be07..e6794fbc98 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -1,7 +1,6 @@ import time import datetime import mutagen -import magic # For MIME type detection from analyzer import Analyzer class MetadataAnalyzer(Analyzer): @@ -45,12 +44,9 @@ def analyze(filename, metadata): # Other fields for Airtime metadata["cueout"] = metadata["length"] - #Use the python-magic module to get the MIME type. + #Use the mutagen to get the MIME type. if audio_file.mime: metadata["mime"] = audio_file.mime[0] - else: - mime_magic = magic.Magic(mime=True) - metadata["mime"] = mime_magic.from_file(filename) #Try to get the number of channels if mutagen can... try: diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index 82c64d84cb..a0dba0cfc9 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -22,7 +22,6 @@ scripts=['bin/airtime_analyzer'], install_requires=[ 'mutagen', - 'python-magic', 'pika', 'nose', 'coverage', From 9fdfc0a957479bea1b8ec6a20ecdbc8695e583fa Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 23 Apr 2014 17:42:09 -0400 Subject: [PATCH 105/310] CC-5709: Airtime Analyzer * Catch exceptions related to unpickling the HTTP request queue --- .../airtime_analyzer/airtime_analyzer/status_reporter.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index ee5062943c..33f082cd3e 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -45,6 +45,13 @@ def process_http_requests(ipc_queue, http_retry_queue_path): pass else: raise e + except Exception as e: + # If we fail to unpickle a saved queue of failed HTTP requests, then we'll just log an error + # and continue because those HTTP requests are lost anyways. The pickled file will be + # overwritten the next time the analyzer is shut down too. + logging.error("Failed to unpickle %s. Continuing..." % http_retry_queue_path) + pass + while not shutdown: try: From bc72a6626e075020bfde07e613ec6173b07bc692 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 23 Apr 2014 18:20:50 -0400 Subject: [PATCH 106/310] CC-5709: Airtime Analyzer * Fixed some unit tests that broken when I dropped python-magic in favour of mutagen for MIME type detection --- .../airtime_analyzer/metadata_analyzer.py | 2 +- .../airtime_analyzer/status_reporter.py | 3 ++- .../tests/analyzer_pipeline_tests.py | 2 +- .../tests/metadata_analyzer_tests.py | 20 +++++++++---------- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index e6794fbc98..fada83683b 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -52,7 +52,7 @@ def analyze(filename, metadata): try: #Special handling for getting the # of channels from MP3s. It's in the "mode" field #which is 0=Stereo, 1=Joint Stereo, 2=Dual Channel, 3=Mono. Part of the ID3 spec... - if metadata["mime"] == "audio/mpeg": + if metadata["mime"] in ["audio/mpeg", 'audio/mp3']: if info.mode == 3: metadata["channels"] = 1 else: diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index 33f082cd3e..0e3c716190 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -98,7 +98,8 @@ def send_http_request(picklable_request, retry_queue): logging.error("HTTP request failed with unhandled exception. %s" % str(e)) # Don't put the request into the retry queue, just give up on this one. # I'm doing this to protect against us getting some pathological request - # that breaks our code. I don't want us having + # that breaks our code. I don't want us pickling data that potentially + # breaks airtime_analyzer. diff --git a/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py b/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py index cafa07b47f..54458e33f6 100644 --- a/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py +++ b/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py @@ -28,7 +28,7 @@ def test_basic(): assert metadata['album_title'] == u'Test Album' assert metadata['year'] == u'1999' assert metadata['genre'] == u'Test Genre' - assert metadata['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't. + assert metadata['mime'] == 'audio/mp3' # Not unicode because MIMEs aren't. assert abs(metadata['length_seconds'] - 3.9) < 0.1 assert metadata["length"] == str(datetime.timedelta(seconds=metadata["length_seconds"])) assert os.path.exists(DEFAULT_IMPORT_DEST) diff --git a/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py b/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py index 6e59ae15ab..9215c493af 100644 --- a/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py +++ b/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py @@ -26,7 +26,7 @@ def test_mp3_mono(): assert metadata['channels'] == 1 assert metadata['bit_rate'] == 64000 assert abs(metadata['length_seconds'] - 3.9) < 0.1 - assert metadata['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't. + assert metadata['mime'] == 'audio/mp3' # Not unicode because MIMEs aren't. assert metadata['track_total'] == u'10' # MP3s can have a track_total #Mutagen doesn't extract comments from mp3s it seems @@ -36,7 +36,7 @@ def test_mp3_jointstereo(): assert metadata['channels'] == 2 assert metadata['bit_rate'] == 128000 assert abs(metadata['length_seconds'] - 3.9) < 0.1 - assert metadata['mime'] == 'audio/mpeg' + assert metadata['mime'] == 'audio/mp3' assert metadata['track_total'] == u'10' # MP3s can have a track_total def test_mp3_simplestereo(): @@ -45,7 +45,7 @@ def test_mp3_simplestereo(): assert metadata['channels'] == 2 assert metadata['bit_rate'] == 128000 assert abs(metadata['length_seconds'] - 3.9) < 0.1 - assert metadata['mime'] == 'audio/mpeg' + assert metadata['mime'] == 'audio/mp3' assert metadata['track_total'] == u'10' # MP3s can have a track_total def test_mp3_dualmono(): @@ -54,7 +54,7 @@ def test_mp3_dualmono(): assert metadata['channels'] == 2 assert metadata['bit_rate'] == 128000 assert abs(metadata['length_seconds'] - 3.9) < 0.1 - assert metadata['mime'] == 'audio/mpeg' + assert metadata['mime'] == 'audio/mp3' assert metadata['track_total'] == u'10' # MP3s can have a track_total @@ -64,7 +64,7 @@ def test_ogg_mono(): assert metadata['channels'] == 1 assert metadata['bit_rate'] == 80000 assert abs(metadata['length_seconds'] - 3.8) < 0.1 - assert metadata['mime'] == 'application/ogg' + assert metadata['mime'] == 'audio/vorbis' assert metadata['comment'] == u'Test Comment' def test_ogg_stereo(): @@ -73,7 +73,7 @@ def test_ogg_stereo(): assert metadata['channels'] == 2 assert metadata['bit_rate'] == 112000 assert abs(metadata['length_seconds'] - 3.8) < 0.1 - assert metadata['mime'] == 'application/ogg' + assert metadata['mime'] == 'audio/vorbis' assert metadata['comment'] == u'Test Comment' ''' faac and avconv can't seem to create a proper mono AAC file... ugh @@ -85,7 +85,7 @@ def test_aac_mono(): assert metadata['channels'] == 1 assert metadata['bit_rate'] == 80000 assert abs(metadata['length_seconds'] - 3.8) < 0.1 - assert metadata['mime'] == 'video/mp4' + assert metadata['mime'] == 'audio/mp4' assert metadata['comment'] == u'Test Comment' ''' @@ -95,7 +95,7 @@ def test_aac_stereo(): assert metadata['channels'] == 2 assert metadata['bit_rate'] == 102619 assert abs(metadata['length_seconds'] - 3.8) < 0.1 - assert metadata['mime'] == 'video/mp4' + assert metadata['mime'] == 'audio/mp4' assert metadata['comment'] == u'Test Comment' def test_mp3_utf8(): @@ -111,7 +111,7 @@ def test_mp3_utf8(): assert metadata['channels'] == 2 assert metadata['bit_rate'] == 128000 assert abs(metadata['length_seconds'] - 3.9) < 0.1 - assert metadata['mime'] == 'audio/mpeg' + assert metadata['mime'] == 'audio/mp3' assert metadata['track_total'] == u'10' # MP3s can have a track_total # Make sure the parameter checking works @@ -145,7 +145,7 @@ def test_mp3_bad_channels(): assert metadata['bit_rate'] == 64000 print metadata['length_seconds'] assert abs(metadata['length_seconds'] - 3.9) < 0.1 - assert metadata['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't. + assert metadata['mime'] == 'audio/mp3' # Not unicode because MIMEs aren't. assert metadata['track_total'] == u'10' # MP3s can have a track_total #Mutagen doesn't extract comments from mp3s it seems From 069ebd39917f3ffa850c920b07833807446c7463 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 24 Apr 2014 10:12:24 -0400 Subject: [PATCH 107/310] CC-5802: Upgrade application.ini file --- .../controllers/UpgradeController.php | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index 3e92ed2b26..28b1abc87c 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -40,6 +40,41 @@ public function indexAction() Application_Model_Preference::setDiskUsage($totalSpace - $freeSpace); + $iniFile = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."application.ini" : "/usr/share/airtime/application/configs/application.ini"; + + //update application.ini + $newLines = "resources.frontController.moduleDirectory = APPLICATION_PATH '/modules'\n". + "resources.frontController.plugins.putHandler = 'Zend_Controller_Plugin_PutHandler'\n". + ";load everything in the modules directory including models\n". + "resources.modules[] = ''\n"; + + $currentIniFile = file_get_contents($iniFile); + + /* We want to add the new lines immediately after the first line, '[production]' + * We read the first line into $beginning, and the rest of the file into $end. + * Then overwrite the current application.ini file with $beginning, $newLines, and $end + */ + $lines = explode("\n", $currentIniFile); + $beginning = implode("\n", array_slice($lines, 0,1)); + + //check that first line is '[production]' + if ($beginning != '[production]') { + $this->getResponse() + ->setHttpResponseCode(400) + ->appendBody('Upgrade to Airtime 2.5.3 FAILED. Could not upgrade application.ini'); + return; + } + $end = implode("\n", array_slice($lines, 1)); + + if (!is_writeable($iniFile)) { + $this->getResponse() + ->setHttpResponseCode(400) + ->appendBody('Upgrade to Airtime 2.5.3 FAILED. Could not upgrade application.ini'); + return; + } + $file = new SplFileObject($iniFile, "w"); + $file->fwrite($beginning."\n".$newLines.$end); + $this->getResponse() ->setHttpResponseCode(200) ->appendBody("Upgrade to Airtime 2.5.3 OK"); From f536a7b1b44f1d3c107c69b063515b29b8bd7c50 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 24 Apr 2014 16:19:55 -0400 Subject: [PATCH 108/310] CC-5814: 'Down for maintenance' page during upgrades --- airtime_mvc/application/Bootstrap.php | 7 +++++++ .../application/controllers/IndexController.php | 5 +++++ .../application/controllers/UpgradeController.php | 8 ++++++++ .../controllers/plugins/Maintenance.php | 15 +++++++++++++++ .../views/scripts/index/maintenance.phtml | 1 + 5 files changed, 36 insertions(+) create mode 100644 airtime_mvc/application/controllers/plugins/Maintenance.php create mode 100644 airtime_mvc/application/views/scripts/index/maintenance.phtml diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index 74c1cd69e0..fc9f6c7e41 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -16,6 +16,7 @@ require_once "Timezone.php"; require_once __DIR__.'/forms/helpers/ValidationTypes.php'; require_once __DIR__.'/controllers/plugins/RabbitMqPlugin.php'; +require_once __DIR__.'/controllers/plugins/Maintenance.php'; require_once (APPLICATION_PATH."/logging/Logging.php"); Logging::setLogPath('/var/log/airtime/zendphp.log'); @@ -198,5 +199,11 @@ protected function _initRouter() 'action' => 'password-change', ))); } + + public function _initPlugins() + { + $front = Zend_Controller_Front::getInstance(); + $front->registerPlugin(new Zend_Controller_Plugin_Maintenance()); + } } diff --git a/airtime_mvc/application/controllers/IndexController.php b/airtime_mvc/application/controllers/IndexController.php index 8dcdb3a643..232623bc93 100644 --- a/airtime_mvc/application/controllers/IndexController.php +++ b/airtime_mvc/application/controllers/IndexController.php @@ -18,4 +18,9 @@ public function mainAction() $this->_helper->layout->setLayout('layout'); } + public function maintenanceAction() + { + $this->getResponse()->setHttpResponseCode(503); + } + } diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index 28b1abc87c..c09d58953c 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -17,6 +17,12 @@ public function indexAction() return; } + //Disable Airtime UI + //create a temporary maintenance notification file + $maintenanceFile = '/tmp/maintenance.txt'; + $file = fopen($maintenanceFile, 'w'); + fclose($file); + //Begin upgrade $filename = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf"; $values = parse_ini_file($filename, true); @@ -75,6 +81,8 @@ public function indexAction() $file = new SplFileObject($iniFile, "w"); $file->fwrite($beginning."\n".$newLines.$end); + unlink($maintenanceFile); + $this->getResponse() ->setHttpResponseCode(200) ->appendBody("Upgrade to Airtime 2.5.3 OK"); diff --git a/airtime_mvc/application/controllers/plugins/Maintenance.php b/airtime_mvc/application/controllers/plugins/Maintenance.php new file mode 100644 index 0000000000..46937f5821 --- /dev/null +++ b/airtime_mvc/application/controllers/plugins/Maintenance.php @@ -0,0 +1,15 @@ +maintenanceFile)) { + $request->setModuleName('default') + ->setControllerName('index') + ->setActionName('maintenance') + ->setDispatched(true); + } + } +} \ No newline at end of file diff --git a/airtime_mvc/application/views/scripts/index/maintenance.phtml b/airtime_mvc/application/views/scripts/index/maintenance.phtml new file mode 100644 index 0000000000..5a2277989e --- /dev/null +++ b/airtime_mvc/application/views/scripts/index/maintenance.phtml @@ -0,0 +1 @@ +Airtime is down for maintenance. We'll be back soon! From 42f3bb17e193a6aa1b59f6b6431ff93c1eea5eec Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 24 Apr 2014 16:23:57 -0400 Subject: [PATCH 109/310] CC-5814: 'Down for maintenance' page during upgrades --- airtime_mvc/application/controllers/UpgradeController.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index c09d58953c..ae7ad3e7e0 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -19,6 +19,8 @@ public function indexAction() //Disable Airtime UI //create a temporary maintenance notification file + //when this file is on the server, zend framework redirects all + //requests to the maintenance page and sets a 503 response code $maintenanceFile = '/tmp/maintenance.txt'; $file = fopen($maintenanceFile, 'w'); fclose($file); @@ -81,7 +83,10 @@ public function indexAction() $file = new SplFileObject($iniFile, "w"); $file->fwrite($beginning."\n".$newLines.$end); + //delete maintenance.txt to give users access back to Airtime unlink($maintenanceFile); + + //TODO: clear out the cache $this->getResponse() ->setHttpResponseCode(200) From e503c952d2030efd81fa4ad62825dc4649be9bee Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 24 Apr 2014 17:05:38 -0400 Subject: [PATCH 110/310] CC-5816: Publisher column * Kanye West support. Surely --- .../airtime_analyzer/airtime_analyzer/metadata_analyzer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index fada83683b..2d0e09fc2b 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -1,6 +1,7 @@ import time import datetime import mutagen +import logging from analyzer import Analyzer class MetadataAnalyzer(Analyzer): @@ -92,6 +93,7 @@ def analyze(filename, metadata): 'genre': 'genre', 'isrc': 'isrc', 'label': 'label', + 'organization': 'label', #'length': 'length', 'language': 'language', 'last_modified':'last_modified', From 54db74f622dda1fd8e188f7bb99b29e0ff2e5c6b Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 25 Apr 2014 00:40:51 -0400 Subject: [PATCH 111/310] Allow upgrades from Airtime 2.5.1 because the version wasn't bumped internally to 2.5.2 --- airtime_mvc/application/controllers/UpgradeController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index ae7ad3e7e0..2a22999f37 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -123,12 +123,12 @@ private function verifyAirtimeVersion() ->findOne(); $airtime_version = $pref->getValStr(); - if ($airtime_version != '2.5.2') { + if ($airtime_version != '2.5.2' || $airtime_version != '2.5.1') { $this->getResponse() ->setHttpResponseCode(400) - ->appendBody("Upgrade to Airtime 2.5.3 FAILED. You must be using Airtime 2.5.2 to upgrade."); + ->appendBody("Upgrade to Airtime 2.5.3 FAILED. You must be using Airtime 2.5.1 or 2.5.2 to upgrade."); return false; } return true; } -} \ No newline at end of file +} From e7ea5e53011a77e8042354e33c89d4a76c15d570 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 25 Apr 2014 00:48:13 -0400 Subject: [PATCH 112/310] Try fixing UpgradeController version check again... --- airtime_mvc/application/controllers/UpgradeController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index 2a22999f37..e9ad48131d 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -123,7 +123,7 @@ private function verifyAirtimeVersion() ->findOne(); $airtime_version = $pref->getValStr(); - if ($airtime_version != '2.5.2' || $airtime_version != '2.5.1') { + if (!in_array($airtime_version, ['2.5.1', '2.5.2']) { $this->getResponse() ->setHttpResponseCode(400) ->appendBody("Upgrade to Airtime 2.5.3 FAILED. You must be using Airtime 2.5.1 or 2.5.2 to upgrade."); From cdc88d25e1ced90a41fa92cbd900697b25e65288 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 25 Apr 2014 01:02:47 -0400 Subject: [PATCH 113/310] Argh, fixed typo... it's late --- airtime_mvc/application/controllers/UpgradeController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index e9ad48131d..b293aab595 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -123,7 +123,7 @@ private function verifyAirtimeVersion() ->findOne(); $airtime_version = $pref->getValStr(); - if (!in_array($airtime_version, ['2.5.1', '2.5.2']) { + if (!in_array($airtime_version, ['2.5.1', '2.5.2'])) { $this->getResponse() ->setHttpResponseCode(400) ->appendBody("Upgrade to Airtime 2.5.3 FAILED. You must be using Airtime 2.5.1 or 2.5.2 to upgrade."); From d9adba117af4989770314334b8c1304f4e0ff375 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 25 Apr 2014 01:08:08 -0400 Subject: [PATCH 114/310] One more time... --- airtime_mvc/application/controllers/UpgradeController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index b293aab595..9c4dd59d34 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -123,7 +123,7 @@ private function verifyAirtimeVersion() ->findOne(); $airtime_version = $pref->getValStr(); - if (!in_array($airtime_version, ['2.5.1', '2.5.2'])) { + if (!in_array($airtime_version, array('2.5.1', '2.5.2'))) { $this->getResponse() ->setHttpResponseCode(400) ->appendBody("Upgrade to Airtime 2.5.3 FAILED. You must be using Airtime 2.5.1 or 2.5.2 to upgrade."); From 6890dcc3bc5eb044a625855fdba532c640e9c341 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 25 Apr 2014 11:05:33 -0400 Subject: [PATCH 115/310] CC-5802: Upgrade application.ini file Used a transaction for upgrades. If upgrading the application.ini file fails, the database upgrades will get rolled back. --- .../controllers/UpgradeController.php | 143 +++++++++--------- 1 file changed, 75 insertions(+), 68 deletions(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index ae7ad3e7e0..60a48fd8c5 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -16,81 +16,88 @@ public function indexAction() if (!$this->verifyAirtimeVersion()) { return; } - - //Disable Airtime UI - //create a temporary maintenance notification file - //when this file is on the server, zend framework redirects all - //requests to the maintenance page and sets a 503 response code - $maintenanceFile = '/tmp/maintenance.txt'; - $file = fopen($maintenanceFile, 'w'); - fclose($file); - - //Begin upgrade - $filename = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf"; - $values = parse_ini_file($filename, true); - - $username = $values['database']['dbuser']; - $password = $values['database']['dbpass']; - $host = $values['database']['host']; - $database = $values['database']['dbname']; - $dir = __DIR__; - - passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_$airtime_upgrade_version/upgrade.sql $database 2>&1 | grep -v \"will create implicit index\""); - - $musicDir = CcMusicDirsQuery::create() - ->filterByType('stor') - ->filterByExists(true) - ->findOne(); - $storPath = $musicDir->getDirectory(); - - $freeSpace = disk_free_space($storPath); - $totalSpace = disk_total_space($storPath); - - Application_Model_Preference::setDiskUsage($totalSpace - $freeSpace); - - $iniFile = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."application.ini" : "/usr/share/airtime/application/configs/application.ini"; - - //update application.ini - $newLines = "resources.frontController.moduleDirectory = APPLICATION_PATH '/modules'\n". - "resources.frontController.plugins.putHandler = 'Zend_Controller_Plugin_PutHandler'\n". - ";load everything in the modules directory including models\n". - "resources.modules[] = ''\n"; - $currentIniFile = file_get_contents($iniFile); + $con = Propel::getConnection(); + $con->beginTransaction(); + try { + //Disable Airtime UI + //create a temporary maintenance notification file + //when this file is on the server, zend framework redirects all + //requests to the maintenance page and sets a 503 response code + $maintenanceFile = '/tmp/maintenance.txt'; + $file = fopen($maintenanceFile, 'w'); + fclose($file); + + //Begin upgrade + $filename = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf"; + $values = parse_ini_file($filename, true); + + $username = $values['database']['dbuser']; + $password = $values['database']['dbpass']; + $host = $values['database']['host']; + $database = $values['database']['dbname']; + $dir = __DIR__; + + passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_$airtime_upgrade_version/upgrade.sql $database 2>&1 | grep -v \"will create implicit index\""); + + $musicDir = CcMusicDirsQuery::create() + ->filterByType('stor') + ->filterByExists(true) + ->findOne(); + $storPath = $musicDir->getDirectory(); + + $freeSpace = disk_free_space($storPath); + $totalSpace = disk_total_space($storPath); + + Application_Model_Preference::setDiskUsage($totalSpace - $freeSpace); + + $iniFile = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."application.ini" : "/usr/share/airtime/application/configs/application.ini"; + + //update application.ini + $newLines = "resources.frontController.moduleDirectory = APPLICATION_PATH '/modules'\n". + "resources.frontController.plugins.putHandler = 'Zend_Controller_Plugin_PutHandler'\n". + ";load everything in the modules directory including models\n". + "resources.modules[] = ''\n"; + + $currentIniFile = file_get_contents($iniFile); + + /* We want to add the new lines immediately after the first line, '[production]' + * We read the first line into $beginning, and the rest of the file into $end. + * Then overwrite the current application.ini file with $beginning, $newLines, and $end + */ + $lines = explode("\n", $currentIniFile); + $beginning = implode("\n", array_slice($lines, 0,1)); + + //check that first line is '[production]' + if ($beginning != '[production]') { + throw new Exception('Upgrade to Airtime 2.5.3 FAILED. Could not upgrade application.ini - Invalid format'); + } + $end = implode("\n", array_slice($lines, 1)); + + if (!is_writeable($iniFile)) { + throw new Exception('Upgrade to Airtime 2.5.3 FAILED. Could not upgrade application.ini - Permission denied.'); + } + $file = new SplFileObject($iniFile, "w"); + $file->fwrite($beginning."\n".$newLines.$end); + + //delete maintenance.txt to give users access back to Airtime + unlink($maintenanceFile); + + //TODO: clear out the cache - /* We want to add the new lines immediately after the first line, '[production]' - * We read the first line into $beginning, and the rest of the file into $end. - * Then overwrite the current application.ini file with $beginning, $newLines, and $end - */ - $lines = explode("\n", $currentIniFile); - $beginning = implode("\n", array_slice($lines, 0,1)); + $con->commit(); - //check that first line is '[production]' - if ($beginning != '[production]') { $this->getResponse() - ->setHttpResponseCode(400) - ->appendBody('Upgrade to Airtime 2.5.3 FAILED. Could not upgrade application.ini'); - return; - } - $end = implode("\n", array_slice($lines, 1)); - - if (!is_writeable($iniFile)) { + ->setHttpResponseCode(200) + ->appendBody("Upgrade to Airtime 2.5.3 OK"); + + } catch(Exception $e) { + $con->rollback(); + unlink($maintenanceFile); $this->getResponse() ->setHttpResponseCode(400) - ->appendBody('Upgrade to Airtime 2.5.3 FAILED. Could not upgrade application.ini'); - return; + ->appendBody($e->getMessage()); } - $file = new SplFileObject($iniFile, "w"); - $file->fwrite($beginning."\n".$newLines.$end); - - //delete maintenance.txt to give users access back to Airtime - unlink($maintenanceFile); - - //TODO: clear out the cache - - $this->getResponse() - ->setHttpResponseCode(200) - ->appendBody("Upgrade to Airtime 2.5.3 OK"); } private function verifyAuth() From a43f4878170bc55ac00275a468632ca6734d9cb3 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 25 Apr 2014 12:19:18 -0400 Subject: [PATCH 116/310] Fixed airtime-upgrade.php... --- install_minimal/include/airtime-upgrade.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/install_minimal/include/airtime-upgrade.php b/install_minimal/include/airtime-upgrade.php index 5e8754ec5c..0174d14f09 100644 --- a/install_minimal/include/airtime-upgrade.php +++ b/install_minimal/include/airtime-upgrade.php @@ -65,8 +65,10 @@ function pause() exit(1); } -// Stop media-monitor -service media-monitor stop-with-monit +// Stop media-monitor and disable it -- Airtime 2.5.3+ +@exec("service media-monitor stop-with-monit"); +@exec("rm /etc/init.d/airtime-media-monitor"); + //convert strings like 1.9.0-devel to 1.9.0 $version = substr($version, 0, 5); From f432ea9f7551037ed1251b69fdbe4ceb0d22e2a5 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 25 Apr 2014 14:16:18 -0400 Subject: [PATCH 117/310] CC-5802: Upgrade application.ini file Execute raw sql upgrade file at the end in case errors occured during the upgrade before it gets executed --- .../controllers/UpgradeController.php | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index b5b8f1756d..78a4126e8f 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -27,19 +27,10 @@ public function indexAction() $maintenanceFile = '/tmp/maintenance.txt'; $file = fopen($maintenanceFile, 'w'); fclose($file); - + //Begin upgrade - $filename = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf"; - $values = parse_ini_file($filename, true); - - $username = $values['database']['dbuser']; - $password = $values['database']['dbpass']; - $host = $values['database']['host']; - $database = $values['database']['dbname']; - $dir = __DIR__; - - passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_$airtime_upgrade_version/upgrade.sql $database 2>&1 | grep -v \"will create implicit index\""); + //Update disk_usage value in cc_pref $musicDir = CcMusicDirsQuery::create() ->filterByType('stor') ->filterByExists(true) @@ -50,14 +41,14 @@ public function indexAction() $totalSpace = disk_total_space($storPath); Application_Model_Preference::setDiskUsage($totalSpace - $freeSpace); - + $iniFile = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."application.ini" : "/usr/share/airtime/application/configs/application.ini"; //update application.ini - $newLines = "resources.frontController.moduleDirectory = APPLICATION_PATH '/modules'\n". - "resources.frontController.plugins.putHandler = 'Zend_Controller_Plugin_PutHandler'\n". + $newLines = "resources.frontController.moduleDirectory = APPLICATION_PATH \"/modules\"\n". + "resources.frontController.plugins.putHandler = \"Zend_Controller_Plugin_PutHandler\"\n". ";load everything in the modules directory including models\n". - "resources.modules[] = ''\n"; + "resources.modules[] = \"\"\n"; $currentIniFile = file_get_contents($iniFile); @@ -79,7 +70,8 @@ public function indexAction() } $file = new SplFileObject($iniFile, "w"); $file->fwrite($beginning."\n".$newLines.$end); - + + //delete maintenance.txt to give users access back to Airtime unlink($maintenanceFile); @@ -87,6 +79,19 @@ public function indexAction() $con->commit(); + $airtimeConf = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf"; + $values = parse_ini_file($airtimeConf, true); + + //update system_version in cc_pref and change some columns in cc_files + $username = $values['database']['dbuser']; + $password = $values['database']['dbpass']; + $host = $values['database']['host']; + $database = $values['database']['dbname']; + $dir = __DIR__; + + passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_$airtime_upgrade_version/upgrade.sql $database 2>&1 | grep -v \"will create implicit index\""); + + $this->getResponse() ->setHttpResponseCode(200) ->appendBody("Upgrade to Airtime 2.5.3 OK"); From 61df7c1a4486a452656c8cc4f4ec54a63b9045fc Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 25 Apr 2014 14:20:04 -0400 Subject: [PATCH 118/310] Moved some comments around --- airtime_mvc/application/controllers/UpgradeController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index 78a4126e8f..b7d89170e7 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -42,9 +42,9 @@ public function indexAction() Application_Model_Preference::setDiskUsage($totalSpace - $freeSpace); + //update application.ini $iniFile = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."application.ini" : "/usr/share/airtime/application/configs/application.ini"; - //update application.ini $newLines = "resources.frontController.moduleDirectory = APPLICATION_PATH \"/modules\"\n". "resources.frontController.plugins.putHandler = \"Zend_Controller_Plugin_PutHandler\"\n". ";load everything in the modules directory including models\n". @@ -79,10 +79,10 @@ public function indexAction() $con->commit(); + //update system_version in cc_pref and change some columns in cc_files $airtimeConf = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf"; $values = parse_ini_file($airtimeConf, true); - //update system_version in cc_pref and change some columns in cc_files $username = $values['database']['dbuser']; $password = $values['database']['dbpass']; $host = $values['database']['host']; From 66000a2847fd8a1051aedc8d4677adfff9d7c8d2 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 25 Apr 2014 14:53:58 -0400 Subject: [PATCH 119/310] CC-5802: Upgrade application.ini file Changed where we insert new application.ini file lines --- .../controllers/UpgradeController.php | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index b7d89170e7..f5a7d45493 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -52,18 +52,20 @@ public function indexAction() $currentIniFile = file_get_contents($iniFile); - /* We want to add the new lines immediately after the first line, '[production]' - * We read the first line into $beginning, and the rest of the file into $end. - * Then overwrite the current application.ini file with $beginning, $newLines, and $end + /* We want to add the new lines after a specific line. So we must find read the file + * into an array, find the key to which our desired line belongs, and use the key + * to split the file in two halves, $beginning and $end. + * The $newLines will go inbetween $beginning and $end */ $lines = explode("\n", $currentIniFile); - $beginning = implode("\n", array_slice($lines, 0,1)); - - //check that first line is '[production]' - if ($beginning != '[production]') { - throw new Exception('Upgrade to Airtime 2.5.3 FAILED. Could not upgrade application.ini - Invalid format'); + + $key = array_search("resources.layout.layoutPath = APPLICATION_PATH \"/layouts/scripts/\"", $lines); + if (!$key) { + throw new Exception('Upgrade to Airtime 2.5.3 FAILED. Could not upgrade application.ini'); } - $end = implode("\n", array_slice($lines, 1)); + + $beginning = implode("\n", array_slice($lines, 0, $key)); + $end = implode("\n", array_slice($lines, $key)); if (!is_writeable($iniFile)) { throw new Exception('Upgrade to Airtime 2.5.3 FAILED. Could not upgrade application.ini - Permission denied.'); From 8d9b9c1fb75a2b9622779b032c66b2db6c343597 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 25 Apr 2014 15:00:13 -0400 Subject: [PATCH 120/310] Moved deleting the maintenace temporary file flag to very end of upgrade task --- airtime_mvc/application/controllers/UpgradeController.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index f5a7d45493..3e383cb0a9 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -73,10 +73,6 @@ public function indexAction() $file = new SplFileObject($iniFile, "w"); $file->fwrite($beginning."\n".$newLines.$end); - - //delete maintenance.txt to give users access back to Airtime - unlink($maintenanceFile); - //TODO: clear out the cache $con->commit(); @@ -93,6 +89,8 @@ public function indexAction() passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_$airtime_upgrade_version/upgrade.sql $database 2>&1 | grep -v \"will create implicit index\""); + //delete maintenance.txt to give users access back to Airtime + unlink($maintenanceFile); $this->getResponse() ->setHttpResponseCode(200) From 42806b1cbfe501c77d9fc3ccf665cb3e5ee2715e Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 28 Apr 2014 09:43:21 -0400 Subject: [PATCH 121/310] CC-5802: Upgrade application.ini file --- airtime_mvc/application/controllers/UpgradeController.php | 2 +- airtime_mvc/application/controllers/plugins/Maintenance.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index 3e383cb0a9..ecab019100 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -24,7 +24,7 @@ public function indexAction() //create a temporary maintenance notification file //when this file is on the server, zend framework redirects all //requests to the maintenance page and sets a 503 response code - $maintenanceFile = '/tmp/maintenance.txt'; + $maintenanceFile = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."maintenance.txt" : "/tmp/maintenance.txt"; $file = fopen($maintenanceFile, 'w'); fclose($file); diff --git a/airtime_mvc/application/controllers/plugins/Maintenance.php b/airtime_mvc/application/controllers/plugins/Maintenance.php index 46937f5821..f6baf62017 100644 --- a/airtime_mvc/application/controllers/plugins/Maintenance.php +++ b/airtime_mvc/application/controllers/plugins/Maintenance.php @@ -2,10 +2,10 @@ class Zend_Controller_Plugin_Maintenance extends Zend_Controller_Plugin_Abstract { - protected $maintenanceFile = '/tmp/maintenance.txt'; - public function preDispatch(Zend_Controller_Request_Abstract $request) { - if (file_exists($this->maintenanceFile)) { + $maintenanceFile = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."maintenance.txt" : "/tmp/maintenance.txt"; + + if (file_exists($maintenanceFile)) { $request->setModuleName('default') ->setControllerName('index') ->setActionName('maintenance') From d081ff10b2995fb8a8b1b92ae43c7e76b1a0fa9f Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 28 Apr 2014 10:25:36 -0400 Subject: [PATCH 122/310] CC-5807: Disk Space will be updated when file is not actually deleted --- airtime_mvc/application/models/StoredFile.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 87cbe07047..8e249e1507 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -372,9 +372,6 @@ public function delete() { $filepath = $this->getFilePath(); - //Update the user's disk usage - Application_Model_Preference::updateDiskUsage(-1 * abs(filesize($filepath))); - // Check if the file is scheduled to be played in the future if (Application_Model_Schedule::IsFileScheduledInTheFuture($this->getId())) { throw new DeleteScheduledFileException(); @@ -394,6 +391,9 @@ public function delete() if (file_exists($filepath) && $type == "stor") { try { + //Update the user's disk usage + Application_Model_Preference::updateDiskUsage(-1 * abs(filesize($filepath))); + unlink($filepath); } catch (Exception $e) { Logging::error($e->getMessage()); From 375ec5477863cf887b5abbac887c02443eb88459 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 28 Apr 2014 11:54:59 -0400 Subject: [PATCH 123/310] CC-5820: Airtime Analyzer: Length and MIME parsing skipped if file has no audio metadata tags. --- .../airtime_analyzer/airtime_analyzer/metadata_analyzer.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index 2d0e09fc2b..d1e82c7a86 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -29,8 +29,10 @@ def analyze(filename, metadata): #Bail if the file couldn't be parsed. The title should stay as the filename #inside Airtime. - if not audio_file: + if audio_file == None: # Don't use "if not" here. It is wrong due to mutagen's design. return metadata + # Note that audio_file can equal {} if the file is valid but there's no metadata tags. + # We can still try to grab the info variables below. #Grab other file information that isn't encoded in a tag, but instead usually #in the file header. Mutagen breaks that out into a separate "info" object: From fae5b15a9f8f00245a0dc7377db5d3e8371051f8 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 28 Apr 2014 14:44:52 -0400 Subject: [PATCH 124/310] CC-5821: Airtime Analyzer: Ftp-uploaded folder doesn't get removed from organize $_FILES does not store the original file path so we were losing the folder name. Fixed by explicitly passing the full filepath in via the ftp-upload-hook.sh script --- .../rest/controllers/MediaController.php | 21 +++++++++++++------ .../airtime_analyzer/tools/ftp-upload-hook.sh | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index ecd538a126..eec9e1b10c 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -136,7 +136,19 @@ public function postAction() $file->save(); return; } else { - + /* If full_path is set, the post request came from ftp. + * Users are allowed to upload folders via ftp. If this is the case + * we need to include the folder name with the file name, otherwise + * files won't get removed from the organize folder. + */ + if (isset($whiteList["full_path"])) { + $fullPath = $whiteList["full_path"]; + $basePath = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/organize/" : "/srv/airtime/stor/organize/"; + $relativePath = substr($fullPath, strlen($basePath)); + } else { + $relativePath = $_FILES["file"]["name"]; + } + $file->fromArray($whiteList); $file->setDbOwnerId($this->getOwnerId()); $now = new DateTime("now", new DateTimeZone("UTC")); @@ -146,8 +158,8 @@ public function postAction() $file->save(); $callbackUrl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getRequestUri() . "/" . $file->getPrimaryKey(); - - $this->processUploadedFile($callbackUrl, $_FILES["file"]["name"], $this->getOwnerId()); + + $this->processUploadedFile($callbackUrl, $relativePath, $this->getOwnerId()); $this->getResponse() ->setHttpResponseCode(201) @@ -365,9 +377,6 @@ private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) Logging::error($e->getMessage()); return; } - - Logging::info($newTempFilePath); - //Logging::info("Old temp file path: " . $tempFilePath); //Dispatch a message to airtime_analyzer through RabbitMQ, //notifying it that there's a new upload to process! diff --git a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh index e456d8be95..f5be38183b 100755 --- a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh +++ b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh @@ -28,7 +28,7 @@ post_file() { api_key=$(awk -F "= " '/api_key/ {print $2}' $instance_conf_path) - until curl --max-time 30 $url -u $api_key":" -X POST -F "file=@${file_path}" -F "name=${filename}" + until curl --max-time 30 $url -u $api_key":" -X POST -F "file=@${file_path}" -F "full_path=${file_path}" do retry_count=$[$retry_count+1] if [ $retry_count -ge $max_retry ]; then From c586e3e2b8e1d41be6dd302a3f0638b2db178c68 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 28 Apr 2014 15:52:08 -0400 Subject: [PATCH 125/310] CC-5821: Airtime Analyzer: Ftp-uploaded folder doesn't get removed from organize Was using wrong position when using substr() --- .../application/modules/rest/controllers/MediaController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index eec9e1b10c..d6881e831f 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -144,7 +144,8 @@ public function postAction() if (isset($whiteList["full_path"])) { $fullPath = $whiteList["full_path"]; $basePath = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/organize/" : "/srv/airtime/stor/organize/"; - $relativePath = substr($fullPath, strlen($basePath)); + $relativePath = substr($fullPath, strlen($basePath)-1); + } else { $relativePath = $_FILES["file"]["name"]; } From f428a2d9609a37676b7f56133d55d0ecc7d5328f Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 28 Apr 2014 16:20:26 -0400 Subject: [PATCH 126/310] CC-5821: Airtime Analyzer: Ftp-uploaded folder doesn't get removed from organize Delete the empty folder after files have been copied into imported --- .../rest/controllers/MediaController.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index d6881e831f..8838d4e4f8 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -144,11 +144,24 @@ public function postAction() if (isset($whiteList["full_path"])) { $fullPath = $whiteList["full_path"]; $basePath = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/organize/" : "/srv/airtime/stor/organize/"; + //$relativePath is the folder name(if one) + track name, that was uploaded via ftp $relativePath = substr($fullPath, strlen($basePath)-1); + //after the file is moved from organize store it's parent folder so we can delete it after + if (dirname($relativePath) != '/') { + $pathToDelete = Application_Common_OsPath::join( + $basePath, + dirname($relativePath) + ); + } else { + //if the uploaded file was not in a folder, DO NOT delete + $pathToDelete = False; + } } else { $relativePath = $_FILES["file"]["name"]; + $pathToDelete = False; } + $file->fromArray($whiteList); $file->setDbOwnerId($this->getOwnerId()); @@ -161,6 +174,11 @@ public function postAction() $callbackUrl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getRequestUri() . "/" . $file->getPrimaryKey(); $this->processUploadedFile($callbackUrl, $relativePath, $this->getOwnerId()); + + if (!$pathToDelete) { + //delete the empty folder that was uploaded via ftp (if one) + rmdir($pathToDelete); + } $this->getResponse() ->setHttpResponseCode(201) From 79687499aa3b2812929a5d338ab6fdfe31f4de63 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 28 Apr 2014 16:24:59 -0400 Subject: [PATCH 127/310] Logging statement. To remove later. --- .../application/modules/rest/controllers/MediaController.php | 1 + 1 file changed, 1 insertion(+) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 8838d4e4f8..7c38558241 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -176,6 +176,7 @@ public function postAction() $this->processUploadedFile($callbackUrl, $relativePath, $this->getOwnerId()); if (!$pathToDelete) { + Logging::info($pathToDelete); //delete the empty folder that was uploaded via ftp (if one) rmdir($pathToDelete); } From 6f1dd7987f1b6df012b9faa3b6bb25cd747dd844 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 29 Apr 2014 10:05:17 -0400 Subject: [PATCH 128/310] CC-5821: Airtime Analyzer: Ftp-uploaded folder doesn't get removed from organize --- .../modules/rest/controllers/MediaController.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 7c38558241..2c7a667cae 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -147,7 +147,7 @@ public function postAction() //$relativePath is the folder name(if one) + track name, that was uploaded via ftp $relativePath = substr($fullPath, strlen($basePath)-1); - //after the file is moved from organize store it's parent folder so we can delete it after + //after the file is moved from organize, store it's parent folder so we can delete it after if (dirname($relativePath) != '/') { $pathToDelete = Application_Common_OsPath::join( $basePath, @@ -155,11 +155,11 @@ public function postAction() ); } else { //if the uploaded file was not in a folder, DO NOT delete - $pathToDelete = False; + $pathToDelete = false; } } else { $relativePath = $_FILES["file"]["name"]; - $pathToDelete = False; + $pathToDelete = false; } @@ -175,7 +175,7 @@ public function postAction() $this->processUploadedFile($callbackUrl, $relativePath, $this->getOwnerId()); - if (!$pathToDelete) { + if ($pathToDelete) { Logging::info($pathToDelete); //delete the empty folder that was uploaded via ftp (if one) rmdir($pathToDelete); From 94375ee441be4acae99ee5aa038f1a004aebc0e4 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 29 Apr 2014 10:35:39 -0400 Subject: [PATCH 129/310] CC-5821: Airtime Analyzer: Ftp-uploaded folder doesn't get removed from organize Cleaner way of removing empty sub folders after ftp uploads --- .../rest/controllers/MediaController.php | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 2c7a667cae..e74f491c4c 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -146,20 +146,8 @@ public function postAction() $basePath = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/organize/" : "/srv/airtime/stor/organize/"; //$relativePath is the folder name(if one) + track name, that was uploaded via ftp $relativePath = substr($fullPath, strlen($basePath)-1); - - //after the file is moved from organize, store it's parent folder so we can delete it after - if (dirname($relativePath) != '/') { - $pathToDelete = Application_Common_OsPath::join( - $basePath, - dirname($relativePath) - ); - } else { - //if the uploaded file was not in a folder, DO NOT delete - $pathToDelete = false; - } } else { $relativePath = $_FILES["file"]["name"]; - $pathToDelete = false; } @@ -175,12 +163,6 @@ public function postAction() $this->processUploadedFile($callbackUrl, $relativePath, $this->getOwnerId()); - if ($pathToDelete) { - Logging::info($pathToDelete); - //delete the empty folder that was uploaded via ftp (if one) - rmdir($pathToDelete); - } - $this->getResponse() ->setHttpResponseCode(201) ->appendBody(json_encode($this->sanitizeResponse($file))); @@ -233,6 +215,10 @@ public function putAction() $now = new DateTime("now", new DateTimeZone("UTC")); $file->setDbMtime($now); $file->save(); + + $this->removeEmptySubFolders( + isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/organize/" : "/srv/airtime/stor/organize/"); + $this->getResponse() ->setHttpResponseCode(200) ->appendBody(json_encode($this->sanitizeResponse($file))); @@ -459,5 +445,10 @@ public function sanitizeResponse($file) return $response; } + private function removeEmptySubFolders($path) + { + exec("find $path -empty -type d -delete"); + } + } From 04da9b3d61100d62b052d1bea8bed43593a31166 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 29 Apr 2014 11:09:31 -0400 Subject: [PATCH 130/310] CC-5821: Airtime Analyzer: Ftp-uploaded folder doesn't get removed from organize Imported file path had album name twice - fixed --- .../application/modules/rest/controllers/MediaController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index e74f491c4c..ba116af0f6 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -387,7 +387,7 @@ private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) //Dispatch a message to airtime_analyzer through RabbitMQ, //notifying it that there's a new upload to process! Application_Model_RabbitMq::SendMessageToAnalyzer($newTempFilePath, - $importedStorageDirectory, $originalFilename, + $importedStorageDirectory, basename($originalFilename), $callbackUrl, $apiKey); } From a5eb5e9901c46a112d23f8d6d2f26737ba20cc3a Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 29 Apr 2014 16:06:25 -0400 Subject: [PATCH 131/310] CC-5806: Airtime Analyzer: Please implement "remove all files" --- .../application/modules/rest/Bootstrap.php | 12 ++++++- .../rest/controllers/MediaController.php | 36 +++++++++++++++++++ .../rest/views/scripts/media/clear.phtml | 0 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 airtime_mvc/application/modules/rest/views/scripts/media/clear.phtml diff --git a/airtime_mvc/application/modules/rest/Bootstrap.php b/airtime_mvc/application/modules/rest/Bootstrap.php index e7017ba167..31691ca96d 100644 --- a/airtime_mvc/application/modules/rest/Bootstrap.php +++ b/airtime_mvc/application/modules/rest/Bootstrap.php @@ -23,5 +23,15 @@ protected function _initRouter() ) ); $router->addRoute('download', $downloadRoute); + + $clearLibraryRoute = new Zend_Controller_Router_Route( + 'rest/media/clear', + array( + 'controller' => 'media', + 'action' => 'clear', + 'module' => 'rest' + ) + ); + $router->addRoute('clear', $clearLibraryRoute); } -} \ No newline at end of file +} diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index ba116af0f6..65f30b7e9c 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -80,6 +80,42 @@ public function downloadAction() $this->fileNotFoundResponse(); } } + + public function clearAction() + { + //TODO:: make this not accessible via public api?? + if (!$this->verifyAuth(true, true)) + { + return; + } + + //set file_exists flag to false for every file + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME); + $selectCriteria = new Criteria(); + $selectCriteria->add(CcFilesPeer::FILE_EXISTS, true); + $updateCriteria = new Criteria(); + $updateCriteria->add(CcFilesPeer::FILE_EXISTS, false); + BasePeer::doUpdate($selectCriteria, $updateCriteria, $con); + + $path = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/imported/*" : "/srv/airtime/stor/imported/*"; + exec("rm -rf $path"); + + //update disk_usage value in cc_pref + $musicDir = CcMusicDirsQuery::create() + ->filterByType('stor') + ->filterByExists(true) + ->findOne(); + $storPath = $musicDir->getDirectory(); + + $freeSpace = disk_free_space($storPath); + $totalSpace = disk_total_space($storPath); + + Application_Model_Preference::setDiskUsage($totalSpace - $freeSpace); + + $this->getResponse() + ->setHttpResponseCode(200) + ->appendBody("Library has been cleared"); + } public function getAction() { diff --git a/airtime_mvc/application/modules/rest/views/scripts/media/clear.phtml b/airtime_mvc/application/modules/rest/views/scripts/media/clear.phtml new file mode 100644 index 0000000000..e69de29bb2 From c2f6032c8b8bcbe5e7abc1d3df07c96040e85f63 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 30 Apr 2014 17:56:02 -0400 Subject: [PATCH 132/310] Fixed the upstart config --- .../install/upstart/airtime_analyzer.conf | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf b/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf index 6fccc21c90..696c8b9a92 100644 --- a/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf +++ b/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf @@ -6,8 +6,17 @@ stop on runlevel [!2345] respawn +setuid www-data +setgid www-data + +expect fork + env LANG='en_US.UTF-8' env LC_ALL='en_US.UTF-8' -exec su www-data -c "airtime_analyzer" +script + airtime_analyzer +end script + + From 26a39ed2db41f15156d4b9ddd19b793490ffa594 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 30 Apr 2014 18:32:17 -0400 Subject: [PATCH 133/310] CC-5823: Airtime Analyzer: Wav file uploading fails with zero length and empty mime * Fixed --- .../airtime_analyzer/metadata_analyzer.py | 54 +++++++++---------- python_apps/airtime_analyzer/setup.py | 1 + 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index d1e82c7a86..e6507ef791 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -1,6 +1,8 @@ import time import datetime import mutagen +import magic +import wave import logging from analyzer import Analyzer @@ -24,6 +26,11 @@ def analyze(filename, metadata): #Other fields we'll want to set for Airtime: metadata["hidden"] = False + # Mutagen doesn't handle WAVE files so we use a different package + mime_check = magic.from_file(filename, mime=True) + if mime_check == 'audio/x-wav': + return MetadataAnalyzer._analyze_wave(filename, metadata) + #Extract metadata from an audio file using mutagen audio_file = mutagen.File(filename, easy=True) @@ -122,33 +129,20 @@ def analyze(filename, metadata): return metadata - - -''' -For reference, the Airtime metadata fields are: - title - artist ("Creator" in Airtime) - album - bit rate - BPM - composer - conductor - copyright - cue in - cue out - encoded by - genre - ISRC - label - language - last modified - length - mime - mood - owner - replay gain - sample rate - track number - website - year -''' + @staticmethod + def _analyze_wave(filename, metadata): + try: + reader = wave.open(filename, 'rb') + metadata["mime"] = magic.from_file(filename, mime=True) + metadata["channels"] = reader.getnchannels() + metadata["sample_rate"] = reader.getframerate() + length_seconds = float(reader.getnframes()) / float(metadata["channels"] * metadata["sample_rate"]) + #Converting the length in seconds (float) to a formatted time string + track_length = datetime.timedelta(seconds=length_seconds) + metadata["length"] = str(track_length) #time.strftime("%H:%M:%S.%f", track_length) + metadata["length_seconds"] = length_seconds + metadata["cueout"] = metadata["length"] + except wave.Error: + logging.error("Invalid WAVE file.") + raise + return metadata diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index a0dba0cfc9..7b732af7cb 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -23,6 +23,7 @@ install_requires=[ 'mutagen', 'pika', + 'magic', 'nose', 'coverage', 'mock', From abcdf5ea6a9485bed28f81c7c275be82321d969f Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 30 Apr 2014 18:42:13 -0400 Subject: [PATCH 134/310] CC-5824: Airtime Analyzer: Flac file was uploaded but AA says it's failed * Fixed --- .../airtime_analyzer/metadata_analyzer.py | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index e6507ef791..eccfaa40d7 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -28,6 +28,7 @@ def analyze(filename, metadata): # Mutagen doesn't handle WAVE files so we use a different package mime_check = magic.from_file(filename, mime=True) + metadata["mime"] = mime_check if mime_check == 'audio/x-wav': return MetadataAnalyzer._analyze_wave(filename, metadata) @@ -44,17 +45,21 @@ def analyze(filename, metadata): #Grab other file information that isn't encoded in a tag, but instead usually #in the file header. Mutagen breaks that out into a separate "info" object: info = audio_file.info - metadata["sample_rate"] = info.sample_rate - metadata["length_seconds"] = info.length - #Converting the length in seconds (float) to a formatted time string - track_length = datetime.timedelta(seconds=info.length) - metadata["length"] = str(track_length) #time.strftime("%H:%M:%S.%f", track_length) - metadata["bit_rate"] = info.bitrate - - # Other fields for Airtime - metadata["cueout"] = metadata["length"] + if hasattr(info, "sample_rate"): # Mutagen is annoying and inconsistent + metadata["sample_rate"] = info.sample_rate + if hasattr(info, "length"): + metadata["length_seconds"] = info.length + #Converting the length in seconds (float) to a formatted time string + track_length = datetime.timedelta(seconds=info.length) + metadata["length"] = str(track_length) #time.strftime("%H:%M:%S.%f", track_length) + # Other fields for Airtime + metadata["cueout"] = metadata["length"] - #Use the mutagen to get the MIME type. + if hasattr(info, "bit_rate"): + metadata["bit_rate"] = info.bitrate + + # Use the mutagen to get the MIME type, if it has one. This is more reliable and + # consistent for certain types of MP3s or MPEG files than the MIMEs returned by magic. if audio_file.mime: metadata["mime"] = audio_file.mime[0] From c11e39f933e9ac664e7577f6406d9186547f655f Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 30 Apr 2014 18:46:37 -0400 Subject: [PATCH 135/310] Fixed python-magic dependency --- python_apps/airtime_analyzer/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index 7b732af7cb..c47b051678 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -23,7 +23,7 @@ install_requires=[ 'mutagen', 'pika', - 'magic', + 'python-magic', 'nose', 'coverage', 'mock', From 721e4e1a4a1f170710474f229cd4e06557eba21a Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 1 May 2014 10:58:51 -0400 Subject: [PATCH 136/310] CC-5806: Airtime Analyzer: Please implement "remove all files" --- .../application/modules/rest/controllers/MediaController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 65f30b7e9c..34bd5ac55f 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -83,7 +83,6 @@ public function downloadAction() public function clearAction() { - //TODO:: make this not accessible via public api?? if (!$this->verifyAuth(true, true)) { return; @@ -97,6 +96,7 @@ public function clearAction() $updateCriteria->add(CcFilesPeer::FILE_EXISTS, false); BasePeer::doUpdate($selectCriteria, $updateCriteria, $con); + //delete all files and directories under .../imported $path = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/imported/*" : "/srv/airtime/stor/imported/*"; exec("rm -rf $path"); From 2d6748457c006e4de364a5b98540decbe49ddbdd Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 2 May 2014 15:50:37 -0400 Subject: [PATCH 137/310] Remove database credentials from application.ini --- airtime_mvc/application/configs/application.ini | 13 +++++++------ airtime_mvc/application/models/Auth.php | 13 +++++++++++-- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/airtime_mvc/application/configs/application.ini b/airtime_mvc/application/configs/application.ini index 71bcd5c46e..a9302c71df 100644 --- a/airtime_mvc/application/configs/application.ini +++ b/airtime_mvc/application/configs/application.ini @@ -12,12 +12,13 @@ resources.frontController.plugins.putHandler = "Zend_Controller_Plugin_PutHandle resources.modules[] = "" resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" resources.view[] = -resources.db.adapter = "Pdo_Pgsql" -resources.db.params.charset = "utf8" -resources.db.params.host = "localhost" -resources.db.params.username = "airtime" -resources.db.params.password = "airtime" -resources.db.params.dbname = "airtime" +; These are no longer needed. They are specified in /etc/airtime/airtime.conf: +;resources.db.adapter = "Pdo_Pgsql" +;resources.db.params.charset = "utf8" +;resources.db.params.host = "localhost" +;resources.db.params.username = "airtime" +;resources.db.params.password = "airtime" +;resources.db.params.dbname = "airtime" [staging : production] diff --git a/airtime_mvc/application/models/Auth.php b/airtime_mvc/application/models/Auth.php index 104ee80506..ee539c7c1c 100644 --- a/airtime_mvc/application/models/Auth.php +++ b/airtime_mvc/application/models/Auth.php @@ -74,8 +74,17 @@ public function checkToken($user_id, $token, $action) */ public static function getAuthAdapter() { - $dbAdapter = Zend_Db_Table::getDefaultAdapter(); - $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter); + $CC_CONFIG = Config::getConfig(); + + // Database config + $db = Zend_Db::factory('PDO_' . $CC_CONFIG['dsn']['phptype'], array( + 'host' => $CC_CONFIG['dsn']['hostspec'], + 'username' => $CC_CONFIG['dsn']['username'], + 'password' => $CC_CONFIG['dsn']['password'], + 'dbname' => $CC_CONFIG['dsn']['database'] + )); + Zend_Db_Table_Abstract::setDefaultAdapter($db); + $authAdapter = new Zend_Auth_Adapter_DbTable($db); $authAdapter->setTableName('cc_subjs') ->setIdentityColumn('login') From 5dab498041addb66edb491fbec666dc56f0a73bb Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 2 May 2014 17:16:03 -0400 Subject: [PATCH 138/310] Removed this silly airtime-update-db-settings script * No longer needed, was a horrible hack in the first place. --- install_minimal/include/AirtimeInstall.php | 5 -- install_minimal/include/airtime-copy-files.sh | 1 - .../include/airtime-remove-files.sh | 1 - utils/airtime-update-db-settings | 18 ---- utils/airtime-update-db-settings.py | 87 ------------------- 5 files changed, 112 deletions(-) delete mode 100755 utils/airtime-update-db-settings delete mode 100644 utils/airtime-update-db-settings.py diff --git a/install_minimal/include/AirtimeInstall.php b/install_minimal/include/AirtimeInstall.php index fd37edb22a..dd97f0717c 100644 --- a/install_minimal/include/AirtimeInstall.php +++ b/install_minimal/include/AirtimeInstall.php @@ -340,10 +340,6 @@ public static function CreateSymlinksToUtils() $dir = AirtimeInstall::CONF_DIR_BINARIES."/utils/airtime-import/airtime-import"; exec("ln -s $dir /usr/bin/airtime-import"); - echo "* Installing airtime-update-db-settings".PHP_EOL; - $dir = AirtimeInstall::CONF_DIR_BINARIES."/utils/airtime-update-db-settings"; - exec("ln -s $dir /usr/bin/airtime-update-db-settings"); - echo "* Installing airtime-check-system".PHP_EOL; $dir = AirtimeInstall::CONF_DIR_BINARIES."/utils/airtime-check-system"; exec("ln -s $dir /usr/bin/airtime-check-system"); @@ -360,7 +356,6 @@ public static function CreateSymlinksToUtils() public static function RemoveSymlinks() { exec("rm -f /usr/bin/airtime-import"); - exec("rm -f /usr/bin/airtime-update-db-settings"); exec("rm -f /usr/bin/airtime-check-system"); exec("rm -f /usr/bin/airtime-user"); exec("rm -f /usr/bin/airtime-log"); diff --git a/install_minimal/include/airtime-copy-files.sh b/install_minimal/include/airtime-copy-files.sh index 8f26b7d3f5..ac3bff3c99 100755 --- a/install_minimal/include/airtime-copy-files.sh +++ b/install_minimal/include/airtime-copy-files.sh @@ -80,7 +80,6 @@ cp -R $AIRTIMEROOT/python_apps/std_err_override /usr/lib/airtime echo "* Creating symbolic links in /usr/bin" #create symbolic links ln -sf /usr/lib/airtime/utils/airtime-import/airtime-import /usr/bin/airtime-import -ln -sf /usr/lib/airtime/utils/airtime-update-db-settings /usr/bin/airtime-update-db-settings ln -sf /usr/lib/airtime/utils/airtime-check-system /usr/bin/airtime-check-system ln -sf /usr/lib/airtime/utils/airtime-log /usr/bin/airtime-log ln -sf /usr/lib/airtime/utils/airtime-test-soundcard /usr/bin/airtime-test-soundcard diff --git a/install_minimal/include/airtime-remove-files.sh b/install_minimal/include/airtime-remove-files.sh index 2429c17f49..3cafa6cbb6 100755 --- a/install_minimal/include/airtime-remove-files.sh +++ b/install_minimal/include/airtime-remove-files.sh @@ -31,7 +31,6 @@ python $AIRTIMEROOT/python_apps/media-monitor/install/media-monitor-remove-files #remove symlinks rm -f /usr/bin/airtime-import -rm -f /usr/bin/airtime-update-db-settings rm -f /usr/bin/airtime-check-system rm -f /usr/bin/airtime-log rm -f /usr/bin/airtime-test-soundcard diff --git a/utils/airtime-update-db-settings b/utils/airtime-update-db-settings deleted file mode 100755 index 5ed0fcd897..0000000000 --- a/utils/airtime-update-db-settings +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Determine directories, files -#------------------------------------------------------------------------------- - -virtualenv_bin="/usr/lib/airtime/airtime_virtualenv/bin/" -. ${virtualenv_bin}activate - -# Absolute path to this script -SCRIPT=`readlink -f $0` -# Absolute directory this script is in -SCRIPTPATH=`dirname $SCRIPT` - -#------------------------------------------------------------------------------- -# Do import -#------------------------------------------------------------------------------- -invokePwd=$PWD -cd $SCRIPTPATH && python airtime-update-db-settings.py diff --git a/utils/airtime-update-db-settings.py b/utils/airtime-update-db-settings.py deleted file mode 100644 index d28322fb13..0000000000 --- a/utils/airtime-update-db-settings.py +++ /dev/null @@ -1,87 +0,0 @@ -""" -The purpose of this script is to consolidate into one location where -we need to update database host, dbname, username and password. - -This script reads from /etc/airtime/airtime.conf. -""" -import os -import sys -import ConfigParser -import xml.dom.minidom -from xml.dom.minidom import Node - -if os.geteuid() != 0: - print "Please run this as root." - sys.exit(1) - -airtime_conf = '/etc/airtime/airtime.conf' - -#Read the universal values -parser = ConfigParser.SafeConfigParser() -parser.read(airtime_conf) - -host = 'resources.db.params.host' -dbname = 'resources.db.params.dbname' -username = 'resources.db.params.username' -password = 'resources.db.params.password' - -airtime_dir = parser.get('general', 'airtime_dir') -if os.path.exists(airtime_dir): - print 'Airtime root folder found at %s' % airtime_dir -else: - print 'Could not find Airtime root folder specified by "airtime_dir" in %s' % airtime_conf - sys.exit(1) - -print ("Updating %s/application/configs/application.ini" % airtime_dir) -f = file('%s/application/configs/application.ini' % airtime_dir,'r') -file_lines = [] - -for line in f: - if line[0:len(host)] == host: - line= '%s = "%s"\n' % (host, parser.get('database', 'host')) - elif line[0:len(dbname)] == dbname: - line= '%s = "%s"\n' % (dbname, parser.get('database', 'dbname')) - elif line[0:len(username)] == username: - line= '%s = "%s"\n' % (username, parser.get('database', 'dbuser')) - elif line[0:len(password)] == password: - line= '%s = "%s"\n' % (password, parser.get('database', 'dbpass')) - file_lines.append(line) -f.close() - -f = file('%s/application/configs/application.ini' % airtime_dir, 'w') -f.writelines(file_lines) -f.close() - - -print ("Updating %s/build/build.properties" % airtime_dir) - -f = file('%s/build/build.properties' % airtime_dir, 'r') -file_lines = [] - -db_url = 'propel.database.url' - -for line in f: - if line[0:len(db_url)] == db_url: - line = '%s = pgsql:host=%s dbname=%s user=%s password=%s\n' % \ - (db_url, parser.get('database', 'host'), parser.get('database', 'dbname'), parser.get('database', 'dbuser'), \ - parser.get('database', 'dbpass')) - file_lines.append(line) -f.close() - -f = file('%s/build/build.properties' % airtime_dir, 'w') -f.writelines(file_lines) -f.close() - -print ("Updating %s/build/runtime-conf.xml" % airtime_dir) - -doc = xml.dom.minidom.parse('%s/build/runtime-conf.xml' % airtime_dir) - -node = doc.getElementsByTagName("dsn")[0] -node.firstChild.nodeValue = 'pgsql:host=%s;port=5432;dbname=%s;user=%s;password=%s' % (parser.get('database', 'host'), \ -parser.get('database', 'dbname'), parser.get('database', 'dbuser'), parser.get('database', 'dbpass')) - -xml_file = open('%s/build/runtime-conf.xml' % airtime_dir, "w") -xml_file.writelines(doc.toxml('utf-8')) -xml_file.close() - -print "Success!" From e4e5590b9f2a674ebab830e1dddf87def689383b Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 5 May 2014 11:19:14 -0400 Subject: [PATCH 139/310] CC-5802: Upgrade application.ini file Remove this upgrade step from the upgrade controller --- .../controllers/UpgradeController.php | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index ecab019100..4c8ada0887 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -42,37 +42,6 @@ public function indexAction() Application_Model_Preference::setDiskUsage($totalSpace - $freeSpace); - //update application.ini - $iniFile = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."application.ini" : "/usr/share/airtime/application/configs/application.ini"; - - $newLines = "resources.frontController.moduleDirectory = APPLICATION_PATH \"/modules\"\n". - "resources.frontController.plugins.putHandler = \"Zend_Controller_Plugin_PutHandler\"\n". - ";load everything in the modules directory including models\n". - "resources.modules[] = \"\"\n"; - - $currentIniFile = file_get_contents($iniFile); - - /* We want to add the new lines after a specific line. So we must find read the file - * into an array, find the key to which our desired line belongs, and use the key - * to split the file in two halves, $beginning and $end. - * The $newLines will go inbetween $beginning and $end - */ - $lines = explode("\n", $currentIniFile); - - $key = array_search("resources.layout.layoutPath = APPLICATION_PATH \"/layouts/scripts/\"", $lines); - if (!$key) { - throw new Exception('Upgrade to Airtime 2.5.3 FAILED. Could not upgrade application.ini'); - } - - $beginning = implode("\n", array_slice($lines, 0, $key)); - $end = implode("\n", array_slice($lines, $key)); - - if (!is_writeable($iniFile)) { - throw new Exception('Upgrade to Airtime 2.5.3 FAILED. Could not upgrade application.ini - Permission denied.'); - } - $file = new SplFileObject($iniFile, "w"); - $file->fwrite($beginning."\n".$newLines.$end); - //TODO: clear out the cache $con->commit(); From 16fb9d75d3902c007f53a84f2e7a4b8ac13553a5 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 5 May 2014 12:25:42 -0400 Subject: [PATCH 140/310] Changed GetDiskUsage so it will always return 0 if the value has not been set yet --- airtime_mvc/application/models/Preference.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php index 65b42e83fa..50de284a3f 100644 --- a/airtime_mvc/application/models/Preference.php +++ b/airtime_mvc/application/models/Preference.php @@ -1428,7 +1428,8 @@ public static function GetHistoryFileTemplate() { public static function getDiskUsage() { - return self::getValue("disk_usage"); + $val = self::getValue("disk_usage"); + return (strlen($val) == 0) ? 0 : $val; } public static function setDiskUsage($value) From 22343ed99cd671b52b75f6f97baca4bf9f401ff7 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 5 May 2014 14:39:36 -0400 Subject: [PATCH 141/310] Fixed bitrate import in airtime_analyzer --- .../airtime_analyzer/airtime_analyzer/metadata_analyzer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index eccfaa40d7..e3a3ef06b5 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -112,6 +112,7 @@ def analyze(filename, metadata): 'language': 'language', 'last_modified':'last_modified', 'mood': 'mood', + 'bit_rate': 'bit_rate', 'replay_gain': 'replaygain', #'tracknumber': 'track_number', #'track_total': 'track_total', From d063700254553125a3f9cf6a5565f3270e44b698 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 5 May 2014 14:56:32 -0400 Subject: [PATCH 142/310] CC-5834: Airtime Analyzer: Bitrate is missing * Fixed --- .../airtime_analyzer/airtime_analyzer/metadata_analyzer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index e3a3ef06b5..59ef4ba7c8 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -55,7 +55,7 @@ def analyze(filename, metadata): # Other fields for Airtime metadata["cueout"] = metadata["length"] - if hasattr(info, "bit_rate"): + if hasattr(info, "bitrate"): metadata["bit_rate"] = info.bitrate # Use the mutagen to get the MIME type, if it has one. This is more reliable and From ed494ac58725f3ac6163882389efd14e5261acb6 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 5 May 2014 18:25:47 -0400 Subject: [PATCH 143/310] Some defensive code against multiprocess related deadlocks * Reinitialize logging in child processes so we don't inherit locks. Might be causing a deadlock we're seeing on Pro right now. --- .../airtime_analyzer/analyzer_pipeline.py | 12 +++++++++++- .../airtime_analyzer/message_listener.py | 4 ++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 3a1465b7b5..4f20f9c18b 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -30,6 +30,10 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): temporary randomly generated name, which is why we want to know what the original name was. """ + # Might be super critical to initialize a separate log file here so that we + # don't inherit logging/locks from the parent process. Supposedly + # this can lead to Bad Things (deadlocks): http://bugs.python.org/issue6721 + AnalyzerPipeline.setup_logging() try: if not isinstance(queue, multiprocessing.queues.Queue): raise TypeError("queue must be a multiprocessing.Queue()") @@ -59,4 +63,10 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): logging.exception(e) raise e - + @staticmethod + def setup_logging(): + _LOG_PATH = "/var/log/airtime/airtime_analyzer_pipeline.log" + FORMAT = "%(asctime)s [%(module)s] [%(levelname)-5.5s] %(message)s" + logging.basicConfig(filename=_LOG_PATH,level=logging.DEBUG, format=FORMAT) + #rootLogger = logging.getLogger() + #rootLogger.setFormatter(logFormatter) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 9939f11bce..97613e81fc 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -212,6 +212,10 @@ def spawn_analyzer_process(audio_file_path, import_directory, original_filename) logging.info(results) else: raise Exception("Analyzer process terminated unexpectedly.") + + # Ensure our queue doesn't fill up and block due to unexpected behaviour. Defensive code. + while not q.empty(): + q.get() return results From 56c3d8070b7895803babd5a0e1bffb5871e51bd1 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 6 May 2014 15:01:25 -0400 Subject: [PATCH 144/310] Alternate bugfix for logging deadlock in airtime_analyzer --- .../airtime_analyzer/analyzer_pipeline.py | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 4f20f9c18b..39c558bacc 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -1,6 +1,7 @@ """ Analyzes and imports an audio file into the Airtime library. """ import logging +import threading import multiprocessing from metadata_analyzer import MetadataAnalyzer from filemover_analyzer import FileMoverAnalyzer @@ -30,10 +31,11 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): temporary randomly generated name, which is why we want to know what the original name was. """ - # Might be super critical to initialize a separate log file here so that we + # It is super critical to initialize a separate log file here so that we # don't inherit logging/locks from the parent process. Supposedly # this can lead to Bad Things (deadlocks): http://bugs.python.org/issue6721 - AnalyzerPipeline.setup_logging() + AnalyzerPipeline.python_logger_deadlock_workaround() + try: if not isinstance(queue, multiprocessing.queues.Queue): raise TypeError("queue must be a multiprocessing.Queue()") @@ -64,9 +66,12 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): raise e @staticmethod - def setup_logging(): - _LOG_PATH = "/var/log/airtime/airtime_analyzer_pipeline.log" - FORMAT = "%(asctime)s [%(module)s] [%(levelname)-5.5s] %(message)s" - logging.basicConfig(filename=_LOG_PATH,level=logging.DEBUG, format=FORMAT) - #rootLogger = logging.getLogger() - #rootLogger.setFormatter(logFormatter) + def python_logger_deadlock_workaround(): + # Workaround for: http://bugs.python.org/issue6721#msg140215 + logger_names = logging.Logger.manager.loggerDict.keys() + logger_names.append(None) # Root logger + for name in logger_names: + for handler in logging.getLogger(name).handlers: + handler.createLock() + logging._lock = threading.RLock() + From 81dd1deba3277f695639ee42a1c08019f2cb43e5 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 7 May 2014 13:12:18 -0400 Subject: [PATCH 145/310] Removing something for testing --- .../airtime_analyzer/airtime_analyzer/analyzer_pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 39c558bacc..939a4f2d50 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -34,7 +34,7 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): # It is super critical to initialize a separate log file here so that we # don't inherit logging/locks from the parent process. Supposedly # this can lead to Bad Things (deadlocks): http://bugs.python.org/issue6721 - AnalyzerPipeline.python_logger_deadlock_workaround() + #AnalyzerPipeline.python_logger_deadlock_workaround() try: if not isinstance(queue, multiprocessing.queues.Queue): From c29143948343a925428b3594d2169eca3f09843f Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 7 May 2014 15:01:31 -0400 Subject: [PATCH 146/310] Adding back analyzer deadlock workaround. Removing command to delete empty sub folders inside organize. --- .../application/modules/rest/controllers/MediaController.php | 4 ++-- .../airtime_analyzer/airtime_analyzer/analyzer_pipeline.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 34bd5ac55f..d2a55d0ebc 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -252,8 +252,8 @@ public function putAction() $file->setDbMtime($now); $file->save(); - $this->removeEmptySubFolders( - isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/organize/" : "/srv/airtime/stor/organize/"); + /* $this->removeEmptySubFolders( + isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/organize/" : "/srv/airtime/stor/organize/"); */ $this->getResponse() ->setHttpResponseCode(200) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 939a4f2d50..39c558bacc 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -34,7 +34,7 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): # It is super critical to initialize a separate log file here so that we # don't inherit logging/locks from the parent process. Supposedly # this can lead to Bad Things (deadlocks): http://bugs.python.org/issue6721 - #AnalyzerPipeline.python_logger_deadlock_workaround() + AnalyzerPipeline.python_logger_deadlock_workaround() try: if not isinstance(queue, multiprocessing.queues.Queue): From 0040965222388ab98892ed3ee3fa748aacac1522 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 8 May 2014 13:01:49 -0400 Subject: [PATCH 147/310] CC-5840: Add Media -> Endless retries if there is a validation error Fixed by not adding message to retry queue if request returns a validation specific error code (422) --- .../modules/rest/controllers/MediaController.php | 2 +- .../airtime_analyzer/status_reporter.py | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index d2a55d0ebc..8a578fc0c5 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -369,7 +369,7 @@ private function fileNotFoundResponse() private function invalidDataResponse() { $resp = $this->getResponse(); - $resp->setHttpResponseCode(400); + $resp->setHttpResponseCode(422); $resp->appendBody("ERROR: Invalid data"); } diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index 0e3c716190..0a69461ba8 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -91,9 +91,13 @@ def send_http_request(picklable_request, retry_queue): r.raise_for_status() # Raise an exception if there was an http error code returned logging.info("HTTP request sent successfully.") except requests.exceptions.RequestException as e: - # If the web server is having problems, retry the request later: - logging.error("HTTP request failed. Retrying later! Exception was: %s" % str(e)) - retry_queue.append(picklable_request) + if r.status_code != 422: + # If the web server is having problems, retry the request later: + logging.error("HTTP request failed. Retrying later! Exception was: %s" % str(e)) + retry_queue.append(picklable_request) + else: + # Do no retry the request if there was a metadata validation error + logging.error("HTTP request failed. Exception was: %s" % str(e)) except Exception as e: logging.error("HTTP request failed with unhandled exception. %s" % str(e)) # Don't put the request into the retry queue, just give up on this one. From 691841eba4b793d337da7997d88be17a06fb0223 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 12 May 2014 11:29:58 -0400 Subject: [PATCH 148/310] CC-5844: Airtime Analyzer: Auto format the 'year' tag. --- .../rest/controllers/MediaController.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 8a578fc0c5..dbe5796062 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -221,6 +221,7 @@ public function putAction() $requestData = json_decode($this->getRequest()->getRawBody(), true); $whiteList = $this->removeBlacklistedFieldsFromRequestData($requestData); + $whiteList = $this->stripTimeStampFromYearTag($whiteList); if (!$this->validateRequestData($file, $whiteList)) { $file->save(); @@ -486,5 +487,21 @@ private function removeEmptySubFolders($path) exec("find $path -empty -type d -delete"); } + /* + * It's possible that the year tag will be a timestamp but Airtime doesn't support this. + * The year field in cc_files can only be 16 chars max. + * + * This functions strips the year field of it's timestamp, if one, and leaves just the year + */ + private function stripTimeStampFromYearTag($metadata) + { + if (isset($metadata["year"])) { + if (preg_match("/^(\d{4})-(\d{2})-(\d{2})(?:\s+(\d{2}):(\d{2}):(\d{2}))?$/", $metadata["year"])) { + $metadata["year"] = substr($metadata["year"], 0, 4); + } + } + return $metadata; + } + } From 4cdd855a217ab830003b7dfcf54bdaac6c726124 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 20 May 2014 14:15:51 -0400 Subject: [PATCH 149/310] CC-5855: Output to zendlog when files are deleted from library --- airtime_mvc/application/controllers/LibraryController.php | 2 -- airtime_mvc/application/models/StoredFile.php | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index 2102a662ea..41ab24eaa8 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -78,8 +78,6 @@ public function indexAction() $obj_sess = new Zend_Session_Namespace(UI_PLAYLISTCONTROLLER_OBJ_SESSNAME); if (isset($obj_sess->id)) { $objInfo = Application_Model_Library::getObjInfo($obj_sess->type); - Logging::info($obj_sess->id); - Logging::info($obj_sess->type); $objInfo = Application_Model_Library::getObjInfo($obj_sess->type); $obj = new $objInfo['className']($obj_sess->id); diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 8e249e1507..88bbf70c59 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -401,7 +401,7 @@ public function delete() } } - + Logging::info("User ".$user->getLogin()." is deleting file: ".$this->_file->getDbTrackTitle()." - file id: ".$this->_file->getDbId()); // set hidden flag to true $this->_file->setDbHidden(true); $this->_file->save(); From 08badfb421cf72fce7797385671091ab8c7a6330 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 20 May 2014 17:43:06 -0400 Subject: [PATCH 150/310] SAAS-436: Fix widgets --- .../public/widgets}/css/airtime-widgets.css | 0 .../css/widget-img/schedule-tabs-list-bgr.png | Bin .../public/widgets}/js/jquery-1.6.1.min.js | 0 .../widgets}/js/jquery-ui-1.8.10.custom.min.js | 0 .../public/widgets}/js/jquery.showinfo.js | 0 .../public/widgets}/sample_page.html | 0 .../public/widgets}/widget_schedule.html | 0 .../public/widgets}/widgets.html | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename {widgets => airtime_mvc/public/widgets}/css/airtime-widgets.css (100%) rename {widgets => airtime_mvc/public/widgets}/css/widget-img/schedule-tabs-list-bgr.png (100%) rename {widgets => airtime_mvc/public/widgets}/js/jquery-1.6.1.min.js (100%) rename {widgets => airtime_mvc/public/widgets}/js/jquery-ui-1.8.10.custom.min.js (100%) rename {widgets => airtime_mvc/public/widgets}/js/jquery.showinfo.js (100%) rename {widgets => airtime_mvc/public/widgets}/sample_page.html (100%) rename {widgets => airtime_mvc/public/widgets}/widget_schedule.html (100%) rename {widgets => airtime_mvc/public/widgets}/widgets.html (100%) diff --git a/widgets/css/airtime-widgets.css b/airtime_mvc/public/widgets/css/airtime-widgets.css similarity index 100% rename from widgets/css/airtime-widgets.css rename to airtime_mvc/public/widgets/css/airtime-widgets.css diff --git a/widgets/css/widget-img/schedule-tabs-list-bgr.png b/airtime_mvc/public/widgets/css/widget-img/schedule-tabs-list-bgr.png similarity index 100% rename from widgets/css/widget-img/schedule-tabs-list-bgr.png rename to airtime_mvc/public/widgets/css/widget-img/schedule-tabs-list-bgr.png diff --git a/widgets/js/jquery-1.6.1.min.js b/airtime_mvc/public/widgets/js/jquery-1.6.1.min.js similarity index 100% rename from widgets/js/jquery-1.6.1.min.js rename to airtime_mvc/public/widgets/js/jquery-1.6.1.min.js diff --git a/widgets/js/jquery-ui-1.8.10.custom.min.js b/airtime_mvc/public/widgets/js/jquery-ui-1.8.10.custom.min.js similarity index 100% rename from widgets/js/jquery-ui-1.8.10.custom.min.js rename to airtime_mvc/public/widgets/js/jquery-ui-1.8.10.custom.min.js diff --git a/widgets/js/jquery.showinfo.js b/airtime_mvc/public/widgets/js/jquery.showinfo.js similarity index 100% rename from widgets/js/jquery.showinfo.js rename to airtime_mvc/public/widgets/js/jquery.showinfo.js diff --git a/widgets/sample_page.html b/airtime_mvc/public/widgets/sample_page.html similarity index 100% rename from widgets/sample_page.html rename to airtime_mvc/public/widgets/sample_page.html diff --git a/widgets/widget_schedule.html b/airtime_mvc/public/widgets/widget_schedule.html similarity index 100% rename from widgets/widget_schedule.html rename to airtime_mvc/public/widgets/widget_schedule.html diff --git a/widgets/widgets.html b/airtime_mvc/public/widgets/widgets.html similarity index 100% rename from widgets/widgets.html rename to airtime_mvc/public/widgets/widgets.html From 8432799b9a50e4221fd3fef4ee1b43980675d824 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 22 May 2014 14:47:14 -0400 Subject: [PATCH 151/310] CC-5853: Tracks marked as 'hidden' won't be marked as unavailable in Now Playing page --- airtime_mvc/application/models/StoredFile.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 88bbf70c59..e30851e261 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -403,7 +403,8 @@ public function delete() Logging::info("User ".$user->getLogin()." is deleting file: ".$this->_file->getDbTrackTitle()." - file id: ".$this->_file->getDbId()); // set hidden flag to true - $this->_file->setDbHidden(true); + //$this->_file->setDbHidden(true); + $this->_file->setDbFileExists(false); $this->_file->save(); // need to explicitly update any playlist's and block's length From 091be8cea31ec3c6f598a91fc1ad96c31ab01663 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 22 May 2014 18:40:05 -0400 Subject: [PATCH 152/310] SAAS-439: Genres longer than 64 characters cause Media API exception * Truncate the genre field in the Media API --- .../rest/controllers/MediaController.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index dbe5796062..7bbb3bc950 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -222,6 +222,7 @@ public function putAction() $requestData = json_decode($this->getRequest()->getRawBody(), true); $whiteList = $this->removeBlacklistedFieldsFromRequestData($requestData); $whiteList = $this->stripTimeStampFromYearTag($whiteList); + $whiteList = $this->truncateGenreTag($whiteList); if (!$this->validateRequestData($file, $whiteList)) { $file->save(); @@ -502,6 +503,20 @@ private function stripTimeStampFromYearTag($metadata) } return $metadata; } - + + /** The genre tag in our cc_files schema is currently a varchar(64). It's possible for MP3 genre tags + * to be longer than that, so we have to truncate longer genres. (We've seen ridiculously long genre tags.) + * @param string array $metadata + */ + private function truncateGenreTag($metadata) + { + if (isset($metadata["genre"])) + { + if (strlen($metadata["genre"]) >= 64) { + $metadata["genre"] = substr($metadata["genre"], 0, 64); + } + } + return $metadata; + } } From e1a04299392dbb7ed70bb789142935b0407451c8 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 22 May 2014 19:16:42 -0400 Subject: [PATCH 153/310] Handle error case that could cause invalid disk usage reading --- .../modules/rest/controllers/MediaController.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 7bbb3bc950..e4f78652fe 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -234,7 +234,14 @@ public function putAction() //our internal schema. Internally, file path is stored relative to a directory, with the directory //as a foreign key to cc_music_dirs. if (isset($requestData["full_path"])) { - Application_Model_Preference::updateDiskUsage(filesize($requestData["full_path"])); + $fileSizeBytes = filesize($requestData["full_path"]); + if ($fileSizeBytes === false) + { + $file->setDbImportStatus(2)->save(); + $this->fileNotFoundResponse(); + return; + } + Application_Model_Preference::updateDiskUsage($fileSizeBytes); $fullPath = $requestData["full_path"]; $storDir = Application_Model_MusicDir::getStorDir()->getDirectory(); From 9eb0f2f3b33256f5d46c659e3d8390affa4155ad Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 26 May 2014 17:13:45 -0400 Subject: [PATCH 154/310] CC-5859: Airtime Analyzer: format fields before writing to db --- airtime_mvc/application/forms/EditAudioMD.php | 165 +++++++++++------- .../rest/controllers/MediaController.php | 35 ++-- 2 files changed, 124 insertions(+), 76 deletions(-) diff --git a/airtime_mvc/application/forms/EditAudioMD.php b/airtime_mvc/application/forms/EditAudioMD.php index cbb45af02b..69ddbccde4 100644 --- a/airtime_mvc/application/forms/EditAudioMD.php +++ b/airtime_mvc/application/forms/EditAudioMD.php @@ -15,39 +15,62 @@ public function startForm($p_id) 'value' => $p_id )); // Add title field - $this->addElement('text', 'track_title', array( + /*$this->addElement('text', 'track_title', array( 'label' => _('Title:'), 'class' => 'input_text', 'filters' => array('StringTrim'), - )); + ));*/ + $track_title = new Zend_Form_Element_Text('track_title'); + $track_title->class = 'input_text'; + $track_title->setLabel(_('Title:')) + ->setFilters(array('StringTrim')) + ->setValidators(array( + new Zend_Validate_StringLength(array('max' => 512)) + )); + $this->addElement($track_title); // Add artist field - $this->addElement('text', 'artist_name', array( + /*$this->addElement('text', 'artist_name', array( 'label' => _('Creator:'), 'class' => 'input_text', 'filters' => array('StringTrim'), - )); + ));*/ + $artist_name = new Zend_Form_Element_Text('artist_name'); + $artist_name->class = 'input_text'; + $artist_name->setLabel(_('Creator:')) + ->setFilters(array('StringTrim')) + ->setValidators(array( + new Zend_Validate_StringLength(array('max' => 512)) + )); + $this->addElement($artist_name); // Add album field - $this->addElement('text', 'album_title', array( - 'label' => _('Album:'), - 'class' => 'input_text', - 'filters' => array('StringTrim') - )); + $album_title = new Zend_Form_Element_Text('album_title'); + $album_title->class = 'input_text'; + $album_title->setLabel(_('Album:')) + ->setFilters(array('StringTrim')) + ->setValidators(array( + new Zend_Validate_StringLength(array('max' => 512)) + ));; + $this->addElement($album_title); // Add track number field - $this->addElement('text', 'track_number', array( - 'label' => _('Track:'), - 'class' => 'input_text', - 'filters' => array('StringTrim'), - )); + $track_number = new Zend_Form_Element('track_number'); + $track_number->class = 'input_text'; + $track_number->setLabel('Track Number:') + ->setFilters(array('StringTrim')) + ->setValidators(array(new Zend_Validate_Digits())); + $this->addElement($track_number); // Add genre field - $this->addElement('text', 'genre', array( - 'label' => _('Genre:'), - 'class' => 'input_text', - 'filters' => array('StringTrim') - )); + $genre = new Zend_Form_Element('genre'); + $genre->class = 'input_text'; + $genre->setLabel(_('Genre:')) + ->setFilters(array('StringTrim')) + ->setValidators(array( + new Zend_Validate_StringLength(array('max' => 64)) + )); + $this->addElement($genre); // Add year field $year = new Zend_Form_Element_Text('year'); @@ -63,32 +86,44 @@ public function startForm($p_id) $this->addElement($year); // Add label field - $this->addElement('text', 'label', array( - 'label' => _('Label:'), - 'class' => 'input_text', - 'filters' => array('StringTrim') - )); + $label = new Zend_Form_Element('label'); + $label->class = 'input_text'; + $label->setLabel(_('Label:')) + ->setFilters(array('StringTrim')) + ->setValidators(array( + new Zend_Validate_StringLength(array('max' => 512)) + )); + $this->addElement($label); // Add composer field - $this->addElement('text', 'composer', array( - 'label' => _('Composer:'), - 'class' => 'input_text', - 'filters' => array('StringTrim') - )); + $composer = new Zend_Form_Element('composer'); + $composer->class = 'input_text'; + $composer->setLabel(_('Composer:')) + ->setFilters(array('StringTrim')) + ->setValidators(array( + new Zend_Validate_StringLength(array('max' => 512)) + )); + $this->addElement($composer); // Add conductor field - $this->addElement('text', 'conductor', array( - 'label' => _('Conductor:'), - 'class' => 'input_text', - 'filters' => array('StringTrim') - )); + $conductor = new Zend_Form_Element('conductor'); + $conductor->class = 'input_text'; + $conductor->setLabel(_('Conductor:')) + ->setFilters(array('StringTrim')) + ->setValidators(array( + new Zend_Validate_StringLength(array('max' => 512)) + )); + $this->addElement($conductor); // Add mood field - $this->addElement('text', 'mood', array( - 'label' => _('Mood:'), - 'class' => 'input_text', - 'filters' => array('StringTrim') - )); + $mood = new Zend_Form_Element('mood'); + $mood->class = 'input_text'; + $mood->setLabel(_('Mood:')) + ->setFilters(array('StringTrim')) + ->setValidators(array( + new Zend_Validate_StringLength(array('max' => 64)) + )); + $this->addElement($mood); // Add bmp field $bpm = new Zend_Form_Element_Text('bpm'); @@ -101,32 +136,44 @@ public function startForm($p_id) $this->addElement($bpm); // Add copyright field - $this->addElement('text', 'copyright', array( - 'label' => _('Copyright:'), - 'class' => 'input_text', - 'filters' => array('StringTrim') - )); + $copyright = new Zend_Form_Element('copyright'); + $copyright->class = 'input_text'; + $copyright->setLabel(_('Copyright:')) + ->setFilters(array('StringTrim')) + ->setValidators(array( + new Zend_Validate_StringLength(array('max' => 512)) + )); + $this->addElement($copyright); // Add isrc number field - $this->addElement('text', 'isrc_number', array( - 'label' => _('ISRC Number:'), - 'class' => 'input_text', - 'filters' => array('StringTrim') - )); + $isrc_number = new Zend_Form_Element('isrc_number'); + $isrc_number->class = 'input_text'; + $isrc_number->setLabel(_('ISRC Number:')) + ->setFilters(array('StringTrim')) + ->setValidators(array( + new Zend_Validate_StringLength(array('max' => 512)) + )); + $this->addElement($isrc_number); // Add website field - $this->addElement('text', 'info_url', array( - 'label' => _('Website:'), - 'class' => 'input_text', - 'filters' => array('StringTrim') - )); + $info_url = new Zend_Form_Element('info_url'); + $info_url->class = 'input_text'; + $info_url->setLabel(_('Website:')) + ->setFilters(array('StringTrim')) + ->setValidators(array( + new Zend_Validate_StringLength(array('max' => 512)) + )); + $this->addElement($info_url); // Add language field - $this->addElement('text', 'language', array( - 'label' => _('Language:'), - 'class' => 'input_text', - 'filters' => array('StringTrim') - )); + $language = new Zend_Form_Element('language'); + $language->class = 'input_text'; + $language->setLabel(_('Language:')) + ->setFilters(array('StringTrim')) + ->setValidators(array( + new Zend_Validate_StringLength(array('max' => 512)) + )); + $this->addElement($language); // Add the submit button $this->addElement('button', 'editmdsave', array( diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index e4f78652fe..704ee20528 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -222,7 +222,6 @@ public function putAction() $requestData = json_decode($this->getRequest()->getRawBody(), true); $whiteList = $this->removeBlacklistedFieldsFromRequestData($requestData); $whiteList = $this->stripTimeStampFromYearTag($whiteList); - $whiteList = $this->truncateGenreTag($whiteList); if (!$this->validateRequestData($file, $whiteList)) { $file->save(); @@ -382,12 +381,29 @@ private function invalidDataResponse() $resp->appendBody("ERROR: Invalid data"); } - private function validateRequestData($file, $whiteList) + private function validateRequestData($file, &$whiteList) { // EditAudioMD form is used here for validation $fileForm = new Application_Form_EditAudioMD(); $fileForm->startForm($file->getDbId()); $fileForm->populate($whiteList); + + /* + * Here we are truncating metadata of any characters greater than the + * max string length set in the database. In the rare case a track's + * genre is more than 64 chars, for example, we don't want to reject + * tracks for that reason + */ + foreach($whiteList as $tag => &$value) { + if ($fileForm->getElement($tag)) { + $stringLengthValidator = $fileForm->getElement($tag)->getValidator('StringLength'); + //$stringLengthValidator will be false if the StringLength validator doesn't exist on the current element + //in which case we don't have to truncate the extra characters + if ($stringLengthValidator) { + $value = substr($value, 0, $stringLengthValidator->getMax()); + } + } + } if (!$fileForm->isValidPartial($whiteList)) { $file->setDbImportStatus(2); @@ -510,20 +526,5 @@ private function stripTimeStampFromYearTag($metadata) } return $metadata; } - - /** The genre tag in our cc_files schema is currently a varchar(64). It's possible for MP3 genre tags - * to be longer than that, so we have to truncate longer genres. (We've seen ridiculously long genre tags.) - * @param string array $metadata - */ - private function truncateGenreTag($metadata) - { - if (isset($metadata["genre"])) - { - if (strlen($metadata["genre"]) >= 64) { - $metadata["genre"] = substr($metadata["genre"], 0, 64); - } - } - return $metadata; - } } From d21cb596cd8dd4bf956249f0d8a2b56c755d4b0c Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 26 May 2014 18:59:28 -0400 Subject: [PATCH 155/310] CC-5860: Analyzer HTTP requests can hang indefinitely * Log a backtrace when sent the USR2 signal (kill -SIGUSR2 ) * Rigged up up something to strace and restart when we see a request hanging --- .../airtime_analyzer/airtime_analyzer.py | 26 +++++-- .../airtime_analyzer/status_reporter.py | 72 +++++++++++++++++-- 2 files changed, 89 insertions(+), 9 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py index 39f3039f44..56739f200e 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py @@ -4,6 +4,8 @@ import logging import logging.handlers import sys +import signal +import traceback from functools import partial from metadata_analyzer import MetadataAnalyzer from replaygain_analyzer import ReplayGainAnalyzer @@ -23,6 +25,9 @@ class AirtimeAnalyzerServer: def __init__(self, rmq_config_path, http_retry_queue_path, debug=False): + # Debug console. Access with 'kill -SIGUSR2 ' + signal.signal(signal.SIGUSR2, lambda sig, frame: AirtimeAnalyzerServer.dump_stacktrace()) + # Configure logging self.setup_logging(debug) @@ -30,13 +35,13 @@ def __init__(self, rmq_config_path, http_retry_queue_path, debug=False): rabbitmq_config = self.read_config_file(rmq_config_path) # Start up the StatusReporter process - StatusReporter.start_child_process(http_retry_queue_path) + StatusReporter.start_thread(http_retry_queue_path) # Start listening for RabbitMQ messages telling us about newly - # uploaded files. + # uploaded files. This blocks until we recieve a shutdown signal. self._msg_listener = MessageListener(rabbitmq_config) - StatusReporter.stop_child_process() + StatusReporter.stop_thread() def setup_logging(self, debug): @@ -81,4 +86,17 @@ def read_config_file(self, config_path): exit(-1) return config - + + @classmethod + def dump_stacktrace(stack): + ''' Dump a stacktrace for all threads ''' + code = [] + for threadId, stack in sys._current_frames().items(): + code.append("\n# ThreadID: %s" % threadId) + for filename, lineno, name, line in traceback.extract_stack(stack): + code.append('File: "%s", line %d, in %s' % (filename, lineno, name)) + if line: + code.append(" %s" % (line.strip())) + logging.info('\n'.join(code)) + + diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index 0a69461ba8..a93ab1f8a2 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -3,8 +3,12 @@ import logging import collections import Queue -import signal +import subprocess import multiprocessing +import time +import sys +import traceback +import os import pickle import threading @@ -84,10 +88,13 @@ def send_http_request(picklable_request, retry_queue): if not isinstance(picklable_request, PicklableHttpRequest): raise TypeError("picklable_request must be a PicklableHttpRequest. Was of type " + type(picklable_request).__name__) try: - prepared_request = picklable_request.create_request() - prepared_request = prepared_request.prepare() + t = threading.Timer(60, alert_hung_request) + t.start() + bare_request = picklable_request.create_request() s = requests.Session() + prepared_request = s.prepare_request(bare_request) r = s.send(prepared_request, timeout=StatusReporter._HTTP_REQUEST_TIMEOUT) + t.cancel() # Watchdog no longer needed. r.raise_for_status() # Raise an exception if there was an http error code returned logging.info("HTTP request sent successfully.") except requests.exceptions.RequestException as e: @@ -105,6 +112,61 @@ def send_http_request(picklable_request, retry_queue): # that breaks our code. I don't want us pickling data that potentially # breaks airtime_analyzer. +def alert_hung_request(): + ''' Temporary function to alert our Airtime developers when we have a request that's + blocked indefinitely. We're working with the python requests developers to figure this + one out. (We need to strace airtime_analyzer to figure out where exactly it's blocked.) + There's some weird circumstance where this can happen, even though we specify a timeout. + ''' + pid = os.getpid() + + # Capture a list of the open file/socket handles so we can interpret the strace log + lsof_log = subprocess.check_output(["lsof -p %s" % str(pid)], shell=True) + + strace_log = "" + # Run strace on us for 10 seconds + try: + subprocess.check_output(["timeout 10 strace -p %s -s 1000 -f -v -o /var/log/airtime/airtime_analyzer_strace.log -ff " % str(pid)], + shell=True) + except subprocess.CalledProcessError as e: # When the timeout fires, it returns a crazy code + strace_log = e.output + pass + + + # Dump a traceback + code = [] + for threadId, stack in sys._current_frames().items(): + code.append("\n# ThreadID: %s" % threadId) + for filename, lineno, name, line in traceback.extract_stack(stack): + code.append('File: "%s", line %d, in %s' % (filename, lineno, name)) + if line: + code.append(" %s" % (line.strip())) + stack_trace = ('\n'.join(code)) + + logging.critical(stack_trace) + logging.critical(strace_log) + logging.critical(lsof_log) + # Exit the program so that upstart respawns us + #sys.exit(-1) #deadlocks :( + subprocess.check_output(["kill -9 %s" % str(pid)], shell=True) # Ugh, avert your eyes + +''' +request_running = False +request_running_lock = threading.Lock() +def is_request_running(): + request_running_lock.acquire() + rr = request_running + request_running_lock.release() + return rr +def set_request_running(is_running): + request_running_lock.acquire() + request_running = is_running + request_running_lock.release() +def is_request_hung(): +''' + + + class StatusReporter(): @@ -122,13 +184,13 @@ class StatusReporter(): _request_process = None @classmethod - def start_child_process(self, http_retry_queue_path): + def start_thread(self, http_retry_queue_path): StatusReporter._request_process = threading.Thread(target=process_http_requests, args=(StatusReporter._ipc_queue,http_retry_queue_path)) StatusReporter._request_process.start() @classmethod - def stop_child_process(self): + def stop_thread(self): logging.info("Terminating status_reporter process") #StatusReporter._request_process.terminate() # Triggers SIGTERM on the child process StatusReporter._ipc_queue.put("shutdown") # Special trigger From 1373d4984f5de0fe16cd9babc9b28a382477e8fc Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 30 May 2014 13:02:19 -0400 Subject: [PATCH 156/310] CC-5862: Invalid UTF-8 chars cause DB error * Strip and validate UTF-8 strings in the Media API * Also properly parse track numbers containing "-" --- .../rest/controllers/MediaController.php | 25 +++++++++++++++++++ .../airtime_analyzer/metadata_analyzer.py | 6 ++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 704ee20528..e10fda28c2 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -402,10 +402,15 @@ private function validateRequestData($file, &$whiteList) if ($stringLengthValidator) { $value = substr($value, 0, $stringLengthValidator->getMax()); } + + $value = $this->stripInvalidUtf8Characters($value); } } if (!$fileForm->isValidPartial($whiteList)) { + $errors = $fileForm->getErrors(); + $messages = $fileForm->getMessages(); + Logging::error($messages); $file->setDbImportStatus(2); $file->setDbHidden(true); $this->invalidDataResponse(); @@ -526,5 +531,25 @@ private function stripTimeStampFromYearTag($metadata) } return $metadata; } + + private function stripInvalidUtf8Characters($string) + { + //Remove invalid UTF-8 characters + //reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ? + $string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'. + '|[\x00-\x7F][\x80-\xBF]+'. + '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'. + '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'. + '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S', + '?', $string ); + + //reject overly long 3 byte sequences and UTF-16 surrogates and replace with ? + $string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'. + '|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $string ); + + //Do a final encoding conversion to + $string = mb_convert_encoding($string, 'UTF-8', 'UTF-8'); + return $string; + } } diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index 59ef4ba7c8..ec58895969 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -83,7 +83,11 @@ def analyze(filename, metadata): track_number = audio_file["tracknumber"] if isinstance(track_number, list): # Sometimes tracknumber is a list, ugh track_number = track_number[0] - track_number_tokens = track_number.split(u'/') + track_number_tokens = track_number + if u'/' in track_number: + track_number_tokens = track_number.split(u'/') + elif u'-' in track_number: + track_number_tokens = track_number.split(u'-') track_number = track_number_tokens[0] metadata["track_number"] = track_number track_total = track_number_tokens[1] From 2e6d3821aebdddc4c23d84b908bf65cf9fe44ae9 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 2 Jun 2014 14:14:09 -0400 Subject: [PATCH 157/310] CC-5863: Deleted files still shown in Recent Uploads view * Fixed --- airtime_mvc/application/controllers/PluploadController.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index 84e1289c94..bae5d9a7a0 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -46,6 +46,9 @@ public function recentUploadsAction() $numTotalRecentUploads = $recentUploadsQuery->count(); $numTotalDisplayUploads = $numTotalRecentUploads; + + //Hide deleted files + $recentUploadsQuery->filterByDbFileExists(true); if ($filter == "pending") { $recentUploadsQuery->filterByDbImportStatus(1); @@ -74,7 +77,7 @@ public function recentUploadsAction() $upload['utime']->setTimeZone($displayTimezone); $upload['utime'] = $upload['utime']->format('Y-m-d H:i:s'); - //TODO: Invoke sanitization here + //TODO: Invoke sanitization here (MediaController's removeBlacklist stuff) array_push($uploadsArray, $upload); } From 4548123ad9dea8e89ba1cb507b75941f69cbb676 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 3 Jun 2014 11:41:45 -0400 Subject: [PATCH 158/310] CC-5861: Long file paths will cause analyzer error * Fixed it --- .../airtime_analyzer/filemover_analyzer.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py index b0d94ee796..de296e092f 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py @@ -41,13 +41,15 @@ def move(audio_file_path, import_directory, original_filename, metadata): #Import the file over to it's final location. # TODO: Also, handle the case where the move fails and write some code # to possibly move the file to problem_files. - + + max_dir_len = 32 + max_file_len = 32 final_file_path = import_directory if metadata.has_key("artist_name"): - final_file_path += "/" + metadata["artist_name"] + final_file_path += "/" + metadata["artist_name"][0:max_dir_len] # truncating with array slicing if metadata.has_key("album_title"): - final_file_path += "/" + metadata["album_title"] - final_file_path += "/" + original_filename + final_file_path += "/" + metadata["album_title"][0:max_dir_len] + final_file_path += "/" + original_filename[0:max_file_len] #Ensure any redundant slashes are stripped final_file_path = os.path.normpath(final_file_path) From a969f8fc4407203a011aff6243b4533867b48342 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 3 Jun 2014 12:43:01 -0400 Subject: [PATCH 159/310] CC-5856: Analyzer metadata exception * Fixed parsing of metadata when there's empty lists returned (mutagen's API is awful) * Return HTTP 422 if there's any exception in validating the metadata --- .../rest/controllers/MediaController.php | 50 ++++++++++--------- .../airtime_analyzer/metadata_analyzer.py | 5 +- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index e10fda28c2..f88c397d13 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -383,31 +383,35 @@ private function invalidDataResponse() private function validateRequestData($file, &$whiteList) { - // EditAudioMD form is used here for validation - $fileForm = new Application_Form_EditAudioMD(); - $fileForm->startForm($file->getDbId()); - $fileForm->populate($whiteList); - - /* - * Here we are truncating metadata of any characters greater than the - * max string length set in the database. In the rare case a track's - * genre is more than 64 chars, for example, we don't want to reject - * tracks for that reason - */ - foreach($whiteList as $tag => &$value) { - if ($fileForm->getElement($tag)) { - $stringLengthValidator = $fileForm->getElement($tag)->getValidator('StringLength'); - //$stringLengthValidator will be false if the StringLength validator doesn't exist on the current element - //in which case we don't have to truncate the extra characters - if ($stringLengthValidator) { - $value = substr($value, 0, $stringLengthValidator->getMax()); + try { + // EditAudioMD form is used here for validation + $fileForm = new Application_Form_EditAudioMD(); + $fileForm->startForm($file->getDbId()); + $fileForm->populate($whiteList); + + /* + * Here we are truncating metadata of any characters greater than the + * max string length set in the database. In the rare case a track's + * genre is more than 64 chars, for example, we don't want to reject + * tracks for that reason + */ + foreach($whiteList as $tag => &$value) { + if ($fileForm->getElement($tag)) { + $stringLengthValidator = $fileForm->getElement($tag)->getValidator('StringLength'); + //$stringLengthValidator will be false if the StringLength validator doesn't exist on the current element + //in which case we don't have to truncate the extra characters + if ($stringLengthValidator) { + $value = substr($value, 0, $stringLengthValidator->getMax()); + } + + $value = $this->stripInvalidUtf8Characters($value); } - - $value = $this->stripInvalidUtf8Characters($value); } - } - - if (!$fileForm->isValidPartial($whiteList)) { + + if (!$fileForm->isValidPartial($whiteList)) { + throw Exception("Data validation failed"); + } + } catch (Exception $e) { $errors = $fileForm->getErrors(); $messages = $fileForm->getMessages(); Logging::error($messages); diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index ec58895969..a7bd0a3045 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -132,7 +132,10 @@ def analyze(filename, metadata): # Some tags are returned as lists because there could be multiple values. # This is unusual so we're going to always just take the first item in the list. if isinstance(metadata[airtime_tag], list): - metadata[airtime_tag] = metadata[airtime_tag][0] + if metadata[airtime_tag]: + metadata[airtime_tag] = metadata[airtime_tag][0] + else: # Handle empty lists + metadata[airtime_tag] = "" except KeyError: continue From 5e7fdb9606d6e2f26bb09f375c2565b35b96c054 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 4 Jun 2014 13:46:25 -0400 Subject: [PATCH 160/310] Don't retry Analyzer HTTP requests if the web app is broken --- .../airtime_analyzer/airtime_analyzer.py | 2 +- .../airtime_analyzer/status_reporter.py | 41 ++++++++++++++++--- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py index 56739f200e..bb76ba465b 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py @@ -25,7 +25,7 @@ class AirtimeAnalyzerServer: def __init__(self, rmq_config_path, http_retry_queue_path, debug=False): - # Debug console. Access with 'kill -SIGUSR2 ' + # Dump a stacktrace with 'kill -SIGUSR2 ' signal.signal(signal.SIGUSR2, lambda sig, frame: AirtimeAnalyzerServer.dump_stacktrace()) # Configure logging diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index a93ab1f8a2..7dcfa5d443 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -11,6 +11,7 @@ import os import pickle import threading +from urlparse import urlparse class PicklableHttpRequest: def __init__(self, method, url, data, api_key): @@ -97,14 +98,25 @@ def send_http_request(picklable_request, retry_queue): t.cancel() # Watchdog no longer needed. r.raise_for_status() # Raise an exception if there was an http error code returned logging.info("HTTP request sent successfully.") - except requests.exceptions.RequestException as e: - if r.status_code != 422: - # If the web server is having problems, retry the request later: - logging.error("HTTP request failed. Retrying later! Exception was: %s" % str(e)) - retry_queue.append(picklable_request) - else: + except requests.exceptions.HTTPError as e: + if e.response.status_code == 422: # Do no retry the request if there was a metadata validation error + logging.error("HTTP request failed due to an HTTP exception. Exception was: %s" % str(e)) + else: + # The request failed with an error 500 probably, so let's check if Airtime and/or + # the web server are broken. If not, then our request was probably causing an + # error 500 in the media API (ie. a bug), so there's no point in retrying it. logging.error("HTTP request failed. Exception was: %s" % str(e)) + parsed_url = urlparse(e.response.request.url) + if is_web_server_broken(parsed_url.scheme + "://" + parsed_url.netloc): + # If the web server is having problems, retry the request later: + retry_queue.append(picklable_request) + # Otherwise, if the request was bad, the request is never retried. + # You will have to find these bad requests in logs or you'll be + # notified by sentry. + except requests.exceptions.ConnectionError as e: + logging.error("HTTP request failed due to a connection error. Retrying later. %s" % str(e)) + retry_queue.append(picklable_request) # Retry it later except Exception as e: logging.error("HTTP request failed with unhandled exception. %s" % str(e)) # Don't put the request into the retry queue, just give up on this one. @@ -112,6 +124,23 @@ def send_http_request(picklable_request, retry_queue): # that breaks our code. I don't want us pickling data that potentially # breaks airtime_analyzer. +def is_web_server_broken(url): + ''' Do a naive test to check if the web server we're trying to access is down. + We use this to try to differentiate between error 500s that are coming + from (for example) a bug in the Airtime Media REST API and error 500s + caused by Airtime or the webserver itself being broken temporarily. + ''' + try: + test_req = requests.get(url) + test_req.raise_for_status() + except Exception as e: + return true + else: + # The request worked fine, so the web server and Airtime are still up. + return false + return false + + def alert_hung_request(): ''' Temporary function to alert our Airtime developers when we have a request that's blocked indefinitely. We're working with the python requests developers to figure this From e3c2ae03b3903a8bf6df0dd5d22b978ab052c401 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 4 Jun 2014 14:15:36 -0400 Subject: [PATCH 161/310] Fixed upload file count being wrong in Add Media page (lemma to CC-5863) --- airtime_mvc/application/controllers/PluploadController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index bae5d9a7a0..63286cdd67 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -44,12 +44,12 @@ public function recentUploadsAction() //old propel 1.5 to reuse this query item (for counts/finds) $recentUploadsQuery->keepQuery(true); - $numTotalRecentUploads = $recentUploadsQuery->count(); - $numTotalDisplayUploads = $numTotalRecentUploads; - //Hide deleted files $recentUploadsQuery->filterByDbFileExists(true); + $numTotalRecentUploads = $recentUploadsQuery->count(); + $numTotalDisplayUploads = $numTotalRecentUploads; + if ($filter == "pending") { $recentUploadsQuery->filterByDbImportStatus(1); $numTotalDisplayUploads = $recentUploadsQuery->count(); From a12ebf2cb1b10388b1315b468c04decd5005d529 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 4 Jun 2014 18:23:18 -0400 Subject: [PATCH 162/310] CC-5836: Status page still reports media-monitor even AA enabled --- airtime_mvc/application/controllers/SystemstatusController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/controllers/SystemstatusController.php b/airtime_mvc/application/controllers/SystemstatusController.php index 496dae6255..dfc2d019b6 100644 --- a/airtime_mvc/application/controllers/SystemstatusController.php +++ b/airtime_mvc/application/controllers/SystemstatusController.php @@ -16,7 +16,7 @@ public function indexAction() $services = array( "pypo"=>Application_Model_Systemstatus::GetPypoStatus(), "liquidsoap"=>Application_Model_Systemstatus::GetLiquidsoapStatus(), - "media-monitor"=>Application_Model_Systemstatus::GetMediaMonitorStatus(), + //"media-monitor"=>Application_Model_Systemstatus::GetMediaMonitorStatus(), ); $partitions = Application_Model_Systemstatus::GetDiskInfo(); From e5a74e7285abc845b170b47ffc26ece137e9e152 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 11 Jun 2014 13:35:10 -0400 Subject: [PATCH 163/310] Fix error due to bad exception throwing --- .../application/modules/rest/controllers/MediaController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index f88c397d13..1604d1262b 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -409,7 +409,7 @@ private function validateRequestData($file, &$whiteList) } if (!$fileForm->isValidPartial($whiteList)) { - throw Exception("Data validation failed"); + throw new Exception("Data validation failed"); } } catch (Exception $e) { $errors = $fileForm->getErrors(); From aeb3bb7aa0d8c5b744e3794de0fba2db4049301f Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 4 Jul 2014 16:34:00 -0400 Subject: [PATCH 164/310] SAAS-447: Cloud Storage Added resource_id column to cc_files table --- .../models/airtime/map/CcFilesTableMap.php | 1 + .../models/airtime/om/BaseCcFiles.php | 50 ++++++++++++++++++- .../models/airtime/om/BaseCcFilesPeer.php | 31 +++++++----- .../models/airtime/om/BaseCcFilesQuery.php | 26 ++++++++++ airtime_mvc/build/schema.xml | 1 + airtime_mvc/build/sql/schema.sql | 1 + 6 files changed, 96 insertions(+), 14 deletions(-) diff --git a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php index e9ddfeb9af..cfe0830fb3 100644 --- a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php @@ -108,6 +108,7 @@ public function initialize() $this->addColumn('HIDDEN', 'DbHidden', 'BOOLEAN', false, null, false); $this->addColumn('IS_SCHEDULED', 'DbIsScheduled', 'BOOLEAN', false, null, false); $this->addColumn('IS_PLAYLIST', 'DbIsPlaylist', 'BOOLEAN', false, null, false); + $this->addColumn('RESOURCE_ID', 'DbResourceId', 'LONGVARCHAR', false, null, null); // validators } // initialize() diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php index 523e27e280..0277866240 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php @@ -458,6 +458,12 @@ abstract class BaseCcFiles extends BaseObject implements Persistent */ protected $is_playlist; + /** + * The value for the resource_id field. + * @var string + */ + protected $resource_id; + /** * @var CcSubjs */ @@ -1338,6 +1344,16 @@ public function getDbIsPlaylist() return $this->is_playlist; } + /** + * Get the [resource_id] column value. + * + * @return string + */ + public function getDbResourceId() + { + return $this->resource_id; + } + /** * Set the value of [id] column. * @@ -2866,6 +2882,26 @@ public function setDbIsPlaylist($v) return $this; } // setDbIsPlaylist() + /** + * Set the value of [resource_id] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbResourceId($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->resource_id !== $v) { + $this->resource_id = $v; + $this->modifiedColumns[] = CcFilesPeer::RESOURCE_ID; + } + + return $this; + } // setDbResourceId() + /** * Indicates whether the columns in this object are only set to default values. * @@ -3024,6 +3060,7 @@ public function hydrate($row, $startcol = 0, $rehydrate = false) $this->hidden = ($row[$startcol + 67] !== null) ? (boolean) $row[$startcol + 67] : null; $this->is_scheduled = ($row[$startcol + 68] !== null) ? (boolean) $row[$startcol + 68] : null; $this->is_playlist = ($row[$startcol + 69] !== null) ? (boolean) $row[$startcol + 69] : null; + $this->resource_id = ($row[$startcol + 70] !== null) ? (string) $row[$startcol + 70] : null; $this->resetModified(); $this->setNew(false); @@ -3032,7 +3069,7 @@ public function hydrate($row, $startcol = 0, $rehydrate = false) $this->ensureConsistency(); } - return $startcol + 70; // 70 = CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 71; // 71 = CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating CcFiles object", $e); @@ -3693,6 +3730,9 @@ public function getByPosition($pos) case 69: return $this->getDbIsPlaylist(); break; + case 70: + return $this->getDbResourceId(); + break; default: return null; break; @@ -3787,6 +3827,7 @@ public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColum $keys[67] => $this->getDbHidden(), $keys[68] => $this->getDbIsScheduled(), $keys[69] => $this->getDbIsPlaylist(), + $keys[70] => $this->getDbResourceId(), ); if ($includeForeignObjects) { if (null !== $this->aFkOwner) { @@ -4039,6 +4080,9 @@ public function setByPosition($pos, $value) case 69: $this->setDbIsPlaylist($value); break; + case 70: + $this->setDbResourceId($value); + break; } // switch() } @@ -4133,6 +4177,7 @@ public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) if (array_key_exists($keys[67], $arr)) $this->setDbHidden($arr[$keys[67]]); if (array_key_exists($keys[68], $arr)) $this->setDbIsScheduled($arr[$keys[68]]); if (array_key_exists($keys[69], $arr)) $this->setDbIsPlaylist($arr[$keys[69]]); + if (array_key_exists($keys[70], $arr)) $this->setDbResourceId($arr[$keys[70]]); } /** @@ -4214,6 +4259,7 @@ public function buildCriteria() if ($this->isColumnModified(CcFilesPeer::HIDDEN)) $criteria->add(CcFilesPeer::HIDDEN, $this->hidden); if ($this->isColumnModified(CcFilesPeer::IS_SCHEDULED)) $criteria->add(CcFilesPeer::IS_SCHEDULED, $this->is_scheduled); if ($this->isColumnModified(CcFilesPeer::IS_PLAYLIST)) $criteria->add(CcFilesPeer::IS_PLAYLIST, $this->is_playlist); + if ($this->isColumnModified(CcFilesPeer::RESOURCE_ID)) $criteria->add(CcFilesPeer::RESOURCE_ID, $this->resource_id); return $criteria; } @@ -4344,6 +4390,7 @@ public function copyInto($copyObj, $deepCopy = false) $copyObj->setDbHidden($this->hidden); $copyObj->setDbIsScheduled($this->is_scheduled); $copyObj->setDbIsPlaylist($this->is_playlist); + $copyObj->setDbResourceId($this->resource_id); if ($deepCopy) { // important: temporarily setNew(false) because this affects the behavior of @@ -5392,6 +5439,7 @@ public function clear() $this->hidden = null; $this->is_scheduled = null; $this->is_playlist = null; + $this->resource_id = null; $this->alreadyInSave = false; $this->alreadyInValidation = false; $this->clearAllReferences(); diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php index dd2e9bec5e..faa6af5590 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php @@ -26,7 +26,7 @@ abstract class BaseCcFilesPeer { const TM_CLASS = 'CcFilesTableMap'; /** The total number of columns. */ - const NUM_COLUMNS = 70; + const NUM_COLUMNS = 71; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -241,6 +241,9 @@ abstract class BaseCcFilesPeer { /** the column name for the IS_PLAYLIST field */ const IS_PLAYLIST = 'cc_files.IS_PLAYLIST'; + /** the column name for the RESOURCE_ID field */ + const RESOURCE_ID = 'cc_files.RESOURCE_ID'; + /** * An identiy map to hold any loaded instances of CcFiles objects. * This must be public so that other peer classes can access this when hydrating from JOIN @@ -257,12 +260,12 @@ abstract class BaseCcFilesPeer { * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbImportStatus', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbImportStatus', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::NAME, self::MIME, self::FTYPE, self::DIRECTORY, self::FILEPATH, self::IMPORT_STATUS, self::CURRENTLYACCESSING, self::EDITEDBY, self::MTIME, self::UTIME, self::LPTIME, self::MD5, self::TRACK_TITLE, self::ARTIST_NAME, self::BIT_RATE, self::SAMPLE_RATE, self::FORMAT, self::LENGTH, self::ALBUM_TITLE, self::GENRE, self::COMMENTS, self::YEAR, self::TRACK_NUMBER, self::CHANNELS, self::URL, self::BPM, self::RATING, self::ENCODED_BY, self::DISC_NUMBER, self::MOOD, self::LABEL, self::COMPOSER, self::ENCODER, self::CHECKSUM, self::LYRICS, self::ORCHESTRA, self::CONDUCTOR, self::LYRICIST, self::ORIGINAL_LYRICIST, self::RADIO_STATION_NAME, self::INFO_URL, self::ARTIST_URL, self::AUDIO_SOURCE_URL, self::RADIO_STATION_URL, self::BUY_THIS_URL, self::ISRC_NUMBER, self::CATALOG_NUMBER, self::ORIGINAL_ARTIST, self::COPYRIGHT, self::REPORT_DATETIME, self::REPORT_LOCATION, self::REPORT_ORGANIZATION, self::SUBJECT, self::CONTRIBUTOR, self::LANGUAGE, self::FILE_EXISTS, self::SOUNDCLOUD_ID, self::SOUNDCLOUD_ERROR_CODE, self::SOUNDCLOUD_ERROR_MSG, self::SOUNDCLOUD_LINK_TO_FILE, self::SOUNDCLOUD_UPLOAD_TIME, self::REPLAY_GAIN, self::OWNER_ID, self::CUEIN, self::CUEOUT, self::SILAN_CHECK, self::HIDDEN, self::IS_SCHEDULED, self::IS_PLAYLIST, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'IMPORT_STATUS', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'import_status', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, ) + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbImportStatus', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', 'DbResourceId', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbImportStatus', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', 'dbResourceId', ), + BasePeer::TYPE_COLNAME => array (self::ID, self::NAME, self::MIME, self::FTYPE, self::DIRECTORY, self::FILEPATH, self::IMPORT_STATUS, self::CURRENTLYACCESSING, self::EDITEDBY, self::MTIME, self::UTIME, self::LPTIME, self::MD5, self::TRACK_TITLE, self::ARTIST_NAME, self::BIT_RATE, self::SAMPLE_RATE, self::FORMAT, self::LENGTH, self::ALBUM_TITLE, self::GENRE, self::COMMENTS, self::YEAR, self::TRACK_NUMBER, self::CHANNELS, self::URL, self::BPM, self::RATING, self::ENCODED_BY, self::DISC_NUMBER, self::MOOD, self::LABEL, self::COMPOSER, self::ENCODER, self::CHECKSUM, self::LYRICS, self::ORCHESTRA, self::CONDUCTOR, self::LYRICIST, self::ORIGINAL_LYRICIST, self::RADIO_STATION_NAME, self::INFO_URL, self::ARTIST_URL, self::AUDIO_SOURCE_URL, self::RADIO_STATION_URL, self::BUY_THIS_URL, self::ISRC_NUMBER, self::CATALOG_NUMBER, self::ORIGINAL_ARTIST, self::COPYRIGHT, self::REPORT_DATETIME, self::REPORT_LOCATION, self::REPORT_ORGANIZATION, self::SUBJECT, self::CONTRIBUTOR, self::LANGUAGE, self::FILE_EXISTS, self::SOUNDCLOUD_ID, self::SOUNDCLOUD_ERROR_CODE, self::SOUNDCLOUD_ERROR_MSG, self::SOUNDCLOUD_LINK_TO_FILE, self::SOUNDCLOUD_UPLOAD_TIME, self::REPLAY_GAIN, self::OWNER_ID, self::CUEIN, self::CUEOUT, self::SILAN_CHECK, self::HIDDEN, self::IS_SCHEDULED, self::IS_PLAYLIST, self::RESOURCE_ID, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'IMPORT_STATUS', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', 'RESOURCE_ID', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'import_status', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', 'resource_id', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, ) ); /** @@ -272,12 +275,12 @@ abstract class BaseCcFilesPeer { * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbImportStatus' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbImportStatus' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::NAME => 1, self::MIME => 2, self::FTYPE => 3, self::DIRECTORY => 4, self::FILEPATH => 5, self::IMPORT_STATUS => 6, self::CURRENTLYACCESSING => 7, self::EDITEDBY => 8, self::MTIME => 9, self::UTIME => 10, self::LPTIME => 11, self::MD5 => 12, self::TRACK_TITLE => 13, self::ARTIST_NAME => 14, self::BIT_RATE => 15, self::SAMPLE_RATE => 16, self::FORMAT => 17, self::LENGTH => 18, self::ALBUM_TITLE => 19, self::GENRE => 20, self::COMMENTS => 21, self::YEAR => 22, self::TRACK_NUMBER => 23, self::CHANNELS => 24, self::URL => 25, self::BPM => 26, self::RATING => 27, self::ENCODED_BY => 28, self::DISC_NUMBER => 29, self::MOOD => 30, self::LABEL => 31, self::COMPOSER => 32, self::ENCODER => 33, self::CHECKSUM => 34, self::LYRICS => 35, self::ORCHESTRA => 36, self::CONDUCTOR => 37, self::LYRICIST => 38, self::ORIGINAL_LYRICIST => 39, self::RADIO_STATION_NAME => 40, self::INFO_URL => 41, self::ARTIST_URL => 42, self::AUDIO_SOURCE_URL => 43, self::RADIO_STATION_URL => 44, self::BUY_THIS_URL => 45, self::ISRC_NUMBER => 46, self::CATALOG_NUMBER => 47, self::ORIGINAL_ARTIST => 48, self::COPYRIGHT => 49, self::REPORT_DATETIME => 50, self::REPORT_LOCATION => 51, self::REPORT_ORGANIZATION => 52, self::SUBJECT => 53, self::CONTRIBUTOR => 54, self::LANGUAGE => 55, self::FILE_EXISTS => 56, self::SOUNDCLOUD_ID => 57, self::SOUNDCLOUD_ERROR_CODE => 58, self::SOUNDCLOUD_ERROR_MSG => 59, self::SOUNDCLOUD_LINK_TO_FILE => 60, self::SOUNDCLOUD_UPLOAD_TIME => 61, self::REPLAY_GAIN => 62, self::OWNER_ID => 63, self::CUEIN => 64, self::CUEOUT => 65, self::SILAN_CHECK => 66, self::HIDDEN => 67, self::IS_SCHEDULED => 68, self::IS_PLAYLIST => 69, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'IMPORT_STATUS' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'import_status' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, ) + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbImportStatus' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, 'DbResourceId' => 70, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbImportStatus' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, 'dbResourceId' => 70, ), + BasePeer::TYPE_COLNAME => array (self::ID => 0, self::NAME => 1, self::MIME => 2, self::FTYPE => 3, self::DIRECTORY => 4, self::FILEPATH => 5, self::IMPORT_STATUS => 6, self::CURRENTLYACCESSING => 7, self::EDITEDBY => 8, self::MTIME => 9, self::UTIME => 10, self::LPTIME => 11, self::MD5 => 12, self::TRACK_TITLE => 13, self::ARTIST_NAME => 14, self::BIT_RATE => 15, self::SAMPLE_RATE => 16, self::FORMAT => 17, self::LENGTH => 18, self::ALBUM_TITLE => 19, self::GENRE => 20, self::COMMENTS => 21, self::YEAR => 22, self::TRACK_NUMBER => 23, self::CHANNELS => 24, self::URL => 25, self::BPM => 26, self::RATING => 27, self::ENCODED_BY => 28, self::DISC_NUMBER => 29, self::MOOD => 30, self::LABEL => 31, self::COMPOSER => 32, self::ENCODER => 33, self::CHECKSUM => 34, self::LYRICS => 35, self::ORCHESTRA => 36, self::CONDUCTOR => 37, self::LYRICIST => 38, self::ORIGINAL_LYRICIST => 39, self::RADIO_STATION_NAME => 40, self::INFO_URL => 41, self::ARTIST_URL => 42, self::AUDIO_SOURCE_URL => 43, self::RADIO_STATION_URL => 44, self::BUY_THIS_URL => 45, self::ISRC_NUMBER => 46, self::CATALOG_NUMBER => 47, self::ORIGINAL_ARTIST => 48, self::COPYRIGHT => 49, self::REPORT_DATETIME => 50, self::REPORT_LOCATION => 51, self::REPORT_ORGANIZATION => 52, self::SUBJECT => 53, self::CONTRIBUTOR => 54, self::LANGUAGE => 55, self::FILE_EXISTS => 56, self::SOUNDCLOUD_ID => 57, self::SOUNDCLOUD_ERROR_CODE => 58, self::SOUNDCLOUD_ERROR_MSG => 59, self::SOUNDCLOUD_LINK_TO_FILE => 60, self::SOUNDCLOUD_UPLOAD_TIME => 61, self::REPLAY_GAIN => 62, self::OWNER_ID => 63, self::CUEIN => 64, self::CUEOUT => 65, self::SILAN_CHECK => 66, self::HIDDEN => 67, self::IS_SCHEDULED => 68, self::IS_PLAYLIST => 69, self::RESOURCE_ID => 70, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'IMPORT_STATUS' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, 'RESOURCE_ID' => 70, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'import_status' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, 'resource_id' => 70, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, ) ); /** @@ -419,6 +422,7 @@ public static function addSelectColumns(Criteria $criteria, $alias = null) $criteria->addSelectColumn(CcFilesPeer::HIDDEN); $criteria->addSelectColumn(CcFilesPeer::IS_SCHEDULED); $criteria->addSelectColumn(CcFilesPeer::IS_PLAYLIST); + $criteria->addSelectColumn(CcFilesPeer::RESOURCE_ID); } else { $criteria->addSelectColumn($alias . '.ID'); $criteria->addSelectColumn($alias . '.NAME'); @@ -490,6 +494,7 @@ public static function addSelectColumns(Criteria $criteria, $alias = null) $criteria->addSelectColumn($alias . '.HIDDEN'); $criteria->addSelectColumn($alias . '.IS_SCHEDULED'); $criteria->addSelectColumn($alias . '.IS_PLAYLIST'); + $criteria->addSelectColumn($alias . '.RESOURCE_ID'); } } diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php index e939859222..dbac410a4a 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php @@ -76,6 +76,7 @@ * @method CcFilesQuery orderByDbHidden($order = Criteria::ASC) Order by the hidden column * @method CcFilesQuery orderByDbIsScheduled($order = Criteria::ASC) Order by the is_scheduled column * @method CcFilesQuery orderByDbIsPlaylist($order = Criteria::ASC) Order by the is_playlist column + * @method CcFilesQuery orderByDbResourceId($order = Criteria::ASC) Order by the resource_id column * * @method CcFilesQuery groupByDbId() Group by the id column * @method CcFilesQuery groupByDbName() Group by the name column @@ -147,6 +148,7 @@ * @method CcFilesQuery groupByDbHidden() Group by the hidden column * @method CcFilesQuery groupByDbIsScheduled() Group by the is_scheduled column * @method CcFilesQuery groupByDbIsPlaylist() Group by the is_playlist column + * @method CcFilesQuery groupByDbResourceId() Group by the resource_id column * * @method CcFilesQuery leftJoin($relation) Adds a LEFT JOIN clause to the query * @method CcFilesQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query @@ -257,6 +259,7 @@ * @method CcFiles findOneByDbHidden(boolean $hidden) Return the first CcFiles filtered by the hidden column * @method CcFiles findOneByDbIsScheduled(boolean $is_scheduled) Return the first CcFiles filtered by the is_scheduled column * @method CcFiles findOneByDbIsPlaylist(boolean $is_playlist) Return the first CcFiles filtered by the is_playlist column + * @method CcFiles findOneByDbResourceId(string $resource_id) Return the first CcFiles filtered by the resource_id column * * @method array findByDbId(int $id) Return CcFiles objects filtered by the id column * @method array findByDbName(string $name) Return CcFiles objects filtered by the name column @@ -328,6 +331,7 @@ * @method array findByDbHidden(boolean $hidden) Return CcFiles objects filtered by the hidden column * @method array findByDbIsScheduled(boolean $is_scheduled) Return CcFiles objects filtered by the is_scheduled column * @method array findByDbIsPlaylist(boolean $is_playlist) Return CcFiles objects filtered by the is_playlist column + * @method array findByDbResourceId(string $resource_id) Return CcFiles objects filtered by the resource_id column * * @package propel.generator.airtime.om */ @@ -2100,6 +2104,28 @@ public function filterByDbIsPlaylist($dbIsPlaylist = null, $comparison = null) return $this->addUsingAlias(CcFilesPeer::IS_PLAYLIST, $dbIsPlaylist, $comparison); } + /** + * Filter the query on the resource_id column + * + * @param string $dbResourceId The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbResourceId($dbResourceId = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbResourceId)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbResourceId)) { + $dbResourceId = str_replace('*', '%', $dbResourceId); + $comparison = Criteria::LIKE; + } + } + return $this->addUsingAlias(CcFilesPeer::RESOURCE_ID, $dbResourceId, $comparison); + } + /** * Filter the query by a related CcSubjs object * diff --git a/airtime_mvc/build/schema.xml b/airtime_mvc/build/schema.xml index 8cf6e6987c..1c4a232b93 100644 --- a/airtime_mvc/build/schema.xml +++ b/airtime_mvc/build/schema.xml @@ -82,6 +82,7 @@ + diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index a7a4c0d669..3ae4497a18 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -100,6 +100,7 @@ CREATE TABLE "cc_files" "hidden" BOOLEAN default 'f', "is_scheduled" BOOLEAN default 'f', "is_playlist" BOOLEAN default 'f', + "resource_id" TEXT, PRIMARY KEY ("id") ); From 2b704178ea5c84b5377e7b66165487716348324a Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 4 Jul 2014 16:35:01 -0400 Subject: [PATCH 165/310] Set resource_id and directory to 'cloud' type on PUT request --- .../modules/rest/controllers/MediaController.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index f88c397d13..0489d086e5 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -254,7 +254,13 @@ public function putAction() $file->setDbFilepath($filePathRelativeToStor); $file->setDbDirectory(1); //1 corresponds to the default stor/imported directory. } - } + } else if (isset($requestData["s3_object_name"])) { + $cloud_cc_music_dir = CcMusicDirsQuery::create() + ->filterByType("cloud") + ->findOne(); + $file->setDbDirectory($cloud_cc_music_dir->getId()); + $file->setDbResourceId($requestData["s3_object_name"]); + } $now = new DateTime("now", new DateTimeZone("UTC")); $file->setDbMtime($now); From 1393bad01436f7e87f1b9e33af19e2a3b3e3d4d2 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 4 Jul 2014 16:38:58 -0400 Subject: [PATCH 166/310] Modified config file variables to describe not only rabbitmq settings Removed filemover_analyzer functionality and replaced with an uploader function into Amazon s3 --- .../airtime_analyzer/airtime_analyzer.py | 6 +-- .../airtime_analyzer/analyzer_pipeline.py | 6 ++- .../airtime_analyzer/filemover_analyzer.py | 45 ++++++++++++++++++- .../airtime_analyzer/message_listener.py | 21 ++++++--- .../airtime_analyzer/bin/airtime_analyzer | 12 ++--- 5 files changed, 70 insertions(+), 20 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py index bb76ba465b..567c31c987 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py @@ -23,7 +23,7 @@ class AirtimeAnalyzerServer: # Variables _log_level = logging.INFO - def __init__(self, rmq_config_path, http_retry_queue_path, debug=False): + def __init__(self, config_path, http_retry_queue_path, debug=False): # Dump a stacktrace with 'kill -SIGUSR2 ' signal.signal(signal.SIGUSR2, lambda sig, frame: AirtimeAnalyzerServer.dump_stacktrace()) @@ -32,14 +32,14 @@ def __init__(self, rmq_config_path, http_retry_queue_path, debug=False): self.setup_logging(debug) # Read our config file - rabbitmq_config = self.read_config_file(rmq_config_path) + config = self.read_config_file(config_path) # Start up the StatusReporter process StatusReporter.start_thread(http_retry_queue_path) # Start listening for RabbitMQ messages telling us about newly # uploaded files. This blocks until we recieve a shutdown signal. - self._msg_listener = MessageListener(rabbitmq_config) + self._msg_listener = MessageListener(config) StatusReporter.stop_thread() diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 39c558bacc..89513fd4c7 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -17,7 +17,8 @@ class AnalyzerPipeline: """ @staticmethod - def run_analysis(queue, audio_file_path, import_directory, original_filename): + def run_analysis(queue, audio_file_path, import_directory, original_filename, + s3_bucket, s3_api_key, s3_api_key_secret): """Analyze and import an audio file, and put all extracted metadata into queue. Keyword arguments: @@ -51,7 +52,8 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): # First, we extract the ID3 tags and other metadata: metadata = dict() metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) - metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) + metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata, + s3_bucket, s3_api_key, s3_api_key_secret) metadata["import_status"] = 0 # imported # Note that the queue we're putting the results into is our interprocess communication diff --git a/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py index de296e092f..8d899152fc 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py @@ -18,7 +18,8 @@ def analyze(audio_file_path, metadata): raise Exception("Use FileMoverAnalyzer.move() instead.") @staticmethod - def move(audio_file_path, import_directory, original_filename, metadata): + def move(audio_file_path, import_directory, original_filename, metadata, + s3_bucket, s3_api_key, s3_api_key_secret): """Move the file at audio_file_path over into the import_directory/import, renaming it to original_filename. @@ -41,10 +42,13 @@ def move(audio_file_path, import_directory, original_filename, metadata): #Import the file over to it's final location. # TODO: Also, handle the case where the move fails and write some code # to possibly move the file to problem_files. - + + #cloud storage doesn't need this + ''' max_dir_len = 32 max_file_len = 32 final_file_path = import_directory + if metadata.has_key("artist_name"): final_file_path += "/" + metadata["artist_name"][0:max_dir_len] # truncating with array slicing if metadata.has_key("album_title"): @@ -60,6 +64,7 @@ def move(audio_file_path, import_directory, original_filename, metadata): #the wrong information for the file we just overwrote (eg. the song length would be wrong!) #If the final file path is the same as the file we've been told to import (which #you often do when you're debugging), then don't move the file at all. + if os.path.exists(final_file_path): if os.path.samefile(audio_file_path, final_file_path): metadata["full_path"] = final_file_path @@ -74,12 +79,48 @@ def move(audio_file_path, import_directory, original_filename, metadata): #Ensure the full path to the file exists mkdir_p(os.path.dirname(final_file_path)) + ''' + + file_base_name = os.path.basename(audio_file_path) + file_name, extension = os.path.splitext(file_base_name) + object_name = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension) + + from libcloud.storage.types import Provider, ContainerDoesNotExistError + from libcloud.storage.providers import get_driver + + cls = get_driver(Provider.S3) + driver = cls(s3_api_key, s3_api_key_secret) + + try: + container = driver.get_container(s3_bucket) + except ContainerDoesNotExistError: + container = driver.create_container(s3_bucket) + + extra = {'meta_data': {'filename': file_base_name}} + #libcloud complains when float objects are in metadata + #extra = {'meta_data': metadata} + + with open(audio_file_path, 'rb') as iterator: + obj = driver.upload_object_via_stream(iterator=iterator, + container=container, + object_name=object_name, + extra=extra) + + #remove file from organize directory + try: + os.remove(audio_file_path) + except OSError: + pass + #cloud storage doesn't need this + ''' #Move the file into its final destination directory logging.debug("Moving %s to %s" % (audio_file_path, final_file_path)) shutil.move(audio_file_path, final_file_path) metadata["full_path"] = final_file_path + ''' + metadata["s3_object_name"] = object_name return metadata def mkdir_p(path): diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 97613e81fc..9dd25a436c 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -73,6 +73,12 @@ def __init__(self, config): self._password = config.get(RMQ_CONFIG_SECTION, 'password') self._vhost = config.get(RMQ_CONFIG_SECTION, 'vhost') + # Read the S3 API setting from the config file + S3_CONFIG_SECTION = "s3" + self._s3_bucket = config.get(S3_CONFIG_SECTION, 'bucket') + self._s3_api_key = config.get(S3_CONFIG_SECTION, 'api_key') + self._s3_api_key_secret = config.get(S3_CONFIG_SECTION, 'api_key_secret') + # Set up a signal handler so we can shutdown gracefully # For some reason, this signal handler must be set up here. I'd rather # put it in AirtimeAnalyzerServer, but it doesn't work there (something to do @@ -111,7 +117,7 @@ def connect_to_messaging_server(self): self._channel.queue_bind(exchange=EXCHANGE, queue=QUEUE, routing_key=ROUTING_KEY) logging.info(" Listening for messages...") - self._channel.basic_consume(MessageListener.msg_received_callback, + self._channel.basic_consume(self.msg_received_callback, queue=QUEUE, no_ack=False) def wait_for_messages(self): @@ -128,8 +134,8 @@ def graceful_shutdown(self, signum, frame): self._shutdown = True self.disconnect_from_messaging_server() - @staticmethod - def msg_received_callback(channel, method_frame, header_frame, body): + #@staticmethod + def msg_received_callback(self, channel, method_frame, header_frame, body): ''' A callback method that runs when a RabbitMQ message is received. Here we parse the message, spin up an analyzer process, and report the @@ -160,7 +166,7 @@ def msg_received_callback(channel, method_frame, header_frame, body): callback_url = msg_dict["callback_url"] api_key = msg_dict["api_key"] - audio_metadata = MessageListener.spawn_analyzer_process(audio_file_path, import_directory, original_filename) + audio_metadata = self.spawn_analyzer_process(audio_file_path, import_directory, original_filename) StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) except KeyError as e: @@ -198,12 +204,13 @@ def msg_received_callback(channel, method_frame, header_frame, body): # If we don't ack, then RabbitMQ will redeliver the message in the future. channel.basic_ack(delivery_tag=method_frame.delivery_tag) - @staticmethod - def spawn_analyzer_process(audio_file_path, import_directory, original_filename): + #@staticmethod + def spawn_analyzer_process(self, audio_file_path, import_directory, original_filename): ''' Spawn a child process to analyze and import a new audio file. ''' q = multiprocessing.Queue() p = multiprocessing.Process(target=AnalyzerPipeline.run_analysis, - args=(q, audio_file_path, import_directory, original_filename)) + args=(q, audio_file_path, import_directory, original_filename, + self._s3_bucket, self._s3_api_key, self._s3_api_key_secret)) p.start() p.join() if p.exitcode == 0: diff --git a/python_apps/airtime_analyzer/bin/airtime_analyzer b/python_apps/airtime_analyzer/bin/airtime_analyzer index 6e8eab367f..ff17fc2f25 100755 --- a/python_apps/airtime_analyzer/bin/airtime_analyzer +++ b/python_apps/airtime_analyzer/bin/airtime_analyzer @@ -17,28 +17,28 @@ def run(): parser = argparse.ArgumentParser() parser.add_argument("-d", "--daemon", help="run as a daemon", action="store_true") parser.add_argument("--debug", help="log full debugging output", action="store_true") - parser.add_argument("--rmq-config-file", help="specify a configuration file with RabbitMQ settings (default is %s)" % DEFAULT_CONFIG_PATH) + parser.add_argument("--config-file", help="specify a configuration file with RabbitMQ settings (default is %s)" % DEFAULT_CONFIG_PATH) parser.add_argument("--http-retry-queue-file", help="specify where incompleted HTTP requests will be serialized (default is %s)" % DEFAULT_HTTP_RETRY_PATH) args = parser.parse_args() check_if_media_monitor_is_running() #Default config file path - rmq_config_path = DEFAULT_CONFIG_PATH + config_path = DEFAULT_CONFIG_PATH http_retry_queue_path = DEFAULT_HTTP_RETRY_PATH - if args.rmq_config_file: - rmq_config_path = args.rmq_config_file + if args.config_file: + config_path = args.config_file if args.http_retry_queue_file: http_retry_queue_path = args.http_retry_queue_file if args.daemon: with daemon.DaemonContext(): - aa.AirtimeAnalyzerServer(rmq_config_path=rmq_config_path, + aa.AirtimeAnalyzerServer(config_path=config_path, http_retry_queue_path=http_retry_queue_path, debug=args.debug) else: # Run without daemonizing - aa.AirtimeAnalyzerServer(rmq_config_path=rmq_config_path, + aa.AirtimeAnalyzerServer(config_path=config_path, http_retry_queue_path=http_retry_queue_path, debug=args.debug) From e84f765696117b73de5e58a993543b2b31bf0982 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 7 Jul 2014 15:53:25 -0400 Subject: [PATCH 167/310] Better FileMover permissions unit test (passes as root) --- python_apps/airtime_analyzer/tests/filemover_analyzer_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/tests/filemover_analyzer_tests.py b/python_apps/airtime_analyzer/tests/filemover_analyzer_tests.py index 7591442c04..dbdbb2feb3 100644 --- a/python_apps/airtime_analyzer/tests/filemover_analyzer_tests.py +++ b/python_apps/airtime_analyzer/tests/filemover_analyzer_tests.py @@ -104,7 +104,7 @@ def test_double_duplicate_files(): @raises(OSError) def test_bad_permissions_destination_dir(): filename = os.path.basename(DEFAULT_AUDIO_FILE) - dest_dir = u'/var/foobar' + dest_dir = u'/sys/foobar' # /sys is using sysfs on Linux, which is unwritable FileMoverAnalyzer.move(DEFAULT_AUDIO_FILE, dest_dir, filename, dict()) #Move the file back shutil.move(os.path.join(dest_dir, filename), DEFAULT_AUDIO_FILE) From d2e83252585090205d3086c2c71dfdffeb09b93a Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 10 Jul 2014 17:31:27 -0400 Subject: [PATCH 168/310] CC-5891: Install apache-libcloud under virtualenv --- .../airtime_virtual_env.pybundle | Bin 2222106 -> 3540495 bytes python_apps/python-virtualenv/requirements | 1 + 2 files changed, 1 insertion(+) diff --git a/python_apps/python-virtualenv/airtime_virtual_env.pybundle b/python_apps/python-virtualenv/airtime_virtual_env.pybundle index 109804252c54eeb92a9fd04c28ae73d7b372baab..201cecc3bff5390eead1f112f1eeca63e333cce3 100644 GIT binary patch delta 1473717 zcmZU*2RxPG-#>0U&f%P6@4d=i*)k%Tky)awjAUkyBa)GkksFEZ?Cp@9oy?GxO=OQq zq5sK!zTfBf{GVPgz1}|8XJ6~SKi73j8xF^fi=M=V>uKQ=P~qUs1lae6+kcRaw24o(Lko!E)cWB~|TtO52%h%OkY z^@khcG1db$EyQgsOwmP1W8qy-L!z)3INc_pjTi-zLh_{ji!Fa#^08^lhIE-8k$LqQ+rJK%2Eq)+~ZCt|I=&4J&* zTKn7xH^;^+*ak1ddbW}Wk0QJ@@NitM>+0YLM z;q2I~8TP?vunx(uz}vC#Viqn-4B81kg&Shy(A$R#K*;{rGzD;t$tVF4RRjybMvB08 z9~~uP5F6P`Aw&~aXDI?<2YST&WcpJ*E)Gr~0S=A?z^;nm1}dJj6QUXT5kuI1-4;Nk zVP}pD5#kEK_JW-n_$&s+TKGYOcuxuXCqjzw#TwHRNBqG;O({e-mbd>FW-x)gRH_II z&>O((7D68+=0XtHu~JP$h?W1bssWCL;XN`X5XJ0~DS~LX9Ki%mNF6tJ7!bJkpIHef zfZxL!%Myo^VsqI1n@k5g;A?E*71)GGnZtdto%zZbo`X%Y6A_#oJA^7_;UBQPE{bqw z+RNTn=X;%EPlAK9%lWUjInYY`WWHG4&tUK+Y|wUe@O$8pJr3S^uY%#%Wd1jUIMDlC zaAPdLmJs|7;pG?^BpYTez^n`KHMIhV=)Q=8?8(j7k01v{@E|)*MAoy!gJUJL{0n+B2;XPRG_Kt9OY){`!La1H_ z`Q``tF9>FCVb(vKEB}I|0?MP=p+H6~f)!NI9*al zG64^TUr~X4{bXFJcE+SYgCK(0}JCm%72SxQbT|%95+4o@`{f=CtY~4D6#NTlKDgVV zOG#l@u<1QNgN}e2jtpV+*q~B$VPH}KIYU_OWixPH1vUyIAthJ=C=$;LL*rd`j$Zzh z0}9hIQkZo?0>Cwb2?J%Kuy|0wRPjHe&qQF`peS4))`+$C_ZBQ4WZcw-6@lpYHP{h| z!Zcw+mnP)dbBIzgCN3^b=nKJw06{5O38?Oy6bu)uZr~0K4T|FOz$QRsss(EV5xFt! z4~PQf{==85gQcN&Bw!G%8dV`!@1@;}t${rKe~(O~aAEM(j{Dvkc4(9In7K zWmp5*zj2+ATo{d+gE-7UtS0OVAff>y0(Onr;edt$%n39rd<*vZ5*29k!LYWZTS*#*T6#iN|!42q6v**T0mppq<5FxmdQ563jEv%XTOXfLO7U{jX=H z%eCP(3dZ~RQh9jW4;Z@b2Wf>dI1wx{Prm>u3yd55RT#-e1314&5GDV6z+z>EQ2~!x zV5DFG{w%PdOH^>q0>dukxIVB~AOt=*z~;dK-a5h(vF(#)umNyIb+sM}8OC%vF=pw# z0z9*Vu>ckrXVJe+Vbj>ONw~xMu^?-U`*~56ih|%QKutV$$JVXw| zZdU+=2{s9`t}wyixL{0}t?33xOlwBSVoga_ATqFUvI^mVg&y??A1qX>Met#l;N1_1 zg8%TgBJe>7D0Lx1K(&=05i(ffPA5Y5k_gPVBL+eHSxE>fknv{*f&kPBkY*s9LB^mA zga_C>n}iSmHzJ@f7Xi*Q^xt9x7dGacJVXJu!+*a=0HDz8LWD1tX!;(J0TOi!5JXra zLpcJw8l7h$da+^fmLhg>FUM8H2wW)#GuWY+u_XXh%l8OM;FU5NcIWx7Oa|^Uz_2PAn04UY4Kf`tsuDFaI}q*PAOm+OKvR_r%ow1d zLRJ8_9;uMM|3B|JGyrZ7gdRAxgkTqa%qW!ulZkm-69y596-1mM``?zJWCaW!20L~KJ} zzQwIvv7()(e-(0LP5K)zP=B_`+Sjp!O`quH&=HbRX`C_WxoE_$=On!}>D%!LzvHXyM8qbDdp; zM<)U^_<{Xfu!@HXkyMlwHp$E($JE{BmBM09F25W0Hzk~xq)}mkxKKMf)a#^`lwR=* z206`2`vGKi%`+J$3TMIr81Ie_vR)4kRG>M1|_&<4!JT9f=)k}t!wouX9?mO80 zWIE}UL85bmOt;7;N;_H%*%p2W3JHww=T035JTovPPLejabQ7j1gXTQ*Tq=xRE%fXs zsb6)~rF2zJGO`?k&Y=AARR8XjIo#X(8vC(~`?||${i>(GW$y5&wO-AHMrlJ+e`mXR zpHX5Dfu00~MZYIQwXtek?IiWb_CI8Uh_A9_5CpBeR&T25)0LW8s?NFL_3yuqz*CRR z8n!Rkta%T+BVS`er?27_zQmVDV%vlKpX^_%Rt!KR4X+Er`}JwMNO2#R** zX#G$l;z(sY7QRb?Ub<-!S4W%4cXvuIg6VottlF19!e`%r6vI5L+FHTlz0w>*7jKU* z+Yt7!t>^3B<0PS0bj(iO>OxW`t2}3nKc#Am^iL~hxf{%{9rKKfC49aW9{A0Co4Pu#sT&G7uHH+PVgP z3+k6T*S_7ZGN684HReB*-_|hf^v+xS-K?KG*Tv=_rv&H zjCp2gveMl9hY;yuk*jaR{kg(gv}24{jNG_m&UU@Ay>n7OS*?`(!i&r+*{a(i>Ma8#Cj6?`;N;!3xB2=EYxfm3 zmq}kg3a3xTl?<+29cyM?Y$G_pduHRHMt?C0Wjsc}9UG%KCXt`w^GTtX zLk;%nnc)=yYFho=VZ>5l0W?(=*Qbyk$9*&>o+mwLoaz+%JT@L)khz4S6Ay8Q>?R#v zFjH)Eus3%ZqM!~^_^~$&3ihaiL#=82sAlcxueHZ&)11fBzrdA~&I@g$)Tursm3zZR zo!FVON456x*#lEoysu8W)ol;smWg@f`m5S0b^4G8Dy!$LBotC5aSM6mt zk1m<@a!BfX>M4pijSF)4L30bV5s4?Xu#Tf7weY5ck`=YAYEx0>L7+`6;YO;z^w3FZ zwrzvPKlX?H(sbOE?L3~%_8%s2N$&@v%@ACWa!<7S%s4hQ^;(5bf>t$_oY9DfM>=XgeA@aXUOF z5##oPxK%R}-FKYldUV9Jp!Jl`hu|grHf|1HPps&PY~jljR-%v;0~6f)GlaTifk%sZ zuW|0te<_N1tv^l?7HFzrZxGyvFF^Z2Mf07O&MF;=EUM?^%bG6BEHla1dMKRPWXPL?1E=8TqI_wI+Ma3H% z{)&^h09-e#o7s#k25bhYc`y+%iY2vYnQRCvggRbSEY1@S*3K8?7rq4Q4KRVd9k~O9 z$ex?s3hID1#mML6txy|V=Z7>UJQTjMtCHg|u>`0leCUD4zFhEzO zvM_fE4>~+5+d97W>&7Q#e^E>2VCp}9ANd~K5PbjL>g_$%)7^!V28oJ(CJ`;k!0}#2 zt!`@0o`XUrk%2po*9oH&GbAD$^|U0j(i({x+r&EqVJX6oyT7Bd33*Z!2R^j%i0j!XvG03( z$=-+-Te)iLoACCwy=IzCP^{D0$!V-%XQ~GkvD=$pACq9m;#_;JY%D;LUoVV63 zbyDDu>Y?Mbz7h{GPw{Od{6B?A)8Jk#WNbZC{~WvLZ^}FSrHpa8Xt5<;enF&iQ}AI# zYVg{oadEje(+^pEek9UKgfIlk&yDlIEu^$)8E;r4O#%L$A$`C{1E(*AQk_4fPhN&$ zJsx&)gWD^MZp86J?2NMCTGnv7${8KRlj5d2YCn6^_%@~5t~j?*<1N^C=KxB z7bs*BaO_#a#!V8IrlowNWN*GY$`e+-&Edr}6$2~R3}XrytliMO!NK^E} zNRWoDt)KDlg_8>`1@4(ocAIBdd!u>}f4vA~dyzcb_IszeY&1e(SK1w^<&ayTx22Z7 zt?=430=JGd0qPQ(JvFDnXZv;}g~2>H16ApF(Ew%8sv#a)tX1`VID^X-hnMyPr?`$_ z;rM-9fmuulS;WOnicRFwM0ZDJOjDMyT4t-1KpC}&#(SljeMVb8JVg$!JodbRlZa(D z?pPu^0&0K4%=!9?*V&9-jSJ|ddb6!>on+VFk;;htD7pnRcK>645H(Qt z8$yO+dQ8gxWnNS12JOdhEN$o~iwn+p9Bom;X1_;s=d%fdEFC&Sn%rWB7a5X19CjBM zc8%TV%M>FM@TGmo_2eOYz<33z5;W=dDjDr<)@>Gxkn;l-+>*b`>kcgv$8l!!ie##}gnjCt6LH+DC&CwaM& zksno|?bQA`g^<4n`JO&isql7cc-DSJ&xQrd?*-%e!*L=##X0!RC7cimhIOX`(g`V# zh(G!-@6c|xjN8*%Z02X1ehd&vlvCbh-lToB_&xJ&;O}p>;xg*eH~z*fnBkfAz4-v} zxVE7aKh`edh0s*HaBJM8kE9k$-jJk7ZjN+8r9dSq(B`@jDrt1_j6TVBk@>AE+B*;i zT(u|5&-6ZQ=MrSn^Z4}sxn7f9Z<<)f{YGb?;bY|Nps9)WDhZ9_hb+?i<}ebqq2cu0 zoL9%+vc3=JE*kOvEUw>_d@^aEI^)JZa=6XPD~a2a7+-5MRhBb5*k4n&{w7Gcf#RJ1 z6N=_)qDQy<$|^@qSvh@mq13be@9!MUiGqei#cLs-5z(1^ZHGl;TVCV!-XcB;@_RsQD{hT=w>qMJtDyPS0x%PY zY{isvD3H}Bd)q;Hb_+ItnqjWT*RHpJYmzFBJ2jVxb<7l4Frh*6la-$RQWOsqyr%F* z+?~+p$;w2&%Sv>J+qIvH|8qw9@6{5$z6>FRVXGM32<#c-zXMZXwhKW5#B?LD)!)l9 z5~3S{Eh9;HBfvsyVi_JSu-%OSk5@0xTK|dC6Qp3&114jLq)UW$J4LACUBbj|5?Wy6 z7*lJ$WRW>R41g@q9>gtN5blm4=Gj4L+>3Y)!!rCrSc43}+!uuBB@t*SM4o`nHAToY zG7#R&N1EY-kS`l4KmbDgOe7~r1?WhTdLYq>6q$)tdijd}={XVsJV?P5$(z#Iseo4$ z5UkF3P~=l=!3hCJDqKnfdT``*P){;5a-9T(HP4Y+4Df%^(QA}7)nZ=V_oaZ5btDzK z0*+jQgG}Q-$N@qS%E=&;6+!q|68RbLQnXj*?$g$PwLrwBD1Z^A1a4N^i)3mgh)bbTu#XF#-8M!+7qz_!pQuTrCq0jv&zf9LWXDXR?!`9|#~J zP_V!M)1wf;wI0a~npYo09uR{tz8=Yq^{;6Tsf~%TZV4nBJ|WKo3v@A1oZH=)`Wx3}fzI*?xd6cEMg9e3)3qb_$GtoRvsh)C z7Qj?j^#}nW8**MWzAd>rc#d#XF)n@uBP@<-y#|QdkaGi0_sJpXfQRG?*uo<2J@RYV zIGZiWt+9~Bi5z<*gO&H_d(({WAYzZUCKV>CD{7&K8lx1K|01faIi{ZbcxWD>m&$#kf^mrVg(W_ z*GM?=KsYM~tpOo$S)%`E5@;8L(t^!4^3WMV5GGxNekLOSr+)1`Bf%Jx-D{ZsVgrx} zC@s*Y$PPnUo9pXn;fo>%oNGUgT6Dev8m2F~VZT=Dum*ZtAmwdNAwFW&#`dH>SCY#76E zAK2R@(ZuZs-D{$*x;tP7vGUu&+WXwL06?_fsl%g+E8+~4oRgVvz)mIuXW zEspLtnZxmMKeyoD>^OY32-VEb4lrFBb8-G!7EL>cX z|50X~zmSZ<>yARsU0Y9KUjw7;C_m|fQH53C40s@@1fQ z{fM*7((?JAyFpcTJ6|@x4NaU&Of#ywj{s_MJZTN~%E204BGz?iG7Sp0qY zY4YfCRkbg|*kM;ynJ!P>Rqm60m}_h4vSMUaV!k?&y~XHut{~ge-(1Dw*uRmRvjC7VuNzdg*61myp6(#go;7@7t%1K%V7K309l&+eq6pvL#0D=cva9@hKf(+T* zuL;wF)~onoEWgoaT@w?@nty5kME#|>GW5_~o*-BOrwR3>D|JoB(dyorZg$T>M&4Z= zN!IR}PG@a<9`ZG&aGLLXwI6HjeZ-h=okhnrFYDa-PNNV3%^hPIEIN{4c$^w8#4-9M zL33W|&HL2|Ktx4Vgnf=7GkfBw{>x7(DR%gqH^>Nm3j9iH3g+Qa*1Tqmrg57!XM{gz z^Ycm_Wt0QTEy=UIwYt7Z{`;3qTz#oPCd#}A(!O`azdT$kLNducVCK@7RF5(3AyKWO zwB;4iMOyjw7R^!(%V*)tk+W$`Xi$G2IXUr;IkDBGTUa|0yckDg8 z)mx%G-*#tmZ!PLdb8nn@#fIG`t2wHN*SVUDpd&vX#gqD#|4XE{Yx2%}u_&=NV69y@ zp+UvY9927!{I03iBrJ-KLMDf+Lmyf2q(ekmN4-W%QTH7(KLu)iYwZ_AQpz$@)x!0< z&mpn7qd_?SL{huJ1E)_mA+c4|OkSv5aTGruO?K}3nZRSxI!An#wrGwb$nd%DsNp^itCq&F&u0@*HDF(2}P21a39}$Og@^K$5`|9;1rsq$?F1~{=pKE1X$w_0nB6Xd4>#XjDU5Q?&1ish>>*L)e4Q@+1kU1`6UEU^fEA1?yYqFG`hU0Z!- z7;)oAj|KrNA0hqmqP6YU;767tkE?w11scNMq9j-zg&Mj>G)_oG`}>8ltB%~T?yq!J z4TY+6eh`h34NYRcb>w~1LDOj^k?3WmN56%Vv2nX`R0TR@@J2OG$4pe+GMDAzXTb3u z_wW?OZ-VP?esSN1d*s~gddTs9JO#Is+9TS5t^jsTUf z6fyVHrPogP=oy%J_IMc9)Ajol)M%bvx2<-9%Gtl1p{a6{=wOHn;QDRzZlIzoeKCHv zLC!8)T#B&RWb0SrkKjPyxJh=QVf%xubbAcSfVAji{kY-pp|g8K52}f_2-;5#5Y9*) zsmu&tf-hU^sc4j1ynnMl5x&<@2&C;t`rV_sIq~v@wnzGGSiVWwNt-|1)cPXs6y@_~}0=c#z4}9LRcsQ(2~ZCzmjK>ol+mSC7@W z$l7!(<$RqrM35-QqSt-bW(qB9xj_-|qI$yrp$km2^(Vz#uylEM#!VuYYU8X0ueRlf ziXV4+VnZEVg_&^QiU>dVBs!B_I$TYQ@kjNkw|_E!Pw$2B9l;%%xI3f#+eT-N?f93* zO@dhlTO!h9T!pq6fgeAUA8jAA6$-LOw1)I>V4i^7sN?3lmeXX#))xb7XWS_4wk4Z_ z&Uxg{XnS4KPS&(yM!Am_87*=Q57%8bY!QLByHVbQ{Qd($KPbka`lwl!m{)Bm?d=(yT%f3|JpRgdi`%J zcURSJf`Z9NU9MH>!Y`~(>kgIue^ ztuot-4x7En`7G8dZoQSnmgHYcpQX26wXQ`p*aW)qjOzQBRYAzlGQZ0?BdaBv;Cmm3 zn!fFuPwnFtKO!l0D9@h1G4V6^#=zsd<~)*Op+$A*sCP-z!};rl5aD%J|E}IQ*(fWN zJg(Jw#$fQ$ho@tGB|0|3FlP=%p6{?%Q^FrAyXT??m`}8!8ANyYpE<)roeDJMd!mXU zHog?McAm%LZ}bFS-|att2Q}XlkUdAH z@svDUy#?*^-a8KJyxCOJBBboAEcZIvC3pn&Op>l4n*q=uhM}g z(R5)&#Zmb(T<9-qG; z#N5lWBBdLXUW%6WqA zRq<9z<*jW32BN~B@nVHkl6MFI6^abuxv&`YWTX9g%a@<1;GRFP#2}iR_%KxPsvfBY zgKZ7|P3XE#b**~eh6aBD-tmy=-ib&P(TP=eu}9UT7ff+4yq}rHjNbJ#yE2d@emWxt0d@@=S;oA@68r68)6{@&k&c(j+&I(tB z?Rr2Oon3}1Bc8EZNA%lgW4)%R4P>U@Rv6dl6hG%}m%{rQZE^{kXxz8O((*vd;?u34 zn{X8&p=vs-@3@P#Bc?X7~_v?9lVBU zqc3-CRnlpFNpuwdimPTCxr{3RQT*XL?>$x3({v-jQpKl45AMv!LPrNRts}u$&3TWo^`qR{XcSy1;7XZS_nz zHRnXP*bW2jRCJ+=YIT%ojSH*$rbqI2ktWKTq5I;so9Wz~OVbMe?F3v@PiS_&l7_V0 z?VE3688#q`P_aR)`o+(K99^z$j#jwByp}--yYa+Ulc^?6)V9X-!;>U^R;8SxBe{&p zr|*>cdb9Q?Y6g%D-rQZT!SqKjX&mWV*}olCeYvUMU`SBcr@-qFqh$iOv#3AW&EF2( zl~en>GZIM`bE4%JK(F46(qqk9N*_^m3$dEb*Fj7=y<6$&RYScO_4hECUP8HS+t~z# zQiVmZskZdB&-DDzpQO_I9Vyl&IFWBJ&o&kB6#8EDeAG}T;WOLSFXMUQ#@<;BPy(n* zrvpSp*V>CkJkc9f$vMYnVLjNBix zbYsfigotGemJY{C+Vv8_a^JVopI`PIhB2dacsrKqj#S|LnIgzlY9og>pD*)YEM80O ztR_4W)cfn;H)!xjp!U1AOV~X!$vehG(C})?;`I!*UGp~v`b$l)4lZBVF&jfo@8pOcI0M}bu?Ll zQ-QtCb%T8iasigC>#YQV@{Bu4jOpcf&1G$;s=mEwa6zAL%{*z?S1M0<4IzH(W#+0f zSnyMbMM{LWXPVt&gzJ@DXa(UY+L#&P5h&ET+%L-f7f)N6L?Bz#8@2X{R2Nk#Y4FA& z-J$8;ALS=O7in7XdP+O;gfRrMYGX$6LwB9Ma+vyh(Stku6}HgFM|cX&&%5n@UAbj_ z+)OSr^Q9l=pi4-{`B^Q?iI+LL&YOr+!@aTS?bSXv4Su{`oA}W3H|Zf(RwCr9dsFv* z_gqU&xpT6`9p*?p8^($Pq+5%i?Sd4XOz0OpF6KhW`09wvW-9+Pt}??@_K}l z3L`Ya?<*fry!51`T7IIu)T%S=&}n080CA*sI}LI8ITR4mX)D3j8X_(jx_qQu`B}2A z&?+eJja|vMjfn@BWbmC=2RbETPC5jIm3g%5w;mAnMpJTs$jK;0@#vSl@V_oi@CII$ z2PiYR^k`&#ka>}+!>QB0wJgVqT3>DyZwmV{^4n+J&_`+4b?)t^-}|kn`Uz{PJoZ_` zi7g3B9o~`YYTs7fEC-KE4vS*9UF5#`%(7JxmMQE`y}9~b*vEQMZu1zeMsT6M-z9$g zJi&$h){%NT%8c|QJBpW~?npH) z=LU|UWaHOkaz4Vyc)d!z_WS6)7td=l(i{n?=B zgK06*V1bb%k7y@w{qEnkZsm@I@{pwJ1{2caLA+xHlZMZ$Q8?CzW8UajOO{fsi$8vD z{%kOM8Lv;xB5fkw#kWChz0b>DRHfF@x8G@=6R4eGLS8k3JcZdBCRbYR7YkzIuP( zh-~H!e?RYM6MKCjOHZximIL_q#*GGqp{rT`ya%gyi>Qz{bx)Dv#ht9J>U0yO?#KK~ zLe!e#!h9zYZ%!MMd|z!xS{ZJe7xK2sUtKnF+Ar|=uJhd+MgMKQGBQ%fEh;m!ua?!r zd~hzw+C>E!4}0o9A9{Uw$*f-SYo|F}yrS=`O!7;q`R*He@>A4y(jiN>s$R?H+3hEa zl_xGb5`45>SF=U@AhtG)o>TXU7DmS8BDpPihex9ByNgQ=@ZeobN(>n@MrUvy{Q7pi zT07{cuz>Tp1*k6WpoVKD0OvvBKK));M#M>^q*C5Nq)UYc#+4Ig-!=8Z|=KT zCz)h4&hU6^QMyxy?zVor*>)d3cV8yGes`^(cdsJr4dMlyc^!GPVj zgHJrV<|PKNTx0!0qIN3Pvebig*XqzGaWUJ{&fv6#?te!GDQU|ytjU-r_IxUhZg6%m zNp5_es4FpFKJJGTLJ#RVDjsN244^o2X#H*O+w8fS>{3@}rT%;OH1Th-P2XQfhkeVM z*7_x3v7zS5`lh8g@8*X3fcXbrdbp3=D*Fg|t5q)acQQXjK6DzWH(Q@g%#r4LxO{K3 zq4w{|4E;qbDhnl$6f{WJy!nvn;&x@bPBX1#4PWh}<4=~%uu8bug#4Lyx&o_rZyfb+ zwy9K~y6ze-U|P>5Ir55UomY}ZFM1|daC&>9L@mlA%lo(9;T`cF|KgotwObwDmi5mE zNsivLb~fj~N-5`}@mu{nc#Ar?oaewutnO;nd=)3jt}gn=dt8P+i`ZoYS07h{gJyKS z--&DhY)t+t*VQl87G;UMM&&KKEz`c`7P1eD2F4v>e@*3-AJ96A*G@N}FJS+>zKn)* zL0O?-(H|cH-9%g#{byy=mTqIdSnI(Y>9PJ#(I3su3cZUD|5ukL?0bh)!5oWJvj8Yj zC_QjbiJcs%#e-6zC>avp)moRYK3`E;O*xyKB;qKzS(E~~Q#_)(>zF&0I<8$F6!Daj z_)5{ccLz9BgeHdVWKyoLi5JN07t+k4h=UK`?$B?Stt6#$7)j@8+&QnZb@<& zWs;f*=E@?ZDEo$iwTjVmj%>I6PU?+1J!`9Kz7P`fG1VUG+f0j{T#k1LzN?CGUngIR zM6#B|!j^KoD?L3_YBbiLRvL#wR-*|aEfjXJ4&Fh|tdHi*SxHET#x4$~WF>E_8^_It6!&#j{F@USXSy;n! ze~`*+(C>@ql$NV)%uyao72g znwQ_08ci2LVqkEf+s|PPJG(mS8woL9q@X9xR@5FjcS= zrgWMsG~I*!HN5dR`Nwm6mD?lMS4V0%^NS6i1zC`G@}G4Jg>@bttfv)(h~#wW1^$foUXOuAB~GFGS;zk6?;zrY9gorO6$9J zgd5e;wfo99kvxr>E?mkvgt*qnyUdV3Nk_6st3=$O$M|FEt2vS(jcsQQ!GuI%x6ZYs%~ zc%NkKCjg#DpWNyVGusLB!M(2@<~$@9w>H4U@!XW_x-Knnm-wJ<3drVxFp|*Q*@g}booPWMK3?+`^A3Vj}vy%u({xG)>2VcI5Hv2cfy+PJRyt#^v5-v-}F8RDE^F zjepQBT3$RPo*>4wpF>p@^=*M;oZ@jE-D6VT@N3KI@9&R_=;a5Sbu8)`*)S)bCw%Pl z+l%*q^WpQD&`%2I--PllFTzm)Hx05R7UVsq#y;vvNj(kf)H9-ZV+&KEEtKH3S95>A zK%g0bH`q(E;`{qKmCvYX#gw4{!^iy6j)NQR&yMauqa~)%o*ADV3f%*DM-DXgKhWc#8x3_P5- zrX<;pc|X25Ch;~kjdDld`t6`)4r~T07`j_)cRk^aE3rK`N!=HmmRcHh>j4$9(NlhjLFdCW5Ba}WhfL^yIov0IlOA@ZM~_3c z1hSny|GTroR+w$jJJVHCh6zRcocay5Q_hjANbGger$$Kqd9}*lomT}z?L%lCP1zQc zT;bi)+_CK52E29m6=C=ns$RaDCkA{k@=Etz2ZL`J_CAFw6baQ&?ZH^-dZh#Q>xkRK zb`J|b?!O`R8!(|gE-{&UeDJbaMh-g8sl0Vvka}r7FJO`d36uSTLoI;Pj-xoOpOZl2 zqcdjknscs9F&k;{5+d9^ib_9}_*iBo#p!MBzMz->bEJ4Yx7$#@1T4zM< zKq9^(GZxUg>jY>snh%aN*e;7M`FzeN%9jY+O1Nr!TiHPqWux*z;I-H%2PbEN3Uaf# zRfFXxFX)=TWkm&*19PVkfCUDnqc~4#6LSjhCD3x(*7!cy?fakyxCMi<-TxNtAdr7J z`CI%1bJ@M<+OLw_y60EqU&rA3HnOVeESdCFg~MOGeNlJFj`sij?zNtO^r`cND0Ff5 zO1eGoyb7R`MdBY^P@4>&Nq#(w~h zbEf!4vXoL>=rXdbkLW!!e73HD8^;{7$}v*)r`m%kKWa_3hk#K2v;X#3_>e_EgzS1N zvd)mgnID~%J~P6sjcVB7i(}Sp6~b8#mU9pj@>f84HuRX)(qCH$iuv&Pz(*n%PO)@s zUD+I!Jh5V;`JOminrp{M&ppj7+nV9bORfGwC_!)H_BN0c&k(jSAJ7LK*Pr9~HE(oS z$nYzK`ul5MG~TRmhvpkx>(0IS}0#fi?mt8Xfyk^mr_6n zRkDuj;pU&=u&mDK^SNZL@>@Iu+cVYnX)2h<=3V}Rli&)_ksV5ZJ3RIsQU4Oaw@u^!c4c&z)&W(+yZF?0sFNl2tPUv$8 zR@-*fgWEebEp!jbs`t0-nfdY>e8#!`i#PhWUfA9r8(Ciz4-<{pM27Yl zJ(eYe(^>_^%?dmW({6Cun>`~vBo%>;4WZAkp|ywaE>-JUroJ&dCbOnL<)2a&(%Lv3 z{=8?Wcd^2EV70_M9JJSyUvNHbgM$B1?UVJKKNYq=?%{rc|A#XiS8m2VjpkF^qnC8c z9-W-|js2?+@1Tao;mi#yeu~j}e^TeoJ__8w5-qN?o%L2KJZiaix4;7l`K>+qQ9t^v zXMuV3VZdVeJb!xpch#WA0iIl`0Z;43)57@Hn97h2PdZxDImR$xw*T!5##Hi7n}_0q zLxY4lcfZ=X1|3(-ta;2c6FlLOfml3!WL`A(jsAOxocAW1`{`&ukdc`+eXeqPa2oju zh5Nr>830dFsLJIV1Hd8*H2_hgD0Ch~$wE+F5Qz#wEiVyzT?i_My*n44NsRqqzBhvy zyhWFsNvsCmal+h6;slhgLSX;vo8ilgP?%5Tr3q61-FG_6B<{UL=&w1%N`xS>_Z_i4 zNMtM|eu@wO$EiP6FYk!CwzNwCEani?1Fh`r5cGpA;-`2Z=L-c$Bt8fWzfm~Wcr1Tf!XDl0=M@c--Y6`-+%nBu>`%7Wy{FyAwjs+OdJauMhCSLUxR_vmjlGS1Rz9zBF0=h zyc9F~LA(dOj4YabBZ(Vaa_(?1Z zCJMd(otO|yts5cEq5ye=eiMfhgV1b+I04KG;6e@=z9a(os3GQHb0an8o7KzwBociU z!@MKnU@nK@DE!M0Eig}w`S`T#%71R6UV5EH0jb5i^!kgw1a}RF`7ti&^}mh=;`lMw z56!MXT0r&vTo5Cy^++~IKS*T03W>lvYRV3A!S>m8T8KIc$Y7xXNyi37aucGDRbZkD zc?z}Nw_z`PW`KtZ0kAb;uF>&pVL$4{Tn(lH82qW>|99wN{tOZg0JEi}1N)ZO zmh!*1iD`fo8%hTFzY+Ry=B3gk=6%^14v5-PQUPVnn9)}9gmQ`SQVd<`Ny$S3LM}T> z3nCE4+fv4Xo}pEqQ_eA988RuWsV=p)NgUg5VlsRa|57Wu!h`Z0%RduDX-#84E9vfaP^I20+A) znhUGE^=Wx8q(>_c*yTm{|Hw~7vbbxvZ8&p{(wJ127&~9$jm^;V+ z%%k@UsOhl@!{wq0!SYIvQ~w256*NgYH5=%Pi@NYR3^QxFi2(M8bXWrc;neJSm-c`5 z36xu5t{USA0dA^PRDj4ZJ0+T`liG>ovbk`Sz3&+&kP0#Y?oZ7Mw0*{0CiV2Deu)i) zVU(Hy3k9>NSFqM^FHuW?_kPh$!PJ<)Ds<^|R^4E{&Q_lmAn>b(g;(0`p+pLlnoZyfOXUv*&sEVsWa zM;j2$0fz8@0y#*5(RBOXF5CA+paOj}#3pE<2PZ=M*HzJq#Nf?;-4cKx+GP1tq%{jQ zHs^gIZvzAPd)oY01jOu52o3UCBt;54y~Axdy~8V`_)`j`B!=zyw|o{IK_}AR!#!x? z{=e(-8wMxcfBkcPt)TY8Z`8Qgy4RAcD|4Q+a3E%!*JqRGMz5fV7X%N_Te~;ejBE5y>$8HiI|@oNDQClj(YJg^fD{~Hly?1UPh{#IZGLF@_j#}0t5^FsT5 zu{(wDf8huaAt40CvXQ_vY@ridLj7?8jd^`s<3Fk!%>PCLaYG9niNn9lkz>IMdw-$) zU*>y>V{;Jv(N``o>$7=R_kaJUUKW4}a)87}2f1bAd;B^3LqWsg_kVK$>VN%94D#2* zfokaX!`=Uz9a%$C@WB5j>i4wb{M)Q0eeCx&-TzerS<&Un_wK8d_W$oIc@Dk|)L%Dr zqi{H{{v3kBD6z)>3QgHaDF20DLl39*Z}L`;Ns1V8yw@ZGvS%Y90SRrr)5j4nzJCcI z_6yhM?*+es{t)ZrZy?${zx954cT5%ipWi|xunqZdgxY_ty^U-i$iEx2c#o412{DLd z>HR|2#DTBz*8?F@60Lu+kY9ppZ}_A2$B4cT+Bs;Acq3{Uw?Y5C7bm}i_kmu$ z8faqio%AdK5_?4GPb_w5T)14`ot_8(e7 zCjo=-Ng#V!zDEl}hFgf=!80#_&FCcAAPVS{aAG; zT`q=qFJ9&Kqn{+5+92z}=>iORtwm`(YPZGe^wrJvoM2G5@Zl`*^`)u;nF1*J+#b7j zKbJfY#-BXa83XMG{>T?j1rbgLi$rvEt{Id;TODPf7@!lFp`4l(n!z?ti3-@??6kbc zTW1B4G6Har>yi1dRBbq|D2D7g{L?_vi~x}jKILtm^q{Yd0DAB+P$MHCk}VBRXhC%9 z;t6AFH7yx-ojkY%`KJ`$8m)hYbLco?W@QzpkeE*{jWCi~nNlw9W3sL&$b|{O0o3{N z8kLO58E(xoL+V8o3g%ncwb=lcI-WFTHPLCSKpE`{Ic$eHrOdF*WL{p3Ew?!L3OU3D z%b>7H`6)igqkYBANBZZ|=y}|Q{4j;wr)hunX*Q*L)fqZQnDdYPRA}<;gafgy69A%2 zFhl*QToNO2c?An~XS&2))o-7sPQmFxG|T{E@E6cWW`H10nq9Rj!$G1^!Dsqv#5uHI z{9!pfcK*P0PzE#L6KoWh-NBGlGz{p18GsK?20~&1aDvZ)#908I;6k7_761)a1D=J= zIL90phB=ed`j%Kwj6`m1&kN{@1%L-Eg(c51=_ul>ZsUqHcDaz?kdXo=@_onXtF%xP z{I%JlrE@V0Bn4x1-GVBeQ7NS$QhPaX(Ca+X{POxoS0nTJY{J=+lozrTVwF_o?^ywPKu?zUOVn+$ShabMs|sd_!zW0W4y z4XrUS-1$TWS`WA`J->I_^tX)IF!yNXi0DVZK0hv|a~+GBUxkd97!Z~CnxRKYK{hn4@Rd z&KHz6x(h98NF5`Zebi%(**t+beA0J)pJEuAS!5D`eo0T)<2{v~ARRIju=~LmxlLN0 z+46&}Hh5Ak=JXRXjlDL|Aow>9DWl}aFuwpaIy2ad=qUde+TvUY#KB|y9z;luw6nWd zk0C5?609GR*KAlYoLh6EA=`>jx&mQ&Q{v&$8Ub2D0BNa|K(m;-Gjw73RYQ+?Twn6h zYlK6Vaj?DfF-y6JSt~lh1g`23sy#XK7S%n}9PP8i>PQRX((D3Y+>cn7#yw^+w1Bm$ zDbn8@NJ@6Tx!Ey7-L9EiaL`)u@U=Kz5XM9W!JA{| zB9ETsZ;Yi(41NGiPenKy^G6rY@tkAN_q$Ku9O(wvXHR3Gb$8^Rhal~f5c zJylm`$JfYL1bu=8F{BIT&m6(=_576r0+nXgUpXZ9Xs7q^2ufFkQSQ%HU(_18LFOC) zI+W0@r9ww4l6W0jg)y;bAy76400)hUU66~(%YT5mZkLYo=(~UJK{O z08oR=fUr3M#5nAHc!z`2^uLOO(KZA$5<4sWHFoF@@8v)WoPf{3$g*Mql+)>TLC8EU z&U4PnFJO0C=b1s1x?B!u%X?kyjgdog>wYK#KcYO<^q}t~&-DT)1L>;#pV&Os!Y0WS z1dx95A+ipYb)wp1o8l;Rp`Lj-vq->jApG*gVd`}FCSMNS=6P#)_;50gcUVff@Um34 zJtQS}KC6bqB-#NEyydO!oMh8FjQfN`sTr^Vf6Z+H=7z_V0H-oq=I`?of_(Q@7(Jot zsGYh6Lofv-<2Gy@nuKJkmVJ1|YA`^)t9x}OJYRz))!PD$1+*bQNrnr}I@&2^5r^K9+UBb`{`gIhiY<_mhj^3TMGgZ#g=K1V@% zDfemZQ$^i9iJFgBZ<_pu4QiZYZXK*UCX#JM0@sXLg;`sLVG=_`&(MMj)NOtFu8; zQcQic8UeitFKE6aPF-rTFL<>6b9NyM^I=Nq8}kl2aFw8kY~&FmZw=8Wa+X@X86ex= zVz>JE89goUM+aGKucLTgN;6m=<4Z_SWXrBP9Z(%NG6=zp{R@4?X|sC2KvpS51%Rf> zSf4{bEj^V^Kdbz@J8Jhs{PyOyfM``ef^Kf;!$oNFjIlB*C3c?T=t!RU&1#Wv15W zha|1q;Q49|<2R>^q-pjw#pvMs5O$pQ1p?)s3=;I?`=)tE$kw50&&MISS!-|9!9K6U zw}<1&p6hj~(H{UI)N;SyT=d^=dYcV7S=JF5fxiYcS(#eDtm4{>M94;=orAZic=i(c{RVUB64tD4y(j>bU5w8xe4u6|uF&rphY!V#txj@ z+X<82%Cz3j-k$gBe-6AQ9^5fL%KM3eY~Ibn2w`uslM3mA;;Avoc!i2C4!iluT0O_c z;q3$HIXa^o211+%swxOR{1VRD_B({}TWnYiNTZ;u;Zw3{0~MTx!fPDepyYv0s4)$Z zGv8)V5N1L9cQA3=Su_p0G?>)j;FX|YT1+KmTg^U*R?%=mQX(0!PIJ%}Ev7#B7mzp| zrWiN?6iSE511#|J*uB#{4XWuh`%potpQU;Gf!!gJ0$2LpUO@j|WxNiosbBs$bU>qx zG+!_qP6Xk^Kl@O}Xy)4_4lxjNM`27E?sA&1Ne%6yEbjMKykY_D;Pl?tqO+vlpmTx; zuLxgXq;>_{t-A?G#vn0cW{OS?i^NL)f}exFg`r*vYP)jr0hYLt=f|Ra(#%V? zvd|_0F&SVD#7zxOu^sb?wafxd5-IKZ372h7CNgavNA6cg)C7t!r3*V+=}%20il}Bk zqg(Go8V9KZ_u}tYQqeAW$!UklBJRG}lJ9+xiLy7H@l!QCD;&XG;<0rl4(^b}E2))w zoEVsPE_T@3+S<&ECmCL>2+x4m(bm#kc@1Y6EtUa#_x(sY;8!Zf*{sdnE3}%|iAU=+ zS^xM=S8;mY-n8UrP9kj{D_3%O(snZcvKIus5$7VcUb);8BB0&49bP6XraW^ zM5*4u@}%0=4~QM@pbf#J=SG{wsu;s$3o(RMan)p8mfPn74nip<-mmMX#&k7@2cxLE z)?jmHpAlvF{3parzV-~fq}wIWGm_Y=GE&?(L` z$bKRILSug9n{^)loBUE+WmV*wM{snM#`S&R23!@PG|~@O^ACRCkJwyVh8*Wn35)PO zwZN3QuXDLP8TqN&i;x)QF$*h+sZ^1^7+6QzR=6E|>E*ifm9y#5f9}Hv!_OXSw9I0& zGRvy3X{jG4e*jRRMuCfDeR6WM)Nhgz_(Fj8DmMXE+8qw}Sk6^epxvaN<8rQ2Icq%& zlxkD5RXwjzr;Dj|-`cnA;2FxLhBjwd?Nz$H+DkXPaz6gf+pq2zzkRdjf#kQwo&F$j zhWr%!Q>j)CX=!_07(l*+1}*dP2vc`TS1IWm`=A%y&kojPL*Z+ce%wpH#!}npoL2qm z^vMGd;4}Wcmf;V7kG5+zJS5{W?q1P3plC}(cR&u-x<=zo?s~Km>*j2mNPo~Nc(bE= zv_^3?^(~|<>Hczc_S#doAqo|}K0RWz#koi-T3T;79*R^a7$gxQV&m;rmw&6L9K77>gFCN%Wwl`0tc-)@_CaPI0c}a{SuC?Q+t+WE&i(%)vrZ z?BsOzZL)-`P+cRZt~lvrU5;%fDiEUQ*Fo}7fw65R@l1ouWKvLyfZagCr%aY@S}G8d zXX;==sKBpnTJd(W*6GbjjUH%uV4v1ThUi9gY*m!2T(L$7pSe(Lu5dcq(OyWd{a)`~ zTUB^NYux~o{?keP{Ht^cw$C;&=K0ZjQ+lsAmVs!Jjl3P1qGy#nptsGoo_l59cKXtw zzE(l{;%0uuuNgN){bPUZyuA)BAqRuD8&Mfg*UJcDh$| za*2r{^%bK~OV_Nt@6U}iJO(ZqJaef0)&wMPJ8x?T9Y}Vfy&n$|9;cSh1Tm|)4kmAW z@n@KNuPdwqXavt5WXP4a3S(Vo3VmI26J13Kqk+P_FjY+m=OH;cl|)XaJ)w%jJ#{zV_={M8)<5I+y!*I z?^?r+e>@B*cuf#T@v(Kz4S2gghg77x$RgC6eU*TGd)RglP%Ueg#Mhg|9i3mmq!w~X>5^Il{OI-TX*y-*FkA$H?jZq)pzrd zv0WU$d4Znms)FYI8zCR;&`Sq`pMHk(+8c7ET^A3^r1Y!I_oWOnD>L>-IAHBjGF*8) zt`LL_-vBe~D%RU7a%;s;q;r7-TAAFv6*)#jL0u&9+~-kN24wh5I3*K{I;3Z$(dmJ} z`p`m{))-ZblZv=2#SgrBH_y%r$i6nweiTj$3BR7l_Bca_Z`G}RMeCFN+Wjz<=6Fc@ z>>6|K+3sra_vKbbli#ScK-6pIl0Tn0JU4GWq?8j;bzUa`ub||>tN__o{8{!2N3j&;mm5SZrM8@9$rs#Tq7aini(?y--AfiE*v&7<_Jcs+(8#* zVyXv7!c~afXh|K}l7wAC(VD%b5MMq=PF}-z!h%#zv->UHFTRxN?z2SDJ3RpKLJ&Yd z?&R7SMr6eqOW=ssC`PEm$T93$mx%1-SzB`M68t)e-Dr55*$C%2VOK_RVA4hTI5uiD zC;d4QU;EHf=jMDStg*;WBEF=Ew)ZT;+OjUue&wBxu%D>tA@3?S%YtnNe~4%A%z2O z`ZlS@u=`JENMex-wVHAAylQk&7`0j{c*(i}`Hi8(Ke;s%ILy?h&bC4>Y?PdY5pPoz zh1j{tYQY4p30NfXi0W$@DEQa2sVnnNEO&ACWvgzE4ddGfv z&d45fH}9zfP8*p^38ZdBInniImHM3)+}^8h=@ARTDh|Wvuq;q)codDm zUYw!BPHul_TlYgI$H|nE$f4uBxK1-FqS`!)kMk({D!@~M5}`USSxV|1l4>(P2-D1d zxUgl;^Kgy9g7=noP&l+QvirD{0;tn-jfHq1yq<&*3S8R#{3TonsG0?3i5yWqJs|;b zt%`eWII|A@(RVR2x>y>14`TZ=GD|8>N~C;&=k0n)>@dNi1Z5TR_DQQkh!HQGdW!{| zJ|`$wtkX1|Of0UN{m=#7^f_02*WR^`f^vV`peYkR>}4~aDMCk|(;(y{M<6bsuuRg# zEOLT}2dTPY$<=!R*dO@-exLJ8PMu!PnF0x-TOPYJgru`)4fZ8w%?&O!e1pU*cT>O$ zP1IqTc!GQI3rc%eOjlIlL}hV^FRs!pgfO?L%W6)^s~DBK7<`Ypet)zapdAPmm>eRcjqHk68; zw}Hf_mHI#gHs;Jhurjdq$WzkQfD9oVg|vdVjRw~oG@`?tRWWY(>q%qgS$-xQJ<2Z*pc_$cJK-Y~n@rCR=Lzr(?2K_E?~-6LF~htuRFM}SId7O~0T=F1t`Slrd zJV;_TXuHAO+!Bs{f7o0Kf16J}-VN8?ObsAP4{sd!AScAD;lfgN7&&pe$Cfr0HMGax z6vM;N+={wKAdJd`UH~!sLmP%SfL|og-HczX+pjsALMm`8BU+^>gOoO|$1jpXqB{r2 zLvHpS9Eeg=^U{z-`anp*|IzK+y5PX8BP%K-ghO#+8_PYmt6(PY$)?(6`!-#Rhg$dG z#-{Ui!$@U}i|4=~_JMu0o0oiP1C3%$na0j*!n2^^*eGpP&&815IAzt13x}d!Y%JDA zv_NW~&la@~p&~bnaQe5k-Ts#Eg|$0Vere?a48Z6jb^EllwHDV0_yvR3)NJ`AHzs{U zk*|OZN{gizP6Nk}30Wb2{FgIns-U$GjzqAAsgJ%az3Qw}FDqK$pN`_b2gk*8pFhrk z4(HhvbC}0UNe4DoVvFjY zIRgn+=U^N~xP^rH!~5iL8NtxrbNi80^hCbV0`LHv6MyW2{_Ni>oBh^!mxl z&qcA0-4vRja1O_NVLuwS-57hKLDJYdv*9($wMQCP2QamjE`wmdx z#Ci2qT~#)%*$W-9P-ifFs{7{Ty6q&Y$IPY37R{m6&@rFOlJHzOg#F&`H!rGYldS8a z&p4Q7%wAFc{|D5DmQc*ne<;Qz4!{lLFLW`gkIDB>N(TkV`wOE}QtckNzr%V@(0`zZ z1{!kA|3SKP4wyDre~S)&2K)~I8LGkT`v>Z!f50>%{HtIYg;_)R2L;+3Kc8NB-?T-T z<{e=94>!jJjrYC-{{B3eTmLXIa|z53{~%1dJ&gCQWd0y4w!8qqKLrF6Oaa6{$Oz`? z7gEjlwF6a1f02=~fp=u2=M~fFAC5{?f?50*KR2uTvBMt_AlacZ23jsFWKIBhn6KobVAB%rMK zpFbr)zYJhg{~meh!7BWp|7hDL1kua>(1N`Pq!+^<>@H$!u5Xjt}?u(%XolHe3mLoH~Cg}XcNao)Stc!nmK zO9r3~aOq3?-LmtzAn}=J$J$*mkWclsP51$O&pi6YUg8y~`Wo9o%TZ`J^5Fq#B&3tW zsSqtyYLx@NP>Ca2XnLPJI^OcTym2Q7w7l^Ehg))AwdL33J_UARBc=iRyh2tpEOBSj zvr2?rvB@uYDF`p8%_dCWS8n{9SO$*1m^lvU0`b|f-ICX(IwC^lS*H1HE+@mAw7D{} zI7LyjSMBN=r*-i;vGc{~SrJ^C*rEs$Q8ZE!3-3=zY z*XbE|w<;DIc5~b&BY1x@p3+U`h;G~M)|;L;XF6t&e%bBzo8~cKB4CLQ+U*vd<}t|? z2bwADmIu1q<6TuE0H%3HLXnMckGIHQFVIHJT!IVSAEsJZx+cFc_=Yh1exO?WEqEvw zo7zYJ5TId{k!$SZGa{VXJ+&}JtM5f%jjg8XwG3Ld#dA;Fw@b=AFQERkl}|6YBd3_! z_aj1~_FAp|`n%=wmh9P0!F1t;)m*o=5AdMu)0U9Nqqe?RtmX2VEb)24U20!Y<+W@3 z^=#oq9KCNFvv0Jez_G02)6^4Khub6ZMM2dEoFz|>Am+9;4kB0A@%t&5Pg|@Qf}KPYOmq+ANg$XEwN`!*#!=W1)x}jg>R&ee{|5{UwJ$&)_avXTGcE>(gEde z6qap9HL%h^{5NCKP7fyBCE!=!3c|(Elyb{-^a7|DqYfoeie0bN-MmV**|x;- z;k$1*sZ?Uq?WWNa-($3>`sQwZf#jUm5A8idod}J}-l-rvj@ZyWz7uO@qC|ET{|ntS zjuy0b0yRFR*4p`A^P|M3U8C!`4CE7$9S-P`qXTxg?eWV&OzVvfDa>)VRA74LbbmgK z&2M)xuMqF05cptyTod6|?>yO$8JJ&vL6pOp1m)BOqqrgweH zF50q+k9U<4QF2AGa3u40tkuJ4RJ+_peD(90pr81Yx?jw8U3|zhV_KqbW#|0H z6$cX7zSx7}ON{4Y3C~U-pn=g3<+>f{u4H52yHxE{dRjKwa+*PQGqt|m$tJb7bN48G z*ou^~MFslPx=kg<(p$!fc@_?lipwU1XC;Cy^D*R>fuBw825nkqD~3-EK6GdCE#B!qKyG|#c0Ue=aQy}pV}Ouzk2^nYP*b9h zE@W;g>hSt&b~P4}I-g`2(lpf_OWJ-RVz;a)TwO*Uw;im)`Q=Vq zK0QRMo0G?6PnB@9z5<82y)?wqqQUi23|%HTEx|{7A7@Q+V|wk93h5Oske&jLG@#Ud z`H|%d-6|!Crmk&#OtjqZ5pW|o_Mzy|L(O^~&c#}kwTC^McjSc+Z$P9jtKed7Q*`eRN zy6Z^LKN6%;Hn`wA?9oId-JHimf>7@FVfD1*L`1`DyMstNswVJ{8E>e}V_V-C9H;q4&ZEX~}FVb$O6;INjDuiUF z7A3LEZjQ_`y6Y}Bmhxupe$D{bT%XI0?s-&@tU=3-0Ry+mZJYRUT?VKNG2=}jD<4|U zX^3h|*pn1)CJpls4#F9P6xAr&Kflx9c48UteYN9ymgNR&>we0CSko*UB^rajV<#?< zhVX|Z@y{GwDieFlzu-@o1h3%P2!R4K5w3Je;H@#1wdGPk7p9W)lX_f)=DMOMfhtPd zybTXG*-edx{Y1n|#!*ge4ckA_^D~{V4yS=tVwl91Pop7A?%`ugy+>a9V|+nE?LJmb z!(rew80S9lHN`v&V#0jAEAP-uH>O1%SF4oQfiCUF_tArw2^PcW?7FPz?Bq1AjA7m- zOj%N5XCiN^%4nErD>auSBYfEdmY2m{LGHUU; zZh0V(38Ce8iN4;~(q!rw1>RFy8o)hAg+)|bvV zPwvPUKTMecjelN)!hpQ{=@2 z-tjE<$0T=CWI=E8XvusTVj#HFm(i5WCGCP&+QYLno1rkm{Fz<(MW~)eq#?OACwNoy z*MN5T;w87Hkdc`>@XT~H@OSI5?nuf_s}}S8W37qxr7SpnfMffW zIy?C=wT{wnyPR+<<*!A}fqUU3v3*6cZkuFPg)x2oaDmkHD!z8HfkAbhu_X?j%s67; zh*flZJ%^e)Ml`?IG5dU~Ndm`IC+q2!7YOjhu522u-K9s_ESH6y#t+N=PuoB119c;Q z&MPk}eW*T@2q6r9E~b2Kq^p*1O-nlI(sIRB<&aVr%!U7tK# z+W!T_b)s>Ty!@7D680nnRf&RAAQJpUqtl!as!w`HERVN~sBtD{KYUy<<$YkE<<>5! zQ>LaLBD;^Suc*EDj1ji;x^w}y1!TSjI2S0>ruY6>2gXVhU)MECaX7K}oXz@8^BOku z>L8OK%AoknrU?djO%dBjSH3j4(Hj|-hiI3X<|6D3j5uTtnj{EOnuppzj~R98ysu! zAFXwZ54Gw?OWjr>>)Dy8ayeBarb{tssbggH07~(QlPNLeIr(;H(V=xoMh-gb=2eH0Rcj0B4u&~(Car#+ z&zl%k_ex$~x{S2RjX;`NCKs;z5Y-fg`~xWM2i2tQ;P-nunMEwL1^G-N@MRFc^!bBH zOHbG5XJILJhzkzYS8IwqluZThATWvxHl|1aQ^!d~0VZrpe{80qQ=n1j7esU|q;GPp z^P)7%U1G1lL!&>xhGh5;r#Vzaq5Us&@}Ld5P}UhQR%6(Ma-4O zZtfiuqO%mp@gcmG)dWvKrMVtWuG$G&wA73Iez5{akFXhn#?82c*5=*L9G(?BVWo}i zzR7~d}9JA-@m4$jOs-0G~xQJl3{Pf$*sr9A%B8qI(DI1q0EAb zJPfh3qd4FviI108wTC^eTs<=X@T;O7Qh0pB+-!JKV~q-U*I~_oVu%Uv8Zp@{{UfB4 zxp;js{(zu%xrQMxf&4}Y1ur#-??b(r8Dq7$S-oJIs<-gG;TTSySZZGbIHe1e=+(u$*NHX_2ybMfR*~Cu*IhC8c0G;? zvdC?*hpT#EuF@e(md0v=!{UyvQE1F6A#pS@U4L@TrRsv>ll2RoYE7s~YnSDm$!-fP zsO-_LL1>l`IX&Xq6|RUtHdV)R^fHivKO6j*@d6cGILfj?%i&fcCxY>r=#YTI2L*WtpLD3a3?^g-Gz?Il)L%3 z?eB5t(T&;V>-`c?16QS z`cPrMo)hL^Jx<(81JSJu&k&d?Azam_)RD3#Ij~t z#c;5rOr2_7xjKm4iLNPr$@t{JC9=eNEo-bOz}lP^6!^X&dn#_g zJXBRz4@C=XfSme6Z;KvZw6R{`Yl%46N@DXG1}k!X-dsy@jh*sj2>ZoR9^7mPu|!xb z0y-lC^ZbLpG^_lIKmL7TKqi2P2q(+}#PM3*zu@$kpY=_?r~~y8;Bly@02uC4Qf8hp z9G3?+o9OQkY>?tI#x_>K@5&Xu43z^%4-tKr2Uj-*TW%#z45v${LDzwy zoPU|6#+bnLozRy0HS`S`&F!WF8QR3Ok(*S4nX<94xp8M=ejuW=tSbk0iBaVgNWEC6 zN78^~*WsBr?K^SWI)>_ZQn=0OHWqhD`yH(Gtmkf_h&IeJo{|KX;hT@qbFzu>9nZfM*uf6W)01 z<4-3l8NE{5n~u?7!sCftWbhkih5E)>y!HKtk-t-q=_BC-e^30z`@YRdUxD*Pl}IXs zEGCt^pPm&V77WN@7Np62egwt(4GOaDQi@k-O}6SkwzDs3rzM7^oumF$j4^lUnPDvt1U^68F&ebUqutb z7fkAEe-De3TA;Pm?an+yN-+DzSK5_)zx!Z06zgy~AfB60UK( z@YL0fkGi5B5WQQF=Qb->$6P^qkPEbSUx2d_=^d#>x*Kq_h_0sj2&e#7f|HHw9mXFk zv!se-7~v6hg!Sk~WA_yC4Pqq2zF67U(WP%B<|-I<-K$?jz~qlz8rQbu-;CQ&Hfz(J z_+NJ6&B7$ST8I5u-@xL9FH#^`dB8FTm<=(;E9tVSyOHRr=E-)E3Gd{WbJVYAb`Dej z?3+x&({ljl(|Iv7PB8`^PIdDBM$eciT*jsm(t$!!@r^_E&vh^`ZbBoq_1-~YAQ$iU zzzTv?Zb!L_dV5_*B1lrEv?k%h0}ZSEvU7pTzd#;?M90;c!J4f#gL3F9r&Wm#{iTn zQD4N4Ijw|(DOk-1KGQ-!IR`zUk>+{mVPYAu;lR6>5t=iM!aiGk+!~R$yP)D;I;4kG zt_=z}&c*j0oP?ThEk#LJCGsk)AKnhp2-tn9nDAka#eaBGSO{KeeSa%KmG8({oqtk| zg}}J~HElNNCze*5-|18^hhLe^D#Sa6Gdq5yTJhWBAT9b*K!h?lw$*TwGLs7h)Hjz zV;W-a@sW=PK3ur%V5LiY9UTb&74X?^ar#FDp%bV2#0!o(-;5C%?LJ48KYtE;W!2 zTW}C4g0mG8Cb|+IKdX+pHH{Cr8p9Hsr{VLn*YVjl16u|NPr+`RaG}hZPbhVI)zY9S z854fdreF+rB&Jy+riD0Os+-cmhqR&9+R%!k4sm*vkw8^XBQ_}Dr%$|`25ZejvZqfR zU-aQGVivK+W?8yUu{^c`KPcz@L}4Z5imPz)~b0R6Ct zb^h z6)0aRp^X7w#e#Xg(--Xa6^fs<3IQ9uEdEs|X|E*&LVh=_VAZaKoi^TAW(Yb+mIW(j zJM26k?2#Qk2H|D_R{`3)+j5F+qFDSgX%?KP44M|*L=;dQQC7}25~&ve8vi7f*kGO! zVCq$8{iW(M;_{d(XpCx1WnGN0(#-@?-jOEw4MKKcjs5!!kjjaZmj3b2? zQ<-pR&pKQE^lV9%g%E+#ne2!jI%V=e3`0u|aQLB~kvhB|dZ+mdy1zNB)o~S1_&ZU> z6@=;!Q|l66BPJ*~4LK;Nh2N6sLY%}1Xs9_yTP4^t(=_Amm#2gSalVDFCc~ix?!Y5o z_3v6|4H*XlgqntG{8~Cm-E1C}zRqVgRm-{_5b}zI)`_;PZYkk{YnRb3w zV+tPHrs$^Ryu*;=pk8J(f2C@8y9)3tSCjSZ1E)^uE`I`e(;=sEqEIA3L|-sxMFXBy zsiA1=kNF?(FR#~LA~lSlI8=2!ym5u+wN%83toV_KO`^w5HFDkVFw4q6(7KWw2L~?i z=ho$B)L@-9nNgpjr=S_v3EHIQyPllNyO@|B$p^K+QF4vG^eBqg+J-`ri)I0N=sZkS z&p-0g>_~51;U*QE5&#rD%pG_Ls7@EkH2VhYmkqKw6y6B39PnJ#RvkelMhCghE`n8L zEJV|C=r&`XMS*7Y!Fdgf&@;BOtB+k3lgdx2%*kgKpA}Kuiv`V&twC?TpT^BC@yz7hHf)!a0LyT!`&Z#t5-#FxtmF~F2{qd!f)LbMv5c4xd;&aMQ0TMubP+u1Z({Rsy*7M0>2rW$|iDE4g3x4j$?*n+EHR0YP!#;poll2{ zY9Xlj>y3A~fqvG3!CN378}KYFDCm2DUV<`5rgpg8OPI$5+IE>KSl9Q|6*&Q{Rw%Fh zD$2*`+@B?GMY1aP`>k03hpC7x4MtVU%!{Ksf?*#(>F=BQp-~lM2oas8RbZ=d=g-BXFWtRunAk$Z|6{ok^7P0xAVc7uH68;c0qUMe22|yj|#}o0cpw z&|BIVito(n?$Df31BJO`cwh~8{wQM9-pjb>>@$WQSt(g8pNwvzG8H6=&_QE;V8#1m zs{_n&KZ8AP~ z8&b+-s+I3cV*gew_G2u>V4B>rftUMCuwYd4#%o1IVVK2m_OV*ruRl;wtWS|okH;Q_ z^X!Cp7m6>QggB5o_QNez08!O+xGsuR>)1sS;UuO#Y9= z0|Z7(z*2$$$-S@DbxWQWhChYv%2niQK97V!90WbdJt!MKJCx7>FAJUxayYaP6NE#i zdZ)MtJF4j9ze~v)7vxNVS=oKn5A-sdzAq>h^Lysa`{q3+Cj*)|@^{kV_=m1Ft5|##h1hH}eemHpTT}Y% zAkn>*Q`;}j?frRj@5QKt0r73p7VEh_Rx$;i+%Nf=1S8?n z-316B?B5!EG3|&v;+5mx!E=jqr+&g8*=Z3K4{09t&M7h2Y|!LPtG^YnA3TDb`h9uj z5a@i-bQlX2$IEAGe#)bfyJ<&Unx9Fa@tUGg}%gr*~w^db}s0y0m zz-%D2?jF@qBNTa2!Fi(Db7mR%mCn%miTHKRL|Wahf!sH)I$9?DP5Oa%dWwQBRSFn! zAQdjfp9t99j3Zok-~2w#9mGMrDhm_|{;%Rj` zI<3XIKBR^9nWcy-L>`N)UA&~of)wzdk*wUK+Z<>U-`un6=ee zOfa3FFhjHVEWbS4+%+6=n4NM9w!=rtOjr%NKG>Wwjheqoy=uGJ3yW(wGr6ecJwrO@ zpgS+X(>{V))O7M^!9KVa zED7kc^pA$7Dktk56y~WcWG4$|D>;&qxw6QG(`%u)%an$)Jh`gMA4YnCi9b1Hp`}%1 z7AP|!V~f(r)b4C6bX&d#GdZ_u)jVUeBV--fn_(u~m&_(t3b_3$y58u1ENG9}W&x4w ztBJ=kN|@lOux%bL5d=@U?BMQ(R*x9fakey0g%b_6mj2??NRf@-CUn>TS|ETsf?3Dj z^c?D1xq2bL$afoRECb05l*-@|;S{X)r~{p@Zc}#Ot>r>eE87+{3=LZzrYoZNq|1#q z@fx~(!`pJ2X(N)XaG|4O`npTnsv+avmS#D!_vH%Vg!^_^&RvUN>v zj2x!cH6ewtYvr_4^T?WrQ=?^ShH>il85TW+V=om8aT>S$JgcGsh|aFOYA41IyeU(j zx6)xbUP$2!U@oKnsI=pqU|DI+-ru%TXjKxjbXub+d^zV~m(wi=^p(4?{5*tV0#wlQ(i*hXX9 zwr$%JV`4o0fBSp!%&TkeeeSc?UT4jV*?XVQC31K$g!Bs{+D;#~FSgpymBY7|e;7$4 zL*D36iZ9tT@9$!FblXCTF;NQlq;rwjRCxsoMp&V{9&8OebnXwY`m^MA`ih$V#-3Zg z5@!ddwJ=bY9X5C#xxESaXx~vI_9{4N@C-!2q#QuGv$+Yj*?G_)$%GGR?J3ZAIqzys z8niANy%#Ytn>)^waZC2ZMQklSz);h6TctQTl?*Jt(&|?U={qI)`^f(emt z{(ZiCVHxwp2y*zRcns)IN|MSHkN2t+{?0wjTs+J|t#**ZIw3mQg|K5>GnsWGgfKg6 zy-4@?4@E~oYm*esuW_mX^Y#3oQ(f={NhE6dK~LOf3(c|*KZjfXZ;CLu)Kob(e_lwU zl;JlXHY*P^<7R??Bd-)dmkQL&2{E*;3iYV$Ka36>OSA7|KxRB>lAvS+gy6(;MOmgh ziY@WrDKO&z=Py~(N~m1OvErrrS8)1+ok3Cp8-%QTrvinU@)GfY)RCxqhcfN(BOVD> zxP?`jc4rgi;oq3na}pqazxjaJ^Wsbl8p{$)7Oudd5zjpP+maJ;n4&^IE z<)Vm>sJ&=U${j0tgjd4S>!A)2ugjmfeS3hdG?a)(9K=-*0>U2`3U(!T68EJtPhuXY zjg(oYWFQWN&Bk0nfk-I3gsi`8V94V2tLp~cq&SkWaK-T*|5<4X;==8&CB?i4#^Rqw zM29HL4x&d@)wt#%1v~R-b6l$uE{%7LlOh!PK#0xRh{(@VVJWiJ7vvD9Udgr}eLkA9 znP}#f)7P(&E>0AEM$9TX5=kw3v5VwMUV5m^_W7M(S?|1q{E zWU_M0L5}i`1liZpOcSA_67{+0mTBS(bKLAFNae0A;Z>fgaQ* zOKe{>w>n9H*<8j#F{*T-{!@HL8P8f$>I$rIx!Ohz)iCQis@uW7#!9x0CL;k0#)I|X z+eOn?G^7s_*Ln9LcX>3U$%!&xM-JyHLM>9_l8@Te>8KO*T z|FLlSGc67sT9RstEGb0(8lpSj52bwtw_IVz z{q$S`Le;c`Uke_XEFQBe1yi*G`?izVo~C_~yY5{y1MRvu@$b(=W4hmhf2!L({D4aE z$TWnR`pg+V-F4{dFYq9gRrb`T6bE|H(Xh6uWW>Tc%oV6Nn@dw=4MeLY4Lj7`ejZmu z2RwY9f}ar#AHMac^d1@${>`q|t!g@B`!c``kcWHhib14Dwl&D2XPYaWkse9aOy+_% zTbJfI*$R#T2KqMKn{^Ac_j8chr|+FV2*a$tB(4Wga^fQS=u#7@0o$7mGQ<*e|NaOv zT+F^LxtmDY91q?z2=yJ0thry>Dv5DWg} z<@}q2F?SGDO%p8DWFevMmxP?)2C8czcr^AfCqm4tVdbCAIalqv+bzHgURwpFd3x+8i!6cSg zATo1~+e3elmsxkuP)sUvIwZF%g7loyvaiy(dE@GPx=6QxJZXLhI&=JihZ_dj}Xls!UfXmNoBU-wO>L4?%&w ziY4A`Nyays3C4EpS`?;un6 zGWp&gn7PnjoIvVXSnWPNS36YGyRr8*J1_$4Ods2fUI_%Tm4gUdi^cA~bZ1IIX-(O+mUu=VXRogQmGtna^#6|aKi zw{x0{h~}^6l6fkEg0T3nQO85!a-RCRkJFLgiej*RlE$&(oPN&&mcnw-<%_Rjb55Fg z#6+K8oZH}Jf9|-y1?M5pIgOUQULS=L(%f4h5z7UHvYn-)PO8LviE+mff5!NA1Sm@tOgVO1Ls%DeWJq`>ZkvXV3(aUgn+V0+vpSUG#&P z1jCr)Wg9DLBl-zv{%IDSzhPNOd9T~iiNm4_S_@ghVh#KUs?#U)Vi3wezNS5l6Q{BH zT?l5JP&(UrYy|7pdmBkv+px5i{&|Qd1HEgklXZX1e8f8dN)ksrpbk(2d3TuCT%;Pt zZYcC1CuwO>?bUNU%iFy{Ijzp?hRi>IUwI2%#{wPn1eOG}(3v%Sqe#X(v#mCBu2ZD! zEd6@e74j^in<4?TRJ_JBrJCdZmd26o1?frX5suk_O?Rtn$FS259#0t(sbV3 zb2Et4&V)Pe&IsO^P8T_O&UR%V^=wbBQ2PhM4!mLjs^a-g?dJW#%6fZA(T4dNve$Wu zKuh^-<|5OK@CwoHx^rmsS8()c!bUxv&MHjyVx`IQ^t8CP_Y`lz3kq zy)@xysN<dWF zJl3B8mM}Hb+Zhkg{@3nGJ{ zirtIZo#T<{mdrt60TX(*JjXRf=(hN2Av;d+!4r$9$H>5H9t2dgwIcdjm9-)XbG&iHOYf{%gp^n^yS9qhR<-pk zSf+sPEd5lVs`$BUAdwqFIJ{f!Fkd?BW~Zqk$wo-HO?URP&5Bm z0s>_l^DCnWt65R}l+*|L6o4Y;M)Hy|!z}+wi7eZIp-}mX&EY)RVI&~LyMr+chQ7>v zW7y~%jsIoGYTC*lR_ zYPMrKcz1M3m(m9VJ;`1zCtowq>1bDPc&vR^{-9OfLkRWRi&72^0jMBu054BMae=CJyO(=0&E?lAyzbFC` z=3b+v-DMg-<+^v2Dxf5*ll2hg14Y+&sWX`;E?)9kJQjGX_a^J~J#)zmay+8?2U~30 zql$qNOoZNtNd~!2jnUr7)#g(~bOLLygzo?mLQ>ps`-U;#yQ{q!L)PCgEp?oHy^Z9h}M{yzdi~HgYz}E~ZMBvv@EO$Mt!7=IT#8X;FD>>5`S@ z!N9&?c7fygObZkq)x5k@z~$}S5j@rHQ2%&Ny%PCtddgE(t+@L7a1-pinofXbhw+7! zgZ|8Qvb zI&z|b2I`+5kym2nlr1H7;e8JI!d&uZTzKqy781Xa6GU+YZS+L1JBF6M*twNy;+Uvn z3SEu+)%_OCy4b3L*jhY#NSvA_zKr;yrHA=TlAGN85CEg{ZUhEjaF}RQivMs5Z2ORy z3&W7)q>0pobXfYxx%5KGRC^p;#eeY?l6IJ8@{sU>(4+7x9a@MZBI$Z&s`HYTO*|n& z2}ulTsIM8~LKLeeAUbMzxKPPH+ymb2SiD~_yR-%o4_^4&H#|g`exHe`izG;oW+t-V zuYuLIe`TGef^;Up)1d@Wj8AI{pd9q0SnLI`Jk#fodOB6rn_ZI_wZ<$f7!9p`O>F#` zID0OXTOrS9ZqH%XQucbjmFLuL5zVv3xEJrP1}ae>pD!F=s&B^DRdZ)Ik+hRKGYTPF zEBe)^PeNYpc_T@1cM2^!qCF{e)Z*oNZO`rxLjZpA6%$K&%rgRN%QLlBLTtl=N5-Jq z4V@Pm$?4iWp>5h>^X}Dzmg5p{eHXBGNIh@0oNd^ehK~zKx+GpwR%?Tgs()dS&8r1s zqkeUFbxrd$Ban}tPd=-~ug!7Yz7D1H;5u}+oE%tTLiON$~DVi0#3n|+aUu6!4A z1`Oj}V?BT<+E?Yj)CIIV=^N{3!-pZq9pB-}uTFFCJME0D5lAj=C>rXTKxvW%-|7BR z`0nHGF)+buv9ImZTWr;pZlfNyDIionNpF$~7u+c9W zTb1YiVm2{xi|yZ7FBThgt zi^UH;N0*UWt1v#lP##zIud~)@a$@2fU-d*}-O*Y|lm9g+2On&qu9B|Meah{~K)6WW z)joOotKcgbF5qRNbTgd#eDX=Mp)m$pPS4=*6W?S2(`>W74bz;1qJ%Q_bF}A@2;e)H zP3chCCE_h4T21`>V4Np99**+28Yq~K)L~(Iv?{COfsj&ib_`^1^@OJuxq^X^yY^P z89rIB38V2JEmdY#ZbZe6VsuayDFDGKE^X4}B)3l@jD9%y(vJ{ZH@(QKfL{8i#^Jr@S~{%0;QExGDLW?v_K`-pyZ~K_Fj)mU zf0!$=%-jq$B=S@A30BL5a8e+ldeAXkLKY7EQ zg1Ghbl;M$p6!SD*XWXco8YfOiX+2%|IdEma7e(4>9WnEiJyy9#JFJ7clYYv{&jw%}9MDUa&lQ}Z~Bf8S`xvWUA6A{HR3?x;~#bg8n$$jmmo!Y&>8 z>jMJh2fuL}P_oMG*OWdz377VB2%+M!4$bj(n|Th^O?r^Gxk`4iRK02mQEmZ9 zC^WIvg8*Ffal{ddb)yzb5MConmDVQMI(Hk8VKk1D%4s<6&IUHrhhoJVT(xXJ6BR7- zw-K>NmDhr%I5T3$zG88e=m{L=Cg9V+EqrHKrs}*GatMY(8+Iu(LHtf>DWT9EmAk(T zp6K=aB+d&PV9$vki3jxJPhB?;6|i8(Wx1%;^aqG;l|?poJ>X?|F(1tPHZ1gRI7oSR zJPwKs)(w|xFza@_y6Pf%@~l{4NpL?UUXfl8WVxYTy$kmJirgOZ%8|Z&yms}%MXO|1b6nwN8*|Z9{oXcTM6vK|vN+ES!K-+$ z+#OqgEPqy1f#*_?gUSU8-VES?sc@wjX44>V{^g8IP8nt5yKqr;h=41eRzaJ=3;mReCA|$1YZ%;RD>kq zaCk&#QElj#R~e)DFR!bGog1gH?wv8qupXT`%c1T*e#_YNGvc9~2(2YGS>!$NtgV0r zXptOAo%tGe12&Gy`gQ9~`uWS`srE4F)gOc9$N=d>uNb?5c?ePlUchwWekqLmNn_h5 zuu!@`r$bZ!v`KzaoGyD}Z6>JQ_p@kS%Hx-L#3{t-ic5;x0;p;>dT-%%R>^4=g-UBM zlZ?;E4xwj4koYvM#4Swzz=j}@VjEyJ+$`G&kPd|AV^5T(qeRR0^7 zAWHAf@I|}xk_DxWnTpYzIC^kW`^2SE5b>D9jm}QJAsRq6pAeEAEU95h3Jtg}rLE>3 z#K@vsD*P43Z5b|J|I?Py1c}?3KbwWVrPi36s^V<QCz)@_~np;6PIwnc&rFtpvD&b0^QR2d_g61K)v=U1CY1?=zQCjpkqJ1s~Ra zpzS#yt`3$Evrw2HN(_-6wxlIZ9UFSr<%{qrwGQiD*zNah+MEh!{KJ*%oD7|0WzJ*%P1C6yLx4D=S#i@M^V&K-TQM~ zA`G-QEGwknGMf0pFO1e*?+{sF`eN4)SXy#AR@KWqKb<_EIBZLj_^eVSwsK|>#xw|~ zWtm8zw=~P#s%r|z>ta=|qM#qp&5MX9IP5C;HBS?{>4hrig#q+!3gXt`b&CRjm+2M- zXI%3PvwoL~rukHxD+~N~Kdb}&jg*H0;bMhPdz>b7%ZyYjxAWeezE<@>ldMHfQ}h&i z4)*J^Kzc7izb#}fMqw~P{n|48#@ej9O{5|FhsRMxT-RsnZ(P*znwS_Kq@V7hnIQ{z93>Bd7{zHc{xMJfXS)i~ckzibyNX=B?)YijjK>xP{G0M$>6JNyiS(#7f z9iCH0L;anPTdMs-*tFan%O;XWcYNB^O;>b_fOVbbbpm&>U;*bVLfbbyypi%6+(0Va*RNt;+L!^aI(DRQc>aWuoX7E0)EsO z_t0^PLhQU=L;W`!*?s`Wz~{|{f-TCA$BABsfPZ-IHsJt+aT8xoGb@~QK+ahhnp?&=I1?Y-8=i3-}w2% zdzJuUl{gz|JNxj&PDe!4M(SEZAM1COM-hs^w=cM^_h70*!a3VU8#cHSW5-#phC?FL z(CffdRw7j4`d#$reNnSgxQCelFVgE!)3A-LQSPw)!l}4v3RHpl)NdRLZ4% zK{a-9qBqESgy>cRcF6)p$t1noX^WvxTe0`Ys;pfWu=i)(mwF5ThIVE#YX1s5XkFKim*qk6ucA*Pkvu(qOV(bw5Vvmd>R5aQ-@UZawt82IA-5H1G5 zgDAF;L)AgaUrD)mSg=#mBN0bb9hjelphJASY2#;nhzDdKUl{Pp>!HOpY)_!AC5VFFa$ z%~Idh4jAp6j&P3OAcI_T83Odxc)YO?zD@FsOwGp}6CKFAkCQ7*W5^)vK-rc8JZ6h5 z723LbGV>v7lyonk)uLquJ_r>b8pdX853qIPS}p>_cd_%(`P zNX5k~_!;30^cG6mw1i!_)0HBJFeh2+-iB{0^>=oj_`4XvC;~Qjs31yP_|1Rz!A#Jt zoe|@}SozE})w7peyal9LlpOQmC88eSMpKfXIDK)(!zg%A+Ui&^(*traBu(gmZ_K_H z`mT0hrKUI@70z_1^yH_EnN|Vdl26`Yq|oo}!!EFNC-cgO&MQlrAnQT?Xl215!~3Q? zD*u@mZJ-5fUmy_1zV-#4nrcZb5^Zg2*r`tXP_)$bVUC!ZV99mwM%4rGjcS>cmz;~0 zX>3_6&B>Llxe2nFnj{b_M*X%(dAd@OqV6rF_cow&=)){@XA=~c`2$ec;oBf&K{JiErAx_kA;qE@s?RAP(E#cDW)n-#%V(M_m54A zlcPg<3{e}^`K1t-Rt}>ii}1pl4E1;IE-IZ5N4dX;H+`$Okw}=&ye8I&o1P?EUWoM| zKV#PAH9mSCZTTTmbnN{?X`jgXM>{s!GLTNQI31 zAlK(Og^#I?F(XGm<6<%1yaLCag;Eg)`;hMG*jdm5>OFRa?VD3bC>TSF`N2;idd+7AU zldtC+V0R-K(ri%S5Be73y{lusFaRy@O1zX`46hl(0hsz#F;z*zLci0i?5Cl~?BQNV zs^25OQ}X+lV_S;x9{&86`GUX`)tcqf;s7N&zCE)9a7BTcd#x#|#9m8-k3uA{HZK`f zdSf3!OKJ7@iyUC&x;213%Dc}(qY0=ksGf>0RWfJ}-X)O0F1`+qzBgKV*{~33FvoD` z9Z}9(>J1!>Jr@jX>^j^aIKm@rcp?9DlckS{F?Gt-rvaxSh`E#ri*L^_>EJ^?gO)Eg zg@M+PQT)Y(#D@!dkp!utnF6cGr(-$DJsm^HH4yd9pa6j7!^{S~axma&PQ-yq_ip!8 z5*w-=$*ZkyYUOwRf~_;tPYa7rwy*6=HsdV@wk|lVft<$#+mr+CP=8~!Yyvvb~XU$zC4O&)ZZF*4# zwWCH1bb{4q%gmU$c-p#TJ?zkP97+*Drwek;KBtQ`yz1myhcLCaIh#p^gVgYoJLJol z-cgSB59^*K=hnAvVmD((vb$P71E-|9ya)WEo`7YUa$(BZk0Iw!5_^Wh&4>6pzt75A zUQ@!|o*KB;zCTsggO=uEHF$h0*A@}FI@qf2RjxcPi&m!lNfy(;e`PSyw-7{6fFFsM`P3Ju?N#8W*7Y+#Qg ztpR8dVen89Jf6<3l-}aVSYjU%?crWpL|+^w`u%JVF^X3gseabka`7#$N9+=V;x|p#pW=9!>onAU;fJEz#7}!%z zhANyvh5lwtC;kGmFCk(=Uq9Jg4J5|#t#uunMOuJ@}WT6B;e<{ zJ4Cl36B;TQJHs3-WcBfJ`C?2>y+33*e88fmO@CFiTKV>sK_kUFpdLT-21{Wfc26+p z9{saMpI&?*-X@uGR3-=MBzKEv7EsP;eDE#^BbQ4)yZWk!+QhI6REve#L1sSpD!A4U zTz-;+D3hpq{#rZg8>i<61B)P9WmYW;sflujJ*wLhbAS#98Hl~h7Rp4QUdS@w8^>RmMq^5904%q7WN)6Y6 z`IJ-IxI3QwJ~>prarJ9GDV-iQjew-#38ocWRr+BMVjW}6b7&}iqoD4DGSR0P_u~QK z3xuY^s%s>IOBtB%&We|aUKFcHSL!Y3ul-pm7uHn8`%liZ_!bxW<|rbP@aF9o=Tipl zM!vlH<<|q#X5S2GTKCTj{qGo;MsSmyg8thLxkmX&$h~V!L14%R4H{ zXHBYsw}E4I^Q(S zma^@R!t~hAmsb8_$SmXKF&0D?h@V>|Nl$RnmOLURY6Z zex?eS`@ClKuRx8h{Ue@pRCi-HQC-Ybdq-~`bz+U>$?cqXu=avNYep!9(uF6sdyLru zF%<-aWAk|blj9iwk~8!b^y3RUoSqzXr0&fEyi@T2ui^2&)(@zSa7YqV9V=}wEfoQp zm`~*#5a_4Q1R3DAO&kKZM;_)q99HUd@JWr0WWWSS&dPF7fQ$zWOkTv%#tw%|wR5FR z{An_g$tEyC)|>BS*H|`bw|BOMvhiF{j}@vW({&PbEh3%27%7TxMzdTz2=G`~G7AXOAOA)O7mLN*MCO|Mw@m$-cc$SNh{j`kvH z<)yM0N;R#J;j4$IU0ff%TB`JcLQj$D4n}QthCyn>1|ID-CGTlD-$W;+)duvtRKWr; zlu&B4K@1>dvCqIZcN3^Be2F@~-wl4iZ~R?Lk6J5RvN*I)u@%1{*Z?kWVVBy_lW`?u zShdSfzs2?7F6auW?m6r@d`Zc}9`2xQ`_&@lV`!Ud=Oy#djCn`Op=z)v!6lx7QTTDi zJ)}Nmic{Kr%Mu|@X83R{Z2>Knjd+83IEV$mx*V_}Q`2F7a3ynw$d~nYM7lW2?{(GP zH5BQX1oHKAfpZOw!CTHJXcC{{fmS*+tTf*_v>)xm{@m(f4qV9_MvjtO#c^wm>^B$z$_o-sqdHogAbzH zca^`cx#Ib)lx2Fyw1=<$u_-N|DLr>_*A@u5SP1hFS{l?U6+Lgn4#97*l`km&bPB+} zZ89+G`AYC~zx0Hv139Iy9L*m@Y&HLBa%jPY-1)uWVCnPcR3#uKG;vh~t=Q+!S+)pa zkfe1tdGKqcxStCCx%Wn6F5`_u1Q@rv^-rqEXNt2T=zRg?Jlz)|7fL57xFkF2DJg0y zir!n}sz$cq={rGX^1^7a>WeW!4BLt+rA<|4y@xtWpG^2f`OHi4TJCpu~c+ z_Wk3)Ah(6<072((Sp-U;MEwEKWY3aU0PH${^$d@AkM%7Ni<+m?BoXbcPvFz9({Ck} zMKS0*W?dEp)cEx0O0ULUa=M{9h89QHQgbqQsK#@M#h3cvj`}{ zV5Db0O?~6RC4}o_NDGY`!BmX!2CDVcj@7qK#^>|baMvSFsk%f5m21~9LUQ)rf2l9G zn3IH3;_Z^>>J8*0b`13<1^W%I%wPXn{p1q@KjXv-l;*DX?Ng>VC+a>O`E5r&_Zh(Z zq0@aQKS6|q0{i__WZDKmTBg7;E1U52p;K#6ZI;MWLz2A$Mp1t=1wD4&Qa!c~)-0&v2OYdH30slN zFqvnrC!PRqUKK3hIJ@ha4|9BM9qb|+%G~C-XZSSE3%@b;%m^wVrte0X+jMSW{G>P9 ze|+k$VVfrscgJR@t!WVWOX4toH5P6g@UTdEVcIqfbX=YZ+R4#+ER6&p%?=^heYSS2-pPF_>^K zDw`O)b;TIa#$oCOrXJWK{hGD-&Fu9ePb!cu9@ah?J}GB#THly4o=CE@J#RIr>4Z^_ zH?D_rYUws(q*&Rr$B1-YFlREq_aGqo)j>*Y-0my>2ytzA;v*}w%xczWtm-)-!|Tqb zS?vQS3k8Almi1&44}={)I8vC4Jd}(}Bii0^hF}RG2QhFMAU~;U+n`Qk170Rqk8Yu1 zSWmGnXpEevD5sXL`{fuJrv=kRojX#@&eezI!DC^-pYlzjaI@4IC@T`t99#HRYb;x? zP>YVVGyg^yJDS+CqRu45*JK}ph9QO28P!F*g5+N3G10oB==*Mq-I1RJhTyl*TQvKV zjsXdPSWt+ne$O!8f+LZ@y@tjhY9OHjih2Zf1%UNq=HTZA-J+J|`x84Ad3@S8t>v&> z{o93veQ3&xkFsG5!u!IB=r!*|gp6A-^})DbsnJH#A4vR)`1C|Hpd^ICkKL}_b}4`g zw*rE+QDNNNnH1IGbZ6nHQme`j*&VkUQo!E~Z0Y{s(&hHwN_Ntr{+4WIjaF>v;g)QC z%|ui!ZneA@8b*Q+o4?J$=2#@`2Eyh1AlhavA3eq0LEA&^&dKeWU$^efgN2*t+WU_F>eRs}}(3|EDfb{p&PpMoz})f`IxD8(Erc^9P{cQri5!?_WUc_iDAy5{qIs( zOjLn?D5r_Zi1-hM)iH(tH;vw03?7w#@yh>Mt|eqh@e;Bj{sk%j4NYeJZ!Cceg84ry zcETQn@qbYNh+hBCHlA<+Z}hJu1u68;qFt|o@b!Nb3-edD`hQOEdQW7J|1~InllXTt zL~@0Hpih4JAEf+sOyeX75Oe=)@gWZX*HWMLZRLNr@t~ghXYH<+rK$VhXcdkd?7unK zyu%4V75v{*J6(gvhyI5dpK!yJ|6$6*2VCwys(FX|^KaOc6249u{{NbK${GdQQ^-8w zX#vhU;-17B&FwelXrw(~B*L*)_l&?4NWV$3Bo2@j#)(*l5dWTIr54N+VM{+jtP%V} zaNoijEnI++xgUa+aVrmgWinKYMPaHv0| z+AnOxPk6~*{H^4yo^b5?VotDL0$75t`JIe<8u-7A+e@)kRYa%YK#O!L7VuYc=lGcJjqPX{4I-tWz1>&Fz6Kiohx4eK(df&20G4+ z3}!u-YsDLS>$+b1Pyah&c&E%cp?!Y52sye=GZ~_ zpi-rJZWU+u*sm-g@`D5;ML0(nj=h1Bkr|V(hB@59xecWxH>IeCIyOMjoEOFrZtv7m z{e5M5!xNjWn3n}{Mk;o|)g3=bQ6_fsHQ;ZaZ>g>$`CXp;yI*OiaUUup$cP`*P@1F* zY>@YvSTM=W95T*9Az^78XC{itSQ{stp^~}4#>_U1!_z+q1p9LxDC4tOoDD6rTGVl* zJPp3WbgDj4Y)s%jH!EQHU3%HpWONR_^0(VyC$Z81Tpc{EOg*CIUB@L zSx>N8frk1xU2XNgA}#CGGwJJ_>uG0dt?oemP~UGo!*00g9|@dJBNb{NjutoS;Bw^U z?)x&FUn1`-B@DS9ZX~{PLoR;(5XK)Fl{>M5>-G9kI$Q)GPIKY|b@Kg40r{K&pUcTj zrMZbx)kt6rJR7Gc2K?{wg6V6I346vX8)J37tJ<)F)1#*sjli?4q+jT*2P&g@TyTt3 zZLB+@Q{K-H6=n$TVQ<)5t5voTv=uv7OH_UlIvq3cKHiT{>sRS?IDhmNjwg**cRG`8 zB}jIA=e_~vBBlj=p7$bB_AX8cyFq)6gNT)C^`bK!SYovkev}3k`ejXd3M7gLZ);;p zK2`YZ1%~?44H#1vT1>huIYnpVw9>n@i-qpRyt>vSxD~7^Wwi~u5s^()0^8PAC*`jP zi-;iVcrg>lj+Ovg+8?2`hHTj=$MFcwOdh40l@x$!1`e%VDcX1M{MnAxmX2DCI;%S+ z2SRolGDne{us#b4ofz%KG3~`dHoSD>5H&`6x;`z*j|C>R8#GhSO(`66)icGDvcZ%T zpkiieEyYC&;W%wA#FMwrD9+A)CW#@68CJ6~EAWn>qGGEAo>2AIsTiI?PsnoLGjJ`Q zbqi2My(z~DMp&0o+4lO!MuKXgJI_i7?GM3wkqcP4_9e7e8U8$J$T!4aSIM?e-m!E) zzYPB(<_Xx5eZA1_-IiRt=k)u;a8s?C1-5c`=^aa5^8j_6JVb|b2SLuIt21o<4raq9 zj@g}h`eluMAyw6WMuBHzSvacI$=Ew@gj)b3KUrHwTojmtZgE1zNfz79V3?<09$Mv~ zh*l*Fl@wu3Ur28a+odJrEt=8c_U1p{LKt0(7doASk;uR_wo|DU;M)h=rw^V_rYF|~ zl`6(Za49wrACupgKl>oY8Ucx!=t#XAN&{RjZa z43SKxTJR#z>V^ZgE$h*OV?yuD{;p#uxNqLfV2Khik{#GB%KrHPWS>ejgcY|mWKGXD zClwke=|$=?l`)b&eEvYhA!&IG)*lEdM_l8wdVl4t%Y2ts+iBLhuz|e>@{Gp@d{-~r zz}L1CpG70OzeiD;z)}u@QqN!UU6%mu>5N>d|{7=C9WBo?Q$;=ESt9)<5^okF+m1X0Eh$OQ>m+9ho8d zrsaO^gAjT~b%;mjz(7+|7Q7~64hPQHG5tWw*Ipw};UIh3iDd%AN@vNY z3S+q%|Hi}R!-vJ6Y-JztkD>tbc8lKk>H2+WMBDSHV%z48tr74Ks1bItnNiu`*32}E z4LgK6bF>5oTrx_N089UM%b@JUPSKx=u2`kUj9QdB4^BvTMU58BtJoTMrdO;fAd0H9 zVyi}Iqt8eq7A13^USV2%0R|1xiAsc2$XWPk+~Hh$cPT7&0w*#Kc0z!mG{ojfOXiI< z??${Lojyp~sMS-vqWNT4W9^A$gt?E5AL}3x-TyjnhY^JVc9(c82A9atsM(Zgl+*0d zqylK1i?cCjoX`hKQhV;G6(@Qy>p>8wZIr9c8jt&dJCc z?s_nFayd^~va3H1+XEo9PTY4Orfyym+&kv4t)=R zSAW2aAqV#hBTte+5Lbede2~XpymEZqQs;I+=69+$>mUOC5VanisMT_Vxlp_=-`DFD>3{-rM3nufLd@R_Q{zQ$XzvVXFfJ8tnD+^3WxC zXYdxi`{P3s7u}hL$QNdo5f2)8WRX0qyIQO+Yv8Z~-?$+L-8M<3ugF zqWsXy;)zW1iLaU6>+W&uyxVoyv_5LiHBIH`Vxy&vMLyJ5S-3gY7Ph`NunIqO$(kO| zN>&~(@(t=NT6C(+EEDL2iEVSr)~^&%g?E(%O1NoT{b+s!x1qjpp4_1ZcE^?~j)fKN zCan8Id#8XojR=(&jnY<#Y}aTz6YWe`=Eb zywEx5_qJ+~{GY$NRdXf*zpx}QbF|f_Xn?s;pRWske^^}-Or^FVqb@W`^d8`( zBnf}^)hw0AJa{zhLTS#;t+k|WH-+Ah;u3fOSlQK5!WnrF4ShfodV;T_p_9mvJv(rm z#5bFz3>V0rCR1Nk>yAmnHs87~Q-0Uwh9mZc>Uw>7ZMm&oHCb2JxxT`h3~ycFfV`z_ zwkeMgc{*`lf7_yx6Kk|>VF4%3er>7QT#--40&@B>?ph@o2y zHMTQIp$Yl-u+EN4!f@c$SwAFrF-h3xA*%3IK-9x>e|g$YU$S$|v#;qHzgdk+%gVf+ z>LgBZmRi_RhJ%6=2)-;RVLog%B?Scn4TdfYsO?ac5GzgNcsJ3V2rU+Sz)igg2Hpb{ z0m(a@f}(e^TbD4tZu4`yo%B{YxTWQ0E&S>>lL<+9U$U7{Zjj~2Hx>jt@GZ@`mVUUc zr6GAfe@ah-?U*CaG4FVe1;=yjaXiOf%X5@2;uMYkhVeMS^>9fJf4hmsO+J?-Mc`?< z`-U`-EHNzw#6Z^3HOXC_i&F^w2TS!hl1(R?3mdg+L+)+Gik{1EE&11EJ<5T2L)TOU zYW4UVPSfd#P(RMF~cCnIJ&cV{U>>Zq6;3 z9{U?%uHPXiNY=@XKJbgcYkS+6w*x2@$dvpQV?HgJv~4-&4#3sBRj@2uyRJx=4BE;8 z2~j>Ub_GiP^JI|R=ryflmKErECs?)lOwP0Kkb?vIMY#+Gv;KYH2Dbi?4JhDV(%;CN zf2|&~)oZr;%w`X{S^cKX|;0+bc)&Kx*v5y@r zn$l)J?*`1_`MeWC6hU^%3whkTwauiPx48`)jI?m|c{9`2k8_)#T}djg%U}RonqO<^ z=IjZHPPif9xIeSA79Bssj241#hJx#sf8y2#X_7RCV3F~pxCI+ufjt~#0}upg?z%R_ zRa*t(vDT=y)p4ylcS9CKeF?QxOL79m`09-?Tq$9Z+yMG~Q)r10EqhCd;4o}VW-5{F zdRoics+Cq+LRd9~3K3`($}%jqLP5$Rcd$pvH{R9~(yRa>a5s_4ea`Fbmge@{kX zwIyAtE-f^L%(=dt9RtdP$_rdgWW+%j#dBE+&W~Pr?b-4L;s#m~M` zjpAx6W~H*(P!87!Z&tK{6~0t5e_{{Ia`fH`D=9!oNQus!;TFz>z#f}s+n(HTZdZP1 zP|WWO26M&yp4`r$6pZBe=SOl0u~M09HgD8J-FA}G@Z-2V@3$guPq*CL?)>ajE6)aA zY&IMeayuvYC6WZs-UWrIEHjk|;e^j8DV3bPhcMwAF;T6bBEz;P*+68~e}j2jG_4AH zBagDA!P}MRmm0=quj$^FyG_w=Z!7xkzG#u#o9sS6no5%9te&9wBGXi@PV)W^_`I8G zHZtWO^Vn3mKg<4QKB5O&vT-y^^PxbIVob7LTg~NC^JW9<*Q0YD{>x#!)@p##edHv? z54sDm>?D_BdQ;FPT#u8De;`>&1OY4lzcjwh19^d9U2l}9jN|!}`@h3DiQDTAfUH!# z3@Icrnv|gC<8B>9RS(A02oT5yN4R3!$Q2>Yznf6D!a-UMEZ^Gn4hO^eVo($)J1B5= z0N4C*t`H36hl4@K@6L$La3aUl?fE3tQ7pdtvvR!%Ry>v}QHYbWe;0+6oICWx%~onA zX6j2zvM&k-7Db?pm3vf@CSy~aYf3Mpm1d)6cXUik22b%7fk|^SEG@1H@ya23AD1(YOb{EvLr1b zOxA@5jq$Ze`ClQ3e+drm_{8k2ud1!%6NIf6p-=kyr~|%n`Q)SnKU?=iGDu`W35jBP zsbrkU(Gn}4!5(|)3fdx=SE``nTG^sXPw4n4EiK2K)R8LTPex@0wZeIU{>EJBhX3}f zqO-y1ZMw!tM_uL{$_AzSe5oPpcC7`5n=hQDZ;~Pws}v|{f9m82Xsj)f|Hy9n3hcy7 z?KjiVA_b2eJ9Z>B1xyiW@Fgu?2}JEuGxp#ds)|br$K1RNj`@}(e6zd z{QbG+iPlplC9hR+niXO4%WqI}i4%y}vz!isk~$$#;0{}23k$90+6qT7wWn@oj_13Q z3mE#(Cv1=5U{5gK-#MK+ZBTb9|5aS#d!Dv$l!U(>e^}iK5V5_%aE=Jf#nqb^0`{tGu*vfuZN`3-Gx7y22_`6O;jZd|K z;mQHyRR%0ns%nm)K+iihjypi8S1z~}xMHigK}jmaBU8m9#V-K$sx?&$mxM$R5PENm;2*iIf5qeuQNL#>wFEn>`YRX8&%8K&;ax12Z<2(c2<#hOEb_N^G)IYCYys74+F?(j0xKv5 zD_-UZe}QJZ?3(>fbu*&-8%VBmnn?Is+Cc>@whVBmnn z9k6Y{%}y5C&bPZ@+knK~ux`N39@sbFW)v0ff0 zpzXk@2@e9lukB^}{V-|3%^_Gd;O4Lie@pDeeeA3>>uuoZ!~RN$zGAsU*$=CSMqZ;8s=B)PFUN<|$&}WP@Z& zbmNr)(*Qm)mPs8eK?|dPZ7o*J#3F2CpbExZTR^^t zhf@7%h1I$1PPk}iV%qcGiS6Tr(F3L`C0n%+f~RD*N+)HTURrA2w5YWXAF{bY6r6Id zx+G{tJC4Z&H|$oj_F8kTG$$Wge~UsL02%GM>($0W$hv&R%ONEFQD)M;z?AKYk^*N+ zwgqhbjyMO5?{1*egO30W0yJ1}Eo$v#x0iKJfg`ha=J z|K&*0=I49`f6Lc`Y1DQq7ZS416!WY*Du9;!QDD^%Oy6Ko6pW;3fBz2T_XnLeHPGQ& zFjksiZ^+xiP0roqEmkJbVDt34SA8y}AAC&Q45XzJ+Z-xkHwP|Gw>3D8dr*`SnK<07*H3eB)G(UvKsNK-=mPH6<(wu2M2}sd}=mib(C}Xuq(L;^w z#VsyBtL?r{HXv)OP(^iGm!_=W!j@C)f=(*9ircIpCZ%dg?(-gn$JAL`2`PT#pg!$R z3RO1&C@Q~>th$4^>~ytst0YRX^T^@@!9L#Wq1@xw1aK{*f9nL#s)T>n?K#E3IFz$Q zwh8jNA%XTm@TCP8-zmR?K_S04$CIbmB+78nw;Ffyyc0n5bBl~(FRW>OGp!18m>_x8 zI>%SN6cXup+SkNi{6V7psB zD3|BRyCru|e|8F<>9yurEhYn`ROu7LMKiWE+bIT{)m4TO!m2W zX@jIlRhg*?Pt@PMP$hpkg+o|b%d{t-R4+eDe+rM!ge7A8f^JZYrMe`zxF8&3w$NBo zO3;3ly$ZTisxAqcfloyfoh|ujxDl0>!Rf!|cvPuxzM`#agya-Uw~|by@g{ULqnMhF zHgQ7ew-o0Zh}4v~|5G+N)Dt_KF*~cuB9g~9Mn>?a(gSg<`g6*1SK+K5x=CVL&9#IR zf5l^4OUUAe2Ik3(8WJfvFzBpyp;gaO^~tK^)KQ+RlHDIPR;C*rkP8Q;J-h0KT^iq& z*^Ia^GQS>+KY|yZ$K^-e(bWo<1$iZRqx{1zvAP0rPkPUb{GR7gy)rC^%J0YJr*XNA z%az+4o77Av4hhDLqM7^5oiUn!gwq5Ye;%qb+lPZ)`C(XZbA@kA4rj*GQ#dS!KK8&UG@eQ)?`KT#L6uaeWzXmq5DkEGUH7yFTgOA82xxM z6DY^}L3Ho@)!k$TbC=z(dM;;Sf3lwR4;DUt4QD#4B)s->O%Rb%bFD?KM89&J(zViJ zY3n7E#6Xa5YhqQ`gC~k;m_y1NMQtGFWF57g1#<< z`%CE!7klS|quCc6&2B05g1e#GN*m2?Z;C0sg@1M1#W}YWR;`4bf7nQMeqIjb$T9vN za&&!C8o5|1Dmj{-VBM}lpTQ!Y4=HbJs?mw(UCK8hB2P=!O3D^`2pGykj$bRd5|4B? zF07?CivfQcV4<^JscB43b1Y(M=oga(R8X*&r3>$tZj zp=T)k>uoK{u+xEIEVMPsIgU}_0sCQxNhy1upRxnf(Nvq>*4TT;jDArP{--;Q-$)uD zZkfb*lXfG7fmR9*s*MtT*u*f)5s>E&o&g9&2+@3P<|SNy>7Ezv-f3?kct*y-aR=!JU=vM&cmwxxF8{CpujK*I3sfy%B)bknPj)~KJP2>BALkumPwYUB{ZT;t z1Rh4!NdY}btxrL8veK$lq}ylDoqLj!&++vMKZ0H}e;sN!vOg=+4EysTzdujX7eE_N z?bTWvQw_R{DkS(RKVl#69J}rq0T^U5Z2!^Y-hpngL|Z>`Jlf(&PL{}HJ06`W9oJ2; zyqjz*ZjsO4i>>~E9=?-mfy#9k{=;elc1_N5`U^ImQNd{9M+*mpbWJ2SojXL=V z%=)G}f3=ED25F0_4Qts!AEah1oihNZKI`7nbwKMiPIlh91(8{?Zwq{Tlk8jnR*jwm zr9y_x%%)!k52txPWv7Bz3&WMU=E{a1sY~-XWYUa^E(puhOG{2xYO$jhB(l?q-k|5` z;EmV9UfL*G+&pgj%9<^~?}2psPu9r^y0%dge>7{!N`UL2ijV`WmN35FtaWMElTSWb zYLw2Es#C~0KGFW-oVEJGpHpowAszEc4<|$c6=uj8dB+2{=UcSdeK*3JlwgrbOJ7yj z>rv%y4#-$%PJorpam-LJk&0pb&FTN`f%oju>);DYHtX|=s?hnXuO?1C6p;cO;&p3P ze*&P3mBpw@dE+1L>qQ4+fq;#-*dPogSlGvM8D!Z{ts`Vlf{LAATcU31a@bnH{G}8s zqT5VcRiy3J6yY8h&@3lE| zsKkqY$FH@$eI)a?+WvM5^AwKHooauPVi3E+pBQuf89P(@#F*`Z+>fyjW0R$^WFD9$ zJ@QGut*xzz6s5v-^hJfjr=yP6>~HNb$h8$&IUT&3sp`S;($Os#bqNHi0Y*_Od)kvN#Je<9@^h00QxlWD5@F9Ao#VpfnbDeZ@4oWBClmg<$p!HEa37c zdNEMkrN^v)F5{z2QO)yLZyF1TIq1Fs5I0WRm9j}gpwH%LQJBsF`@tT(K0C8|Q1Hq; z@yc(qbbo6dT*cLI&XxgUf1_oj$gA>yX8jAP2KD#`eYpgHcDFYxm}$J< ze|;pdU;oei`i>w|Me=nj8KhsSXir}4SFU}H_*Ts+`+hdaxpx1kU|>CN*?n7IYT3T=-}+EE!Yk3Y;4dv zd#<_A0Pi*#mDa+VGTSzqYqTW79(Gd(c+zPcB9-F6#Bi&b?X)jiZ*=+grDhzS0as~u z7E@GdHYzEN!#cVTf4qb;i?AVh5Ij=I9<>HB1*Lk)zT*$b$7IM-dqY#q>CmSr5dX>EHW0N1JLb?$0D!MsHURJq3pltXUc5O$}N-Ht}XEZknO&< zOo)l=11xM9li8qe?Y3qNvkr@LZO!(AiF#` zJgMrX`2+!(_gX!gtF~%kH-ce04Anlp<212EhPEwSui`X|0LybrYm`U00qlm*3jS8D zEjJrHC(oRbwytIL_A(sZv~ud~EMOKe)JzUbZ}AnSbX0L$?NA8BpKEeh1C%kbkeXF% z^g%-*VVG5Mf6cUoD4!zgii*D~e;h)c!Aokk;8uuS=dzL|u<-$tBk*YmYq6?*rd` z_W6q!E?qt~HqlYeiSPADR{ovV)tOgzmc*~&xHM|Ae>6@`?<7~6F2IQ{?Z+Q%TOBV# z*+#o(*DlNT-E=0^q1Uw&SGAJ%d7J_akNfeTEVb{K=de*GANYj(XnLM)l1?>D1-G{D z31042m3!(0obp4)`gLw^FQw|l|6174${P+lq+-GacS5QHpl3mG6p9`L1ajr}41TKo zzqn+ae_}8&AqptCcKKt*N_Fo_<@}Z;%;c?f#5~lSJ17WUKG>NXqP!7qb%x~Wpw)EP z?bEjBMg$q`W$KPZyzNCb&|`E242_z=2NXo&RQ|w@8#zU_$H)e^0Me@@cli97a4+f(7SCy|J?jolYbg*H| zDHP7Ny6lG=>TT$y4LMC3rAMY7=|(Eer(IaUKBGbFUXM~t%H4|%{e3NraMJ`o>=ZDM zf7l+5QCclY%e}jAd4x?qHb1X7mzw@#58w7tKtVg;d`==1Y)5f!M*|G;z#UhhRs zz&85xo;`YSK*-qw{^#;S&<^JIIrW^3eirEF*l%HpD5#$0U&{C13LAAwj1}W^f3!+7 zY|U9GG>Mi2`u)NyAnjr6MlZ{I?RsKAn zU0U#81lYUv4|PxI_D5Gyryf4jwH+R2Pu;G8_X6;bPCarj#s9qfmuZITq~*!NiSJ#U zth$tJ{QsDD0>s_-4&yui3&D7ae_puX3xKnNzhDq&8~)sYTx*{=Q^MEZ1zg)!WgvU% z;dcewU8<0b4`=>7l7+=GWX|sb5c?Gn`KABEgW|4EZODf+=%Uwj7o^bYwNF?C5l|{W z3m#Zs4(<(D=~<;auuhg1)~bS<$6+W)O$xQE#=ux;_XZm3y+GHg&he+Ae?|tbUQY>m zGNs2)O-{V03OZigy?kQkqAJ!u-FX6AesOeXjaYXM<8wU)C!8M{2=+ktsRIYqI2k(`hOefOftvXO}akF%*^^>%iwoP(_ZupGh4(oNkq+Kf7yvobO>zgvSUVe zUo}xo$Zi8_fpR@u{;v=a5(Rh5qifRnXnh_+u9*B*CxpxPIIS06@F4K-jN?L#bk1bd z4h?s6`vDJg5BfzvFcR#@jRcp*k-OdF$M@m#{l@8&(o7iEr8I4$LXeUR1W$_3Xgm2m zxcmYxU%~~J)6^?1fB#eCWWxW0u{v1PTPy#v@u8t`5?3l^1ac_apz#M*kk_|BwtT)pf`}~!Qz49p?olSf4Mj*Wk%)i$egi%FllrV z0uz?5&R|1&Lf<2&LwX)Lji>GUG^|e}`m{rzcIwkE zDZLZ%Dg8freI|h#?rS z)+X&vrY;W|ur8~u6Tyeso28=~HG%FmlXK^d=tP@$C;mBF(r|fM_k81Ba%yfX#mh)B z#-BQKWa`9IMghh7NRg<7Y|k&X6Hq0E?EkfR@_{Le<` zWP5n?u2X@sr_OYr4;g|tUPrkHC)$fVa;80;MRO&*`&6Rnqe)TqQkX8t!ZNe+)i}PI@t{{n;Ivhl`1UUaI)Tcf8JBIjonLacZG^KqBL0CzP7an>qus$ z`xIy$nNgWrYNmL9oC@j0)h<)<{*I~0mX&hjZyXhfd#dx3A2?%m%wTh?kd?qy^c(pM z1U+@8eJC=|OzTLwUCw)XXWw@$b8Y+Wr@TuY9ZO&9xcx+TsRI)~`Nq+!ufK__o&KYp ze{{Y7+4`ZeVN z^EMzUSv!ERJNVssjol#vlW>7Ak^%H=sCSfGUxOrL-L;9WI*22n+(T$dXvF;Pj505 z@99kj;yt~&jbzE@APJJqA(A4Sf7?llY>iNdZBY9cFU} z{ojs&btWW=kSDitL9l*OU3MHdTRY9>PEes>Z2df_R3Tj?#rf;_dHkDMe}#UJimJE& z5$f&lG+WGR15O+YHW_n5Qs_Tr1b6$lb{iz`rZ1g8#*NLg`o~88&B!3Oe_jn@YWvC< zoV6ZEwpq?=pgM{)8CL&EgVsaICbgFt5oXv-kHh*a`a+ujLJz*4!=Wy)WiwRjp*@`> zMptog!e>Qmy5Zb*(KO9o&^n z0))F1?-b+?HKjs@+s?Gde+jqA>N><$-L3u{wO{0!!6=Mlhnyvam zUH08dDmXm$u?j-jjqh=+G^_m$cwswjpWn+gl>fvtxm<0CZkPDQW4KpKIV*77%~Rg@ zfsJ<-@3$9oqq)J{e?YL^{~gE;21WiK%EM2=-eAAAZXOJF6yO&H_tvNzQ;2?2HRrc- zS!YqLzw5&FP#tKoki?8=y^5hyb?IAbsFb%FK`S4zo4eXRkQ@B%*6;xqZVX1FtYf#A z>g#Q$^+T@Ke5%$#8?-q{Dr^}0jmGb}77v+tyAx4;8IRU_e?#*8g3B|^x7ENtj_`3; zU`;oBvXOvj7#TDUr+tG^t|3R&esw2xcJ;nsMs8sgMY}T!DaS#bE9Bd z@8sl+l0$xUtKY3-ge}SZdt^AZqgM~CMGwnY$1cSauCxd2XSVbkd!=Zr6)uy z)VT#$$62+%mAn0#KrgbZlV&DmjoW6)P9%(`$zH3Gt_5kIXcKg6p*(H-f>4LnDuC>jCocw|kZIzFW7 z_M`fOndojhrz`N#XMxh=E4R=291u=k> zpDcEqf&mj08QW?t?H?=P7wdOJ#9yV$b#)uD%@FvGz1;oI5 zR#c;lv7a=qF|}atcc-7WM7>(_-z=}VUbC{4 zf2npc=mvVQUH{hry(NO)u$)di;nq-2Eji!vMSA_h{T>+6=H-9yh@5RZgI+o3MsmfV zklUBrQy9$k=7xKQu^$IJwL0X8tcqQoz>_G#s@vlfAqwt&@52Snf>a)M$du$>cs{RefmJ-KWyQ6 zpf^+@c=jujA9F{mYbbf>%7m7GM_koK6?|LyAQrJKP~v$)qe z<>3~DnYyId&eR=Io?RaAA<6^fXPm%60pkCQ3&{O4VvfGM`sfT7%l4TUUnq|Tf9Wq+ zzq@o$>}=|YOwC(Nk14utfP^Ww37jycIFk$R?p6269_uN?2o6<5j3vTj_ODG>-_o%zSH0|-vYlHj^fk9bfce0EU@Moc zz7Zrb-uMMe&m(wR4xu2|KZ>)+u@}yfy-?tlK_LZii@qr6v-Kth+hAhK;Cc8aQW!if znP$2*dmHf%4R7MhNB0F?@&H{nC{>Y zcXTk_sP7F{KY@Q1Tcxx1XiqMw{_gGjw_V%UlOhhb=P-~XXfzevX6@4 zr`eaeu?Zr7H`~(}FJCy5(NiKSjdn{_))G=xkQ!Eu0OfKZn_Z10rrFsI7q{*Nr{P3q zOn{Ovk;5}rg=Jzj#l(AA8+x8yxVPFfo z)rJNHA1X@ZCf4C?8|$l&C(sU$4iJ@~2?G5?5pC9&TCxcWf2PR^a%`$rtXOfMzN}1N zxU85jnLp4?Og!eM3?P#@2Sk3aJ9I>bSPP+TH11cd!wtQ2BZFG*gkS82g+7j^GTx64 z2YU*;a)`&&E63C>!BGzjmMiy#-GyEG0d>@x*Z0L>S027Fdh_siTg;Czj+5ZPa_!6Q z7Cbp+PvJ3Kf5b!84Y)PRQzNimDY zx27r50M%%&UbloS2Mgz|PFyO+2~|_4`H8z}uvV&-xLH~I)4TdS)3L^}6;7VH(e)SQTY_ka(e=aMK zHl^O|Z4%1R^kWIf*paGQw_+Ptvt316T?r?qJtqLQ#{&!bw0sO3Ys>JTrc6)U$W(-} zzyZ1%G+sA%#+e_G>|gG&Z%prSel*xG5PV-3>z*e(G)83EO~)Ks>(S@~R-qU-8Wmez zFS;X^BR-Y@YN(D%+CVfpShY*ue?>MIvJ9zG8W@)pVQ`mDlK8OuPsM)s_j|lYNuf!D zeZfeV9zW0qmC=4G)Tfr9*PFebhNYLSyOi14v_o@jY4t=cb&~exFtDd?OG?0<$Uo^* zpu^L8Dwu+T$wS%UxJv{V?zzy`{11Lr_6!FDN@2s@TEFZ6bdQ^H9}BW|f5=81s?Z(r z0zLM`IqP}{Zg-qB9vPc`Ta1AS1dpys)_=4Bq^{Sh zyieJQMSv0coO}(6S?)dmiD{2ME%ZJ zN|AUgOKxpL1ohf(V*KBdJd^vyLB?hm40q6M4VkU&W^33$W;rOtMWA9ll3Cb`*S+wkf_J0FR@<@14!Sh5q3XI1hF?l~UveAv$iJ33PPeck3w=HZvzx3`)2K=#|o zgyw%aq0;l+oXT82GnMj~p32=2SeI&h*tOrtZya~5^xd|4aOVrGbT@!QAb6&6!nk>v z%O~?P+|j1h&lO&^OY3um+6c;TjL_H4Zgy?A%<-4=h4_Bf^{X;adrSZZ{T{Lz4s#-Z zJYU;kwnjm_$|ttmd~J@JxYYK!FXvyCPd0!4d$*oHa=VXyuHZg;zMvm{03VevV!J<5 zxaTiQ2OG~B3&BV1Cva|au+k&-*}|Ph%J~D@193cBxr=gn4R7+Lf-SeR8^i&wk6I~y zZI?z&moJU*#Xh_sl&Pp?7okl4&18ULZ%=I`1r){%w%*^f$!KM~a~n-#C!{0Mb1r}7 zn04E(d!|%2Jq|`$bXYD=&&6v(NNkkI;8jaWuJOJ@e^=>m+z%_eh#c1UFbNBsPnpx+QZXEiNT z*)$dgq9r8JhS>u3#;-?_C`h3??^c|;P8J@5Fsp8#ghvuNyM z+=1VW8Zi77$bph4N{$BH6Qx2fI{30Hh7YF(IEgTZwHQ)}awjZ%pJe-gfNlMW#W;&X zEouqis7%Ge) zH^g`=%$3&|D_S==-@OH?D-Zu8BZWPvF*m~Zhpn%Yp`edn&1ffI#Im}oKd46Y<-;=c5V15VF2NUP?p2CG>Z2d8AkMyYuZ08AX-=uc2@17)ue_@hH z42zWWtma9|Epl(g8Tf+IBrb1)n*UK6HUBVzQzTBD$k(f;<33K(gIS4&%JFqskPFw- z`)ZWpkF@Cg3>bPCx?r^F2$EcvurVmDw8FRQ%{3oP@=ku_TH$=yqA9NRmDZ{+T#vKy zVDSeGH|wBddZQ6n*U1#>pb{7Yf5`6&2}_;}8=O;Y<3J%L3f|NB(J)`X1w%9dX`?D87edcOC=5XpKtt=2>*rImT3xvJ4kk zQvo1(@3ai$qJ~ES6YGG{Xfnv1H$ErCg@1{h2K(uLvLJrb60NO&f6PFgPP=IJH=$ur z>q~jY)rpCI2V@%}F$(E3*vtnt3b1eV8Qc%pdzC6RPX;v#u`$iZ0;mS@e&wVq)k_5< z$@wNo$3gk=1#mx@x*u=_xY(nH7HB~xG^jy*TYnU2v!c%ia-a)6zM9MV54AoY#MBW^ zdL*yyc*et&?|lWje^|BcspneG_DJr1o%qU#8>@cP7xxUc(+1Sys+kL)MGuekp zoOBLJGyY+;Dw7E#+E?cVc~%8$60 zxV#A}e_@xq(L{FDqJmP^P1+S!R+iSH7$Pi$#Hc7#XvImYE*4Eq+ze{aMEF!uKhit- z5mGf#MQ(I$@mp9JwiecUy&7H5)T+J^5!tpPU}~E|1Ocz_bmYAv-~Tlnc`#%*yAI?F zLNoLR1v&f=2>$;*YFQ2Eb_woY$Q=nz1gC=Ce~?TG%`lkTC5Ph(sD|9m{BZ7pU}vt= z#|WaOsq1xYjt?5U)$%^3qD1QKIgon&A*yCkvm$1&1o|04y_eoSOeiYF$s@6cWDSST z0m^45rE(W+={0$OU!N0y1p63<668&1_d~^%7LAp`)ik*BIhUBvB*r|a+7IJQVT}rr ze{&;~_aj5)Ajfo2MNG#Nxz|A|IJ9zJ5Yj|pFyWQ*A;nxEE%s8GG2R<@xqGe zbK|ucc;V$Pi&M>ONN7RrqnE5+dE&dDod@Kd57Hnq)|gAl>NzU*&e6$^Gih1e|ojy1(!Mq_4d{uqWqxz)L8whq!!G||3!g^ zO27K8hKmir?!SBlIbE$@0->>F6fNviUG9EYO~2FS{$Q}xXOfn*0(G&zpmGxxqS%^M zspacT7vfjX2zM@6EZxV4w0w_*(zITwt?%iSA^jZ>(TVJ#V$TEX=KoLpj!X_#f1`;a z%0}`mG2;B?#{zo*>5&(%uMoLc{*x~y$>iAp+^b7V?R)cwgY*GlH&u`ZdYGb`^7F{^ zo5tMT|Laqda|(+9vPjcY%njtA1q&_J0q|<_gR+tA%gJvJ{G6dYY&^ij0U>ro@(Ce= zH9llgvc|K4qrFO7J@)Rf^{-Emf80+avc7Zz)WP~O<=)?qip)T$33S91#yJTZ-VRvl znGHE357PoIi?lMh#T^T~*S9btxLXbDS1dsf-pub2jPn9*d83wpk6Dr)ZJ`(@Q=35h z?~vTz#*C}qW?qv2GroR-Y_xq_w(YVa_Xp`V_)b7<5I}abNiDs-o3u)tf6qJm6Ef-x z>v5|(7bn=zB%GHEF@G~;WF(pvC-`wxkJmJuE!ohCLVKbDKX8e}y24!gv`zu*Pdi{$ zuJ5(L5v@a6P)un0X9K(8I_+;ZR!smD`ye9|V9M6=k)Ui{hynDKGw}Rfw(WBPMHA{W z&g8%n*dc$xuY=}xA=o20e}IMog@>`Bd{4f}@D+IPk3ugOMwqRPTzu1P9I+H~jYP7* zYRsJ({J0=5b2hWO=_5eAVuCG=$fEJx9eIZwJK{Ha`*N8F~vD3Q)eA>}zr4Hlrz${gjeTDxtIODQ!CS|jXne<(>A8Ut!g09EGH z=}OJ!OLv*3UGn~um?k=1EezZ6*i@0v!v)x0Rh{Wg<0U%-hgw)8ET<#{rI;L*Vl<%H z6$A4Y>SoZkNCmE{D0_+wIVw%=uL!Pr3jb!X`oF+BQRD|~5qpYln$?;;EiJ|U+sviSIfC~3|?|}^|vWB&bbQZG(dN1Mn!h} zQ_Zg7-%Ks#-C?CbMoIK%IhHF6NA)*PA^qClRap9xz}y(@^=Jp(iE!MWuJ3 zwdxYZd6V8ff1&zXvQZ{5^v5Ijm-HL)Y`Bi(_)@rs_HK9Ix6ACR%n>xlQHM;w}n$p{(}T{*M+R?ubm zYZ}^6CG5s-y)J7mGo+-f4kSa`?hS{0fVS~_G;l=lfBOR$q;Jv>9)}Twmr_*&pF!ml z`|jZo)6-W+Nt^MreF=kC;Pimg;c`+Yj?jmUvOx!wm+Q5eRGX6efzjhuKEIf=aP}Bz zGGoP3do758XM8>snDTxHi6^TJnj8)VpQF|bD6L~C2PV9vC@rLY-My?$Z&}7K{WDK^ zfrbY)e;KnNvQzVX?haGapPR8(9fd@(1=PkyPBKobW|jq>6L}zn{@%bYx%H*o0_!|~b)Qul zgDMr@St9rQb5fsVY>O{ME6Lo(-0v?H&LR&6`jR6}_w zPaD3y`g>M;HmyoYD^KL(qh|3K)cfM&f7ZfJK6oq7&r0{+Mqd`+2Vn}n^L9QSGmGQU zaMQ=lVd%2yeQg`+u|3E`^A9@A6YkI(v2Abt!~Et*ruXtH>G!|S_WO78@rfj-yhWEr zWRkRuRP>U7EObtAfMVjq{( z-sTh~8+s?})w;gC(rm@0W|T>7e@0WvjY(CSVyN)2!BKa#RJ~i@OGQcMDE% z2_D?t-QC$}a0~A44#8~$!7aGM#vL{qoWuJ*-&g0Hs;QbaYozB-Pj#=p=eobcG)zk1 z93^s`M?ns(6)h78Y}fFT22h(RDwv&QFSEueJq<>OokIegm3+dE8bk&}Fxn;J%vqJL z{+wP(lT^tedB|!MI>MoOC^W3M5#tcmjhGZ`ZUqb4wTlMJpepx3h72RBVWAaBMl-50 zi>?B`Dk#9`_F}jsJ4;U0FGH8}_hMqc8R}FGBP5o%LJ^-F2+<2qj=Lyc-FcJrMAr;u z_>vraEGD8QCF>5tO-YV>RPoZ|s^U-=Fq}WiX{-Ip^+p@SvP#X{PaVNzaMNK-=yFNA zs;e0~fc7fHXLmG$(*-Mdi^TpV?)knBZ?g|rlMm1BhZyJUf{ofHLYeTx*QSECTq;)n zTZp7=n1^;l3TPYDUr*l@(-fufDo{ol{wzgNQ0n`IhzDAIrKPu3nTx&=Obfli)X$9F z2Wn@yrPZ!8%i;EWzUD&p$c+|)C2tkcufGNeniO~WracMxe9Nubyina@PL7Eg)QL9G z@XaV5@$WR=Le$m@)}`ucue|FV5f*;v7zq@9=o+CUi@9_ON`Ss}AtGzbTx7e^`|-*p z!l*qe@XGos+U+p89_%AvwKbjHhJ1KIdh1!Ac{P{`GqGb>Gp=+5kzPLXSr}?KMYQe> zk?>UPsws!=SGQlfaL|d!Y&mVxgcj3T0!&%GS&3?blI3p$01eNXqW8-eUe7=7+=2s$ zP4eK4M;WBO;?}_UFKQj`fj<5be3%$T6!K?#7ifY5sl&UhFKDc4cblxedP1oZvD=#! zhN`?f>gE}fy%bqO6P*5O4gk7*J?9KVSC|+2qmLh7LviCk3(H%DjoH@7C{Hf9q<_Zp zyI**E&lbG|B_Ja|eHsEC-w=&;8osU(o?1uc)y<8w);=Z?cQ=ksLL$Bqf^3fJg(bqA zd7BWvOAq>V0O-m|-bLKJXVJUG^P~?T0?X57D0}LuJ1mt~Tc^jjWB^*8tWHc!Ta`_2 zPnq{0<|ccuiy{p|*agFcui~WhMH!QLH`V!5OrYYAG4Z#1!N<|!?_$B&wycn00pazY zhaN1*t<)^IudcMd`c+)DV&+U2m~Vbmlqxc z_B`W;>gYMhoc0J%&GSsJE0k;Q=%vxKQ5QnU(GhrHB?;O^78&I4d4a?o3OQ-nhE9_f zQGe)6(&ncI%c4Zh_Y2D-z&1GdWJlc(Q43}-H&@Qs#hT#zvslwn@vqw0sSd9^P&j84 z&+(ml%LGg+hykvtuxho5Qp5B;JjzoA3Ub>K_Kfg?`jKA!!#d|4CGAo^iP$I2Kt(Pb zno)+60tW-XZPA+f&f#Zu4ZIazsWB@m*trzhs_v>bIfvnczw8M$dCA=^ZbN^8Ts|{v zbCpZ-%Wz_9matVjwQa;u!r5^+Init~S3WkW^zwexx`0-Er-p2Ng^WSaqevwvz=Mc= zCLq11ey*LWG0%&FDYsgxg$4dx_l+DspGSW2Qz(O1+d(MnDJA&ps;)&9$!vxO)AiyK zEXPu22|TcLBb=BTVYOMXJ~77m{n|~<3b*t*YcyW)P2Ta#E=3qZ^i@0X2oS>L#jK{M-DYwUN{pJwK+)5Z1OA>#hho;x4XC> z!d~IYQ9&Y*#jNU>aELc&b(CzNkpEB`exp?2z$}fq*IDEWipnjLd7yqee3zgxcSC2<6aEi-^YMz>S1WL}(wtW)#TAcZnNt zIas{KcIk|kv!JUnn&ne|6ez1;-q`kP;4v>^R3C$|a?7Fzt>z>Fmx zgO+WUL92_>zRq?S+P?Hg6ZdDzVflF!zkAg1W@Y;QBqA+<87*C-NbcK;Er{MB$ZNe* zi$7=KTh*QQh(pHlda|IZ1eK$Me-D@Z-UD2h>k~-1LBwdZGQ&egX6db8nH19(J`6~L z@bgxD;V>Rvz)jKzp3VqM?PiXLa_=qDELK;-!9 zlE+NN8W%qx8vrXLC5k~pfD*(lKM{%b0mlamFNhZ*@q`|m3(pI8pi~?^0~=qe=IW1Y zQJ0t`uBf~pyVS|m0_sZ>rJ5Q9Z#c&P_A%k_zGrW|-B1lu2#;Zs6Ud zZ-QEqj78)JDlF;CNsTGi84iD{zbaX85Siy8QFR2|{GKQy{p3)OoP2AQ!I3(qj@yTI z^pgTq!bX2=?PRp|g{b6vT$?ZC2`D={84De)W{Z#Kol4MmV{7U$_zn*#w=r(m3R1xz ztaJA%CDT3_mHxURQZr;3vAl$2b5@C3a#F* zJdSS%Pk33j&$XE-?0pqPRw@MjHiJJW88!Pi*wW_ZMCw@);L39Mu(x%Y^-Vh=9{XlV z;vqhSqba5zd}8X+puVAr67x1>FjTbhR`7bsh=yWF|7m2YHdH($G!!~?apUORK1+o1 z?&`AsDeP=;V;>;ms+h;z0+>fpnrm%^p`850Fcm`B9x8pbpgZ-|oi?A-CEZhQ2WZlx z9*v+nb_HoOIhq zS|DUqPtDXffoe7`bF4arAE_W!!$s3`+D(`^!6`JvPAIB0%d{bET>!FFSF%iCAU}>A zgnk%`ge=u?^|fLa`fdhd-D)Mp@qT1OIpW7)l3WcC*LRe1NUiib^GxBGSWkDM+H~`d z^fqia%S~}jkfe&ZYP#5YG#>+JKx(-9_6=>OqdYlE{?31P{P@RLtp;fokTBdGLP>w# z{@uOr*^<^5b)9_HMZi*8Ixn;SiTw}$e8+gNWQgFz-^F%tN z`}CX6S{2u;C)Rpqopj>#~N@>Agc(Okp)w* zjKtK1hJs%Uo`OxRAEC*N|NLWSo2d>#cu z@!Vo=Vs|bj_J(cNc8AKHOi@IU&>huAxEhLFkIkfmaNTJ*JA!(tC@;~@+M5Y~Mx7lj zn_NGO3Uc3(K60fJvgpsgk=4~SP9rreVg&Vx;x>VDo;?uGnbLPHah8iW=oLx5fGOxXz^rIn-luC)y`UT$s= z57lC9yBIYG@)yn?mQbC%8;#X5S+|G}hWsT{|5BIaV^y3a)E&ZJ~2vc>|UKu?!EI0jz?E z#T!)zZ-6Gu2XIENWOoKiiNTL`kR@Ny$%8w|?{n*(h_R-lst0D1Jx1hy(kk$Q&D)h) zMFgZ8W_8?OJnA>FF$3TexYAS@+!QoEcT|cG_9ruz;%5;Bd$FRv=kd}RU!cOaBvOW356hd>pn-r_W4kdyWJci&G@`{if%z8vG6t4x->>&f3bOL?Dq0*ldIa&;Ry>*zfKwOH1 zH2XVws6lhIRhdf;mbpKnqtNjj->?B}f^W75yPtZ_akidE|AW`?bXEX$3te){ZOV4W z2_wparw=LKn#$jdWOMAE^#1J(Lb)W~&*eeL2L!y%q~K<4RBO?Cv#+cS04mnM9!wuF ztlI}|{?9zc>`N+MP{+Tw!U=c2=WE#PC8wmn<>^adxKiU!k}%vo>^uC8#Owf^bq#I@ ziwk=govZvae9ex)s`vk!;QM^rzxjcCJI>|!VmiINt;QUWD@De37!y#uF6AfvA|2y; zk@|brI{)>8V3U}HxQDIYfg$!i^NF(=SpAMFB^@z?w)OAh|HG62AIP|v^yO#{Gz5e^ z0t5v9C*a-G!^XaiX&JE-`adwa`a442f05KaqS1d*@h1z)e?9fTxEk{CraSRXn`( z|3+>83Gg!L|0O5f;pP5I5_rJR5&Yj5<;E=iyybtm_Wu`ekDGoi1BsQ4W%mW~f1YNW zaT~#!yaiwaOgUn)V|Zrew=xtU6&msxM?n)|hvSK2vRo8G-6z5z`bOn!%9?fB)t|4H zoZ#fec!6Xwc40HF56f!{Y$@h+uP40^v!8^!p3h8fM`oPfw3!3BpSS)VC8d3jRMTam zT*Z*ppyqbb#45*W1^&dJ&+mL>{DVg!oU8c_!M1-5psjP}k9OMM+0n$qw>Z$*(&QLz zu6I{Vs|8S$zjfG|wfw?rI;x_#SE{xqK`HH)Idk1K|A!9yUw;mf04H>Ae&Y5t z)Tnl?0f=rY>OT;{V(+ zQs4o7Qt6`g?qh%=#wnsUYXY>mabvzemMi8w460j>KUso_(5Psgdb|(wDSC9}tCDB@ z&eu&uV*0KNR5}E%+4zF8^d%l&pZYxU$a6bCM#!n;b;${4At=-l;AMt>-v@~mIS_;_;Px+EIJwIOsdbLXhj~u8V3UJGZ~($Vf_HrFf@KZyJEQ7G;tNQVmMHO9 zHK~tI{v2^Ln*NTPxieS0f&N=LLWG}j_N&B)&TOPJ2y8PX#`thAf|J;%e#NJ+G z-Er$NXQJ7@J%i{oN79m5NqF+yBjn8g`5Zg%F>d`nh z>bXVbWW3wfC{E697Ef;2KZ4lR+nCl{dNzC3wx*r_-=6(H9cPG5gj#|H0)japy%7%* zH@#bx9632|gc<-Qk&$cIzu(;gIlB0Djj%wVm#H$Be^YeXz58?Gk~N=Wn6u?quXr_e zBIL4_y}G&nEr=5P+tbrWHaVVv)7Esi&+X~tdDD@T7h3m6{kC4E`14T;ELiuMS6y1?Lxmk%0qhF246h!<3q%`~BlI~uF$7=(tsUB#Zov}>wRj1&foe#` zd}r}b&&0&evkw*bx%mZB8$aklSYrcv%hOsFSwK|(-UzbCm5vLJ{8bl2{Of=N=py9M zF&u>K%^%>%=IvMDL&Ur>JVP>>@0aiE$U8`ot>OfKDhMjue_+YWcEzHD0@`NBE zC~q0Dc*ao`SRb5GlB&!>AI{>SP;zM;clwC5aI+wEi$(OK#St-5t;GZgQU+z- z95cc3y&+6*WYp8JBGBhnQFOwdm;fCwJ{SVFV}8OHq4M`NMoIJ)M3X@kLGp$Ivx|xY z0-(UuplZl`7=I)%HpmXb2$>Jfo6s4``HM3W7zLyQbPJjfI)Y?_Foem0%z^EO;e&tV z2XYw0I+KDqKsdnaASGyF=yr%lU!WCaKD0k{0qUcaD7-Uf15#wr7iYu8FH#FD>hz|Yg3`~G{l>zcX_d-14 z0u!KKt$_)UuiC%_Xn!Wq2y`zh7z;uK6PyeoLIA!9%7=Qa47!4NLYiM z5%Qx)kP-SLYS0zrs}#@)>eUkH1o^57bb@~M1b()l2)u&wX9Iab2cm=iK?Rb5{z1P( zfY71dF+k|h?+Bm-sCRr&0`xl!ND1m48>9sNjslv2dM5_WK)*wQ*r49OfY_klkwEoO z?}VUw=yy2K3j_d*5!?m=AOd?q0Pw*7AOK`wbchcOa00{!K3ECj0~jcjr`iF|@frw!Fq3~ceVT(i=oMnv_j13ByoOO&P z3g{Xb{^H>y*dun+e#OQ|jD@9z(t@c&>Sk?VaaI6j!)#$Zb_3C|9(SNb#6i+X{>?x< zm|jVcG~%muFc}rt3^p(a*akp)^$vEzdPIa0Q325*zM2O+;XN`yiD-ZXU;?v%N_dY1 zP$Fs|E5uj(;Cw2u8*E@6(Cf3}8f-)kMurVc0zG7ufeyU?1)yFVu%7XdCg>FZhETOa}X&3ktGXu4_j?E3*1CYpVdhLS)xww~2&TZj-%-vH1J-Azr zJHp8S^t^!sp}1QnJGr=97CW1`TV^|-r>u6~0Jv$){^8;1+K+O`WWT|Q;q^`6hVW2a zG@Zx9aCANIKLaMn(#(RkI~Cz(xTMYC_V5Jl$BJ+|X8*~75f=Y}fn?m?wE;R7|M3Ae z+}`1VWnDhU9UEji=A7To;{%+yc`e|a@Oj+4HgHHd9!pN6^U{Dk?zGM$Kk@{wCUZ_3 z3Aia-i@Do&XC7DBY$qhVz74E{oZk#a#a+YgolPE}W>B~c3Qr~ATmcj0+?WZ${5?e0gD)*Wy0?5!A<$xpoLTuw&kom)DdhaL|) z9s&(}|2-EZi_YNK{gJdeQtwLDi(dX#vO$DnpmG_pRpp=Xz$&@?YyA$rQw$)x^g5*Q z)T*#@_948Nt+%ytZkzq0Z>im)vG{NYS<$1%ELd7|q}FjSIHuV&3%}#%S-Ny9)P)dL zd!#n*o40G<%yF#NN%RKU44lD(gn~a#Uj6GRVO7ae3Q)}D*KjSWIzuBBrW0c06HL)6 z4T@9F&kdOO_wjeF;^H*yRj&H+dHfDmK1sz_H#0pLn;V4bP|s^B&&x}Wo&~_NrYEO| zC8Nzz04}n^ERwba*+9?O8yM!G{E#D-b`vrCephtne>eQfT)8-H&NxKxFFJAG`l-#!h(_7#i&G}q1HLPE|b56!D#kK??;mhN@`^b2C~ zDeZ}9QEcA#NoHOkL}=^Wu3`oX1Scyl5JC4oI40XKR6?R8<1Si2Iwt!sHbP~0B(p8C zL2@S>Ey)6Ud}8f75*2iFb1e3&Jo#Woy*3E0xI{4A^r5?#r(Z79*1WDDS0@CH{V$+b zi#?}UT2MRVdnCMkLeKnN*Lt+$`h%j#}Gr`o2I#=kD_h&)WsTVbK?^I%tt#Bz~N zJ$i{9_Dzf$QJAz1o7qQy4bQ%VO_7^1xM z+D&?|n`oj{r;u?g)s~NpTeIqV5<9e0dP~6U4sn7?sj8WgRVQ8*28=KRH0Ld3Ne)-i+BKnIp>=rDwWe>9-^ZyLX3_3_?qhKftac7 z!9Y4atYj9-fWNI#=CR2vN~uK=-qd106X63xbslAIPF!$T%3hgB<*a^ITWZi*DCSO} z-y8(?3XTb|vtMnsY0Xi#N0iWsa|;F3 zo_m;#HT{_=_sPg{q3MjtT-@3JTHel394Qcumu)HkbWU3m#?6M_`(6@5m6^Ep{e_YT ztn^Dc?-b#*?7N#DV^;0o*6qGv)eYTs-py23*Y3a8>wx(a8)ctY31$IZh2Jz~FuHrm zENu=4k13sYB^#nP7SuNLD{Jv7BLvw11KmtnHl^zWdZX!Ui!8RIC)fUhXGwp?golWZ zwD6+(KBYUIyM($op=T@U?fBmJyp2*v`<9{zKfamTVX+lf7MeirnK{0Cxm-0XSj%CX z#F5Bf%C_)JVg(Bc`J+84d$s%*k^a<2;l7KsyWZcq&AeNGpZK&ev(*cnOH=L9f4{cV#Xv(9EN{!quxw@8?%`U)5*Z&DKjGQHwYP0&TC)_pOG(yN1tK^p(oVK(^7co45L6HrbUMakV_2`Ir@39 zWm^`hZ~l_~v$e)ioYAyqIW3*245^0P@4V7 zcjbDJw5px*Q~o)nY6GDMP@+OTR*P^5k6vywp9L7KTGDn=G_pqR%aEQQV6J@Kuf(VK0wgf%uFA?AlpDMw+j{(v4u4W*x(Z=T zui+pwY`-5LDZpo`l4+n=Z!_KYJP5Znr!igqeKAORJF%bY6@6a zMehDtT^u<9S9rjb4X(ANnwh>qTNj>_JnY2(r)mDhZ_Yv$Qu5L>sWL+$2hqs(Pyfuy z!^#JC=A;Qv9vi!Mp|t(Wp9vb(WgC?q95z|XVg)sw!1$ngp0R9=)!#@J<9JUT$zDaB zUE}HHPffsdtEU@cfc@MbO@v4Ce{C_2>M+#LZO3FS*A7a@4$n^ubx!uiat)5T!BbL7 zmb$*HffWarUiTFS*K_U%swa;tQCOvS_@YtE87me1G&3|z0}zHwGGca z*C?KVww%{eF@@Xe1z2N|6}5m>=z$m;z0|J;8w_I-N{qoqdVo29JqNCwyG}Zbh_hT# zV^Eq~%wE;8%4H)w{i|2tv6&gOO!lyhCQ?pvlcVO5zHvHx9rl{CR}7g$p0<>GNJ~_^ z)GSs0>#Ow`pcq;9So18~-*CcW6p93vg?w&`6sQ!iy{oIVqQ3XnKS~JF-a%!CM-buGq=j z#VAEX6peq9>3DgcLIs~B*j#Rw{RSM?n12n*zqz@?1N0zvm#eUfR8^uKHzb$c_8w%G z=aO!$B@Z@o^h`c|bCTf&d^6MIe2k=)lw1da0GJ&qoPgWM zDt;enRZEiht(atyLeR^XD)MMTwquZUu%^+0ax)LW+aB;Mu6HlG-nQ6So;Q z?4O_t*bQX7SMd=MJI*iV&F|_45pimDFn)&X{#ViIrkb(x`bYsyOY9uriZI zLHcQAqX*u0tRw44uHBMj*AMZ#^;ic@gQG_%xA#R`{hAFn&o;A3nENI#HkOXgn!8~L z&x%n`|EQZGhoRpzA_a5@|DiN0J$P#4qqHhiki_^47O2hHg+Z=!IaU1@7qVFEX zq9c|OP$m;V8rgF<-`7tH=T(vnX+}g9lHM6tsL8jT>DPhk`b#LW)+14vtyF-ZQ>lgN zkFF+0i7T?+aem1~p zZAm6LIW)pq=Cj9Zk0Z|+>5%ULZm0jk18ya1C;J3u%s)OhVO6`ZuGk6K1xD#;ksQC@ z7qx!(o-lOss!%{{*(~G{UU>i6an#6=KTi!3`0kt4Fmu}c{L&N=kh$HV>c@p`t|_5aNckvfTCC@_VII5!NScenqLbpa&fr!0U{Z)j%iKHkKylkJ8zH+oO>lM;zC@ih zI&7CtNFfz@@c!4(v6(J#{xopLlzXb0taXehYii!jSgLvR_u7tFCFSSHLQ*WdZ$rTM zmR16b~5{-F?wKZ_{M zItQ1yh)7Vj##b#yq}6oB^Xhxd-8ZY3vdt)UBN$0X%mtJT$b8A1ai;f)puYaPepiyI zapu34Q%+O_nH?@(O=D;>A!$nO5NosGph9&j$jMgDjm74vm&dFzw!<(36g+EXIGYSz zBW1x)^6#>f*fAMW1#B=^7+K}ayI3Wv7%MNgNat|pUHam-{%Rt0lW1t48TCtTqkTD? z!MczjLJx6T=xDw};d9Eb{+lE2nVVF(2uDz??;5!|envlEk4rdL8-Sy4XH-2icDq^o zswEC|vicaR{36&XarX;(v+=-DzErMf$hxS=j30?i2qdv_0_fqd$=%Yce3`rQDUohj zl*gqUI##n`2cHo?YoJ~XST3F!M#G1mVwd=4iq>DHT}`iGwiMq8tyai-Gkj;-Mm|x5 zKvxhNp5cOCP#MmC96(KR0v`-IUd-L2;q%@EEB?GG;1fNu&FbSKS#EP^DHG|%?$r47 z5iW|Eh_BDc00dVp{#8*CgA;Y9^7BvH=3y2-UDPL#I`t?+!R99MT?&)Ia$U3Gj{}B1 zw*0vWVW!K2bSWN{E!u>QJbH8yNRgCNikM!@YTotDQzsq=j&Z=EArd9rxyy*cE9LnQdJEzj!iMH)Q;Zva$HEpjF33MA>jH_lVw=~9QTWPgpA;OW$)|1* zm!3hGeuaPuG4+%wJl;muUI!d5qI+(Jmid@uIqrAK%bS-H)tMi`KV!t^3*Jo!oNx(d zXkxg$6ang93f+<3hGCN!Co#c@HZ(4HVc2X8@jgGp*LcG$Xe+)^UwKHZSVHA%U7`d| zH9@ct=48+q*vf5_+b_{5ckz|zWPznxNdLH~c(T!;c@R^#kTX!uB(izD^pUZdzAZ=mJ0guyUX!{ zs^Nk1oIV>?7BPNT%O7^Ka%rq4;duUr&EO^P;wdYf)Id?GVVc#r%PkCxfv7R}u#&ve zxHIUcTnn!uu?VZv>1^_F{6s#IjfMw7g6P(9nB`>y_wyzq=Ixptf)ld_&*q)ko9rQ;>h4&I!!2=qY04g{C{0^@l<3dvyc5ma=zRs z@HOrhV8f?+5TcLq0Aeb=HWa)lTK*7(*WIXSr6B|T#ATdE1YLQG)+6YDt8J{4H# z-tEzjO%$PMA8WFtqN8+^XF+czP^OjDUDNxDx{C|;MJC@JSw(?2BEG%)*upnkjgRq-{eKl9to?0yfu z1E+3oapbC3J&_4&#Oa_SN6z^5dmW?jZw;I4%Bda$?qDH9R0ZjheytKM^dH`o9U=OS zh-_+I4p7Yr8&<$KxP#YuKrh`?CCfxr7j>5?H`?ES_~bpz)`^q-%ob~bi{`T5A|sW` z&dNtqpdxJKYD%rRY8b_{svHX@t|#7Ejg6W5ws2ORzi=H<8)~I526=a^lm&fyyPY{Q zp;Vy`wrlF6X~n&p-tluPy7I%6HlxG%!kebvn>O~&Yl-RCM#n1!QBET z{q}+RyoMAUnxklfW#{fBCYyK!DApuHV^)teY!K&vhx4 z=O#$mLDW%Wc>jZ@8oCY!akaVwsK;9&C!p=ox!x=8;`R5hzY6(HN?T zPo;3Y`dVIkcbP<;IXN5eH>G2BHQ)*w^5U{-)Ac&?kTJVK3P9zc!myZLq=l5BL`_tT191W}0;>mQ3<7a&7fBQCBNeAhj$C8N z0<>4sYu28Z3{8en*YJ@!GC9XJD%?S?0*v8bYUuoC^SMe(u?*HPYh%m zCGyvX<-dL%K>O5$PtUfW zBfFpc_GQ&(_yKg6;m6_TH~(=PKW4h?p*(%tWTB6LdhL@)h3DLJ?avE;FSg0*PHWWLq8fRK~Mqn6C^=)kxl8X-;NdQ&#&xvoi zPL6C*l^O;}=izTAymF8+jWxAh@4n8eTA0*j(S+H!)s5;ry$b$T(oF|HZ1zJAGtwaO z$esBt5iGiLHY%)*j#X?ul_l;W$Rio$ya6&Px##?IWW<`p)%EHtir19YRwt&hc5L;{ z28~*w4AR^!JG8$2)zY%H|5s@JjUERr;*2wloc?{w^#O~>vOv|B3ZdMalF7L#s4oE3 zD(%Ci#fS4h3*Bo$xfPT785ucRW@c}qhSN)~WeD;nIgw2&y~WVGWf4q@3!p3i(M2ve z2KDj305%?hL95PhqMbd^#jhFx(n^hOVDINIQkaX!Hq!9#KjvhX;pol5)J~eibu;-& zv!*qLS$Q_x3AXUQA(Xg7kqo9`&jzz7h1&^=3e(lO2bH>ArACAKyZ6o-Bw7i1xtUtM zj6DGF1^PIKv#fNfDO0Tr_C1wm_YHa>(-cx}fE-=yoSD>#OYzdP_r}s+Y=2E^8Dm}4O@Fwk}sC~r$IrzY2Zo;gOSD8^;DeM!#I)FZduy@j{u5qHjOQuxg`QtE(ig;9T|8dNi$Etas z3e#>97P>*M(LM%S+_W2n53qCo4wczdZ_t_^oNH?=PT6!UNii03GyrCmG*q_tis$FF z3}6N7Vpzr;5hS+dS~TW1>2a>HSkYn3H6a=2Qi?D#RuvvI(NAlHH>4fN0gR11r)ZE; zbc5MLQ>Fgurb(_b_5ZSSuKNPNC?y0&@yPNL%(9k1Ibw*tu}DJs`F+C#($l9_F$W=b ztaI16Nz?uWn!5IX-ybw>KN#zW0lFi|Cl)&RBH`+_Wub6KFxaL)&~BD&nzU zx5uGDuP>=m*ueSWH;0s!5&*p!pyC)AFoFA){VM0nD_E6-vCebvEA6poY3B9B9}A~uzq^xxKiX$|E|lT_BB1@y|J<#n(tgcPEs zD@Yeo32~pgbIN|Zx>bz9$S}au%(WOlHZbaE>x^-@c(zhq7D?_5e12O&84~}Iu~o?D zo0YdOqoSq)q4}!;fxo)f;Hpw5*Fd?Mzw4`@i=)3`5}!Pe|2O5_sZ=_3E4S3Ak)sOE zL+5u&TPBTPm%M5?AAruS9~x@2!8B3R;hd52-Y6xNG=XH-t(0L}@(e?^L?k(d3nJP` zD09>86Ln&1nSZ>}9`&^vdz#~=^{s5y97MBY{2ebJD47dEQ&b-Ag2iMZym5gtRnTm= zLj=k!aw8`p7I595CX{O;bT}$j7-llK%nnifNX}{3UwH{+csZ*G)Wvy#Gjdgd3* zh|Z=c=1U4C{jgt(OM#qpHas#}bL^ctR1d5E>}&Z{!&%H3ZhKXGWfY!h)V*NF0aoZk zH~fYfi10?CWJf}50XDUt^7ab<;yJ8`T=Xh8&x5jpqqwdXHd&`iQuPC616>)he$zOlzF;ZZEdv9pMbv+nxMeK|5yhkYW-^Q>q*Vr~zc+>s$f|;%UaC$1CXiy%u|_1#J#VmJ^^=o>U_{d z2-axwI~9m7(F{FBB@Oga3+TL?8yYXwc^Oyl;0UnMT&+Ae1TfLQZIwG%t*FtqI#j1G z+(T~JC6c0{6=A+FB?uEw1`z^+cRPjQ0>1sC=ws7A#MR)PKLxhE`?m&WuHD{!tYD^k zS)>r=101!s8JElJpA>t}3qLyssVe;E^tka<;nG1z`Z=cb6ub5LQ5kb|n`zm|eluGo zH_%e7G0iA(3A<`=+NDAmx4Q3^e>`3Ksc0*4FCi^WVpRBMI7h_m#8szHeQ0Fle#G(# zOUdG$PuX9Yox}C>Z(Zy#&m%j9KPwz&*C&qm03^3b8^HkODOWwEE7#unHl@fdNgvCB;dh z|3Zg^WNJm{g=%%znK@8nGUTttDfh7fY+1JkXI*yk$=vAR3TO%sDi3d z8(>#H^*;WvQb>TvJ!3q%cqA*0$X;ae$eaRo3>c_Dxvx0gG~jgOFgF4z3*+%G-V>mD zpf&6(QY<5ZJ7PEEWA#^E*gm*o!bcDMMNa)p7gT(1pi$^7p?Lbvvb7;r4($pPSQltb za*hP8XRPHj3kM%(6wV1-#DH8Cyd12OE>sn|4BZD`ObS3KM@|<00hh?e)88Q`egW4l zmEH=p3GIQK=3%C914?b4fpuZKB+b8f45nPP(a*+D>!k=edm6hYV@E-Zb{3nY7kxk~ zF6u=*Kr2iS*BzZJ)c4+3diq@ntmTG=`n|wkU6E}pqM?y)^nQS*g&YoH9&Kh=%hzhF zUYuTuOaTv~bs%?YDqcRJ*K1`4@>T|tljryv3>duDJz37dbeB$qvNDh1lC%?@Mgg~< zj1+dv(erVQ&^!mD{Fbby1iZS5+KPlH|4@z3l~~1 zxX3}!irNfnlQgb83hzv5+m_)rr|aU|&}q#vv;sI5CPn?+@Ako9et$OFZA0RKY<8WB zQ5U)f@%6C>t|5skguGoi#d)T0>-k5agC>dER9N!wBj)(@lW1%p+LpbM8|mQ! z@E-{RAB$LMt>cSCjnb{0|746<{GW6qBB25r-2k1)0On^O_z~NkD2-k75~P>nM50PL z6TqMcrEy5}_$33l8AnDwkyT9hr#pe_h9-Hfcqfu<)OkxLi5*v75VOjBqI{URG2Tdh zyIFzA3dJv^d#IYX5+ow+hcU)(xR>l~}@T6)R5LaDw}d*x!&}o(T09aen;{HVE0j zYmm5;dBZCqUCf1=r3inxvp}BXuF5u#!v_HBfS(q=4p4b-vDA1i@>$D>nxl37j%%i( zsBkt!fve;lCvfe2UKKAT2JNpx)CR59L+lWdz1ZzifM)Ia&`waF*2w+t&J~!WTS#9A=wd;vOLDB5kICxd2VndO}>^B#R9$o zLNGKQAsmE0diiK^6yl9@vrnT!nw*6SRG67YW4(g(i$mibOqlunP}fY+Q_q~^qRhE> z2$>GC*3J2YKt`14bGSQWnp`dzZ&G8i7TMD&d&JTrXUrC&X>Vfvt(-Q=9SDB-{-K&! zn#mMj1EB~wFpvs_XsoeV6T;7d8vu>hyk37wWxcYH6x2DQ#0_JI6Wsd0P2Tb}p=}h8 zoch8LDM9li9yf4&U`@AG2w|xvFPf5ppKGaRr4j5;GPh$|vD+B^7 z_IV=|2ItSAE zpKN9SO!al^CnI+n^{21IHvq0jlNIfmz6oTU{Nj%^E>Tz}}5 zL&(@3ChV?6MZW7`hpQ-lox*Lk8=J(V`>TZ%I1@+1Htc9@HX&I%V+8PjZQNpJ{qDx^ zfgwRnXObalV5mTn`&r|9^H9D~-i(6Bh4hqq(-D(-I_JKhbGPxl&S&h?nm>#f&9!`fyrt_}QNW$W2+h$)qHeuWXAMu<8;oAI z;UqV5c_j2f#i-QHY!HuEbLFmzb)c$M)K~MkBs0pq@szfeCsh4PO^eG3&!LV-Bd!UUQ>&` zwv{(t|MKC*$-#8+`?RJRW_EtNq%VAa@8ld?d0xX0$g;@$>$`2$$v85p-8JK^d`po= zU+k}Lt+Pc)oCdsLs`x{J4)DHXcDmYtiF+m=zSN1uT%i%9b&oT)|AB$vj zeotqwYkR@3m}cg0&W8JC8YZ%^#rUn*Z{g~^bKY}?#)b;uVY1bbQG<`6#%T_w^0+JB ziB?*hV#ojc(~P56sO>fz+V{9fNNVGN^I7mK)b%Y{SZ=zbUcKWz^vd8bDP$B$NZ6qt zElk9c;T;w%`ur!pNU2_DJPopGfcwxh|ArBwKV{p*-<* zbYwAU0@{V-DL)WkHo)`jUS-hC}l6`+~^UwC?*zLFY+e{IgOZc)+TKjm)wpFfI-oZK2UnLtbChs_6PRqOd zf>4YnTg5#)3${1wR&l56D^7Pb#Ic^|u;cC8mR?0=GQIYweii*K*}oTX>ZkkATQAl< z$K$j3o18eE6JC*WZ zlci6oJz+Sz>G@Ub%@ZKt$2qO0@`G~*%kCs!6gl*s1+cA$Q374Y!di{4u?3{seg1Fb zTpCnp?+2cjB%Jda@onb(b#IkS+Jj=Evax}!8SmHpk_+&|qs~939A&!wse6s5~lNO7WaXmd+kMp$gGPlU7qvLGahUrpbH!}5pf2U7*{rCoJ^Gk7r zRa98+K&H!1)UL*vE2xi_xAdg>UMGbo>#ia3LF+sGrm10VFRR)@^It{p3Pn8P<{~;<21bk?m|S%IIlFZh4wrLDR! zla9Z8JN>T8nMKBcdqb?%q&yAL5A@0eoH&vv90}q237EI%vh%McgWvCCi{#kC;iYRm zn)_W|HE#6M6`mxa+J7gU9l|BOJEci?x%i%NI@?b1Fi#M3S4eBvhk8eU>PxQ5E&=am zYLn^DMrgkeJyy>qlU$lFI`_3)g1dg}jOpnzyxKO8CHfKziti(@=f~dRKvG3I_7#qD z!zW?vnB#?#75b%Dz2zM9e9f@>+Pbtq%UCgUh^6t?LMGdoeqM3T`90_AGmfY5}(|6 z;XpYHVVS8V{CVSbx5r=EWQG$_f32fWdYa;=Qhf3;vslB}G8T5q{Y=S;7K+<19)j-? zDL>esN%Q*@cTs(b>QPw7y}`HYo#|gqdQER-mY=vOTX53tnh&Go3#LmaDau&-{kT7A z_c2QaQcKJ`_e82QCi zH1U`9(0}*!%)7hCI#G0Hk!34{PkQzfo-co7gF@oQ4LHy|_4@s#dGto)W-ctO1o^yhxqFpeARxsh^8Rneh>LF&-_i29XENI1C@TfmD8A7uxIHyZPezoNO!S7GLCXL( z=KU$)_fcu4NGSubqZ0WP=dy&7j8u>bIZH&8&7mtW5nu)xw(FO;Yc><$2B`V>!UK5?;p=}i54~UX5XHCO0uvzW(XVWj#C7?R%IYlHI49M(ebD&X{>k<|-OO(meZNxV5BHz#a8>o2^zVq(%N)A- z+DVq3RNnY8YN)7)qWHMxw==S^!C4<3R2lA289supmDC*TUAt3uultXxy;LTmFqn*M z&b)Dg#89J_N&P~&9V+stK22e4c8#hmUb?M5w?bJf`5DtIjohpsqw+bKl+Juj=&@a^ z`*K_gcQe@&%9?V{0awc2NA8h09b`8Q-Z<-L_IJr@oCUReRZhmCWYfslNVo5{`R>Ji z;nIjRoX57e2Lg4ajtN*c7^MvvO*z%-R>`+ml^aFq>JF#{@32ZdKX|nL>KpgsqdNR8 z*Ri#_o50etHY#ITY!PV%Wk?)TooQE%N$6U(cG38j4oAP zZdPt;j!fpP<_iuKPTP7GHOd*H#5eU&zsZWxA>+KNyg(0EN!XPQp~Z--pF$1~@ggZ@ z+B~yen^xNr%QEeU!{nCkjUqY%d+SMf<~NTS3*;uxeth^^P$2e$W{pXKp^z=J%M%4j z!$;OQR4cz3J~DY)W3h$z@7IV+>MV@6I0MvEYOK^kNXHH90tP38E>CV+2H0j)q%riD z*<^fby{99yeUp>UzjSCmFC(cUU3knfG%iGqHB3SFs{DmPSGIFw1QJUp<9pu^+VJLk zjy2^=1J$(--FMrx!d{DhECDW^Sa{|k^!jJ(N9VP}?ALc+PpL<<2-xcuJ-RA$>4kOM zEYCilPI0tz)Iuy;g-SXj@`D>=QpNisv78YV9yLr%&}IGESp`94RMq>IHU*RJ%aJ;3 zL6l9_3&1v$^_Qo5udxAZ%km>nQ`)=nQu()X!B_U^#kxscBEer&!g_1OB~;!;bK zw3ewa7qg=t`Faa;_2!~NUo+Z>jhdTW=mqDa!8+;_jvZ6>QY2}rcTF7^3`8Sq1blis z=?WG(41Yd!H6FCyS2VCgT+>1XIM6qU%UU|Q$}0GgAG@Z$Nh?w1NG-K=OYD_g82+t; z=!-8gm$O^Dn?<;^KDM(2YTOJwFUl7A?0JJLP6^XDR-W^6xAMsh=M(HjoKCmyEe`jp#n`7Z8Zg-7(6O4W9UWq{~e&hDS z`;85%{D^Y*1*tu`JS3&SOw8r|fDcr7Jek#)QpT!hWRGf|AZb@bs+t+35{o zw*ZOMi(@YjSc^jkrkC{H%HQAnAG0Oqlyn07JWkhF{fv@ zLN7iFtPG#$Ef;3eyudzEf0vh+?}p^r&WLr@9y#1OL;kJ9S96|aPNtWf62lW&@Q$?1 zL4AI;2K&;N&b_~QNNaHOfZ@tS+cb~<@NuI_h8yFjKK}jHYTI?$BBjpbYcQ$FG3B0u zfkn^w@gdsv?20eaQh_%)7a|8JM=m|&qVMV9ktvfMVjZcXjqj~sQ>WHJBuuoyiCB)W7G+f=@KooU6{{<=S~#8+2`83#jNK49{=Sw zN8r@0VkT<6cYLzJ3cb``b`6`~G?!T=#jf*N7kzM!RJ}dhSg3zp2J3O-Q!sP?+?|RW zKZA3vZ(l0+OW0g}?Htb^#^>JqGy;*s)55D%CgGNNb`(bNoO+1A z7Gl{FGxfs=Qsasylff5uob8u_RaDmeJn6+V za%#TV;)>@zzKB)f4Nr4pp}%lf_qbO3OYov)Vi za(*CTiecqN+QyQ`@AeDY-CiZ{<3htJ5Ao$aQIAz=AB-_R6${BPb4G0PWq(dpe0+LK zJoek_gGbdXj&(-T-wemEKdO%*-x~U~HSQJ`^dj8EX|}QYdbQc^&)m$Rf-{yeKaw?Yz;Y-M}S7&e*qo7Z-G{ znB&jN^R%*jHtl%M#z}Ek=#J^zL=p4bOG|?S#d|#IUtioQ%I4KpFBd6oiDQ}T4<6q` zKZ#Ep7`0AJ9-DQGvJYx}nxHw#eqbvSQnmn=0VS$F3l$z=6XX@lpZx2cIE!C6ahuyd zx@Xb3k1t{1j9LxbPF#U#jY$^QXp-|CIgy=PEy?$F6qG zcg0G6*1G`$CF5VvN}Q2qarak0Uq*!#BsMnVJ6t!XUIf-nMO>@GJ51Am*V}!t>RMRO zDlsh4)ORJ!cUQss?f|2!zkx(AzT||Tgnx?v<-?%6g(n*+Cvy#{MpN$iC8<4gOo*aS zbPH_!d@18)qK)!xalP^Evcjdmo@S)W9XTK44qk_#90s`_7>HglIX3-->iMRsED2!_ zUx4>~_5OnFOp^F9AF~Isg3`7f*JgO`lufx~DL?-$>%GxμJ1py0GB^74=+Q|pBty| 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 z zk`6A`i|mqUNywkG^oGu&B!7WY=`t;D;P62#3F%TCZ({4ESp4xKze(&jMS6*fDtLE9 z-wqZ~Rk40l|D`^REcRm}(KkS~wwg`nZ zBkJ1ZD;`4MK7Vm5a2M?I{EUm6<+*7jf!@a9!STt)Alf*5f3nf9ZGSF)Eo9LXlto88 z$zoEhJ>ZK+D&=YkLS+5iGsX0W60=qp7{OzK=fL2`{6}CN|FKI6Eb|{dCE{;@Hubs3 zI_QT~90Faa$-=)#y1E=4L{`Rgcz$Am06ho!!at$@avPaN>wmC z+}+>V+y6o1GCtbvQfmA4$=;80Fy)-K@s z;NZk=kRI8^{LK zh`#ye<84x0mVY)Mh7O=u5MT{9pM;`D3n=%+TfQ*PHTlG*w zvJ;D+Aam}a_8k?->8#;swy~dwZ~~k13ZzEdngO?w?DvauBYF{p(=&$G_Y@S)wqf#O z7;t}RP)XmUoota+@R;}KZ*WqB(;MRFL$|i9rfM~GihnmT1;K4ucX0-rT#?^RaDNaD z;a8(?s{%Dr@g_qyCf-J zWS`_k7)rgFBy=91xb(6IUF8Na>haK}QJes&>q245S9T4Q0&M&B>)k`xv-+kid7kH0 z10k3ih>2NxLDvrA35s1~+6-a?IG(Vna4BG?pMOYo4w723sLJu1WL}zWNdW{uZ=o(> zgz86hnacIFbT=Zw%Yi!Ls$7k(ngREG%%Jx}f0&>D0(A`ffE^Vt%WmlENsvfM zmtmw}i00xxOYXYja*BRB8ej3s(VlhRR5q->z%oqv+P&Gr)+S;-!y9R zlb0_Ud|9JJ416T-#3NGoT67Tk+_f}*Vt?)#P{Uf)sOl^$m-FO~^;M(jUdkZ_1n6yA zWONgAZ&*k}ctAu_TDvkMf;bvUiXmaH4F=3wf^%>mbP@n@oGtH*f-md$Ik|yFo1ACJ zq9*@?SU@(hxB~yE*_K)sn~+`j7YHwFuRSTZgnFA)Ab+`B z*`4K`@kU&%&r($Bj5m^1m7CfP)B~oAh@a#3kEDjO{*vz>S&Ze{gGk#ukSsAzD+3Vj zZkIUj=-@b7W>APWPSl-=Sw)j9f)w>GvSEZ8tIeC)d1vNjq0E#DHJ&Go3bG1Ad<#)A zs0sDUqb0(beuFZPLKo?<85=+kMRFRO^K|B& zBC$WRdw6fdUjdVN`qNcUW2OPXc0e7k)V%d4gYdkxQWh`fnzLN6cLS@}8Gk(Khl#>F zrg)_UdgSOdP52mar)ZcgVFk}>`l#0-G+|Z?$uj|y1%K68v?)LmWiY{@@nV$CMo}1@ zAiIf+6tgq^LG*90Uhy&0s^YN`RE#*s0KtsiyGmE!l*KxVoQ6mhkS~FF(HJPOK=)>? zeOSK>)hIBOy>Ffq42p$!0a^{Q>0uWWlA#hLbH}Rkf~oR?YfYmY_xvnScGkas;lBU1Y|I zl<}$ye)s^gk%`a|V{sI1Yx}{7abc7}D0c7moG!IaOs}J4Am&A=i)7CSeK|wGfv@Q< z)?F1StOplG!$Rdc9VzBwp4{YxM>1|dWZQL|>eMu}>;X5#TQ>ZUik}&3Kp;ikkqIGx z!kV}yCa45Gv$Ck>vwt==BcTzMhV)ra*UUCV4QZGzEUkgYc}p64w8|d=8VGhrRwX&% z_9~lRMJ3-aiMu6-hFu5&O7^KVtonE!{pZQS&cP@;O0V-9VW$t=2?U*2!#|ljX;x;4 z%f*znRY-`mOq~5%yaQoHd>fkUyFn8=xvwUa?pw{Cnp!-|Vt?&q^5)?E{!Rz`w2X@3z)QO0Zsg)`-sr{l|k|eQx8HM@t+`V@OyjuJ?d!GiLIlmJU)1H z65E)#N{ZQfnD{Hy_}ybdDs4lT&}f<7lV6;xX8AbcdeUn{)yIopdH2lSf0NJW`7J5X zuTWY@P%DRw1b^%7r{}AAVpO6k3Ek$%YL_e6Bj?#d%Eh=$%F*U#R+cLgv6TnSFIkan zo)`ITnQp$_`~LOYgZDcxx3>PQMxfcWecysCf|ZXjT?6!l`8a_6e=)nwX4TaoBAfDo z=wjd;aWh@6N_XE1T-mVAzjI-e&Bn6*vFgMaJF>PC34c32rrxhzRgHG6$GtWX!qeEo zmS_1z7FCIQeFni+{r9dElLGq&gTIv1g*9T^aK81D+F4iDz&qTA1`!uB2=nZP1Zt!r;C0|m-5OxXN(qGu$FlZ6 zqUjad=2qkPCvRT?QmxKv;+bacdE(&E_`abYDaFU1BV#+-3<1K>kh9Qh=sRn-6RfPA>=NR_; zMJa8cEhgflGdAwyZQE-(1bP32BY&~Gf(@R=Wbbkah0&8l)p}-dZyf3*onOQ2-IJkk z{g%`Q%#Pi&y6Q-*E?5ea!}lk#u&;)8svP4JEG~Px1AQC8wfYq00f;=c9S<}Y;@(Ve zxIttD?6HC^d*&~Ot|72do5%XsY=8n{RC>$mgN|Bgqa{<7@G-rk;YY{@Cx6mtVT4{l zn?I5}r+h{xZ)KTJGwcA}9wqe(3=7zY53_7qeW-62Lu^2|qv#E~#T+I8d;A^$kY*6r zys*A81h=}6)JxX&O*PoswUV5zC)sjxiSE{$g3bi9Oq#;5OoPUCe<&+n?mP1$u(XWNZT`ybI+UVD0Epw)EpvCjGSq^{V z4u(Lnkhu{sNSiF(0Gq5WFNJVX0XvQ5ZN?V+xFpXp9;)kywS&inDH0W`kcZLtsFcF9 z6&i&CdzebgLFt?1)DKP^U>A?VXjll#G@X^~K3bO2+le$hIoUQk@P80rw)>L|CNjh? zy};-q7}tug`BAGc#xolR^c)(M(cwHrKM_322geZi+pvm->JS^ii6*u%s51+ICO{xg zGu*)*^IjjoI$M&4Zj4g0D^ZaJWAzZ^U04P3NQ6SjhQZ=C2GQp)eM_Bhf^(3g`X_~O zv#il0Vp3Lj_(`}g^nWhU5e22K7ph?Q-FiccIvc-+HDm3zuY2p?e>7Zsq?MBREJ;s3 zth@Y3g>nIR*SNHG6~?{U2}Qd?Q!Q4u^U@c$QM8?5B&oFG&`0?a5A}##V=FSYabE=a zz`)OOFREmGFBA(n3`2Hd@fQUjI7%r)P+Y9$H5Yw+0YSPNfPah)C~-#>?|ffjz||@q z?5W0D2&gVwdsW!|3ZzcNx2Jrp=H4R}L2qXVyrk$BA%*gZ4BL7;l7lPNF9jOBs zSu)2M8h>{{iRr?qZmd0H#XZvM+0Op){pxX6kM5a*_G>O4Zhrl>^RK1DOXqx*&1bfO zV5so!$=3XU= z5*S=ie6`@Ut~#QC2Z(@L%O~4^#3d>5_!Te6uz&2w+IXqI63dcxS#01VM&@2I`F8>6 zqVDLJ>sF?QKN3G!jof{?m=Ky5=dWQXyynV$QX65$Ov`F21Cd+hXPq@AwCj2{f=h~S z85xIGedylt>O9y(Yb1gDM5#jc-h9UU{E=+WzIN@t%HvH(vHR<|Nt;VsjlMyz=ybAP z#ec{yHgYUtl?%)J*3btfEFB7MPK%VyYn_E|2&;P+%A|j;{DS0@aMkd_6?L@Bj|7tG zsPo|kt7`gQKYGPt=RSNumLO%thTz8Gm94JX9a@oo9cHI7)J&jg+?68n3VK}%v`zcD zL1;pn0~ypZXl4o4Ctx(>66k3yg{Jd9$A93&TnnO0XBMf>Qq(ktccfbRaEB^+;^8{G z5i)qO7XfcwcPG04_E1YiY_y@Sl{AVU5as4xB0KdAI_6A;DZMWTA{61O;H&*6cR^ZN z$WU-*5{|bm&yiha`=^_;-{u6d1gUhn&T(Pc2GX97k^Wt8kKom5;-6oS#Dk&9?0=41 zl>tc;J$P7Z6_BRpyM7EXufhdxka6du3ayvDhlo|~P4h@EI;W)S=P?UJBfIxug`IC6 zwwVFLS+36K+0=0=!^PcQZo1DdMfOy`-3e&5aQK@!@H%Y-lC^!_k$j9oBz&D(ipSwG zUm*kdy6Ab$O*crCQeIDF;*8D?wSOdTiz`D_`)hEbZOjYu6_Zh{wL8C_tnT@}o1_pv z<#{GTOfmAQ9it56o2xfSjjuX*^*V-0rbUwqGNp%rQvSz5bc3@+;q7IaVOFKr7~$S- z5?^b`hF-vIcEIth;sI=@AJaQ=oBOfv%u(1kI_OwE3NBmrNoNJFFzq;vxi(N&FQ%Al7QFu1{aL!zn%Q46 zN*~p*GD_b;)9y?(+6^MBQh!-4;uqz3<3+i_kuHEZPG6m2zi4a05;ia0e|zWV@Yc0^H0s#t@;`F>`z zQ+%sZm&AQE(WOUTiWJdZWBX@u5e5f!Wkf?Z8s9%o_D%#wUPvO&~H)U#Et- zZ1*Ymxfo8%XuhADz_~5m;-ytJT+3U`Z?oai? z-IhR=Tbmz`J=Bz^_Eplf|HAs0_>#D6vA% z05Rk>Y&{c+qxcfU$^|C6=0|#IXA178853}ZsTuHlBeIEV% z^UovUl7pdsrhleJw)Vr3Kj_~Mjp$G!9peT+rx-%mm05dX4o$)YWhXi9by+0lr;+!$ z*O=E?<%KLWRR$c|fxV@2+|)2;MZQ{~)hO2yGM}%iR5Sp8KB5VBmCOw|Dt~f>)*^1d!#>LVH|KXkZDVO` zWK2EWmD$%3uQx+u%gnKI<8vA#OF zD%Zr!q>t@%fnJOW-V0DpXBC4Zs5)KO_XX{vXnzFhZ4=aHFPK2wO#@-Zl^R*dwcK-w zC?eLwdl(M|TyxFP5ke(UW2+Ym4{E`xU+f%8WJBo>MC!Lr>(#r4QV8n@f_X}l1~=rZ zO|ERi@Bnf(o2j8CdN(o*RCxp9nqd{csL~X%buBvwD=Mq>wZ50W=Mk(MLMAE!X;*B_ zFn_;>3{Gcb@uo!prwp+YM9BS>qW6?qZmJ_fvY#^9yar49w|cv{x=-VF6Sx~!-E9=( zeG9642=w}MKhfUn^;rCMqb>ROY}V}S!#>VZt$s^Ri7hah#KM4TwQvK6y)MHg_4F9( zg@^WxAw9fn%@pC>`t>ws2j*bR`Ed>xJbyj(z`6$Y@^p*#o$7q35Z41T5o#Aw5*3LM zY2Y$3WtYmLyJOjHy}l@FKE^nqR6xNIyc)i$iHB#eFH3D88Sk-e0Y{EII>DyKa$Vq2 zxp3Sdq8wgQ+^m@+Qt>A7j@5M4r5Boeh;I#%{!BUvj*V`+;bg@`#6fhJh75a*w14CX zk>t7FI&eXcs;;I=^~lA7TLt6sIFFnPE<~*1J`3Vy>wjG&&0u0iKa$?oLn3MJrxj*6 z3)9ec^kY_F%DqSwTW4`hvst0S?+TUdBP|pJjk(z2kNrZS(aGdaFR2Ugj{gGt|7?Y0 zY>Z-S#;|2nU<6yb<|C#@->^UQ?SDI+=XwpNm!^*nRQqVqXnq0|af}&Lv+AyaZ*E7j zQ1kT5fVl_|el3<6a$Z@^~Qd&)`+_ES$Vnv}f&JV&SHtZr9 zw%0L0sDX^4gWCnrn+(n`k#eb#;sQ77Hnzbh)xWN;lf_Gw(p{Z$1Fc2xvVY5~s)0IW zHt9tMhlLvF(3<11(Jy1pyzUwAm|e;)w$p3_#;g__`$nWQijMG)j)68~#UNQnH8dkC z8=eorUVHXh)^fq7Yh#oF>5ha3)(G6SZa)Q_pz>0F*L>ADJJLf%e(+9x@5pt{=^dNX zvIY+(EWlhlo5L{Xavis&!{CN}Go}*c)_Z$S&eS zQNTS4s$;tNju+N_*zYnyC;Ex@Pk@8nvdF7^n!_1~OeipSCh+N;zxV@_JQ`{i7@|d} z7zw2Ku5tXdESzw0Zw~I@!nE+@SDkpd2c@x11KlGO!4JicsFzKzmw$k{Dg3jV!9Qs= z?bi&MZ)w^E9rxm?aE{Vy`AaGL_yZ!RgUwXxI> z=VAMbvlJ-os`bQyp?~QZf$3j%F-482SCrqK4K0@i#J4pzBS|%=c#Z8>ObBDO`w)>` zNHswjh(GH>lwTXQg=R~Zx9}i})%?RV_1)-B*ZurSc2vQBaRYTG+TK$Y?(`I60X3Pl zE$8xU%eg5;X#vGM>m3D*fsLX!`iBEQyw8|*o40C(G1zQamj&NZZ%gxa z{MU%{ZPaYhM(yTi^dvw#LQy6fI^2EN+=yBC@pyIP{B&m5wc@-n1$=EIe+4yoh>Ed+ z&al=_l+wR`C4cpd$)^O`lz?xHjM$YL0{)^LLEd_kOvuRLW36HbF*T`uwjL=%&6b^^ zrZLORFJ-=nCDvLK**)T$|Z;YbT4L^~~#u?wYPZq2TEGMgC4u2a^dXasiTim>SDPP64+r!tN z@+F{Z)-$$7(w45_^SedOzjxSt_$7ksU}X4(u@xfUTGs7VR?QanKEY_>98Le2OdlvP zev)BqaE>&NFWV=lOgmUSN|WEKbiN#}&R2_SMH!>uzv~su$=&8_%%-#lU+V^@yW2J} zd1Mjs7k@_Tg2_J1lp_B?cDab0F#AoPwnPA4>uq|vz^7St_fL~;0heT5?*jQ2!os9r zZjCt>NC8YFBCbrz8c|aL^JYj?tj7^r6$^iUTe!s+D(-=Z$J|OG@OhmqP)nY|Ou~>p zeAs?}a)4BZ-`{QTzu$iQ;X|E7X7{FTL6Oe^ZGS0@MJqnJ((*Uak_n-;H8!x#$XW0o zczOkHf0IP!^9Y}JYuSeuN`hf*XcUy2Os$lSsf@0M`v4l6@Y^2i5uIHGKVMal`_Iyr zXk-uWi_u{*J}KFu+FSc3pGp8{E|%6wz2hb^a+*9vW1_RZ+XDAM*%?g2-BPulN6J4& z27e+>=C{cm2-BRz&nRgoGgJw(DbXw5+<)3s&t3}ql1+lWX@C&SZBwpZ*g9q5m)nPX z!>j6g{(SbQbnD;$_{Z?b+Qe*e%BTrJ46Erpy>_JIbumrv7X;R)0X4)a^w~M?j+lXWy~Q82%OZ3)Z=izn_Oe zk!#L`Ez{4P`FupAl`~7rOml(KJcnjsF{^>HG8ppM!DUnWHz|R*b##z|kj9J+j)jR} zlbxc-8s|Z;PbSA%;sO;Ycbr{bQ%1lk*I0nQbt(`Xtt@GhdgjvDX=u5#ouCwO7Jm|$ z;|6w<&sWzq&5L)kdGWKUc`nl9KimQSjvWy7T|cx%vMjIiss;n{t-^tP(9{iCs3*S& zT!>$U4GAaU78mXcJLIX3h@Xw!KzBDT#~lzkAkc7=YnzRSMGDhTB6!@kr4!q6RO;o8 zJU&4qThp`AENck;%-o!6W@HQD7k{8*Y#1+V5((Ywpl^MwOhkT`E>G60PbX#K5%yrO z;+dUZDp0^{U7WnTwh6^2%;oK-BpAN|c>?a*0+uJ87&YNV>hPxHyk~SnHFnnT4`(UW zh?8=fWr0Lq#%ZE!=MIiv?!108!kVwSqJsw$rjHAKpy)iumYikItp??^qkj}*bxp_u z20&Hktghtg=XkZ^*tWt{F`Io69znuhZ=uScH4RC(g=%y0!$Xy$km!mpx7wL42;zq~ z9J82)eHv=|%$M+l(%&vQwC(`9c2G)$pRFXN4z;ecM4jbnGE`Nq&a=V?LM}jd3Rdh8 zJ70C|5fwg4FT7qcl)mYK(|_7C3mEl|1W6|XfZbclmC&)Xyy=B{OHkJ9tPRZVt&Tkq zI2svnLcyWTjf=NmH%L@*!?bUmf;tCtDsD7kiqJ|>HJhH)15Elfd+fs!K}zfcf`xg$T#V*6hS0Ux;%2_|>LWcuVd} zCtcwcTw~PL!L{;Vn)=qx>ANebA6HrRmfD^Ix|c0TE9j+14t``5wz~fP>&EP#_{Qva zbt}_lQ&{Kz!eGQ>W`D=`I-=_f5c#Bol)*WGpsv;72T2+COWnz48=Mxi)9!NLbetVh zZHAiXvil-+r`m>|nkuj{@^f8hRymW}qfY8Qb6R5T4wSi(HH++X+}S6d= zZid6xxKqwKNeoy0J!8_!@OOVQY>8x}t|>ZY)>2_#TJiTV0e_Zd8f8AD?#gxZLGbN~ zxGd3?2!+#wqg7I=B70JR=wK6#(rUNxHu8H;o=VBwP>AdBGTDW0%G%eQTBlkaE~AWE za$M_jrK#QH7&AMHIXkklI*Gw*?+FmWR?~%mU+$= zld&J9 zx*E-YYlC-Z> ziGlO$I-S#ddTUO2I?F2Z8`q8yLpIIT*58;oS*3s0g7<2PzB>#8MJQrXxM}Vk-h8_W z|NM!}Y5NO=oK&2jUB-G1o`1I+5>F~?;83fEm1P}66~d36f&iBS~|es7co8VxqsUk|C5~_=U7+ex!L6A8j1cJw)PTW-i0S3JkZ* z=jkM0Rm)XnNmBE4aVbKQH%z?%5HWxznWR>B?JO>Hk4CVG@tHbWtgg>Fkik4#q;z?4 zkyb!IGPPeLT4mSg`DL(QvN=CSggj5}WPd~{NpUA#WfdZH*-inz1@p1`yOEbKVUAvN zHxCHz#whYrNo;UW;T?am3TQrMnA5fA)DGqRk<$IT#M+f#*-3xoHgDULHYC&01+5O& z4-)XJtxp5Nfc0*w?N4ceu;FWcoNMxdY)saz_FHAbiY6i$w&a4Nfp8NwLO#D7iGROA z;*~|@vN{HyoLr_q(&I*%-;?--!LRJ;TKbl{Xk9yYcrH3vNKEvk&a5A7s(TDBnubyI z(^X1Wb;up?32S??<(8I2{rc3p^j#pBF?%cq(IR8Wv67H6%gW_E5w@biAlvRoRWWb@ zHO&}yEdY2~&mw4=^0QpWBrG@t9LkFmm{SvPN%8 zbqJG)>l0u{vD47?C=9J4eyK7ZMZ-|?A$ z1XmS(>rB}dvpK^))&+ncv)6t#9Yd(j$E_g>ojpQRXW_;Cp;yjBS5aYx0Fp?O4-lq~ z3B;};@}~<&h6|!n;s@3@9l3ObI{9VbBYG?%E$NVT>RZ2ws_NW~tTNi&$g!vHx&49rY}HT^4$Q{r++?1Y zqPX@b^d)qw=zt5WL4$PUY=te7zZ)Faoo^f3$SH5=L2L5S?-1vcvwX)hDJr}GPW!Q&drRZ9-+@Jr;#j2M$F^k z&@(D(33kjKGXfUB$qEo{C>pGc<&59$D69f@W1M4#tl|~FO@BIrZHRGf-n&s~<3(O2 zmM)HC5$_!`XrT%ecy$}9yM_})6QWHFJ1P7=93s-G`P$U?`XhSVLqCu-q1ewjDo?3b z)0MZM!<4t~uE_!SWgW{nJJfLabdL@7g5~>o*blet_*K@o7JP+XnjJTJ&HV1O)4!Al zv~{<8YBmmCeScU7_fazgHjeS5s39b;I>?Xe!_Qkc!~R>PcNo>qMxd6fv>3Tg)7h+p zFvG~|BGH&z8R@%Pgc;f>=xVK9ut9htGJdNN!)4dYX7M!Q3sdNtG7QBrN6F=}6`UAA zf^4pX$`SQes(0W4{WkPEW*M#AkxzT_i>eD`!>-TbMSn=EV*~bdNa{^^ER92fUdnja zYpF=gu)3_U(+^sz8XA9c zne>BX;!%k-;a${mw(w~u8i;sbxGdY@xi*Sr+_;>6!uXRy+MgF4|4 zJTz{1*nj3CX`d@`c4)?dx(}3)on!5KMn?ARHtw=5AAK42D_|W48y9tJhTB zV1aAEX^|!KHE^hsdD5aBSz!Jt@GG`{hZ5z_wmn}3es?!`(S?yLfs#8nt?V~MBgrtLZ8#c)aU60eqL=s3uqFQN+faS~p zhr;SS1sX)BIcV_ocPBxkr^768>~A>_zEJ&K+*fZl+scEjf}6{BW=2Gd`KAEB3~2(_T+Q3a0>Ux15R_bx5Y&o%B4 zbuQ~2@L+mGd}fHF$WGcoV|@fKXZC9k_&3Y6*ahWJ;uWu5kh8^fzA_wkfVjJPHiro; zki)>jS*LZ5A2-QFHHJBvY3qsjKz9=Z|y-C{{bz;~Ik zz%dIGsx0M!MlOk@-4|LeGy%*OAU{D7GupAJm@P}4e?R@)Eh1upK;K5iWg7djHamg1-FI;!lUy;3hTjOKuZj~3V&a1TV&s$ zS&l6uO9iOlzsAq=C@UutL*?omIup(Elv9mNuhQv90p;dT!TMEk7X~Z_>p_RU_v>rW zaP@r2K(kP%wn}*D7C?=^7I^6=Oz>9^t)^?L{PXBIhh>>z)&Us^S+O9Qz(r(kq3drM z;vi$PTSRG57)JQdDJ6x$mVao+94q=XVPEyJBe#RLN2l2#c!)vXA>4Jm?{O}X z_k$NlL)s565W38w5z!qGYh@RrH@%<4pmt5s#wP&J_AB0B8`wX-@wr853<9-yfdw+f&?c~!kDlt9K z2HR=x%{B%R5Fd&Qt7MLJwxKMzH-^zSWp;V>O#ssOupPm{Y%zmP^gOSw{9uu?0jG=F zKD>{DhaRmg9~!R+&aEOh`6XmPYy*ArpiyVezACcu0`J%6+2SK$yP#Ox#P8vO&F1k5 zhJ?==0(3H%0^>lS)PEM^?6+olVemStOCXVqh)3*BwVNZUIk^qD(~#T7%$vi78`9>; zTn(o{lI(TGM1z3 zsIrE{r~FPuDW+fTjXLn2?y3D*@8qV(tOdw&r5*S$_Kmfw!3icYp%litj(%)`5|6j5 zK)(!w{ZO|oSAU(hb?H^#u^fHe{J7%qY*Z8Sg6C}~lUsidcmW5u8kKg)L~p2=0dwUqUG0X=AAP5 zBJa&~_L`<5Ou#uv6SvvS53=zb*VL@11}I!Fs3z{P`0JW&w&5xKxDz>+`$KcZvwRMK?1fH`l&ykP4NvHC53@q+ zF^jy94ep*&I~(NYCXgC_E{lYO>q2C6lV#wy$I4}jI9UcCxB!4af4_xprc03sPnM!5 zZZSQj8t*>h#`J%0hYiK#&n}W{wD8{fQ()Vv?h7i^zDOz}Qe1|#C|rziPm@nOPmmvo zzKx|$+!iSec7#Vvynxxoqh6@+Em=6IY;rS91%@5_5 zo?B&zB|}F?d_Dv=n4w-U?w`Kg@@SpzAIFqx64P8RmdLqFT{A zl#WQ%QD#QU20M=il}wymDB0W+P|K z-Ru;%ak2&fdn0P@Ef2AtX(sJz(gSYVVf54x4&@0^MrM($i>^UbcTKCaK=->{2l}11 zPi#$gfU@q(Z26KWHQ+w%G!mv6XuN@9x)KYjNG*R=bO#E#4{>a>s{UR<4%7#FCsh72 zQpP=iAlBFNXjC8K5^4Y<(a&1J7SyLXc!4+fO$)+U1`k{TVvg2c1ox!>rr-oVwPkhw z&1jIILk}3(sJY%=jx5em_WXn z!hp7}Q3y2HuTn5E*E45S&6Iq<^x1X?j=DzNE5Grv{`wp6(tA~|<(|U4Wex5jOlcm* zK#KG_zX=PfS;(opZXw)Xg6*$Uyjq-Z$GaNA$k3dPs)15?j(jbY-$iTl1k+v|c-!+l)*#3XX z=+sR3GXV+FCD7WWx6~5SVQnTJNu=#r*c$VnwrFicBq%jGrA_Gcm zG3fLJPE6|!aN`kOrFAA;Xw3BzeI$RfTP>bypaSyOGt_cbqFLD!3{^n>dWH&R@e20w zN6LVI72L z3ta_X>mN=WhI{LaP-N%GP5J!yuRHpe+BE!mJhf?8s|D-xG-^|mO8Bwk)AWBBDnu=! zJ1gXCQz(YDgW7%FRw~|8Q}`Ha!e);1zfffu<47rdmf-XM(jnTPhclLk>JS@Q$>XXN z@5xY_&+7luFV^Z8Cm_f!3n7R3+ioxZOOp)9QG3QO%I_%6gj~V>RsmA3t5zAZoA?O$ zG#1-{XlG!Pzoci!e20DIDcpY|s#6SsoZp!2L;tV~k^R7!3D$ZcI)H*Jf3shURH9?i zHFrrh?HytXQJBxhJEleghFwk%K=}6{eu6e>s^qX{#haEo60#U#C)iweSbt0LC}b-r zZ-gd`FG@u=_}%x^kD2*mIYB;1>RvIKY!1oLA)A55+rS)VzyIw215kfU0|XQR000O8 zmw@U-io8D|)>8lgHs}EWH2?qrVs&Y3WG`WGVPj}zEo^CGV{C7AWG`%KVqtc~Md08amz0vlCsE>vPy2sDtq=k znU_UV?SLkdXglkS%%P$-ku%4K1eR}WtM*|@|r4%#&7fHTEJ

+iy7W2$>OSd4#;_nhhdC{bzc#7Rf%1d4>Nt1&MPsr7k5dz5(v%H3xVb` zy@h$h$-y}n7~EE3n2W2Oq?VH|pzz5tqouGDo#q9^c%^?uvbA@b9G-3^f7v@dJlzp6 zemFe)_U-p)$q#!cCwoU{hX<$0+mqz=+oS!%v%|MX;@8*7-qGKazaAd#?*UWq-nP#^8zvKMJC% zshVF8W?^!X*1FnJxezNB{-;Ty?}s;n4Cw23+YKpuJjEIF=70<(s=zR$FKSWj%YgcYHYe+ri1H zSV@1$G#P#Ta`bHf;Oo8bzdM_q?VbL0_WJFcz{&{!~#ki!N95tNpevuF@j}s zsr#VKfq}{QLLf{rmS4UWJJ6 zCds~osKF6<17N8@$cg}Y7rxDxXU@9q z#h0(%?Ifcw{{G^Nn-^a!&c66|_lq~XU!0C4q))SJvAh6YUNo%Yi{J0Q`0AZ5bdwi> zGQZt@x1IdPefmFlU;O@E@?Xj5OVh|ATQ(_28vetFV{Ct_5ZMufQwY+=C(tT^ps9n7 z|Ca_Qh!v+J`R4V3;(BA72}(*`iBf;OwBdH+5DPT)ZJs4mS;-awBv}x*SCf8S)(tE+ zkj2Ep(p6r=QXR=I5Kga`Fp>;sqE1+Mvsqr`&1^QVv*qOuC=t~xU+g3wvO6Jwv$>EY zJ4w105(EfxdL+nd2P<2jxsdEaw&dw@2HFP|O9X2HT9?0m^P3Msm|xYhtMGpjM3z-! zYjmK|<>mH7;}ybaDiQM$Y5AB==x@USxSe!<4+Ex0!wiP#_XN}=LDaKV+FZlTzLaeD zaXFr!`ik!66!W5*1g37l%BDc9fmyjkPd<83oR$5a+)3k1O+o! zq#(Iu;T=$zaiSMeN@hPcRf>N^!bt;0BVULy5G-b#FPw1#km4Quv0unm#5?)T9baf$ zyrnPpOF{@(27a+$B9`JE{?)Ja2u-YhZ<__S5Yt(ecl6lwPYoG-_NfSI?`lk+>DO9_ zoKP=dS(U9S z)xljC=;%*|aKx-nx4x*iaDM2U0t!F=jO1&Pteoy0GrK$1d|KrBbt;zIVn44xj7gdr z^4wqF+}xpBq696lPq8`pP?K%|dq~(ViN!1A!lI3I35yKWza1g37an;=i4f}mt)S{? zy#hGm4g484w5HQ+RIz`7831b?ST>&64}UOW#Ci^9A%6d73?}yMK?n2OEL}F&udlQD zhdA^6R&1aXDw$wW67>DJCJ^PS9YvdpoO<}>$TX3=Z!45NEoa{(16g1g5CRG7XOwNCsq~c zrrJsAb&BPO^qR2i+vz@xh%tIAvC)#Z^}8pG|sI2RK$E)Z(n6w~xb?Bwp~2zBwu+;SVY# zeY0O%oq@Lb?_g2riYW-c9G+%+41CS}`UP^FOGyFF~cj zWw0vYyW|2suXs?l(7HG5*jFmNL8*~nLu(wmqn9}R_yw+TGoJ}e=+B{5Txt|%AbiHo z?~PW3MWv6tLDlE}WBtvQuDJKWH$y~gyEs&*Y3$m;IZTT|!v8IrS!V5=bRSC)#pKY| zQ_2HqdWL_kj`4q&AQplgvbmB4z-Csz6R%GaC+p(lY3M*s zmL!GfTw6<%#8_PIl?C)YP5;F?&llArX{-Pm4m!l2U!cTLTJ)1^gtFnW(rGr33u?N3 zfdGR&SQZ3IceMjNhd5>%7R$#JFq^Aw0nucJPdIC%H(A#cjU8GomV= zXB&U%PGP#S#0%X`N2N;;qZsoEd~DnuA!P>lnC>n@iy4MizUJ0C{RZ?VYf_<%r#s2N z)@74E);?4cND@f*G95m(itQ<^f^1JUOz8NW>I`>$$3oC;wn1jcjG~)(1@nv87IVDxnK}J* zz~imalu&;H(iYpY8MLLYpX?hau43#h7D8!<0%R;C6dKx}C$K@E_&PWg-6gp#Du{oE zJdK!2`0D+8s1(wWA8ki%P8w! zQsCD)e5AdFvB|{fWy0sC?`mnAoydRM`S+Nhz<}O&j)rbvNjfJWo_~(xPSZn|n+(*| zjFu7D&yx5atgcZtUyuK9pS-(a_RUPp4Ahqw$-{(<*{Im4ExnEgHco{gLGPf5oH<44OMVbzqw@6L9n8?B=#@ z8ImD)ZEUo$68EvtoSv_F80C@@>BE2PuD zT~g(hJI#~y$wQWNk)rH1AM<~8Rb@q!e1G;D=Y9I=-ZF4n>k>_F*IF(aq2tLk&z8v>FyWJM32A>zW zymt{W?&c)X`PfAP2#GYW@)h6&mkj#H2B0p4+$hd+KuEbzoLMdop-Ne?=&HgcE({;3 zH1FTT1VyATq9Rx*6wwcn#N;eHuY{-vtHv11-?h+}r0oJ&X2c{y0Jf9qH2E?JCRT;B zdoaSh0n+S=A$A{^l(c`E^ZjgYZqG-0!bb0GauvN9!+2nUZ5Zt_1NkTUeAk;)HSDIa zSHzx#n_HJ*u=fs!7%pLqbV0m*QVtu?bynl-LC{Trwg<3>7QY`Y4Y~>59#&T}AY0vb zsh!p7Ch&p*CjMi9(J%S3uBFA%BUXJ{Hg zQ@QJPOZ`6NVgm)=j_mj&k1>a?b_ECwJ7%42X;!af|vrOfnO{y_EXp>`RjSFxI zuDb#^gd@wmlm)h-CxvLSZjyOg!%;f8>p|}o2+_GFOBc{N)xd4OqTet69H8A_z9d?wG|N5+qjeE5Il^R3{NPy?tNPPOCiL^OcU zZ?lU!ZxAXt?bo|6Uy?5`wE=#DFGq5u-|ipGPS5tv4rXumjzx{13?n%{dHc6R@G?6* z`etj_`20?e503W5Geh!Q0>U@lrB1#-@?gnl7Oc0&#|QgXsk4KVH-|@HnBo?6;RQ>Y zhmo>a^mBht??||>ooBFgLjI0EA8@=V1-lo!%sTEJ$vL<>1(X<&lAj6Iy;O#430TPq z22y>@g;+`FxUa8KU3Uhg!#$oUh>!Mt_5cdVuAi6W`lngMqdDBojlFvf|2*>PZ(NPC$S5D z2gT#tQZPS86#hocyi3M#Nxa>Gi~hiA1jUK)5we?X!Aw%;E(H9jkYC9sbhMO=Rfvx5 zKpVPpO9Ps|cayz2L?01-lN(sjZnjSMwqT;R4)?a&`#at`l_ar8Bq8hR>D;3LA}}Ib z+mnBGV25%uw_aiN4(7~^933d)N}vc60bvss?a+kghh2gxmGmB(5;hbq14ayBH~CJ; zDgX$z$}0av8s_&W-_;Yb3BOEH+SFpXubMjy9TLays!GKQ5+W*Hyo5L^c(o>FhK?n% zlk6XzhR{|By?+nlGonnA)vF%Fsp+g;L{Wd&R1uGJ(28w=I*MO{n{P#Rw*Hysb(Z`M zW&uNUj7P_ej+2{p4O>+eiUs1upkyDlPwZ$*Hnx?>`I(H^4LP@cQqet}b5>h882@e! z%s5mUPI5r&_-vhWU=Ry+&Y_{&i@o7H9JAA*_BXkEVmI;zs;m!k;^CQ|)S z3&n#)OxV-~7Hr+Cnwk`!MRmYz9aUtIvHZIucf-@sHwR~+H6aU%HFcw}Z}M-bBXyI_5r9)McY09rVr(EGiv`aJY&@G>J%O2C4c;#U_bk=pf_8GslJ!bpQcDwhi zje6%i>ynQ(!4@idc8wb^P3>j-)DE0i-DY4?ZC}a3+LJZW#uXG{J&gY3Lq#OMmZ6s+V zoS=*`&Fm&`SMnN8s5@CzfJ3x(xEciBY!<3fN?7YwR#;_q>i|**^ZN_{+(yEngooT<9Q=p|TS~I`_e3e~i zMV)`lq+DhZuP)Y&jM-3&-El=x-l2|Y{~}-J&0T1JrI>$^Wmq3$LLnB!E4HX>W*nkB zEbRJYZL6&IZ7Nc)#!DikWl$vvQ;G)b@0?^5fuXx$Rjqw9Tv%Zx`m5J6K0(VwsrEZ} z!m8k7%@{|-OqdGMKvPw;DklS1y=u@|_vm73bP=G^L5c{us^&Dy$`JmO%rF9*G^G2O zPJ&k_iP3*Zup(IjRJ0!qD>NP&Y`l@fi&j0e7F+Hk*4any(ah*~9lv9%YGZ$8@aVml>c+aS3?UzOPkyM2++pHF z)@qj?>S$`9@Q`Og@ii(NkBbgj;ITvoYhTZbI`*M?sRqo8gyx6?2+5$tfs+2iZjk{% zGQKg0S~lmn_Ap{{8ats=t@w0HxE0Wn~z{aj*zh4z0hbC%t7vPwe|LBwFX5 zpr~aenW3Tr0%|3?veHlkXJpLNQ8O`FZTPBIac|mIwZ^Gy528yxmPD~o(X*(Y_9Vf9 z`w-oxKh?&c|6UhyEHp$oO7UK(=IkUJ?kkSSj&#m`Vj-6-RBfTLXa0J?D&H5 zj~|$kAlAdXa2cXwft7a98ADx>FQhd(f?H!|PYvuU|CkZi(iZY~+|hne0t*148T)?# zjX9VFv>lc_v68&!jP0=Pn3cz|g}bWWKh?nr=0+N<8&j=EQ;J!K{sVMkHl;=*A##xK z#tULFi@pp-GEJI>E_Nx~xAbE9tT&T<;6C(Zkg`=@uOd%^Vd}GYZ0j#;T&Gxce}R)&9qn(}#|q+i-8!)l0&O#n?y{xiAs=LgkxM!Kl z2UPaH=J8IvPIQb8*t1DLtLwB*o2DA8K%*lVw$ZjL0=Qx?ons=ZeYWgU?md71t&@Xq zAT99G+q2o}@xklEuMZFQyNq>4(s@d`dugQw^&RaJYz$$&e=le++?XOt82(!^@T zBto)afEdUqe|s&K%^aQa88|Uu<@)Lxq3j(WLZUw`Eq>n!aRWa4d9%Fp`y?66vEUSl zCNdf@mv}ky3&RqpQot!hsXx5(3*izzl*{upn_~r?TvSy0y`q_jZDGaTNjmZ<@g)3Qj7X978u$4yKr?yekh_Ma)zY4Ts<->jF*o7{X!;@q+ z*b_;{nRorm%tt`dYOozit?E5s3Rp!k0Zq?2n9+Ypl!GTT#jSHH!dWS;H0P0eF&%ujdXWTD=w3u-klt_V8bYFr=W zxqg4y*>N9Sm0~j;358%pr&B}}y+NqVue~%v+gr9%QoG)@_Y&4-n08gl3N-Tot&1d% zG9(Vd6Y3{{o>^unzMkS}AyIWj z>Cs$G!Q{Rj3W9$~6jluM4){I_0U&?0t8b1;*f7}ke%52kRJ&!rW2eGy=eMnXiV~p! zgXM2xjK(f=c>M8qhHfz2 zS(PqF-HYj#QcA+n?B(lGnVO2?{$Ss7@bhhIHLLGg^; z%;OYpRr4SkefUXUG0=CUe#&*4b+yg_g$;BGndnB!V}833?h6w|0JMD{Xq)!P^Y*IPLAgA zGC6^K0O#vUJC-bxLZcZm(AABxlwI39S|$`PoQ*9oUd-;G_b7)=np6-jymDZY{~uQAglu?w z1imQ{Il4CmqK!xuFbJQdxeZ#z-GTp^LMnk;?9fG3ztINCq?>XKyP*Y1h@piLAKU?f`ZzV}EZjaPaVBRvV+>O#n&7!rEDE3P@Am z4rg%pw7Hd=G&O&&9XmAGgW2>wi5?o<2qBfPmYEfT29q)b_HT4b++$?yjb30f8B z-@ZBi?%)i}%Fhnp9K8MhtbMPkW=;nGvG$uv$>t$)*j|702y3WZGBD8#qkY5V)7}$6 zrgG9Jj@b;$D{EI0>}jO(sf`fCUAb19q^}5BRAKHs1qcywt!Nai7q4EuioN(U_Tsnx zCRNk6)Wn`5KB8_^ut zqX$uTT5sEW{<;@;2E-DsyUCH}E7Hk9h>7Ml6WdtZTxG@8GHF{}62S>ZKb&8PU z2tkNKt-Ifm8YEG$>x4p^Dem^z4Ua&wQ%T(T#)>HsOhvo4#v@AtLg)DJXf01vh??HB zXl;MSRS--4i=9k7CtGpMS5q$0Do5sj23f+B8Dca5(cDX$otfP`R#8du&Y2y)iO2{y zy<_56uIZ~xnEXZk;)_>bEzk~u?X~l5d+Q_da~yx;1VE=Ni|ugA8QpqeBgK!T}IvgF9@c za-)wXt(qC|dg()jiRzin4LD0IGfYeUb-Jt#qrJV(mn1Y*5zi=R%m5}Ycw2wg4qE~1 z97kClZ=FfsuJIQ&h`?>xHi$r=XLQO?vbZBzt@vzd<$KFE?O|O7b<}!?J*k&jwi@|wG*=-`362LrrC!Ci=R}0>!f{P3(g4ss zD8ok-aTCQM5<2n-h53$m5e%WxEoW;3&FU1Y`%B1wdj})7s>&<0oCi%# zNBZv!mCY?8b-Z!oRvv+Y3)K%tXo-K%N^jseDd1^qo!neQrU&Tg1#B0Twl@YNQL%B$ z7GmLKpy~#|L9GSs2n7)aN5Ah-d;Eg&xf2$T%B{rEA-4R^jSd!|U>) zgJEWW8Htm!lki+^ea>XDv%QSgSxCTc*D_PqKXvLGQ6*?1&I1#IdH9oAhj)J+bnt;^ zmeIi+hsMw#fQ=0(a?%s?1P>sFGt6Vj+Y#zLn}^_}8896P(N-z2CzGxQ$0nj=VDmK~ zh-6QrYO`hnc7x8#7Pt6EG0gUw?_>7Nv9d_T)p9t>yx{q(cP%E!*K^J6VqV(U+df*P z$hWZ?!6i8scA&AaKw`LD$C`g^hwF{-HTQ8xUwLZ7o@=1=w&BDQ?c->P4gV^ToR&wi zk?aV4mXo09HHa1>0fN#AH9{c0@iT$;ah2H83O<{JO*LBoW82g^{b|3nW#X0#THnG} zS}~AJrlSWWk|^}nkxjPG~H@ZTy}pQfYJz92x0Th zU$!U7>$HGl$s-JBD3hv1@CClBqC)4jj#&`DQNvR^$B-x>Sc7_ni}7&fA`nwQc$pd z%^c7)Uk>)|Oln`q$S8lZbYo82xK1vic9H7BzOc>L(#E=V=>%7zAvHwX$|+XUoSUNq zsIDuT;Oz{H_lI_-$=`So*%pneN8nh^Uy1gSLqg0pu?}n3Y)BMAt0C`n*=2o(>q(Op zrv6lSfs>*~V*l_#5fJFyl>RU;cRb^PY%ynX(q zEkLE>V9jgfU@2=AMpDMugBue?EK)tnBzj6y(-}%rhxor#i2*1iB9Tr&s1S6x+qQ_z zqe)5Ss(6Gl1GK&e2CatU_1QhNryEdx3~ULkSFsI2JeVh|am~;#3a7f1r*W~xnB|orz5;MKS zYQuFYd2G>XAf3lDaZWZ)89QpS8Wihuxzv&X?;|L_2}w73eaO@u#>>+A2he(cj@6+y z^rw%Mox`11`y@=hU5ed=cwrNFz{L~-L2yWlx}2OQhWvjoEe*4<0eIUq^+scW6Sz-j zv(qWZ)@Q_SNA;ndeBd3|xfQHayY*@jj*H5kL{`Q3SXFRiE21Z=H=sUHNIjlXv`nZq zIHE@fPK-S)_Nuv92U)F{xdl$@HyHCXWucFuAVFKGGV*AMSWJM(S&x9y*-r%laaT|k z{x0!bV7h;gxXcpJ%377Js;th6MqMbvaKV{t78-&!PlN}IvBUFSVxIrTx|yG1bKM22@ zA3A>xxm>XoQorzKiWgec^n{Gi33=AW4mEcR;VKy+JGM?23m(yd$Kip;5vI7eSg4Q( zaNpN)mup1`(|4{qNZ4YbAbC7#)9_&GuvdVUwxtTyMIf9Bmg;@?Sntv~A#4sP{`cj2 z8Q^OAv@JA%j~hcNY6}Tnjm2z)5t;_P%&30~-Y%K32wa1*yBu&x)IY(d4ZL(cp7=T7 zS=e&VBNJX6DzM%;2#d?au7fyDKlMR~cRdt9l?;dF#t@gBySmXxt7ZB68$wP_-J3&N z%+^-!K^CY})_9vi>SPU7c2j=LHW2P7SW(G$JjlEsGayV1xW^as)Z(v_ z{@+*9(+vJc2>a)1MOh)jU|Hb<+gzwvWIu|bIpV%P=yxENEGBNqiZ%GBHQAVV6_g0q zw?z=dVnY51WLkqi{8MVxX70VYsIq_b1E(-58Vyh3sWq!|HO4xdaIX96HJXoEipaz9 zGY{-jYd8@u_p6fgpQ7Z@1plY#Ihqd!u5)lza_y%-TfCk}*&+w%bI0qs=8o>UaUUi* zh#gvrU0<$PWf*CO2i$Da+A!{18Vx#$y3dhRkS;O_Jrv#*OLiMzdpu%?Tp@qtnjFe8 zf<_Qp)1c*0XJr4t)eLU%(34K>j~0zjxJaZQXL;97SrH?Ic8bz67a~!pj6XV@ zg-lw52t~jTN|$nf(bi3^L?8*NIZ_#LdJPH9)Iqxyv)@6b>=G~+-+8Is$ zS?0yqAh5k1-X}+OEhB#X{c%kF3Mx`Y=!P@k4VqsE*tr-q$gTdy)J3Hs0FyWAEsp^W z>bfUXm6Eo&0H1$Qmvb=W;dLHXr85l$6*KY#pxNO}f+S@FOREl8t`;lb8%1`Jt(N6oN2U-m!g-*KA;WTZ ztYJe;?Zf662jRtf_5W+Cjt7h!N`tzad<~8gm@r*5r^bI*zV$mOEA?`-{53_#zh8=u zM-AkU2#bwoF;*O9RE@SpkCIDQKEi7y*&(t+x?oxr53DW^Oz?J744?QiLLy$TUJ#US zxi>;(24cjSW}SObW4p(L?zAOU>L0_Nu}mIiPw~u-sBjh>9gcjR}C+%4I z2rjaZxjKKOKxpD^>yd>Fus%gu6Ej(&2qP(T;Pwu_54C%@(3qrTgULu6QB%72(soDr zY@z2bLJoRf1*{2WpcCd0=9@Y7I{Z{_T4x-TgpZLyiEiu-)#^%`S6K_O>(j^01jDt9L$vmQax%oxT>^ z%-7$V(es0ZL~0%%oSYt>o*f*WjpD`0)*LHzI{sM|Kja0O?~mjO<8w6==&Bd4bb~Ro zL?wSY@rFW(VyxIWlKSGfQ-LGpctAhM+0SfwB8@~MSE-75TAsJS{0NJI%r>Siy2se20SikU z=e)`m;dsomjc;=|JXTXpTJtRD%-)K26Dogo7YOzLm<2MGz8F>mveh8vs&@gG_@^V~ zffv4#@?on!TVxPu&<(wSN)~(H7SHE2Yv@K7%DlPon4+5MweSk5Q=P=mU~j$x zWFyf9z&pTJflvCKl&{tr8$z*dg)xC0Yi4#QR+FI9`;A#J)FROV;&Fzz`z^Z1xr~2? z6|^UC+(#5QVfwnbAz$k6OviKi$pXnG+ODEnyF_X*+T}xNihX{P^(lk4SpDf}r+O$07uc(;8I-tf|k@*A5Oedyy67Qi9Kqwv=>MA`G*gvc#1hZn(`398Roa!dG zQ0qB4=A(ezk8|%Ie0LyJyFT-aYjfPhg6z z$X9%NgDiCTk(`?7UR-9#joHIQ)DQSuVi8R>`0IWu=YZK>RoOfZO*n+`S}oIg1||qQ zyDC}KXDX(n{!Uh=N815#g+(F!q38;UMhN)!S zp6eG%++K)RMnRD{uewCA0ruW*hP>>9dw6;!*4O^Q@yWsKy|aUTwx?Z{b)8=WE)&|8n{km(sgHZ^n80F&7XR!GMhve zGAa$Xq3-Zy_%;wWs70~aG>p%~Dma6~q{Jrm;bay~+pu^hX2MKJ4sW(hED#ltqsKH2 z4wP1eolftX9+T3~{@6p2T{;O|HGF+rKk8{g zs;{Lc$=GrKP>qw3SwDYpDUu3kVkXQcp_5D`ijMJO^dqBNg^scVqw%;mXPqZ&59!`< z|JxOBJ>-}En8|EH24(%mjj0qV6qwL1E*MNdjy?`c%mEe1;N4^JBI|d@%i-Mv*8OsI zE8gHH>ju-Z;8tJv-FQ1ul@696>%`RVGMEh8awfw*|Qa zWN>qdY(;YC8&NDIv7|JTW;VBJ%@23(g183b5w~)8FUzBP5lsZxnLFsz|^-RebQfQdAvy;%%K@BGHS8i-lyVV;21$K_+(dnPaFy1%)Cls!*C6vy zpT0~)eeTIjLPHfE?!b`zG@|(g3*-H_M+c+N!CLvHu5_+yVEB2e6z>})&@_^isA91r z{rnY;rx<@*XpvhtO+G9wnJIORpl-})s`Net?Pt|wofw>%6h5)V;DiI|tg6^3xwp&7 zYOQXsp(y>sr#%HK$HiH=L%Lx}gZ6IV#8VnnB{6`5qT0KI^Q|?k>$Ij!s){%Qz__k$ zCmT{9+-{oTf);#LI@n9IJGB{~P<#9hXl!|Ov;lvg)+{Uj!D1B6prwp?>uX#5)5Hp*pp9+9XDI80&jYbf`1EI?)Jt27iy|0Zc~Q|acX)A^M;%`jDVr+|%;pBl4!ZrihBKG}tv z&L5>_SNHR2ELe_yp?P?bQ|WTnD3omo+oc{ zhS!|JkTpz1IU{XTJkn%@S4E)1&7gnG zbRPc*B1&f+ucSZwu~R@V;8np2(cY0!kK zS{u%$gHiibw&!)~W5xAE6R4-AW%hr9hFwD?T+B?%o><%ZYvBCal^;pUAzntrksxak zbYT$}x_5MCTxV8;#2!y#7bc>;FASZi|0C|68>Fp7? z-Czs1ZSA7YXAIFWs~b8%5?I1I5&Mb&YGTmHk3mLyNgEm?8CUGGTo=Ks^`N_vwJ1X~ zCAK!aqZ7OutfA@gNQDaZeIYvOk;8O|(g9^tB%U!Tj|yr<5-~HJ;$9xJ8$8$~EB-Ns z5wQrA_Y@r=&@abAqHPQo*+qYz7VZdipdo9$m@muqViZFNKH0LZ@p)D>Wj(ZUs&)Uy z%c4p1BCB3}ycvoDMU;J^LDU`|E>9x&BA4wr7P>w3Fvs-PY)f@Sr$I7WR@y`bb1*T% zlpKh`1*}YfLw)UI!TU7wLrqUyZg?T)K=SrdzqqX~pGA1=A1naaLE(SlhHG2U1i^xD z0ZmKAHN((GT-%Bt(J@U6kNv#3tRcON5D7b)s#s^y7GuHGHVF%64dZ}_U^sqUSAz#K zRNP=a&Ez`bN*OdBQN`kRT}VVvs(|70h_4=@JV13^KwazQn95oyg=PI0xA`LD3dkg? zpW9H{nUpLWV^W<%HX45o94$2*@d1OVY@4wgs2N~4RscxNc76%m#=JAwr$&X^2WC9lA@-J9O@>Hbw$J;lyD?%bdRb`lJaoZPVk?bb1OG7UhTDb4%)uDWT27tYN2^_$$l ziLr7=z>O~C1;+n3XrGHx)2@xJRvo>w;9>}GNS0~SmeQr!K1t8o9df?d?2O>Q!3?od z^WdeaR8?t7&pOr3?&q1Vq0C6xhP*e!bnVMUtg{`Kz#J7Cd&}tb zi~Gh2>=hj3pU_NfR(mJiUp7I|+Q=g)n5aY<#5{gz}D3a;MO%64`gY zsw|NEmqh_4_q(SrsO6C#j(QUT7X_VHUjSfv7ogS@ns4i?L{mmY+C3w51Gqo%)E_(+6Cjpq$F8QMMVReRpBhGO;bzh!N#Iy(m81(yG9k|yYZ(Q zhowhP8|W36-J=NT>m;Rk1cp+7AKs(!ZD>4pHf`5<{!#C*ow`nU@Q6jvFE5>HHZwrq z>$zZ_PE#l0OLG+YS|7E24sIiU&@POXE}aMv6w$TT6b6BXJCEqwEb+*y zi=HX~3T`t1-lUycY>bRmu z!uUN<0uD}NLW_6i-7=m1a87>JsA?>?@r21<^T5$Z>S5k-htrWl*>J+v z>pcd=3?d0FUHX9zhz!M5HmH~`gzDCZ+&@@wuEEy+_Y_N`#k8uZNn%QNxbI|celaqAA;3K;ez*~8xQ9qD&FN|Y;Z#otqO{A^xOZ@vaHh#TccxC03?yIEm9Fq~OJKzbPM?lp0#n(8^ z?rV*56bVND3n(&!a(YeN9-)SLZ^ma;8l5!Ru;`s@qBAI6rF%2>lRaTOGZ0RA7C&Jn zs>s(qy@`1Mz*mQ@kHztF1GA}O6a1?~HtRO=Da*<499OFw*hy(008z`#uNe2iSq47G z3eIaXe;foUVOgyrCNdc>Qtdl%gy?Do?GhPQdbH(L2hcjqP{#)$trO4VcEBHfYql8g zoz8E=rD|=5;Hvp-)pPGN6)af4MMQG57Mukc>tY6R8C%jgo6N%~-s8mpZm(t?Pv?tD zp-CDnN}!wCALhA1Gpvoo0nqr%=bYELizoQU+3Hrx-I(laGY=Lm zdvpzFbszp1n5wNh5o1~luts=C*WH)DpUz}ytGUuR3~$6SrhtbUJhan zeG7YaMl8VZ$k|J?AsT)}$71nbbZ?V^hEG9U1rTLm=$>I%a#8hH?}-9)=X3n9 zA~$a}I#W7UZJMePbDH;N#Wk+DxhJb#I4?_&vGK%%QPDrK$;viQYjT8IzPl)Xi>gvl4jv^;D zj}6dPe`#*^`_E`(S$`XtX4OC248iabift16uf5v+ez6{cB59ODJI0qD3%>jk?PS{W zjr*B&TdchL!jT5MULYyLjl3dxN3lefPpJ>ZN(bj$mZ092Rj_CmoE|d8J}LIk5kNLP zQ{t*K=PV$&8)4Rz0V*Ejvviwjp?hR<+YGq*;H>}x9g64G?O9QV{@;H-qwi4%O+{uq zCxkyOFF(Qs@EE*&TZpa8jiUlc_z}actCY4@lP_WB@QGO)q3OuDMeO`Yi^1D}EV9gp zkoS?(THxxPulzCsdF1>*uLbxCnZxm74xnT^$$9vyDrRSGU21dGJM-N{Rslijnpc!w zMQzb10xm$_%%cJ2AW)J&_0O4-+p4@u;WsM^#fV-FK*4bB=sFx5E~(@=a?C{yW6T14 zr4})1iD^*9N5RQULrYD;#qA%%=V8JP@$&yiQ_aI4p3<%ezv-`D;C^Ihz&LIp|H%iH z+$!`ekUg2ZGe#BXzy>hsyw{x6C#nf6MWX#J}>I+CH z_YSO-O&=|<_I)oJqhPQ~OGQJ0%jAJvI!N7Aa;83)<7jFXY_qQ7g%UomrJ*tdyz@bEAlZ&Byr8GlF9(1i4Sz}KDsFqD(x4?pO_+=u zWdITLyN2Kwyu#3@Jn3V%%b-z}fy?WEFCGyGpTo6;#tp9!DNrG~p>9Pz=3P?x-<2B< zA;n>WG?{BNO78wl7iKjXcCF848zTVBkpS0fyCtJ7GP)NMw>_aRC|LH{RIkNLlO#=`mS`PO^B0$=r>T(N9iZ?T?1x(u`;q%w<#m}|=jcHW zx=#y#y6i{MBIScEk)m?d!M*QDuoS3^m&0Xqe|4`Poa6X2N73L)nQH9;0Qi*ghbG zPCK1J8WZaM{6EeVo5D9;)6Lz9wmw$EdU<8!vqx83O4&!o36`ttS{ec z+O$~a%JuP@_85%FeF)K*<#otLPVDB1a`0;n5YD#0&X;)zN3ODA0H*Ls zZj0GF3DGSfg#(PE%-gcqiWZ-$+0}$@4az5iHJA_`rObF3rGS()XneL5QpvqONR6iH zwUfQ(t3Q^}xJ`%jZ|CibbiOs-_n+CY9U_&A(>h99L&#elh55_SL23Tpop@!k@?YLF`rRV0IlGgc(^D>gKJqLM)ktH>mEB%rQ%e^y$rc4@B8mD z(l}v%K^Nk#yP$UjrXw_c+LKuCbT$v6Rd6z4J>@csFKhTs%to=x2>8)!h@qF00(yu= zq4pnHUS>AGh^-jUCz7MByhk2tvmiBCgl;xDM#h|`%? z4T-8Zd3f*JRK)kVFUYER+dji@)#xTIDwVA30x5gYlfR6}fC0q8GK4@;B)@>CyH``?eFVons!ipfZYg zg@%oao`FK3mI99-JrE%n_g8uut|)Zj_rTJDaT#p8IK`!ZPN0>o>NypSQ%<5ldj@CpzK3TK7*aiw~bRn}689~%m!O?rO+18Bt`X7=F z^f0+q%ygOf0$c;nCs1;#gD=nKr-QQ{K~~f;aTQN|2@HvvnF4B4LV8e9UUfflc4Ak1 z^n8NF96&Ag9v4v)p~$xq>-b{9h`gSP|) z>S`M)PtMrE05`h5HxP4k3+vw3^0nkdE-mnjwf^CtY$m!XH|E*$l&vrTX2E6KJr(W@ z`{{C)36pCjlCccT8iG3*bDI59*U(XX-&55?dhYa4L6R6Y%9$Ki+jT4W|VAkhnT(p-PmsWT3&EYVHJGOKt^ zdSNt>Yk9A|L{DwQ?7xj3)@iAk%A8h;B`td0h-JYf(**Y$h*^hEqz;@DTh)|KRE}bv zlAz{h2j{oPH~JSdA<)CK9oKW#x3;hzqmt)yqPICeA;4%rPA84O0J}lLu3?tE6}WC8 z^UGfYKH;{DJ^VLt$h{y}s8+)NsB8r4m=?gPAe~AZ8Of!4t&d3?>DNY=bv{{FXf`p5 zZ=Ka~8!|;f$u=j=8~QR6>0OIAcIdjY)JyULS8q@x!CTinVMW@s^lF|yY4uj#K&jC( zI~x)o^jM2?p5IQcy&+@Afmh0}3fQG*k^W)+jXyI;Q7k)p30gn~++!-6kNqsp5^lUhVf zSW>ZrE^RTKg7dT(5g^ch%GrnSk|s7Eb2CZhKWuq^+100w*ccGNz3WYdvnVbtqG;v~ z;Ajy}lkMANdNqy4%&+~M`*9NT-|}#Ptnr-=E!(g> zlX>|gn*ut+EBqMbAT9*ecVZ$*7VSVO3D_fu8dfaUg1Y~JdIrG{5WkX((yBihr&DNf zk0r&I7_-Z1M-|fk|6-oFt3q_9hbOim4zexZLrQ>j%tbSNJ9vCh7pq5pK*zQLvU>yY z+2+00ZKIqPnjFA^8HLg;T;5#(CLX>m9-fSz4Ici#ozhX_mAH=?S#>-)Nq?_>u)0r;%+WU5Y2O$XcDe&eMz$`M%T2Wm{x$|SpR2=d)#e)U7Q4=o zYR0Li7sS~J;Yq9FI=eCUU8v&&u3>5|4C+cM&otQYeC$R1knFmY=DhXizqa-F1#|xR z#=QFfX;8iibYd(hG5R)W>Ix9+4ssY{Z1kvL`Z1})9>o&AX|vY{>rnU!?3l2hyu6(e z8xx}BCj4k|vdXUw5&SHJ9SlW6Y5OSZ$m`uKM9w(;*CVHBs;R?c?uO|D;7mhKyBi>O z%{g{IEjSXm`n1nE!RR$C-WdHaS>oda5qc@UHm!aFU#n96Y1CSv3Q+mPBZ2)7Y*z>; z@g#nSO@?12j>Y?!2nt~%1!^)SDR8AP#64g7*_ixoqsMN=*YYVkM{w-x>Ns!6arH#; zJlizWs;eNrD3o1ar)1m)P_!+6X_bZNlhP~dKrVgi#6{w+Bj{itQ+Ar9`CKS<)yEe2 zzG_W3g%DCKBH2c~x6Kmhmy^*p+6-dt&@`BkHAHf&&zW1oDf8~=E?!UM@QO|3tMH<9 z{B^ zOD9^$qCK?d9sZ*yBEu~Z;Hef-d1@*3R8=^gH&MJrM=M=N_|=n z0-hhl(pBZ#HSBh$iun7Q-+>rCpZ1K)4Bh3PFN4UdyRjBd>3(%;mT;&R9(bxI7kxQ1 zMDSnf{IVqT{y9EW2zw>!3$Edn7#&iRIPUeS^j%z4X8-9X1aMbx}WQ*JDRIv!H=X zubo}|Ezet$V+93~r%4t$$c!WyVm3GbD9~K)^CYPInQ4%;tf05RlsAPsVxIyE%S79S zE!pq@__=5rU=13MP?!oyjaW68bY5YBz?qtsBoKZ?+66!H%P}~7@DJx&2t>@(;zxF5`pZ@=T^}RiuSpn;1=%v zv?4U2q?{M!N=hMZrM$U8N%8rdLAhdUls!OK@vEN+SVRor-bhv=@y4y_FFS=u+ER@h zx3lpWmub6$H{uN_D-08xc^0e@shC_8DV-3tdZY-2Z3kK3y=G^`IH6ZlTl@IDL40mJ zL89uGuqD3x2dVgf5lt1E-CG=ZfPgM2fPpywA4F4tiLHa1DdYbaY3lwz>;FSF^#N>& z*Pj3TMRQ5X7O6-*;gs|43QN+N0_U~Oi zY{FxYq=v#|js^&q7zV1;XjMpjfuYZg=Q{)+UK* zo*S3n96kY)OZS1~Rs*MAB|>qx;S1G3qQF%bwkY8fOf+4k+CbXhWQHXgVo)O@mk=^z z-pm*nw2TE5{2XG;TbepuU0qk9A$E*2wSYC#v(?vt0!T`pst{&XE*T1?JkV7CyfN&A z*UP}rKZ2H6`oLMq_XuOL5aFYEOzl$v(-Us#C&u%@QT&|bEoAQVRy{!Tw6dBuPa!vX z&Fft=$vepm{qIw^7l`2&f3F#{$HuZD|90_EUf*Z@7pJwo%ey5Y=x=+oecGpdJp$Yg zxTlK=(ppk<=9@(b5Mh(z7b7E791}(YHA4E&Su8LSjES6UIP)Rak-F#ZifaXJGeO>fLzL}gHQJ)2Wb zEy`Abxp{Zjmv{Uj#&*_THBbVF4yU^Vo(c)A3^0JYj#?4QNMB;TICvi)1ORg7p7$Y@c&7y`p|H9p>^LJObePtht=nMnMy6a?@sR#xu=Z%B z?T+>b!OSMU7Z!CdoC4nuKsz?_jW^csO3-bU0@@<8KhAnwB~c5B1CrkfLB?;<%r{_W zBHlD#(rAJrBDG+_@4Rx*p8$@JXI>d-P7nPg`~kLTu}2}MPQytb&oFBV%v*pqkbm-| zni2%wMD0TL#~c^FAjY&wCPWyFE8=dVUv=c!fFk zH;6BuukbMe_*srO`2Y*Xf>-jdEIq~0I!)OkQt^iL!10L9E4|n7S-=U5WcZCGo-pk2 z^hLL!9aXYKeRJ$1!b(;Nky@jd@M0;{Q~bx|>+IJ|Q_s@C#py(RaLv$9aSuM4UGUP* z4?dco-|J1425sf~>B8;4@7X(8RDadJ+Fe&b@*|#>q%=O&i2a(61F+P8hyR)_{xNT1 zqNe!I<$ z_julyI0VGE`u$f#9f@}jz!T8?fC6MVB#)wv88`%v`mj$<7{?8rTr@-R96tX{A?9aJ zFDUzj7K*$PPMFB?eaOf?tlET=lyN_(B7?9SP>02)h%gbA8lY;bK351?A2jK`0g{k$ zm4m^DD`K^1=X3e8@dW|%&x0Q;4w5I;wzkd7Z{DcXSJBJV)c4X<_lSODD+K3ZOC>>x zcL*n{;KsIgmCMAHnG*9HN{^CI;Z-?S02V${>V9xR92FxtUGK#KH;;`6H=mLpC$y0t zFCqNa#mb(LAs{uRw9goXMRBtLQVRG_xnEb$3h;V+;~=B&;guUw@c@zhp)r%?*@Ee| z*+aPu*lm`B5F-+xr#6gCd2`;c%tojpx)`gful=v@T+eeFB*2!P=54*67i4%>~Mug=Osk_(RA z;vbc02l)?_v<*1-rf-@n^aAt_#@DoZ?dpfwF#_6_T5^ScVrd0hxX+b4N~Bd$2Mqbz zBH3gDUh)3Cdg|2+5SXtZdKOm1AEjehuuBq0d{Y^1&0N44&e6d)tqKw$4w%uLGT2B$08@ z{e?lxwcdzN?#vR^YZAec$h*(~?vALWmw&vX%bg>G$C$BQ<~y-AJOnbH=GfE(mW%=5 z047~+o_m7r>Ck0jvWUhZ4osr-Y`U#SgO~c#y1o7Epxl$Y1%EJ~E1zaIuIs*hPApYt z>4UUI>n}pB@9|kfvgvS^U|`E1-Nu_HXA4HUSaBoW*k$g9DRE5x*;eB~Z15uFy<4uJ zX&Tu*ENIEQ^yZz)(3LkL-fR1_!V1<&0@}L%08VYU&-C<|_uy+!AHbSxFTglbZsest zNW^k!I%*9wbC>dzio$71)ptN_ftA=4N0A7Y?oGf<=(RvzkbD`LX^liI= zgW1+H zE{E~v&(D>r7q)~AN|ANDu&Nw}q4F20zy+(b{ARrb6KutC8NOIlxM@#x)U7mmsqio= z06Dzbmp^Myas!A8ojO+_hKcX6PU6zwXr{`)vzNaydfq&%m1nGqUJk7EfKk?}Y3gbH&MBohp?`q;$^kf_{hOjkM1JPN}NZ47SJ#DIfhNQxTI zDdAFS6b8QqBG}*MDoxwk{!8B_Gr^nq1<)UIos}i8UrE;EGki3t8S!0YoO^FjM{p<* zt2v)bP(~p_o73bbaW&a;z*e?|EUD4>hfu$N-oz3``R=Z! zZ;&Dl6>uE{vt*^jya{Hd8q2VWXyBF<^(Ev(IX!czRTIHG%upVGu7x628-(|RL-z=I z-8UWGkv4oOXIFD-C>>1nLOBsjw;x#|D4Fy96|$BwjH=I0z_|7UfMX^?cXghfm?6`Q zIeMDAvTQn90;i{VqF9nX;LctHrCWJ=M^9|2rOOvfVQqD7e@{){_~s?6D;Ryo?&cOT z4xEi6RqQ!Lr=WF+1kQH|LJxH0u$SqkDaiVMktBmlmtx}nFD0tn>poh*5Bs<|mJki} z8B?uPmt)p!EcGuZ;8H8xr4JtDv6qpe&|&JSy3&)VRWI8N6am~VR2N4whE0QDZ(b>% z*Vo<#a-lPlD&M845kN>0M>1$EKW1)sAT`hP-9Xy|%h&QBBc z4eG|(yIg|C$N{ z9Bqa1FL(}3k#INEi`Vo!A+>AbxwhADXh(Y!AzZ&DIQ?UEidT_+o$G#85I-RBbN9m4 zyEvi}^2xaSQ*XYZj86Ny5VXoi$ysl^z|zNTW&@}O@X-Wf04+c*>Ty$5Cxn$Ie3KlX zl{1e)f3g5(H_;H#A%zPvBsoRoPcW|=@d(SGU3|bB&EVycn3~Qm$84n}*Hm=WT;1-1 zGq4`>Ik0drL2V0lwoyV@9om%P4sFwK+F;_eKsbQt7yU%$^52$Ro2u7txWHgmO%7{7JcGIpDid^YJHS;mLxL^x7;TgFE)0|C?h!-IW1F&jDe3f=QL|d_uJ)I=vxtfbJ%+#adf1CmR9}pI+;^&J?{2M&mI|5$=wx6IE zK&f<}e&sWVOsc<03O_#&XTYMcY8SsE6PK^h29>{rl*U0I2#B5I6rcAO0U=!-0?;EaQvb^8se;R< z2p2r>6)b>3gB^}dpE@w}(d;m=b=Rj00EE+N2A>A}(c0Dvb*uxV4b2i?DY_@5eJyXH zn;h4ER7^X2Z-rliKre`zLrJ;_Iq@cEC>s@oDXDX%`Bz4%^&KR0jGR9Ny?DvJ%B z^f2Y6T=KFhLA)*NFZxlfI@gD`(4W%ny?xC>To}u;?ewtH!M6gs5ER>BzxRMr0Kad) zGcFl92Y*g{7-6^Nc@{(@c05-*npThU&2>R#B!n!H+9-ZiXb?25;T+H)Wj(y~+FvK) zt9E#q4vzx^A0dxH6n}yW>sd`Y6TgSxQYLym?B}tUJz75UV%_B;HufCZNwZepwGp6z zW0R^Q;UHin&HZz5{4A4CZqMu(z;WduW)i{khA!?yhbyP1l45dPkg@Mgm;&fJNLRM- zGb|dT8%PDtw*>1I}Jf=Z_O1OfcZiku?wh9U-g<~=yisV8xA>=E2wL3ex# zr`cexStFMDYYyuN^#~ZrkZ29^P+j7XBd@8$61qDW>i!3HPrhebCbq3!K#LjQFB~eE zk3Ko*+(UCfH2-=>`yp`IW`b{aqOJz=okwn3P2up^0D-Ni68TUF+i;@EqsJ0glw|~8 zb%}8g5tBKE>g@>Wzm$}jw<4eQ^w{kW0I_ttsu13Y442PI^GmW~{&WG0!*19ESg>IT zHl+b7A&893-@hieK)T5dfa^#u5fj(=bcW`4tu?x`Z41?og|;K5e1BGRYj}Z#y(D!J z*`q9+!MbGvj^Cysg@@&5vrvS>Ns3RCNnFR zi!MlWbP&0~gXKb%m{|+Qe%zTQ9=t@hqRjf^n2j)7e22_t+xxCK05dICcs2;yi6q!z zGMxcBebiUTCDVJErr-pH()=(>A-qGaWPN5D)?GF8(MI)x8on%2r1UPF&)U*~Jw^|y z6ev$F=!VB$s8;*K399I%mZuACHG>_@z+SO2W@_e>2N!gF6cfU^ahB_$h_u(tyI9~g zz1zt9nw^bP%a8>NK>d355+Mh;nVYdLIj`l)p4bf|G$p}{wuv6~%YJc%+`HP9GYb~_ zRL5|xwNhRIRYSV(T}C3*L;F@lxVc;Y?+YfC(`7m#ZB!cmolX8vC?*t*#Agv{Lq%J_ zEV}%n4NHfQ?CI1+14u^Iz-TIa`q=_4VWA3)u3XRKB5~$5AW6Kni-`du;0>ra69TOr z$LfsYnf9ZAVO7a=T@@fCnbHwtIs$Zcz>NKUaUc-Z)6+0psJJpt9VhY^Y%eZigwJj#b$a-YnJ49Lm5HZe@6lAuytxDl{kmhzM7smg1 zBV_3m+2WVU)zfh;i&xh?@awGn9U=U3)^@`&^ris?U>Y2X`>!M0#wO#Xl5*SYfE=`1 zYA1tYC_&%(qKGxU>O9S$S}^cOTht|)kOF0uB6ikB5x(dl`r=1q2o$^d24}!9uwlXkw1|(ijS)wOZjs1cP(09E`iz%)W{QN5~7JY&6isY z--o3Lh>>Z7C&OZ+e_+IfN*G*n4ANp0T>f?g#D|VFTdaJ;LR=K~GRrxLF+_FY`s-HV zp9~HP*&u#9hdOWK2bi0@1TA1c(4YT@ZpRM``9-P3!or05_ zdJZX#K!FJJ%JFitse()nsEf4sfZ~kF@7vlt6-=`AyW7v_g4Z%-wQFb4am6yf)>(3g z8+?wasHoQ(nxumiln(?0_qKkcJ-VX}R@~d#k0{k-n#fap|OY-M!B)rk21BZJZl{6**Q z&fZHZMGk2Dsw>C3+WDrcBEKVM|8B};lj=# zK#22@N0^IibBE}n41NnAyK`@A^FRQZYnA42?s?qIrAr17{1c&psSh~Mj?=|DWAcfc zI3Tg#JT_*TX)%0q$CF%~i(oX8CNVEQK0%fD#4#>NY{Rmx52LviFA1 zDq*nyCMEhF&3pBRF^%r@`pP+>gDtxT*wSso1yV4xj0r_Dg>%tozEVvQ@n^|2@|G^i z<)gt8uc_t3qhid`BjADp#2?viqV4BX3f`#_9(osjt@)#%(b(BS`Cv`uF3eenYLRxj z!&GZDR;DeS@zp9U_(pW1{)xU;(?#VaZgEoNr=OsG;56xVNHml{<4ZH3Pfl4Amks9(pm$BC^_dR0j{@S06%Oifd(B0tq!a~WmeoZr-b)UK zC2*B2OEcj4vTR+GUxP9#VOM6<-%BDKH& zcu1?>^;`>K?WB7HWJLLo`g|7?W|{2@NWG;;zc)gncOg^yWEIB`m;^Ob3NPKEfceWa zh9|a{mm1E&>mnI8u38g7SWnc4ZJSei6h&cGse9bb&SS0^s~BZR8R0m%SS(?CNR#6&wV~DAqcJT1t?~U6zZ-&NRXaHc1R;dDPz@Sl`_=?Lb5d> z&8ZYbO(=5%)}YdfX06GNjFWATpmOO6wZh@ND-r1P8gR93W?AtId5}B{E9H~Vh zR9o<9!|2Fy4?$W?DKb@syhAJKZAP5>?Ln$9xe%zfpo1DwwY|xPUQmMVV^&}(b_2dX z4y#(@XnzYxiw1@@XaJ#U)sK@)KW1(bEEUBPaETp3gIq~4Twy{@@t**CGXnYQt0 zKf}CMG0$(l{^qCjn>yJHaskb*>*rdBmXRi>`9|Zk6YAFLMV2Xu z)V0=`%i`1BN?v<f@kZAc%S}usG{odg$i&^>*qW6D*wk4B0C)dS~qT~sL3m*Ae zZn$M}$L##1LL~$UMX#`T@%o4VP!sPJOg_hviDhTJm&+2hKxXow9A)Cig?f zT0R=_LDpq>P6yT+Rs(D(&p={>AjgQ4YU^hJJqf84qo@=0^d3aYjv9pIFti;^t#U|l zwJEb9aQWfIAE0f->AqC?mU3Gj{u+`>d6&NFGYvD_)__Q0r%D_@B<59mV!B61yodej zu5%cfwlrA2Uh1vD6|PAqKZ0Zh#<>T?C0{gi8a{U6p^m{&OmR3iSTTmHemIZ8_^M(+ zEN)}gzXg(1Tv3WDlzd)L+90x<_Og+}q}1R@z)glYAt|+K%G2``bLK_-O}%EQx52n} z(2nhQo_G~Zj;*p+xlv|qNlWGB@VBtS$eurVqwoOO`I`{}3MnTK@+5g#1&6Q&^>5vP zB5Q60(>c-0VU=f)RemCh3%B84(`PI|<{0A)lIj-3k5>doZ}&~jKUy--cL!{#sKCrm zSvRTgjA0AoNbd6WD2VL*zHG=3~V(A@kAZqbAYHfG;(M1a%N=`)f~yT{Kt8*9bt$#P^9xGSH4AE>9%jJ5Qr7NhA^OtJkZ2Nwh?zFLP{g?p9z5crpc;oBF#jVnuQRgW zGMCX>#7-D$;Ln(|@Qa3pPE8MJzTu*uRhamdD?@VUNu?;O)L}0e#!8d>H-n=v`Akoz z}J>NGo5Ll4$Qrz9RInXs5xn91)?uGq?wlQAD= zU+}|I?(JU3P-l}`t4wrn2>gv#iQjDSjayepgQ^@o?RfI+B75r0V@w6iZB?sh%Jt?@ z%_V>Fl+XO!luYQPeCc2{8zPNaGC4iIOJ^&Z1%^!w(JuZQkLhSvUM5FG#GypwNWx1S z{x>}_6pZ>vSw5qzna}P!F&w2VZe11pHva;?Rc4Zb*W%2ca|W(YK8859j2+QnnW`6J zhe(6jjg&X5Wx?3_SV##-X(qKD$=mPHX6&l|5LlSbu_)BIpFGYRNYj@^1vYmA#aiYr zx@3XtkUr<6rj|i*0>4hSh*Y_1^|(J@QT-DkU2dLJ^lOcsXqjYk!`IrXaGQt!=YA_0 zW_WaZf%{UbvW2`Uo+g2RD>|)f+Qb?KZ(j=A9NYdKsN3*vFvlLCf^HD%m^oADtif3` z`0C^4_d;(!#LWEll2!ilvvK=+>EY1p)%G-V`g*yQ`?gox>-BW{a@lp)>(}&YZ{u<{ zlReXRwdeO`(35RE$+-4lN~Xh>9FvRx?dkZQ9y}>(*jEK+o?5!cp!T^{O7(6allnVL z<>&0}>8hH0%=Qi#Qm$V!_=o~{Ct3X=;L;!Q_d(Ak@`*OS%_$it_^b(TnNip9P`|ZQ zl3w@$8cD$KB`3wg0K>}_HG+WU;E+q!(j3N%j1DvMejF$5tVA<;UZgW#@Qle&hSS%) zMV=@mxcO@amMnRJQ)Kb`LT0SY=XjKW_FsAIQ9cwSS|>k1&6H~bT1&L0S~k2#TW^ie zB$A18K`@67_i~t)0r!gRu|(;O%m|6uT2oVDMpuc2e=;I+kcN=ouoMQ6EHNfA;lf9N zhYmN-#e@q7@~xCgDZ+_aa<^)tp-gORy?fpZR7bxHRj?Y+XIH+ka*}@GZMEHQUdird zomFG4>G1eOSf~jyN4XnO`i=Y17cZGyH`PzKPSrkkU_9R-B>BDrvQ)mprTQ%>s$QCER=$mf>ED1wNiO z{>RG;r}iq&a{+Q(#XpeBDP+`z;o_z9=&%rQW|N(JaN!|#Yfd00ipWUZrcrei($iH^0KI3zCd3HF2Y?Q;Np{l59cIEoBuu2(xG`9ly{Pdh&z^THy=m z2*#M_`*0r5(^O5jQ531nk2w4=sgPe*-_Hy0Ye0l+_(U16#&C3D_UFhhgDB0u+G8x-hUY}MP zFQ&@$SXe&gsrL-tPmdtr)8N@1#YGM<(TDw~30vaB+DMjd@8p>cRvTrIewbZ|(4efa zq&mGtjeGsQ4jOHFQ_e#)*_#40rjP@7VSCS0 znfa(i(dlc@(u8JI&98E#6UQZz@$Urzh>es1F!&*Ou%5y!V*O)>+fUs00Nf#f0KKz?~OAL}CZH~yJqvfQT zax2f05C*oWtpU_;B~|P+0=xt8Jtc8g-ur8&B*xq3AWFs+tXkRCfsaX@h9OcE<+e?W z*a=fsD!fv|t!Lg_$$QG^{9hIK5PWtWuS_j{QE%jd_zKH8P}`MSwbHD%x(~)J&KjJf z{+ry9)@rc z4c2qklc6zto^tJ3!5wD}RO!LhwJ282z-Bj)VKlCPDUW!C36hX@#>%2v`K!VH0)_@0 zja)KVr)-AW4vLtda5T<J91;JBw|p_F8qYf2eG5T~y?eBCD8}(AvXR-$OGW zTnDt>+}mskV$HXp6+Yp1j<2-6>HpZ@^selp3|=8+Yj$J%K1R_1^hTK=(2g`3A=yKP z1hI)5`lC%JGUa|8qt~80G#tDQq0YFf_0sz+AH1q;yEdf@W)e2-BB*-eK11elQtl1rLhVaZmH{;*n&_i4=b|>Nh#3@;Ki0cU3-co zxc(C80+C=&0s-6HKMk}8)ll}4Y$=5 zOhilOaH@A-?Yd=d{&e+{Ze@6jiHtIulX9ja&oPL5Ox#2QWJ+=dpV2TCAmf$}ak-}u zwjg;C?r-%hMTMxWARzog{LntKZvuG&b3mGC<$6j0`upSgp^9YDu_jz_pP|!z-a(u} zTL=sIk@hczOo-ks4)MNIm?}RjIooU@`uNK55lYQ>Xc(mn!S^^M{wooQO<)Lv|Ks-4 zjpZiHQ}i(A%NkIsj-820wnx@`=n&|&<@=`%|DoWJ4)F20V#MNgE~pW$TJ`n#;-UF` z!tuW-d#4~x;;%`#ZQHiHr)?Y4wrv|v+s3qQ+qP}n*0j5K-i_Fec>l5c;i@X?qHgLJ zS$R&Lleu{Z$W{J4z7%j7YGxbgAW#wp^;^fwU4Ti8q-kX*2Tx6``C=0E>#Kwcj7enU z6&t#IkZX54sL_mVG1V0_VF2;zOh@!w0aIKkmowJT^yOK&G+uW~^L$6n@d`Ej{t5m1 z^-Z$?;m8^4DLEzL{ivX=;E90%QH;%0nS}tsktwK1ecihx*n~k1b9xs^6(9v72o6n= zEZZkblP!Rj0XA_9YfW1U7#BrC>dZJrJlIh37p5T9@l!n(7>4ePirU(mzjIj4Vdq5m zjEtDTjmFPm>iEiHr%VeXl^ZH+5>wkz4D*TuXs5n!O|0>Ug(L|kzWXDD*bfK~7dmo( zIMc~AJ@F&U!jM&NbgG)v^Rp(2Ue+J6DjJdmtdPAK<~zds@<%qYa6C0qHn1nEt{T0h zqi7l<@#Ur4muZN;)BLS>hKoaRT*oN4S7d~|X4aOJ1X-jdr7m^$M?fmw_l>LWH66qS zq_GZyD8JExfp@vcRaQ0o#4VbDc$8|lfxF3af}S_)?E+uTe(cDuTS=73|DqIvzm zDVm+%AfhXv9pHQVFkQ|Shw9QV2*sQ0?-=Z(6}loze8bkrf85$!mAyewoIpTLgyQa{ zAvSub`9}&su8B@wpWqq+;RB_|zOuyCYgfhOb*r?DlKo;{e&S}a(1 zZyx3Sjh_k9)=6Y0CzgK+#?R@s2ce!mxa8aqE<{H!OCgOlQkZx?-QZf+$cbzMpx{Qc zh%-rZ36WAJvk3}$ZCI*kZbh{ONJ?bbdX&TuFT2jygcj)5pk;ULL=mu^dGlr_8alr~ zEjI0cYs^^Ls3Qj%4Re9xMCXdOF1cGDmkt>sclhXTrf{YxJblquMI68xQ)?eCPHY%*m^@qhzS8zhjjuwwaR%xR1+bRA3FoLXEXAqn zed-JD%e)<+?Mla|3ao(o9$Ef9xZd%NJ$&dG+!%#M6o1?nW~HGnEp#&jpb{hAuGiCo z!yO=bv?U+Zwjsvk(tLljTbxTqeW`(c6L0)ObKR$nQ;?B*v&HLt9=h_BnYIW}L_F&@N-rnWn<#AnDQDo5Bl9sl! zw$3uoJbxbOv#}j^a|P$hY`A@-SFZ%lnxoyF-47g zt}bAasdsm2+tOsAC4lDRqdsws?FwnzsMgAnd^(`0S(am_$D z&d5pi;7)X<63EQ?5ZtMtz-KXjAvV9aRm|m%sy3ZE=(=@j!JN6*CcAh@=e`!k-6-!7 zg~$Sbp;>G!0Z6c--v8iX?*xxGQ@o&UcUFmm{b~LU#O=!4P*+7vmaja{h&JgZEYI~^ zG*(eTSyZU303!{MTTEb+jrSUiPFI={xM!ekte@a=+?M+8N0ZJBHJ^Zl+k2 z0(C}At(B(=zlx@F`PjKpy|%yD4eWG|h}w&vjAoDeXE8P`wSHV=R%=Ci4V**btJ5i>u%JCQ`0?JP z<3P%U)LcnFH$$OV_%`{5R5XhbO*WJQ35S^+*Je+4e}+C_9Z;K;AY>L)P87r-Ayk5> z5TjxGiLCNR0`!271)ri>7ggm_BD$J=X2_#GiU5?3ehlue&K|kyYgBtO;h5V=zY|V4 z7_{KvGAGhUqyAKUjgq3LCE}@43xDZufT(&Ti;Zu*HJR>Uzw!5+{_*TFT2w@6y{Qm( zX=blrRH4r=jLRQ-{IFaJH=SlXzG|c%*@z{nit%$@tSh=~wa1*icTUGdKYQ&}eY>}oy zJ_0{iz=WzOGV0?+=v!g8J!h3sm1|d;f=jWDcay@6@2HY7hfid{zRl$TMdjzLRU4cy z>+kAlCY`pQFYK`jUDp=A_CrnYkOS?d5(D`6@7rZY;UvBAiWd4r5#C3^=68@ty9hl; zn40P#6ZhyaAJ=K=i@6_qw@aWTT{sMkPS7gE)eqm4Y{=e!pbrgNDt zy0aOgi*JZ5n3^{!)w}5lJ(_e^pQ@;uX&;zVro&aP2);R*)kG=SQv@89GWmICFQ=Ky zSxekMV}3v0W6OmDOPgMe{zq&ShpB$5P2)gO{Z59#FeHK^J?f@?NTP{qI zk8vrB`1(qB3d7Nm=uE4Be$mw&NK|6jm`i7tB$EHvHI??YLHXm{*-Yp&;OZci*L=ys z-hq(~Z`zO(Hq2v`XDaJrtLF?*gOaop*MUEIg=`=$O#$;#9#y zMwItxpuMTQ(@*M?bEj($kp0h`wDrVsxU*@&XkKWTKwA28b8LQOVq}+Av#LCBu0DEgc`29ZU+^0 zDOu;~0DPm=u72HO^g;vFb>a#i@;Ru|rUnpG4)bk3ba~hf;Jh6Zbe{AWn#Nl6rI88S za4AmB){x#pEUhYw20=XBo?NqImTrHsjKsmJFzt*re|xJE%IlpMR(F-2>SliTVNL zE64?#s4G4b;HK)eO)bFF**Jjio4zA``^=9MgDAKK-t&!LG+fg~OJ89`1q@UeQ9^U* z5$#xJjE2aoxM#zjU&*??%)G{j!fqV}dC$Vm$I>^X1GjWDuT;2X5>OElc@T64nSf7a*kLKgvRy2bhKKtlGY3JGKXq#fkUCuj8Y6EQ@?AD3y4$suYTqXc zor`((QD(4P$h^xLh)m&KDI-G&uA>gD=Yp}96_!2iP{B6(ge+APM4$hFf9E}|x+DcOHVxX9SXa)YV$ftvSObh|LDW38zcYl| zz~)#4P+j?amM^05Jp6?x#g~DInApP(np7$8hZesAWfLrps7Ei37-Oyyz zY#$GLbhPw9{M0<4Sl6!7z+v^T+Ipct$lPK^Am0EAK@S@`N%5|NayPZqD_0>pp; zhHFsAkC}gvt*)l)|DwFT(C}mscr)1l(9z2=)di6O)Jp989s&-{zA7c@i)6mjLok}} zMbpWXdW1@=(IQ{T=J5#)FMH^u(%Z_q(#CryhtuID+djrIZLCp3pa(&C)9Euw9Se9z zqgy?h2|E$6ye`B=i&-iZPgKdgHz$1n>cN#)c867%(VFwn4 zSbBn!0}F0YJib%u1#G)?EI5LkY>bu65(SdKfR3Zxq!02%i5Z(f&IJ6o5>chC3zh9% z`Xmm~gWHsbB?n#p&f$v9!wEDU!=nD;c8`$w?S-?`>iX`!wyNe(9-P;)hp%f4z((D( zjWd9aU873sANw^vF=|KB7ctRN--%YW)HY0Wki_WPoGmjD@J5c08YrK-!G@64V{}=o z*Xzg#6tApa=f*|W`==S|BZ4={n4wqSen0i$QQu?RT?s{n{yRDGgHoq1YAgtRovrkpP zHPCbm{_(Mur1A*f899;B#kyr`Kdz8l;g)n&hX@VU1mWYx7NDj{m6=`re+hq#Vs3OC<4Y;0>x~jWC-L zn$nDq9wTLVru-?Ln=mUB>jh0~=)}USm$d_T%n!2!%G$#tmaMS{#I|h~b`2Fu%W3uX z`ZuT54%MRzGWja4lg-LS$z3G7m&URIkpnqemoYfTH2CFzV3ji1n_UNIs>$|Hzc|Rt zi>3F+X54V8>9W%B|-MV$I~^Xs5pn{I}SiYA3s@6+p zW4NU1^01k-ws&s@4AV!fXyi_=<(2>2Oi->*SuA(sijk(&+98f$ZB2@btZ-ydMre*n z)a~dJ#Z+Y>%z|LgkmY$7|Du|zTTB~g3Zqv~2w929CfYA1Mgyyyf1u9m0HxXG9JJit z73DzaOFXadpKW->z*k(BIjnYGFBh~9;A&?H8_JNdbZ~_LJSSGleG-U0#;T~p4F78Q zu4p$qN52qDZB7oHe@I)IH{sK^iCZ}!prTZeYAG%D6kAPtZpKNNWkW zyMLHZaf_IzK(+Q_zKA*0f$cIuNWw<5M2(Uauk=>3S8vEV!+b$Y?aAGTsj zx#}^^7rK@RP_9_mvRObT29)f&h2{ct2$LDenHg*ckak|ss-C>)Ud>9a=8>>!Rqi#z zi)$0e5mqiUA?WQ|@T{eqa<=z`DZJ$QQ=)nYwB4p4&!ONB@sTNk2?0jOIU5u^i&|$w z)b%Rwd!IsQPKH6>>p1~KBgA!IZl;ZJp!slfy(Ae1aK-V9p2(z;9(8imFM&%@Wve)< zBMmx^%9t)>uXpG`al+(oW{|U+KTgpTBHb_@ozJvyZJjW+Vm%5ogVqCyd9RqE(@9!h z1WHp_be&R*r>8PjW0xge1O93%xFcyDpO1IhkKGYj=lhggB7}dtCg>Zu?kyNGDdD?(xS=VAPQ6&6*kz@+FQQy|o2fw&osk}*FwXGRQ7$GXBYwU* zL+>N*a;~$h26&tOrYXXD20-841i_QkkI6!3DWFjP99ej%mFUh5GZlCJo-(v(qbRX5 zBwp$|ratl4XWLcVm79hq#IpUW28F?!&PXW2BZd9b4A&8F zTVuQLOM#g^nQot7KzIZpOowKz84cS~QzsZMPFcYvSG$8pq3Jh)>v(O<1 z;4xoP`{Iku!6rz$RaEO9u2E{`y?0(^d6emKtr4wJg81XTd+&JjD6oTKgF3aeU-q7@a&ml+?tn4ldM3gLB4x}wEX+(Ne(c)j zPDl2UxI82rry2)c=$)m~P$Ts5f~T<%U=#4-vM8%6*e0GmGx49>!(7-6Yi%$2b?J1Gqt~&*-U>yA|NHkZ#k;U4gjv|eu*dr zT&j0|P#}T!#c@VPX%+ZZA-$U*LnbB_PHc{^dWfA8!;;~bF(LvNC(4%@U&{!o ze}KaNRZ<+sKsopbta;~;oC~0Bgks;l^8j}`Kvy>*J>t{!C%gE-<0t{%Cq`O<2sM$R z@g-m|+&q(dIHsX6LS-pe<9!gE09(caNGDK{s@+0M`(Z{b=jYWl3uk{q7&#=htb$1~ zG^kvgH2+n20Q)CnLPgOUpdYcVEKboxS~1W%xKoAwScZ2bOKU{&6vU6Dwc_i z6irB3Yr29`URxs%&#v|i8rMBk3ZH{@2#O}~eZYfaM}k7d;biOv{Hej!-hb_*$ntoT zu!0CWbAzS>7Fhk1fUpQ&Ye?8nVfi7u2TX-iqv?i0lZeG7hK@35pGrVH_$8rVGe)_? zmui&sij}I>Xn}L5K@(nwQt`-4d3@neUXkONkRH9o-qi=CO#y*7tes0#6#%A_Ced`1;Vl*9!h)YVm}%gX%t3IWlhx${c#h^G%Hb}gNTCjB1@z^a3 zrrOt3^1wHek(#yZ{*Or9p{F6t$w6_ie z{tYXFF90lTD$#QwSSdW3LVknD1x(SUm-FDoP=3w78F0V(fxA{p_^B`zX014#WUXV$ z?eTZRK|cvltPyj@1-K26}?7!r_1r9Vzm-X-nTyZ3( zNd7d!yUFV1};EN;@I%=MfInpzX~Cc22hJT@k+q#T&Qz zfV=27&RRORN3P=MZwwo!KMQXrJ$P#SHZ5}qZV&i2njJcWTR#GQ70kC$y;!Y*#tOy5 zS^%2HD_mEs-1r;Z{8@{Ke-$rHySCN$u3O|cJ3X|gb^Gu^+a7evbzXYqY9Uq^A1iU8 ztXvd}SvtC~WQn&ZgU(yO(MLKS%?D6Iy-bE@J8}Bj`QFJfbAGrQgCW-vy1fEq2OKhg z-pyFOB61Du=^YgyR(C^5`+Vx%g-~`xbOBH@GIrwn;;FrHeK0AWK&Fc7+*JDK2?rRn zsT=7SmyO_AgG%+~p?fqKbXREK_u#C*>r1>~*rilrp1hExs~b^h_6GkbK28V!xU>Xm zDj_^Op87lHPtrvFK=v~Qgq2vSG$*oRQ2m8?qb|}3H*q8x#Jg(gUN{_=g9O)>D+TZ# z-MdsAuRw=6Ly~sN6QNuJ8R?GB-1o?nK-;Qsvnzl{UFfzWDvo`zARhx^6COh&!MnWD zCmH@C8njQ3-UP+}_b3L+?8(_W#`4|^!>%~5#w4NX0;8#p!etv@fb&PX+6@Bd?+&do z5g!ox6DrdsrO^_oxq7s?Wg9C6764`T@%wto&0`mJRjWBiyCG-2CMUfzN83VQ34Kb1 zaYJmfa=B%Y>~?m`w>qO4<8SKglxBE>(p9pMmespU3_%rG6F6VPcA*NK#u@)yE^0cK zyL9HpX~2Nk@ev0|zB>{w)V|Fwd?%R*a*{TMk#c&eh-Sfxtpw9NpzD4W`=ExuER z(G_Lq%55@rBuJtq6Qz>Uuxfhc`b#{2aUjTkFF@b^!PV=rT5a}-u>Jl+Myz*i?y-0m zr5V6~t&?6521XLcE8vUfEJk!JvKY-1Xy;m2TzEgvhR?Rc5Et$A24L^aS9ht^-mLY; zN&U3I_a%4s7A?l<5VN)cd!>i+X5jr2R<38@SNN5P9a55UbwRu&E*p5-Kv$h8Q3%Da zxpjRwhB07kkM*z<*z$8b7>394rESO?=|MH`?rTomu&xoqTsxRc7SoqhHGWX z?a;IuZo#V86|?xqF`&Nmyym-l``XIp&oK?A(pbgk{@_>WglYZfdSsz9f)&se76(QA z=UVp~EVat_UVZ(#4UR|m>KFs8&uKf_FwxLhZ}oxoGeek#Oi(tv?UU}hMu_E?UK%5; z``t1%ROxR!WxzRAalSxyE!Hb!sZQfe5caB2pfVgLlxv1BC!hp?K%m*Ox;pCM$(}f% zaKdZ`A=r=F$(t(<&Sat5C7kq>We?8=?>2HbDQRgdb6$+0)*pd+7*iajWuuR7Q{0Oj z8?Bc-MIs-ZPakE*st&~;)s6_{(AwWDQYtNVN4%6?a0G@j*YL8!XOBZW`? zeoRzBh1oq?1Td?YoXYaD;6Mk{Mhm+NFR%tWqMx1NO-nsY?D%9;A|8fnu2pH z^s9Q27PVGu4Z27E3}=yUk^mEV^}DpexKeIq=IQDYei@bH7W=nrgV|i|E8i(hM}si@ zBA;l6`uVzgg|?}(aG;@7i;$9TL%ftjn0|F8ge|S?ZvY+!my|uM`Mdm_O)8hpA51RJ zJ7emcNL7TeVF(3?HCMDM_q!b&ByZ-Jzz=%|FsLaxH|AIFG`Os7E1PSR9>{y^#%&ur ze2H`DrczU8U5R^^dD}p#Mwwpb5Pp;LuhNDBrsf(&yly>~Zt1;*6)$imK3K7g>_M&h*xBVFf&3;ACXp%;pfC`|7< zbIcC;x&I}d%kT*oH2AZNOX#biV9)tTP!uU z&Y2orX@$324r>u&+ux+yZ2Dt0r^lW-*t4(TI#F1~LI~}FJ~2#F8nOcU(hu~DQ0f)& zS;xXs9$av>dcgRKL5Wb(gW{GhdV+u|lNvFVBbO94;DBn@0|-+)UVo(eX#Q+^id17s z(a64#@+_)1wIl1uq}q^x>V;h5e935ML)1pJ;G!rwaFN4EONOJ!1v4IcwM)DuwE}kQ z1WzND9w)#~9lm6W zh~XU>i(d@$Bs5k2hDo^r%Lr-pEw*G7;s+MZ1a^93B1GBI5}d|O7m>n8>&)YoYhnGi z9iLjkbFv;A!V%6Y*%>QdC%KVRdjd6%2+cO8a8lDef`+)i5eD*9vaRj*#6dC}C78Ax z%j7b6n(sXIgr#Gw75*IZxiSEBAxf$YUL-A;&Eppw>iOEU>>VqBlGC2njOt zePU%`HImu|td(UasYo~Sh}t3&ue_pCJ+kMz=!v;f&f$_38>Ofma1DSOCb}sPFsV&B zZzb}rm{k$z-7++^HR+DsjJdDE9rmK-i;VUZP0v_}ji_wqgq)c*oQqgGHW8QJNzT?QncKA6q#r{iZ@p@?-ET7j(-_oj+_1M+A36+{n zekdjDJ=S8hCCq|^^$CWiUHD`UxXngFR^|!&t3phH9(@`;qCS{;IqV)eRCi!TI+LJ< z)r-`obex2F%^WRG-J`AB0o};~A9%HcDZ0t7JP3_Bcy7T-NDq*B9KU`Q9ksKMcS$62 z$VC3Tm51q~vvU2k%^B-CX9wvRRX@s&8M3FAZ0?y8K0ZIBWr7j!+FLZv1Dk*7DjyU5 z8ak;;+#5kR$Rc-H%Mk|`ImMo!=`^L(-1wMTh0)PBahCsH?v6s3d4{M1n4@sSyJzSMT;v?S;LSdMiet^+tUZ44HN$EJ31zbRUeN8jgTg@>qCIU<7=H=X9=3X6 z@lId=d-=bxlkw#hK{n%ld-e~emjDWMUn7fe*oN%WIzYEk`CEWp@8a_&vvqsWnz`K^ z!ISRF<$MD8bsPRu9iS$8_TiIln=1@ zp5^uR@apraK4UF6N78LeLx7xze}l47J1G(WZ!u=@~_bS8E2SSY>EDNe;usR5h9DTMAwj5MR``v?l0#agW1CI& zmT^fwJTFsYK!0RDMuj4yY=_c_=OKhzNe>qROQEbsM`hcd;8VXuv;r>Od{iu=Xcj8& z(kxNXVtAP)`XHpjgCGHLaaZLGLPQ%Ov*cnB^Rkx3=^P&E+%*uHp=}8ewkSg*5F4q5 z{*&R4QlXmetVZUM_naJHbzc`nY&1QVwahALGHTY>^c>1NZC~!{>FL*_SBtM!=o+k( zbvvHD`&(#qey#>NX;L?#P)Vh@mzJTt=^jEu${z&-btrgT^PVZ z5N%dCo+hq7hbz$cY{AP3TBN0j^Qk2rlq=|@EFmi=^YUSi*k^_6|kvqeQ$z1wT)bfwdPA5XEb3(fJELyBsWarfn zpN2jfI7Mi)sUoshD`_7|vrPZFjTUPb;%Lz3xCL+2p8G3cl*PNIePd1U(TStN9HvD$ z!}5FBsYNj>yWdqT*FhPXY@L@!gMtiO%Pux1E;UuyvT;QErp(2#mVGAwEYz^E#kYw7 zehb*FYU0^>P2nppB3CgNUq~{%)2XWeuEO2@mp6%cS4*_)5cR^yFk_SblJX|qFkn~SYdyiRMC zW0W2hlVI79F%Huz9=F+RcJSus)z4sK^HzWDu4w}Z1NL=2K%fXXHQpH4D|w-rU3`MT zN(vreBwuv{twjx;G85`F{;2+A{VN)@(>bA;>0T$UeSh*u@7ObAOIH@Mh(s~TCA{Am zfA%Ydmyhv2scyL;i0*Qu2lw6W$_)kg(C!cOK-3l3th#5;iRWyTN)>vOPAiXXKi>$` zmfkr)V1L~YexCMEe45FnsG|Im>8KL{d#{(l4D|GqJ{w{>uJF=aGyviwI3of-A@ zE$u8_^!5MILsO-GyGPwAuUzY!=Hy4XK4app(TuZvEyw#A`!ef^-DRgA1HLG;KZ%^h_II<+>v{DuCr#} zu*d{aO(iTkviJj0?|=3-7%gO~j~dQ(DjWnZwR0VzQ(21aLgFoW>20J}Oi5xr=Ql;)DVi*#6z z{BoUnA`Eu=*-v^5fpMV0dUFuVz|q|=)5ovK^}PZQ!vNofI?G{M_FR52>Q2BG6&FBuS$aunpD za04BtUhvKuxs6sn<9bK^`j20GW-%E&Jv~UKG z_&>S;aC1`5^2S;DOtTOeU}qci<&3dVa>_Fuk&+v#i2H8whpIBMpBLX=pRIcrr7Ig> zgF!T+75wqr$4B4zC4SFA(mzrds41w;CPzhi$e-A!&dmjZ39Fvz!z%Z@q}xgNmjnS4 z6p}g2iLi+$fv$h0lFg;>G|Tr?ji68f9Z1o|bjmDbCR1r8{2gg<3bW%`l+i;v8Df1t z!^scf(2vJ}Jz^sa;S3|0N6b zx+O}As6B#_1IA=3gGy_f2Y@{xP2$H>_nCiR93=Dcw5@*psWNnwUL~7ErzQtHQZ>dQ z)1pDaC>4thSYp&`RY(5Q1t4WebE#n#%hiI8oB=rb6^)3r_l+tQXN36GYL)R;mV-KU zu~|+M_I-JU_iy=su>ReLaTvHWzi#q zH_1cN^f+5tbDaxX0zlTH%uE2cCbFT2d=D2Uym*8_F)xGT?wG5n58p=@7bdLOIdS8| z=v>`c+3=KuQOLaA6qJR8V=sgA>%fKvv<8Fx7$C=x#Q%hW;WMQ$LQ0?k&|K4g68=-< zvlM#i4g-?}0j30EZWszBhWSjCp{M}q0p%Lja1-tFy2bU)&C4uvPia6B8<#*gS^b`% zY%heSQ-1gXwezmIN<%8+mNLUON4ms|tZJi&xap8*=`T!A7?P<1GRDI?72X8H`tQiK zh%+-RUz?38(8y0;A7)|7J38qJEM6eJrIX)zRA7)bm?~BGA%eSBWQmi_T2?l_U|2m6 zsD9Xf@Jj~pKHiT0WMBZ;J}uFL>vc%z#&siLiz^;1jLX0vUP;MAq};fRbA0lZFNA>= z&B78<@_A*OGPvhpXJV&$jr>!aG+-kd@K6gUj_b&Al2vB!40G(Lx$4!#h$Oo2oa)U> zSbwXaKB~C&^uKoj-~1;6%#YV{1eVFX31dv)d+8}WYGtm#mSX^hcCIuTu2yiLWqEyz4W8Fq&12T`37 zh;-xvw9+Z@sgo2!emrgxN?BzB0-ZW1M_WO$JJUA8wAEK2usICyZX|)e1Q_k7BD$B@5VH6+#+ zC-dmnvnxN*-*IKX+^l3Gy^=P$7CWGKnuPgeU`ShRpPYv_97aK|vA}xV-Y}cn5m~vB z88BY1x;WxVro8D*JJ7sFyF1yxx#K_%Yp&6VG#G$xz1tGNYga5S3<<6((p+s>@XBD` z+Nq9QtJW@9nH9sUf|jx@0zvT%1py5eXQO-!$RgU+1aPcXa&89hNF%2@r1jG9!su{jSf8*W-CL zwGTiCbxAyJ16IYV>@9vCyrN8nWR}Q~VPuF~vf{oM2C4V8P^)+<-HTiE5J4wSP_Yn_ z-N>v|7vvX$Sf+;8(nj=I;9zr5n85+k98 zNxPXyt`i4#4jx$X0_vaMJZ3^wG=ksz*kJ(4B(J1J350WE?q}^lD!eP;I;2z|%oKxB z|Af2HU9X8NB&42$Ok33M)D|#Efk?t%)_*ykEliTrjgo>IX_5&%akxT3QLS$rNtF!V zW>Xv~1R2jb#(o<3R1lhi{VuA!JMF$)Ne$mUnS-RXlM3ZTy_Ze)fUsd3=-u4XOc?;E z6~7flT!zi|6l@{wcSokI@FgIYRy1lb;e^6t*-EAlRJm(Vy|a-~)_mm@&(!4Z2k)hE zp+7vc;HuAoBvbxN4=mRDpAyJ2P-fch6gvTh-1%y2Ke;ye3nLoV|Y@N5YlN*C2l=W=(Mz8C& zK(+Ef$eD!&3}uXGAcYY!o2db+b6fXDm*OKc#+$7yA0^2s+p(aJD_~QZytLXM$t$tQ zZ>{IvI6QQ%M_V1{|6I9iACbwhkXEnkv;t$U z18W2)ho$>xUB_qDu1!Q&}c98T@!VfmxJ=5C`~ z1-{^Lk8fMJo+-b_z^HWvxq|7EI#?VcAQ9N-GZ(k46uXMad9!Oq` zA@*t}791oyr_%m{vLOIGx1RK1hRNd~fhP!A!)zq@!|h`^?n0aftnH)fDnl)EaAGm` zFyc>Z85k&lq-Gm#soRvyF^c1k=fMp=Huf1>q*mbvWqA!nURK#zbQ@|F zh5H$RvBF}Ymm|h+9(JT*;y4SK0fYYENV)1;_2H1MF@dQ5W&MD^UR}d?NspDSgUAFT ze8lDZ?eNR~@2R2i0eK7GFI$&{fg)5v9+ z%TX_r9!qB(%|XP(Lua#K%fAI3K2s^@eAnv7m6)96gw)V79o$<(XvoM65$TvAz2bx} z9(-I{NG~@W{{8~oM)w0bd#(x`yt%|S>wM=LcF&rdt^LAJU!ewQJf(f!RSqkxb`-yK ziqEYymB*oQ>KV2-ZVc%G;2q-rYD&O@w}CMlqRT`DU-)<_FpECBwt2EtE>Yn!8sH~t0WG#uE?(%Fb=fwsysRw-VG zRvN9!qt?Y$NZRkp?@QR1-$5VZj-SN{{)_!GqEZD6> zQDO?`^75{X204qPx9BWy!+(SWgNJhpbi-A0ifjUqeJ$k=Smah!mN;D3Zpu! z7c^|`KGSvk79LwFaS5H1oFaSk*St-vl2g-BE`^YIS>}KJ{4sIY#^qU{)cp=UiekJ0 zHjdI&cRjIydt3pU`{5<| zb9g2K{%aBe*!9i-4b#{NhCwngOvi(}z`JJjl?#MlK<>N-{+LoXt}B#R#Ayw*<_=}) zI}mc1Mp_lW$}_~dw z%(xqnQpff82sao2{NKB-+%;Gn5{N)R5C0ks|EIi%|D4zY{70|B+}_;D(&S%xwybUI zyxE5QU85hMNI^=iYB_q}&efbzp2S&ma$^!_%8}&A$3iBIVijp3HPOIu__MPOE*NN^ znD}Jp^=TjlR@bRP=a#G6$GA4@MDwZ9MhC6YfON%rr2L8n-e@vS+RqO`yL%h~fb&`5 z$M?NrdZi}8cnt(c)`m#1=rUOBQy}5eB)^+b2E)#k5T*;s9YQcBB@TbTJMg;uj-D=} zOrtesgG#G4Z2;mP7ap;}7e%yzNN&57Hksn1@b#!yF%mVJAyt2OHo&zb;nF9g)A%5X z#AI>tpJ0`AI)(n6`pk_fc-S)*Ub92H3JkS5!0aLipP>Q#?wx5Kn; zsdNQw)&S>2xgKng-?7*SILdL^9qbr3S40!ljhBBe&0Qut>Bj?@uCOk_?LhW0mT)dJ zc#j(A@A&;*q)~)6#Li}dAt0wBPdQQQEj!Om^1*5|0_#9$%cjJernuZJ?$th~M!+7| zf3E9CQPcAM;!0ZxWXCDIT)h0XVy=(VW|=`G8?3f{W!k`%YHr{?_*iq{w10|IYZofg zd2cX87zGC7Yt{&$KdKegAs<{`?}WVzv}}c8Fy$6f**tBZ=j`R|#qq&H49yGL|7g5_ zK9yOs7Dulp)Fb?Qs984F*IEcc{L)sO&G|E%Y9!-4lsX3!Q;gvNjyU&pQn$ns;M@Ag zuE8Sztj9x*Ppfv;*7Hu?&w@rqEGhBud4Jw9Unt5^38@gE7G9WzB=Ib)!b(jXix9V~ z27CW*p-&y_tc15Jqc~qw#L548U!)aTc<5W~k(qR0+l_`UCmq>Z3*fEzbMSiIqtwMe zzBw!vk#35u8uKqWdZ&wzf!)&3k1k^r<713*TG11j4z=8BN!;mkP+z`B24`(QrhJr` ziiR;(J}(9U;O4{m49tf07r@hn*RCc)%eyS9!>ge{dP|36UYZpf@Cf#ZRWu0RLGiXE zS(NlQ#{Lk*QVfWt;Z3g4ed!RIz}CzI;gq0&f<{84SBKt*OACRXnaicj;0~Fup+JX} z*7D~cV$}nqoh4^k1RrwFW03*d7bH_?lLp$!+phtn?FWxY=HtWKm!t$JkR_@fWink4 z!G3pSD?b)(`(VH5jmZ5?oHvk|wxIjh>_Y1K4doxGQ<{Wu!wGwTG{Mz&tGdr@-V;xM{nUN;CpATR z(TMv~>Yhuz%S?7lJ32xO6mxyxL=$yZWV{Iw6QYZlCo_hd(=yvvL@*i85Y5z^!D?^3r0%tB#Cm~bj0ud41zwg2%CvuqvX#3{B09y8)YY^Y}?lGw7cV^?xzc2 zF=02wPQODeFNwcRKB z3M#f;v2AC^wr$(C?NpMAor>*LPJP`s-RG)LkFkHiy4qvDYd-I@^jf^w2%Fzz6IYd=r~(gu{U zUB8i)FO5sTNpaKK_GPVAseg6-N{ba46%hWT- z)m|i&qCUJMtj3KfkgOGMN@4Q2W-HegU@U{@$0<^vN*=g(e{43c4A3yW1<-&b5=oon zL-Rkxg6|t`Vw0>6(j+%}_Vz=Rr@^8&Tqsc1l4~SDxaw_H%gnC|w&CDfyws@2(|Ch$ z^g4^2-#K7r$E;Wv(e&WH)NYXGs8J0AMB93(N>^L$u2F!*cAPIf_V{kSfsX<8O5@~uexv_18e1t-v((V9;%xfC zdI^eWd{N_*Yd(o{@m&FgVDCw`DIN!7)O;FoEe;tjS@}_wl zT~1IJpz)-y`-DA2&U`8QOs|=-M%L)IB7q5Oo46%-;L)98jM}E?JuU!?T?q8zv%Y&z z-<^=-z*Mx4r&8-}K%{VXh_-oH>7ki4_|<+ew9q-5^I!gAW`=A{u@5#1no9RHN==5l zKPuDgJHx)Ann;1v82-p12h2{OV>Cq8d}qC6F{%7*RFq+sGoZe_XSAMZ7@4+;Z=mEohODMJ0!RACpw{ zU_KbzQlS?t(LnkZYAIR^LY9w*I^A%ee`3OD5xx+52;bDhaY$}k<5w_1NA%%EQdr~i z;?~*=tOj1F&f9d>hg3Hbe`q;pq?75Hx?X_~)WgnuffUIXo1X!>o8)g6|Fn(|WiaWn zA&|_0JIC889xM=r3RB^O`8N>2q-*q z%Ss2-Xw-B5IidilQlM!4_pQkG)wr?tRO15L zH6<3(Av#MLX7jYa`mE8$MJBk!pd-^K2cku-*ZsCcc;94^zgK2g71zrCRQ>XSLGUfVvyV=t_;2JBS$iw0eeuZocSHC z`bAMSo&Flwnrdt#2JB+FaY%Me!*LI<<>8^!K&|PacJj@7?wpp--+94d{x6_+m^I9b zT8Ue02pTyy2=n*D1gZB(EYcDdK|sxXa!+!&6^IrvI7NQy=ajCb&2-b7JKKbcP7<6C zexAIzgU~go1fB{RbEw|1fQC-2iyd*3u04gxDEX_zbr+#DPAC*&vQI3d7^|^U#F{7x zIE0isxi9mpjMs&>aWO)U_t7fE!z@*qWsQAS#isMdO5jUR+iX^gLVQ<~d9fgRn>r9RI*}`(s7mZlfb0 z(7OcvfkP%w{&-V|{HY)Z%^1i5Pma2OsfCDdxj#HkGW>INoSvV@5l#vb|bn zL7>T%&e-s(S#BaTg}#@PzS0?nz5Ico@GB)G%IFW7M)2SmV}YgwB`+#Cay*;e-lR#~ zX_@`3$t$N=aiHUB7IH9%2?WnT?Z?5njl>b81uG@;o_7h4)n@Mc50-8+zBZifPkUrw z7PGaBW4Oct*Y7HLs70;K_UR`iTAnjwHw-rmGtF#Dm@m(vSK8QKN9nalmW9y{0++je zaSh1Qw!B+)`L=@jJmNFUm{9~P2?un{S6gWdtDNQYmYUaY?|SthynwT-U7_6sU2A7( zdr(1v1AuJV)&?1Q+$wIUVk)~KT>cj@Ey~=`*wd%mT;ul(vS@NAt8&eBRb*QyN-#LrGDQM;|0n}bg^Gz!{70}p<4Fb+e06G46=;d7mt)q zqmDC5lr=Tk)ZV`Zg;@0YNOP%JWs7%afGP#f^{c>ss1o?tt5hVF-6=J3QP$x*Z&HV2e@OgUK#$S)qFvG?(aSFv0n9UV7B|fR+It2Au#@JP+>sQ z{Lg;8WW?{m3 zT~+iUqzY&zKIrg!Q6zG*qgWy+kLx}>J?$petLW2?=n)W6*PAZzE{i}-R=pn1_j(S+ z{n&&3!A)a35b$0Tax8ozKD+t=(<0vsyH*-__ki%E8vG0)(})et?in7bZ(7>uoUb&~ z%S6qWv@{57OhQoDo~FGJ(gF~FDkto|5I4XZ=bq_dR8lEKis*A~P)qu$9gZY&r@(cR zH)z#Cw0xA=2h}D)vzGu)&GugdI0}5`{t>I3az%TuuXb&0JdW0(x5xZDo3EHKF0Ji8 z!UW)xa=Q`VKxsZxJ6OWqTFm*uLT!4%I0bq|dlH-^Px=QKp;(}^KxL8_10rj)m9=@? z>n#aE4oAR$5i+g0ESP?e#$Fl$vH0NC>&@GtU#~kjKfkr%>Cpx1Upczc|6!U(E`mX2 zZ8rSx!+x2wl;D&?>h;kckw%Ba=`KpKgTg7tPf2Y4#{qLv-)!73f7jO;B;CdsWZftY zgKA5BGun|;%z~{y0l}Pm+)9q7wzQkPaOv8bZ8l+$-n4M+oF}@>AV@f1Q*GDnK1jo?- z{q_X@L~fuL^$jdmjL)evu742oiQVHc_gvS18{McN0zF`~Qj&Q8W&zR=VU6Bp7z|>$ z5u@NwG+8x9{Gc;{eJB6756(96A)>fckh*RO7f9DOAejQD;$%3DMm=rj=igrg|Gl_8 zt8N8NgPS8i_Qb6jRoW`E2wuHOclD->UM~5;Fq-j0+<5WvO0wsK+T|deqluo`bLxy@ zP=_wjV}xvG-+!-s;y}*n{Z4)?Ld*rH;ysRYHse;!$Y;k?zadw?Wv6v(lh>=WVwp1= zxhYEJDXR&{HEBhpYMAZlO4X6;S8NQ95x;nxx}LQBP2g_W5X$oO_ISy3Ae-D6>5&a% zjmi7|mN{}eRX119%nT#Zy-F4Z>bSxB7PLkVitM9#?QFDfT&E8iVCyGu=Lq!; zaJL?gYz;9VYajA;XR50^S>2*FKl-a<+XzbMUi8m@JmW*;zv2K**m@KMw`+mpjyO%* zCtZkFVWjOz=|G*S!yBM+KsL=EW<)5JSnw?j!KTR-n?b{_KYY!eV`p*ak+!zZY~U!{ z&1}Jwn6HiBiD6oPSOpGlbrXK3kV$Fi)W{-Q7Y*m}{F+y}R{0v6NLx0l;g9(i;-+fO zBPbq#i&vO4ViX)&yMB*5M2#7=$`DWTG8pPH=@z(7uq9O)&%)s`)x&=VtKCDQmXPV0 z9^yAab*P5*aW^ef!?1>1%n$cdK#ltoa}kHA_+o6tXHHWjm!!u1?Ci%BB_Gx(3GcFPRjWfr$p*6Ms%ZK4Afc`|SV3!x}B3;?(X);0ubtOMb9*v{>G0$3G3g zwVgpPlUy9dF}Xrah+zJVRU4RF>n3xXfHKR7UlJp87`JLB*TR-sNw2z#Pf+BW-8m%V zoxzt1ErEf5MZ}1!>8+4;^g6N?Xtw%GC1h>mEP}%-r0iK}`cnbu6$aRHdWv5C-?{BA zhKn1nhiM&EGF8-s7{Gbc9Nb9TLbCu`G3j_~P$hgHJlffM(#hgMk=_{6E)Fsj5LNwH z$LAx@x=?~>r#c>zG#;?9^+H%VL-Lt-BB$sM&0D<0(Ho>+1cgbX_`jy;vhIWsrTQTc zKLrjgpPzHEq{m<4|0Yc@6#P~LRr@3LVh*$aE39N)xahW@ zd1DYGxiUx%!|_|ZCGY{^L>W}{=DP7FP$d%c^8M&;2uy%_yLn;m_Uc;0@KnuW3?`WE zG{vA)uFCuZoQRE@FKK?Pktc@7JNSVN*&ov6ihDqH4{+5K8%@|R<<*MJ0ih*#5cEnZ z_W)T^tpNQ?5L`itZR=MPTaXCAfAGMN3xpeek|cLtS~_k87SS2eMd`V!gIA93Hiv21 zXxztHJGH~|n1~qri+{o$mqrXqQ5Od7jFRz>&CsPei^$CO4SugwbKqHWZN{XqH@D%* zn-04mEM{*fdX=Il4%WKM4LuCQIQgMtjKdKj*nYxGp4r8L#&$bP-3-G*k7;FM!!R?_6-T@hcbCU<+dfd-dkw5 zF1>Z}9YP`v$_Wi1Uogzy8O6gvcym0wY_&~WEEK;C{RO5F=JX)JR~6daIPXegMqN8q z(0T+r6_(WS_@ubj-w_3nGHY3rI>8-_7eg0IkJGK*qd;!>i|6Gdqg()%hg!mAMy3(( z-gc%5V?kzex$bP02myPf+?GqDD>oB^5Y4^jjeS^}65re|#97U&3;ku(aRecBzTX#I z+>6e4^i>A&+TAGzjgVR|`Rm^HuXo6I)&z-ynFIs|nIKAw25kU_O^qR7jd}JZGe(4U^(29A!2G=*Mzc2h} zo}2nS*#d}1cOh{eXDZ*Sa*SMrPs7f6$97jvQ(9s1|KrGHL z>KjZMqg-kdQLzKANT_<6ifFS@eN>Q;eGw2JOtXq<#^0^-RA=oyMUcidwc35*Mferd zsO<;!@pnpr2CNAnMb`|h-cb~SWt2a#3g~&jL(a=g5FRG@zM0&9ByR33@N_y zv#AH5hI%h59)e1_rYAw zF4rILjE3`k{*KahR#9ntfTA(xhAxzeu(BLK!wQ7x^Hr}uhz3@lJZ4N#HU`NT?GPR2 z=P%pbtELra!VBHbAbT{EwtIY()If>MKO?o9t}}z$Au+D!yV$ge)qt8u*geJ^?}PyS zRAw>#4YtZPi9ZO=5FzsV$pr}Y(3tcN>-7JA+E+inZ6SXK*{u9}L$B^33l{t7rLrLQ z>NHzam6v0TZG+~F@`fSW-m$x09i+L;LA$pO2Kwc#A>I?0mH_04V*&t5K zl||6`d!&fWgeo08LIJkL<;I<4=|!e686ia(m-^^^|nJ?-=>kly+b`>7qGrB9(Tecj_FeF_v}<*;5B)W z)?4hs6lX;yXf#VJUUb1jtDEsJSp1$&b(N1(>F-lv)XYv8+UVz;gZHhI|Lhis#Atdf z`0IBp(;b%oS%0>pX9| zUT;$q$1Kp+Wv9;KtLN(ed!a!vitxSS;3dEawWIALVH*ZoY?HGx&zAk2if3%NoW9vf zUTI%$R~Z{`Qtxr*!jStWx8oG#C|^~fP&Lh=3w5`oWYLX0&=_ zwm^?LqO}~#``H-j`+&3DpJ#l$@-;q7H!@%G(Ov22GD?YYj_#Ad^g+GFRfu>{@kXt> z1Fdb(2eb&lT!U=tU!YfVsVY)*_eXZ((L^y0_%u|@t-QklE|?Kl@yE^X2r=R)J)3wd zyq1rQnSS}FHMoR<+UY>$S%f4A{-mW<*;R192GhCYj5d1RX*l7F@@?y2%-<06xpduV zdq%%bygABIf7i!MAbTA-zL9$iw0#V~KO5>EXlkZBsH(axl(z(vqF0EYo!MvS)wo|b z5v*G32uv14h@b5umM?00Vb9R>t6b8$$Pv0on0+agI;p+aR|I7K&j73#eP_%83j#9y z&o?6YKM%krmgbf&hBo%briOO^67a}>q$8b}|D+@HCRD~vqBGkYeuX7$o52^0a)wm# zT}?C0;=mf1i!r?h8fkOV*S7OF+zkV?M*T@yG;-pc`)q6hUS+{}9ij%+hI9+zhscDV z;^Z%ESnxe1i3#`(QpS}Xk`X)jJM6GNritOnsH79xlD}Sr$P%n3PVf;$Bh(~Mm04TO zD%3$qjYp%O_AFT2&ypY&a3VSyllos$&oNII=z!XB^>K+t5V?PJG2TDAmaodq3G7fD|-jiOF-nOByVN39_sx7lR+`+$sqlnjv5t-RF~mEBxR-<*joQJvNU|*}jISMc3%QP^XV`iv zx^2bfRhwKZDpZl6+w0-Fy=4?rKrO}AZuSdwcGnN zdcaiQ=)>{_uC7xtI~ZT48&)8t6?M}trra3{H_Lf{lW-~RYJPKzBYW4*8_s5c^QEfK zO>r|Tz#$z6vBv1YMem(?FpH-vp=-`LTkS*=>r_lCwb6Lmm z=w1l8sa8zbuAy+k^vywDjg2jqOx!z6M97K0)W`zJAC+=;&2>=+hnO73rjF>~2|n*| zwa|IcN!zyEooCNLsQ4fQLtP{02HtvO$NukbF*3DU23|&LasdLp=b_tTu0LU47rsGK zUysVIkGvzXxIX8iY^)!fyxNLS2N5HMWWef|Ed;{_9UJw_+i+#lRhVe{o$|6h*o;c} zt!kJqNDb$Vvvx3t!{dSXrDi0(p|>fm6 zpY!_JI53vrB!%RN+?-@`CRb>rVb0_GH@=$Sal~xU@QvA0te8OclTU-`YBa3(PXy{o z7xgenvWfg^Sz5wNo?fm+BtKO3Cj#0Qkxmdwr7co|t+T4;!Ue7R7Br0_6y zh5#W}jp$f?)F**R#taIaBAb84%p71##i-CSH8xo&!NP+o5VQE&KK)B%eBF)^Pi0!D4ojB zH=35k%bqYyY8$lHSy#)&>0>j;r2LASOI>ljSn2+QEf`%ILMdlLVrZQ#E+~s9pZh%@ z7*6IuBi!e*pUX>y+0o};5l_j`5TDZqiUO}bna3|@MxCTDt~iFr4K>H%zegNEl!-*Z zulTZ4^rMIlmw;NL4h2Y#;H9br+F<(i#5Zjx3drp zPFYFl6;}$e8oQEr$5=zHp8S)-Y*Nj0<&B~M2}G;@!~J{h+f2VS@zURf!JS*7n6a8* z3A4UIom!Vy!B5xPoNXi$+N=0b9TC)`wC5A_iZ;Ye>p2>|YiD3Tr%QgD#DDSM;`M>n)3 z($+7xKbIKxWw(Ar_*+58WAx|o=9Ij^7+YCgfAwq*XC>*Ft6sH6w>Yy{YATwt8Z;wM z#DT+gi=aOYr#TdjAh!C9;U?6~NrR4lx|+MC2{gjet^odMi?!eClJK5hn@2DalKlJl zF}K|;B9_MLNA0Q!6HKRB5`VQFgkFuw(nYWGWGK_~mzDn{WTXqCk*C9(lZ6!ki1~`U zY(M;2YluYmB>#CW0juaI;0IMIX`{^GUYGrAdo*M$3O(H)OHYd@N|>xwHq{<*T&OuQ zYY6aY5xMlqwIa^-zitc`pO$dU$EovlfV^VZDKpEcA|;++%Jch_DPl~0Q3zw(hl%XE zSsMJ(5ODjRgLFhNZZc)u14ar|zlZM)(GAqts6X^Ry8MN~ zn94aZ+qO)zZ=!<=fyA)Di5=lWQ(1fM@b%s!akkWGVt!fBr4pryMohf(3|&EW7}zBn zJWZ~R)?;#LBBu9}G2Zc0Wn{b~I#_}uEwEXE@`Mm9P8O90Cm|9-xnUH2U%CJ@PYmzp zD;8-1{D@|MFn~lTLK%&FaWHkhkj2J&B1lezeECh&XXX*@=9B_?Lc0>06LO}p7l&fu;m+K9;MVpRDw zQ6ChMk=4P=zaoZY#-o1SQ;L(BCm)}zm{MunDSe$P4X9y9fm4N~%Tw8FjIMEkj30T& z3Cp&G+g+{~KIBIhFSp|l$naoj`APWQyY*kU+p65PSesua-P;Wmj8I{=mknbm8Go;d z8G^<)yd7*|mNU54pCoP8UpB8+$zGgC{6uI#J0N|eP-al`k3U6SwyZX+YrhK-$e|dd zWv=YF1+e(7PJyyW3ftj>v-9u!(G17y<$tc7XGtevu=}N(f z3OPkd=D_I%k=r@NF;X-BH&KWOIS~5K@C<0;#pDUiUEmTB&)a(_Kt$R2WKO=ADB9Wr?FL zG^WfmqH#$U+!SesqEhOEx&3rCtyuN_C2J`Nn9~tc6b3gVMM&5gX!j&okB5%(h^OR! z6h+s^u4g|(g_##O0t-wwgFmkwoJPG!lBWn2V#A8UaE`b>U@I-BFoE730&3l%29hj@ zn44s)L9LW_@!1>)*t_pvd}c8e#l)|fkqsp$D+-lkg9eHqI~a0=$#R!#QNey$X%7vp zD7Q6Yb(l59TL)W?Oa%HCqVVHtN2o#ZQbbeTXD?;7+3%R!vE?`oJi6e$BUXN!=8-mf z^B}A%F9dC19y^pP?Lio>22ukzcY;E8cDNcHLqNFwkzmQYehEtx1c9D%_Wg-h&x+3$Wt68d|J63Jq0Bbv6^Lqkq2W^`MbS#($2ha~*WsErpd0IT) zj(2xQ(&6zBK{S4UAGJ=fm&|gv+7*pH7-BEv)8P77s`_xAiKf>@uzx+PMMC3;@*VO2 z1**M@hZj{78Yon7dZS;{kz8ZEn5ne#=B^db6Ll-9Uh%ou{o|jv4(=}SvW?cCh-#+$ zn{%l;MMcnXhki2O2%s4%cgVsmL=^Pp>}gUk7}{9vhMOv#N5AIUn2%6l5h-R$kW4=C z{f7 ze`0WTp`mq=^ve947 z-z+}zjYn$L>L?h+$@Rx@63_g#o7q}-!8U?rZS?a;rROiIn$Wnv*+zm%odst*M8=cS zPjo-oYO|)>7)fJGQqvGQrO9>8?8|HGG+(j$;iifzazccIni`>KLI&o`(pY1~H+}Dy zt+BBYfL~FL90fw&rc0!4W%YlE>EfxZK54bq!==S+MT_2^QbQe=IwR;;g`3_`6|9?u zKZgGf35@pK%BEOfWM~yIprEc(*NZqR$VSno4l_qugnO@H#Td)20vUy_*?OC#fj{aN zoqJdPHFI{H{p7a~R-JRsd_Oro>-2KIwOrad%~L~L?E=^=4{X2@=P(nN3jTv~I?G2u zYabW!u%2c|9gXVh3FonB3Y2&YNU;pUmyAed&I0O0R`NK+W;NW`KU-ad%(EYdOv%{` z36P{{pt1B0^CQgbn3(GBRpts*&G|gs?LeP46t9Ed^N)H)l~G@-E&O6t<1 zHn`M%G5}2OuuR|Bpu(*(WY0nCKd}Pe$ceYeuU5X#eP_Rtfz65zhK7giXG;&6UE@Tb z59_O}08&wnJ8b;!J*^}jzyXC5-q@r~vmO>aO+2jY#F@~Z(DpffBV{*m0A zL=V&23BW7^v64aIp~8YJ1(%L~72dLQXOuMH{78Esf3KWP_~xMlS1h&7Z&$^GCCRd+ z;BzLJPM%6Gd&|`%c^cmB;59Plcb%ZM!>FG16yv=FXxTh8Kz?NTg(Fyr4ktXUd)ZO10dZ@B+2hn#O=l(?M zyMC;6htyS%_=lIHUs*l#XWD0s73IeY0IITx-k-!zcdI*N1|=UzMmL@eL3OW%v3$mk z92Ww0MuNun^>IDY1Yx%tC4N&o*M0i&;2z%;q-yZ;kU@<4D#+?UG%4JRLSC%RJI70KoZH z|5m6dWkknQ2!`bOfIBXMfq9|E6@5o>$#&%TUCCXSx zI@s)Nk4odXB1ln#iq)VWGdwp_Zt={TXqeo(OIE|R7uS+6hgJ$z{z6Mu^ZY5UHGzgy zh%9&1@NksP*>_|Rl~bnBpsKA(2(0$7pwGKExxJhIGI45J7!&-ltk4UBro=qN*n_i(Tds%NvNKp%1oxVL}0QzrwyvyvB}o7II0Yl4Yls zH)n$gA_2nn?Nt=gicQTz3jKlNkh%Q<(Wrm&79Lx5)+Lh9W`;&G7l``PZ0R`WIg!L@ zGRa*xf{gSRwiw#*>%R@%PP@(b9|RyE4^IDYwVwah>M=C3bab`tDCTaHyGI!~2kGQ1Jn)l(&fBnFaXV4#d3k;isNefHmvBcP?$wQDyU2nMqWxzS|d;1yRNsgGC}JC7akC$SzYFx6~Y#;tVmwJ}1kVrA??~)k}i{L zQlypuE+kV53A(DxO6e;;36zFdQcuhwD9 z!qH;J5UL7nJX`L)P&EokadV_$d9ew+cng3Ms$)ifr{dbbFw^hm@8IeB10JnED-Lw~ zd`Iic*459`jh>aaA3kdFaP_=>vvG0r1O<9fsj!KM=ghI|-bKJ_3~*j8m3BW26JZyX zM%#-sfd`0qftzb5(jt?@AO0GgdZ8*brLRTwtcS57^v6;WRa%1&M*fME_r+wCv_O_5 z;?vXf^RxU_QXjqZE!-~@MfAETi2lnmWj)k3^VR0~!z@&VwVuZUs+C{Brl0WCeJs`Mr8zZ)4OO^g%fZ@(cnL6mEg z>|mqd3sD6|M*Y0)=$)J%KEgOb-JJcyRmO4IaNVF;=WddDU+p|0zI zKj7eJY$P0@pMU;^IU4^{23i8>;jY`$!{d{=ba~8FWCRJN3$!EFNuZ*-T4a~V>*ML- za$*XZ9OC_B{o3ziOJNT9+NZigor=JTOQNqBJ@`qpBt@)d$|7$x&&*0|0y!uch3%O* z(01MH4U)pffZ5cEAR`NJfQC{Eq-3td$l6&i4y@%{1CYnU93)t;Mj4@)=SkrY6(O$O zFi{S*e-)bqvHCZ)07xsSOCpBQKQ*V89Nref^R?wc?Oj2>-tMb{C@M#q^ak4opToa# zJSHXaMn?nK*W(CdOo;3V2cOh~`o9gqS)@mJ!zMA!M?)BX{eA0pWk|q=GHWgfFvq7C zHh(@tt5G0Ch7K(wI`q;!C@(Oo&iT=LA7D2ng0vG%g9oso0JTH#%(i(5(57t9%?Nr! z?@OA_+v)AK?iOwE(}a0N7>aymQ>`9ighImsFDPq>7u=gUsD4UO)*Wx(+N0YJGlDVSB#XB!VYR9T~Qwxmjzbk&;(_(REb=lz&w1YxBFlE=Ka&jg4y zt!{M_BP3~2Pa41R{qzGR%zP)< zrQ+EAPU@hze}~F|gCecs0&YOqe}h8dAl@x|gk0X-55OyOy3u$Yv1aaFNn@Gj@Hv)` z(UURKBMSsdIY3NG!(*5Zvck%+fIB=Zn?-)bANpU>>Mo65krxcw*ygjKxX7o^8=+BJ z=7A)IiwOHeKpJqX)!VVD;z^3HUH9jvxO`){FiLa{j0rL3(Ax)Z6^RGf|Fn%$A_~j& z{W6qR1W>(jK4M`&UGGd$K?4G67O0nUnOW@Vp=*XLC9f!jj9ZKi8m03;DYzwHQaA}4 z#dB{-Hs+T=Hg92+$NVc;nc_y6njn6G5qLPT8Dh@=`!zX{o3m*w<)++=wQN(q%v&2t zIWn2=8H1e{KhuvhC^qcYM*QqGz%D1m<>SF71Z+{;jDP6ZRjX$>?)TVW!Ij1zuVefW z>E+{<{5@%4;0`)Jjw;u^19~byAFZ2Va0tN_kHtqXK#OwT_!~(&3DyJriHjHV4b(;^ zS`_4y0#Wq}3@MCKMFp{kl)S8Uh>VL5g}cVf?&r)_I>U<}k1K4x@maa~x;yf?y9 zN%I-D?u3=>_@8vp=tXQ$LF9|cx&BCDWGm{wSlK^tC=p^kBYVeQbl?Z7+4zMp0npCw zGVx36cG1VLJ^vm8@DTTOGVv6)f(G*SrC)E+pjM#4PSXk>zYV>5kAF#fU+~Of8_XL| z)0zvnF)QIFqT$>{yXwdD6eszA-c!TM!DxansjCv(hPy}^To0WZc2H++<8ktvO$0;= z=`^z^M_UI*;J@D$(j<$IC>Lf^07X)AUXZ`gaQ+F6l9MRb1bDPNsvs^%orv+s&aRML ze7sJg$m77N41A|O7HtS|NAc_rLC_-ZRMdirgG>|ri7_@g)$>RS(;(}i`g6mg|33ZQKZ%;s2N(l&rbvhF zNzsPj2Oa~P5IE(~l7w~xz~VrAXnfc(21br7Y|QuK96)3#u+vlfLl(%=yA_#n$uU8M z$RXW(S05b(N5`R14qb|il6vxS-yEJ8{9rCLMGv>Rro0h_gdsB(hn_39#7V$)VGzbh zk{~%g>`cVCyZZ$1w@(G&fGI@14ICjKra-UqrcFKH_e23@H~+PQhVFVGCF zsVZ^RKU{gBChLPOh8?qo4aa)9d-DS)6SJ*%`k@0WM>EtOUhc{KqJ)wwG9E83+^(-1 zgY!dBqQ*wxr^V%khf>%7`dYOyb>XY6A6;_#Dp!wxUjLjnkCsa710*`yQV@xk?KPNF z{6(UNWsVKgZmOiKGO`oP4`aj>Y?RPQB93vbF02{-;0V^6Q&u6hm3NO3-N~yg15WyP zDe1GynPKEm>DEe|6y-3DxuDc|^t_Ns28&P#zSfc!YrZuIYyZwcj514YUutXly_m#n z&p0>#jCD78x7bnxKqG%MtSpTRK#$SOyYO}?Tfb3kK2yPy87dS`(HukxiV1sTgKW6! zsNnu>;NtapbpeKZH@l0I9BJw37EuDqa&x{^bw7nX-ggD|umxGvE*z^$3KJ6TG?}KA z!d~#e97mZ-LF;NB098IHwHJK^13Vp8-?h@?&ot)?eE|L^%aClg5I3q+Rf1mB5rFBFC zWx4J#NUq}pZdlTb+d2&)t8+qnYqB6w%0#w%y40NayM=ca?*uGyUcKn8be zl9BhUdyHFz2ZLZigowr+ts|)D(sXx{#BP&=1#xbA2DSDSE7SlAHMMH{S*z z8b`u92Dx!S_P~l#I2h1YrY6s*%?l}ok0jEi?2epzASx^Wc^Ef=rB$az$1XW8DjsGX zjJ~HAI;l*QW=ZhX0bjvWC0;hqWmCin$Oiwd=7h6nP)*=C|^!P}nkOX9_E zqtzf1Q;$s~Wb&VbT-REW!gt75)x91lktaFuNtf5ldL~ZJn{Z9GX5tAP?UydK^!7v$ z-seXsu~7@nSc1)3%8*|*>-`mLa35?YPB#KWt8WTrgKzrGPOjrxlBP;_rMwXM8^sp4 z+>GN#Sl0?#U$fGeLxV+}LMAJMIll3E18q|kB*h-$4O*|Yb=^VS%a(J$O<)6nF|IP^ znlNCWvia|=J($==_m|uC8gve)0mC2PCVqQg?r#2}s0z{0y-si=pPVaovfA-^*vhb% zFt1r>|0uPhBnl|aA#49xsNu%VTC=BKhji1%TjVnHD@&!1=qk9kYmC<#NofbUhjT)h z6Jc()bU2+*Z$aF8rZ;(=MY`1xu%=S%m+dy}W!_heJA;=eG;*V$^4-Z?tCX2YJ59kn z}2Za2n7Zj=u?08*^v z#@-%-BCMv_3WgH1cDTTm29wrw+pC=Vlmz@vrAqbK<*$W=(p-&Bu`$~?a711kg)q2i zc1JMBq~|_$@T)uPuO0YLej$PVqmm(=C#)tY=FLz^?6!4^wUTcK65og6vPOLBO4hzb z{&3;`S)omrlYQuEEd!q}bQ>KRYMass(ay&b=83>o_Vv!w(b=+=ki68RrapTk?oC?@ z^{_*QeNuS)MT%?gjN5g%4QrGCT%iPna1V zGD@NtMZyt?7pw2Qxdz&PWOc}OpULH@Y-Vn_DaRp^{s%1Mz?tzhs z?t3hEwmb{nvM@ex39>dtf8~ndy&}T(vXDBPhPV5d|BcWMaK=p@R=hVG>fR%CAg3#r zl)fdcE0d;iWvAz&03cSK64Innup{VoB4cYdaXW+)Xw7*F`v>4!lY0d@o_592o0E-V zM344qR~l&`9Noh{uddGSyNbX6G_(%Foi)k|AvV|?RWTP*s({$ z%rms_jOttOn*)FUl=gk!k?$QurkHd1Ce3w9il6yRxa3)k=VJNugCHEe`VQ?jaqidT z+Ti6y@-UP>3B0c>7F7fvR&ZD11vw43zay245||ZiKM-ze?5vPEi*9d$=?4=ZmH(LdB-QE@ zi8!?Kh*s6%=Qsral^)TzK#gO4xRX^zTPL>WF9lV*BtL({>sdLEoGJH+VTCN0IU4*d zITd>)3-~_1x!CO2lRdXO`wD<7V9W2Xpc=%91DXO8&$F9hTHVt7R&J6j1FU-K0=jQB zW5ZYVKL5qpIfMric4;(L$F|wAopkJ^W2=LXZB=Y^Y}m{N7PTr7E~6V23EQp6Vcvr!a_C=5-kx`Fc>YQ7uyd?!|?`sc1Y7KHHiGw^}8^|ULFuTMEE2lH`v*41W53=f?3 zerAUmVo{+4zXBh(tsr!d%?31o(eM^;hOmICo$R6dqJheJte}3hvv$I#oWT?9zG&zt zH{WVIpBPZ@%w5ly_FkXnS&bk%6AUhI*U9lE!;{pB>AJMJ z0c34nTn20-zc`^^vgIrXWF6^|zcYWbCimpTMwb50F_hC^@yzZ(3L*ECy za14T)Ra5JS!g}M z$V6haJ)BCaH#U83l?Z|sM4u-}>H%`!M?3;}v*Jrwhu(_edN0lIp8d3GH~;2dpRXCK zc0WV12-j zkIkFyDyn>pL_NJ0Q$d{ZEH#@c+T^3O5gF-k#24lQPQ`}5QR(g|^i|?FGk+aFJzdr! zSO0UlJia|*&5}MgH9T;}9CaXLPWjU7s_>alCeH!7_vvm>zQ-^?6x-QP9ox~qXXS~B zuM#={O*XIBF}V+O;ujf1FSu+V>o0^3{ofh;Fkch1p*sh)87kA znHlDz58HpnDOl=bv>Em6ZE(Qo=87P6iLfGAHE_JW+BJ77tlX?%9CMU$H!Bkoi}%IUdZE_xf4dDW6BW(4ply$b2%Y$QLMLJc-rI+Pp7kMVxA zxMtJEb8mLk8*uoQPV4}!g_?4-e(z`D>=APBPBHr={YYGrCQC~oApl^hozIGC9~Csy zVDWQFVeNuYu~Q9HfpbhJ&J$u7WqREoJf_MA6yOc1MoS%>xO1+Tk0e(kJlANx^s7?r zVWeD2Q#71=$5T(mo~79kiNJ` zk~D9TW$5W{Sm>VB?z?gLnEG&vzt$?mVfAHOdu6UGN)5$tFPlysUN*?ZG!@UIm97ym zK_8S9O)@$5Mj95WE>D{d461WzbFPXZy7QJEdH8b)HB*WB?j+cUD=oDJkT&JF zydG#Thbc1rO*1YV_kaqbo;)gMhgw>N50s$z4N3jlz#HFD){Ml>PRgMATV>!{^*xPq z9h0Nm_}wd<+o$Hj>2KG%&99kRE3HjW+P$dNl{dn`0YK#4Oyjkb$&uL5m`h$C-1738 zBARt|kM;4dyu|K%0A}{Y%?kg^tbM>XVxBgE*fK-&KT3`3{A-DUU)7&yr#`Toat35^ zLh&r@orFv2Y@E{itK*fY_#Fb?jyE4(Y(Ade&mR_E_BR(!0XvTdW+;b|m$0k)1v~~- zCehNGyMT3@uXTqDLz3EWe>||D+hv5IIl9F`Qj_nr8w0QP0c=ezzbLhlw9yRoU>#>E z*3?EL86>r(=r1e|gXadt*L)JHHg=_`PF4^nuk%>=?>g6CNLP)g0qIkw;M(MsK6p7@h~ zo(F&*XyMXu7vS0Z2I}x&AYVS^M&v(GmeMi1qU%^m!EL6$Skiq7h`risF^4Z`i%mE|>{j2C?&jJ^+@m zt|Aw>Cr{&<(K-69HVzc0w+xydoS5K;xT_0)PHreg5H+D+a18eAkL*aFpCbPx7lWM> z-v18%lgp zk`1$!33zVauY3}TIDe`IUU68dk;7FoAK7=IQv&1=PXPMAZ$K`29n0TAf`CvV|8Jke{{esh zAHbrcovqW?IJQt7(Ei$jME7~D-oi(Z1C_H05iq$0VYFvq%*0=s3@3$w(8{x}VkwPP z(aApoHn|Iob2BwGih!5FIaS>*2&)VtH$9(W>-cfoU6%W;?c)vOe7S7mu%h zv>I|%(hV`zt_YBE=_xn0`*UuHS&Gp5I z*K@a~i7kF188CZR5pX1khS%BJ5MjWpx)ELzX#b38x|K}rKsU?D00y;;$ZKV>5(3EU0WiZDHaOq+|U{!fT@g=#WW9f54`Hd7zlN3 zRS5<}Sxgqg10uQwJ|z+%-T2Ac*OKv5MG)_G%Qk7B z$4Sa=qqXvsuVq=Y^o0D5!jzQmJvzzryI(7JXj<5IUyu8f*mAC86avNwlZ;0f$fI*X zc9s_Dw3El4l*iGfk#!JCSB{1j6*_~Xe?0?Z((l=m?o=DJ=kIG&)uEdWJY0S{_WPV+ zw4Haa-mm)fXvN{qDy7YP$ky_Srq|L%Aq;vtWMp~YN|?J&1!{VbdV^nbTvhfhcWS>k zXiO2@)<9Q^l_1wx8hrmplo^*Kh0aEOv_dKyIbb&S{SQ3JJ=cmoMo|!=V zj$du>h=fZ`<@bg!vEpsRqPV+~xeu_iK*W*oTC7=_-fMd=K~;ONm#URw9j4tkG@4cn zdj*N3G}ZTF)+1n5$ni(jR(bT-p&P$Mn#{Rskx)+hRhk4>?XRa|G1FgL2^S58ti%_E zLgm_ScfJAGUva#ejGDIX!gN|HPhmioKjQ7Bwr`Z#)n^yoe2^2rTQjNG(5kVIgM^C( zM4er|clG(s!(LE(MXrL*_;k2JcfCIGV9=&xZyJ_z$g5GR^44r1Z~2~Fk8Ws8>h1N3 za8H0}`T8KJTj)}Eft4deP;{ED4Z(s&L%oRBMbJ-#x~)-3|K!cYu4G_1;pgits)>fPpd3%n&di| zJ9zufS2V%x-0_reYDySm^NYU=)8lW8;V&*sl-F+dAb{)C$t#2Kxs<1qaK3yZk0lPW z$emP(z{FHb|L)Ss8WzRVfQ8$6zDELMcgRTxuLWnLlFgdu4DOA=z-&mJ_Sf{8?9CFM#M;8nesy@>nu&iM zUR;HN-!gflJhdPkLmUANMKLzYv=sJQqhAjGb5dsVOe>Bv-`@T$1czm3kiBa8cTgdK zj*M+}Hh_{={A%V~e>0$6t6VXWQua$sSgbaJwG|XvGou?i)yD1#INw_h_%Ic@`e0AP zrD~+@T(WCv_6kBMp-%G2N7$cCY)ZT^=$W1+eB~o(9J))z?G?G*EUeg#O}9T!V^q5$ zfzHgAh~c|5+qVlOGiYC3b{u*w;oVwyn8K0#F;XHmp7Y50Klne|oRM;f_8=f0OJM&$ zuL{f8H|4zZ-4%~Bj{2qjGyL!52njo_V$wMmVQ29d=qQ2C)=E<$Av1OUWQx9y;y&#R zIB?>mH?RBHWGsW*M7V>N(v%k;4-<0%4+8tCN{tSux(R8!W1p}$O-?Ee?-puQ;fXM0#!~Lfgsa z6#;K5e|sDA*LYcnLXl!tz2eId>EzOs-Wud~1_>J?BX-*C71RL&74%_-pIzJ+YD-VGo&sDStnbAO_h3 z?Yebmi)P$qK2>*UgsINk`u>h@0{e4_Z`9Ntu|AdcjuL*9Eo%T0RZ;H(P`Mn5FILDF zIR4iQ)P3Mz2yVh7V(r>_a57>(o7$oOW59%=c59|~c<@)W!>k{?Ayo6~osz5fN9cG; z+T7nc6-$w*)(h8X+TP*Cv+d>pZVHAkT(Y|Z^-YiIQZ^=wKpD|6teX6pkPsEJ?RfCE z();LSSSwM>XY+eI4z|$&%`268KzM35;+joY)+2&6>!9;_{hQ+MFSOX85y&_LvijjX zly@if1?0|1TiZiJ`_7TS6!D~O^heqn=s2GonQhD(I!vhV=dlZOL$5?pvkXg67e<|!kuKN~$Kn<8k{PbY0fCa5pfD)In1EItg;6sZU)BBAzs#8T^&gIe z=<=Z%Sasu2-xs=jY-ycQvn|E)UrZj@UD!?h_6})S_|2`5lIXGt*MeVmL1d`B;d=wo z2{v)JPZm(TyCnLO)Oijd?wY%yDBwhYjwDbm&-Rf2GS+0ecEUH^h99ZE-Fq8Bvqr_i zaLE!}b+2u_wX!@6nMC7`x$-ZEo_=y?>~D++qb7bkm*Uy@5ZJtc*kqlM16_6NRTFNk zgOt_S7aN{ypc26KSJS)GyUTLUN--{A7aXg;(F4eHNx?P`mzt2ypy*qOX>SaghL=~+ zAQxpD@#;%6YfPwdLvoC+G2DAo*p8WCqHC*n&Aw6ea*!I-QJl_Rvat@x+hWGlH`I@1Z_T>(`jop$Q@Y04VfM5)Uy)*8 zB>{J+Rz8}3>b#5%zhz@y`Ux-Ia`@W~vp^6<=kK0&Zr@cK!J}gaGT1 z&ov+t2uxBH_WXT@qK`?6wC{hucz?X=G_{P`zo=kIhlZy5sOwt?6fjsw{1=iS}cyKt%5&qjQ=u^1Bi z=i_yuH>qvF`*)>uhxEM>eDj@V_BfC3DQIM&$?ERy8R;Lv-BfT?)py86)xxbA#m{|r z-sQ&IKGx(qrBVs&v_63aOd_O_FX_Ku0i8*GTd*;QhEz|z@Z_?z>BF|E9M*QyxR{k%~E4Zekvx?c$v z2!Zi_o(X%rJ-GA9RIdVku_W49D_BW0&^v#dZv^239&ViR&S=GT0o@R9Jcs4w=hM^Q zh}WMt&W?qL?ZiGdW1j=~HKMm%2Vlgj>+@bl+6LAIZ*fhqj_O1mOZmrwb&gf?R2w4A3|)c~UV!@pH=f2tLN zCfdypt;AeM{1&Vz5;IQxs+E4#T(e@&7^8JmP2Pg39<*~8R%1TTtM8wcszBd_BJ13SgfI{c!U>(>K*B> zQ!M&2L4up$*{N+mSJc&AFa}rrlBf;Xt#jVvvhadM(Db0lPwR7Bt`WcG<= zLI-t+(t@0%M1vL12OV z!i8Or52&+Dzi$?X{ZeV%^gRl>{t;6yx=V*Aq{pr7uhVdZiosN+WtKRI?To^TIeQ=8 z7^`s=jOp9rDi}jpH_Xrpa%`$et00_gzH#b7zlHL2thaJ3LOLYV{MYx4+AgudsmHga z_ny9g_4<2PTAW8taJ`U%QrgaSH8QNBt};b(0k~zF{)9a=yczy67~%OlC!GBzw(;*Z zh67Bw(p0vXCLiK5Do#=41eS6{`)y6^z80qCfBEs)tddAyqh(x8sZr3Gh?-64k^8Sm+2n%oWI#YuY*=x3k zkbuta#%M%)DUT7t5yR0y9?0)Wt^m9)F+RN-D0Ty?_h!&tOrLiqBx2NFE;)wXa>y=a zq^z86V@xXf4Fc8;cCjA>yJ}2k2t+FZ5LACvIZyWnc${N8r{{Sz@k2CjV@InE-EN#P zA&K`K;5|V^V)7$dnZpfwf~#oLAM)g*h4M9XrJuJw?xLRDuZ%_U`U3D@$8`7>=nK9qcAz&F&uF z`;$WGE)R@z31|;`Ni?Rb_@ak}0Knju{g>FeVPbo^uh}a5M4>{H#th-Z-;*&SAEz}# zv%(7gHSc+%r7hltU91U-Po64Li}Ol_jnQa?qr}ARs&x+=;Tvi{JbMz&$)BiLWg#%_j*DRH4nll!OVp_e))2jF#OQzSd z<<5x>TI#VW&8kZH8k|Z>z@8xlgvnnWa%>FtlprZSeOVD0UVM#1IGn73UJ|fXIbBiE z{@aNisf19+Z_dcM(ZokTp%GD-@*D^!`snDk)(myJQAD`rCvnE1vO}RX<@oxTkcb>k z?{e`Al{0_9WUpWyj2{&bZu4!V{iEtk*!}6OlyR`DNO;hD>2mkQ<^1_}3yUA}#w;JU zO4L?$ue013_T^p-ZEdQ&3Hlc`?@3bG+vl80X7x$Ip=&(GdBAJ|u3#@7omTwBBHDf{ z*{~2Hk*6DEhNmM2m8Ys6yNXQT6?I0jA~6Avf12N933R!UFWM^EgXDRu;1klgOoW4L5FqA_apjInprl!JXMy6>*73^v zkr6~2s9mQ+bR;ucA|AQ+Ap@8k{gALGC*zU?T&pqsI{ zlU@HcT3|kIe7Z(1w;!)7$6Thv8ouoGz^XE$W09r|scz1Q+4{RoTc$#my__v9>~@9y z5wWad=729k5C{=7R;XJ3&d8S1Y&Arjj~yqY*^9s;sM-*r%EUi6b2e=tTbqapt~rgk zhFrEIKCeO~!!U989O_V^+L%bB9BYCHTYv4WBf9%5R#h%e(drnnr+ZFHmaZYKrr$J> ztITqA)NTH6>oXf&jt+)p80lCObJ&eN=0D4q{A8`BLV(W1Vwn5|KgRMmTsWb@NMg~c zV+O{zLFG^KTK(A)O^?FhYR&yK$Bbf4F;A^rlhtQ*6DhVzOa&EF$mxV2RxXMPn;5K6o~RJ{R-q0(3@19$jEK?OBkIm?qFJCD>x*B<7sA6?n3@zmYF`qmT&~zDj zdh?6zZ}ebx88zV;VNKqvhC|dDCtL(6zP?D44q&-Uk-c~pXxwUj?@Z8JZC;+&JL=)Q z3Z*`O(3*rs6@S#EIi_Odi;={x(yi1|vcp`-ujgXEPDm0J-V!$^4dH~#X+TSFUGHgS zInF#-Qe~FN%nd&?mzGfg`({DmjX%v)VHxz4mR^3%2BoQ3keyey9~z$dtF#cOSkFm8 z4M>>Om*I@*TQ_Q;Y{4Xzq z#%tPGMeU~RWM|DzqPEE!LWH}V1%BqWaQ<0L%~gpsg0B6A(P7Gc`GmPD4WG_A5(qlM zZObUiZ7&^rN>Y^6Ro1YWFCw4L-BkoHTOD#3L;S@WK(;z5i)qx}<7`8%syr7Xi57_G;IcP4oM*)hEN;Li!j=-JB*< zr2(!i!nJIKs=RppD#Q+y-ECzJW zc~6FwD}w0;<`6gTx2ju>5Oc~O@l*v0n?Riq@99_ zk^Y;4`{r!*^TI0O#EXbnfd7ciCpT+Xefr%&@n59jePCRr0SqNJvESn!HB>Kf49$4AG5gO9bRR5FSDC6eA~qrw)a9TzBU$&pnN7l zM4EFWm8pZ}EC)3U-rhF9w6)!IGO-L#$Xm5%W7M(kL?|Y9%L@Ziep?{(;>i(1amg!p zg9th+rM`ksTuO;TxL(*_aBp>d-|lg$q$|{Y<2IVGRAA{4M_j7Ml`Sz+u=*^piSYLyZ?_&usk&%$5JX59hb)Yh zkBLx9XLJgcbLa#h`f6kT$1DCj6VK`jceS}Wwtg*p1j?om?!JWiHHYzfM|ROm#7>&> z%RAeZjUIel{1H(ESHy*R3sk%rhr%}w+9AV1avc;C+g&d;elyd|2W!;cE^*f(!;JeS z^7nD$`tpEH$l^=HjdQ3=N7?UxMA6Yhyu}Q1h{d)GR1l_t-^N*D{BJ80Je^%{>cy+C z&7ZcrT}zA6VjT+7$k>w_^^vGv1~dj+wW3JYjIyy@o-TUd@#StyQ2W19n`3?BLm{)* z+w^!kxE4A;>`g2gOpf|YzUd}@HtD98AbPGVJk*&K<1%vt8)NWgkB z7Lm}{D~Y}Uuj1=}<$v7!hXt&y)DjQW43GbWD&3+9u*uRJ;)cdL42IgCLZow!`(m?% zwG%vK?r?l5AF2f5Aj1$q-^->|~C`jXYOM~3y0FXJw+dG{l4eLiPgSfZ9|IlpeZnu9>1Sk@OM<@aqj!6P4HiJ+|%v#gP7 zC+20CmiX6~Lw(KbMb33NO3zB43h$36gKFo4V7Hmthv$6ognI=dedq;tN8xfiYV=be zoe_8ErlK*0!ac_GIBW+VV_2IE;gHf7JBLlyv6kLQ@wa_@d9lT`~ z#wU>W3g7ca%nD4Xo*$tGlO*+w@qg0aEZLU#cE|N|JcPRPMzS+C_GGIA#%PH9w%l;a zq`(OO`IS0=b}fi`uZRf~qwhR3D23(&beNFUp+7L*pO_izVu;4ydKB8D5E1V&CqlGMiUO%K5iWx|dskp!MmZh6I*Ee+ zTDN9isoS>Ci(SA(GJ}X)A$QpZRpYGPW<->BxBa{v?w)jZl=w>+uBmsb|u1bA;R&AkPQ4sE+*~ScwfbT z@m&jaL=aT0rA!i~KZdu|E9cvQzR>5Qjp7L*_^w&K=7-^EA--UNPDGBu zLv@jntyqniNmQ;@Ua2}MA?nzHUQS|0J*K_Qu4vvtF(kpQcLew_r4bqcgd0}{c^V0~ zwV!!k;0CfvL3WW{sTPGXZti*x(bhF?fUH6waiz5g$kP)Fh}Rnov5WnViy)lzb;EfI z1_8>uyIqe;3bk-Xnl>HVp1me$AL{NOO}JA?j;wax{eIa~Lr3(6Tw>kMY6Fkp0g+&~ z&tG;>&?VnOMs&O1uUByZhZX|rErdOf@^dI00a1vH+B+AC$l@Nw^3b31t)BPht#A zaxepqt+W{7)Ob3s+B`XM{B z^Sfc_fARjLzd{-TGpBdrmgm9e1H&{9J2*m!IdvF}pGyInjgI$TTsr4#vr%S{h+wXY zl^skVm-YcA&%(@bU&orRu^zR5cr>({17A!8M)KXNqHESm2<@q`gT^izWs{0)lfJS0 zY)3<@{2N~#qM;RmX;7p1>^plqnAQ(u7_|7v>Nww(0#O0rM~vkfg_%uy!+7XwQaY%O zAAnf=?7$-!fX+-(LW6lP+$@inx|Fu_CAU4rt=m@lCdf=~>e-r+Fj~~Gl34l2+_HO+ zK|2RYJ;ir|X3!nsnqA)Z+(mS0m|@0gMX!-fLfkCw#!orF-{GcRGf>-gs%bWkRwhHO z_}$O8Xj>jwoaZ~0eRzXC*R8+Grg1m#-sa;pvzxf=oC>Ld?xmARt)WEOBBoSin-Q`&&XNsUmQYZ3oT2+%h#Q^k_7Vgn!6b?rAL@R@1!sf zX(YogO+bdaCizCU0LqO*{BDq!Psx^f2tyiwk^!0eZD&zMM9#2FmVR->F~m$Q$~=oT zIpCHodnpMX|CjJeD1syFpa936yhjCj0u+<9Ivrv!33=tmnbKtn{>u|e7PG*VhHf&H zIK{fKB2DBRO#Jw+VE2RuA-*KiAs3DUmIshY5WJwceMIKA~W`Ox_)WhKl0rO{VkN#{rJBqNB zRe>&zvt#lLx`;a*sLs+bsP@YL)Q+0+g_7PUsra2uzfGh4+t&eKebu= zNpg{6r3<2eK%x2~n`>DoD-R28?h~}pmSnq$(!J-k4kGd?Ckk31Lg+~t#57E_*~-#m z5^(DFB+WesGqabaxY1{ph^GUY0Tyw{IrRy(iJqCs>IeTG6z$gN2PBDNKu`cb3+K<| z`~2YXTNP(m9=F$Vnfd`U0u&xH8h=~3*)TPf5LTCeNZQ6;aIsWRXqT%f2>9FU0A0*3 z+1iQyyb)4cn)-$5RdScvaFUJ#iZA=vQN&?}X#y>&MQW4uPF7{_NEAjGV3U6h*4Q4= zE?!P!NRs`@tL~QKw6M=WqsxzQ88Zk+7i--Kfz|+JSrb(98)Z<*x%`TRXf#AT=?^v8 z_p;+?;&!3Xlk?9&&gTWXaRD(%ajjRPoa|3SR#--`TJ?j@xze61Nt7b&4U#SAwbjwl zmfieJDm;u9_P~&X>GKR&fV~Jwd9B6(@x%a8es0A92^VU?_f#6o?x$hu^bs}2VA_jS zOtompl!0tSfA!YRB=mBHl1+{{Fw&R%e1xt&A5JK5 zra6`$t!8G}Zl zG-f?aouKP|S&~gqcP_(`I&Yym$0T^T@AB^BK+VBmmDR$JRBVaal_w?Bs?;%yGO!=! zDEq>yRe3cRyR3$vz)p)tQindN(_9_~7{2k=6B~?4BPw(#R(p?c_4nS_VNx&EDWTI) z-V89A8N`ZcI3K$!-+Hoxr_;8;T#k&e>XlB0lQ%+WQ1$GL04wwF!rUX);4xl`8wz%H z^!f^>cdz;s7AolUPOerhD!gC6tix+R#7fK`GHou!2SQ3u0aTWcn@ji6#lM+iG70pt z%}`l+jxYo$O>j-}#SnSZaUwiE#2PEn=MfBnAT1PLEwLbhm2jNIF}O`kFd&)`{NW5XOdU+`%xY~|| zOzH#Z9OxiXS`w97HH@+!P z`8t;nXe(YvRJ>bL3Z!g?{+~&PN-kfJnEjB( zW#mR2kTOEHj+5GmPVr3I7vePJaW)@~py3P=Hi?g}Bej%qb`Bzk==z$IC-0Ab-$}mM zLeJP_&$ZjL?ixU5{6cq>ji2kO{%PI4>CVZgb>3#ryi-wUJ)+P@kE4K*R6lFAZ9P;* z8?(?M?58iq-H9ph65b$7dznw`&$O`_xp+{li1E~2#I(!=~#xPDZgH7o86&R$vd z7}zq7rJilUs0z7+;_(8XswYU}iJX3PhnMG2)D;H%rR>CuOI1%%S3kSFR6`rmteVKJ z?(zLwh5}6>xl?;_rczpam%L`2i@|y^hf zX-YlK4ZEJ4hfZV|_jVr~&_n9P73PB(J(MUCF@z?AT~fDNON>qUwt-&)CUE>vqIPGb zqmo&gF>DyH0&eWIe}(y3WS2P5NjEiA0UZPs%Pi+eyrRxas+Mag-%rdlE8(Y%8-WqO zL!5GZ8`MtOfunq5^(ktOc!QpUHMb()49+e^UBq`4Qpjkd(wsiGZE6!yh9`Z`!qd-- zP7-Dt{iQ?h+Z#K|{ZK?~wqpBi!88`*Q-Q&Tq{AGkXZ&0|9Z}cDIV4xkx$xx zJD|JcaG4_wgolNR`8L#<#O@&tz==usFA=40I87YTKaqa~Oq|S*Z48tr%XS9R?~18g z%JuSXE>VAr-XQP&o+)PEdcTq-tV~-uApH&68#a0U?eXmd~{b5?i3|#6%>vGR1uxp{R&U*ya zBKhFau<>_@u7v1%f{9J+>uP#Eb1Q>4XPHCtbl|H8OX4wp_#+U%)gt=*&?gT;53O!8 zs+>&&LJ9LL#`SCz;^^9Z*SONGnH53*Z0+*N@b+l6jU{My#HuIU0pZN}Bsb1~IcbIf0D+GgQTR}fc1Lz-=l1-)s)i0@qGAt8 zL7Q!p&cB4vod#n19oR^)TDO_5I^^XKVcr_FHBZI2>iRb0o^VaZ`hf7@Kr>s{9^g78 z@~9c>Ftt~5eFet-$RSjX!6UkW>=*!cciX_R6kPw99`x}_De$f)Vk?|v5gbeXAe(++_6 z*xR$Fghl;LL$GgS?eO^&CSzPOj5|!x%i#{uV~uH3BSMDr?p4Hl-8z@XCjX{^E`j} zu;dZWAdDFaMLANpm~~rnJ}ZV-WJKu5l(_I*g;qt2eum}W#o zTb;ZoEI4$DLt0nm`m9n+=tqerrf99pw*YeN5ymv=KcadqU}2m4V=kjqvgKsbtB>$} zKcCfpv;yg#DT*zaxdD|BYJV@t^|rl--IIKxsZjc*LEh(2e2(=LP4*B$Wun|mt@{Wt z6|Bfv_PS*B<^#YZlsh+SF(%7T4KYF7e2}=vfJGR7Z)hzTZDXDZA+Wf>7c)H=mL%2y&4md+>Fu3K&aRouN|%MVWj~k zrIk=1IGr6+n>c7Dk1I8DJs-ljQqDCFd~)HC^f2XN+@M z&j4q#a*nVLVx)YwMFTQLhl{!zxe3iIq!!;o?{GE82BvEGY^ClkM^Cmn%gLc|bGO#4 zA~0j8o{2oO^yI|1Wo2LiVswRvfFF&An4auE|EF|T$BP-v+efrmM_dcyJyIP{mIt*k z;MYwzTB2@9ArJgIrLrIexM=-!f(B#EwJ8eiO;YoCxKzdG)vN^fp;b7RV6q0TWr#-i zh2~y0!lqW06epjVuVvZ34E3MxZ@AzAU9@*S6l={hCY(nU%=k4o2 z(puAt4M=WgBI{xGDo=vtyq%=4T4Orp*kI&J<@k{{DhSyu`+c{%tk5B%QD!a(P5?}# zzu7&Pv^u@u9s@j+11+rm+yXr`Q2Pr8NC4!1$oH=q>|_|dXC=jY{c|*96n6<^{wga- zn%Z(3k$M|pGhu`ax390WVZ~d zKtMUVdAQsmT0xLAWel>mb`ZIkbY#Ds3rlK5Aev$5G;vEPM*8n&`P*6>vS#co+F1-Y zo04mF4x7#8>vN+l$~b+Whp|uxMTUIzuixb5BZE`FcoTr$8i3>uY3)hNM!4iFe~?@F z$3a8JAy`vY<-9dq(D98s62MYCl(E*uM%c(k+!NcJq}rB09DC-hlh5z2&?r4s_;eGx z%#!Fh>>G1N6Uy-%^H;-j@FIqG(?5s^y|)xzTqxqmEYEE(FYzbA~umz6A~Yy z&K!YdU-Pc2o3FH|*#P>VyMmwBba$diZ{Gw`cZnFcU+S=*|_Kv!Kd`dWc%)+-0*=C$-yK~YeR7x z!Hl@2bEM{M6-K{4s7sT{`^D{;L~Dr+gQGU7^X>~MRjNm}`~l*hkF3Hq(}w zDBhjaWDhy%<+#GP)?sB$LP~_aojy;v{ph1jpqJ*(<;CjKGwWLgpGiEMH3*$mj~)13 z>Zg_S<=0a0S{1w|Yh799p+z3*@|A4s*RzD!c5+P>A(7xW;u{O-)86C|;4KsM_ge}Y z2-eDu(aZ&M!~jyIPq{)RsZS|a-rv)H>m99_lHbwA1@BN~IFpDPnurSXZ#=IMu>Az; zV?POL%vcLE|4fG*6=TNM2~8cKS&$?ssx+Jl@rCS4{0$qHxe(Y;{w9K?WOg2YFjXs= zqX4VmhDvl!NA3ac-hbr%DC38Oztx(_z8%hv#S$%mC5v!f4T>!m3Ei!$tc8~q;yvg z;XhRhUgznk|Kp5qXT*#YbF){HM8bWmwUafkU*luVOSN;c7W}BoG;WeKWf~i*I^(D= zj69kNgR+Y$UKo>6Gv2gOW>6@(n61r@iC0Bn{sX>B?P5k|+gABC9cP4=$+K1pr&^J9 zX1zKl53{wJf2OH$GZjtVgC+G$9#Cv8T4o^wl&z*?)~cBLP<%rgW@QG{wJ4ZX@!BfY zOsZ&Wn%X$FP&8$<37ucQnyM)n_A6+b)RYp+n8vJnE#{xn)!4>2%cNu%oXPFDTBbH6 z8B@@^6AdaV=dfhXfJ!2FrH;cktz3h(M!gpLFd?{_e>z-_=|vi=9bZdx4z!xB`S9T* zUqZJXzl_4y*5J$b&R`V*!msa9AQ`9jsjcYl#Ivn*+0vEs-SVJ5yfT~n$HV`r*JnAK z?%C3AX>FFO*IgLILM^Wg65}{jSwm>jk6L9G^Gp&JRl1KI0+m{<&=8z@tzdz*YPW(x z0<}8se~K=B6Kbv*w9&p5RZ7hh-Nrd)E*C)}1B?=>U#|T3L}d)coRUeJYzY^q0CP@3 z3X`CJJlN#P;+d{Q7Dy0qY({$JNpPhaX)zaE+tDLi>M?ZIAuc2^6{pioJ-|bxmb00u zo4-Pg=y(p8YFVGuENGP1i~>bL`vsc_i2!0Ie_O|2$mZ1zI`1&)1!y2d;sZ-WaYCgs z24P~}EC*d~Qem|VtCO-+9MN3Qw#}fQ6}N4&FXpa|6VFncHX<g+)?)SMNE^5H zAt%s7uqz_?Rd#P8!Lc1!|30>HCSe(Lxuj&%RRJ}wEp~Gxdtfsst6O_HolFeC7{ZS| ze`a-VH??ABjv%eNBj}^3k6D7?j_+@flASTt&K7w^VR{tD#9~Fdc}IN!NhZ<<38>x( zxS}>FI10gg+rqBlN?mCmY)MY*uAO^BYt->M<%zv+{cbhqnLtb>A)o}uTbQ$)@fBo1 z3yLsf@}AA7-(bmI%IITXelnR8w7-2Te?Xe|gBr?g!K6HR%wh5b&&j2ZKy%Nu|5(gI zNaYevFfW#xW%De;Sl#bM+dN&E$&w^l}8uzo=6v9^AIET>ZUOn+j$mr$ue>5&W ztn04=3pQ@zt1R%vxw|tY2t>b*CzjII;OL?xF&4Q{Gr02XOIj@&v8`REc&OAmDub#l zx%)H8IgpF08rBEh0(vJ8NXD2xD_FqN69{lBr_g=Hwed98Sijagkz5L?mcPBpbjNzo zd;MDm`?HM4OW{#Y>FQY>g;cKBe@jf^DwC&=Q!Qm{TTwoE5S~BHAVYJ7E`&iKAmG9# z(=+%NG+V~=W)?rTS1QtRI^F9Oj6j^x5{@$PErR9|3 zp$oQoP7+Kv+$H5S2Of3#{wR}UQFiO@p$HDE>*N0gH?;izTlgoX|lS4y!I<7 zaD(|V#}`wd(^qH7pV@pLvzg!_dFAwPI7^?VT3J4a?vijeF_?>kiFmGzg{9E%)v~?> z+$a1ou0?mFq!LmSRm*@Ve^nht9`)0^oQX%Kz9yGxcjIiw3=2joA2oxqlbYEL zjn7(THt(xse^igu=2@PDQr4*$ZbWq5|X?2 zH1|H_ww?9xUgUN~BZ7kXH7afiW&#`=$lJ^DhBj9u(%pc9jNtrk(+p8)w(4f}kG$Gf zbC)kKe)^C9^YarY49MduY&C~;wVsWKK!MR5P%_>r43j&MEJZYP00# zgx5sF!Ors+FMoLTf8*=FK67Jr_IpPu+^_@*H(jQc!+_DQwWGioSKRdv*g9mt`W2n> zdOqkMi>30bt(QNBlb5fbN6@=FHlq-2QgpMXZ`21J2=qb}D{p%^-82tj@gRzWTD`{U zY?dbWO2F^YxSa)>eX3N2W*@cqEDd6*MN9t(p|Ly!jVww5f91}elK%D-Y*{rL+(T|? zy&6NbW`#ix_iC!bS~Z2}o)rZF3O9?e-4_N>p2s7ah%F(7|6n*cc8uVACLoE^u}2l; zQ3Zj|qYCn5bErst>RHpcvKV~6@^Dd z;Zad&^!b{Kf5HhaQQw@Q!mTE()k?88C1Jff!XLs)A)$Z}eY8?MDj)jiQTcdOJ|2~i zWj_A`%7<`t@hKnQfQiC;NHXUh8=s?kAHbSJ30Qak6y9bH?-J_M$pof#mG9yFpipJ2 zbAswTa~F}GPn}mk{P5xje{dmmdg?su;eXrDI@OL(e=t7chF=L{TSlnzfVxjFr>7NO zPETvSoWyS#_)^Uo3J$htXd>cq5S@c)jiSunX>kB7zM#P91i!TdPZWK#-(NQV6a)TM z$d<1)d{oL;#7kio#GV%9xp+H`_8^~l>pQi#Y!$FWJ1lXr_Q+g{5^ee6e(kUTu~)bT zNu0$xe$c^SVFkx@iL}hEPVO9zU38u_e<%j_yfAWYsW&p#y7At;HEVL%AaZG_#q6*01 zBpeCorz z2ggd#_9Cv3^QRE+$1U283GRqqY@sbi{3>N%9QBI*{H2!=tue=1SlDs)Hf0kU>>iY!Rcz%OF!Gq$3f$7qh_ zUp+!l*bVWrXm~|pklR4nPYUa6+l>hcf4q&#`+_mWv_u$|fQN~%x%NbJhAiUTM~hh) zOnT2urcinh%yo=OiOske7O5y4&N{5Y-uIKr1U|d5UiBa-KpPwVH!J9rMs>+?}{+t@sD_Jc@mIr)We=0aPE5nP{>e znW^+yH#5OYwjB=Hk{XWKh>akPqLz%eT4w^<61ANtRhX2~W6{OrwYZv<@?x&atCmMy5iRLIUNoQf4?5Uifo=NHR>OAbi zAsewG9tVTtfWs>tjB|H==loEsJa-m;7uJ7lL*!-^pyTRT&0T@~Hbg9UPPAySajtOQ z!NGA!GU0b&I|d_OPpkeA);!Zwyt6(-~On z!2N?!>4uw36_UGpyOknEuj3$-rtF|%1G5Gx(r+Gg8A;%fuR!ErHid)le1S*mn*mN4 z$+Vj|k8BCFY&=pvWtCK}f5kvT<$*u`UrypDJ958Z0`_82M2A_HW?jw-=uCkY(F-`Z z!>FtPVZ+m^KkCx);$q5XYL3jM=CT*7Gx&&&mnXTIBrG1eNdv$ov!XrlB{*L%<0@FK za->ST218D;sbzJyIlS810q3`ja?7k52^%|D&AG#cs4PNHPwy-nf48h^D*>?LF9%;_|~FR?C3 zgS!}z&YI&}OJEdSF=kYfqo3F!vj-^P1RJEEnWj~wTGjkIWP^GQzE&7`6Xz3kL`G9N zSg#>bX5A7NRV-qbf5U@#E~<`T!fjQy?Sj@9P(4c;5fuz1d$E{?+5Ky~fAV#&&sB2< zbk5*1LNQX+O6{DK0yu~_fce=pTv))YzAUaU3BQE?cJ zLmnxq8Z1%b08Rm|jn_z@CQ%zrRIA0LR3MfSkJ|YIRvNgz=7|y zygMwh1w$Aj37QCg3@&!Qi@h zu)sQiHd1`$l#}S~CC$Umv1xK)0C%UPZYzWvX4vE>e-ktmCg`e~CwXq+4M@{wXw zk+U2J=ZkyiSd=!6Ox~b$6`2`sBA!MfvNna^F`~%1j_=ydm+9PYY7bk|ycKxgFtT@2 z9tX>Vf63R~9_tprHq+(cHiNTs)5Qh(n^6Zewr-_1x=1D?WtRyzJTIgC9HZj2+O)> z8p*VgDK9Vgl}KH+Y9wuIm`+`Nw8RT7YR$9wGa$o61EUlDoC6lvL!c{Z6 zf1OdTDxqBIj+4s6q2F|p$h##A)oh-JL^WciAkk7u*0gEDs|iVMPu#9TKDP)s^ z3+s3IYm0i@7+RQUmlOuaXu+h*csU<9e-NpS!Lgy4F&!kHBQ&OUvb`d$Du{1Q-dFuY z+ZLPy_cdLb=lRhv&|UUE=6Z9Hr@}Nn3YujG8F(} z>sufDeM`>5V}MEYIflI)B-8U9jWTo!*qA$%D_F<%llE_rxbE{@Rv$ecIYxGe-cg!D zk4~jmE=O6>*2rPyNhy*G-4mO*e}kNei;?o66q6)FHB;a88Q9t$b0S7-W=Z$;c*o(X zv)};^_5j8jbHS;hzo(?(YF3&ib5k{%oe)-E6%!|fIvUnmEV!N$cJs`52D zi2P!Lhl!~Z6h@oGPa1K9-MQ>_+(hP8?`^DBt3x=Y==uLM{KT)sFU~jS_IQURz?I%-Fb9U|PM7nE^ov9L2$DPV64j<}9rqTB6FSWCD z5?|ga%Wx*X$El7&# z)}oQlALg2fV2W9IRptnM+MFe@xWN-n+QVW*%>%4aNz%NuPSaTHk+6xdVJwiUaiCg| zH5C7I()9Qm;t}HZX_UwRH065|-QYu?arv5pCGz9@0E()~B-bdEf5Re|G$0jWyv2*? z65%tp{s(&4sE_y~lhwK|DLlwI$QCx=&)xHA3Go3+R3CAnq;^3AnE2b*JBf+SZ z8+);5T)HxVm4oScK9cX0&-`Yqv%G?7EUhgv~Z%)zLa-@f2$|@4pb1~ zZPFytopcOIpw_KZe}*ohps~?t61gYj&X91j%eKH z1s@Y1gP&VOHh0`F7!Dw6L<`^`a2G%iLvdPH$3Kk%FsM4-gW6^D2ID}8smi^wltdRu zM$izux>B+!JvGiZHd@Qsw(d|E@WU@Z*(}T(lR!FuqyV6Re{}xmApijYFsMD%LtVX>|$bbGf6$F$274%UD|KSg)B+aG4jaJcDmBf*BJY!T1c zWQ4Ohl!R%92R-qH)q^tP#4-Sf3O+s_czp0=v+R*Mt{zK3qu4J-n;QMH+1sZ^-eDV- zLBP3xk|plzf2xui*(#G-^?J+gZ4y+Sv8~$B7A0fW_sNLgW?3FB9k%#Cj~5%$ zJQ|_Yk&iWBaH6q2CTR2M)yv++tCy1qy4Jnuntf!7IDgYw6qj4CJ7u%u?;VX@s!X%m zEbJ;|9p(6l>~cK6l--EHG@gBCSfX!Pl?xI21AzmPf2g8Xm2Gm+CBegOGxJ5p6!;wO z7l9paXp)Bs5%*JUL6%-F|L-?}wd6;#X>%ir|2CL#U zp2bC-%UTw*d6uEuWq>ED>zs=U*==kH&N{R3c1zL)Tq%PG+)ZyQp1Y%}AX9ywkGJf? zu0Y4O@?r+YmLAg7J83}B17j2IPNG|Fn_)(3e{ourj3z|^I9cy~pF<#)E*)H+>n4)* z5SIjkS6MYj2bV7d3=)*{dO?KN&`5G?Y7cSxK{#B-f0tp_7z_UX<%>B3fGdtV;M_cj zqkcrCreM`Dj&ymz*JPt5T;hYLDf=6_c0`GHhx*nn4ao#m+bX~N6c5YI;C=DpdnwIwtB(1P@V8oDB;9ftXYR?@x z6H5N9hFY(n&45|&i-Wv`FFl}CO-!yRe-TXxhI>vEh3J=(l&c}!^g%fH7w5mN<2qu? zCfAsT()>DUo-=wCAj3nd0nbyD~JZ z=PsHkSBsrkjB~oTh2wK^hczBBcZ0wL{Z0r$_i=e`<_3qLYO$vkqw{NYcMP*_fA493 zC9d!7aBsi++RqADK&;xzTkRmi3dX+ zYs%@eh%Sp~t>5Jl6%W4 zXK^^y)dAt2%^uXzs7r-#%ObyafUd+Q4f9{sK~qDi1+01DK!dBFm^pGaiwB_Sra4)^ zUG}Z}Bs(<;6=cV$j&mCk8h^}|54?E~5P0TCjUZ}oQ&BdHJyZ$ZRuT)rf36@9gOuVK zBw78VFXDCO6nU@n~LtBJ!BIAM@KZ+A=IK)A5OAr$T4E1 z-uQ&;SC*^_cYPkH3rs^{BS8laq27thc*6UMhA#}z4#Y+7s}(<^E#`Mz8#IeozP z3{GgYT-0whTdxtSRo@a}fAY1>%Rn1zX5-Is$m#%K^G?ho8#{34Q$W~@F{3pU6z26zAkPvrLm8+^Mw4BNI*n%Qgg#ob63LY%i5t+1!Q!+NGG zB*yZv8BEjkQxF%yVlJFF;2tU`d$f4NVIf|i)iN_rbzF**I6Xkn~n*C8wWby=Ue>5Lj$sDBiYJ; z>MAL%Y<>f35MR3af67J6;7(`Zs9)Wr=s6PfM)1E&5p*=Zm*wF8r(VXxl<--%9oJ*V zEeF3cgZNZy(b94uIJC(I59bqawj_+Yt{6|;gm=Px$$vtm8@X@5Y&n%N<&^1A-96_G z2#9pFz}9&TxsO41(B1D2_)$XAgO_071z24pSUa<*9Ica%f81G7AZxbX!U`fmQNY=2 zg^6dS*Lu7wEZwLkzz`W7n87tA?u=W%Lda+Uu{9FG;2=lI$3~zY3_nGVCYxG78exAI zpzFcNPH=HNPBXI8P3V5$6{#NefQYVq+KDlk)#=zdT}d?sb3}=NPZSZDn@i(lJY7uc z;yUXq1-Vv$e*;966%eFObl-E;N}y7e#l+#_z-Ukq*Dut-5?&4#1UpKYKBC3|)OiCM zP|+z+1En7U!<8#O0JRM?Nu+guZW(2vrFmw=W{+*Z4AVkuL(=vz)q;*2xfe z2M~B@f3o9u>{lZ@x}NPKJD%CDHQ^CjUz6~7un9o;;Yg1L@?V7X$R#>m;3~>?ax#6Q zdbI5Bkb67N!0i}M6xd{Ua)KOCV@g3+`#$&|E^u&qfSmP7#7)MMRI>0Ad~M@An6N$K z7!wsbsm4pJ-2NGoLCMt~ZCBaJOj(XNKm=VVSl2 z!6#am%(OVoW8>9qfCbtsk@qrjYFE!IAs{tMk<~Ei!Fm&9+00szA!`y>a4C)7NUQEo z#H4X4r%sV_zE&can=z|{- zJI=-B#%>wS&A^47wPu&A5!IHT>sQ#zXS&Vd)U9t?E~q*&U}jI+btCbht6dh&rx2c2 z-`QyBc{!?;l31?|QJALO-e{Lo!vXM7#{+^{%cX8qir!ZeoG%0>doLb>Ae`a!n zYjuv7qGMZ7*SbTrB-~lms9-0zf7sT7CK51NEAWL%)ow%Fc$7ds<3~xaf$_Un-9}S5 zj;yv;RyzKi67z&)j2cc2_Z8&ks{4vH=~EEBYn?h3d}RFn8*?O9xp7`v9m6K<=TOVJ1IFedyAxu3fAt+VcXw34 ze3q!?H%~Ce)b{@1;3T-1rsGevkcn7K6Gp3XLLvu^V@oM2%TDM0zCf2!h-33Qtw(jqovDWv_WD><_Nr zYaU(S&0NY1%ijf>p!6DDe_e3&`8=lg`|@?&=EBnL{+=$#)j#J-7@lcen&H59OGIT$ z91%X$PQ>8pgD1stof&vt=79sn=lhJ8e*#IsY64%IhaDwea-2q-b=27?4}@XV>FG%b zdGbLw94(I6xrpFtS1u8#6OtpB077(R6EMJgD9+i&hxxcfe7qgcf28Y;J%kH_GB5j< z;9B#tzV@MQV?C=M;idrt*nhb7Z*8XTugm8TY$s^14z8dNu2CW68xin>r;9FlDzEW} zG{@`2UUOnu$0&T{{^WXMf`OD*(-j{=Sp>WvRAIdNb1IF{u}8(Rt>UO#N**=GN6m4$ z5mf3&5MgFBNh85koxnwBFYQ~W_#2?>_ZjpVjXnh5>l^ddPgcZv6i zTh+9_u+`hLUP4H0G3rO}4h~1d)Bfq<=xzV_tQ0Rv_@A`LocjG#EFVK?bsKu~bO~U! zVHc}D>RKgTWQVJ_nB~AdE|?qwzW3fA{d)B7wqe;>W7#&LEPtMx zDQF!?r<27P0>MuxD4%)-?2Wg?1zR`g3r_zW_&&gvk;JrzRovj}t|f(a)J3etxn|M+ z4#U-_3#RLae^<)A6@EyUGmw`e2q-y@2`TbK$Ap!KmpxXzOI~4{Izu=cMPIUDBE!>b zoCq&;4DiVaikjKrCDEK54&S{$**_c|{_XUnKkA>Jo(z6^e|k7X$<+ZN*f}?_U}Ob( zv}0_13WGI|vLdEyx%KFsb#S{d;&~NkYcfn8K%guM(JZ&sz6IsZ`UyZnH zUGnW=MHbGBLuQHYphHCE06N*#dg&Ent`|;T#|&!7@Ft&YELg>GpVR4LW)X3{pZqc8 zb-*3y-`>8F4%?JUfSlkUCr`#O`+)ETQ+line;Apl&scZPR|6Sv7n&dx<#iZwU#3DG zVYQMViZNgW8+GA?0}+d!!s7T8E)x;hvZIUsxrwJ!>4noJ=bH$^L&SQ-ipx053p$|< zt0F3-*(Ay~mI_~q-?>r27+JTQKkM6|k@TTKsMdiimDGU?=zhDb!l&I!WbaB@!}2N$NN916BvTxv=YTQdlSx@1L)JoZB=L=M zijz_T013;Df`);HK%>+sG9Y`~pzD<&*B?b)3qsul0U5`7IkQ}8674|8wM&y7e*n3v ztR5TLn|s5Cuf}7~8=%|z7;%-wLyN+!MZ>aRv{>_unyamR9MmrWX^>o|%dLMVLOx^q zcY!DvU_o6Z=T|jm;W}F(8Htuql>O)#*&gcl_uf`@^lI`me60ocA(k+MM0^Wb%k|6Z z5@T;Lga_GTsu|_@(-A(^?IR{ifArqdxlTMkhTs%A#2n6vM`X#;&_*saqIF|&hyeY# zaIpcN{W_C(k<&y_XJc^ckCyaKRIT66PFc!v?XjT)h$ZVdtVW`a&Jb6TYlMMMxV5#u z=yT$*zBtSZ_Dp(Q$^gs2NYDpQ(1=~6<8+GbvxJz{KJu*WSio#nujc*$f1-&&P$4Yp z8t@c|0?cCo*|1s@JQ;bc2TPH9Hf@e!-8yjv5iN|hOp`-|8pt4Tp~8)0XJ=>=+@jdKaeg+o<;y6yteg<%Xf~Q9-fe*CRVrNb;D{njU0yR{ z)#^?w%n}N1v1Z&Vbe&pgcV5yXpc|Is3>~bt*}3p4D{Wam&&SK!=|uAl%ygv5 z75e2HwOOGUKuZdK)s1Bgd-t##7;-qm90r{R=7oLhHf3aGPvvQfe`%<@iGoR*bP8m= zFu5x*teV3_k3+VE1&%6e2qP!ax!&?Cuf{m!xww?`%)@S}IAN}PFQxVk+yk;pQy{hs zYW%Bq03kUgMYeR<#JF!N8qUO{LgV>&uEoofLkb=!ki963A^Awa^Hc|eW6edyd5&o{ zybI)8WRS=u)8Ygcf7dAlClu&6QO9H+ic(mCMEdyjngC)5U53+KVFV^^iHhr7vec)t zld{@MxZ>j-((nzAJ!!>7<7Lk-kL)g`xfT#w=eMShQ^1=VAvB?HsdEHrlH+HBuk9r%D>ZVHf2?jocqSqwr$W*KpGk`G zDpp!#3C2pREIHzsqWvC)Iu~bb8Z5bfB0Nfx=oGl0(Jsm>P38=abD2#e$_vc{gBR8) zj?RqWSWMBIovlPRSY8~2)aXj8+2j*uxHVSVh$ygF8@o5wSk2yzAeKJoB?MZjk38Oq z=EcIJPAsiJe+H7ga}nHYB}QB8!EIB0P!7TpDxs{aH7@+mmp?y12&g!fZne~XdMdf9YCUS1I zm7=+**Qdmxmidg_^t0J@ff7)Dg#TqA z+{{p>*7K1z(r(ICHq{Q!3f03lJ%W1d2xS02=t8%UF>MKWMrIpF6 zDEk~umb>R{)c$raJez1X@n;~K4soDQcx|}aBEo+za-K^i5U^F?3*9Iy;0?4?Ae5sw z*9(f!s+Z}4smx&!To=WBcYFIPO?y|ed5KTZzWXZRP$ ze*wS5iI$KTp5)yPUs7Fo-2(-6PcVoyxPbQCIX~BP;qpt{gJcrjx~^>#I&LG6IoWW% zU`2Nf`iRsJ9JYwqkhcg#iJv7_Qm#Pnt?Qv@o>1>G(TOc7I0141i4&_2A^$b1S0o$yMm_tx^sujVL7YbaT$l6DC-%aBj63VJ!Ygn93${MvWz zM=Rq;1@!lji7**^HkWFkIM5IpOwj%C%WoTy!d5%qkhR6?51B}PUSD1(YH3%N;67a4 zEa&;v!12q2wK(c{m`l3kCU-zDu9({Ucn*c2yc8pEm(KODP=R8^qt~>&-+jZUBnz%x@uHy!mqKwsD zvzs$pHBJrvDeHQ_c6ZD4Cc)cEOCx1r^bX+FqE$Cm{~`_$E9{`se=NRQ)h(4^tgy9o z2M1nVDJ`S=*&U&{C9s+cmF5c8wdLNXCRi-@Qo%)je9Ut|zHOoj@P*b^z9y#Qr>U&9 zzRp~N@wIO=ml0U&l2=Yv*K`pqC-QSIi1qoC7^j4r(4Pt?DEe}+3b&cF&b-FB^1f)))llbV{ZE#RPwBIqTY5p%|cpfo|4`I7Z8 ziTydsik!Q20?UR8ln?Q^3a|F%WGw6dHVpo;h_XA16(7(MRnG}lr5I4xbYu4OnR$_$ z-yFmStsC6IzwHG(=1z_W#Q#3;eV=!N?}IM(E#AOT_yDOifBsZO8yr1yy*HkF2**^N z-@nhl@OC66z-}KQcS-?#bjgf#$-r#D0elDUk98~@3W(8>fM-h`Hsp(GT}s9Vp7yr4 z3CX86l6ZWwQNl4y?z(5t^hiM6M!a*WIdM_z&t)d7-_EAJsK}zI#{r#c-#u+}BzJ=Y&AAd>`IV`38s4#$$k}vt zt|6|me^s9U3rn!J9soJZ;onqCjli{s{)Ju3p2xr>IV?S+%SAF4lAkRL<_paU53fWd@0tys;i}BvzFt8W^1FTT?Ar+E@xEsfO0x@VL6M>%)@{d zdjhb?OU{xkROcxJq$we(7y}sD!w~|hlJxk&e}?XNVjO|s@#O_-HPT0sva*%*szNtbYvx> z_cPWZzj~<7f0T0Q2-!ZOWt>yJtAsb{AE#_*fC3c1nnE3+Mslg8rw;+|*d3w1PR_sa ze>RCZ`QY%kO5#g6Dj-0n*i2(Um6BdtS+ZyjuA520_xP7uqjrS-S{E|4fgo1`Els^^ zE;fTMV7wU=i}^INkAt!>W>TpyWFWe`mVJesA^ov&n#qiS>nCjbj>llucycS15j5c> z3-Glo+}K;_vdXv-0+IC__%JY;xwA!ze@P7fx>odw@({^Ufsx%PFAB{D1P4WQ;(J`B zokP@d*94qMzQcY>bk#Iov7!3Jw18R#z}?Ny-VUnCIqUpXaun@-KM}i0oTyK@o6MPp z@VV@PLDhC-oX%!xV#hHwM4kvve+CI; zD41Ux+pdh($5=AuUqq;@HgL4yUUl-;(j)@vV_DeJ^&*IefY(uPbRQsab)}>7G_fxc zwpBs2jEleUm~6XhR2^f`8R%g=dpo^>ilew&ISZwlKa0SIyV^`Nsd$?5YJAqrl#OBr z{n~3hA5n-kQ|*Tj%0&=gk`heGe<*;vSRbm9aj5)Gw0PziKZ?=@Y_(6J&?-m|xC+`q ze&WbjS0)XsfNXff7$c2h{lkP23FT!}|3E2V=2*GeqS0_&YHppw z{R=S&8)iZ2wJdIow!+~|A$MMdJX#{|34L^?ShWM>%N7pR?A zQND&uQ}dTIrg@XSq$PwKZYw1ap@iFDq*5G%?K>i;nkIWr6)CGy_)Ffl!9f4Cg1~@Rtru+ff)|^{W3B$GhY`S+O zAR{*SxDhUI(|7??rula!;6ih)<){eN-r^nwqSc;_S0nd3{(~Ds_jFWTmB`xD`5AwK z)JOURnXZu8a8=|3ai-v$tJW~7fxWNPHd_Xgn@Ay!wMriF(V)tme~~?$9FAwTlMq^s zsad-;N*~~{*!O8O-(ol7!P1>H*&1|-l`>7~rQO@i%C78G&UqaQ#ype+l3DY~lP7o# zfEVi1NpyhM2)aM9sW6`K=@eqAKMVhv;(<6GCh$uMJy{07DEFHEDG)y^tvrgb1d4^d z;FuQttj9{=bM6=0e^Jel;&T&SUJe1q!XSHVH zZX=qwJek_na#ogb7VO!|S zuaiYrY}Oz;`c@R?#nw(|Gx*D2KHY@bmCox-vRsEbp2<+_oe|aS*p@qdD&6Dhr?K7Q zB`9KH@S*=^a4=$&FgiK>W$^B3=rRN%_mIu2Gf2qVN?>*aE*|Koez-e{iZDh3CCH?gzy(oXA>*>~AAI42R zm^Hl?qu_ZOV{j8yZ82x8Y_Rbr!rJIb5`lzAI)Tuic9N5m6aC=?1^={zg2YGWBuQ6N zIt?b#Y@QZOXdQz#LR0)Ez8Fu_#RPv@0_ubUVv+)cf6)hFM#j^a4r)I|2}C*xWfT;` z^Au-Uv+e3-w&asH6r|e z$dRqZf0cV}>cf3kV?R_4*+exIOoy{oFvie>^-~1G>X>!TvDW z9Q5-zWSi`9d>M}$Q${%7$^``1kelzV4jiqc14oScSL;9`Ab2{Uy*D~A>>q|}A#$7p zrX58YlO92L7^bWni)p&ixEFc26xz`uAHg`$OH=>Q)G@cpt&ivG8e(}tM_Y=mJz@{oaDf$b@8Iy~{`)tlqr><6 zfBjMacrf~Kcrs*amdDuf?{RX?xTnZ>^(s(Pg3lbasPNM#(tkH*oD837a)6 zLa$^|IKGZ1F0U-AUJf!U;cFeEW&kdK5KtsLrip>(1*2h{{(C-(PVmMZ+mjVw-ywXb zQV)o60L9#kX{Q;de+e~DKyXv#jN&1;TM*$X9!L4M&H$z+%ge$a z^97QKG_7f@GRv=Wn^(9#uMLLgOo&mnrs-I_xS{K4xLG(#i@|J87Q|@cI4SR#P-rKj zYH$ZmHXOA3?btU+FsN6HSm&(#O4sIvK?j1xAJE32(vGamnU2vfg$hCRgmu4Be_q^L zpVY=qr!M?tweft>vVD;XX1?&Z-mq~9skCJ8q3Y_rpGC7Y^Ca&%SadywG*I zns=oHUf1;nZQ&+Dz_4482SKj>2$8#-$Ptg3dXTDcTuP3nTj|_){U%q2f7+vXcCpA; z(UJ*5y@pKXR#B2&E!j5Tqruys-VY7knW|Ok%?XxZ3KK@oO0%nNq5ledTIZNTV3bwr zM1yW=)B3ARrivw#>D|c0D&TN~eK0+_wQhTg6v;)mqY3AQQobwXSLRS+I z?-oVQL{qeih!8O9g@h>CLQKGWSugl`|GjyJgk|JwAPMdek_kbJe=XzX5*#}69Eois zt<9C?aWRCBcwHrSQeFl&AdkmPU+b8O3u%7V!GU~@vnSD{d&^sQ zQR9VcH=5Ac0vCrfCgYjDjGlToX;vQa>Ls%@%smZF-I6E32e2UnhY89n1b85I^1ChI zmjRxF4(pp)v1}_eTL6bj@b=jaz=1O`9DgjBs%RZh%ja@8f9OkZNb)0X z8eb*iE;de-59bmlD&?pbd&W^A_4C*0ZX3l}Af92+QIWAwB&RYoLJI)}%;8REwHqfW zMRtR?jP+)VS&%Gd7i?14Xvy2rfWS0dB;#vuixSMok4&^wH5lHC2E*GG8kAt_8l>ZG zJl$sWmc;)6e-AA@%D#;0a($HKOgg|rI!+(o`C2t#)e$6K9-_NLLd$l0)Eal+oCGQA zdr7WwTV8A-Bs8Q{o5lZx{JDoe4Y%HjpRh24!s2V)sw;EvisHK91BY-!xS?A($x7GC z?lMR}HKn6vf__@M6GW>{St%FGjxN0&!d-1P%*5$>e+KBfRCt=aM-bZ|j`w@oLMeii zi%pZtWf3LpukX6OLV?8f{@~z*lM@LnaP&y^{O!&;)WK97^wehGt7^lWtIm155~May zIIr>ulq_-Zsq{;4NC4#-*5= z*bP*he_@S}!JmAqAiUh$z~R^9Auicy4DmWREW98A3r-tgMz)qJ)_IG=MB8B%%0h|4 zcMIYn!8$;Qm+5qx-hk0T)lkqo2Q;Srd3>ryl-x`q635|1E@dD5=C^!$dQ7Fx5C`Lc zjRl4-QMEy*Ibee!o~SCirI)|;uo=dpI3fcPf7NmGRAtNx4WKp(rRW&ez&ab!>sQ>6 z#+XrXm2fd;t9ZUiA)|s6BCX#rX?U!%e`^EOTa)6TSt}O50C)*O2Wtq7 ze`cT^3Z%B}}d9LJq5N6}+xL})l z*v{5T*(_xnc`e-xhvB--UL|->ID%lPeH*g&lPDMft|DsCpcFS+GOIM1)se?q^9R-qq3P3eXJhPEt;rlXh=x-+>4N1p6w zWfozz!xail|LuUGiLt|Z=QYM`qRnV+Xp>0Fnf5?zsiD2D(4{tlfyu$lgoP17z!}1dLbCFRyPL1RJf^D&$i}Ox%$5K%MPEsdY2Phz zrvEU-T1k-E56t3D0q2ZBVs7rz`JEwz`RYa{+f9-++7_=YpFIN9FTS8jjFo}{uYcgMD`mH*u%r5PH)7k; zlHI75%Ka)1mY1X_amFeQ3|g*w(DEVvC?w)p?vS-KR`)bDlV}=MOik%|>v6&c?qQsK zh~LvVQM#&fbKu#dok5h|x3gt%`vXZ%il5MSya`dyfVUjux=!C4O}d-qe`BmNhhgv_ zroD`#J>2##L7WwX)s`OJNZ-d8S-y6gfzZmUL|IGMJ3MtvS?98NLcZ&8qk^>_E~bS% zj$~?eHX)n-LieVCRHJp_Et)yn)sq4TfBB1sZ23rl=*#lg z8TN;o%T8JOwS0CYfw6kJyN*%FcBO&Be#k*V%tf_w%xI9+g8WU%lF-P@&EVTcmGp$_Sto+&a8EIjXm~QbFDeY zm!tTKW62d?!4lj?Hb)KmOKVUIZzS>ULmgC+SH7x~gNSxFd?HC2Oe0$q;@@PwzMyN-Ovdm)-3(n~X1 z$<(V)e0^$8JhK{0(yKPk0tN8E825_SADl7v$>pX>gC>LzD2DYgAC8eI?NCiIplAd{ z+9o2@iZfj>HKFvX>t^Uq$W1PDMS{WzS|@FLVVk(tBy0qwTNk#OTB`2~AjBKu)iU(( zTj^8O?odG{z^)f@quN|Dku`_OztBl*tGDJE)99v%H?UfI8N}fm>i{ZpYuAaOksstz z3Ca1|==IHoiTVs2I6lHIa&T^OrHlq0Xt9z90_bPI^ZQZB=EstEmZYe-^V9I6vF%gs zAsm@tN`E;ON16thP8UpRCl}7;=U=#-IRq>wSvV@wT^_rFI@R)c>LUmpcq2hoA{GLU zas|!QxCfPhZl0kThyk62?P>d|86Z8XgySP7y-smX>gHs{(W+r^5jM~SIz0M)EAbO4 zLJwzFoVv1ldwp-G6VI>I5Be_doIkZDrjpO!;xjYoWslTuZ^3*zOzH>39$Y#(G8z2T zd!pRLQFkDQV|OWlCCx{&k$`3be9n}gcDU|ptBewEqx7(!zw(BG%W=@CA?bCc-{^gl zC?fmDW5uuNM{&Q0^!1b?@%Rus56Y@QN}1RJktiCIDFpOrj$jn2`jFgqi!>RgwNT6I z*BX#BNd(H-Y=&K zd}z);yfVGX#Q^$r4%{P`abvA>f6Lz}VJPDv$T0F7oz-Xq0fEOcf)S)Y>kUf!Mq`m$>>1G2J!<&i&d)s&)<+U~yPSpw zV#4tK`geNzJTg=am`q2#()k_iZ*{CL8Oni?&GHm_Y{O-qM+~i;a5hmjy%VW*cOO1&;_653n!Nc&XkNTi0XE=W3o6Uio;XG0;<;4@X~Iz zxVyfuII>x+;#?8aS)P|@*uju151arv$1CVigGB)+nyPiEyNT4a?MdHVUQ?aJNByu! z=gr{z`-Sz++3tptELzxBm*75T4_oxNaGAx9I%5*1O0_ZAc|g~>P{|hvBJ){NCv{}r$ZfT+0NpiZ8^7e6l=ZGDQ0R7K?xej zv;P2`>0L7U=bs*Ahi9^KM)q2z?_GR`A}tU8$55`@zsmUhO7a|_ zL8|V@T!-xk1OGx(jfHn%4JdDwOKp?GSi{Pq$S`i|y=!x+s}gCB{)qbKW; zG#>@eDJ)E#_vib2a&#)&hHNB`Vsp-JS@0_go~V0h@tL1fD`{a_w-twLEUv%M8*=dkA6{5w1wagowOrmZ*)* z-IC6Z3sR~9h@INLSmLStB_@HG7>ahVD0^5wu8MCniL6v9ZrALkmG` z3qyWlq+#{hVBC@LDgB;&UOSe{HV~SLW2LhEGdkz#_4wjGG4pL+K*502_(3-U3iI_7 zPCT&Jq&F8HeVd%k&hr`c(b2Xgl3Ms^EZ5q{+Vf0$^^L^v)s8=kMxf;cki)jNL+@|x zeb3*FZ0G2$6jeE~wo=r;Vcr?#KQ^aK(o^E`x?-EFu&Y>oPgh+$a0Zal}L zvz>vBAea(cyn%RdMIEIyMr<*2!|nSKIY(^=)1FOJ$R0=`v~99>s_E=IuB$g8ThKG@ zzdFfa40pJq>ig@bLN?ks8Ko?Bd1dTYrta_rZHEt+=ntbT-;{sk0j8Gbb+wJ|YoXs% zGDknvt-q=F%#yk=f2`*{%Cm$v7k(EYty_Exjc zn>4S`ZPAbL(L#RGT2e@7{_1Kup~~v&@TWo(i+m8fXm_g)Vxd}pG=@XH4OhR*xR=is zomtV)xZMK}I+pt<|Ls$5hn*n=AfRR*AfO-rt91Hr%E{2m*4fC!LEqZg@k={(aKGE` zHN|%wRTI=v7(JGTv&%$S!+p!r-E9!9mqp-SYeol+rUA@^ZH~sv#-BN(zjken$0mx0 z)pZQ)L{4bp-wy1I+nI=W>3?;iOYje=kk)t}U17Kdc}g!DbJ#n|&@MhBxf`R9QMcvj zxMXfQ;FLn1oXx15&A{)_7f4TZZ%|LUra%Kt`;2$&+?CL9iVJ}VgL<4;t42^6eURRiZ)qWer=1&1FUpA-<~r0@cCIme*hHs6z~i`Vf@`mH_L z*u}@8ZpDfxyWoEI?LZjzavvOpD=pfGAne-#VVJvuZ}NvJ?m^D#K=LytB+3&E0`mhq zhb;>y%Mn2j83ZdiJstIa0SKzMgM~HaiQY69(D9hu@*lg=!8yZ+>K!K@XTL%Gy%pPL zcxJ%E(DjE8M_QDal8fgQoh`ZA-pZ2;ufH-m1ys42?`iP?WXQQm%~%ybKl*6G478SDk{e>uuyd1Bo0jxQcQ&zyhK+g zCoeBAC(PorYpzE%J$5yB(EfhMhG5XFw(o$=R*pA0x}QKBGAPN_bYl(#dv$yPR@!$l zMSGvYGdeXx#2GzVw{vTA3kDx-K(1+Bxa~AJDLup~9k|00e(W6YP?xV&{chYGKg#80 z!Jv5^S4x8ob28v2H@}Ti=Dv~0Ut{{hqug{0B^RSku571dQ)e`T_yxiv>gQZTY?cE2 z?k_LsIkK23GrD_2LUZ&pd+s%U6l4RuTvc;3C0IPdc_707bbFHj$%>BdhMa8&l|g?y zVs=gm*qmFKnPHMsV50e$eA9isDC`Dgglqyei_EV)`2dt!5AToJY;J`D+e7qC5ni!JB|40?Y90P2>e3;gi}x9%6l}`f=F`xDf<_zts~f1xi&WqF@5qR`pLl< z$s?`dniLH~&F?Du@?(YU{_`8mCp)Xd`qJQ3J~;l_0SXgc z)a_T$A>KnC3+-5C5V*}MU+yp_IR)3@&IsKGibfsd57Lzjy9<&w!7B6fjOzD6@ zBG~4Rk9^{Va~@2$l0Mr)(3mCrQpEUeJ##iWRmRd{I=yx6ON^l2$A^ky!U2kA(q?rt zdNKqKrz`Egysdii{dms14oOI*nJprzEho2lknyO_--&|IGf94Qtn^5H)H-u@1W8W) zAU*SY*+*;{>3JT63)rs!7(88$?Il8bf1bRW?~k6X6kLwq8@U(*;s-h8_S|+LvPmj> zx5mVGP9mv{ei0R01THYujx~)!%1Z*0R{Ekyyv5lj?e|wO zH?-UxvrsW4=nU_mnZ<~J#sv>!(|Ug1ZB9xAqQR(I&*EN_z+ORNl_- zrSZ1y3*QR;L9Pw<`RbWC-LYN$K=-_%PI>f!Rq-U4?6A3e#GD0+@d{fMk#(zWPp3rB zs#?u{YP?)M!bV|teZet3pp z?+ABPlh@5L;Jf~@Io`X-LE0@S6W8ZW1cjbKPNPq{fdsU6SP;dI$9*BK*_aLZf~NUYO$-k z#KxE+NtH_ zz=`MOapS_NI`GPt?>yz|q3`(P(8X;bXVJuq-OH@50dD_8pUJ!~X^Mp+HUAZ)fjx6$ za|0I$@L=!Iif`c}<;Zpl{z_GG4BNi})`|j;DGaN%VW_c%`dLjGR;Zj}Oj4-?E}(fw zx4g0v14;Z8zWcPnKQtILq?+367?}Wei2UQIzjnSbHSHY)N2M+Q1*M022p9^7RTd;= zq8vc9skm`m8iA*k+E|fz4?Jp~*H34}K#`#em^pi!>%oiBTS!LeE0D5CIz{l+(J``D zegMM$l}F1$;w2jx$N!7Qr{Ny_m?(ohENd-nHNrwdGM*y`+7`B`5Q(tWzh22M$(y1^ z^XbD+&}{g3;C%9NdhLji(UX}SlgcUOoPv|ZQxgv`_DV(uLNzkq7y(#FITTH zmad4?hE@YdWnr?s`_gIJoC6cOJT7e}J=`%gTCt?(f`gHEz(?8vWn}UCB8|)j>&h^P z?Lxizmy0FgYLRnw1Ne2a0+QzV_x11($atHVm;lwW>Cvka%S4A8S9m#KjUknv069ng zYm+VUx_hE%|L1H4ovL^B9~Hj@1u~#Ns5_Xp(#smnmE!-H#qi_P&0521+Qi2s z!~%*+jA3jRVM&krJX1Z;ibr6q0Z1Uf{avW03Vx~u_KL9r5NSZ=hI1nIaw`@j0_ef;byQ>b*2Y{%M)W7qlbaHPi>%5iWzO2DmLdC zwdUoeFJ%pcQ+|DdWvcm_4`s!hscc6_X9qe!i02=oBOF0HZvyL7oty_t0Z4%P?EC#7 zAQP4|s4PN@94!o)P0?xd7*M0}*GHG^7$)4Ecq6Y&;ro7_9OGG_H&8rpTd=(2o`M~f zW_Ci}d>*qY{GQu80(#_KzHs(ft+Bv%@FimhWPoxyBLJ(jEgw>&$A^E z@(mW+u5luhE4bXZmR)ewuX04T$BN*&G777drmgbCH*=#@P15E}!d`>SSFvn$ua$cR zdsjOHN32gmuBVp{>NQSKw_Cy8L{Wh6t0U&c;#yh}(R1LsC>?EC019;O;tN_aH_Jg0 z<6ltXPZdFLVux_hUGp~B1MEwrYbo9xWX3jvR!EprbXkcn?kiifp^yvX_>AJ`dCbj1 z#u2^b-RRo;&);XBgS@{=04kxHHz3chk_slN@AQvX27Qp6AM~fE6XH9BUBIK?UqDlq z+#?cA>9K;?aOF&d0iKA@M@*0OonF?WERKC`tFBEUP;0yl7`cAVHH5pxt0UI4B|13b z;^z(Qq1%HGT={Ac@iWaQ*!>M^AxM@3)cISKG^#4;bOUkHZ0l#lNo2~bu1??m4m-_+ zpG?B3(1d7V7?t*@C-pkqhw8k09CT6P>Z5)+l^z?B2`?XpLYFOy$2w|JG`5e` z`QAqjA{H)Nw>{(l#nT$ z#zPw?BS{>xW}r&9D5XWHe>sFZZn{Lc$W1suIm58$KHs$ zZM7u!Q8(Mg@N`tAbEk!g*Q3W03(Vo&Y@gVz1)~3yWRbys=H5PSnV-G5LIF4>b2Jc# z4?yo3<-_IU;*`5aTUCfZkk=@CSJu?l6=8m- znY%Y%Y5bID%Rfe^5yc-QbdZ!pk0>TcFCMc-Rbw8x9|)2_nOE zbB{-*V@1+loM4Smf2A@-_tZ`LhhK|06`)Q9X^ppZBNfB^*Xa*ju1>v+Od9QSBp0#Y zu1lL?WvSGjM!i-t_4DMtE*w9l0}s5Komdn}SuO2&nuvvyxq41h%@=E=Qr>U&__?ph zeN<}=>&k^rP;q58q5=XkYXx?ja8+yAQA{{9whrQAoJrLh`6CZQ^wsVlBgb?~oB-$j zGO%lN_Y~ZRa>3V&b9>xmZ#C0-=IwCwVu)E~y#t24V$7UbLKzY9&u{9nDSR9-b3i{c z6eaEVb^zrl5nmMlkIPR?BQIrUz(7E5pg=%e|9cJv@XyOnHs&_QCbm{aUl|lx2zO-;@CmPM*2$J@fh$;gp@i7XTdWtpp(=+y&7_l^M}_K zAMQ4%yO(sGP}_w5C*+xTlLY(;Z~hWo{5hCU!HNl(xXuiQ*V5oEd3^6{Xrb>OJYL zCyBc>_B~n2vWMU(fa8f1>|;qDO8|!kM&Zou50`6|H_2n1bW#hHvjPe#E%`uNta@n^ zPjS_!3cwNlxm-Q6db@wUwV?)&)7Pf;7J%6lD(IeH5l~&TugSofqGyRgp6i!Fz= z+dOs7rW0LxSr8XrZ;@QM;__8)A6T%TDM!ag5qRt?My(|dkY4iSOz`~#`bQKi)gF|H zfB^xa!Tn1p{$~(dIywKH4EzFdl-icWfeT%!^5(GSfIvlC}_Uu=htx2Zqd3`9s5&|=Eng$3q3QsRzuJm{? zwVrF;xS>tpxP~dhrZXn5zX1~j8R}R8@D*-^kxim{GI-3F@9v)@;9&xGEw9!hu7wxlAy|TZkQHzj_dQp#&L&adrpUqqVsrTX_ z3j5O1uL-hkG;4x|(>B@57iKgkr09=^(3yQgIRVRxSwNw@`szXQAK-5yUSSMMow=PW zhs#;S{!zV5N9A~PDswYq_Kt81Wi$G-L(uByv0$vY7KZH>PvOZcTj*H(Hb(u~`38NXEv7LpfOA zV}YqQUvUzm-u4@n5w&jB8!%C2 zd&D^yXi{BJDobFJBz@iT0GJmkSyYEIWK81H<3|o5r%Ou;7rP!dRp1@KS$CF2U;feR z9BpQxlOSEN>eOvJ#esT-Ts;IeUnrOL%LaA~r1L?R6{4k-%Narq(Lt~YZOcu?&GFdM z%ANrS9G}e9rRd|{$k3nI`?SxVW`lZKApEm<(EY31JAJbt&MEQZC4r0)@MKL4Y61(( zeHZgv?Qm^^Ig~}^Xv;0YKn!6IlX*RYGXKU*EZL9b(cy<$z8(?fLJ|BbRV>`kW&G(O z_E-f?-vA5#XZGk)Sqi^gzH_w|*m6!&J?~UAVmcKRUfdQUy5?<&+t0mi4IgiS`F9G8gJ59y{Hfq2NZTfx{1%uvzx|jIzWHW8QdToJX8!gzp;KK)L+H^1P1i(|*wNU1dad-aK8W|vn zhTBDW>*?Z(UpctnkHP--?BWXcEBnc#E+v^prR~Q$cI@dEn@xt>P-;o8y5@t}CsWK? ze#SU-P-zA(fF4S_$b|2xo$(m9`qh$BG{fOlhC=D)4yMyJ97h&>hVb||pNzt-=4wRf zP-t&Y+AIB}r>Z-EYt4csOU8@nG9jTA(5W0YmUNxEPpHr{{ly*TBzY{}i za&mHfHmmmsDg|xwHcAT?;Y{9kwbq3e{r6r)=Q@<=#J~s=T^(Tj8Q*xwQU3DpqDmBr zPQgu?dy0-EpbD7%XodBR0RCu<<@yD#j?N%lR!GtnLuB}?k%jR+i@Is*`Vd^^usRYx zbr$}3m zJx*=F&mWaLUupv&UFYoatM3%CN^M1^O;!yvJ2}>f-Y&(2-I0GXd}#X@+gF;NB%3(d zr*Q8T6YS||XG+yjfSYPLrGiU=Q27)!>aJQS-+bi7S~FRVNlJ*e^*Z!?t7w;E6?1{f z?929++OSKk3EeVZC#+`?MscvGPyPwMlcgWY3a4x_%zzKTrt>O!Nu5UZhip5~tR7LO zex)1z3Gvx`YPRDP%ie!HFZ)Y{L~W~owEuoWKRQq$aDa#!=NgTg`@JydjZ{@&_P)Si zfoAc;hPG86FKfLfA{96sc5uVTzK%6Qa0?|q1VuhsGtOzJ80)mLZZaVgOIG;8z5uQ2 z0fCJ4qgWjPDN}!p`;X!SHb5=Z@e9;J|C)sUXHXlv**Y5PTN(cs1$|46_MfQ6#YV;Y z3)Qe+s4fLG{-=meMglSacM*+ZQ^0>v16tj)1X;S{&l|-1l=U;P@ltuDV;-7r*1#L; zP8dd$&;YRh6TQ2ty6tcZ8l$PoW$rqS0@939xlU9!a8)TtVF&WmTlrC~~ zbzy+c8aW5Tmxjg!zXdPIDTTyC6?vY9-0}ecusc+o>`b939f)+4tN;t%GTJE zg?Y_yDZ`#=be2$%r?`c8MzBUV>dF>so)hJ zoOh_ka*Eb^nUj!Oyo~9FMMUzFW5M1G=@>ZZ&qNN`jGrh=55P{Ar8pXMceFGT%bS83 zrmxbAM~g*8eo9BvU?h(Wv3j+3>xgKh`{AfgP2Q4aQFNap@2$zhG8EFX>M=%?4R><*6Y_ z68}8eLu`G_LmGrrZB}kTkGdQsIgi^X9XvIa7@$L#UF^F+c#`urCsnYMh~%0Ym|Jf7 z9!DhXpuOu{VQAI7CsV)HgZ?zo+i6;kegSHGU1>Jx!#pV5HKhs8Tj|>v8aw=dM@Rjy z1O$Bj)vw`M+uHnpV^RDovA#kX**N|~oRqK2FM^2SAOCgzC%))}^Pl4YtjrDmo~qFQ z$I0K9|F46tiMf^W*TK!n+2QXk4V6kgHoy20I&M*wj)0OWsyw6CZQ>0-N zZ%j&#gSqS%5bCP%P1vzs?h8WlK@P@w0irq)6t}ZzipBzKujbJ^X3B8!2! zr358Z)}SVh{O}Dsm}Akak%PH3MWM1!K9i!*^?YuOlb7#n2e*^zH~w|7Qo`s?I2(_XFtc{gQAb{ykdu zXQ*rS^^cVwfnRhovt2qT%NMpkDMq7RaQiV1yzbFbe^RrJN^eG|@mL{RvOqsSYb_Si zb}(3IF0La%;orO-EoJn9M|Be_2QY^@v^vc0*k8=6%~CU8Q2eY#D5ED6WWYLUOGWgDGI<-uT^irMS-jOcB%S4wr)Bq6h{g32P?#Z= z&W67H6hVEW)jXu%+G=eIZBba8_&Ft9<0ed~3`s8;aWh90NQD%h{qB-u^(gndc_46frzZIZg=tjh2 z|Eiz$8&3S%_CML?FSz^hb%IKL!5r}QX8mWl{|Ctb{RHrDY-8tOZfI^}s{0r0=`0*= zZORW7fq)D5-`4$SCXw@5H|DL>MF>Am+bD`Cr-af8w0K z@5cW-#;?cvf|`u&t~f%+t6E}wfPg`U-@3Z}HA#)345)&h3yMhG!ZO%h#mR$Hv(U1_ z$Ezy#udDOGKr>fw2`jZOk9!^G6wV-OyxeJwfH*w>8KloB(aT&4F|#3bE-^DAb6=rv z_|}!OpN)ba3Z!C>GL@4oVSFzI@A&s0l4!o&gV6Tjy=L$^F{$~ko&no=u*6ve{aW;B z3OAVS$i0lnRr+KL*$hM^XhZ8{CQx<)@I^3K&_mJ#T9K62TxwoCj0C2@NmY!~9_uUuNl;4$#FW;(g^@IK8CcQMz7~_{t@Ul5p%C-#A}){)Vqy~m zA`d{Q^nVkJupX?om4@j^Q$S@qB(TSA(vCXfNK&A(COjyL4x%=DRE+_cd!hualXIc) zMZ?Ao=v8>~3Zfmok+ncKw)$l47T~JidrZxed^cT3L<-x(T9K^6lNcJ_k%JeoTEHaD z9No4WQEV3MGbr>)hVOSbe08)LqLRM)PpEx$n7|!+kcym_yraR%hmsP`6hR!(oJozO zKnNe(^azX|by62BxfGXNVjFNV*3nolt$LJIx+ZETPwOfp< z)r=GuM)5znh|cKoG@PN9+{%uk@^82s}eA5H6Mr z_f~PUkcmihZiRJID#w#lMV6g)KuSw3*&gCM#mvPdhe;=~uG`B1P}GeBL4c0k=1ci<~rm2GWWL^l$TTAG^T zEERuRW!`5pYgJElJ-+SK)eGZuxWRLDK`$>(dBs`pbv$&oMLk3IW~g8YmV?<~$YOf? z1zrkrzc8N7i1};0do@&30~X3|+5eG1x3?OhxFLXm5b%J2*#1`n{Wt#no1hGBZETDU zoy=`*zBuYaW5Z@`5UF!X={pii0kq^tPb;L>ac|>+(oTzmKBWxE5P|BxBnd#!VP(VE zh;aBed$@Al9)w_f;!1xzCkPB#(ajubmw z4<3be2wHv!oJpm_oh50S`*aC7H6kgmBB3~6Z{FXhAUY0EL^}i|{em}L9}yNjab}ow zOi=*}RY=Q{4tTf1<%Hdlj`;w92XnSoq&}u7&YS!}#Pl22{I}B?ff7C1eNXi~vcp%x zG!w)?D7b!3gb_9Acxp4YjbS@fGla81Db&CdgvRlaxD}N!;RA~(8K>LIVQ6|RICLJ4 zYwj{a;^IETd835k2!k7uPx9sM-BfD=L@cHO?DXe=A*CpOM3oFtLMZ@`&TkbBe!5LG zu6{vg6w^Uigs~zFh7Hd!>JwzM%q(2o%B3?xX0s5%s%Xih=&HEs6DuBuQ2UWHl3mHK zpPS?gTcBg>Q3BsA1M7=g$;2`DFe-?FT86QZQ$r{ty3Eghm!0@3CdvFNCefwwLqB3p z9oOleI;tNT7r?b8y9Mal=uGWQJYQTqJMm&pZ6Bi1*%YNDJnx%?tEt)XdVjT2kfz7o z9!5>yfiER_gJdGXYn3CUy)6diKM`1>I?!qP{^O2X!`Ny-pOn`wP2QzIYcMy@j4JRb zKbay@$U0v9f{XS1emW->YhF}^Pi6j$wlI`&spC;T@*}(p_ZpzCEGxRx8zFoM&#Kmz zI2tcMcb^PdBt{dz|b?c_5zH)N*b-t zIm>sZp!4hn6@IoiZ z)k4!(L)2-==ii+Rwntcp>?tqFLF#~Sw$IQ4%U$&pdxn%jPMSFx z!R(Vdj*SnvUk3BjbRn;4*nf-)1FT={n^5mXbv&H8f<()P*Ce+|-#mFjQqTCGqIyb! z*1ggK`UUiH9QJa6<3!ZgIptfwx|%UkeS|JIMMJh6pp=QBrT0)Pa`iI&0T+&pc*TqO z40mXTZBYiWvj~znxH@d1!iOhWYwwFgEP7zaQk{PUAq2aT`T!GQtJOOj~)b=(A51NX<0kG z-28UdZ()D8Heq$yZCee$fiE|Sa*FN1+P{}6GCBirhFO?Xqxw#-nr?pfQK3QuhnNa* z-c-{S+gnm}x4P))%0f1tc)ig;R3%OAZ)#uN@&i{Z8L z^a5Y(lC6{*{82yC)aM&|Q&^?X&>Ib4$4QdMMIdgaCrRkA-0$>7sifreTZL#=YLBd+7>0LTr0OpSDq|{4q18 z2!0hdNeWfFD^X+c!GuD#Zz>5K^}y+mpFzCzKN+U| zP%Q8F`Ej`rpUHTxE^iBs9r_N&NGGEKiQ&QZD~+6zb+53fnl^Cv1W|1HZkW^a^Ezon zH=8M-N0jDous4oJ(~T19-Zu}elPVy1hM2k|l^H7i&6Q+XPmKqBTs=W+o*yE9&6wioOH)~>&8 zC*|y#){e&h+`I8^o@5wyE$3L+G+~+IVC`fZree%=4av!l4W;e=-f+AErxj&JTL~6` z4B*>_01Nom!NqI~2zS+im7LVUWfuhF!x>cKn72)8)X{5l=YxttjNNq;lu6LKlGfO*> z;kgX49MWS}2x>#Z5Bb)4>>`dxqc~A%n6%y~5i#6uu`2!|oC1Ggs?D}w`6A6Qkz9Mq zDj>f~lp`oP=S`5DjFe+Ms0=??fE1!*sIU&M;1PE2QfU4XQAm{XRE;nRnn*8)31cV< zdVF~BE_D%6T-CI7lZrv(A^|(4+Oww74`C>245tRec(s~Bx$h2S5nREdEsfCHZo(LQ z``TAx!flLXYWIgKM{3KvJAu}ONm$_-?6J?yv8GsIMCBwAU{XSz@MjAk01L))#(hC% z7E@ykf)p8My*B44@(I&Q=Z8NJF7+#S>LX3$3#TsV>y;7y9`hf$Mv-Dg=Hs_GDlhd2 z(1qGoe#YVyMlc1K^-&`~(=wQjhV}C051kf*+GV-&SQ6^hEQjC%Y_M{4Xo9FC{DrD> zY!yOW5cfu)coWQlQQ9|KCc40HS3GsNNx^GPEuH5?Q?B=02u5Htp-r@=v zxNe5Otik!Xfs1&?9kc$((};xH7nb{1a#ZZYsFjvRN0tlkll|hHjX)qp3!64ZJQxzV z*EIXno%Jjr>T)8Z;qTYvh({HTnrXcTK9^Wh3I*1JqhASw_RC=}9Du!;HQ!E?hH#)D z5-uAAKH->|Qb-5`%ef@_MvPK0=UVKN?Ug1+v*nR<4P~>cA7`0n$BM4-8^$_0?3sD1 ziMz7%Dv}Svwo;)}d8z4M2=!YQ#!J)vb=q`}d#|rEH?8M&RqJRkf|BB1JMeOV#2jRG zKst6>q{840&Xs+j3BVBM_I+`h0~7xIkV!5z^oXKFqN|4j1cYHkjXssQrWfH?9C$f@ zkV0XNH0kLZ_=(~&_>_d>#4g6Ix$(+RmH=nlsjN`Gb;FN^$;7vSkhXV37eKlCrwt|) zt}PD%{Ez_Kyu(Y%W3`|3H6Fy`_D4n8Z>K$(1O415FGAzUGl1onoxylPZ;8@|`8$3I zA{zEqz}wAE-z#)?{j1Uvmq;5GCsVG`DZXS^z1jYj7?zVkW>b0W0~ww>&&`uAr_$V4 zdjS^G{O(4RCO~-q2igxfEhb!@@j2pWgWqC!>EOtxD?QJ80Al8~-!(Bfla%3IepJ%i zQk0%BMIIcM;{ep#Ov21qB|q#Rc({D2nnMM(5FCc&-MCCOv{yWZib;qzt9M@eLmEAD zLo6!c)nLo%KUoMmS(}dTF5`W;%NYp`(WB0WV92L~?s2O@wu3QcBC@wYpEQ4>A}MW*hd^rWThMQvIhW9y#bk}H_UftFkSbht!HjVX4yct%U+Ff zFe{JCZTt35e7ASgclSg(qE;vi0<5gQc9&~>8``OOgDp6)GHMVQD&MqHVGIB0S8w9C z&DVW?lLttFfTDa&G9ZEeN{$?7yN|7Zk=xeSS6?+){}Q?VJ@xp?PukhqI2!93TIoAF z{++DcP`9>SV?+43)U~(c6$i&LR_`*t2V!?-tIqtodV$9U@WFc@8t_FtBB8B1OmR1y?9B0o zCR%-3Wibq-5;TD5R+VwZZGX19LQH7nA_F=k#b5L&awg#WS~;`KSr8<~RvQ?ZYRSii z>ct5e?eQWfLK7QEL2Pf51{LwP0k-1twi4+F`t|p?G@+b^FbK2!xwT}N)x_hln3Af- z?xSB>l8Z%25Pf@<(OBfZ&*1w=QL!=QgL~UfwRT_)c!7YK*fq)FvlrPxUo%1$|dQ-gFXsSNLV*bsPi0(TUy>dfd(9#(4B3#?a|rvAb^KyM%{m z;0n3ihTa6+L)fnQ2BMbsoM~yij)>dX_b&%GjAoAl{laspbc}pT6x&Y`hfXFSxnZW# zuO}8uvbWAJ9cfQ3DB#%}B#rC5Ql2)86)gRJ98{$P^H+kT>|SP+e8JP9?^e{X%t+K2 z!8_35)zpK&IgCTn7!e|9rxfmHpgeqdFj01mpASIXt3dLukL}ay(KsO9nka!NoeJhX z;^D`YLZ=28o4wy9rxj^jrR}G2C<_{uOkNG|ZP`7cBvr|u2~`w5R{L%0667I`VAcgp zTrJr~(}r4Ki%|Ll}ib+)p2c0GEO#2x-SO z84Zy9{K$uIG>@_=h^!4|$Kdry;7w5qusdZSyyp=009;a=mg>5sIS zhscHS$RE&d_@^mi^Q<&+OD@&J+d#KH$rme_)!3(TV@vIp2Ye;q`@z4CDhir+=9_QR8vx!M~XO`!- zSAb+NWqAL%*0|8?x8>qPS3_9VjBIBUrMyj{>dh#rCnrP^H-5DiYefe(xm*dAnRdY1 z3hGxQD3B}5JlC`I-jllZs|WrYD40&TQz7S1lwsbK(JjBHCCc}sw9dzfY#l`t24O@A z?qaLG2JfSqXZS>4{!`9VHW~f~{p$2Hs%D{}4s@m26s-rIlBV~tF2Y6?N4u>WtJ0?w z^aegQ1IM$>88dOAZTo7_J~R)gSXV$ZGi(+CSSP_7+qf>Cm*?i@_kH3}{NPln;1tNE zGP83QXT1S+#Ky_qVwarN^AH<`-MV!DO&W1mK+6i#1_v6FLNQl$YtvVkx#Mz$$!hX| zT!XRW>2&lr{;o;)@Xq&Qzl^s9joN1O@W|S|iL*z;A?)RExUPv$XqYmdiQs@r2#-O@ zG#RlJz{h8sLQ808f5WHkb{nrxoG)uhe4l*H_dWzJ<#$5uZ>^9*wi;m`xghO_Chzdj zp65z_Z?ONEx~X8LFVg$sPyMfLYyaAM7QpH61dgtgyWPK4t*Wire5IDXkEkU_KyvOm zV#ke5Ro(TF^8~Q{P==$40xJgTge+G#vMwJG9?qIqmwU7l!s^C^kj~4Ljxx$R_fc%z zLud6sRsAxFofOe#t8>FI{QnPS?-X8Hz_w||ww;Qdif!ArZB(2c+qP{xso1trv29Jh z>7MSM?t}T~Y+u(pU+diu?#D6+H+d{fvxby~Yao++R(&y#G+;iCGP+qA3Xt5CA448k02>ai-fBt{7l1zS!>Fpk4A=q2+PtHI;2bh zp{o!0t*uj;cFb(9KTNEx8P(rtPA{u_{!xqI?j#d_AGqqwVl3X2_8*Ru=4YxITR%n7 zkO~rFBg+V&)7iN@I^d;%fR$yNNQW%3;L2CYZ2VLC;~!T7A7CZ|9Okiw?A<{Ce?q$R z#j$og3u^=4k-g71w_M)}_1vHWx!Z6aYP|}#^W=Bz@)iJoe?32~5#zcFm|oJXMsg*b zj!DF7iVr`Mz&736uE~euMtDedol@$t`(-{w=(b#n%24fe*x~0Qp+s+jHoU_oYbgJ! z6$VIYGe|3crAyiY=y0?vhqTDR7~q4)iE}-(C{H&`rS??^w;KQ{t(!y3LVXhbVJH)! z(I{hX^0jGwN2wX-c0r6-P0yACd0~;ESH?^zvt>pKfjVKip|$%b>4cNB5O$0ZMAhoj zcSDzN|qOc2?w(iW^t4QQ>09=Z7X48%1M?V%iJeqMPs(6x4RM z`I9K>`1s$hr`^N_=%0+aHZ;AY%@aC5WdY0tmsju;-*1>uUM%^TwJ0a_rFC4Ed2F`z zYHv5v%Nk?AJ2$ez;Cege<4|BMf%o068zP_Atlg(oE*o{tnzC0(87MmD=3RGRb#|+b z8LNYR-wu7g&+4NO)pUTZo35K4D*IX9yDe&d`{@ol=G-i67M>~WAJ0n=LyPvs+8EGzco|6RtJV6_41E%vnk2}V5`a&n=d4ZE=XvI~I$c!4F!~Xi}php&> zZFm#sF^$qWwfv*o*hh*11@t=KKF(76Ja-;TJ45cwPRZIV=B|=IsA}4nGSQ7l$7&Pv6WaoQaAkevN_VQ|#vW8qFF~u*7@RoL(_zH=kN6ibs z4j|ty#dggxfh|=u3M86zdXoKq3XUrN_g>Pw3?+tNN?s`(7vtkCzkJMN6gixn2{lMX zJDP!8S0dXknX~{51e3o6dDSC|HtN! zxG`okTr}>s=tofaKU>i?0UJOc9Zr~HSZMoUS8u;8xje-f1@D6mg)RtK#2rLT0@h^ z##e>&lVz{IrA!9J9&dwcN&Sn`iT67}8Z4z1Ah zBhZl7Fty6VP_$F5f)vCsXhHYw@^+;^(GPxryMtfM-Lbuwj zPvzVv+1^BD%#9IYau#KPRg7>lZ;qb1MyYL}vH&V^fWf4KnJ}fTHEl6>LHLp$hY=5{ zZ$(p7n0&Y-NCLGCL;oOpdjT{wsj?926TGz1lCcaf-Y_Z^ebv0A(>(X3R%+P5x^SRZ z`-dL6eKWOU_9Uj~$4 zWu}J_*KJfq)z+D1fbN&sq=P7kO#t7t^u4NClzuuKmkwHMWFUBSny%hLJk$3^kV&Cr zXE#ZG@|{{V?u9B~m2RvA>zyU?7%G!rrL6i;W;&2750CrXPgbF{``3nM!yavL%W3Ly zVxyihdxWF$y77H3lVOHmy5?*??JRTFL$Ls1c`YMdKj*GZNVJMP)pj5a&K*z;w+BaC zg=HkF#}FtpChZmc)F$^(JA5bm6CnB$kAit&&Ig;}-mUs)|H4=A5Q&jDxo??P!}#;5 z$ew&T!l;efK|)E5k+!t#C%DXknWn~<1a03<22U3 z1%7~QzgXQj^B4EW>E)h$?cVO=7q0vF`>fR{jdZc5xhUsG3msu<)M{50@&xetX5+ft zdxnb$W3V!SnOm9xS>Jrkab5genwIQ^#b2SHwu^ zm{R+v_q)PB?I8TS+YN42k`NS*x!ER7j{t0f3*k+}?*c2yFku^g+*LwNkw>PQU=tS8 z#dHkd_zkofDpqH+!|U#V@+aU%_uPORoPX2X`Lw$|b#)??rDyH|5z(VUkFnyR@^hF~ z3Vv$COX9D}7W9N0x#)FgEUW@8xcOPUKhrO}0E<_e^&m^7u4p71p1~89%ANTf{>-I= z+(FzKyWFXqzi~gmxoTriVb|VjG?ZJduXq8?=-(JJn5oU}?I>)SzO8jGv#X_%bTH%> zQbm^n_p3G-dI;rf$(m4Cum55LzGQ8t9=C!sM8Gx%ZdRXb=(7TN$B zXr@p2zqDgDstD5B+NuDHk0ng-f!=QTl%#1}JVw2fA$J(X=f`X^dv=?b+W}`?JFknU z*?)X_FB5(!W^BLydR^CUJrW#n*f(EqNoes_HPd_EqtdKcwc1a&$cK;ZKy>H})inJ~ zbES$19DbOU!UTDf?Nm!61XTyMTu!6eRoK zW*nz&Bb2f4_ECz@VR#AvSux5eGS=VZG82h|3nVfw%t6z+!Q2@DCFZZ|tu3$Jn>>r=bf;l*|BdI%%k!q0?c(s! z;xr~zhGwJ-_aW3598Bisy<&soA+B7fWDHK&n2}>ph}Z%XQF;x<22;g|Z9eG;o#fLk zt-eYbR1G& z9D%eytSr#nB0xDPSTz{$`>@mj-9Ej8GeYG{bA5egjo}=Uxafx;z0__u2ymW^d|r|$ zpyQ!Ds7e9JS1Xp#CEZ>o-ryi)9|(h!FA&esY@tthq^n5=N8SWXmTdTCFPX}k6H<^; z??47W9h~lcM%?JNDnenNd+e0`nR>EVmJh-@8zURF$vcq-T?9f@5+D1i7de-g*;E4PyfE%;Qn7C zrSn5fGG%J{;8xPFZL~6zQzq2|k%nrO#dF|+0u>oPsrN>(L8GDi6(d-N7?b8I8fORR3Or<4fYTjrz(>gc%^kXBmQWBHChw>dnfw6^Yd8T z4^yDqz;ne9s${AcFSvIS!K%!S;SP5sXo4_zO;W=BVueVfbugVkZ3tN+VPb}`EFM`& zPdO8+#ZdIIcdrO_O|XC(`B4oBU*0hU;svRL1)x2g!HzbZiZ`O^SEZ&hHyG=+moRkh zRbRyl=D?R61G!%SAF2Tap-2gXq5UD$=8y*_ll0L*3M|C4d2G37KU@nG^v7BMmY*EJ zfS!ynL_KN`c7x#`X10Psl>)L8`_hL1@R(dhBL)X^gZ62aj&Z*f9l9UUT@1T!HCaCy(JUx1(AX&KlRW)>Bb6kh8buT3>_9FP!ukjxuPOx)6( z*GowEU9bR+rj;H4Y=JuWQ^4l#<>R9~MqNt}65c#I!SW8@LS(1W8^qMW* z7I{*D^ym~oczLDfVGNC3_~~qES$B>_=pV!2CoG-YeNp+murnw=;Ipu270m;GH?z-A z5G0>f21+&>?~f_)JM8ANet97G(i9?W6(P;xp2r*6bnyFGQy7%BSJd=SpjC*40?Jv$ zsEuG0IGq=>N#A+gr=#Daq}Qug_XkC+R4L0~4U;+`SsfQkj#lV?-z7?V7_{ZYHjN{T zQ-qeOtDa!^-|y!9wR$KEuq}6d?*oieCQ6Y&9L-TFX>2$iVrfo$!+W%@%K`xlbVR?XAM9m+Cwt`*pd`kMhJ)@=N||*K^M=Oxod=G9 z0I?W-)*~*oJ(7C+i`dhARxJYo4MDV;I6l%STQgh$uNfj8_^FJ^B~FN-$r7|fDB=h} z)8|G&+XK*r+hKMPmy!moNwXrVk zpace$;t|BF1fDZFHLAgu7sq}TZAJP_Er{a3CMx=(^@8s(1_E{ZG>iTHc%?P?{%Nuv z1SdjMtu4a`5Tu2M@J6D^A;;-T^LPvbyBS#*2Wy2CZA>pOV1fNTgB@miImBcItm}Tz zM|!rER&e!T=iJM@v2O8k%M;-^3WIc@rrcy*ltMC;H+6Mws{LbeJPE;y|IE)6rtoP% z!fJNT-<=I5cbJRu!}l|TCNfdG;~W+r50F^N-;sW&?@0yrS8pN`Rh$n}Q#6_#sN%FZ zB1;XhkJ0Nno9^l$vN`g2Xw07gM9DXKRma{-MC+kL&*VA&4s9vGQqojR#0!FOY*#97 zeI@;qtf!y$pfz)kZ} z?RXpmJ%O6&*DtbZhdEGIGmDZ>mU)Qi1@C6HEgYPE2r~>^-7hS*1dmZ)X3Nu2>7m?> z(wPK@z?jU4lj`&uKfa46Kkn-~VL?xkEX{kA8erl-oKP3#Gl(Lwk%RJTBj=eG; zlxDPH-B^R^EKp8|L914FjMA8FWOX5r& z|H+ht-6=HDsoTxO()AVMSn-Zq+F0?tmrNFMLbPZ74TD~yUoOn51g!j#I4RzD^|f7a zJocyzNhKVI^91X{O!)52dO|%Mu!7Q##x~BRzQrL|tlqpNj5aQ)4)v~VcuA7GRV$r5 z*+%eCwWmrvW1&T3TS$J5acKv07rz)-;)dhWIyvJZP=pslN`!`DOK+ORy(6q&NQ$7< zo5xSfjB5ceXSSS62guazo$QvuyF7raQQlqDOLAD@bKXN6th{h7+|P{#UGS&F;TUNh zC64JTn*7pT`BF$5s-HbUgS4qFG|(PDI97gK3sr3SB7;!d`<@BLg%bUe?8kK|)52lO}G75b&UhMQYgRcmh; zhH#5l+gidOvG&8qb+SHG2ym!@C#BT9x;f5fUJDeQ))aESo-YT&xi|M|6i=(6l_|GQ zww*bkT=TIkQK@%kRV(47REBOb zA0YUAY*dEm&!)^4q4M~$1_+GPu)WM3+nlUjmrVVWboOPo+3`bK`nK(XvsI6okI>lZ zOSE~4ApUFxq)pa5SH3gR`~vCNK>83k1-{bJ{>m9$0>~a!f%qhu5$>sHRPHjE00`jL zXHzikf}z>?;Kraz=2LFft@<^fJguUc;=_Dj*(D4d1QrWd?ys*n%aWV@9JwOzg@!&* zlTvt4mtSn>-&|aFIIr_ose-X7Z1-BoP`;ioEUYy%xfTY_g}oc(NOGfmg11-6eenc>P2V+LCs!w>bC!iH%_j$P{S zURjp$l-%pge=T(yX&o#+2>%z;1n}cJN5QY+Z-W8>X~F^lvHTbRZu}qB7*$#O4Y8kU zj5^#!V3}Wjz>yNi&CifrP#F<=!R8<8ld33q%A2&@+%8woHiQkIJ_>aO}fH>*t z9uNDYsXLS__b4G_5U~JFk|0f?d z9L)e_mMW7#$tQ!saC=eqlNPSBPPEv@<+3@twtj`pVg&A%qM-TSf$dNlpk*@>uepT! zQ_o4XSohKoU4+t%rXans`ciu-tKxXjpt5X|_+EfrmLkd5`Dw}OhhE_ev=j;5h82nw zgn8qL2l3;YGKw=q>3^}ypd+;d;}_2OM=LS zF?~gqv^x(Ax3xUaP4R06gzBDy80XxjxrA4lU<;9d3y@WD!>Hia*s`19Lkpz<>&bu$W#LkjPq6 z-*d~|Ygv_U$KR`FO)%X`4>(_9c0OND>l1G0!cgIx<9KUs|0XvCG^Nd?I=}WV#SHnt|AVXyT*qfSH%0mXW2sR#B)sq$yjN9y~AfL zzL%VH@JGrgc#9b`*obO$d`4E`YN^}6l&M)TH$~zr8RffMP`Q{o1BTU7D=GKRJQ*xn zR;5QGFo%0enItQIf+^Oy)lJ=z{@}YbbLeztKGg#cGnLitmv&b ztm!WUiwvmWy6-UM0t10q!78r6#T#H(e+d?pqZXi1CMl#ORWXb2cV%stKxv*ZYjN*P zAyZs3+J5_aCbx$8LOShcp4(-7`}@b#q>OEAMz_@wyxm850Y4hXxwsB`<#7;@N z>IK&lt`M`zqY+XnN@2V=)-&HW&b67b-1_Yoy)W~}1Q&Gc_%8eY z@l>rQ?_gcU zVTQ~K;9ZXV0vHAP*B<2#tmzK?eodG+e5ZqaBT2d|O`#@vLTg~tr-OVJ6osAmCa%st za1WgB6pEY~T91^b@5BhnYcws~@DT9Z1SX@*)|o~2XH)0J2$>tD4jUc`ChbujICl#C zHiaIxpYz#u)+tb6IJKO@uu5$mERC?6Qcw{nYcOAS8xV-Y(ol<=_fup2oiL2KzB2|B zgy|xxBOgckvm|q|ZPWuK-d7oX?Qo_=8=9=?r{OK*;*Khq&z;N=#!mN#M5ReDfK<|t9KzzS1=K)K^PB%1|NaWOd5ESatM6?VMLDL1qj>{!H zJ#j2v699>r0vxoK-7J|_gx`dgm?%#3h#-K;Ezngat@kiu!r?2Z_dGJ-i0k5wwf*7g z>LtwgP+R+6n7L;lQ&Thcx^!aX&fJC5S1LVE=tKIA6GOiqBv{o8*ZB#yV1m9t^foEevmcYQ0iM~Q;jqM0%dXF>A%qA(l=D0u+3s$>Q_ z9bn+#Cj8JnzFIthJ3l4~9(9IV7KxeW(Q!D)5)zLX=3sQ2ed4t;P~~E4B+yoOSb)Hd zt!sVRzM(mg6|vY`VwA>DM!jLDUOQnyD!NXnDLMKEJ)FC&>+1`@eSXehmVcmeId2F#57EpE@ zbKVE*rfCm`nvPLfjTNGF&b*?ATg-~3P9VdBS3>TL(~i-W9xGCp?G0p48!E)u>CfaC z39PbEkiV~f%px--U7OzaxD>~^a3I}f7Q^ljUH4CKc@wWzrO@DKM!fx2n^G1x(@!W? zi6?>}s6R`z7Y6m-nEoXoog=D(9x$d>m0Ctqlf{)C^rFvdtf@TVS%|X;vJiq>Yb{V! zK71P8!puuH(S4D-3J|q z?nwe%oSqWpIw>7dchlktW~=><@8U97szvZAHYR1l7AFdFRR`H_?7d*RCqMv)j6J8y z{f$@?5-y+@b{xa|hVJ@0sA`jTD_7~NYr59a!zdqC-)-EbG~J**!ml3@sJZBup1d$!fU-4O|r_Zl6Lh$xR>zc-Ka|(92$?0XDWSBOyX?ps^I|a3p zx!YQG!pX?K&htJGLi>$L6IYmvnYg{Kd{^6t@oy_2OA8WI8yC%AiMhYHi8)Y%t!#MLryBRb)Szm z6Ax?)4iSi$tw}Iz?B?(MvBXZAg`X=FM$1%e9l=7{&DiQ{EUNw1E!%bCqCu8*X-#^^ zM*pCyTP=&TWelT71MoVR)^@#2gPh1AMJY7*>F;!XImZ_pnfbrYfkKp|7>)GKo-==oULGZgumc}c>;tE+x zU<+FrzRn0stXMh4sX(EkNh%*o1B=t?{+W?frJ15GR>IV56aX;pj=4n>-7Q2t4;NP- z;MHP8WK>IM2oq*Bm5&&7-ibvAQ`Y=wGzfGE@2aVKwM~5$Im$(DrH?z0LpOvht7ZuPOq3W zOkjB~Ld1`X4%j03Ya-0q9ml`fyynv>KyoAoOA4(_C{#8wOFl81II51%3vakH$cY^% zCtev;K%OvocysYki_XF+f@=ivkXYuRe|d7_0-DMWu{_(9Vd6u0*7r6|kU`MEfltWS^ z!j*5<2)t1kkTgl2{_5MCyB#}SOV4KkXXCw9GJd_rDwniz!X?^I-tqJ$=lJID6{R0p z&|>DDt-OZTZ^R~0+nZ*R3Uc!9#_r(*IJD4(~{2*P{u6{Pd+zB7xAe z-K4s&0cC;t?=!sI69ekC!j7#kNt*J=Km0wuz<05aqG7Hk`QhU%f5l!wT45M1wn5th zAvf8Srrc>n-?QB06o;1=0XR@X-5cWgzJ?=~JPZNYl{Ho0QdH}OOY6CZF@Zny=~vtu z=4xJd65=_|#zt`(-0sYhpKD|J^U!h&hBlWk0GQIfE)KW#Hn|0>(`XH+&G{-+a}m9q zdK`A(B65c;^{pxSj!J~(2egjiXFc1y)B6yE6^|A4&bIP>y1z;HT%XZN)B&+R zt|9aG(Kq7%JbeFm2FL$*#s2@z^Z0*o68{}j0r;Qc@A;QZ9mAgtkP*&*iRJX4-1q;W zg#6zja3e$K|3GiHG;L!y*ie3g--4usq@`My(i!KhkN^jEy+MmJ_+`0BQ9Hp|6x&-h za@7PaK&|${-yJxzwFEk^Y+EmmMFAAatQGT+0qi5P*I&f+@Uh{lgXCEc%ou(A#;lFf zC7kU_?NRCIQYe4Kso!sku$S+2WC;}g^(E$#M{wV+6CYB=>BEM+A|)0`=M zTzIkd5JqK+vIhInWb(YJY(SiBh~YG;edNu40m6ss1%_zJg!)584MUEcON@z*^Vqa4 z8RcmerN^2jMKA)ApgS0QDrgylHA+#lx>P;>TLRqg1I|ccOw=7B!JE`Wk-q2TE3(SZ zqfbqQTH0yAI^orLkQp{4KsAyUT}I4%e_0FEz)^c#L3zUOCjuUpu`~wNn4Q`i{ueN~ zesOtv>eLRG-pHon>8r)*_67`u9}P({ZDjCDs%!_B_h3!WBEYSSoZ|nJ0S`#0(l*-E zanPCU3n+$2JLLIQ0>>rslK~I>$$)d{QUGmPT|sFi+4m%Z6I<}}V3d#?64FQ&F^wNdD$RPzBgb7=l6OeuN9&`#8<-{!G{7zb3uiLc8y;tH^Td0r~f z3&AMd--<5-BTlE%>KojcOl(Np2ZZUYnt)?BnR7j4)x|1Sou|ohzhfp z2`7fi)&9w`x@_EDkM2VsJoF4oS_~a_;5B+HSBhE;C-e&2G^R)v~%OKOqbV3*aHX&nMf0(l_e7OIIzJC-VrBbc7Du$8|Lm*g8Q5 zfCba9wlr;6Qb%MLIp^7jJ@HZ^Yc+sBgZ$gNNB>BqH1^V~=%w|3=%`K*N;HRx&sR*C z@FGyACpomziz!9tSY0qMB+{sZXmo z1^nVs(Wt?87suqJCBN`j9wQV4X$_BP-Pb3buRFMf#a3Nb;a3S}YDuruhhXCJ6485U zn_DMUqW+~z^@&q%+`OCm(p2xlKLIK&+BFQ?_;9~IXQ$9uhg$_3cP*R#)Zu1LB-9di zYbHg6Zvy+_C9PCP0Pvj>+*E{J6KA`&eGbRQY^p% zwdkL7-`E&E7=Rr0xpLuEUM>Lb%B!BEAC2!occ|8iPUr@&i${S$&A4@Bd>ckAYdMMs2A3*^U^yu z4~a-(QFd?0F(Cknk=&~d#4_3v4^0bmo7(=?kTD(fArDb;y;ps4zPrNP>_KBSe5Z4S z?*hp&uJ6eLQ}EVmjPsJzr9(A;frNq9`F5DMq}b|lX{InqEU^V7Xuy%8%?OAR*t8Y- zRFw6l+%tf1l}S{BO6rDY!gEP@!`J>@73#Sn)EIjLwF#h}qAb8Pu58xsToO9u(3#zP zB&@A-EB)MQ3l^yFobtx1Gj7JJGid)&e(kYkmv%FvF-dg)c?FEk?FVsi0rdJuO91+M zS=e3E{ewNq(9z|SPWZ*FQ$?+LUa&_M;Tw?#5(k)O`*rBte&=Jq6X5&(srh>HSstz- zZpx0FeelDNb#<}&tW6jbJw+@^%yrU)@ldl}C0)+aHqSrr-ppTQ>sAfpmb!Ri=-3@6 z&l*J_%)DJg-?pk2MwNV;bdqf*H#`PpZ)aaw{UtKxcMBktr1@c<(Wbu=aS83WlRQ}1o-4ciOKVUk;7W-Ypc{fAY^4>50 zs$qTaWG!vM!eEA>!#UAot^8SmSL5G1Td;P-3`w<)yV!-9P?nZ@hlP_VxMLw#j!_SB z^y;v+(vgnzC|jtJmE=WKw8;+o18@!Ux=PunY{60Me&cy;o;(~~vL)7-T*k$4%x*A@(j-wi1_Q|bIg3F#XN_}J)a;v zkB(m7q8C~$Z?4k0Y#dU81HxW+cH&LwYUN>k28wkj? z69|a!|65E4{GXrk|2CubgP!`2M0TlruCy=F@S~6|<`>3ZXxi9-!cRdshJZ6qvBBe~ z<)rJi2on`GR9kA^NjL?T2Hx-U%=h+s;M2NYHB{K7d;9` zp2Qfg7wR(IhgRczHvsM;veLMkd99Fkh`!PiKFdo6a{ZYfYFSegNX*S}Gwiw8EH4ma zGQfP5QaRYjVx-Aqr2WILR(q`Vro7!v90Npf+mqzVF1>7pAd;BQejL0JNFOE^Iw`n? z{q(#W>jlD}2!V~~!Mfw$1R{lbxPid{*2pwAo-_wG9jA>4t9$$U2Ti*0Q8*h# z%YI_IIQaO3SgA507I+Q0^2DM|_V7}K6p*Gjf(3_q55yR&8vH-FArp~%bv;43k0>8N zM`w?(kI&XJ7NFI31iv~oS(_i&KL_EBZkW;J)kJ&oUO?*aj0~oT7c0d&8rFO>jlsfv zjiS8_r_6D0Uo)&xi@5b5Y!ZTs$l>5TOnabIB(#8DhOF8%-B$j0|i^a}}l>+Lw13wiHlC#*?`yV3QC zPM2JIke4qjXn~0lw^PV6+n2AIM@pUi4WLj*?B4IGRt@5wNZr@mbVqba2w7m^GjWa= zGXu0Jz3As|d#nAdHq>#1Vi!1pVnLUM{fF0<0QM@+&Ud6Ru}qiR^h;45-w*;9=;-O$ zpR@Vf<@=2nkIsaRU5VxVwOOg^j`>C&%Wi&Wh$WC53nR&m1RFan6D-8T^39U@zHlpG z8~5uMRDlL6Zr)Bo@(?_iMADv+T)7a^g%3RlWX5dilfuNIFZ-*dH4x<{4~6w1(19p? z0Kc&w&`glcfmY{BE)k!c#1pq|mrigO;Q-8=3xP`cP)-3*4$af4$_M`2SEIdhJI38j~V*X*fQAVd=m zic@|xgRO|>5~6stpJmV}KB*%a3HF+6B6UyZCAauM8ECw)hgd+YTU*?IGgQCg0Q`}H zbQ;5eK{ZmDmkO`g!z5K=^wX`1V(=P)aSZ{+B;_?|2?GN; zC=BIL)OTC2b^%Vm%waPqR1tCE0g6dHVsd6elY*lQA#T)SuhB=Q&(g%;s3hyz=g)v# zOSQlj|5R+OET`Q`+CcDq;RUvS3nXGCD_mvBu4Lk$wv`LJtb19yn(!&}G?Ly*#t77# zF{Vnz=(y*+6c;x?8g*7>j7c;H6${gnTaOZVooM?H|GOONG@pB@Z8ne|5N@~1yWP^z zz_6?Ry{!Aa>z*?}!>2$DQtu|Ws1k04+L(8NGUQC&6dbGdF{dS06Zd-*)i+vcds~!n zH(#h$MYbSa+ z;UW6@AF}u?-Sm*021W@ifYBCbb@|2l#5!}9`dpv)#MzmX9$($nFtBPFG&+M=A#dYC zNLceHn?0Gi^6&GAvt=Bwx^#XPbOL7v(IyG;okHCFnD8z1YzNZ3wBA>VE)feNiB+D{ zXP&f=YSea&PWoh$XmXC$oHSC=KnwNH}ypxp|Mb^$=r38*-A0t=H&F`Drf6f;k#yDeNM*b_ZYi**J zVp%BEYslUbLv~l)H}ym}$lXA1sa&|R%dfitl{!vR&y8jBUOXsj&pG8Doj*MXn7Cv? z^zqkLsSyKWH-4ws59U2p@piS!y{^=q=3j!08^dO$jg9T?fF&xmp7BU+2#8tlfosW` zXr(n}jZ;OdI)mZc?dOf=Ue716sUcMaELs&CmB^DZy@zU%L&51Ghi8K>TbQmsWs&>= zg;6sXAvT}@Ik>+3eTL{nJ7_Q>FWh6n-u6E`58F1jwmseJ9ZXH^nJVloww0Za!+Du+ z8@9UYFdSk`fG|Ekn`c?`N~D%Fwh;OTxL|3ZaxfkA`+(d7=j;hFM>riKLG>UzN%k*E z;LbttG7g_|IbALm`>(F6yy4!+7k@dFRGD6m?>V}LQ1NGa>1wN5PgVUa)td11z6(Y8 zcdn2&=kI?PAFpW|rg=7W5J?!zm5&s_Fd?sV+SnKcfD%z%QsyD4F%_@k6UNvz7)|GY z%h}UHj@GTM_3e*lr3x|?m%A@}lWZpb=m_BG(sTvoMIm8#>L8o%49ItQ63dyVT#rie zT%EYvMXLS^W2yYk}~M+i3&Q+C$Ym87}`hxRp|x<1P1e>yX^x3;mBWC?qU z-?R%00rqa8TbB+0Kzp>=GY0FdLP>at*(o4-Oi>4+1NN(C0?^R`i;6dhY4kh^=K ztG6*;JIxaHN;k;5x9v(hJ6}^i9`*`;oY6yH4R8?L9LuzHaWXxw~=_;oJKtH%1wfWL)cPHgmF-J3jI_rqyA*-3w zR}s3Yw8D5owL6}(by|+47a#phRB}Crmy5@0tI)Yd`9(yuNriO^O3Cm_O?eWXUL`X7 zRc_YvGa`TGr+zFXCTOt%@!t+648^d`kP^&&y0BR^b14-F=pwPU#nl32hb9+8iBM$? zz~t*|Ore(C`s*!LGNsfz`$!XR>Uea2!5VIqneG(9oET*G*PnZ7XF*$u{*iB`glXN8 zRu)c3vKyE}%F>$qDV8$9)iCH9ObBe`Bt>OO^W#YOlp;99^<~E3oa8Cr6{khhf2ON? zh*BEz#&5S|_zV~Eeq&@|8+jPj=hKJC0A?s^6)5`g_ndkO-LolLeJdOjJ?dw+^z&m< z>GRZ$QB01Ng+|!NlZ%B@!)D|`@B>AtO;4xxT0NO~P_{g{5T+x4YwlecGDRH`U1dqu z5RcrHgd)@ZNHNEHu}J|!iH07&-TXrfF-d)wv44l%&;%<|Dgg*5IDK;e^ja7E0V(M3 z{$Ad;c4IHz%LY{8Tw+;bf2RFrvOKH|`LK%2)~gmq)%XQ@1F}hMFUJS|!Y5ZFsxFbg z!YZ!wQHoLBhDeebq?#dqE#Vy{b8aLOE*6F2Iygup9}-c!z&x)?g{<2!S_2axwK1n& zRS{8Ks_l4*{yl5Ds8(2bOz35=daR48x;zfa637yq#7iW7vXu7 z*6Qx?Yv0!4^`3iP%^uM0PfKRS+?@ASlNlnw;Lc~aUwAQYu4(z9Oul9i z?O@h}-na8RS%(LL0q;zPY+(3b3^J+kF=9`XpB1)m73(?E$)OGQ0JfJn!=+XlX!pEH zT>d)vl3S+hsL@~6>=S8L5U#vGj3nImyp|oV{HIYu$OSrLWZF{rlln5E-*XrWBo@p= zDyMd#SP+vA4bn$m&|vAjgt(Tn+Zq1Nn*ED%AmVtV_khJh{=V=9z zq;@BSJo@@qp2;dF?KDdr;z4VK*{wc$XSzmvz9Jb0GclJ3Ysh@?39hVuBt$3 z%HY_^(MZjz7>SM-$-!K$s)5mlVU+?Yay6Vph-lS+-u1<-ikN=LkTdDn#)*A2(c+U^_5NCe8J(Q6 zSy4?;wPeV2Km1A2CUM2{Zms}G>mw$a_LQyq`d1Ae#ATAN#MQmEUAe&bk@#K0fngZg zqs;O{8RQSi>O=pVY146Wr^3O#CrXKQ4x8FOa%TEu0s^2q|8H9=)fI)KihH?wy@z&V zH<_29?*oBWFd z+8CVeN#<-l$pnhi>bFcKTGC##s;0Scd$%MT>M4Je8Y?t~XRS%WL`-jvAJB_b((3yc z^W(T;=S3Q)h;n=b?@gWF-t3$x|2+;_~p!v~10$mQx~VTE>Vq z0n14m^m9!T^;j23wsdD;1*ZOSc(I0qm5l3L!66<{Wbg1}yd$W5Q{_y1VtS$wT?+%bGEl;@Y9l#lI+F;(jhmM%7(%Src%0JX6BFynLC`zp6k>%)Im}+G ze^#wQ4KT!hV9^?&`d|PRBZ7R{G4cRiM2x1F53`t{aR)Hscmb?n37${|s5inUfMf9e zVE;1gNg@M?07ts7j6Ixl&<7MXu9g1n$;U1PMjQ{qGEF`40GXm650BNOS5tyRE0fW| zj2rly9EmBr+2bEWtyUq`v)}aaKo~y^H8yCXiSG(=!-;f|mMML{i8+&tAO-+P8>y4|7(D{8kBpxN5SSs{7|1ZYQDLRv=Yqzn} zvCWQc+qP}n$s60YZQC|Fwv&!+o&FBS!8jLxUDT+neN|)EuC?ZRW-RZdPUTyAXr0Te zc!zI;zS4ppEab%nwu{7}9y&XEP6BG_Y<6eW8P0v2Py}e`fpbUhs?#x~4!|{A%xh`e zcop``;?9ApPM+fp3IFrs=ey)1GXI`RcTWbV%9%^{-aN*+`Y0OQ*cgEySIs@*Xj|<| z$UbMoqbDcwp|P}9Z;^WLQJK0Z^%9bqz3244F*^k2(s%Xsi-9yN3D*I=fi_K;I{?nV=!_4o=X_Fv5+LWsL1LZ&`<|Pr zwnMfJKJ%Ni#ut)nF!~9voRqxb?OFZ!xmV`)toB>tKBA4SNb#2%wl;GOSlw-TWlr0;g<%)qRN zf(D9hQnwvv8zXnnSPllKACL}AE2ndaSn_(u{Rf&e0e{K|OL{T04qRRKoPD}K!kIL_ zY$%Uk$Q&GysfL#*0?wH#hG$#`D5G)@-lKX-J}{m-1BdQ9_v@}~n&XUDVt;1db#;e>g;DQfs66@N^TX6q(y zs)esJY%`wK4J+xEVdr#db9=SkyD>g z6RhVRhKKqQd@DNPf-ii!xGiqU236nGZ2z)StjRA^|5z{(L2S3>ZtSb4hejE{uI*rV zX~!GDLaB{;0+4>g6JNWSbJ^qkBkE!8@kPFkb-=H92{NFmc1N%Eh4*#pKPWdf2*?%& z4}e5LH^sw)HqCFyO8mE2Rj`XuDL^( zl3(ywQ+1^9@hT(C%F(}-56myKa0hE zMT;+PknLe@#3so%;ghhnM}I}Y!D$#dLLHV$KJPreASi#573NoNjTkDM_8O^>B10m> zpJMb;v)AMoZAV(|MuLIKDTuum$^&d5Dg(@a{0D57`4nszbV*fOgh5zIj_kqZ6f z|9ijZ0UN<^jZ->X&q-bQ=bmHL+&E5`q@dxJ6~*FTZ>h(5j6&uE(j;8t{)_1D3}rb= z_3VexucWM=;G({9+UxcrX?hLJMpP`l@}e9)aynspWgo`^T`=|mAsL_AS196vr65Hr@9&T zL%&}8u&kL8xVC#nglFMO+h8*ESkR@iuBn|&I&O0sob#;}F)b)siqpHSOb62GgE7(TgP9;Qc(|R5)yV6oP1>%N zx?rt#v+76Up+9Ey7L*NTTQK%eTQPJ{)hWE)Bo6GI#Py`!3;x9TUUw2#m7UuF^wtEO zu_q(Sj3qr9)3;P5k30P@G430+@h;3ifJ8WhfW#@;{H~-rTX5!rQ2xDXH~TQ$1?pe# zv(MLR_U_hM0etLzK*2Ucyc{<-`i}?%5Og-W#hvR72e2>KP%+)A)k33r>lv}b1lH}N zsfo9_0~HrC71lEi27~tt91PW+rOe}HrGG#dcFkkk!RP@k#M%}q!V}F2$%ulz0RNwi zKz^M5i7vIYYpx{sem*?J5+o!xQ@)!(FsN_pDj9uz?k{()JK`q0Y6MHQI7KdR{3I|4M>lM9!&EL!9+xg@V z(Lt1WDt_BjMHA|5v}7v220}&(z_Zd@%M%i1^Lsj^`@-bd{Aa}yT8uAmu-pC3wQr># zE8?uNRhYa!U#eTWNnWX2zf-JSECT+FOJbBFfr9V^vrlfR6aH=!+42KL?6oHa)uW@d zs>;cM#{NlW=;OzN`tXWCibMFk?nflBP~c1~k;2h;E}|POYflP6=vT)*puu0759|Zn z665MpR#51?d3UuunJb`<5T|8V+1=~>ThIYPSE)T@sEI7EjA>NWkl%?VGR1dke$X{3C!v`xILF?~lbvx5y)7Gboa;J-N9yS((EpFu)wM z+GJNGm-BCVYP~Hkn}m9Z|W|mub1KjwO8HbaK4COYs4j`;5Jt3{#-xqrn3!_ixpRBpzShC z{2E?%DxwZDYzBm2X^6`rF?S#FI*W}o9w*z@ADuubc^V-XqqSy0;JiPg+}EYg8vk`c zLnTsi`BDv7%$%w>jLT(()WTM?-2x_sp{SzfkcMz2FuO|{e3VRmN%<&PW)3ZlD^p9t zKbk|d?7SL8B~&JQpkfZ%b>f~)aGZMa&Llki!m=Rx8`MODL&_a zL30e&B%RHPB0>Q`{=$^8-cR9BGRK03!vsA7qXnd^^FY01 zl2>6n7yJBt^56;XY)4(ny8aNd>5Txxi}UElIi_&@XCA5~zl2-7MWCe!e302dVwA){ zdC1v}-455zdC$NuATvf1OL6Y60GU;`f;OK!p-VH+UsxQ#-?VF>C&<41wrxRx0t9y6 z`w;&ueb`^+f02RSY?m((e?LL+^73*X!@eGv+qp!yo2Vbne=duoq5i^T61^}--66* z)#Ei0b8D$iG&bP0ldGxNVK`)y4F!rN?SNuCEmbZ@;CKeAUUt0KnrIfKlFRmn^T%Np z1NFZ#KXK}%s+qV5e2E%+ish;k@|Dz^pw!TNy#3(-$FivlKQ{~(kfL%jLUS@%7!!00 zr*lskJ>k6W>yoPagLy_3{=c*aTJ0cw+}6RHje&^##nyWq2cv59i#R%aZ_l#pqk3g& z;7StJ3^?v!f9X&W$h@E1}+&~!w56USlw4xKC zJqK*W7F3MZV9vvtK6Z{h0K3n5j9}$cQc*ip29QWM-h8m2QJ>PPdaaNRIhnLo_H!(j})t7E=aa4np3dxsihw3)oNA%l|@u` z`$)Bi3*Y5Ab^kU5thw;Uj6tJIQ%i&|gbf|Qg}NUSe4x6dG24dhIm7ZInz){TvV?2M zl=E)%4r4iNh7<(7akW+9{9*9=U)NYlg2D}D*v8Q0ExU6Rq#UkBxS-m?J;@dQm^_uF zbq-9eUr4Hz*h^-IrwTd83c3@3;R^o`bgK_TOq(T#FCc-nwYoM(V;QZhyZ!wE4NC%+ zJ@qQVUscOroib{hAYDad5x4tF4bx>G--WBZ9f@9fA3^(s^pezeqp~s?!ERnhZA7ig z+0cSGkq#>1o4VguNb?7mvdnJyh zz1YJ<9m?H59BDB%O%DYwUVff#i3ytgu~bfiow-uERIMlb@&Rld{Tx69vHWHPgXCP1 zo964|r^}na8LOHs=PHW z=9-+Vl%H@^0=N7`J19#5%7ndhiM8al%T^k-c(}39sbjXpZ7G#L3OK93)L7fhZnWyC znJjTH*%{Q1$eStKv`n^mIJWpP@u(Q+EL)GnWY>4?+3vMs=hTC3EHG6{vLd z(qcf?!fdIv_Apw6_dsjtc#JjyAIw1R4*{zr5IdNG&Y`x_=(xE)(HIi|&FFLLk1pn(oo>i50H_#s&Vdr^slMRIDe@bsEQ!{o4wYsC$4;T*wgsour7C4IDC45&N4uTK(6k62_7-OuLOr! zWLHUUV*oSi*awxwkAx+BDRK*K;FGP9a{BhTK&T}hf2KG~cJ|Hwyy*QBqa7I?`k}F> z37BJpt#+YwO*EJ!NV8TVX)=s<$9Qa@?adFU*4E}vI=_ZtNl)NF?Eur1q{oZKuQqru z9%NJ1G{a{nf@jt5!&y#i%TrF9`#-gHFt6;H-~pzKSGpB!aqzqFSr<}j#z_D+ckR!*~c+lF^H(n*^jOB+e?s+9r*O)(V_r7Xv)csou@LgW|$igCT<17$@SI?`s9>m=8|6%JTC9j^`O zt`{gFX^sv;bUaOeAIHoY-AMCppcfLY?FI|3`%Du1Q?qzG+CB-;E(HVM5fx0x^0c5A z#Y2|>g;Ku@1;w#pMKO&XHPkQ}->W^buiTPG)=_;e}KI zrQ2x^g*s!el|}#q+xU*UJB+*7={6$Rcged>YMzrjMtL+6k)HFOFz7g=8`DT183654 z0dT>9UrTUSpmg#STxQF$<4na(uz(`Qx_=_Q&%Y)a>ZP@&yYAYDbBXpPKlt+m`Um5_ zKE|`YN#x#oeQq|Jhf@C3Gx{0hK657*mp5;Glc~e!p?c1C5G5Xc>*5LWnQKGN1X)k*?b!sN&O)v+U1!b!D zRWZNF-jd{e>g18{XNT9v&8G?Y`?S+%--O+1pR#h=C#S8hZcjcFSM$7m`m>b%!t6}@@kx;N(t3xl+rOtg zXMLCTFeX{Y{q`ViTZ`R?lNUW&*7i92y3$>8p&8CT0dkisED03p67&M-5=nE{H0%ux zu!sKGG1Q+NHwgm)UuC1976W>R-}mqBtHXLB_`uNJOdiv(dZORmSlrm8FPg#}Vo&gk zAV_e6LG3}|-jdLf3YGXNPhj9_V6F@2Wldok+;L>|DD|Q?yf&dR?b(1EM+%|k66t1> zy!VzGXfa^+S6cnkZv z8S7xDIkQH+kI0fIkOc{TOH$nuN$x~m*{@{+5duE0+-7@45p#{&kgKpWz}3gbYi4#j z5JM^?ZSAX7jUcT@@Ee^YKEoW_e?O{f4p^8F?2~z9um1nZ}_2cKh(8sf!XSXu55|@RPf#Vdu8dZlIRuaX#%4>At`5EtdOxk*qSdUsmyb%W4@^B0&JVDoQG_{gzs=exz|$GE^^}=cQ4I;=s~2z@1B<=Zw=y3O%jagg-s&U z=g-WCraZI&nc`r(Y4sGj{UALMt6gW-VdOuA=HBs%=c*OG2z_mnlj>^q(A+h7LROTo zno~_6xoWQ}^=Lc?T9hZL)a2#88;6OfjnznkshZdOhJ>DSvc16U4O)*63?JhB2rtEh z<{v!XYm!)GeuxSX4)~=r@b5LRj$+h0m$ok=oqxXoAC2sob|)rCAfA)bS5g2=3~5GE z@cjct(8D+!tR~jvJSM)lP>;$tDgT`DHR7=`)M@d-vw%WR=%TD&C4RRi0WLMd3Pj@%iMMaN*#T@e zmUk@aOJ9_P()*9gZAyve!OKAuzdt z)yGiMFc%%TYIIq)68+KgT@SQqHg`+b{^{)(j3P;@Dy2&m&53_tyLul;m_3 z%+ryl@E4n2k4CqawfEfAa8(+#U>(tCJiy}BbMS8yJl`CqPvS==2_#`;#0BdMQ{S~^ z)8BNVOvIobK2cIwoXCoYrhwts4k3ViQ`hzS?+v}Uwato-?6dH&OHt0=zpi0DNyG&^ z)RUM>>(-#r2$Bas`bvo|_0gozcEX59)JJ+PLjclgd|{Q1xBmw~=ADK`So}9tM3?qo z(bxS?|L6ZzDRO514|vRL>%PI2wEIBad41HW8n{{dE-T`gNDJ#Ji|J=HcPY@t_ z8`Dr>EA`j;eb-&AG3FD3jR?LYX3i3{l_k^N@(AlLF#8^L=KVY-QS{mHE$aQ~y80Or5{^$YX(~#=waAwE@a;5D_|Yuw?g0{d#^nGaxy_%38^uGJ?_?n44-si zW+;CLX$W^<6Mp6AQAoX47sfeo9&Wk_G|H+v`*!Il3DB#J&8sLkgl(7XloDk|H! zd70?up7yzZ+1f?se^;^X4e(ng$;(Vjn~|&AK2Lm*c5>O_w0qe&#d~!V%FLNN67F)= zA%^n+AFA()h9u=)S+D^s@e|EgtPc9*IP}cbMoaiS)RRG;q0h-M1Syrb^pyoT34o&)!K0!Pjp|u z2-NtORRJ<(ZH0#$J_{(k@IH^8b%FdmF=(!?GP^Kfkz0pe zD$u@(G#~p^gtpUhyt!y1fDSszwLssuvz%AgTu}KPa4vv zr3(OAg2km zQlI$0)KV3r*zW>1a|1b6zjGcC^rMi`#;%f*R!plFmFcx_3`%JS+GFRU7x&fc zz~N<@*;RL zu}_q@R|c=oO+DRP-HPs{>@JI>pFus;{a z1n(l0iDE&QstCd!J%qnIuWk{Co&ZBS1pG>v_vWq#j8&NDlj_9e)foZ%mRt}8?UUDH zF6ROiTF2AB3>bzC!(M_kP!O5J`GI<38fz=qr=KW3d0TqOUHo|2x(O3zU-D3j(aHm3 z2tRj+Fy%OdJ=Ja2_T)ySo2xj^94Mzt*w?($maAGOH`m$4o4#vTe|@jGDFeL1Bk(Co zz1gl_TvrFa5vz9_JCgp4jm;RG#Bc{bFKc}*UmUg8d$_-hrj{bOmJ?pdJ%%5g?}-3XGPwG%JAGp1a*^Q?kJ zqFk+F^&l{IO6~-Q^g5q-Q~gbJ{mmLo4AQZ>;#u+eG#d1(`UdxkLl4LTrMVf1z=i3$ z%Skb)_Fw=q*+XZRd9toeXpO5aFs<;l+MPN*z2)vb{c>f)B2j?HYyejBBxD(W>DxTA zIb`{851uqL5d72WeB2UgyYp8*(fop1niP9OuBe|I*K#ZbZA)XhT$;TMw}K{9&cW{i z?XXL(=dQ@Pun{WwC?CK8bwd>-_%w6zJ&?~-{rqya>E)`x&tcH=6~u0D_3^Q+dwi-k zEVGVTm#dreyn!(@Rjj(Fl}f3YLKyAc)C{?hzQHFZ==*sgU#8F9VcQn1_OYFI1KOim zl*cFgei*=+{&Uu7w|uqQC)4Yq-(`Ms9QXVY_b&xLXd$h%ISBA*J9)|J1eSz~J%IDh zLrLZ&1pnPBbCRhMr?^c) zkp|bvNw+|Al1_J5Ea3x$|H~g3Jc3a>A@qqwH%vm5rAsgRlA`717TZc`#<$%K)po)57~rY^96n9xC6Y2A{jNs+(}r{Ccv?|`W{x- zDdqKHhOna7_Rv!hv!F1c+>EqQ6mo@bK3_lM-LHhE7?0_DSQjq(hP*HJP9ZFxCSPau zUXwxYDK;FejJl*WP!gc*7>S?Y4er!ImVnS8sdUH&V8F`xv5T?2gYylL$b51xdUV@0 z($yL+8v)$xEAYJD?ebNSy*t)9Hlg=j3ifNr!1u7YJw}eM^ti0)&b1?t_pC-0^y64P zro#dL7{Q_o-Wl(R@VgK7zXGx#iX0$QKo}#sgc+^oa+w0~-slbV8s#Nm8a(BQYgb2= zhn6|h2KQO@wD)+GR*=eU9iFCE;47MbK;>H}X#rU`F%`bBnG>g=3?Mu23{@ttC*p)? zE!YXtTVW<)st*RXX9o^E>a1T~*BV$yT|1o)BYMd!Q9M#x$a$=PI9XeJFAREES3N1r zcv<~Iltzl1JA{tBYd`A+UJmN4B6Gu*|N?TaYsI3`No;^xa_cY_a`iT-Ah$D7LU&zw5!!p!aaqb*L^+6mW5S zkq8ruiX<{nbp;1x!=qiN9+@bOyLw=IdDhrMS(%S1wljV~Ogk1<&fTfnr$<=k$g~J< zq_)K=)TmHpt(E%Cziz^Ie!isNWNp7J#{fci*LB4y9+;dK^@R-MbOrFs*HsINVePB_ z5)WzNDVnSJ1{#%rAv0E+=+fSlqPkV~RmR=kYz8d|_B>bm-L?szZ3g|WCm_RY2bu5r^(U=;TY^6E}Se|V%8{~2(i(Z(e0X&7()?XSQz7LEUDyMuL`RWdqA-3pp!rpgPo@h7}M0o+BV@OqgPh5|+~5+@ce44};E#?wme((kmwropEM z0vV;*(0~ygROdhUGxBn;l-}0_6VX_PC1I#^h&lZDD-dXxEclpWV#sufFBFPWk(6O= z?R_@*_sF{XH5LF9c%bY8+Ev^?_&E7aIpZ1cQ(Ixgq!xXGK!mc(hDR|~WDGFxZH3+G zsSRZyMq=!=lOpBtWgRG!X5oq+1-%zOD&r6xnk4aod`97Pm6jOWN*dCc#oLLzD^BZ8AAx7`YK{mKxAu^SfDorXQ0pMyk&8LsG(g0<^hkvcL zdUqJNna*!qhj$=hFIX7tk*%1k(DBVN0LwyiGNN7U37J)h}m0&QG892pS z%Ut>C&`H*J9@NFW-8d*f;_n_72Q?zBqJilW7^&>WrA_ui#sT+Ab$qE5NmhRfV#oFs z-o5POGO(w%*SEgh%LjDwm-kfGw=I8t{Ut>L58C`irij_}V}u#N5Wn`YS)GdlEO#`wOT3x{iV}{Axa}fqa?vk zbv7^*$}qR0Ygtw=-THW$eZVR&y+ov#P#KZzxp}po3^G?g)U41@!Cl(s5xzZr5Z1Ym zPMi_*I56(*zXiBmgbeERl6vo?9&onB(~>-<&cLLMpDl3N@qQ)cyQYPSPNa@0O4C=LQT5QDmarwdEiW%wOTN2&ixazXss*i%m)q-Erh4S4t0K^B4-e z*y|&D=Xa!`Op>r@r=xnJm(p&KcOs^J1+aT_M>;n0)?{E+`!96!_w`3 zw_U=amt2S;Wjqg-J`#0@{X8ZVweA$^L{%U7JO&iz>+&qrnIX7vG%q^sD4M8*!QwX} zrBrr@sX##S^5)SWMG&kOR;l}Yyoxb>J<^o}a=SLW0w1n#XsA9Bjs#;(0x1@c?L`ui zp|CBU@nW*>cMkV0R24GwO}{9zWgCm2BT7t1poCQtC)NGjq{lKk{NS0w%;I={C5=K8 z)}Jsx(Odsqqav8R?An~M-+aj@k@Zrz-MCnjQT+fZu%ZMA^5`_EP@KTNDlz#D2-1Of z-;C&kzxN)70ZkA*%d&S|4B~X5yLc{kR_zH-(jp?5wk&)4vpG`~W-)(bvTtuyJa|rX zBSe1%Z@}vnX5r8}o(EJEQm1cJ2YBVw-UbR+HFKm6b`DP~C;6aqV!b%#yf#ttWChy5 z;C=$QTI+d`{aPcT7~`zbuvQ&jS|Z>xhrVbHQ;>M1zEzis%MX8d+7CFLNoEcW9y{>S zxj(@A)t%jvDTygRq}D-kY@A)d?fr7q?IIkdMG`%R#;U9wPMx1vX1>=`m68LPxa1X2%=)I@dIHc>ru zRp9e4UHPl^C!Vfc^VKAm6Tzi39zpk8n}tAlEZWStkvJfzK+9vqUe1;DE8j6wUVKiutH&rG9_F0g;fpH{q2D87lI89^q<4E$9glZJvo%h)2+aj5S-9oDV>|mXg@=>! zr%Gn<;fo2GV=2lft){r^`Jah25R<_J^W_764lpsvi>wa)$xQk=MR?876TH?xND^Te zH0=jz&_Yx52xJ(qJD)9uaRt9yE<$M4FA0P_V0*ti`}wijFWmymV=H`aS`g{2(i2Kx5edwsyM#4XT(=W0if zKh%Kp_4IEIcl)hlH`wQ2(Jj=53eO=JG@dNNZ*Fww94zdg2`FAC z17d!k4=1b6PW5FKg;xSFPLpec;5z+wS@gWp&2VOhy0^N!N`r@51Ls%+6g$ErFm(1e z?Jz=WqANu1Zj&yUOKdk zpp;0^68@M2y0*)}oOpral#H=^u4X-0E`1~paCgT%O%R2N`e}{C(1O-FD_5%MRz5%2`9m_R9x^f zIsJbX8j0cc#T~3A%HMKPsr$}l7!F$Mn)~6YmJXR1+iK_(Yjk*G=A3X-VG9uh{+hza zRXnQ4zf~*FF@yDrDt8Lbh+)wH*wg%FI0P7xBRM~i|2yvKKj_`R6bB%X|J?pv|5Z8L z|17Ac^)ta>0{*iI*2xKj88Q%%T@J7mssp&_1TW8fe9A!lrG)uDVG{Ht%tb+i&+$DG`ym95J&Pr<_%V-lH8ad!`27 zB-5hdlaRI@z!6<~S-L6r?n*-e(y6V^!lV8X=bZs~%1M~$Tj|hDxNHTnb{Z&u-TY25 zlPbh7OGa?rt)^A`nFQG0&4I~k1*Sg0$oV&6^B^O1^Qy`vE5dBXAcDFfku#Antd^D55a~PN!`k2RrF4CFJ&DzUlF~%2xqb#T4 z;&2jh%%!&1vACb3EjB#%X>m&}CH${EbfPk0{kO8+-99&4aeSNrH);eJsr#POPk}c; z%;F!n30b2KCL6H2x*nltl@DEC`6x?FJTum<4%3{jI;pF%?0 z`>r~kaxz2xKvoXi@W$L=`gL9rk~X>!Aq3FQ;|nXopMN6~^>1V-|4tj?UmKSWfOc&J z;cCg)Z0fnD#ne>;#7)ef;<~ZDTu%#lB=yWQ*Ji6auH>=QIrV3-P6Bpy%II zaDQ2}Bhra4(kN^*_N(ipd>8lUe>=QMZ4u+Nx5>;UZpUFXc-d#Jz>Z>+VC%pZxB z^9Grl4-_?q>#{kew~2AKcMEaWp}KED4*aVFKfAlRiIIoQceBO%S7{ZlnfSTKxw$zo zXgki!5%-n?Bqr6}IKjk_Y+>Y}q`=F6K2gJ6*vL0r>zv_@r_nTqEN4tl+U3lqvo^f& zKuvStY`<#dd<+N!UNIQD9S95Vf@-M_E9$hs(+Y=g49zQLw7Mnzx9()ez7m(VS9K!@ zP_lJ#z!isOlxyRQ7100iy%)nn?+-F8ij@5llt1@Xn~Y zKY}O2+V~+Hv;_fXBJa~Knx-bS1nVe^WTEM-8OQM0!E_r5Zdnv%+fmo~RirSIibC#1 zm+o=^xz0QY$?F`t@W8=wbcy*pbxHPPR@;XJ-gWDwHQ7JUpv>3{-6N@)#cvNgyWAM3 zWmVQzFVBjwVgli+gAvF5xml0rkKxp)MDVHZa+Y1243h373&r%nASwsq#{*6 z0gyLcIg1k2RHifkJTVkuHkzawZpaZmQvq%OH_vV9@N9(qd{uiaFDu)pV4#L%jm{5I zL;M^H{e+v*tNn@fyZz0!v9Y>cmz``p>bsTrRc~)*ZT3-!Mewx@<0Z*M|IZk$;$@5L zq|vUTprN8socqg0{h%+o{$^?A4^{#qXET`8`3Qw!jhtB0(%`IVe%McI+) zZW+Ni*Q}f)DkVR50SSNG5tj=WJ9l?%y47wi=OfssjEv_mzH)zBuyJ}l;YT?GXY3Jg z;#FwPK7}1@#5M6Wj#i(+$Bf#c!`lpC`HKHp`{sLIzgS@FdSN}Telm6iMmjWN?J=SL z?@_BE2FOy-S)p9N{ku)_Vmg(?vEGrNHj6P_?V{=+Bd8c23 zeS!PYxDa$Lqv?}}6Q(zp2cN~aEX5#Yf*5C?cK!pM?KR9vA+NL0+xr=BWfy_~6B*roYb+j%}zh z1pNx&2XO8@J(thkp!+dsHmqjJinCO6N^ETGSevbE#j(Q=mD>=QD+cHYx->Ljn)Ueq z+Kl$VlBDEmp6a=epF4R?e=D;9a-?UJy}vpcV~ePBvEZBsF`RRQQ%*I2AkN(|ijbVQ zgCkUeF&N`T?NW0B!8%s{Ax8d>L5$p(J=``uIDL2vCl)TRa{mb|$ZCV{Va1gKm83~P z1U(c!K`IP$f*ELYD9QqBNq$)`D;qm44C2hGmn}D_3h?#>o<(3kfR+a+W4uII&B+z; zSOY%m#l*Wa8*(_x5D`-9toJ9a5tW34=C*acM_=7v-E+bLy2TjG85vdM zsF6td9F@=_)eTDy&;U1JKCge5p&zV}B9!b_z~Ic#~_ z`8#q@xq(90tYosSVtSK*vH3Mrn0-w3vKU}5STar&q}$9h<#@HM*|1||mnyaa9h~k9 zB;k@8MV$lb&6gsX*AdDj?l87`ONBekvR@XHu)X(KoR#SrNe4)Nd16Zz)kU9 z9Hrs!IH+ZIydwZZg(I9Xm%jlal$s&0)cY-_tK3ydN;&dh8#92pQN1um3eh0~2}Qg7 zTm?Hgv5oqOJQZH&D?kvEo1wHu6#)VXE1;|z`z?u{!G3{R8kH! zqP%%;;6tnn{A<_ko`(*PZAxTtd9LJ&bY^^i-6~9NrjU6>ZSYuID#zh`{lkUkDIn=t=PL1oQfY%>m^eNz&{=9!JH9 zJ1-{sd?A7~qh0BKL5bBv3?_GeF|hThdsywc#mU3T%QF=;bS99)f&&>=x7#~m*_9|D zpfB<-t6}%(J2qSmi4d|-6^0m}2Z@Ou`;FN(H#il-Xk~nK=ClMj2yarczkbYUePe^v zH4D(Oc4~Y3UQpR)cA`+gw|Y`X=1Dp|l%f%v(kstSWUDh^M@kDbWsMRb8!LCF1cQ`I z+lY>#Ss8HDu0c(D>tbLhJCLc$YdKK~mRhgxD;w9tiKcGac~mj7N-w1lteR$3UwL4N zJJU&31(xeNdH)neFol?=U!7tS`u#_m@dhxWOa;eYexJF3!&7Qx`CyFWKpRX`HfnLs zFR(Z=BjlkaXfP0*Sgf!~ zX#ZgGmp9eS=h4y}Gu5b#M(mP>RS{h;F4Gp=mx^%!DU zfjFH4at|*}%w98{MDsmydtMeiJi2RSUAp(dA)PTdoL}hK`g$n(m-L z?(H$bE=CnoBBAYf7sCHYrNW9(T8rB!4~Loa9-O7f95FFW*ySlQocu9~$YD+mB}X7? zjRB_iZIFvuoJu8eYIOQae1V`Ve_fc0ENxF~?n?fjg&s zybnWc?|-q%4-6`-8Va6gI`kJzaOK%eW_9ErYQF zKL^FJe&z`w5$2VvjPkV-QD|wf5?e~y(4pw`M&EVZMJ4iPVbd|C4-Pn%+7tH*T8R66 z=)Thh&siY2U0`(yg|tAibcbO{LyQPiZQU`~Ef=|K7;?L%0v$^lUkM7Vk|8Rnv!>Xr zl7A9uqP1YZ-$XxiR&*eo$K1WEA>i>r3rVsqt$9ryo@0unzc3T&R|-in@&%&FxvDJf z8CKGAwdwEX`_~zQS-y`ajHTe20_SMO+NS)k6Cofs^ znla`U<$U>mXjkaw;CkzRitG@GrXoWvSnywMO>KNlG~N*?wv42m;f$g^cInPMj9k(1 zCR$D&a&Le>*3@9XiMnahUG>KuVBeDL9J}Cmn4ni*5aE0L!LxM;kC1nk^0cS zEh0Lnz^YB^V9@*5P(Iyd8B z0e4sB%c-P<4*`6VPg!2fYP-{|>^8ZYcN++xcsCx|Dn-o3mbDzcdY)HRghZ9&@gczX z3~x)AgnzohyxtA4vDgR;UwUoL-$H+$&JkdJijF`|03G=4Y?J~I&QHF*mzLIn^X}h~ zccAg~HujZyeRK}cYpD-bFv-;XM!%+mQcI?Kb$t)kIt1|JwDZ|i+WgAjyOB`SbzYwx zYb$bj^zsMmMTKCoyZ-g9wV{l^FKiIf_@tEd0~rmUrN#X!ONYNj4!=215_R+ziof%* z7|Xk^DFJ2qG@e|qbcY)B$8FsRCnZux-emniJ`3S1F@2cqyy~Y*Fvuwjez8R!JC|U?eL;Xa5Iq_Ph)mL+8>-%>0>J-Am86CwvCIx7*m7GA>UxH?PB%J-)W%*_Qm2LCI zgQ1?8$A64Uh#g(HxdQ4l=R4re_upvy%7DDGBy9-p5ZocSySuwfaCdhL zaDx*hxJz({-~_ojP0)17Z-c6N65$N78iJta>)RYwY!&;7-ccl`Ck zvZs)rSD22h%yoViSiC-eWyW&Iw^S%l>p-Cw>{dUI|n|5HEOmdOrTSn;59h^?|09=K>ZC%#PvbJyqa; zR_L;GG&Q#SaRO1t-f?LV?Xk+RrdlZ0#*Ekb!1h(hYgcr9D)zXk!Cg{ncoPZ6!b%xN zM^9@B&u_r-DC4TcP&^@3`vxRAR$rQ>rDb;7XNqeewQUnz4in)GmN*k`^QaXVVDVy_ zjuy8W%NtL1OhR^fw6Uw*HfIa5X@U&#c4IP9(T)J?kMT2b? z4;{vE5jzekr4S41DLPWUWOF$WXlqXE$XZr(C~|UFU@U$&xJo(GMAqH;k{R(nQ>LC6 zh}!xlg=Hcw_m~I`>I0->PQQkRVq~!Uq8LFEYa@FI<8vHKnp4P>x{(1aHH*>*PIA?Z zgfr+M>4@MP|HOSg)>SEp;91Iuj%N~LJ6$<9+9hWhItzv=&D+l2NyU1$MQ)%raJaRF z-O}PtFQf3!y-_3iFJ241krrqlf87$Y476@+Cnbt{Y+;%ajxJ}YMMWh65O8o?CQD|z zYe^@%U9;-n$|q2l^vN!54g2G#ob2o8*7wla+~RjHzqBM=WcTw|kQA{SYkKE=y}Jju zP!f`-=9v`tu7Ry?!BFgvOiS{zg(M1aS`fGX)%wa)1Pwb=Q9VLVG=G8zQB9CLmDFQy6s*-p14kFT*?T5is`P}#vPr1n9 zcQ8RDMX`~Rr&wLf@l!+w9pL>)m6h{^f}t?=ulTJC{F%MrX5`RxII!Zttn$+w(e(N@ zN;-Q{417H8kaEn=yoU6{S67TFC;(hDJDU*v7FxL81CKk?PrK+6Y6`EP{h?(w(WeT-#7FP!M|eLi0W(LN}{nUubG zVOpv?7!zLS5*jR;GHk;yHZt1NJ)vhwG*c+{C~VNq&*x}_smSo!Mvg)*ryppvuRO5D zVMt6VW>Gqp)zvvtTa3w7z7a`l8@5b+SSek&9!dRVdYDQiHnC&~0eH-pZ0_Odb()8n_T%hkEVff+EOngCks?hjtyT2U9s1#+3M?}r z{grpMA!aD&PwqiaMr-BCa_96|?DU9^iLCcM<&Arv4a#nIW*>d#=K-MoV+R(L_`uz{ zlyD|l{t`3xlJUbU#oYHnbm&dt;$LGBc61B+B*HqKU`lmiFHYt~*I!KJ1mrXo*l1sE zGn_S4Z+z^`oG^U6Z50T%&QygETX*s7plxDgCO3kt~MvsVZ&bU%E0d-`+B%W zzLd3j9-Fx-&ow*7kD7&iaNWN&G4CbTtvv4Lxg}IJab6%V4ZWWS)FWFSLh|&tgjdxS z*YH@h%d%7u%tnfn$Co=1V97QbY_3{b1e%VNOg~C`c*7 z_!-A~=A%1na4n-xqrGs5PW#2)-7ab1G)71A_-$6v$C+7w56_(9yCZ~_!(F1K?TR!1 zDG^;u<80UUi=`sEyQA_t_lbt>Ci=QEujs1`T{NvaPhh4d`wQ6{Z6MG*`^)VOz0)!e z&a`<~JZ)Kn+hM0s^DzW^;W1y2MR890hFWk7;hJubH<83m&iG#A%$!vl4n8i4EQ#ng zZ}VHl$NI0hr8Us2-*dLBeS>c^Q6Bv}A$*A*Q0Z6l&vLMcls9Tyd}3aDwd~=&w=xoNbuSZhMi!lxoSL3YbO#W=eq+b<=K^dlZxXSEsRy~9RMl*=xBanl0B!Ej;tIHzOt47@Svt>q{nhksb^$8r z2FeU`PUsnqEM>)v^CQiPx8m=hV*x|GZVl8f+Ll0Kk@|@K;M2CnFJVf$UdWsoM(z4z zWUyRL*j1M0hqQV#HsD=%Q2tf(bu1*_66PnBvu}msFvg|i_2lkvci}#qI@zk3(5s>) zFs5nniw({i&Q2>xy=g)1cb`FR4_0{F=$o<8;ex`Tgu=H5?Jy z#Q8?1nyujAUMbS5_FD%5t|mZAc1F%FG$nYTfWp72nsqodJa+(3wegjnOqxM2w)}U)Tw`9{ZvE9cyGb?5#zLuk0U7F00 z0dtu(OA^iYyob!jqKtm^LR+Q#;)Y-!xd~K(xM!yE*n>Fo#mq((IdVW~jYy;-bQ|!uE&g9SI*I(Ne)V5&^|Pas@!xjn|Es&x@6DZnU%w#y?|$KLts(yM zfnVqUabn?5=L>-U_JG09CHxf~{^>`!|N4=C@(tj3`1$z}SGIpTG2g#D@h|iK_QKI$ zrv7p8!cGeK{*()v^9VF_{_VN{q+2^{S2sgbM+Y}!YX@@|S3`4qCpT|KFMB)lw_V7A z%&6kWz7jL749ih86#ZU_I8Q)Mq6EIN?Xczz=;3*$FBYo@W|A7`lXYCdQ{MF6q%PxN zm5zj8W_x;_zgW#xv`5eu8U&&YeC+>vObRjl>9;v@*RVi|G@ zC(zL6*cGrKUwj3uZ~O?`L`W(&NzsJfo@`{Bk_U(h-p4k~za~ zyLpV@%l$nz>tKs6Lf56DXB+7HIWn|3qG!|HTV?bPBZaPjQPx{#Z4_vU3Sua8pj8lCPm@nRk3*Gtn-5XCjG~l#=D3uPs~a zeAdcakR*fE>>ftj{oW#%8<3+OCq|VuluT33%u=SGu9ul{`NDwFG*#J*RK7ktq#Gjo zSSbGGJ#4w@{Z-bI<~ldrQe7JsJ|K^ zX74hK5jYsw8%QuP&HtDY{>eW9mLG;Vm$;(X&5RQ|(HvnhPOzG!ZlAL$^X?IuXVc0+tB|`?QC9b6pH|GudeDSqSt$Z)EF5HUxy>?O z^qkXMB_&;W;!Hxp8~O0AzB-=|4|3PwpI3z~!nvR3B;7R%MP3yh&Zw3Q@SD@{Idr-l`mO`4ZP><=xmf`MYWKiJLDW4#ixDO&ZZD=*hRd_5kv}$JPg~bR~!VqKQ z)1>;SI=oaZWYWIMIW9vk*%4L&H4bVjABRMsZKYLHi?oJr zeIqZ*H}6Sl!$rVzF^w)DYuIRbKT1s9l0{^_Q)xrw-x;vRf1X@g8bQ) z2i1vVIB0c}O6X2TYm@M=YDEuE;By42H4zf{Kho=O_%f&dL#;pHC0&1{MaW275{~3I zt)eJ5LNG=p*ApH9D{UunzEDkFZs_bd?KPg?{l|BAQ?4#=`-siFO@qqylp|q*;g3#3gKAUXt8mOXk6H(0hp@i7GWN}0ByGEI<5viA{L8-On%Z0`=gsgYK4{Z-9^ABGgIKp{j0RP+4@ zAp~$Y`v(sb{-gwdrcS?w*FR#&Z?1c&x#E(pjM{Nc6W+u?M3UFrl>iRtu;p=f6*cb> zI0uRIGgnjZmS5(@%)X?~d4s1wd03ydE1%}PeQ?yY$_Q9q<3BuJX830_`WnNj96+^c zC)25FgB?Mt#k7vO1UBVq3Kmne_as1xBeKm>^uCFynS|$NjS*uvLa<7<3^!gT3Fc9Z zb*hkmFj936gr%j6Q3}$~TYn8n+CMQaW|5X0d@#k3?4VVemq2Js$jMeVc02VYJ%sK! z06KxsNg1dzir}T;zt3^rnlZFaI6&K>zi-Q@h9wn6+4wGuc2I{SLDxE|i&9jN@9hXx zN~_1rNFDD>D{UEFHXm!#%{MYXBzO~B5j0w;TGr4~r1?IhNQccvUyUl{2{k(gmOH|4 zjd8rBAb~1-NA2Jql^Q{8)it6tp;JVdr62Z_$q1mYn0Wi^^XmHEylZvSsu?v)60t?ssSg z*Q(FW`WzCcyvXCj{jlB;ROL>poxlF|Mq%}asc&G?Fn;6i;Ut$pI07qj8&&0NfdOC5 zV*jv>=k%B2E*BR8MTRArqGLZQ+m9Q(l!=HEW&St!KprEt}8ZZCN-~=%JL-YO{bySpt2f^6# zH3sP`ba#sQqMQ$Q*apJW7o}ZS67kqet<5LW23--Dkd|DA+ulHl$u}L3Ak?gZOs3vU zHsO8zu;NTA-f_*g$+Sh|JrW!|wO8S#g@cVmL)^ijXW5Zm{3%=d8xs3<-o=Wq-05f$ z3tu4PuSx|7$CFHV`Df@^+6B{&F<0&t#tR*oI`)?iZuQdQl(4TqTW6rT1r#iQDMP4q z#jO6I)FvQ&xA||S^2-|&Kb`(h+00)lwc#J$@8IZWXzpcY?C$DjZpO-J@V-IjyA;1$bFEjmG*vsvIJ- zexcaV)w#e56i7x8pz&{~AOBEPe`Fs&L{nb%_1Q09zn?0kP6j~mtOrU(mH%5!{exD; zfBL$i2dg2op`o$6o7HdXIMh;zS!6~9y^tC^p%4yXqESUskYrVwqk%G4#yTXtGPW3J z4@~P<-W3nnLD3uY*@8lzyz<|01!w)@&JHxGd}0YNjB^F6(d$~8jh*@yzg%Q?8J0?WLW9I@DdoY zJn7Dtcw4&20>o?c#OGp)Y4K8#<RFy1>jJuGfu2ph-{DfU>*1322+~Ps8$aP_Fn&pVtfP_QdfsJrclr_5K@_qwe-{Wd z4GWK>3O`Nw)XxsaLy$xRR+_@BO+9%2n#n(~m_AEguq^Q8@r@=0Cbk)rKn4P_Va`i^ z4Adw{PgKJdXF! z%N-?Ks20f!8cDw7Bff!=nQqNnQrrOuP6`JCWe|}j!r3M--y$rP0!A2?<2Lpk(Km^U zZd>a*`Y)}*s@UbSixA~ssgdcMT#tKPpm@GmP=76<|CJf>AaaA}QwFz^i~DNc4l_~Q z$CRh3n{t|SzvaWr)rIXZhL5!qm%;sc%n*(_SP*NG=5Af)dHt7Fr1p1smpfJf8-$~9 z2Kb4)Cvb(48rr!nE9HiMm@_4U3J(i)eTb*99xZcIADtrzwX55YuCq^G*6{|jJO~mc zC-a?)g9rC4Oi_ss?oBoMzOV)c;Vp@Ph*(3hOKXe3jKLvohF{2AUjl}Smu!L)t2M>Zgpc~{3y8i)B`1_FcJ4Q{8+4L|Y!koOy?*5kP z0VLylD`cBCsYVE4*jQ}}yIH-wI&zh3>ggxhVkQiEoJKjM)!2g$;$w50+^GnrQi0_l zSaG8lsPBKyQAtIdWzQ|X13M(?AbOAYY&M1v{-HrUSFAogs)}?=#49#PZ{Xg6>uoVc zW&wX&Tk$EMhf4y%I8TwFGrg-MSrvN~BG8UIV|^g~o-0^)_T+T*;VQk^;P`3vKB1h` zwPDoIGR4Kx3%`}|wf%kZ%k7|h|DjhQOts%W&UM^D{*>WwBAj$Q({2EX4jm-I{~q># zf(h_j_4(h0eU{%vIxc|R&5Q`O)?Qq~&xIPsJ((SZluHYg#4Q%7)`4vtK|<2gV?q!y zeB3!!PV}x~-s=*BD8|t~b2WhlFx`BP&XALo#cMguGBu}li#bSXb_y$-=0z_LsJk*< zG4RCuWKQ7i2oi|ZGR9}}b(PeJD-=oJ?#rbL))-8b66PTkujzOE4*XZ5>;(85Js#dZZy|i?4ra$^!e4zXX_BZ*l?-SE0g5;M2 z8tS0&ryAWqDWCmP<@ysC|J4Lte-l*XwklYlO<`N_vN{D_;nqW2d@nHCHv2-1f{>(` z{k{0mu(%XWX)Sq!*3j^$-tOMs*&I!nFiNsuN-;7Ba(ig#8xA}&_80ZIvo3uu;J<{E z+p$xFALY3p1;!r>`PUZkYyIy}E3h|rGd46cb~FC%-^(>+%jjho-ZC*LDyY<|GPARC zvT(31s3^;hPteJXj><7aD2+3X(SZ-)f`yzX)T$=Pt(j0lLpSLC@}Hof`!nVmgMsA# zul?x1D(Rp6qDQC_ z*WV-J{W8==#HV2y0m##U@G6ReeCQ={R<%n1_Bq<{x|VB#Ba^KUrNcMy;FX>{BdT2{ zPW{;PgszQCiV39n<NCIY>tOs>|a9+Xv!qxXuP%2_`~wN&a5Nj;VNtr`f1M z;uq*~ESPPL0IsN<(7Id(&$5cSXn4w= z&W^_C-CifTu8cQ36 zqA4OoC&#lwB;Iruev~!qSNbf~SWq7c)jBR7kGvWd-g6d9Wn2lS03)u_5MD#xp5VD} zS`-x+sBY1M_zQFf;GPFtg`~q9lSH`iJUYR82(B~v*P%@})Y-n2%*}SI-(@dUtVzZ# zzJE(yq?xK5DKkT3T3Q#*EQ`_4&@;|Grb);q-A>-%HG*F*iYK9^o&K&YwXJ%%r%Qx=Ntr6;$ z&8aWa4|IunqiuJIXCpqKEiAUoMEi(cMvn27U(Js?cyup_quqsT5G#>`HV1J$!O0 zcW!DOJp$xsrmL2aFS%wcO4D}KgOBqGO~l*9k%k8@lyw-s{Q0YR1|?axJ@z z!l7EA>f@K`GJOf+{)$k8Shnss8NmI-~>Mo$wBH45wPs_n`#w^Gl@D|wn|P173P zv-5^$lV5OQB&b{WRDzFk)5>Z~RyOito3U#H1m*q5I^JzbSu~ZdvdDp%Hf%6F;AqF! zyew%+5~;n`{5ZrVB$0ELw=T@A>{aj0m?@qWqE*A5!9+-O!zT}bolp;^G@6s$cAQ~D zKhQxuCaja;zmtf4_ffdn2jZ`C_Y-i*b_2=14wUZM|Cf6K|LQ&8pA_kz%KZ=jGW;bw z25I9kVGIOgsKLkl5=pO2_!OrLT=c=A0Ju{+JVw3A;m;V6^8ueiri%yILmH*^xHo6+ zma=LD;`^+4-d!5hG_Ye?S|%xxEX5qAVY)UZS(cWNI!#}|UqJuqgI*Uwq1Zl=x+#HGP$h}&C*aai zr{Yo-zLtj92ksEPG20=6sfB;QlkS%4c(}^hV#LE3gS)~Ei7hhlAkX33r*|>^_UyJ> z3}(+OFX~9%eQk6GpVz-rw>kXEVoqNmBOMu!36YMhMWiBo4D}g*sZ2>Wb(myb;$xuT zMO{H>=C*Z+L>DV26^3iFc>u|NS0&((_mWzBG=Y5|q4tY?#)9KEUAUtMXRsXn?Q3}O4+wHhVUwoP$=tv7FMby7D@5i61s&Q5H6z4)%MKlSN{nhEu; zvMM~WeOD`byc815;=lQYeB3FS`T2rO01lM(|7HTf|KO_k|HcG4>WP<=Esco?hJ)S;ZK&#cwkgMall)-=rz)oRT|ur&0-|L)zuSQQ+MHxr z_D>s-$L;=M14kP6AR7RpNo;E_9q}^16=ImF)$d`l$9(c~SMx0!LGZ1MSCJK}xSIFb zX|%(V4Cs+G+pu$FW}EEWZw z5Bp&a{~6yhT9rPf#$S|)Z6sH$TN}o=%r~b; z{@rK`+Aserarub=Kg);uF(Q#5+81*C9h2hPLlr8HB6>{()g8@wLQYx=Kx%wrR^)KG zu(Z-bGQQh>yh$iI)>5SS9%l&3FyckZ3kgTDuMagChW8Sjm~2@k4P@C(S5a+ZHnxiQ zX~n9UsZ7LR?BfciM_n1j!}eA=@K}U5#S8SDLyr0`25Vx_W9FuXC`FX&ClSw~j!|~E!2b%N zeP8a-mO!%N2gyw3KOr;V*M0i`Q?~b$>>1nG@C?P^Y>@(Uyo!_JNN}R{q6#6*ka^T8 znrJ#zON=5Mn6!vKF$yno8@fd34|>pg>=ueL?>{Ups{tI844n`lA$mDHS^`_rg#^mMMf zQW*}&YABaPQMj}7}QRv$hyilcC;;4?hW$pcbHQtkSg_kq4K0?tVDD>oK@jyPoLZ?%YSQDXuhwD;$BDCo^& zPfWDBP(!s~U`D-->1TLnI_D*)@Zsvye?sjh0 zPR1^7KlJJsyDHnmjMH~~k3o99o5Eh@7HKZxO}RF~42tq6U9Vuxj8-#`aXG z3<-KqNV?zvx4|>Ww2ZE{SC$51Z~b5QlVN10M9K9-DQBVO9r34gNAIcGdb3*x>JvIy znm)pu9SZT=Ge|-SeTTfK-E|EOOvrrRbfxelNzULslJwb%wp@EIS%S1#n|G||BK|Uh)AM=sF(PQ8zKW3Bpd;Iu+M2}zp zi5mxaa43rt89yft_`CFYoBgYdj;n(P(9deW&tFKZrYqV^$}W?{xr|qUTO5I!j80^wL%lkVsqSe``H1eh8t+7;zQ~}Ar z=rPPu72f(I5sv-<&QI{Qq54lneL75qBpG@6DU*W6`@2Oqc_XgAP4U24)d8MmqaF4S zGBnRzM?J{67y9=5t<|z*o#Yo$$|+ePgfndid~BnY!kEH8C!smJufL)dUKqr-*HqpW z1eYQ{H@KktCMF~Yz>ivIYieQ8t2v9ZSZZUz))Fo6QTl|$_wmcrb&%|@GUK`(+hE49qC^S;k3QqOd*w==W2Yp>YG*g_X>*ju|q9`LfY{Z?iJH2)* z+vX-4-+<|{T^wZ+E|YksWwC~y*c|+X)%b>;n@;<&q4n5a8nEFP6LO%4j;oXtd!0ZI zLwWQ;IXmLnV6XM1_VAnX{q718cqVUXSCxG4vbxMYXi+4jG`wz~IiXVZw)w=j%@_In zzzb!7e~Lc=)w1p6LZLwZu0KVey1(s2z^{ps%=Q`hQs^r8a3+37>^*GQ{X*1g>|5@U zWkz~Vjr*eFGHJ-`3%`Z8&dqw*+r@IxeRWz}ePtgMwl2pW#XQA% zWzep4;F^)C$P01x8;g3|2t{^=U*{%45k?UM(Np1iDE{5Pp3wN9Jl7nNm1+Kddgdy3 zP;U;0D|FVqhE*)BbTkXz;M-Ru+d|@?QY_AzdLMDSG2^(xI1MnVPiE#JhYU`9SP78H zT(K@sN+ehBbQ9)RtFQb=+5D9Q?7_7>f(gLHGcdSgeP#Yu;F0WukUua4$oT~i-|v==;Rg{kwnd| zTj5+HZOvy?SuXEKQze+2Sj(jdcjiE5Oc=>QAGh)) zAs>3B^_(p;SU}FBt~F)Nhnb3Shll?O$c%-x_+U&XZZAG-uKjk*E~f(AVhd->&(Cg3 zkarIy>BJoVNxt|=^c`_nGNxO+Gj|&S%cgcEOkm*#e zAn+pz{6EYAe*?Y6&hlt=0V<8k{{lV9z_C=)-!RVrnEL^Gu(epaPeomC3}i((CCUv% z&cmZ$a`hFrv~_aP;TB%>*f>^tI*eHSCg*BWSE_vHG&B+jlWQ^1q{>o}< zts-C}*krtx9@T8+!&vksJVm5;yoJ8Vd{d?OcN;+!U+WzR5bQ0m-8FBAlu`bKJ$ZTz z{wsE9zJ$Rh6_bNK=prvx2-~k8`0+r^gCIV3RxPuV-=hL1c%VvvYth5I-S???3&8!z zRu|u2)vo{nh{yfNXQ)9Y@K1T#e?!x(9jx7~jsHKI7Bk`iIu9X!eH$@&->aCXY5x@m z4X#9^Cg7QdN26n3n?{%}WW-&Z^GYTQZ^JElsq*wPzu_%j{`&$H6{Zuema+v>Ya z3nnA+=kk>i5fVH?yCwX5{YeXN-4SqoVy_4}XN|D)fgome9=3xc`qp4QZU{aqqc@YT zp=F4esIlY<&aTg4aNo4CZZ?eGOuShqCVEbMb~X9-xbWL$C-gNRpu|`EX!DGz7>0KW zo!53kG#Ydb$;%-avx#!p9L;;~&f^wi$HTe!cpu?i`_UpxXiPk04?s*l^vh8*jddce z6i^U(`X2@n;K${cpM{k_vgyA?k>7k~MZ;ccLm2h(=)KjALCcb=Y=#b5n2Bo`Hk8PH z-)INMtBVjfY*gU8J-9au&ZP@6BbP$@?&!e*Tit}>_qrYWx$QO#nYefJPK0yp*)xF@ zw>R}3Tpwn28|v18-lsU&&l!cRX`(d8Mb_Z*%PzU}>9VnrGm8m{Y7@-C8exbA5d>Iy zijkv6P#p5X>AbaW!O=QSdDi}~B&qbEomKdsQxjXq$w|8y-1YaXLHX^B5GA4;KzG#4 z&`sb84>lfgh0<=P3yrLl*_B%M@vmQwCU$cnXT4u{tmTga?D!6f60F=2+#TPHaAq=wH*^&5sjFmWE4m?N>;}UaWb~)O4Ojx4$38jS%4(p^+Ycrak__@j%z3 zPjjz@N`rwujVh1&rQc^S11{vFSEkbnBPFYfLmKQ9xMRDu0%Y@JI4voZQ3w17CJ#n$ z2exc(5U^UW0DILC?-%H?63vfQ^jToT%W9T;6tUh!nkKY0iC%17a``^S?X{-Wi5sZ8 zj=jB8`dCZ6+B{BC44N9BK2si%o1}N2;jt3=QuIBxa9C|3**xvM*nz?1=6rqFI|wCQ zFA)G?-OFIZ`C*?mY6HvDWG%B-G2umVpXuJD1*QcTERaLlhTz*Ulf6#eCcy1)m>bOU zlpKgE0yz1v@O(VH=?}PFqsG9L500~W`*x~R+#vs}wk9DdhCRYdmUKI14|zU&NeE=g5B#=-%J>+g7WKRS&Y5;+=XKS!cyj4z7+PNSlLeEtd3kY{v4 z{>?<;&2jU({~*$;*V6)F<^%L!0c9e+bkhNZClR3WFP)bLT-})dXz=sX4Sv5Y@mm4O z(9GHebYS1n#oO>loypq4@<;wxSMz>wOodvGfp&a!qE3TrmQDGk^qAbZ($J_}lLiWs z^Gt(sQ`2Vc=@31m^ANqP0^<-<8KNu$NNz zH$E{3+QFTF*|fP)A7J||EeC~NhPYhC;Kbr zjUQ{POa$F|6GoI+IDKhWoK)%UWDrteHw^{_k3l_+LSo5X3a`sb-ca?_u?flXtlk=X z{wk0hnUU%9^7rLq2jGO;UF>7!mZW;q@&Kv(_nF4KvzzLxIsH}}L5~^V)o6kpV}8Hw zUFHk))#NY!i<*Gp&h1H6Rm{L<=(RI?m>*$SY1QJKf~z&J5_LD-S3jYc;ySk(-#kZ& zd#Ba-_&9lCi4u3|=dQAAg{Z2r!a>3CL#kGLawF%j!yE=;iXoanZ+8}TSfxY|T`%|N zzN^{yPGq8(*ubrLOgLDr{sQla`0N=DD`IFG8!Xh~P^LWKmac8uO<^?GP(3d#IX`TZ zbI?_SO319r+P@XNmLC~4)B(qLHgiq*)-ms@r>+0ekn}8WiXJoMa&Dbr;T?h1ap`gfW04J}3n$Izf-Roz#3AdZ@b+z;Pt+tS z#jkncJDB~j6OJgBAE!>hEYIK_)2vi$m_O{kHZr9{ zp^m1JFhbyi%0>~b&QdJyxpHsq4w|K0?_bck5ayT8_Og4(U1C`1P(W@f%Nqh1oXFBt z2{++;u!U@tEWS&Z@}X0&Sk{W-Zh7VAcGhtj(KyAYxrVG0^C5oR`H?aIDPb;W^LqCh zw5BA`Q277X_OC1raAo@46^!j%%#F>wK}RYH9b!s(ffukmbJlsIwMLpEfVDRJHKhwjgoAdopI%gMWXD&eNRo zYHy7(adPQPcINGT=n?gEi;Efb02QmvaAoVDP5?HX3HRM8$9P!;g z0ttUghkw1R$MG-f^hc4--R)022I7}(r!wn80!a`v(j)={6Zp%dz(0Or_>WnCc!Z&= zqlKHDvA4Mk=vMHYw!P~jH|pc~`^nhdPs^xO);?Jo%O?TPr(FssyJ8I}Q%+%ZUspAL zmCXzGxLb9k_-MoozEilXCpcMC&om*}YEZchF)8*ouO$H+o=8e@$`Vtc6j7;B%5bQIfW^DDLCMQ8mssn5^ z`E~jEeI~}n(eoz0K8ettvrwY1Jnogrpp#U-p_9HY1ejch0~Sx8ufu{hdm%FWwJCeg z3{COCKq4Tsht2RlmznO873867RCPmjGXT5kCN1N%pRFnXrZ98#$-Vltl+Aa67-_0_ z+i3CtiO(MY5~gJCILk9M%O541QMt}D)@EQ8PC?djrxkglUl;XS*XiZ!Na1&OvGp@ z&{+MjWU@nIY>c<7X@}GNUeL zj^%OvW(8U>X8Cy_X>*cptYj?t$RWrs#TFpZ1=u$ z6_%v+?PF<)=+WiG(pv#LPKR;X!$!Iet3~&_TO{zrr4x=hPR`Q#30wzh(+u+17Zq z=4%HarxPE@7H-^WZE+I@CNt0Q*3FtCAgJ<{TjlYyiUba-n89x-8F56@uz|USkUC?w zGL(Q{Zdnn(ZVwoh%?_8Rp(r!ZE5p<;(B&mFs)u0^N>Kd}|NM2O{J?`f+tniN3(T@j zu_Y%_>GDre3QU1Dnbvev`nu?lJng=IzIAT_8I?}+`w@csqWEf20%2XQ>0m-yj7dU8 zdY8!DkEj}6lJ+rZxi-}uv{JUrdzZZJP4^dTep@$-;YJXO91|bF$ya994O7lfdp{L~ zit;FbBUuH@&KD3wlAyY$md)3FCGb945oOWM71kJ!OLyiQ8<#^-26tVwz1B+|x;7#L z;1p@4L*DS(!+m3CbQ122VJ}w_0+-~~!+lj$02sMDGWyW-Z$zK(%}QS~S#y*Yx*qhD zha#&W6yYOJN+sK4PL~E1f@jJ=`EShGZ;_uhxU0lQad{-SV!g=^cw_XbDQjVT|K*Z1 z++8KC9Fv0>rra^f099^jh>g3OOUo`=IzWbz$~bM0*}l%gR0->-&b7K?<5vkH-g0y$ zHRbRDv(wNTu@a_mLf0$>2^#f@+r;vR`wX7!jWCxD(Og2i4t)!PLt~I?PviO4=gTD) zQlj_An)mtX4`oY6NX#KK`)~7YIpiu1S5>(7MV-;?MQRwYs&$$TMG}YZH2d{A0Ciq* zg`}@r+;Ck309foP< z;To%b<_mI(GdGyeu8B+j_`)wUft1j=;!o6tyOOR`UfQyWn>nXvH*>^aQA>Szc?20L z`1^C4a^u*1CsI3rT6$vZ$M-A1o zX+OrRq>7-YwMkso?V=@8SdJ9CHCwQrHha%0DoL=l?)5v=mHV46F|4xJ0>^mXdzmzG zio#n_-sKjmQhS}1<;MYv!MPiI-y%!$VMnwX#T7f9!pjsNIEvHR@ZOU*n(P}z-@CJ0 z5G@;9K)wo&%w#!~?Cr*b6_4|ysPzpMFs5CZdw|&%hV~~_ibLTr*Nn+Y(ahSDrF5*k z6Xj+S$7~lal8ir`<0N|~3sfia!w4m_d5WvTe!2D8Gox{3q)B1U=XKmEbLte4yB>SI zG29sTpSD0imytP|_0h4lMzb28XTW>?EjyMzypQ_Cl+y6F;_)71_L}(eVu`pwOkCb? zu-#y2<$$bYcMqYeI}U8-gFiHlB+bACwhtH2aprji2Q7Pfv1Mu0J+S62=rA8SJErk1 zh)2c?OsC_0nzA9pgvUp6@2B*j%lr{)JtRbCE$RmQ^uE?iRgI=;q+Q|#-n25I)kJC6 zvkL?lD9rOgaRC+Gk-~lKNz@5cn`=uq*5~3bx8z17_QeF;B zanTHfgTE=P9%M)=e*y-Smnt> z=(@x?{dDv(FhNmDQ!0;w!g+D|CTPOBD!b96-(ztXNH}$}f=l*}lMX4!&weD*mkgy`P6shh>hS>1NPC?A1RbvesEBRjH;b#{B)GK8>q@_bz2|k^~N9T ziF*gF^6h}wu-%^TB(7Hx<2hACmNiB~`*Ef*Mv=1+{Hcpe{jehcOk^5`#Pnme&w+SKvhEIH*@!{8VZOnfo?h(lrKu1R z)H+T}mOyXUji7s;g!IOiU}|&cSG>6oK6KeaBQ*b`Q7<_$tUJ_m9Gk92i7__ous^K%EcwHNqQQgYHTvLi@fOhRti zgn%KB<;#gofY>lg-~IIfvE_o0VcSQKNA8X`e!-7|eC;lbj9Ceh=UkQxme@NdyOplK zkHzOBpKmkXih+T;1Nf%(Q47K1lDstwro?gkMk< z5I@q6g;v;lir>pGvv^@peR@K{5x_&ER2<;(_uT&O@8b zJ!C}`j@q1pMVjyW2v9zfw+l5>^~A`zcq4SQoKT?;Z`)%qeM0@1sg#_wlUaZxl3Z{n z1Z#E3`Zz=FHZY3Dy0tq1+{5u?2UV%y#FMtDwOe@k{ke0sTyjWZATT@{dkAk-BO1YSw#rAn8KI!>KzPOMErJ9bJifW?3NoF*>#rx4R@FLq}Z~~bl0>R_?=sRe= zN4tlEo*iw_0PLF(7)5pQ?Pq{Wc|@3ZNi+2{su5Fc(_PRGlg=wuEvI&79gM|r>D>sS zE134j^S7>_oS{#i9+e1-VV-Q&7$^I~;GjDpi7LIP`%r3xc0Ipiv2BDe^T5fhPF$h0 zHbcx<^gL{-f8fW5kwR{a1twOYAM~s|p4B1vpOtt9pc7BQiJj~XMlAt6Tw+Fab+kyA z=7ILPTxl}8@2`6hkrK5rpZtP98%O0Oh9yQumVR%Xz7QJ;d&|Ey*CN7}N!TQ-;377~ z8D5_Oq;OcS{y)ynsXg!@%G2rCwr$%+$F^;EjDOTo$F{AG)v;~ccG5AnXXj>SE_V0X zFHl!iPt`f~{@$ZHk`CSm^9aNZzaa@RPhD<|u{-n;eflPN!-UJAE*>Qbh!T{R<{o{T z8JlM_USj%o0vR&F#%0)FD(I-A$|E)WrazjZEmrv82tYMVBEXz$eg?bC@*+zW4A zq4%Xe>=i+lXRq;{$%;|?PvX-GqpYA31@QNE@P7Ft)!{c(!c$`c(wX!psNkbv4dbgY zs$bq3R3QR?dryE#?={_u5(kq1^0aU4YL;*QzbTBUf-cg=i}1n8QGh3sAH~8!_(Au$ z-^tIyIjxzUe}lxsBuu44+(jw_<>^>sdw>6d3n<_2G{`masSW*fJSveKCsP{Fi3#y<(Q#gzJ*8^_k9ac`1cu)1O} z^|9VgydX#!m3CH2;LJX(-I#4l7ZnW_orynzbtSw<8*H3g2nV1+|i z)?{(Q_5OFM_esiH#C-3ndT8fVsc=604PJ9QWzow%Y+|4+`(ges`M;GvGfj-rX;X9L zofgq|2z_w{Xc@t2>1pBAP_%2kM6%om8?q<33Nywc4Ca6a^_-b`0_GwUO0@ zM>Ex1Sscx=e-5#vg?!St#m>3pD7+gX3sO}f3jwxTER`0Qu&#N}OJ%}m!=?#S1!WyW zrb1p1T)~*EZo0Bo+MuHYV@3>4%)fnM@l&*pM=oruoYnknCL$|9F*-*k;U3318c&NJ zH6}^%R;&eUt=)nuD$RYFFn=+c+ZsNS_iD=H;&m@Tm@KvH+gZUrSJmzDy()(=%tEU- zPXVv}t?TEjkoe6>ab4#grM=8Cb_Hha2XNeHVVF~#)p+tlrOfAMLozO=6wuz3RZBAb zOJsF?QAftGByHP+Rcp{oRr=TzKdcK_RxR5Xby#t~bSz;+W;O6K<*1<1_hD$~`Lp90 zIK*5laK-c!GI)h2k9-T7osZ?=#9YzIi2(ch@eBKq^kCm9f&(_*@FImvJE+_zheGPh zIe%J9$A`Uyh8ZRV=S&neBUwE4svPUgVvVW(v}YQWHa6A1*aFXx@4q%;*NUpr`?M{J z7XwU)$VsOepm|kh<^J%B4RJ6%TFmK;fospHCOpoyoP|=eKUcaDQCOdI*hc`Tcfdh) zdhV8KX7K3D3~^-qXl$o};v1j*h3_NPOv!J@Ks=jSeh#j*Fu6o1rcS7=tHM!e-0qp? z#U|fR55$ETD{mYF3`MW*mQc10q{SebOr{N_HoUUVHR~Bx0*kcBP@{ZAj=0Y3TJ&F8 zluYR5{HhAdcS5(x?C;FWQj*vgpMXtvrw^8tHG9+ym(HnED4rCx9cZplqd^D1?_&Fl zZlrHxI7~|Pf}fCC;BPlo)IO^Nx!0gp0+JP4U5NxOsk!YY{KFb0>|vo5UkPNVSQ;zi zI&Bs<4c1N4lxmHMNSaD-J=S{nxiK}b1GXzgF)532YF5~MUX|g>G%0Ae0pPO%7w$oZ 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

VAUPR(sM@}6Rz=}|2uL-3t$T)n%l#G;is*sn- z%%&tOH6@)^-?AT<$&JE_=KUkZdxjQ93yNp5!WTXaiPIWRv*UdbQialTHb3n4(d%oO zB1;{Db#s#OM*(U{fEr}Dx`uU6dpL?^5iLTe0d7h?Wc+sPa20%!SDK|kpO=G9Z+0zV zrXSr0Kmx1Do&(&vrmenQILCGTHz2>h;Eg|SzH=AK_K}XUZV#dGgjb=l1K8N8Yxer3 zvA2;t-lqlRAcFtwM*q+Hmp|-g_h0?!P$Y}ZR}xflj|>P|YXd7h!@L1_#eEyBJd$_l zFJNK7btJ1iuY|_8z;?IV1jhkbz3}vvn2P*QB>Xy%ZH8SQnRIdZ0Z z`<9w~b2-X0N(}4XL{IBsxK*z< zk_@VNEjSih^KbFW-&gkz1Dm2*yL2ms!yQ$YIGZOcTc>rJiOu~5lw!$J585yYAJL87 z04na3nX_NsY_sGlteK!)I)?@W69?_s->Ogie!zcZM}GRF1EmFvMP^j5D>Zue$Oy?q z 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ΜlhG}+ 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Ν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

(*qYg9#iZMR8E7>cf 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

`x_^^pWTT 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

Devjvunh&cjb|ozJ8wt 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àxw|_PH8Nb6`w%0b;dSBd;;A}@}%HO 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 E5+wV2>9o#3!u~FO@vpFz)45peS!N-=njd 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 delta 147012 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 diff --git a/python_apps/python-virtualenv/requirements b/python_apps/python-virtualenv/requirements index 77e5614171..18c54a77a9 100644 --- a/python_apps/python-virtualenv/requirements +++ b/python_apps/python-virtualenv/requirements @@ -1,3 +1,4 @@ +apache-libcloud==0.15.1 argparse==1.2.1 amqplib==1.0.2 PyDispatcher==2.0.3 From c2411b6f4100249ac964b6dbb444efe6baefbf22 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 10 Jul 2014 17:56:41 -0400 Subject: [PATCH 169/310] CC-5884: Modify Pypo -> Download files from cloud storage --- airtime_mvc/application/configs/conf.php | 2 + airtime_mvc/application/models/Schedule.php | 10 +++- airtime_mvc/application/models/StoredFile.php | 53 +++++++++++++++---- .../rest/controllers/MediaController.php | 13 +++-- python_apps/pypo/pypofile.py | 17 ++++-- 5 files changed, 77 insertions(+), 18 deletions(-) diff --git a/airtime_mvc/application/configs/conf.php b/airtime_mvc/application/configs/conf.php index 4063747c5b..2c11755cfd 100644 --- a/airtime_mvc/application/configs/conf.php +++ b/airtime_mvc/application/configs/conf.php @@ -30,6 +30,8 @@ public static function loadConfig() { // Name of the web server user $CC_CONFIG['webServerUser'] = $values['general']['web_server_user']; $CC_CONFIG['rabbitmq'] = $values['rabbitmq']; + + $CC_CONFIG['s3'] = $values['s3']; $CC_CONFIG['baseDir'] = $values['general']['base_dir']; $CC_CONFIG['baseUrl'] = $values['general']['base_url']; diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index 4b2cf044e4..810852bbf6 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -724,7 +724,7 @@ private static function createInputHarborKickTimes(&$data, $range_start, $range_ } } - private static function createFileScheduleEvent(&$data, $item, $media_id, $uri) + private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $filesize, $object_name, $isInCloud) { $start = self::AirtimeTimeToPypoTime($item["start"]); $end = self::AirtimeTimeToPypoTime($item["end"]); @@ -756,6 +756,9 @@ private static function createFileScheduleEvent(&$data, $item, $media_id, $uri) 'show_name' => $item["show_name"], 'replay_gain' => $replay_gain, 'independent_event' => $independent_event, + 'filesize' => $filesize, + 'object_name' => $object_name, + 'is_in_cloud' => $isInCloud ); if ($schedule_item['cue_in'] > $schedule_item['cue_out']) { @@ -889,7 +892,10 @@ private static function createScheduledEvents(&$data, $range_start, $range_end) $media_id = $item['file_id']; $storedFile = Application_Model_StoredFile::RecallById($media_id); $uri = $storedFile->getFilePath(); - self::createFileScheduleEvent($data, $item, $media_id, $uri); + $object_name = $storedFile->getResourceId(); + $filesize = $storedFile->getFileSize(); + $isInCloud = $storedFile->isInCloud(); + self::createFileScheduleEvent($data, $item, $media_id, $uri, $filesize, $object_name, $isInCloud); } elseif (!is_null($item['stream_id'])) { //row is type "webstream" diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index e30851e261..01ccdd0a6b 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -473,7 +473,7 @@ public function getFileExtension() $mime = $this->_file->getDbMime(); - if ($mime == "audio/ogg" || $mime == "application/ogg") { + if ($mime == "audio/ogg" || $mime == "application/ogg" || $mime == "audio/vorbis") { return "ogg"; } elseif ($mime == "audio/mp3" || $mime == "audio/mpeg") { return "mp3"; @@ -495,15 +495,20 @@ public function getFilePath() { assert($this->_file); - $music_dir = Application_Model_MusicDir::getDirByPK($this-> - _file->getDbDirectory()); - if (!$music_dir) { - throw new Exception("Invalid music_dir for file in database."); + if ($this->isInCloud()) { + return $this->getCloudUrl(); + } else { + + $music_dir = Application_Model_MusicDir::getDirByPK($this-> + _file->getDbDirectory()); + if (!$music_dir) { + throw new Exception("Invalid music_dir for file in database."); + } + $directory = $music_dir->getDirectory(); + $filepath = $this->_file->getDbFilepath(); + + return Application_Common_OsPath::join($directory, $filepath); } - $directory = $music_dir->getDirectory(); - $filepath = $this->_file->getDbFilepath(); - - return Application_Common_OsPath::join($directory, $filepath); } /** @@ -555,7 +560,37 @@ public function getRelativeFileUrl($baseUrl) { return $baseUrl."api/get-media/file/".$this->getId().".".$this->getFileExtension(); } + + public function isInCloud() + { + $location = CcMusicDirsQuery::create()->findPk($this->_file->getDbDirectory()); + if ($location->getType() == "cloud") { + return true; + } + return false; + } + + public function getCloudUrl() + { + $CC_CONFIG = Config::getConfig(); + return $CC_CONFIG["s3"]["host"]."/".$CC_CONFIG["s3"]["bucket"]."/" . urlencode($this->getResourceId()); + } + + public function getResourceId() + { + return $this->_file->getDbResourceId(); + } + public function getFileSize() + { + if ($this->isInCloud()) { + //TODO: error checking - 403 forbidden> + return strlen(file_get_contents($this->getCloudUrl())); + } else { + return filesize($this->getFilePath()); + } + } + public static function Insert($md, $con) { // save some work by checking if filepath is given right away diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 0489d086e5..294677909a 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -232,7 +232,7 @@ public function putAction() //Our RESTful API takes "full_path" as a field, which we then split and translate to match //our internal schema. Internally, file path is stored relative to a directory, with the directory //as a foreign key to cc_music_dirs. - if (isset($requestData["full_path"])) { + /*if (isset($requestData["full_path"])) { $fileSizeBytes = filesize($requestData["full_path"]); if ($fileSizeBytes === false) { @@ -254,20 +254,25 @@ public function putAction() $file->setDbFilepath($filePathRelativeToStor); $file->setDbDirectory(1); //1 corresponds to the default stor/imported directory. } - } else if (isset($requestData["s3_object_name"])) { + }*/ + + if (isset($requestData["s3_object_name"])) { $cloud_cc_music_dir = CcMusicDirsQuery::create() ->filterByType("cloud") ->findOne(); $file->setDbDirectory($cloud_cc_music_dir->getId()); $file->setDbResourceId($requestData["s3_object_name"]); + + //Application_Model_Preference::updateDiskUsage($requestData["filesize"]); } $now = new DateTime("now", new DateTimeZone("UTC")); $file->setDbMtime($now); $file->save(); - /* $this->removeEmptySubFolders( - isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/organize/" : "/srv/airtime/stor/organize/"); */ + //get the filesize and update disk_usage + $storedFile = Application_Model_StoredFile::RecallById($file->getDbId()); + Application_Model_Preference::updateDiskUsage($storedFile->getFileSize()); $this->getResponse() ->setHttpResponseCode(200) diff --git a/python_apps/pypo/pypofile.py b/python_apps/pypo/pypofile.py index c636e374c8..4292adf62b 100644 --- a/python_apps/pypo/pypofile.py +++ b/python_apps/pypo/pypofile.py @@ -2,6 +2,7 @@ from threading import Thread from Queue import Empty +from cloud_storage_downloader import CloudStorageDownloader import logging import shutil @@ -9,6 +10,7 @@ import sys import stat + from std_err_override import LogWriter # configure logging @@ -35,16 +37,21 @@ def copy_file(self, media_item): """ src = media_item['uri'] dst = media_item['dst'] + is_in_cloud = media_item['is_in_cloud'] try: - src_size = os.path.getsize(src) + if is_in_cloud: + src_size = media_item['filesize'] + else: + src_size = os.path.getsize(src) except Exception, e: self.logger.error("Could not get size of source file: %s", src) return - + dst_exists = True try: dst_size = os.path.getsize(dst) + self.logger.debug(dst_size) except Exception, e: dst_exists = False @@ -66,7 +73,11 @@ def copy_file(self, media_item): """ copy will overwrite dst if it already exists """ - shutil.copy(src, dst) + if is_in_cloud: + csd = CloudStorageDownloader() + csd.download_obj(dst, media_item['object_name']) + else: + shutil.copy(src, dst) #make file world readable os.chmod(dst, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) From e6bbf8e84cf27080e62716a72d0a9fb622d39d8b Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 10 Jul 2014 17:57:38 -0400 Subject: [PATCH 170/310] CC-5884: Modify Pypo -> Download files from cloud storage --- python_apps/pypo/cloud_storage_downloader.py | 45 ++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 python_apps/pypo/cloud_storage_downloader.py diff --git a/python_apps/pypo/cloud_storage_downloader.py b/python_apps/pypo/cloud_storage_downloader.py new file mode 100644 index 0000000000..51a5c99535 --- /dev/null +++ b/python_apps/pypo/cloud_storage_downloader.py @@ -0,0 +1,45 @@ +import os +import logging +import ConfigParser +import urllib2 + +from libcloud.storage.types import Provider, ContainerDoesNotExistError, ObjectDoesNotExistError +from libcloud.storage.providers import get_driver + +CONFIG_PATH = '/etc/airtime/airtime.conf' + +class CloudStorageDownloader: + def __init__(self): + config = self.read_config_file(CONFIG_PATH) + + S3_CONFIG_SECTION = "s3" + self._s3_bucket = config.get(S3_CONFIG_SECTION, 'bucket') + self._s3_api_key = config.get(S3_CONFIG_SECTION, 'api_key') + self._s3_api_key_secret = config.get(S3_CONFIG_SECTION, 'api_key_secret') + + def download_obj(self, dst, obj_name): + cls = get_driver(Provider.S3) + driver = cls(self._s3_api_key, self._s3_api_key_secret) + #object_name = os.path.basename(urllib2.unquote(obj_url).decode('utf8')) + try: + cloud_obj = driver.get_object(container_name=self._s3_bucket, + object_name=obj_name) + except ObjectDoesNotExistError: + logging.info("Could not find object: %s" % obj_name) + exit(-1) + logging.info('Downloading: %s to %s' % (cloud_obj.name, dst)) + cloud_obj.download(destination_path=dst) + + def read_config_file(self, config_path): + """Parse the application's config file located at config_path.""" + config = ConfigParser.SafeConfigParser() + try: + config.readfp(open(config_path)) + except IOError as e: + print "Failed to open config file at " + config_path + ": " + e.strerror + exit(-1) + except Exception: + print e.strerror + exit(-1) + + return config \ No newline at end of file From 6f119b006fd62ed1b9de1212448dc7cf03911ffb Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 10 Jul 2014 17:58:00 -0400 Subject: [PATCH 171/310] CC-5884: Modify Pypo -> Download files from cloud storage --- python_apps/pypo/cloud_storage_downloader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/pypo/cloud_storage_downloader.py b/python_apps/pypo/cloud_storage_downloader.py index 51a5c99535..059b31275e 100644 --- a/python_apps/pypo/cloud_storage_downloader.py +++ b/python_apps/pypo/cloud_storage_downloader.py @@ -42,4 +42,4 @@ def read_config_file(self, config_path): print e.strerror exit(-1) - return config \ No newline at end of file + return config From e7dfc08128a7f53cda1ee3e172702366c8c19735 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 10 Jul 2014 17:59:27 -0400 Subject: [PATCH 172/310] CC-5892: Handle when a file is downloaded from the Airtime library --- .../application/controllers/ApiController.php | 12 ++++++++++++ .../controllers/AudiopreviewController.php | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index 98ca2ce601..47573065d1 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -81,6 +81,18 @@ public function getMediaAction() $media = Application_Model_StoredFile::RecallById($fileId); if ($media != null) { + + if ($media->isInCloud()) { + if ("true" == $this->_getParam('download')) { + header('Content-type:'.$media->getPropelOrm()->getDbMime()); + header('Content-Disposition: attachment; filename="'.$media->getResourceId().'"'); + header('Content-length:'.$media->getFileSize()); + echo $media->getCloudUrl(); + exit; + } else { + $this->_redirect($media->getCloudUrl()); + } + } $filepath = $media->getFilePath(); // Make sure we don't have some wrong result beecause of caching diff --git a/airtime_mvc/application/controllers/AudiopreviewController.php b/airtime_mvc/application/controllers/AudiopreviewController.php index af5e7fa0d2..e90c34a399 100644 --- a/airtime_mvc/application/controllers/AudiopreviewController.php +++ b/airtime_mvc/application/controllers/AudiopreviewController.php @@ -46,8 +46,8 @@ public function audioPreviewAction() } if ($type == "audioclip") { - $uri = $baseUrl."api/get-media/file/".$audioFileID; $media = Application_Model_StoredFile::RecallById($audioFileID); + $uri = $baseUrl."api/get-media/file/".$audioFileID; $mime = $media->getPropelOrm()->getDbMime(); } elseif ($type == "stream") { $webstream = CcWebstreamQuery::create()->findPk($audioFileID); From 039a51121b74be5f985d7465fa3d858ca5923621 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 11 Jul 2014 16:16:30 -0400 Subject: [PATCH 173/310] CC-5885: Factor out cloud storage code into separate class --- airtime_mvc/application/configs/conf.php | 2 +- airtime_mvc/application/models/StoredFile.php | 2 +- .../airtime_analyzer/analyzer_pipeline.py | 8 ++-- .../cloud_storage_uploader.py | 43 +++++++++++++++++++ .../airtime_analyzer/filemover_analyzer.py | 41 +----------------- .../airtime_analyzer/message_listener.py | 11 ++--- python_apps/pypo/cloud_storage_downloader.py | 20 ++++----- 7 files changed, 67 insertions(+), 60 deletions(-) create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py diff --git a/airtime_mvc/application/configs/conf.php b/airtime_mvc/application/configs/conf.php index 2c11755cfd..26a35b404e 100644 --- a/airtime_mvc/application/configs/conf.php +++ b/airtime_mvc/application/configs/conf.php @@ -31,7 +31,7 @@ public static function loadConfig() { $CC_CONFIG['webServerUser'] = $values['general']['web_server_user']; $CC_CONFIG['rabbitmq'] = $values['rabbitmq']; - $CC_CONFIG['s3'] = $values['s3']; + $CC_CONFIG['cloud_storage'] = $values['cloud_storage']; $CC_CONFIG['baseDir'] = $values['general']['base_dir']; $CC_CONFIG['baseUrl'] = $values['general']['base_url']; diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 01ccdd0a6b..bb2d040a32 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -573,7 +573,7 @@ public function isInCloud() public function getCloudUrl() { $CC_CONFIG = Config::getConfig(); - return $CC_CONFIG["s3"]["host"]."/".$CC_CONFIG["s3"]["bucket"]."/" . urlencode($this->getResourceId()); + return $CC_CONFIG["cloud_storage"]["host"]."/".$CC_CONFIG["cloud_storage"]["bucket"]."/" . urlencode($this->getResourceId()); } public function getResourceId() diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 89513fd4c7..0202c26879 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -5,6 +5,7 @@ import multiprocessing from metadata_analyzer import MetadataAnalyzer from filemover_analyzer import FileMoverAnalyzer +from cloud_storage_uploader import CloudStorageUploader class AnalyzerPipeline: """ Analyzes and imports an audio file into the Airtime library. @@ -18,7 +19,7 @@ class AnalyzerPipeline: @staticmethod def run_analysis(queue, audio_file_path, import_directory, original_filename, - s3_bucket, s3_api_key, s3_api_key_secret): + cloud_provider, cloud_bucket, cloud_api_key, cloud_api_key_secret): """Analyze and import an audio file, and put all extracted metadata into queue. Keyword arguments: @@ -52,8 +53,9 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename, # First, we extract the ID3 tags and other metadata: metadata = dict() metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) - metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata, - s3_bucket, s3_api_key, s3_api_key_secret) + #metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) + csu = CloudStorageUploader(cloud_provider, cloud_bucket, cloud_api_key, cloud_api_key_secret) + metadata = csu.upload_obj(audio_file_path, metadata) metadata["import_status"] = 0 # imported # Note that the queue we're putting the results into is our interprocess communication diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py new file mode 100644 index 0000000000..4fa2da0b77 --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -0,0 +1,43 @@ +import os +import logging +import uuid + +from libcloud.storage.providers import get_driver +from libcloud.storage.types import Provider, ContainerDoesNotExistError + +class CloudStorageUploader: + def __init__(self, provider, bucket, api_key, api_key_secret): + self._provider = provider + self._bucket = bucket + self._api_key = api_key + self._api_key_secret = api_key_secret + + def upload_obj(self, audio_file_path, metadata): + file_base_name = os.path.basename(audio_file_path) + file_name, extension = os.path.splitext(file_base_name) + object_name = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension) + + cls = get_driver(getattr(Provider, self._provider)) + driver = cls(self._api_key, self._api_key_secret) + + try: + container = driver.get_container(self._bucket) + except ContainerDoesNotExistError: + container = driver.create_container(self._bucket) + + extra = {'meta_data': {'filename': file_base_name}} + + with open(audio_file_path, 'rb') as iterator: + obj = driver.upload_object_via_stream(iterator=iterator, + container=container, + object_name=object_name, + extra=extra) + + '''remove file from organize directory''' + try: + os.remove(audio_file_path) + except OSError: + logging.info("Could not remove %s" % audio_file_path) + + metadata["s3_object_name"] = object_name + return metadata diff --git a/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py index 8d899152fc..b759ecab74 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py @@ -18,8 +18,7 @@ def analyze(audio_file_path, metadata): raise Exception("Use FileMoverAnalyzer.move() instead.") @staticmethod - def move(audio_file_path, import_directory, original_filename, metadata, - s3_bucket, s3_api_key, s3_api_key_secret): + def move(audio_file_path, import_directory, original_filename, metadata): """Move the file at audio_file_path over into the import_directory/import, renaming it to original_filename. @@ -43,8 +42,6 @@ def move(audio_file_path, import_directory, original_filename, metadata, # TODO: Also, handle the case where the move fails and write some code # to possibly move the file to problem_files. - #cloud storage doesn't need this - ''' max_dir_len = 32 max_file_len = 32 final_file_path = import_directory @@ -79,48 +76,12 @@ def move(audio_file_path, import_directory, original_filename, metadata, #Ensure the full path to the file exists mkdir_p(os.path.dirname(final_file_path)) - ''' - file_base_name = os.path.basename(audio_file_path) - file_name, extension = os.path.splitext(file_base_name) - object_name = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension) - - from libcloud.storage.types import Provider, ContainerDoesNotExistError - from libcloud.storage.providers import get_driver - - cls = get_driver(Provider.S3) - driver = cls(s3_api_key, s3_api_key_secret) - - try: - container = driver.get_container(s3_bucket) - except ContainerDoesNotExistError: - container = driver.create_container(s3_bucket) - - extra = {'meta_data': {'filename': file_base_name}} - #libcloud complains when float objects are in metadata - #extra = {'meta_data': metadata} - - with open(audio_file_path, 'rb') as iterator: - obj = driver.upload_object_via_stream(iterator=iterator, - container=container, - object_name=object_name, - extra=extra) - - #remove file from organize directory - try: - os.remove(audio_file_path) - except OSError: - pass - - #cloud storage doesn't need this - ''' #Move the file into its final destination directory logging.debug("Moving %s to %s" % (audio_file_path, final_file_path)) shutil.move(audio_file_path, final_file_path) metadata["full_path"] = final_file_path - ''' - metadata["s3_object_name"] = object_name return metadata def mkdir_p(path): diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 9dd25a436c..e723542d79 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -74,10 +74,11 @@ def __init__(self, config): self._vhost = config.get(RMQ_CONFIG_SECTION, 'vhost') # Read the S3 API setting from the config file - S3_CONFIG_SECTION = "s3" - self._s3_bucket = config.get(S3_CONFIG_SECTION, 'bucket') - self._s3_api_key = config.get(S3_CONFIG_SECTION, 'api_key') - self._s3_api_key_secret = config.get(S3_CONFIG_SECTION, 'api_key_secret') + CLOUD_STORAGE_CONFIG_SECTION = "cloud_storage" + self._provider = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'provider') + self._bucket = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'bucket') + self._api_key = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key') + self._api_key_secret = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key_secret') # Set up a signal handler so we can shutdown gracefully # For some reason, this signal handler must be set up here. I'd rather @@ -210,7 +211,7 @@ def spawn_analyzer_process(self, audio_file_path, import_directory, original_fil q = multiprocessing.Queue() p = multiprocessing.Process(target=AnalyzerPipeline.run_analysis, args=(q, audio_file_path, import_directory, original_filename, - self._s3_bucket, self._s3_api_key, self._s3_api_key_secret)) + self._provider, self._bucket, self._api_key, self._api_key_secret)) p.start() p.join() if p.exitcode == 0: diff --git a/python_apps/pypo/cloud_storage_downloader.py b/python_apps/pypo/cloud_storage_downloader.py index 059b31275e..2ae6931a9d 100644 --- a/python_apps/pypo/cloud_storage_downloader.py +++ b/python_apps/pypo/cloud_storage_downloader.py @@ -1,9 +1,8 @@ import os import logging import ConfigParser -import urllib2 -from libcloud.storage.types import Provider, ContainerDoesNotExistError, ObjectDoesNotExistError +from libcloud.storage.types import Provider, ObjectDoesNotExistError from libcloud.storage.providers import get_driver CONFIG_PATH = '/etc/airtime/airtime.conf' @@ -12,17 +11,18 @@ class CloudStorageDownloader: def __init__(self): config = self.read_config_file(CONFIG_PATH) - S3_CONFIG_SECTION = "s3" - self._s3_bucket = config.get(S3_CONFIG_SECTION, 'bucket') - self._s3_api_key = config.get(S3_CONFIG_SECTION, 'api_key') - self._s3_api_key_secret = config.get(S3_CONFIG_SECTION, 'api_key_secret') + CLOUD_STORAGE_CONFIG_SECTION = "cloud_storage" + self._provider = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'provider') + self._bucket = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'bucket') + self._api_key = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key') + self._api_key_secret = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key_secret') def download_obj(self, dst, obj_name): - cls = get_driver(Provider.S3) - driver = cls(self._s3_api_key, self._s3_api_key_secret) - #object_name = os.path.basename(urllib2.unquote(obj_url).decode('utf8')) + cls = get_driver(getattr(Provider, self._provider)) + driver = cls(self._api_key, self._api_key_secret) + try: - cloud_obj = driver.get_object(container_name=self._s3_bucket, + cloud_obj = driver.get_object(container_name=self._bucket, object_name=obj_name) except ObjectDoesNotExistError: logging.info("Could not find object: %s" % obj_name) From 9d0f564190fe6c8cda0a08c7969d3586efbed615 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 11 Jul 2014 16:17:13 -0400 Subject: [PATCH 174/310] Prevent analyzer from crashing if it is reporting a failure to Airtime --- .../modules/rest/controllers/MediaController.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 294677909a..fb77c91c77 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -222,6 +222,12 @@ public function putAction() $requestData = json_decode($this->getRequest()->getRawBody(), true); $whiteList = $this->removeBlacklistedFieldsFromRequestData($requestData); $whiteList = $this->stripTimeStampFromYearTag($whiteList); + + if ($requestData["import_status"] == 2) { + $file->setDbImportStatus(2)->save(); + $this->importFailedResponse(); + return; + } if (!$this->validateRequestData($file, $whiteList)) { $file->save(); @@ -384,6 +390,13 @@ private function fileNotFoundResponse() $resp->setHttpResponseCode(404); $resp->appendBody("ERROR: Media not found."); } + + private function importFailedResponse() + { + $resp = $this->getResponse(); + $resp->setHttpResponseCode(200); + $resp->appendBody("ERROR: Import Failed."); + } private function invalidDataResponse() { From 8e714bcb640c2bbeb251cdee89807e413e609730 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 15 Jul 2014 07:26:39 -0400 Subject: [PATCH 175/310] CC-5888: Handle file deletion if the file is stored in the cloud --- airtime_mvc/application/models/RabbitMq.php | 3 ++- airtime_mvc/application/models/StoredFile.php | 22 ++++++++++--------- .../rest/controllers/MediaController.php | 1 - .../cloud_storage_uploader.py | 3 +++ .../airtime_analyzer/message_listener.py | 10 +++++++-- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/airtime_mvc/application/models/RabbitMq.php b/airtime_mvc/application/models/RabbitMq.php index 7af846127c..bbabb6440e 100644 --- a/airtime_mvc/application/models/RabbitMq.php +++ b/airtime_mvc/application/models/RabbitMq.php @@ -80,9 +80,10 @@ public static function SendMessageToShowRecorder($event_type) } public static function SendMessageToAnalyzer($tmpFilePath, $importedStorageDirectory, $originalFilename, - $callbackUrl, $apiKey) + $callbackUrl, $apiKey, $messageType) { $exchange = 'airtime-uploads'; + $data['message_type'] = $messageType; $data['tmp_file_path'] = $tmpFilePath; $data['import_directory'] = $importedStorageDirectory; $data['original_filename'] = $originalFilename; diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index bb2d040a32..76415e1da7 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -384,28 +384,28 @@ public function delete() throw new FileNoPermissionException(); } - $music_dir = Application_Model_MusicDir::getDirByPK($this->_file->getDbDirectory()); - assert($music_dir); - $type = $music_dir->getType(); + $isInCloud = $this->isInCloud(); - - if (file_exists($filepath) && $type == "stor") { + $filesize = $this->getFileSize(); + if (file_exists($filepath) && !$isInCloud) { try { - //Update the user's disk usage - Application_Model_Preference::updateDiskUsage(-1 * abs(filesize($filepath))); - unlink($filepath); } catch (Exception $e) { Logging::error($e->getMessage()); return; } + } elseif ($isInCloud) { + //delete file from cloud } + //Update the user's disk usage + Application_Model_Preference::updateDiskUsage(-1 * $filesize); + Logging::info("User ".$user->getLogin()." is deleting file: ".$this->_file->getDbTrackTitle()." - file id: ".$this->_file->getDbId()); // set hidden flag to true //$this->_file->setDbHidden(true); - $this->_file->setDbFileExists(false); - $this->_file->save(); + //$this->_file->setDbFileExists(false); + //$this->_file->save(); // need to explicitly update any playlist's and block's length // that contains the file getting deleted @@ -423,6 +423,8 @@ public function delete() $bl->setDbLength($bl->computeDbLength(Propel::getConnection(CcBlockPeer::DATABASE_NAME))); $bl->save(); } + + $this->_file->delete(); } /** diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index fb77c91c77..16e084e80b 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -307,7 +307,6 @@ public function deleteAction() if ($storedFile->existsOnDisk()) { $storedFile->delete(); //TODO: This checks your session permissions... Make it work without a session? } - $file->delete(); $this->getResponse() ->setHttpResponseCode(204); } else { diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index 4fa2da0b77..3cd7793dfe 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -41,3 +41,6 @@ def upload_obj(self, audio_file_path, metadata): metadata["s3_object_name"] = object_name return metadata + + def delete_obj(self, object_name): + pass \ No newline at end of file diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index e723542d79..45db991501 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -8,6 +8,7 @@ import multiprocessing from analyzer_pipeline import AnalyzerPipeline from status_reporter import StatusReporter +from cloud_storage_uploader import CloudStorageUploader EXCHANGE = "airtime-uploads" EXCHANGE_TYPE = "topic" @@ -151,6 +152,7 @@ def msg_received_callback(self, channel, method_frame, header_frame, body): original_filename = "" callback_url = "" api_key = "" + message_type = "" ''' Spin up a worker process. We use the multiprocessing module and multiprocessing.Queue to pass objects between the processes so that if the analyzer process crashes, it does not @@ -166,9 +168,13 @@ def msg_received_callback(self, channel, method_frame, header_frame, body): original_filename = msg_dict["original_filename"] callback_url = msg_dict["callback_url"] api_key = msg_dict["api_key"] + message_type = msg_dict["message_type"] - audio_metadata = self.spawn_analyzer_process(audio_file_path, import_directory, original_filename) - StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) + if event_type == "upload": + audio_metadata = self.spawn_analyzer_process(audio_file_path, import_directory, original_filename) + StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) + elif event_type == "delete": + pass except KeyError as e: # A field in msg_dict that we needed was missing (eg. audio_file_path) From 7438ecd2b418387cd62a56d1251b07842de3c765 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 15 Jul 2014 16:32:48 -0400 Subject: [PATCH 176/310] Use track metadata from Airtime in playout engine * Resolves CC-5893: Metadata not updated on Airtime Pro * Report track metadata in the schedule API, and make pypo pass that along to Liquidsoap via annotations. * Move HTTP response sanitization for file metadata out of the REST module and into CcFiles * Slightly improved the terrible exception handling in pypo --- airtime_mvc/application/models/Schedule.php | 5 ++- .../application/models/airtime/CcFiles.php | 24 ++++++++++++ .../rest/controllers/MediaController.php | 37 ++++--------------- .../generate_liquidsoap_cfg.py | 3 ++ python_apps/pypo/telnetliquidsoap.py | 34 ++++++++++++----- 5 files changed, 62 insertions(+), 41 deletions(-) diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index 2641094a36..2552bf07e3 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -738,13 +738,16 @@ private static function createFileScheduleEvent(&$data, $item, $media_id, $uri) $replay_gain = is_null($item["replay_gain"]) ? "0": $item["replay_gain"]; $replay_gain += Application_Model_Preference::getReplayGainModifier(); - if ( !Application_Model_Preference::GetEnableReplayGain() ) { + if (!Application_Model_Preference::GetEnableReplayGain() ) { $replay_gain = 0; } + $fileMetadata = CcFiles::sanitizeResponse(CcFilesQuery::create()->findPk($media_id)); + $schedule_item = array( 'id' => $media_id, 'type' => 'file', + 'metadata' => $fileMetadata, 'row_id' => $item["id"], 'uri' => $uri, 'fade_in' => Application_Model_Schedule::WallTimeToMillisecs($item["fade_in"]), diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index f49c9154ab..93ef491a8e 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -13,6 +13,14 @@ */ class CcFiles extends BaseCcFiles { + //fields we should never expose through our RESTful API + private static $privateFields = array( + 'file_exists', + 'silan_check', + 'is_scheduled', + 'is_playlist' + ); + public function getCueLength() { $cuein = $this->getDbCuein(); @@ -46,4 +54,20 @@ public function reassignTo($user) $this->save(); } + /** + * + * Strips out the private fields we do not want to send back in API responses + * @param $file a CcFiles object + */ + //TODO: rename this function? + public static function sanitizeResponse($file) + { + $response = $file->toArray(BasePeer::TYPE_FIELDNAME); + + foreach (self::$privateFields as $key) { + unset($response[$key]); + } + + return $response; + } } // CcFiles diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 1604d1262b..f03b3b7b25 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -4,7 +4,7 @@ class Rest_MediaController extends Zend_Rest_Controller { //fields that are not modifiable via our RESTful API - private $blackList = array( + private static $blackList = array( 'id', 'directory', 'filepath', @@ -18,14 +18,6 @@ class Rest_MediaController extends Zend_Rest_Controller 'is_playlist' ); - //fields we should never expose through our RESTful API - private $privateFields = array( - 'file_exists', - 'silan_check', - 'is_scheduled', - 'is_playlist' - ); - public function init() { $this->view->layout()->disableLayout(); @@ -41,7 +33,7 @@ public function indexAction() $files_array = array(); foreach (CcFilesQuery::create()->find() as $file) { - array_push($files_array, $this->sanitizeResponse($file)); + array_push($files_array, CcFiles::sanitizeResponse($file)); } $this->getResponse() @@ -134,7 +126,7 @@ public function getAction() $this->getResponse() ->setHttpResponseCode(200) - ->appendBody(json_encode($this->sanitizeResponse($file))); + ->appendBody(json_encode(CcFiles::sanitizeResponse($file))); } else { $this->fileNotFoundResponse(); } @@ -201,7 +193,7 @@ public function postAction() $this->getResponse() ->setHttpResponseCode(201) - ->appendBody(json_encode($this->sanitizeResponse($file))); + ->appendBody(json_encode(CcFiles::sanitizeResponse($file))); } } @@ -265,7 +257,7 @@ public function putAction() $this->getResponse() ->setHttpResponseCode(200) - ->appendBody(json_encode($this->sanitizeResponse($file))); + ->appendBody(json_encode(CcFiles::sanitizeResponse($file))); } else { $file->setDbImportStatus(2)->save(); $this->fileNotFoundResponse(); @@ -490,30 +482,15 @@ private function getOwnerId() * from outside of Airtime * @param array $data */ - private function removeBlacklistedFieldsFromRequestData($data) + private static function removeBlacklistedFieldsFromRequestData($data) { - foreach ($this->blackList as $key) { + foreach (self::$blackList as $key) { unset($data[$key]); } return $data; } - /** - * - * Strips out the private fields we do not want to send back in API responses - */ - //TODO: rename this function? - public function sanitizeResponse($file) - { - $response = $file->toArray(BasePeer::TYPE_FIELDNAME); - - foreach ($this->privateFields as $key) { - unset($response[$key]); - } - - return $response; - } private function removeEmptySubFolders($path) { diff --git a/python_apps/pypo/liquidsoap_scripts/generate_liquidsoap_cfg.py b/python_apps/pypo/liquidsoap_scripts/generate_liquidsoap_cfg.py index e0160181b3..45bdb46f43 100644 --- a/python_apps/pypo/liquidsoap_scripts/generate_liquidsoap_cfg.py +++ b/python_apps/pypo/liquidsoap_scripts/generate_liquidsoap_cfg.py @@ -44,5 +44,8 @@ def generate_liquidsoap_config(ss): logging.error("traceback: %s", traceback.format_exc()) sys.exit(1) else: + logging.error(str(e)) + logging.error("traceback: %s", traceback.format_exc()) + logging.info("Retrying in 3 seconds...") time.sleep(3) attempts += 1 diff --git a/python_apps/pypo/telnetliquidsoap.py b/python_apps/pypo/telnetliquidsoap.py index 44d97a13f5..2f572ff131 100644 --- a/python_apps/pypo/telnetliquidsoap.py +++ b/python_apps/pypo/telnetliquidsoap.py @@ -3,17 +3,31 @@ def create_liquidsoap_annotation(media): # We need liq_start_next value in the annotate. That is the value that controls overlap duration of crossfade. - return ('annotate:media_id="%s",liq_start_next="0",liq_fade_in="%s",' + \ + + filename = media['dst'] + annotation = ('annotate:media_id="%s",liq_start_next="0",liq_fade_in="%s",' + \ 'liq_fade_out="%s",liq_cue_in="%s",liq_cue_out="%s",' + \ - 'schedule_table_id="%s",replay_gain="%s dB":%s') % \ - (media['id'], - float(media['fade_in']) / 1000, - float(media['fade_out']) / 1000, - float(media['cue_in']), - float(media['cue_out']), - media['row_id'], - media['replay_gain'], - media['dst']) + 'schedule_table_id="%s",replay_gain="%s dB"') % \ + (media['id'], + float(media['fade_in']) / 1000, + float(media['fade_out']) / 1000, + float(media['cue_in']), + float(media['cue_out']), + media['row_id'], + media['replay_gain']) + + # Override the the artist/title that Liquidsoap extracts from a file's metadata + # with the metadata we get from Airtime. (You can modify metadata in Airtime's library, + # which doesn't get saved back to the file.) + if 'metadata' in media: + if 'artist_name' in media['metadata']: + annotation += ',artist="%s"' % (media['metadata']['artist_name']) + if 'track_title' in media['metadata']: + annotation += ',title="%s"' % (media['metadata']['track_title']) + + annotation += ":" + filename + + return annotation class TelnetLiquidsoap: From aaee522ec678a5a1f5e4df7cbd1ad0655247b41a Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 15 Jul 2014 17:20:04 -0400 Subject: [PATCH 177/310] CC-5888: Handle file deletion if the file is stored in the cloud --- airtime_mvc/application/models/RabbitMq.php | 16 +++++- airtime_mvc/application/models/StoredFile.php | 54 +++++++++++++------ .../application/modules/rest/Bootstrap.php | 13 +++++ .../rest/controllers/MediaController.php | 34 +++++++++--- .../views/scripts/media/delete-success.phtml | 0 .../cloud_storage_uploader.py | 33 +++++++++--- .../airtime_analyzer/message_listener.py | 23 +++++--- 7 files changed, 134 insertions(+), 39 deletions(-) create mode 100644 airtime_mvc/application/modules/rest/views/scripts/media/delete-success.phtml diff --git a/airtime_mvc/application/models/RabbitMq.php b/airtime_mvc/application/models/RabbitMq.php index bbabb6440e..f810554608 100644 --- a/airtime_mvc/application/models/RabbitMq.php +++ b/airtime_mvc/application/models/RabbitMq.php @@ -79,10 +79,11 @@ public static function SendMessageToShowRecorder($event_type) self::sendMessage($exchange, 'direct', true, $data); } - public static function SendMessageToAnalyzer($tmpFilePath, $importedStorageDirectory, $originalFilename, + public static function SendUploadMessageToAnalyzer($tmpFilePath, $importedStorageDirectory, $originalFilename, $callbackUrl, $apiKey, $messageType) { $exchange = 'airtime-uploads'; + $data['message_type'] = $messageType; $data['tmp_file_path'] = $tmpFilePath; $data['import_directory'] = $importedStorageDirectory; @@ -93,4 +94,17 @@ public static function SendMessageToAnalyzer($tmpFilePath, $importedStorageDirec $jsonData = json_encode($data); self::sendMessage($exchange, 'topic', false, $jsonData, 'airtime-uploads'); } + + public static function SendDeleteMessageToAnalyzer($callbackUrl, $objectName, $apiKey, $messageType) + { + $exchange = 'airtime-uploads'; + + $data['message_type'] = $messageType; + $data['api_key'] = $apiKey; + $data['object_name'] = $objectName; + $data['callback_url'] = $callbackUrl; + + $jsonData = json_encode($data); + self::sendMessage($exchange, 'topic', false, $jsonData, 'airtime-uploads'); + } } diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 76415e1da7..d5333afee9 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -363,9 +363,7 @@ public function existsOnDisk() } /** - * Delete stored virtual file - * - * @param boolean $p_deleteFile + * Deletes the physical file from the local file system or from the cloud * */ public function delete() @@ -383,10 +381,11 @@ public function delete() if (!$isAdminOrPM && $this->getFileOwnerId() != $user->getId()) { throw new FileNoPermissionException(); } + $file_id = $this->_file->getDbId(); + Logging::info("User ".$user->getLogin()." is deleting file: ".$this->_file->getDbTrackTitle()." - file id: ".$file_id); $isInCloud = $this->isInCloud(); - $filesize = $this->getFileSize(); if (file_exists($filepath) && !$isInCloud) { try { unlink($filepath); @@ -394,23 +393,46 @@ public function delete() Logging::error($e->getMessage()); return; } + + $this->doFileDeletionCleanup($this->getFileSize()); + } elseif ($isInCloud) { - //delete file from cloud + //Dispatch a message to airtime_analyzer through RabbitMQ, + //notifying it that we need to delete a file from the cloud + $CC_CONFIG = Config::getConfig(); + $apiKey = $CC_CONFIG["apiKey"][0]; + + $callbackUrl = 'http://'.$_SERVER['HTTP_HOST'].'/rest/media/'.$file_id.'/delete-success'; + + Application_Model_RabbitMq::SendDeleteMessageToAnalyzer( + $callbackUrl, $this->_file->getDbResourceId(), $apiKey, 'delete'); } + } + /* + * This function handles all the actions required when a file is deleted + */ + public function doFileDeletionCleanup($filesize) + { //Update the user's disk usage Application_Model_Preference::updateDiskUsage(-1 * $filesize); + + //Explicitly update any playlist's and block's length that contains + //the file getting deleted + self::updateBlockAndPlaylistLength($this->_file->getDbId()); + + //delete the file record from cc_files + $this->_file->delete(); + } - Logging::info("User ".$user->getLogin()." is deleting file: ".$this->_file->getDbTrackTitle()." - file id: ".$this->_file->getDbId()); - // set hidden flag to true - //$this->_file->setDbHidden(true); - //$this->_file->setDbFileExists(false); - //$this->_file->save(); - - // need to explicitly update any playlist's and block's length - // that contains the file getting deleted - $fileId = $this->_file->getDbId(); - $plRows = CcPlaylistcontentsQuery::create()->filterByDbFileId()->find(); + /* + * This function is meant to be called when a file is getting + * deleted from the library. It re-calculates the length of + * all blocks and playlists that contained the deleted file. + */ + public static function updateBlockAndPlaylistLength($fileId) + { + $plRows = CcPlaylistcontentsQuery::create()->filterByDbFileId($fileId)->find(); foreach ($plRows as $row) { $pl = CcPlaylistQuery::create()->filterByDbId($row->getDbPlaylistId($fileId))->findOne(); $pl->setDbLength($pl->computeDbLength(Propel::getConnection(CcPlaylistPeer::DATABASE_NAME))); @@ -423,8 +445,6 @@ public function delete() $bl->setDbLength($bl->computeDbLength(Propel::getConnection(CcBlockPeer::DATABASE_NAME))); $bl->save(); } - - $this->_file->delete(); } /** diff --git a/airtime_mvc/application/modules/rest/Bootstrap.php b/airtime_mvc/application/modules/rest/Bootstrap.php index 31691ca96d..f0e0d773c2 100644 --- a/airtime_mvc/application/modules/rest/Bootstrap.php +++ b/airtime_mvc/application/modules/rest/Bootstrap.php @@ -33,5 +33,18 @@ protected function _initRouter() ) ); $router->addRoute('clear', $clearLibraryRoute); + + $deleteSuccessRoute = new Zend_Controller_Router_Route( + 'rest/media/:id/delete-success', + array( + 'controller' => 'media', + 'action' => 'delete-success', + 'module' => 'rest' + ), + array( + 'id' => '\d+' + ) + ); + $router->addRoute('delete-success', $deleteSuccessRoute); } } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 16e084e80b..9d0dd48fca 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -29,6 +29,9 @@ class Rest_MediaController extends Zend_Rest_Controller public function init() { $this->view->layout()->disableLayout(); + + $ajaxContext = $this->_helper->getHelper('AjaxContext'); + $ajaxContext->addActionContext('delete-success', 'json'); } public function indexAction() @@ -278,7 +281,7 @@ public function putAction() //get the filesize and update disk_usage $storedFile = Application_Model_StoredFile::RecallById($file->getDbId()); - Application_Model_Preference::updateDiskUsage($storedFile->getFileSize()); + Application_Model_Preference::updateDiskUsage($requestData["filesize"]); $this->getResponse() ->setHttpResponseCode(200) @@ -304,9 +307,8 @@ public function deleteAction() if ($file) { $con = Propel::getConnection(); $storedFile = new Application_Model_StoredFile($file, $con); - if ($storedFile->existsOnDisk()) { - $storedFile->delete(); //TODO: This checks your session permissions... Make it work without a session? - } + $storedFile->delete(); //TODO: This checks your session permissions... Make it work without a session? + $this->getResponse() ->setHttpResponseCode(204); } else { @@ -314,6 +316,26 @@ public function deleteAction() } } + public function deleteSuccessAction() + { + if (!$this->verifyAuth(true, true)) + { + return; + } + + $id = $this->getId(); + if (!$id) { + return; + } + + $requestData = json_decode($this->getRequest()->getRawBody(), true); + + $con = Propel::getConnection(); + $storedFile = new Application_Model_StoredFile(CcFilesQuery::create()->findPk($id), $con); + + $storedFile->doFileDeletionCleanup($requestData["filesize"]); + } + private function getId() { if (!$id = $this->_getParam('id', false)) { @@ -479,9 +501,9 @@ private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) //Dispatch a message to airtime_analyzer through RabbitMQ, //notifying it that there's a new upload to process! - Application_Model_RabbitMq::SendMessageToAnalyzer($newTempFilePath, + Application_Model_RabbitMq::SendUploadMessageToAnalyzer($newTempFilePath, $importedStorageDirectory, basename($originalFilename), - $callbackUrl, $apiKey); + $callbackUrl, $apiKey, 'upload'); } private function getOwnerId() diff --git a/airtime_mvc/application/modules/rest/views/scripts/media/delete-success.phtml b/airtime_mvc/application/modules/rest/views/scripts/media/delete-success.phtml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index 3cd7793dfe..76e9e62572 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -3,7 +3,7 @@ import uuid from libcloud.storage.providers import get_driver -from libcloud.storage.types import Provider, ContainerDoesNotExistError +from libcloud.storage.types import Provider, ContainerDoesNotExistError, ObjectDoesNotExistError class CloudStorageUploader: def __init__(self, provider, bucket, api_key, api_key_secret): @@ -17,15 +17,16 @@ def upload_obj(self, audio_file_path, metadata): file_name, extension = os.path.splitext(file_base_name) object_name = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension) - cls = get_driver(getattr(Provider, self._provider)) - driver = cls(self._api_key, self._api_key_secret) + #cls = get_driver(getattr(Provider, self._provider)) + driver = self.get_cloud_driver() try: container = driver.get_container(self._bucket) except ContainerDoesNotExistError: container = driver.create_container(self._bucket) - extra = {'meta_data': {'filename': file_base_name}} + extra = {'meta_data': {'filename': file_base_name}, + 'acl': 'public-read-write'} with open(audio_file_path, 'rb') as iterator: obj = driver.upload_object_via_stream(iterator=iterator, @@ -33,14 +34,32 @@ def upload_obj(self, audio_file_path, metadata): object_name=object_name, extra=extra) + + metadata["filesize"] = os.path.getsize(audio_file_path) + '''remove file from organize directory''' try: os.remove(audio_file_path) except OSError: - logging.info("Could not remove %s" % audio_file_path) + logging.info("Could not remove %s from organize directory" % audio_file_path) metadata["s3_object_name"] = object_name return metadata - def delete_obj(self, object_name): - pass \ No newline at end of file + def delete_obj(self, obj_name): + driver = self.get_cloud_driver() + + return_msg = dict() + return_msg["success"] = False + try: + cloud_obj = driver.get_object(container_name=self._bucket, + object_name=obj_name) + return_msg["filesize"] = getattr(cloud_obj, 'size') + return_msg["success"] = driver.delete_object(obj=cloud_obj) + return return_msg + except ObjectDoesNotExistError: + logging.info("Could not find object on %s" % self._provider) + + def get_cloud_driver(self): + cls = get_driver(getattr(Provider, self._provider)) + return cls(self._api_key, self._api_key_secret) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 45db991501..f4df7f3607 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -162,19 +162,26 @@ def msg_received_callback(self, channel, method_frame, header_frame, body): ''' try: msg_dict = json.loads(body) - audio_file_path = msg_dict["tmp_file_path"] - #final_file_path = msg_dict["final_file_path"] - import_directory = msg_dict["import_directory"] - original_filename = msg_dict["original_filename"] - callback_url = msg_dict["callback_url"] api_key = msg_dict["api_key"] message_type = msg_dict["message_type"] + callback_url = msg_dict["callback_url"] - if event_type == "upload": + if message_type == "upload": + audio_file_path = msg_dict["tmp_file_path"] + import_directory = msg_dict["import_directory"] + original_filename = msg_dict["original_filename"] + audio_metadata = self.spawn_analyzer_process(audio_file_path, import_directory, original_filename) StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) - elif event_type == "delete": - pass + elif message_type == "delete": + object_name = msg_dict["object_name"] + csu = CloudStorageUploader(self._provider, self._bucket, self._api_key, self._api_key_secret) + response = csu.delete_obj(object_name) + if response["success"]: + audio_metadata = dict() + audio_metadata["delete_success"] = True + audio_metadata["filesize"] = response["filesize"] + StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) except KeyError as e: # A field in msg_dict that we needed was missing (eg. audio_file_path) From 7ca6b91cdf9f1c946f719082b8df098a2af34b3d Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 16 Jul 2014 12:03:22 -0400 Subject: [PATCH 178/310] CC-5888: Handle file deletion if the file is stored in the cloud --- airtime_mvc/application/models/StoredFile.php | 2 ++ .../modules/rest/controllers/MediaController.php | 10 ++++++---- .../airtime_analyzer/cloud_storage_uploader.py | 11 ++++------- .../airtime_analyzer/message_listener.py | 11 +++++------ 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index d5333afee9..199ec6787b 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -402,6 +402,8 @@ public function delete() $CC_CONFIG = Config::getConfig(); $apiKey = $CC_CONFIG["apiKey"][0]; + //If the file was successfully deleted from the cloud the analyzer + //will make a request to the Media API to do the deletion cleanup. $callbackUrl = 'http://'.$_SERVER['HTTP_HOST'].'/rest/media/'.$file_id.'/delete-success'; Application_Model_RabbitMq::SendDeleteMessageToAnalyzer( diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 9d0dd48fca..7e9e36df76 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -330,10 +330,12 @@ public function deleteSuccessAction() $requestData = json_decode($this->getRequest()->getRawBody(), true); - $con = Propel::getConnection(); - $storedFile = new Application_Model_StoredFile(CcFilesQuery::create()->findPk($id), $con); - - $storedFile->doFileDeletionCleanup($requestData["filesize"]); + if ($requestData["import_status"] == 1) { + $con = Propel::getConnection(); + $storedFile = new Application_Model_StoredFile(CcFilesQuery::create()->findPk($id), $con); + + $storedFile->doFileDeletionCleanup($requestData["filesize"]); + } } private function getId() diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index 76e9e62572..0b7d4a742d 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -17,7 +17,6 @@ def upload_obj(self, audio_file_path, metadata): file_name, extension = os.path.splitext(file_base_name) object_name = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension) - #cls = get_driver(getattr(Provider, self._provider)) driver = self.get_cloud_driver() try: @@ -49,16 +48,14 @@ def upload_obj(self, audio_file_path, metadata): def delete_obj(self, obj_name): driver = self.get_cloud_driver() - return_msg = dict() - return_msg["success"] = False try: cloud_obj = driver.get_object(container_name=self._bucket, object_name=obj_name) - return_msg["filesize"] = getattr(cloud_obj, 'size') - return_msg["success"] = driver.delete_object(obj=cloud_obj) - return return_msg + filesize = getattr(cloud_obj, 'size') + driver.delete_object(obj=cloud_obj) + return filesize except ObjectDoesNotExistError: - logging.info("Could not find object on %s" % self._provider) + raise Exception("Could not find object on %s" % self._provider) def get_cloud_driver(self): cls = get_driver(getattr(Provider, self._provider)) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index f4df7f3607..cc633cca54 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -176,12 +176,11 @@ def msg_received_callback(self, channel, method_frame, header_frame, body): elif message_type == "delete": object_name = msg_dict["object_name"] csu = CloudStorageUploader(self._provider, self._bucket, self._api_key, self._api_key_secret) - response = csu.delete_obj(object_name) - if response["success"]: - audio_metadata = dict() - audio_metadata["delete_success"] = True - audio_metadata["filesize"] = response["filesize"] - StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) + filesize = csu.delete_obj(object_name) + return_data = dict() + return_data["filesize"] = filesize + return_data["import_status"] = 1 + StatusReporter.report_success_to_callback_url(callback_url, api_key, return_data) except KeyError as e: # A field in msg_dict that we needed was missing (eg. audio_file_path) From 82d7f093821dd682332b22e7b11aaeccc95f3f2a Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 16 Jul 2014 12:44:09 -0400 Subject: [PATCH 179/310] Small code cleanup --- .../rest/controllers/MediaController.php | 36 +++---------------- 1 file changed, 4 insertions(+), 32 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 7e9e36df76..e8e07fbdc0 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -237,33 +237,6 @@ public function putAction() return; } else if ($file) { $file->fromArray($whiteList, BasePeer::TYPE_FIELDNAME); - - //Our RESTful API takes "full_path" as a field, which we then split and translate to match - //our internal schema. Internally, file path is stored relative to a directory, with the directory - //as a foreign key to cc_music_dirs. - /*if (isset($requestData["full_path"])) { - $fileSizeBytes = filesize($requestData["full_path"]); - if ($fileSizeBytes === false) - { - $file->setDbImportStatus(2)->save(); - $this->fileNotFoundResponse(); - return; - } - Application_Model_Preference::updateDiskUsage($fileSizeBytes); - - $fullPath = $requestData["full_path"]; - $storDir = Application_Model_MusicDir::getStorDir()->getDirectory(); - $pos = strpos($fullPath, $storDir); - - if ($pos !== FALSE) - { - assert($pos == 0); //Path must start with the stor directory path - - $filePathRelativeToStor = substr($fullPath, strlen($storDir)); - $file->setDbFilepath($filePathRelativeToStor); - $file->setDbDirectory(1); //1 corresponds to the default stor/imported directory. - } - }*/ if (isset($requestData["s3_object_name"])) { $cloud_cc_music_dir = CcMusicDirsQuery::create() @@ -272,17 +245,13 @@ public function putAction() $file->setDbDirectory($cloud_cc_music_dir->getId()); $file->setDbResourceId($requestData["s3_object_name"]); - //Application_Model_Preference::updateDiskUsage($requestData["filesize"]); + Application_Model_Preference::updateDiskUsage($requestData["filesize"]); } $now = new DateTime("now", new DateTimeZone("UTC")); $file->setDbMtime($now); $file->save(); - //get the filesize and update disk_usage - $storedFile = Application_Model_StoredFile::RecallById($file->getDbId()); - Application_Model_Preference::updateDiskUsage($requestData["filesize"]); - $this->getResponse() ->setHttpResponseCode(200) ->appendBody(json_encode($this->sanitizeResponse($file))); @@ -335,6 +304,9 @@ public function deleteSuccessAction() $storedFile = new Application_Model_StoredFile(CcFilesQuery::create()->findPk($id), $con); $storedFile->doFileDeletionCleanup($requestData["filesize"]); + + //refresh library table to remove the deleted file from it + //$this->view->headScript()->appendScript("oTable.fnStandingRedraw();"); } } From 3f676be66cd9b623484b9195aaea64303c9ae24c Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 16 Jul 2014 14:43:55 -0400 Subject: [PATCH 180/310] Use a different libcloud function for uploading files --- .../airtime_analyzer/cloud_storage_uploader.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index 0b7d4a742d..667725c32f 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -27,13 +27,12 @@ def upload_obj(self, audio_file_path, metadata): extra = {'meta_data': {'filename': file_base_name}, 'acl': 'public-read-write'} - with open(audio_file_path, 'rb') as iterator: - obj = driver.upload_object_via_stream(iterator=iterator, - container=container, - object_name=object_name, - extra=extra) + obj = driver.upload_object(file_path=audio_file_path, + container=container, + object_name=object_name, + verify_hash=False, + extra=extra) - metadata["filesize"] = os.path.getsize(audio_file_path) '''remove file from organize directory''' From 72841de714482507a47fbfef3168c78344d086c6 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 23 Jul 2014 15:03:51 -0400 Subject: [PATCH 181/310] CC-5895: Upgrade Propel to 1.7 Used composer to download Propel 1.7 The Propel library will no longer be stored in the Airtime repo --- airtime_mvc/application/Bootstrap.php | 2 +- .../configs/airtime-conf-production.php | 2 +- .../application/configs/airtime-conf.php | 4 +- .../configs/classmap-airtime-conf.php | 412 +- .../models/airtime/map/CcBlockTableMap.php | 115 +- .../airtime/map/CcBlockcontentsTableMap.php | 112 +- .../airtime/map/CcBlockcriteriaTableMap.php | 75 +- .../models/airtime/map/CcCountryTableMap.php | 63 +- .../models/airtime/map/CcFilesTableMap.php | 219 +- .../airtime/map/CcListenerCountTableMap.php | 73 +- .../models/airtime/map/CcLiveLogTableMap.php | 69 +- .../models/airtime/map/CcLocaleTableMap.php | 67 +- .../airtime/map/CcLoginAttemptsTableMap.php | 63 +- .../airtime/map/CcMountNameTableMap.php | 67 +- .../airtime/map/CcMusicDirsTableMap.php | 73 +- .../models/airtime/map/CcPermsTableMap.php | 71 +- .../models/airtime/map/CcPlaylistTableMap.php | 109 +- .../map/CcPlaylistcontentsTableMap.php | 120 +- .../map/CcPlayoutHistoryMetaDataTableMap.php | 71 +- .../airtime/map/CcPlayoutHistoryTableMap.php | 77 +- .../CcPlayoutHistoryTemplateFieldTableMap.php | 77 +- .../map/CcPlayoutHistoryTemplateTableMap.php | 69 +- .../models/airtime/map/CcPrefTableMap.php | 71 +- .../models/airtime/map/CcScheduleTableMap.php | 99 +- .../airtime/map/CcServiceRegisterTableMap.php | 63 +- .../models/airtime/map/CcSessTableMap.php | 69 +- .../models/airtime/map/CcShowDaysTableMap.php | 85 +- .../airtime/map/CcShowHostsTableMap.php | 71 +- .../airtime/map/CcShowInstancesTableMap.php | 97 +- .../airtime/map/CcShowRebroadcastTableMap.php | 71 +- .../models/airtime/map/CcShowTableMap.php | 95 +- .../models/airtime/map/CcSmembTableMap.php | 69 +- .../airtime/map/CcStreamSettingTableMap.php | 65 +- .../models/airtime/map/CcSubjsTableMap.php | 105 +- .../airtime/map/CcSubjsTokenTableMap.php | 73 +- .../airtime/map/CcTimestampTableMap.php | 67 +- .../map/CcWebstreamMetadataTableMap.php | 71 +- .../airtime/map/CcWebstreamTableMap.php | 83 +- .../models/airtime/om/BaseCcBlock.php | 4107 ++--- .../models/airtime/om/BaseCcBlockPeer.php | 2020 +-- .../models/airtime/om/BaseCcBlockQuery.php | 1466 +- .../models/airtime/om/BaseCcBlockcontents.php | 3056 ++-- .../airtime/om/BaseCcBlockcontentsPeer.php | 2802 ++-- .../airtime/om/BaseCcBlockcontentsQuery.php | 1538 +- .../models/airtime/om/BaseCcBlockcriteria.php | 2144 +-- .../airtime/om/BaseCcBlockcriteriaPeer.php | 1982 +-- .../airtime/om/BaseCcBlockcriteriaQuery.php | 870 +- .../models/airtime/om/BaseCcCountry.php | 1502 +- .../models/airtime/om/BaseCcCountryPeer.php | 1462 +- .../models/airtime/om/BaseCcCountryQuery.php | 456 +- .../models/airtime/om/BaseCcFiles.php | 12360 +++++++++------- .../models/airtime/om/BaseCcFilesPeer.php | 3890 ++--- .../models/airtime/om/BaseCcFilesQuery.php | 6044 ++++---- .../models/airtime/om/BaseCcListenerCount.php | 2100 +-- .../airtime/om/BaseCcListenerCountPeer.php | 2742 ++-- .../airtime/om/BaseCcListenerCountQuery.php | 944 +- .../models/airtime/om/BaseCcLiveLog.php | 1888 +-- .../models/airtime/om/BaseCcLiveLogPeer.php | 1490 +- .../models/airtime/om/BaseCcLiveLogQuery.php | 606 +- .../models/airtime/om/BaseCcLocale.php | 1628 +- .../models/airtime/om/BaseCcLocalePeer.php | 1480 +- .../models/airtime/om/BaseCcLocaleQuery.php | 523 +- .../models/airtime/om/BaseCcLoginAttempts.php | 1556 +- .../airtime/om/BaseCcLoginAttemptsPeer.php | 1462 +- .../airtime/om/BaseCcLoginAttemptsQuery.php | 478 +- .../models/airtime/om/BaseCcMountName.php | 2039 +-- .../models/airtime/om/BaseCcMountNamePeer.php | 1476 +- .../airtime/om/BaseCcMountNameQuery.php | 584 +- .../models/airtime/om/BaseCcMusicDirs.php | 2484 ++-- .../models/airtime/om/BaseCcMusicDirsPeer.php | 1500 +- .../airtime/om/BaseCcMusicDirsQuery.php | 771 +- .../models/airtime/om/BaseCcPerms.php | 2018 +-- .../models/airtime/om/BaseCcPermsPeer.php | 1964 +-- .../models/airtime/om/BaseCcPermsQuery.php | 833 +- .../models/airtime/om/BaseCcPlaylist.php | 3083 ++-- .../models/airtime/om/BaseCcPlaylistPeer.php | 1998 +-- .../models/airtime/om/BaseCcPlaylistQuery.php | 1119 +- .../airtime/om/BaseCcPlaylistcontents.php | 3544 ++--- .../airtime/om/BaseCcPlaylistcontentsPeer.php | 3516 ++--- .../om/BaseCcPlaylistcontentsQuery.php | 1929 +-- .../airtime/om/BaseCcPlayoutHistory.php | 2810 ++-- .../om/BaseCcPlayoutHistoryMetaData.php | 1936 +-- .../om/BaseCcPlayoutHistoryMetaDataPeer.php | 1962 +-- .../om/BaseCcPlayoutHistoryMetaDataQuery.php | 752 +- .../airtime/om/BaseCcPlayoutHistoryPeer.php | 2758 ++-- .../airtime/om/BaseCcPlayoutHistoryQuery.php | 1171 +- .../om/BaseCcPlayoutHistoryTemplate.php | 2093 +-- .../om/BaseCcPlayoutHistoryTemplateField.php | 2310 +-- .../BaseCcPlayoutHistoryTemplateFieldPeer.php | 1992 +-- ...BaseCcPlayoutHistoryTemplateFieldQuery.php | 944 +- .../om/BaseCcPlayoutHistoryTemplatePeer.php | 1486 +- .../om/BaseCcPlayoutHistoryTemplateQuery.php | 667 +- .../models/airtime/om/BaseCcPref.php | 1936 +-- .../models/airtime/om/BaseCcPrefPeer.php | 1962 +-- .../models/airtime/om/BaseCcPrefQuery.php | 752 +- .../models/airtime/om/BaseCcSchedule.php | 4310 +++--- .../models/airtime/om/BaseCcSchedulePeer.php | 3540 ++--- .../models/airtime/om/BaseCcScheduleQuery.php | 2036 +-- .../airtime/om/BaseCcServiceRegister.php | 1502 +- .../airtime/om/BaseCcServiceRegisterPeer.php | 1462 +- .../airtime/om/BaseCcServiceRegisterQuery.php | 456 +- .../models/airtime/om/BaseCcSess.php | 1992 +-- .../models/airtime/om/BaseCcSessPeer.php | 1954 +-- .../models/airtime/om/BaseCcSessQuery.php | 767 +- .../models/airtime/om/BaseCcShow.php | 4728 +++--- .../models/airtime/om/BaseCcShowDays.php | 3030 ++-- .../models/airtime/om/BaseCcShowDaysPeer.php | 2032 +-- .../models/airtime/om/BaseCcShowDaysQuery.php | 1323 +- .../models/airtime/om/BaseCcShowHosts.php | 1996 +-- .../models/airtime/om/BaseCcShowHostsPeer.php | 2732 ++-- .../airtime/om/BaseCcShowHostsQuery.php | 863 +- .../models/airtime/om/BaseCcShowInstances.php | 5065 ++++--- .../airtime/om/BaseCcShowInstancesPeer.php | 3140 ++-- .../airtime/om/BaseCcShowInstancesQuery.php | 2125 +-- .../models/airtime/om/BaseCcShowPeer.php | 1604 +- .../models/airtime/om/BaseCcShowQuery.php | 1663 ++- .../airtime/om/BaseCcShowRebroadcast.php | 2014 +-- .../airtime/om/BaseCcShowRebroadcastPeer.php | 1962 +-- .../airtime/om/BaseCcShowRebroadcastQuery.php | 775 +- .../models/airtime/om/BaseCcSmemb.php | 1892 +-- .../models/airtime/om/BaseCcSmembPeer.php | 1492 +- .../models/airtime/om/BaseCcSmembQuery.php | 705 +- .../models/airtime/om/BaseCcStreamSetting.php | 1606 +- .../airtime/om/BaseCcStreamSettingPeer.php | 1472 +- .../airtime/om/BaseCcStreamSettingQuery.php | 515 +- .../models/airtime/om/BaseCcSubjs.php | 6987 +++++---- .../models/airtime/om/BaseCcSubjsPeer.php | 1622 +- .../models/airtime/om/BaseCcSubjsQuery.php | 2477 ++-- .../models/airtime/om/BaseCcSubjsToken.php | 2118 +-- .../airtime/om/BaseCcSubjsTokenPeer.php | 1972 +-- .../airtime/om/BaseCcSubjsTokenQuery.php | 834 +- .../models/airtime/om/BaseCcTimestamp.php | 2117 +-- .../models/airtime/om/BaseCcTimestampPeer.php | 1476 +- .../airtime/om/BaseCcTimestampQuery.php | 607 +- .../models/airtime/om/BaseCcWebstream.php | 3209 ++-- .../airtime/om/BaseCcWebstreamMetadata.php | 2014 +-- .../om/BaseCcWebstreamMetadataPeer.php | 1962 +-- .../om/BaseCcWebstreamMetadataQuery.php | 775 +- .../models/airtime/om/BaseCcWebstreamPeer.php | 1556 +- .../airtime/om/BaseCcWebstreamQuery.php | 1171 +- airtime_mvc/build/sql/schema.sql | 1249 +- airtime_mvc/library/propel/composer.json | 5 + dev_tools/propel_regenerate.sh | 2 +- 143 files changed, 115144 insertions(+), 98011 deletions(-) create mode 100644 airtime_mvc/library/propel/composer.json diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index ff80a4a656..7f333960aa 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -3,7 +3,7 @@ $CC_CONFIG = Config::getConfig(); require_once __DIR__."/configs/ACL.php"; -require_once 'propel/runtime/lib/Propel.php'; +require_once 'propel/vendor/propel/propel1/runtime/lib/Propel.php'; Propel::init(__DIR__."/configs/airtime-conf-production.php"); diff --git a/airtime_mvc/application/configs/airtime-conf-production.php b/airtime_mvc/application/configs/airtime-conf-production.php index aaef0e371c..429dfa9e0d 100644 --- a/airtime_mvc/application/configs/airtime-conf-production.php +++ b/airtime_mvc/application/configs/airtime-conf-production.php @@ -28,7 +28,7 @@ ), 'default' => 'airtime', ), - 'generator_version' => '1.5.2', + 'generator_version' => '1.7.0', ); $conf['classmap'] = include(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classmap-airtime-conf.php'); return $conf; diff --git a/airtime_mvc/application/configs/airtime-conf.php b/airtime_mvc/application/configs/airtime-conf.php index e767e18b83..b23a373343 100644 --- a/airtime_mvc/application/configs/airtime-conf.php +++ b/airtime_mvc/application/configs/airtime-conf.php @@ -1,5 +1,5 @@ @@ -22,7 +22,7 @@ ), 'default' => 'airtime', ), - 'generator_version' => '1.5.2', + 'generator_version' => '1.7.0', ); $conf['classmap'] = include(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classmap-airtime-conf.php'); return $conf; \ No newline at end of file diff --git a/airtime_mvc/application/configs/classmap-airtime-conf.php b/airtime_mvc/application/configs/classmap-airtime-conf.php index fb42846811..3bd595d17c 100644 --- a/airtime_mvc/application/configs/classmap-airtime-conf.php +++ b/airtime_mvc/application/configs/classmap-airtime-conf.php @@ -1,242 +1,242 @@ 'airtime/map/CcMusicDirsTableMap.php', - 'CcMusicDirsPeer' => 'airtime/CcMusicDirsPeer.php', - 'CcMusicDirs' => 'airtime/CcMusicDirs.php', - 'CcMusicDirsQuery' => 'airtime/CcMusicDirsQuery.php', - 'BaseCcMusicDirsPeer' => 'airtime/om/BaseCcMusicDirsPeer.php', - 'BaseCcMusicDirs' => 'airtime/om/BaseCcMusicDirs.php', - 'BaseCcMusicDirsQuery' => 'airtime/om/BaseCcMusicDirsQuery.php', - 'CcFilesTableMap' => 'airtime/map/CcFilesTableMap.php', - 'CcFilesPeer' => 'airtime/CcFilesPeer.php', - 'CcFiles' => 'airtime/CcFiles.php', - 'CcFilesQuery' => 'airtime/CcFilesQuery.php', - 'BaseCcFilesPeer' => 'airtime/om/BaseCcFilesPeer.php', + 'BaseCcBlock' => 'airtime/om/BaseCcBlock.php', + 'BaseCcBlockPeer' => 'airtime/om/BaseCcBlockPeer.php', + 'BaseCcBlockQuery' => 'airtime/om/BaseCcBlockQuery.php', + 'BaseCcBlockcontents' => 'airtime/om/BaseCcBlockcontents.php', + 'BaseCcBlockcontentsPeer' => 'airtime/om/BaseCcBlockcontentsPeer.php', + 'BaseCcBlockcontentsQuery' => 'airtime/om/BaseCcBlockcontentsQuery.php', + 'BaseCcBlockcriteria' => 'airtime/om/BaseCcBlockcriteria.php', + 'BaseCcBlockcriteriaPeer' => 'airtime/om/BaseCcBlockcriteriaPeer.php', + 'BaseCcBlockcriteriaQuery' => 'airtime/om/BaseCcBlockcriteriaQuery.php', + 'BaseCcCountry' => 'airtime/om/BaseCcCountry.php', + 'BaseCcCountryPeer' => 'airtime/om/BaseCcCountryPeer.php', + 'BaseCcCountryQuery' => 'airtime/om/BaseCcCountryQuery.php', 'BaseCcFiles' => 'airtime/om/BaseCcFiles.php', + 'BaseCcFilesPeer' => 'airtime/om/BaseCcFilesPeer.php', 'BaseCcFilesQuery' => 'airtime/om/BaseCcFilesQuery.php', - 'CcPermsTableMap' => 'airtime/map/CcPermsTableMap.php', - 'CcPermsPeer' => 'airtime/CcPermsPeer.php', - 'CcPerms' => 'airtime/CcPerms.php', - 'CcPermsQuery' => 'airtime/CcPermsQuery.php', - 'BaseCcPermsPeer' => 'airtime/om/BaseCcPermsPeer.php', + 'BaseCcListenerCount' => 'airtime/om/BaseCcListenerCount.php', + 'BaseCcListenerCountPeer' => 'airtime/om/BaseCcListenerCountPeer.php', + 'BaseCcListenerCountQuery' => 'airtime/om/BaseCcListenerCountQuery.php', + 'BaseCcLiveLog' => 'airtime/om/BaseCcLiveLog.php', + 'BaseCcLiveLogPeer' => 'airtime/om/BaseCcLiveLogPeer.php', + 'BaseCcLiveLogQuery' => 'airtime/om/BaseCcLiveLogQuery.php', + 'BaseCcLocale' => 'airtime/om/BaseCcLocale.php', + 'BaseCcLocalePeer' => 'airtime/om/BaseCcLocalePeer.php', + 'BaseCcLocaleQuery' => 'airtime/om/BaseCcLocaleQuery.php', + 'BaseCcLoginAttempts' => 'airtime/om/BaseCcLoginAttempts.php', + 'BaseCcLoginAttemptsPeer' => 'airtime/om/BaseCcLoginAttemptsPeer.php', + 'BaseCcLoginAttemptsQuery' => 'airtime/om/BaseCcLoginAttemptsQuery.php', + 'BaseCcMountName' => 'airtime/om/BaseCcMountName.php', + 'BaseCcMountNamePeer' => 'airtime/om/BaseCcMountNamePeer.php', + 'BaseCcMountNameQuery' => 'airtime/om/BaseCcMountNameQuery.php', + 'BaseCcMusicDirs' => 'airtime/om/BaseCcMusicDirs.php', + 'BaseCcMusicDirsPeer' => 'airtime/om/BaseCcMusicDirsPeer.php', + 'BaseCcMusicDirsQuery' => 'airtime/om/BaseCcMusicDirsQuery.php', 'BaseCcPerms' => 'airtime/om/BaseCcPerms.php', + 'BaseCcPermsPeer' => 'airtime/om/BaseCcPermsPeer.php', 'BaseCcPermsQuery' => 'airtime/om/BaseCcPermsQuery.php', - 'CcShowTableMap' => 'airtime/map/CcShowTableMap.php', - 'CcShowPeer' => 'airtime/CcShowPeer.php', - 'CcShow' => 'airtime/CcShow.php', - 'CcShowQuery' => 'airtime/CcShowQuery.php', - 'BaseCcShowPeer' => 'airtime/om/BaseCcShowPeer.php', - 'BaseCcShow' => 'airtime/om/BaseCcShow.php', - 'BaseCcShowQuery' => 'airtime/om/BaseCcShowQuery.php', - 'CcShowInstancesTableMap' => 'airtime/map/CcShowInstancesTableMap.php', - 'CcShowInstancesPeer' => 'airtime/CcShowInstancesPeer.php', - 'CcShowInstances' => 'airtime/CcShowInstances.php', - 'CcShowInstancesQuery' => 'airtime/CcShowInstancesQuery.php', - 'BaseCcShowInstancesPeer' => 'airtime/om/BaseCcShowInstancesPeer.php', - 'BaseCcShowInstances' => 'airtime/om/BaseCcShowInstances.php', - 'BaseCcShowInstancesQuery' => 'airtime/om/BaseCcShowInstancesQuery.php', - 'CcShowDaysTableMap' => 'airtime/map/CcShowDaysTableMap.php', - 'CcShowDaysPeer' => 'airtime/CcShowDaysPeer.php', - 'CcShowDays' => 'airtime/CcShowDays.php', - 'CcShowDaysQuery' => 'airtime/CcShowDaysQuery.php', - 'BaseCcShowDaysPeer' => 'airtime/om/BaseCcShowDaysPeer.php', - 'BaseCcShowDays' => 'airtime/om/BaseCcShowDays.php', - 'BaseCcShowDaysQuery' => 'airtime/om/BaseCcShowDaysQuery.php', - 'CcShowRebroadcastTableMap' => 'airtime/map/CcShowRebroadcastTableMap.php', - 'CcShowRebroadcastPeer' => 'airtime/CcShowRebroadcastPeer.php', - 'CcShowRebroadcast' => 'airtime/CcShowRebroadcast.php', - 'CcShowRebroadcastQuery' => 'airtime/CcShowRebroadcastQuery.php', - 'BaseCcShowRebroadcastPeer' => 'airtime/om/BaseCcShowRebroadcastPeer.php', - 'BaseCcShowRebroadcast' => 'airtime/om/BaseCcShowRebroadcast.php', - 'BaseCcShowRebroadcastQuery' => 'airtime/om/BaseCcShowRebroadcastQuery.php', - 'CcShowHostsTableMap' => 'airtime/map/CcShowHostsTableMap.php', - 'CcShowHostsPeer' => 'airtime/CcShowHostsPeer.php', - 'CcShowHosts' => 'airtime/CcShowHosts.php', - 'CcShowHostsQuery' => 'airtime/CcShowHostsQuery.php', - 'BaseCcShowHostsPeer' => 'airtime/om/BaseCcShowHostsPeer.php', - 'BaseCcShowHosts' => 'airtime/om/BaseCcShowHosts.php', - 'BaseCcShowHostsQuery' => 'airtime/om/BaseCcShowHostsQuery.php', - 'CcPlaylistTableMap' => 'airtime/map/CcPlaylistTableMap.php', - 'CcPlaylistPeer' => 'airtime/CcPlaylistPeer.php', - 'CcPlaylist' => 'airtime/CcPlaylist.php', - 'CcPlaylistQuery' => 'airtime/CcPlaylistQuery.php', - 'BaseCcPlaylistPeer' => 'airtime/om/BaseCcPlaylistPeer.php', 'BaseCcPlaylist' => 'airtime/om/BaseCcPlaylist.php', + 'BaseCcPlaylistPeer' => 'airtime/om/BaseCcPlaylistPeer.php', 'BaseCcPlaylistQuery' => 'airtime/om/BaseCcPlaylistQuery.php', - 'CcPlaylistcontentsTableMap' => 'airtime/map/CcPlaylistcontentsTableMap.php', - 'CcPlaylistcontentsPeer' => 'airtime/CcPlaylistcontentsPeer.php', - 'CcPlaylistcontents' => 'airtime/CcPlaylistcontents.php', - 'CcPlaylistcontentsQuery' => 'airtime/CcPlaylistcontentsQuery.php', - 'BaseCcPlaylistcontentsPeer' => 'airtime/om/BaseCcPlaylistcontentsPeer.php', 'BaseCcPlaylistcontents' => 'airtime/om/BaseCcPlaylistcontents.php', + 'BaseCcPlaylistcontentsPeer' => 'airtime/om/BaseCcPlaylistcontentsPeer.php', 'BaseCcPlaylistcontentsQuery' => 'airtime/om/BaseCcPlaylistcontentsQuery.php', - 'CcBlockTableMap' => 'airtime/map/CcBlockTableMap.php', - 'CcBlockPeer' => 'airtime/CcBlockPeer.php', - 'CcBlock' => 'airtime/CcBlock.php', - 'CcBlockQuery' => 'airtime/CcBlockQuery.php', - 'BaseCcBlockPeer' => 'airtime/om/BaseCcBlockPeer.php', - 'BaseCcBlock' => 'airtime/om/BaseCcBlock.php', - 'BaseCcBlockQuery' => 'airtime/om/BaseCcBlockQuery.php', - 'CcBlockcontentsTableMap' => 'airtime/map/CcBlockcontentsTableMap.php', - 'CcBlockcontentsPeer' => 'airtime/CcBlockcontentsPeer.php', - 'CcBlockcontents' => 'airtime/CcBlockcontents.php', - 'CcBlockcontentsQuery' => 'airtime/CcBlockcontentsQuery.php', - 'BaseCcBlockcontentsPeer' => 'airtime/om/BaseCcBlockcontentsPeer.php', - 'BaseCcBlockcontents' => 'airtime/om/BaseCcBlockcontents.php', - 'BaseCcBlockcontentsQuery' => 'airtime/om/BaseCcBlockcontentsQuery.php', - 'CcBlockcriteriaTableMap' => 'airtime/map/CcBlockcriteriaTableMap.php', - 'CcBlockcriteriaPeer' => 'airtime/CcBlockcriteriaPeer.php', - 'CcBlockcriteria' => 'airtime/CcBlockcriteria.php', - 'CcBlockcriteriaQuery' => 'airtime/CcBlockcriteriaQuery.php', - 'BaseCcBlockcriteriaPeer' => 'airtime/om/BaseCcBlockcriteriaPeer.php', - 'BaseCcBlockcriteria' => 'airtime/om/BaseCcBlockcriteria.php', - 'BaseCcBlockcriteriaQuery' => 'airtime/om/BaseCcBlockcriteriaQuery.php', - 'CcPrefTableMap' => 'airtime/map/CcPrefTableMap.php', - 'CcPrefPeer' => 'airtime/CcPrefPeer.php', - 'CcPref' => 'airtime/CcPref.php', - 'CcPrefQuery' => 'airtime/CcPrefQuery.php', - 'BaseCcPrefPeer' => 'airtime/om/BaseCcPrefPeer.php', + 'BaseCcPlayoutHistory' => 'airtime/om/BaseCcPlayoutHistory.php', + 'BaseCcPlayoutHistoryMetaData' => 'airtime/om/BaseCcPlayoutHistoryMetaData.php', + 'BaseCcPlayoutHistoryMetaDataPeer' => 'airtime/om/BaseCcPlayoutHistoryMetaDataPeer.php', + 'BaseCcPlayoutHistoryMetaDataQuery' => 'airtime/om/BaseCcPlayoutHistoryMetaDataQuery.php', + 'BaseCcPlayoutHistoryPeer' => 'airtime/om/BaseCcPlayoutHistoryPeer.php', + 'BaseCcPlayoutHistoryQuery' => 'airtime/om/BaseCcPlayoutHistoryQuery.php', + 'BaseCcPlayoutHistoryTemplate' => 'airtime/om/BaseCcPlayoutHistoryTemplate.php', + 'BaseCcPlayoutHistoryTemplateField' => 'airtime/om/BaseCcPlayoutHistoryTemplateField.php', + 'BaseCcPlayoutHistoryTemplateFieldPeer' => 'airtime/om/BaseCcPlayoutHistoryTemplateFieldPeer.php', + 'BaseCcPlayoutHistoryTemplateFieldQuery' => 'airtime/om/BaseCcPlayoutHistoryTemplateFieldQuery.php', + 'BaseCcPlayoutHistoryTemplatePeer' => 'airtime/om/BaseCcPlayoutHistoryTemplatePeer.php', + 'BaseCcPlayoutHistoryTemplateQuery' => 'airtime/om/BaseCcPlayoutHistoryTemplateQuery.php', 'BaseCcPref' => 'airtime/om/BaseCcPref.php', + 'BaseCcPrefPeer' => 'airtime/om/BaseCcPrefPeer.php', 'BaseCcPrefQuery' => 'airtime/om/BaseCcPrefQuery.php', - 'CcScheduleTableMap' => 'airtime/map/CcScheduleTableMap.php', - 'CcSchedulePeer' => 'airtime/CcSchedulePeer.php', - 'CcSchedule' => 'airtime/CcSchedule.php', - 'CcScheduleQuery' => 'airtime/CcScheduleQuery.php', - 'BaseCcSchedulePeer' => 'airtime/om/BaseCcSchedulePeer.php', 'BaseCcSchedule' => 'airtime/om/BaseCcSchedule.php', + 'BaseCcSchedulePeer' => 'airtime/om/BaseCcSchedulePeer.php', 'BaseCcScheduleQuery' => 'airtime/om/BaseCcScheduleQuery.php', - 'CcSessTableMap' => 'airtime/map/CcSessTableMap.php', - 'CcSessPeer' => 'airtime/CcSessPeer.php', - 'CcSess' => 'airtime/CcSess.php', - 'CcSessQuery' => 'airtime/CcSessQuery.php', - 'BaseCcSessPeer' => 'airtime/om/BaseCcSessPeer.php', + 'BaseCcServiceRegister' => 'airtime/om/BaseCcServiceRegister.php', + 'BaseCcServiceRegisterPeer' => 'airtime/om/BaseCcServiceRegisterPeer.php', + 'BaseCcServiceRegisterQuery' => 'airtime/om/BaseCcServiceRegisterQuery.php', 'BaseCcSess' => 'airtime/om/BaseCcSess.php', + 'BaseCcSessPeer' => 'airtime/om/BaseCcSessPeer.php', 'BaseCcSessQuery' => 'airtime/om/BaseCcSessQuery.php', - 'CcSmembTableMap' => 'airtime/map/CcSmembTableMap.php', - 'CcSmembPeer' => 'airtime/CcSmembPeer.php', - 'CcSmemb' => 'airtime/CcSmemb.php', - 'CcSmembQuery' => 'airtime/CcSmembQuery.php', - 'BaseCcSmembPeer' => 'airtime/om/BaseCcSmembPeer.php', + 'BaseCcShow' => 'airtime/om/BaseCcShow.php', + 'BaseCcShowDays' => 'airtime/om/BaseCcShowDays.php', + 'BaseCcShowDaysPeer' => 'airtime/om/BaseCcShowDaysPeer.php', + 'BaseCcShowDaysQuery' => 'airtime/om/BaseCcShowDaysQuery.php', + 'BaseCcShowHosts' => 'airtime/om/BaseCcShowHosts.php', + 'BaseCcShowHostsPeer' => 'airtime/om/BaseCcShowHostsPeer.php', + 'BaseCcShowHostsQuery' => 'airtime/om/BaseCcShowHostsQuery.php', + 'BaseCcShowInstances' => 'airtime/om/BaseCcShowInstances.php', + 'BaseCcShowInstancesPeer' => 'airtime/om/BaseCcShowInstancesPeer.php', + 'BaseCcShowInstancesQuery' => 'airtime/om/BaseCcShowInstancesQuery.php', + 'BaseCcShowPeer' => 'airtime/om/BaseCcShowPeer.php', + 'BaseCcShowQuery' => 'airtime/om/BaseCcShowQuery.php', + 'BaseCcShowRebroadcast' => 'airtime/om/BaseCcShowRebroadcast.php', + 'BaseCcShowRebroadcastPeer' => 'airtime/om/BaseCcShowRebroadcastPeer.php', + 'BaseCcShowRebroadcastQuery' => 'airtime/om/BaseCcShowRebroadcastQuery.php', 'BaseCcSmemb' => 'airtime/om/BaseCcSmemb.php', + 'BaseCcSmembPeer' => 'airtime/om/BaseCcSmembPeer.php', 'BaseCcSmembQuery' => 'airtime/om/BaseCcSmembQuery.php', - 'CcSubjsTableMap' => 'airtime/map/CcSubjsTableMap.php', - 'CcSubjsPeer' => 'airtime/CcSubjsPeer.php', - 'CcSubjs' => 'airtime/CcSubjs.php', - 'CcSubjsQuery' => 'airtime/CcSubjsQuery.php', - 'BaseCcSubjsPeer' => 'airtime/om/BaseCcSubjsPeer.php', + 'BaseCcStreamSetting' => 'airtime/om/BaseCcStreamSetting.php', + 'BaseCcStreamSettingPeer' => 'airtime/om/BaseCcStreamSettingPeer.php', + 'BaseCcStreamSettingQuery' => 'airtime/om/BaseCcStreamSettingQuery.php', 'BaseCcSubjs' => 'airtime/om/BaseCcSubjs.php', + 'BaseCcSubjsPeer' => 'airtime/om/BaseCcSubjsPeer.php', 'BaseCcSubjsQuery' => 'airtime/om/BaseCcSubjsQuery.php', - 'CcSubjsTokenTableMap' => 'airtime/map/CcSubjsTokenTableMap.php', - 'CcSubjsTokenPeer' => 'airtime/CcSubjsTokenPeer.php', - 'CcSubjsToken' => 'airtime/CcSubjsToken.php', - 'CcSubjsTokenQuery' => 'airtime/CcSubjsTokenQuery.php', - 'BaseCcSubjsTokenPeer' => 'airtime/om/BaseCcSubjsTokenPeer.php', 'BaseCcSubjsToken' => 'airtime/om/BaseCcSubjsToken.php', + 'BaseCcSubjsTokenPeer' => 'airtime/om/BaseCcSubjsTokenPeer.php', 'BaseCcSubjsTokenQuery' => 'airtime/om/BaseCcSubjsTokenQuery.php', - 'CcCountryTableMap' => 'airtime/map/CcCountryTableMap.php', - 'CcCountryPeer' => 'airtime/CcCountryPeer.php', - 'CcCountry' => 'airtime/CcCountry.php', - 'CcCountryQuery' => 'airtime/CcCountryQuery.php', - 'BaseCcCountryPeer' => 'airtime/om/BaseCcCountryPeer.php', - 'BaseCcCountry' => 'airtime/om/BaseCcCountry.php', - 'BaseCcCountryQuery' => 'airtime/om/BaseCcCountryQuery.php', - 'CcStreamSettingTableMap' => 'airtime/map/CcStreamSettingTableMap.php', - 'CcStreamSettingPeer' => 'airtime/CcStreamSettingPeer.php', - 'CcStreamSetting' => 'airtime/CcStreamSetting.php', - 'CcStreamSettingQuery' => 'airtime/CcStreamSettingQuery.php', - 'BaseCcStreamSettingPeer' => 'airtime/om/BaseCcStreamSettingPeer.php', - 'BaseCcStreamSetting' => 'airtime/om/BaseCcStreamSetting.php', - 'BaseCcStreamSettingQuery' => 'airtime/om/BaseCcStreamSettingQuery.php', - 'CcLoginAttemptsTableMap' => 'airtime/map/CcLoginAttemptsTableMap.php', - 'CcLoginAttemptsPeer' => 'airtime/CcLoginAttemptsPeer.php', - 'CcLoginAttempts' => 'airtime/CcLoginAttempts.php', - 'CcLoginAttemptsQuery' => 'airtime/CcLoginAttemptsQuery.php', - 'BaseCcLoginAttemptsPeer' => 'airtime/om/BaseCcLoginAttemptsPeer.php', - 'BaseCcLoginAttempts' => 'airtime/om/BaseCcLoginAttempts.php', - 'BaseCcLoginAttemptsQuery' => 'airtime/om/BaseCcLoginAttemptsQuery.php', - 'CcServiceRegisterTableMap' => 'airtime/map/CcServiceRegisterTableMap.php', - 'CcServiceRegisterPeer' => 'airtime/CcServiceRegisterPeer.php', - 'CcServiceRegister' => 'airtime/CcServiceRegister.php', - 'CcServiceRegisterQuery' => 'airtime/CcServiceRegisterQuery.php', - 'BaseCcServiceRegisterPeer' => 'airtime/om/BaseCcServiceRegisterPeer.php', - 'BaseCcServiceRegister' => 'airtime/om/BaseCcServiceRegister.php', - 'BaseCcServiceRegisterQuery' => 'airtime/om/BaseCcServiceRegisterQuery.php', - 'CcLiveLogTableMap' => 'airtime/map/CcLiveLogTableMap.php', - 'CcLiveLogPeer' => 'airtime/CcLiveLogPeer.php', - 'CcLiveLog' => 'airtime/CcLiveLog.php', - 'CcLiveLogQuery' => 'airtime/CcLiveLogQuery.php', - 'BaseCcLiveLogPeer' => 'airtime/om/BaseCcLiveLogPeer.php', - 'BaseCcLiveLog' => 'airtime/om/BaseCcLiveLog.php', - 'BaseCcLiveLogQuery' => 'airtime/om/BaseCcLiveLogQuery.php', - 'CcWebstreamTableMap' => 'airtime/map/CcWebstreamTableMap.php', - 'CcWebstreamPeer' => 'airtime/CcWebstreamPeer.php', - 'CcWebstream' => 'airtime/CcWebstream.php', - 'CcWebstreamQuery' => 'airtime/CcWebstreamQuery.php', - 'BaseCcWebstreamPeer' => 'airtime/om/BaseCcWebstreamPeer.php', + 'BaseCcTimestamp' => 'airtime/om/BaseCcTimestamp.php', + 'BaseCcTimestampPeer' => 'airtime/om/BaseCcTimestampPeer.php', + 'BaseCcTimestampQuery' => 'airtime/om/BaseCcTimestampQuery.php', 'BaseCcWebstream' => 'airtime/om/BaseCcWebstream.php', - 'BaseCcWebstreamQuery' => 'airtime/om/BaseCcWebstreamQuery.php', - 'CcWebstreamMetadataTableMap' => 'airtime/map/CcWebstreamMetadataTableMap.php', - 'CcWebstreamMetadataPeer' => 'airtime/CcWebstreamMetadataPeer.php', - 'CcWebstreamMetadata' => 'airtime/CcWebstreamMetadata.php', - 'CcWebstreamMetadataQuery' => 'airtime/CcWebstreamMetadataQuery.php', - 'BaseCcWebstreamMetadataPeer' => 'airtime/om/BaseCcWebstreamMetadataPeer.php', 'BaseCcWebstreamMetadata' => 'airtime/om/BaseCcWebstreamMetadata.php', + 'BaseCcWebstreamMetadataPeer' => 'airtime/om/BaseCcWebstreamMetadataPeer.php', 'BaseCcWebstreamMetadataQuery' => 'airtime/om/BaseCcWebstreamMetadataQuery.php', - 'CcMountNameTableMap' => 'airtime/map/CcMountNameTableMap.php', - 'CcMountNamePeer' => 'airtime/CcMountNamePeer.php', - 'CcMountName' => 'airtime/CcMountName.php', - 'CcMountNameQuery' => 'airtime/CcMountNameQuery.php', - 'BaseCcMountNamePeer' => 'airtime/om/BaseCcMountNamePeer.php', - 'BaseCcMountName' => 'airtime/om/BaseCcMountName.php', - 'BaseCcMountNameQuery' => 'airtime/om/BaseCcMountNameQuery.php', - 'CcTimestampTableMap' => 'airtime/map/CcTimestampTableMap.php', - 'CcTimestampPeer' => 'airtime/CcTimestampPeer.php', - 'CcTimestamp' => 'airtime/CcTimestamp.php', - 'CcTimestampQuery' => 'airtime/CcTimestampQuery.php', - 'BaseCcTimestampPeer' => 'airtime/om/BaseCcTimestampPeer.php', - 'BaseCcTimestamp' => 'airtime/om/BaseCcTimestamp.php', - 'BaseCcTimestampQuery' => 'airtime/om/BaseCcTimestampQuery.php', - 'CcListenerCountTableMap' => 'airtime/map/CcListenerCountTableMap.php', - 'CcListenerCountPeer' => 'airtime/CcListenerCountPeer.php', + 'BaseCcWebstreamPeer' => 'airtime/om/BaseCcWebstreamPeer.php', + 'BaseCcWebstreamQuery' => 'airtime/om/BaseCcWebstreamQuery.php', + 'CcBlock' => 'airtime/CcBlock.php', + 'CcBlockPeer' => 'airtime/CcBlockPeer.php', + 'CcBlockQuery' => 'airtime/CcBlockQuery.php', + 'CcBlockTableMap' => 'airtime/map/CcBlockTableMap.php', + 'CcBlockcontents' => 'airtime/CcBlockcontents.php', + 'CcBlockcontentsPeer' => 'airtime/CcBlockcontentsPeer.php', + 'CcBlockcontentsQuery' => 'airtime/CcBlockcontentsQuery.php', + 'CcBlockcontentsTableMap' => 'airtime/map/CcBlockcontentsTableMap.php', + 'CcBlockcriteria' => 'airtime/CcBlockcriteria.php', + 'CcBlockcriteriaPeer' => 'airtime/CcBlockcriteriaPeer.php', + 'CcBlockcriteriaQuery' => 'airtime/CcBlockcriteriaQuery.php', + 'CcBlockcriteriaTableMap' => 'airtime/map/CcBlockcriteriaTableMap.php', + 'CcCountry' => 'airtime/CcCountry.php', + 'CcCountryPeer' => 'airtime/CcCountryPeer.php', + 'CcCountryQuery' => 'airtime/CcCountryQuery.php', + 'CcCountryTableMap' => 'airtime/map/CcCountryTableMap.php', + 'CcFiles' => 'airtime/CcFiles.php', + 'CcFilesPeer' => 'airtime/CcFilesPeer.php', + 'CcFilesQuery' => 'airtime/CcFilesQuery.php', + 'CcFilesTableMap' => 'airtime/map/CcFilesTableMap.php', 'CcListenerCount' => 'airtime/CcListenerCount.php', + 'CcListenerCountPeer' => 'airtime/CcListenerCountPeer.php', 'CcListenerCountQuery' => 'airtime/CcListenerCountQuery.php', - 'BaseCcListenerCountPeer' => 'airtime/om/BaseCcListenerCountPeer.php', - 'BaseCcListenerCount' => 'airtime/om/BaseCcListenerCount.php', - 'BaseCcListenerCountQuery' => 'airtime/om/BaseCcListenerCountQuery.php', - 'CcLocaleTableMap' => 'airtime/map/CcLocaleTableMap.php', - 'CcLocalePeer' => 'airtime/CcLocalePeer.php', + 'CcListenerCountTableMap' => 'airtime/map/CcListenerCountTableMap.php', + 'CcLiveLog' => 'airtime/CcLiveLog.php', + 'CcLiveLogPeer' => 'airtime/CcLiveLogPeer.php', + 'CcLiveLogQuery' => 'airtime/CcLiveLogQuery.php', + 'CcLiveLogTableMap' => 'airtime/map/CcLiveLogTableMap.php', 'CcLocale' => 'airtime/CcLocale.php', + 'CcLocalePeer' => 'airtime/CcLocalePeer.php', 'CcLocaleQuery' => 'airtime/CcLocaleQuery.php', - 'BaseCcLocalePeer' => 'airtime/om/BaseCcLocalePeer.php', - 'BaseCcLocale' => 'airtime/om/BaseCcLocale.php', - 'BaseCcLocaleQuery' => 'airtime/om/BaseCcLocaleQuery.php', - 'CcPlayoutHistoryTableMap' => 'airtime/map/CcPlayoutHistoryTableMap.php', - 'CcPlayoutHistoryPeer' => 'airtime/CcPlayoutHistoryPeer.php', + 'CcLocaleTableMap' => 'airtime/map/CcLocaleTableMap.php', + 'CcLoginAttempts' => 'airtime/CcLoginAttempts.php', + 'CcLoginAttemptsPeer' => 'airtime/CcLoginAttemptsPeer.php', + 'CcLoginAttemptsQuery' => 'airtime/CcLoginAttemptsQuery.php', + 'CcLoginAttemptsTableMap' => 'airtime/map/CcLoginAttemptsTableMap.php', + 'CcMountName' => 'airtime/CcMountName.php', + 'CcMountNamePeer' => 'airtime/CcMountNamePeer.php', + 'CcMountNameQuery' => 'airtime/CcMountNameQuery.php', + 'CcMountNameTableMap' => 'airtime/map/CcMountNameTableMap.php', + 'CcMusicDirs' => 'airtime/CcMusicDirs.php', + 'CcMusicDirsPeer' => 'airtime/CcMusicDirsPeer.php', + 'CcMusicDirsQuery' => 'airtime/CcMusicDirsQuery.php', + 'CcMusicDirsTableMap' => 'airtime/map/CcMusicDirsTableMap.php', + 'CcPerms' => 'airtime/CcPerms.php', + 'CcPermsPeer' => 'airtime/CcPermsPeer.php', + 'CcPermsQuery' => 'airtime/CcPermsQuery.php', + 'CcPermsTableMap' => 'airtime/map/CcPermsTableMap.php', + 'CcPlaylist' => 'airtime/CcPlaylist.php', + 'CcPlaylistPeer' => 'airtime/CcPlaylistPeer.php', + 'CcPlaylistQuery' => 'airtime/CcPlaylistQuery.php', + 'CcPlaylistTableMap' => 'airtime/map/CcPlaylistTableMap.php', + 'CcPlaylistcontents' => 'airtime/CcPlaylistcontents.php', + 'CcPlaylistcontentsPeer' => 'airtime/CcPlaylistcontentsPeer.php', + 'CcPlaylistcontentsQuery' => 'airtime/CcPlaylistcontentsQuery.php', + 'CcPlaylistcontentsTableMap' => 'airtime/map/CcPlaylistcontentsTableMap.php', 'CcPlayoutHistory' => 'airtime/CcPlayoutHistory.php', - 'CcPlayoutHistoryQuery' => 'airtime/CcPlayoutHistoryQuery.php', - 'BaseCcPlayoutHistoryPeer' => 'airtime/om/BaseCcPlayoutHistoryPeer.php', - 'BaseCcPlayoutHistory' => 'airtime/om/BaseCcPlayoutHistory.php', - 'BaseCcPlayoutHistoryQuery' => 'airtime/om/BaseCcPlayoutHistoryQuery.php', - 'CcPlayoutHistoryMetaDataTableMap' => 'airtime/map/CcPlayoutHistoryMetaDataTableMap.php', - 'CcPlayoutHistoryMetaDataPeer' => 'airtime/CcPlayoutHistoryMetaDataPeer.php', 'CcPlayoutHistoryMetaData' => 'airtime/CcPlayoutHistoryMetaData.php', + 'CcPlayoutHistoryMetaDataPeer' => 'airtime/CcPlayoutHistoryMetaDataPeer.php', 'CcPlayoutHistoryMetaDataQuery' => 'airtime/CcPlayoutHistoryMetaDataQuery.php', - 'BaseCcPlayoutHistoryMetaDataPeer' => 'airtime/om/BaseCcPlayoutHistoryMetaDataPeer.php', - 'BaseCcPlayoutHistoryMetaData' => 'airtime/om/BaseCcPlayoutHistoryMetaData.php', - 'BaseCcPlayoutHistoryMetaDataQuery' => 'airtime/om/BaseCcPlayoutHistoryMetaDataQuery.php', - 'CcPlayoutHistoryTemplateTableMap' => 'airtime/map/CcPlayoutHistoryTemplateTableMap.php', - 'CcPlayoutHistoryTemplatePeer' => 'airtime/CcPlayoutHistoryTemplatePeer.php', + 'CcPlayoutHistoryMetaDataTableMap' => 'airtime/map/CcPlayoutHistoryMetaDataTableMap.php', + 'CcPlayoutHistoryPeer' => 'airtime/CcPlayoutHistoryPeer.php', + 'CcPlayoutHistoryQuery' => 'airtime/CcPlayoutHistoryQuery.php', + 'CcPlayoutHistoryTableMap' => 'airtime/map/CcPlayoutHistoryTableMap.php', 'CcPlayoutHistoryTemplate' => 'airtime/CcPlayoutHistoryTemplate.php', - 'CcPlayoutHistoryTemplateQuery' => 'airtime/CcPlayoutHistoryTemplateQuery.php', - 'BaseCcPlayoutHistoryTemplatePeer' => 'airtime/om/BaseCcPlayoutHistoryTemplatePeer.php', - 'BaseCcPlayoutHistoryTemplate' => 'airtime/om/BaseCcPlayoutHistoryTemplate.php', - 'BaseCcPlayoutHistoryTemplateQuery' => 'airtime/om/BaseCcPlayoutHistoryTemplateQuery.php', - 'CcPlayoutHistoryTemplateFieldTableMap' => 'airtime/map/CcPlayoutHistoryTemplateFieldTableMap.php', - 'CcPlayoutHistoryTemplateFieldPeer' => 'airtime/CcPlayoutHistoryTemplateFieldPeer.php', 'CcPlayoutHistoryTemplateField' => 'airtime/CcPlayoutHistoryTemplateField.php', + 'CcPlayoutHistoryTemplateFieldPeer' => 'airtime/CcPlayoutHistoryTemplateFieldPeer.php', 'CcPlayoutHistoryTemplateFieldQuery' => 'airtime/CcPlayoutHistoryTemplateFieldQuery.php', - 'BaseCcPlayoutHistoryTemplateFieldPeer' => 'airtime/om/BaseCcPlayoutHistoryTemplateFieldPeer.php', - 'BaseCcPlayoutHistoryTemplateField' => 'airtime/om/BaseCcPlayoutHistoryTemplateField.php', - 'BaseCcPlayoutHistoryTemplateFieldQuery' => 'airtime/om/BaseCcPlayoutHistoryTemplateFieldQuery.php', + 'CcPlayoutHistoryTemplateFieldTableMap' => 'airtime/map/CcPlayoutHistoryTemplateFieldTableMap.php', + 'CcPlayoutHistoryTemplatePeer' => 'airtime/CcPlayoutHistoryTemplatePeer.php', + 'CcPlayoutHistoryTemplateQuery' => 'airtime/CcPlayoutHistoryTemplateQuery.php', + 'CcPlayoutHistoryTemplateTableMap' => 'airtime/map/CcPlayoutHistoryTemplateTableMap.php', + 'CcPref' => 'airtime/CcPref.php', + 'CcPrefPeer' => 'airtime/CcPrefPeer.php', + 'CcPrefQuery' => 'airtime/CcPrefQuery.php', + 'CcPrefTableMap' => 'airtime/map/CcPrefTableMap.php', + 'CcSchedule' => 'airtime/CcSchedule.php', + 'CcSchedulePeer' => 'airtime/CcSchedulePeer.php', + 'CcScheduleQuery' => 'airtime/CcScheduleQuery.php', + 'CcScheduleTableMap' => 'airtime/map/CcScheduleTableMap.php', + 'CcServiceRegister' => 'airtime/CcServiceRegister.php', + 'CcServiceRegisterPeer' => 'airtime/CcServiceRegisterPeer.php', + 'CcServiceRegisterQuery' => 'airtime/CcServiceRegisterQuery.php', + 'CcServiceRegisterTableMap' => 'airtime/map/CcServiceRegisterTableMap.php', + 'CcSess' => 'airtime/CcSess.php', + 'CcSessPeer' => 'airtime/CcSessPeer.php', + 'CcSessQuery' => 'airtime/CcSessQuery.php', + 'CcSessTableMap' => 'airtime/map/CcSessTableMap.php', + 'CcShow' => 'airtime/CcShow.php', + 'CcShowDays' => 'airtime/CcShowDays.php', + 'CcShowDaysPeer' => 'airtime/CcShowDaysPeer.php', + 'CcShowDaysQuery' => 'airtime/CcShowDaysQuery.php', + 'CcShowDaysTableMap' => 'airtime/map/CcShowDaysTableMap.php', + 'CcShowHosts' => 'airtime/CcShowHosts.php', + 'CcShowHostsPeer' => 'airtime/CcShowHostsPeer.php', + 'CcShowHostsQuery' => 'airtime/CcShowHostsQuery.php', + 'CcShowHostsTableMap' => 'airtime/map/CcShowHostsTableMap.php', + 'CcShowInstances' => 'airtime/CcShowInstances.php', + 'CcShowInstancesPeer' => 'airtime/CcShowInstancesPeer.php', + 'CcShowInstancesQuery' => 'airtime/CcShowInstancesQuery.php', + 'CcShowInstancesTableMap' => 'airtime/map/CcShowInstancesTableMap.php', + 'CcShowPeer' => 'airtime/CcShowPeer.php', + 'CcShowQuery' => 'airtime/CcShowQuery.php', + 'CcShowRebroadcast' => 'airtime/CcShowRebroadcast.php', + 'CcShowRebroadcastPeer' => 'airtime/CcShowRebroadcastPeer.php', + 'CcShowRebroadcastQuery' => 'airtime/CcShowRebroadcastQuery.php', + 'CcShowRebroadcastTableMap' => 'airtime/map/CcShowRebroadcastTableMap.php', + 'CcShowTableMap' => 'airtime/map/CcShowTableMap.php', + 'CcSmemb' => 'airtime/CcSmemb.php', + 'CcSmembPeer' => 'airtime/CcSmembPeer.php', + 'CcSmembQuery' => 'airtime/CcSmembQuery.php', + 'CcSmembTableMap' => 'airtime/map/CcSmembTableMap.php', + 'CcStreamSetting' => 'airtime/CcStreamSetting.php', + 'CcStreamSettingPeer' => 'airtime/CcStreamSettingPeer.php', + 'CcStreamSettingQuery' => 'airtime/CcStreamSettingQuery.php', + 'CcStreamSettingTableMap' => 'airtime/map/CcStreamSettingTableMap.php', + 'CcSubjs' => 'airtime/CcSubjs.php', + 'CcSubjsPeer' => 'airtime/CcSubjsPeer.php', + 'CcSubjsQuery' => 'airtime/CcSubjsQuery.php', + 'CcSubjsTableMap' => 'airtime/map/CcSubjsTableMap.php', + 'CcSubjsToken' => 'airtime/CcSubjsToken.php', + 'CcSubjsTokenPeer' => 'airtime/CcSubjsTokenPeer.php', + 'CcSubjsTokenQuery' => 'airtime/CcSubjsTokenQuery.php', + 'CcSubjsTokenTableMap' => 'airtime/map/CcSubjsTokenTableMap.php', + 'CcTimestamp' => 'airtime/CcTimestamp.php', + 'CcTimestampPeer' => 'airtime/CcTimestampPeer.php', + 'CcTimestampQuery' => 'airtime/CcTimestampQuery.php', + 'CcTimestampTableMap' => 'airtime/map/CcTimestampTableMap.php', + 'CcWebstream' => 'airtime/CcWebstream.php', + 'CcWebstreamMetadata' => 'airtime/CcWebstreamMetadata.php', + 'CcWebstreamMetadataPeer' => 'airtime/CcWebstreamMetadataPeer.php', + 'CcWebstreamMetadataQuery' => 'airtime/CcWebstreamMetadataQuery.php', + 'CcWebstreamMetadataTableMap' => 'airtime/map/CcWebstreamMetadataTableMap.php', + 'CcWebstreamPeer' => 'airtime/CcWebstreamPeer.php', + 'CcWebstreamQuery' => 'airtime/CcWebstreamQuery.php', + 'CcWebstreamTableMap' => 'airtime/map/CcWebstreamTableMap.php', ); \ No newline at end of file diff --git a/airtime_mvc/application/models/airtime/map/CcBlockTableMap.php b/airtime_mvc/application/models/airtime/map/CcBlockTableMap.php index 0ce86613c1..dfc5c95ffe 100644 --- a/airtime_mvc/application/models/airtime/map/CcBlockTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcBlockTableMap.php @@ -14,63 +14,70 @@ * * @package propel.generator.airtime.map */ -class CcBlockTableMap extends TableMap { +class CcBlockTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcBlockTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcBlockTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_block'); - $this->setPhpName('CcBlock'); - $this->setClassname('CcBlock'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_block_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('NAME', 'DbName', 'VARCHAR', true, 255, ''); - $this->addColumn('MTIME', 'DbMtime', 'TIMESTAMP', false, 6, null); - $this->addColumn('UTIME', 'DbUtime', 'TIMESTAMP', false, 6, null); - $this->addForeignKey('CREATOR_ID', 'DbCreatorId', 'INTEGER', 'cc_subjs', 'ID', false, null, null); - $this->addColumn('DESCRIPTION', 'DbDescription', 'VARCHAR', false, 512, null); - $this->addColumn('LENGTH', 'DbLength', 'VARCHAR', false, null, '00:00:00'); - $this->addColumn('TYPE', 'DbType', 'VARCHAR', false, 7, 'static'); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_block'); + $this->setPhpName('CcBlock'); + $this->setClassname('CcBlock'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_block_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('name', 'DbName', 'VARCHAR', true, 255, ''); + $this->addColumn('mtime', 'DbMtime', 'TIMESTAMP', false, 6, null); + $this->addColumn('utime', 'DbUtime', 'TIMESTAMP', false, 6, null); + $this->addForeignKey('creator_id', 'DbCreatorId', 'INTEGER', 'cc_subjs', 'id', false, null, null); + $this->addColumn('description', 'DbDescription', 'VARCHAR', false, 512, null); + $this->addColumn('length', 'DbLength', 'VARCHAR', false, null, '00:00:00'); + $this->addColumn('type', 'DbType', 'VARCHAR', false, 7, 'static'); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('creator_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcPlaylistcontents', 'CcPlaylistcontents', RelationMap::ONE_TO_MANY, array('id' => 'block_id', ), 'CASCADE', null); - $this->addRelation('CcBlockcontents', 'CcBlockcontents', RelationMap::ONE_TO_MANY, array('id' => 'block_id', ), 'CASCADE', null); - $this->addRelation('CcBlockcriteria', 'CcBlockcriteria', RelationMap::ONE_TO_MANY, array('id' => 'block_id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('creator_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcPlaylistcontents', 'CcPlaylistcontents', RelationMap::ONE_TO_MANY, array('id' => 'block_id', ), 'CASCADE', null, 'CcPlaylistcontentss'); + $this->addRelation('CcBlockcontents', 'CcBlockcontents', RelationMap::ONE_TO_MANY, array('id' => 'block_id', ), 'CASCADE', null, 'CcBlockcontentss'); + $this->addRelation('CcBlockcriteria', 'CcBlockcriteria', RelationMap::ONE_TO_MANY, array('id' => 'block_id', ), 'CASCADE', null, 'CcBlockcriterias'); + } // buildRelations() - /** - * - * Gets the list of behaviors registered for this table - * - * @return array Associative array (name => parameters) of behaviors - */ - public function getBehaviors() - { - return array( - 'aggregate_column' => array('name' => 'length', 'expression' => 'SUM(cliplength)', 'foreign_table' => 'cc_blockcontents', ), - ); - } // getBehaviors() + /** + * + * Gets the list of behaviors registered for this table + * + * @return array Associative array (name => parameters) of behaviors + */ + public function getBehaviors() + { + return array( + 'aggregate_column' => array ( + 'name' => 'length', + 'expression' => 'SUM(cliplength)', + 'condition' => NULL, + 'foreign_table' => 'cc_blockcontents', + 'foreign_schema' => NULL, +), + ); + } // getBehaviors() } // CcBlockTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcBlockcontentsTableMap.php b/airtime_mvc/application/models/airtime/map/CcBlockcontentsTableMap.php index ec74e8b7e0..da16caa4c4 100644 --- a/airtime_mvc/application/models/airtime/map/CcBlockcontentsTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcBlockcontentsTableMap.php @@ -14,63 +14,67 @@ * * @package propel.generator.airtime.map */ -class CcBlockcontentsTableMap extends TableMap { +class CcBlockcontentsTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcBlockcontentsTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcBlockcontentsTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_blockcontents'); - $this->setPhpName('CcBlockcontents'); - $this->setClassname('CcBlockcontents'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_blockcontents_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addForeignKey('BLOCK_ID', 'DbBlockId', 'INTEGER', 'cc_block', 'ID', false, null, null); - $this->addForeignKey('FILE_ID', 'DbFileId', 'INTEGER', 'cc_files', 'ID', false, null, null); - $this->addColumn('POSITION', 'DbPosition', 'INTEGER', false, null, null); - $this->addColumn('TRACKOFFSET', 'DbTrackOffset', 'REAL', true, null, 0); - $this->addColumn('CLIPLENGTH', 'DbCliplength', 'VARCHAR', false, null, '00:00:00'); - $this->addColumn('CUEIN', 'DbCuein', 'VARCHAR', false, null, '00:00:00'); - $this->addColumn('CUEOUT', 'DbCueout', 'VARCHAR', false, null, '00:00:00'); - $this->addColumn('FADEIN', 'DbFadein', 'TIME', false, null, '00:00:00'); - $this->addColumn('FADEOUT', 'DbFadeout', 'TIME', false, null, '00:00:00'); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_blockcontents'); + $this->setPhpName('CcBlockcontents'); + $this->setClassname('CcBlockcontents'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_blockcontents_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addForeignKey('block_id', 'DbBlockId', 'INTEGER', 'cc_block', 'id', false, null, null); + $this->addForeignKey('file_id', 'DbFileId', 'INTEGER', 'cc_files', 'id', false, null, null); + $this->addColumn('position', 'DbPosition', 'INTEGER', false, null, null); + $this->addColumn('trackoffset', 'DbTrackOffset', 'REAL', true, null, 0); + $this->addColumn('cliplength', 'DbCliplength', 'VARCHAR', false, null, '00:00:00'); + $this->addColumn('cuein', 'DbCuein', 'VARCHAR', false, null, '00:00:00'); + $this->addColumn('cueout', 'DbCueout', 'VARCHAR', false, null, '00:00:00'); + $this->addColumn('fadein', 'DbFadein', 'TIME', false, null, '00:00:00'); + $this->addColumn('fadeout', 'DbFadeout', 'TIME', false, null, '00:00:00'); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcBlock', 'CcBlock', RelationMap::MANY_TO_ONE, array('block_id' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcBlock', 'CcBlock', RelationMap::MANY_TO_ONE, array('block_id' => 'id', ), 'CASCADE', null); + } // buildRelations() - /** - * - * Gets the list of behaviors registered for this table - * - * @return array Associative array (name => parameters) of behaviors - */ - public function getBehaviors() - { - return array( - 'aggregate_column_relation' => array('foreign_table' => 'cc_block', 'update_method' => 'updateDbLength', ), - ); - } // getBehaviors() + /** + * + * Gets the list of behaviors registered for this table + * + * @return array Associative array (name => parameters) of behaviors + */ + public function getBehaviors() + { + return array( + 'aggregate_column_relation' => array ( + 'foreign_table' => 'cc_block', + 'update_method' => 'updateDbLength', +), + ); + } // getBehaviors() } // CcBlockcontentsTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcBlockcriteriaTableMap.php b/airtime_mvc/application/models/airtime/map/CcBlockcriteriaTableMap.php index 6565bf259b..cf4a5e2ec9 100644 --- a/airtime_mvc/application/models/airtime/map/CcBlockcriteriaTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcBlockcriteriaTableMap.php @@ -14,45 +14,46 @@ * * @package propel.generator.airtime.map */ -class CcBlockcriteriaTableMap extends TableMap { +class CcBlockcriteriaTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcBlockcriteriaTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcBlockcriteriaTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_blockcriteria'); - $this->setPhpName('CcBlockcriteria'); - $this->setClassname('CcBlockcriteria'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_blockcriteria_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('CRITERIA', 'DbCriteria', 'VARCHAR', true, 32, null); - $this->addColumn('MODIFIER', 'DbModifier', 'VARCHAR', true, 16, null); - $this->addColumn('VALUE', 'DbValue', 'VARCHAR', true, 512, null); - $this->addColumn('EXTRA', 'DbExtra', 'VARCHAR', false, 512, null); - $this->addForeignKey('BLOCK_ID', 'DbBlockId', 'INTEGER', 'cc_block', 'ID', true, null, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_blockcriteria'); + $this->setPhpName('CcBlockcriteria'); + $this->setClassname('CcBlockcriteria'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_blockcriteria_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('criteria', 'DbCriteria', 'VARCHAR', true, 32, null); + $this->addColumn('modifier', 'DbModifier', 'VARCHAR', true, 16, null); + $this->addColumn('value', 'DbValue', 'VARCHAR', true, 512, null); + $this->addColumn('extra', 'DbExtra', 'VARCHAR', false, 512, null); + $this->addForeignKey('block_id', 'DbBlockId', 'INTEGER', 'cc_block', 'id', true, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcBlock', 'CcBlock', RelationMap::MANY_TO_ONE, array('block_id' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcBlock', 'CcBlock', RelationMap::MANY_TO_ONE, array('block_id' => 'id', ), 'CASCADE', null); + } // buildRelations() } // CcBlockcriteriaTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcCountryTableMap.php b/airtime_mvc/application/models/airtime/map/CcCountryTableMap.php index b839d03596..b016f703de 100644 --- a/airtime_mvc/application/models/airtime/map/CcCountryTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcCountryTableMap.php @@ -14,39 +14,40 @@ * * @package propel.generator.airtime.map */ -class CcCountryTableMap extends TableMap { +class CcCountryTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcCountryTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcCountryTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_country'); - $this->setPhpName('CcCountry'); - $this->setClassname('CcCountry'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(false); - // columns - $this->addPrimaryKey('ISOCODE', 'DbIsoCode', 'CHAR', true, 3, null); - $this->addColumn('NAME', 'DbName', 'VARCHAR', true, 255, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_country'); + $this->setPhpName('CcCountry'); + $this->setClassname('CcCountry'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(false); + // columns + $this->addPrimaryKey('isocode', 'DbIsoCode', 'CHAR', true, 3, null); + $this->addColumn('name', 'DbName', 'VARCHAR', true, 255, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + } // buildRelations() } // CcCountryTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php index cfe0830fb3..f58689f3a9 100644 --- a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php @@ -14,117 +14,118 @@ * * @package propel.generator.airtime.map */ -class CcFilesTableMap extends TableMap { +class CcFilesTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcFilesTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcFilesTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_files'); - $this->setPhpName('CcFiles'); - $this->setClassname('CcFiles'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_files_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('NAME', 'DbName', 'VARCHAR', true, 255, ''); - $this->addColumn('MIME', 'DbMime', 'VARCHAR', true, 255, ''); - $this->addColumn('FTYPE', 'DbFtype', 'VARCHAR', true, 128, ''); - $this->addForeignKey('DIRECTORY', 'DbDirectory', 'INTEGER', 'cc_music_dirs', 'ID', false, null, null); - $this->addColumn('FILEPATH', 'DbFilepath', 'LONGVARCHAR', false, null, ''); - $this->addColumn('IMPORT_STATUS', 'DbImportStatus', 'INTEGER', true, null, 1); - $this->addColumn('CURRENTLYACCESSING', 'DbCurrentlyaccessing', 'INTEGER', true, null, 0); - $this->addForeignKey('EDITEDBY', 'DbEditedby', 'INTEGER', 'cc_subjs', 'ID', false, null, null); - $this->addColumn('MTIME', 'DbMtime', 'TIMESTAMP', false, 6, null); - $this->addColumn('UTIME', 'DbUtime', 'TIMESTAMP', false, 6, null); - $this->addColumn('LPTIME', 'DbLPtime', 'TIMESTAMP', false, 6, null); - $this->addColumn('MD5', 'DbMd5', 'CHAR', false, 32, null); - $this->addColumn('TRACK_TITLE', 'DbTrackTitle', 'VARCHAR', false, 512, null); - $this->addColumn('ARTIST_NAME', 'DbArtistName', 'VARCHAR', false, 512, null); - $this->addColumn('BIT_RATE', 'DbBitRate', 'INTEGER', false, null, null); - $this->addColumn('SAMPLE_RATE', 'DbSampleRate', 'INTEGER', false, null, null); - $this->addColumn('FORMAT', 'DbFormat', 'VARCHAR', false, 128, null); - $this->addColumn('LENGTH', 'DbLength', 'VARCHAR', false, null, '00:00:00'); - $this->addColumn('ALBUM_TITLE', 'DbAlbumTitle', 'VARCHAR', false, 512, null); - $this->addColumn('GENRE', 'DbGenre', 'VARCHAR', false, 64, null); - $this->addColumn('COMMENTS', 'DbComments', 'LONGVARCHAR', false, null, null); - $this->addColumn('YEAR', 'DbYear', 'VARCHAR', false, 16, null); - $this->addColumn('TRACK_NUMBER', 'DbTrackNumber', 'INTEGER', false, null, null); - $this->addColumn('CHANNELS', 'DbChannels', 'INTEGER', false, null, null); - $this->addColumn('URL', 'DbUrl', 'VARCHAR', false, 1024, null); - $this->addColumn('BPM', 'DbBpm', 'INTEGER', false, null, null); - $this->addColumn('RATING', 'DbRating', 'VARCHAR', false, 8, null); - $this->addColumn('ENCODED_BY', 'DbEncodedBy', 'VARCHAR', false, 255, null); - $this->addColumn('DISC_NUMBER', 'DbDiscNumber', 'VARCHAR', false, 8, null); - $this->addColumn('MOOD', 'DbMood', 'VARCHAR', false, 64, null); - $this->addColumn('LABEL', 'DbLabel', 'VARCHAR', false, 512, null); - $this->addColumn('COMPOSER', 'DbComposer', 'VARCHAR', false, 512, null); - $this->addColumn('ENCODER', 'DbEncoder', 'VARCHAR', false, 64, null); - $this->addColumn('CHECKSUM', 'DbChecksum', 'VARCHAR', false, 256, null); - $this->addColumn('LYRICS', 'DbLyrics', 'LONGVARCHAR', false, null, null); - $this->addColumn('ORCHESTRA', 'DbOrchestra', 'VARCHAR', false, 512, null); - $this->addColumn('CONDUCTOR', 'DbConductor', 'VARCHAR', false, 512, null); - $this->addColumn('LYRICIST', 'DbLyricist', 'VARCHAR', false, 512, null); - $this->addColumn('ORIGINAL_LYRICIST', 'DbOriginalLyricist', 'VARCHAR', false, 512, null); - $this->addColumn('RADIO_STATION_NAME', 'DbRadioStationName', 'VARCHAR', false, 512, null); - $this->addColumn('INFO_URL', 'DbInfoUrl', 'VARCHAR', false, 512, null); - $this->addColumn('ARTIST_URL', 'DbArtistUrl', 'VARCHAR', false, 512, null); - $this->addColumn('AUDIO_SOURCE_URL', 'DbAudioSourceUrl', 'VARCHAR', false, 512, null); - $this->addColumn('RADIO_STATION_URL', 'DbRadioStationUrl', 'VARCHAR', false, 512, null); - $this->addColumn('BUY_THIS_URL', 'DbBuyThisUrl', 'VARCHAR', false, 512, null); - $this->addColumn('ISRC_NUMBER', 'DbIsrcNumber', 'VARCHAR', false, 512, null); - $this->addColumn('CATALOG_NUMBER', 'DbCatalogNumber', 'VARCHAR', false, 512, null); - $this->addColumn('ORIGINAL_ARTIST', 'DbOriginalArtist', 'VARCHAR', false, 512, null); - $this->addColumn('COPYRIGHT', 'DbCopyright', 'VARCHAR', false, 512, null); - $this->addColumn('REPORT_DATETIME', 'DbReportDatetime', 'VARCHAR', false, 32, null); - $this->addColumn('REPORT_LOCATION', 'DbReportLocation', 'VARCHAR', false, 512, null); - $this->addColumn('REPORT_ORGANIZATION', 'DbReportOrganization', 'VARCHAR', false, 512, null); - $this->addColumn('SUBJECT', 'DbSubject', 'VARCHAR', false, 512, null); - $this->addColumn('CONTRIBUTOR', 'DbContributor', 'VARCHAR', false, 512, null); - $this->addColumn('LANGUAGE', 'DbLanguage', 'VARCHAR', false, 512, null); - $this->addColumn('FILE_EXISTS', 'DbFileExists', 'BOOLEAN', false, null, true); - $this->addColumn('SOUNDCLOUD_ID', 'DbSoundcloudId', 'INTEGER', false, null, null); - $this->addColumn('SOUNDCLOUD_ERROR_CODE', 'DbSoundcloudErrorCode', 'INTEGER', false, null, null); - $this->addColumn('SOUNDCLOUD_ERROR_MSG', 'DbSoundcloudErrorMsg', 'VARCHAR', false, 512, null); - $this->addColumn('SOUNDCLOUD_LINK_TO_FILE', 'DbSoundcloudLinkToFile', 'VARCHAR', false, 4096, null); - $this->addColumn('SOUNDCLOUD_UPLOAD_TIME', 'DbSoundCloundUploadTime', 'TIMESTAMP', false, 6, null); - $this->addColumn('REPLAY_GAIN', 'DbReplayGain', 'NUMERIC', false, null, null); - $this->addForeignKey('OWNER_ID', 'DbOwnerId', 'INTEGER', 'cc_subjs', 'ID', false, null, null); - $this->addColumn('CUEIN', 'DbCuein', 'VARCHAR', false, null, '00:00:00'); - $this->addColumn('CUEOUT', 'DbCueout', 'VARCHAR', false, null, '00:00:00'); - $this->addColumn('SILAN_CHECK', 'DbSilanCheck', 'BOOLEAN', false, null, false); - $this->addColumn('HIDDEN', 'DbHidden', 'BOOLEAN', false, null, false); - $this->addColumn('IS_SCHEDULED', 'DbIsScheduled', 'BOOLEAN', false, null, false); - $this->addColumn('IS_PLAYLIST', 'DbIsPlaylist', 'BOOLEAN', false, null, false); - $this->addColumn('RESOURCE_ID', 'DbResourceId', 'LONGVARCHAR', false, null, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_files'); + $this->setPhpName('CcFiles'); + $this->setClassname('CcFiles'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_files_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('name', 'DbName', 'VARCHAR', true, 255, ''); + $this->addColumn('mime', 'DbMime', 'VARCHAR', true, 255, ''); + $this->addColumn('ftype', 'DbFtype', 'VARCHAR', true, 128, ''); + $this->addForeignKey('directory', 'DbDirectory', 'INTEGER', 'cc_music_dirs', 'id', false, null, null); + $this->addColumn('filepath', 'DbFilepath', 'LONGVARCHAR', false, null, ''); + $this->addColumn('import_status', 'DbImportStatus', 'INTEGER', true, null, 1); + $this->addColumn('currentlyaccessing', 'DbCurrentlyaccessing', 'INTEGER', true, null, 0); + $this->addForeignKey('editedby', 'DbEditedby', 'INTEGER', 'cc_subjs', 'id', false, null, null); + $this->addColumn('mtime', 'DbMtime', 'TIMESTAMP', false, 6, null); + $this->addColumn('utime', 'DbUtime', 'TIMESTAMP', false, 6, null); + $this->addColumn('lptime', 'DbLPtime', 'TIMESTAMP', false, 6, null); + $this->addColumn('md5', 'DbMd5', 'CHAR', false, 32, null); + $this->addColumn('track_title', 'DbTrackTitle', 'VARCHAR', false, 512, null); + $this->addColumn('artist_name', 'DbArtistName', 'VARCHAR', false, 512, null); + $this->addColumn('bit_rate', 'DbBitRate', 'INTEGER', false, null, null); + $this->addColumn('sample_rate', 'DbSampleRate', 'INTEGER', false, null, null); + $this->addColumn('format', 'DbFormat', 'VARCHAR', false, 128, null); + $this->addColumn('length', 'DbLength', 'VARCHAR', false, null, '00:00:00'); + $this->addColumn('album_title', 'DbAlbumTitle', 'VARCHAR', false, 512, null); + $this->addColumn('genre', 'DbGenre', 'VARCHAR', false, 64, null); + $this->addColumn('comments', 'DbComments', 'LONGVARCHAR', false, null, null); + $this->addColumn('year', 'DbYear', 'VARCHAR', false, 16, null); + $this->addColumn('track_number', 'DbTrackNumber', 'INTEGER', false, null, null); + $this->addColumn('channels', 'DbChannels', 'INTEGER', false, null, null); + $this->addColumn('url', 'DbUrl', 'VARCHAR', false, 1024, null); + $this->addColumn('bpm', 'DbBpm', 'INTEGER', false, null, null); + $this->addColumn('rating', 'DbRating', 'VARCHAR', false, 8, null); + $this->addColumn('encoded_by', 'DbEncodedBy', 'VARCHAR', false, 255, null); + $this->addColumn('disc_number', 'DbDiscNumber', 'VARCHAR', false, 8, null); + $this->addColumn('mood', 'DbMood', 'VARCHAR', false, 64, null); + $this->addColumn('label', 'DbLabel', 'VARCHAR', false, 512, null); + $this->addColumn('composer', 'DbComposer', 'VARCHAR', false, 512, null); + $this->addColumn('encoder', 'DbEncoder', 'VARCHAR', false, 64, null); + $this->addColumn('checksum', 'DbChecksum', 'VARCHAR', false, 256, null); + $this->addColumn('lyrics', 'DbLyrics', 'LONGVARCHAR', false, null, null); + $this->addColumn('orchestra', 'DbOrchestra', 'VARCHAR', false, 512, null); + $this->addColumn('conductor', 'DbConductor', 'VARCHAR', false, 512, null); + $this->addColumn('lyricist', 'DbLyricist', 'VARCHAR', false, 512, null); + $this->addColumn('original_lyricist', 'DbOriginalLyricist', 'VARCHAR', false, 512, null); + $this->addColumn('radio_station_name', 'DbRadioStationName', 'VARCHAR', false, 512, null); + $this->addColumn('info_url', 'DbInfoUrl', 'VARCHAR', false, 512, null); + $this->addColumn('artist_url', 'DbArtistUrl', 'VARCHAR', false, 512, null); + $this->addColumn('audio_source_url', 'DbAudioSourceUrl', 'VARCHAR', false, 512, null); + $this->addColumn('radio_station_url', 'DbRadioStationUrl', 'VARCHAR', false, 512, null); + $this->addColumn('buy_this_url', 'DbBuyThisUrl', 'VARCHAR', false, 512, null); + $this->addColumn('isrc_number', 'DbIsrcNumber', 'VARCHAR', false, 512, null); + $this->addColumn('catalog_number', 'DbCatalogNumber', 'VARCHAR', false, 512, null); + $this->addColumn('original_artist', 'DbOriginalArtist', 'VARCHAR', false, 512, null); + $this->addColumn('copyright', 'DbCopyright', 'VARCHAR', false, 512, null); + $this->addColumn('report_datetime', 'DbReportDatetime', 'VARCHAR', false, 32, null); + $this->addColumn('report_location', 'DbReportLocation', 'VARCHAR', false, 512, null); + $this->addColumn('report_organization', 'DbReportOrganization', 'VARCHAR', false, 512, null); + $this->addColumn('subject', 'DbSubject', 'VARCHAR', false, 512, null); + $this->addColumn('contributor', 'DbContributor', 'VARCHAR', false, 512, null); + $this->addColumn('language', 'DbLanguage', 'VARCHAR', false, 512, null); + $this->addColumn('file_exists', 'DbFileExists', 'BOOLEAN', false, null, true); + $this->addColumn('soundcloud_id', 'DbSoundcloudId', 'INTEGER', false, null, null); + $this->addColumn('soundcloud_error_code', 'DbSoundcloudErrorCode', 'INTEGER', false, null, null); + $this->addColumn('soundcloud_error_msg', 'DbSoundcloudErrorMsg', 'VARCHAR', false, 512, null); + $this->addColumn('soundcloud_link_to_file', 'DbSoundcloudLinkToFile', 'VARCHAR', false, 4096, null); + $this->addColumn('soundcloud_upload_time', 'DbSoundCloundUploadTime', 'TIMESTAMP', false, 6, null); + $this->addColumn('replay_gain', 'DbReplayGain', 'NUMERIC', false, null, null); + $this->addForeignKey('owner_id', 'DbOwnerId', 'INTEGER', 'cc_subjs', 'id', false, null, null); + $this->addColumn('cuein', 'DbCuein', 'VARCHAR', false, null, '00:00:00'); + $this->addColumn('cueout', 'DbCueout', 'VARCHAR', false, null, '00:00:00'); + $this->addColumn('silan_check', 'DbSilanCheck', 'BOOLEAN', false, null, false); + $this->addColumn('hidden', 'DbHidden', 'BOOLEAN', false, null, false); + $this->addColumn('is_scheduled', 'DbIsScheduled', 'BOOLEAN', false, null, false); + $this->addColumn('is_playlist', 'DbIsPlaylist', 'BOOLEAN', false, null, false); + $this->addColumn('resource_id', 'DbResourceId', 'LONGVARCHAR', false, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('FkOwner', 'CcSubjs', RelationMap::MANY_TO_ONE, array('owner_id' => 'id', ), null, null); - $this->addRelation('CcSubjsRelatedByDbEditedby', 'CcSubjs', RelationMap::MANY_TO_ONE, array('editedby' => 'id', ), null, null); - $this->addRelation('CcMusicDirs', 'CcMusicDirs', RelationMap::MANY_TO_ONE, array('directory' => 'id', ), null, null); - $this->addRelation('CcShowInstances', 'CcShowInstances', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null); - $this->addRelation('CcPlaylistcontents', 'CcPlaylistcontents', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null); - $this->addRelation('CcBlockcontents', 'CcBlockcontents', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null); - $this->addRelation('CcSchedule', 'CcSchedule', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null); - $this->addRelation('CcPlayoutHistory', 'CcPlayoutHistory', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('FkOwner', 'CcSubjs', RelationMap::MANY_TO_ONE, array('owner_id' => 'id', ), null, null); + $this->addRelation('CcSubjsRelatedByDbEditedby', 'CcSubjs', RelationMap::MANY_TO_ONE, array('editedby' => 'id', ), null, null); + $this->addRelation('CcMusicDirs', 'CcMusicDirs', RelationMap::MANY_TO_ONE, array('directory' => 'id', ), null, null); + $this->addRelation('CcShowInstances', 'CcShowInstances', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcShowInstancess'); + $this->addRelation('CcPlaylistcontents', 'CcPlaylistcontents', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcPlaylistcontentss'); + $this->addRelation('CcBlockcontents', 'CcBlockcontents', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcBlockcontentss'); + $this->addRelation('CcSchedule', 'CcSchedule', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcSchedules'); + $this->addRelation('CcPlayoutHistory', 'CcPlayoutHistory', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcPlayoutHistorys'); + } // buildRelations() } // CcFilesTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcListenerCountTableMap.php b/airtime_mvc/application/models/airtime/map/CcListenerCountTableMap.php index 2b9476a756..c3592f15df 100644 --- a/airtime_mvc/application/models/airtime/map/CcListenerCountTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcListenerCountTableMap.php @@ -14,44 +14,45 @@ * * @package propel.generator.airtime.map */ -class CcListenerCountTableMap extends TableMap { +class CcListenerCountTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcListenerCountTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcListenerCountTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_listener_count'); - $this->setPhpName('CcListenerCount'); - $this->setClassname('CcListenerCount'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_listener_count_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addForeignKey('TIMESTAMP_ID', 'DbTimestampId', 'INTEGER', 'cc_timestamp', 'ID', true, null, null); - $this->addForeignKey('MOUNT_NAME_ID', 'DbMountNameId', 'INTEGER', 'cc_mount_name', 'ID', true, null, null); - $this->addColumn('LISTENER_COUNT', 'DbListenerCount', 'INTEGER', true, null, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_listener_count'); + $this->setPhpName('CcListenerCount'); + $this->setClassname('CcListenerCount'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_listener_count_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addForeignKey('timestamp_id', 'DbTimestampId', 'INTEGER', 'cc_timestamp', 'id', true, null, null); + $this->addForeignKey('mount_name_id', 'DbMountNameId', 'INTEGER', 'cc_mount_name', 'id', true, null, null); + $this->addColumn('listener_count', 'DbListenerCount', 'INTEGER', true, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcTimestamp', 'CcTimestamp', RelationMap::MANY_TO_ONE, array('timestamp_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcMountName', 'CcMountName', RelationMap::MANY_TO_ONE, array('mount_name_id' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcTimestamp', 'CcTimestamp', RelationMap::MANY_TO_ONE, array('timestamp_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcMountName', 'CcMountName', RelationMap::MANY_TO_ONE, array('mount_name_id' => 'id', ), 'CASCADE', null); + } // buildRelations() } // CcListenerCountTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcLiveLogTableMap.php b/airtime_mvc/application/models/airtime/map/CcLiveLogTableMap.php index 4c8c2f0889..d907f347e1 100644 --- a/airtime_mvc/application/models/airtime/map/CcLiveLogTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcLiveLogTableMap.php @@ -14,42 +14,43 @@ * * @package propel.generator.airtime.map */ -class CcLiveLogTableMap extends TableMap { +class CcLiveLogTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcLiveLogTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcLiveLogTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_live_log'); - $this->setPhpName('CcLiveLog'); - $this->setClassname('CcLiveLog'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_live_log_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('STATE', 'DbState', 'VARCHAR', true, 32, null); - $this->addColumn('START_TIME', 'DbStartTime', 'TIMESTAMP', true, null, null); - $this->addColumn('END_TIME', 'DbEndTime', 'TIMESTAMP', false, null, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_live_log'); + $this->setPhpName('CcLiveLog'); + $this->setClassname('CcLiveLog'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_live_log_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('state', 'DbState', 'VARCHAR', true, 32, null); + $this->addColumn('start_time', 'DbStartTime', 'TIMESTAMP', true, null, null); + $this->addColumn('end_time', 'DbEndTime', 'TIMESTAMP', false, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + } // buildRelations() } // CcLiveLogTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcLocaleTableMap.php b/airtime_mvc/application/models/airtime/map/CcLocaleTableMap.php index e6b51fc129..5d58c66756 100644 --- a/airtime_mvc/application/models/airtime/map/CcLocaleTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcLocaleTableMap.php @@ -14,41 +14,42 @@ * * @package propel.generator.airtime.map */ -class CcLocaleTableMap extends TableMap { +class CcLocaleTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcLocaleTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcLocaleTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_locale'); - $this->setPhpName('CcLocale'); - $this->setClassname('CcLocale'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_locale_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('LOCALE_CODE', 'DbLocaleCode', 'VARCHAR', true, 16, null); - $this->addColumn('LOCALE_LANG', 'DbLocaleLang', 'VARCHAR', true, 128, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_locale'); + $this->setPhpName('CcLocale'); + $this->setClassname('CcLocale'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_locale_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('locale_code', 'DbLocaleCode', 'VARCHAR', true, 16, null); + $this->addColumn('locale_lang', 'DbLocaleLang', 'VARCHAR', true, 128, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + } // buildRelations() } // CcLocaleTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcLoginAttemptsTableMap.php b/airtime_mvc/application/models/airtime/map/CcLoginAttemptsTableMap.php index 32ce737430..21b6b8d346 100644 --- a/airtime_mvc/application/models/airtime/map/CcLoginAttemptsTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcLoginAttemptsTableMap.php @@ -14,39 +14,40 @@ * * @package propel.generator.airtime.map */ -class CcLoginAttemptsTableMap extends TableMap { +class CcLoginAttemptsTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcLoginAttemptsTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcLoginAttemptsTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_login_attempts'); - $this->setPhpName('CcLoginAttempts'); - $this->setClassname('CcLoginAttempts'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(false); - // columns - $this->addPrimaryKey('IP', 'DbIP', 'VARCHAR', true, 32, null); - $this->addColumn('ATTEMPTS', 'DbAttempts', 'INTEGER', false, null, 0); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_login_attempts'); + $this->setPhpName('CcLoginAttempts'); + $this->setClassname('CcLoginAttempts'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(false); + // columns + $this->addPrimaryKey('ip', 'DbIP', 'VARCHAR', true, 32, null); + $this->addColumn('attempts', 'DbAttempts', 'INTEGER', false, null, 0); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + } // buildRelations() } // CcLoginAttemptsTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcMountNameTableMap.php b/airtime_mvc/application/models/airtime/map/CcMountNameTableMap.php index f07bc54036..d9bca27f08 100644 --- a/airtime_mvc/application/models/airtime/map/CcMountNameTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcMountNameTableMap.php @@ -14,41 +14,42 @@ * * @package propel.generator.airtime.map */ -class CcMountNameTableMap extends TableMap { +class CcMountNameTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcMountNameTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcMountNameTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_mount_name'); - $this->setPhpName('CcMountName'); - $this->setClassname('CcMountName'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_mount_name_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('MOUNT_NAME', 'DbMountName', 'VARCHAR', true, 255, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_mount_name'); + $this->setPhpName('CcMountName'); + $this->setClassname('CcMountName'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_mount_name_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('mount_name', 'DbMountName', 'VARCHAR', true, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcListenerCount', 'CcListenerCount', RelationMap::ONE_TO_MANY, array('id' => 'mount_name_id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcListenerCount', 'CcListenerCount', RelationMap::ONE_TO_MANY, array('id' => 'mount_name_id', ), 'CASCADE', null, 'CcListenerCounts'); + } // buildRelations() } // CcMountNameTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcMusicDirsTableMap.php b/airtime_mvc/application/models/airtime/map/CcMusicDirsTableMap.php index 5af51394e3..ca02ed7d91 100644 --- a/airtime_mvc/application/models/airtime/map/CcMusicDirsTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcMusicDirsTableMap.php @@ -14,44 +14,45 @@ * * @package propel.generator.airtime.map */ -class CcMusicDirsTableMap extends TableMap { +class CcMusicDirsTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcMusicDirsTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcMusicDirsTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_music_dirs'); - $this->setPhpName('CcMusicDirs'); - $this->setClassname('CcMusicDirs'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_music_dirs_id_seq'); - // columns - $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); - $this->addColumn('DIRECTORY', 'Directory', 'LONGVARCHAR', false, null, null); - $this->addColumn('TYPE', 'Type', 'VARCHAR', false, 255, null); - $this->addColumn('EXISTS', 'Exists', 'BOOLEAN', false, null, true); - $this->addColumn('WATCHED', 'Watched', 'BOOLEAN', false, null, true); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_music_dirs'); + $this->setPhpName('CcMusicDirs'); + $this->setClassname('CcMusicDirs'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_music_dirs_id_seq'); + // columns + $this->addPrimaryKey('id', 'Id', 'INTEGER', true, null, null); + $this->addColumn('directory', 'Directory', 'LONGVARCHAR', false, null, null); + $this->addColumn('type', 'Type', 'VARCHAR', false, 255, null); + $this->addColumn('exists', 'Exists', 'BOOLEAN', false, null, true); + $this->addColumn('watched', 'Watched', 'BOOLEAN', false, null, true); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcFiles', 'CcFiles', RelationMap::ONE_TO_MANY, array('id' => 'directory', ), null, null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcFiles', 'CcFiles', RelationMap::ONE_TO_MANY, array('id' => 'directory', ), null, null, 'CcFiless'); + } // buildRelations() } // CcMusicDirsTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcPermsTableMap.php b/airtime_mvc/application/models/airtime/map/CcPermsTableMap.php index 481d17c96d..ea9833a631 100644 --- a/airtime_mvc/application/models/airtime/map/CcPermsTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcPermsTableMap.php @@ -14,43 +14,44 @@ * * @package propel.generator.airtime.map */ -class CcPermsTableMap extends TableMap { +class CcPermsTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcPermsTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcPermsTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_perms'); - $this->setPhpName('CcPerms'); - $this->setClassname('CcPerms'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(false); - // columns - $this->addPrimaryKey('PERMID', 'Permid', 'INTEGER', true, null, null); - $this->addForeignKey('SUBJ', 'Subj', 'INTEGER', 'cc_subjs', 'ID', false, null, null); - $this->addColumn('ACTION', 'Action', 'VARCHAR', false, 20, null); - $this->addColumn('OBJ', 'Obj', 'INTEGER', false, null, null); - $this->addColumn('TYPE', 'Type', 'CHAR', false, 1, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_perms'); + $this->setPhpName('CcPerms'); + $this->setClassname('CcPerms'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(false); + // columns + $this->addPrimaryKey('permid', 'Permid', 'INTEGER', true, null, null); + $this->addForeignKey('subj', 'Subj', 'INTEGER', 'cc_subjs', 'id', false, null, null); + $this->addColumn('action', 'Action', 'VARCHAR', false, 20, null); + $this->addColumn('obj', 'Obj', 'INTEGER', false, null, null); + $this->addColumn('type', 'Type', 'CHAR', false, 1, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('subj' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('subj' => 'id', ), 'CASCADE', null); + } // buildRelations() } // CcPermsTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcPlaylistTableMap.php b/airtime_mvc/application/models/airtime/map/CcPlaylistTableMap.php index 8dba50bbd4..e14663e130 100644 --- a/airtime_mvc/application/models/airtime/map/CcPlaylistTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcPlaylistTableMap.php @@ -14,60 +14,67 @@ * * @package propel.generator.airtime.map */ -class CcPlaylistTableMap extends TableMap { +class CcPlaylistTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcPlaylistTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcPlaylistTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_playlist'); - $this->setPhpName('CcPlaylist'); - $this->setClassname('CcPlaylist'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_playlist_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('NAME', 'DbName', 'VARCHAR', true, 255, ''); - $this->addColumn('MTIME', 'DbMtime', 'TIMESTAMP', false, 6, null); - $this->addColumn('UTIME', 'DbUtime', 'TIMESTAMP', false, 6, null); - $this->addForeignKey('CREATOR_ID', 'DbCreatorId', 'INTEGER', 'cc_subjs', 'ID', false, null, null); - $this->addColumn('DESCRIPTION', 'DbDescription', 'VARCHAR', false, 512, null); - $this->addColumn('LENGTH', 'DbLength', 'VARCHAR', false, null, '00:00:00'); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_playlist'); + $this->setPhpName('CcPlaylist'); + $this->setClassname('CcPlaylist'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_playlist_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('name', 'DbName', 'VARCHAR', true, 255, ''); + $this->addColumn('mtime', 'DbMtime', 'TIMESTAMP', false, 6, null); + $this->addColumn('utime', 'DbUtime', 'TIMESTAMP', false, 6, null); + $this->addForeignKey('creator_id', 'DbCreatorId', 'INTEGER', 'cc_subjs', 'id', false, null, null); + $this->addColumn('description', 'DbDescription', 'VARCHAR', false, 512, null); + $this->addColumn('length', 'DbLength', 'VARCHAR', false, null, '00:00:00'); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('creator_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcPlaylistcontents', 'CcPlaylistcontents', RelationMap::ONE_TO_MANY, array('id' => 'playlist_id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('creator_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcPlaylistcontents', 'CcPlaylistcontents', RelationMap::ONE_TO_MANY, array('id' => 'playlist_id', ), 'CASCADE', null, 'CcPlaylistcontentss'); + } // buildRelations() - /** - * - * Gets the list of behaviors registered for this table - * - * @return array Associative array (name => parameters) of behaviors - */ - public function getBehaviors() - { - return array( - 'aggregate_column' => array('name' => 'length', 'expression' => 'SUM(cliplength)', 'foreign_table' => 'cc_playlistcontents', ), - ); - } // getBehaviors() + /** + * + * Gets the list of behaviors registered for this table + * + * @return array Associative array (name => parameters) of behaviors + */ + public function getBehaviors() + { + return array( + 'aggregate_column' => array ( + 'name' => 'length', + 'expression' => 'SUM(cliplength)', + 'condition' => NULL, + 'foreign_table' => 'cc_playlistcontents', + 'foreign_schema' => NULL, +), + ); + } // getBehaviors() } // CcPlaylistTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcPlaylistcontentsTableMap.php b/airtime_mvc/application/models/airtime/map/CcPlaylistcontentsTableMap.php index 3122f64d5f..25edcd6e87 100644 --- a/airtime_mvc/application/models/airtime/map/CcPlaylistcontentsTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcPlaylistcontentsTableMap.php @@ -14,67 +14,71 @@ * * @package propel.generator.airtime.map */ -class CcPlaylistcontentsTableMap extends TableMap { +class CcPlaylistcontentsTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcPlaylistcontentsTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcPlaylistcontentsTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_playlistcontents'); - $this->setPhpName('CcPlaylistcontents'); - $this->setClassname('CcPlaylistcontents'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_playlistcontents_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addForeignKey('PLAYLIST_ID', 'DbPlaylistId', 'INTEGER', 'cc_playlist', 'ID', false, null, null); - $this->addForeignKey('FILE_ID', 'DbFileId', 'INTEGER', 'cc_files', 'ID', false, null, null); - $this->addForeignKey('BLOCK_ID', 'DbBlockId', 'INTEGER', 'cc_block', 'ID', false, null, null); - $this->addColumn('STREAM_ID', 'DbStreamId', 'INTEGER', false, null, null); - $this->addColumn('TYPE', 'DbType', 'SMALLINT', true, null, 0); - $this->addColumn('POSITION', 'DbPosition', 'INTEGER', false, null, null); - $this->addColumn('TRACKOFFSET', 'DbTrackOffset', 'REAL', true, null, 0); - $this->addColumn('CLIPLENGTH', 'DbCliplength', 'VARCHAR', false, null, '00:00:00'); - $this->addColumn('CUEIN', 'DbCuein', 'VARCHAR', false, null, '00:00:00'); - $this->addColumn('CUEOUT', 'DbCueout', 'VARCHAR', false, null, '00:00:00'); - $this->addColumn('FADEIN', 'DbFadein', 'TIME', false, null, '00:00:00'); - $this->addColumn('FADEOUT', 'DbFadeout', 'TIME', false, null, '00:00:00'); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_playlistcontents'); + $this->setPhpName('CcPlaylistcontents'); + $this->setClassname('CcPlaylistcontents'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_playlistcontents_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addForeignKey('playlist_id', 'DbPlaylistId', 'INTEGER', 'cc_playlist', 'id', false, null, null); + $this->addForeignKey('file_id', 'DbFileId', 'INTEGER', 'cc_files', 'id', false, null, null); + $this->addForeignKey('block_id', 'DbBlockId', 'INTEGER', 'cc_block', 'id', false, null, null); + $this->addColumn('stream_id', 'DbStreamId', 'INTEGER', false, null, null); + $this->addColumn('type', 'DbType', 'SMALLINT', true, null, 0); + $this->addColumn('position', 'DbPosition', 'INTEGER', false, null, null); + $this->addColumn('trackoffset', 'DbTrackOffset', 'REAL', true, null, 0); + $this->addColumn('cliplength', 'DbCliplength', 'VARCHAR', false, null, '00:00:00'); + $this->addColumn('cuein', 'DbCuein', 'VARCHAR', false, null, '00:00:00'); + $this->addColumn('cueout', 'DbCueout', 'VARCHAR', false, null, '00:00:00'); + $this->addColumn('fadein', 'DbFadein', 'TIME', false, null, '00:00:00'); + $this->addColumn('fadeout', 'DbFadeout', 'TIME', false, null, '00:00:00'); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcBlock', 'CcBlock', RelationMap::MANY_TO_ONE, array('block_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcPlaylist', 'CcPlaylist', RelationMap::MANY_TO_ONE, array('playlist_id' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcBlock', 'CcBlock', RelationMap::MANY_TO_ONE, array('block_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcPlaylist', 'CcPlaylist', RelationMap::MANY_TO_ONE, array('playlist_id' => 'id', ), 'CASCADE', null); + } // buildRelations() - /** - * - * Gets the list of behaviors registered for this table - * - * @return array Associative array (name => parameters) of behaviors - */ - public function getBehaviors() - { - return array( - 'aggregate_column_relation' => array('foreign_table' => 'cc_playlist', 'update_method' => 'updateDbLength', ), - ); - } // getBehaviors() + /** + * + * Gets the list of behaviors registered for this table + * + * @return array Associative array (name => parameters) of behaviors + */ + public function getBehaviors() + { + return array( + 'aggregate_column_relation' => array ( + 'foreign_table' => 'cc_playlist', + 'update_method' => 'updateDbLength', +), + ); + } // getBehaviors() } // CcPlaylistcontentsTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryMetaDataTableMap.php b/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryMetaDataTableMap.php index 8e937f6e52..76a68db354 100644 --- a/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryMetaDataTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryMetaDataTableMap.php @@ -14,43 +14,44 @@ * * @package propel.generator.airtime.map */ -class CcPlayoutHistoryMetaDataTableMap extends TableMap { +class CcPlayoutHistoryMetaDataTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcPlayoutHistoryMetaDataTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcPlayoutHistoryMetaDataTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_playout_history_metadata'); - $this->setPhpName('CcPlayoutHistoryMetaData'); - $this->setClassname('CcPlayoutHistoryMetaData'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_playout_history_metadata_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addForeignKey('HISTORY_ID', 'DbHistoryId', 'INTEGER', 'cc_playout_history', 'ID', true, null, null); - $this->addColumn('KEY', 'DbKey', 'VARCHAR', true, 128, null); - $this->addColumn('VALUE', 'DbValue', 'VARCHAR', true, 128, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_playout_history_metadata'); + $this->setPhpName('CcPlayoutHistoryMetaData'); + $this->setClassname('CcPlayoutHistoryMetaData'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_playout_history_metadata_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addForeignKey('history_id', 'DbHistoryId', 'INTEGER', 'cc_playout_history', 'id', true, null, null); + $this->addColumn('key', 'DbKey', 'VARCHAR', true, 128, null); + $this->addColumn('value', 'DbValue', 'VARCHAR', true, 128, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcPlayoutHistory', 'CcPlayoutHistory', RelationMap::MANY_TO_ONE, array('history_id' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcPlayoutHistory', 'CcPlayoutHistory', RelationMap::MANY_TO_ONE, array('history_id' => 'id', ), 'CASCADE', null); + } // buildRelations() } // CcPlayoutHistoryMetaDataTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTableMap.php b/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTableMap.php index 23696f18da..93b3cd8a09 100644 --- a/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTableMap.php @@ -14,46 +14,47 @@ * * @package propel.generator.airtime.map */ -class CcPlayoutHistoryTableMap extends TableMap { +class CcPlayoutHistoryTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcPlayoutHistoryTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcPlayoutHistoryTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_playout_history'); - $this->setPhpName('CcPlayoutHistory'); - $this->setClassname('CcPlayoutHistory'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_playout_history_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addForeignKey('FILE_ID', 'DbFileId', 'INTEGER', 'cc_files', 'ID', false, null, null); - $this->addColumn('STARTS', 'DbStarts', 'TIMESTAMP', true, null, null); - $this->addColumn('ENDS', 'DbEnds', 'TIMESTAMP', false, null, null); - $this->addForeignKey('INSTANCE_ID', 'DbInstanceId', 'INTEGER', 'cc_show_instances', 'ID', false, null, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_playout_history'); + $this->setPhpName('CcPlayoutHistory'); + $this->setClassname('CcPlayoutHistory'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_playout_history_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addForeignKey('file_id', 'DbFileId', 'INTEGER', 'cc_files', 'id', false, null, null); + $this->addColumn('starts', 'DbStarts', 'TIMESTAMP', true, null, null); + $this->addColumn('ends', 'DbEnds', 'TIMESTAMP', false, null, null); + $this->addForeignKey('instance_id', 'DbInstanceId', 'INTEGER', 'cc_show_instances', 'id', false, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcShowInstances', 'CcShowInstances', RelationMap::MANY_TO_ONE, array('instance_id' => 'id', ), 'SET NULL', null); - $this->addRelation('CcPlayoutHistoryMetaData', 'CcPlayoutHistoryMetaData', RelationMap::ONE_TO_MANY, array('id' => 'history_id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcShowInstances', 'CcShowInstances', RelationMap::MANY_TO_ONE, array('instance_id' => 'id', ), 'SET NULL', null); + $this->addRelation('CcPlayoutHistoryMetaData', 'CcPlayoutHistoryMetaData', RelationMap::ONE_TO_MANY, array('id' => 'history_id', ), 'CASCADE', null, 'CcPlayoutHistoryMetaDatas'); + } // buildRelations() } // CcPlayoutHistoryTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTemplateFieldTableMap.php b/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTemplateFieldTableMap.php index f68db26a1f..495f7f1f2f 100644 --- a/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTemplateFieldTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTemplateFieldTableMap.php @@ -14,46 +14,47 @@ * * @package propel.generator.airtime.map */ -class CcPlayoutHistoryTemplateFieldTableMap extends TableMap { +class CcPlayoutHistoryTemplateFieldTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcPlayoutHistoryTemplateFieldTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcPlayoutHistoryTemplateFieldTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_playout_history_template_field'); - $this->setPhpName('CcPlayoutHistoryTemplateField'); - $this->setClassname('CcPlayoutHistoryTemplateField'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_playout_history_template_field_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addForeignKey('TEMPLATE_ID', 'DbTemplateId', 'INTEGER', 'cc_playout_history_template', 'ID', true, null, null); - $this->addColumn('NAME', 'DbName', 'VARCHAR', true, 128, null); - $this->addColumn('LABEL', 'DbLabel', 'VARCHAR', true, 128, null); - $this->addColumn('TYPE', 'DbType', 'VARCHAR', true, 128, null); - $this->addColumn('IS_FILE_MD', 'DbIsFileMD', 'BOOLEAN', true, null, false); - $this->addColumn('POSITION', 'DbPosition', 'INTEGER', true, null, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_playout_history_template_field'); + $this->setPhpName('CcPlayoutHistoryTemplateField'); + $this->setClassname('CcPlayoutHistoryTemplateField'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_playout_history_template_field_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addForeignKey('template_id', 'DbTemplateId', 'INTEGER', 'cc_playout_history_template', 'id', true, null, null); + $this->addColumn('name', 'DbName', 'VARCHAR', true, 128, null); + $this->addColumn('label', 'DbLabel', 'VARCHAR', true, 128, null); + $this->addColumn('type', 'DbType', 'VARCHAR', true, 128, null); + $this->addColumn('is_file_md', 'DbIsFileMD', 'BOOLEAN', true, null, false); + $this->addColumn('position', 'DbPosition', 'INTEGER', true, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcPlayoutHistoryTemplate', 'CcPlayoutHistoryTemplate', RelationMap::MANY_TO_ONE, array('template_id' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcPlayoutHistoryTemplate', 'CcPlayoutHistoryTemplate', RelationMap::MANY_TO_ONE, array('template_id' => 'id', ), 'CASCADE', null); + } // buildRelations() } // CcPlayoutHistoryTemplateFieldTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTemplateTableMap.php b/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTemplateTableMap.php index e5aea573d7..78be57d283 100644 --- a/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTemplateTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTemplateTableMap.php @@ -14,42 +14,43 @@ * * @package propel.generator.airtime.map */ -class CcPlayoutHistoryTemplateTableMap extends TableMap { +class CcPlayoutHistoryTemplateTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcPlayoutHistoryTemplateTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcPlayoutHistoryTemplateTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_playout_history_template'); - $this->setPhpName('CcPlayoutHistoryTemplate'); - $this->setClassname('CcPlayoutHistoryTemplate'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_playout_history_template_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('NAME', 'DbName', 'VARCHAR', true, 128, null); - $this->addColumn('TYPE', 'DbType', 'VARCHAR', true, 35, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_playout_history_template'); + $this->setPhpName('CcPlayoutHistoryTemplate'); + $this->setClassname('CcPlayoutHistoryTemplate'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_playout_history_template_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('name', 'DbName', 'VARCHAR', true, 128, null); + $this->addColumn('type', 'DbType', 'VARCHAR', true, 35, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcPlayoutHistoryTemplateField', 'CcPlayoutHistoryTemplateField', RelationMap::ONE_TO_MANY, array('id' => 'template_id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcPlayoutHistoryTemplateField', 'CcPlayoutHistoryTemplateField', RelationMap::ONE_TO_MANY, array('id' => 'template_id', ), 'CASCADE', null, 'CcPlayoutHistoryTemplateFields'); + } // buildRelations() } // CcPlayoutHistoryTemplateTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcPrefTableMap.php b/airtime_mvc/application/models/airtime/map/CcPrefTableMap.php index 1d22a122d4..843264a50d 100644 --- a/airtime_mvc/application/models/airtime/map/CcPrefTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcPrefTableMap.php @@ -14,43 +14,44 @@ * * @package propel.generator.airtime.map */ -class CcPrefTableMap extends TableMap { +class CcPrefTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcPrefTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcPrefTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_pref'); - $this->setPhpName('CcPref'); - $this->setClassname('CcPref'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_pref_id_seq'); - // columns - $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); - $this->addForeignKey('SUBJID', 'Subjid', 'INTEGER', 'cc_subjs', 'ID', false, null, null); - $this->addColumn('KEYSTR', 'Keystr', 'VARCHAR', false, 255, null); - $this->addColumn('VALSTR', 'Valstr', 'LONGVARCHAR', false, null, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_pref'); + $this->setPhpName('CcPref'); + $this->setClassname('CcPref'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_pref_id_seq'); + // columns + $this->addPrimaryKey('id', 'Id', 'INTEGER', true, null, null); + $this->addForeignKey('subjid', 'Subjid', 'INTEGER', 'cc_subjs', 'id', false, null, null); + $this->addColumn('keystr', 'Keystr', 'VARCHAR', false, 255, null); + $this->addColumn('valstr', 'Valstr', 'LONGVARCHAR', false, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('subjid' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('subjid' => 'id', ), 'CASCADE', null); + } // buildRelations() } // CcPrefTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcScheduleTableMap.php b/airtime_mvc/application/models/airtime/map/CcScheduleTableMap.php index 54d25cdb87..6c0cec7c04 100644 --- a/airtime_mvc/application/models/airtime/map/CcScheduleTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcScheduleTableMap.php @@ -14,57 +14,58 @@ * * @package propel.generator.airtime.map */ -class CcScheduleTableMap extends TableMap { +class CcScheduleTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcScheduleTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcScheduleTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_schedule'); - $this->setPhpName('CcSchedule'); - $this->setClassname('CcSchedule'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_schedule_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('STARTS', 'DbStarts', 'TIMESTAMP', true, null, null); - $this->addColumn('ENDS', 'DbEnds', 'TIMESTAMP', true, null, null); - $this->addForeignKey('FILE_ID', 'DbFileId', 'INTEGER', 'cc_files', 'ID', false, null, null); - $this->addForeignKey('STREAM_ID', 'DbStreamId', 'INTEGER', 'cc_webstream', 'ID', false, null, null); - $this->addColumn('CLIP_LENGTH', 'DbClipLength', 'VARCHAR', false, null, '00:00:00'); - $this->addColumn('FADE_IN', 'DbFadeIn', 'TIME', false, null, '00:00:00'); - $this->addColumn('FADE_OUT', 'DbFadeOut', 'TIME', false, null, '00:00:00'); - $this->addColumn('CUE_IN', 'DbCueIn', 'VARCHAR', true, null, null); - $this->addColumn('CUE_OUT', 'DbCueOut', 'VARCHAR', true, null, null); - $this->addColumn('MEDIA_ITEM_PLAYED', 'DbMediaItemPlayed', 'BOOLEAN', false, null, false); - $this->addForeignKey('INSTANCE_ID', 'DbInstanceId', 'INTEGER', 'cc_show_instances', 'ID', true, null, null); - $this->addColumn('PLAYOUT_STATUS', 'DbPlayoutStatus', 'SMALLINT', true, null, 1); - $this->addColumn('BROADCASTED', 'DbBroadcasted', 'SMALLINT', true, null, 0); - $this->addColumn('POSITION', 'DbPosition', 'INTEGER', true, null, 0); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_schedule'); + $this->setPhpName('CcSchedule'); + $this->setClassname('CcSchedule'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_schedule_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('starts', 'DbStarts', 'TIMESTAMP', true, null, null); + $this->addColumn('ends', 'DbEnds', 'TIMESTAMP', true, null, null); + $this->addForeignKey('file_id', 'DbFileId', 'INTEGER', 'cc_files', 'id', false, null, null); + $this->addForeignKey('stream_id', 'DbStreamId', 'INTEGER', 'cc_webstream', 'id', false, null, null); + $this->addColumn('clip_length', 'DbClipLength', 'VARCHAR', false, null, '00:00:00'); + $this->addColumn('fade_in', 'DbFadeIn', 'TIME', false, null, '00:00:00'); + $this->addColumn('fade_out', 'DbFadeOut', 'TIME', false, null, '00:00:00'); + $this->addColumn('cue_in', 'DbCueIn', 'VARCHAR', true, null, null); + $this->addColumn('cue_out', 'DbCueOut', 'VARCHAR', true, null, null); + $this->addColumn('media_item_played', 'DbMediaItemPlayed', 'BOOLEAN', false, null, false); + $this->addForeignKey('instance_id', 'DbInstanceId', 'INTEGER', 'cc_show_instances', 'id', true, null, null); + $this->addColumn('playout_status', 'DbPlayoutStatus', 'SMALLINT', true, null, 1); + $this->addColumn('broadcasted', 'DbBroadcasted', 'SMALLINT', true, null, 0); + $this->addColumn('position', 'DbPosition', 'INTEGER', true, null, 0); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcShowInstances', 'CcShowInstances', RelationMap::MANY_TO_ONE, array('instance_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcWebstream', 'CcWebstream', RelationMap::MANY_TO_ONE, array('stream_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcWebstreamMetadata', 'CcWebstreamMetadata', RelationMap::ONE_TO_MANY, array('id' => 'instance_id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcShowInstances', 'CcShowInstances', RelationMap::MANY_TO_ONE, array('instance_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcWebstream', 'CcWebstream', RelationMap::MANY_TO_ONE, array('stream_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcWebstreamMetadata', 'CcWebstreamMetadata', RelationMap::ONE_TO_MANY, array('id' => 'instance_id', ), 'CASCADE', null, 'CcWebstreamMetadatas'); + } // buildRelations() } // CcScheduleTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcServiceRegisterTableMap.php b/airtime_mvc/application/models/airtime/map/CcServiceRegisterTableMap.php index f4eae5e606..d6e6d7b860 100644 --- a/airtime_mvc/application/models/airtime/map/CcServiceRegisterTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcServiceRegisterTableMap.php @@ -14,39 +14,40 @@ * * @package propel.generator.airtime.map */ -class CcServiceRegisterTableMap extends TableMap { +class CcServiceRegisterTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcServiceRegisterTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcServiceRegisterTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_service_register'); - $this->setPhpName('CcServiceRegister'); - $this->setClassname('CcServiceRegister'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(false); - // columns - $this->addPrimaryKey('NAME', 'DbName', 'VARCHAR', true, 32, null); - $this->addColumn('IP', 'DbIp', 'VARCHAR', true, 18, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_service_register'); + $this->setPhpName('CcServiceRegister'); + $this->setClassname('CcServiceRegister'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(false); + // columns + $this->addPrimaryKey('name', 'DbName', 'VARCHAR', true, 32, null); + $this->addColumn('ip', 'DbIp', 'VARCHAR', true, 18, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + } // buildRelations() } // CcServiceRegisterTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcSessTableMap.php b/airtime_mvc/application/models/airtime/map/CcSessTableMap.php index 66605b4eb7..c1ced09344 100644 --- a/airtime_mvc/application/models/airtime/map/CcSessTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcSessTableMap.php @@ -14,42 +14,43 @@ * * @package propel.generator.airtime.map */ -class CcSessTableMap extends TableMap { +class CcSessTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcSessTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcSessTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_sess'); - $this->setPhpName('CcSess'); - $this->setClassname('CcSess'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(false); - // columns - $this->addPrimaryKey('SESSID', 'Sessid', 'CHAR', true, 32, null); - $this->addForeignKey('USERID', 'Userid', 'INTEGER', 'cc_subjs', 'ID', false, null, null); - $this->addColumn('LOGIN', 'Login', 'VARCHAR', false, 255, null); - $this->addColumn('TS', 'Ts', 'TIMESTAMP', false, null, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_sess'); + $this->setPhpName('CcSess'); + $this->setClassname('CcSess'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(false); + // columns + $this->addPrimaryKey('sessid', 'Sessid', 'CHAR', true, 32, null); + $this->addForeignKey('userid', 'Userid', 'INTEGER', 'cc_subjs', 'id', false, null, null); + $this->addColumn('login', 'Login', 'VARCHAR', false, 255, null); + $this->addColumn('ts', 'Ts', 'TIMESTAMP', false, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('userid' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('userid' => 'id', ), 'CASCADE', null); + } // buildRelations() } // CcSessTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcShowDaysTableMap.php b/airtime_mvc/application/models/airtime/map/CcShowDaysTableMap.php index 7d6b8a10e5..dcfa0391d7 100644 --- a/airtime_mvc/application/models/airtime/map/CcShowDaysTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcShowDaysTableMap.php @@ -14,50 +14,51 @@ * * @package propel.generator.airtime.map */ -class CcShowDaysTableMap extends TableMap { +class CcShowDaysTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcShowDaysTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcShowDaysTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_show_days'); - $this->setPhpName('CcShowDays'); - $this->setClassname('CcShowDays'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_show_days_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('FIRST_SHOW', 'DbFirstShow', 'DATE', true, null, null); - $this->addColumn('LAST_SHOW', 'DbLastShow', 'DATE', false, null, null); - $this->addColumn('START_TIME', 'DbStartTime', 'TIME', true, null, null); - $this->addColumn('TIMEZONE', 'DbTimezone', 'VARCHAR', true, 255, null); - $this->addColumn('DURATION', 'DbDuration', 'VARCHAR', true, 255, null); - $this->addColumn('DAY', 'DbDay', 'TINYINT', false, null, null); - $this->addColumn('REPEAT_TYPE', 'DbRepeatType', 'TINYINT', true, null, null); - $this->addColumn('NEXT_POP_DATE', 'DbNextPopDate', 'DATE', false, null, null); - $this->addForeignKey('SHOW_ID', 'DbShowId', 'INTEGER', 'cc_show', 'ID', true, null, null); - $this->addColumn('RECORD', 'DbRecord', 'TINYINT', false, null, 0); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_show_days'); + $this->setPhpName('CcShowDays'); + $this->setClassname('CcShowDays'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_show_days_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('first_show', 'DbFirstShow', 'DATE', true, null, null); + $this->addColumn('last_show', 'DbLastShow', 'DATE', false, null, null); + $this->addColumn('start_time', 'DbStartTime', 'TIME', true, null, null); + $this->addColumn('timezone', 'DbTimezone', 'VARCHAR', true, null, null); + $this->addColumn('duration', 'DbDuration', 'VARCHAR', true, null, null); + $this->addColumn('day', 'DbDay', 'TINYINT', false, null, null); + $this->addColumn('repeat_type', 'DbRepeatType', 'TINYINT', true, null, null); + $this->addColumn('next_pop_date', 'DbNextPopDate', 'DATE', false, null, null); + $this->addForeignKey('show_id', 'DbShowId', 'INTEGER', 'cc_show', 'id', true, null, null); + $this->addColumn('record', 'DbRecord', 'TINYINT', false, null, 0); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcShow', 'CcShow', RelationMap::MANY_TO_ONE, array('show_id' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcShow', 'CcShow', RelationMap::MANY_TO_ONE, array('show_id' => 'id', ), 'CASCADE', null); + } // buildRelations() } // CcShowDaysTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcShowHostsTableMap.php b/airtime_mvc/application/models/airtime/map/CcShowHostsTableMap.php index c76efdbd37..752c36665e 100644 --- a/airtime_mvc/application/models/airtime/map/CcShowHostsTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcShowHostsTableMap.php @@ -14,43 +14,44 @@ * * @package propel.generator.airtime.map */ -class CcShowHostsTableMap extends TableMap { +class CcShowHostsTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcShowHostsTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcShowHostsTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_show_hosts'); - $this->setPhpName('CcShowHosts'); - $this->setClassname('CcShowHosts'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_show_hosts_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addForeignKey('SHOW_ID', 'DbShow', 'INTEGER', 'cc_show', 'ID', true, null, null); - $this->addForeignKey('SUBJS_ID', 'DbHost', 'INTEGER', 'cc_subjs', 'ID', true, null, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_show_hosts'); + $this->setPhpName('CcShowHosts'); + $this->setClassname('CcShowHosts'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_show_hosts_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addForeignKey('show_id', 'DbShow', 'INTEGER', 'cc_show', 'id', true, null, null); + $this->addForeignKey('subjs_id', 'DbHost', 'INTEGER', 'cc_subjs', 'id', true, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcShow', 'CcShow', RelationMap::MANY_TO_ONE, array('show_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('subjs_id' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcShow', 'CcShow', RelationMap::MANY_TO_ONE, array('show_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('subjs_id' => 'id', ), 'CASCADE', null); + } // buildRelations() } // CcShowHostsTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcShowInstancesTableMap.php b/airtime_mvc/application/models/airtime/map/CcShowInstancesTableMap.php index c55e860802..153c4dbbf2 100644 --- a/airtime_mvc/application/models/airtime/map/CcShowInstancesTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcShowInstancesTableMap.php @@ -14,56 +14,57 @@ * * @package propel.generator.airtime.map */ -class CcShowInstancesTableMap extends TableMap { +class CcShowInstancesTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcShowInstancesTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcShowInstancesTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_show_instances'); - $this->setPhpName('CcShowInstances'); - $this->setClassname('CcShowInstances'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_show_instances_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('STARTS', 'DbStarts', 'TIMESTAMP', true, null, null); - $this->addColumn('ENDS', 'DbEnds', 'TIMESTAMP', true, null, null); - $this->addForeignKey('SHOW_ID', 'DbShowId', 'INTEGER', 'cc_show', 'ID', true, null, null); - $this->addColumn('RECORD', 'DbRecord', 'TINYINT', false, null, 0); - $this->addColumn('REBROADCAST', 'DbRebroadcast', 'TINYINT', false, null, 0); - $this->addForeignKey('INSTANCE_ID', 'DbOriginalShow', 'INTEGER', 'cc_show_instances', 'ID', false, null, null); - $this->addForeignKey('FILE_ID', 'DbRecordedFile', 'INTEGER', 'cc_files', 'ID', false, null, null); - $this->addColumn('TIME_FILLED', 'DbTimeFilled', 'VARCHAR', false, null, '00:00:00'); - $this->addColumn('CREATED', 'DbCreated', 'TIMESTAMP', true, null, null); - $this->addColumn('LAST_SCHEDULED', 'DbLastScheduled', 'TIMESTAMP', false, null, null); - $this->addColumn('MODIFIED_INSTANCE', 'DbModifiedInstance', 'BOOLEAN', true, null, false); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_show_instances'); + $this->setPhpName('CcShowInstances'); + $this->setClassname('CcShowInstances'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_show_instances_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('starts', 'DbStarts', 'TIMESTAMP', true, null, null); + $this->addColumn('ends', 'DbEnds', 'TIMESTAMP', true, null, null); + $this->addForeignKey('show_id', 'DbShowId', 'INTEGER', 'cc_show', 'id', true, null, null); + $this->addColumn('record', 'DbRecord', 'TINYINT', false, null, 0); + $this->addColumn('rebroadcast', 'DbRebroadcast', 'TINYINT', false, null, 0); + $this->addForeignKey('instance_id', 'DbOriginalShow', 'INTEGER', 'cc_show_instances', 'id', false, null, null); + $this->addForeignKey('file_id', 'DbRecordedFile', 'INTEGER', 'cc_files', 'id', false, null, null); + $this->addColumn('time_filled', 'DbTimeFilled', 'VARCHAR', false, null, '00:00:00'); + $this->addColumn('created', 'DbCreated', 'TIMESTAMP', true, null, null); + $this->addColumn('last_scheduled', 'DbLastScheduled', 'TIMESTAMP', false, null, null); + $this->addColumn('modified_instance', 'DbModifiedInstance', 'BOOLEAN', true, null, false); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcShow', 'CcShow', RelationMap::MANY_TO_ONE, array('show_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcShowInstancesRelatedByDbOriginalShow', 'CcShowInstances', RelationMap::MANY_TO_ONE, array('instance_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null); - $this->addRelation('CcShowInstancesRelatedByDbId', 'CcShowInstances', RelationMap::ONE_TO_MANY, array('id' => 'instance_id', ), 'CASCADE', null); - $this->addRelation('CcSchedule', 'CcSchedule', RelationMap::ONE_TO_MANY, array('id' => 'instance_id', ), 'CASCADE', null); - $this->addRelation('CcPlayoutHistory', 'CcPlayoutHistory', RelationMap::ONE_TO_MANY, array('id' => 'instance_id', ), 'SET NULL', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcShow', 'CcShow', RelationMap::MANY_TO_ONE, array('show_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcShowInstancesRelatedByDbOriginalShow', 'CcShowInstances', RelationMap::MANY_TO_ONE, array('instance_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null); + $this->addRelation('CcShowInstancesRelatedByDbId', 'CcShowInstances', RelationMap::ONE_TO_MANY, array('id' => 'instance_id', ), 'CASCADE', null, 'CcShowInstancessRelatedByDbId'); + $this->addRelation('CcSchedule', 'CcSchedule', RelationMap::ONE_TO_MANY, array('id' => 'instance_id', ), 'CASCADE', null, 'CcSchedules'); + $this->addRelation('CcPlayoutHistory', 'CcPlayoutHistory', RelationMap::ONE_TO_MANY, array('id' => 'instance_id', ), 'SET NULL', null, 'CcPlayoutHistorys'); + } // buildRelations() } // CcShowInstancesTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcShowRebroadcastTableMap.php b/airtime_mvc/application/models/airtime/map/CcShowRebroadcastTableMap.php index 60a9ba9808..55b557b4fe 100644 --- a/airtime_mvc/application/models/airtime/map/CcShowRebroadcastTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcShowRebroadcastTableMap.php @@ -14,43 +14,44 @@ * * @package propel.generator.airtime.map */ -class CcShowRebroadcastTableMap extends TableMap { +class CcShowRebroadcastTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcShowRebroadcastTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcShowRebroadcastTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_show_rebroadcast'); - $this->setPhpName('CcShowRebroadcast'); - $this->setClassname('CcShowRebroadcast'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_show_rebroadcast_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('DAY_OFFSET', 'DbDayOffset', 'VARCHAR', true, 255, null); - $this->addColumn('START_TIME', 'DbStartTime', 'TIME', true, null, null); - $this->addForeignKey('SHOW_ID', 'DbShowId', 'INTEGER', 'cc_show', 'ID', true, null, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_show_rebroadcast'); + $this->setPhpName('CcShowRebroadcast'); + $this->setClassname('CcShowRebroadcast'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_show_rebroadcast_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('day_offset', 'DbDayOffset', 'VARCHAR', true, null, null); + $this->addColumn('start_time', 'DbStartTime', 'TIME', true, null, null); + $this->addForeignKey('show_id', 'DbShowId', 'INTEGER', 'cc_show', 'id', true, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcShow', 'CcShow', RelationMap::MANY_TO_ONE, array('show_id' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcShow', 'CcShow', RelationMap::MANY_TO_ONE, array('show_id' => 'id', ), 'CASCADE', null); + } // buildRelations() } // CcShowRebroadcastTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcShowTableMap.php b/airtime_mvc/application/models/airtime/map/CcShowTableMap.php index 8a26866704..96087d4ba7 100644 --- a/airtime_mvc/application/models/airtime/map/CcShowTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcShowTableMap.php @@ -14,55 +14,56 @@ * * @package propel.generator.airtime.map */ -class CcShowTableMap extends TableMap { +class CcShowTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcShowTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcShowTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_show'); - $this->setPhpName('CcShow'); - $this->setClassname('CcShow'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_show_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('NAME', 'DbName', 'VARCHAR', true, 255, ''); - $this->addColumn('URL', 'DbUrl', 'VARCHAR', false, 255, ''); - $this->addColumn('GENRE', 'DbGenre', 'VARCHAR', false, 255, ''); - $this->addColumn('DESCRIPTION', 'DbDescription', 'VARCHAR', false, 512, null); - $this->addColumn('COLOR', 'DbColor', 'VARCHAR', false, 6, null); - $this->addColumn('BACKGROUND_COLOR', 'DbBackgroundColor', 'VARCHAR', false, 6, null); - $this->addColumn('LIVE_STREAM_USING_AIRTIME_AUTH', 'DbLiveStreamUsingAirtimeAuth', 'BOOLEAN', false, null, false); - $this->addColumn('LIVE_STREAM_USING_CUSTOM_AUTH', 'DbLiveStreamUsingCustomAuth', 'BOOLEAN', false, null, false); - $this->addColumn('LIVE_STREAM_USER', 'DbLiveStreamUser', 'VARCHAR', false, 255, null); - $this->addColumn('LIVE_STREAM_PASS', 'DbLiveStreamPass', 'VARCHAR', false, 255, null); - $this->addColumn('LINKED', 'DbLinked', 'BOOLEAN', true, null, false); - $this->addColumn('IS_LINKABLE', 'DbIsLinkable', 'BOOLEAN', true, null, true); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_show'); + $this->setPhpName('CcShow'); + $this->setClassname('CcShow'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_show_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('name', 'DbName', 'VARCHAR', true, 255, ''); + $this->addColumn('url', 'DbUrl', 'VARCHAR', false, 255, ''); + $this->addColumn('genre', 'DbGenre', 'VARCHAR', false, 255, ''); + $this->addColumn('description', 'DbDescription', 'VARCHAR', false, 512, null); + $this->addColumn('color', 'DbColor', 'VARCHAR', false, 6, null); + $this->addColumn('background_color', 'DbBackgroundColor', 'VARCHAR', false, 6, null); + $this->addColumn('live_stream_using_airtime_auth', 'DbLiveStreamUsingAirtimeAuth', 'BOOLEAN', false, null, false); + $this->addColumn('live_stream_using_custom_auth', 'DbLiveStreamUsingCustomAuth', 'BOOLEAN', false, null, false); + $this->addColumn('live_stream_user', 'DbLiveStreamUser', 'VARCHAR', false, 255, null); + $this->addColumn('live_stream_pass', 'DbLiveStreamPass', 'VARCHAR', false, 255, null); + $this->addColumn('linked', 'DbLinked', 'BOOLEAN', true, null, false); + $this->addColumn('is_linkable', 'DbIsLinkable', 'BOOLEAN', true, null, true); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcShowInstances', 'CcShowInstances', RelationMap::ONE_TO_MANY, array('id' => 'show_id', ), 'CASCADE', null); - $this->addRelation('CcShowDays', 'CcShowDays', RelationMap::ONE_TO_MANY, array('id' => 'show_id', ), 'CASCADE', null); - $this->addRelation('CcShowRebroadcast', 'CcShowRebroadcast', RelationMap::ONE_TO_MANY, array('id' => 'show_id', ), 'CASCADE', null); - $this->addRelation('CcShowHosts', 'CcShowHosts', RelationMap::ONE_TO_MANY, array('id' => 'show_id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcShowInstances', 'CcShowInstances', RelationMap::ONE_TO_MANY, array('id' => 'show_id', ), 'CASCADE', null, 'CcShowInstancess'); + $this->addRelation('CcShowDays', 'CcShowDays', RelationMap::ONE_TO_MANY, array('id' => 'show_id', ), 'CASCADE', null, 'CcShowDayss'); + $this->addRelation('CcShowRebroadcast', 'CcShowRebroadcast', RelationMap::ONE_TO_MANY, array('id' => 'show_id', ), 'CASCADE', null, 'CcShowRebroadcasts'); + $this->addRelation('CcShowHosts', 'CcShowHosts', RelationMap::ONE_TO_MANY, array('id' => 'show_id', ), 'CASCADE', null, 'CcShowHostss'); + } // buildRelations() } // CcShowTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcSmembTableMap.php b/airtime_mvc/application/models/airtime/map/CcSmembTableMap.php index 236cdd0166..4067e5e47e 100644 --- a/airtime_mvc/application/models/airtime/map/CcSmembTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcSmembTableMap.php @@ -14,42 +14,43 @@ * * @package propel.generator.airtime.map */ -class CcSmembTableMap extends TableMap { +class CcSmembTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcSmembTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcSmembTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_smemb'); - $this->setPhpName('CcSmemb'); - $this->setClassname('CcSmemb'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(false); - // columns - $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); - $this->addColumn('UID', 'Uid', 'INTEGER', true, null, 0); - $this->addColumn('GID', 'Gid', 'INTEGER', true, null, 0); - $this->addColumn('LEVEL', 'Level', 'INTEGER', true, null, 0); - $this->addColumn('MID', 'Mid', 'INTEGER', false, null, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_smemb'); + $this->setPhpName('CcSmemb'); + $this->setClassname('CcSmemb'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(false); + // columns + $this->addPrimaryKey('id', 'Id', 'INTEGER', true, null, null); + $this->addColumn('uid', 'Uid', 'INTEGER', true, null, 0); + $this->addColumn('gid', 'Gid', 'INTEGER', true, null, 0); + $this->addColumn('level', 'Level', 'INTEGER', true, null, 0); + $this->addColumn('mid', 'Mid', 'INTEGER', false, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + } // buildRelations() } // CcSmembTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcStreamSettingTableMap.php b/airtime_mvc/application/models/airtime/map/CcStreamSettingTableMap.php index d401ce096b..a0638089e2 100644 --- a/airtime_mvc/application/models/airtime/map/CcStreamSettingTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcStreamSettingTableMap.php @@ -14,40 +14,41 @@ * * @package propel.generator.airtime.map */ -class CcStreamSettingTableMap extends TableMap { +class CcStreamSettingTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcStreamSettingTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcStreamSettingTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_stream_setting'); - $this->setPhpName('CcStreamSetting'); - $this->setClassname('CcStreamSetting'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(false); - // columns - $this->addPrimaryKey('KEYNAME', 'DbKeyName', 'VARCHAR', true, 64, null); - $this->addColumn('VALUE', 'DbValue', 'VARCHAR', false, 255, null); - $this->addColumn('TYPE', 'DbType', 'VARCHAR', true, 16, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_stream_setting'); + $this->setPhpName('CcStreamSetting'); + $this->setClassname('CcStreamSetting'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(false); + // columns + $this->addPrimaryKey('keyname', 'DbKeyName', 'VARCHAR', true, 64, null); + $this->addColumn('value', 'DbValue', 'VARCHAR', false, 255, null); + $this->addColumn('type', 'DbType', 'VARCHAR', true, 16, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + } // buildRelations() } // CcStreamSettingTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcSubjsTableMap.php b/airtime_mvc/application/models/airtime/map/CcSubjsTableMap.php index d4f83529a2..8ffb5bf4fe 100644 --- a/airtime_mvc/application/models/airtime/map/CcSubjsTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcSubjsTableMap.php @@ -14,60 +14,61 @@ * * @package propel.generator.airtime.map */ -class CcSubjsTableMap extends TableMap { +class CcSubjsTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcSubjsTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcSubjsTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_subjs'); - $this->setPhpName('CcSubjs'); - $this->setClassname('CcSubjs'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_subjs_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('LOGIN', 'DbLogin', 'VARCHAR', true, 255, ''); - $this->addColumn('PASS', 'DbPass', 'VARCHAR', true, 255, ''); - $this->addColumn('TYPE', 'DbType', 'CHAR', true, 1, 'U'); - $this->addColumn('FIRST_NAME', 'DbFirstName', 'VARCHAR', true, 255, ''); - $this->addColumn('LAST_NAME', 'DbLastName', 'VARCHAR', true, 255, ''); - $this->addColumn('LASTLOGIN', 'DbLastlogin', 'TIMESTAMP', false, null, null); - $this->addColumn('LASTFAIL', 'DbLastfail', 'TIMESTAMP', false, null, null); - $this->addColumn('SKYPE_CONTACT', 'DbSkypeContact', 'VARCHAR', false, 255, null); - $this->addColumn('JABBER_CONTACT', 'DbJabberContact', 'VARCHAR', false, 255, null); - $this->addColumn('EMAIL', 'DbEmail', 'VARCHAR', false, 255, null); - $this->addColumn('CELL_PHONE', 'DbCellPhone', 'VARCHAR', false, 255, null); - $this->addColumn('LOGIN_ATTEMPTS', 'DbLoginAttempts', 'INTEGER', false, null, 0); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_subjs'); + $this->setPhpName('CcSubjs'); + $this->setClassname('CcSubjs'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_subjs_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('login', 'DbLogin', 'VARCHAR', true, 255, ''); + $this->addColumn('pass', 'DbPass', 'VARCHAR', true, 255, ''); + $this->addColumn('type', 'DbType', 'CHAR', true, 1, 'U'); + $this->addColumn('first_name', 'DbFirstName', 'VARCHAR', true, 255, ''); + $this->addColumn('last_name', 'DbLastName', 'VARCHAR', true, 255, ''); + $this->addColumn('lastlogin', 'DbLastlogin', 'TIMESTAMP', false, null, null); + $this->addColumn('lastfail', 'DbLastfail', 'TIMESTAMP', false, null, null); + $this->addColumn('skype_contact', 'DbSkypeContact', 'VARCHAR', false, null, null); + $this->addColumn('jabber_contact', 'DbJabberContact', 'VARCHAR', false, null, null); + $this->addColumn('email', 'DbEmail', 'VARCHAR', false, null, null); + $this->addColumn('cell_phone', 'DbCellPhone', 'VARCHAR', false, null, null); + $this->addColumn('login_attempts', 'DbLoginAttempts', 'INTEGER', false, null, 0); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcFilesRelatedByDbOwnerId', 'CcFiles', RelationMap::ONE_TO_MANY, array('id' => 'owner_id', ), null, null); - $this->addRelation('CcFilesRelatedByDbEditedby', 'CcFiles', RelationMap::ONE_TO_MANY, array('id' => 'editedby', ), null, null); - $this->addRelation('CcPerms', 'CcPerms', RelationMap::ONE_TO_MANY, array('id' => 'subj', ), 'CASCADE', null); - $this->addRelation('CcShowHosts', 'CcShowHosts', RelationMap::ONE_TO_MANY, array('id' => 'subjs_id', ), 'CASCADE', null); - $this->addRelation('CcPlaylist', 'CcPlaylist', RelationMap::ONE_TO_MANY, array('id' => 'creator_id', ), 'CASCADE', null); - $this->addRelation('CcBlock', 'CcBlock', RelationMap::ONE_TO_MANY, array('id' => 'creator_id', ), 'CASCADE', null); - $this->addRelation('CcPref', 'CcPref', RelationMap::ONE_TO_MANY, array('id' => 'subjid', ), 'CASCADE', null); - $this->addRelation('CcSess', 'CcSess', RelationMap::ONE_TO_MANY, array('id' => 'userid', ), 'CASCADE', null); - $this->addRelation('CcSubjsToken', 'CcSubjsToken', RelationMap::ONE_TO_MANY, array('id' => 'user_id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcFilesRelatedByDbOwnerId', 'CcFiles', RelationMap::ONE_TO_MANY, array('id' => 'owner_id', ), null, null, 'CcFilessRelatedByDbOwnerId'); + $this->addRelation('CcFilesRelatedByDbEditedby', 'CcFiles', RelationMap::ONE_TO_MANY, array('id' => 'editedby', ), null, null, 'CcFilessRelatedByDbEditedby'); + $this->addRelation('CcPerms', 'CcPerms', RelationMap::ONE_TO_MANY, array('id' => 'subj', ), 'CASCADE', null, 'CcPermss'); + $this->addRelation('CcShowHosts', 'CcShowHosts', RelationMap::ONE_TO_MANY, array('id' => 'subjs_id', ), 'CASCADE', null, 'CcShowHostss'); + $this->addRelation('CcPlaylist', 'CcPlaylist', RelationMap::ONE_TO_MANY, array('id' => 'creator_id', ), 'CASCADE', null, 'CcPlaylists'); + $this->addRelation('CcBlock', 'CcBlock', RelationMap::ONE_TO_MANY, array('id' => 'creator_id', ), 'CASCADE', null, 'CcBlocks'); + $this->addRelation('CcPref', 'CcPref', RelationMap::ONE_TO_MANY, array('id' => 'subjid', ), 'CASCADE', null, 'CcPrefs'); + $this->addRelation('CcSess', 'CcSess', RelationMap::ONE_TO_MANY, array('id' => 'userid', ), 'CASCADE', null, 'CcSesss'); + $this->addRelation('CcSubjsToken', 'CcSubjsToken', RelationMap::ONE_TO_MANY, array('id' => 'user_id', ), 'CASCADE', null, 'CcSubjsTokens'); + } // buildRelations() } // CcSubjsTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcSubjsTokenTableMap.php b/airtime_mvc/application/models/airtime/map/CcSubjsTokenTableMap.php index 2aeb7ad64f..b33c8d0914 100644 --- a/airtime_mvc/application/models/airtime/map/CcSubjsTokenTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcSubjsTokenTableMap.php @@ -14,44 +14,45 @@ * * @package propel.generator.airtime.map */ -class CcSubjsTokenTableMap extends TableMap { +class CcSubjsTokenTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcSubjsTokenTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcSubjsTokenTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_subjs_token'); - $this->setPhpName('CcSubjsToken'); - $this->setClassname('CcSubjsToken'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_subjs_token_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addForeignKey('USER_ID', 'DbUserId', 'INTEGER', 'cc_subjs', 'ID', true, null, null); - $this->addColumn('ACTION', 'DbAction', 'VARCHAR', true, 255, null); - $this->addColumn('TOKEN', 'DbToken', 'VARCHAR', true, 40, null); - $this->addColumn('CREATED', 'DbCreated', 'TIMESTAMP', true, null, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_subjs_token'); + $this->setPhpName('CcSubjsToken'); + $this->setClassname('CcSubjsToken'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_subjs_token_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addForeignKey('user_id', 'DbUserId', 'INTEGER', 'cc_subjs', 'id', true, null, null); + $this->addColumn('action', 'DbAction', 'VARCHAR', true, 255, null); + $this->addColumn('token', 'DbToken', 'VARCHAR', true, 40, null); + $this->addColumn('created', 'DbCreated', 'TIMESTAMP', true, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('user_id' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('user_id' => 'id', ), 'CASCADE', null); + } // buildRelations() } // CcSubjsTokenTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcTimestampTableMap.php b/airtime_mvc/application/models/airtime/map/CcTimestampTableMap.php index 6df327d362..fcc8544a76 100644 --- a/airtime_mvc/application/models/airtime/map/CcTimestampTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcTimestampTableMap.php @@ -14,41 +14,42 @@ * * @package propel.generator.airtime.map */ -class CcTimestampTableMap extends TableMap { +class CcTimestampTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcTimestampTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcTimestampTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_timestamp'); - $this->setPhpName('CcTimestamp'); - $this->setClassname('CcTimestamp'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_timestamp_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('TIMESTAMP', 'DbTimestamp', 'TIMESTAMP', true, null, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_timestamp'); + $this->setPhpName('CcTimestamp'); + $this->setClassname('CcTimestamp'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_timestamp_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('timestamp', 'DbTimestamp', 'TIMESTAMP', true, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcListenerCount', 'CcListenerCount', RelationMap::ONE_TO_MANY, array('id' => 'timestamp_id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcListenerCount', 'CcListenerCount', RelationMap::ONE_TO_MANY, array('id' => 'timestamp_id', ), 'CASCADE', null, 'CcListenerCounts'); + } // buildRelations() } // CcTimestampTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcWebstreamMetadataTableMap.php b/airtime_mvc/application/models/airtime/map/CcWebstreamMetadataTableMap.php index 305d8189ab..38e4b71a26 100644 --- a/airtime_mvc/application/models/airtime/map/CcWebstreamMetadataTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcWebstreamMetadataTableMap.php @@ -14,43 +14,44 @@ * * @package propel.generator.airtime.map */ -class CcWebstreamMetadataTableMap extends TableMap { +class CcWebstreamMetadataTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcWebstreamMetadataTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcWebstreamMetadataTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_webstream_metadata'); - $this->setPhpName('CcWebstreamMetadata'); - $this->setClassname('CcWebstreamMetadata'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_webstream_metadata_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addForeignKey('INSTANCE_ID', 'DbInstanceId', 'INTEGER', 'cc_schedule', 'ID', true, null, null); - $this->addColumn('START_TIME', 'DbStartTime', 'TIMESTAMP', true, null, null); - $this->addColumn('LIQUIDSOAP_DATA', 'DbLiquidsoapData', 'VARCHAR', true, 1024, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_webstream_metadata'); + $this->setPhpName('CcWebstreamMetadata'); + $this->setClassname('CcWebstreamMetadata'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_webstream_metadata_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addForeignKey('instance_id', 'DbInstanceId', 'INTEGER', 'cc_schedule', 'id', true, null, null); + $this->addColumn('start_time', 'DbStartTime', 'TIMESTAMP', true, null, null); + $this->addColumn('liquidsoap_data', 'DbLiquidsoapData', 'VARCHAR', true, 1024, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcSchedule', 'CcSchedule', RelationMap::MANY_TO_ONE, array('instance_id' => 'id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcSchedule', 'CcSchedule', RelationMap::MANY_TO_ONE, array('instance_id' => 'id', ), 'CASCADE', null); + } // buildRelations() } // CcWebstreamMetadataTableMap diff --git a/airtime_mvc/application/models/airtime/map/CcWebstreamTableMap.php b/airtime_mvc/application/models/airtime/map/CcWebstreamTableMap.php index c4b28a5164..e76fbbd8ac 100644 --- a/airtime_mvc/application/models/airtime/map/CcWebstreamTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcWebstreamTableMap.php @@ -14,49 +14,50 @@ * * @package propel.generator.airtime.map */ -class CcWebstreamTableMap extends TableMap { +class CcWebstreamTableMap extends TableMap +{ - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = 'airtime.map.CcWebstreamTableMap'; + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'airtime.map.CcWebstreamTableMap'; - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - $this->setName('cc_webstream'); - $this->setPhpName('CcWebstream'); - $this->setClassname('CcWebstream'); - $this->setPackage('airtime'); - $this->setUseIdGenerator(true); - $this->setPrimaryKeyMethodInfo('cc_webstream_id_seq'); - // columns - $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); - $this->addColumn('NAME', 'DbName', 'VARCHAR', true, 255, null); - $this->addColumn('DESCRIPTION', 'DbDescription', 'VARCHAR', true, 255, null); - $this->addColumn('URL', 'DbUrl', 'VARCHAR', true, 512, null); - $this->addColumn('LENGTH', 'DbLength', 'VARCHAR', true, null, '00:00:00'); - $this->addColumn('CREATOR_ID', 'DbCreatorId', 'INTEGER', true, null, null); - $this->addColumn('MTIME', 'DbMtime', 'TIMESTAMP', true, 6, null); - $this->addColumn('UTIME', 'DbUtime', 'TIMESTAMP', true, 6, null); - $this->addColumn('LPTIME', 'DbLPtime', 'TIMESTAMP', false, 6, null); - $this->addColumn('MIME', 'DbMime', 'VARCHAR', false, 255, null); - // validators - } // initialize() + /** + * Initialize the table attributes, columns and validators + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('cc_webstream'); + $this->setPhpName('CcWebstream'); + $this->setClassname('CcWebstream'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cc_webstream_id_seq'); + // columns + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('name', 'DbName', 'VARCHAR', true, 255, null); + $this->addColumn('description', 'DbDescription', 'VARCHAR', true, 255, null); + $this->addColumn('url', 'DbUrl', 'VARCHAR', true, 512, null); + $this->addColumn('length', 'DbLength', 'VARCHAR', true, null, '00:00:00'); + $this->addColumn('creator_id', 'DbCreatorId', 'INTEGER', true, null, null); + $this->addColumn('mtime', 'DbMtime', 'TIMESTAMP', true, 6, null); + $this->addColumn('utime', 'DbUtime', 'TIMESTAMP', true, 6, null); + $this->addColumn('lptime', 'DbLPtime', 'TIMESTAMP', false, 6, null); + $this->addColumn('mime', 'DbMime', 'VARCHAR', false, null, null); + // validators + } // initialize() - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - { - $this->addRelation('CcSchedule', 'CcSchedule', RelationMap::ONE_TO_MANY, array('id' => 'stream_id', ), 'CASCADE', null); - } // buildRelations() + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcSchedule', 'CcSchedule', RelationMap::ONE_TO_MANY, array('id' => 'stream_id', ), 'CASCADE', null, 'CcSchedules'); + } // buildRelations() } // CcWebstreamTableMap diff --git a/airtime_mvc/application/models/airtime/om/BaseCcBlock.php b/airtime_mvc/application/models/airtime/om/BaseCcBlock.php index f9c900c819..236d3542d6 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcBlock.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcBlock.php @@ -4,1780 +4,2341 @@ /** * Base class that represents a row from the 'cc_block' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcBlock extends BaseObject implements Persistent +abstract class BaseCcBlock extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcBlockPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcBlockPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the name field. - * Note: this column has a database default value of: '' - * @var string - */ - protected $name; - - /** - * The value for the mtime field. - * @var string - */ - protected $mtime; - - /** - * The value for the utime field. - * @var string - */ - protected $utime; - - /** - * The value for the creator_id field. - * @var int - */ - protected $creator_id; - - /** - * The value for the description field. - * @var string - */ - protected $description; - - /** - * The value for the length field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $length; - - /** - * The value for the type field. - * Note: this column has a database default value of: 'static' - * @var string - */ - protected $type; - - /** - * @var CcSubjs - */ - protected $aCcSubjs; - - /** - * @var array CcPlaylistcontents[] Collection to store aggregation of CcPlaylistcontents objects. - */ - protected $collCcPlaylistcontentss; - - /** - * @var array CcBlockcontents[] Collection to store aggregation of CcBlockcontents objects. - */ - protected $collCcBlockcontentss; - - /** - * @var array CcBlockcriteria[] Collection to store aggregation of CcBlockcriteria objects. - */ - protected $collCcBlockcriterias; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->name = ''; - $this->length = '00:00:00'; - $this->type = 'static'; - } - - /** - * Initializes internal state of BaseCcBlock object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [name] column value. - * - * @return string - */ - public function getDbName() - { - return $this->name; - } - - /** - * Get the [optionally formatted] temporal [mtime] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbMtime($format = 'Y-m-d H:i:s') - { - if ($this->mtime === null) { - return null; - } - - - - try { - $dt = new DateTime($this->mtime); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->mtime, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [utime] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbUtime($format = 'Y-m-d H:i:s') - { - if ($this->utime === null) { - return null; - } - - - - try { - $dt = new DateTime($this->utime); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->utime, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [creator_id] column value. - * - * @return int - */ - public function getDbCreatorId() - { - return $this->creator_id; - } - - /** - * Get the [description] column value. - * - * @return string - */ - public function getDbDescription() - { - return $this->description; - } - - /** - * Get the [length] column value. - * - * @return string - */ - public function getDbLength() - { - return $this->length; - } - - /** - * Get the [type] column value. - * - * @return string - */ - public function getDbType() - { - return $this->type; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcBlock The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcBlockPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [name] column. - * - * @param string $v new value - * @return CcBlock The current object (for fluent API support) - */ - public function setDbName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->name !== $v || $this->isNew()) { - $this->name = $v; - $this->modifiedColumns[] = CcBlockPeer::NAME; - } - - return $this; - } // setDbName() - - /** - * Sets the value of [mtime] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcBlock The current object (for fluent API support) - */ - public function setDbMtime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->mtime !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->mtime !== null && $tmpDt = new DateTime($this->mtime)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->mtime = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcBlockPeer::MTIME; - } - } // if either are not null - - return $this; - } // setDbMtime() - - /** - * Sets the value of [utime] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcBlock The current object (for fluent API support) - */ - public function setDbUtime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->utime !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->utime !== null && $tmpDt = new DateTime($this->utime)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->utime = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcBlockPeer::UTIME; - } - } // if either are not null - - return $this; - } // setDbUtime() - - /** - * Set the value of [creator_id] column. - * - * @param int $v new value - * @return CcBlock The current object (for fluent API support) - */ - public function setDbCreatorId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->creator_id !== $v) { - $this->creator_id = $v; - $this->modifiedColumns[] = CcBlockPeer::CREATOR_ID; - } - - if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { - $this->aCcSubjs = null; - } - - return $this; - } // setDbCreatorId() - - /** - * Set the value of [description] column. - * - * @param string $v new value - * @return CcBlock The current object (for fluent API support) - */ - public function setDbDescription($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->description !== $v) { - $this->description = $v; - $this->modifiedColumns[] = CcBlockPeer::DESCRIPTION; - } - - return $this; - } // setDbDescription() - - /** - * Set the value of [length] column. - * - * @param string $v new value - * @return CcBlock The current object (for fluent API support) - */ - public function setDbLength($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->length !== $v || $this->isNew()) { - $this->length = $v; - $this->modifiedColumns[] = CcBlockPeer::LENGTH; - } - - return $this; - } // setDbLength() - - /** - * Set the value of [type] column. - * - * @param string $v new value - * @return CcBlock The current object (for fluent API support) - */ - public function setDbType($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->type !== $v || $this->isNew()) { - $this->type = $v; - $this->modifiedColumns[] = CcBlockPeer::TYPE; - } - - return $this; - } // setDbType() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->name !== '') { - return false; - } - - if ($this->length !== '00:00:00') { - return false; - } - - if ($this->type !== 'static') { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->mtime = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->utime = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->creator_id = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; - $this->description = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; - $this->length = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; - $this->type = ($row[$startcol + 7] !== null) ? (string) $row[$startcol + 7] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 8; // 8 = CcBlockPeer::NUM_COLUMNS - CcBlockPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcBlock object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcSubjs !== null && $this->creator_id !== $this->aCcSubjs->getDbId()) { - $this->aCcSubjs = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcBlockPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcSubjs = null; - $this->collCcPlaylistcontentss = null; - - $this->collCcBlockcontentss = null; - - $this->collCcBlockcriterias = null; - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcBlockQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcBlockPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSubjs !== null) { - if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { - $affectedRows += $this->aCcSubjs->save($con); - } - $this->setCcSubjs($this->aCcSubjs); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcBlockPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcBlockPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcBlockPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcBlockPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - if ($this->collCcPlaylistcontentss !== null) { - foreach ($this->collCcPlaylistcontentss as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcBlockcontentss !== null) { - foreach ($this->collCcBlockcontentss as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcBlockcriterias !== null) { - foreach ($this->collCcBlockcriterias as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSubjs !== null) { - if (!$this->aCcSubjs->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); - } - } - - - if (($retval = CcBlockPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - if ($this->collCcPlaylistcontentss !== null) { - foreach ($this->collCcPlaylistcontentss as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcBlockcontentss !== null) { - foreach ($this->collCcBlockcontentss as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcBlockcriterias !== null) { - foreach ($this->collCcBlockcriterias as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcBlockPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbName(); - break; - case 2: - return $this->getDbMtime(); - break; - case 3: - return $this->getDbUtime(); - break; - case 4: - return $this->getDbCreatorId(); - break; - case 5: - return $this->getDbDescription(); - break; - case 6: - return $this->getDbLength(); - break; - case 7: - return $this->getDbType(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcBlockPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbName(), - $keys[2] => $this->getDbMtime(), - $keys[3] => $this->getDbUtime(), - $keys[4] => $this->getDbCreatorId(), - $keys[5] => $this->getDbDescription(), - $keys[6] => $this->getDbLength(), - $keys[7] => $this->getDbType(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcSubjs) { - $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcBlockPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbName($value); - break; - case 2: - $this->setDbMtime($value); - break; - case 3: - $this->setDbUtime($value); - break; - case 4: - $this->setDbCreatorId($value); - break; - case 5: - $this->setDbDescription($value); - break; - case 6: - $this->setDbLength($value); - break; - case 7: - $this->setDbType($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcBlockPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbMtime($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbUtime($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbCreatorId($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setDbDescription($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setDbLength($arr[$keys[6]]); - if (array_key_exists($keys[7], $arr)) $this->setDbType($arr[$keys[7]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcBlockPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcBlockPeer::ID)) $criteria->add(CcBlockPeer::ID, $this->id); - if ($this->isColumnModified(CcBlockPeer::NAME)) $criteria->add(CcBlockPeer::NAME, $this->name); - if ($this->isColumnModified(CcBlockPeer::MTIME)) $criteria->add(CcBlockPeer::MTIME, $this->mtime); - if ($this->isColumnModified(CcBlockPeer::UTIME)) $criteria->add(CcBlockPeer::UTIME, $this->utime); - if ($this->isColumnModified(CcBlockPeer::CREATOR_ID)) $criteria->add(CcBlockPeer::CREATOR_ID, $this->creator_id); - if ($this->isColumnModified(CcBlockPeer::DESCRIPTION)) $criteria->add(CcBlockPeer::DESCRIPTION, $this->description); - if ($this->isColumnModified(CcBlockPeer::LENGTH)) $criteria->add(CcBlockPeer::LENGTH, $this->length); - if ($this->isColumnModified(CcBlockPeer::TYPE)) $criteria->add(CcBlockPeer::TYPE, $this->type); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcBlockPeer::DATABASE_NAME); - $criteria->add(CcBlockPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcBlock (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbName($this->name); - $copyObj->setDbMtime($this->mtime); - $copyObj->setDbUtime($this->utime); - $copyObj->setDbCreatorId($this->creator_id); - $copyObj->setDbDescription($this->description); - $copyObj->setDbLength($this->length); - $copyObj->setDbType($this->type); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getCcPlaylistcontentss() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcPlaylistcontents($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcBlockcontentss() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcBlockcontents($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcBlockcriterias() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcBlockcriteria($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcBlock Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcBlockPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcBlockPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcSubjs object. - * - * @param CcSubjs $v - * @return CcBlock The current object (for fluent API support) - * @throws PropelException - */ - public function setCcSubjs(CcSubjs $v = null) - { - if ($v === null) { - $this->setDbCreatorId(NULL); - } else { - $this->setDbCreatorId($v->getDbId()); - } - - $this->aCcSubjs = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcSubjs object, it will not be re-added. - if ($v !== null) { - $v->addCcBlock($this); - } - - return $this; - } - - - /** - * Get the associated CcSubjs object - * - * @param PropelPDO Optional Connection object. - * @return CcSubjs The associated CcSubjs object. - * @throws PropelException - */ - public function getCcSubjs(PropelPDO $con = null) - { - if ($this->aCcSubjs === null && ($this->creator_id !== null)) { - $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->creator_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcSubjs->addCcBlocks($this); - */ - } - return $this->aCcSubjs; - } - - /** - * Clears out the collCcPlaylistcontentss collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcPlaylistcontentss() - */ - public function clearCcPlaylistcontentss() - { - $this->collCcPlaylistcontentss = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcPlaylistcontentss collection. - * - * By default this just sets the collCcPlaylistcontentss collection to an empty array (like clearcollCcPlaylistcontentss()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcPlaylistcontentss() - { - $this->collCcPlaylistcontentss = new PropelObjectCollection(); - $this->collCcPlaylistcontentss->setModel('CcPlaylistcontents'); - } - - /** - * Gets an array of CcPlaylistcontents objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcBlock is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcPlaylistcontents[] List of CcPlaylistcontents objects - * @throws PropelException - */ - public function getCcPlaylistcontentss($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcPlaylistcontentss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlaylistcontentss) { - // return empty collection - $this->initCcPlaylistcontentss(); - } else { - $collCcPlaylistcontentss = CcPlaylistcontentsQuery::create(null, $criteria) - ->filterByCcBlock($this) - ->find($con); - if (null !== $criteria) { - return $collCcPlaylistcontentss; - } - $this->collCcPlaylistcontentss = $collCcPlaylistcontentss; - } - } - return $this->collCcPlaylistcontentss; - } - - /** - * Returns the number of related CcPlaylistcontents objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcPlaylistcontents objects. - * @throws PropelException - */ - public function countCcPlaylistcontentss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcPlaylistcontentss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlaylistcontentss) { - return 0; - } else { - $query = CcPlaylistcontentsQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcBlock($this) - ->count($con); - } - } else { - return count($this->collCcPlaylistcontentss); - } - } - - /** - * Method called to associate a CcPlaylistcontents object to this object - * through the CcPlaylistcontents foreign key attribute. - * - * @param CcPlaylistcontents $l CcPlaylistcontents - * @return void - * @throws PropelException - */ - public function addCcPlaylistcontents(CcPlaylistcontents $l) - { - if ($this->collCcPlaylistcontentss === null) { - $this->initCcPlaylistcontentss(); - } - if (!$this->collCcPlaylistcontentss->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcPlaylistcontentss[]= $l; - $l->setCcBlock($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcBlock is new, it will return - * an empty collection; or if this CcBlock has previously - * been saved, it will retrieve related CcPlaylistcontentss from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcBlock. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcPlaylistcontents[] List of CcPlaylistcontents objects - */ - public function getCcPlaylistcontentssJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcPlaylistcontentsQuery::create(null, $criteria); - $query->joinWith('CcFiles', $join_behavior); - - return $this->getCcPlaylistcontentss($query, $con); - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcBlock is new, it will return - * an empty collection; or if this CcBlock has previously - * been saved, it will retrieve related CcPlaylistcontentss from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcBlock. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcPlaylistcontents[] List of CcPlaylistcontents objects - */ - public function getCcPlaylistcontentssJoinCcPlaylist($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcPlaylistcontentsQuery::create(null, $criteria); - $query->joinWith('CcPlaylist', $join_behavior); - - return $this->getCcPlaylistcontentss($query, $con); - } - - /** - * Clears out the collCcBlockcontentss collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcBlockcontentss() - */ - public function clearCcBlockcontentss() - { - $this->collCcBlockcontentss = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcBlockcontentss collection. - * - * By default this just sets the collCcBlockcontentss collection to an empty array (like clearcollCcBlockcontentss()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcBlockcontentss() - { - $this->collCcBlockcontentss = new PropelObjectCollection(); - $this->collCcBlockcontentss->setModel('CcBlockcontents'); - } - - /** - * Gets an array of CcBlockcontents objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcBlock is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcBlockcontents[] List of CcBlockcontents objects - * @throws PropelException - */ - public function getCcBlockcontentss($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcBlockcontentss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcBlockcontentss) { - // return empty collection - $this->initCcBlockcontentss(); - } else { - $collCcBlockcontentss = CcBlockcontentsQuery::create(null, $criteria) - ->filterByCcBlock($this) - ->find($con); - if (null !== $criteria) { - return $collCcBlockcontentss; - } - $this->collCcBlockcontentss = $collCcBlockcontentss; - } - } - return $this->collCcBlockcontentss; - } - - /** - * Returns the number of related CcBlockcontents objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcBlockcontents objects. - * @throws PropelException - */ - public function countCcBlockcontentss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcBlockcontentss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcBlockcontentss) { - return 0; - } else { - $query = CcBlockcontentsQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcBlock($this) - ->count($con); - } - } else { - return count($this->collCcBlockcontentss); - } - } - - /** - * Method called to associate a CcBlockcontents object to this object - * through the CcBlockcontents foreign key attribute. - * - * @param CcBlockcontents $l CcBlockcontents - * @return void - * @throws PropelException - */ - public function addCcBlockcontents(CcBlockcontents $l) - { - if ($this->collCcBlockcontentss === null) { - $this->initCcBlockcontentss(); - } - if (!$this->collCcBlockcontentss->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcBlockcontentss[]= $l; - $l->setCcBlock($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcBlock is new, it will return - * an empty collection; or if this CcBlock has previously - * been saved, it will retrieve related CcBlockcontentss from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcBlock. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcBlockcontents[] List of CcBlockcontents objects - */ - public function getCcBlockcontentssJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcBlockcontentsQuery::create(null, $criteria); - $query->joinWith('CcFiles', $join_behavior); - - return $this->getCcBlockcontentss($query, $con); - } - - /** - * Clears out the collCcBlockcriterias collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcBlockcriterias() - */ - public function clearCcBlockcriterias() - { - $this->collCcBlockcriterias = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcBlockcriterias collection. - * - * By default this just sets the collCcBlockcriterias collection to an empty array (like clearcollCcBlockcriterias()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcBlockcriterias() - { - $this->collCcBlockcriterias = new PropelObjectCollection(); - $this->collCcBlockcriterias->setModel('CcBlockcriteria'); - } - - /** - * Gets an array of CcBlockcriteria objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcBlock is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcBlockcriteria[] List of CcBlockcriteria objects - * @throws PropelException - */ - public function getCcBlockcriterias($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcBlockcriterias || null !== $criteria) { - if ($this->isNew() && null === $this->collCcBlockcriterias) { - // return empty collection - $this->initCcBlockcriterias(); - } else { - $collCcBlockcriterias = CcBlockcriteriaQuery::create(null, $criteria) - ->filterByCcBlock($this) - ->find($con); - if (null !== $criteria) { - return $collCcBlockcriterias; - } - $this->collCcBlockcriterias = $collCcBlockcriterias; - } - } - return $this->collCcBlockcriterias; - } - - /** - * Returns the number of related CcBlockcriteria objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcBlockcriteria objects. - * @throws PropelException - */ - public function countCcBlockcriterias(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcBlockcriterias || null !== $criteria) { - if ($this->isNew() && null === $this->collCcBlockcriterias) { - return 0; - } else { - $query = CcBlockcriteriaQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcBlock($this) - ->count($con); - } - } else { - return count($this->collCcBlockcriterias); - } - } - - /** - * Method called to associate a CcBlockcriteria object to this object - * through the CcBlockcriteria foreign key attribute. - * - * @param CcBlockcriteria $l CcBlockcriteria - * @return void - * @throws PropelException - */ - public function addCcBlockcriteria(CcBlockcriteria $l) - { - if ($this->collCcBlockcriterias === null) { - $this->initCcBlockcriterias(); - } - if (!$this->collCcBlockcriterias->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcBlockcriterias[]= $l; - $l->setCcBlock($this); - } - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->name = null; - $this->mtime = null; - $this->utime = null; - $this->creator_id = null; - $this->description = null; - $this->length = null; - $this->type = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - if ($this->collCcPlaylistcontentss) { - foreach ((array) $this->collCcPlaylistcontentss as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcBlockcontentss) { - foreach ((array) $this->collCcBlockcontentss as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcBlockcriterias) { - foreach ((array) $this->collCcBlockcriterias as $o) { - $o->clearAllReferences($deep); - } - } - } // if ($deep) - - $this->collCcPlaylistcontentss = null; - $this->collCcBlockcontentss = null; - $this->collCcBlockcriterias = null; - $this->aCcSubjs = null; - } - - // aggregate_column behavior - - /** - * Computes the value of the aggregate column length - * - * @param PropelPDO $con A connection object - * - * @return mixed The scalar result from the aggregate query - */ - public function computeDbLength(PropelPDO $con) - { - $stmt = $con->prepare('SELECT SUM(cliplength) FROM "cc_blockcontents" WHERE cc_blockcontents.BLOCK_ID = :p1'); - $stmt->bindValue(':p1', $this->getDbId()); - $stmt->execute(); - return $stmt->fetchColumn(); - } - - /** - * Updates the aggregate column length - * - * @param PropelPDO $con A connection object - */ - public function updateDbLength(PropelPDO $con) - { - $this->setDbLength($this->computeDbLength($con)); - $this->save($con); - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcBlock + /** + * Peer class name + */ + const PEER = 'CcBlockPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcBlockPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the name field. + * Note: this column has a database default value of: '' + * @var string + */ + protected $name; + + /** + * The value for the mtime field. + * @var string + */ + protected $mtime; + + /** + * The value for the utime field. + * @var string + */ + protected $utime; + + /** + * The value for the creator_id field. + * @var int + */ + protected $creator_id; + + /** + * The value for the description field. + * @var string + */ + protected $description; + + /** + * The value for the length field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $length; + + /** + * The value for the type field. + * Note: this column has a database default value of: 'static' + * @var string + */ + protected $type; + + /** + * @var CcSubjs + */ + protected $aCcSubjs; + + /** + * @var PropelObjectCollection|CcPlaylistcontents[] Collection to store aggregation of CcPlaylistcontents objects. + */ + protected $collCcPlaylistcontentss; + protected $collCcPlaylistcontentssPartial; + + /** + * @var PropelObjectCollection|CcBlockcontents[] Collection to store aggregation of CcBlockcontents objects. + */ + protected $collCcBlockcontentss; + protected $collCcBlockcontentssPartial; + + /** + * @var PropelObjectCollection|CcBlockcriteria[] Collection to store aggregation of CcBlockcriteria objects. + */ + protected $collCcBlockcriterias; + protected $collCcBlockcriteriasPartial; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccPlaylistcontentssScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccBlockcontentssScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccBlockcriteriasScheduledForDeletion = null; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->name = ''; + $this->length = '00:00:00'; + $this->type = 'static'; + } + + /** + * Initializes internal state of BaseCcBlock object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [name] column value. + * + * @return string + */ + public function getDbName() + { + + return $this->name; + } + + /** + * Get the [optionally formatted] temporal [mtime] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbMtime($format = 'Y-m-d H:i:s') + { + if ($this->mtime === null) { + return null; + } + + + try { + $dt = new DateTime($this->mtime); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->mtime, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [utime] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbUtime($format = 'Y-m-d H:i:s') + { + if ($this->utime === null) { + return null; + } + + + try { + $dt = new DateTime($this->utime); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->utime, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [creator_id] column value. + * + * @return int + */ + public function getDbCreatorId() + { + + return $this->creator_id; + } + + /** + * Get the [description] column value. + * + * @return string + */ + public function getDbDescription() + { + + return $this->description; + } + + /** + * Get the [length] column value. + * + * @return string + */ + public function getDbLength() + { + + return $this->length; + } + + /** + * Get the [type] column value. + * + * @return string + */ + public function getDbType() + { + + return $this->type; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcBlock The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcBlockPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [name] column. + * + * @param string $v new value + * @return CcBlock The current object (for fluent API support) + */ + public function setDbName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->name !== $v) { + $this->name = $v; + $this->modifiedColumns[] = CcBlockPeer::NAME; + } + + + return $this; + } // setDbName() + + /** + * Sets the value of [mtime] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcBlock The current object (for fluent API support) + */ + public function setDbMtime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->mtime !== null || $dt !== null) { + $currentDateAsString = ($this->mtime !== null && $tmpDt = new DateTime($this->mtime)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->mtime = $newDateAsString; + $this->modifiedColumns[] = CcBlockPeer::MTIME; + } + } // if either are not null + + + return $this; + } // setDbMtime() + + /** + * Sets the value of [utime] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcBlock The current object (for fluent API support) + */ + public function setDbUtime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->utime !== null || $dt !== null) { + $currentDateAsString = ($this->utime !== null && $tmpDt = new DateTime($this->utime)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->utime = $newDateAsString; + $this->modifiedColumns[] = CcBlockPeer::UTIME; + } + } // if either are not null + + + return $this; + } // setDbUtime() + + /** + * Set the value of [creator_id] column. + * + * @param int $v new value + * @return CcBlock The current object (for fluent API support) + */ + public function setDbCreatorId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->creator_id !== $v) { + $this->creator_id = $v; + $this->modifiedColumns[] = CcBlockPeer::CREATOR_ID; + } + + if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { + $this->aCcSubjs = null; + } + + + return $this; + } // setDbCreatorId() + + /** + * Set the value of [description] column. + * + * @param string $v new value + * @return CcBlock The current object (for fluent API support) + */ + public function setDbDescription($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->description !== $v) { + $this->description = $v; + $this->modifiedColumns[] = CcBlockPeer::DESCRIPTION; + } + + + return $this; + } // setDbDescription() + + /** + * Set the value of [length] column. + * + * @param string $v new value + * @return CcBlock The current object (for fluent API support) + */ + public function setDbLength($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->length !== $v) { + $this->length = $v; + $this->modifiedColumns[] = CcBlockPeer::LENGTH; + } + + + return $this; + } // setDbLength() + + /** + * Set the value of [type] column. + * + * @param string $v new value + * @return CcBlock The current object (for fluent API support) + */ + public function setDbType($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->type !== $v) { + $this->type = $v; + $this->modifiedColumns[] = CcBlockPeer::TYPE; + } + + + return $this; + } // setDbType() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->name !== '') { + return false; + } + + if ($this->length !== '00:00:00') { + return false; + } + + if ($this->type !== 'static') { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->mtime = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->utime = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->creator_id = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; + $this->description = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; + $this->length = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; + $this->type = ($row[$startcol + 7] !== null) ? (string) $row[$startcol + 7] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 8; // 8 = CcBlockPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcBlock object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcSubjs !== null && $this->creator_id !== $this->aCcSubjs->getDbId()) { + $this->aCcSubjs = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcBlockPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcSubjs = null; + $this->collCcPlaylistcontentss = null; + + $this->collCcBlockcontentss = null; + + $this->collCcBlockcriterias = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcBlockQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + // aggregate_column behavior + if (null !== $this->collCcBlockcontentss) { + $this->setDbLength($this->computeDbLength($con)); + if ($this->isModified()) { + $this->save($con); + } + } + + CcBlockPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSubjs !== null) { + if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { + $affectedRows += $this->aCcSubjs->save($con); + } + $this->setCcSubjs($this->aCcSubjs); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->ccPlaylistcontentssScheduledForDeletion !== null) { + if (!$this->ccPlaylistcontentssScheduledForDeletion->isEmpty()) { + CcPlaylistcontentsQuery::create() + ->filterByPrimaryKeys($this->ccPlaylistcontentssScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccPlaylistcontentssScheduledForDeletion = null; + } + } + + if ($this->collCcPlaylistcontentss !== null) { + foreach ($this->collCcPlaylistcontentss as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccBlockcontentssScheduledForDeletion !== null) { + if (!$this->ccBlockcontentssScheduledForDeletion->isEmpty()) { + CcBlockcontentsQuery::create() + ->filterByPrimaryKeys($this->ccBlockcontentssScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccBlockcontentssScheduledForDeletion = null; + } + } + + if ($this->collCcBlockcontentss !== null) { + foreach ($this->collCcBlockcontentss as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccBlockcriteriasScheduledForDeletion !== null) { + if (!$this->ccBlockcriteriasScheduledForDeletion->isEmpty()) { + CcBlockcriteriaQuery::create() + ->filterByPrimaryKeys($this->ccBlockcriteriasScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccBlockcriteriasScheduledForDeletion = null; + } + } + + if ($this->collCcBlockcriterias !== null) { + foreach ($this->collCcBlockcriterias as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcBlockPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcBlockPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_block_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcBlockPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcBlockPeer::NAME)) { + $modifiedColumns[':p' . $index++] = '"name"'; + } + if ($this->isColumnModified(CcBlockPeer::MTIME)) { + $modifiedColumns[':p' . $index++] = '"mtime"'; + } + if ($this->isColumnModified(CcBlockPeer::UTIME)) { + $modifiedColumns[':p' . $index++] = '"utime"'; + } + if ($this->isColumnModified(CcBlockPeer::CREATOR_ID)) { + $modifiedColumns[':p' . $index++] = '"creator_id"'; + } + if ($this->isColumnModified(CcBlockPeer::DESCRIPTION)) { + $modifiedColumns[':p' . $index++] = '"description"'; + } + if ($this->isColumnModified(CcBlockPeer::LENGTH)) { + $modifiedColumns[':p' . $index++] = '"length"'; + } + if ($this->isColumnModified(CcBlockPeer::TYPE)) { + $modifiedColumns[':p' . $index++] = '"type"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_block" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"name"': + $stmt->bindValue($identifier, $this->name, PDO::PARAM_STR); + break; + case '"mtime"': + $stmt->bindValue($identifier, $this->mtime, PDO::PARAM_STR); + break; + case '"utime"': + $stmt->bindValue($identifier, $this->utime, PDO::PARAM_STR); + break; + case '"creator_id"': + $stmt->bindValue($identifier, $this->creator_id, PDO::PARAM_INT); + break; + case '"description"': + $stmt->bindValue($identifier, $this->description, PDO::PARAM_STR); + break; + case '"length"': + $stmt->bindValue($identifier, $this->length, PDO::PARAM_STR); + break; + case '"type"': + $stmt->bindValue($identifier, $this->type, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSubjs !== null) { + if (!$this->aCcSubjs->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); + } + } + + + if (($retval = CcBlockPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + if ($this->collCcPlaylistcontentss !== null) { + foreach ($this->collCcPlaylistcontentss as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcBlockcontentss !== null) { + foreach ($this->collCcBlockcontentss as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcBlockcriterias !== null) { + foreach ($this->collCcBlockcriterias as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcBlockPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbName(); + break; + case 2: + return $this->getDbMtime(); + break; + case 3: + return $this->getDbUtime(); + break; + case 4: + return $this->getDbCreatorId(); + break; + case 5: + return $this->getDbDescription(); + break; + case 6: + return $this->getDbLength(); + break; + case 7: + return $this->getDbType(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcBlock'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcBlock'][$this->getPrimaryKey()] = true; + $keys = CcBlockPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbName(), + $keys[2] => $this->getDbMtime(), + $keys[3] => $this->getDbUtime(), + $keys[4] => $this->getDbCreatorId(), + $keys[5] => $this->getDbDescription(), + $keys[6] => $this->getDbLength(), + $keys[7] => $this->getDbType(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcSubjs) { + $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->collCcPlaylistcontentss) { + $result['CcPlaylistcontentss'] = $this->collCcPlaylistcontentss->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcBlockcontentss) { + $result['CcBlockcontentss'] = $this->collCcBlockcontentss->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcBlockcriterias) { + $result['CcBlockcriterias'] = $this->collCcBlockcriterias->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcBlockPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbName($value); + break; + case 2: + $this->setDbMtime($value); + break; + case 3: + $this->setDbUtime($value); + break; + case 4: + $this->setDbCreatorId($value); + break; + case 5: + $this->setDbDescription($value); + break; + case 6: + $this->setDbLength($value); + break; + case 7: + $this->setDbType($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcBlockPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbMtime($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbUtime($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbCreatorId($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setDbDescription($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setDbLength($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setDbType($arr[$keys[7]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcBlockPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcBlockPeer::ID)) $criteria->add(CcBlockPeer::ID, $this->id); + if ($this->isColumnModified(CcBlockPeer::NAME)) $criteria->add(CcBlockPeer::NAME, $this->name); + if ($this->isColumnModified(CcBlockPeer::MTIME)) $criteria->add(CcBlockPeer::MTIME, $this->mtime); + if ($this->isColumnModified(CcBlockPeer::UTIME)) $criteria->add(CcBlockPeer::UTIME, $this->utime); + if ($this->isColumnModified(CcBlockPeer::CREATOR_ID)) $criteria->add(CcBlockPeer::CREATOR_ID, $this->creator_id); + if ($this->isColumnModified(CcBlockPeer::DESCRIPTION)) $criteria->add(CcBlockPeer::DESCRIPTION, $this->description); + if ($this->isColumnModified(CcBlockPeer::LENGTH)) $criteria->add(CcBlockPeer::LENGTH, $this->length); + if ($this->isColumnModified(CcBlockPeer::TYPE)) $criteria->add(CcBlockPeer::TYPE, $this->type); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcBlockPeer::DATABASE_NAME); + $criteria->add(CcBlockPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcBlock (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbName($this->getDbName()); + $copyObj->setDbMtime($this->getDbMtime()); + $copyObj->setDbUtime($this->getDbUtime()); + $copyObj->setDbCreatorId($this->getDbCreatorId()); + $copyObj->setDbDescription($this->getDbDescription()); + $copyObj->setDbLength($this->getDbLength()); + $copyObj->setDbType($this->getDbType()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + foreach ($this->getCcPlaylistcontentss() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcPlaylistcontents($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcBlockcontentss() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcBlockcontents($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcBlockcriterias() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcBlockcriteria($relObj->copy($deepCopy)); + } + } + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcBlock Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcBlockPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcBlockPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcSubjs object. + * + * @param CcSubjs $v + * @return CcBlock The current object (for fluent API support) + * @throws PropelException + */ + public function setCcSubjs(CcSubjs $v = null) + { + if ($v === null) { + $this->setDbCreatorId(NULL); + } else { + $this->setDbCreatorId($v->getDbId()); + } + + $this->aCcSubjs = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcSubjs object, it will not be re-added. + if ($v !== null) { + $v->addCcBlock($this); + } + + + return $this; + } + + + /** + * Get the associated CcSubjs object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcSubjs The associated CcSubjs object. + * @throws PropelException + */ + public function getCcSubjs(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcSubjs === null && ($this->creator_id !== null) && $doQuery) { + $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->creator_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcSubjs->addCcBlocks($this); + */ + } + + return $this->aCcSubjs; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CcPlaylistcontents' == $relationName) { + $this->initCcPlaylistcontentss(); + } + if ('CcBlockcontents' == $relationName) { + $this->initCcBlockcontentss(); + } + if ('CcBlockcriteria' == $relationName) { + $this->initCcBlockcriterias(); + } + } + + /** + * Clears out the collCcPlaylistcontentss collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcBlock The current object (for fluent API support) + * @see addCcPlaylistcontentss() + */ + public function clearCcPlaylistcontentss() + { + $this->collCcPlaylistcontentss = null; // important to set this to null since that means it is uninitialized + $this->collCcPlaylistcontentssPartial = null; + + return $this; + } + + /** + * reset is the collCcPlaylistcontentss collection loaded partially + * + * @return void + */ + public function resetPartialCcPlaylistcontentss($v = true) + { + $this->collCcPlaylistcontentssPartial = $v; + } + + /** + * Initializes the collCcPlaylistcontentss collection. + * + * By default this just sets the collCcPlaylistcontentss collection to an empty array (like clearcollCcPlaylistcontentss()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcPlaylistcontentss($overrideExisting = true) + { + if (null !== $this->collCcPlaylistcontentss && !$overrideExisting) { + return; + } + $this->collCcPlaylistcontentss = new PropelObjectCollection(); + $this->collCcPlaylistcontentss->setModel('CcPlaylistcontents'); + } + + /** + * Gets an array of CcPlaylistcontents objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcBlock is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcPlaylistcontents[] List of CcPlaylistcontents objects + * @throws PropelException + */ + public function getCcPlaylistcontentss($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcPlaylistcontentssPartial && !$this->isNew(); + if (null === $this->collCcPlaylistcontentss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlaylistcontentss) { + // return empty collection + $this->initCcPlaylistcontentss(); + } else { + $collCcPlaylistcontentss = CcPlaylistcontentsQuery::create(null, $criteria) + ->filterByCcBlock($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcPlaylistcontentssPartial && count($collCcPlaylistcontentss)) { + $this->initCcPlaylistcontentss(false); + + foreach ($collCcPlaylistcontentss as $obj) { + if (false == $this->collCcPlaylistcontentss->contains($obj)) { + $this->collCcPlaylistcontentss->append($obj); + } + } + + $this->collCcPlaylistcontentssPartial = true; + } + + $collCcPlaylistcontentss->getInternalIterator()->rewind(); + + return $collCcPlaylistcontentss; + } + + if ($partial && $this->collCcPlaylistcontentss) { + foreach ($this->collCcPlaylistcontentss as $obj) { + if ($obj->isNew()) { + $collCcPlaylistcontentss[] = $obj; + } + } + } + + $this->collCcPlaylistcontentss = $collCcPlaylistcontentss; + $this->collCcPlaylistcontentssPartial = false; + } + } + + return $this->collCcPlaylistcontentss; + } + + /** + * Sets a collection of CcPlaylistcontents objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccPlaylistcontentss A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcBlock The current object (for fluent API support) + */ + public function setCcPlaylistcontentss(PropelCollection $ccPlaylistcontentss, PropelPDO $con = null) + { + $ccPlaylistcontentssToDelete = $this->getCcPlaylistcontentss(new Criteria(), $con)->diff($ccPlaylistcontentss); + + + $this->ccPlaylistcontentssScheduledForDeletion = $ccPlaylistcontentssToDelete; + + foreach ($ccPlaylistcontentssToDelete as $ccPlaylistcontentsRemoved) { + $ccPlaylistcontentsRemoved->setCcBlock(null); + } + + $this->collCcPlaylistcontentss = null; + foreach ($ccPlaylistcontentss as $ccPlaylistcontents) { + $this->addCcPlaylistcontents($ccPlaylistcontents); + } + + $this->collCcPlaylistcontentss = $ccPlaylistcontentss; + $this->collCcPlaylistcontentssPartial = false; + + return $this; + } + + /** + * Returns the number of related CcPlaylistcontents objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcPlaylistcontents objects. + * @throws PropelException + */ + public function countCcPlaylistcontentss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcPlaylistcontentssPartial && !$this->isNew(); + if (null === $this->collCcPlaylistcontentss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlaylistcontentss) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcPlaylistcontentss()); + } + $query = CcPlaylistcontentsQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcBlock($this) + ->count($con); + } + + return count($this->collCcPlaylistcontentss); + } + + /** + * Method called to associate a CcPlaylistcontents object to this object + * through the CcPlaylistcontents foreign key attribute. + * + * @param CcPlaylistcontents $l CcPlaylistcontents + * @return CcBlock The current object (for fluent API support) + */ + public function addCcPlaylistcontents(CcPlaylistcontents $l) + { + if ($this->collCcPlaylistcontentss === null) { + $this->initCcPlaylistcontentss(); + $this->collCcPlaylistcontentssPartial = true; + } + + if (!in_array($l, $this->collCcPlaylistcontentss->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcPlaylistcontents($l); + + if ($this->ccPlaylistcontentssScheduledForDeletion and $this->ccPlaylistcontentssScheduledForDeletion->contains($l)) { + $this->ccPlaylistcontentssScheduledForDeletion->remove($this->ccPlaylistcontentssScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcPlaylistcontents $ccPlaylistcontents The ccPlaylistcontents object to add. + */ + protected function doAddCcPlaylistcontents($ccPlaylistcontents) + { + $this->collCcPlaylistcontentss[]= $ccPlaylistcontents; + $ccPlaylistcontents->setCcBlock($this); + } + + /** + * @param CcPlaylistcontents $ccPlaylistcontents The ccPlaylistcontents object to remove. + * @return CcBlock The current object (for fluent API support) + */ + public function removeCcPlaylistcontents($ccPlaylistcontents) + { + if ($this->getCcPlaylistcontentss()->contains($ccPlaylistcontents)) { + $this->collCcPlaylistcontentss->remove($this->collCcPlaylistcontentss->search($ccPlaylistcontents)); + if (null === $this->ccPlaylistcontentssScheduledForDeletion) { + $this->ccPlaylistcontentssScheduledForDeletion = clone $this->collCcPlaylistcontentss; + $this->ccPlaylistcontentssScheduledForDeletion->clear(); + } + $this->ccPlaylistcontentssScheduledForDeletion[]= $ccPlaylistcontents; + $ccPlaylistcontents->setCcBlock(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcBlock is new, it will return + * an empty collection; or if this CcBlock has previously + * been saved, it will retrieve related CcPlaylistcontentss from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcBlock. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcPlaylistcontents[] List of CcPlaylistcontents objects + */ + public function getCcPlaylistcontentssJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcPlaylistcontentsQuery::create(null, $criteria); + $query->joinWith('CcFiles', $join_behavior); + + return $this->getCcPlaylistcontentss($query, $con); + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcBlock is new, it will return + * an empty collection; or if this CcBlock has previously + * been saved, it will retrieve related CcPlaylistcontentss from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcBlock. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcPlaylistcontents[] List of CcPlaylistcontents objects + */ + public function getCcPlaylistcontentssJoinCcPlaylist($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcPlaylistcontentsQuery::create(null, $criteria); + $query->joinWith('CcPlaylist', $join_behavior); + + return $this->getCcPlaylistcontentss($query, $con); + } + + /** + * Clears out the collCcBlockcontentss collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcBlock The current object (for fluent API support) + * @see addCcBlockcontentss() + */ + public function clearCcBlockcontentss() + { + $this->collCcBlockcontentss = null; // important to set this to null since that means it is uninitialized + $this->collCcBlockcontentssPartial = null; + + return $this; + } + + /** + * reset is the collCcBlockcontentss collection loaded partially + * + * @return void + */ + public function resetPartialCcBlockcontentss($v = true) + { + $this->collCcBlockcontentssPartial = $v; + } + + /** + * Initializes the collCcBlockcontentss collection. + * + * By default this just sets the collCcBlockcontentss collection to an empty array (like clearcollCcBlockcontentss()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcBlockcontentss($overrideExisting = true) + { + if (null !== $this->collCcBlockcontentss && !$overrideExisting) { + return; + } + $this->collCcBlockcontentss = new PropelObjectCollection(); + $this->collCcBlockcontentss->setModel('CcBlockcontents'); + } + + /** + * Gets an array of CcBlockcontents objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcBlock is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcBlockcontents[] List of CcBlockcontents objects + * @throws PropelException + */ + public function getCcBlockcontentss($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcBlockcontentssPartial && !$this->isNew(); + if (null === $this->collCcBlockcontentss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcBlockcontentss) { + // return empty collection + $this->initCcBlockcontentss(); + } else { + $collCcBlockcontentss = CcBlockcontentsQuery::create(null, $criteria) + ->filterByCcBlock($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcBlockcontentssPartial && count($collCcBlockcontentss)) { + $this->initCcBlockcontentss(false); + + foreach ($collCcBlockcontentss as $obj) { + if (false == $this->collCcBlockcontentss->contains($obj)) { + $this->collCcBlockcontentss->append($obj); + } + } + + $this->collCcBlockcontentssPartial = true; + } + + $collCcBlockcontentss->getInternalIterator()->rewind(); + + return $collCcBlockcontentss; + } + + if ($partial && $this->collCcBlockcontentss) { + foreach ($this->collCcBlockcontentss as $obj) { + if ($obj->isNew()) { + $collCcBlockcontentss[] = $obj; + } + } + } + + $this->collCcBlockcontentss = $collCcBlockcontentss; + $this->collCcBlockcontentssPartial = false; + } + } + + return $this->collCcBlockcontentss; + } + + /** + * Sets a collection of CcBlockcontents objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccBlockcontentss A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcBlock The current object (for fluent API support) + */ + public function setCcBlockcontentss(PropelCollection $ccBlockcontentss, PropelPDO $con = null) + { + $ccBlockcontentssToDelete = $this->getCcBlockcontentss(new Criteria(), $con)->diff($ccBlockcontentss); + + + $this->ccBlockcontentssScheduledForDeletion = $ccBlockcontentssToDelete; + + foreach ($ccBlockcontentssToDelete as $ccBlockcontentsRemoved) { + $ccBlockcontentsRemoved->setCcBlock(null); + } + + $this->collCcBlockcontentss = null; + foreach ($ccBlockcontentss as $ccBlockcontents) { + $this->addCcBlockcontents($ccBlockcontents); + } + + $this->collCcBlockcontentss = $ccBlockcontentss; + $this->collCcBlockcontentssPartial = false; + + return $this; + } + + /** + * Returns the number of related CcBlockcontents objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcBlockcontents objects. + * @throws PropelException + */ + public function countCcBlockcontentss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcBlockcontentssPartial && !$this->isNew(); + if (null === $this->collCcBlockcontentss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcBlockcontentss) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcBlockcontentss()); + } + $query = CcBlockcontentsQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcBlock($this) + ->count($con); + } + + return count($this->collCcBlockcontentss); + } + + /** + * Method called to associate a CcBlockcontents object to this object + * through the CcBlockcontents foreign key attribute. + * + * @param CcBlockcontents $l CcBlockcontents + * @return CcBlock The current object (for fluent API support) + */ + public function addCcBlockcontents(CcBlockcontents $l) + { + if ($this->collCcBlockcontentss === null) { + $this->initCcBlockcontentss(); + $this->collCcBlockcontentssPartial = true; + } + + if (!in_array($l, $this->collCcBlockcontentss->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcBlockcontents($l); + + if ($this->ccBlockcontentssScheduledForDeletion and $this->ccBlockcontentssScheduledForDeletion->contains($l)) { + $this->ccBlockcontentssScheduledForDeletion->remove($this->ccBlockcontentssScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcBlockcontents $ccBlockcontents The ccBlockcontents object to add. + */ + protected function doAddCcBlockcontents($ccBlockcontents) + { + $this->collCcBlockcontentss[]= $ccBlockcontents; + $ccBlockcontents->setCcBlock($this); + } + + /** + * @param CcBlockcontents $ccBlockcontents The ccBlockcontents object to remove. + * @return CcBlock The current object (for fluent API support) + */ + public function removeCcBlockcontents($ccBlockcontents) + { + if ($this->getCcBlockcontentss()->contains($ccBlockcontents)) { + $this->collCcBlockcontentss->remove($this->collCcBlockcontentss->search($ccBlockcontents)); + if (null === $this->ccBlockcontentssScheduledForDeletion) { + $this->ccBlockcontentssScheduledForDeletion = clone $this->collCcBlockcontentss; + $this->ccBlockcontentssScheduledForDeletion->clear(); + } + $this->ccBlockcontentssScheduledForDeletion[]= $ccBlockcontents; + $ccBlockcontents->setCcBlock(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcBlock is new, it will return + * an empty collection; or if this CcBlock has previously + * been saved, it will retrieve related CcBlockcontentss from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcBlock. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcBlockcontents[] List of CcBlockcontents objects + */ + public function getCcBlockcontentssJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcBlockcontentsQuery::create(null, $criteria); + $query->joinWith('CcFiles', $join_behavior); + + return $this->getCcBlockcontentss($query, $con); + } + + /** + * Clears out the collCcBlockcriterias collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcBlock The current object (for fluent API support) + * @see addCcBlockcriterias() + */ + public function clearCcBlockcriterias() + { + $this->collCcBlockcriterias = null; // important to set this to null since that means it is uninitialized + $this->collCcBlockcriteriasPartial = null; + + return $this; + } + + /** + * reset is the collCcBlockcriterias collection loaded partially + * + * @return void + */ + public function resetPartialCcBlockcriterias($v = true) + { + $this->collCcBlockcriteriasPartial = $v; + } + + /** + * Initializes the collCcBlockcriterias collection. + * + * By default this just sets the collCcBlockcriterias collection to an empty array (like clearcollCcBlockcriterias()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcBlockcriterias($overrideExisting = true) + { + if (null !== $this->collCcBlockcriterias && !$overrideExisting) { + return; + } + $this->collCcBlockcriterias = new PropelObjectCollection(); + $this->collCcBlockcriterias->setModel('CcBlockcriteria'); + } + + /** + * Gets an array of CcBlockcriteria objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcBlock is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcBlockcriteria[] List of CcBlockcriteria objects + * @throws PropelException + */ + public function getCcBlockcriterias($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcBlockcriteriasPartial && !$this->isNew(); + if (null === $this->collCcBlockcriterias || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcBlockcriterias) { + // return empty collection + $this->initCcBlockcriterias(); + } else { + $collCcBlockcriterias = CcBlockcriteriaQuery::create(null, $criteria) + ->filterByCcBlock($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcBlockcriteriasPartial && count($collCcBlockcriterias)) { + $this->initCcBlockcriterias(false); + + foreach ($collCcBlockcriterias as $obj) { + if (false == $this->collCcBlockcriterias->contains($obj)) { + $this->collCcBlockcriterias->append($obj); + } + } + + $this->collCcBlockcriteriasPartial = true; + } + + $collCcBlockcriterias->getInternalIterator()->rewind(); + + return $collCcBlockcriterias; + } + + if ($partial && $this->collCcBlockcriterias) { + foreach ($this->collCcBlockcriterias as $obj) { + if ($obj->isNew()) { + $collCcBlockcriterias[] = $obj; + } + } + } + + $this->collCcBlockcriterias = $collCcBlockcriterias; + $this->collCcBlockcriteriasPartial = false; + } + } + + return $this->collCcBlockcriterias; + } + + /** + * Sets a collection of CcBlockcriteria objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccBlockcriterias A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcBlock The current object (for fluent API support) + */ + public function setCcBlockcriterias(PropelCollection $ccBlockcriterias, PropelPDO $con = null) + { + $ccBlockcriteriasToDelete = $this->getCcBlockcriterias(new Criteria(), $con)->diff($ccBlockcriterias); + + + $this->ccBlockcriteriasScheduledForDeletion = $ccBlockcriteriasToDelete; + + foreach ($ccBlockcriteriasToDelete as $ccBlockcriteriaRemoved) { + $ccBlockcriteriaRemoved->setCcBlock(null); + } + + $this->collCcBlockcriterias = null; + foreach ($ccBlockcriterias as $ccBlockcriteria) { + $this->addCcBlockcriteria($ccBlockcriteria); + } + + $this->collCcBlockcriterias = $ccBlockcriterias; + $this->collCcBlockcriteriasPartial = false; + + return $this; + } + + /** + * Returns the number of related CcBlockcriteria objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcBlockcriteria objects. + * @throws PropelException + */ + public function countCcBlockcriterias(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcBlockcriteriasPartial && !$this->isNew(); + if (null === $this->collCcBlockcriterias || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcBlockcriterias) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcBlockcriterias()); + } + $query = CcBlockcriteriaQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcBlock($this) + ->count($con); + } + + return count($this->collCcBlockcriterias); + } + + /** + * Method called to associate a CcBlockcriteria object to this object + * through the CcBlockcriteria foreign key attribute. + * + * @param CcBlockcriteria $l CcBlockcriteria + * @return CcBlock The current object (for fluent API support) + */ + public function addCcBlockcriteria(CcBlockcriteria $l) + { + if ($this->collCcBlockcriterias === null) { + $this->initCcBlockcriterias(); + $this->collCcBlockcriteriasPartial = true; + } + + if (!in_array($l, $this->collCcBlockcriterias->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcBlockcriteria($l); + + if ($this->ccBlockcriteriasScheduledForDeletion and $this->ccBlockcriteriasScheduledForDeletion->contains($l)) { + $this->ccBlockcriteriasScheduledForDeletion->remove($this->ccBlockcriteriasScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcBlockcriteria $ccBlockcriteria The ccBlockcriteria object to add. + */ + protected function doAddCcBlockcriteria($ccBlockcriteria) + { + $this->collCcBlockcriterias[]= $ccBlockcriteria; + $ccBlockcriteria->setCcBlock($this); + } + + /** + * @param CcBlockcriteria $ccBlockcriteria The ccBlockcriteria object to remove. + * @return CcBlock The current object (for fluent API support) + */ + public function removeCcBlockcriteria($ccBlockcriteria) + { + if ($this->getCcBlockcriterias()->contains($ccBlockcriteria)) { + $this->collCcBlockcriterias->remove($this->collCcBlockcriterias->search($ccBlockcriteria)); + if (null === $this->ccBlockcriteriasScheduledForDeletion) { + $this->ccBlockcriteriasScheduledForDeletion = clone $this->collCcBlockcriterias; + $this->ccBlockcriteriasScheduledForDeletion->clear(); + } + $this->ccBlockcriteriasScheduledForDeletion[]= clone $ccBlockcriteria; + $ccBlockcriteria->setCcBlock(null); + } + + return $this; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->name = null; + $this->mtime = null; + $this->utime = null; + $this->creator_id = null; + $this->description = null; + $this->length = null; + $this->type = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCcPlaylistcontentss) { + foreach ($this->collCcPlaylistcontentss as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcBlockcontentss) { + foreach ($this->collCcBlockcontentss as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcBlockcriterias) { + foreach ($this->collCcBlockcriterias as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->aCcSubjs instanceof Persistent) { + $this->aCcSubjs->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + if ($this->collCcPlaylistcontentss instanceof PropelCollection) { + $this->collCcPlaylistcontentss->clearIterator(); + } + $this->collCcPlaylistcontentss = null; + if ($this->collCcBlockcontentss instanceof PropelCollection) { + $this->collCcBlockcontentss->clearIterator(); + } + $this->collCcBlockcontentss = null; + if ($this->collCcBlockcriterias instanceof PropelCollection) { + $this->collCcBlockcriterias->clearIterator(); + } + $this->collCcBlockcriterias = null; + $this->aCcSubjs = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcBlockPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + + // aggregate_column behavior + + /** + * Computes the value of the aggregate column length * + * @param PropelPDO $con A connection object + * + * @return mixed The scalar result from the aggregate query + */ + public function computeDbLength(PropelPDO $con) + { + $stmt = $con->prepare('SELECT SUM(cliplength) FROM "cc_blockcontents" WHERE cc_blockcontents.block_id = :p1'); + $stmt->bindValue(':p1', $this->getDbId()); + $stmt->execute(); + + return $stmt->fetchColumn(); + } + + /** + * Updates the aggregate column length * + * @param PropelPDO $con A connection object + */ + public function updateDbLength(PropelPDO $con) + { + $this->setDbLength($this->computeDbLength($con)); + $this->save($con); + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcBlockPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcBlockPeer.php index 48003ffc56..403a647470 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcBlockPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcBlockPeer.php @@ -4,1005 +4,1031 @@ /** * Base static class for performing query and update operations on the 'cc_block' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcBlockPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_block'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcBlock'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcBlock'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcBlockTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 8; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_block.ID'; - - /** the column name for the NAME field */ - const NAME = 'cc_block.NAME'; - - /** the column name for the MTIME field */ - const MTIME = 'cc_block.MTIME'; - - /** the column name for the UTIME field */ - const UTIME = 'cc_block.UTIME'; - - /** the column name for the CREATOR_ID field */ - const CREATOR_ID = 'cc_block.CREATOR_ID'; - - /** the column name for the DESCRIPTION field */ - const DESCRIPTION = 'cc_block.DESCRIPTION'; - - /** the column name for the LENGTH field */ - const LENGTH = 'cc_block.LENGTH'; - - /** the column name for the TYPE field */ - const TYPE = 'cc_block.TYPE'; - - /** - * An identiy map to hold any loaded instances of CcBlock objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcBlock[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMtime', 'DbUtime', 'DbCreatorId', 'DbDescription', 'DbLength', 'DbType', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMtime', 'dbUtime', 'dbCreatorId', 'dbDescription', 'dbLength', 'dbType', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::NAME, self::MTIME, self::UTIME, self::CREATOR_ID, self::DESCRIPTION, self::LENGTH, self::TYPE, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MTIME', 'UTIME', 'CREATOR_ID', 'DESCRIPTION', 'LENGTH', 'TYPE', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mtime', 'utime', 'creator_id', 'description', 'length', 'type', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMtime' => 2, 'DbUtime' => 3, 'DbCreatorId' => 4, 'DbDescription' => 5, 'DbLength' => 6, 'DbType' => 7, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMtime' => 2, 'dbUtime' => 3, 'dbCreatorId' => 4, 'dbDescription' => 5, 'dbLength' => 6, 'dbType' => 7, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::NAME => 1, self::MTIME => 2, self::UTIME => 3, self::CREATOR_ID => 4, self::DESCRIPTION => 5, self::LENGTH => 6, self::TYPE => 7, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MTIME' => 2, 'UTIME' => 3, 'CREATOR_ID' => 4, 'DESCRIPTION' => 5, 'LENGTH' => 6, 'TYPE' => 7, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mtime' => 2, 'utime' => 3, 'creator_id' => 4, 'description' => 5, 'length' => 6, 'type' => 7, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcBlockPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcBlockPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcBlockPeer::ID); - $criteria->addSelectColumn(CcBlockPeer::NAME); - $criteria->addSelectColumn(CcBlockPeer::MTIME); - $criteria->addSelectColumn(CcBlockPeer::UTIME); - $criteria->addSelectColumn(CcBlockPeer::CREATOR_ID); - $criteria->addSelectColumn(CcBlockPeer::DESCRIPTION); - $criteria->addSelectColumn(CcBlockPeer::LENGTH); - $criteria->addSelectColumn(CcBlockPeer::TYPE); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.NAME'); - $criteria->addSelectColumn($alias . '.MTIME'); - $criteria->addSelectColumn($alias . '.UTIME'); - $criteria->addSelectColumn($alias . '.CREATOR_ID'); - $criteria->addSelectColumn($alias . '.DESCRIPTION'); - $criteria->addSelectColumn($alias . '.LENGTH'); - $criteria->addSelectColumn($alias . '.TYPE'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcBlockPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcBlockPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcBlock - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcBlockPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcBlockPeer::populateObjects(CcBlockPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcBlockPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcBlock $value A CcBlock object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcBlock $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcBlock object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcBlock) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcBlock object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcBlock Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_block - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - // Invalidate objects in CcPlaylistcontentsPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcPlaylistcontentsPeer::clearInstancePool(); - // Invalidate objects in CcBlockcontentsPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcBlockcontentsPeer::clearInstancePool(); - // Invalidate objects in CcBlockcriteriaPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcBlockcriteriaPeer::clearInstancePool(); - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcBlockPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcBlockPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcBlockPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcBlockPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcBlock object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcBlockPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcBlockPeer::NUM_COLUMNS; - } else { - $cls = CcBlockPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcBlockPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcSubjs table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcBlockPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcBlockPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcBlockPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcBlock objects pre-filled with their CcSubjs objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcBlock objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcBlockPeer::addSelectColumns($criteria); - $startcol = (CcBlockPeer::NUM_COLUMNS - CcBlockPeer::NUM_LAZY_LOAD_COLUMNS); - CcSubjsPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcBlockPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcBlockPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcBlockPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcBlockPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcBlockPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcBlock) to $obj2 (CcSubjs) - $obj2->addCcBlock($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcBlockPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcBlockPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcBlockPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcBlock objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcBlock objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcBlockPeer::addSelectColumns($criteria); - $startcol2 = (CcBlockPeer::NUM_COLUMNS - CcBlockPeer::NUM_LAZY_LOAD_COLUMNS); - - CcSubjsPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcSubjsPeer::NUM_COLUMNS - CcSubjsPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcBlockPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcBlockPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcBlockPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcBlockPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcBlockPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcSubjs rows - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcBlock) to the collection in $obj2 (CcSubjs) - $obj2->addCcBlock($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcBlockPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcBlockPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcBlockTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcBlockPeer::CLASS_DEFAULT : CcBlockPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcBlock or Criteria object. - * - * @param mixed $values Criteria or CcBlock object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcBlock object - } - - if ($criteria->containsKey(CcBlockPeer::ID) && $criteria->keyContainsValue(CcBlockPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcBlockPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcBlock or Criteria object. - * - * @param mixed $values Criteria or CcBlock object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcBlockPeer::ID); - $value = $criteria->remove(CcBlockPeer::ID); - if ($value) { - $selectCriteria->add(CcBlockPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcBlockPeer::TABLE_NAME); - } - - } else { // $values is CcBlock object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_block table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcBlockPeer::TABLE_NAME, $con, CcBlockPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcBlockPeer::clearInstancePool(); - CcBlockPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcBlock or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcBlock object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcBlockPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcBlock) { // it's a model object - // invalidate the cache for this single object - CcBlockPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcBlockPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcBlockPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcBlockPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcBlock object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcBlock $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcBlock $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcBlockPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcBlockPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcBlockPeer::DATABASE_NAME, CcBlockPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcBlock - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcBlockPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcBlockPeer::DATABASE_NAME); - $criteria->add(CcBlockPeer::ID, $pk); - - $v = CcBlockPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcBlockPeer::DATABASE_NAME); - $criteria->add(CcBlockPeer::ID, $pks, Criteria::IN); - $objs = CcBlockPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcBlockPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_block'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcBlock'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcBlockTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 8; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 8; + + /** the column name for the id field */ + const ID = 'cc_block.id'; + + /** the column name for the name field */ + const NAME = 'cc_block.name'; + + /** the column name for the mtime field */ + const MTIME = 'cc_block.mtime'; + + /** the column name for the utime field */ + const UTIME = 'cc_block.utime'; + + /** the column name for the creator_id field */ + const CREATOR_ID = 'cc_block.creator_id'; + + /** the column name for the description field */ + const DESCRIPTION = 'cc_block.description'; + + /** the column name for the length field */ + const LENGTH = 'cc_block.length'; + + /** the column name for the type field */ + const TYPE = 'cc_block.type'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcBlock objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcBlock[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcBlockPeer::$fieldNames[CcBlockPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMtime', 'DbUtime', 'DbCreatorId', 'DbDescription', 'DbLength', 'DbType', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMtime', 'dbUtime', 'dbCreatorId', 'dbDescription', 'dbLength', 'dbType', ), + BasePeer::TYPE_COLNAME => array (CcBlockPeer::ID, CcBlockPeer::NAME, CcBlockPeer::MTIME, CcBlockPeer::UTIME, CcBlockPeer::CREATOR_ID, CcBlockPeer::DESCRIPTION, CcBlockPeer::LENGTH, CcBlockPeer::TYPE, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MTIME', 'UTIME', 'CREATOR_ID', 'DESCRIPTION', 'LENGTH', 'TYPE', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mtime', 'utime', 'creator_id', 'description', 'length', 'type', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcBlockPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMtime' => 2, 'DbUtime' => 3, 'DbCreatorId' => 4, 'DbDescription' => 5, 'DbLength' => 6, 'DbType' => 7, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMtime' => 2, 'dbUtime' => 3, 'dbCreatorId' => 4, 'dbDescription' => 5, 'dbLength' => 6, 'dbType' => 7, ), + BasePeer::TYPE_COLNAME => array (CcBlockPeer::ID => 0, CcBlockPeer::NAME => 1, CcBlockPeer::MTIME => 2, CcBlockPeer::UTIME => 3, CcBlockPeer::CREATOR_ID => 4, CcBlockPeer::DESCRIPTION => 5, CcBlockPeer::LENGTH => 6, CcBlockPeer::TYPE => 7, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MTIME' => 2, 'UTIME' => 3, 'CREATOR_ID' => 4, 'DESCRIPTION' => 5, 'LENGTH' => 6, 'TYPE' => 7, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mtime' => 2, 'utime' => 3, 'creator_id' => 4, 'description' => 5, 'length' => 6, 'type' => 7, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcBlockPeer::getFieldNames($toType); + $key = isset(CcBlockPeer::$fieldKeys[$fromType][$name]) ? CcBlockPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcBlockPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcBlockPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcBlockPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcBlockPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcBlockPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcBlockPeer::ID); + $criteria->addSelectColumn(CcBlockPeer::NAME); + $criteria->addSelectColumn(CcBlockPeer::MTIME); + $criteria->addSelectColumn(CcBlockPeer::UTIME); + $criteria->addSelectColumn(CcBlockPeer::CREATOR_ID); + $criteria->addSelectColumn(CcBlockPeer::DESCRIPTION); + $criteria->addSelectColumn(CcBlockPeer::LENGTH); + $criteria->addSelectColumn(CcBlockPeer::TYPE); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.name'); + $criteria->addSelectColumn($alias . '.mtime'); + $criteria->addSelectColumn($alias . '.utime'); + $criteria->addSelectColumn($alias . '.creator_id'); + $criteria->addSelectColumn($alias . '.description'); + $criteria->addSelectColumn($alias . '.length'); + $criteria->addSelectColumn($alias . '.type'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcBlockPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcBlockPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcBlockPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcBlock + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcBlockPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcBlockPeer::populateObjects(CcBlockPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcBlockPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcBlockPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcBlock $obj A CcBlock object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcBlockPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcBlock object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcBlock) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcBlock object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcBlockPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcBlock Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcBlockPeer::$instances[$key])) { + return CcBlockPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcBlockPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcBlockPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_block + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in CcPlaylistcontentsPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcPlaylistcontentsPeer::clearInstancePool(); + // Invalidate objects in CcBlockcontentsPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcBlockcontentsPeer::clearInstancePool(); + // Invalidate objects in CcBlockcriteriaPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcBlockcriteriaPeer::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcBlockPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcBlockPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcBlockPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcBlockPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcBlock object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcBlockPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcBlockPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcBlockPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcBlockPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcSubjs table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcBlockPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcBlockPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcBlockPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcBlockPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcBlock objects pre-filled with their CcSubjs objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcBlock objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcBlockPeer::DATABASE_NAME); + } + + CcBlockPeer::addSelectColumns($criteria); + $startcol = CcBlockPeer::NUM_HYDRATE_COLUMNS; + CcSubjsPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcBlockPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcBlockPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcBlockPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcBlockPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcBlockPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcBlock) to $obj2 (CcSubjs) + $obj2->addCcBlock($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcBlockPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcBlockPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcBlockPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcBlockPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcBlock objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcBlock objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcBlockPeer::DATABASE_NAME); + } + + CcBlockPeer::addSelectColumns($criteria); + $startcol2 = CcBlockPeer::NUM_HYDRATE_COLUMNS; + + CcSubjsPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcSubjsPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcBlockPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcBlockPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcBlockPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcBlockPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcBlockPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcSubjs rows + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcBlock) to the collection in $obj2 (CcSubjs) + $obj2->addCcBlock($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcBlockPeer::DATABASE_NAME)->getTable(CcBlockPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcBlockPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcBlockPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcBlockTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcBlockPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcBlock or Criteria object. + * + * @param mixed $values Criteria or CcBlock object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcBlock object + } + + if ($criteria->containsKey(CcBlockPeer::ID) && $criteria->keyContainsValue(CcBlockPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcBlockPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcBlockPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcBlock or Criteria object. + * + * @param mixed $values Criteria or CcBlock object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcBlockPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcBlockPeer::ID); + $value = $criteria->remove(CcBlockPeer::ID); + if ($value) { + $selectCriteria->add(CcBlockPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcBlockPeer::TABLE_NAME); + } + + } else { // $values is CcBlock object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcBlockPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_block table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcBlockPeer::TABLE_NAME, $con, CcBlockPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcBlockPeer::clearInstancePool(); + CcBlockPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcBlock or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcBlock object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcBlockPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcBlock) { // it's a model object + // invalidate the cache for this single object + CcBlockPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcBlockPeer::DATABASE_NAME); + $criteria->add(CcBlockPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcBlockPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcBlockPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcBlockPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcBlock object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcBlock $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcBlockPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcBlockPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcBlockPeer::DATABASE_NAME, CcBlockPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcBlock + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcBlockPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcBlockPeer::DATABASE_NAME); + $criteria->add(CcBlockPeer::ID, $pk); + + $v = CcBlockPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcBlock[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcBlockPeer::DATABASE_NAME); + $criteria->add(CcBlockPeer::ID, $pks, Criteria::IN); + $objs = CcBlockPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcBlockPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcBlockQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcBlockQuery.php index 100efd61e8..5ffad787a7 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcBlockQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcBlockQuery.php @@ -4,643 +4,861 @@ /** * Base class that represents a query for the 'cc_block' table. * - * * - * @method CcBlockQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcBlockQuery orderByDbName($order = Criteria::ASC) Order by the name column - * @method CcBlockQuery orderByDbMtime($order = Criteria::ASC) Order by the mtime column - * @method CcBlockQuery orderByDbUtime($order = Criteria::ASC) Order by the utime column - * @method CcBlockQuery orderByDbCreatorId($order = Criteria::ASC) Order by the creator_id column - * @method CcBlockQuery orderByDbDescription($order = Criteria::ASC) Order by the description column - * @method CcBlockQuery orderByDbLength($order = Criteria::ASC) Order by the length column - * @method CcBlockQuery orderByDbType($order = Criteria::ASC) Order by the type column * - * @method CcBlockQuery groupByDbId() Group by the id column - * @method CcBlockQuery groupByDbName() Group by the name column - * @method CcBlockQuery groupByDbMtime() Group by the mtime column - * @method CcBlockQuery groupByDbUtime() Group by the utime column - * @method CcBlockQuery groupByDbCreatorId() Group by the creator_id column - * @method CcBlockQuery groupByDbDescription() Group by the description column - * @method CcBlockQuery groupByDbLength() Group by the length column - * @method CcBlockQuery groupByDbType() Group by the type column + * @method CcBlockQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcBlockQuery orderByDbName($order = Criteria::ASC) Order by the name column + * @method CcBlockQuery orderByDbMtime($order = Criteria::ASC) Order by the mtime column + * @method CcBlockQuery orderByDbUtime($order = Criteria::ASC) Order by the utime column + * @method CcBlockQuery orderByDbCreatorId($order = Criteria::ASC) Order by the creator_id column + * @method CcBlockQuery orderByDbDescription($order = Criteria::ASC) Order by the description column + * @method CcBlockQuery orderByDbLength($order = Criteria::ASC) Order by the length column + * @method CcBlockQuery orderByDbType($order = Criteria::ASC) Order by the type column * - * @method CcBlockQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcBlockQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcBlockQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcBlockQuery groupByDbId() Group by the id column + * @method CcBlockQuery groupByDbName() Group by the name column + * @method CcBlockQuery groupByDbMtime() Group by the mtime column + * @method CcBlockQuery groupByDbUtime() Group by the utime column + * @method CcBlockQuery groupByDbCreatorId() Group by the creator_id column + * @method CcBlockQuery groupByDbDescription() Group by the description column + * @method CcBlockQuery groupByDbLength() Group by the length column + * @method CcBlockQuery groupByDbType() Group by the type column * - * @method CcBlockQuery leftJoinCcSubjs($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSubjs relation - * @method CcBlockQuery rightJoinCcSubjs($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSubjs relation - * @method CcBlockQuery innerJoinCcSubjs($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSubjs relation + * @method CcBlockQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcBlockQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcBlockQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcBlockQuery leftJoinCcPlaylistcontents($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcPlaylistcontents relation - * @method CcBlockQuery rightJoinCcPlaylistcontents($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcPlaylistcontents relation - * @method CcBlockQuery innerJoinCcPlaylistcontents($relationAlias = '') Adds a INNER JOIN clause to the query using the CcPlaylistcontents relation + * @method CcBlockQuery leftJoinCcSubjs($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSubjs relation + * @method CcBlockQuery rightJoinCcSubjs($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSubjs relation + * @method CcBlockQuery innerJoinCcSubjs($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSubjs relation * - * @method CcBlockQuery leftJoinCcBlockcontents($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcBlockcontents relation - * @method CcBlockQuery rightJoinCcBlockcontents($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcBlockcontents relation - * @method CcBlockQuery innerJoinCcBlockcontents($relationAlias = '') Adds a INNER JOIN clause to the query using the CcBlockcontents relation + * @method CcBlockQuery leftJoinCcPlaylistcontents($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPlaylistcontents relation + * @method CcBlockQuery rightJoinCcPlaylistcontents($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlaylistcontents relation + * @method CcBlockQuery innerJoinCcPlaylistcontents($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlaylistcontents relation * - * @method CcBlockQuery leftJoinCcBlockcriteria($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcBlockcriteria relation - * @method CcBlockQuery rightJoinCcBlockcriteria($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcBlockcriteria relation - * @method CcBlockQuery innerJoinCcBlockcriteria($relationAlias = '') Adds a INNER JOIN clause to the query using the CcBlockcriteria relation + * @method CcBlockQuery leftJoinCcBlockcontents($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcBlockcontents relation + * @method CcBlockQuery rightJoinCcBlockcontents($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcBlockcontents relation + * @method CcBlockQuery innerJoinCcBlockcontents($relationAlias = null) Adds a INNER JOIN clause to the query using the CcBlockcontents relation * - * @method CcBlock findOne(PropelPDO $con = null) Return the first CcBlock matching the query - * @method CcBlock findOneOrCreate(PropelPDO $con = null) Return the first CcBlock matching the query, or a new CcBlock object populated from the query conditions when no match is found + * @method CcBlockQuery leftJoinCcBlockcriteria($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcBlockcriteria relation + * @method CcBlockQuery rightJoinCcBlockcriteria($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcBlockcriteria relation + * @method CcBlockQuery innerJoinCcBlockcriteria($relationAlias = null) Adds a INNER JOIN clause to the query using the CcBlockcriteria relation * - * @method CcBlock findOneByDbId(int $id) Return the first CcBlock filtered by the id column - * @method CcBlock findOneByDbName(string $name) Return the first CcBlock filtered by the name column - * @method CcBlock findOneByDbMtime(string $mtime) Return the first CcBlock filtered by the mtime column - * @method CcBlock findOneByDbUtime(string $utime) Return the first CcBlock filtered by the utime column - * @method CcBlock findOneByDbCreatorId(int $creator_id) Return the first CcBlock filtered by the creator_id column - * @method CcBlock findOneByDbDescription(string $description) Return the first CcBlock filtered by the description column - * @method CcBlock findOneByDbLength(string $length) Return the first CcBlock filtered by the length column - * @method CcBlock findOneByDbType(string $type) Return the first CcBlock filtered by the type column + * @method CcBlock findOne(PropelPDO $con = null) Return the first CcBlock matching the query + * @method CcBlock findOneOrCreate(PropelPDO $con = null) Return the first CcBlock matching the query, or a new CcBlock object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcBlock objects filtered by the id column - * @method array findByDbName(string $name) Return CcBlock objects filtered by the name column - * @method array findByDbMtime(string $mtime) Return CcBlock objects filtered by the mtime column - * @method array findByDbUtime(string $utime) Return CcBlock objects filtered by the utime column - * @method array findByDbCreatorId(int $creator_id) Return CcBlock objects filtered by the creator_id column - * @method array findByDbDescription(string $description) Return CcBlock objects filtered by the description column - * @method array findByDbLength(string $length) Return CcBlock objects filtered by the length column - * @method array findByDbType(string $type) Return CcBlock objects filtered by the type column + * @method CcBlock findOneByDbName(string $name) Return the first CcBlock filtered by the name column + * @method CcBlock findOneByDbMtime(string $mtime) Return the first CcBlock filtered by the mtime column + * @method CcBlock findOneByDbUtime(string $utime) Return the first CcBlock filtered by the utime column + * @method CcBlock findOneByDbCreatorId(int $creator_id) Return the first CcBlock filtered by the creator_id column + * @method CcBlock findOneByDbDescription(string $description) Return the first CcBlock filtered by the description column + * @method CcBlock findOneByDbLength(string $length) Return the first CcBlock filtered by the length column + * @method CcBlock findOneByDbType(string $type) Return the first CcBlock filtered by the type column + * + * @method array findByDbId(int $id) Return CcBlock objects filtered by the id column + * @method array findByDbName(string $name) Return CcBlock objects filtered by the name column + * @method array findByDbMtime(string $mtime) Return CcBlock objects filtered by the mtime column + * @method array findByDbUtime(string $utime) Return CcBlock objects filtered by the utime column + * @method array findByDbCreatorId(int $creator_id) Return CcBlock objects filtered by the creator_id column + * @method array findByDbDescription(string $description) Return CcBlock objects filtered by the description column + * @method array findByDbLength(string $length) Return CcBlock objects filtered by the length column + * @method array findByDbType(string $type) Return CcBlock objects filtered by the type column * * @package propel.generator.airtime.om */ abstract class BaseCcBlockQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcBlockQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcBlock'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcBlockQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcBlockQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcBlockQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcBlockQuery) { + return $criteria; + } + $query = new CcBlockQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcBlock|CcBlock[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcBlockPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcBlockPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcBlock A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcBlock A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "name", "mtime", "utime", "creator_id", "description", "length", "type" FROM "cc_block" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcBlock(); + $obj->hydrate($row); + CcBlockPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcBlock|CcBlock[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcBlock[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcBlockPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcBlockPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcBlockPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcBlockPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcBlockPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the name column + * + * Example usage: + * + * $query->filterByDbName('fooValue'); // WHERE name = 'fooValue' + * $query->filterByDbName('%fooValue%'); // WHERE name LIKE '%fooValue%' + * + * + * @param string $dbName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function filterByDbName($dbName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbName)) { + $dbName = str_replace('*', '%', $dbName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcBlockPeer::NAME, $dbName, $comparison); + } + + /** + * Filter the query on the mtime column + * + * Example usage: + * + * $query->filterByDbMtime('2011-03-14'); // WHERE mtime = '2011-03-14' + * $query->filterByDbMtime('now'); // WHERE mtime = '2011-03-14' + * $query->filterByDbMtime(array('max' => 'yesterday')); // WHERE mtime < '2011-03-13' + * + * + * @param mixed $dbMtime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function filterByDbMtime($dbMtime = null, $comparison = null) + { + if (is_array($dbMtime)) { + $useMinMax = false; + if (isset($dbMtime['min'])) { + $this->addUsingAlias(CcBlockPeer::MTIME, $dbMtime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbMtime['max'])) { + $this->addUsingAlias(CcBlockPeer::MTIME, $dbMtime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcBlockPeer::MTIME, $dbMtime, $comparison); + } + + /** + * Filter the query on the utime column + * + * Example usage: + * + * $query->filterByDbUtime('2011-03-14'); // WHERE utime = '2011-03-14' + * $query->filterByDbUtime('now'); // WHERE utime = '2011-03-14' + * $query->filterByDbUtime(array('max' => 'yesterday')); // WHERE utime < '2011-03-13' + * + * + * @param mixed $dbUtime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function filterByDbUtime($dbUtime = null, $comparison = null) + { + if (is_array($dbUtime)) { + $useMinMax = false; + if (isset($dbUtime['min'])) { + $this->addUsingAlias(CcBlockPeer::UTIME, $dbUtime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbUtime['max'])) { + $this->addUsingAlias(CcBlockPeer::UTIME, $dbUtime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcBlockPeer::UTIME, $dbUtime, $comparison); + } + + /** + * Filter the query on the creator_id column + * + * Example usage: + * + * $query->filterByDbCreatorId(1234); // WHERE creator_id = 1234 + * $query->filterByDbCreatorId(array(12, 34)); // WHERE creator_id IN (12, 34) + * $query->filterByDbCreatorId(array('min' => 12)); // WHERE creator_id >= 12 + * $query->filterByDbCreatorId(array('max' => 12)); // WHERE creator_id <= 12 + * + * + * @see filterByCcSubjs() + * + * @param mixed $dbCreatorId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function filterByDbCreatorId($dbCreatorId = null, $comparison = null) + { + if (is_array($dbCreatorId)) { + $useMinMax = false; + if (isset($dbCreatorId['min'])) { + $this->addUsingAlias(CcBlockPeer::CREATOR_ID, $dbCreatorId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbCreatorId['max'])) { + $this->addUsingAlias(CcBlockPeer::CREATOR_ID, $dbCreatorId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcBlockPeer::CREATOR_ID, $dbCreatorId, $comparison); + } + + /** + * Filter the query on the description column + * + * Example usage: + * + * $query->filterByDbDescription('fooValue'); // WHERE description = 'fooValue' + * $query->filterByDbDescription('%fooValue%'); // WHERE description LIKE '%fooValue%' + * + * + * @param string $dbDescription The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function filterByDbDescription($dbDescription = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbDescription)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbDescription)) { + $dbDescription = str_replace('*', '%', $dbDescription); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcBlockPeer::DESCRIPTION, $dbDescription, $comparison); + } + + /** + * Filter the query on the length column + * + * Example usage: + * + * $query->filterByDbLength('fooValue'); // WHERE length = 'fooValue' + * $query->filterByDbLength('%fooValue%'); // WHERE length LIKE '%fooValue%' + * + * + * @param string $dbLength The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function filterByDbLength($dbLength = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLength)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLength)) { + $dbLength = str_replace('*', '%', $dbLength); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcBlockPeer::LENGTH, $dbLength, $comparison); + } + + /** + * Filter the query on the type column + * + * Example usage: + * + * $query->filterByDbType('fooValue'); // WHERE type = 'fooValue' + * $query->filterByDbType('%fooValue%'); // WHERE type LIKE '%fooValue%' + * + * + * @param string $dbType The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function filterByDbType($dbType = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbType)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbType)) { + $dbType = str_replace('*', '%', $dbType); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcBlockPeer::TYPE, $dbType, $comparison); + } + + /** + * Filter the query by a related CcSubjs object + * + * @param CcSubjs|PropelObjectCollection $ccSubjs The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSubjs($ccSubjs, $comparison = null) + { + if ($ccSubjs instanceof CcSubjs) { + return $this + ->addUsingAlias(CcBlockPeer::CREATOR_ID, $ccSubjs->getDbId(), $comparison); + } elseif ($ccSubjs instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcBlockPeer::CREATOR_ID, $ccSubjs->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcSubjs() only accepts arguments of type CcSubjs or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSubjs relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function joinCcSubjs($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSubjs'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSubjs'); + } + + return $this; + } + + /** + * Use the CcSubjs relation CcSubjs object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery A secondary query class using the current class as primary query + */ + public function useCcSubjsQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcSubjs($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); + } + + /** + * Filter the query by a related CcPlaylistcontents object + * + * @param CcPlaylistcontents|PropelObjectCollection $ccPlaylistcontents the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcPlaylistcontents($ccPlaylistcontents, $comparison = null) + { + if ($ccPlaylistcontents instanceof CcPlaylistcontents) { + return $this + ->addUsingAlias(CcBlockPeer::ID, $ccPlaylistcontents->getDbBlockId(), $comparison); + } elseif ($ccPlaylistcontents instanceof PropelObjectCollection) { + return $this + ->useCcPlaylistcontentsQuery() + ->filterByPrimaryKeys($ccPlaylistcontents->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcPlaylistcontents() only accepts arguments of type CcPlaylistcontents or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcPlaylistcontents relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function joinCcPlaylistcontents($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcPlaylistcontents'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcPlaylistcontents'); + } + + return $this; + } + + /** + * Use the CcPlaylistcontents relation CcPlaylistcontents object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlaylistcontentsQuery A secondary query class using the current class as primary query + */ + public function useCcPlaylistcontentsQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcPlaylistcontents($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcPlaylistcontents', 'CcPlaylistcontentsQuery'); + } + + /** + * Filter the query by a related CcBlockcontents object + * + * @param CcBlockcontents|PropelObjectCollection $ccBlockcontents the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcBlockcontents($ccBlockcontents, $comparison = null) + { + if ($ccBlockcontents instanceof CcBlockcontents) { + return $this + ->addUsingAlias(CcBlockPeer::ID, $ccBlockcontents->getDbBlockId(), $comparison); + } elseif ($ccBlockcontents instanceof PropelObjectCollection) { + return $this + ->useCcBlockcontentsQuery() + ->filterByPrimaryKeys($ccBlockcontents->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcBlockcontents() only accepts arguments of type CcBlockcontents or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcBlockcontents relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function joinCcBlockcontents($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcBlockcontents'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcBlockcontents'); + } + + return $this; + } + + /** + * Use the CcBlockcontents relation CcBlockcontents object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockcontentsQuery A secondary query class using the current class as primary query + */ + public function useCcBlockcontentsQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcBlockcontents($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcBlockcontents', 'CcBlockcontentsQuery'); + } + + /** + * Filter the query by a related CcBlockcriteria object + * + * @param CcBlockcriteria|PropelObjectCollection $ccBlockcriteria the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcBlockcriteria($ccBlockcriteria, $comparison = null) + { + if ($ccBlockcriteria instanceof CcBlockcriteria) { + return $this + ->addUsingAlias(CcBlockPeer::ID, $ccBlockcriteria->getDbBlockId(), $comparison); + } elseif ($ccBlockcriteria instanceof PropelObjectCollection) { + return $this + ->useCcBlockcriteriaQuery() + ->filterByPrimaryKeys($ccBlockcriteria->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcBlockcriteria() only accepts arguments of type CcBlockcriteria or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcBlockcriteria relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function joinCcBlockcriteria($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcBlockcriteria'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcBlockcriteria'); + } + + return $this; + } + + /** + * Use the CcBlockcriteria relation CcBlockcriteria object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockcriteriaQuery A secondary query class using the current class as primary query + */ + public function useCcBlockcriteriaQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcBlockcriteria($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcBlockcriteria', 'CcBlockcriteriaQuery'); + } + + /** + * Exclude object from result + * + * @param CcBlock $ccBlock Object to remove from the list of results + * + * @return CcBlockQuery The current query, for fluid interface + */ + public function prune($ccBlock = null) + { + if ($ccBlock) { + $this->addUsingAlias(CcBlockPeer::ID, $ccBlock->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcBlockQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcBlock', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcBlockQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcBlockQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcBlockQuery) { - return $criteria; - } - $query = new CcBlockQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcBlock|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcBlockPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcBlockPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcBlockPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcBlockPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the name column - * - * @param string $dbName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByDbName($dbName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbName)) { - $dbName = str_replace('*', '%', $dbName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcBlockPeer::NAME, $dbName, $comparison); - } - - /** - * Filter the query on the mtime column - * - * @param string|array $dbMtime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByDbMtime($dbMtime = null, $comparison = null) - { - if (is_array($dbMtime)) { - $useMinMax = false; - if (isset($dbMtime['min'])) { - $this->addUsingAlias(CcBlockPeer::MTIME, $dbMtime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbMtime['max'])) { - $this->addUsingAlias(CcBlockPeer::MTIME, $dbMtime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcBlockPeer::MTIME, $dbMtime, $comparison); - } - - /** - * Filter the query on the utime column - * - * @param string|array $dbUtime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByDbUtime($dbUtime = null, $comparison = null) - { - if (is_array($dbUtime)) { - $useMinMax = false; - if (isset($dbUtime['min'])) { - $this->addUsingAlias(CcBlockPeer::UTIME, $dbUtime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbUtime['max'])) { - $this->addUsingAlias(CcBlockPeer::UTIME, $dbUtime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcBlockPeer::UTIME, $dbUtime, $comparison); - } - - /** - * Filter the query on the creator_id column - * - * @param int|array $dbCreatorId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByDbCreatorId($dbCreatorId = null, $comparison = null) - { - if (is_array($dbCreatorId)) { - $useMinMax = false; - if (isset($dbCreatorId['min'])) { - $this->addUsingAlias(CcBlockPeer::CREATOR_ID, $dbCreatorId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbCreatorId['max'])) { - $this->addUsingAlias(CcBlockPeer::CREATOR_ID, $dbCreatorId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcBlockPeer::CREATOR_ID, $dbCreatorId, $comparison); - } - - /** - * Filter the query on the description column - * - * @param string $dbDescription The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByDbDescription($dbDescription = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbDescription)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbDescription)) { - $dbDescription = str_replace('*', '%', $dbDescription); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcBlockPeer::DESCRIPTION, $dbDescription, $comparison); - } - - /** - * Filter the query on the length column - * - * @param string $dbLength The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByDbLength($dbLength = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLength)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLength)) { - $dbLength = str_replace('*', '%', $dbLength); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcBlockPeer::LENGTH, $dbLength, $comparison); - } - - /** - * Filter the query on the type column - * - * @param string $dbType The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByDbType($dbType = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbType)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbType)) { - $dbType = str_replace('*', '%', $dbType); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcBlockPeer::TYPE, $dbType, $comparison); - } - - /** - * Filter the query by a related CcSubjs object - * - * @param CcSubjs $ccSubjs the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByCcSubjs($ccSubjs, $comparison = null) - { - return $this - ->addUsingAlias(CcBlockPeer::CREATOR_ID, $ccSubjs->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSubjs relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function joinCcSubjs($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSubjs'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSubjs'); - } - - return $this; - } - - /** - * Use the CcSubjs relation CcSubjs object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery A secondary query class using the current class as primary query - */ - public function useCcSubjsQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcSubjs($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); - } - - /** - * Filter the query by a related CcPlaylistcontents object - * - * @param CcPlaylistcontents $ccPlaylistcontents the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByCcPlaylistcontents($ccPlaylistcontents, $comparison = null) - { - return $this - ->addUsingAlias(CcBlockPeer::ID, $ccPlaylistcontents->getDbBlockId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcPlaylistcontents relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function joinCcPlaylistcontents($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcPlaylistcontents'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcPlaylistcontents'); - } - - return $this; - } - - /** - * Use the CcPlaylistcontents relation CcPlaylistcontents object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlaylistcontentsQuery A secondary query class using the current class as primary query - */ - public function useCcPlaylistcontentsQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcPlaylistcontents($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcPlaylistcontents', 'CcPlaylistcontentsQuery'); - } - - /** - * Filter the query by a related CcBlockcontents object - * - * @param CcBlockcontents $ccBlockcontents the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByCcBlockcontents($ccBlockcontents, $comparison = null) - { - return $this - ->addUsingAlias(CcBlockPeer::ID, $ccBlockcontents->getDbBlockId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcBlockcontents relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function joinCcBlockcontents($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcBlockcontents'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcBlockcontents'); - } - - return $this; - } - - /** - * Use the CcBlockcontents relation CcBlockcontents object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockcontentsQuery A secondary query class using the current class as primary query - */ - public function useCcBlockcontentsQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcBlockcontents($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcBlockcontents', 'CcBlockcontentsQuery'); - } - - /** - * Filter the query by a related CcBlockcriteria object - * - * @param CcBlockcriteria $ccBlockcriteria the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function filterByCcBlockcriteria($ccBlockcriteria, $comparison = null) - { - return $this - ->addUsingAlias(CcBlockPeer::ID, $ccBlockcriteria->getDbBlockId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcBlockcriteria relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function joinCcBlockcriteria($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcBlockcriteria'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcBlockcriteria'); - } - - return $this; - } - - /** - * Use the CcBlockcriteria relation CcBlockcriteria object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockcriteriaQuery A secondary query class using the current class as primary query - */ - public function useCcBlockcriteriaQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcBlockcriteria($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcBlockcriteria', 'CcBlockcriteriaQuery'); - } - - /** - * Exclude object from result - * - * @param CcBlock $ccBlock Object to remove from the list of results - * - * @return CcBlockQuery The current query, for fluid interface - */ - public function prune($ccBlock = null) - { - if ($ccBlock) { - $this->addUsingAlias(CcBlockPeer::ID, $ccBlock->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcBlockQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcBlockcontents.php b/airtime_mvc/application/models/airtime/om/BaseCcBlockcontents.php index f2e6fb6d10..ec32bc9c82 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcBlockcontents.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcBlockcontents.php @@ -4,1459 +4,1611 @@ /** * Base class that represents a row from the 'cc_blockcontents' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcBlockcontents extends BaseObject implements Persistent +abstract class BaseCcBlockcontents extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcBlockcontentsPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcBlockcontentsPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the block_id field. - * @var int - */ - protected $block_id; - - /** - * The value for the file_id field. - * @var int - */ - protected $file_id; - - /** - * The value for the position field. - * @var int - */ - protected $position; - - /** - * The value for the trackoffset field. - * Note: this column has a database default value of: 0 - * @var double - */ - protected $trackoffset; - - /** - * The value for the cliplength field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $cliplength; - - /** - * The value for the cuein field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $cuein; - - /** - * The value for the cueout field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $cueout; - - /** - * The value for the fadein field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $fadein; - - /** - * The value for the fadeout field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $fadeout; - - /** - * @var CcFiles - */ - protected $aCcFiles; - - /** - * @var CcBlock - */ - protected $aCcBlock; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - // aggregate_column_relation behavior - protected $oldCcBlock; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->trackoffset = 0; - $this->cliplength = '00:00:00'; - $this->cuein = '00:00:00'; - $this->cueout = '00:00:00'; - $this->fadein = '00:00:00'; - $this->fadeout = '00:00:00'; - } - - /** - * Initializes internal state of BaseCcBlockcontents object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [block_id] column value. - * - * @return int - */ - public function getDbBlockId() - { - return $this->block_id; - } - - /** - * Get the [file_id] column value. - * - * @return int - */ - public function getDbFileId() - { - return $this->file_id; - } - - /** - * Get the [position] column value. - * - * @return int - */ - public function getDbPosition() - { - return $this->position; - } - - /** - * Get the [trackoffset] column value. - * - * @return double - */ - public function getDbTrackOffset() - { - return $this->trackoffset; - } - - /** - * Get the [cliplength] column value. - * - * @return string - */ - public function getDbCliplength() - { - return $this->cliplength; - } - - /** - * Get the [cuein] column value. - * - * @return string - */ - public function getDbCuein() - { - return $this->cuein; - } - - /** - * Get the [cueout] column value. - * - * @return string - */ - public function getDbCueout() - { - return $this->cueout; - } - - /** - * Get the [optionally formatted] temporal [fadein] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbFadein($format = '%X') - { - if ($this->fadein === null) { - return null; - } - - - - try { - $dt = new DateTime($this->fadein); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->fadein, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [fadeout] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbFadeout($format = '%X') - { - if ($this->fadeout === null) { - return null; - } - - - - try { - $dt = new DateTime($this->fadeout); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->fadeout, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcBlockcontents The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcBlockcontentsPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [block_id] column. - * - * @param int $v new value - * @return CcBlockcontents The current object (for fluent API support) - */ - public function setDbBlockId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->block_id !== $v) { - $this->block_id = $v; - $this->modifiedColumns[] = CcBlockcontentsPeer::BLOCK_ID; - } - - if ($this->aCcBlock !== null && $this->aCcBlock->getDbId() !== $v) { - $this->aCcBlock = null; - } - - return $this; - } // setDbBlockId() - - /** - * Set the value of [file_id] column. - * - * @param int $v new value - * @return CcBlockcontents The current object (for fluent API support) - */ - public function setDbFileId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->file_id !== $v) { - $this->file_id = $v; - $this->modifiedColumns[] = CcBlockcontentsPeer::FILE_ID; - } - - if ($this->aCcFiles !== null && $this->aCcFiles->getDbId() !== $v) { - $this->aCcFiles = null; - } - - return $this; - } // setDbFileId() - - /** - * Set the value of [position] column. - * - * @param int $v new value - * @return CcBlockcontents The current object (for fluent API support) - */ - public function setDbPosition($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->position !== $v) { - $this->position = $v; - $this->modifiedColumns[] = CcBlockcontentsPeer::POSITION; - } - - return $this; - } // setDbPosition() - - /** - * Set the value of [trackoffset] column. - * - * @param double $v new value - * @return CcBlockcontents The current object (for fluent API support) - */ - public function setDbTrackOffset($v) - { - if ($v !== null) { - $v = (double) $v; - } - - if ($this->trackoffset !== $v || $this->isNew()) { - $this->trackoffset = $v; - $this->modifiedColumns[] = CcBlockcontentsPeer::TRACKOFFSET; - } - - return $this; - } // setDbTrackOffset() - - /** - * Set the value of [cliplength] column. - * - * @param string $v new value - * @return CcBlockcontents The current object (for fluent API support) - */ - public function setDbCliplength($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->cliplength !== $v || $this->isNew()) { - $this->cliplength = $v; - $this->modifiedColumns[] = CcBlockcontentsPeer::CLIPLENGTH; - } - - return $this; - } // setDbCliplength() - - /** - * Set the value of [cuein] column. - * - * @param string $v new value - * @return CcBlockcontents The current object (for fluent API support) - */ - public function setDbCuein($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->cuein !== $v || $this->isNew()) { - $this->cuein = $v; - $this->modifiedColumns[] = CcBlockcontentsPeer::CUEIN; - } - - return $this; - } // setDbCuein() - - /** - * Set the value of [cueout] column. - * - * @param string $v new value - * @return CcBlockcontents The current object (for fluent API support) - */ - public function setDbCueout($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->cueout !== $v || $this->isNew()) { - $this->cueout = $v; - $this->modifiedColumns[] = CcBlockcontentsPeer::CUEOUT; - } - - return $this; - } // setDbCueout() - - /** - * Sets the value of [fadein] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcBlockcontents The current object (for fluent API support) - */ - public function setDbFadein($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->fadein !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->fadein !== null && $tmpDt = new DateTime($this->fadein)) ? $tmpDt->format('H:i:s') : null; - $newNorm = ($dt !== null) ? $dt->format('H:i:s') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - || ($dt->format('H:i:s') === '00:00:00') // or the entered value matches the default - ) - { - $this->fadein = ($dt ? $dt->format('H:i:s') : null); - $this->modifiedColumns[] = CcBlockcontentsPeer::FADEIN; - } - } // if either are not null - - return $this; - } // setDbFadein() - - /** - * Sets the value of [fadeout] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcBlockcontents The current object (for fluent API support) - */ - public function setDbFadeout($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->fadeout !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->fadeout !== null && $tmpDt = new DateTime($this->fadeout)) ? $tmpDt->format('H:i:s') : null; - $newNorm = ($dt !== null) ? $dt->format('H:i:s') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - || ($dt->format('H:i:s') === '00:00:00') // or the entered value matches the default - ) - { - $this->fadeout = ($dt ? $dt->format('H:i:s') : null); - $this->modifiedColumns[] = CcBlockcontentsPeer::FADEOUT; - } - } // if either are not null - - return $this; - } // setDbFadeout() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->trackoffset !== 0) { - return false; - } - - if ($this->cliplength !== '00:00:00') { - return false; - } - - if ($this->cuein !== '00:00:00') { - return false; - } - - if ($this->cueout !== '00:00:00') { - return false; - } - - if ($this->fadein !== '00:00:00') { - return false; - } - - if ($this->fadeout !== '00:00:00') { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->block_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->file_id = ($row[$startcol + 2] !== null) ? (int) $row[$startcol + 2] : null; - $this->position = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; - $this->trackoffset = ($row[$startcol + 4] !== null) ? (double) $row[$startcol + 4] : null; - $this->cliplength = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; - $this->cuein = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; - $this->cueout = ($row[$startcol + 7] !== null) ? (string) $row[$startcol + 7] : null; - $this->fadein = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; - $this->fadeout = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 10; // 10 = CcBlockcontentsPeer::NUM_COLUMNS - CcBlockcontentsPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcBlockcontents object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcBlock !== null && $this->block_id !== $this->aCcBlock->getDbId()) { - $this->aCcBlock = null; - } - if ($this->aCcFiles !== null && $this->file_id !== $this->aCcFiles->getDbId()) { - $this->aCcFiles = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcBlockcontentsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcFiles = null; - $this->aCcBlock = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcBlockcontentsQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - // aggregate_column_relation behavior - $this->updateRelatedCcBlock($con); - CcBlockcontentsPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcFiles !== null) { - if ($this->aCcFiles->isModified() || $this->aCcFiles->isNew()) { - $affectedRows += $this->aCcFiles->save($con); - } - $this->setCcFiles($this->aCcFiles); - } - - if ($this->aCcBlock !== null) { - if ($this->aCcBlock->isModified() || $this->aCcBlock->isNew()) { - $affectedRows += $this->aCcBlock->save($con); - } - $this->setCcBlock($this->aCcBlock); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcBlockcontentsPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcBlockcontentsPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcBlockcontentsPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcBlockcontentsPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcFiles !== null) { - if (!$this->aCcFiles->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcFiles->getValidationFailures()); - } - } - - if ($this->aCcBlock !== null) { - if (!$this->aCcBlock->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcBlock->getValidationFailures()); - } - } - - - if (($retval = CcBlockcontentsPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcBlockcontentsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbBlockId(); - break; - case 2: - return $this->getDbFileId(); - break; - case 3: - return $this->getDbPosition(); - break; - case 4: - return $this->getDbTrackOffset(); - break; - case 5: - return $this->getDbCliplength(); - break; - case 6: - return $this->getDbCuein(); - break; - case 7: - return $this->getDbCueout(); - break; - case 8: - return $this->getDbFadein(); - break; - case 9: - return $this->getDbFadeout(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcBlockcontentsPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbBlockId(), - $keys[2] => $this->getDbFileId(), - $keys[3] => $this->getDbPosition(), - $keys[4] => $this->getDbTrackOffset(), - $keys[5] => $this->getDbCliplength(), - $keys[6] => $this->getDbCuein(), - $keys[7] => $this->getDbCueout(), - $keys[8] => $this->getDbFadein(), - $keys[9] => $this->getDbFadeout(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcFiles) { - $result['CcFiles'] = $this->aCcFiles->toArray($keyType, $includeLazyLoadColumns, true); - } - if (null !== $this->aCcBlock) { - $result['CcBlock'] = $this->aCcBlock->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcBlockcontentsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbBlockId($value); - break; - case 2: - $this->setDbFileId($value); - break; - case 3: - $this->setDbPosition($value); - break; - case 4: - $this->setDbTrackOffset($value); - break; - case 5: - $this->setDbCliplength($value); - break; - case 6: - $this->setDbCuein($value); - break; - case 7: - $this->setDbCueout($value); - break; - case 8: - $this->setDbFadein($value); - break; - case 9: - $this->setDbFadeout($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcBlockcontentsPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbBlockId($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbFileId($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbPosition($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbTrackOffset($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setDbCliplength($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setDbCuein($arr[$keys[6]]); - if (array_key_exists($keys[7], $arr)) $this->setDbCueout($arr[$keys[7]]); - if (array_key_exists($keys[8], $arr)) $this->setDbFadein($arr[$keys[8]]); - if (array_key_exists($keys[9], $arr)) $this->setDbFadeout($arr[$keys[9]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcBlockcontentsPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcBlockcontentsPeer::ID)) $criteria->add(CcBlockcontentsPeer::ID, $this->id); - if ($this->isColumnModified(CcBlockcontentsPeer::BLOCK_ID)) $criteria->add(CcBlockcontentsPeer::BLOCK_ID, $this->block_id); - if ($this->isColumnModified(CcBlockcontentsPeer::FILE_ID)) $criteria->add(CcBlockcontentsPeer::FILE_ID, $this->file_id); - if ($this->isColumnModified(CcBlockcontentsPeer::POSITION)) $criteria->add(CcBlockcontentsPeer::POSITION, $this->position); - if ($this->isColumnModified(CcBlockcontentsPeer::TRACKOFFSET)) $criteria->add(CcBlockcontentsPeer::TRACKOFFSET, $this->trackoffset); - if ($this->isColumnModified(CcBlockcontentsPeer::CLIPLENGTH)) $criteria->add(CcBlockcontentsPeer::CLIPLENGTH, $this->cliplength); - if ($this->isColumnModified(CcBlockcontentsPeer::CUEIN)) $criteria->add(CcBlockcontentsPeer::CUEIN, $this->cuein); - if ($this->isColumnModified(CcBlockcontentsPeer::CUEOUT)) $criteria->add(CcBlockcontentsPeer::CUEOUT, $this->cueout); - if ($this->isColumnModified(CcBlockcontentsPeer::FADEIN)) $criteria->add(CcBlockcontentsPeer::FADEIN, $this->fadein); - if ($this->isColumnModified(CcBlockcontentsPeer::FADEOUT)) $criteria->add(CcBlockcontentsPeer::FADEOUT, $this->fadeout); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcBlockcontentsPeer::DATABASE_NAME); - $criteria->add(CcBlockcontentsPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcBlockcontents (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbBlockId($this->block_id); - $copyObj->setDbFileId($this->file_id); - $copyObj->setDbPosition($this->position); - $copyObj->setDbTrackOffset($this->trackoffset); - $copyObj->setDbCliplength($this->cliplength); - $copyObj->setDbCuein($this->cuein); - $copyObj->setDbCueout($this->cueout); - $copyObj->setDbFadein($this->fadein); - $copyObj->setDbFadeout($this->fadeout); - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcBlockcontents Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcBlockcontentsPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcBlockcontentsPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcFiles object. - * - * @param CcFiles $v - * @return CcBlockcontents The current object (for fluent API support) - * @throws PropelException - */ - public function setCcFiles(CcFiles $v = null) - { - if ($v === null) { - $this->setDbFileId(NULL); - } else { - $this->setDbFileId($v->getDbId()); - } - - $this->aCcFiles = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcFiles object, it will not be re-added. - if ($v !== null) { - $v->addCcBlockcontents($this); - } - - return $this; - } - - - /** - * Get the associated CcFiles object - * - * @param PropelPDO Optional Connection object. - * @return CcFiles The associated CcFiles object. - * @throws PropelException - */ - public function getCcFiles(PropelPDO $con = null) - { - if ($this->aCcFiles === null && ($this->file_id !== null)) { - $this->aCcFiles = CcFilesQuery::create()->findPk($this->file_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcFiles->addCcBlockcontentss($this); - */ - } - return $this->aCcFiles; - } - - /** - * Declares an association between this object and a CcBlock object. - * - * @param CcBlock $v - * @return CcBlockcontents The current object (for fluent API support) - * @throws PropelException - */ - public function setCcBlock(CcBlock $v = null) - { - // aggregate_column_relation behavior - if (null !== $this->aCcBlock && $v !== $this->aCcBlock) { - $this->oldCcBlock = $this->aCcBlock; - } - if ($v === null) { - $this->setDbBlockId(NULL); - } else { - $this->setDbBlockId($v->getDbId()); - } - - $this->aCcBlock = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcBlock object, it will not be re-added. - if ($v !== null) { - $v->addCcBlockcontents($this); - } - - return $this; - } - - - /** - * Get the associated CcBlock object - * - * @param PropelPDO Optional Connection object. - * @return CcBlock The associated CcBlock object. - * @throws PropelException - */ - public function getCcBlock(PropelPDO $con = null) - { - if ($this->aCcBlock === null && ($this->block_id !== null)) { - $this->aCcBlock = CcBlockQuery::create()->findPk($this->block_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcBlock->addCcBlockcontentss($this); - */ - } - return $this->aCcBlock; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->block_id = null; - $this->file_id = null; - $this->position = null; - $this->trackoffset = null; - $this->cliplength = null; - $this->cuein = null; - $this->cueout = null; - $this->fadein = null; - $this->fadeout = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcFiles = null; - $this->aCcBlock = null; - } - - // aggregate_column_relation behavior - - /** - * Update the aggregate column in the related CcBlock object - * - * @param PropelPDO $con A connection object - */ - protected function updateRelatedCcBlock(PropelPDO $con) - { - if ($ccBlock = $this->getCcBlock()) { - $ccBlock->updateDbLength($con); - } - if ($this->oldCcBlock) { - $this->oldCcBlock->updateDbLength($con); - $this->oldCcBlock = null; - } - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcBlockcontents + /** + * Peer class name + */ + const PEER = 'CcBlockcontentsPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcBlockcontentsPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the block_id field. + * @var int + */ + protected $block_id; + + /** + * The value for the file_id field. + * @var int + */ + protected $file_id; + + /** + * The value for the position field. + * @var int + */ + protected $position; + + /** + * The value for the trackoffset field. + * Note: this column has a database default value of: 0 + * @var double + */ + protected $trackoffset; + + /** + * The value for the cliplength field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $cliplength; + + /** + * The value for the cuein field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $cuein; + + /** + * The value for the cueout field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $cueout; + + /** + * The value for the fadein field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $fadein; + + /** + * The value for the fadeout field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $fadeout; + + /** + * @var CcFiles + */ + protected $aCcFiles; + + /** + * @var CcBlock + */ + protected $aCcBlock; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + // aggregate_column_relation behavior + protected $oldCcBlock; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->trackoffset = 0; + $this->cliplength = '00:00:00'; + $this->cuein = '00:00:00'; + $this->cueout = '00:00:00'; + $this->fadein = '00:00:00'; + $this->fadeout = '00:00:00'; + } + + /** + * Initializes internal state of BaseCcBlockcontents object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [block_id] column value. + * + * @return int + */ + public function getDbBlockId() + { + + return $this->block_id; + } + + /** + * Get the [file_id] column value. + * + * @return int + */ + public function getDbFileId() + { + + return $this->file_id; + } + + /** + * Get the [position] column value. + * + * @return int + */ + public function getDbPosition() + { + + return $this->position; + } + + /** + * Get the [trackoffset] column value. + * + * @return double + */ + public function getDbTrackOffset() + { + + return $this->trackoffset; + } + + /** + * Get the [cliplength] column value. + * + * @return string + */ + public function getDbCliplength() + { + + return $this->cliplength; + } + + /** + * Get the [cuein] column value. + * + * @return string + */ + public function getDbCuein() + { + + return $this->cuein; + } + + /** + * Get the [cueout] column value. + * + * @return string + */ + public function getDbCueout() + { + + return $this->cueout; + } + + /** + * Get the [optionally formatted] temporal [fadein] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbFadein($format = '%X') + { + if ($this->fadein === null) { + return null; + } + + + try { + $dt = new DateTime($this->fadein); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->fadein, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [fadeout] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbFadeout($format = '%X') + { + if ($this->fadeout === null) { + return null; + } + + + try { + $dt = new DateTime($this->fadeout); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->fadeout, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcBlockcontents The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcBlockcontentsPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [block_id] column. + * + * @param int $v new value + * @return CcBlockcontents The current object (for fluent API support) + */ + public function setDbBlockId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->block_id !== $v) { + $this->block_id = $v; + $this->modifiedColumns[] = CcBlockcontentsPeer::BLOCK_ID; + } + + if ($this->aCcBlock !== null && $this->aCcBlock->getDbId() !== $v) { + $this->aCcBlock = null; + } + + + return $this; + } // setDbBlockId() + + /** + * Set the value of [file_id] column. + * + * @param int $v new value + * @return CcBlockcontents The current object (for fluent API support) + */ + public function setDbFileId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->file_id !== $v) { + $this->file_id = $v; + $this->modifiedColumns[] = CcBlockcontentsPeer::FILE_ID; + } + + if ($this->aCcFiles !== null && $this->aCcFiles->getDbId() !== $v) { + $this->aCcFiles = null; + } + + + return $this; + } // setDbFileId() + + /** + * Set the value of [position] column. + * + * @param int $v new value + * @return CcBlockcontents The current object (for fluent API support) + */ + public function setDbPosition($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->position !== $v) { + $this->position = $v; + $this->modifiedColumns[] = CcBlockcontentsPeer::POSITION; + } + + + return $this; + } // setDbPosition() + + /** + * Set the value of [trackoffset] column. + * + * @param double $v new value + * @return CcBlockcontents The current object (for fluent API support) + */ + public function setDbTrackOffset($v) + { + if ($v !== null && is_numeric($v)) { + $v = (double) $v; + } + + if ($this->trackoffset !== $v) { + $this->trackoffset = $v; + $this->modifiedColumns[] = CcBlockcontentsPeer::TRACKOFFSET; + } + + + return $this; + } // setDbTrackOffset() + + /** + * Set the value of [cliplength] column. + * + * @param string $v new value + * @return CcBlockcontents The current object (for fluent API support) + */ + public function setDbCliplength($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->cliplength !== $v) { + $this->cliplength = $v; + $this->modifiedColumns[] = CcBlockcontentsPeer::CLIPLENGTH; + } + + + return $this; + } // setDbCliplength() + + /** + * Set the value of [cuein] column. + * + * @param string $v new value + * @return CcBlockcontents The current object (for fluent API support) + */ + public function setDbCuein($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->cuein !== $v) { + $this->cuein = $v; + $this->modifiedColumns[] = CcBlockcontentsPeer::CUEIN; + } + + + return $this; + } // setDbCuein() + + /** + * Set the value of [cueout] column. + * + * @param string $v new value + * @return CcBlockcontents The current object (for fluent API support) + */ + public function setDbCueout($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->cueout !== $v) { + $this->cueout = $v; + $this->modifiedColumns[] = CcBlockcontentsPeer::CUEOUT; + } + + + return $this; + } // setDbCueout() + + /** + * Sets the value of [fadein] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcBlockcontents The current object (for fluent API support) + */ + public function setDbFadein($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->fadein !== null || $dt !== null) { + $currentDateAsString = ($this->fadein !== null && $tmpDt = new DateTime($this->fadein)) ? $tmpDt->format('H:i:s') : null; + $newDateAsString = $dt ? $dt->format('H:i:s') : null; + if ( ($currentDateAsString !== $newDateAsString) // normalized values don't match + || ($dt->format('H:i:s') === '00:00:00') // or the entered value matches the default + ) { + $this->fadein = $newDateAsString; + $this->modifiedColumns[] = CcBlockcontentsPeer::FADEIN; + } + } // if either are not null + + + return $this; + } // setDbFadein() + + /** + * Sets the value of [fadeout] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcBlockcontents The current object (for fluent API support) + */ + public function setDbFadeout($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->fadeout !== null || $dt !== null) { + $currentDateAsString = ($this->fadeout !== null && $tmpDt = new DateTime($this->fadeout)) ? $tmpDt->format('H:i:s') : null; + $newDateAsString = $dt ? $dt->format('H:i:s') : null; + if ( ($currentDateAsString !== $newDateAsString) // normalized values don't match + || ($dt->format('H:i:s') === '00:00:00') // or the entered value matches the default + ) { + $this->fadeout = $newDateAsString; + $this->modifiedColumns[] = CcBlockcontentsPeer::FADEOUT; + } + } // if either are not null + + + return $this; + } // setDbFadeout() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->trackoffset !== 0) { + return false; + } + + if ($this->cliplength !== '00:00:00') { + return false; + } + + if ($this->cuein !== '00:00:00') { + return false; + } + + if ($this->cueout !== '00:00:00') { + return false; + } + + if ($this->fadein !== '00:00:00') { + return false; + } + + if ($this->fadeout !== '00:00:00') { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->block_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->file_id = ($row[$startcol + 2] !== null) ? (int) $row[$startcol + 2] : null; + $this->position = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; + $this->trackoffset = ($row[$startcol + 4] !== null) ? (double) $row[$startcol + 4] : null; + $this->cliplength = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; + $this->cuein = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; + $this->cueout = ($row[$startcol + 7] !== null) ? (string) $row[$startcol + 7] : null; + $this->fadein = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; + $this->fadeout = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 10; // 10 = CcBlockcontentsPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcBlockcontents object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcBlock !== null && $this->block_id !== $this->aCcBlock->getDbId()) { + $this->aCcBlock = null; + } + if ($this->aCcFiles !== null && $this->file_id !== $this->aCcFiles->getDbId()) { + $this->aCcFiles = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcBlockcontentsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcFiles = null; + $this->aCcBlock = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcBlockcontentsQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + // aggregate_column_relation behavior + $this->updateRelatedCcBlock($con); + CcBlockcontentsPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcFiles !== null) { + if ($this->aCcFiles->isModified() || $this->aCcFiles->isNew()) { + $affectedRows += $this->aCcFiles->save($con); + } + $this->setCcFiles($this->aCcFiles); + } + + if ($this->aCcBlock !== null) { + if ($this->aCcBlock->isModified() || $this->aCcBlock->isNew()) { + $affectedRows += $this->aCcBlock->save($con); + } + $this->setCcBlock($this->aCcBlock); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcBlockcontentsPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcBlockcontentsPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_blockcontents_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcBlockcontentsPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcBlockcontentsPeer::BLOCK_ID)) { + $modifiedColumns[':p' . $index++] = '"block_id"'; + } + if ($this->isColumnModified(CcBlockcontentsPeer::FILE_ID)) { + $modifiedColumns[':p' . $index++] = '"file_id"'; + } + if ($this->isColumnModified(CcBlockcontentsPeer::POSITION)) { + $modifiedColumns[':p' . $index++] = '"position"'; + } + if ($this->isColumnModified(CcBlockcontentsPeer::TRACKOFFSET)) { + $modifiedColumns[':p' . $index++] = '"trackoffset"'; + } + if ($this->isColumnModified(CcBlockcontentsPeer::CLIPLENGTH)) { + $modifiedColumns[':p' . $index++] = '"cliplength"'; + } + if ($this->isColumnModified(CcBlockcontentsPeer::CUEIN)) { + $modifiedColumns[':p' . $index++] = '"cuein"'; + } + if ($this->isColumnModified(CcBlockcontentsPeer::CUEOUT)) { + $modifiedColumns[':p' . $index++] = '"cueout"'; + } + if ($this->isColumnModified(CcBlockcontentsPeer::FADEIN)) { + $modifiedColumns[':p' . $index++] = '"fadein"'; + } + if ($this->isColumnModified(CcBlockcontentsPeer::FADEOUT)) { + $modifiedColumns[':p' . $index++] = '"fadeout"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_blockcontents" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"block_id"': + $stmt->bindValue($identifier, $this->block_id, PDO::PARAM_INT); + break; + case '"file_id"': + $stmt->bindValue($identifier, $this->file_id, PDO::PARAM_INT); + break; + case '"position"': + $stmt->bindValue($identifier, $this->position, PDO::PARAM_INT); + break; + case '"trackoffset"': + $stmt->bindValue($identifier, $this->trackoffset, PDO::PARAM_STR); + break; + case '"cliplength"': + $stmt->bindValue($identifier, $this->cliplength, PDO::PARAM_STR); + break; + case '"cuein"': + $stmt->bindValue($identifier, $this->cuein, PDO::PARAM_STR); + break; + case '"cueout"': + $stmt->bindValue($identifier, $this->cueout, PDO::PARAM_STR); + break; + case '"fadein"': + $stmt->bindValue($identifier, $this->fadein, PDO::PARAM_STR); + break; + case '"fadeout"': + $stmt->bindValue($identifier, $this->fadeout, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcFiles !== null) { + if (!$this->aCcFiles->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcFiles->getValidationFailures()); + } + } + + if ($this->aCcBlock !== null) { + if (!$this->aCcBlock->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcBlock->getValidationFailures()); + } + } + + + if (($retval = CcBlockcontentsPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcBlockcontentsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbBlockId(); + break; + case 2: + return $this->getDbFileId(); + break; + case 3: + return $this->getDbPosition(); + break; + case 4: + return $this->getDbTrackOffset(); + break; + case 5: + return $this->getDbCliplength(); + break; + case 6: + return $this->getDbCuein(); + break; + case 7: + return $this->getDbCueout(); + break; + case 8: + return $this->getDbFadein(); + break; + case 9: + return $this->getDbFadeout(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcBlockcontents'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcBlockcontents'][$this->getPrimaryKey()] = true; + $keys = CcBlockcontentsPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbBlockId(), + $keys[2] => $this->getDbFileId(), + $keys[3] => $this->getDbPosition(), + $keys[4] => $this->getDbTrackOffset(), + $keys[5] => $this->getDbCliplength(), + $keys[6] => $this->getDbCuein(), + $keys[7] => $this->getDbCueout(), + $keys[8] => $this->getDbFadein(), + $keys[9] => $this->getDbFadeout(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcFiles) { + $result['CcFiles'] = $this->aCcFiles->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->aCcBlock) { + $result['CcBlock'] = $this->aCcBlock->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcBlockcontentsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbBlockId($value); + break; + case 2: + $this->setDbFileId($value); + break; + case 3: + $this->setDbPosition($value); + break; + case 4: + $this->setDbTrackOffset($value); + break; + case 5: + $this->setDbCliplength($value); + break; + case 6: + $this->setDbCuein($value); + break; + case 7: + $this->setDbCueout($value); + break; + case 8: + $this->setDbFadein($value); + break; + case 9: + $this->setDbFadeout($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcBlockcontentsPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbBlockId($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbFileId($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbPosition($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbTrackOffset($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setDbCliplength($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setDbCuein($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setDbCueout($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setDbFadein($arr[$keys[8]]); + if (array_key_exists($keys[9], $arr)) $this->setDbFadeout($arr[$keys[9]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcBlockcontentsPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcBlockcontentsPeer::ID)) $criteria->add(CcBlockcontentsPeer::ID, $this->id); + if ($this->isColumnModified(CcBlockcontentsPeer::BLOCK_ID)) $criteria->add(CcBlockcontentsPeer::BLOCK_ID, $this->block_id); + if ($this->isColumnModified(CcBlockcontentsPeer::FILE_ID)) $criteria->add(CcBlockcontentsPeer::FILE_ID, $this->file_id); + if ($this->isColumnModified(CcBlockcontentsPeer::POSITION)) $criteria->add(CcBlockcontentsPeer::POSITION, $this->position); + if ($this->isColumnModified(CcBlockcontentsPeer::TRACKOFFSET)) $criteria->add(CcBlockcontentsPeer::TRACKOFFSET, $this->trackoffset); + if ($this->isColumnModified(CcBlockcontentsPeer::CLIPLENGTH)) $criteria->add(CcBlockcontentsPeer::CLIPLENGTH, $this->cliplength); + if ($this->isColumnModified(CcBlockcontentsPeer::CUEIN)) $criteria->add(CcBlockcontentsPeer::CUEIN, $this->cuein); + if ($this->isColumnModified(CcBlockcontentsPeer::CUEOUT)) $criteria->add(CcBlockcontentsPeer::CUEOUT, $this->cueout); + if ($this->isColumnModified(CcBlockcontentsPeer::FADEIN)) $criteria->add(CcBlockcontentsPeer::FADEIN, $this->fadein); + if ($this->isColumnModified(CcBlockcontentsPeer::FADEOUT)) $criteria->add(CcBlockcontentsPeer::FADEOUT, $this->fadeout); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcBlockcontentsPeer::DATABASE_NAME); + $criteria->add(CcBlockcontentsPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcBlockcontents (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbBlockId($this->getDbBlockId()); + $copyObj->setDbFileId($this->getDbFileId()); + $copyObj->setDbPosition($this->getDbPosition()); + $copyObj->setDbTrackOffset($this->getDbTrackOffset()); + $copyObj->setDbCliplength($this->getDbCliplength()); + $copyObj->setDbCuein($this->getDbCuein()); + $copyObj->setDbCueout($this->getDbCueout()); + $copyObj->setDbFadein($this->getDbFadein()); + $copyObj->setDbFadeout($this->getDbFadeout()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcBlockcontents Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcBlockcontentsPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcBlockcontentsPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcFiles object. + * + * @param CcFiles $v + * @return CcBlockcontents The current object (for fluent API support) + * @throws PropelException + */ + public function setCcFiles(CcFiles $v = null) + { + if ($v === null) { + $this->setDbFileId(NULL); + } else { + $this->setDbFileId($v->getDbId()); + } + + $this->aCcFiles = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcFiles object, it will not be re-added. + if ($v !== null) { + $v->addCcBlockcontents($this); + } + + + return $this; + } + + + /** + * Get the associated CcFiles object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcFiles The associated CcFiles object. + * @throws PropelException + */ + public function getCcFiles(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcFiles === null && ($this->file_id !== null) && $doQuery) { + $this->aCcFiles = CcFilesQuery::create()->findPk($this->file_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcFiles->addCcBlockcontentss($this); + */ + } + + return $this->aCcFiles; + } + + /** + * Declares an association between this object and a CcBlock object. + * + * @param CcBlock $v + * @return CcBlockcontents The current object (for fluent API support) + * @throws PropelException + */ + public function setCcBlock(CcBlock $v = null) + { + // aggregate_column_relation behavior + if (null !== $this->aCcBlock && $v !== $this->aCcBlock) { + $this->oldCcBlock = $this->aCcBlock; + } + if ($v === null) { + $this->setDbBlockId(NULL); + } else { + $this->setDbBlockId($v->getDbId()); + } + + $this->aCcBlock = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcBlock object, it will not be re-added. + if ($v !== null) { + $v->addCcBlockcontents($this); + } + + + return $this; + } + + + /** + * Get the associated CcBlock object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcBlock The associated CcBlock object. + * @throws PropelException + */ + public function getCcBlock(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcBlock === null && ($this->block_id !== null) && $doQuery) { + $this->aCcBlock = CcBlockQuery::create()->findPk($this->block_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcBlock->addCcBlockcontentss($this); + */ + } + + return $this->aCcBlock; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->block_id = null; + $this->file_id = null; + $this->position = null; + $this->trackoffset = null; + $this->cliplength = null; + $this->cuein = null; + $this->cueout = null; + $this->fadein = null; + $this->fadeout = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcFiles instanceof Persistent) { + $this->aCcFiles->clearAllReferences($deep); + } + if ($this->aCcBlock instanceof Persistent) { + $this->aCcBlock->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcFiles = null; + $this->aCcBlock = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcBlockcontentsPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + + // aggregate_column_relation behavior + + /** + * Update the aggregate column in the related CcBlock object + * + * @param PropelPDO $con A connection object + */ + protected function updateRelatedCcBlock(PropelPDO $con) + { + if ($ccBlock = $this->getCcBlock()) { + if (!$ccBlock->isAlreadyInSave()) { + $ccBlock->updateDbLength($con); + } + } + if ($this->oldCcBlock) { + $this->oldCcBlock->updateDbLength($con); + $this->oldCcBlock = null; + } + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcBlockcontentsPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcBlockcontentsPeer.php index 6cdb1e2656..e3917377c6 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcBlockcontentsPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcBlockcontentsPeer.php @@ -4,1393 +4,1425 @@ /** * Base static class for performing query and update operations on the 'cc_blockcontents' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcBlockcontentsPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_blockcontents'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcBlockcontents'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcBlockcontents'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcBlockcontentsTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 10; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_blockcontents.ID'; - - /** the column name for the BLOCK_ID field */ - const BLOCK_ID = 'cc_blockcontents.BLOCK_ID'; - - /** the column name for the FILE_ID field */ - const FILE_ID = 'cc_blockcontents.FILE_ID'; - - /** the column name for the POSITION field */ - const POSITION = 'cc_blockcontents.POSITION'; - - /** the column name for the TRACKOFFSET field */ - const TRACKOFFSET = 'cc_blockcontents.TRACKOFFSET'; - - /** the column name for the CLIPLENGTH field */ - const CLIPLENGTH = 'cc_blockcontents.CLIPLENGTH'; - - /** the column name for the CUEIN field */ - const CUEIN = 'cc_blockcontents.CUEIN'; - - /** the column name for the CUEOUT field */ - const CUEOUT = 'cc_blockcontents.CUEOUT'; - - /** the column name for the FADEIN field */ - const FADEIN = 'cc_blockcontents.FADEIN'; - - /** the column name for the FADEOUT field */ - const FADEOUT = 'cc_blockcontents.FADEOUT'; - - /** - * An identiy map to hold any loaded instances of CcBlockcontents objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcBlockcontents[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbBlockId', 'DbFileId', 'DbPosition', 'DbTrackOffset', 'DbCliplength', 'DbCuein', 'DbCueout', 'DbFadein', 'DbFadeout', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbBlockId', 'dbFileId', 'dbPosition', 'dbTrackOffset', 'dbCliplength', 'dbCuein', 'dbCueout', 'dbFadein', 'dbFadeout', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::BLOCK_ID, self::FILE_ID, self::POSITION, self::TRACKOFFSET, self::CLIPLENGTH, self::CUEIN, self::CUEOUT, self::FADEIN, self::FADEOUT, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'BLOCK_ID', 'FILE_ID', 'POSITION', 'TRACKOFFSET', 'CLIPLENGTH', 'CUEIN', 'CUEOUT', 'FADEIN', 'FADEOUT', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'block_id', 'file_id', 'position', 'trackoffset', 'cliplength', 'cuein', 'cueout', 'fadein', 'fadeout', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbBlockId' => 1, 'DbFileId' => 2, 'DbPosition' => 3, 'DbTrackOffset' => 4, 'DbCliplength' => 5, 'DbCuein' => 6, 'DbCueout' => 7, 'DbFadein' => 8, 'DbFadeout' => 9, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbBlockId' => 1, 'dbFileId' => 2, 'dbPosition' => 3, 'dbTrackOffset' => 4, 'dbCliplength' => 5, 'dbCuein' => 6, 'dbCueout' => 7, 'dbFadein' => 8, 'dbFadeout' => 9, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::BLOCK_ID => 1, self::FILE_ID => 2, self::POSITION => 3, self::TRACKOFFSET => 4, self::CLIPLENGTH => 5, self::CUEIN => 6, self::CUEOUT => 7, self::FADEIN => 8, self::FADEOUT => 9, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'BLOCK_ID' => 1, 'FILE_ID' => 2, 'POSITION' => 3, 'TRACKOFFSET' => 4, 'CLIPLENGTH' => 5, 'CUEIN' => 6, 'CUEOUT' => 7, 'FADEIN' => 8, 'FADEOUT' => 9, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'block_id' => 1, 'file_id' => 2, 'position' => 3, 'trackoffset' => 4, 'cliplength' => 5, 'cuein' => 6, 'cueout' => 7, 'fadein' => 8, 'fadeout' => 9, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcBlockcontentsPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcBlockcontentsPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcBlockcontentsPeer::ID); - $criteria->addSelectColumn(CcBlockcontentsPeer::BLOCK_ID); - $criteria->addSelectColumn(CcBlockcontentsPeer::FILE_ID); - $criteria->addSelectColumn(CcBlockcontentsPeer::POSITION); - $criteria->addSelectColumn(CcBlockcontentsPeer::TRACKOFFSET); - $criteria->addSelectColumn(CcBlockcontentsPeer::CLIPLENGTH); - $criteria->addSelectColumn(CcBlockcontentsPeer::CUEIN); - $criteria->addSelectColumn(CcBlockcontentsPeer::CUEOUT); - $criteria->addSelectColumn(CcBlockcontentsPeer::FADEIN); - $criteria->addSelectColumn(CcBlockcontentsPeer::FADEOUT); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.BLOCK_ID'); - $criteria->addSelectColumn($alias . '.FILE_ID'); - $criteria->addSelectColumn($alias . '.POSITION'); - $criteria->addSelectColumn($alias . '.TRACKOFFSET'); - $criteria->addSelectColumn($alias . '.CLIPLENGTH'); - $criteria->addSelectColumn($alias . '.CUEIN'); - $criteria->addSelectColumn($alias . '.CUEOUT'); - $criteria->addSelectColumn($alias . '.FADEIN'); - $criteria->addSelectColumn($alias . '.FADEOUT'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcBlockcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcBlockcontents - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcBlockcontentsPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcBlockcontentsPeer::populateObjects(CcBlockcontentsPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcBlockcontentsPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcBlockcontents $value A CcBlockcontents object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcBlockcontents $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcBlockcontents object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcBlockcontents) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcBlockcontents object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcBlockcontents Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_blockcontents - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcBlockcontentsPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcBlockcontentsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcBlockcontentsPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcBlockcontents object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcBlockcontentsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcBlockcontentsPeer::NUM_COLUMNS; - } else { - $cls = CcBlockcontentsPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcBlockcontentsPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcFiles table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcBlockcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcBlockcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcBlock table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcBlock(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcBlockcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcBlockcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcBlockcontents objects pre-filled with their CcFiles objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcBlockcontents objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcBlockcontentsPeer::addSelectColumns($criteria); - $startcol = (CcBlockcontentsPeer::NUM_COLUMNS - CcBlockcontentsPeer::NUM_LAZY_LOAD_COLUMNS); - CcFilesPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcBlockcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcBlockcontentsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcBlockcontentsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcBlockcontentsPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcBlockcontents) to $obj2 (CcFiles) - $obj2->addCcBlockcontents($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcBlockcontents objects pre-filled with their CcBlock objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcBlockcontents objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcBlock(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcBlockcontentsPeer::addSelectColumns($criteria); - $startcol = (CcBlockcontentsPeer::NUM_COLUMNS - CcBlockcontentsPeer::NUM_LAZY_LOAD_COLUMNS); - CcBlockPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcBlockcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcBlockcontentsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcBlockcontentsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcBlockcontentsPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcBlockPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcBlockPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcBlockPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcBlockcontents) to $obj2 (CcBlock) - $obj2->addCcBlockcontents($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcBlockcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcBlockcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcBlockcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcBlockcontents objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcBlockcontents objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcBlockcontentsPeer::addSelectColumns($criteria); - $startcol2 = (CcBlockcontentsPeer::NUM_COLUMNS - CcBlockcontentsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcFilesPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcBlockPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcBlockPeer::NUM_COLUMNS - CcBlockPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcBlockcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcBlockcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcBlockcontentsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcBlockcontentsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcBlockcontentsPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcFiles rows - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcBlockcontents) to the collection in $obj2 (CcFiles) - $obj2->addCcBlockcontents($obj1); - } // if joined row not null - - // Add objects for joined CcBlock rows - - $key3 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcBlockPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcBlockPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcBlockPeer::addInstanceToPool($obj3, $key3); - } // if obj3 loaded - - // Add the $obj1 (CcBlockcontents) to the collection in $obj3 (CcBlock) - $obj3->addCcBlockcontents($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcFiles table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcBlockcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcBlockcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcBlock table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcBlock(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcBlockcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcBlockcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcBlockcontents objects pre-filled with all related objects except CcFiles. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcBlockcontents objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcBlockcontentsPeer::addSelectColumns($criteria); - $startcol2 = (CcBlockcontentsPeer::NUM_COLUMNS - CcBlockcontentsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcBlockPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcBlockPeer::NUM_COLUMNS - CcBlockPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcBlockcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcBlockcontentsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcBlockcontentsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcBlockcontentsPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcBlock rows - - $key2 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcBlockPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcBlockPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcBlockPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcBlockcontents) to the collection in $obj2 (CcBlock) - $obj2->addCcBlockcontents($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcBlockcontents objects pre-filled with all related objects except CcBlock. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcBlockcontents objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcBlock(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcBlockcontentsPeer::addSelectColumns($criteria); - $startcol2 = (CcBlockcontentsPeer::NUM_COLUMNS - CcBlockcontentsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcFilesPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcBlockcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcBlockcontentsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcBlockcontentsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcBlockcontentsPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcFiles rows - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcBlockcontents) to the collection in $obj2 (CcFiles) - $obj2->addCcBlockcontents($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcBlockcontentsPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcBlockcontentsPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcBlockcontentsTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcBlockcontentsPeer::CLASS_DEFAULT : CcBlockcontentsPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcBlockcontents or Criteria object. - * - * @param mixed $values Criteria or CcBlockcontents object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcBlockcontents object - } - - if ($criteria->containsKey(CcBlockcontentsPeer::ID) && $criteria->keyContainsValue(CcBlockcontentsPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcBlockcontentsPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcBlockcontents or Criteria object. - * - * @param mixed $values Criteria or CcBlockcontents object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcBlockcontentsPeer::ID); - $value = $criteria->remove(CcBlockcontentsPeer::ID); - if ($value) { - $selectCriteria->add(CcBlockcontentsPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); - } - - } else { // $values is CcBlockcontents object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_blockcontents table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcBlockcontentsPeer::TABLE_NAME, $con, CcBlockcontentsPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcBlockcontentsPeer::clearInstancePool(); - CcBlockcontentsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcBlockcontents or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcBlockcontents object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcBlockcontentsPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcBlockcontents) { // it's a model object - // invalidate the cache for this single object - CcBlockcontentsPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcBlockcontentsPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcBlockcontentsPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcBlockcontentsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcBlockcontents object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcBlockcontents $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcBlockcontents $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcBlockcontentsPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcBlockcontentsPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcBlockcontentsPeer::DATABASE_NAME, CcBlockcontentsPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcBlockcontents - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcBlockcontentsPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcBlockcontentsPeer::DATABASE_NAME); - $criteria->add(CcBlockcontentsPeer::ID, $pk); - - $v = CcBlockcontentsPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcBlockcontentsPeer::DATABASE_NAME); - $criteria->add(CcBlockcontentsPeer::ID, $pks, Criteria::IN); - $objs = CcBlockcontentsPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcBlockcontentsPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_blockcontents'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcBlockcontents'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcBlockcontentsTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 10; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 10; + + /** the column name for the id field */ + const ID = 'cc_blockcontents.id'; + + /** the column name for the block_id field */ + const BLOCK_ID = 'cc_blockcontents.block_id'; + + /** the column name for the file_id field */ + const FILE_ID = 'cc_blockcontents.file_id'; + + /** the column name for the position field */ + const POSITION = 'cc_blockcontents.position'; + + /** the column name for the trackoffset field */ + const TRACKOFFSET = 'cc_blockcontents.trackoffset'; + + /** the column name for the cliplength field */ + const CLIPLENGTH = 'cc_blockcontents.cliplength'; + + /** the column name for the cuein field */ + const CUEIN = 'cc_blockcontents.cuein'; + + /** the column name for the cueout field */ + const CUEOUT = 'cc_blockcontents.cueout'; + + /** the column name for the fadein field */ + const FADEIN = 'cc_blockcontents.fadein'; + + /** the column name for the fadeout field */ + const FADEOUT = 'cc_blockcontents.fadeout'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcBlockcontents objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcBlockcontents[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcBlockcontentsPeer::$fieldNames[CcBlockcontentsPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbBlockId', 'DbFileId', 'DbPosition', 'DbTrackOffset', 'DbCliplength', 'DbCuein', 'DbCueout', 'DbFadein', 'DbFadeout', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbBlockId', 'dbFileId', 'dbPosition', 'dbTrackOffset', 'dbCliplength', 'dbCuein', 'dbCueout', 'dbFadein', 'dbFadeout', ), + BasePeer::TYPE_COLNAME => array (CcBlockcontentsPeer::ID, CcBlockcontentsPeer::BLOCK_ID, CcBlockcontentsPeer::FILE_ID, CcBlockcontentsPeer::POSITION, CcBlockcontentsPeer::TRACKOFFSET, CcBlockcontentsPeer::CLIPLENGTH, CcBlockcontentsPeer::CUEIN, CcBlockcontentsPeer::CUEOUT, CcBlockcontentsPeer::FADEIN, CcBlockcontentsPeer::FADEOUT, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'BLOCK_ID', 'FILE_ID', 'POSITION', 'TRACKOFFSET', 'CLIPLENGTH', 'CUEIN', 'CUEOUT', 'FADEIN', 'FADEOUT', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'block_id', 'file_id', 'position', 'trackoffset', 'cliplength', 'cuein', 'cueout', 'fadein', 'fadeout', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcBlockcontentsPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbBlockId' => 1, 'DbFileId' => 2, 'DbPosition' => 3, 'DbTrackOffset' => 4, 'DbCliplength' => 5, 'DbCuein' => 6, 'DbCueout' => 7, 'DbFadein' => 8, 'DbFadeout' => 9, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbBlockId' => 1, 'dbFileId' => 2, 'dbPosition' => 3, 'dbTrackOffset' => 4, 'dbCliplength' => 5, 'dbCuein' => 6, 'dbCueout' => 7, 'dbFadein' => 8, 'dbFadeout' => 9, ), + BasePeer::TYPE_COLNAME => array (CcBlockcontentsPeer::ID => 0, CcBlockcontentsPeer::BLOCK_ID => 1, CcBlockcontentsPeer::FILE_ID => 2, CcBlockcontentsPeer::POSITION => 3, CcBlockcontentsPeer::TRACKOFFSET => 4, CcBlockcontentsPeer::CLIPLENGTH => 5, CcBlockcontentsPeer::CUEIN => 6, CcBlockcontentsPeer::CUEOUT => 7, CcBlockcontentsPeer::FADEIN => 8, CcBlockcontentsPeer::FADEOUT => 9, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'BLOCK_ID' => 1, 'FILE_ID' => 2, 'POSITION' => 3, 'TRACKOFFSET' => 4, 'CLIPLENGTH' => 5, 'CUEIN' => 6, 'CUEOUT' => 7, 'FADEIN' => 8, 'FADEOUT' => 9, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'block_id' => 1, 'file_id' => 2, 'position' => 3, 'trackoffset' => 4, 'cliplength' => 5, 'cuein' => 6, 'cueout' => 7, 'fadein' => 8, 'fadeout' => 9, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcBlockcontentsPeer::getFieldNames($toType); + $key = isset(CcBlockcontentsPeer::$fieldKeys[$fromType][$name]) ? CcBlockcontentsPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcBlockcontentsPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcBlockcontentsPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcBlockcontentsPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcBlockcontentsPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcBlockcontentsPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcBlockcontentsPeer::ID); + $criteria->addSelectColumn(CcBlockcontentsPeer::BLOCK_ID); + $criteria->addSelectColumn(CcBlockcontentsPeer::FILE_ID); + $criteria->addSelectColumn(CcBlockcontentsPeer::POSITION); + $criteria->addSelectColumn(CcBlockcontentsPeer::TRACKOFFSET); + $criteria->addSelectColumn(CcBlockcontentsPeer::CLIPLENGTH); + $criteria->addSelectColumn(CcBlockcontentsPeer::CUEIN); + $criteria->addSelectColumn(CcBlockcontentsPeer::CUEOUT); + $criteria->addSelectColumn(CcBlockcontentsPeer::FADEIN); + $criteria->addSelectColumn(CcBlockcontentsPeer::FADEOUT); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.block_id'); + $criteria->addSelectColumn($alias . '.file_id'); + $criteria->addSelectColumn($alias . '.position'); + $criteria->addSelectColumn($alias . '.trackoffset'); + $criteria->addSelectColumn($alias . '.cliplength'); + $criteria->addSelectColumn($alias . '.cuein'); + $criteria->addSelectColumn($alias . '.cueout'); + $criteria->addSelectColumn($alias . '.fadein'); + $criteria->addSelectColumn($alias . '.fadeout'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcBlockcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcBlockcontents + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcBlockcontentsPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcBlockcontentsPeer::populateObjects(CcBlockcontentsPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcBlockcontentsPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcBlockcontents $obj A CcBlockcontents object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcBlockcontentsPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcBlockcontents object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcBlockcontents) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcBlockcontents object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcBlockcontentsPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcBlockcontents Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcBlockcontentsPeer::$instances[$key])) { + return CcBlockcontentsPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcBlockcontentsPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcBlockcontentsPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_blockcontents + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcBlockcontentsPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcBlockcontentsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcBlockcontentsPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcBlockcontents object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcBlockcontentsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcBlockcontentsPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcBlockcontentsPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcBlockcontentsPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcFiles table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcBlockcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcBlockcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcBlock table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcBlock(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcBlockcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcBlockcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcBlockcontents objects pre-filled with their CcFiles objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcBlockcontents objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + } + + CcBlockcontentsPeer::addSelectColumns($criteria); + $startcol = CcBlockcontentsPeer::NUM_HYDRATE_COLUMNS; + CcFilesPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcBlockcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcBlockcontentsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcBlockcontentsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcBlockcontentsPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcBlockcontents) to $obj2 (CcFiles) + $obj2->addCcBlockcontents($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcBlockcontents objects pre-filled with their CcBlock objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcBlockcontents objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcBlock(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + } + + CcBlockcontentsPeer::addSelectColumns($criteria); + $startcol = CcBlockcontentsPeer::NUM_HYDRATE_COLUMNS; + CcBlockPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcBlockcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcBlockcontentsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcBlockcontentsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcBlockcontentsPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcBlockPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcBlockPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcBlockPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcBlockcontents) to $obj2 (CcBlock) + $obj2->addCcBlockcontents($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcBlockcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcBlockcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $criteria->addJoin(CcBlockcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcBlockcontents objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcBlockcontents objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + } + + CcBlockcontentsPeer::addSelectColumns($criteria); + $startcol2 = CcBlockcontentsPeer::NUM_HYDRATE_COLUMNS; + + CcFilesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + + CcBlockPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcBlockPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcBlockcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $criteria->addJoin(CcBlockcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcBlockcontentsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcBlockcontentsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcBlockcontentsPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcFiles rows + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcBlockcontents) to the collection in $obj2 (CcFiles) + $obj2->addCcBlockcontents($obj1); + } // if joined row not null + + // Add objects for joined CcBlock rows + + $key3 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcBlockPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcBlockPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcBlockPeer::addInstanceToPool($obj3, $key3); + } // if obj3 loaded + + // Add the $obj1 (CcBlockcontents) to the collection in $obj3 (CcBlock) + $obj3->addCcBlockcontents($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcFiles table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcBlockcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcBlockcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcBlock table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcBlock(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcBlockcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcBlockcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcBlockcontents objects pre-filled with all related objects except CcFiles. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcBlockcontents objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + } + + CcBlockcontentsPeer::addSelectColumns($criteria); + $startcol2 = CcBlockcontentsPeer::NUM_HYDRATE_COLUMNS; + + CcBlockPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcBlockPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcBlockcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcBlockcontentsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcBlockcontentsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcBlockcontentsPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcBlock rows + + $key2 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcBlockPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcBlockPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcBlockPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcBlockcontents) to the collection in $obj2 (CcBlock) + $obj2->addCcBlockcontents($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcBlockcontents objects pre-filled with all related objects except CcBlock. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcBlockcontents objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcBlock(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + } + + CcBlockcontentsPeer::addSelectColumns($criteria); + $startcol2 = CcBlockcontentsPeer::NUM_HYDRATE_COLUMNS; + + CcFilesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcBlockcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcBlockcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcBlockcontentsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcBlockcontentsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcBlockcontentsPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcFiles rows + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcBlockcontents) to the collection in $obj2 (CcFiles) + $obj2->addCcBlockcontents($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcBlockcontentsPeer::DATABASE_NAME)->getTable(CcBlockcontentsPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcBlockcontentsPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcBlockcontentsPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcBlockcontentsTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcBlockcontentsPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcBlockcontents or Criteria object. + * + * @param mixed $values Criteria or CcBlockcontents object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcBlockcontents object + } + + if ($criteria->containsKey(CcBlockcontentsPeer::ID) && $criteria->keyContainsValue(CcBlockcontentsPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcBlockcontentsPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcBlockcontents or Criteria object. + * + * @param mixed $values Criteria or CcBlockcontents object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcBlockcontentsPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcBlockcontentsPeer::ID); + $value = $criteria->remove(CcBlockcontentsPeer::ID); + if ($value) { + $selectCriteria->add(CcBlockcontentsPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcBlockcontentsPeer::TABLE_NAME); + } + + } else { // $values is CcBlockcontents object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_blockcontents table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcBlockcontentsPeer::TABLE_NAME, $con, CcBlockcontentsPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcBlockcontentsPeer::clearInstancePool(); + CcBlockcontentsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcBlockcontents or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcBlockcontents object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcBlockcontentsPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcBlockcontents) { // it's a model object + // invalidate the cache for this single object + CcBlockcontentsPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcBlockcontentsPeer::DATABASE_NAME); + $criteria->add(CcBlockcontentsPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcBlockcontentsPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcBlockcontentsPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcBlockcontentsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcBlockcontents object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcBlockcontents $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcBlockcontentsPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcBlockcontentsPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcBlockcontentsPeer::DATABASE_NAME, CcBlockcontentsPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcBlockcontents + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcBlockcontentsPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcBlockcontentsPeer::DATABASE_NAME); + $criteria->add(CcBlockcontentsPeer::ID, $pk); + + $v = CcBlockcontentsPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcBlockcontents[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcBlockcontentsPeer::DATABASE_NAME); + $criteria->add(CcBlockcontentsPeer::ID, $pks, Criteria::IN); + $objs = CcBlockcontentsPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcBlockcontentsPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcBlockcontentsQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcBlockcontentsQuery.php index f648e36404..868c0b2417 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcBlockcontentsQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcBlockcontentsQuery.php @@ -4,672 +4,900 @@ /** * Base class that represents a query for the 'cc_blockcontents' table. * - * * - * @method CcBlockcontentsQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcBlockcontentsQuery orderByDbBlockId($order = Criteria::ASC) Order by the block_id column - * @method CcBlockcontentsQuery orderByDbFileId($order = Criteria::ASC) Order by the file_id column - * @method CcBlockcontentsQuery orderByDbPosition($order = Criteria::ASC) Order by the position column - * @method CcBlockcontentsQuery orderByDbTrackOffset($order = Criteria::ASC) Order by the trackoffset column - * @method CcBlockcontentsQuery orderByDbCliplength($order = Criteria::ASC) Order by the cliplength column - * @method CcBlockcontentsQuery orderByDbCuein($order = Criteria::ASC) Order by the cuein column - * @method CcBlockcontentsQuery orderByDbCueout($order = Criteria::ASC) Order by the cueout column - * @method CcBlockcontentsQuery orderByDbFadein($order = Criteria::ASC) Order by the fadein column - * @method CcBlockcontentsQuery orderByDbFadeout($order = Criteria::ASC) Order by the fadeout column * - * @method CcBlockcontentsQuery groupByDbId() Group by the id column - * @method CcBlockcontentsQuery groupByDbBlockId() Group by the block_id column - * @method CcBlockcontentsQuery groupByDbFileId() Group by the file_id column - * @method CcBlockcontentsQuery groupByDbPosition() Group by the position column - * @method CcBlockcontentsQuery groupByDbTrackOffset() Group by the trackoffset column - * @method CcBlockcontentsQuery groupByDbCliplength() Group by the cliplength column - * @method CcBlockcontentsQuery groupByDbCuein() Group by the cuein column - * @method CcBlockcontentsQuery groupByDbCueout() Group by the cueout column - * @method CcBlockcontentsQuery groupByDbFadein() Group by the fadein column - * @method CcBlockcontentsQuery groupByDbFadeout() Group by the fadeout column + * @method CcBlockcontentsQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcBlockcontentsQuery orderByDbBlockId($order = Criteria::ASC) Order by the block_id column + * @method CcBlockcontentsQuery orderByDbFileId($order = Criteria::ASC) Order by the file_id column + * @method CcBlockcontentsQuery orderByDbPosition($order = Criteria::ASC) Order by the position column + * @method CcBlockcontentsQuery orderByDbTrackOffset($order = Criteria::ASC) Order by the trackoffset column + * @method CcBlockcontentsQuery orderByDbCliplength($order = Criteria::ASC) Order by the cliplength column + * @method CcBlockcontentsQuery orderByDbCuein($order = Criteria::ASC) Order by the cuein column + * @method CcBlockcontentsQuery orderByDbCueout($order = Criteria::ASC) Order by the cueout column + * @method CcBlockcontentsQuery orderByDbFadein($order = Criteria::ASC) Order by the fadein column + * @method CcBlockcontentsQuery orderByDbFadeout($order = Criteria::ASC) Order by the fadeout column * - * @method CcBlockcontentsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcBlockcontentsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcBlockcontentsQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcBlockcontentsQuery groupByDbId() Group by the id column + * @method CcBlockcontentsQuery groupByDbBlockId() Group by the block_id column + * @method CcBlockcontentsQuery groupByDbFileId() Group by the file_id column + * @method CcBlockcontentsQuery groupByDbPosition() Group by the position column + * @method CcBlockcontentsQuery groupByDbTrackOffset() Group by the trackoffset column + * @method CcBlockcontentsQuery groupByDbCliplength() Group by the cliplength column + * @method CcBlockcontentsQuery groupByDbCuein() Group by the cuein column + * @method CcBlockcontentsQuery groupByDbCueout() Group by the cueout column + * @method CcBlockcontentsQuery groupByDbFadein() Group by the fadein column + * @method CcBlockcontentsQuery groupByDbFadeout() Group by the fadeout column * - * @method CcBlockcontentsQuery leftJoinCcFiles($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcFiles relation - * @method CcBlockcontentsQuery rightJoinCcFiles($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcFiles relation - * @method CcBlockcontentsQuery innerJoinCcFiles($relationAlias = '') Adds a INNER JOIN clause to the query using the CcFiles relation + * @method CcBlockcontentsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcBlockcontentsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcBlockcontentsQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcBlockcontentsQuery leftJoinCcBlock($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcBlock relation - * @method CcBlockcontentsQuery rightJoinCcBlock($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcBlock relation - * @method CcBlockcontentsQuery innerJoinCcBlock($relationAlias = '') Adds a INNER JOIN clause to the query using the CcBlock relation + * @method CcBlockcontentsQuery leftJoinCcFiles($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcFiles relation + * @method CcBlockcontentsQuery rightJoinCcFiles($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcFiles relation + * @method CcBlockcontentsQuery innerJoinCcFiles($relationAlias = null) Adds a INNER JOIN clause to the query using the CcFiles relation * - * @method CcBlockcontents findOne(PropelPDO $con = null) Return the first CcBlockcontents matching the query - * @method CcBlockcontents findOneOrCreate(PropelPDO $con = null) Return the first CcBlockcontents matching the query, or a new CcBlockcontents object populated from the query conditions when no match is found + * @method CcBlockcontentsQuery leftJoinCcBlock($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcBlock relation + * @method CcBlockcontentsQuery rightJoinCcBlock($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcBlock relation + * @method CcBlockcontentsQuery innerJoinCcBlock($relationAlias = null) Adds a INNER JOIN clause to the query using the CcBlock relation * - * @method CcBlockcontents findOneByDbId(int $id) Return the first CcBlockcontents filtered by the id column - * @method CcBlockcontents findOneByDbBlockId(int $block_id) Return the first CcBlockcontents filtered by the block_id column - * @method CcBlockcontents findOneByDbFileId(int $file_id) Return the first CcBlockcontents filtered by the file_id column - * @method CcBlockcontents findOneByDbPosition(int $position) Return the first CcBlockcontents filtered by the position column - * @method CcBlockcontents findOneByDbTrackOffset(double $trackoffset) Return the first CcBlockcontents filtered by the trackoffset column - * @method CcBlockcontents findOneByDbCliplength(string $cliplength) Return the first CcBlockcontents filtered by the cliplength column - * @method CcBlockcontents findOneByDbCuein(string $cuein) Return the first CcBlockcontents filtered by the cuein column - * @method CcBlockcontents findOneByDbCueout(string $cueout) Return the first CcBlockcontents filtered by the cueout column - * @method CcBlockcontents findOneByDbFadein(string $fadein) Return the first CcBlockcontents filtered by the fadein column - * @method CcBlockcontents findOneByDbFadeout(string $fadeout) Return the first CcBlockcontents filtered by the fadeout column + * @method CcBlockcontents findOne(PropelPDO $con = null) Return the first CcBlockcontents matching the query + * @method CcBlockcontents findOneOrCreate(PropelPDO $con = null) Return the first CcBlockcontents matching the query, or a new CcBlockcontents object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcBlockcontents objects filtered by the id column - * @method array findByDbBlockId(int $block_id) Return CcBlockcontents objects filtered by the block_id column - * @method array findByDbFileId(int $file_id) Return CcBlockcontents objects filtered by the file_id column - * @method array findByDbPosition(int $position) Return CcBlockcontents objects filtered by the position column - * @method array findByDbTrackOffset(double $trackoffset) Return CcBlockcontents objects filtered by the trackoffset column - * @method array findByDbCliplength(string $cliplength) Return CcBlockcontents objects filtered by the cliplength column - * @method array findByDbCuein(string $cuein) Return CcBlockcontents objects filtered by the cuein column - * @method array findByDbCueout(string $cueout) Return CcBlockcontents objects filtered by the cueout column - * @method array findByDbFadein(string $fadein) Return CcBlockcontents objects filtered by the fadein column - * @method array findByDbFadeout(string $fadeout) Return CcBlockcontents objects filtered by the fadeout column + * @method CcBlockcontents findOneByDbBlockId(int $block_id) Return the first CcBlockcontents filtered by the block_id column + * @method CcBlockcontents findOneByDbFileId(int $file_id) Return the first CcBlockcontents filtered by the file_id column + * @method CcBlockcontents findOneByDbPosition(int $position) Return the first CcBlockcontents filtered by the position column + * @method CcBlockcontents findOneByDbTrackOffset(double $trackoffset) Return the first CcBlockcontents filtered by the trackoffset column + * @method CcBlockcontents findOneByDbCliplength(string $cliplength) Return the first CcBlockcontents filtered by the cliplength column + * @method CcBlockcontents findOneByDbCuein(string $cuein) Return the first CcBlockcontents filtered by the cuein column + * @method CcBlockcontents findOneByDbCueout(string $cueout) Return the first CcBlockcontents filtered by the cueout column + * @method CcBlockcontents findOneByDbFadein(string $fadein) Return the first CcBlockcontents filtered by the fadein column + * @method CcBlockcontents findOneByDbFadeout(string $fadeout) Return the first CcBlockcontents filtered by the fadeout column + * + * @method array findByDbId(int $id) Return CcBlockcontents objects filtered by the id column + * @method array findByDbBlockId(int $block_id) Return CcBlockcontents objects filtered by the block_id column + * @method array findByDbFileId(int $file_id) Return CcBlockcontents objects filtered by the file_id column + * @method array findByDbPosition(int $position) Return CcBlockcontents objects filtered by the position column + * @method array findByDbTrackOffset(double $trackoffset) Return CcBlockcontents objects filtered by the trackoffset column + * @method array findByDbCliplength(string $cliplength) Return CcBlockcontents objects filtered by the cliplength column + * @method array findByDbCuein(string $cuein) Return CcBlockcontents objects filtered by the cuein column + * @method array findByDbCueout(string $cueout) Return CcBlockcontents objects filtered by the cueout column + * @method array findByDbFadein(string $fadein) Return CcBlockcontents objects filtered by the fadein column + * @method array findByDbFadeout(string $fadeout) Return CcBlockcontents objects filtered by the fadeout column * * @package propel.generator.airtime.om */ abstract class BaseCcBlockcontentsQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcBlockcontentsQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcBlockcontents'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcBlockcontentsQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcBlockcontentsQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcBlockcontentsQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcBlockcontentsQuery) { + return $criteria; + } + $query = new CcBlockcontentsQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcBlockcontents|CcBlockcontents[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcBlockcontentsPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcBlockcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcBlockcontents A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcBlockcontents A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "block_id", "file_id", "position", "trackoffset", "cliplength", "cuein", "cueout", "fadein", "fadeout" FROM "cc_blockcontents" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcBlockcontents(); + $obj->hydrate($row); + CcBlockcontentsPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcBlockcontents|CcBlockcontents[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcBlockcontents[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcBlockcontentsPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcBlockcontentsPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcBlockcontentsPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcBlockcontentsPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcBlockcontentsPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the block_id column + * + * Example usage: + * + * $query->filterByDbBlockId(1234); // WHERE block_id = 1234 + * $query->filterByDbBlockId(array(12, 34)); // WHERE block_id IN (12, 34) + * $query->filterByDbBlockId(array('min' => 12)); // WHERE block_id >= 12 + * $query->filterByDbBlockId(array('max' => 12)); // WHERE block_id <= 12 + * + * + * @see filterByCcBlock() + * + * @param mixed $dbBlockId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function filterByDbBlockId($dbBlockId = null, $comparison = null) + { + if (is_array($dbBlockId)) { + $useMinMax = false; + if (isset($dbBlockId['min'])) { + $this->addUsingAlias(CcBlockcontentsPeer::BLOCK_ID, $dbBlockId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbBlockId['max'])) { + $this->addUsingAlias(CcBlockcontentsPeer::BLOCK_ID, $dbBlockId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcBlockcontentsPeer::BLOCK_ID, $dbBlockId, $comparison); + } + + /** + * Filter the query on the file_id column + * + * Example usage: + * + * $query->filterByDbFileId(1234); // WHERE file_id = 1234 + * $query->filterByDbFileId(array(12, 34)); // WHERE file_id IN (12, 34) + * $query->filterByDbFileId(array('min' => 12)); // WHERE file_id >= 12 + * $query->filterByDbFileId(array('max' => 12)); // WHERE file_id <= 12 + * + * + * @see filterByCcFiles() + * + * @param mixed $dbFileId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function filterByDbFileId($dbFileId = null, $comparison = null) + { + if (is_array($dbFileId)) { + $useMinMax = false; + if (isset($dbFileId['min'])) { + $this->addUsingAlias(CcBlockcontentsPeer::FILE_ID, $dbFileId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbFileId['max'])) { + $this->addUsingAlias(CcBlockcontentsPeer::FILE_ID, $dbFileId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcBlockcontentsPeer::FILE_ID, $dbFileId, $comparison); + } + + /** + * Filter the query on the position column + * + * Example usage: + * + * $query->filterByDbPosition(1234); // WHERE position = 1234 + * $query->filterByDbPosition(array(12, 34)); // WHERE position IN (12, 34) + * $query->filterByDbPosition(array('min' => 12)); // WHERE position >= 12 + * $query->filterByDbPosition(array('max' => 12)); // WHERE position <= 12 + * + * + * @param mixed $dbPosition The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function filterByDbPosition($dbPosition = null, $comparison = null) + { + if (is_array($dbPosition)) { + $useMinMax = false; + if (isset($dbPosition['min'])) { + $this->addUsingAlias(CcBlockcontentsPeer::POSITION, $dbPosition['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbPosition['max'])) { + $this->addUsingAlias(CcBlockcontentsPeer::POSITION, $dbPosition['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcBlockcontentsPeer::POSITION, $dbPosition, $comparison); + } + + /** + * Filter the query on the trackoffset column + * + * Example usage: + * + * $query->filterByDbTrackOffset(1234); // WHERE trackoffset = 1234 + * $query->filterByDbTrackOffset(array(12, 34)); // WHERE trackoffset IN (12, 34) + * $query->filterByDbTrackOffset(array('min' => 12)); // WHERE trackoffset >= 12 + * $query->filterByDbTrackOffset(array('max' => 12)); // WHERE trackoffset <= 12 + * + * + * @param mixed $dbTrackOffset The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function filterByDbTrackOffset($dbTrackOffset = null, $comparison = null) + { + if (is_array($dbTrackOffset)) { + $useMinMax = false; + if (isset($dbTrackOffset['min'])) { + $this->addUsingAlias(CcBlockcontentsPeer::TRACKOFFSET, $dbTrackOffset['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbTrackOffset['max'])) { + $this->addUsingAlias(CcBlockcontentsPeer::TRACKOFFSET, $dbTrackOffset['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcBlockcontentsPeer::TRACKOFFSET, $dbTrackOffset, $comparison); + } + + /** + * Filter the query on the cliplength column + * + * Example usage: + * + * $query->filterByDbCliplength('fooValue'); // WHERE cliplength = 'fooValue' + * $query->filterByDbCliplength('%fooValue%'); // WHERE cliplength LIKE '%fooValue%' + * + * + * @param string $dbCliplength The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function filterByDbCliplength($dbCliplength = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCliplength)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCliplength)) { + $dbCliplength = str_replace('*', '%', $dbCliplength); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcBlockcontentsPeer::CLIPLENGTH, $dbCliplength, $comparison); + } + + /** + * Filter the query on the cuein column + * + * Example usage: + * + * $query->filterByDbCuein('fooValue'); // WHERE cuein = 'fooValue' + * $query->filterByDbCuein('%fooValue%'); // WHERE cuein LIKE '%fooValue%' + * + * + * @param string $dbCuein The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function filterByDbCuein($dbCuein = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCuein)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCuein)) { + $dbCuein = str_replace('*', '%', $dbCuein); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcBlockcontentsPeer::CUEIN, $dbCuein, $comparison); + } + + /** + * Filter the query on the cueout column + * + * Example usage: + * + * $query->filterByDbCueout('fooValue'); // WHERE cueout = 'fooValue' + * $query->filterByDbCueout('%fooValue%'); // WHERE cueout LIKE '%fooValue%' + * + * + * @param string $dbCueout The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function filterByDbCueout($dbCueout = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCueout)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCueout)) { + $dbCueout = str_replace('*', '%', $dbCueout); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcBlockcontentsPeer::CUEOUT, $dbCueout, $comparison); + } + + /** + * Filter the query on the fadein column + * + * Example usage: + * + * $query->filterByDbFadein('2011-03-14'); // WHERE fadein = '2011-03-14' + * $query->filterByDbFadein('now'); // WHERE fadein = '2011-03-14' + * $query->filterByDbFadein(array('max' => 'yesterday')); // WHERE fadein < '2011-03-13' + * + * + * @param mixed $dbFadein The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function filterByDbFadein($dbFadein = null, $comparison = null) + { + if (is_array($dbFadein)) { + $useMinMax = false; + if (isset($dbFadein['min'])) { + $this->addUsingAlias(CcBlockcontentsPeer::FADEIN, $dbFadein['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbFadein['max'])) { + $this->addUsingAlias(CcBlockcontentsPeer::FADEIN, $dbFadein['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcBlockcontentsPeer::FADEIN, $dbFadein, $comparison); + } + + /** + * Filter the query on the fadeout column + * + * Example usage: + * + * $query->filterByDbFadeout('2011-03-14'); // WHERE fadeout = '2011-03-14' + * $query->filterByDbFadeout('now'); // WHERE fadeout = '2011-03-14' + * $query->filterByDbFadeout(array('max' => 'yesterday')); // WHERE fadeout < '2011-03-13' + * + * + * @param mixed $dbFadeout The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function filterByDbFadeout($dbFadeout = null, $comparison = null) + { + if (is_array($dbFadeout)) { + $useMinMax = false; + if (isset($dbFadeout['min'])) { + $this->addUsingAlias(CcBlockcontentsPeer::FADEOUT, $dbFadeout['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbFadeout['max'])) { + $this->addUsingAlias(CcBlockcontentsPeer::FADEOUT, $dbFadeout['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcBlockcontentsPeer::FADEOUT, $dbFadeout, $comparison); + } + + /** + * Filter the query by a related CcFiles object + * + * @param CcFiles|PropelObjectCollection $ccFiles The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcontentsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcFiles($ccFiles, $comparison = null) + { + if ($ccFiles instanceof CcFiles) { + return $this + ->addUsingAlias(CcBlockcontentsPeer::FILE_ID, $ccFiles->getDbId(), $comparison); + } elseif ($ccFiles instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcBlockcontentsPeer::FILE_ID, $ccFiles->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcFiles() only accepts arguments of type CcFiles or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcFiles relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function joinCcFiles($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcFiles'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcFiles'); + } + + return $this; + } + + /** + * Use the CcFiles relation CcFiles object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery A secondary query class using the current class as primary query + */ + public function useCcFilesQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcFiles($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery'); + } + + /** + * Filter the query by a related CcBlock object + * + * @param CcBlock|PropelObjectCollection $ccBlock The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcontentsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcBlock($ccBlock, $comparison = null) + { + if ($ccBlock instanceof CcBlock) { + return $this + ->addUsingAlias(CcBlockcontentsPeer::BLOCK_ID, $ccBlock->getDbId(), $comparison); + } elseif ($ccBlock instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcBlockcontentsPeer::BLOCK_ID, $ccBlock->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcBlock() only accepts arguments of type CcBlock or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcBlock relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function joinCcBlock($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcBlock'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcBlock'); + } + + return $this; + } + + /** + * Use the CcBlock relation CcBlock object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockQuery A secondary query class using the current class as primary query + */ + public function useCcBlockQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcBlock($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcBlock', 'CcBlockQuery'); + } + + /** + * Exclude object from result + * + * @param CcBlockcontents $ccBlockcontents Object to remove from the list of results + * + * @return CcBlockcontentsQuery The current query, for fluid interface + */ + public function prune($ccBlockcontents = null) + { + if ($ccBlockcontents) { + $this->addUsingAlias(CcBlockcontentsPeer::ID, $ccBlockcontents->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } + + /** + * Code to execute before every DELETE statement + * + * @param PropelPDO $con The connection object used by the query + */ + protected function basePreDelete(PropelPDO $con) + { + // aggregate_column_relation behavior + $this->findRelatedCcBlocks($con); + + return $this->preDelete($con); + } + + /** + * Code to execute after every DELETE statement + * + * @param int $affectedRows the number of deleted rows + * @param PropelPDO $con The connection object used by the query + */ + protected function basePostDelete($affectedRows, PropelPDO $con) + { + // aggregate_column_relation behavior + $this->updateRelatedCcBlocks($con); + + return $this->postDelete($affectedRows, $con); + } + + /** + * Code to execute before every UPDATE statement + * + * @param array $values The associative array of columns and values for the update + * @param PropelPDO $con The connection object used by the query + * @param boolean $forceIndividualSaves If false (default), the resulting call is a BasePeer::doUpdate(), otherwise it is a series of save() calls on all the found objects + */ + protected function basePreUpdate(&$values, PropelPDO $con, $forceIndividualSaves = false) + { + // aggregate_column_relation behavior + $this->findRelatedCcBlocks($con); + + return $this->preUpdate($values, $con, $forceIndividualSaves); + } + + /** + * Code to execute after every UPDATE statement + * + * @param int $affectedRows the number of updated rows + * @param PropelPDO $con The connection object used by the query + */ + protected function basePostUpdate($affectedRows, PropelPDO $con) + { + // aggregate_column_relation behavior + $this->updateRelatedCcBlocks($con); + + return $this->postUpdate($affectedRows, $con); + } + + // aggregate_column_relation behavior + + /** + * Finds the related CcBlock objects and keep them for later + * + * @param PropelPDO $con A connection object + */ + protected function findRelatedCcBlocks($con) + { + $criteria = clone $this; + if ($this->useAliasInSQL) { + $alias = $this->getModelAlias(); + $criteria->removeAlias($alias); + } else { + $alias = ''; + } + $this->ccBlocks = CcBlockQuery::create() + ->joinCcBlockcontents($alias) + ->mergeWith($criteria) + ->find($con); + } + + protected function updateRelatedCcBlocks($con) + { + foreach ($this->ccBlocks as $ccBlock) { + $ccBlock->updateDbLength($con); + } + $this->ccBlocks = array(); + } - /** - * Initializes internal state of BaseCcBlockcontentsQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcBlockcontents', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcBlockcontentsQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcBlockcontentsQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcBlockcontentsQuery) { - return $criteria; - } - $query = new CcBlockcontentsQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcBlockcontents|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcBlockcontentsPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcBlockcontentsPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcBlockcontentsPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcBlockcontentsPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the block_id column - * - * @param int|array $dbBlockId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByDbBlockId($dbBlockId = null, $comparison = null) - { - if (is_array($dbBlockId)) { - $useMinMax = false; - if (isset($dbBlockId['min'])) { - $this->addUsingAlias(CcBlockcontentsPeer::BLOCK_ID, $dbBlockId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbBlockId['max'])) { - $this->addUsingAlias(CcBlockcontentsPeer::BLOCK_ID, $dbBlockId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcBlockcontentsPeer::BLOCK_ID, $dbBlockId, $comparison); - } - - /** - * Filter the query on the file_id column - * - * @param int|array $dbFileId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByDbFileId($dbFileId = null, $comparison = null) - { - if (is_array($dbFileId)) { - $useMinMax = false; - if (isset($dbFileId['min'])) { - $this->addUsingAlias(CcBlockcontentsPeer::FILE_ID, $dbFileId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbFileId['max'])) { - $this->addUsingAlias(CcBlockcontentsPeer::FILE_ID, $dbFileId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcBlockcontentsPeer::FILE_ID, $dbFileId, $comparison); - } - - /** - * Filter the query on the position column - * - * @param int|array $dbPosition The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByDbPosition($dbPosition = null, $comparison = null) - { - if (is_array($dbPosition)) { - $useMinMax = false; - if (isset($dbPosition['min'])) { - $this->addUsingAlias(CcBlockcontentsPeer::POSITION, $dbPosition['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbPosition['max'])) { - $this->addUsingAlias(CcBlockcontentsPeer::POSITION, $dbPosition['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcBlockcontentsPeer::POSITION, $dbPosition, $comparison); - } - - /** - * Filter the query on the trackoffset column - * - * @param double|array $dbTrackOffset The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByDbTrackOffset($dbTrackOffset = null, $comparison = null) - { - if (is_array($dbTrackOffset)) { - $useMinMax = false; - if (isset($dbTrackOffset['min'])) { - $this->addUsingAlias(CcBlockcontentsPeer::TRACKOFFSET, $dbTrackOffset['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbTrackOffset['max'])) { - $this->addUsingAlias(CcBlockcontentsPeer::TRACKOFFSET, $dbTrackOffset['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcBlockcontentsPeer::TRACKOFFSET, $dbTrackOffset, $comparison); - } - - /** - * Filter the query on the cliplength column - * - * @param string $dbCliplength The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByDbCliplength($dbCliplength = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCliplength)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCliplength)) { - $dbCliplength = str_replace('*', '%', $dbCliplength); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcBlockcontentsPeer::CLIPLENGTH, $dbCliplength, $comparison); - } - - /** - * Filter the query on the cuein column - * - * @param string $dbCuein The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByDbCuein($dbCuein = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCuein)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCuein)) { - $dbCuein = str_replace('*', '%', $dbCuein); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcBlockcontentsPeer::CUEIN, $dbCuein, $comparison); - } - - /** - * Filter the query on the cueout column - * - * @param string $dbCueout The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByDbCueout($dbCueout = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCueout)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCueout)) { - $dbCueout = str_replace('*', '%', $dbCueout); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcBlockcontentsPeer::CUEOUT, $dbCueout, $comparison); - } - - /** - * Filter the query on the fadein column - * - * @param string|array $dbFadein The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByDbFadein($dbFadein = null, $comparison = null) - { - if (is_array($dbFadein)) { - $useMinMax = false; - if (isset($dbFadein['min'])) { - $this->addUsingAlias(CcBlockcontentsPeer::FADEIN, $dbFadein['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbFadein['max'])) { - $this->addUsingAlias(CcBlockcontentsPeer::FADEIN, $dbFadein['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcBlockcontentsPeer::FADEIN, $dbFadein, $comparison); - } - - /** - * Filter the query on the fadeout column - * - * @param string|array $dbFadeout The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByDbFadeout($dbFadeout = null, $comparison = null) - { - if (is_array($dbFadeout)) { - $useMinMax = false; - if (isset($dbFadeout['min'])) { - $this->addUsingAlias(CcBlockcontentsPeer::FADEOUT, $dbFadeout['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbFadeout['max'])) { - $this->addUsingAlias(CcBlockcontentsPeer::FADEOUT, $dbFadeout['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcBlockcontentsPeer::FADEOUT, $dbFadeout, $comparison); - } - - /** - * Filter the query by a related CcFiles object - * - * @param CcFiles $ccFiles the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByCcFiles($ccFiles, $comparison = null) - { - return $this - ->addUsingAlias(CcBlockcontentsPeer::FILE_ID, $ccFiles->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcFiles relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function joinCcFiles($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcFiles'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcFiles'); - } - - return $this; - } - - /** - * Use the CcFiles relation CcFiles object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery A secondary query class using the current class as primary query - */ - public function useCcFilesQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcFiles($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery'); - } - - /** - * Filter the query by a related CcBlock object - * - * @param CcBlock $ccBlock the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function filterByCcBlock($ccBlock, $comparison = null) - { - return $this - ->addUsingAlias(CcBlockcontentsPeer::BLOCK_ID, $ccBlock->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcBlock relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function joinCcBlock($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcBlock'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcBlock'); - } - - return $this; - } - - /** - * Use the CcBlock relation CcBlock object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockQuery A secondary query class using the current class as primary query - */ - public function useCcBlockQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcBlock($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcBlock', 'CcBlockQuery'); - } - - /** - * Exclude object from result - * - * @param CcBlockcontents $ccBlockcontents Object to remove from the list of results - * - * @return CcBlockcontentsQuery The current query, for fluid interface - */ - public function prune($ccBlockcontents = null) - { - if ($ccBlockcontents) { - $this->addUsingAlias(CcBlockcontentsPeer::ID, $ccBlockcontents->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - - /** - * Code to execute before every DELETE statement - * - * @param PropelPDO $con The connection object used by the query - */ - protected function basePreDelete(PropelPDO $con) - { - // aggregate_column_relation behavior - $this->findRelatedCcBlocks($con); - - return $this->preDelete($con); - } - - /** - * Code to execute after every DELETE statement - * - * @param int $affectedRows the number of deleted rows - * @param PropelPDO $con The connection object used by the query - */ - protected function basePostDelete($affectedRows, PropelPDO $con) - { - // aggregate_column_relation behavior - $this->updateRelatedCcBlocks($con); - - return $this->postDelete($affectedRows, $con); - } - - /** - * Code to execute before every UPDATE statement - * - * @param array $values The associatiove array of columns and values for the update - * @param PropelPDO $con The connection object used by the query - * @param boolean $forceIndividualSaves If false (default), the resulting call is a BasePeer::doUpdate(), ortherwise it is a series of save() calls on all the found objects - */ - protected function basePreUpdate(&$values, PropelPDO $con, $forceIndividualSaves = false) - { - // aggregate_column_relation behavior - $this->findRelatedCcBlocks($con); - - return $this->preUpdate($values, $con, $forceIndividualSaves); - } - - /** - * Code to execute after every UPDATE statement - * - * @param int $affectedRows the number of udated rows - * @param PropelPDO $con The connection object used by the query - */ - protected function basePostUpdate($affectedRows, PropelPDO $con) - { - // aggregate_column_relation behavior - $this->updateRelatedCcBlocks($con); - - return $this->postUpdate($affectedRows, $con); - } - - // aggregate_column_relation behavior - - /** - * Finds the related CcBlock objects and keep them for later - * - * @param PropelPDO $con A connection object - */ - protected function findRelatedCcBlocks($con) - { - $criteria = clone $this; - if ($this->useAliasInSQL) { - $alias = $this->getModelAlias(); - $criteria->removeAlias($alias); - } else { - $alias = ''; - } - $this->ccBlocks = CcBlockQuery::create() - ->joinCcBlockcontents($alias) - ->mergeWith($criteria) - ->find($con); - } - - protected function updateRelatedCcBlocks($con) - { - foreach ($this->ccBlocks as $ccBlock) { - $ccBlock->updateDbLength($con); - } - $this->ccBlocks = array(); - } - -} // BaseCcBlockcontentsQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcBlockcriteria.php b/airtime_mvc/application/models/airtime/om/BaseCcBlockcriteria.php index 2982a3b868..069a8f96ef 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcBlockcriteria.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcBlockcriteria.php @@ -4,998 +4,1160 @@ /** * Base class that represents a row from the 'cc_blockcriteria' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcBlockcriteria extends BaseObject implements Persistent +abstract class BaseCcBlockcriteria extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcBlockcriteriaPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcBlockcriteriaPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the criteria field. - * @var string - */ - protected $criteria; - - /** - * The value for the modifier field. - * @var string - */ - protected $modifier; - - /** - * The value for the value field. - * @var string - */ - protected $value; - - /** - * The value for the extra field. - * @var string - */ - protected $extra; - - /** - * The value for the block_id field. - * @var int - */ - protected $block_id; - - /** - * @var CcBlock - */ - protected $aCcBlock; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [criteria] column value. - * - * @return string - */ - public function getDbCriteria() - { - return $this->criteria; - } - - /** - * Get the [modifier] column value. - * - * @return string - */ - public function getDbModifier() - { - return $this->modifier; - } - - /** - * Get the [value] column value. - * - * @return string - */ - public function getDbValue() - { - return $this->value; - } - - /** - * Get the [extra] column value. - * - * @return string - */ - public function getDbExtra() - { - return $this->extra; - } - - /** - * Get the [block_id] column value. - * - * @return int - */ - public function getDbBlockId() - { - return $this->block_id; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcBlockcriteria The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcBlockcriteriaPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [criteria] column. - * - * @param string $v new value - * @return CcBlockcriteria The current object (for fluent API support) - */ - public function setDbCriteria($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->criteria !== $v) { - $this->criteria = $v; - $this->modifiedColumns[] = CcBlockcriteriaPeer::CRITERIA; - } - - return $this; - } // setDbCriteria() - - /** - * Set the value of [modifier] column. - * - * @param string $v new value - * @return CcBlockcriteria The current object (for fluent API support) - */ - public function setDbModifier($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->modifier !== $v) { - $this->modifier = $v; - $this->modifiedColumns[] = CcBlockcriteriaPeer::MODIFIER; - } - - return $this; - } // setDbModifier() - - /** - * Set the value of [value] column. - * - * @param string $v new value - * @return CcBlockcriteria The current object (for fluent API support) - */ - public function setDbValue($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->value !== $v) { - $this->value = $v; - $this->modifiedColumns[] = CcBlockcriteriaPeer::VALUE; - } - - return $this; - } // setDbValue() - - /** - * Set the value of [extra] column. - * - * @param string $v new value - * @return CcBlockcriteria The current object (for fluent API support) - */ - public function setDbExtra($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->extra !== $v) { - $this->extra = $v; - $this->modifiedColumns[] = CcBlockcriteriaPeer::EXTRA; - } - - return $this; - } // setDbExtra() - - /** - * Set the value of [block_id] column. - * - * @param int $v new value - * @return CcBlockcriteria The current object (for fluent API support) - */ - public function setDbBlockId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->block_id !== $v) { - $this->block_id = $v; - $this->modifiedColumns[] = CcBlockcriteriaPeer::BLOCK_ID; - } - - if ($this->aCcBlock !== null && $this->aCcBlock->getDbId() !== $v) { - $this->aCcBlock = null; - } - - return $this; - } // setDbBlockId() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->criteria = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->modifier = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->value = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->extra = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; - $this->block_id = ($row[$startcol + 5] !== null) ? (int) $row[$startcol + 5] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 6; // 6 = CcBlockcriteriaPeer::NUM_COLUMNS - CcBlockcriteriaPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcBlockcriteria object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcBlock !== null && $this->block_id !== $this->aCcBlock->getDbId()) { - $this->aCcBlock = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcBlockcriteriaPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcBlock = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcBlockcriteriaQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcBlockcriteriaPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcBlock !== null) { - if ($this->aCcBlock->isModified() || $this->aCcBlock->isNew()) { - $affectedRows += $this->aCcBlock->save($con); - } - $this->setCcBlock($this->aCcBlock); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcBlockcriteriaPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcBlockcriteriaPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcBlockcriteriaPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcBlockcriteriaPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcBlock !== null) { - if (!$this->aCcBlock->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcBlock->getValidationFailures()); - } - } - - - if (($retval = CcBlockcriteriaPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcBlockcriteriaPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbCriteria(); - break; - case 2: - return $this->getDbModifier(); - break; - case 3: - return $this->getDbValue(); - break; - case 4: - return $this->getDbExtra(); - break; - case 5: - return $this->getDbBlockId(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcBlockcriteriaPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbCriteria(), - $keys[2] => $this->getDbModifier(), - $keys[3] => $this->getDbValue(), - $keys[4] => $this->getDbExtra(), - $keys[5] => $this->getDbBlockId(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcBlock) { - $result['CcBlock'] = $this->aCcBlock->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcBlockcriteriaPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbCriteria($value); - break; - case 2: - $this->setDbModifier($value); - break; - case 3: - $this->setDbValue($value); - break; - case 4: - $this->setDbExtra($value); - break; - case 5: - $this->setDbBlockId($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcBlockcriteriaPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbCriteria($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbModifier($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbValue($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbExtra($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setDbBlockId($arr[$keys[5]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcBlockcriteriaPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcBlockcriteriaPeer::ID)) $criteria->add(CcBlockcriteriaPeer::ID, $this->id); - if ($this->isColumnModified(CcBlockcriteriaPeer::CRITERIA)) $criteria->add(CcBlockcriteriaPeer::CRITERIA, $this->criteria); - if ($this->isColumnModified(CcBlockcriteriaPeer::MODIFIER)) $criteria->add(CcBlockcriteriaPeer::MODIFIER, $this->modifier); - if ($this->isColumnModified(CcBlockcriteriaPeer::VALUE)) $criteria->add(CcBlockcriteriaPeer::VALUE, $this->value); - if ($this->isColumnModified(CcBlockcriteriaPeer::EXTRA)) $criteria->add(CcBlockcriteriaPeer::EXTRA, $this->extra); - if ($this->isColumnModified(CcBlockcriteriaPeer::BLOCK_ID)) $criteria->add(CcBlockcriteriaPeer::BLOCK_ID, $this->block_id); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcBlockcriteriaPeer::DATABASE_NAME); - $criteria->add(CcBlockcriteriaPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcBlockcriteria (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbCriteria($this->criteria); - $copyObj->setDbModifier($this->modifier); - $copyObj->setDbValue($this->value); - $copyObj->setDbExtra($this->extra); - $copyObj->setDbBlockId($this->block_id); - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcBlockcriteria Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcBlockcriteriaPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcBlockcriteriaPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcBlock object. - * - * @param CcBlock $v - * @return CcBlockcriteria The current object (for fluent API support) - * @throws PropelException - */ - public function setCcBlock(CcBlock $v = null) - { - if ($v === null) { - $this->setDbBlockId(NULL); - } else { - $this->setDbBlockId($v->getDbId()); - } - - $this->aCcBlock = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcBlock object, it will not be re-added. - if ($v !== null) { - $v->addCcBlockcriteria($this); - } - - return $this; - } - - - /** - * Get the associated CcBlock object - * - * @param PropelPDO Optional Connection object. - * @return CcBlock The associated CcBlock object. - * @throws PropelException - */ - public function getCcBlock(PropelPDO $con = null) - { - if ($this->aCcBlock === null && ($this->block_id !== null)) { - $this->aCcBlock = CcBlockQuery::create()->findPk($this->block_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcBlock->addCcBlockcriterias($this); - */ - } - return $this->aCcBlock; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->criteria = null; - $this->modifier = null; - $this->value = null; - $this->extra = null; - $this->block_id = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcBlock = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcBlockcriteria + /** + * Peer class name + */ + const PEER = 'CcBlockcriteriaPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcBlockcriteriaPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the criteria field. + * @var string + */ + protected $criteria; + + /** + * The value for the modifier field. + * @var string + */ + protected $modifier; + + /** + * The value for the value field. + * @var string + */ + protected $value; + + /** + * The value for the extra field. + * @var string + */ + protected $extra; + + /** + * The value for the block_id field. + * @var int + */ + protected $block_id; + + /** + * @var CcBlock + */ + protected $aCcBlock; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [criteria] column value. + * + * @return string + */ + public function getDbCriteria() + { + + return $this->criteria; + } + + /** + * Get the [modifier] column value. + * + * @return string + */ + public function getDbModifier() + { + + return $this->modifier; + } + + /** + * Get the [value] column value. + * + * @return string + */ + public function getDbValue() + { + + return $this->value; + } + + /** + * Get the [extra] column value. + * + * @return string + */ + public function getDbExtra() + { + + return $this->extra; + } + + /** + * Get the [block_id] column value. + * + * @return int + */ + public function getDbBlockId() + { + + return $this->block_id; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcBlockcriteria The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcBlockcriteriaPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [criteria] column. + * + * @param string $v new value + * @return CcBlockcriteria The current object (for fluent API support) + */ + public function setDbCriteria($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->criteria !== $v) { + $this->criteria = $v; + $this->modifiedColumns[] = CcBlockcriteriaPeer::CRITERIA; + } + + + return $this; + } // setDbCriteria() + + /** + * Set the value of [modifier] column. + * + * @param string $v new value + * @return CcBlockcriteria The current object (for fluent API support) + */ + public function setDbModifier($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->modifier !== $v) { + $this->modifier = $v; + $this->modifiedColumns[] = CcBlockcriteriaPeer::MODIFIER; + } + + + return $this; + } // setDbModifier() + + /** + * Set the value of [value] column. + * + * @param string $v new value + * @return CcBlockcriteria The current object (for fluent API support) + */ + public function setDbValue($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->value !== $v) { + $this->value = $v; + $this->modifiedColumns[] = CcBlockcriteriaPeer::VALUE; + } + + + return $this; + } // setDbValue() + + /** + * Set the value of [extra] column. + * + * @param string $v new value + * @return CcBlockcriteria The current object (for fluent API support) + */ + public function setDbExtra($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->extra !== $v) { + $this->extra = $v; + $this->modifiedColumns[] = CcBlockcriteriaPeer::EXTRA; + } + + + return $this; + } // setDbExtra() + + /** + * Set the value of [block_id] column. + * + * @param int $v new value + * @return CcBlockcriteria The current object (for fluent API support) + */ + public function setDbBlockId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->block_id !== $v) { + $this->block_id = $v; + $this->modifiedColumns[] = CcBlockcriteriaPeer::BLOCK_ID; + } + + if ($this->aCcBlock !== null && $this->aCcBlock->getDbId() !== $v) { + $this->aCcBlock = null; + } + + + return $this; + } // setDbBlockId() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->criteria = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->modifier = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->value = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->extra = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; + $this->block_id = ($row[$startcol + 5] !== null) ? (int) $row[$startcol + 5] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 6; // 6 = CcBlockcriteriaPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcBlockcriteria object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcBlock !== null && $this->block_id !== $this->aCcBlock->getDbId()) { + $this->aCcBlock = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcBlockcriteriaPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcBlock = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcBlockcriteriaQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcBlockcriteriaPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcBlock !== null) { + if ($this->aCcBlock->isModified() || $this->aCcBlock->isNew()) { + $affectedRows += $this->aCcBlock->save($con); + } + $this->setCcBlock($this->aCcBlock); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcBlockcriteriaPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcBlockcriteriaPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_blockcriteria_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcBlockcriteriaPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcBlockcriteriaPeer::CRITERIA)) { + $modifiedColumns[':p' . $index++] = '"criteria"'; + } + if ($this->isColumnModified(CcBlockcriteriaPeer::MODIFIER)) { + $modifiedColumns[':p' . $index++] = '"modifier"'; + } + if ($this->isColumnModified(CcBlockcriteriaPeer::VALUE)) { + $modifiedColumns[':p' . $index++] = '"value"'; + } + if ($this->isColumnModified(CcBlockcriteriaPeer::EXTRA)) { + $modifiedColumns[':p' . $index++] = '"extra"'; + } + if ($this->isColumnModified(CcBlockcriteriaPeer::BLOCK_ID)) { + $modifiedColumns[':p' . $index++] = '"block_id"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_blockcriteria" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"criteria"': + $stmt->bindValue($identifier, $this->criteria, PDO::PARAM_STR); + break; + case '"modifier"': + $stmt->bindValue($identifier, $this->modifier, PDO::PARAM_STR); + break; + case '"value"': + $stmt->bindValue($identifier, $this->value, PDO::PARAM_STR); + break; + case '"extra"': + $stmt->bindValue($identifier, $this->extra, PDO::PARAM_STR); + break; + case '"block_id"': + $stmt->bindValue($identifier, $this->block_id, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcBlock !== null) { + if (!$this->aCcBlock->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcBlock->getValidationFailures()); + } + } + + + if (($retval = CcBlockcriteriaPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcBlockcriteriaPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbCriteria(); + break; + case 2: + return $this->getDbModifier(); + break; + case 3: + return $this->getDbValue(); + break; + case 4: + return $this->getDbExtra(); + break; + case 5: + return $this->getDbBlockId(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcBlockcriteria'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcBlockcriteria'][$this->getPrimaryKey()] = true; + $keys = CcBlockcriteriaPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbCriteria(), + $keys[2] => $this->getDbModifier(), + $keys[3] => $this->getDbValue(), + $keys[4] => $this->getDbExtra(), + $keys[5] => $this->getDbBlockId(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcBlock) { + $result['CcBlock'] = $this->aCcBlock->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcBlockcriteriaPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbCriteria($value); + break; + case 2: + $this->setDbModifier($value); + break; + case 3: + $this->setDbValue($value); + break; + case 4: + $this->setDbExtra($value); + break; + case 5: + $this->setDbBlockId($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcBlockcriteriaPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbCriteria($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbModifier($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbValue($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbExtra($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setDbBlockId($arr[$keys[5]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcBlockcriteriaPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcBlockcriteriaPeer::ID)) $criteria->add(CcBlockcriteriaPeer::ID, $this->id); + if ($this->isColumnModified(CcBlockcriteriaPeer::CRITERIA)) $criteria->add(CcBlockcriteriaPeer::CRITERIA, $this->criteria); + if ($this->isColumnModified(CcBlockcriteriaPeer::MODIFIER)) $criteria->add(CcBlockcriteriaPeer::MODIFIER, $this->modifier); + if ($this->isColumnModified(CcBlockcriteriaPeer::VALUE)) $criteria->add(CcBlockcriteriaPeer::VALUE, $this->value); + if ($this->isColumnModified(CcBlockcriteriaPeer::EXTRA)) $criteria->add(CcBlockcriteriaPeer::EXTRA, $this->extra); + if ($this->isColumnModified(CcBlockcriteriaPeer::BLOCK_ID)) $criteria->add(CcBlockcriteriaPeer::BLOCK_ID, $this->block_id); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcBlockcriteriaPeer::DATABASE_NAME); + $criteria->add(CcBlockcriteriaPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcBlockcriteria (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbCriteria($this->getDbCriteria()); + $copyObj->setDbModifier($this->getDbModifier()); + $copyObj->setDbValue($this->getDbValue()); + $copyObj->setDbExtra($this->getDbExtra()); + $copyObj->setDbBlockId($this->getDbBlockId()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcBlockcriteria Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcBlockcriteriaPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcBlockcriteriaPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcBlock object. + * + * @param CcBlock $v + * @return CcBlockcriteria The current object (for fluent API support) + * @throws PropelException + */ + public function setCcBlock(CcBlock $v = null) + { + if ($v === null) { + $this->setDbBlockId(NULL); + } else { + $this->setDbBlockId($v->getDbId()); + } + + $this->aCcBlock = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcBlock object, it will not be re-added. + if ($v !== null) { + $v->addCcBlockcriteria($this); + } + + + return $this; + } + + + /** + * Get the associated CcBlock object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcBlock The associated CcBlock object. + * @throws PropelException + */ + public function getCcBlock(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcBlock === null && ($this->block_id !== null) && $doQuery) { + $this->aCcBlock = CcBlockQuery::create()->findPk($this->block_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcBlock->addCcBlockcriterias($this); + */ + } + + return $this->aCcBlock; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->criteria = null; + $this->modifier = null; + $this->value = null; + $this->extra = null; + $this->block_id = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcBlock instanceof Persistent) { + $this->aCcBlock->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcBlock = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcBlockcriteriaPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcBlockcriteriaPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcBlockcriteriaPeer.php index a523024ad2..00024dfa6c 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcBlockcriteriaPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcBlockcriteriaPeer.php @@ -4,986 +4,1012 @@ /** * Base static class for performing query and update operations on the 'cc_blockcriteria' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcBlockcriteriaPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_blockcriteria'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcBlockcriteria'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcBlockcriteria'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcBlockcriteriaTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 6; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_blockcriteria.ID'; - - /** the column name for the CRITERIA field */ - const CRITERIA = 'cc_blockcriteria.CRITERIA'; - - /** the column name for the MODIFIER field */ - const MODIFIER = 'cc_blockcriteria.MODIFIER'; - - /** the column name for the VALUE field */ - const VALUE = 'cc_blockcriteria.VALUE'; - - /** the column name for the EXTRA field */ - const EXTRA = 'cc_blockcriteria.EXTRA'; - - /** the column name for the BLOCK_ID field */ - const BLOCK_ID = 'cc_blockcriteria.BLOCK_ID'; - - /** - * An identiy map to hold any loaded instances of CcBlockcriteria objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcBlockcriteria[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbCriteria', 'DbModifier', 'DbValue', 'DbExtra', 'DbBlockId', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbCriteria', 'dbModifier', 'dbValue', 'dbExtra', 'dbBlockId', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::CRITERIA, self::MODIFIER, self::VALUE, self::EXTRA, self::BLOCK_ID, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'CRITERIA', 'MODIFIER', 'VALUE', 'EXTRA', 'BLOCK_ID', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'criteria', 'modifier', 'value', 'extra', 'block_id', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbCriteria' => 1, 'DbModifier' => 2, 'DbValue' => 3, 'DbExtra' => 4, 'DbBlockId' => 5, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbCriteria' => 1, 'dbModifier' => 2, 'dbValue' => 3, 'dbExtra' => 4, 'dbBlockId' => 5, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::CRITERIA => 1, self::MODIFIER => 2, self::VALUE => 3, self::EXTRA => 4, self::BLOCK_ID => 5, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'CRITERIA' => 1, 'MODIFIER' => 2, 'VALUE' => 3, 'EXTRA' => 4, 'BLOCK_ID' => 5, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'criteria' => 1, 'modifier' => 2, 'value' => 3, 'extra' => 4, 'block_id' => 5, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcBlockcriteriaPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcBlockcriteriaPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcBlockcriteriaPeer::ID); - $criteria->addSelectColumn(CcBlockcriteriaPeer::CRITERIA); - $criteria->addSelectColumn(CcBlockcriteriaPeer::MODIFIER); - $criteria->addSelectColumn(CcBlockcriteriaPeer::VALUE); - $criteria->addSelectColumn(CcBlockcriteriaPeer::EXTRA); - $criteria->addSelectColumn(CcBlockcriteriaPeer::BLOCK_ID); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.CRITERIA'); - $criteria->addSelectColumn($alias . '.MODIFIER'); - $criteria->addSelectColumn($alias . '.VALUE'); - $criteria->addSelectColumn($alias . '.EXTRA'); - $criteria->addSelectColumn($alias . '.BLOCK_ID'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcBlockcriteriaPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcBlockcriteriaPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcBlockcriteria - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcBlockcriteriaPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcBlockcriteriaPeer::populateObjects(CcBlockcriteriaPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcBlockcriteriaPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcBlockcriteria $value A CcBlockcriteria object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcBlockcriteria $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcBlockcriteria object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcBlockcriteria) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcBlockcriteria object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcBlockcriteria Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_blockcriteria - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcBlockcriteriaPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcBlockcriteriaPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcBlockcriteriaPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcBlockcriteriaPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcBlockcriteria object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcBlockcriteriaPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcBlockcriteriaPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcBlockcriteriaPeer::NUM_COLUMNS; - } else { - $cls = CcBlockcriteriaPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcBlockcriteriaPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcBlock table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcBlock(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcBlockcriteriaPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcBlockcriteriaPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcBlockcriteriaPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcBlockcriteria objects pre-filled with their CcBlock objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcBlockcriteria objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcBlock(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcBlockcriteriaPeer::addSelectColumns($criteria); - $startcol = (CcBlockcriteriaPeer::NUM_COLUMNS - CcBlockcriteriaPeer::NUM_LAZY_LOAD_COLUMNS); - CcBlockPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcBlockcriteriaPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcBlockcriteriaPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcBlockcriteriaPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcBlockcriteriaPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcBlockcriteriaPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcBlockPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcBlockPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcBlockPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcBlockcriteria) to $obj2 (CcBlock) - $obj2->addCcBlockcriteria($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcBlockcriteriaPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcBlockcriteriaPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcBlockcriteriaPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcBlockcriteria objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcBlockcriteria objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcBlockcriteriaPeer::addSelectColumns($criteria); - $startcol2 = (CcBlockcriteriaPeer::NUM_COLUMNS - CcBlockcriteriaPeer::NUM_LAZY_LOAD_COLUMNS); - - CcBlockPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcBlockPeer::NUM_COLUMNS - CcBlockPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcBlockcriteriaPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcBlockcriteriaPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcBlockcriteriaPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcBlockcriteriaPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcBlockcriteriaPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcBlock rows - - $key2 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcBlockPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcBlockPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcBlockPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcBlockcriteria) to the collection in $obj2 (CcBlock) - $obj2->addCcBlockcriteria($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcBlockcriteriaPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcBlockcriteriaPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcBlockcriteriaTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcBlockcriteriaPeer::CLASS_DEFAULT : CcBlockcriteriaPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcBlockcriteria or Criteria object. - * - * @param mixed $values Criteria or CcBlockcriteria object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcBlockcriteria object - } - - if ($criteria->containsKey(CcBlockcriteriaPeer::ID) && $criteria->keyContainsValue(CcBlockcriteriaPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcBlockcriteriaPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcBlockcriteria or Criteria object. - * - * @param mixed $values Criteria or CcBlockcriteria object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcBlockcriteriaPeer::ID); - $value = $criteria->remove(CcBlockcriteriaPeer::ID); - if ($value) { - $selectCriteria->add(CcBlockcriteriaPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcBlockcriteriaPeer::TABLE_NAME); - } - - } else { // $values is CcBlockcriteria object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_blockcriteria table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcBlockcriteriaPeer::TABLE_NAME, $con, CcBlockcriteriaPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcBlockcriteriaPeer::clearInstancePool(); - CcBlockcriteriaPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcBlockcriteria or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcBlockcriteria object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcBlockcriteriaPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcBlockcriteria) { // it's a model object - // invalidate the cache for this single object - CcBlockcriteriaPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcBlockcriteriaPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcBlockcriteriaPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcBlockcriteriaPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcBlockcriteria object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcBlockcriteria $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcBlockcriteria $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcBlockcriteriaPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcBlockcriteriaPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcBlockcriteriaPeer::DATABASE_NAME, CcBlockcriteriaPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcBlockcriteria - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcBlockcriteriaPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcBlockcriteriaPeer::DATABASE_NAME); - $criteria->add(CcBlockcriteriaPeer::ID, $pk); - - $v = CcBlockcriteriaPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcBlockcriteriaPeer::DATABASE_NAME); - $criteria->add(CcBlockcriteriaPeer::ID, $pks, Criteria::IN); - $objs = CcBlockcriteriaPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcBlockcriteriaPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_blockcriteria'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcBlockcriteria'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcBlockcriteriaTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 6; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 6; + + /** the column name for the id field */ + const ID = 'cc_blockcriteria.id'; + + /** the column name for the criteria field */ + const CRITERIA = 'cc_blockcriteria.criteria'; + + /** the column name for the modifier field */ + const MODIFIER = 'cc_blockcriteria.modifier'; + + /** the column name for the value field */ + const VALUE = 'cc_blockcriteria.value'; + + /** the column name for the extra field */ + const EXTRA = 'cc_blockcriteria.extra'; + + /** the column name for the block_id field */ + const BLOCK_ID = 'cc_blockcriteria.block_id'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcBlockcriteria objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcBlockcriteria[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcBlockcriteriaPeer::$fieldNames[CcBlockcriteriaPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbCriteria', 'DbModifier', 'DbValue', 'DbExtra', 'DbBlockId', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbCriteria', 'dbModifier', 'dbValue', 'dbExtra', 'dbBlockId', ), + BasePeer::TYPE_COLNAME => array (CcBlockcriteriaPeer::ID, CcBlockcriteriaPeer::CRITERIA, CcBlockcriteriaPeer::MODIFIER, CcBlockcriteriaPeer::VALUE, CcBlockcriteriaPeer::EXTRA, CcBlockcriteriaPeer::BLOCK_ID, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'CRITERIA', 'MODIFIER', 'VALUE', 'EXTRA', 'BLOCK_ID', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'criteria', 'modifier', 'value', 'extra', 'block_id', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcBlockcriteriaPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbCriteria' => 1, 'DbModifier' => 2, 'DbValue' => 3, 'DbExtra' => 4, 'DbBlockId' => 5, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbCriteria' => 1, 'dbModifier' => 2, 'dbValue' => 3, 'dbExtra' => 4, 'dbBlockId' => 5, ), + BasePeer::TYPE_COLNAME => array (CcBlockcriteriaPeer::ID => 0, CcBlockcriteriaPeer::CRITERIA => 1, CcBlockcriteriaPeer::MODIFIER => 2, CcBlockcriteriaPeer::VALUE => 3, CcBlockcriteriaPeer::EXTRA => 4, CcBlockcriteriaPeer::BLOCK_ID => 5, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'CRITERIA' => 1, 'MODIFIER' => 2, 'VALUE' => 3, 'EXTRA' => 4, 'BLOCK_ID' => 5, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'criteria' => 1, 'modifier' => 2, 'value' => 3, 'extra' => 4, 'block_id' => 5, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcBlockcriteriaPeer::getFieldNames($toType); + $key = isset(CcBlockcriteriaPeer::$fieldKeys[$fromType][$name]) ? CcBlockcriteriaPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcBlockcriteriaPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcBlockcriteriaPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcBlockcriteriaPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcBlockcriteriaPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcBlockcriteriaPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcBlockcriteriaPeer::ID); + $criteria->addSelectColumn(CcBlockcriteriaPeer::CRITERIA); + $criteria->addSelectColumn(CcBlockcriteriaPeer::MODIFIER); + $criteria->addSelectColumn(CcBlockcriteriaPeer::VALUE); + $criteria->addSelectColumn(CcBlockcriteriaPeer::EXTRA); + $criteria->addSelectColumn(CcBlockcriteriaPeer::BLOCK_ID); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.criteria'); + $criteria->addSelectColumn($alias . '.modifier'); + $criteria->addSelectColumn($alias . '.value'); + $criteria->addSelectColumn($alias . '.extra'); + $criteria->addSelectColumn($alias . '.block_id'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcBlockcriteriaPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcBlockcriteriaPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcBlockcriteriaPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcBlockcriteria + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcBlockcriteriaPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcBlockcriteriaPeer::populateObjects(CcBlockcriteriaPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcBlockcriteriaPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcBlockcriteriaPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcBlockcriteria $obj A CcBlockcriteria object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcBlockcriteriaPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcBlockcriteria object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcBlockcriteria) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcBlockcriteria object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcBlockcriteriaPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcBlockcriteria Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcBlockcriteriaPeer::$instances[$key])) { + return CcBlockcriteriaPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcBlockcriteriaPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcBlockcriteriaPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_blockcriteria + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcBlockcriteriaPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcBlockcriteriaPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcBlockcriteriaPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcBlockcriteriaPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcBlockcriteria object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcBlockcriteriaPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcBlockcriteriaPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcBlockcriteriaPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcBlockcriteriaPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcBlockcriteriaPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcBlock table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcBlock(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcBlockcriteriaPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcBlockcriteriaPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcBlockcriteriaPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcBlockcriteriaPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcBlockcriteria objects pre-filled with their CcBlock objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcBlockcriteria objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcBlock(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcBlockcriteriaPeer::DATABASE_NAME); + } + + CcBlockcriteriaPeer::addSelectColumns($criteria); + $startcol = CcBlockcriteriaPeer::NUM_HYDRATE_COLUMNS; + CcBlockPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcBlockcriteriaPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcBlockcriteriaPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcBlockcriteriaPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcBlockcriteriaPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcBlockcriteriaPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcBlockPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcBlockPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcBlockPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcBlockcriteria) to $obj2 (CcBlock) + $obj2->addCcBlockcriteria($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcBlockcriteriaPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcBlockcriteriaPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcBlockcriteriaPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcBlockcriteriaPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcBlockcriteria objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcBlockcriteria objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcBlockcriteriaPeer::DATABASE_NAME); + } + + CcBlockcriteriaPeer::addSelectColumns($criteria); + $startcol2 = CcBlockcriteriaPeer::NUM_HYDRATE_COLUMNS; + + CcBlockPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcBlockPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcBlockcriteriaPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcBlockcriteriaPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcBlockcriteriaPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcBlockcriteriaPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcBlockcriteriaPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcBlock rows + + $key2 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcBlockPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcBlockPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcBlockPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcBlockcriteria) to the collection in $obj2 (CcBlock) + $obj2->addCcBlockcriteria($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcBlockcriteriaPeer::DATABASE_NAME)->getTable(CcBlockcriteriaPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcBlockcriteriaPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcBlockcriteriaPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcBlockcriteriaTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcBlockcriteriaPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcBlockcriteria or Criteria object. + * + * @param mixed $values Criteria or CcBlockcriteria object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcBlockcriteria object + } + + if ($criteria->containsKey(CcBlockcriteriaPeer::ID) && $criteria->keyContainsValue(CcBlockcriteriaPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcBlockcriteriaPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcBlockcriteriaPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcBlockcriteria or Criteria object. + * + * @param mixed $values Criteria or CcBlockcriteria object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcBlockcriteriaPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcBlockcriteriaPeer::ID); + $value = $criteria->remove(CcBlockcriteriaPeer::ID); + if ($value) { + $selectCriteria->add(CcBlockcriteriaPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcBlockcriteriaPeer::TABLE_NAME); + } + + } else { // $values is CcBlockcriteria object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcBlockcriteriaPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_blockcriteria table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcBlockcriteriaPeer::TABLE_NAME, $con, CcBlockcriteriaPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcBlockcriteriaPeer::clearInstancePool(); + CcBlockcriteriaPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcBlockcriteria or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcBlockcriteria object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcBlockcriteriaPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcBlockcriteria) { // it's a model object + // invalidate the cache for this single object + CcBlockcriteriaPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcBlockcriteriaPeer::DATABASE_NAME); + $criteria->add(CcBlockcriteriaPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcBlockcriteriaPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcBlockcriteriaPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcBlockcriteriaPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcBlockcriteria object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcBlockcriteria $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcBlockcriteriaPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcBlockcriteriaPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcBlockcriteriaPeer::DATABASE_NAME, CcBlockcriteriaPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcBlockcriteria + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcBlockcriteriaPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcBlockcriteriaPeer::DATABASE_NAME); + $criteria->add(CcBlockcriteriaPeer::ID, $pk); + + $v = CcBlockcriteriaPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcBlockcriteria[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcBlockcriteriaPeer::DATABASE_NAME); + $criteria->add(CcBlockcriteriaPeer::ID, $pks, Criteria::IN); + $objs = CcBlockcriteriaPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcBlockcriteriaPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcBlockcriteriaQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcBlockcriteriaQuery.php index 9baabbd742..c91212458c 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcBlockcriteriaQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcBlockcriteriaQuery.php @@ -4,369 +4,533 @@ /** * Base class that represents a query for the 'cc_blockcriteria' table. * - * * - * @method CcBlockcriteriaQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcBlockcriteriaQuery orderByDbCriteria($order = Criteria::ASC) Order by the criteria column - * @method CcBlockcriteriaQuery orderByDbModifier($order = Criteria::ASC) Order by the modifier column - * @method CcBlockcriteriaQuery orderByDbValue($order = Criteria::ASC) Order by the value column - * @method CcBlockcriteriaQuery orderByDbExtra($order = Criteria::ASC) Order by the extra column - * @method CcBlockcriteriaQuery orderByDbBlockId($order = Criteria::ASC) Order by the block_id column * - * @method CcBlockcriteriaQuery groupByDbId() Group by the id column - * @method CcBlockcriteriaQuery groupByDbCriteria() Group by the criteria column - * @method CcBlockcriteriaQuery groupByDbModifier() Group by the modifier column - * @method CcBlockcriteriaQuery groupByDbValue() Group by the value column - * @method CcBlockcriteriaQuery groupByDbExtra() Group by the extra column - * @method CcBlockcriteriaQuery groupByDbBlockId() Group by the block_id column + * @method CcBlockcriteriaQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcBlockcriteriaQuery orderByDbCriteria($order = Criteria::ASC) Order by the criteria column + * @method CcBlockcriteriaQuery orderByDbModifier($order = Criteria::ASC) Order by the modifier column + * @method CcBlockcriteriaQuery orderByDbValue($order = Criteria::ASC) Order by the value column + * @method CcBlockcriteriaQuery orderByDbExtra($order = Criteria::ASC) Order by the extra column + * @method CcBlockcriteriaQuery orderByDbBlockId($order = Criteria::ASC) Order by the block_id column * - * @method CcBlockcriteriaQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcBlockcriteriaQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcBlockcriteriaQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcBlockcriteriaQuery groupByDbId() Group by the id column + * @method CcBlockcriteriaQuery groupByDbCriteria() Group by the criteria column + * @method CcBlockcriteriaQuery groupByDbModifier() Group by the modifier column + * @method CcBlockcriteriaQuery groupByDbValue() Group by the value column + * @method CcBlockcriteriaQuery groupByDbExtra() Group by the extra column + * @method CcBlockcriteriaQuery groupByDbBlockId() Group by the block_id column * - * @method CcBlockcriteriaQuery leftJoinCcBlock($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcBlock relation - * @method CcBlockcriteriaQuery rightJoinCcBlock($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcBlock relation - * @method CcBlockcriteriaQuery innerJoinCcBlock($relationAlias = '') Adds a INNER JOIN clause to the query using the CcBlock relation + * @method CcBlockcriteriaQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcBlockcriteriaQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcBlockcriteriaQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcBlockcriteria findOne(PropelPDO $con = null) Return the first CcBlockcriteria matching the query - * @method CcBlockcriteria findOneOrCreate(PropelPDO $con = null) Return the first CcBlockcriteria matching the query, or a new CcBlockcriteria object populated from the query conditions when no match is found + * @method CcBlockcriteriaQuery leftJoinCcBlock($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcBlock relation + * @method CcBlockcriteriaQuery rightJoinCcBlock($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcBlock relation + * @method CcBlockcriteriaQuery innerJoinCcBlock($relationAlias = null) Adds a INNER JOIN clause to the query using the CcBlock relation * - * @method CcBlockcriteria findOneByDbId(int $id) Return the first CcBlockcriteria filtered by the id column - * @method CcBlockcriteria findOneByDbCriteria(string $criteria) Return the first CcBlockcriteria filtered by the criteria column - * @method CcBlockcriteria findOneByDbModifier(string $modifier) Return the first CcBlockcriteria filtered by the modifier column - * @method CcBlockcriteria findOneByDbValue(string $value) Return the first CcBlockcriteria filtered by the value column - * @method CcBlockcriteria findOneByDbExtra(string $extra) Return the first CcBlockcriteria filtered by the extra column - * @method CcBlockcriteria findOneByDbBlockId(int $block_id) Return the first CcBlockcriteria filtered by the block_id column + * @method CcBlockcriteria findOne(PropelPDO $con = null) Return the first CcBlockcriteria matching the query + * @method CcBlockcriteria findOneOrCreate(PropelPDO $con = null) Return the first CcBlockcriteria matching the query, or a new CcBlockcriteria object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcBlockcriteria objects filtered by the id column - * @method array findByDbCriteria(string $criteria) Return CcBlockcriteria objects filtered by the criteria column - * @method array findByDbModifier(string $modifier) Return CcBlockcriteria objects filtered by the modifier column - * @method array findByDbValue(string $value) Return CcBlockcriteria objects filtered by the value column - * @method array findByDbExtra(string $extra) Return CcBlockcriteria objects filtered by the extra column - * @method array findByDbBlockId(int $block_id) Return CcBlockcriteria objects filtered by the block_id column + * @method CcBlockcriteria findOneByDbCriteria(string $criteria) Return the first CcBlockcriteria filtered by the criteria column + * @method CcBlockcriteria findOneByDbModifier(string $modifier) Return the first CcBlockcriteria filtered by the modifier column + * @method CcBlockcriteria findOneByDbValue(string $value) Return the first CcBlockcriteria filtered by the value column + * @method CcBlockcriteria findOneByDbExtra(string $extra) Return the first CcBlockcriteria filtered by the extra column + * @method CcBlockcriteria findOneByDbBlockId(int $block_id) Return the first CcBlockcriteria filtered by the block_id column + * + * @method array findByDbId(int $id) Return CcBlockcriteria objects filtered by the id column + * @method array findByDbCriteria(string $criteria) Return CcBlockcriteria objects filtered by the criteria column + * @method array findByDbModifier(string $modifier) Return CcBlockcriteria objects filtered by the modifier column + * @method array findByDbValue(string $value) Return CcBlockcriteria objects filtered by the value column + * @method array findByDbExtra(string $extra) Return CcBlockcriteria objects filtered by the extra column + * @method array findByDbBlockId(int $block_id) Return CcBlockcriteria objects filtered by the block_id column * * @package propel.generator.airtime.om */ abstract class BaseCcBlockcriteriaQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcBlockcriteriaQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcBlockcriteria'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcBlockcriteriaQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcBlockcriteriaQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcBlockcriteriaQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcBlockcriteriaQuery) { + return $criteria; + } + $query = new CcBlockcriteriaQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcBlockcriteria|CcBlockcriteria[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcBlockcriteriaPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcBlockcriteriaPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcBlockcriteria A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcBlockcriteria A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "criteria", "modifier", "value", "extra", "block_id" FROM "cc_blockcriteria" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcBlockcriteria(); + $obj->hydrate($row); + CcBlockcriteriaPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcBlockcriteria|CcBlockcriteria[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcBlockcriteria[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcBlockcriteriaQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcBlockcriteriaPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcBlockcriteriaQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcBlockcriteriaPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcriteriaQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcBlockcriteriaPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcBlockcriteriaPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcBlockcriteriaPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the criteria column + * + * Example usage: + * + * $query->filterByDbCriteria('fooValue'); // WHERE criteria = 'fooValue' + * $query->filterByDbCriteria('%fooValue%'); // WHERE criteria LIKE '%fooValue%' + * + * + * @param string $dbCriteria The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcriteriaQuery The current query, for fluid interface + */ + public function filterByDbCriteria($dbCriteria = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCriteria)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCriteria)) { + $dbCriteria = str_replace('*', '%', $dbCriteria); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcBlockcriteriaPeer::CRITERIA, $dbCriteria, $comparison); + } + + /** + * Filter the query on the modifier column + * + * Example usage: + * + * $query->filterByDbModifier('fooValue'); // WHERE modifier = 'fooValue' + * $query->filterByDbModifier('%fooValue%'); // WHERE modifier LIKE '%fooValue%' + * + * + * @param string $dbModifier The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcriteriaQuery The current query, for fluid interface + */ + public function filterByDbModifier($dbModifier = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbModifier)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbModifier)) { + $dbModifier = str_replace('*', '%', $dbModifier); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcBlockcriteriaPeer::MODIFIER, $dbModifier, $comparison); + } + + /** + * Filter the query on the value column + * + * Example usage: + * + * $query->filterByDbValue('fooValue'); // WHERE value = 'fooValue' + * $query->filterByDbValue('%fooValue%'); // WHERE value LIKE '%fooValue%' + * + * + * @param string $dbValue The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcriteriaQuery The current query, for fluid interface + */ + public function filterByDbValue($dbValue = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbValue)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbValue)) { + $dbValue = str_replace('*', '%', $dbValue); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcBlockcriteriaPeer::VALUE, $dbValue, $comparison); + } + + /** + * Filter the query on the extra column + * + * Example usage: + * + * $query->filterByDbExtra('fooValue'); // WHERE extra = 'fooValue' + * $query->filterByDbExtra('%fooValue%'); // WHERE extra LIKE '%fooValue%' + * + * + * @param string $dbExtra The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcriteriaQuery The current query, for fluid interface + */ + public function filterByDbExtra($dbExtra = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbExtra)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbExtra)) { + $dbExtra = str_replace('*', '%', $dbExtra); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcBlockcriteriaPeer::EXTRA, $dbExtra, $comparison); + } + + /** + * Filter the query on the block_id column + * + * Example usage: + * + * $query->filterByDbBlockId(1234); // WHERE block_id = 1234 + * $query->filterByDbBlockId(array(12, 34)); // WHERE block_id IN (12, 34) + * $query->filterByDbBlockId(array('min' => 12)); // WHERE block_id >= 12 + * $query->filterByDbBlockId(array('max' => 12)); // WHERE block_id <= 12 + * + * + * @see filterByCcBlock() + * + * @param mixed $dbBlockId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcriteriaQuery The current query, for fluid interface + */ + public function filterByDbBlockId($dbBlockId = null, $comparison = null) + { + if (is_array($dbBlockId)) { + $useMinMax = false; + if (isset($dbBlockId['min'])) { + $this->addUsingAlias(CcBlockcriteriaPeer::BLOCK_ID, $dbBlockId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbBlockId['max'])) { + $this->addUsingAlias(CcBlockcriteriaPeer::BLOCK_ID, $dbBlockId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcBlockcriteriaPeer::BLOCK_ID, $dbBlockId, $comparison); + } + + /** + * Filter the query by a related CcBlock object + * + * @param CcBlock|PropelObjectCollection $ccBlock The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcBlockcriteriaQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcBlock($ccBlock, $comparison = null) + { + if ($ccBlock instanceof CcBlock) { + return $this + ->addUsingAlias(CcBlockcriteriaPeer::BLOCK_ID, $ccBlock->getDbId(), $comparison); + } elseif ($ccBlock instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcBlockcriteriaPeer::BLOCK_ID, $ccBlock->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcBlock() only accepts arguments of type CcBlock or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcBlock relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockcriteriaQuery The current query, for fluid interface + */ + public function joinCcBlock($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcBlock'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcBlock'); + } + + return $this; + } + + /** + * Use the CcBlock relation CcBlock object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockQuery A secondary query class using the current class as primary query + */ + public function useCcBlockQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcBlock($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcBlock', 'CcBlockQuery'); + } + + /** + * Exclude object from result + * + * @param CcBlockcriteria $ccBlockcriteria Object to remove from the list of results + * + * @return CcBlockcriteriaQuery The current query, for fluid interface + */ + public function prune($ccBlockcriteria = null) + { + if ($ccBlockcriteria) { + $this->addUsingAlias(CcBlockcriteriaPeer::ID, $ccBlockcriteria->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcBlockcriteriaQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcBlockcriteria', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcBlockcriteriaQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcBlockcriteriaQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcBlockcriteriaQuery) { - return $criteria; - } - $query = new CcBlockcriteriaQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcBlockcriteria|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcBlockcriteriaPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcBlockcriteriaQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcBlockcriteriaPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcBlockcriteriaQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcBlockcriteriaPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcriteriaQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcBlockcriteriaPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the criteria column - * - * @param string $dbCriteria The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcriteriaQuery The current query, for fluid interface - */ - public function filterByDbCriteria($dbCriteria = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCriteria)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCriteria)) { - $dbCriteria = str_replace('*', '%', $dbCriteria); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcBlockcriteriaPeer::CRITERIA, $dbCriteria, $comparison); - } - - /** - * Filter the query on the modifier column - * - * @param string $dbModifier The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcriteriaQuery The current query, for fluid interface - */ - public function filterByDbModifier($dbModifier = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbModifier)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbModifier)) { - $dbModifier = str_replace('*', '%', $dbModifier); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcBlockcriteriaPeer::MODIFIER, $dbModifier, $comparison); - } - - /** - * Filter the query on the value column - * - * @param string $dbValue The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcriteriaQuery The current query, for fluid interface - */ - public function filterByDbValue($dbValue = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbValue)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbValue)) { - $dbValue = str_replace('*', '%', $dbValue); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcBlockcriteriaPeer::VALUE, $dbValue, $comparison); - } - - /** - * Filter the query on the extra column - * - * @param string $dbExtra The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcriteriaQuery The current query, for fluid interface - */ - public function filterByDbExtra($dbExtra = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbExtra)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbExtra)) { - $dbExtra = str_replace('*', '%', $dbExtra); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcBlockcriteriaPeer::EXTRA, $dbExtra, $comparison); - } - - /** - * Filter the query on the block_id column - * - * @param int|array $dbBlockId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcriteriaQuery The current query, for fluid interface - */ - public function filterByDbBlockId($dbBlockId = null, $comparison = null) - { - if (is_array($dbBlockId)) { - $useMinMax = false; - if (isset($dbBlockId['min'])) { - $this->addUsingAlias(CcBlockcriteriaPeer::BLOCK_ID, $dbBlockId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbBlockId['max'])) { - $this->addUsingAlias(CcBlockcriteriaPeer::BLOCK_ID, $dbBlockId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcBlockcriteriaPeer::BLOCK_ID, $dbBlockId, $comparison); - } - - /** - * Filter the query by a related CcBlock object - * - * @param CcBlock $ccBlock the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcBlockcriteriaQuery The current query, for fluid interface - */ - public function filterByCcBlock($ccBlock, $comparison = null) - { - return $this - ->addUsingAlias(CcBlockcriteriaPeer::BLOCK_ID, $ccBlock->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcBlock relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockcriteriaQuery The current query, for fluid interface - */ - public function joinCcBlock($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcBlock'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcBlock'); - } - - return $this; - } - - /** - * Use the CcBlock relation CcBlock object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockQuery A secondary query class using the current class as primary query - */ - public function useCcBlockQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcBlock($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcBlock', 'CcBlockQuery'); - } - - /** - * Exclude object from result - * - * @param CcBlockcriteria $ccBlockcriteria Object to remove from the list of results - * - * @return CcBlockcriteriaQuery The current query, for fluid interface - */ - public function prune($ccBlockcriteria = null) - { - if ($ccBlockcriteria) { - $this->addUsingAlias(CcBlockcriteriaPeer::ID, $ccBlockcriteria->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcBlockcriteriaQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcCountry.php b/airtime_mvc/application/models/airtime/om/BaseCcCountry.php index 3f92c5493d..dee0b4a903 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcCountry.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcCountry.php @@ -4,705 +4,811 @@ /** * Base class that represents a row from the 'cc_country' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcCountry extends BaseObject implements Persistent +abstract class BaseCcCountry extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcCountryPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcCountryPeer - */ - protected static $peer; - - /** - * The value for the isocode field. - * @var string - */ - protected $isocode; - - /** - * The value for the name field. - * @var string - */ - protected $name; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [isocode] column value. - * - * @return string - */ - public function getDbIsoCode() - { - return $this->isocode; - } - - /** - * Get the [name] column value. - * - * @return string - */ - public function getDbName() - { - return $this->name; - } - - /** - * Set the value of [isocode] column. - * - * @param string $v new value - * @return CcCountry The current object (for fluent API support) - */ - public function setDbIsoCode($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->isocode !== $v) { - $this->isocode = $v; - $this->modifiedColumns[] = CcCountryPeer::ISOCODE; - } - - return $this; - } // setDbIsoCode() - - /** - * Set the value of [name] column. - * - * @param string $v new value - * @return CcCountry The current object (for fluent API support) - */ - public function setDbName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->name !== $v) { - $this->name = $v; - $this->modifiedColumns[] = CcCountryPeer::NAME; - } - - return $this; - } // setDbName() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->isocode = ($row[$startcol + 0] !== null) ? (string) $row[$startcol + 0] : null; - $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 2; // 2 = CcCountryPeer::NUM_COLUMNS - CcCountryPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcCountry object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcCountryPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcCountryQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcCountryPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setNew(false); - } else { - $affectedRows = CcCountryPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcCountryPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcCountryPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbIsoCode(); - break; - case 1: - return $this->getDbName(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcCountryPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbIsoCode(), - $keys[1] => $this->getDbName(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcCountryPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbIsoCode($value); - break; - case 1: - $this->setDbName($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcCountryPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbIsoCode($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcCountryPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcCountryPeer::ISOCODE)) $criteria->add(CcCountryPeer::ISOCODE, $this->isocode); - if ($this->isColumnModified(CcCountryPeer::NAME)) $criteria->add(CcCountryPeer::NAME, $this->name); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcCountryPeer::DATABASE_NAME); - $criteria->add(CcCountryPeer::ISOCODE, $this->isocode); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return string - */ - public function getPrimaryKey() - { - return $this->getDbIsoCode(); - } - - /** - * Generic method to set the primary key (isocode column). - * - * @param string $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbIsoCode($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbIsoCode(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcCountry (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbIsoCode($this->isocode); - $copyObj->setDbName($this->name); - - $copyObj->setNew(true); - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcCountry Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcCountryPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcCountryPeer(); - } - return self::$peer; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->isocode = null; - $this->name = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcCountry + /** + * Peer class name + */ + const PEER = 'CcCountryPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcCountryPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the isocode field. + * @var string + */ + protected $isocode; + + /** + * The value for the name field. + * @var string + */ + protected $name; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [isocode] column value. + * + * @return string + */ + public function getDbIsoCode() + { + + return $this->isocode; + } + + /** + * Get the [name] column value. + * + * @return string + */ + public function getDbName() + { + + return $this->name; + } + + /** + * Set the value of [isocode] column. + * + * @param string $v new value + * @return CcCountry The current object (for fluent API support) + */ + public function setDbIsoCode($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->isocode !== $v) { + $this->isocode = $v; + $this->modifiedColumns[] = CcCountryPeer::ISOCODE; + } + + + return $this; + } // setDbIsoCode() + + /** + * Set the value of [name] column. + * + * @param string $v new value + * @return CcCountry The current object (for fluent API support) + */ + public function setDbName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->name !== $v) { + $this->name = $v; + $this->modifiedColumns[] = CcCountryPeer::NAME; + } + + + return $this; + } // setDbName() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->isocode = ($row[$startcol + 0] !== null) ? (string) $row[$startcol + 0] : null; + $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 2; // 2 = CcCountryPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcCountry object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcCountryPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcCountryQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcCountryPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcCountryPeer::ISOCODE)) { + $modifiedColumns[':p' . $index++] = '"isocode"'; + } + if ($this->isColumnModified(CcCountryPeer::NAME)) { + $modifiedColumns[':p' . $index++] = '"name"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_country" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"isocode"': + $stmt->bindValue($identifier, $this->isocode, PDO::PARAM_STR); + break; + case '"name"': + $stmt->bindValue($identifier, $this->name, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcCountryPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcCountryPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbIsoCode(); + break; + case 1: + return $this->getDbName(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array()) + { + if (isset($alreadyDumpedObjects['CcCountry'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcCountry'][$this->getPrimaryKey()] = true; + $keys = CcCountryPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbIsoCode(), + $keys[1] => $this->getDbName(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcCountryPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbIsoCode($value); + break; + case 1: + $this->setDbName($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcCountryPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbIsoCode($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcCountryPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcCountryPeer::ISOCODE)) $criteria->add(CcCountryPeer::ISOCODE, $this->isocode); + if ($this->isColumnModified(CcCountryPeer::NAME)) $criteria->add(CcCountryPeer::NAME, $this->name); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcCountryPeer::DATABASE_NAME); + $criteria->add(CcCountryPeer::ISOCODE, $this->isocode); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return string + */ + public function getPrimaryKey() + { + return $this->getDbIsoCode(); + } + + /** + * Generic method to set the primary key (isocode column). + * + * @param string $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbIsoCode($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbIsoCode(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcCountry (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbName($this->getDbName()); + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbIsoCode(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcCountry Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcCountryPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcCountryPeer(); + } + + return self::$peer; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->isocode = null; + $this->name = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcCountryPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcCountryPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcCountryPeer.php index ee16e55bf3..2970e29e07 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcCountryPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcCountryPeer.php @@ -4,728 +4,750 @@ /** * Base static class for performing query and update operations on the 'cc_country' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcCountryPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_country'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcCountry'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcCountry'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcCountryTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 2; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ISOCODE field */ - const ISOCODE = 'cc_country.ISOCODE'; - - /** the column name for the NAME field */ - const NAME = 'cc_country.NAME'; - - /** - * An identiy map to hold any loaded instances of CcCountry objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcCountry[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbIsoCode', 'DbName', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbIsoCode', 'dbName', ), - BasePeer::TYPE_COLNAME => array (self::ISOCODE, self::NAME, ), - BasePeer::TYPE_RAW_COLNAME => array ('ISOCODE', 'NAME', ), - BasePeer::TYPE_FIELDNAME => array ('isocode', 'name', ), - BasePeer::TYPE_NUM => array (0, 1, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbIsoCode' => 0, 'DbName' => 1, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbIsoCode' => 0, 'dbName' => 1, ), - BasePeer::TYPE_COLNAME => array (self::ISOCODE => 0, self::NAME => 1, ), - BasePeer::TYPE_RAW_COLNAME => array ('ISOCODE' => 0, 'NAME' => 1, ), - BasePeer::TYPE_FIELDNAME => array ('isocode' => 0, 'name' => 1, ), - BasePeer::TYPE_NUM => array (0, 1, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcCountryPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcCountryPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcCountryPeer::ISOCODE); - $criteria->addSelectColumn(CcCountryPeer::NAME); - } else { - $criteria->addSelectColumn($alias . '.ISOCODE'); - $criteria->addSelectColumn($alias . '.NAME'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcCountryPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcCountryPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcCountry - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcCountryPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcCountryPeer::populateObjects(CcCountryPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcCountryPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcCountry $value A CcCountry object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcCountry $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbIsoCode(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcCountry object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcCountry) { - $key = (string) $value->getDbIsoCode(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcCountry object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcCountry Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_country - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (string) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcCountryPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcCountryPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcCountryPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcCountryPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcCountry object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcCountryPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcCountryPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcCountryPeer::NUM_COLUMNS; - } else { - $cls = CcCountryPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcCountryPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcCountryPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcCountryPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcCountryTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcCountryPeer::CLASS_DEFAULT : CcCountryPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcCountry or Criteria object. - * - * @param mixed $values Criteria or CcCountry object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcCountry object - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcCountry or Criteria object. - * - * @param mixed $values Criteria or CcCountry object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcCountryPeer::ISOCODE); - $value = $criteria->remove(CcCountryPeer::ISOCODE); - if ($value) { - $selectCriteria->add(CcCountryPeer::ISOCODE, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcCountryPeer::TABLE_NAME); - } - - } else { // $values is CcCountry object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_country table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcCountryPeer::TABLE_NAME, $con, CcCountryPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcCountryPeer::clearInstancePool(); - CcCountryPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcCountry or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcCountry object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcCountryPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcCountry) { // it's a model object - // invalidate the cache for this single object - CcCountryPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcCountryPeer::ISOCODE, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcCountryPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcCountryPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcCountry object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcCountry $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcCountry $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcCountryPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcCountryPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcCountryPeer::DATABASE_NAME, CcCountryPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param string $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcCountry - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcCountryPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcCountryPeer::DATABASE_NAME); - $criteria->add(CcCountryPeer::ISOCODE, $pk); - - $v = CcCountryPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcCountryPeer::DATABASE_NAME); - $criteria->add(CcCountryPeer::ISOCODE, $pks, Criteria::IN); - $objs = CcCountryPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcCountryPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_country'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcCountry'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcCountryTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 2; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 2; + + /** the column name for the isocode field */ + const ISOCODE = 'cc_country.isocode'; + + /** the column name for the name field */ + const NAME = 'cc_country.name'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcCountry objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcCountry[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcCountryPeer::$fieldNames[CcCountryPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbIsoCode', 'DbName', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbIsoCode', 'dbName', ), + BasePeer::TYPE_COLNAME => array (CcCountryPeer::ISOCODE, CcCountryPeer::NAME, ), + BasePeer::TYPE_RAW_COLNAME => array ('ISOCODE', 'NAME', ), + BasePeer::TYPE_FIELDNAME => array ('isocode', 'name', ), + BasePeer::TYPE_NUM => array (0, 1, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcCountryPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbIsoCode' => 0, 'DbName' => 1, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbIsoCode' => 0, 'dbName' => 1, ), + BasePeer::TYPE_COLNAME => array (CcCountryPeer::ISOCODE => 0, CcCountryPeer::NAME => 1, ), + BasePeer::TYPE_RAW_COLNAME => array ('ISOCODE' => 0, 'NAME' => 1, ), + BasePeer::TYPE_FIELDNAME => array ('isocode' => 0, 'name' => 1, ), + BasePeer::TYPE_NUM => array (0, 1, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcCountryPeer::getFieldNames($toType); + $key = isset(CcCountryPeer::$fieldKeys[$fromType][$name]) ? CcCountryPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcCountryPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcCountryPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcCountryPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcCountryPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcCountryPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcCountryPeer::ISOCODE); + $criteria->addSelectColumn(CcCountryPeer::NAME); + } else { + $criteria->addSelectColumn($alias . '.isocode'); + $criteria->addSelectColumn($alias . '.name'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcCountryPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcCountryPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcCountryPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcCountry + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcCountryPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcCountryPeer::populateObjects(CcCountryPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcCountryPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcCountryPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcCountry $obj A CcCountry object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbIsoCode(); + } // if key === null + CcCountryPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcCountry object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcCountry) { + $key = (string) $value->getDbIsoCode(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcCountry object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcCountryPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcCountry Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcCountryPeer::$instances[$key])) { + return CcCountryPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcCountryPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcCountryPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_country + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (string) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcCountryPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcCountryPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcCountryPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcCountryPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcCountry object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcCountryPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcCountryPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcCountryPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcCountryPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcCountryPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcCountryPeer::DATABASE_NAME)->getTable(CcCountryPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcCountryPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcCountryPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcCountryTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcCountryPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcCountry or Criteria object. + * + * @param mixed $values Criteria or CcCountry object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcCountry object + } + + + // Set the correct dbName + $criteria->setDbName(CcCountryPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcCountry or Criteria object. + * + * @param mixed $values Criteria or CcCountry object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcCountryPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcCountryPeer::ISOCODE); + $value = $criteria->remove(CcCountryPeer::ISOCODE); + if ($value) { + $selectCriteria->add(CcCountryPeer::ISOCODE, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcCountryPeer::TABLE_NAME); + } + + } else { // $values is CcCountry object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcCountryPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_country table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcCountryPeer::TABLE_NAME, $con, CcCountryPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcCountryPeer::clearInstancePool(); + CcCountryPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcCountry or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcCountry object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcCountryPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcCountry) { // it's a model object + // invalidate the cache for this single object + CcCountryPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcCountryPeer::DATABASE_NAME); + $criteria->add(CcCountryPeer::ISOCODE, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcCountryPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcCountryPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcCountryPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcCountry object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcCountry $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcCountryPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcCountryPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcCountryPeer::DATABASE_NAME, CcCountryPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param string $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcCountry + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcCountryPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcCountryPeer::DATABASE_NAME); + $criteria->add(CcCountryPeer::ISOCODE, $pk); + + $v = CcCountryPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcCountry[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcCountryPeer::DATABASE_NAME); + $criteria->add(CcCountryPeer::ISOCODE, $pks, Criteria::IN); + $objs = CcCountryPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcCountryPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcCountryQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcCountryQuery.php index 4e634ea19e..85fd27e757 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcCountryQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcCountryQuery.php @@ -4,193 +4,293 @@ /** * Base class that represents a query for the 'cc_country' table. * - * * - * @method CcCountryQuery orderByDbIsoCode($order = Criteria::ASC) Order by the isocode column - * @method CcCountryQuery orderByDbName($order = Criteria::ASC) Order by the name column * - * @method CcCountryQuery groupByDbIsoCode() Group by the isocode column - * @method CcCountryQuery groupByDbName() Group by the name column + * @method CcCountryQuery orderByDbIsoCode($order = Criteria::ASC) Order by the isocode column + * @method CcCountryQuery orderByDbName($order = Criteria::ASC) Order by the name column * - * @method CcCountryQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcCountryQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcCountryQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcCountryQuery groupByDbIsoCode() Group by the isocode column + * @method CcCountryQuery groupByDbName() Group by the name column * - * @method CcCountry findOne(PropelPDO $con = null) Return the first CcCountry matching the query - * @method CcCountry findOneOrCreate(PropelPDO $con = null) Return the first CcCountry matching the query, or a new CcCountry object populated from the query conditions when no match is found + * @method CcCountryQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcCountryQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcCountryQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcCountry findOneByDbIsoCode(string $isocode) Return the first CcCountry filtered by the isocode column - * @method CcCountry findOneByDbName(string $name) Return the first CcCountry filtered by the name column + * @method CcCountry findOne(PropelPDO $con = null) Return the first CcCountry matching the query + * @method CcCountry findOneOrCreate(PropelPDO $con = null) Return the first CcCountry matching the query, or a new CcCountry object populated from the query conditions when no match is found * - * @method array findByDbIsoCode(string $isocode) Return CcCountry objects filtered by the isocode column - * @method array findByDbName(string $name) Return CcCountry objects filtered by the name column + * @method CcCountry findOneByDbName(string $name) Return the first CcCountry filtered by the name column + * + * @method array findByDbIsoCode(string $isocode) Return CcCountry objects filtered by the isocode column + * @method array findByDbName(string $name) Return CcCountry objects filtered by the name column * * @package propel.generator.airtime.om */ abstract class BaseCcCountryQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcCountryQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcCountry'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcCountryQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcCountryQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcCountryQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcCountryQuery) { + return $criteria; + } + $query = new CcCountryQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcCountry|CcCountry[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcCountryPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcCountryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcCountry A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbIsoCode($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcCountry A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "isocode", "name" FROM "cc_country" WHERE "isocode" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_STR); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcCountry(); + $obj->hydrate($row); + CcCountryPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcCountry|CcCountry[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcCountry[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcCountryQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcCountryPeer::ISOCODE, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcCountryQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcCountryPeer::ISOCODE, $keys, Criteria::IN); + } + + /** + * Filter the query on the isocode column + * + * Example usage: + * + * $query->filterByDbIsoCode('fooValue'); // WHERE isocode = 'fooValue' + * $query->filterByDbIsoCode('%fooValue%'); // WHERE isocode LIKE '%fooValue%' + * + * + * @param string $dbIsoCode The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcCountryQuery The current query, for fluid interface + */ + public function filterByDbIsoCode($dbIsoCode = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbIsoCode)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbIsoCode)) { + $dbIsoCode = str_replace('*', '%', $dbIsoCode); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcCountryPeer::ISOCODE, $dbIsoCode, $comparison); + } + + /** + * Filter the query on the name column + * + * Example usage: + * + * $query->filterByDbName('fooValue'); // WHERE name = 'fooValue' + * $query->filterByDbName('%fooValue%'); // WHERE name LIKE '%fooValue%' + * + * + * @param string $dbName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcCountryQuery The current query, for fluid interface + */ + public function filterByDbName($dbName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbName)) { + $dbName = str_replace('*', '%', $dbName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcCountryPeer::NAME, $dbName, $comparison); + } + + /** + * Exclude object from result + * + * @param CcCountry $ccCountry Object to remove from the list of results + * + * @return CcCountryQuery The current query, for fluid interface + */ + public function prune($ccCountry = null) + { + if ($ccCountry) { + $this->addUsingAlias(CcCountryPeer::ISOCODE, $ccCountry->getDbIsoCode(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcCountryQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcCountry', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcCountryQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcCountryQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcCountryQuery) { - return $criteria; - } - $query = new CcCountryQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcCountry|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcCountryPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcCountryQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcCountryPeer::ISOCODE, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcCountryQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcCountryPeer::ISOCODE, $keys, Criteria::IN); - } - - /** - * Filter the query on the isocode column - * - * @param string $dbIsoCode The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcCountryQuery The current query, for fluid interface - */ - public function filterByDbIsoCode($dbIsoCode = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbIsoCode)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbIsoCode)) { - $dbIsoCode = str_replace('*', '%', $dbIsoCode); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcCountryPeer::ISOCODE, $dbIsoCode, $comparison); - } - - /** - * Filter the query on the name column - * - * @param string $dbName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcCountryQuery The current query, for fluid interface - */ - public function filterByDbName($dbName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbName)) { - $dbName = str_replace('*', '%', $dbName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcCountryPeer::NAME, $dbName, $comparison); - } - - /** - * Exclude object from result - * - * @param CcCountry $ccCountry Object to remove from the list of results - * - * @return CcCountryQuery The current query, for fluid interface - */ - public function prune($ccCountry = null) - { - if ($ccCountry) { - $this->addUsingAlias(CcCountryPeer::ISOCODE, $ccCountry->getDbIsoCode(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcCountryQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php index 0277866240..d23bd7a690 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php @@ -4,5517 +4,6857 @@ /** * Base class that represents a row from the 'cc_files' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcFiles extends BaseObject implements Persistent +abstract class BaseCcFiles extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcFilesPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcFilesPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the name field. - * Note: this column has a database default value of: '' - * @var string - */ - protected $name; - - /** - * The value for the mime field. - * Note: this column has a database default value of: '' - * @var string - */ - protected $mime; - - /** - * The value for the ftype field. - * Note: this column has a database default value of: '' - * @var string - */ - protected $ftype; - - /** - * The value for the directory field. - * @var int - */ - protected $directory; - - /** - * The value for the filepath field. - * Note: this column has a database default value of: '' - * @var string - */ - protected $filepath; - - /** - * The value for the import_status field. - * Note: this column has a database default value of: 1 - * @var int - */ - protected $import_status; - - /** - * The value for the currentlyaccessing field. - * Note: this column has a database default value of: 0 - * @var int - */ - protected $currentlyaccessing; - - /** - * The value for the editedby field. - * @var int - */ - protected $editedby; - - /** - * The value for the mtime field. - * @var string - */ - protected $mtime; - - /** - * The value for the utime field. - * @var string - */ - protected $utime; - - /** - * The value for the lptime field. - * @var string - */ - protected $lptime; - - /** - * The value for the md5 field. - * @var string - */ - protected $md5; - - /** - * The value for the track_title field. - * @var string - */ - protected $track_title; - - /** - * The value for the artist_name field. - * @var string - */ - protected $artist_name; - - /** - * The value for the bit_rate field. - * @var int - */ - protected $bit_rate; - - /** - * The value for the sample_rate field. - * @var int - */ - protected $sample_rate; - - /** - * The value for the format field. - * @var string - */ - protected $format; - - /** - * The value for the length field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $length; - - /** - * The value for the album_title field. - * @var string - */ - protected $album_title; - - /** - * The value for the genre field. - * @var string - */ - protected $genre; - - /** - * The value for the comments field. - * @var string - */ - protected $comments; - - /** - * The value for the year field. - * @var string - */ - protected $year; - - /** - * The value for the track_number field. - * @var int - */ - protected $track_number; - - /** - * The value for the channels field. - * @var int - */ - protected $channels; - - /** - * The value for the url field. - * @var string - */ - protected $url; - - /** - * The value for the bpm field. - * @var int - */ - protected $bpm; - - /** - * The value for the rating field. - * @var string - */ - protected $rating; - - /** - * The value for the encoded_by field. - * @var string - */ - protected $encoded_by; - - /** - * The value for the disc_number field. - * @var string - */ - protected $disc_number; - - /** - * The value for the mood field. - * @var string - */ - protected $mood; - - /** - * The value for the label field. - * @var string - */ - protected $label; - - /** - * The value for the composer field. - * @var string - */ - protected $composer; - - /** - * The value for the encoder field. - * @var string - */ - protected $encoder; - - /** - * The value for the checksum field. - * @var string - */ - protected $checksum; - - /** - * The value for the lyrics field. - * @var string - */ - protected $lyrics; - - /** - * The value for the orchestra field. - * @var string - */ - protected $orchestra; - - /** - * The value for the conductor field. - * @var string - */ - protected $conductor; - - /** - * The value for the lyricist field. - * @var string - */ - protected $lyricist; - - /** - * The value for the original_lyricist field. - * @var string - */ - protected $original_lyricist; - - /** - * The value for the radio_station_name field. - * @var string - */ - protected $radio_station_name; - - /** - * The value for the info_url field. - * @var string - */ - protected $info_url; - - /** - * The value for the artist_url field. - * @var string - */ - protected $artist_url; - - /** - * The value for the audio_source_url field. - * @var string - */ - protected $audio_source_url; - - /** - * The value for the radio_station_url field. - * @var string - */ - protected $radio_station_url; - - /** - * The value for the buy_this_url field. - * @var string - */ - protected $buy_this_url; - - /** - * The value for the isrc_number field. - * @var string - */ - protected $isrc_number; - - /** - * The value for the catalog_number field. - * @var string - */ - protected $catalog_number; - - /** - * The value for the original_artist field. - * @var string - */ - protected $original_artist; - - /** - * The value for the copyright field. - * @var string - */ - protected $copyright; - - /** - * The value for the report_datetime field. - * @var string - */ - protected $report_datetime; - - /** - * The value for the report_location field. - * @var string - */ - protected $report_location; - - /** - * The value for the report_organization field. - * @var string - */ - protected $report_organization; - - /** - * The value for the subject field. - * @var string - */ - protected $subject; - - /** - * The value for the contributor field. - * @var string - */ - protected $contributor; - - /** - * The value for the language field. - * @var string - */ - protected $language; - - /** - * The value for the file_exists field. - * Note: this column has a database default value of: true - * @var boolean - */ - protected $file_exists; - - /** - * The value for the soundcloud_id field. - * @var int - */ - protected $soundcloud_id; - - /** - * The value for the soundcloud_error_code field. - * @var int - */ - protected $soundcloud_error_code; - - /** - * The value for the soundcloud_error_msg field. - * @var string - */ - protected $soundcloud_error_msg; - - /** - * The value for the soundcloud_link_to_file field. - * @var string - */ - protected $soundcloud_link_to_file; - - /** - * The value for the soundcloud_upload_time field. - * @var string - */ - protected $soundcloud_upload_time; - - /** - * The value for the replay_gain field. - * @var string - */ - protected $replay_gain; - - /** - * The value for the owner_id field. - * @var int - */ - protected $owner_id; - - /** - * The value for the cuein field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $cuein; - - /** - * The value for the cueout field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $cueout; - - /** - * The value for the silan_check field. - * Note: this column has a database default value of: false - * @var boolean - */ - protected $silan_check; - - /** - * The value for the hidden field. - * Note: this column has a database default value of: false - * @var boolean - */ - protected $hidden; - - /** - * The value for the is_scheduled field. - * Note: this column has a database default value of: false - * @var boolean - */ - protected $is_scheduled; - - /** - * The value for the is_playlist field. - * Note: this column has a database default value of: false - * @var boolean - */ - protected $is_playlist; - - /** - * The value for the resource_id field. - * @var string - */ - protected $resource_id; - - /** - * @var CcSubjs - */ - protected $aFkOwner; - - /** - * @var CcSubjs - */ - protected $aCcSubjsRelatedByDbEditedby; - - /** - * @var CcMusicDirs - */ - protected $aCcMusicDirs; - - /** - * @var array CcShowInstances[] Collection to store aggregation of CcShowInstances objects. - */ - protected $collCcShowInstancess; - - /** - * @var array CcPlaylistcontents[] Collection to store aggregation of CcPlaylistcontents objects. - */ - protected $collCcPlaylistcontentss; - - /** - * @var array CcBlockcontents[] Collection to store aggregation of CcBlockcontents objects. - */ - protected $collCcBlockcontentss; - - /** - * @var array CcSchedule[] Collection to store aggregation of CcSchedule objects. - */ - protected $collCcSchedules; - - /** - * @var array CcPlayoutHistory[] Collection to store aggregation of CcPlayoutHistory objects. - */ - protected $collCcPlayoutHistorys; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->name = ''; - $this->mime = ''; - $this->ftype = ''; - $this->filepath = ''; - $this->import_status = 1; - $this->currentlyaccessing = 0; - $this->length = '00:00:00'; - $this->file_exists = true; - $this->cuein = '00:00:00'; - $this->cueout = '00:00:00'; - $this->silan_check = false; - $this->hidden = false; - $this->is_scheduled = false; - $this->is_playlist = false; - } - - /** - * Initializes internal state of BaseCcFiles object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [name] column value. - * - * @return string - */ - public function getDbName() - { - return $this->name; - } - - /** - * Get the [mime] column value. - * - * @return string - */ - public function getDbMime() - { - return $this->mime; - } - - /** - * Get the [ftype] column value. - * - * @return string - */ - public function getDbFtype() - { - return $this->ftype; - } - - /** - * Get the [directory] column value. - * - * @return int - */ - public function getDbDirectory() - { - return $this->directory; - } - - /** - * Get the [filepath] column value. - * - * @return string - */ - public function getDbFilepath() - { - return $this->filepath; - } - - /** - * Get the [import_status] column value. - * - * @return int - */ - public function getDbImportStatus() - { - return $this->import_status; - } - - /** - * Get the [currentlyaccessing] column value. - * - * @return int - */ - public function getDbCurrentlyaccessing() - { - return $this->currentlyaccessing; - } - - /** - * Get the [editedby] column value. - * - * @return int - */ - public function getDbEditedby() - { - return $this->editedby; - } - - /** - * Get the [optionally formatted] temporal [mtime] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbMtime($format = 'Y-m-d H:i:s') - { - if ($this->mtime === null) { - return null; - } - - - - try { - $dt = new DateTime($this->mtime); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->mtime, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [utime] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbUtime($format = 'Y-m-d H:i:s') - { - if ($this->utime === null) { - return null; - } - - - - try { - $dt = new DateTime($this->utime); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->utime, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [lptime] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbLPtime($format = 'Y-m-d H:i:s') - { - if ($this->lptime === null) { - return null; - } - - - - try { - $dt = new DateTime($this->lptime); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->lptime, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [md5] column value. - * - * @return string - */ - public function getDbMd5() - { - return $this->md5; - } - - /** - * Get the [track_title] column value. - * - * @return string - */ - public function getDbTrackTitle() - { - return $this->track_title; - } - - /** - * Get the [artist_name] column value. - * - * @return string - */ - public function getDbArtistName() - { - return $this->artist_name; - } - - /** - * Get the [bit_rate] column value. - * - * @return int - */ - public function getDbBitRate() - { - return $this->bit_rate; - } - - /** - * Get the [sample_rate] column value. - * - * @return int - */ - public function getDbSampleRate() - { - return $this->sample_rate; - } - - /** - * Get the [format] column value. - * - * @return string - */ - public function getDbFormat() - { - return $this->format; - } - - /** - * Get the [length] column value. - * - * @return string - */ - public function getDbLength() - { - return $this->length; - } - - /** - * Get the [album_title] column value. - * - * @return string - */ - public function getDbAlbumTitle() - { - return $this->album_title; - } - - /** - * Get the [genre] column value. - * - * @return string - */ - public function getDbGenre() - { - return $this->genre; - } - - /** - * Get the [comments] column value. - * - * @return string - */ - public function getDbComments() - { - return $this->comments; - } - - /** - * Get the [year] column value. - * - * @return string - */ - public function getDbYear() - { - return $this->year; - } - - /** - * Get the [track_number] column value. - * - * @return int - */ - public function getDbTrackNumber() - { - return $this->track_number; - } - - /** - * Get the [channels] column value. - * - * @return int - */ - public function getDbChannels() - { - return $this->channels; - } - - /** - * Get the [url] column value. - * - * @return string - */ - public function getDbUrl() - { - return $this->url; - } - - /** - * Get the [bpm] column value. - * - * @return int - */ - public function getDbBpm() - { - return $this->bpm; - } - - /** - * Get the [rating] column value. - * - * @return string - */ - public function getDbRating() - { - return $this->rating; - } - - /** - * Get the [encoded_by] column value. - * - * @return string - */ - public function getDbEncodedBy() - { - return $this->encoded_by; - } - - /** - * Get the [disc_number] column value. - * - * @return string - */ - public function getDbDiscNumber() - { - return $this->disc_number; - } - - /** - * Get the [mood] column value. - * - * @return string - */ - public function getDbMood() - { - return $this->mood; - } - - /** - * Get the [label] column value. - * - * @return string - */ - public function getDbLabel() - { - return $this->label; - } - - /** - * Get the [composer] column value. - * - * @return string - */ - public function getDbComposer() - { - return $this->composer; - } - - /** - * Get the [encoder] column value. - * - * @return string - */ - public function getDbEncoder() - { - return $this->encoder; - } - - /** - * Get the [checksum] column value. - * - * @return string - */ - public function getDbChecksum() - { - return $this->checksum; - } - - /** - * Get the [lyrics] column value. - * - * @return string - */ - public function getDbLyrics() - { - return $this->lyrics; - } - - /** - * Get the [orchestra] column value. - * - * @return string - */ - public function getDbOrchestra() - { - return $this->orchestra; - } - - /** - * Get the [conductor] column value. - * - * @return string - */ - public function getDbConductor() - { - return $this->conductor; - } - - /** - * Get the [lyricist] column value. - * - * @return string - */ - public function getDbLyricist() - { - return $this->lyricist; - } - - /** - * Get the [original_lyricist] column value. - * - * @return string - */ - public function getDbOriginalLyricist() - { - return $this->original_lyricist; - } - - /** - * Get the [radio_station_name] column value. - * - * @return string - */ - public function getDbRadioStationName() - { - return $this->radio_station_name; - } - - /** - * Get the [info_url] column value. - * - * @return string - */ - public function getDbInfoUrl() - { - return $this->info_url; - } - - /** - * Get the [artist_url] column value. - * - * @return string - */ - public function getDbArtistUrl() - { - return $this->artist_url; - } - - /** - * Get the [audio_source_url] column value. - * - * @return string - */ - public function getDbAudioSourceUrl() - { - return $this->audio_source_url; - } - - /** - * Get the [radio_station_url] column value. - * - * @return string - */ - public function getDbRadioStationUrl() - { - return $this->radio_station_url; - } - - /** - * Get the [buy_this_url] column value. - * - * @return string - */ - public function getDbBuyThisUrl() - { - return $this->buy_this_url; - } - - /** - * Get the [isrc_number] column value. - * - * @return string - */ - public function getDbIsrcNumber() - { - return $this->isrc_number; - } - - /** - * Get the [catalog_number] column value. - * - * @return string - */ - public function getDbCatalogNumber() - { - return $this->catalog_number; - } - - /** - * Get the [original_artist] column value. - * - * @return string - */ - public function getDbOriginalArtist() - { - return $this->original_artist; - } - - /** - * Get the [copyright] column value. - * - * @return string - */ - public function getDbCopyright() - { - return $this->copyright; - } - - /** - * Get the [report_datetime] column value. - * - * @return string - */ - public function getDbReportDatetime() - { - return $this->report_datetime; - } - - /** - * Get the [report_location] column value. - * - * @return string - */ - public function getDbReportLocation() - { - return $this->report_location; - } - - /** - * Get the [report_organization] column value. - * - * @return string - */ - public function getDbReportOrganization() - { - return $this->report_organization; - } - - /** - * Get the [subject] column value. - * - * @return string - */ - public function getDbSubject() - { - return $this->subject; - } - - /** - * Get the [contributor] column value. - * - * @return string - */ - public function getDbContributor() - { - return $this->contributor; - } - - /** - * Get the [language] column value. - * - * @return string - */ - public function getDbLanguage() - { - return $this->language; - } - - /** - * Get the [file_exists] column value. - * - * @return boolean - */ - public function getDbFileExists() - { - return $this->file_exists; - } - - /** - * Get the [soundcloud_id] column value. - * - * @return int - */ - public function getDbSoundcloudId() - { - return $this->soundcloud_id; - } - - /** - * Get the [soundcloud_error_code] column value. - * - * @return int - */ - public function getDbSoundcloudErrorCode() - { - return $this->soundcloud_error_code; - } - - /** - * Get the [soundcloud_error_msg] column value. - * - * @return string - */ - public function getDbSoundcloudErrorMsg() - { - return $this->soundcloud_error_msg; - } - - /** - * Get the [soundcloud_link_to_file] column value. - * - * @return string - */ - public function getDbSoundcloudLinkToFile() - { - return $this->soundcloud_link_to_file; - } - - /** - * Get the [optionally formatted] temporal [soundcloud_upload_time] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbSoundCloundUploadTime($format = 'Y-m-d H:i:s') - { - if ($this->soundcloud_upload_time === null) { - return null; - } - - - - try { - $dt = new DateTime($this->soundcloud_upload_time); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->soundcloud_upload_time, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [replay_gain] column value. - * - * @return string - */ - public function getDbReplayGain() - { - return $this->replay_gain; - } - - /** - * Get the [owner_id] column value. - * - * @return int - */ - public function getDbOwnerId() - { - return $this->owner_id; - } - - /** - * Get the [cuein] column value. - * - * @return string - */ - public function getDbCuein() - { - return $this->cuein; - } - - /** - * Get the [cueout] column value. - * - * @return string - */ - public function getDbCueout() - { - return $this->cueout; - } - - /** - * Get the [silan_check] column value. - * - * @return boolean - */ - public function getDbSilanCheck() - { - return $this->silan_check; - } - - /** - * Get the [hidden] column value. - * - * @return boolean - */ - public function getDbHidden() - { - return $this->hidden; - } - - /** - * Get the [is_scheduled] column value. - * - * @return boolean - */ - public function getDbIsScheduled() - { - return $this->is_scheduled; - } - - /** - * Get the [is_playlist] column value. - * - * @return boolean - */ - public function getDbIsPlaylist() - { - return $this->is_playlist; - } - - /** - * Get the [resource_id] column value. - * - * @return string - */ - public function getDbResourceId() - { - return $this->resource_id; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcFilesPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [name] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->name !== $v || $this->isNew()) { - $this->name = $v; - $this->modifiedColumns[] = CcFilesPeer::NAME; - } - - return $this; - } // setDbName() - - /** - * Set the value of [mime] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbMime($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->mime !== $v || $this->isNew()) { - $this->mime = $v; - $this->modifiedColumns[] = CcFilesPeer::MIME; - } - - return $this; - } // setDbMime() - - /** - * Set the value of [ftype] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbFtype($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->ftype !== $v || $this->isNew()) { - $this->ftype = $v; - $this->modifiedColumns[] = CcFilesPeer::FTYPE; - } - - return $this; - } // setDbFtype() - - /** - * Set the value of [directory] column. - * - * @param int $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbDirectory($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->directory !== $v) { - $this->directory = $v; - $this->modifiedColumns[] = CcFilesPeer::DIRECTORY; - } - - if ($this->aCcMusicDirs !== null && $this->aCcMusicDirs->getId() !== $v) { - $this->aCcMusicDirs = null; - } - - return $this; - } // setDbDirectory() - - /** - * Set the value of [filepath] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbFilepath($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->filepath !== $v || $this->isNew()) { - $this->filepath = $v; - $this->modifiedColumns[] = CcFilesPeer::FILEPATH; - } - - return $this; - } // setDbFilepath() - - /** - * Set the value of [import_status] column. - * - * @param int $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbImportStatus($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->import_status !== $v || $this->isNew()) { - $this->import_status = $v; - $this->modifiedColumns[] = CcFilesPeer::IMPORT_STATUS; - } - - return $this; - } // setDbImportStatus() - - /** - * Set the value of [currentlyaccessing] column. - * - * @param int $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbCurrentlyaccessing($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->currentlyaccessing !== $v || $this->isNew()) { - $this->currentlyaccessing = $v; - $this->modifiedColumns[] = CcFilesPeer::CURRENTLYACCESSING; - } - - return $this; - } // setDbCurrentlyaccessing() - - /** - * Set the value of [editedby] column. - * - * @param int $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbEditedby($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->editedby !== $v) { - $this->editedby = $v; - $this->modifiedColumns[] = CcFilesPeer::EDITEDBY; - } - - if ($this->aCcSubjsRelatedByDbEditedby !== null && $this->aCcSubjsRelatedByDbEditedby->getDbId() !== $v) { - $this->aCcSubjsRelatedByDbEditedby = null; - } - - return $this; - } // setDbEditedby() - - /** - * Sets the value of [mtime] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcFiles The current object (for fluent API support) - */ - public function setDbMtime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->mtime !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->mtime !== null && $tmpDt = new DateTime($this->mtime)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->mtime = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcFilesPeer::MTIME; - } - } // if either are not null - - return $this; - } // setDbMtime() - - /** - * Sets the value of [utime] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcFiles The current object (for fluent API support) - */ - public function setDbUtime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->utime !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->utime !== null && $tmpDt = new DateTime($this->utime)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->utime = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcFilesPeer::UTIME; - } - } // if either are not null - - return $this; - } // setDbUtime() - - /** - * Sets the value of [lptime] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcFiles The current object (for fluent API support) - */ - public function setDbLPtime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->lptime !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->lptime !== null && $tmpDt = new DateTime($this->lptime)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->lptime = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcFilesPeer::LPTIME; - } - } // if either are not null - - return $this; - } // setDbLPtime() - - /** - * Set the value of [md5] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbMd5($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->md5 !== $v) { - $this->md5 = $v; - $this->modifiedColumns[] = CcFilesPeer::MD5; - } - - return $this; - } // setDbMd5() - - /** - * Set the value of [track_title] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbTrackTitle($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->track_title !== $v) { - $this->track_title = $v; - $this->modifiedColumns[] = CcFilesPeer::TRACK_TITLE; - } - - return $this; - } // setDbTrackTitle() - - /** - * Set the value of [artist_name] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbArtistName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->artist_name !== $v) { - $this->artist_name = $v; - $this->modifiedColumns[] = CcFilesPeer::ARTIST_NAME; - } - - return $this; - } // setDbArtistName() - - /** - * Set the value of [bit_rate] column. - * - * @param int $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbBitRate($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->bit_rate !== $v) { - $this->bit_rate = $v; - $this->modifiedColumns[] = CcFilesPeer::BIT_RATE; - } - - return $this; - } // setDbBitRate() - - /** - * Set the value of [sample_rate] column. - * - * @param int $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbSampleRate($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->sample_rate !== $v) { - $this->sample_rate = $v; - $this->modifiedColumns[] = CcFilesPeer::SAMPLE_RATE; - } - - return $this; - } // setDbSampleRate() - - /** - * Set the value of [format] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbFormat($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->format !== $v) { - $this->format = $v; - $this->modifiedColumns[] = CcFilesPeer::FORMAT; - } - - return $this; - } // setDbFormat() - - /** - * Set the value of [length] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbLength($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->length !== $v || $this->isNew()) { - $this->length = $v; - $this->modifiedColumns[] = CcFilesPeer::LENGTH; - } - - return $this; - } // setDbLength() - - /** - * Set the value of [album_title] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbAlbumTitle($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->album_title !== $v) { - $this->album_title = $v; - $this->modifiedColumns[] = CcFilesPeer::ALBUM_TITLE; - } - - return $this; - } // setDbAlbumTitle() - - /** - * Set the value of [genre] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbGenre($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->genre !== $v) { - $this->genre = $v; - $this->modifiedColumns[] = CcFilesPeer::GENRE; - } - - return $this; - } // setDbGenre() - - /** - * Set the value of [comments] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbComments($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->comments !== $v) { - $this->comments = $v; - $this->modifiedColumns[] = CcFilesPeer::COMMENTS; - } - - return $this; - } // setDbComments() - - /** - * Set the value of [year] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbYear($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->year !== $v) { - $this->year = $v; - $this->modifiedColumns[] = CcFilesPeer::YEAR; - } - - return $this; - } // setDbYear() - - /** - * Set the value of [track_number] column. - * - * @param int $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbTrackNumber($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->track_number !== $v) { - $this->track_number = $v; - $this->modifiedColumns[] = CcFilesPeer::TRACK_NUMBER; - } - - return $this; - } // setDbTrackNumber() - - /** - * Set the value of [channels] column. - * - * @param int $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbChannels($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->channels !== $v) { - $this->channels = $v; - $this->modifiedColumns[] = CcFilesPeer::CHANNELS; - } - - return $this; - } // setDbChannels() - - /** - * Set the value of [url] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbUrl($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->url !== $v) { - $this->url = $v; - $this->modifiedColumns[] = CcFilesPeer::URL; - } - - return $this; - } // setDbUrl() - - /** - * Set the value of [bpm] column. - * - * @param int $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbBpm($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->bpm !== $v) { - $this->bpm = $v; - $this->modifiedColumns[] = CcFilesPeer::BPM; - } - - return $this; - } // setDbBpm() - - /** - * Set the value of [rating] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbRating($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->rating !== $v) { - $this->rating = $v; - $this->modifiedColumns[] = CcFilesPeer::RATING; - } - - return $this; - } // setDbRating() - - /** - * Set the value of [encoded_by] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbEncodedBy($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->encoded_by !== $v) { - $this->encoded_by = $v; - $this->modifiedColumns[] = CcFilesPeer::ENCODED_BY; - } - - return $this; - } // setDbEncodedBy() - - /** - * Set the value of [disc_number] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbDiscNumber($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->disc_number !== $v) { - $this->disc_number = $v; - $this->modifiedColumns[] = CcFilesPeer::DISC_NUMBER; - } - - return $this; - } // setDbDiscNumber() - - /** - * Set the value of [mood] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbMood($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->mood !== $v) { - $this->mood = $v; - $this->modifiedColumns[] = CcFilesPeer::MOOD; - } - - return $this; - } // setDbMood() - - /** - * Set the value of [label] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbLabel($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->label !== $v) { - $this->label = $v; - $this->modifiedColumns[] = CcFilesPeer::LABEL; - } - - return $this; - } // setDbLabel() - - /** - * Set the value of [composer] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbComposer($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->composer !== $v) { - $this->composer = $v; - $this->modifiedColumns[] = CcFilesPeer::COMPOSER; - } - - return $this; - } // setDbComposer() - - /** - * Set the value of [encoder] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbEncoder($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->encoder !== $v) { - $this->encoder = $v; - $this->modifiedColumns[] = CcFilesPeer::ENCODER; - } - - return $this; - } // setDbEncoder() - - /** - * Set the value of [checksum] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbChecksum($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->checksum !== $v) { - $this->checksum = $v; - $this->modifiedColumns[] = CcFilesPeer::CHECKSUM; - } - - return $this; - } // setDbChecksum() - - /** - * Set the value of [lyrics] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbLyrics($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->lyrics !== $v) { - $this->lyrics = $v; - $this->modifiedColumns[] = CcFilesPeer::LYRICS; - } - - return $this; - } // setDbLyrics() - - /** - * Set the value of [orchestra] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbOrchestra($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->orchestra !== $v) { - $this->orchestra = $v; - $this->modifiedColumns[] = CcFilesPeer::ORCHESTRA; - } - - return $this; - } // setDbOrchestra() - - /** - * Set the value of [conductor] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbConductor($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->conductor !== $v) { - $this->conductor = $v; - $this->modifiedColumns[] = CcFilesPeer::CONDUCTOR; - } - - return $this; - } // setDbConductor() - - /** - * Set the value of [lyricist] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbLyricist($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->lyricist !== $v) { - $this->lyricist = $v; - $this->modifiedColumns[] = CcFilesPeer::LYRICIST; - } - - return $this; - } // setDbLyricist() - - /** - * Set the value of [original_lyricist] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbOriginalLyricist($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->original_lyricist !== $v) { - $this->original_lyricist = $v; - $this->modifiedColumns[] = CcFilesPeer::ORIGINAL_LYRICIST; - } - - return $this; - } // setDbOriginalLyricist() - - /** - * Set the value of [radio_station_name] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbRadioStationName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->radio_station_name !== $v) { - $this->radio_station_name = $v; - $this->modifiedColumns[] = CcFilesPeer::RADIO_STATION_NAME; - } - - return $this; - } // setDbRadioStationName() - - /** - * Set the value of [info_url] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbInfoUrl($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->info_url !== $v) { - $this->info_url = $v; - $this->modifiedColumns[] = CcFilesPeer::INFO_URL; - } - - return $this; - } // setDbInfoUrl() - - /** - * Set the value of [artist_url] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbArtistUrl($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->artist_url !== $v) { - $this->artist_url = $v; - $this->modifiedColumns[] = CcFilesPeer::ARTIST_URL; - } - - return $this; - } // setDbArtistUrl() - - /** - * Set the value of [audio_source_url] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbAudioSourceUrl($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->audio_source_url !== $v) { - $this->audio_source_url = $v; - $this->modifiedColumns[] = CcFilesPeer::AUDIO_SOURCE_URL; - } - - return $this; - } // setDbAudioSourceUrl() - - /** - * Set the value of [radio_station_url] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbRadioStationUrl($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->radio_station_url !== $v) { - $this->radio_station_url = $v; - $this->modifiedColumns[] = CcFilesPeer::RADIO_STATION_URL; - } - - return $this; - } // setDbRadioStationUrl() - - /** - * Set the value of [buy_this_url] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbBuyThisUrl($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->buy_this_url !== $v) { - $this->buy_this_url = $v; - $this->modifiedColumns[] = CcFilesPeer::BUY_THIS_URL; - } - - return $this; - } // setDbBuyThisUrl() - - /** - * Set the value of [isrc_number] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbIsrcNumber($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->isrc_number !== $v) { - $this->isrc_number = $v; - $this->modifiedColumns[] = CcFilesPeer::ISRC_NUMBER; - } - - return $this; - } // setDbIsrcNumber() - - /** - * Set the value of [catalog_number] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbCatalogNumber($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->catalog_number !== $v) { - $this->catalog_number = $v; - $this->modifiedColumns[] = CcFilesPeer::CATALOG_NUMBER; - } - - return $this; - } // setDbCatalogNumber() - - /** - * Set the value of [original_artist] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbOriginalArtist($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->original_artist !== $v) { - $this->original_artist = $v; - $this->modifiedColumns[] = CcFilesPeer::ORIGINAL_ARTIST; - } - - return $this; - } // setDbOriginalArtist() - - /** - * Set the value of [copyright] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbCopyright($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->copyright !== $v) { - $this->copyright = $v; - $this->modifiedColumns[] = CcFilesPeer::COPYRIGHT; - } - - return $this; - } // setDbCopyright() - - /** - * Set the value of [report_datetime] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbReportDatetime($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->report_datetime !== $v) { - $this->report_datetime = $v; - $this->modifiedColumns[] = CcFilesPeer::REPORT_DATETIME; - } - - return $this; - } // setDbReportDatetime() - - /** - * Set the value of [report_location] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbReportLocation($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->report_location !== $v) { - $this->report_location = $v; - $this->modifiedColumns[] = CcFilesPeer::REPORT_LOCATION; - } - - return $this; - } // setDbReportLocation() - - /** - * Set the value of [report_organization] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbReportOrganization($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->report_organization !== $v) { - $this->report_organization = $v; - $this->modifiedColumns[] = CcFilesPeer::REPORT_ORGANIZATION; - } - - return $this; - } // setDbReportOrganization() - - /** - * Set the value of [subject] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbSubject($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->subject !== $v) { - $this->subject = $v; - $this->modifiedColumns[] = CcFilesPeer::SUBJECT; - } - - return $this; - } // setDbSubject() - - /** - * Set the value of [contributor] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbContributor($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->contributor !== $v) { - $this->contributor = $v; - $this->modifiedColumns[] = CcFilesPeer::CONTRIBUTOR; - } - - return $this; - } // setDbContributor() - - /** - * Set the value of [language] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbLanguage($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->language !== $v) { - $this->language = $v; - $this->modifiedColumns[] = CcFilesPeer::LANGUAGE; - } - - return $this; - } // setDbLanguage() - - /** - * Set the value of [file_exists] column. - * - * @param boolean $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbFileExists($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->file_exists !== $v || $this->isNew()) { - $this->file_exists = $v; - $this->modifiedColumns[] = CcFilesPeer::FILE_EXISTS; - } - - return $this; - } // setDbFileExists() - - /** - * Set the value of [soundcloud_id] column. - * - * @param int $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbSoundcloudId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->soundcloud_id !== $v) { - $this->soundcloud_id = $v; - $this->modifiedColumns[] = CcFilesPeer::SOUNDCLOUD_ID; - } - - return $this; - } // setDbSoundcloudId() - - /** - * Set the value of [soundcloud_error_code] column. - * - * @param int $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbSoundcloudErrorCode($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->soundcloud_error_code !== $v) { - $this->soundcloud_error_code = $v; - $this->modifiedColumns[] = CcFilesPeer::SOUNDCLOUD_ERROR_CODE; - } - - return $this; - } // setDbSoundcloudErrorCode() - - /** - * Set the value of [soundcloud_error_msg] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbSoundcloudErrorMsg($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->soundcloud_error_msg !== $v) { - $this->soundcloud_error_msg = $v; - $this->modifiedColumns[] = CcFilesPeer::SOUNDCLOUD_ERROR_MSG; - } - - return $this; - } // setDbSoundcloudErrorMsg() - - /** - * Set the value of [soundcloud_link_to_file] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbSoundcloudLinkToFile($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->soundcloud_link_to_file !== $v) { - $this->soundcloud_link_to_file = $v; - $this->modifiedColumns[] = CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE; - } - - return $this; - } // setDbSoundcloudLinkToFile() - - /** - * Sets the value of [soundcloud_upload_time] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcFiles The current object (for fluent API support) - */ - public function setDbSoundCloundUploadTime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->soundcloud_upload_time !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->soundcloud_upload_time !== null && $tmpDt = new DateTime($this->soundcloud_upload_time)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->soundcloud_upload_time = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME; - } - } // if either are not null - - return $this; - } // setDbSoundCloundUploadTime() - - /** - * Set the value of [replay_gain] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbReplayGain($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->replay_gain !== $v) { - $this->replay_gain = $v; - $this->modifiedColumns[] = CcFilesPeer::REPLAY_GAIN; - } - - return $this; - } // setDbReplayGain() - - /** - * Set the value of [owner_id] column. - * - * @param int $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbOwnerId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->owner_id !== $v) { - $this->owner_id = $v; - $this->modifiedColumns[] = CcFilesPeer::OWNER_ID; - } - - if ($this->aFkOwner !== null && $this->aFkOwner->getDbId() !== $v) { - $this->aFkOwner = null; - } - - return $this; - } // setDbOwnerId() - - /** - * Set the value of [cuein] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbCuein($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->cuein !== $v || $this->isNew()) { - $this->cuein = $v; - $this->modifiedColumns[] = CcFilesPeer::CUEIN; - } - - return $this; - } // setDbCuein() - - /** - * Set the value of [cueout] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbCueout($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->cueout !== $v || $this->isNew()) { - $this->cueout = $v; - $this->modifiedColumns[] = CcFilesPeer::CUEOUT; - } - - return $this; - } // setDbCueout() - - /** - * Set the value of [silan_check] column. - * - * @param boolean $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbSilanCheck($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->silan_check !== $v || $this->isNew()) { - $this->silan_check = $v; - $this->modifiedColumns[] = CcFilesPeer::SILAN_CHECK; - } - - return $this; - } // setDbSilanCheck() - - /** - * Set the value of [hidden] column. - * - * @param boolean $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbHidden($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->hidden !== $v || $this->isNew()) { - $this->hidden = $v; - $this->modifiedColumns[] = CcFilesPeer::HIDDEN; - } - - return $this; - } // setDbHidden() - - /** - * Set the value of [is_scheduled] column. - * - * @param boolean $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbIsScheduled($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->is_scheduled !== $v || $this->isNew()) { - $this->is_scheduled = $v; - $this->modifiedColumns[] = CcFilesPeer::IS_SCHEDULED; - } - - return $this; - } // setDbIsScheduled() - - /** - * Set the value of [is_playlist] column. - * - * @param boolean $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbIsPlaylist($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->is_playlist !== $v || $this->isNew()) { - $this->is_playlist = $v; - $this->modifiedColumns[] = CcFilesPeer::IS_PLAYLIST; - } - - return $this; - } // setDbIsPlaylist() - - /** - * Set the value of [resource_id] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbResourceId($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->resource_id !== $v) { - $this->resource_id = $v; - $this->modifiedColumns[] = CcFilesPeer::RESOURCE_ID; - } - - return $this; - } // setDbResourceId() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->name !== '') { - return false; - } - - if ($this->mime !== '') { - return false; - } - - if ($this->ftype !== '') { - return false; - } - - if ($this->filepath !== '') { - return false; - } - - if ($this->import_status !== 1) { - return false; - } - - if ($this->currentlyaccessing !== 0) { - return false; - } - - if ($this->length !== '00:00:00') { - return false; - } - - if ($this->file_exists !== true) { - return false; - } - - if ($this->cuein !== '00:00:00') { - return false; - } - - if ($this->cueout !== '00:00:00') { - return false; - } - - if ($this->silan_check !== false) { - return false; - } - - if ($this->hidden !== false) { - return false; - } - - if ($this->is_scheduled !== false) { - return false; - } - - if ($this->is_playlist !== false) { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->mime = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->ftype = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->directory = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; - $this->filepath = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; - $this->import_status = ($row[$startcol + 6] !== null) ? (int) $row[$startcol + 6] : null; - $this->currentlyaccessing = ($row[$startcol + 7] !== null) ? (int) $row[$startcol + 7] : null; - $this->editedby = ($row[$startcol + 8] !== null) ? (int) $row[$startcol + 8] : null; - $this->mtime = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; - $this->utime = ($row[$startcol + 10] !== null) ? (string) $row[$startcol + 10] : null; - $this->lptime = ($row[$startcol + 11] !== null) ? (string) $row[$startcol + 11] : null; - $this->md5 = ($row[$startcol + 12] !== null) ? (string) $row[$startcol + 12] : null; - $this->track_title = ($row[$startcol + 13] !== null) ? (string) $row[$startcol + 13] : null; - $this->artist_name = ($row[$startcol + 14] !== null) ? (string) $row[$startcol + 14] : null; - $this->bit_rate = ($row[$startcol + 15] !== null) ? (int) $row[$startcol + 15] : null; - $this->sample_rate = ($row[$startcol + 16] !== null) ? (int) $row[$startcol + 16] : null; - $this->format = ($row[$startcol + 17] !== null) ? (string) $row[$startcol + 17] : null; - $this->length = ($row[$startcol + 18] !== null) ? (string) $row[$startcol + 18] : null; - $this->album_title = ($row[$startcol + 19] !== null) ? (string) $row[$startcol + 19] : null; - $this->genre = ($row[$startcol + 20] !== null) ? (string) $row[$startcol + 20] : null; - $this->comments = ($row[$startcol + 21] !== null) ? (string) $row[$startcol + 21] : null; - $this->year = ($row[$startcol + 22] !== null) ? (string) $row[$startcol + 22] : null; - $this->track_number = ($row[$startcol + 23] !== null) ? (int) $row[$startcol + 23] : null; - $this->channels = ($row[$startcol + 24] !== null) ? (int) $row[$startcol + 24] : null; - $this->url = ($row[$startcol + 25] !== null) ? (string) $row[$startcol + 25] : null; - $this->bpm = ($row[$startcol + 26] !== null) ? (int) $row[$startcol + 26] : null; - $this->rating = ($row[$startcol + 27] !== null) ? (string) $row[$startcol + 27] : null; - $this->encoded_by = ($row[$startcol + 28] !== null) ? (string) $row[$startcol + 28] : null; - $this->disc_number = ($row[$startcol + 29] !== null) ? (string) $row[$startcol + 29] : null; - $this->mood = ($row[$startcol + 30] !== null) ? (string) $row[$startcol + 30] : null; - $this->label = ($row[$startcol + 31] !== null) ? (string) $row[$startcol + 31] : null; - $this->composer = ($row[$startcol + 32] !== null) ? (string) $row[$startcol + 32] : null; - $this->encoder = ($row[$startcol + 33] !== null) ? (string) $row[$startcol + 33] : null; - $this->checksum = ($row[$startcol + 34] !== null) ? (string) $row[$startcol + 34] : null; - $this->lyrics = ($row[$startcol + 35] !== null) ? (string) $row[$startcol + 35] : null; - $this->orchestra = ($row[$startcol + 36] !== null) ? (string) $row[$startcol + 36] : null; - $this->conductor = ($row[$startcol + 37] !== null) ? (string) $row[$startcol + 37] : null; - $this->lyricist = ($row[$startcol + 38] !== null) ? (string) $row[$startcol + 38] : null; - $this->original_lyricist = ($row[$startcol + 39] !== null) ? (string) $row[$startcol + 39] : null; - $this->radio_station_name = ($row[$startcol + 40] !== null) ? (string) $row[$startcol + 40] : null; - $this->info_url = ($row[$startcol + 41] !== null) ? (string) $row[$startcol + 41] : null; - $this->artist_url = ($row[$startcol + 42] !== null) ? (string) $row[$startcol + 42] : null; - $this->audio_source_url = ($row[$startcol + 43] !== null) ? (string) $row[$startcol + 43] : null; - $this->radio_station_url = ($row[$startcol + 44] !== null) ? (string) $row[$startcol + 44] : null; - $this->buy_this_url = ($row[$startcol + 45] !== null) ? (string) $row[$startcol + 45] : null; - $this->isrc_number = ($row[$startcol + 46] !== null) ? (string) $row[$startcol + 46] : null; - $this->catalog_number = ($row[$startcol + 47] !== null) ? (string) $row[$startcol + 47] : null; - $this->original_artist = ($row[$startcol + 48] !== null) ? (string) $row[$startcol + 48] : null; - $this->copyright = ($row[$startcol + 49] !== null) ? (string) $row[$startcol + 49] : null; - $this->report_datetime = ($row[$startcol + 50] !== null) ? (string) $row[$startcol + 50] : null; - $this->report_location = ($row[$startcol + 51] !== null) ? (string) $row[$startcol + 51] : null; - $this->report_organization = ($row[$startcol + 52] !== null) ? (string) $row[$startcol + 52] : null; - $this->subject = ($row[$startcol + 53] !== null) ? (string) $row[$startcol + 53] : null; - $this->contributor = ($row[$startcol + 54] !== null) ? (string) $row[$startcol + 54] : null; - $this->language = ($row[$startcol + 55] !== null) ? (string) $row[$startcol + 55] : null; - $this->file_exists = ($row[$startcol + 56] !== null) ? (boolean) $row[$startcol + 56] : null; - $this->soundcloud_id = ($row[$startcol + 57] !== null) ? (int) $row[$startcol + 57] : null; - $this->soundcloud_error_code = ($row[$startcol + 58] !== null) ? (int) $row[$startcol + 58] : null; - $this->soundcloud_error_msg = ($row[$startcol + 59] !== null) ? (string) $row[$startcol + 59] : null; - $this->soundcloud_link_to_file = ($row[$startcol + 60] !== null) ? (string) $row[$startcol + 60] : null; - $this->soundcloud_upload_time = ($row[$startcol + 61] !== null) ? (string) $row[$startcol + 61] : null; - $this->replay_gain = ($row[$startcol + 62] !== null) ? (string) $row[$startcol + 62] : null; - $this->owner_id = ($row[$startcol + 63] !== null) ? (int) $row[$startcol + 63] : null; - $this->cuein = ($row[$startcol + 64] !== null) ? (string) $row[$startcol + 64] : null; - $this->cueout = ($row[$startcol + 65] !== null) ? (string) $row[$startcol + 65] : null; - $this->silan_check = ($row[$startcol + 66] !== null) ? (boolean) $row[$startcol + 66] : null; - $this->hidden = ($row[$startcol + 67] !== null) ? (boolean) $row[$startcol + 67] : null; - $this->is_scheduled = ($row[$startcol + 68] !== null) ? (boolean) $row[$startcol + 68] : null; - $this->is_playlist = ($row[$startcol + 69] !== null) ? (boolean) $row[$startcol + 69] : null; - $this->resource_id = ($row[$startcol + 70] !== null) ? (string) $row[$startcol + 70] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 71; // 71 = CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcFiles object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcMusicDirs !== null && $this->directory !== $this->aCcMusicDirs->getId()) { - $this->aCcMusicDirs = null; - } - if ($this->aCcSubjsRelatedByDbEditedby !== null && $this->editedby !== $this->aCcSubjsRelatedByDbEditedby->getDbId()) { - $this->aCcSubjsRelatedByDbEditedby = null; - } - if ($this->aFkOwner !== null && $this->owner_id !== $this->aFkOwner->getDbId()) { - $this->aFkOwner = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcFilesPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aFkOwner = null; - $this->aCcSubjsRelatedByDbEditedby = null; - $this->aCcMusicDirs = null; - $this->collCcShowInstancess = null; - - $this->collCcPlaylistcontentss = null; - - $this->collCcBlockcontentss = null; - - $this->collCcSchedules = null; - - $this->collCcPlayoutHistorys = null; - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcFilesQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcFilesPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aFkOwner !== null) { - if ($this->aFkOwner->isModified() || $this->aFkOwner->isNew()) { - $affectedRows += $this->aFkOwner->save($con); - } - $this->setFkOwner($this->aFkOwner); - } - - if ($this->aCcSubjsRelatedByDbEditedby !== null) { - if ($this->aCcSubjsRelatedByDbEditedby->isModified() || $this->aCcSubjsRelatedByDbEditedby->isNew()) { - $affectedRows += $this->aCcSubjsRelatedByDbEditedby->save($con); - } - $this->setCcSubjsRelatedByDbEditedby($this->aCcSubjsRelatedByDbEditedby); - } - - if ($this->aCcMusicDirs !== null) { - if ($this->aCcMusicDirs->isModified() || $this->aCcMusicDirs->isNew()) { - $affectedRows += $this->aCcMusicDirs->save($con); - } - $this->setCcMusicDirs($this->aCcMusicDirs); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcFilesPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcFilesPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcFilesPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcFilesPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - if ($this->collCcShowInstancess !== null) { - foreach ($this->collCcShowInstancess as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcPlaylistcontentss !== null) { - foreach ($this->collCcPlaylistcontentss as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcBlockcontentss !== null) { - foreach ($this->collCcBlockcontentss as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcSchedules !== null) { - foreach ($this->collCcSchedules as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcPlayoutHistorys !== null) { - foreach ($this->collCcPlayoutHistorys as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aFkOwner !== null) { - if (!$this->aFkOwner->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aFkOwner->getValidationFailures()); - } - } - - if ($this->aCcSubjsRelatedByDbEditedby !== null) { - if (!$this->aCcSubjsRelatedByDbEditedby->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcSubjsRelatedByDbEditedby->getValidationFailures()); - } - } - - if ($this->aCcMusicDirs !== null) { - if (!$this->aCcMusicDirs->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcMusicDirs->getValidationFailures()); - } - } - - - if (($retval = CcFilesPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - if ($this->collCcShowInstancess !== null) { - foreach ($this->collCcShowInstancess as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcPlaylistcontentss !== null) { - foreach ($this->collCcPlaylistcontentss as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcBlockcontentss !== null) { - foreach ($this->collCcBlockcontentss as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcSchedules !== null) { - foreach ($this->collCcSchedules as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcPlayoutHistorys !== null) { - foreach ($this->collCcPlayoutHistorys as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcFilesPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbName(); - break; - case 2: - return $this->getDbMime(); - break; - case 3: - return $this->getDbFtype(); - break; - case 4: - return $this->getDbDirectory(); - break; - case 5: - return $this->getDbFilepath(); - break; - case 6: - return $this->getDbImportStatus(); - break; - case 7: - return $this->getDbCurrentlyaccessing(); - break; - case 8: - return $this->getDbEditedby(); - break; - case 9: - return $this->getDbMtime(); - break; - case 10: - return $this->getDbUtime(); - break; - case 11: - return $this->getDbLPtime(); - break; - case 12: - return $this->getDbMd5(); - break; - case 13: - return $this->getDbTrackTitle(); - break; - case 14: - return $this->getDbArtistName(); - break; - case 15: - return $this->getDbBitRate(); - break; - case 16: - return $this->getDbSampleRate(); - break; - case 17: - return $this->getDbFormat(); - break; - case 18: - return $this->getDbLength(); - break; - case 19: - return $this->getDbAlbumTitle(); - break; - case 20: - return $this->getDbGenre(); - break; - case 21: - return $this->getDbComments(); - break; - case 22: - return $this->getDbYear(); - break; - case 23: - return $this->getDbTrackNumber(); - break; - case 24: - return $this->getDbChannels(); - break; - case 25: - return $this->getDbUrl(); - break; - case 26: - return $this->getDbBpm(); - break; - case 27: - return $this->getDbRating(); - break; - case 28: - return $this->getDbEncodedBy(); - break; - case 29: - return $this->getDbDiscNumber(); - break; - case 30: - return $this->getDbMood(); - break; - case 31: - return $this->getDbLabel(); - break; - case 32: - return $this->getDbComposer(); - break; - case 33: - return $this->getDbEncoder(); - break; - case 34: - return $this->getDbChecksum(); - break; - case 35: - return $this->getDbLyrics(); - break; - case 36: - return $this->getDbOrchestra(); - break; - case 37: - return $this->getDbConductor(); - break; - case 38: - return $this->getDbLyricist(); - break; - case 39: - return $this->getDbOriginalLyricist(); - break; - case 40: - return $this->getDbRadioStationName(); - break; - case 41: - return $this->getDbInfoUrl(); - break; - case 42: - return $this->getDbArtistUrl(); - break; - case 43: - return $this->getDbAudioSourceUrl(); - break; - case 44: - return $this->getDbRadioStationUrl(); - break; - case 45: - return $this->getDbBuyThisUrl(); - break; - case 46: - return $this->getDbIsrcNumber(); - break; - case 47: - return $this->getDbCatalogNumber(); - break; - case 48: - return $this->getDbOriginalArtist(); - break; - case 49: - return $this->getDbCopyright(); - break; - case 50: - return $this->getDbReportDatetime(); - break; - case 51: - return $this->getDbReportLocation(); - break; - case 52: - return $this->getDbReportOrganization(); - break; - case 53: - return $this->getDbSubject(); - break; - case 54: - return $this->getDbContributor(); - break; - case 55: - return $this->getDbLanguage(); - break; - case 56: - return $this->getDbFileExists(); - break; - case 57: - return $this->getDbSoundcloudId(); - break; - case 58: - return $this->getDbSoundcloudErrorCode(); - break; - case 59: - return $this->getDbSoundcloudErrorMsg(); - break; - case 60: - return $this->getDbSoundcloudLinkToFile(); - break; - case 61: - return $this->getDbSoundCloundUploadTime(); - break; - case 62: - return $this->getDbReplayGain(); - break; - case 63: - return $this->getDbOwnerId(); - break; - case 64: - return $this->getDbCuein(); - break; - case 65: - return $this->getDbCueout(); - break; - case 66: - return $this->getDbSilanCheck(); - break; - case 67: - return $this->getDbHidden(); - break; - case 68: - return $this->getDbIsScheduled(); - break; - case 69: - return $this->getDbIsPlaylist(); - break; - case 70: - return $this->getDbResourceId(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcFilesPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbName(), - $keys[2] => $this->getDbMime(), - $keys[3] => $this->getDbFtype(), - $keys[4] => $this->getDbDirectory(), - $keys[5] => $this->getDbFilepath(), - $keys[6] => $this->getDbImportStatus(), - $keys[7] => $this->getDbCurrentlyaccessing(), - $keys[8] => $this->getDbEditedby(), - $keys[9] => $this->getDbMtime(), - $keys[10] => $this->getDbUtime(), - $keys[11] => $this->getDbLPtime(), - $keys[12] => $this->getDbMd5(), - $keys[13] => $this->getDbTrackTitle(), - $keys[14] => $this->getDbArtistName(), - $keys[15] => $this->getDbBitRate(), - $keys[16] => $this->getDbSampleRate(), - $keys[17] => $this->getDbFormat(), - $keys[18] => $this->getDbLength(), - $keys[19] => $this->getDbAlbumTitle(), - $keys[20] => $this->getDbGenre(), - $keys[21] => $this->getDbComments(), - $keys[22] => $this->getDbYear(), - $keys[23] => $this->getDbTrackNumber(), - $keys[24] => $this->getDbChannels(), - $keys[25] => $this->getDbUrl(), - $keys[26] => $this->getDbBpm(), - $keys[27] => $this->getDbRating(), - $keys[28] => $this->getDbEncodedBy(), - $keys[29] => $this->getDbDiscNumber(), - $keys[30] => $this->getDbMood(), - $keys[31] => $this->getDbLabel(), - $keys[32] => $this->getDbComposer(), - $keys[33] => $this->getDbEncoder(), - $keys[34] => $this->getDbChecksum(), - $keys[35] => $this->getDbLyrics(), - $keys[36] => $this->getDbOrchestra(), - $keys[37] => $this->getDbConductor(), - $keys[38] => $this->getDbLyricist(), - $keys[39] => $this->getDbOriginalLyricist(), - $keys[40] => $this->getDbRadioStationName(), - $keys[41] => $this->getDbInfoUrl(), - $keys[42] => $this->getDbArtistUrl(), - $keys[43] => $this->getDbAudioSourceUrl(), - $keys[44] => $this->getDbRadioStationUrl(), - $keys[45] => $this->getDbBuyThisUrl(), - $keys[46] => $this->getDbIsrcNumber(), - $keys[47] => $this->getDbCatalogNumber(), - $keys[48] => $this->getDbOriginalArtist(), - $keys[49] => $this->getDbCopyright(), - $keys[50] => $this->getDbReportDatetime(), - $keys[51] => $this->getDbReportLocation(), - $keys[52] => $this->getDbReportOrganization(), - $keys[53] => $this->getDbSubject(), - $keys[54] => $this->getDbContributor(), - $keys[55] => $this->getDbLanguage(), - $keys[56] => $this->getDbFileExists(), - $keys[57] => $this->getDbSoundcloudId(), - $keys[58] => $this->getDbSoundcloudErrorCode(), - $keys[59] => $this->getDbSoundcloudErrorMsg(), - $keys[60] => $this->getDbSoundcloudLinkToFile(), - $keys[61] => $this->getDbSoundCloundUploadTime(), - $keys[62] => $this->getDbReplayGain(), - $keys[63] => $this->getDbOwnerId(), - $keys[64] => $this->getDbCuein(), - $keys[65] => $this->getDbCueout(), - $keys[66] => $this->getDbSilanCheck(), - $keys[67] => $this->getDbHidden(), - $keys[68] => $this->getDbIsScheduled(), - $keys[69] => $this->getDbIsPlaylist(), - $keys[70] => $this->getDbResourceId(), - ); - if ($includeForeignObjects) { - if (null !== $this->aFkOwner) { - $result['FkOwner'] = $this->aFkOwner->toArray($keyType, $includeLazyLoadColumns, true); - } - if (null !== $this->aCcSubjsRelatedByDbEditedby) { - $result['CcSubjsRelatedByDbEditedby'] = $this->aCcSubjsRelatedByDbEditedby->toArray($keyType, $includeLazyLoadColumns, true); - } - if (null !== $this->aCcMusicDirs) { - $result['CcMusicDirs'] = $this->aCcMusicDirs->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcFilesPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbName($value); - break; - case 2: - $this->setDbMime($value); - break; - case 3: - $this->setDbFtype($value); - break; - case 4: - $this->setDbDirectory($value); - break; - case 5: - $this->setDbFilepath($value); - break; - case 6: - $this->setDbImportStatus($value); - break; - case 7: - $this->setDbCurrentlyaccessing($value); - break; - case 8: - $this->setDbEditedby($value); - break; - case 9: - $this->setDbMtime($value); - break; - case 10: - $this->setDbUtime($value); - break; - case 11: - $this->setDbLPtime($value); - break; - case 12: - $this->setDbMd5($value); - break; - case 13: - $this->setDbTrackTitle($value); - break; - case 14: - $this->setDbArtistName($value); - break; - case 15: - $this->setDbBitRate($value); - break; - case 16: - $this->setDbSampleRate($value); - break; - case 17: - $this->setDbFormat($value); - break; - case 18: - $this->setDbLength($value); - break; - case 19: - $this->setDbAlbumTitle($value); - break; - case 20: - $this->setDbGenre($value); - break; - case 21: - $this->setDbComments($value); - break; - case 22: - $this->setDbYear($value); - break; - case 23: - $this->setDbTrackNumber($value); - break; - case 24: - $this->setDbChannels($value); - break; - case 25: - $this->setDbUrl($value); - break; - case 26: - $this->setDbBpm($value); - break; - case 27: - $this->setDbRating($value); - break; - case 28: - $this->setDbEncodedBy($value); - break; - case 29: - $this->setDbDiscNumber($value); - break; - case 30: - $this->setDbMood($value); - break; - case 31: - $this->setDbLabel($value); - break; - case 32: - $this->setDbComposer($value); - break; - case 33: - $this->setDbEncoder($value); - break; - case 34: - $this->setDbChecksum($value); - break; - case 35: - $this->setDbLyrics($value); - break; - case 36: - $this->setDbOrchestra($value); - break; - case 37: - $this->setDbConductor($value); - break; - case 38: - $this->setDbLyricist($value); - break; - case 39: - $this->setDbOriginalLyricist($value); - break; - case 40: - $this->setDbRadioStationName($value); - break; - case 41: - $this->setDbInfoUrl($value); - break; - case 42: - $this->setDbArtistUrl($value); - break; - case 43: - $this->setDbAudioSourceUrl($value); - break; - case 44: - $this->setDbRadioStationUrl($value); - break; - case 45: - $this->setDbBuyThisUrl($value); - break; - case 46: - $this->setDbIsrcNumber($value); - break; - case 47: - $this->setDbCatalogNumber($value); - break; - case 48: - $this->setDbOriginalArtist($value); - break; - case 49: - $this->setDbCopyright($value); - break; - case 50: - $this->setDbReportDatetime($value); - break; - case 51: - $this->setDbReportLocation($value); - break; - case 52: - $this->setDbReportOrganization($value); - break; - case 53: - $this->setDbSubject($value); - break; - case 54: - $this->setDbContributor($value); - break; - case 55: - $this->setDbLanguage($value); - break; - case 56: - $this->setDbFileExists($value); - break; - case 57: - $this->setDbSoundcloudId($value); - break; - case 58: - $this->setDbSoundcloudErrorCode($value); - break; - case 59: - $this->setDbSoundcloudErrorMsg($value); - break; - case 60: - $this->setDbSoundcloudLinkToFile($value); - break; - case 61: - $this->setDbSoundCloundUploadTime($value); - break; - case 62: - $this->setDbReplayGain($value); - break; - case 63: - $this->setDbOwnerId($value); - break; - case 64: - $this->setDbCuein($value); - break; - case 65: - $this->setDbCueout($value); - break; - case 66: - $this->setDbSilanCheck($value); - break; - case 67: - $this->setDbHidden($value); - break; - case 68: - $this->setDbIsScheduled($value); - break; - case 69: - $this->setDbIsPlaylist($value); - break; - case 70: - $this->setDbResourceId($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcFilesPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbMime($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbFtype($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbDirectory($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setDbFilepath($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setDbImportStatus($arr[$keys[6]]); - if (array_key_exists($keys[7], $arr)) $this->setDbCurrentlyaccessing($arr[$keys[7]]); - if (array_key_exists($keys[8], $arr)) $this->setDbEditedby($arr[$keys[8]]); - if (array_key_exists($keys[9], $arr)) $this->setDbMtime($arr[$keys[9]]); - if (array_key_exists($keys[10], $arr)) $this->setDbUtime($arr[$keys[10]]); - if (array_key_exists($keys[11], $arr)) $this->setDbLPtime($arr[$keys[11]]); - if (array_key_exists($keys[12], $arr)) $this->setDbMd5($arr[$keys[12]]); - if (array_key_exists($keys[13], $arr)) $this->setDbTrackTitle($arr[$keys[13]]); - if (array_key_exists($keys[14], $arr)) $this->setDbArtistName($arr[$keys[14]]); - if (array_key_exists($keys[15], $arr)) $this->setDbBitRate($arr[$keys[15]]); - if (array_key_exists($keys[16], $arr)) $this->setDbSampleRate($arr[$keys[16]]); - if (array_key_exists($keys[17], $arr)) $this->setDbFormat($arr[$keys[17]]); - if (array_key_exists($keys[18], $arr)) $this->setDbLength($arr[$keys[18]]); - if (array_key_exists($keys[19], $arr)) $this->setDbAlbumTitle($arr[$keys[19]]); - if (array_key_exists($keys[20], $arr)) $this->setDbGenre($arr[$keys[20]]); - if (array_key_exists($keys[21], $arr)) $this->setDbComments($arr[$keys[21]]); - if (array_key_exists($keys[22], $arr)) $this->setDbYear($arr[$keys[22]]); - if (array_key_exists($keys[23], $arr)) $this->setDbTrackNumber($arr[$keys[23]]); - if (array_key_exists($keys[24], $arr)) $this->setDbChannels($arr[$keys[24]]); - if (array_key_exists($keys[25], $arr)) $this->setDbUrl($arr[$keys[25]]); - if (array_key_exists($keys[26], $arr)) $this->setDbBpm($arr[$keys[26]]); - if (array_key_exists($keys[27], $arr)) $this->setDbRating($arr[$keys[27]]); - if (array_key_exists($keys[28], $arr)) $this->setDbEncodedBy($arr[$keys[28]]); - if (array_key_exists($keys[29], $arr)) $this->setDbDiscNumber($arr[$keys[29]]); - if (array_key_exists($keys[30], $arr)) $this->setDbMood($arr[$keys[30]]); - if (array_key_exists($keys[31], $arr)) $this->setDbLabel($arr[$keys[31]]); - if (array_key_exists($keys[32], $arr)) $this->setDbComposer($arr[$keys[32]]); - if (array_key_exists($keys[33], $arr)) $this->setDbEncoder($arr[$keys[33]]); - if (array_key_exists($keys[34], $arr)) $this->setDbChecksum($arr[$keys[34]]); - if (array_key_exists($keys[35], $arr)) $this->setDbLyrics($arr[$keys[35]]); - if (array_key_exists($keys[36], $arr)) $this->setDbOrchestra($arr[$keys[36]]); - if (array_key_exists($keys[37], $arr)) $this->setDbConductor($arr[$keys[37]]); - if (array_key_exists($keys[38], $arr)) $this->setDbLyricist($arr[$keys[38]]); - if (array_key_exists($keys[39], $arr)) $this->setDbOriginalLyricist($arr[$keys[39]]); - if (array_key_exists($keys[40], $arr)) $this->setDbRadioStationName($arr[$keys[40]]); - if (array_key_exists($keys[41], $arr)) $this->setDbInfoUrl($arr[$keys[41]]); - if (array_key_exists($keys[42], $arr)) $this->setDbArtistUrl($arr[$keys[42]]); - if (array_key_exists($keys[43], $arr)) $this->setDbAudioSourceUrl($arr[$keys[43]]); - if (array_key_exists($keys[44], $arr)) $this->setDbRadioStationUrl($arr[$keys[44]]); - if (array_key_exists($keys[45], $arr)) $this->setDbBuyThisUrl($arr[$keys[45]]); - if (array_key_exists($keys[46], $arr)) $this->setDbIsrcNumber($arr[$keys[46]]); - if (array_key_exists($keys[47], $arr)) $this->setDbCatalogNumber($arr[$keys[47]]); - if (array_key_exists($keys[48], $arr)) $this->setDbOriginalArtist($arr[$keys[48]]); - if (array_key_exists($keys[49], $arr)) $this->setDbCopyright($arr[$keys[49]]); - if (array_key_exists($keys[50], $arr)) $this->setDbReportDatetime($arr[$keys[50]]); - if (array_key_exists($keys[51], $arr)) $this->setDbReportLocation($arr[$keys[51]]); - if (array_key_exists($keys[52], $arr)) $this->setDbReportOrganization($arr[$keys[52]]); - if (array_key_exists($keys[53], $arr)) $this->setDbSubject($arr[$keys[53]]); - if (array_key_exists($keys[54], $arr)) $this->setDbContributor($arr[$keys[54]]); - if (array_key_exists($keys[55], $arr)) $this->setDbLanguage($arr[$keys[55]]); - if (array_key_exists($keys[56], $arr)) $this->setDbFileExists($arr[$keys[56]]); - if (array_key_exists($keys[57], $arr)) $this->setDbSoundcloudId($arr[$keys[57]]); - if (array_key_exists($keys[58], $arr)) $this->setDbSoundcloudErrorCode($arr[$keys[58]]); - if (array_key_exists($keys[59], $arr)) $this->setDbSoundcloudErrorMsg($arr[$keys[59]]); - if (array_key_exists($keys[60], $arr)) $this->setDbSoundcloudLinkToFile($arr[$keys[60]]); - if (array_key_exists($keys[61], $arr)) $this->setDbSoundCloundUploadTime($arr[$keys[61]]); - if (array_key_exists($keys[62], $arr)) $this->setDbReplayGain($arr[$keys[62]]); - if (array_key_exists($keys[63], $arr)) $this->setDbOwnerId($arr[$keys[63]]); - if (array_key_exists($keys[64], $arr)) $this->setDbCuein($arr[$keys[64]]); - if (array_key_exists($keys[65], $arr)) $this->setDbCueout($arr[$keys[65]]); - if (array_key_exists($keys[66], $arr)) $this->setDbSilanCheck($arr[$keys[66]]); - if (array_key_exists($keys[67], $arr)) $this->setDbHidden($arr[$keys[67]]); - if (array_key_exists($keys[68], $arr)) $this->setDbIsScheduled($arr[$keys[68]]); - if (array_key_exists($keys[69], $arr)) $this->setDbIsPlaylist($arr[$keys[69]]); - if (array_key_exists($keys[70], $arr)) $this->setDbResourceId($arr[$keys[70]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcFilesPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcFilesPeer::ID)) $criteria->add(CcFilesPeer::ID, $this->id); - if ($this->isColumnModified(CcFilesPeer::NAME)) $criteria->add(CcFilesPeer::NAME, $this->name); - if ($this->isColumnModified(CcFilesPeer::MIME)) $criteria->add(CcFilesPeer::MIME, $this->mime); - if ($this->isColumnModified(CcFilesPeer::FTYPE)) $criteria->add(CcFilesPeer::FTYPE, $this->ftype); - if ($this->isColumnModified(CcFilesPeer::DIRECTORY)) $criteria->add(CcFilesPeer::DIRECTORY, $this->directory); - if ($this->isColumnModified(CcFilesPeer::FILEPATH)) $criteria->add(CcFilesPeer::FILEPATH, $this->filepath); - if ($this->isColumnModified(CcFilesPeer::IMPORT_STATUS)) $criteria->add(CcFilesPeer::IMPORT_STATUS, $this->import_status); - if ($this->isColumnModified(CcFilesPeer::CURRENTLYACCESSING)) $criteria->add(CcFilesPeer::CURRENTLYACCESSING, $this->currentlyaccessing); - if ($this->isColumnModified(CcFilesPeer::EDITEDBY)) $criteria->add(CcFilesPeer::EDITEDBY, $this->editedby); - if ($this->isColumnModified(CcFilesPeer::MTIME)) $criteria->add(CcFilesPeer::MTIME, $this->mtime); - if ($this->isColumnModified(CcFilesPeer::UTIME)) $criteria->add(CcFilesPeer::UTIME, $this->utime); - if ($this->isColumnModified(CcFilesPeer::LPTIME)) $criteria->add(CcFilesPeer::LPTIME, $this->lptime); - if ($this->isColumnModified(CcFilesPeer::MD5)) $criteria->add(CcFilesPeer::MD5, $this->md5); - if ($this->isColumnModified(CcFilesPeer::TRACK_TITLE)) $criteria->add(CcFilesPeer::TRACK_TITLE, $this->track_title); - if ($this->isColumnModified(CcFilesPeer::ARTIST_NAME)) $criteria->add(CcFilesPeer::ARTIST_NAME, $this->artist_name); - if ($this->isColumnModified(CcFilesPeer::BIT_RATE)) $criteria->add(CcFilesPeer::BIT_RATE, $this->bit_rate); - if ($this->isColumnModified(CcFilesPeer::SAMPLE_RATE)) $criteria->add(CcFilesPeer::SAMPLE_RATE, $this->sample_rate); - if ($this->isColumnModified(CcFilesPeer::FORMAT)) $criteria->add(CcFilesPeer::FORMAT, $this->format); - if ($this->isColumnModified(CcFilesPeer::LENGTH)) $criteria->add(CcFilesPeer::LENGTH, $this->length); - if ($this->isColumnModified(CcFilesPeer::ALBUM_TITLE)) $criteria->add(CcFilesPeer::ALBUM_TITLE, $this->album_title); - if ($this->isColumnModified(CcFilesPeer::GENRE)) $criteria->add(CcFilesPeer::GENRE, $this->genre); - if ($this->isColumnModified(CcFilesPeer::COMMENTS)) $criteria->add(CcFilesPeer::COMMENTS, $this->comments); - if ($this->isColumnModified(CcFilesPeer::YEAR)) $criteria->add(CcFilesPeer::YEAR, $this->year); - if ($this->isColumnModified(CcFilesPeer::TRACK_NUMBER)) $criteria->add(CcFilesPeer::TRACK_NUMBER, $this->track_number); - if ($this->isColumnModified(CcFilesPeer::CHANNELS)) $criteria->add(CcFilesPeer::CHANNELS, $this->channels); - if ($this->isColumnModified(CcFilesPeer::URL)) $criteria->add(CcFilesPeer::URL, $this->url); - if ($this->isColumnModified(CcFilesPeer::BPM)) $criteria->add(CcFilesPeer::BPM, $this->bpm); - if ($this->isColumnModified(CcFilesPeer::RATING)) $criteria->add(CcFilesPeer::RATING, $this->rating); - if ($this->isColumnModified(CcFilesPeer::ENCODED_BY)) $criteria->add(CcFilesPeer::ENCODED_BY, $this->encoded_by); - if ($this->isColumnModified(CcFilesPeer::DISC_NUMBER)) $criteria->add(CcFilesPeer::DISC_NUMBER, $this->disc_number); - if ($this->isColumnModified(CcFilesPeer::MOOD)) $criteria->add(CcFilesPeer::MOOD, $this->mood); - if ($this->isColumnModified(CcFilesPeer::LABEL)) $criteria->add(CcFilesPeer::LABEL, $this->label); - if ($this->isColumnModified(CcFilesPeer::COMPOSER)) $criteria->add(CcFilesPeer::COMPOSER, $this->composer); - if ($this->isColumnModified(CcFilesPeer::ENCODER)) $criteria->add(CcFilesPeer::ENCODER, $this->encoder); - if ($this->isColumnModified(CcFilesPeer::CHECKSUM)) $criteria->add(CcFilesPeer::CHECKSUM, $this->checksum); - if ($this->isColumnModified(CcFilesPeer::LYRICS)) $criteria->add(CcFilesPeer::LYRICS, $this->lyrics); - if ($this->isColumnModified(CcFilesPeer::ORCHESTRA)) $criteria->add(CcFilesPeer::ORCHESTRA, $this->orchestra); - if ($this->isColumnModified(CcFilesPeer::CONDUCTOR)) $criteria->add(CcFilesPeer::CONDUCTOR, $this->conductor); - if ($this->isColumnModified(CcFilesPeer::LYRICIST)) $criteria->add(CcFilesPeer::LYRICIST, $this->lyricist); - if ($this->isColumnModified(CcFilesPeer::ORIGINAL_LYRICIST)) $criteria->add(CcFilesPeer::ORIGINAL_LYRICIST, $this->original_lyricist); - if ($this->isColumnModified(CcFilesPeer::RADIO_STATION_NAME)) $criteria->add(CcFilesPeer::RADIO_STATION_NAME, $this->radio_station_name); - if ($this->isColumnModified(CcFilesPeer::INFO_URL)) $criteria->add(CcFilesPeer::INFO_URL, $this->info_url); - if ($this->isColumnModified(CcFilesPeer::ARTIST_URL)) $criteria->add(CcFilesPeer::ARTIST_URL, $this->artist_url); - if ($this->isColumnModified(CcFilesPeer::AUDIO_SOURCE_URL)) $criteria->add(CcFilesPeer::AUDIO_SOURCE_URL, $this->audio_source_url); - if ($this->isColumnModified(CcFilesPeer::RADIO_STATION_URL)) $criteria->add(CcFilesPeer::RADIO_STATION_URL, $this->radio_station_url); - if ($this->isColumnModified(CcFilesPeer::BUY_THIS_URL)) $criteria->add(CcFilesPeer::BUY_THIS_URL, $this->buy_this_url); - if ($this->isColumnModified(CcFilesPeer::ISRC_NUMBER)) $criteria->add(CcFilesPeer::ISRC_NUMBER, $this->isrc_number); - if ($this->isColumnModified(CcFilesPeer::CATALOG_NUMBER)) $criteria->add(CcFilesPeer::CATALOG_NUMBER, $this->catalog_number); - if ($this->isColumnModified(CcFilesPeer::ORIGINAL_ARTIST)) $criteria->add(CcFilesPeer::ORIGINAL_ARTIST, $this->original_artist); - if ($this->isColumnModified(CcFilesPeer::COPYRIGHT)) $criteria->add(CcFilesPeer::COPYRIGHT, $this->copyright); - if ($this->isColumnModified(CcFilesPeer::REPORT_DATETIME)) $criteria->add(CcFilesPeer::REPORT_DATETIME, $this->report_datetime); - if ($this->isColumnModified(CcFilesPeer::REPORT_LOCATION)) $criteria->add(CcFilesPeer::REPORT_LOCATION, $this->report_location); - if ($this->isColumnModified(CcFilesPeer::REPORT_ORGANIZATION)) $criteria->add(CcFilesPeer::REPORT_ORGANIZATION, $this->report_organization); - if ($this->isColumnModified(CcFilesPeer::SUBJECT)) $criteria->add(CcFilesPeer::SUBJECT, $this->subject); - if ($this->isColumnModified(CcFilesPeer::CONTRIBUTOR)) $criteria->add(CcFilesPeer::CONTRIBUTOR, $this->contributor); - if ($this->isColumnModified(CcFilesPeer::LANGUAGE)) $criteria->add(CcFilesPeer::LANGUAGE, $this->language); - if ($this->isColumnModified(CcFilesPeer::FILE_EXISTS)) $criteria->add(CcFilesPeer::FILE_EXISTS, $this->file_exists); - if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_ID)) $criteria->add(CcFilesPeer::SOUNDCLOUD_ID, $this->soundcloud_id); - if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_ERROR_CODE)) $criteria->add(CcFilesPeer::SOUNDCLOUD_ERROR_CODE, $this->soundcloud_error_code); - if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_ERROR_MSG)) $criteria->add(CcFilesPeer::SOUNDCLOUD_ERROR_MSG, $this->soundcloud_error_msg); - if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE)) $criteria->add(CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE, $this->soundcloud_link_to_file); - if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME)) $criteria->add(CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, $this->soundcloud_upload_time); - if ($this->isColumnModified(CcFilesPeer::REPLAY_GAIN)) $criteria->add(CcFilesPeer::REPLAY_GAIN, $this->replay_gain); - if ($this->isColumnModified(CcFilesPeer::OWNER_ID)) $criteria->add(CcFilesPeer::OWNER_ID, $this->owner_id); - if ($this->isColumnModified(CcFilesPeer::CUEIN)) $criteria->add(CcFilesPeer::CUEIN, $this->cuein); - if ($this->isColumnModified(CcFilesPeer::CUEOUT)) $criteria->add(CcFilesPeer::CUEOUT, $this->cueout); - if ($this->isColumnModified(CcFilesPeer::SILAN_CHECK)) $criteria->add(CcFilesPeer::SILAN_CHECK, $this->silan_check); - if ($this->isColumnModified(CcFilesPeer::HIDDEN)) $criteria->add(CcFilesPeer::HIDDEN, $this->hidden); - if ($this->isColumnModified(CcFilesPeer::IS_SCHEDULED)) $criteria->add(CcFilesPeer::IS_SCHEDULED, $this->is_scheduled); - if ($this->isColumnModified(CcFilesPeer::IS_PLAYLIST)) $criteria->add(CcFilesPeer::IS_PLAYLIST, $this->is_playlist); - if ($this->isColumnModified(CcFilesPeer::RESOURCE_ID)) $criteria->add(CcFilesPeer::RESOURCE_ID, $this->resource_id); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcFilesPeer::DATABASE_NAME); - $criteria->add(CcFilesPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcFiles (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbName($this->name); - $copyObj->setDbMime($this->mime); - $copyObj->setDbFtype($this->ftype); - $copyObj->setDbDirectory($this->directory); - $copyObj->setDbFilepath($this->filepath); - $copyObj->setDbImportStatus($this->import_status); - $copyObj->setDbCurrentlyaccessing($this->currentlyaccessing); - $copyObj->setDbEditedby($this->editedby); - $copyObj->setDbMtime($this->mtime); - $copyObj->setDbUtime($this->utime); - $copyObj->setDbLPtime($this->lptime); - $copyObj->setDbMd5($this->md5); - $copyObj->setDbTrackTitle($this->track_title); - $copyObj->setDbArtistName($this->artist_name); - $copyObj->setDbBitRate($this->bit_rate); - $copyObj->setDbSampleRate($this->sample_rate); - $copyObj->setDbFormat($this->format); - $copyObj->setDbLength($this->length); - $copyObj->setDbAlbumTitle($this->album_title); - $copyObj->setDbGenre($this->genre); - $copyObj->setDbComments($this->comments); - $copyObj->setDbYear($this->year); - $copyObj->setDbTrackNumber($this->track_number); - $copyObj->setDbChannels($this->channels); - $copyObj->setDbUrl($this->url); - $copyObj->setDbBpm($this->bpm); - $copyObj->setDbRating($this->rating); - $copyObj->setDbEncodedBy($this->encoded_by); - $copyObj->setDbDiscNumber($this->disc_number); - $copyObj->setDbMood($this->mood); - $copyObj->setDbLabel($this->label); - $copyObj->setDbComposer($this->composer); - $copyObj->setDbEncoder($this->encoder); - $copyObj->setDbChecksum($this->checksum); - $copyObj->setDbLyrics($this->lyrics); - $copyObj->setDbOrchestra($this->orchestra); - $copyObj->setDbConductor($this->conductor); - $copyObj->setDbLyricist($this->lyricist); - $copyObj->setDbOriginalLyricist($this->original_lyricist); - $copyObj->setDbRadioStationName($this->radio_station_name); - $copyObj->setDbInfoUrl($this->info_url); - $copyObj->setDbArtistUrl($this->artist_url); - $copyObj->setDbAudioSourceUrl($this->audio_source_url); - $copyObj->setDbRadioStationUrl($this->radio_station_url); - $copyObj->setDbBuyThisUrl($this->buy_this_url); - $copyObj->setDbIsrcNumber($this->isrc_number); - $copyObj->setDbCatalogNumber($this->catalog_number); - $copyObj->setDbOriginalArtist($this->original_artist); - $copyObj->setDbCopyright($this->copyright); - $copyObj->setDbReportDatetime($this->report_datetime); - $copyObj->setDbReportLocation($this->report_location); - $copyObj->setDbReportOrganization($this->report_organization); - $copyObj->setDbSubject($this->subject); - $copyObj->setDbContributor($this->contributor); - $copyObj->setDbLanguage($this->language); - $copyObj->setDbFileExists($this->file_exists); - $copyObj->setDbSoundcloudId($this->soundcloud_id); - $copyObj->setDbSoundcloudErrorCode($this->soundcloud_error_code); - $copyObj->setDbSoundcloudErrorMsg($this->soundcloud_error_msg); - $copyObj->setDbSoundcloudLinkToFile($this->soundcloud_link_to_file); - $copyObj->setDbSoundCloundUploadTime($this->soundcloud_upload_time); - $copyObj->setDbReplayGain($this->replay_gain); - $copyObj->setDbOwnerId($this->owner_id); - $copyObj->setDbCuein($this->cuein); - $copyObj->setDbCueout($this->cueout); - $copyObj->setDbSilanCheck($this->silan_check); - $copyObj->setDbHidden($this->hidden); - $copyObj->setDbIsScheduled($this->is_scheduled); - $copyObj->setDbIsPlaylist($this->is_playlist); - $copyObj->setDbResourceId($this->resource_id); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getCcShowInstancess() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcShowInstances($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcPlaylistcontentss() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcPlaylistcontents($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcBlockcontentss() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcBlockcontents($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcSchedules() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcSchedule($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcPlayoutHistorys() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcPlayoutHistory($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcFiles Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcFilesPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcFilesPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcSubjs object. - * - * @param CcSubjs $v - * @return CcFiles The current object (for fluent API support) - * @throws PropelException - */ - public function setFkOwner(CcSubjs $v = null) - { - if ($v === null) { - $this->setDbOwnerId(NULL); - } else { - $this->setDbOwnerId($v->getDbId()); - } - - $this->aFkOwner = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcSubjs object, it will not be re-added. - if ($v !== null) { - $v->addCcFilesRelatedByDbOwnerId($this); - } - - return $this; - } - - - /** - * Get the associated CcSubjs object - * - * @param PropelPDO Optional Connection object. - * @return CcSubjs The associated CcSubjs object. - * @throws PropelException - */ - public function getFkOwner(PropelPDO $con = null) - { - if ($this->aFkOwner === null && ($this->owner_id !== null)) { - $this->aFkOwner = CcSubjsQuery::create()->findPk($this->owner_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aFkOwner->addCcFilessRelatedByDbOwnerId($this); - */ - } - return $this->aFkOwner; - } - - /** - * Declares an association between this object and a CcSubjs object. - * - * @param CcSubjs $v - * @return CcFiles The current object (for fluent API support) - * @throws PropelException - */ - public function setCcSubjsRelatedByDbEditedby(CcSubjs $v = null) - { - if ($v === null) { - $this->setDbEditedby(NULL); - } else { - $this->setDbEditedby($v->getDbId()); - } - - $this->aCcSubjsRelatedByDbEditedby = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcSubjs object, it will not be re-added. - if ($v !== null) { - $v->addCcFilesRelatedByDbEditedby($this); - } - - return $this; - } - - - /** - * Get the associated CcSubjs object - * - * @param PropelPDO Optional Connection object. - * @return CcSubjs The associated CcSubjs object. - * @throws PropelException - */ - public function getCcSubjsRelatedByDbEditedby(PropelPDO $con = null) - { - if ($this->aCcSubjsRelatedByDbEditedby === null && ($this->editedby !== null)) { - $this->aCcSubjsRelatedByDbEditedby = CcSubjsQuery::create()->findPk($this->editedby, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcSubjsRelatedByDbEditedby->addCcFilessRelatedByDbEditedby($this); - */ - } - return $this->aCcSubjsRelatedByDbEditedby; - } - - /** - * Declares an association between this object and a CcMusicDirs object. - * - * @param CcMusicDirs $v - * @return CcFiles The current object (for fluent API support) - * @throws PropelException - */ - public function setCcMusicDirs(CcMusicDirs $v = null) - { - if ($v === null) { - $this->setDbDirectory(NULL); - } else { - $this->setDbDirectory($v->getId()); - } - - $this->aCcMusicDirs = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcMusicDirs object, it will not be re-added. - if ($v !== null) { - $v->addCcFiles($this); - } - - return $this; - } - - - /** - * Get the associated CcMusicDirs object - * - * @param PropelPDO Optional Connection object. - * @return CcMusicDirs The associated CcMusicDirs object. - * @throws PropelException - */ - public function getCcMusicDirs(PropelPDO $con = null) - { - if ($this->aCcMusicDirs === null && ($this->directory !== null)) { - $this->aCcMusicDirs = CcMusicDirsQuery::create()->findPk($this->directory, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcMusicDirs->addCcFiless($this); - */ - } - return $this->aCcMusicDirs; - } - - /** - * Clears out the collCcShowInstancess collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcShowInstancess() - */ - public function clearCcShowInstancess() - { - $this->collCcShowInstancess = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcShowInstancess collection. - * - * By default this just sets the collCcShowInstancess collection to an empty array (like clearcollCcShowInstancess()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcShowInstancess() - { - $this->collCcShowInstancess = new PropelObjectCollection(); - $this->collCcShowInstancess->setModel('CcShowInstances'); - } - - /** - * Gets an array of CcShowInstances objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcFiles is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcShowInstances[] List of CcShowInstances objects - * @throws PropelException - */ - public function getCcShowInstancess($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcShowInstancess || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowInstancess) { - // return empty collection - $this->initCcShowInstancess(); - } else { - $collCcShowInstancess = CcShowInstancesQuery::create(null, $criteria) - ->filterByCcFiles($this) - ->find($con); - if (null !== $criteria) { - return $collCcShowInstancess; - } - $this->collCcShowInstancess = $collCcShowInstancess; - } - } - return $this->collCcShowInstancess; - } - - /** - * Returns the number of related CcShowInstances objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcShowInstances objects. - * @throws PropelException - */ - public function countCcShowInstancess(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcShowInstancess || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowInstancess) { - return 0; - } else { - $query = CcShowInstancesQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcFiles($this) - ->count($con); - } - } else { - return count($this->collCcShowInstancess); - } - } - - /** - * Method called to associate a CcShowInstances object to this object - * through the CcShowInstances foreign key attribute. - * - * @param CcShowInstances $l CcShowInstances - * @return void - * @throws PropelException - */ - public function addCcShowInstances(CcShowInstances $l) - { - if ($this->collCcShowInstancess === null) { - $this->initCcShowInstancess(); - } - if (!$this->collCcShowInstancess->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcShowInstancess[]= $l; - $l->setCcFiles($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcFiles is new, it will return - * an empty collection; or if this CcFiles has previously - * been saved, it will retrieve related CcShowInstancess from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcFiles. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcShowInstances[] List of CcShowInstances objects - */ - public function getCcShowInstancessJoinCcShow($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcShowInstancesQuery::create(null, $criteria); - $query->joinWith('CcShow', $join_behavior); - - return $this->getCcShowInstancess($query, $con); - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcFiles is new, it will return - * an empty collection; or if this CcFiles has previously - * been saved, it will retrieve related CcShowInstancess from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcFiles. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcShowInstances[] List of CcShowInstances objects - */ - public function getCcShowInstancessJoinCcShowInstancesRelatedByDbOriginalShow($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcShowInstancesQuery::create(null, $criteria); - $query->joinWith('CcShowInstancesRelatedByDbOriginalShow', $join_behavior); - - return $this->getCcShowInstancess($query, $con); - } - - /** - * Clears out the collCcPlaylistcontentss collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcPlaylistcontentss() - */ - public function clearCcPlaylistcontentss() - { - $this->collCcPlaylistcontentss = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcPlaylistcontentss collection. - * - * By default this just sets the collCcPlaylistcontentss collection to an empty array (like clearcollCcPlaylistcontentss()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcPlaylistcontentss() - { - $this->collCcPlaylistcontentss = new PropelObjectCollection(); - $this->collCcPlaylistcontentss->setModel('CcPlaylistcontents'); - } - - /** - * Gets an array of CcPlaylistcontents objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcFiles is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcPlaylistcontents[] List of CcPlaylistcontents objects - * @throws PropelException - */ - public function getCcPlaylistcontentss($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcPlaylistcontentss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlaylistcontentss) { - // return empty collection - $this->initCcPlaylistcontentss(); - } else { - $collCcPlaylistcontentss = CcPlaylistcontentsQuery::create(null, $criteria) - ->filterByCcFiles($this) - ->find($con); - if (null !== $criteria) { - return $collCcPlaylistcontentss; - } - $this->collCcPlaylistcontentss = $collCcPlaylistcontentss; - } - } - return $this->collCcPlaylistcontentss; - } - - /** - * Returns the number of related CcPlaylistcontents objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcPlaylistcontents objects. - * @throws PropelException - */ - public function countCcPlaylistcontentss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcPlaylistcontentss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlaylistcontentss) { - return 0; - } else { - $query = CcPlaylistcontentsQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcFiles($this) - ->count($con); - } - } else { - return count($this->collCcPlaylistcontentss); - } - } - - /** - * Method called to associate a CcPlaylistcontents object to this object - * through the CcPlaylistcontents foreign key attribute. - * - * @param CcPlaylistcontents $l CcPlaylistcontents - * @return void - * @throws PropelException - */ - public function addCcPlaylistcontents(CcPlaylistcontents $l) - { - if ($this->collCcPlaylistcontentss === null) { - $this->initCcPlaylistcontentss(); - } - if (!$this->collCcPlaylistcontentss->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcPlaylistcontentss[]= $l; - $l->setCcFiles($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcFiles is new, it will return - * an empty collection; or if this CcFiles has previously - * been saved, it will retrieve related CcPlaylistcontentss from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcFiles. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcPlaylistcontents[] List of CcPlaylistcontents objects - */ - public function getCcPlaylistcontentssJoinCcBlock($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcPlaylistcontentsQuery::create(null, $criteria); - $query->joinWith('CcBlock', $join_behavior); - - return $this->getCcPlaylistcontentss($query, $con); - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcFiles is new, it will return - * an empty collection; or if this CcFiles has previously - * been saved, it will retrieve related CcPlaylistcontentss from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcFiles. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcPlaylistcontents[] List of CcPlaylistcontents objects - */ - public function getCcPlaylistcontentssJoinCcPlaylist($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcPlaylistcontentsQuery::create(null, $criteria); - $query->joinWith('CcPlaylist', $join_behavior); - - return $this->getCcPlaylistcontentss($query, $con); - } - - /** - * Clears out the collCcBlockcontentss collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcBlockcontentss() - */ - public function clearCcBlockcontentss() - { - $this->collCcBlockcontentss = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcBlockcontentss collection. - * - * By default this just sets the collCcBlockcontentss collection to an empty array (like clearcollCcBlockcontentss()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcBlockcontentss() - { - $this->collCcBlockcontentss = new PropelObjectCollection(); - $this->collCcBlockcontentss->setModel('CcBlockcontents'); - } - - /** - * Gets an array of CcBlockcontents objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcFiles is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcBlockcontents[] List of CcBlockcontents objects - * @throws PropelException - */ - public function getCcBlockcontentss($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcBlockcontentss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcBlockcontentss) { - // return empty collection - $this->initCcBlockcontentss(); - } else { - $collCcBlockcontentss = CcBlockcontentsQuery::create(null, $criteria) - ->filterByCcFiles($this) - ->find($con); - if (null !== $criteria) { - return $collCcBlockcontentss; - } - $this->collCcBlockcontentss = $collCcBlockcontentss; - } - } - return $this->collCcBlockcontentss; - } - - /** - * Returns the number of related CcBlockcontents objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcBlockcontents objects. - * @throws PropelException - */ - public function countCcBlockcontentss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcBlockcontentss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcBlockcontentss) { - return 0; - } else { - $query = CcBlockcontentsQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcFiles($this) - ->count($con); - } - } else { - return count($this->collCcBlockcontentss); - } - } - - /** - * Method called to associate a CcBlockcontents object to this object - * through the CcBlockcontents foreign key attribute. - * - * @param CcBlockcontents $l CcBlockcontents - * @return void - * @throws PropelException - */ - public function addCcBlockcontents(CcBlockcontents $l) - { - if ($this->collCcBlockcontentss === null) { - $this->initCcBlockcontentss(); - } - if (!$this->collCcBlockcontentss->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcBlockcontentss[]= $l; - $l->setCcFiles($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcFiles is new, it will return - * an empty collection; or if this CcFiles has previously - * been saved, it will retrieve related CcBlockcontentss from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcFiles. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcBlockcontents[] List of CcBlockcontents objects - */ - public function getCcBlockcontentssJoinCcBlock($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcBlockcontentsQuery::create(null, $criteria); - $query->joinWith('CcBlock', $join_behavior); - - return $this->getCcBlockcontentss($query, $con); - } - - /** - * Clears out the collCcSchedules collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcSchedules() - */ - public function clearCcSchedules() - { - $this->collCcSchedules = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcSchedules collection. - * - * By default this just sets the collCcSchedules collection to an empty array (like clearcollCcSchedules()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcSchedules() - { - $this->collCcSchedules = new PropelObjectCollection(); - $this->collCcSchedules->setModel('CcSchedule'); - } - - /** - * Gets an array of CcSchedule objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcFiles is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcSchedule[] List of CcSchedule objects - * @throws PropelException - */ - public function getCcSchedules($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcSchedules || null !== $criteria) { - if ($this->isNew() && null === $this->collCcSchedules) { - // return empty collection - $this->initCcSchedules(); - } else { - $collCcSchedules = CcScheduleQuery::create(null, $criteria) - ->filterByCcFiles($this) - ->find($con); - if (null !== $criteria) { - return $collCcSchedules; - } - $this->collCcSchedules = $collCcSchedules; - } - } - return $this->collCcSchedules; - } - - /** - * Returns the number of related CcSchedule objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcSchedule objects. - * @throws PropelException - */ - public function countCcSchedules(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcSchedules || null !== $criteria) { - if ($this->isNew() && null === $this->collCcSchedules) { - return 0; - } else { - $query = CcScheduleQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcFiles($this) - ->count($con); - } - } else { - return count($this->collCcSchedules); - } - } - - /** - * Method called to associate a CcSchedule object to this object - * through the CcSchedule foreign key attribute. - * - * @param CcSchedule $l CcSchedule - * @return void - * @throws PropelException - */ - public function addCcSchedule(CcSchedule $l) - { - if ($this->collCcSchedules === null) { - $this->initCcSchedules(); - } - if (!$this->collCcSchedules->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcSchedules[]= $l; - $l->setCcFiles($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcFiles is new, it will return - * an empty collection; or if this CcFiles has previously - * been saved, it will retrieve related CcSchedules from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcFiles. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcSchedule[] List of CcSchedule objects - */ - public function getCcSchedulesJoinCcShowInstances($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcScheduleQuery::create(null, $criteria); - $query->joinWith('CcShowInstances', $join_behavior); - - return $this->getCcSchedules($query, $con); - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcFiles is new, it will return - * an empty collection; or if this CcFiles has previously - * been saved, it will retrieve related CcSchedules from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcFiles. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcSchedule[] List of CcSchedule objects - */ - public function getCcSchedulesJoinCcWebstream($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcScheduleQuery::create(null, $criteria); - $query->joinWith('CcWebstream', $join_behavior); - - return $this->getCcSchedules($query, $con); - } - - /** - * Clears out the collCcPlayoutHistorys collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcPlayoutHistorys() - */ - public function clearCcPlayoutHistorys() - { - $this->collCcPlayoutHistorys = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcPlayoutHistorys collection. - * - * By default this just sets the collCcPlayoutHistorys collection to an empty array (like clearcollCcPlayoutHistorys()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcPlayoutHistorys() - { - $this->collCcPlayoutHistorys = new PropelObjectCollection(); - $this->collCcPlayoutHistorys->setModel('CcPlayoutHistory'); - } - - /** - * Gets an array of CcPlayoutHistory objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcFiles is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcPlayoutHistory[] List of CcPlayoutHistory objects - * @throws PropelException - */ - public function getCcPlayoutHistorys($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcPlayoutHistorys || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlayoutHistorys) { - // return empty collection - $this->initCcPlayoutHistorys(); - } else { - $collCcPlayoutHistorys = CcPlayoutHistoryQuery::create(null, $criteria) - ->filterByCcFiles($this) - ->find($con); - if (null !== $criteria) { - return $collCcPlayoutHistorys; - } - $this->collCcPlayoutHistorys = $collCcPlayoutHistorys; - } - } - return $this->collCcPlayoutHistorys; - } - - /** - * Returns the number of related CcPlayoutHistory objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcPlayoutHistory objects. - * @throws PropelException - */ - public function countCcPlayoutHistorys(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcPlayoutHistorys || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlayoutHistorys) { - return 0; - } else { - $query = CcPlayoutHistoryQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcFiles($this) - ->count($con); - } - } else { - return count($this->collCcPlayoutHistorys); - } - } - - /** - * Method called to associate a CcPlayoutHistory object to this object - * through the CcPlayoutHistory foreign key attribute. - * - * @param CcPlayoutHistory $l CcPlayoutHistory - * @return void - * @throws PropelException - */ - public function addCcPlayoutHistory(CcPlayoutHistory $l) - { - if ($this->collCcPlayoutHistorys === null) { - $this->initCcPlayoutHistorys(); - } - if (!$this->collCcPlayoutHistorys->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcPlayoutHistorys[]= $l; - $l->setCcFiles($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcFiles is new, it will return - * an empty collection; or if this CcFiles has previously - * been saved, it will retrieve related CcPlayoutHistorys from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcFiles. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcPlayoutHistory[] List of CcPlayoutHistory objects - */ - public function getCcPlayoutHistorysJoinCcShowInstances($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcPlayoutHistoryQuery::create(null, $criteria); - $query->joinWith('CcShowInstances', $join_behavior); - - return $this->getCcPlayoutHistorys($query, $con); - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->name = null; - $this->mime = null; - $this->ftype = null; - $this->directory = null; - $this->filepath = null; - $this->import_status = null; - $this->currentlyaccessing = null; - $this->editedby = null; - $this->mtime = null; - $this->utime = null; - $this->lptime = null; - $this->md5 = null; - $this->track_title = null; - $this->artist_name = null; - $this->bit_rate = null; - $this->sample_rate = null; - $this->format = null; - $this->length = null; - $this->album_title = null; - $this->genre = null; - $this->comments = null; - $this->year = null; - $this->track_number = null; - $this->channels = null; - $this->url = null; - $this->bpm = null; - $this->rating = null; - $this->encoded_by = null; - $this->disc_number = null; - $this->mood = null; - $this->label = null; - $this->composer = null; - $this->encoder = null; - $this->checksum = null; - $this->lyrics = null; - $this->orchestra = null; - $this->conductor = null; - $this->lyricist = null; - $this->original_lyricist = null; - $this->radio_station_name = null; - $this->info_url = null; - $this->artist_url = null; - $this->audio_source_url = null; - $this->radio_station_url = null; - $this->buy_this_url = null; - $this->isrc_number = null; - $this->catalog_number = null; - $this->original_artist = null; - $this->copyright = null; - $this->report_datetime = null; - $this->report_location = null; - $this->report_organization = null; - $this->subject = null; - $this->contributor = null; - $this->language = null; - $this->file_exists = null; - $this->soundcloud_id = null; - $this->soundcloud_error_code = null; - $this->soundcloud_error_msg = null; - $this->soundcloud_link_to_file = null; - $this->soundcloud_upload_time = null; - $this->replay_gain = null; - $this->owner_id = null; - $this->cuein = null; - $this->cueout = null; - $this->silan_check = null; - $this->hidden = null; - $this->is_scheduled = null; - $this->is_playlist = null; - $this->resource_id = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - if ($this->collCcShowInstancess) { - foreach ((array) $this->collCcShowInstancess as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcPlaylistcontentss) { - foreach ((array) $this->collCcPlaylistcontentss as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcBlockcontentss) { - foreach ((array) $this->collCcBlockcontentss as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcSchedules) { - foreach ((array) $this->collCcSchedules as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcPlayoutHistorys) { - foreach ((array) $this->collCcPlayoutHistorys as $o) { - $o->clearAllReferences($deep); - } - } - } // if ($deep) - - $this->collCcShowInstancess = null; - $this->collCcPlaylistcontentss = null; - $this->collCcBlockcontentss = null; - $this->collCcSchedules = null; - $this->collCcPlayoutHistorys = null; - $this->aFkOwner = null; - $this->aCcSubjsRelatedByDbEditedby = null; - $this->aCcMusicDirs = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcFiles + /** + * Peer class name + */ + const PEER = 'CcFilesPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcFilesPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the name field. + * Note: this column has a database default value of: '' + * @var string + */ + protected $name; + + /** + * The value for the mime field. + * Note: this column has a database default value of: '' + * @var string + */ + protected $mime; + + /** + * The value for the ftype field. + * Note: this column has a database default value of: '' + * @var string + */ + protected $ftype; + + /** + * The value for the directory field. + * @var int + */ + protected $directory; + + /** + * The value for the filepath field. + * Note: this column has a database default value of: '' + * @var string + */ + protected $filepath; + + /** + * The value for the import_status field. + * Note: this column has a database default value of: 1 + * @var int + */ + protected $import_status; + + /** + * The value for the currentlyaccessing field. + * Note: this column has a database default value of: 0 + * @var int + */ + protected $currentlyaccessing; + + /** + * The value for the editedby field. + * @var int + */ + protected $editedby; + + /** + * The value for the mtime field. + * @var string + */ + protected $mtime; + + /** + * The value for the utime field. + * @var string + */ + protected $utime; + + /** + * The value for the lptime field. + * @var string + */ + protected $lptime; + + /** + * The value for the md5 field. + * @var string + */ + protected $md5; + + /** + * The value for the track_title field. + * @var string + */ + protected $track_title; + + /** + * The value for the artist_name field. + * @var string + */ + protected $artist_name; + + /** + * The value for the bit_rate field. + * @var int + */ + protected $bit_rate; + + /** + * The value for the sample_rate field. + * @var int + */ + protected $sample_rate; + + /** + * The value for the format field. + * @var string + */ + protected $format; + + /** + * The value for the length field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $length; + + /** + * The value for the album_title field. + * @var string + */ + protected $album_title; + + /** + * The value for the genre field. + * @var string + */ + protected $genre; + + /** + * The value for the comments field. + * @var string + */ + protected $comments; + + /** + * The value for the year field. + * @var string + */ + protected $year; + + /** + * The value for the track_number field. + * @var int + */ + protected $track_number; + + /** + * The value for the channels field. + * @var int + */ + protected $channels; + + /** + * The value for the url field. + * @var string + */ + protected $url; + + /** + * The value for the bpm field. + * @var int + */ + protected $bpm; + + /** + * The value for the rating field. + * @var string + */ + protected $rating; + + /** + * The value for the encoded_by field. + * @var string + */ + protected $encoded_by; + + /** + * The value for the disc_number field. + * @var string + */ + protected $disc_number; + + /** + * The value for the mood field. + * @var string + */ + protected $mood; + + /** + * The value for the label field. + * @var string + */ + protected $label; + + /** + * The value for the composer field. + * @var string + */ + protected $composer; + + /** + * The value for the encoder field. + * @var string + */ + protected $encoder; + + /** + * The value for the checksum field. + * @var string + */ + protected $checksum; + + /** + * The value for the lyrics field. + * @var string + */ + protected $lyrics; + + /** + * The value for the orchestra field. + * @var string + */ + protected $orchestra; + + /** + * The value for the conductor field. + * @var string + */ + protected $conductor; + + /** + * The value for the lyricist field. + * @var string + */ + protected $lyricist; + + /** + * The value for the original_lyricist field. + * @var string + */ + protected $original_lyricist; + + /** + * The value for the radio_station_name field. + * @var string + */ + protected $radio_station_name; + + /** + * The value for the info_url field. + * @var string + */ + protected $info_url; + + /** + * The value for the artist_url field. + * @var string + */ + protected $artist_url; + + /** + * The value for the audio_source_url field. + * @var string + */ + protected $audio_source_url; + + /** + * The value for the radio_station_url field. + * @var string + */ + protected $radio_station_url; + + /** + * The value for the buy_this_url field. + * @var string + */ + protected $buy_this_url; + + /** + * The value for the isrc_number field. + * @var string + */ + protected $isrc_number; + + /** + * The value for the catalog_number field. + * @var string + */ + protected $catalog_number; + + /** + * The value for the original_artist field. + * @var string + */ + protected $original_artist; + + /** + * The value for the copyright field. + * @var string + */ + protected $copyright; + + /** + * The value for the report_datetime field. + * @var string + */ + protected $report_datetime; + + /** + * The value for the report_location field. + * @var string + */ + protected $report_location; + + /** + * The value for the report_organization field. + * @var string + */ + protected $report_organization; + + /** + * The value for the subject field. + * @var string + */ + protected $subject; + + /** + * The value for the contributor field. + * @var string + */ + protected $contributor; + + /** + * The value for the language field. + * @var string + */ + protected $language; + + /** + * The value for the file_exists field. + * Note: this column has a database default value of: true + * @var boolean + */ + protected $file_exists; + + /** + * The value for the soundcloud_id field. + * @var int + */ + protected $soundcloud_id; + + /** + * The value for the soundcloud_error_code field. + * @var int + */ + protected $soundcloud_error_code; + + /** + * The value for the soundcloud_error_msg field. + * @var string + */ + protected $soundcloud_error_msg; + + /** + * The value for the soundcloud_link_to_file field. + * @var string + */ + protected $soundcloud_link_to_file; + + /** + * The value for the soundcloud_upload_time field. + * @var string + */ + protected $soundcloud_upload_time; + + /** + * The value for the replay_gain field. + * @var string + */ + protected $replay_gain; + + /** + * The value for the owner_id field. + * @var int + */ + protected $owner_id; + + /** + * The value for the cuein field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $cuein; + + /** + * The value for the cueout field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $cueout; + + /** + * The value for the silan_check field. + * Note: this column has a database default value of: false + * @var boolean + */ + protected $silan_check; + + /** + * The value for the hidden field. + * Note: this column has a database default value of: false + * @var boolean + */ + protected $hidden; + + /** + * The value for the is_scheduled field. + * Note: this column has a database default value of: false + * @var boolean + */ + protected $is_scheduled; + + /** + * The value for the is_playlist field. + * Note: this column has a database default value of: false + * @var boolean + */ + protected $is_playlist; + + /** + * The value for the resource_id field. + * @var string + */ + protected $resource_id; + + /** + * @var CcSubjs + */ + protected $aFkOwner; + + /** + * @var CcSubjs + */ + protected $aCcSubjsRelatedByDbEditedby; + + /** + * @var CcMusicDirs + */ + protected $aCcMusicDirs; + + /** + * @var PropelObjectCollection|CcShowInstances[] Collection to store aggregation of CcShowInstances objects. + */ + protected $collCcShowInstancess; + protected $collCcShowInstancessPartial; + + /** + * @var PropelObjectCollection|CcPlaylistcontents[] Collection to store aggregation of CcPlaylistcontents objects. + */ + protected $collCcPlaylistcontentss; + protected $collCcPlaylistcontentssPartial; + + /** + * @var PropelObjectCollection|CcBlockcontents[] Collection to store aggregation of CcBlockcontents objects. + */ + protected $collCcBlockcontentss; + protected $collCcBlockcontentssPartial; + + /** + * @var PropelObjectCollection|CcSchedule[] Collection to store aggregation of CcSchedule objects. + */ + protected $collCcSchedules; + protected $collCcSchedulesPartial; + + /** + * @var PropelObjectCollection|CcPlayoutHistory[] Collection to store aggregation of CcPlayoutHistory objects. + */ + protected $collCcPlayoutHistorys; + protected $collCcPlayoutHistorysPartial; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccShowInstancessScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccPlaylistcontentssScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccBlockcontentssScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccSchedulesScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccPlayoutHistorysScheduledForDeletion = null; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->name = ''; + $this->mime = ''; + $this->ftype = ''; + $this->filepath = ''; + $this->import_status = 1; + $this->currentlyaccessing = 0; + $this->length = '00:00:00'; + $this->file_exists = true; + $this->cuein = '00:00:00'; + $this->cueout = '00:00:00'; + $this->silan_check = false; + $this->hidden = false; + $this->is_scheduled = false; + $this->is_playlist = false; + } + + /** + * Initializes internal state of BaseCcFiles object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [name] column value. + * + * @return string + */ + public function getDbName() + { + + return $this->name; + } + + /** + * Get the [mime] column value. + * + * @return string + */ + public function getDbMime() + { + + return $this->mime; + } + + /** + * Get the [ftype] column value. + * + * @return string + */ + public function getDbFtype() + { + + return $this->ftype; + } + + /** + * Get the [directory] column value. + * + * @return int + */ + public function getDbDirectory() + { + + return $this->directory; + } + + /** + * Get the [filepath] column value. + * + * @return string + */ + public function getDbFilepath() + { + + return $this->filepath; + } + + /** + * Get the [import_status] column value. + * + * @return int + */ + public function getDbImportStatus() + { + + return $this->import_status; + } + + /** + * Get the [currentlyaccessing] column value. + * + * @return int + */ + public function getDbCurrentlyaccessing() + { + + return $this->currentlyaccessing; + } + + /** + * Get the [editedby] column value. + * + * @return int + */ + public function getDbEditedby() + { + + return $this->editedby; + } + + /** + * Get the [optionally formatted] temporal [mtime] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbMtime($format = 'Y-m-d H:i:s') + { + if ($this->mtime === null) { + return null; + } + + + try { + $dt = new DateTime($this->mtime); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->mtime, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [utime] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbUtime($format = 'Y-m-d H:i:s') + { + if ($this->utime === null) { + return null; + } + + + try { + $dt = new DateTime($this->utime); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->utime, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [lptime] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbLPtime($format = 'Y-m-d H:i:s') + { + if ($this->lptime === null) { + return null; + } + + + try { + $dt = new DateTime($this->lptime); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->lptime, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [md5] column value. + * + * @return string + */ + public function getDbMd5() + { + + return $this->md5; + } + + /** + * Get the [track_title] column value. + * + * @return string + */ + public function getDbTrackTitle() + { + + return $this->track_title; + } + + /** + * Get the [artist_name] column value. + * + * @return string + */ + public function getDbArtistName() + { + + return $this->artist_name; + } + + /** + * Get the [bit_rate] column value. + * + * @return int + */ + public function getDbBitRate() + { + + return $this->bit_rate; + } + + /** + * Get the [sample_rate] column value. + * + * @return int + */ + public function getDbSampleRate() + { + + return $this->sample_rate; + } + + /** + * Get the [format] column value. + * + * @return string + */ + public function getDbFormat() + { + + return $this->format; + } + + /** + * Get the [length] column value. + * + * @return string + */ + public function getDbLength() + { + + return $this->length; + } + + /** + * Get the [album_title] column value. + * + * @return string + */ + public function getDbAlbumTitle() + { + + return $this->album_title; + } + + /** + * Get the [genre] column value. + * + * @return string + */ + public function getDbGenre() + { + + return $this->genre; + } + + /** + * Get the [comments] column value. + * + * @return string + */ + public function getDbComments() + { + + return $this->comments; + } + + /** + * Get the [year] column value. + * + * @return string + */ + public function getDbYear() + { + + return $this->year; + } + + /** + * Get the [track_number] column value. + * + * @return int + */ + public function getDbTrackNumber() + { + + return $this->track_number; + } + + /** + * Get the [channels] column value. + * + * @return int + */ + public function getDbChannels() + { + + return $this->channels; + } + + /** + * Get the [url] column value. + * + * @return string + */ + public function getDbUrl() + { + + return $this->url; + } + + /** + * Get the [bpm] column value. + * + * @return int + */ + public function getDbBpm() + { + + return $this->bpm; + } + + /** + * Get the [rating] column value. + * + * @return string + */ + public function getDbRating() + { + + return $this->rating; + } + + /** + * Get the [encoded_by] column value. + * + * @return string + */ + public function getDbEncodedBy() + { + + return $this->encoded_by; + } + + /** + * Get the [disc_number] column value. + * + * @return string + */ + public function getDbDiscNumber() + { + + return $this->disc_number; + } + + /** + * Get the [mood] column value. + * + * @return string + */ + public function getDbMood() + { + + return $this->mood; + } + + /** + * Get the [label] column value. + * + * @return string + */ + public function getDbLabel() + { + + return $this->label; + } + + /** + * Get the [composer] column value. + * + * @return string + */ + public function getDbComposer() + { + + return $this->composer; + } + + /** + * Get the [encoder] column value. + * + * @return string + */ + public function getDbEncoder() + { + + return $this->encoder; + } + + /** + * Get the [checksum] column value. + * + * @return string + */ + public function getDbChecksum() + { + + return $this->checksum; + } + + /** + * Get the [lyrics] column value. + * + * @return string + */ + public function getDbLyrics() + { + + return $this->lyrics; + } + + /** + * Get the [orchestra] column value. + * + * @return string + */ + public function getDbOrchestra() + { + + return $this->orchestra; + } + + /** + * Get the [conductor] column value. + * + * @return string + */ + public function getDbConductor() + { + + return $this->conductor; + } + + /** + * Get the [lyricist] column value. + * + * @return string + */ + public function getDbLyricist() + { + + return $this->lyricist; + } + + /** + * Get the [original_lyricist] column value. + * + * @return string + */ + public function getDbOriginalLyricist() + { + + return $this->original_lyricist; + } + + /** + * Get the [radio_station_name] column value. + * + * @return string + */ + public function getDbRadioStationName() + { + + return $this->radio_station_name; + } + + /** + * Get the [info_url] column value. + * + * @return string + */ + public function getDbInfoUrl() + { + + return $this->info_url; + } + + /** + * Get the [artist_url] column value. + * + * @return string + */ + public function getDbArtistUrl() + { + + return $this->artist_url; + } + + /** + * Get the [audio_source_url] column value. + * + * @return string + */ + public function getDbAudioSourceUrl() + { + + return $this->audio_source_url; + } + + /** + * Get the [radio_station_url] column value. + * + * @return string + */ + public function getDbRadioStationUrl() + { + + return $this->radio_station_url; + } + + /** + * Get the [buy_this_url] column value. + * + * @return string + */ + public function getDbBuyThisUrl() + { + + return $this->buy_this_url; + } + + /** + * Get the [isrc_number] column value. + * + * @return string + */ + public function getDbIsrcNumber() + { + + return $this->isrc_number; + } + + /** + * Get the [catalog_number] column value. + * + * @return string + */ + public function getDbCatalogNumber() + { + + return $this->catalog_number; + } + + /** + * Get the [original_artist] column value. + * + * @return string + */ + public function getDbOriginalArtist() + { + + return $this->original_artist; + } + + /** + * Get the [copyright] column value. + * + * @return string + */ + public function getDbCopyright() + { + + return $this->copyright; + } + + /** + * Get the [report_datetime] column value. + * + * @return string + */ + public function getDbReportDatetime() + { + + return $this->report_datetime; + } + + /** + * Get the [report_location] column value. + * + * @return string + */ + public function getDbReportLocation() + { + + return $this->report_location; + } + + /** + * Get the [report_organization] column value. + * + * @return string + */ + public function getDbReportOrganization() + { + + return $this->report_organization; + } + + /** + * Get the [subject] column value. + * + * @return string + */ + public function getDbSubject() + { + + return $this->subject; + } + + /** + * Get the [contributor] column value. + * + * @return string + */ + public function getDbContributor() + { + + return $this->contributor; + } + + /** + * Get the [language] column value. + * + * @return string + */ + public function getDbLanguage() + { + + return $this->language; + } + + /** + * Get the [file_exists] column value. + * + * @return boolean + */ + public function getDbFileExists() + { + + return $this->file_exists; + } + + /** + * Get the [soundcloud_id] column value. + * + * @return int + */ + public function getDbSoundcloudId() + { + + return $this->soundcloud_id; + } + + /** + * Get the [soundcloud_error_code] column value. + * + * @return int + */ + public function getDbSoundcloudErrorCode() + { + + return $this->soundcloud_error_code; + } + + /** + * Get the [soundcloud_error_msg] column value. + * + * @return string + */ + public function getDbSoundcloudErrorMsg() + { + + return $this->soundcloud_error_msg; + } + + /** + * Get the [soundcloud_link_to_file] column value. + * + * @return string + */ + public function getDbSoundcloudLinkToFile() + { + + return $this->soundcloud_link_to_file; + } + + /** + * Get the [optionally formatted] temporal [soundcloud_upload_time] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbSoundCloundUploadTime($format = 'Y-m-d H:i:s') + { + if ($this->soundcloud_upload_time === null) { + return null; + } + + + try { + $dt = new DateTime($this->soundcloud_upload_time); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->soundcloud_upload_time, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [replay_gain] column value. + * + * @return string + */ + public function getDbReplayGain() + { + + return $this->replay_gain; + } + + /** + * Get the [owner_id] column value. + * + * @return int + */ + public function getDbOwnerId() + { + + return $this->owner_id; + } + + /** + * Get the [cuein] column value. + * + * @return string + */ + public function getDbCuein() + { + + return $this->cuein; + } + + /** + * Get the [cueout] column value. + * + * @return string + */ + public function getDbCueout() + { + + return $this->cueout; + } + + /** + * Get the [silan_check] column value. + * + * @return boolean + */ + public function getDbSilanCheck() + { + + return $this->silan_check; + } + + /** + * Get the [hidden] column value. + * + * @return boolean + */ + public function getDbHidden() + { + + return $this->hidden; + } + + /** + * Get the [is_scheduled] column value. + * + * @return boolean + */ + public function getDbIsScheduled() + { + + return $this->is_scheduled; + } + + /** + * Get the [is_playlist] column value. + * + * @return boolean + */ + public function getDbIsPlaylist() + { + + return $this->is_playlist; + } + + /** + * Get the [resource_id] column value. + * + * @return string + */ + public function getDbResourceId() + { + + return $this->resource_id; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcFilesPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [name] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->name !== $v) { + $this->name = $v; + $this->modifiedColumns[] = CcFilesPeer::NAME; + } + + + return $this; + } // setDbName() + + /** + * Set the value of [mime] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbMime($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->mime !== $v) { + $this->mime = $v; + $this->modifiedColumns[] = CcFilesPeer::MIME; + } + + + return $this; + } // setDbMime() + + /** + * Set the value of [ftype] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbFtype($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->ftype !== $v) { + $this->ftype = $v; + $this->modifiedColumns[] = CcFilesPeer::FTYPE; + } + + + return $this; + } // setDbFtype() + + /** + * Set the value of [directory] column. + * + * @param int $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbDirectory($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->directory !== $v) { + $this->directory = $v; + $this->modifiedColumns[] = CcFilesPeer::DIRECTORY; + } + + if ($this->aCcMusicDirs !== null && $this->aCcMusicDirs->getId() !== $v) { + $this->aCcMusicDirs = null; + } + + + return $this; + } // setDbDirectory() + + /** + * Set the value of [filepath] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbFilepath($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->filepath !== $v) { + $this->filepath = $v; + $this->modifiedColumns[] = CcFilesPeer::FILEPATH; + } + + + return $this; + } // setDbFilepath() + + /** + * Set the value of [import_status] column. + * + * @param int $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbImportStatus($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->import_status !== $v) { + $this->import_status = $v; + $this->modifiedColumns[] = CcFilesPeer::IMPORT_STATUS; + } + + + return $this; + } // setDbImportStatus() + + /** + * Set the value of [currentlyaccessing] column. + * + * @param int $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbCurrentlyaccessing($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->currentlyaccessing !== $v) { + $this->currentlyaccessing = $v; + $this->modifiedColumns[] = CcFilesPeer::CURRENTLYACCESSING; + } + + + return $this; + } // setDbCurrentlyaccessing() + + /** + * Set the value of [editedby] column. + * + * @param int $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbEditedby($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->editedby !== $v) { + $this->editedby = $v; + $this->modifiedColumns[] = CcFilesPeer::EDITEDBY; + } + + if ($this->aCcSubjsRelatedByDbEditedby !== null && $this->aCcSubjsRelatedByDbEditedby->getDbId() !== $v) { + $this->aCcSubjsRelatedByDbEditedby = null; + } + + + return $this; + } // setDbEditedby() + + /** + * Sets the value of [mtime] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcFiles The current object (for fluent API support) + */ + public function setDbMtime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->mtime !== null || $dt !== null) { + $currentDateAsString = ($this->mtime !== null && $tmpDt = new DateTime($this->mtime)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->mtime = $newDateAsString; + $this->modifiedColumns[] = CcFilesPeer::MTIME; + } + } // if either are not null + + + return $this; + } // setDbMtime() + + /** + * Sets the value of [utime] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcFiles The current object (for fluent API support) + */ + public function setDbUtime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->utime !== null || $dt !== null) { + $currentDateAsString = ($this->utime !== null && $tmpDt = new DateTime($this->utime)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->utime = $newDateAsString; + $this->modifiedColumns[] = CcFilesPeer::UTIME; + } + } // if either are not null + + + return $this; + } // setDbUtime() + + /** + * Sets the value of [lptime] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcFiles The current object (for fluent API support) + */ + public function setDbLPtime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->lptime !== null || $dt !== null) { + $currentDateAsString = ($this->lptime !== null && $tmpDt = new DateTime($this->lptime)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->lptime = $newDateAsString; + $this->modifiedColumns[] = CcFilesPeer::LPTIME; + } + } // if either are not null + + + return $this; + } // setDbLPtime() + + /** + * Set the value of [md5] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbMd5($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->md5 !== $v) { + $this->md5 = $v; + $this->modifiedColumns[] = CcFilesPeer::MD5; + } + + + return $this; + } // setDbMd5() + + /** + * Set the value of [track_title] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbTrackTitle($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->track_title !== $v) { + $this->track_title = $v; + $this->modifiedColumns[] = CcFilesPeer::TRACK_TITLE; + } + + + return $this; + } // setDbTrackTitle() + + /** + * Set the value of [artist_name] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbArtistName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->artist_name !== $v) { + $this->artist_name = $v; + $this->modifiedColumns[] = CcFilesPeer::ARTIST_NAME; + } + + + return $this; + } // setDbArtistName() + + /** + * Set the value of [bit_rate] column. + * + * @param int $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbBitRate($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->bit_rate !== $v) { + $this->bit_rate = $v; + $this->modifiedColumns[] = CcFilesPeer::BIT_RATE; + } + + + return $this; + } // setDbBitRate() + + /** + * Set the value of [sample_rate] column. + * + * @param int $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbSampleRate($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->sample_rate !== $v) { + $this->sample_rate = $v; + $this->modifiedColumns[] = CcFilesPeer::SAMPLE_RATE; + } + + + return $this; + } // setDbSampleRate() + + /** + * Set the value of [format] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbFormat($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->format !== $v) { + $this->format = $v; + $this->modifiedColumns[] = CcFilesPeer::FORMAT; + } + + + return $this; + } // setDbFormat() + + /** + * Set the value of [length] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbLength($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->length !== $v) { + $this->length = $v; + $this->modifiedColumns[] = CcFilesPeer::LENGTH; + } + + + return $this; + } // setDbLength() + + /** + * Set the value of [album_title] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbAlbumTitle($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->album_title !== $v) { + $this->album_title = $v; + $this->modifiedColumns[] = CcFilesPeer::ALBUM_TITLE; + } + + + return $this; + } // setDbAlbumTitle() + + /** + * Set the value of [genre] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbGenre($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->genre !== $v) { + $this->genre = $v; + $this->modifiedColumns[] = CcFilesPeer::GENRE; + } + + + return $this; + } // setDbGenre() + + /** + * Set the value of [comments] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbComments($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->comments !== $v) { + $this->comments = $v; + $this->modifiedColumns[] = CcFilesPeer::COMMENTS; + } + + + return $this; + } // setDbComments() + + /** + * Set the value of [year] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbYear($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->year !== $v) { + $this->year = $v; + $this->modifiedColumns[] = CcFilesPeer::YEAR; + } + + + return $this; + } // setDbYear() + + /** + * Set the value of [track_number] column. + * + * @param int $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbTrackNumber($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->track_number !== $v) { + $this->track_number = $v; + $this->modifiedColumns[] = CcFilesPeer::TRACK_NUMBER; + } + + + return $this; + } // setDbTrackNumber() + + /** + * Set the value of [channels] column. + * + * @param int $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbChannels($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->channels !== $v) { + $this->channels = $v; + $this->modifiedColumns[] = CcFilesPeer::CHANNELS; + } + + + return $this; + } // setDbChannels() + + /** + * Set the value of [url] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbUrl($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->url !== $v) { + $this->url = $v; + $this->modifiedColumns[] = CcFilesPeer::URL; + } + + + return $this; + } // setDbUrl() + + /** + * Set the value of [bpm] column. + * + * @param int $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbBpm($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->bpm !== $v) { + $this->bpm = $v; + $this->modifiedColumns[] = CcFilesPeer::BPM; + } + + + return $this; + } // setDbBpm() + + /** + * Set the value of [rating] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbRating($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->rating !== $v) { + $this->rating = $v; + $this->modifiedColumns[] = CcFilesPeer::RATING; + } + + + return $this; + } // setDbRating() + + /** + * Set the value of [encoded_by] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbEncodedBy($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->encoded_by !== $v) { + $this->encoded_by = $v; + $this->modifiedColumns[] = CcFilesPeer::ENCODED_BY; + } + + + return $this; + } // setDbEncodedBy() + + /** + * Set the value of [disc_number] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbDiscNumber($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->disc_number !== $v) { + $this->disc_number = $v; + $this->modifiedColumns[] = CcFilesPeer::DISC_NUMBER; + } + + + return $this; + } // setDbDiscNumber() + + /** + * Set the value of [mood] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbMood($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->mood !== $v) { + $this->mood = $v; + $this->modifiedColumns[] = CcFilesPeer::MOOD; + } + + + return $this; + } // setDbMood() + + /** + * Set the value of [label] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbLabel($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->label !== $v) { + $this->label = $v; + $this->modifiedColumns[] = CcFilesPeer::LABEL; + } + + + return $this; + } // setDbLabel() + + /** + * Set the value of [composer] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbComposer($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->composer !== $v) { + $this->composer = $v; + $this->modifiedColumns[] = CcFilesPeer::COMPOSER; + } + + + return $this; + } // setDbComposer() + + /** + * Set the value of [encoder] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbEncoder($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->encoder !== $v) { + $this->encoder = $v; + $this->modifiedColumns[] = CcFilesPeer::ENCODER; + } + + + return $this; + } // setDbEncoder() + + /** + * Set the value of [checksum] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbChecksum($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->checksum !== $v) { + $this->checksum = $v; + $this->modifiedColumns[] = CcFilesPeer::CHECKSUM; + } + + + return $this; + } // setDbChecksum() + + /** + * Set the value of [lyrics] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbLyrics($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->lyrics !== $v) { + $this->lyrics = $v; + $this->modifiedColumns[] = CcFilesPeer::LYRICS; + } + + + return $this; + } // setDbLyrics() + + /** + * Set the value of [orchestra] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbOrchestra($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->orchestra !== $v) { + $this->orchestra = $v; + $this->modifiedColumns[] = CcFilesPeer::ORCHESTRA; + } + + + return $this; + } // setDbOrchestra() + + /** + * Set the value of [conductor] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbConductor($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->conductor !== $v) { + $this->conductor = $v; + $this->modifiedColumns[] = CcFilesPeer::CONDUCTOR; + } + + + return $this; + } // setDbConductor() + + /** + * Set the value of [lyricist] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbLyricist($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->lyricist !== $v) { + $this->lyricist = $v; + $this->modifiedColumns[] = CcFilesPeer::LYRICIST; + } + + + return $this; + } // setDbLyricist() + + /** + * Set the value of [original_lyricist] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbOriginalLyricist($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->original_lyricist !== $v) { + $this->original_lyricist = $v; + $this->modifiedColumns[] = CcFilesPeer::ORIGINAL_LYRICIST; + } + + + return $this; + } // setDbOriginalLyricist() + + /** + * Set the value of [radio_station_name] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbRadioStationName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->radio_station_name !== $v) { + $this->radio_station_name = $v; + $this->modifiedColumns[] = CcFilesPeer::RADIO_STATION_NAME; + } + + + return $this; + } // setDbRadioStationName() + + /** + * Set the value of [info_url] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbInfoUrl($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->info_url !== $v) { + $this->info_url = $v; + $this->modifiedColumns[] = CcFilesPeer::INFO_URL; + } + + + return $this; + } // setDbInfoUrl() + + /** + * Set the value of [artist_url] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbArtistUrl($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->artist_url !== $v) { + $this->artist_url = $v; + $this->modifiedColumns[] = CcFilesPeer::ARTIST_URL; + } + + + return $this; + } // setDbArtistUrl() + + /** + * Set the value of [audio_source_url] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbAudioSourceUrl($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->audio_source_url !== $v) { + $this->audio_source_url = $v; + $this->modifiedColumns[] = CcFilesPeer::AUDIO_SOURCE_URL; + } + + + return $this; + } // setDbAudioSourceUrl() + + /** + * Set the value of [radio_station_url] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbRadioStationUrl($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->radio_station_url !== $v) { + $this->radio_station_url = $v; + $this->modifiedColumns[] = CcFilesPeer::RADIO_STATION_URL; + } + + + return $this; + } // setDbRadioStationUrl() + + /** + * Set the value of [buy_this_url] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbBuyThisUrl($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->buy_this_url !== $v) { + $this->buy_this_url = $v; + $this->modifiedColumns[] = CcFilesPeer::BUY_THIS_URL; + } + + + return $this; + } // setDbBuyThisUrl() + + /** + * Set the value of [isrc_number] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbIsrcNumber($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->isrc_number !== $v) { + $this->isrc_number = $v; + $this->modifiedColumns[] = CcFilesPeer::ISRC_NUMBER; + } + + + return $this; + } // setDbIsrcNumber() + + /** + * Set the value of [catalog_number] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbCatalogNumber($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->catalog_number !== $v) { + $this->catalog_number = $v; + $this->modifiedColumns[] = CcFilesPeer::CATALOG_NUMBER; + } + + + return $this; + } // setDbCatalogNumber() + + /** + * Set the value of [original_artist] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbOriginalArtist($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->original_artist !== $v) { + $this->original_artist = $v; + $this->modifiedColumns[] = CcFilesPeer::ORIGINAL_ARTIST; + } + + + return $this; + } // setDbOriginalArtist() + + /** + * Set the value of [copyright] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbCopyright($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->copyright !== $v) { + $this->copyright = $v; + $this->modifiedColumns[] = CcFilesPeer::COPYRIGHT; + } + + + return $this; + } // setDbCopyright() + + /** + * Set the value of [report_datetime] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbReportDatetime($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->report_datetime !== $v) { + $this->report_datetime = $v; + $this->modifiedColumns[] = CcFilesPeer::REPORT_DATETIME; + } + + + return $this; + } // setDbReportDatetime() + + /** + * Set the value of [report_location] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbReportLocation($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->report_location !== $v) { + $this->report_location = $v; + $this->modifiedColumns[] = CcFilesPeer::REPORT_LOCATION; + } + + + return $this; + } // setDbReportLocation() + + /** + * Set the value of [report_organization] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbReportOrganization($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->report_organization !== $v) { + $this->report_organization = $v; + $this->modifiedColumns[] = CcFilesPeer::REPORT_ORGANIZATION; + } + + + return $this; + } // setDbReportOrganization() + + /** + * Set the value of [subject] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbSubject($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->subject !== $v) { + $this->subject = $v; + $this->modifiedColumns[] = CcFilesPeer::SUBJECT; + } + + + return $this; + } // setDbSubject() + + /** + * Set the value of [contributor] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbContributor($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->contributor !== $v) { + $this->contributor = $v; + $this->modifiedColumns[] = CcFilesPeer::CONTRIBUTOR; + } + + + return $this; + } // setDbContributor() + + /** + * Set the value of [language] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbLanguage($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->language !== $v) { + $this->language = $v; + $this->modifiedColumns[] = CcFilesPeer::LANGUAGE; + } + + + return $this; + } // setDbLanguage() + + /** + * Sets the value of the [file_exists] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbFileExists($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->file_exists !== $v) { + $this->file_exists = $v; + $this->modifiedColumns[] = CcFilesPeer::FILE_EXISTS; + } + + + return $this; + } // setDbFileExists() + + /** + * Set the value of [soundcloud_id] column. + * + * @param int $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbSoundcloudId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->soundcloud_id !== $v) { + $this->soundcloud_id = $v; + $this->modifiedColumns[] = CcFilesPeer::SOUNDCLOUD_ID; + } + + + return $this; + } // setDbSoundcloudId() + + /** + * Set the value of [soundcloud_error_code] column. + * + * @param int $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbSoundcloudErrorCode($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->soundcloud_error_code !== $v) { + $this->soundcloud_error_code = $v; + $this->modifiedColumns[] = CcFilesPeer::SOUNDCLOUD_ERROR_CODE; + } + + + return $this; + } // setDbSoundcloudErrorCode() + + /** + * Set the value of [soundcloud_error_msg] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbSoundcloudErrorMsg($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->soundcloud_error_msg !== $v) { + $this->soundcloud_error_msg = $v; + $this->modifiedColumns[] = CcFilesPeer::SOUNDCLOUD_ERROR_MSG; + } + + + return $this; + } // setDbSoundcloudErrorMsg() + + /** + * Set the value of [soundcloud_link_to_file] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbSoundcloudLinkToFile($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->soundcloud_link_to_file !== $v) { + $this->soundcloud_link_to_file = $v; + $this->modifiedColumns[] = CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE; + } + + + return $this; + } // setDbSoundcloudLinkToFile() + + /** + * Sets the value of [soundcloud_upload_time] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcFiles The current object (for fluent API support) + */ + public function setDbSoundCloundUploadTime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->soundcloud_upload_time !== null || $dt !== null) { + $currentDateAsString = ($this->soundcloud_upload_time !== null && $tmpDt = new DateTime($this->soundcloud_upload_time)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->soundcloud_upload_time = $newDateAsString; + $this->modifiedColumns[] = CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME; + } + } // if either are not null + + + return $this; + } // setDbSoundCloundUploadTime() + + /** + * Set the value of [replay_gain] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbReplayGain($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->replay_gain !== $v) { + $this->replay_gain = $v; + $this->modifiedColumns[] = CcFilesPeer::REPLAY_GAIN; + } + + + return $this; + } // setDbReplayGain() + + /** + * Set the value of [owner_id] column. + * + * @param int $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbOwnerId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->owner_id !== $v) { + $this->owner_id = $v; + $this->modifiedColumns[] = CcFilesPeer::OWNER_ID; + } + + if ($this->aFkOwner !== null && $this->aFkOwner->getDbId() !== $v) { + $this->aFkOwner = null; + } + + + return $this; + } // setDbOwnerId() + + /** + * Set the value of [cuein] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbCuein($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->cuein !== $v) { + $this->cuein = $v; + $this->modifiedColumns[] = CcFilesPeer::CUEIN; + } + + + return $this; + } // setDbCuein() + + /** + * Set the value of [cueout] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbCueout($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->cueout !== $v) { + $this->cueout = $v; + $this->modifiedColumns[] = CcFilesPeer::CUEOUT; + } + + + return $this; + } // setDbCueout() + + /** + * Sets the value of the [silan_check] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbSilanCheck($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->silan_check !== $v) { + $this->silan_check = $v; + $this->modifiedColumns[] = CcFilesPeer::SILAN_CHECK; + } + + + return $this; + } // setDbSilanCheck() + + /** + * Sets the value of the [hidden] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbHidden($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->hidden !== $v) { + $this->hidden = $v; + $this->modifiedColumns[] = CcFilesPeer::HIDDEN; + } + + + return $this; + } // setDbHidden() + + /** + * Sets the value of the [is_scheduled] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbIsScheduled($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->is_scheduled !== $v) { + $this->is_scheduled = $v; + $this->modifiedColumns[] = CcFilesPeer::IS_SCHEDULED; + } + + + return $this; + } // setDbIsScheduled() + + /** + * Sets the value of the [is_playlist] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbIsPlaylist($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->is_playlist !== $v) { + $this->is_playlist = $v; + $this->modifiedColumns[] = CcFilesPeer::IS_PLAYLIST; + } + + + return $this; + } // setDbIsPlaylist() + + /** + * Set the value of [resource_id] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbResourceId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->resource_id !== $v) { + $this->resource_id = $v; + $this->modifiedColumns[] = CcFilesPeer::RESOURCE_ID; + } + + + return $this; + } // setDbResourceId() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->name !== '') { + return false; + } + + if ($this->mime !== '') { + return false; + } + + if ($this->ftype !== '') { + return false; + } + + if ($this->filepath !== '') { + return false; + } + + if ($this->import_status !== 1) { + return false; + } + + if ($this->currentlyaccessing !== 0) { + return false; + } + + if ($this->length !== '00:00:00') { + return false; + } + + if ($this->file_exists !== true) { + return false; + } + + if ($this->cuein !== '00:00:00') { + return false; + } + + if ($this->cueout !== '00:00:00') { + return false; + } + + if ($this->silan_check !== false) { + return false; + } + + if ($this->hidden !== false) { + return false; + } + + if ($this->is_scheduled !== false) { + return false; + } + + if ($this->is_playlist !== false) { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->mime = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->ftype = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->directory = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; + $this->filepath = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; + $this->import_status = ($row[$startcol + 6] !== null) ? (int) $row[$startcol + 6] : null; + $this->currentlyaccessing = ($row[$startcol + 7] !== null) ? (int) $row[$startcol + 7] : null; + $this->editedby = ($row[$startcol + 8] !== null) ? (int) $row[$startcol + 8] : null; + $this->mtime = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; + $this->utime = ($row[$startcol + 10] !== null) ? (string) $row[$startcol + 10] : null; + $this->lptime = ($row[$startcol + 11] !== null) ? (string) $row[$startcol + 11] : null; + $this->md5 = ($row[$startcol + 12] !== null) ? (string) $row[$startcol + 12] : null; + $this->track_title = ($row[$startcol + 13] !== null) ? (string) $row[$startcol + 13] : null; + $this->artist_name = ($row[$startcol + 14] !== null) ? (string) $row[$startcol + 14] : null; + $this->bit_rate = ($row[$startcol + 15] !== null) ? (int) $row[$startcol + 15] : null; + $this->sample_rate = ($row[$startcol + 16] !== null) ? (int) $row[$startcol + 16] : null; + $this->format = ($row[$startcol + 17] !== null) ? (string) $row[$startcol + 17] : null; + $this->length = ($row[$startcol + 18] !== null) ? (string) $row[$startcol + 18] : null; + $this->album_title = ($row[$startcol + 19] !== null) ? (string) $row[$startcol + 19] : null; + $this->genre = ($row[$startcol + 20] !== null) ? (string) $row[$startcol + 20] : null; + $this->comments = ($row[$startcol + 21] !== null) ? (string) $row[$startcol + 21] : null; + $this->year = ($row[$startcol + 22] !== null) ? (string) $row[$startcol + 22] : null; + $this->track_number = ($row[$startcol + 23] !== null) ? (int) $row[$startcol + 23] : null; + $this->channels = ($row[$startcol + 24] !== null) ? (int) $row[$startcol + 24] : null; + $this->url = ($row[$startcol + 25] !== null) ? (string) $row[$startcol + 25] : null; + $this->bpm = ($row[$startcol + 26] !== null) ? (int) $row[$startcol + 26] : null; + $this->rating = ($row[$startcol + 27] !== null) ? (string) $row[$startcol + 27] : null; + $this->encoded_by = ($row[$startcol + 28] !== null) ? (string) $row[$startcol + 28] : null; + $this->disc_number = ($row[$startcol + 29] !== null) ? (string) $row[$startcol + 29] : null; + $this->mood = ($row[$startcol + 30] !== null) ? (string) $row[$startcol + 30] : null; + $this->label = ($row[$startcol + 31] !== null) ? (string) $row[$startcol + 31] : null; + $this->composer = ($row[$startcol + 32] !== null) ? (string) $row[$startcol + 32] : null; + $this->encoder = ($row[$startcol + 33] !== null) ? (string) $row[$startcol + 33] : null; + $this->checksum = ($row[$startcol + 34] !== null) ? (string) $row[$startcol + 34] : null; + $this->lyrics = ($row[$startcol + 35] !== null) ? (string) $row[$startcol + 35] : null; + $this->orchestra = ($row[$startcol + 36] !== null) ? (string) $row[$startcol + 36] : null; + $this->conductor = ($row[$startcol + 37] !== null) ? (string) $row[$startcol + 37] : null; + $this->lyricist = ($row[$startcol + 38] !== null) ? (string) $row[$startcol + 38] : null; + $this->original_lyricist = ($row[$startcol + 39] !== null) ? (string) $row[$startcol + 39] : null; + $this->radio_station_name = ($row[$startcol + 40] !== null) ? (string) $row[$startcol + 40] : null; + $this->info_url = ($row[$startcol + 41] !== null) ? (string) $row[$startcol + 41] : null; + $this->artist_url = ($row[$startcol + 42] !== null) ? (string) $row[$startcol + 42] : null; + $this->audio_source_url = ($row[$startcol + 43] !== null) ? (string) $row[$startcol + 43] : null; + $this->radio_station_url = ($row[$startcol + 44] !== null) ? (string) $row[$startcol + 44] : null; + $this->buy_this_url = ($row[$startcol + 45] !== null) ? (string) $row[$startcol + 45] : null; + $this->isrc_number = ($row[$startcol + 46] !== null) ? (string) $row[$startcol + 46] : null; + $this->catalog_number = ($row[$startcol + 47] !== null) ? (string) $row[$startcol + 47] : null; + $this->original_artist = ($row[$startcol + 48] !== null) ? (string) $row[$startcol + 48] : null; + $this->copyright = ($row[$startcol + 49] !== null) ? (string) $row[$startcol + 49] : null; + $this->report_datetime = ($row[$startcol + 50] !== null) ? (string) $row[$startcol + 50] : null; + $this->report_location = ($row[$startcol + 51] !== null) ? (string) $row[$startcol + 51] : null; + $this->report_organization = ($row[$startcol + 52] !== null) ? (string) $row[$startcol + 52] : null; + $this->subject = ($row[$startcol + 53] !== null) ? (string) $row[$startcol + 53] : null; + $this->contributor = ($row[$startcol + 54] !== null) ? (string) $row[$startcol + 54] : null; + $this->language = ($row[$startcol + 55] !== null) ? (string) $row[$startcol + 55] : null; + $this->file_exists = ($row[$startcol + 56] !== null) ? (boolean) $row[$startcol + 56] : null; + $this->soundcloud_id = ($row[$startcol + 57] !== null) ? (int) $row[$startcol + 57] : null; + $this->soundcloud_error_code = ($row[$startcol + 58] !== null) ? (int) $row[$startcol + 58] : null; + $this->soundcloud_error_msg = ($row[$startcol + 59] !== null) ? (string) $row[$startcol + 59] : null; + $this->soundcloud_link_to_file = ($row[$startcol + 60] !== null) ? (string) $row[$startcol + 60] : null; + $this->soundcloud_upload_time = ($row[$startcol + 61] !== null) ? (string) $row[$startcol + 61] : null; + $this->replay_gain = ($row[$startcol + 62] !== null) ? (string) $row[$startcol + 62] : null; + $this->owner_id = ($row[$startcol + 63] !== null) ? (int) $row[$startcol + 63] : null; + $this->cuein = ($row[$startcol + 64] !== null) ? (string) $row[$startcol + 64] : null; + $this->cueout = ($row[$startcol + 65] !== null) ? (string) $row[$startcol + 65] : null; + $this->silan_check = ($row[$startcol + 66] !== null) ? (boolean) $row[$startcol + 66] : null; + $this->hidden = ($row[$startcol + 67] !== null) ? (boolean) $row[$startcol + 67] : null; + $this->is_scheduled = ($row[$startcol + 68] !== null) ? (boolean) $row[$startcol + 68] : null; + $this->is_playlist = ($row[$startcol + 69] !== null) ? (boolean) $row[$startcol + 69] : null; + $this->resource_id = ($row[$startcol + 70] !== null) ? (string) $row[$startcol + 70] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 71; // 71 = CcFilesPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcFiles object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcMusicDirs !== null && $this->directory !== $this->aCcMusicDirs->getId()) { + $this->aCcMusicDirs = null; + } + if ($this->aCcSubjsRelatedByDbEditedby !== null && $this->editedby !== $this->aCcSubjsRelatedByDbEditedby->getDbId()) { + $this->aCcSubjsRelatedByDbEditedby = null; + } + if ($this->aFkOwner !== null && $this->owner_id !== $this->aFkOwner->getDbId()) { + $this->aFkOwner = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcFilesPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aFkOwner = null; + $this->aCcSubjsRelatedByDbEditedby = null; + $this->aCcMusicDirs = null; + $this->collCcShowInstancess = null; + + $this->collCcPlaylistcontentss = null; + + $this->collCcBlockcontentss = null; + + $this->collCcSchedules = null; + + $this->collCcPlayoutHistorys = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcFilesQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcFilesPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aFkOwner !== null) { + if ($this->aFkOwner->isModified() || $this->aFkOwner->isNew()) { + $affectedRows += $this->aFkOwner->save($con); + } + $this->setFkOwner($this->aFkOwner); + } + + if ($this->aCcSubjsRelatedByDbEditedby !== null) { + if ($this->aCcSubjsRelatedByDbEditedby->isModified() || $this->aCcSubjsRelatedByDbEditedby->isNew()) { + $affectedRows += $this->aCcSubjsRelatedByDbEditedby->save($con); + } + $this->setCcSubjsRelatedByDbEditedby($this->aCcSubjsRelatedByDbEditedby); + } + + if ($this->aCcMusicDirs !== null) { + if ($this->aCcMusicDirs->isModified() || $this->aCcMusicDirs->isNew()) { + $affectedRows += $this->aCcMusicDirs->save($con); + } + $this->setCcMusicDirs($this->aCcMusicDirs); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->ccShowInstancessScheduledForDeletion !== null) { + if (!$this->ccShowInstancessScheduledForDeletion->isEmpty()) { + CcShowInstancesQuery::create() + ->filterByPrimaryKeys($this->ccShowInstancessScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccShowInstancessScheduledForDeletion = null; + } + } + + if ($this->collCcShowInstancess !== null) { + foreach ($this->collCcShowInstancess as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccPlaylistcontentssScheduledForDeletion !== null) { + if (!$this->ccPlaylistcontentssScheduledForDeletion->isEmpty()) { + CcPlaylistcontentsQuery::create() + ->filterByPrimaryKeys($this->ccPlaylistcontentssScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccPlaylistcontentssScheduledForDeletion = null; + } + } + + if ($this->collCcPlaylistcontentss !== null) { + foreach ($this->collCcPlaylistcontentss as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccBlockcontentssScheduledForDeletion !== null) { + if (!$this->ccBlockcontentssScheduledForDeletion->isEmpty()) { + CcBlockcontentsQuery::create() + ->filterByPrimaryKeys($this->ccBlockcontentssScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccBlockcontentssScheduledForDeletion = null; + } + } + + if ($this->collCcBlockcontentss !== null) { + foreach ($this->collCcBlockcontentss as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccSchedulesScheduledForDeletion !== null) { + if (!$this->ccSchedulesScheduledForDeletion->isEmpty()) { + CcScheduleQuery::create() + ->filterByPrimaryKeys($this->ccSchedulesScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccSchedulesScheduledForDeletion = null; + } + } + + if ($this->collCcSchedules !== null) { + foreach ($this->collCcSchedules as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccPlayoutHistorysScheduledForDeletion !== null) { + if (!$this->ccPlayoutHistorysScheduledForDeletion->isEmpty()) { + CcPlayoutHistoryQuery::create() + ->filterByPrimaryKeys($this->ccPlayoutHistorysScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccPlayoutHistorysScheduledForDeletion = null; + } + } + + if ($this->collCcPlayoutHistorys !== null) { + foreach ($this->collCcPlayoutHistorys as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcFilesPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcFilesPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_files_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcFilesPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcFilesPeer::NAME)) { + $modifiedColumns[':p' . $index++] = '"name"'; + } + if ($this->isColumnModified(CcFilesPeer::MIME)) { + $modifiedColumns[':p' . $index++] = '"mime"'; + } + if ($this->isColumnModified(CcFilesPeer::FTYPE)) { + $modifiedColumns[':p' . $index++] = '"ftype"'; + } + if ($this->isColumnModified(CcFilesPeer::DIRECTORY)) { + $modifiedColumns[':p' . $index++] = '"directory"'; + } + if ($this->isColumnModified(CcFilesPeer::FILEPATH)) { + $modifiedColumns[':p' . $index++] = '"filepath"'; + } + if ($this->isColumnModified(CcFilesPeer::IMPORT_STATUS)) { + $modifiedColumns[':p' . $index++] = '"import_status"'; + } + if ($this->isColumnModified(CcFilesPeer::CURRENTLYACCESSING)) { + $modifiedColumns[':p' . $index++] = '"currentlyaccessing"'; + } + if ($this->isColumnModified(CcFilesPeer::EDITEDBY)) { + $modifiedColumns[':p' . $index++] = '"editedby"'; + } + if ($this->isColumnModified(CcFilesPeer::MTIME)) { + $modifiedColumns[':p' . $index++] = '"mtime"'; + } + if ($this->isColumnModified(CcFilesPeer::UTIME)) { + $modifiedColumns[':p' . $index++] = '"utime"'; + } + if ($this->isColumnModified(CcFilesPeer::LPTIME)) { + $modifiedColumns[':p' . $index++] = '"lptime"'; + } + if ($this->isColumnModified(CcFilesPeer::MD5)) { + $modifiedColumns[':p' . $index++] = '"md5"'; + } + if ($this->isColumnModified(CcFilesPeer::TRACK_TITLE)) { + $modifiedColumns[':p' . $index++] = '"track_title"'; + } + if ($this->isColumnModified(CcFilesPeer::ARTIST_NAME)) { + $modifiedColumns[':p' . $index++] = '"artist_name"'; + } + if ($this->isColumnModified(CcFilesPeer::BIT_RATE)) { + $modifiedColumns[':p' . $index++] = '"bit_rate"'; + } + if ($this->isColumnModified(CcFilesPeer::SAMPLE_RATE)) { + $modifiedColumns[':p' . $index++] = '"sample_rate"'; + } + if ($this->isColumnModified(CcFilesPeer::FORMAT)) { + $modifiedColumns[':p' . $index++] = '"format"'; + } + if ($this->isColumnModified(CcFilesPeer::LENGTH)) { + $modifiedColumns[':p' . $index++] = '"length"'; + } + if ($this->isColumnModified(CcFilesPeer::ALBUM_TITLE)) { + $modifiedColumns[':p' . $index++] = '"album_title"'; + } + if ($this->isColumnModified(CcFilesPeer::GENRE)) { + $modifiedColumns[':p' . $index++] = '"genre"'; + } + if ($this->isColumnModified(CcFilesPeer::COMMENTS)) { + $modifiedColumns[':p' . $index++] = '"comments"'; + } + if ($this->isColumnModified(CcFilesPeer::YEAR)) { + $modifiedColumns[':p' . $index++] = '"year"'; + } + if ($this->isColumnModified(CcFilesPeer::TRACK_NUMBER)) { + $modifiedColumns[':p' . $index++] = '"track_number"'; + } + if ($this->isColumnModified(CcFilesPeer::CHANNELS)) { + $modifiedColumns[':p' . $index++] = '"channels"'; + } + if ($this->isColumnModified(CcFilesPeer::URL)) { + $modifiedColumns[':p' . $index++] = '"url"'; + } + if ($this->isColumnModified(CcFilesPeer::BPM)) { + $modifiedColumns[':p' . $index++] = '"bpm"'; + } + if ($this->isColumnModified(CcFilesPeer::RATING)) { + $modifiedColumns[':p' . $index++] = '"rating"'; + } + if ($this->isColumnModified(CcFilesPeer::ENCODED_BY)) { + $modifiedColumns[':p' . $index++] = '"encoded_by"'; + } + if ($this->isColumnModified(CcFilesPeer::DISC_NUMBER)) { + $modifiedColumns[':p' . $index++] = '"disc_number"'; + } + if ($this->isColumnModified(CcFilesPeer::MOOD)) { + $modifiedColumns[':p' . $index++] = '"mood"'; + } + if ($this->isColumnModified(CcFilesPeer::LABEL)) { + $modifiedColumns[':p' . $index++] = '"label"'; + } + if ($this->isColumnModified(CcFilesPeer::COMPOSER)) { + $modifiedColumns[':p' . $index++] = '"composer"'; + } + if ($this->isColumnModified(CcFilesPeer::ENCODER)) { + $modifiedColumns[':p' . $index++] = '"encoder"'; + } + if ($this->isColumnModified(CcFilesPeer::CHECKSUM)) { + $modifiedColumns[':p' . $index++] = '"checksum"'; + } + if ($this->isColumnModified(CcFilesPeer::LYRICS)) { + $modifiedColumns[':p' . $index++] = '"lyrics"'; + } + if ($this->isColumnModified(CcFilesPeer::ORCHESTRA)) { + $modifiedColumns[':p' . $index++] = '"orchestra"'; + } + if ($this->isColumnModified(CcFilesPeer::CONDUCTOR)) { + $modifiedColumns[':p' . $index++] = '"conductor"'; + } + if ($this->isColumnModified(CcFilesPeer::LYRICIST)) { + $modifiedColumns[':p' . $index++] = '"lyricist"'; + } + if ($this->isColumnModified(CcFilesPeer::ORIGINAL_LYRICIST)) { + $modifiedColumns[':p' . $index++] = '"original_lyricist"'; + } + if ($this->isColumnModified(CcFilesPeer::RADIO_STATION_NAME)) { + $modifiedColumns[':p' . $index++] = '"radio_station_name"'; + } + if ($this->isColumnModified(CcFilesPeer::INFO_URL)) { + $modifiedColumns[':p' . $index++] = '"info_url"'; + } + if ($this->isColumnModified(CcFilesPeer::ARTIST_URL)) { + $modifiedColumns[':p' . $index++] = '"artist_url"'; + } + if ($this->isColumnModified(CcFilesPeer::AUDIO_SOURCE_URL)) { + $modifiedColumns[':p' . $index++] = '"audio_source_url"'; + } + if ($this->isColumnModified(CcFilesPeer::RADIO_STATION_URL)) { + $modifiedColumns[':p' . $index++] = '"radio_station_url"'; + } + if ($this->isColumnModified(CcFilesPeer::BUY_THIS_URL)) { + $modifiedColumns[':p' . $index++] = '"buy_this_url"'; + } + if ($this->isColumnModified(CcFilesPeer::ISRC_NUMBER)) { + $modifiedColumns[':p' . $index++] = '"isrc_number"'; + } + if ($this->isColumnModified(CcFilesPeer::CATALOG_NUMBER)) { + $modifiedColumns[':p' . $index++] = '"catalog_number"'; + } + if ($this->isColumnModified(CcFilesPeer::ORIGINAL_ARTIST)) { + $modifiedColumns[':p' . $index++] = '"original_artist"'; + } + if ($this->isColumnModified(CcFilesPeer::COPYRIGHT)) { + $modifiedColumns[':p' . $index++] = '"copyright"'; + } + if ($this->isColumnModified(CcFilesPeer::REPORT_DATETIME)) { + $modifiedColumns[':p' . $index++] = '"report_datetime"'; + } + if ($this->isColumnModified(CcFilesPeer::REPORT_LOCATION)) { + $modifiedColumns[':p' . $index++] = '"report_location"'; + } + if ($this->isColumnModified(CcFilesPeer::REPORT_ORGANIZATION)) { + $modifiedColumns[':p' . $index++] = '"report_organization"'; + } + if ($this->isColumnModified(CcFilesPeer::SUBJECT)) { + $modifiedColumns[':p' . $index++] = '"subject"'; + } + if ($this->isColumnModified(CcFilesPeer::CONTRIBUTOR)) { + $modifiedColumns[':p' . $index++] = '"contributor"'; + } + if ($this->isColumnModified(CcFilesPeer::LANGUAGE)) { + $modifiedColumns[':p' . $index++] = '"language"'; + } + if ($this->isColumnModified(CcFilesPeer::FILE_EXISTS)) { + $modifiedColumns[':p' . $index++] = '"file_exists"'; + } + if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_ID)) { + $modifiedColumns[':p' . $index++] = '"soundcloud_id"'; + } + if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_ERROR_CODE)) { + $modifiedColumns[':p' . $index++] = '"soundcloud_error_code"'; + } + if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_ERROR_MSG)) { + $modifiedColumns[':p' . $index++] = '"soundcloud_error_msg"'; + } + if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE)) { + $modifiedColumns[':p' . $index++] = '"soundcloud_link_to_file"'; + } + if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME)) { + $modifiedColumns[':p' . $index++] = '"soundcloud_upload_time"'; + } + if ($this->isColumnModified(CcFilesPeer::REPLAY_GAIN)) { + $modifiedColumns[':p' . $index++] = '"replay_gain"'; + } + if ($this->isColumnModified(CcFilesPeer::OWNER_ID)) { + $modifiedColumns[':p' . $index++] = '"owner_id"'; + } + if ($this->isColumnModified(CcFilesPeer::CUEIN)) { + $modifiedColumns[':p' . $index++] = '"cuein"'; + } + if ($this->isColumnModified(CcFilesPeer::CUEOUT)) { + $modifiedColumns[':p' . $index++] = '"cueout"'; + } + if ($this->isColumnModified(CcFilesPeer::SILAN_CHECK)) { + $modifiedColumns[':p' . $index++] = '"silan_check"'; + } + if ($this->isColumnModified(CcFilesPeer::HIDDEN)) { + $modifiedColumns[':p' . $index++] = '"hidden"'; + } + if ($this->isColumnModified(CcFilesPeer::IS_SCHEDULED)) { + $modifiedColumns[':p' . $index++] = '"is_scheduled"'; + } + if ($this->isColumnModified(CcFilesPeer::IS_PLAYLIST)) { + $modifiedColumns[':p' . $index++] = '"is_playlist"'; + } + if ($this->isColumnModified(CcFilesPeer::RESOURCE_ID)) { + $modifiedColumns[':p' . $index++] = '"resource_id"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_files" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"name"': + $stmt->bindValue($identifier, $this->name, PDO::PARAM_STR); + break; + case '"mime"': + $stmt->bindValue($identifier, $this->mime, PDO::PARAM_STR); + break; + case '"ftype"': + $stmt->bindValue($identifier, $this->ftype, PDO::PARAM_STR); + break; + case '"directory"': + $stmt->bindValue($identifier, $this->directory, PDO::PARAM_INT); + break; + case '"filepath"': + $stmt->bindValue($identifier, $this->filepath, PDO::PARAM_STR); + break; + case '"import_status"': + $stmt->bindValue($identifier, $this->import_status, PDO::PARAM_INT); + break; + case '"currentlyaccessing"': + $stmt->bindValue($identifier, $this->currentlyaccessing, PDO::PARAM_INT); + break; + case '"editedby"': + $stmt->bindValue($identifier, $this->editedby, PDO::PARAM_INT); + break; + case '"mtime"': + $stmt->bindValue($identifier, $this->mtime, PDO::PARAM_STR); + break; + case '"utime"': + $stmt->bindValue($identifier, $this->utime, PDO::PARAM_STR); + break; + case '"lptime"': + $stmt->bindValue($identifier, $this->lptime, PDO::PARAM_STR); + break; + case '"md5"': + $stmt->bindValue($identifier, $this->md5, PDO::PARAM_STR); + break; + case '"track_title"': + $stmt->bindValue($identifier, $this->track_title, PDO::PARAM_STR); + break; + case '"artist_name"': + $stmt->bindValue($identifier, $this->artist_name, PDO::PARAM_STR); + break; + case '"bit_rate"': + $stmt->bindValue($identifier, $this->bit_rate, PDO::PARAM_INT); + break; + case '"sample_rate"': + $stmt->bindValue($identifier, $this->sample_rate, PDO::PARAM_INT); + break; + case '"format"': + $stmt->bindValue($identifier, $this->format, PDO::PARAM_STR); + break; + case '"length"': + $stmt->bindValue($identifier, $this->length, PDO::PARAM_STR); + break; + case '"album_title"': + $stmt->bindValue($identifier, $this->album_title, PDO::PARAM_STR); + break; + case '"genre"': + $stmt->bindValue($identifier, $this->genre, PDO::PARAM_STR); + break; + case '"comments"': + $stmt->bindValue($identifier, $this->comments, PDO::PARAM_STR); + break; + case '"year"': + $stmt->bindValue($identifier, $this->year, PDO::PARAM_STR); + break; + case '"track_number"': + $stmt->bindValue($identifier, $this->track_number, PDO::PARAM_INT); + break; + case '"channels"': + $stmt->bindValue($identifier, $this->channels, PDO::PARAM_INT); + break; + case '"url"': + $stmt->bindValue($identifier, $this->url, PDO::PARAM_STR); + break; + case '"bpm"': + $stmt->bindValue($identifier, $this->bpm, PDO::PARAM_INT); + break; + case '"rating"': + $stmt->bindValue($identifier, $this->rating, PDO::PARAM_STR); + break; + case '"encoded_by"': + $stmt->bindValue($identifier, $this->encoded_by, PDO::PARAM_STR); + break; + case '"disc_number"': + $stmt->bindValue($identifier, $this->disc_number, PDO::PARAM_STR); + break; + case '"mood"': + $stmt->bindValue($identifier, $this->mood, PDO::PARAM_STR); + break; + case '"label"': + $stmt->bindValue($identifier, $this->label, PDO::PARAM_STR); + break; + case '"composer"': + $stmt->bindValue($identifier, $this->composer, PDO::PARAM_STR); + break; + case '"encoder"': + $stmt->bindValue($identifier, $this->encoder, PDO::PARAM_STR); + break; + case '"checksum"': + $stmt->bindValue($identifier, $this->checksum, PDO::PARAM_STR); + break; + case '"lyrics"': + $stmt->bindValue($identifier, $this->lyrics, PDO::PARAM_STR); + break; + case '"orchestra"': + $stmt->bindValue($identifier, $this->orchestra, PDO::PARAM_STR); + break; + case '"conductor"': + $stmt->bindValue($identifier, $this->conductor, PDO::PARAM_STR); + break; + case '"lyricist"': + $stmt->bindValue($identifier, $this->lyricist, PDO::PARAM_STR); + break; + case '"original_lyricist"': + $stmt->bindValue($identifier, $this->original_lyricist, PDO::PARAM_STR); + break; + case '"radio_station_name"': + $stmt->bindValue($identifier, $this->radio_station_name, PDO::PARAM_STR); + break; + case '"info_url"': + $stmt->bindValue($identifier, $this->info_url, PDO::PARAM_STR); + break; + case '"artist_url"': + $stmt->bindValue($identifier, $this->artist_url, PDO::PARAM_STR); + break; + case '"audio_source_url"': + $stmt->bindValue($identifier, $this->audio_source_url, PDO::PARAM_STR); + break; + case '"radio_station_url"': + $stmt->bindValue($identifier, $this->radio_station_url, PDO::PARAM_STR); + break; + case '"buy_this_url"': + $stmt->bindValue($identifier, $this->buy_this_url, PDO::PARAM_STR); + break; + case '"isrc_number"': + $stmt->bindValue($identifier, $this->isrc_number, PDO::PARAM_STR); + break; + case '"catalog_number"': + $stmt->bindValue($identifier, $this->catalog_number, PDO::PARAM_STR); + break; + case '"original_artist"': + $stmt->bindValue($identifier, $this->original_artist, PDO::PARAM_STR); + break; + case '"copyright"': + $stmt->bindValue($identifier, $this->copyright, PDO::PARAM_STR); + break; + case '"report_datetime"': + $stmt->bindValue($identifier, $this->report_datetime, PDO::PARAM_STR); + break; + case '"report_location"': + $stmt->bindValue($identifier, $this->report_location, PDO::PARAM_STR); + break; + case '"report_organization"': + $stmt->bindValue($identifier, $this->report_organization, PDO::PARAM_STR); + break; + case '"subject"': + $stmt->bindValue($identifier, $this->subject, PDO::PARAM_STR); + break; + case '"contributor"': + $stmt->bindValue($identifier, $this->contributor, PDO::PARAM_STR); + break; + case '"language"': + $stmt->bindValue($identifier, $this->language, PDO::PARAM_STR); + break; + case '"file_exists"': + $stmt->bindValue($identifier, $this->file_exists, PDO::PARAM_BOOL); + break; + case '"soundcloud_id"': + $stmt->bindValue($identifier, $this->soundcloud_id, PDO::PARAM_INT); + break; + case '"soundcloud_error_code"': + $stmt->bindValue($identifier, $this->soundcloud_error_code, PDO::PARAM_INT); + break; + case '"soundcloud_error_msg"': + $stmt->bindValue($identifier, $this->soundcloud_error_msg, PDO::PARAM_STR); + break; + case '"soundcloud_link_to_file"': + $stmt->bindValue($identifier, $this->soundcloud_link_to_file, PDO::PARAM_STR); + break; + case '"soundcloud_upload_time"': + $stmt->bindValue($identifier, $this->soundcloud_upload_time, PDO::PARAM_STR); + break; + case '"replay_gain"': + $stmt->bindValue($identifier, $this->replay_gain, PDO::PARAM_INT); + break; + case '"owner_id"': + $stmt->bindValue($identifier, $this->owner_id, PDO::PARAM_INT); + break; + case '"cuein"': + $stmt->bindValue($identifier, $this->cuein, PDO::PARAM_STR); + break; + case '"cueout"': + $stmt->bindValue($identifier, $this->cueout, PDO::PARAM_STR); + break; + case '"silan_check"': + $stmt->bindValue($identifier, $this->silan_check, PDO::PARAM_BOOL); + break; + case '"hidden"': + $stmt->bindValue($identifier, $this->hidden, PDO::PARAM_BOOL); + break; + case '"is_scheduled"': + $stmt->bindValue($identifier, $this->is_scheduled, PDO::PARAM_BOOL); + break; + case '"is_playlist"': + $stmt->bindValue($identifier, $this->is_playlist, PDO::PARAM_BOOL); + break; + case '"resource_id"': + $stmt->bindValue($identifier, $this->resource_id, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aFkOwner !== null) { + if (!$this->aFkOwner->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aFkOwner->getValidationFailures()); + } + } + + if ($this->aCcSubjsRelatedByDbEditedby !== null) { + if (!$this->aCcSubjsRelatedByDbEditedby->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcSubjsRelatedByDbEditedby->getValidationFailures()); + } + } + + if ($this->aCcMusicDirs !== null) { + if (!$this->aCcMusicDirs->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcMusicDirs->getValidationFailures()); + } + } + + + if (($retval = CcFilesPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + if ($this->collCcShowInstancess !== null) { + foreach ($this->collCcShowInstancess as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcPlaylistcontentss !== null) { + foreach ($this->collCcPlaylistcontentss as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcBlockcontentss !== null) { + foreach ($this->collCcBlockcontentss as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcSchedules !== null) { + foreach ($this->collCcSchedules as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcPlayoutHistorys !== null) { + foreach ($this->collCcPlayoutHistorys as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcFilesPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbName(); + break; + case 2: + return $this->getDbMime(); + break; + case 3: + return $this->getDbFtype(); + break; + case 4: + return $this->getDbDirectory(); + break; + case 5: + return $this->getDbFilepath(); + break; + case 6: + return $this->getDbImportStatus(); + break; + case 7: + return $this->getDbCurrentlyaccessing(); + break; + case 8: + return $this->getDbEditedby(); + break; + case 9: + return $this->getDbMtime(); + break; + case 10: + return $this->getDbUtime(); + break; + case 11: + return $this->getDbLPtime(); + break; + case 12: + return $this->getDbMd5(); + break; + case 13: + return $this->getDbTrackTitle(); + break; + case 14: + return $this->getDbArtistName(); + break; + case 15: + return $this->getDbBitRate(); + break; + case 16: + return $this->getDbSampleRate(); + break; + case 17: + return $this->getDbFormat(); + break; + case 18: + return $this->getDbLength(); + break; + case 19: + return $this->getDbAlbumTitle(); + break; + case 20: + return $this->getDbGenre(); + break; + case 21: + return $this->getDbComments(); + break; + case 22: + return $this->getDbYear(); + break; + case 23: + return $this->getDbTrackNumber(); + break; + case 24: + return $this->getDbChannels(); + break; + case 25: + return $this->getDbUrl(); + break; + case 26: + return $this->getDbBpm(); + break; + case 27: + return $this->getDbRating(); + break; + case 28: + return $this->getDbEncodedBy(); + break; + case 29: + return $this->getDbDiscNumber(); + break; + case 30: + return $this->getDbMood(); + break; + case 31: + return $this->getDbLabel(); + break; + case 32: + return $this->getDbComposer(); + break; + case 33: + return $this->getDbEncoder(); + break; + case 34: + return $this->getDbChecksum(); + break; + case 35: + return $this->getDbLyrics(); + break; + case 36: + return $this->getDbOrchestra(); + break; + case 37: + return $this->getDbConductor(); + break; + case 38: + return $this->getDbLyricist(); + break; + case 39: + return $this->getDbOriginalLyricist(); + break; + case 40: + return $this->getDbRadioStationName(); + break; + case 41: + return $this->getDbInfoUrl(); + break; + case 42: + return $this->getDbArtistUrl(); + break; + case 43: + return $this->getDbAudioSourceUrl(); + break; + case 44: + return $this->getDbRadioStationUrl(); + break; + case 45: + return $this->getDbBuyThisUrl(); + break; + case 46: + return $this->getDbIsrcNumber(); + break; + case 47: + return $this->getDbCatalogNumber(); + break; + case 48: + return $this->getDbOriginalArtist(); + break; + case 49: + return $this->getDbCopyright(); + break; + case 50: + return $this->getDbReportDatetime(); + break; + case 51: + return $this->getDbReportLocation(); + break; + case 52: + return $this->getDbReportOrganization(); + break; + case 53: + return $this->getDbSubject(); + break; + case 54: + return $this->getDbContributor(); + break; + case 55: + return $this->getDbLanguage(); + break; + case 56: + return $this->getDbFileExists(); + break; + case 57: + return $this->getDbSoundcloudId(); + break; + case 58: + return $this->getDbSoundcloudErrorCode(); + break; + case 59: + return $this->getDbSoundcloudErrorMsg(); + break; + case 60: + return $this->getDbSoundcloudLinkToFile(); + break; + case 61: + return $this->getDbSoundCloundUploadTime(); + break; + case 62: + return $this->getDbReplayGain(); + break; + case 63: + return $this->getDbOwnerId(); + break; + case 64: + return $this->getDbCuein(); + break; + case 65: + return $this->getDbCueout(); + break; + case 66: + return $this->getDbSilanCheck(); + break; + case 67: + return $this->getDbHidden(); + break; + case 68: + return $this->getDbIsScheduled(); + break; + case 69: + return $this->getDbIsPlaylist(); + break; + case 70: + return $this->getDbResourceId(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcFiles'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcFiles'][$this->getPrimaryKey()] = true; + $keys = CcFilesPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbName(), + $keys[2] => $this->getDbMime(), + $keys[3] => $this->getDbFtype(), + $keys[4] => $this->getDbDirectory(), + $keys[5] => $this->getDbFilepath(), + $keys[6] => $this->getDbImportStatus(), + $keys[7] => $this->getDbCurrentlyaccessing(), + $keys[8] => $this->getDbEditedby(), + $keys[9] => $this->getDbMtime(), + $keys[10] => $this->getDbUtime(), + $keys[11] => $this->getDbLPtime(), + $keys[12] => $this->getDbMd5(), + $keys[13] => $this->getDbTrackTitle(), + $keys[14] => $this->getDbArtistName(), + $keys[15] => $this->getDbBitRate(), + $keys[16] => $this->getDbSampleRate(), + $keys[17] => $this->getDbFormat(), + $keys[18] => $this->getDbLength(), + $keys[19] => $this->getDbAlbumTitle(), + $keys[20] => $this->getDbGenre(), + $keys[21] => $this->getDbComments(), + $keys[22] => $this->getDbYear(), + $keys[23] => $this->getDbTrackNumber(), + $keys[24] => $this->getDbChannels(), + $keys[25] => $this->getDbUrl(), + $keys[26] => $this->getDbBpm(), + $keys[27] => $this->getDbRating(), + $keys[28] => $this->getDbEncodedBy(), + $keys[29] => $this->getDbDiscNumber(), + $keys[30] => $this->getDbMood(), + $keys[31] => $this->getDbLabel(), + $keys[32] => $this->getDbComposer(), + $keys[33] => $this->getDbEncoder(), + $keys[34] => $this->getDbChecksum(), + $keys[35] => $this->getDbLyrics(), + $keys[36] => $this->getDbOrchestra(), + $keys[37] => $this->getDbConductor(), + $keys[38] => $this->getDbLyricist(), + $keys[39] => $this->getDbOriginalLyricist(), + $keys[40] => $this->getDbRadioStationName(), + $keys[41] => $this->getDbInfoUrl(), + $keys[42] => $this->getDbArtistUrl(), + $keys[43] => $this->getDbAudioSourceUrl(), + $keys[44] => $this->getDbRadioStationUrl(), + $keys[45] => $this->getDbBuyThisUrl(), + $keys[46] => $this->getDbIsrcNumber(), + $keys[47] => $this->getDbCatalogNumber(), + $keys[48] => $this->getDbOriginalArtist(), + $keys[49] => $this->getDbCopyright(), + $keys[50] => $this->getDbReportDatetime(), + $keys[51] => $this->getDbReportLocation(), + $keys[52] => $this->getDbReportOrganization(), + $keys[53] => $this->getDbSubject(), + $keys[54] => $this->getDbContributor(), + $keys[55] => $this->getDbLanguage(), + $keys[56] => $this->getDbFileExists(), + $keys[57] => $this->getDbSoundcloudId(), + $keys[58] => $this->getDbSoundcloudErrorCode(), + $keys[59] => $this->getDbSoundcloudErrorMsg(), + $keys[60] => $this->getDbSoundcloudLinkToFile(), + $keys[61] => $this->getDbSoundCloundUploadTime(), + $keys[62] => $this->getDbReplayGain(), + $keys[63] => $this->getDbOwnerId(), + $keys[64] => $this->getDbCuein(), + $keys[65] => $this->getDbCueout(), + $keys[66] => $this->getDbSilanCheck(), + $keys[67] => $this->getDbHidden(), + $keys[68] => $this->getDbIsScheduled(), + $keys[69] => $this->getDbIsPlaylist(), + $keys[70] => $this->getDbResourceId(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aFkOwner) { + $result['FkOwner'] = $this->aFkOwner->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->aCcSubjsRelatedByDbEditedby) { + $result['CcSubjsRelatedByDbEditedby'] = $this->aCcSubjsRelatedByDbEditedby->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->aCcMusicDirs) { + $result['CcMusicDirs'] = $this->aCcMusicDirs->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->collCcShowInstancess) { + $result['CcShowInstancess'] = $this->collCcShowInstancess->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcPlaylistcontentss) { + $result['CcPlaylistcontentss'] = $this->collCcPlaylistcontentss->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcBlockcontentss) { + $result['CcBlockcontentss'] = $this->collCcBlockcontentss->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcSchedules) { + $result['CcSchedules'] = $this->collCcSchedules->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcPlayoutHistorys) { + $result['CcPlayoutHistorys'] = $this->collCcPlayoutHistorys->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcFilesPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbName($value); + break; + case 2: + $this->setDbMime($value); + break; + case 3: + $this->setDbFtype($value); + break; + case 4: + $this->setDbDirectory($value); + break; + case 5: + $this->setDbFilepath($value); + break; + case 6: + $this->setDbImportStatus($value); + break; + case 7: + $this->setDbCurrentlyaccessing($value); + break; + case 8: + $this->setDbEditedby($value); + break; + case 9: + $this->setDbMtime($value); + break; + case 10: + $this->setDbUtime($value); + break; + case 11: + $this->setDbLPtime($value); + break; + case 12: + $this->setDbMd5($value); + break; + case 13: + $this->setDbTrackTitle($value); + break; + case 14: + $this->setDbArtistName($value); + break; + case 15: + $this->setDbBitRate($value); + break; + case 16: + $this->setDbSampleRate($value); + break; + case 17: + $this->setDbFormat($value); + break; + case 18: + $this->setDbLength($value); + break; + case 19: + $this->setDbAlbumTitle($value); + break; + case 20: + $this->setDbGenre($value); + break; + case 21: + $this->setDbComments($value); + break; + case 22: + $this->setDbYear($value); + break; + case 23: + $this->setDbTrackNumber($value); + break; + case 24: + $this->setDbChannels($value); + break; + case 25: + $this->setDbUrl($value); + break; + case 26: + $this->setDbBpm($value); + break; + case 27: + $this->setDbRating($value); + break; + case 28: + $this->setDbEncodedBy($value); + break; + case 29: + $this->setDbDiscNumber($value); + break; + case 30: + $this->setDbMood($value); + break; + case 31: + $this->setDbLabel($value); + break; + case 32: + $this->setDbComposer($value); + break; + case 33: + $this->setDbEncoder($value); + break; + case 34: + $this->setDbChecksum($value); + break; + case 35: + $this->setDbLyrics($value); + break; + case 36: + $this->setDbOrchestra($value); + break; + case 37: + $this->setDbConductor($value); + break; + case 38: + $this->setDbLyricist($value); + break; + case 39: + $this->setDbOriginalLyricist($value); + break; + case 40: + $this->setDbRadioStationName($value); + break; + case 41: + $this->setDbInfoUrl($value); + break; + case 42: + $this->setDbArtistUrl($value); + break; + case 43: + $this->setDbAudioSourceUrl($value); + break; + case 44: + $this->setDbRadioStationUrl($value); + break; + case 45: + $this->setDbBuyThisUrl($value); + break; + case 46: + $this->setDbIsrcNumber($value); + break; + case 47: + $this->setDbCatalogNumber($value); + break; + case 48: + $this->setDbOriginalArtist($value); + break; + case 49: + $this->setDbCopyright($value); + break; + case 50: + $this->setDbReportDatetime($value); + break; + case 51: + $this->setDbReportLocation($value); + break; + case 52: + $this->setDbReportOrganization($value); + break; + case 53: + $this->setDbSubject($value); + break; + case 54: + $this->setDbContributor($value); + break; + case 55: + $this->setDbLanguage($value); + break; + case 56: + $this->setDbFileExists($value); + break; + case 57: + $this->setDbSoundcloudId($value); + break; + case 58: + $this->setDbSoundcloudErrorCode($value); + break; + case 59: + $this->setDbSoundcloudErrorMsg($value); + break; + case 60: + $this->setDbSoundcloudLinkToFile($value); + break; + case 61: + $this->setDbSoundCloundUploadTime($value); + break; + case 62: + $this->setDbReplayGain($value); + break; + case 63: + $this->setDbOwnerId($value); + break; + case 64: + $this->setDbCuein($value); + break; + case 65: + $this->setDbCueout($value); + break; + case 66: + $this->setDbSilanCheck($value); + break; + case 67: + $this->setDbHidden($value); + break; + case 68: + $this->setDbIsScheduled($value); + break; + case 69: + $this->setDbIsPlaylist($value); + break; + case 70: + $this->setDbResourceId($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcFilesPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbMime($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbFtype($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbDirectory($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setDbFilepath($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setDbImportStatus($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setDbCurrentlyaccessing($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setDbEditedby($arr[$keys[8]]); + if (array_key_exists($keys[9], $arr)) $this->setDbMtime($arr[$keys[9]]); + if (array_key_exists($keys[10], $arr)) $this->setDbUtime($arr[$keys[10]]); + if (array_key_exists($keys[11], $arr)) $this->setDbLPtime($arr[$keys[11]]); + if (array_key_exists($keys[12], $arr)) $this->setDbMd5($arr[$keys[12]]); + if (array_key_exists($keys[13], $arr)) $this->setDbTrackTitle($arr[$keys[13]]); + if (array_key_exists($keys[14], $arr)) $this->setDbArtistName($arr[$keys[14]]); + if (array_key_exists($keys[15], $arr)) $this->setDbBitRate($arr[$keys[15]]); + if (array_key_exists($keys[16], $arr)) $this->setDbSampleRate($arr[$keys[16]]); + if (array_key_exists($keys[17], $arr)) $this->setDbFormat($arr[$keys[17]]); + if (array_key_exists($keys[18], $arr)) $this->setDbLength($arr[$keys[18]]); + if (array_key_exists($keys[19], $arr)) $this->setDbAlbumTitle($arr[$keys[19]]); + if (array_key_exists($keys[20], $arr)) $this->setDbGenre($arr[$keys[20]]); + if (array_key_exists($keys[21], $arr)) $this->setDbComments($arr[$keys[21]]); + if (array_key_exists($keys[22], $arr)) $this->setDbYear($arr[$keys[22]]); + if (array_key_exists($keys[23], $arr)) $this->setDbTrackNumber($arr[$keys[23]]); + if (array_key_exists($keys[24], $arr)) $this->setDbChannels($arr[$keys[24]]); + if (array_key_exists($keys[25], $arr)) $this->setDbUrl($arr[$keys[25]]); + if (array_key_exists($keys[26], $arr)) $this->setDbBpm($arr[$keys[26]]); + if (array_key_exists($keys[27], $arr)) $this->setDbRating($arr[$keys[27]]); + if (array_key_exists($keys[28], $arr)) $this->setDbEncodedBy($arr[$keys[28]]); + if (array_key_exists($keys[29], $arr)) $this->setDbDiscNumber($arr[$keys[29]]); + if (array_key_exists($keys[30], $arr)) $this->setDbMood($arr[$keys[30]]); + if (array_key_exists($keys[31], $arr)) $this->setDbLabel($arr[$keys[31]]); + if (array_key_exists($keys[32], $arr)) $this->setDbComposer($arr[$keys[32]]); + if (array_key_exists($keys[33], $arr)) $this->setDbEncoder($arr[$keys[33]]); + if (array_key_exists($keys[34], $arr)) $this->setDbChecksum($arr[$keys[34]]); + if (array_key_exists($keys[35], $arr)) $this->setDbLyrics($arr[$keys[35]]); + if (array_key_exists($keys[36], $arr)) $this->setDbOrchestra($arr[$keys[36]]); + if (array_key_exists($keys[37], $arr)) $this->setDbConductor($arr[$keys[37]]); + if (array_key_exists($keys[38], $arr)) $this->setDbLyricist($arr[$keys[38]]); + if (array_key_exists($keys[39], $arr)) $this->setDbOriginalLyricist($arr[$keys[39]]); + if (array_key_exists($keys[40], $arr)) $this->setDbRadioStationName($arr[$keys[40]]); + if (array_key_exists($keys[41], $arr)) $this->setDbInfoUrl($arr[$keys[41]]); + if (array_key_exists($keys[42], $arr)) $this->setDbArtistUrl($arr[$keys[42]]); + if (array_key_exists($keys[43], $arr)) $this->setDbAudioSourceUrl($arr[$keys[43]]); + if (array_key_exists($keys[44], $arr)) $this->setDbRadioStationUrl($arr[$keys[44]]); + if (array_key_exists($keys[45], $arr)) $this->setDbBuyThisUrl($arr[$keys[45]]); + if (array_key_exists($keys[46], $arr)) $this->setDbIsrcNumber($arr[$keys[46]]); + if (array_key_exists($keys[47], $arr)) $this->setDbCatalogNumber($arr[$keys[47]]); + if (array_key_exists($keys[48], $arr)) $this->setDbOriginalArtist($arr[$keys[48]]); + if (array_key_exists($keys[49], $arr)) $this->setDbCopyright($arr[$keys[49]]); + if (array_key_exists($keys[50], $arr)) $this->setDbReportDatetime($arr[$keys[50]]); + if (array_key_exists($keys[51], $arr)) $this->setDbReportLocation($arr[$keys[51]]); + if (array_key_exists($keys[52], $arr)) $this->setDbReportOrganization($arr[$keys[52]]); + if (array_key_exists($keys[53], $arr)) $this->setDbSubject($arr[$keys[53]]); + if (array_key_exists($keys[54], $arr)) $this->setDbContributor($arr[$keys[54]]); + if (array_key_exists($keys[55], $arr)) $this->setDbLanguage($arr[$keys[55]]); + if (array_key_exists($keys[56], $arr)) $this->setDbFileExists($arr[$keys[56]]); + if (array_key_exists($keys[57], $arr)) $this->setDbSoundcloudId($arr[$keys[57]]); + if (array_key_exists($keys[58], $arr)) $this->setDbSoundcloudErrorCode($arr[$keys[58]]); + if (array_key_exists($keys[59], $arr)) $this->setDbSoundcloudErrorMsg($arr[$keys[59]]); + if (array_key_exists($keys[60], $arr)) $this->setDbSoundcloudLinkToFile($arr[$keys[60]]); + if (array_key_exists($keys[61], $arr)) $this->setDbSoundCloundUploadTime($arr[$keys[61]]); + if (array_key_exists($keys[62], $arr)) $this->setDbReplayGain($arr[$keys[62]]); + if (array_key_exists($keys[63], $arr)) $this->setDbOwnerId($arr[$keys[63]]); + if (array_key_exists($keys[64], $arr)) $this->setDbCuein($arr[$keys[64]]); + if (array_key_exists($keys[65], $arr)) $this->setDbCueout($arr[$keys[65]]); + if (array_key_exists($keys[66], $arr)) $this->setDbSilanCheck($arr[$keys[66]]); + if (array_key_exists($keys[67], $arr)) $this->setDbHidden($arr[$keys[67]]); + if (array_key_exists($keys[68], $arr)) $this->setDbIsScheduled($arr[$keys[68]]); + if (array_key_exists($keys[69], $arr)) $this->setDbIsPlaylist($arr[$keys[69]]); + if (array_key_exists($keys[70], $arr)) $this->setDbResourceId($arr[$keys[70]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcFilesPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcFilesPeer::ID)) $criteria->add(CcFilesPeer::ID, $this->id); + if ($this->isColumnModified(CcFilesPeer::NAME)) $criteria->add(CcFilesPeer::NAME, $this->name); + if ($this->isColumnModified(CcFilesPeer::MIME)) $criteria->add(CcFilesPeer::MIME, $this->mime); + if ($this->isColumnModified(CcFilesPeer::FTYPE)) $criteria->add(CcFilesPeer::FTYPE, $this->ftype); + if ($this->isColumnModified(CcFilesPeer::DIRECTORY)) $criteria->add(CcFilesPeer::DIRECTORY, $this->directory); + if ($this->isColumnModified(CcFilesPeer::FILEPATH)) $criteria->add(CcFilesPeer::FILEPATH, $this->filepath); + if ($this->isColumnModified(CcFilesPeer::IMPORT_STATUS)) $criteria->add(CcFilesPeer::IMPORT_STATUS, $this->import_status); + if ($this->isColumnModified(CcFilesPeer::CURRENTLYACCESSING)) $criteria->add(CcFilesPeer::CURRENTLYACCESSING, $this->currentlyaccessing); + if ($this->isColumnModified(CcFilesPeer::EDITEDBY)) $criteria->add(CcFilesPeer::EDITEDBY, $this->editedby); + if ($this->isColumnModified(CcFilesPeer::MTIME)) $criteria->add(CcFilesPeer::MTIME, $this->mtime); + if ($this->isColumnModified(CcFilesPeer::UTIME)) $criteria->add(CcFilesPeer::UTIME, $this->utime); + if ($this->isColumnModified(CcFilesPeer::LPTIME)) $criteria->add(CcFilesPeer::LPTIME, $this->lptime); + if ($this->isColumnModified(CcFilesPeer::MD5)) $criteria->add(CcFilesPeer::MD5, $this->md5); + if ($this->isColumnModified(CcFilesPeer::TRACK_TITLE)) $criteria->add(CcFilesPeer::TRACK_TITLE, $this->track_title); + if ($this->isColumnModified(CcFilesPeer::ARTIST_NAME)) $criteria->add(CcFilesPeer::ARTIST_NAME, $this->artist_name); + if ($this->isColumnModified(CcFilesPeer::BIT_RATE)) $criteria->add(CcFilesPeer::BIT_RATE, $this->bit_rate); + if ($this->isColumnModified(CcFilesPeer::SAMPLE_RATE)) $criteria->add(CcFilesPeer::SAMPLE_RATE, $this->sample_rate); + if ($this->isColumnModified(CcFilesPeer::FORMAT)) $criteria->add(CcFilesPeer::FORMAT, $this->format); + if ($this->isColumnModified(CcFilesPeer::LENGTH)) $criteria->add(CcFilesPeer::LENGTH, $this->length); + if ($this->isColumnModified(CcFilesPeer::ALBUM_TITLE)) $criteria->add(CcFilesPeer::ALBUM_TITLE, $this->album_title); + if ($this->isColumnModified(CcFilesPeer::GENRE)) $criteria->add(CcFilesPeer::GENRE, $this->genre); + if ($this->isColumnModified(CcFilesPeer::COMMENTS)) $criteria->add(CcFilesPeer::COMMENTS, $this->comments); + if ($this->isColumnModified(CcFilesPeer::YEAR)) $criteria->add(CcFilesPeer::YEAR, $this->year); + if ($this->isColumnModified(CcFilesPeer::TRACK_NUMBER)) $criteria->add(CcFilesPeer::TRACK_NUMBER, $this->track_number); + if ($this->isColumnModified(CcFilesPeer::CHANNELS)) $criteria->add(CcFilesPeer::CHANNELS, $this->channels); + if ($this->isColumnModified(CcFilesPeer::URL)) $criteria->add(CcFilesPeer::URL, $this->url); + if ($this->isColumnModified(CcFilesPeer::BPM)) $criteria->add(CcFilesPeer::BPM, $this->bpm); + if ($this->isColumnModified(CcFilesPeer::RATING)) $criteria->add(CcFilesPeer::RATING, $this->rating); + if ($this->isColumnModified(CcFilesPeer::ENCODED_BY)) $criteria->add(CcFilesPeer::ENCODED_BY, $this->encoded_by); + if ($this->isColumnModified(CcFilesPeer::DISC_NUMBER)) $criteria->add(CcFilesPeer::DISC_NUMBER, $this->disc_number); + if ($this->isColumnModified(CcFilesPeer::MOOD)) $criteria->add(CcFilesPeer::MOOD, $this->mood); + if ($this->isColumnModified(CcFilesPeer::LABEL)) $criteria->add(CcFilesPeer::LABEL, $this->label); + if ($this->isColumnModified(CcFilesPeer::COMPOSER)) $criteria->add(CcFilesPeer::COMPOSER, $this->composer); + if ($this->isColumnModified(CcFilesPeer::ENCODER)) $criteria->add(CcFilesPeer::ENCODER, $this->encoder); + if ($this->isColumnModified(CcFilesPeer::CHECKSUM)) $criteria->add(CcFilesPeer::CHECKSUM, $this->checksum); + if ($this->isColumnModified(CcFilesPeer::LYRICS)) $criteria->add(CcFilesPeer::LYRICS, $this->lyrics); + if ($this->isColumnModified(CcFilesPeer::ORCHESTRA)) $criteria->add(CcFilesPeer::ORCHESTRA, $this->orchestra); + if ($this->isColumnModified(CcFilesPeer::CONDUCTOR)) $criteria->add(CcFilesPeer::CONDUCTOR, $this->conductor); + if ($this->isColumnModified(CcFilesPeer::LYRICIST)) $criteria->add(CcFilesPeer::LYRICIST, $this->lyricist); + if ($this->isColumnModified(CcFilesPeer::ORIGINAL_LYRICIST)) $criteria->add(CcFilesPeer::ORIGINAL_LYRICIST, $this->original_lyricist); + if ($this->isColumnModified(CcFilesPeer::RADIO_STATION_NAME)) $criteria->add(CcFilesPeer::RADIO_STATION_NAME, $this->radio_station_name); + if ($this->isColumnModified(CcFilesPeer::INFO_URL)) $criteria->add(CcFilesPeer::INFO_URL, $this->info_url); + if ($this->isColumnModified(CcFilesPeer::ARTIST_URL)) $criteria->add(CcFilesPeer::ARTIST_URL, $this->artist_url); + if ($this->isColumnModified(CcFilesPeer::AUDIO_SOURCE_URL)) $criteria->add(CcFilesPeer::AUDIO_SOURCE_URL, $this->audio_source_url); + if ($this->isColumnModified(CcFilesPeer::RADIO_STATION_URL)) $criteria->add(CcFilesPeer::RADIO_STATION_URL, $this->radio_station_url); + if ($this->isColumnModified(CcFilesPeer::BUY_THIS_URL)) $criteria->add(CcFilesPeer::BUY_THIS_URL, $this->buy_this_url); + if ($this->isColumnModified(CcFilesPeer::ISRC_NUMBER)) $criteria->add(CcFilesPeer::ISRC_NUMBER, $this->isrc_number); + if ($this->isColumnModified(CcFilesPeer::CATALOG_NUMBER)) $criteria->add(CcFilesPeer::CATALOG_NUMBER, $this->catalog_number); + if ($this->isColumnModified(CcFilesPeer::ORIGINAL_ARTIST)) $criteria->add(CcFilesPeer::ORIGINAL_ARTIST, $this->original_artist); + if ($this->isColumnModified(CcFilesPeer::COPYRIGHT)) $criteria->add(CcFilesPeer::COPYRIGHT, $this->copyright); + if ($this->isColumnModified(CcFilesPeer::REPORT_DATETIME)) $criteria->add(CcFilesPeer::REPORT_DATETIME, $this->report_datetime); + if ($this->isColumnModified(CcFilesPeer::REPORT_LOCATION)) $criteria->add(CcFilesPeer::REPORT_LOCATION, $this->report_location); + if ($this->isColumnModified(CcFilesPeer::REPORT_ORGANIZATION)) $criteria->add(CcFilesPeer::REPORT_ORGANIZATION, $this->report_organization); + if ($this->isColumnModified(CcFilesPeer::SUBJECT)) $criteria->add(CcFilesPeer::SUBJECT, $this->subject); + if ($this->isColumnModified(CcFilesPeer::CONTRIBUTOR)) $criteria->add(CcFilesPeer::CONTRIBUTOR, $this->contributor); + if ($this->isColumnModified(CcFilesPeer::LANGUAGE)) $criteria->add(CcFilesPeer::LANGUAGE, $this->language); + if ($this->isColumnModified(CcFilesPeer::FILE_EXISTS)) $criteria->add(CcFilesPeer::FILE_EXISTS, $this->file_exists); + if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_ID)) $criteria->add(CcFilesPeer::SOUNDCLOUD_ID, $this->soundcloud_id); + if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_ERROR_CODE)) $criteria->add(CcFilesPeer::SOUNDCLOUD_ERROR_CODE, $this->soundcloud_error_code); + if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_ERROR_MSG)) $criteria->add(CcFilesPeer::SOUNDCLOUD_ERROR_MSG, $this->soundcloud_error_msg); + if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE)) $criteria->add(CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE, $this->soundcloud_link_to_file); + if ($this->isColumnModified(CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME)) $criteria->add(CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, $this->soundcloud_upload_time); + if ($this->isColumnModified(CcFilesPeer::REPLAY_GAIN)) $criteria->add(CcFilesPeer::REPLAY_GAIN, $this->replay_gain); + if ($this->isColumnModified(CcFilesPeer::OWNER_ID)) $criteria->add(CcFilesPeer::OWNER_ID, $this->owner_id); + if ($this->isColumnModified(CcFilesPeer::CUEIN)) $criteria->add(CcFilesPeer::CUEIN, $this->cuein); + if ($this->isColumnModified(CcFilesPeer::CUEOUT)) $criteria->add(CcFilesPeer::CUEOUT, $this->cueout); + if ($this->isColumnModified(CcFilesPeer::SILAN_CHECK)) $criteria->add(CcFilesPeer::SILAN_CHECK, $this->silan_check); + if ($this->isColumnModified(CcFilesPeer::HIDDEN)) $criteria->add(CcFilesPeer::HIDDEN, $this->hidden); + if ($this->isColumnModified(CcFilesPeer::IS_SCHEDULED)) $criteria->add(CcFilesPeer::IS_SCHEDULED, $this->is_scheduled); + if ($this->isColumnModified(CcFilesPeer::IS_PLAYLIST)) $criteria->add(CcFilesPeer::IS_PLAYLIST, $this->is_playlist); + if ($this->isColumnModified(CcFilesPeer::RESOURCE_ID)) $criteria->add(CcFilesPeer::RESOURCE_ID, $this->resource_id); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcFilesPeer::DATABASE_NAME); + $criteria->add(CcFilesPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcFiles (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbName($this->getDbName()); + $copyObj->setDbMime($this->getDbMime()); + $copyObj->setDbFtype($this->getDbFtype()); + $copyObj->setDbDirectory($this->getDbDirectory()); + $copyObj->setDbFilepath($this->getDbFilepath()); + $copyObj->setDbImportStatus($this->getDbImportStatus()); + $copyObj->setDbCurrentlyaccessing($this->getDbCurrentlyaccessing()); + $copyObj->setDbEditedby($this->getDbEditedby()); + $copyObj->setDbMtime($this->getDbMtime()); + $copyObj->setDbUtime($this->getDbUtime()); + $copyObj->setDbLPtime($this->getDbLPtime()); + $copyObj->setDbMd5($this->getDbMd5()); + $copyObj->setDbTrackTitle($this->getDbTrackTitle()); + $copyObj->setDbArtistName($this->getDbArtistName()); + $copyObj->setDbBitRate($this->getDbBitRate()); + $copyObj->setDbSampleRate($this->getDbSampleRate()); + $copyObj->setDbFormat($this->getDbFormat()); + $copyObj->setDbLength($this->getDbLength()); + $copyObj->setDbAlbumTitle($this->getDbAlbumTitle()); + $copyObj->setDbGenre($this->getDbGenre()); + $copyObj->setDbComments($this->getDbComments()); + $copyObj->setDbYear($this->getDbYear()); + $copyObj->setDbTrackNumber($this->getDbTrackNumber()); + $copyObj->setDbChannels($this->getDbChannels()); + $copyObj->setDbUrl($this->getDbUrl()); + $copyObj->setDbBpm($this->getDbBpm()); + $copyObj->setDbRating($this->getDbRating()); + $copyObj->setDbEncodedBy($this->getDbEncodedBy()); + $copyObj->setDbDiscNumber($this->getDbDiscNumber()); + $copyObj->setDbMood($this->getDbMood()); + $copyObj->setDbLabel($this->getDbLabel()); + $copyObj->setDbComposer($this->getDbComposer()); + $copyObj->setDbEncoder($this->getDbEncoder()); + $copyObj->setDbChecksum($this->getDbChecksum()); + $copyObj->setDbLyrics($this->getDbLyrics()); + $copyObj->setDbOrchestra($this->getDbOrchestra()); + $copyObj->setDbConductor($this->getDbConductor()); + $copyObj->setDbLyricist($this->getDbLyricist()); + $copyObj->setDbOriginalLyricist($this->getDbOriginalLyricist()); + $copyObj->setDbRadioStationName($this->getDbRadioStationName()); + $copyObj->setDbInfoUrl($this->getDbInfoUrl()); + $copyObj->setDbArtistUrl($this->getDbArtistUrl()); + $copyObj->setDbAudioSourceUrl($this->getDbAudioSourceUrl()); + $copyObj->setDbRadioStationUrl($this->getDbRadioStationUrl()); + $copyObj->setDbBuyThisUrl($this->getDbBuyThisUrl()); + $copyObj->setDbIsrcNumber($this->getDbIsrcNumber()); + $copyObj->setDbCatalogNumber($this->getDbCatalogNumber()); + $copyObj->setDbOriginalArtist($this->getDbOriginalArtist()); + $copyObj->setDbCopyright($this->getDbCopyright()); + $copyObj->setDbReportDatetime($this->getDbReportDatetime()); + $copyObj->setDbReportLocation($this->getDbReportLocation()); + $copyObj->setDbReportOrganization($this->getDbReportOrganization()); + $copyObj->setDbSubject($this->getDbSubject()); + $copyObj->setDbContributor($this->getDbContributor()); + $copyObj->setDbLanguage($this->getDbLanguage()); + $copyObj->setDbFileExists($this->getDbFileExists()); + $copyObj->setDbSoundcloudId($this->getDbSoundcloudId()); + $copyObj->setDbSoundcloudErrorCode($this->getDbSoundcloudErrorCode()); + $copyObj->setDbSoundcloudErrorMsg($this->getDbSoundcloudErrorMsg()); + $copyObj->setDbSoundcloudLinkToFile($this->getDbSoundcloudLinkToFile()); + $copyObj->setDbSoundCloundUploadTime($this->getDbSoundCloundUploadTime()); + $copyObj->setDbReplayGain($this->getDbReplayGain()); + $copyObj->setDbOwnerId($this->getDbOwnerId()); + $copyObj->setDbCuein($this->getDbCuein()); + $copyObj->setDbCueout($this->getDbCueout()); + $copyObj->setDbSilanCheck($this->getDbSilanCheck()); + $copyObj->setDbHidden($this->getDbHidden()); + $copyObj->setDbIsScheduled($this->getDbIsScheduled()); + $copyObj->setDbIsPlaylist($this->getDbIsPlaylist()); + $copyObj->setDbResourceId($this->getDbResourceId()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + foreach ($this->getCcShowInstancess() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcShowInstances($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcPlaylistcontentss() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcPlaylistcontents($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcBlockcontentss() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcBlockcontents($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcSchedules() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcSchedule($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcPlayoutHistorys() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcPlayoutHistory($relObj->copy($deepCopy)); + } + } + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcFiles Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcFilesPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcFilesPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcSubjs object. + * + * @param CcSubjs $v + * @return CcFiles The current object (for fluent API support) + * @throws PropelException + */ + public function setFkOwner(CcSubjs $v = null) + { + if ($v === null) { + $this->setDbOwnerId(NULL); + } else { + $this->setDbOwnerId($v->getDbId()); + } + + $this->aFkOwner = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcSubjs object, it will not be re-added. + if ($v !== null) { + $v->addCcFilesRelatedByDbOwnerId($this); + } + + + return $this; + } + + + /** + * Get the associated CcSubjs object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcSubjs The associated CcSubjs object. + * @throws PropelException + */ + public function getFkOwner(PropelPDO $con = null, $doQuery = true) + { + if ($this->aFkOwner === null && ($this->owner_id !== null) && $doQuery) { + $this->aFkOwner = CcSubjsQuery::create()->findPk($this->owner_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aFkOwner->addCcFilessRelatedByDbOwnerId($this); + */ + } + + return $this->aFkOwner; + } + + /** + * Declares an association between this object and a CcSubjs object. + * + * @param CcSubjs $v + * @return CcFiles The current object (for fluent API support) + * @throws PropelException + */ + public function setCcSubjsRelatedByDbEditedby(CcSubjs $v = null) + { + if ($v === null) { + $this->setDbEditedby(NULL); + } else { + $this->setDbEditedby($v->getDbId()); + } + + $this->aCcSubjsRelatedByDbEditedby = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcSubjs object, it will not be re-added. + if ($v !== null) { + $v->addCcFilesRelatedByDbEditedby($this); + } + + + return $this; + } + + + /** + * Get the associated CcSubjs object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcSubjs The associated CcSubjs object. + * @throws PropelException + */ + public function getCcSubjsRelatedByDbEditedby(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcSubjsRelatedByDbEditedby === null && ($this->editedby !== null) && $doQuery) { + $this->aCcSubjsRelatedByDbEditedby = CcSubjsQuery::create()->findPk($this->editedby, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcSubjsRelatedByDbEditedby->addCcFilessRelatedByDbEditedby($this); + */ + } + + return $this->aCcSubjsRelatedByDbEditedby; + } + + /** + * Declares an association between this object and a CcMusicDirs object. + * + * @param CcMusicDirs $v + * @return CcFiles The current object (for fluent API support) + * @throws PropelException + */ + public function setCcMusicDirs(CcMusicDirs $v = null) + { + if ($v === null) { + $this->setDbDirectory(NULL); + } else { + $this->setDbDirectory($v->getId()); + } + + $this->aCcMusicDirs = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcMusicDirs object, it will not be re-added. + if ($v !== null) { + $v->addCcFiles($this); + } + + + return $this; + } + + + /** + * Get the associated CcMusicDirs object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcMusicDirs The associated CcMusicDirs object. + * @throws PropelException + */ + public function getCcMusicDirs(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcMusicDirs === null && ($this->directory !== null) && $doQuery) { + $this->aCcMusicDirs = CcMusicDirsQuery::create()->findPk($this->directory, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcMusicDirs->addCcFiless($this); + */ + } + + return $this->aCcMusicDirs; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CcShowInstances' == $relationName) { + $this->initCcShowInstancess(); + } + if ('CcPlaylistcontents' == $relationName) { + $this->initCcPlaylistcontentss(); + } + if ('CcBlockcontents' == $relationName) { + $this->initCcBlockcontentss(); + } + if ('CcSchedule' == $relationName) { + $this->initCcSchedules(); + } + if ('CcPlayoutHistory' == $relationName) { + $this->initCcPlayoutHistorys(); + } + } + + /** + * Clears out the collCcShowInstancess collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcFiles The current object (for fluent API support) + * @see addCcShowInstancess() + */ + public function clearCcShowInstancess() + { + $this->collCcShowInstancess = null; // important to set this to null since that means it is uninitialized + $this->collCcShowInstancessPartial = null; + + return $this; + } + + /** + * reset is the collCcShowInstancess collection loaded partially + * + * @return void + */ + public function resetPartialCcShowInstancess($v = true) + { + $this->collCcShowInstancessPartial = $v; + } + + /** + * Initializes the collCcShowInstancess collection. + * + * By default this just sets the collCcShowInstancess collection to an empty array (like clearcollCcShowInstancess()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcShowInstancess($overrideExisting = true) + { + if (null !== $this->collCcShowInstancess && !$overrideExisting) { + return; + } + $this->collCcShowInstancess = new PropelObjectCollection(); + $this->collCcShowInstancess->setModel('CcShowInstances'); + } + + /** + * Gets an array of CcShowInstances objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcFiles is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcShowInstances[] List of CcShowInstances objects + * @throws PropelException + */ + public function getCcShowInstancess($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcShowInstancessPartial && !$this->isNew(); + if (null === $this->collCcShowInstancess || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowInstancess) { + // return empty collection + $this->initCcShowInstancess(); + } else { + $collCcShowInstancess = CcShowInstancesQuery::create(null, $criteria) + ->filterByCcFiles($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcShowInstancessPartial && count($collCcShowInstancess)) { + $this->initCcShowInstancess(false); + + foreach ($collCcShowInstancess as $obj) { + if (false == $this->collCcShowInstancess->contains($obj)) { + $this->collCcShowInstancess->append($obj); + } + } + + $this->collCcShowInstancessPartial = true; + } + + $collCcShowInstancess->getInternalIterator()->rewind(); + + return $collCcShowInstancess; + } + + if ($partial && $this->collCcShowInstancess) { + foreach ($this->collCcShowInstancess as $obj) { + if ($obj->isNew()) { + $collCcShowInstancess[] = $obj; + } + } + } + + $this->collCcShowInstancess = $collCcShowInstancess; + $this->collCcShowInstancessPartial = false; + } + } + + return $this->collCcShowInstancess; + } + + /** + * Sets a collection of CcShowInstances objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccShowInstancess A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcFiles The current object (for fluent API support) + */ + public function setCcShowInstancess(PropelCollection $ccShowInstancess, PropelPDO $con = null) + { + $ccShowInstancessToDelete = $this->getCcShowInstancess(new Criteria(), $con)->diff($ccShowInstancess); + + + $this->ccShowInstancessScheduledForDeletion = $ccShowInstancessToDelete; + + foreach ($ccShowInstancessToDelete as $ccShowInstancesRemoved) { + $ccShowInstancesRemoved->setCcFiles(null); + } + + $this->collCcShowInstancess = null; + foreach ($ccShowInstancess as $ccShowInstances) { + $this->addCcShowInstances($ccShowInstances); + } + + $this->collCcShowInstancess = $ccShowInstancess; + $this->collCcShowInstancessPartial = false; + + return $this; + } + + /** + * Returns the number of related CcShowInstances objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcShowInstances objects. + * @throws PropelException + */ + public function countCcShowInstancess(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcShowInstancessPartial && !$this->isNew(); + if (null === $this->collCcShowInstancess || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowInstancess) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcShowInstancess()); + } + $query = CcShowInstancesQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcFiles($this) + ->count($con); + } + + return count($this->collCcShowInstancess); + } + + /** + * Method called to associate a CcShowInstances object to this object + * through the CcShowInstances foreign key attribute. + * + * @param CcShowInstances $l CcShowInstances + * @return CcFiles The current object (for fluent API support) + */ + public function addCcShowInstances(CcShowInstances $l) + { + if ($this->collCcShowInstancess === null) { + $this->initCcShowInstancess(); + $this->collCcShowInstancessPartial = true; + } + + if (!in_array($l, $this->collCcShowInstancess->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcShowInstances($l); + + if ($this->ccShowInstancessScheduledForDeletion and $this->ccShowInstancessScheduledForDeletion->contains($l)) { + $this->ccShowInstancessScheduledForDeletion->remove($this->ccShowInstancessScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcShowInstances $ccShowInstances The ccShowInstances object to add. + */ + protected function doAddCcShowInstances($ccShowInstances) + { + $this->collCcShowInstancess[]= $ccShowInstances; + $ccShowInstances->setCcFiles($this); + } + + /** + * @param CcShowInstances $ccShowInstances The ccShowInstances object to remove. + * @return CcFiles The current object (for fluent API support) + */ + public function removeCcShowInstances($ccShowInstances) + { + if ($this->getCcShowInstancess()->contains($ccShowInstances)) { + $this->collCcShowInstancess->remove($this->collCcShowInstancess->search($ccShowInstances)); + if (null === $this->ccShowInstancessScheduledForDeletion) { + $this->ccShowInstancessScheduledForDeletion = clone $this->collCcShowInstancess; + $this->ccShowInstancessScheduledForDeletion->clear(); + } + $this->ccShowInstancessScheduledForDeletion[]= $ccShowInstances; + $ccShowInstances->setCcFiles(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcFiles is new, it will return + * an empty collection; or if this CcFiles has previously + * been saved, it will retrieve related CcShowInstancess from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcFiles. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcShowInstances[] List of CcShowInstances objects + */ + public function getCcShowInstancessJoinCcShow($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcShowInstancesQuery::create(null, $criteria); + $query->joinWith('CcShow', $join_behavior); + + return $this->getCcShowInstancess($query, $con); + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcFiles is new, it will return + * an empty collection; or if this CcFiles has previously + * been saved, it will retrieve related CcShowInstancess from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcFiles. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcShowInstances[] List of CcShowInstances objects + */ + public function getCcShowInstancessJoinCcShowInstancesRelatedByDbOriginalShow($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcShowInstancesQuery::create(null, $criteria); + $query->joinWith('CcShowInstancesRelatedByDbOriginalShow', $join_behavior); + + return $this->getCcShowInstancess($query, $con); + } + + /** + * Clears out the collCcPlaylistcontentss collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcFiles The current object (for fluent API support) + * @see addCcPlaylistcontentss() + */ + public function clearCcPlaylistcontentss() + { + $this->collCcPlaylistcontentss = null; // important to set this to null since that means it is uninitialized + $this->collCcPlaylistcontentssPartial = null; + + return $this; + } + + /** + * reset is the collCcPlaylistcontentss collection loaded partially + * + * @return void + */ + public function resetPartialCcPlaylistcontentss($v = true) + { + $this->collCcPlaylistcontentssPartial = $v; + } + + /** + * Initializes the collCcPlaylistcontentss collection. + * + * By default this just sets the collCcPlaylistcontentss collection to an empty array (like clearcollCcPlaylistcontentss()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcPlaylistcontentss($overrideExisting = true) + { + if (null !== $this->collCcPlaylistcontentss && !$overrideExisting) { + return; + } + $this->collCcPlaylistcontentss = new PropelObjectCollection(); + $this->collCcPlaylistcontentss->setModel('CcPlaylistcontents'); + } + + /** + * Gets an array of CcPlaylistcontents objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcFiles is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcPlaylistcontents[] List of CcPlaylistcontents objects + * @throws PropelException + */ + public function getCcPlaylistcontentss($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcPlaylistcontentssPartial && !$this->isNew(); + if (null === $this->collCcPlaylistcontentss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlaylistcontentss) { + // return empty collection + $this->initCcPlaylistcontentss(); + } else { + $collCcPlaylistcontentss = CcPlaylistcontentsQuery::create(null, $criteria) + ->filterByCcFiles($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcPlaylistcontentssPartial && count($collCcPlaylistcontentss)) { + $this->initCcPlaylistcontentss(false); + + foreach ($collCcPlaylistcontentss as $obj) { + if (false == $this->collCcPlaylistcontentss->contains($obj)) { + $this->collCcPlaylistcontentss->append($obj); + } + } + + $this->collCcPlaylistcontentssPartial = true; + } + + $collCcPlaylistcontentss->getInternalIterator()->rewind(); + + return $collCcPlaylistcontentss; + } + + if ($partial && $this->collCcPlaylistcontentss) { + foreach ($this->collCcPlaylistcontentss as $obj) { + if ($obj->isNew()) { + $collCcPlaylistcontentss[] = $obj; + } + } + } + + $this->collCcPlaylistcontentss = $collCcPlaylistcontentss; + $this->collCcPlaylistcontentssPartial = false; + } + } + + return $this->collCcPlaylistcontentss; + } + + /** + * Sets a collection of CcPlaylistcontents objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccPlaylistcontentss A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcFiles The current object (for fluent API support) + */ + public function setCcPlaylistcontentss(PropelCollection $ccPlaylistcontentss, PropelPDO $con = null) + { + $ccPlaylistcontentssToDelete = $this->getCcPlaylistcontentss(new Criteria(), $con)->diff($ccPlaylistcontentss); + + + $this->ccPlaylistcontentssScheduledForDeletion = $ccPlaylistcontentssToDelete; + + foreach ($ccPlaylistcontentssToDelete as $ccPlaylistcontentsRemoved) { + $ccPlaylistcontentsRemoved->setCcFiles(null); + } + + $this->collCcPlaylistcontentss = null; + foreach ($ccPlaylistcontentss as $ccPlaylistcontents) { + $this->addCcPlaylistcontents($ccPlaylistcontents); + } + + $this->collCcPlaylistcontentss = $ccPlaylistcontentss; + $this->collCcPlaylistcontentssPartial = false; + + return $this; + } + + /** + * Returns the number of related CcPlaylistcontents objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcPlaylistcontents objects. + * @throws PropelException + */ + public function countCcPlaylistcontentss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcPlaylistcontentssPartial && !$this->isNew(); + if (null === $this->collCcPlaylistcontentss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlaylistcontentss) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcPlaylistcontentss()); + } + $query = CcPlaylistcontentsQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcFiles($this) + ->count($con); + } + + return count($this->collCcPlaylistcontentss); + } + + /** + * Method called to associate a CcPlaylistcontents object to this object + * through the CcPlaylistcontents foreign key attribute. + * + * @param CcPlaylistcontents $l CcPlaylistcontents + * @return CcFiles The current object (for fluent API support) + */ + public function addCcPlaylistcontents(CcPlaylistcontents $l) + { + if ($this->collCcPlaylistcontentss === null) { + $this->initCcPlaylistcontentss(); + $this->collCcPlaylistcontentssPartial = true; + } + + if (!in_array($l, $this->collCcPlaylistcontentss->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcPlaylistcontents($l); + + if ($this->ccPlaylistcontentssScheduledForDeletion and $this->ccPlaylistcontentssScheduledForDeletion->contains($l)) { + $this->ccPlaylistcontentssScheduledForDeletion->remove($this->ccPlaylistcontentssScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcPlaylistcontents $ccPlaylistcontents The ccPlaylistcontents object to add. + */ + protected function doAddCcPlaylistcontents($ccPlaylistcontents) + { + $this->collCcPlaylistcontentss[]= $ccPlaylistcontents; + $ccPlaylistcontents->setCcFiles($this); + } + + /** + * @param CcPlaylistcontents $ccPlaylistcontents The ccPlaylistcontents object to remove. + * @return CcFiles The current object (for fluent API support) + */ + public function removeCcPlaylistcontents($ccPlaylistcontents) + { + if ($this->getCcPlaylistcontentss()->contains($ccPlaylistcontents)) { + $this->collCcPlaylistcontentss->remove($this->collCcPlaylistcontentss->search($ccPlaylistcontents)); + if (null === $this->ccPlaylistcontentssScheduledForDeletion) { + $this->ccPlaylistcontentssScheduledForDeletion = clone $this->collCcPlaylistcontentss; + $this->ccPlaylistcontentssScheduledForDeletion->clear(); + } + $this->ccPlaylistcontentssScheduledForDeletion[]= $ccPlaylistcontents; + $ccPlaylistcontents->setCcFiles(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcFiles is new, it will return + * an empty collection; or if this CcFiles has previously + * been saved, it will retrieve related CcPlaylistcontentss from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcFiles. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcPlaylistcontents[] List of CcPlaylistcontents objects + */ + public function getCcPlaylistcontentssJoinCcBlock($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcPlaylistcontentsQuery::create(null, $criteria); + $query->joinWith('CcBlock', $join_behavior); + + return $this->getCcPlaylistcontentss($query, $con); + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcFiles is new, it will return + * an empty collection; or if this CcFiles has previously + * been saved, it will retrieve related CcPlaylistcontentss from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcFiles. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcPlaylistcontents[] List of CcPlaylistcontents objects + */ + public function getCcPlaylistcontentssJoinCcPlaylist($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcPlaylistcontentsQuery::create(null, $criteria); + $query->joinWith('CcPlaylist', $join_behavior); + + return $this->getCcPlaylistcontentss($query, $con); + } + + /** + * Clears out the collCcBlockcontentss collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcFiles The current object (for fluent API support) + * @see addCcBlockcontentss() + */ + public function clearCcBlockcontentss() + { + $this->collCcBlockcontentss = null; // important to set this to null since that means it is uninitialized + $this->collCcBlockcontentssPartial = null; + + return $this; + } + + /** + * reset is the collCcBlockcontentss collection loaded partially + * + * @return void + */ + public function resetPartialCcBlockcontentss($v = true) + { + $this->collCcBlockcontentssPartial = $v; + } + + /** + * Initializes the collCcBlockcontentss collection. + * + * By default this just sets the collCcBlockcontentss collection to an empty array (like clearcollCcBlockcontentss()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcBlockcontentss($overrideExisting = true) + { + if (null !== $this->collCcBlockcontentss && !$overrideExisting) { + return; + } + $this->collCcBlockcontentss = new PropelObjectCollection(); + $this->collCcBlockcontentss->setModel('CcBlockcontents'); + } + + /** + * Gets an array of CcBlockcontents objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcFiles is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcBlockcontents[] List of CcBlockcontents objects + * @throws PropelException + */ + public function getCcBlockcontentss($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcBlockcontentssPartial && !$this->isNew(); + if (null === $this->collCcBlockcontentss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcBlockcontentss) { + // return empty collection + $this->initCcBlockcontentss(); + } else { + $collCcBlockcontentss = CcBlockcontentsQuery::create(null, $criteria) + ->filterByCcFiles($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcBlockcontentssPartial && count($collCcBlockcontentss)) { + $this->initCcBlockcontentss(false); + + foreach ($collCcBlockcontentss as $obj) { + if (false == $this->collCcBlockcontentss->contains($obj)) { + $this->collCcBlockcontentss->append($obj); + } + } + + $this->collCcBlockcontentssPartial = true; + } + + $collCcBlockcontentss->getInternalIterator()->rewind(); + + return $collCcBlockcontentss; + } + + if ($partial && $this->collCcBlockcontentss) { + foreach ($this->collCcBlockcontentss as $obj) { + if ($obj->isNew()) { + $collCcBlockcontentss[] = $obj; + } + } + } + + $this->collCcBlockcontentss = $collCcBlockcontentss; + $this->collCcBlockcontentssPartial = false; + } + } + + return $this->collCcBlockcontentss; + } + + /** + * Sets a collection of CcBlockcontents objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccBlockcontentss A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcFiles The current object (for fluent API support) + */ + public function setCcBlockcontentss(PropelCollection $ccBlockcontentss, PropelPDO $con = null) + { + $ccBlockcontentssToDelete = $this->getCcBlockcontentss(new Criteria(), $con)->diff($ccBlockcontentss); + + + $this->ccBlockcontentssScheduledForDeletion = $ccBlockcontentssToDelete; + + foreach ($ccBlockcontentssToDelete as $ccBlockcontentsRemoved) { + $ccBlockcontentsRemoved->setCcFiles(null); + } + + $this->collCcBlockcontentss = null; + foreach ($ccBlockcontentss as $ccBlockcontents) { + $this->addCcBlockcontents($ccBlockcontents); + } + + $this->collCcBlockcontentss = $ccBlockcontentss; + $this->collCcBlockcontentssPartial = false; + + return $this; + } + + /** + * Returns the number of related CcBlockcontents objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcBlockcontents objects. + * @throws PropelException + */ + public function countCcBlockcontentss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcBlockcontentssPartial && !$this->isNew(); + if (null === $this->collCcBlockcontentss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcBlockcontentss) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcBlockcontentss()); + } + $query = CcBlockcontentsQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcFiles($this) + ->count($con); + } + + return count($this->collCcBlockcontentss); + } + + /** + * Method called to associate a CcBlockcontents object to this object + * through the CcBlockcontents foreign key attribute. + * + * @param CcBlockcontents $l CcBlockcontents + * @return CcFiles The current object (for fluent API support) + */ + public function addCcBlockcontents(CcBlockcontents $l) + { + if ($this->collCcBlockcontentss === null) { + $this->initCcBlockcontentss(); + $this->collCcBlockcontentssPartial = true; + } + + if (!in_array($l, $this->collCcBlockcontentss->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcBlockcontents($l); + + if ($this->ccBlockcontentssScheduledForDeletion and $this->ccBlockcontentssScheduledForDeletion->contains($l)) { + $this->ccBlockcontentssScheduledForDeletion->remove($this->ccBlockcontentssScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcBlockcontents $ccBlockcontents The ccBlockcontents object to add. + */ + protected function doAddCcBlockcontents($ccBlockcontents) + { + $this->collCcBlockcontentss[]= $ccBlockcontents; + $ccBlockcontents->setCcFiles($this); + } + + /** + * @param CcBlockcontents $ccBlockcontents The ccBlockcontents object to remove. + * @return CcFiles The current object (for fluent API support) + */ + public function removeCcBlockcontents($ccBlockcontents) + { + if ($this->getCcBlockcontentss()->contains($ccBlockcontents)) { + $this->collCcBlockcontentss->remove($this->collCcBlockcontentss->search($ccBlockcontents)); + if (null === $this->ccBlockcontentssScheduledForDeletion) { + $this->ccBlockcontentssScheduledForDeletion = clone $this->collCcBlockcontentss; + $this->ccBlockcontentssScheduledForDeletion->clear(); + } + $this->ccBlockcontentssScheduledForDeletion[]= $ccBlockcontents; + $ccBlockcontents->setCcFiles(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcFiles is new, it will return + * an empty collection; or if this CcFiles has previously + * been saved, it will retrieve related CcBlockcontentss from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcFiles. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcBlockcontents[] List of CcBlockcontents objects + */ + public function getCcBlockcontentssJoinCcBlock($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcBlockcontentsQuery::create(null, $criteria); + $query->joinWith('CcBlock', $join_behavior); + + return $this->getCcBlockcontentss($query, $con); + } + + /** + * Clears out the collCcSchedules collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcFiles The current object (for fluent API support) + * @see addCcSchedules() + */ + public function clearCcSchedules() + { + $this->collCcSchedules = null; // important to set this to null since that means it is uninitialized + $this->collCcSchedulesPartial = null; + + return $this; + } + + /** + * reset is the collCcSchedules collection loaded partially + * + * @return void + */ + public function resetPartialCcSchedules($v = true) + { + $this->collCcSchedulesPartial = $v; + } + + /** + * Initializes the collCcSchedules collection. + * + * By default this just sets the collCcSchedules collection to an empty array (like clearcollCcSchedules()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcSchedules($overrideExisting = true) + { + if (null !== $this->collCcSchedules && !$overrideExisting) { + return; + } + $this->collCcSchedules = new PropelObjectCollection(); + $this->collCcSchedules->setModel('CcSchedule'); + } + + /** + * Gets an array of CcSchedule objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcFiles is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcSchedule[] List of CcSchedule objects + * @throws PropelException + */ + public function getCcSchedules($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcSchedulesPartial && !$this->isNew(); + if (null === $this->collCcSchedules || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcSchedules) { + // return empty collection + $this->initCcSchedules(); + } else { + $collCcSchedules = CcScheduleQuery::create(null, $criteria) + ->filterByCcFiles($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcSchedulesPartial && count($collCcSchedules)) { + $this->initCcSchedules(false); + + foreach ($collCcSchedules as $obj) { + if (false == $this->collCcSchedules->contains($obj)) { + $this->collCcSchedules->append($obj); + } + } + + $this->collCcSchedulesPartial = true; + } + + $collCcSchedules->getInternalIterator()->rewind(); + + return $collCcSchedules; + } + + if ($partial && $this->collCcSchedules) { + foreach ($this->collCcSchedules as $obj) { + if ($obj->isNew()) { + $collCcSchedules[] = $obj; + } + } + } + + $this->collCcSchedules = $collCcSchedules; + $this->collCcSchedulesPartial = false; + } + } + + return $this->collCcSchedules; + } + + /** + * Sets a collection of CcSchedule objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccSchedules A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcFiles The current object (for fluent API support) + */ + public function setCcSchedules(PropelCollection $ccSchedules, PropelPDO $con = null) + { + $ccSchedulesToDelete = $this->getCcSchedules(new Criteria(), $con)->diff($ccSchedules); + + + $this->ccSchedulesScheduledForDeletion = $ccSchedulesToDelete; + + foreach ($ccSchedulesToDelete as $ccScheduleRemoved) { + $ccScheduleRemoved->setCcFiles(null); + } + + $this->collCcSchedules = null; + foreach ($ccSchedules as $ccSchedule) { + $this->addCcSchedule($ccSchedule); + } + + $this->collCcSchedules = $ccSchedules; + $this->collCcSchedulesPartial = false; + + return $this; + } + + /** + * Returns the number of related CcSchedule objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcSchedule objects. + * @throws PropelException + */ + public function countCcSchedules(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcSchedulesPartial && !$this->isNew(); + if (null === $this->collCcSchedules || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcSchedules) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcSchedules()); + } + $query = CcScheduleQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcFiles($this) + ->count($con); + } + + return count($this->collCcSchedules); + } + + /** + * Method called to associate a CcSchedule object to this object + * through the CcSchedule foreign key attribute. + * + * @param CcSchedule $l CcSchedule + * @return CcFiles The current object (for fluent API support) + */ + public function addCcSchedule(CcSchedule $l) + { + if ($this->collCcSchedules === null) { + $this->initCcSchedules(); + $this->collCcSchedulesPartial = true; + } + + if (!in_array($l, $this->collCcSchedules->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcSchedule($l); + + if ($this->ccSchedulesScheduledForDeletion and $this->ccSchedulesScheduledForDeletion->contains($l)) { + $this->ccSchedulesScheduledForDeletion->remove($this->ccSchedulesScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcSchedule $ccSchedule The ccSchedule object to add. + */ + protected function doAddCcSchedule($ccSchedule) + { + $this->collCcSchedules[]= $ccSchedule; + $ccSchedule->setCcFiles($this); + } + + /** + * @param CcSchedule $ccSchedule The ccSchedule object to remove. + * @return CcFiles The current object (for fluent API support) + */ + public function removeCcSchedule($ccSchedule) + { + if ($this->getCcSchedules()->contains($ccSchedule)) { + $this->collCcSchedules->remove($this->collCcSchedules->search($ccSchedule)); + if (null === $this->ccSchedulesScheduledForDeletion) { + $this->ccSchedulesScheduledForDeletion = clone $this->collCcSchedules; + $this->ccSchedulesScheduledForDeletion->clear(); + } + $this->ccSchedulesScheduledForDeletion[]= $ccSchedule; + $ccSchedule->setCcFiles(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcFiles is new, it will return + * an empty collection; or if this CcFiles has previously + * been saved, it will retrieve related CcSchedules from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcFiles. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcSchedule[] List of CcSchedule objects + */ + public function getCcSchedulesJoinCcShowInstances($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcScheduleQuery::create(null, $criteria); + $query->joinWith('CcShowInstances', $join_behavior); + + return $this->getCcSchedules($query, $con); + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcFiles is new, it will return + * an empty collection; or if this CcFiles has previously + * been saved, it will retrieve related CcSchedules from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcFiles. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcSchedule[] List of CcSchedule objects + */ + public function getCcSchedulesJoinCcWebstream($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcScheduleQuery::create(null, $criteria); + $query->joinWith('CcWebstream', $join_behavior); + + return $this->getCcSchedules($query, $con); + } + + /** + * Clears out the collCcPlayoutHistorys collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcFiles The current object (for fluent API support) + * @see addCcPlayoutHistorys() + */ + public function clearCcPlayoutHistorys() + { + $this->collCcPlayoutHistorys = null; // important to set this to null since that means it is uninitialized + $this->collCcPlayoutHistorysPartial = null; + + return $this; + } + + /** + * reset is the collCcPlayoutHistorys collection loaded partially + * + * @return void + */ + public function resetPartialCcPlayoutHistorys($v = true) + { + $this->collCcPlayoutHistorysPartial = $v; + } + + /** + * Initializes the collCcPlayoutHistorys collection. + * + * By default this just sets the collCcPlayoutHistorys collection to an empty array (like clearcollCcPlayoutHistorys()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcPlayoutHistorys($overrideExisting = true) + { + if (null !== $this->collCcPlayoutHistorys && !$overrideExisting) { + return; + } + $this->collCcPlayoutHistorys = new PropelObjectCollection(); + $this->collCcPlayoutHistorys->setModel('CcPlayoutHistory'); + } + + /** + * Gets an array of CcPlayoutHistory objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcFiles is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcPlayoutHistory[] List of CcPlayoutHistory objects + * @throws PropelException + */ + public function getCcPlayoutHistorys($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcPlayoutHistorysPartial && !$this->isNew(); + if (null === $this->collCcPlayoutHistorys || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlayoutHistorys) { + // return empty collection + $this->initCcPlayoutHistorys(); + } else { + $collCcPlayoutHistorys = CcPlayoutHistoryQuery::create(null, $criteria) + ->filterByCcFiles($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcPlayoutHistorysPartial && count($collCcPlayoutHistorys)) { + $this->initCcPlayoutHistorys(false); + + foreach ($collCcPlayoutHistorys as $obj) { + if (false == $this->collCcPlayoutHistorys->contains($obj)) { + $this->collCcPlayoutHistorys->append($obj); + } + } + + $this->collCcPlayoutHistorysPartial = true; + } + + $collCcPlayoutHistorys->getInternalIterator()->rewind(); + + return $collCcPlayoutHistorys; + } + + if ($partial && $this->collCcPlayoutHistorys) { + foreach ($this->collCcPlayoutHistorys as $obj) { + if ($obj->isNew()) { + $collCcPlayoutHistorys[] = $obj; + } + } + } + + $this->collCcPlayoutHistorys = $collCcPlayoutHistorys; + $this->collCcPlayoutHistorysPartial = false; + } + } + + return $this->collCcPlayoutHistorys; + } + + /** + * Sets a collection of CcPlayoutHistory objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccPlayoutHistorys A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcFiles The current object (for fluent API support) + */ + public function setCcPlayoutHistorys(PropelCollection $ccPlayoutHistorys, PropelPDO $con = null) + { + $ccPlayoutHistorysToDelete = $this->getCcPlayoutHistorys(new Criteria(), $con)->diff($ccPlayoutHistorys); + + + $this->ccPlayoutHistorysScheduledForDeletion = $ccPlayoutHistorysToDelete; + + foreach ($ccPlayoutHistorysToDelete as $ccPlayoutHistoryRemoved) { + $ccPlayoutHistoryRemoved->setCcFiles(null); + } + + $this->collCcPlayoutHistorys = null; + foreach ($ccPlayoutHistorys as $ccPlayoutHistory) { + $this->addCcPlayoutHistory($ccPlayoutHistory); + } + + $this->collCcPlayoutHistorys = $ccPlayoutHistorys; + $this->collCcPlayoutHistorysPartial = false; + + return $this; + } + + /** + * Returns the number of related CcPlayoutHistory objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcPlayoutHistory objects. + * @throws PropelException + */ + public function countCcPlayoutHistorys(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcPlayoutHistorysPartial && !$this->isNew(); + if (null === $this->collCcPlayoutHistorys || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlayoutHistorys) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcPlayoutHistorys()); + } + $query = CcPlayoutHistoryQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcFiles($this) + ->count($con); + } + + return count($this->collCcPlayoutHistorys); + } + + /** + * Method called to associate a CcPlayoutHistory object to this object + * through the CcPlayoutHistory foreign key attribute. + * + * @param CcPlayoutHistory $l CcPlayoutHistory + * @return CcFiles The current object (for fluent API support) + */ + public function addCcPlayoutHistory(CcPlayoutHistory $l) + { + if ($this->collCcPlayoutHistorys === null) { + $this->initCcPlayoutHistorys(); + $this->collCcPlayoutHistorysPartial = true; + } + + if (!in_array($l, $this->collCcPlayoutHistorys->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcPlayoutHistory($l); + + if ($this->ccPlayoutHistorysScheduledForDeletion and $this->ccPlayoutHistorysScheduledForDeletion->contains($l)) { + $this->ccPlayoutHistorysScheduledForDeletion->remove($this->ccPlayoutHistorysScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcPlayoutHistory $ccPlayoutHistory The ccPlayoutHistory object to add. + */ + protected function doAddCcPlayoutHistory($ccPlayoutHistory) + { + $this->collCcPlayoutHistorys[]= $ccPlayoutHistory; + $ccPlayoutHistory->setCcFiles($this); + } + + /** + * @param CcPlayoutHistory $ccPlayoutHistory The ccPlayoutHistory object to remove. + * @return CcFiles The current object (for fluent API support) + */ + public function removeCcPlayoutHistory($ccPlayoutHistory) + { + if ($this->getCcPlayoutHistorys()->contains($ccPlayoutHistory)) { + $this->collCcPlayoutHistorys->remove($this->collCcPlayoutHistorys->search($ccPlayoutHistory)); + if (null === $this->ccPlayoutHistorysScheduledForDeletion) { + $this->ccPlayoutHistorysScheduledForDeletion = clone $this->collCcPlayoutHistorys; + $this->ccPlayoutHistorysScheduledForDeletion->clear(); + } + $this->ccPlayoutHistorysScheduledForDeletion[]= $ccPlayoutHistory; + $ccPlayoutHistory->setCcFiles(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcFiles is new, it will return + * an empty collection; or if this CcFiles has previously + * been saved, it will retrieve related CcPlayoutHistorys from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcFiles. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcPlayoutHistory[] List of CcPlayoutHistory objects + */ + public function getCcPlayoutHistorysJoinCcShowInstances($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcPlayoutHistoryQuery::create(null, $criteria); + $query->joinWith('CcShowInstances', $join_behavior); + + return $this->getCcPlayoutHistorys($query, $con); + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->name = null; + $this->mime = null; + $this->ftype = null; + $this->directory = null; + $this->filepath = null; + $this->import_status = null; + $this->currentlyaccessing = null; + $this->editedby = null; + $this->mtime = null; + $this->utime = null; + $this->lptime = null; + $this->md5 = null; + $this->track_title = null; + $this->artist_name = null; + $this->bit_rate = null; + $this->sample_rate = null; + $this->format = null; + $this->length = null; + $this->album_title = null; + $this->genre = null; + $this->comments = null; + $this->year = null; + $this->track_number = null; + $this->channels = null; + $this->url = null; + $this->bpm = null; + $this->rating = null; + $this->encoded_by = null; + $this->disc_number = null; + $this->mood = null; + $this->label = null; + $this->composer = null; + $this->encoder = null; + $this->checksum = null; + $this->lyrics = null; + $this->orchestra = null; + $this->conductor = null; + $this->lyricist = null; + $this->original_lyricist = null; + $this->radio_station_name = null; + $this->info_url = null; + $this->artist_url = null; + $this->audio_source_url = null; + $this->radio_station_url = null; + $this->buy_this_url = null; + $this->isrc_number = null; + $this->catalog_number = null; + $this->original_artist = null; + $this->copyright = null; + $this->report_datetime = null; + $this->report_location = null; + $this->report_organization = null; + $this->subject = null; + $this->contributor = null; + $this->language = null; + $this->file_exists = null; + $this->soundcloud_id = null; + $this->soundcloud_error_code = null; + $this->soundcloud_error_msg = null; + $this->soundcloud_link_to_file = null; + $this->soundcloud_upload_time = null; + $this->replay_gain = null; + $this->owner_id = null; + $this->cuein = null; + $this->cueout = null; + $this->silan_check = null; + $this->hidden = null; + $this->is_scheduled = null; + $this->is_playlist = null; + $this->resource_id = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCcShowInstancess) { + foreach ($this->collCcShowInstancess as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcPlaylistcontentss) { + foreach ($this->collCcPlaylistcontentss as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcBlockcontentss) { + foreach ($this->collCcBlockcontentss as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcSchedules) { + foreach ($this->collCcSchedules as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcPlayoutHistorys) { + foreach ($this->collCcPlayoutHistorys as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->aFkOwner instanceof Persistent) { + $this->aFkOwner->clearAllReferences($deep); + } + if ($this->aCcSubjsRelatedByDbEditedby instanceof Persistent) { + $this->aCcSubjsRelatedByDbEditedby->clearAllReferences($deep); + } + if ($this->aCcMusicDirs instanceof Persistent) { + $this->aCcMusicDirs->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + if ($this->collCcShowInstancess instanceof PropelCollection) { + $this->collCcShowInstancess->clearIterator(); + } + $this->collCcShowInstancess = null; + if ($this->collCcPlaylistcontentss instanceof PropelCollection) { + $this->collCcPlaylistcontentss->clearIterator(); + } + $this->collCcPlaylistcontentss = null; + if ($this->collCcBlockcontentss instanceof PropelCollection) { + $this->collCcBlockcontentss->clearIterator(); + } + $this->collCcBlockcontentss = null; + if ($this->collCcSchedules instanceof PropelCollection) { + $this->collCcSchedules->clearIterator(); + } + $this->collCcSchedules = null; + if ($this->collCcPlayoutHistorys instanceof PropelCollection) { + $this->collCcPlayoutHistorys->clearIterator(); + } + $this->collCcPlayoutHistorys = null; + $this->aFkOwner = null; + $this->aCcSubjsRelatedByDbEditedby = null; + $this->aCcMusicDirs = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcFilesPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php index faa6af5590..f13be0d7fe 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php @@ -4,2003 +4,2039 @@ /** * Base static class for performing query and update operations on the 'cc_files' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcFilesPeer { +abstract class BaseCcFilesPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_files'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcFiles'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcFilesTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 71; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 71; + + /** the column name for the id field */ + const ID = 'cc_files.id'; + + /** the column name for the name field */ + const NAME = 'cc_files.name'; + + /** the column name for the mime field */ + const MIME = 'cc_files.mime'; + + /** the column name for the ftype field */ + const FTYPE = 'cc_files.ftype'; + + /** the column name for the directory field */ + const DIRECTORY = 'cc_files.directory'; + + /** the column name for the filepath field */ + const FILEPATH = 'cc_files.filepath'; + + /** the column name for the import_status field */ + const IMPORT_STATUS = 'cc_files.import_status'; + + /** the column name for the currentlyaccessing field */ + const CURRENTLYACCESSING = 'cc_files.currentlyaccessing'; + + /** the column name for the editedby field */ + const EDITEDBY = 'cc_files.editedby'; + + /** the column name for the mtime field */ + const MTIME = 'cc_files.mtime'; + + /** the column name for the utime field */ + const UTIME = 'cc_files.utime'; + + /** the column name for the lptime field */ + const LPTIME = 'cc_files.lptime'; + + /** the column name for the md5 field */ + const MD5 = 'cc_files.md5'; + + /** the column name for the track_title field */ + const TRACK_TITLE = 'cc_files.track_title'; + + /** the column name for the artist_name field */ + const ARTIST_NAME = 'cc_files.artist_name'; + + /** the column name for the bit_rate field */ + const BIT_RATE = 'cc_files.bit_rate'; + + /** the column name for the sample_rate field */ + const SAMPLE_RATE = 'cc_files.sample_rate'; + + /** the column name for the format field */ + const FORMAT = 'cc_files.format'; + + /** the column name for the length field */ + const LENGTH = 'cc_files.length'; + + /** the column name for the album_title field */ + const ALBUM_TITLE = 'cc_files.album_title'; + + /** the column name for the genre field */ + const GENRE = 'cc_files.genre'; + + /** the column name for the comments field */ + const COMMENTS = 'cc_files.comments'; + + /** the column name for the year field */ + const YEAR = 'cc_files.year'; + + /** the column name for the track_number field */ + const TRACK_NUMBER = 'cc_files.track_number'; + + /** the column name for the channels field */ + const CHANNELS = 'cc_files.channels'; + + /** the column name for the url field */ + const URL = 'cc_files.url'; + + /** the column name for the bpm field */ + const BPM = 'cc_files.bpm'; + + /** the column name for the rating field */ + const RATING = 'cc_files.rating'; + + /** the column name for the encoded_by field */ + const ENCODED_BY = 'cc_files.encoded_by'; + + /** the column name for the disc_number field */ + const DISC_NUMBER = 'cc_files.disc_number'; + + /** the column name for the mood field */ + const MOOD = 'cc_files.mood'; + + /** the column name for the label field */ + const LABEL = 'cc_files.label'; + + /** the column name for the composer field */ + const COMPOSER = 'cc_files.composer'; + + /** the column name for the encoder field */ + const ENCODER = 'cc_files.encoder'; + + /** the column name for the checksum field */ + const CHECKSUM = 'cc_files.checksum'; + + /** the column name for the lyrics field */ + const LYRICS = 'cc_files.lyrics'; + + /** the column name for the orchestra field */ + const ORCHESTRA = 'cc_files.orchestra'; + + /** the column name for the conductor field */ + const CONDUCTOR = 'cc_files.conductor'; + + /** the column name for the lyricist field */ + const LYRICIST = 'cc_files.lyricist'; + + /** the column name for the original_lyricist field */ + const ORIGINAL_LYRICIST = 'cc_files.original_lyricist'; + + /** the column name for the radio_station_name field */ + const RADIO_STATION_NAME = 'cc_files.radio_station_name'; + + /** the column name for the info_url field */ + const INFO_URL = 'cc_files.info_url'; + + /** the column name for the artist_url field */ + const ARTIST_URL = 'cc_files.artist_url'; + + /** the column name for the audio_source_url field */ + const AUDIO_SOURCE_URL = 'cc_files.audio_source_url'; + + /** the column name for the radio_station_url field */ + const RADIO_STATION_URL = 'cc_files.radio_station_url'; + + /** the column name for the buy_this_url field */ + const BUY_THIS_URL = 'cc_files.buy_this_url'; + + /** the column name for the isrc_number field */ + const ISRC_NUMBER = 'cc_files.isrc_number'; + + /** the column name for the catalog_number field */ + const CATALOG_NUMBER = 'cc_files.catalog_number'; + + /** the column name for the original_artist field */ + const ORIGINAL_ARTIST = 'cc_files.original_artist'; + + /** the column name for the copyright field */ + const COPYRIGHT = 'cc_files.copyright'; + + /** the column name for the report_datetime field */ + const REPORT_DATETIME = 'cc_files.report_datetime'; + + /** the column name for the report_location field */ + const REPORT_LOCATION = 'cc_files.report_location'; - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; + /** the column name for the report_organization field */ + const REPORT_ORGANIZATION = 'cc_files.report_organization'; - /** the table name for this class */ - const TABLE_NAME = 'cc_files'; + /** the column name for the subject field */ + const SUBJECT = 'cc_files.subject'; - /** the related Propel class for this table */ - const OM_CLASS = 'CcFiles'; + /** the column name for the contributor field */ + const CONTRIBUTOR = 'cc_files.contributor'; - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcFiles'; + /** the column name for the language field */ + const LANGUAGE = 'cc_files.language'; - /** the related TableMap class for this table */ - const TM_CLASS = 'CcFilesTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 71; + /** the column name for the file_exists field */ + const FILE_EXISTS = 'cc_files.file_exists'; - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; + /** the column name for the soundcloud_id field */ + const SOUNDCLOUD_ID = 'cc_files.soundcloud_id'; - /** the column name for the ID field */ - const ID = 'cc_files.ID'; + /** the column name for the soundcloud_error_code field */ + const SOUNDCLOUD_ERROR_CODE = 'cc_files.soundcloud_error_code'; - /** the column name for the NAME field */ - const NAME = 'cc_files.NAME'; + /** the column name for the soundcloud_error_msg field */ + const SOUNDCLOUD_ERROR_MSG = 'cc_files.soundcloud_error_msg'; - /** the column name for the MIME field */ - const MIME = 'cc_files.MIME'; + /** the column name for the soundcloud_link_to_file field */ + const SOUNDCLOUD_LINK_TO_FILE = 'cc_files.soundcloud_link_to_file'; - /** the column name for the FTYPE field */ - const FTYPE = 'cc_files.FTYPE'; + /** the column name for the soundcloud_upload_time field */ + const SOUNDCLOUD_UPLOAD_TIME = 'cc_files.soundcloud_upload_time'; - /** the column name for the DIRECTORY field */ - const DIRECTORY = 'cc_files.DIRECTORY'; + /** the column name for the replay_gain field */ + const REPLAY_GAIN = 'cc_files.replay_gain'; + + /** the column name for the owner_id field */ + const OWNER_ID = 'cc_files.owner_id'; + + /** the column name for the cuein field */ + const CUEIN = 'cc_files.cuein'; + + /** the column name for the cueout field */ + const CUEOUT = 'cc_files.cueout'; + + /** the column name for the silan_check field */ + const SILAN_CHECK = 'cc_files.silan_check'; + + /** the column name for the hidden field */ + const HIDDEN = 'cc_files.hidden'; + + /** the column name for the is_scheduled field */ + const IS_SCHEDULED = 'cc_files.is_scheduled'; + + /** the column name for the is_playlist field */ + const IS_PLAYLIST = 'cc_files.is_playlist'; + + /** the column name for the resource_id field */ + const RESOURCE_ID = 'cc_files.resource_id'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcFiles objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcFiles[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcFilesPeer::$fieldNames[CcFilesPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbImportStatus', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', 'DbResourceId', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbImportStatus', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', 'dbResourceId', ), + BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID, CcFilesPeer::NAME, CcFilesPeer::MIME, CcFilesPeer::FTYPE, CcFilesPeer::DIRECTORY, CcFilesPeer::FILEPATH, CcFilesPeer::IMPORT_STATUS, CcFilesPeer::CURRENTLYACCESSING, CcFilesPeer::EDITEDBY, CcFilesPeer::MTIME, CcFilesPeer::UTIME, CcFilesPeer::LPTIME, CcFilesPeer::MD5, CcFilesPeer::TRACK_TITLE, CcFilesPeer::ARTIST_NAME, CcFilesPeer::BIT_RATE, CcFilesPeer::SAMPLE_RATE, CcFilesPeer::FORMAT, CcFilesPeer::LENGTH, CcFilesPeer::ALBUM_TITLE, CcFilesPeer::GENRE, CcFilesPeer::COMMENTS, CcFilesPeer::YEAR, CcFilesPeer::TRACK_NUMBER, CcFilesPeer::CHANNELS, CcFilesPeer::URL, CcFilesPeer::BPM, CcFilesPeer::RATING, CcFilesPeer::ENCODED_BY, CcFilesPeer::DISC_NUMBER, CcFilesPeer::MOOD, CcFilesPeer::LABEL, CcFilesPeer::COMPOSER, CcFilesPeer::ENCODER, CcFilesPeer::CHECKSUM, CcFilesPeer::LYRICS, CcFilesPeer::ORCHESTRA, CcFilesPeer::CONDUCTOR, CcFilesPeer::LYRICIST, CcFilesPeer::ORIGINAL_LYRICIST, CcFilesPeer::RADIO_STATION_NAME, CcFilesPeer::INFO_URL, CcFilesPeer::ARTIST_URL, CcFilesPeer::AUDIO_SOURCE_URL, CcFilesPeer::RADIO_STATION_URL, CcFilesPeer::BUY_THIS_URL, CcFilesPeer::ISRC_NUMBER, CcFilesPeer::CATALOG_NUMBER, CcFilesPeer::ORIGINAL_ARTIST, CcFilesPeer::COPYRIGHT, CcFilesPeer::REPORT_DATETIME, CcFilesPeer::REPORT_LOCATION, CcFilesPeer::REPORT_ORGANIZATION, CcFilesPeer::SUBJECT, CcFilesPeer::CONTRIBUTOR, CcFilesPeer::LANGUAGE, CcFilesPeer::FILE_EXISTS, CcFilesPeer::SOUNDCLOUD_ID, CcFilesPeer::SOUNDCLOUD_ERROR_CODE, CcFilesPeer::SOUNDCLOUD_ERROR_MSG, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, CcFilesPeer::REPLAY_GAIN, CcFilesPeer::OWNER_ID, CcFilesPeer::CUEIN, CcFilesPeer::CUEOUT, CcFilesPeer::SILAN_CHECK, CcFilesPeer::HIDDEN, CcFilesPeer::IS_SCHEDULED, CcFilesPeer::IS_PLAYLIST, CcFilesPeer::RESOURCE_ID, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'IMPORT_STATUS', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', 'RESOURCE_ID', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'import_status', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', 'resource_id', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcFilesPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbImportStatus' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, 'DbResourceId' => 70, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbImportStatus' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, 'dbResourceId' => 70, ), + BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID => 0, CcFilesPeer::NAME => 1, CcFilesPeer::MIME => 2, CcFilesPeer::FTYPE => 3, CcFilesPeer::DIRECTORY => 4, CcFilesPeer::FILEPATH => 5, CcFilesPeer::IMPORT_STATUS => 6, CcFilesPeer::CURRENTLYACCESSING => 7, CcFilesPeer::EDITEDBY => 8, CcFilesPeer::MTIME => 9, CcFilesPeer::UTIME => 10, CcFilesPeer::LPTIME => 11, CcFilesPeer::MD5 => 12, CcFilesPeer::TRACK_TITLE => 13, CcFilesPeer::ARTIST_NAME => 14, CcFilesPeer::BIT_RATE => 15, CcFilesPeer::SAMPLE_RATE => 16, CcFilesPeer::FORMAT => 17, CcFilesPeer::LENGTH => 18, CcFilesPeer::ALBUM_TITLE => 19, CcFilesPeer::GENRE => 20, CcFilesPeer::COMMENTS => 21, CcFilesPeer::YEAR => 22, CcFilesPeer::TRACK_NUMBER => 23, CcFilesPeer::CHANNELS => 24, CcFilesPeer::URL => 25, CcFilesPeer::BPM => 26, CcFilesPeer::RATING => 27, CcFilesPeer::ENCODED_BY => 28, CcFilesPeer::DISC_NUMBER => 29, CcFilesPeer::MOOD => 30, CcFilesPeer::LABEL => 31, CcFilesPeer::COMPOSER => 32, CcFilesPeer::ENCODER => 33, CcFilesPeer::CHECKSUM => 34, CcFilesPeer::LYRICS => 35, CcFilesPeer::ORCHESTRA => 36, CcFilesPeer::CONDUCTOR => 37, CcFilesPeer::LYRICIST => 38, CcFilesPeer::ORIGINAL_LYRICIST => 39, CcFilesPeer::RADIO_STATION_NAME => 40, CcFilesPeer::INFO_URL => 41, CcFilesPeer::ARTIST_URL => 42, CcFilesPeer::AUDIO_SOURCE_URL => 43, CcFilesPeer::RADIO_STATION_URL => 44, CcFilesPeer::BUY_THIS_URL => 45, CcFilesPeer::ISRC_NUMBER => 46, CcFilesPeer::CATALOG_NUMBER => 47, CcFilesPeer::ORIGINAL_ARTIST => 48, CcFilesPeer::COPYRIGHT => 49, CcFilesPeer::REPORT_DATETIME => 50, CcFilesPeer::REPORT_LOCATION => 51, CcFilesPeer::REPORT_ORGANIZATION => 52, CcFilesPeer::SUBJECT => 53, CcFilesPeer::CONTRIBUTOR => 54, CcFilesPeer::LANGUAGE => 55, CcFilesPeer::FILE_EXISTS => 56, CcFilesPeer::SOUNDCLOUD_ID => 57, CcFilesPeer::SOUNDCLOUD_ERROR_CODE => 58, CcFilesPeer::SOUNDCLOUD_ERROR_MSG => 59, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE => 60, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME => 61, CcFilesPeer::REPLAY_GAIN => 62, CcFilesPeer::OWNER_ID => 63, CcFilesPeer::CUEIN => 64, CcFilesPeer::CUEOUT => 65, CcFilesPeer::SILAN_CHECK => 66, CcFilesPeer::HIDDEN => 67, CcFilesPeer::IS_SCHEDULED => 68, CcFilesPeer::IS_PLAYLIST => 69, CcFilesPeer::RESOURCE_ID => 70, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'IMPORT_STATUS' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, 'RESOURCE_ID' => 70, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'import_status' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, 'resource_id' => 70, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcFilesPeer::getFieldNames($toType); + $key = isset(CcFilesPeer::$fieldKeys[$fromType][$name]) ? CcFilesPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcFilesPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcFilesPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcFilesPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcFilesPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcFilesPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcFilesPeer::ID); + $criteria->addSelectColumn(CcFilesPeer::NAME); + $criteria->addSelectColumn(CcFilesPeer::MIME); + $criteria->addSelectColumn(CcFilesPeer::FTYPE); + $criteria->addSelectColumn(CcFilesPeer::DIRECTORY); + $criteria->addSelectColumn(CcFilesPeer::FILEPATH); + $criteria->addSelectColumn(CcFilesPeer::IMPORT_STATUS); + $criteria->addSelectColumn(CcFilesPeer::CURRENTLYACCESSING); + $criteria->addSelectColumn(CcFilesPeer::EDITEDBY); + $criteria->addSelectColumn(CcFilesPeer::MTIME); + $criteria->addSelectColumn(CcFilesPeer::UTIME); + $criteria->addSelectColumn(CcFilesPeer::LPTIME); + $criteria->addSelectColumn(CcFilesPeer::MD5); + $criteria->addSelectColumn(CcFilesPeer::TRACK_TITLE); + $criteria->addSelectColumn(CcFilesPeer::ARTIST_NAME); + $criteria->addSelectColumn(CcFilesPeer::BIT_RATE); + $criteria->addSelectColumn(CcFilesPeer::SAMPLE_RATE); + $criteria->addSelectColumn(CcFilesPeer::FORMAT); + $criteria->addSelectColumn(CcFilesPeer::LENGTH); + $criteria->addSelectColumn(CcFilesPeer::ALBUM_TITLE); + $criteria->addSelectColumn(CcFilesPeer::GENRE); + $criteria->addSelectColumn(CcFilesPeer::COMMENTS); + $criteria->addSelectColumn(CcFilesPeer::YEAR); + $criteria->addSelectColumn(CcFilesPeer::TRACK_NUMBER); + $criteria->addSelectColumn(CcFilesPeer::CHANNELS); + $criteria->addSelectColumn(CcFilesPeer::URL); + $criteria->addSelectColumn(CcFilesPeer::BPM); + $criteria->addSelectColumn(CcFilesPeer::RATING); + $criteria->addSelectColumn(CcFilesPeer::ENCODED_BY); + $criteria->addSelectColumn(CcFilesPeer::DISC_NUMBER); + $criteria->addSelectColumn(CcFilesPeer::MOOD); + $criteria->addSelectColumn(CcFilesPeer::LABEL); + $criteria->addSelectColumn(CcFilesPeer::COMPOSER); + $criteria->addSelectColumn(CcFilesPeer::ENCODER); + $criteria->addSelectColumn(CcFilesPeer::CHECKSUM); + $criteria->addSelectColumn(CcFilesPeer::LYRICS); + $criteria->addSelectColumn(CcFilesPeer::ORCHESTRA); + $criteria->addSelectColumn(CcFilesPeer::CONDUCTOR); + $criteria->addSelectColumn(CcFilesPeer::LYRICIST); + $criteria->addSelectColumn(CcFilesPeer::ORIGINAL_LYRICIST); + $criteria->addSelectColumn(CcFilesPeer::RADIO_STATION_NAME); + $criteria->addSelectColumn(CcFilesPeer::INFO_URL); + $criteria->addSelectColumn(CcFilesPeer::ARTIST_URL); + $criteria->addSelectColumn(CcFilesPeer::AUDIO_SOURCE_URL); + $criteria->addSelectColumn(CcFilesPeer::RADIO_STATION_URL); + $criteria->addSelectColumn(CcFilesPeer::BUY_THIS_URL); + $criteria->addSelectColumn(CcFilesPeer::ISRC_NUMBER); + $criteria->addSelectColumn(CcFilesPeer::CATALOG_NUMBER); + $criteria->addSelectColumn(CcFilesPeer::ORIGINAL_ARTIST); + $criteria->addSelectColumn(CcFilesPeer::COPYRIGHT); + $criteria->addSelectColumn(CcFilesPeer::REPORT_DATETIME); + $criteria->addSelectColumn(CcFilesPeer::REPORT_LOCATION); + $criteria->addSelectColumn(CcFilesPeer::REPORT_ORGANIZATION); + $criteria->addSelectColumn(CcFilesPeer::SUBJECT); + $criteria->addSelectColumn(CcFilesPeer::CONTRIBUTOR); + $criteria->addSelectColumn(CcFilesPeer::LANGUAGE); + $criteria->addSelectColumn(CcFilesPeer::FILE_EXISTS); + $criteria->addSelectColumn(CcFilesPeer::SOUNDCLOUD_ID); + $criteria->addSelectColumn(CcFilesPeer::SOUNDCLOUD_ERROR_CODE); + $criteria->addSelectColumn(CcFilesPeer::SOUNDCLOUD_ERROR_MSG); + $criteria->addSelectColumn(CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE); + $criteria->addSelectColumn(CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME); + $criteria->addSelectColumn(CcFilesPeer::REPLAY_GAIN); + $criteria->addSelectColumn(CcFilesPeer::OWNER_ID); + $criteria->addSelectColumn(CcFilesPeer::CUEIN); + $criteria->addSelectColumn(CcFilesPeer::CUEOUT); + $criteria->addSelectColumn(CcFilesPeer::SILAN_CHECK); + $criteria->addSelectColumn(CcFilesPeer::HIDDEN); + $criteria->addSelectColumn(CcFilesPeer::IS_SCHEDULED); + $criteria->addSelectColumn(CcFilesPeer::IS_PLAYLIST); + $criteria->addSelectColumn(CcFilesPeer::RESOURCE_ID); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.name'); + $criteria->addSelectColumn($alias . '.mime'); + $criteria->addSelectColumn($alias . '.ftype'); + $criteria->addSelectColumn($alias . '.directory'); + $criteria->addSelectColumn($alias . '.filepath'); + $criteria->addSelectColumn($alias . '.import_status'); + $criteria->addSelectColumn($alias . '.currentlyaccessing'); + $criteria->addSelectColumn($alias . '.editedby'); + $criteria->addSelectColumn($alias . '.mtime'); + $criteria->addSelectColumn($alias . '.utime'); + $criteria->addSelectColumn($alias . '.lptime'); + $criteria->addSelectColumn($alias . '.md5'); + $criteria->addSelectColumn($alias . '.track_title'); + $criteria->addSelectColumn($alias . '.artist_name'); + $criteria->addSelectColumn($alias . '.bit_rate'); + $criteria->addSelectColumn($alias . '.sample_rate'); + $criteria->addSelectColumn($alias . '.format'); + $criteria->addSelectColumn($alias . '.length'); + $criteria->addSelectColumn($alias . '.album_title'); + $criteria->addSelectColumn($alias . '.genre'); + $criteria->addSelectColumn($alias . '.comments'); + $criteria->addSelectColumn($alias . '.year'); + $criteria->addSelectColumn($alias . '.track_number'); + $criteria->addSelectColumn($alias . '.channels'); + $criteria->addSelectColumn($alias . '.url'); + $criteria->addSelectColumn($alias . '.bpm'); + $criteria->addSelectColumn($alias . '.rating'); + $criteria->addSelectColumn($alias . '.encoded_by'); + $criteria->addSelectColumn($alias . '.disc_number'); + $criteria->addSelectColumn($alias . '.mood'); + $criteria->addSelectColumn($alias . '.label'); + $criteria->addSelectColumn($alias . '.composer'); + $criteria->addSelectColumn($alias . '.encoder'); + $criteria->addSelectColumn($alias . '.checksum'); + $criteria->addSelectColumn($alias . '.lyrics'); + $criteria->addSelectColumn($alias . '.orchestra'); + $criteria->addSelectColumn($alias . '.conductor'); + $criteria->addSelectColumn($alias . '.lyricist'); + $criteria->addSelectColumn($alias . '.original_lyricist'); + $criteria->addSelectColumn($alias . '.radio_station_name'); + $criteria->addSelectColumn($alias . '.info_url'); + $criteria->addSelectColumn($alias . '.artist_url'); + $criteria->addSelectColumn($alias . '.audio_source_url'); + $criteria->addSelectColumn($alias . '.radio_station_url'); + $criteria->addSelectColumn($alias . '.buy_this_url'); + $criteria->addSelectColumn($alias . '.isrc_number'); + $criteria->addSelectColumn($alias . '.catalog_number'); + $criteria->addSelectColumn($alias . '.original_artist'); + $criteria->addSelectColumn($alias . '.copyright'); + $criteria->addSelectColumn($alias . '.report_datetime'); + $criteria->addSelectColumn($alias . '.report_location'); + $criteria->addSelectColumn($alias . '.report_organization'); + $criteria->addSelectColumn($alias . '.subject'); + $criteria->addSelectColumn($alias . '.contributor'); + $criteria->addSelectColumn($alias . '.language'); + $criteria->addSelectColumn($alias . '.file_exists'); + $criteria->addSelectColumn($alias . '.soundcloud_id'); + $criteria->addSelectColumn($alias . '.soundcloud_error_code'); + $criteria->addSelectColumn($alias . '.soundcloud_error_msg'); + $criteria->addSelectColumn($alias . '.soundcloud_link_to_file'); + $criteria->addSelectColumn($alias . '.soundcloud_upload_time'); + $criteria->addSelectColumn($alias . '.replay_gain'); + $criteria->addSelectColumn($alias . '.owner_id'); + $criteria->addSelectColumn($alias . '.cuein'); + $criteria->addSelectColumn($alias . '.cueout'); + $criteria->addSelectColumn($alias . '.silan_check'); + $criteria->addSelectColumn($alias . '.hidden'); + $criteria->addSelectColumn($alias . '.is_scheduled'); + $criteria->addSelectColumn($alias . '.is_playlist'); + $criteria->addSelectColumn($alias . '.resource_id'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcFilesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcFiles + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcFilesPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcFilesPeer::populateObjects(CcFilesPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcFilesPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcFiles $obj A CcFiles object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcFilesPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcFiles object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcFiles) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcFiles object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcFilesPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcFiles Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcFilesPeer::$instances[$key])) { + return CcFilesPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcFilesPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcFilesPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_files + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in CcShowInstancesPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcShowInstancesPeer::clearInstancePool(); + // Invalidate objects in CcPlaylistcontentsPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcPlaylistcontentsPeer::clearInstancePool(); + // Invalidate objects in CcBlockcontentsPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcBlockcontentsPeer::clearInstancePool(); + // Invalidate objects in CcSchedulePeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcSchedulePeer::clearInstancePool(); + // Invalidate objects in CcPlayoutHistoryPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcPlayoutHistoryPeer::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcFilesPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcFilesPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcFilesPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcFiles object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcFilesPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcFilesPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcFilesPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcFilesPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related FkOwner table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinFkOwner(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcFilesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcFilesPeer::OWNER_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcSubjsRelatedByDbEditedby table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcSubjsRelatedByDbEditedby(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcFilesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcFilesPeer::EDITEDBY, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcMusicDirs table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcMusicDirs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); - /** the column name for the FILEPATH field */ - const FILEPATH = 'cc_files.FILEPATH'; + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcFilesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcFiles objects pre-filled with their CcSubjs objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcFiles objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinFkOwner(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + } + + CcFilesPeer::addSelectColumns($criteria); + $startcol = CcFilesPeer::NUM_HYDRATE_COLUMNS; + CcSubjsPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcFilesPeer::OWNER_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcFilesPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcFilesPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcFiles) to $obj2 (CcSubjs) + $obj2->addCcFilesRelatedByDbOwnerId($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcFiles objects pre-filled with their CcSubjs objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcFiles objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcSubjsRelatedByDbEditedby(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + } + + CcFilesPeer::addSelectColumns($criteria); + $startcol = CcFilesPeer::NUM_HYDRATE_COLUMNS; + CcSubjsPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcFilesPeer::EDITEDBY, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcFilesPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcFilesPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcFiles) to $obj2 (CcSubjs) + $obj2->addCcFilesRelatedByDbEditedby($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcFiles objects pre-filled with their CcMusicDirs objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcFiles objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcMusicDirs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; - /** the column name for the IMPORT_STATUS field */ - const IMPORT_STATUS = 'cc_files.IMPORT_STATUS'; + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + } - /** the column name for the CURRENTLYACCESSING field */ - const CURRENTLYACCESSING = 'cc_files.CURRENTLYACCESSING'; + CcFilesPeer::addSelectColumns($criteria); + $startcol = CcFilesPeer::NUM_HYDRATE_COLUMNS; + CcMusicDirsPeer::addSelectColumns($criteria); - /** the column name for the EDITEDBY field */ - const EDITEDBY = 'cc_files.EDITEDBY'; + $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcFilesPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcFilesPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcMusicDirsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcMusicDirsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcMusicDirsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcMusicDirsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded - /** the column name for the MTIME field */ - const MTIME = 'cc_files.MTIME'; + // Add the $obj1 (CcFiles) to $obj2 (CcMusicDirs) + $obj2->addCcFiles($obj1); - /** the column name for the UTIME field */ - const UTIME = 'cc_files.UTIME'; + } // if joined row was not null - /** the column name for the LPTIME field */ - const LPTIME = 'cc_files.LPTIME'; + $results[] = $obj1; + } + $stmt->closeCursor(); - /** the column name for the MD5 field */ - const MD5 = 'cc_files.MD5'; + return $results; + } - /** the column name for the TRACK_TITLE field */ - const TRACK_TITLE = 'cc_files.TRACK_TITLE'; - /** the column name for the ARTIST_NAME field */ - const ARTIST_NAME = 'cc_files.ARTIST_NAME'; + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); - /** the column name for the BIT_RATE field */ - const BIT_RATE = 'cc_files.BIT_RATE'; + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } - /** the column name for the SAMPLE_RATE field */ - const SAMPLE_RATE = 'cc_files.SAMPLE_RATE'; + if (!$criteria->hasSelectClause()) { + CcFilesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - /** the column name for the FORMAT field */ - const FORMAT = 'cc_files.FORMAT'; + // Set the correct dbName + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcFilesPeer::OWNER_ID, CcSubjsPeer::ID, $join_behavior); + + $criteria->addJoin(CcFilesPeer::EDITEDBY, CcSubjsPeer::ID, $join_behavior); - /** the column name for the LENGTH field */ - const LENGTH = 'cc_files.LENGTH'; + $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); - /** the column name for the ALBUM_TITLE field */ - const ALBUM_TITLE = 'cc_files.ALBUM_TITLE'; + $stmt = BasePeer::doCount($criteria, $con); - /** the column name for the GENRE field */ - const GENRE = 'cc_files.GENRE'; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); - /** the column name for the COMMENTS field */ - const COMMENTS = 'cc_files.COMMENTS'; + return $count; + } - /** the column name for the YEAR field */ - const YEAR = 'cc_files.YEAR'; + /** + * Selects a collection of CcFiles objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcFiles objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; - /** the column name for the TRACK_NUMBER field */ - const TRACK_NUMBER = 'cc_files.TRACK_NUMBER'; + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + } - /** the column name for the CHANNELS field */ - const CHANNELS = 'cc_files.CHANNELS'; + CcFilesPeer::addSelectColumns($criteria); + $startcol2 = CcFilesPeer::NUM_HYDRATE_COLUMNS; - /** the column name for the URL field */ - const URL = 'cc_files.URL'; + CcSubjsPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcSubjsPeer::NUM_HYDRATE_COLUMNS; - /** the column name for the BPM field */ - const BPM = 'cc_files.BPM'; + CcSubjsPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcSubjsPeer::NUM_HYDRATE_COLUMNS; - /** the column name for the RATING field */ - const RATING = 'cc_files.RATING'; + CcMusicDirsPeer::addSelectColumns($criteria); + $startcol5 = $startcol4 + CcMusicDirsPeer::NUM_HYDRATE_COLUMNS; - /** the column name for the ENCODED_BY field */ - const ENCODED_BY = 'cc_files.ENCODED_BY'; + $criteria->addJoin(CcFilesPeer::OWNER_ID, CcSubjsPeer::ID, $join_behavior); - /** the column name for the DISC_NUMBER field */ - const DISC_NUMBER = 'cc_files.DISC_NUMBER'; + $criteria->addJoin(CcFilesPeer::EDITEDBY, CcSubjsPeer::ID, $join_behavior); - /** the column name for the MOOD field */ - const MOOD = 'cc_files.MOOD'; + $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcFilesPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcFilesPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded - /** the column name for the LABEL field */ - const LABEL = 'cc_files.LABEL'; + // Add objects for joined CcSubjs rows - /** the column name for the COMPOSER field */ - const COMPOSER = 'cc_files.COMPOSER'; + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { - /** the column name for the ENCODER field */ - const ENCODER = 'cc_files.ENCODER'; + $cls = CcSubjsPeer::getOMClass(); - /** the column name for the CHECKSUM field */ - const CHECKSUM = 'cc_files.CHECKSUM'; + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded - /** the column name for the LYRICS field */ - const LYRICS = 'cc_files.LYRICS'; + // Add the $obj1 (CcFiles) to the collection in $obj2 (CcSubjs) + $obj2->addCcFilesRelatedByDbOwnerId($obj1); + } // if joined row not null - /** the column name for the ORCHESTRA field */ - const ORCHESTRA = 'cc_files.ORCHESTRA'; + // Add objects for joined CcSubjs rows - /** the column name for the CONDUCTOR field */ - const CONDUCTOR = 'cc_files.CONDUCTOR'; + $key3 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcSubjsPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcSubjsPeer::getOMClass(); - /** the column name for the LYRICIST field */ - const LYRICIST = 'cc_files.LYRICIST'; + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcSubjsPeer::addInstanceToPool($obj3, $key3); + } // if obj3 loaded + + // Add the $obj1 (CcFiles) to the collection in $obj3 (CcSubjs) + $obj3->addCcFilesRelatedByDbEditedby($obj1); + } // if joined row not null + + // Add objects for joined CcMusicDirs rows + + $key4 = CcMusicDirsPeer::getPrimaryKeyHashFromRow($row, $startcol4); + if ($key4 !== null) { + $obj4 = CcMusicDirsPeer::getInstanceFromPool($key4); + if (!$obj4) { + + $cls = CcMusicDirsPeer::getOMClass(); + + $obj4 = new $cls(); + $obj4->hydrate($row, $startcol4); + CcMusicDirsPeer::addInstanceToPool($obj4, $key4); + } // if obj4 loaded + + // Add the $obj1 (CcFiles) to the collection in $obj4 (CcMusicDirs) + $obj4->addCcFiles($obj1); + } // if joined row not null - /** the column name for the ORIGINAL_LYRICIST field */ - const ORIGINAL_LYRICIST = 'cc_files.ORIGINAL_LYRICIST'; + $results[] = $obj1; + } + $stmt->closeCursor(); - /** the column name for the RADIO_STATION_NAME field */ - const RADIO_STATION_NAME = 'cc_files.RADIO_STATION_NAME'; + return $results; + } - /** the column name for the INFO_URL field */ - const INFO_URL = 'cc_files.INFO_URL'; - /** the column name for the ARTIST_URL field */ - const ARTIST_URL = 'cc_files.ARTIST_URL'; + /** + * Returns the number of rows matching criteria, joining the related FkOwner table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptFkOwner(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcFilesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); - /** the column name for the AUDIO_SOURCE_URL field */ - const AUDIO_SOURCE_URL = 'cc_files.AUDIO_SOURCE_URL'; + $stmt = BasePeer::doCount($criteria, $con); - /** the column name for the RADIO_STATION_URL field */ - const RADIO_STATION_URL = 'cc_files.RADIO_STATION_URL'; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } - /** the column name for the BUY_THIS_URL field */ - const BUY_THIS_URL = 'cc_files.BUY_THIS_URL'; - /** the column name for the ISRC_NUMBER field */ - const ISRC_NUMBER = 'cc_files.ISRC_NUMBER'; + /** + * Returns the number of rows matching criteria, joining the related CcSubjsRelatedByDbEditedby table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcSubjsRelatedByDbEditedby(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcFilesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcMusicDirs table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcMusicDirs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); - /** the column name for the CATALOG_NUMBER field */ - const CATALOG_NUMBER = 'cc_files.CATALOG_NUMBER'; + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } - /** the column name for the ORIGINAL_ARTIST field */ - const ORIGINAL_ARTIST = 'cc_files.ORIGINAL_ARTIST'; + if (!$criteria->hasSelectClause()) { + CcFilesPeer::addSelectColumns($criteria); + } - /** the column name for the COPYRIGHT field */ - const COPYRIGHT = 'cc_files.COPYRIGHT'; + $criteria->clearOrderByColumns(); // ORDER BY should not affect count - /** the column name for the REPORT_DATETIME field */ - const REPORT_DATETIME = 'cc_files.REPORT_DATETIME'; + // Set the correct dbName + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcFilesPeer::OWNER_ID, CcSubjsPeer::ID, $join_behavior); + + $criteria->addJoin(CcFilesPeer::EDITEDBY, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcFiles objects pre-filled with all related objects except FkOwner. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcFiles objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptFkOwner(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + } + + CcFilesPeer::addSelectColumns($criteria); + $startcol2 = CcFilesPeer::NUM_HYDRATE_COLUMNS; + + CcMusicDirsPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcMusicDirsPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcFilesPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcFilesPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcMusicDirs rows + + $key2 = CcMusicDirsPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcMusicDirsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcMusicDirsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcMusicDirsPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcFiles) to the collection in $obj2 (CcMusicDirs) + $obj2->addCcFiles($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcFiles objects pre-filled with all related objects except CcSubjsRelatedByDbEditedby. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcFiles objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcSubjsRelatedByDbEditedby(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + } + + CcFilesPeer::addSelectColumns($criteria); + $startcol2 = CcFilesPeer::NUM_HYDRATE_COLUMNS; + + CcMusicDirsPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcMusicDirsPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcFilesPeer::getOMClass(); - /** the column name for the REPORT_LOCATION field */ - const REPORT_LOCATION = 'cc_files.REPORT_LOCATION'; + $obj1 = new $cls(); + $obj1->hydrate($row); + CcFilesPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded - /** the column name for the REPORT_ORGANIZATION field */ - const REPORT_ORGANIZATION = 'cc_files.REPORT_ORGANIZATION'; + // Add objects for joined CcMusicDirs rows - /** the column name for the SUBJECT field */ - const SUBJECT = 'cc_files.SUBJECT'; + $key2 = CcMusicDirsPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcMusicDirsPeer::getInstanceFromPool($key2); + if (!$obj2) { - /** the column name for the CONTRIBUTOR field */ - const CONTRIBUTOR = 'cc_files.CONTRIBUTOR'; + $cls = CcMusicDirsPeer::getOMClass(); - /** the column name for the LANGUAGE field */ - const LANGUAGE = 'cc_files.LANGUAGE'; + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcMusicDirsPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded - /** the column name for the FILE_EXISTS field */ - const FILE_EXISTS = 'cc_files.FILE_EXISTS'; + // Add the $obj1 (CcFiles) to the collection in $obj2 (CcMusicDirs) + $obj2->addCcFiles($obj1); - /** the column name for the SOUNDCLOUD_ID field */ - const SOUNDCLOUD_ID = 'cc_files.SOUNDCLOUD_ID'; + } // if joined row is not null - /** the column name for the SOUNDCLOUD_ERROR_CODE field */ - const SOUNDCLOUD_ERROR_CODE = 'cc_files.SOUNDCLOUD_ERROR_CODE'; + $results[] = $obj1; + } + $stmt->closeCursor(); - /** the column name for the SOUNDCLOUD_ERROR_MSG field */ - const SOUNDCLOUD_ERROR_MSG = 'cc_files.SOUNDCLOUD_ERROR_MSG'; + return $results; + } - /** the column name for the SOUNDCLOUD_LINK_TO_FILE field */ - const SOUNDCLOUD_LINK_TO_FILE = 'cc_files.SOUNDCLOUD_LINK_TO_FILE'; - /** the column name for the SOUNDCLOUD_UPLOAD_TIME field */ - const SOUNDCLOUD_UPLOAD_TIME = 'cc_files.SOUNDCLOUD_UPLOAD_TIME'; - - /** the column name for the REPLAY_GAIN field */ - const REPLAY_GAIN = 'cc_files.REPLAY_GAIN'; - - /** the column name for the OWNER_ID field */ - const OWNER_ID = 'cc_files.OWNER_ID'; - - /** the column name for the CUEIN field */ - const CUEIN = 'cc_files.CUEIN'; - - /** the column name for the CUEOUT field */ - const CUEOUT = 'cc_files.CUEOUT'; - - /** the column name for the SILAN_CHECK field */ - const SILAN_CHECK = 'cc_files.SILAN_CHECK'; - - /** the column name for the HIDDEN field */ - const HIDDEN = 'cc_files.HIDDEN'; - - /** the column name for the IS_SCHEDULED field */ - const IS_SCHEDULED = 'cc_files.IS_SCHEDULED'; - - /** the column name for the IS_PLAYLIST field */ - const IS_PLAYLIST = 'cc_files.IS_PLAYLIST'; - - /** the column name for the RESOURCE_ID field */ - const RESOURCE_ID = 'cc_files.RESOURCE_ID'; - - /** - * An identiy map to hold any loaded instances of CcFiles objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcFiles[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbImportStatus', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', 'DbResourceId', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbImportStatus', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', 'dbResourceId', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::NAME, self::MIME, self::FTYPE, self::DIRECTORY, self::FILEPATH, self::IMPORT_STATUS, self::CURRENTLYACCESSING, self::EDITEDBY, self::MTIME, self::UTIME, self::LPTIME, self::MD5, self::TRACK_TITLE, self::ARTIST_NAME, self::BIT_RATE, self::SAMPLE_RATE, self::FORMAT, self::LENGTH, self::ALBUM_TITLE, self::GENRE, self::COMMENTS, self::YEAR, self::TRACK_NUMBER, self::CHANNELS, self::URL, self::BPM, self::RATING, self::ENCODED_BY, self::DISC_NUMBER, self::MOOD, self::LABEL, self::COMPOSER, self::ENCODER, self::CHECKSUM, self::LYRICS, self::ORCHESTRA, self::CONDUCTOR, self::LYRICIST, self::ORIGINAL_LYRICIST, self::RADIO_STATION_NAME, self::INFO_URL, self::ARTIST_URL, self::AUDIO_SOURCE_URL, self::RADIO_STATION_URL, self::BUY_THIS_URL, self::ISRC_NUMBER, self::CATALOG_NUMBER, self::ORIGINAL_ARTIST, self::COPYRIGHT, self::REPORT_DATETIME, self::REPORT_LOCATION, self::REPORT_ORGANIZATION, self::SUBJECT, self::CONTRIBUTOR, self::LANGUAGE, self::FILE_EXISTS, self::SOUNDCLOUD_ID, self::SOUNDCLOUD_ERROR_CODE, self::SOUNDCLOUD_ERROR_MSG, self::SOUNDCLOUD_LINK_TO_FILE, self::SOUNDCLOUD_UPLOAD_TIME, self::REPLAY_GAIN, self::OWNER_ID, self::CUEIN, self::CUEOUT, self::SILAN_CHECK, self::HIDDEN, self::IS_SCHEDULED, self::IS_PLAYLIST, self::RESOURCE_ID, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'IMPORT_STATUS', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', 'RESOURCE_ID', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'import_status', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', 'resource_id', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbImportStatus' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, 'DbResourceId' => 70, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbImportStatus' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, 'dbResourceId' => 70, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::NAME => 1, self::MIME => 2, self::FTYPE => 3, self::DIRECTORY => 4, self::FILEPATH => 5, self::IMPORT_STATUS => 6, self::CURRENTLYACCESSING => 7, self::EDITEDBY => 8, self::MTIME => 9, self::UTIME => 10, self::LPTIME => 11, self::MD5 => 12, self::TRACK_TITLE => 13, self::ARTIST_NAME => 14, self::BIT_RATE => 15, self::SAMPLE_RATE => 16, self::FORMAT => 17, self::LENGTH => 18, self::ALBUM_TITLE => 19, self::GENRE => 20, self::COMMENTS => 21, self::YEAR => 22, self::TRACK_NUMBER => 23, self::CHANNELS => 24, self::URL => 25, self::BPM => 26, self::RATING => 27, self::ENCODED_BY => 28, self::DISC_NUMBER => 29, self::MOOD => 30, self::LABEL => 31, self::COMPOSER => 32, self::ENCODER => 33, self::CHECKSUM => 34, self::LYRICS => 35, self::ORCHESTRA => 36, self::CONDUCTOR => 37, self::LYRICIST => 38, self::ORIGINAL_LYRICIST => 39, self::RADIO_STATION_NAME => 40, self::INFO_URL => 41, self::ARTIST_URL => 42, self::AUDIO_SOURCE_URL => 43, self::RADIO_STATION_URL => 44, self::BUY_THIS_URL => 45, self::ISRC_NUMBER => 46, self::CATALOG_NUMBER => 47, self::ORIGINAL_ARTIST => 48, self::COPYRIGHT => 49, self::REPORT_DATETIME => 50, self::REPORT_LOCATION => 51, self::REPORT_ORGANIZATION => 52, self::SUBJECT => 53, self::CONTRIBUTOR => 54, self::LANGUAGE => 55, self::FILE_EXISTS => 56, self::SOUNDCLOUD_ID => 57, self::SOUNDCLOUD_ERROR_CODE => 58, self::SOUNDCLOUD_ERROR_MSG => 59, self::SOUNDCLOUD_LINK_TO_FILE => 60, self::SOUNDCLOUD_UPLOAD_TIME => 61, self::REPLAY_GAIN => 62, self::OWNER_ID => 63, self::CUEIN => 64, self::CUEOUT => 65, self::SILAN_CHECK => 66, self::HIDDEN => 67, self::IS_SCHEDULED => 68, self::IS_PLAYLIST => 69, self::RESOURCE_ID => 70, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'IMPORT_STATUS' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, 'RESOURCE_ID' => 70, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'import_status' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, 'resource_id' => 70, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcFilesPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcFilesPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcFilesPeer::ID); - $criteria->addSelectColumn(CcFilesPeer::NAME); - $criteria->addSelectColumn(CcFilesPeer::MIME); - $criteria->addSelectColumn(CcFilesPeer::FTYPE); - $criteria->addSelectColumn(CcFilesPeer::DIRECTORY); - $criteria->addSelectColumn(CcFilesPeer::FILEPATH); - $criteria->addSelectColumn(CcFilesPeer::IMPORT_STATUS); - $criteria->addSelectColumn(CcFilesPeer::CURRENTLYACCESSING); - $criteria->addSelectColumn(CcFilesPeer::EDITEDBY); - $criteria->addSelectColumn(CcFilesPeer::MTIME); - $criteria->addSelectColumn(CcFilesPeer::UTIME); - $criteria->addSelectColumn(CcFilesPeer::LPTIME); - $criteria->addSelectColumn(CcFilesPeer::MD5); - $criteria->addSelectColumn(CcFilesPeer::TRACK_TITLE); - $criteria->addSelectColumn(CcFilesPeer::ARTIST_NAME); - $criteria->addSelectColumn(CcFilesPeer::BIT_RATE); - $criteria->addSelectColumn(CcFilesPeer::SAMPLE_RATE); - $criteria->addSelectColumn(CcFilesPeer::FORMAT); - $criteria->addSelectColumn(CcFilesPeer::LENGTH); - $criteria->addSelectColumn(CcFilesPeer::ALBUM_TITLE); - $criteria->addSelectColumn(CcFilesPeer::GENRE); - $criteria->addSelectColumn(CcFilesPeer::COMMENTS); - $criteria->addSelectColumn(CcFilesPeer::YEAR); - $criteria->addSelectColumn(CcFilesPeer::TRACK_NUMBER); - $criteria->addSelectColumn(CcFilesPeer::CHANNELS); - $criteria->addSelectColumn(CcFilesPeer::URL); - $criteria->addSelectColumn(CcFilesPeer::BPM); - $criteria->addSelectColumn(CcFilesPeer::RATING); - $criteria->addSelectColumn(CcFilesPeer::ENCODED_BY); - $criteria->addSelectColumn(CcFilesPeer::DISC_NUMBER); - $criteria->addSelectColumn(CcFilesPeer::MOOD); - $criteria->addSelectColumn(CcFilesPeer::LABEL); - $criteria->addSelectColumn(CcFilesPeer::COMPOSER); - $criteria->addSelectColumn(CcFilesPeer::ENCODER); - $criteria->addSelectColumn(CcFilesPeer::CHECKSUM); - $criteria->addSelectColumn(CcFilesPeer::LYRICS); - $criteria->addSelectColumn(CcFilesPeer::ORCHESTRA); - $criteria->addSelectColumn(CcFilesPeer::CONDUCTOR); - $criteria->addSelectColumn(CcFilesPeer::LYRICIST); - $criteria->addSelectColumn(CcFilesPeer::ORIGINAL_LYRICIST); - $criteria->addSelectColumn(CcFilesPeer::RADIO_STATION_NAME); - $criteria->addSelectColumn(CcFilesPeer::INFO_URL); - $criteria->addSelectColumn(CcFilesPeer::ARTIST_URL); - $criteria->addSelectColumn(CcFilesPeer::AUDIO_SOURCE_URL); - $criteria->addSelectColumn(CcFilesPeer::RADIO_STATION_URL); - $criteria->addSelectColumn(CcFilesPeer::BUY_THIS_URL); - $criteria->addSelectColumn(CcFilesPeer::ISRC_NUMBER); - $criteria->addSelectColumn(CcFilesPeer::CATALOG_NUMBER); - $criteria->addSelectColumn(CcFilesPeer::ORIGINAL_ARTIST); - $criteria->addSelectColumn(CcFilesPeer::COPYRIGHT); - $criteria->addSelectColumn(CcFilesPeer::REPORT_DATETIME); - $criteria->addSelectColumn(CcFilesPeer::REPORT_LOCATION); - $criteria->addSelectColumn(CcFilesPeer::REPORT_ORGANIZATION); - $criteria->addSelectColumn(CcFilesPeer::SUBJECT); - $criteria->addSelectColumn(CcFilesPeer::CONTRIBUTOR); - $criteria->addSelectColumn(CcFilesPeer::LANGUAGE); - $criteria->addSelectColumn(CcFilesPeer::FILE_EXISTS); - $criteria->addSelectColumn(CcFilesPeer::SOUNDCLOUD_ID); - $criteria->addSelectColumn(CcFilesPeer::SOUNDCLOUD_ERROR_CODE); - $criteria->addSelectColumn(CcFilesPeer::SOUNDCLOUD_ERROR_MSG); - $criteria->addSelectColumn(CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE); - $criteria->addSelectColumn(CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME); - $criteria->addSelectColumn(CcFilesPeer::REPLAY_GAIN); - $criteria->addSelectColumn(CcFilesPeer::OWNER_ID); - $criteria->addSelectColumn(CcFilesPeer::CUEIN); - $criteria->addSelectColumn(CcFilesPeer::CUEOUT); - $criteria->addSelectColumn(CcFilesPeer::SILAN_CHECK); - $criteria->addSelectColumn(CcFilesPeer::HIDDEN); - $criteria->addSelectColumn(CcFilesPeer::IS_SCHEDULED); - $criteria->addSelectColumn(CcFilesPeer::IS_PLAYLIST); - $criteria->addSelectColumn(CcFilesPeer::RESOURCE_ID); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.NAME'); - $criteria->addSelectColumn($alias . '.MIME'); - $criteria->addSelectColumn($alias . '.FTYPE'); - $criteria->addSelectColumn($alias . '.DIRECTORY'); - $criteria->addSelectColumn($alias . '.FILEPATH'); - $criteria->addSelectColumn($alias . '.IMPORT_STATUS'); - $criteria->addSelectColumn($alias . '.CURRENTLYACCESSING'); - $criteria->addSelectColumn($alias . '.EDITEDBY'); - $criteria->addSelectColumn($alias . '.MTIME'); - $criteria->addSelectColumn($alias . '.UTIME'); - $criteria->addSelectColumn($alias . '.LPTIME'); - $criteria->addSelectColumn($alias . '.MD5'); - $criteria->addSelectColumn($alias . '.TRACK_TITLE'); - $criteria->addSelectColumn($alias . '.ARTIST_NAME'); - $criteria->addSelectColumn($alias . '.BIT_RATE'); - $criteria->addSelectColumn($alias . '.SAMPLE_RATE'); - $criteria->addSelectColumn($alias . '.FORMAT'); - $criteria->addSelectColumn($alias . '.LENGTH'); - $criteria->addSelectColumn($alias . '.ALBUM_TITLE'); - $criteria->addSelectColumn($alias . '.GENRE'); - $criteria->addSelectColumn($alias . '.COMMENTS'); - $criteria->addSelectColumn($alias . '.YEAR'); - $criteria->addSelectColumn($alias . '.TRACK_NUMBER'); - $criteria->addSelectColumn($alias . '.CHANNELS'); - $criteria->addSelectColumn($alias . '.URL'); - $criteria->addSelectColumn($alias . '.BPM'); - $criteria->addSelectColumn($alias . '.RATING'); - $criteria->addSelectColumn($alias . '.ENCODED_BY'); - $criteria->addSelectColumn($alias . '.DISC_NUMBER'); - $criteria->addSelectColumn($alias . '.MOOD'); - $criteria->addSelectColumn($alias . '.LABEL'); - $criteria->addSelectColumn($alias . '.COMPOSER'); - $criteria->addSelectColumn($alias . '.ENCODER'); - $criteria->addSelectColumn($alias . '.CHECKSUM'); - $criteria->addSelectColumn($alias . '.LYRICS'); - $criteria->addSelectColumn($alias . '.ORCHESTRA'); - $criteria->addSelectColumn($alias . '.CONDUCTOR'); - $criteria->addSelectColumn($alias . '.LYRICIST'); - $criteria->addSelectColumn($alias . '.ORIGINAL_LYRICIST'); - $criteria->addSelectColumn($alias . '.RADIO_STATION_NAME'); - $criteria->addSelectColumn($alias . '.INFO_URL'); - $criteria->addSelectColumn($alias . '.ARTIST_URL'); - $criteria->addSelectColumn($alias . '.AUDIO_SOURCE_URL'); - $criteria->addSelectColumn($alias . '.RADIO_STATION_URL'); - $criteria->addSelectColumn($alias . '.BUY_THIS_URL'); - $criteria->addSelectColumn($alias . '.ISRC_NUMBER'); - $criteria->addSelectColumn($alias . '.CATALOG_NUMBER'); - $criteria->addSelectColumn($alias . '.ORIGINAL_ARTIST'); - $criteria->addSelectColumn($alias . '.COPYRIGHT'); - $criteria->addSelectColumn($alias . '.REPORT_DATETIME'); - $criteria->addSelectColumn($alias . '.REPORT_LOCATION'); - $criteria->addSelectColumn($alias . '.REPORT_ORGANIZATION'); - $criteria->addSelectColumn($alias . '.SUBJECT'); - $criteria->addSelectColumn($alias . '.CONTRIBUTOR'); - $criteria->addSelectColumn($alias . '.LANGUAGE'); - $criteria->addSelectColumn($alias . '.FILE_EXISTS'); - $criteria->addSelectColumn($alias . '.SOUNDCLOUD_ID'); - $criteria->addSelectColumn($alias . '.SOUNDCLOUD_ERROR_CODE'); - $criteria->addSelectColumn($alias . '.SOUNDCLOUD_ERROR_MSG'); - $criteria->addSelectColumn($alias . '.SOUNDCLOUD_LINK_TO_FILE'); - $criteria->addSelectColumn($alias . '.SOUNDCLOUD_UPLOAD_TIME'); - $criteria->addSelectColumn($alias . '.REPLAY_GAIN'); - $criteria->addSelectColumn($alias . '.OWNER_ID'); - $criteria->addSelectColumn($alias . '.CUEIN'); - $criteria->addSelectColumn($alias . '.CUEOUT'); - $criteria->addSelectColumn($alias . '.SILAN_CHECK'); - $criteria->addSelectColumn($alias . '.HIDDEN'); - $criteria->addSelectColumn($alias . '.IS_SCHEDULED'); - $criteria->addSelectColumn($alias . '.IS_PLAYLIST'); - $criteria->addSelectColumn($alias . '.RESOURCE_ID'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcFilesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcFiles - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcFilesPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcFilesPeer::populateObjects(CcFilesPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcFilesPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcFiles $value A CcFiles object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcFiles $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcFiles object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcFiles) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcFiles object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcFiles Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_files - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - // Invalidate objects in CcShowInstancesPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcShowInstancesPeer::clearInstancePool(); - // Invalidate objects in CcPlaylistcontentsPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcPlaylistcontentsPeer::clearInstancePool(); - // Invalidate objects in CcBlockcontentsPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcBlockcontentsPeer::clearInstancePool(); - // Invalidate objects in CcSchedulePeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcSchedulePeer::clearInstancePool(); - // Invalidate objects in CcPlayoutHistoryPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcPlayoutHistoryPeer::clearInstancePool(); - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcFilesPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcFilesPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcFilesPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcFiles object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcFilesPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcFilesPeer::NUM_COLUMNS; - } else { - $cls = CcFilesPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcFilesPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related FkOwner table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinFkOwner(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcFilesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcFilesPeer::OWNER_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcSubjsRelatedByDbEditedby table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcSubjsRelatedByDbEditedby(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcFilesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcFilesPeer::EDITEDBY, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcMusicDirs table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcMusicDirs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcFilesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcFiles objects pre-filled with their CcSubjs objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcFiles objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinFkOwner(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcFilesPeer::addSelectColumns($criteria); - $startcol = (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - CcSubjsPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcFilesPeer::OWNER_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcFilesPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcFilesPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcFiles) to $obj2 (CcSubjs) - $obj2->addCcFilesRelatedByDbOwnerId($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcFiles objects pre-filled with their CcSubjs objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcFiles objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcSubjsRelatedByDbEditedby(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcFilesPeer::addSelectColumns($criteria); - $startcol = (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - CcSubjsPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcFilesPeer::EDITEDBY, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcFilesPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcFilesPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcFiles) to $obj2 (CcSubjs) - $obj2->addCcFilesRelatedByDbEditedby($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcFiles objects pre-filled with their CcMusicDirs objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcFiles objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcMusicDirs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcFilesPeer::addSelectColumns($criteria); - $startcol = (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - CcMusicDirsPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcFilesPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcFilesPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcMusicDirsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcMusicDirsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcMusicDirsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcMusicDirsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcFiles) to $obj2 (CcMusicDirs) - $obj2->addCcFiles($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcFilesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcFilesPeer::OWNER_ID, CcSubjsPeer::ID, $join_behavior); - - $criteria->addJoin(CcFilesPeer::EDITEDBY, CcSubjsPeer::ID, $join_behavior); - - $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcFiles objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcFiles objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcFilesPeer::addSelectColumns($criteria); - $startcol2 = (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcSubjsPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcSubjsPeer::NUM_COLUMNS - CcSubjsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcSubjsPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcSubjsPeer::NUM_COLUMNS - CcSubjsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcMusicDirsPeer::addSelectColumns($criteria); - $startcol5 = $startcol4 + (CcMusicDirsPeer::NUM_COLUMNS - CcMusicDirsPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcFilesPeer::OWNER_ID, CcSubjsPeer::ID, $join_behavior); - - $criteria->addJoin(CcFilesPeer::EDITEDBY, CcSubjsPeer::ID, $join_behavior); - - $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcFilesPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcFilesPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcSubjs rows - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcFiles) to the collection in $obj2 (CcSubjs) - $obj2->addCcFilesRelatedByDbOwnerId($obj1); - } // if joined row not null - - // Add objects for joined CcSubjs rows - - $key3 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcSubjsPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcSubjsPeer::addInstanceToPool($obj3, $key3); - } // if obj3 loaded - - // Add the $obj1 (CcFiles) to the collection in $obj3 (CcSubjs) - $obj3->addCcFilesRelatedByDbEditedby($obj1); - } // if joined row not null - - // Add objects for joined CcMusicDirs rows - - $key4 = CcMusicDirsPeer::getPrimaryKeyHashFromRow($row, $startcol4); - if ($key4 !== null) { - $obj4 = CcMusicDirsPeer::getInstanceFromPool($key4); - if (!$obj4) { - - $cls = CcMusicDirsPeer::getOMClass(false); - - $obj4 = new $cls(); - $obj4->hydrate($row, $startcol4); - CcMusicDirsPeer::addInstanceToPool($obj4, $key4); - } // if obj4 loaded - - // Add the $obj1 (CcFiles) to the collection in $obj4 (CcMusicDirs) - $obj4->addCcFiles($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining the related FkOwner table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptFkOwner(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcFilesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcSubjsRelatedByDbEditedby table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcSubjsRelatedByDbEditedby(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcFilesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcMusicDirs table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcMusicDirs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcFilesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcFilesPeer::OWNER_ID, CcSubjsPeer::ID, $join_behavior); - - $criteria->addJoin(CcFilesPeer::EDITEDBY, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcFiles objects pre-filled with all related objects except FkOwner. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcFiles objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptFkOwner(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcFilesPeer::addSelectColumns($criteria); - $startcol2 = (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcMusicDirsPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcMusicDirsPeer::NUM_COLUMNS - CcMusicDirsPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcFilesPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcFilesPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcMusicDirs rows - - $key2 = CcMusicDirsPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcMusicDirsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcMusicDirsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcMusicDirsPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcFiles) to the collection in $obj2 (CcMusicDirs) - $obj2->addCcFiles($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcFiles objects pre-filled with all related objects except CcSubjsRelatedByDbEditedby. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcFiles objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcSubjsRelatedByDbEditedby(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcFilesPeer::addSelectColumns($criteria); - $startcol2 = (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcMusicDirsPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcMusicDirsPeer::NUM_COLUMNS - CcMusicDirsPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcFilesPeer::DIRECTORY, CcMusicDirsPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcFilesPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcFilesPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcMusicDirs rows - - $key2 = CcMusicDirsPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcMusicDirsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcMusicDirsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcMusicDirsPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcFiles) to the collection in $obj2 (CcMusicDirs) - $obj2->addCcFiles($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcFiles objects pre-filled with all related objects except CcMusicDirs. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcFiles objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcMusicDirs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcFilesPeer::addSelectColumns($criteria); - $startcol2 = (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcSubjsPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcSubjsPeer::NUM_COLUMNS - CcSubjsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcSubjsPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcSubjsPeer::NUM_COLUMNS - CcSubjsPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcFilesPeer::OWNER_ID, CcSubjsPeer::ID, $join_behavior); - - $criteria->addJoin(CcFilesPeer::EDITEDBY, CcSubjsPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcFilesPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcFilesPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcSubjs rows - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcFiles) to the collection in $obj2 (CcSubjs) - $obj2->addCcFilesRelatedByDbOwnerId($obj1); - - } // if joined row is not null - - // Add objects for joined CcSubjs rows - - $key3 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcSubjsPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcSubjsPeer::addInstanceToPool($obj3, $key3); - } // if $obj3 already loaded - - // Add the $obj1 (CcFiles) to the collection in $obj3 (CcSubjs) - $obj3->addCcFilesRelatedByDbEditedby($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcFilesPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcFilesPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcFilesTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcFilesPeer::CLASS_DEFAULT : CcFilesPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcFiles or Criteria object. - * - * @param mixed $values Criteria or CcFiles object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcFiles object - } - - if ($criteria->containsKey(CcFilesPeer::ID) && $criteria->keyContainsValue(CcFilesPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcFilesPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcFiles or Criteria object. - * - * @param mixed $values Criteria or CcFiles object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcFilesPeer::ID); - $value = $criteria->remove(CcFilesPeer::ID); - if ($value) { - $selectCriteria->add(CcFilesPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); - } - - } else { // $values is CcFiles object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_files table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcFilesPeer::TABLE_NAME, $con, CcFilesPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcFilesPeer::clearInstancePool(); - CcFilesPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcFiles or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcFiles object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcFilesPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcFiles) { // it's a model object - // invalidate the cache for this single object - CcFilesPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcFilesPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcFilesPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcFilesPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcFiles object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcFiles $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcFiles $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcFilesPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcFilesPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcFilesPeer::DATABASE_NAME, CcFilesPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcFiles - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcFilesPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcFilesPeer::DATABASE_NAME); - $criteria->add(CcFilesPeer::ID, $pk); - - $v = CcFilesPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcFilesPeer::DATABASE_NAME); - $criteria->add(CcFilesPeer::ID, $pks, Criteria::IN); - $objs = CcFilesPeer::doSelect($criteria, $con); - } - return $objs; - } + /** + * Selects a collection of CcFiles objects pre-filled with all related objects except CcMusicDirs. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcFiles objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcMusicDirs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + } + + CcFilesPeer::addSelectColumns($criteria); + $startcol2 = CcFilesPeer::NUM_HYDRATE_COLUMNS; + + CcSubjsPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcSubjsPeer::NUM_HYDRATE_COLUMNS; + + CcSubjsPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcSubjsPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcFilesPeer::OWNER_ID, CcSubjsPeer::ID, $join_behavior); + + $criteria->addJoin(CcFilesPeer::EDITEDBY, CcSubjsPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcFilesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcFilesPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcFilesPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcFilesPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcSubjs rows + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcFiles) to the collection in $obj2 (CcSubjs) + $obj2->addCcFilesRelatedByDbOwnerId($obj1); + + } // if joined row is not null + + // Add objects for joined CcSubjs rows + + $key3 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcSubjsPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcSubjsPeer::addInstanceToPool($obj3, $key3); + } // if $obj3 already loaded + + // Add the $obj1 (CcFiles) to the collection in $obj3 (CcSubjs) + $obj3->addCcFilesRelatedByDbEditedby($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcFilesPeer::DATABASE_NAME)->getTable(CcFilesPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcFilesPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcFilesPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcFilesTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcFilesPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcFiles or Criteria object. + * + * @param mixed $values Criteria or CcFiles object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcFiles object + } + + if ($criteria->containsKey(CcFilesPeer::ID) && $criteria->keyContainsValue(CcFilesPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcFilesPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcFiles or Criteria object. + * + * @param mixed $values Criteria or CcFiles object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcFilesPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcFilesPeer::ID); + $value = $criteria->remove(CcFilesPeer::ID); + if ($value) { + $selectCriteria->add(CcFilesPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcFilesPeer::TABLE_NAME); + } + + } else { // $values is CcFiles object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_files table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcFilesPeer::TABLE_NAME, $con, CcFilesPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcFilesPeer::clearInstancePool(); + CcFilesPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcFiles or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcFiles object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcFilesPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcFiles) { // it's a model object + // invalidate the cache for this single object + CcFilesPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcFilesPeer::DATABASE_NAME); + $criteria->add(CcFilesPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcFilesPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcFilesPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcFilesPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcFiles object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcFiles $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcFilesPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcFilesPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcFilesPeer::DATABASE_NAME, CcFilesPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcFiles + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcFilesPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcFilesPeer::DATABASE_NAME); + $criteria->add(CcFilesPeer::ID, $pk); + + $v = CcFilesPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcFiles[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcFilesPeer::DATABASE_NAME); + $criteria->add(CcFilesPeer::ID, $pks, Criteria::IN); + $objs = CcFilesPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcFilesPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php index dbac410a4a..648dd4b1de 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php @@ -4,2654 +4,3434 @@ /** * Base class that represents a query for the 'cc_files' table. * - * * - * @method CcFilesQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcFilesQuery orderByDbName($order = Criteria::ASC) Order by the name column - * @method CcFilesQuery orderByDbMime($order = Criteria::ASC) Order by the mime column - * @method CcFilesQuery orderByDbFtype($order = Criteria::ASC) Order by the ftype column - * @method CcFilesQuery orderByDbDirectory($order = Criteria::ASC) Order by the directory column - * @method CcFilesQuery orderByDbFilepath($order = Criteria::ASC) Order by the filepath column - * @method CcFilesQuery orderByDbImportStatus($order = Criteria::ASC) Order by the import_status column - * @method CcFilesQuery orderByDbCurrentlyaccessing($order = Criteria::ASC) Order by the currentlyaccessing column - * @method CcFilesQuery orderByDbEditedby($order = Criteria::ASC) Order by the editedby column - * @method CcFilesQuery orderByDbMtime($order = Criteria::ASC) Order by the mtime column - * @method CcFilesQuery orderByDbUtime($order = Criteria::ASC) Order by the utime column - * @method CcFilesQuery orderByDbLPtime($order = Criteria::ASC) Order by the lptime column - * @method CcFilesQuery orderByDbMd5($order = Criteria::ASC) Order by the md5 column - * @method CcFilesQuery orderByDbTrackTitle($order = Criteria::ASC) Order by the track_title column - * @method CcFilesQuery orderByDbArtistName($order = Criteria::ASC) Order by the artist_name column - * @method CcFilesQuery orderByDbBitRate($order = Criteria::ASC) Order by the bit_rate column - * @method CcFilesQuery orderByDbSampleRate($order = Criteria::ASC) Order by the sample_rate column - * @method CcFilesQuery orderByDbFormat($order = Criteria::ASC) Order by the format column - * @method CcFilesQuery orderByDbLength($order = Criteria::ASC) Order by the length column - * @method CcFilesQuery orderByDbAlbumTitle($order = Criteria::ASC) Order by the album_title column - * @method CcFilesQuery orderByDbGenre($order = Criteria::ASC) Order by the genre column - * @method CcFilesQuery orderByDbComments($order = Criteria::ASC) Order by the comments column - * @method CcFilesQuery orderByDbYear($order = Criteria::ASC) Order by the year column - * @method CcFilesQuery orderByDbTrackNumber($order = Criteria::ASC) Order by the track_number column - * @method CcFilesQuery orderByDbChannels($order = Criteria::ASC) Order by the channels column - * @method CcFilesQuery orderByDbUrl($order = Criteria::ASC) Order by the url column - * @method CcFilesQuery orderByDbBpm($order = Criteria::ASC) Order by the bpm column - * @method CcFilesQuery orderByDbRating($order = Criteria::ASC) Order by the rating column - * @method CcFilesQuery orderByDbEncodedBy($order = Criteria::ASC) Order by the encoded_by column - * @method CcFilesQuery orderByDbDiscNumber($order = Criteria::ASC) Order by the disc_number column - * @method CcFilesQuery orderByDbMood($order = Criteria::ASC) Order by the mood column - * @method CcFilesQuery orderByDbLabel($order = Criteria::ASC) Order by the label column - * @method CcFilesQuery orderByDbComposer($order = Criteria::ASC) Order by the composer column - * @method CcFilesQuery orderByDbEncoder($order = Criteria::ASC) Order by the encoder column - * @method CcFilesQuery orderByDbChecksum($order = Criteria::ASC) Order by the checksum column - * @method CcFilesQuery orderByDbLyrics($order = Criteria::ASC) Order by the lyrics column - * @method CcFilesQuery orderByDbOrchestra($order = Criteria::ASC) Order by the orchestra column - * @method CcFilesQuery orderByDbConductor($order = Criteria::ASC) Order by the conductor column - * @method CcFilesQuery orderByDbLyricist($order = Criteria::ASC) Order by the lyricist column - * @method CcFilesQuery orderByDbOriginalLyricist($order = Criteria::ASC) Order by the original_lyricist column - * @method CcFilesQuery orderByDbRadioStationName($order = Criteria::ASC) Order by the radio_station_name column - * @method CcFilesQuery orderByDbInfoUrl($order = Criteria::ASC) Order by the info_url column - * @method CcFilesQuery orderByDbArtistUrl($order = Criteria::ASC) Order by the artist_url column - * @method CcFilesQuery orderByDbAudioSourceUrl($order = Criteria::ASC) Order by the audio_source_url column - * @method CcFilesQuery orderByDbRadioStationUrl($order = Criteria::ASC) Order by the radio_station_url column - * @method CcFilesQuery orderByDbBuyThisUrl($order = Criteria::ASC) Order by the buy_this_url column - * @method CcFilesQuery orderByDbIsrcNumber($order = Criteria::ASC) Order by the isrc_number column - * @method CcFilesQuery orderByDbCatalogNumber($order = Criteria::ASC) Order by the catalog_number column - * @method CcFilesQuery orderByDbOriginalArtist($order = Criteria::ASC) Order by the original_artist column - * @method CcFilesQuery orderByDbCopyright($order = Criteria::ASC) Order by the copyright column - * @method CcFilesQuery orderByDbReportDatetime($order = Criteria::ASC) Order by the report_datetime column - * @method CcFilesQuery orderByDbReportLocation($order = Criteria::ASC) Order by the report_location column - * @method CcFilesQuery orderByDbReportOrganization($order = Criteria::ASC) Order by the report_organization column - * @method CcFilesQuery orderByDbSubject($order = Criteria::ASC) Order by the subject column - * @method CcFilesQuery orderByDbContributor($order = Criteria::ASC) Order by the contributor column - * @method CcFilesQuery orderByDbLanguage($order = Criteria::ASC) Order by the language column - * @method CcFilesQuery orderByDbFileExists($order = Criteria::ASC) Order by the file_exists column - * @method CcFilesQuery orderByDbSoundcloudId($order = Criteria::ASC) Order by the soundcloud_id column - * @method CcFilesQuery orderByDbSoundcloudErrorCode($order = Criteria::ASC) Order by the soundcloud_error_code column - * @method CcFilesQuery orderByDbSoundcloudErrorMsg($order = Criteria::ASC) Order by the soundcloud_error_msg column - * @method CcFilesQuery orderByDbSoundcloudLinkToFile($order = Criteria::ASC) Order by the soundcloud_link_to_file column - * @method CcFilesQuery orderByDbSoundCloundUploadTime($order = Criteria::ASC) Order by the soundcloud_upload_time column - * @method CcFilesQuery orderByDbReplayGain($order = Criteria::ASC) Order by the replay_gain column - * @method CcFilesQuery orderByDbOwnerId($order = Criteria::ASC) Order by the owner_id column - * @method CcFilesQuery orderByDbCuein($order = Criteria::ASC) Order by the cuein column - * @method CcFilesQuery orderByDbCueout($order = Criteria::ASC) Order by the cueout column - * @method CcFilesQuery orderByDbSilanCheck($order = Criteria::ASC) Order by the silan_check column - * @method CcFilesQuery orderByDbHidden($order = Criteria::ASC) Order by the hidden column - * @method CcFilesQuery orderByDbIsScheduled($order = Criteria::ASC) Order by the is_scheduled column - * @method CcFilesQuery orderByDbIsPlaylist($order = Criteria::ASC) Order by the is_playlist column - * @method CcFilesQuery orderByDbResourceId($order = Criteria::ASC) Order by the resource_id column * - * @method CcFilesQuery groupByDbId() Group by the id column - * @method CcFilesQuery groupByDbName() Group by the name column - * @method CcFilesQuery groupByDbMime() Group by the mime column - * @method CcFilesQuery groupByDbFtype() Group by the ftype column - * @method CcFilesQuery groupByDbDirectory() Group by the directory column - * @method CcFilesQuery groupByDbFilepath() Group by the filepath column - * @method CcFilesQuery groupByDbImportStatus() Group by the import_status column - * @method CcFilesQuery groupByDbCurrentlyaccessing() Group by the currentlyaccessing column - * @method CcFilesQuery groupByDbEditedby() Group by the editedby column - * @method CcFilesQuery groupByDbMtime() Group by the mtime column - * @method CcFilesQuery groupByDbUtime() Group by the utime column - * @method CcFilesQuery groupByDbLPtime() Group by the lptime column - * @method CcFilesQuery groupByDbMd5() Group by the md5 column - * @method CcFilesQuery groupByDbTrackTitle() Group by the track_title column - * @method CcFilesQuery groupByDbArtistName() Group by the artist_name column - * @method CcFilesQuery groupByDbBitRate() Group by the bit_rate column - * @method CcFilesQuery groupByDbSampleRate() Group by the sample_rate column - * @method CcFilesQuery groupByDbFormat() Group by the format column - * @method CcFilesQuery groupByDbLength() Group by the length column - * @method CcFilesQuery groupByDbAlbumTitle() Group by the album_title column - * @method CcFilesQuery groupByDbGenre() Group by the genre column - * @method CcFilesQuery groupByDbComments() Group by the comments column - * @method CcFilesQuery groupByDbYear() Group by the year column - * @method CcFilesQuery groupByDbTrackNumber() Group by the track_number column - * @method CcFilesQuery groupByDbChannels() Group by the channels column - * @method CcFilesQuery groupByDbUrl() Group by the url column - * @method CcFilesQuery groupByDbBpm() Group by the bpm column - * @method CcFilesQuery groupByDbRating() Group by the rating column - * @method CcFilesQuery groupByDbEncodedBy() Group by the encoded_by column - * @method CcFilesQuery groupByDbDiscNumber() Group by the disc_number column - * @method CcFilesQuery groupByDbMood() Group by the mood column - * @method CcFilesQuery groupByDbLabel() Group by the label column - * @method CcFilesQuery groupByDbComposer() Group by the composer column - * @method CcFilesQuery groupByDbEncoder() Group by the encoder column - * @method CcFilesQuery groupByDbChecksum() Group by the checksum column - * @method CcFilesQuery groupByDbLyrics() Group by the lyrics column - * @method CcFilesQuery groupByDbOrchestra() Group by the orchestra column - * @method CcFilesQuery groupByDbConductor() Group by the conductor column - * @method CcFilesQuery groupByDbLyricist() Group by the lyricist column - * @method CcFilesQuery groupByDbOriginalLyricist() Group by the original_lyricist column - * @method CcFilesQuery groupByDbRadioStationName() Group by the radio_station_name column - * @method CcFilesQuery groupByDbInfoUrl() Group by the info_url column - * @method CcFilesQuery groupByDbArtistUrl() Group by the artist_url column - * @method CcFilesQuery groupByDbAudioSourceUrl() Group by the audio_source_url column - * @method CcFilesQuery groupByDbRadioStationUrl() Group by the radio_station_url column - * @method CcFilesQuery groupByDbBuyThisUrl() Group by the buy_this_url column - * @method CcFilesQuery groupByDbIsrcNumber() Group by the isrc_number column - * @method CcFilesQuery groupByDbCatalogNumber() Group by the catalog_number column - * @method CcFilesQuery groupByDbOriginalArtist() Group by the original_artist column - * @method CcFilesQuery groupByDbCopyright() Group by the copyright column - * @method CcFilesQuery groupByDbReportDatetime() Group by the report_datetime column - * @method CcFilesQuery groupByDbReportLocation() Group by the report_location column - * @method CcFilesQuery groupByDbReportOrganization() Group by the report_organization column - * @method CcFilesQuery groupByDbSubject() Group by the subject column - * @method CcFilesQuery groupByDbContributor() Group by the contributor column - * @method CcFilesQuery groupByDbLanguage() Group by the language column - * @method CcFilesQuery groupByDbFileExists() Group by the file_exists column - * @method CcFilesQuery groupByDbSoundcloudId() Group by the soundcloud_id column - * @method CcFilesQuery groupByDbSoundcloudErrorCode() Group by the soundcloud_error_code column - * @method CcFilesQuery groupByDbSoundcloudErrorMsg() Group by the soundcloud_error_msg column - * @method CcFilesQuery groupByDbSoundcloudLinkToFile() Group by the soundcloud_link_to_file column - * @method CcFilesQuery groupByDbSoundCloundUploadTime() Group by the soundcloud_upload_time column - * @method CcFilesQuery groupByDbReplayGain() Group by the replay_gain column - * @method CcFilesQuery groupByDbOwnerId() Group by the owner_id column - * @method CcFilesQuery groupByDbCuein() Group by the cuein column - * @method CcFilesQuery groupByDbCueout() Group by the cueout column - * @method CcFilesQuery groupByDbSilanCheck() Group by the silan_check column - * @method CcFilesQuery groupByDbHidden() Group by the hidden column - * @method CcFilesQuery groupByDbIsScheduled() Group by the is_scheduled column - * @method CcFilesQuery groupByDbIsPlaylist() Group by the is_playlist column - * @method CcFilesQuery groupByDbResourceId() Group by the resource_id column + * @method CcFilesQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcFilesQuery orderByDbName($order = Criteria::ASC) Order by the name column + * @method CcFilesQuery orderByDbMime($order = Criteria::ASC) Order by the mime column + * @method CcFilesQuery orderByDbFtype($order = Criteria::ASC) Order by the ftype column + * @method CcFilesQuery orderByDbDirectory($order = Criteria::ASC) Order by the directory column + * @method CcFilesQuery orderByDbFilepath($order = Criteria::ASC) Order by the filepath column + * @method CcFilesQuery orderByDbImportStatus($order = Criteria::ASC) Order by the import_status column + * @method CcFilesQuery orderByDbCurrentlyaccessing($order = Criteria::ASC) Order by the currentlyaccessing column + * @method CcFilesQuery orderByDbEditedby($order = Criteria::ASC) Order by the editedby column + * @method CcFilesQuery orderByDbMtime($order = Criteria::ASC) Order by the mtime column + * @method CcFilesQuery orderByDbUtime($order = Criteria::ASC) Order by the utime column + * @method CcFilesQuery orderByDbLPtime($order = Criteria::ASC) Order by the lptime column + * @method CcFilesQuery orderByDbMd5($order = Criteria::ASC) Order by the md5 column + * @method CcFilesQuery orderByDbTrackTitle($order = Criteria::ASC) Order by the track_title column + * @method CcFilesQuery orderByDbArtistName($order = Criteria::ASC) Order by the artist_name column + * @method CcFilesQuery orderByDbBitRate($order = Criteria::ASC) Order by the bit_rate column + * @method CcFilesQuery orderByDbSampleRate($order = Criteria::ASC) Order by the sample_rate column + * @method CcFilesQuery orderByDbFormat($order = Criteria::ASC) Order by the format column + * @method CcFilesQuery orderByDbLength($order = Criteria::ASC) Order by the length column + * @method CcFilesQuery orderByDbAlbumTitle($order = Criteria::ASC) Order by the album_title column + * @method CcFilesQuery orderByDbGenre($order = Criteria::ASC) Order by the genre column + * @method CcFilesQuery orderByDbComments($order = Criteria::ASC) Order by the comments column + * @method CcFilesQuery orderByDbYear($order = Criteria::ASC) Order by the year column + * @method CcFilesQuery orderByDbTrackNumber($order = Criteria::ASC) Order by the track_number column + * @method CcFilesQuery orderByDbChannels($order = Criteria::ASC) Order by the channels column + * @method CcFilesQuery orderByDbUrl($order = Criteria::ASC) Order by the url column + * @method CcFilesQuery orderByDbBpm($order = Criteria::ASC) Order by the bpm column + * @method CcFilesQuery orderByDbRating($order = Criteria::ASC) Order by the rating column + * @method CcFilesQuery orderByDbEncodedBy($order = Criteria::ASC) Order by the encoded_by column + * @method CcFilesQuery orderByDbDiscNumber($order = Criteria::ASC) Order by the disc_number column + * @method CcFilesQuery orderByDbMood($order = Criteria::ASC) Order by the mood column + * @method CcFilesQuery orderByDbLabel($order = Criteria::ASC) Order by the label column + * @method CcFilesQuery orderByDbComposer($order = Criteria::ASC) Order by the composer column + * @method CcFilesQuery orderByDbEncoder($order = Criteria::ASC) Order by the encoder column + * @method CcFilesQuery orderByDbChecksum($order = Criteria::ASC) Order by the checksum column + * @method CcFilesQuery orderByDbLyrics($order = Criteria::ASC) Order by the lyrics column + * @method CcFilesQuery orderByDbOrchestra($order = Criteria::ASC) Order by the orchestra column + * @method CcFilesQuery orderByDbConductor($order = Criteria::ASC) Order by the conductor column + * @method CcFilesQuery orderByDbLyricist($order = Criteria::ASC) Order by the lyricist column + * @method CcFilesQuery orderByDbOriginalLyricist($order = Criteria::ASC) Order by the original_lyricist column + * @method CcFilesQuery orderByDbRadioStationName($order = Criteria::ASC) Order by the radio_station_name column + * @method CcFilesQuery orderByDbInfoUrl($order = Criteria::ASC) Order by the info_url column + * @method CcFilesQuery orderByDbArtistUrl($order = Criteria::ASC) Order by the artist_url column + * @method CcFilesQuery orderByDbAudioSourceUrl($order = Criteria::ASC) Order by the audio_source_url column + * @method CcFilesQuery orderByDbRadioStationUrl($order = Criteria::ASC) Order by the radio_station_url column + * @method CcFilesQuery orderByDbBuyThisUrl($order = Criteria::ASC) Order by the buy_this_url column + * @method CcFilesQuery orderByDbIsrcNumber($order = Criteria::ASC) Order by the isrc_number column + * @method CcFilesQuery orderByDbCatalogNumber($order = Criteria::ASC) Order by the catalog_number column + * @method CcFilesQuery orderByDbOriginalArtist($order = Criteria::ASC) Order by the original_artist column + * @method CcFilesQuery orderByDbCopyright($order = Criteria::ASC) Order by the copyright column + * @method CcFilesQuery orderByDbReportDatetime($order = Criteria::ASC) Order by the report_datetime column + * @method CcFilesQuery orderByDbReportLocation($order = Criteria::ASC) Order by the report_location column + * @method CcFilesQuery orderByDbReportOrganization($order = Criteria::ASC) Order by the report_organization column + * @method CcFilesQuery orderByDbSubject($order = Criteria::ASC) Order by the subject column + * @method CcFilesQuery orderByDbContributor($order = Criteria::ASC) Order by the contributor column + * @method CcFilesQuery orderByDbLanguage($order = Criteria::ASC) Order by the language column + * @method CcFilesQuery orderByDbFileExists($order = Criteria::ASC) Order by the file_exists column + * @method CcFilesQuery orderByDbSoundcloudId($order = Criteria::ASC) Order by the soundcloud_id column + * @method CcFilesQuery orderByDbSoundcloudErrorCode($order = Criteria::ASC) Order by the soundcloud_error_code column + * @method CcFilesQuery orderByDbSoundcloudErrorMsg($order = Criteria::ASC) Order by the soundcloud_error_msg column + * @method CcFilesQuery orderByDbSoundcloudLinkToFile($order = Criteria::ASC) Order by the soundcloud_link_to_file column + * @method CcFilesQuery orderByDbSoundCloundUploadTime($order = Criteria::ASC) Order by the soundcloud_upload_time column + * @method CcFilesQuery orderByDbReplayGain($order = Criteria::ASC) Order by the replay_gain column + * @method CcFilesQuery orderByDbOwnerId($order = Criteria::ASC) Order by the owner_id column + * @method CcFilesQuery orderByDbCuein($order = Criteria::ASC) Order by the cuein column + * @method CcFilesQuery orderByDbCueout($order = Criteria::ASC) Order by the cueout column + * @method CcFilesQuery orderByDbSilanCheck($order = Criteria::ASC) Order by the silan_check column + * @method CcFilesQuery orderByDbHidden($order = Criteria::ASC) Order by the hidden column + * @method CcFilesQuery orderByDbIsScheduled($order = Criteria::ASC) Order by the is_scheduled column + * @method CcFilesQuery orderByDbIsPlaylist($order = Criteria::ASC) Order by the is_playlist column + * @method CcFilesQuery orderByDbResourceId($order = Criteria::ASC) Order by the resource_id column * - * @method CcFilesQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcFilesQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcFilesQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcFilesQuery groupByDbId() Group by the id column + * @method CcFilesQuery groupByDbName() Group by the name column + * @method CcFilesQuery groupByDbMime() Group by the mime column + * @method CcFilesQuery groupByDbFtype() Group by the ftype column + * @method CcFilesQuery groupByDbDirectory() Group by the directory column + * @method CcFilesQuery groupByDbFilepath() Group by the filepath column + * @method CcFilesQuery groupByDbImportStatus() Group by the import_status column + * @method CcFilesQuery groupByDbCurrentlyaccessing() Group by the currentlyaccessing column + * @method CcFilesQuery groupByDbEditedby() Group by the editedby column + * @method CcFilesQuery groupByDbMtime() Group by the mtime column + * @method CcFilesQuery groupByDbUtime() Group by the utime column + * @method CcFilesQuery groupByDbLPtime() Group by the lptime column + * @method CcFilesQuery groupByDbMd5() Group by the md5 column + * @method CcFilesQuery groupByDbTrackTitle() Group by the track_title column + * @method CcFilesQuery groupByDbArtistName() Group by the artist_name column + * @method CcFilesQuery groupByDbBitRate() Group by the bit_rate column + * @method CcFilesQuery groupByDbSampleRate() Group by the sample_rate column + * @method CcFilesQuery groupByDbFormat() Group by the format column + * @method CcFilesQuery groupByDbLength() Group by the length column + * @method CcFilesQuery groupByDbAlbumTitle() Group by the album_title column + * @method CcFilesQuery groupByDbGenre() Group by the genre column + * @method CcFilesQuery groupByDbComments() Group by the comments column + * @method CcFilesQuery groupByDbYear() Group by the year column + * @method CcFilesQuery groupByDbTrackNumber() Group by the track_number column + * @method CcFilesQuery groupByDbChannels() Group by the channels column + * @method CcFilesQuery groupByDbUrl() Group by the url column + * @method CcFilesQuery groupByDbBpm() Group by the bpm column + * @method CcFilesQuery groupByDbRating() Group by the rating column + * @method CcFilesQuery groupByDbEncodedBy() Group by the encoded_by column + * @method CcFilesQuery groupByDbDiscNumber() Group by the disc_number column + * @method CcFilesQuery groupByDbMood() Group by the mood column + * @method CcFilesQuery groupByDbLabel() Group by the label column + * @method CcFilesQuery groupByDbComposer() Group by the composer column + * @method CcFilesQuery groupByDbEncoder() Group by the encoder column + * @method CcFilesQuery groupByDbChecksum() Group by the checksum column + * @method CcFilesQuery groupByDbLyrics() Group by the lyrics column + * @method CcFilesQuery groupByDbOrchestra() Group by the orchestra column + * @method CcFilesQuery groupByDbConductor() Group by the conductor column + * @method CcFilesQuery groupByDbLyricist() Group by the lyricist column + * @method CcFilesQuery groupByDbOriginalLyricist() Group by the original_lyricist column + * @method CcFilesQuery groupByDbRadioStationName() Group by the radio_station_name column + * @method CcFilesQuery groupByDbInfoUrl() Group by the info_url column + * @method CcFilesQuery groupByDbArtistUrl() Group by the artist_url column + * @method CcFilesQuery groupByDbAudioSourceUrl() Group by the audio_source_url column + * @method CcFilesQuery groupByDbRadioStationUrl() Group by the radio_station_url column + * @method CcFilesQuery groupByDbBuyThisUrl() Group by the buy_this_url column + * @method CcFilesQuery groupByDbIsrcNumber() Group by the isrc_number column + * @method CcFilesQuery groupByDbCatalogNumber() Group by the catalog_number column + * @method CcFilesQuery groupByDbOriginalArtist() Group by the original_artist column + * @method CcFilesQuery groupByDbCopyright() Group by the copyright column + * @method CcFilesQuery groupByDbReportDatetime() Group by the report_datetime column + * @method CcFilesQuery groupByDbReportLocation() Group by the report_location column + * @method CcFilesQuery groupByDbReportOrganization() Group by the report_organization column + * @method CcFilesQuery groupByDbSubject() Group by the subject column + * @method CcFilesQuery groupByDbContributor() Group by the contributor column + * @method CcFilesQuery groupByDbLanguage() Group by the language column + * @method CcFilesQuery groupByDbFileExists() Group by the file_exists column + * @method CcFilesQuery groupByDbSoundcloudId() Group by the soundcloud_id column + * @method CcFilesQuery groupByDbSoundcloudErrorCode() Group by the soundcloud_error_code column + * @method CcFilesQuery groupByDbSoundcloudErrorMsg() Group by the soundcloud_error_msg column + * @method CcFilesQuery groupByDbSoundcloudLinkToFile() Group by the soundcloud_link_to_file column + * @method CcFilesQuery groupByDbSoundCloundUploadTime() Group by the soundcloud_upload_time column + * @method CcFilesQuery groupByDbReplayGain() Group by the replay_gain column + * @method CcFilesQuery groupByDbOwnerId() Group by the owner_id column + * @method CcFilesQuery groupByDbCuein() Group by the cuein column + * @method CcFilesQuery groupByDbCueout() Group by the cueout column + * @method CcFilesQuery groupByDbSilanCheck() Group by the silan_check column + * @method CcFilesQuery groupByDbHidden() Group by the hidden column + * @method CcFilesQuery groupByDbIsScheduled() Group by the is_scheduled column + * @method CcFilesQuery groupByDbIsPlaylist() Group by the is_playlist column + * @method CcFilesQuery groupByDbResourceId() Group by the resource_id column * - * @method CcFilesQuery leftJoinFkOwner($relationAlias = '') Adds a LEFT JOIN clause to the query using the FkOwner relation - * @method CcFilesQuery rightJoinFkOwner($relationAlias = '') Adds a RIGHT JOIN clause to the query using the FkOwner relation - * @method CcFilesQuery innerJoinFkOwner($relationAlias = '') Adds a INNER JOIN clause to the query using the FkOwner relation + * @method CcFilesQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcFilesQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcFilesQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcFilesQuery leftJoinCcSubjsRelatedByDbEditedby($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSubjsRelatedByDbEditedby relation - * @method CcFilesQuery rightJoinCcSubjsRelatedByDbEditedby($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSubjsRelatedByDbEditedby relation - * @method CcFilesQuery innerJoinCcSubjsRelatedByDbEditedby($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSubjsRelatedByDbEditedby relation + * @method CcFilesQuery leftJoinFkOwner($relationAlias = null) Adds a LEFT JOIN clause to the query using the FkOwner relation + * @method CcFilesQuery rightJoinFkOwner($relationAlias = null) Adds a RIGHT JOIN clause to the query using the FkOwner relation + * @method CcFilesQuery innerJoinFkOwner($relationAlias = null) Adds a INNER JOIN clause to the query using the FkOwner relation * - * @method CcFilesQuery leftJoinCcMusicDirs($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcMusicDirs relation - * @method CcFilesQuery rightJoinCcMusicDirs($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcMusicDirs relation - * @method CcFilesQuery innerJoinCcMusicDirs($relationAlias = '') Adds a INNER JOIN clause to the query using the CcMusicDirs relation + * @method CcFilesQuery leftJoinCcSubjsRelatedByDbEditedby($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSubjsRelatedByDbEditedby relation + * @method CcFilesQuery rightJoinCcSubjsRelatedByDbEditedby($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSubjsRelatedByDbEditedby relation + * @method CcFilesQuery innerJoinCcSubjsRelatedByDbEditedby($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSubjsRelatedByDbEditedby relation * - * @method CcFilesQuery leftJoinCcShowInstances($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShowInstances relation - * @method CcFilesQuery rightJoinCcShowInstances($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShowInstances relation - * @method CcFilesQuery innerJoinCcShowInstances($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShowInstances relation + * @method CcFilesQuery leftJoinCcMusicDirs($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcMusicDirs relation + * @method CcFilesQuery rightJoinCcMusicDirs($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcMusicDirs relation + * @method CcFilesQuery innerJoinCcMusicDirs($relationAlias = null) Adds a INNER JOIN clause to the query using the CcMusicDirs relation * - * @method CcFilesQuery leftJoinCcPlaylistcontents($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcPlaylistcontents relation - * @method CcFilesQuery rightJoinCcPlaylistcontents($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcPlaylistcontents relation - * @method CcFilesQuery innerJoinCcPlaylistcontents($relationAlias = '') Adds a INNER JOIN clause to the query using the CcPlaylistcontents relation + * @method CcFilesQuery leftJoinCcShowInstances($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShowInstances relation + * @method CcFilesQuery rightJoinCcShowInstances($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShowInstances relation + * @method CcFilesQuery innerJoinCcShowInstances($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShowInstances relation * - * @method CcFilesQuery leftJoinCcBlockcontents($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcBlockcontents relation - * @method CcFilesQuery rightJoinCcBlockcontents($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcBlockcontents relation - * @method CcFilesQuery innerJoinCcBlockcontents($relationAlias = '') Adds a INNER JOIN clause to the query using the CcBlockcontents relation + * @method CcFilesQuery leftJoinCcPlaylistcontents($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPlaylistcontents relation + * @method CcFilesQuery rightJoinCcPlaylistcontents($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlaylistcontents relation + * @method CcFilesQuery innerJoinCcPlaylistcontents($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlaylistcontents relation * - * @method CcFilesQuery leftJoinCcSchedule($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSchedule relation - * @method CcFilesQuery rightJoinCcSchedule($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSchedule relation - * @method CcFilesQuery innerJoinCcSchedule($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSchedule relation + * @method CcFilesQuery leftJoinCcBlockcontents($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcBlockcontents relation + * @method CcFilesQuery rightJoinCcBlockcontents($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcBlockcontents relation + * @method CcFilesQuery innerJoinCcBlockcontents($relationAlias = null) Adds a INNER JOIN clause to the query using the CcBlockcontents relation * - * @method CcFilesQuery leftJoinCcPlayoutHistory($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcPlayoutHistory relation - * @method CcFilesQuery rightJoinCcPlayoutHistory($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcPlayoutHistory relation - * @method CcFilesQuery innerJoinCcPlayoutHistory($relationAlias = '') Adds a INNER JOIN clause to the query using the CcPlayoutHistory relation + * @method CcFilesQuery leftJoinCcSchedule($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSchedule relation + * @method CcFilesQuery rightJoinCcSchedule($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSchedule relation + * @method CcFilesQuery innerJoinCcSchedule($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSchedule relation * - * @method CcFiles findOne(PropelPDO $con = null) Return the first CcFiles matching the query - * @method CcFiles findOneOrCreate(PropelPDO $con = null) Return the first CcFiles matching the query, or a new CcFiles object populated from the query conditions when no match is found + * @method CcFilesQuery leftJoinCcPlayoutHistory($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPlayoutHistory relation + * @method CcFilesQuery rightJoinCcPlayoutHistory($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlayoutHistory relation + * @method CcFilesQuery innerJoinCcPlayoutHistory($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlayoutHistory relation * - * @method CcFiles findOneByDbId(int $id) Return the first CcFiles filtered by the id column - * @method CcFiles findOneByDbName(string $name) Return the first CcFiles filtered by the name column - * @method CcFiles findOneByDbMime(string $mime) Return the first CcFiles filtered by the mime column - * @method CcFiles findOneByDbFtype(string $ftype) Return the first CcFiles filtered by the ftype column - * @method CcFiles findOneByDbDirectory(int $directory) Return the first CcFiles filtered by the directory column - * @method CcFiles findOneByDbFilepath(string $filepath) Return the first CcFiles filtered by the filepath column - * @method CcFiles findOneByDbImportStatus(int $import_status) Return the first CcFiles filtered by the import_status column - * @method CcFiles findOneByDbCurrentlyaccessing(int $currentlyaccessing) Return the first CcFiles filtered by the currentlyaccessing column - * @method CcFiles findOneByDbEditedby(int $editedby) Return the first CcFiles filtered by the editedby column - * @method CcFiles findOneByDbMtime(string $mtime) Return the first CcFiles filtered by the mtime column - * @method CcFiles findOneByDbUtime(string $utime) Return the first CcFiles filtered by the utime column - * @method CcFiles findOneByDbLPtime(string $lptime) Return the first CcFiles filtered by the lptime column - * @method CcFiles findOneByDbMd5(string $md5) Return the first CcFiles filtered by the md5 column - * @method CcFiles findOneByDbTrackTitle(string $track_title) Return the first CcFiles filtered by the track_title column - * @method CcFiles findOneByDbArtistName(string $artist_name) Return the first CcFiles filtered by the artist_name column - * @method CcFiles findOneByDbBitRate(int $bit_rate) Return the first CcFiles filtered by the bit_rate column - * @method CcFiles findOneByDbSampleRate(int $sample_rate) Return the first CcFiles filtered by the sample_rate column - * @method CcFiles findOneByDbFormat(string $format) Return the first CcFiles filtered by the format column - * @method CcFiles findOneByDbLength(string $length) Return the first CcFiles filtered by the length column - * @method CcFiles findOneByDbAlbumTitle(string $album_title) Return the first CcFiles filtered by the album_title column - * @method CcFiles findOneByDbGenre(string $genre) Return the first CcFiles filtered by the genre column - * @method CcFiles findOneByDbComments(string $comments) Return the first CcFiles filtered by the comments column - * @method CcFiles findOneByDbYear(string $year) Return the first CcFiles filtered by the year column - * @method CcFiles findOneByDbTrackNumber(int $track_number) Return the first CcFiles filtered by the track_number column - * @method CcFiles findOneByDbChannels(int $channels) Return the first CcFiles filtered by the channels column - * @method CcFiles findOneByDbUrl(string $url) Return the first CcFiles filtered by the url column - * @method CcFiles findOneByDbBpm(int $bpm) Return the first CcFiles filtered by the bpm column - * @method CcFiles findOneByDbRating(string $rating) Return the first CcFiles filtered by the rating column - * @method CcFiles findOneByDbEncodedBy(string $encoded_by) Return the first CcFiles filtered by the encoded_by column - * @method CcFiles findOneByDbDiscNumber(string $disc_number) Return the first CcFiles filtered by the disc_number column - * @method CcFiles findOneByDbMood(string $mood) Return the first CcFiles filtered by the mood column - * @method CcFiles findOneByDbLabel(string $label) Return the first CcFiles filtered by the label column - * @method CcFiles findOneByDbComposer(string $composer) Return the first CcFiles filtered by the composer column - * @method CcFiles findOneByDbEncoder(string $encoder) Return the first CcFiles filtered by the encoder column - * @method CcFiles findOneByDbChecksum(string $checksum) Return the first CcFiles filtered by the checksum column - * @method CcFiles findOneByDbLyrics(string $lyrics) Return the first CcFiles filtered by the lyrics column - * @method CcFiles findOneByDbOrchestra(string $orchestra) Return the first CcFiles filtered by the orchestra column - * @method CcFiles findOneByDbConductor(string $conductor) Return the first CcFiles filtered by the conductor column - * @method CcFiles findOneByDbLyricist(string $lyricist) Return the first CcFiles filtered by the lyricist column - * @method CcFiles findOneByDbOriginalLyricist(string $original_lyricist) Return the first CcFiles filtered by the original_lyricist column - * @method CcFiles findOneByDbRadioStationName(string $radio_station_name) Return the first CcFiles filtered by the radio_station_name column - * @method CcFiles findOneByDbInfoUrl(string $info_url) Return the first CcFiles filtered by the info_url column - * @method CcFiles findOneByDbArtistUrl(string $artist_url) Return the first CcFiles filtered by the artist_url column - * @method CcFiles findOneByDbAudioSourceUrl(string $audio_source_url) Return the first CcFiles filtered by the audio_source_url column - * @method CcFiles findOneByDbRadioStationUrl(string $radio_station_url) Return the first CcFiles filtered by the radio_station_url column - * @method CcFiles findOneByDbBuyThisUrl(string $buy_this_url) Return the first CcFiles filtered by the buy_this_url column - * @method CcFiles findOneByDbIsrcNumber(string $isrc_number) Return the first CcFiles filtered by the isrc_number column - * @method CcFiles findOneByDbCatalogNumber(string $catalog_number) Return the first CcFiles filtered by the catalog_number column - * @method CcFiles findOneByDbOriginalArtist(string $original_artist) Return the first CcFiles filtered by the original_artist column - * @method CcFiles findOneByDbCopyright(string $copyright) Return the first CcFiles filtered by the copyright column - * @method CcFiles findOneByDbReportDatetime(string $report_datetime) Return the first CcFiles filtered by the report_datetime column - * @method CcFiles findOneByDbReportLocation(string $report_location) Return the first CcFiles filtered by the report_location column - * @method CcFiles findOneByDbReportOrganization(string $report_organization) Return the first CcFiles filtered by the report_organization column - * @method CcFiles findOneByDbSubject(string $subject) Return the first CcFiles filtered by the subject column - * @method CcFiles findOneByDbContributor(string $contributor) Return the first CcFiles filtered by the contributor column - * @method CcFiles findOneByDbLanguage(string $language) Return the first CcFiles filtered by the language column - * @method CcFiles findOneByDbFileExists(boolean $file_exists) Return the first CcFiles filtered by the file_exists column - * @method CcFiles findOneByDbSoundcloudId(int $soundcloud_id) Return the first CcFiles filtered by the soundcloud_id column - * @method CcFiles findOneByDbSoundcloudErrorCode(int $soundcloud_error_code) Return the first CcFiles filtered by the soundcloud_error_code column - * @method CcFiles findOneByDbSoundcloudErrorMsg(string $soundcloud_error_msg) Return the first CcFiles filtered by the soundcloud_error_msg column - * @method CcFiles findOneByDbSoundcloudLinkToFile(string $soundcloud_link_to_file) Return the first CcFiles filtered by the soundcloud_link_to_file column - * @method CcFiles findOneByDbSoundCloundUploadTime(string $soundcloud_upload_time) Return the first CcFiles filtered by the soundcloud_upload_time column - * @method CcFiles findOneByDbReplayGain(string $replay_gain) Return the first CcFiles filtered by the replay_gain column - * @method CcFiles findOneByDbOwnerId(int $owner_id) Return the first CcFiles filtered by the owner_id column - * @method CcFiles findOneByDbCuein(string $cuein) Return the first CcFiles filtered by the cuein column - * @method CcFiles findOneByDbCueout(string $cueout) Return the first CcFiles filtered by the cueout column - * @method CcFiles findOneByDbSilanCheck(boolean $silan_check) Return the first CcFiles filtered by the silan_check column - * @method CcFiles findOneByDbHidden(boolean $hidden) Return the first CcFiles filtered by the hidden column - * @method CcFiles findOneByDbIsScheduled(boolean $is_scheduled) Return the first CcFiles filtered by the is_scheduled column - * @method CcFiles findOneByDbIsPlaylist(boolean $is_playlist) Return the first CcFiles filtered by the is_playlist column - * @method CcFiles findOneByDbResourceId(string $resource_id) Return the first CcFiles filtered by the resource_id column + * @method CcFiles findOne(PropelPDO $con = null) Return the first CcFiles matching the query + * @method CcFiles findOneOrCreate(PropelPDO $con = null) Return the first CcFiles matching the query, or a new CcFiles object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcFiles objects filtered by the id column - * @method array findByDbName(string $name) Return CcFiles objects filtered by the name column - * @method array findByDbMime(string $mime) Return CcFiles objects filtered by the mime column - * @method array findByDbFtype(string $ftype) Return CcFiles objects filtered by the ftype column - * @method array findByDbDirectory(int $directory) Return CcFiles objects filtered by the directory column - * @method array findByDbFilepath(string $filepath) Return CcFiles objects filtered by the filepath column - * @method array findByDbImportStatus(int $import_status) Return CcFiles objects filtered by the import_status column - * @method array findByDbCurrentlyaccessing(int $currentlyaccessing) Return CcFiles objects filtered by the currentlyaccessing column - * @method array findByDbEditedby(int $editedby) Return CcFiles objects filtered by the editedby column - * @method array findByDbMtime(string $mtime) Return CcFiles objects filtered by the mtime column - * @method array findByDbUtime(string $utime) Return CcFiles objects filtered by the utime column - * @method array findByDbLPtime(string $lptime) Return CcFiles objects filtered by the lptime column - * @method array findByDbMd5(string $md5) Return CcFiles objects filtered by the md5 column - * @method array findByDbTrackTitle(string $track_title) Return CcFiles objects filtered by the track_title column - * @method array findByDbArtistName(string $artist_name) Return CcFiles objects filtered by the artist_name column - * @method array findByDbBitRate(int $bit_rate) Return CcFiles objects filtered by the bit_rate column - * @method array findByDbSampleRate(int $sample_rate) Return CcFiles objects filtered by the sample_rate column - * @method array findByDbFormat(string $format) Return CcFiles objects filtered by the format column - * @method array findByDbLength(string $length) Return CcFiles objects filtered by the length column - * @method array findByDbAlbumTitle(string $album_title) Return CcFiles objects filtered by the album_title column - * @method array findByDbGenre(string $genre) Return CcFiles objects filtered by the genre column - * @method array findByDbComments(string $comments) Return CcFiles objects filtered by the comments column - * @method array findByDbYear(string $year) Return CcFiles objects filtered by the year column - * @method array findByDbTrackNumber(int $track_number) Return CcFiles objects filtered by the track_number column - * @method array findByDbChannels(int $channels) Return CcFiles objects filtered by the channels column - * @method array findByDbUrl(string $url) Return CcFiles objects filtered by the url column - * @method array findByDbBpm(int $bpm) Return CcFiles objects filtered by the bpm column - * @method array findByDbRating(string $rating) Return CcFiles objects filtered by the rating column - * @method array findByDbEncodedBy(string $encoded_by) Return CcFiles objects filtered by the encoded_by column - * @method array findByDbDiscNumber(string $disc_number) Return CcFiles objects filtered by the disc_number column - * @method array findByDbMood(string $mood) Return CcFiles objects filtered by the mood column - * @method array findByDbLabel(string $label) Return CcFiles objects filtered by the label column - * @method array findByDbComposer(string $composer) Return CcFiles objects filtered by the composer column - * @method array findByDbEncoder(string $encoder) Return CcFiles objects filtered by the encoder column - * @method array findByDbChecksum(string $checksum) Return CcFiles objects filtered by the checksum column - * @method array findByDbLyrics(string $lyrics) Return CcFiles objects filtered by the lyrics column - * @method array findByDbOrchestra(string $orchestra) Return CcFiles objects filtered by the orchestra column - * @method array findByDbConductor(string $conductor) Return CcFiles objects filtered by the conductor column - * @method array findByDbLyricist(string $lyricist) Return CcFiles objects filtered by the lyricist column - * @method array findByDbOriginalLyricist(string $original_lyricist) Return CcFiles objects filtered by the original_lyricist column - * @method array findByDbRadioStationName(string $radio_station_name) Return CcFiles objects filtered by the radio_station_name column - * @method array findByDbInfoUrl(string $info_url) Return CcFiles objects filtered by the info_url column - * @method array findByDbArtistUrl(string $artist_url) Return CcFiles objects filtered by the artist_url column - * @method array findByDbAudioSourceUrl(string $audio_source_url) Return CcFiles objects filtered by the audio_source_url column - * @method array findByDbRadioStationUrl(string $radio_station_url) Return CcFiles objects filtered by the radio_station_url column - * @method array findByDbBuyThisUrl(string $buy_this_url) Return CcFiles objects filtered by the buy_this_url column - * @method array findByDbIsrcNumber(string $isrc_number) Return CcFiles objects filtered by the isrc_number column - * @method array findByDbCatalogNumber(string $catalog_number) Return CcFiles objects filtered by the catalog_number column - * @method array findByDbOriginalArtist(string $original_artist) Return CcFiles objects filtered by the original_artist column - * @method array findByDbCopyright(string $copyright) Return CcFiles objects filtered by the copyright column - * @method array findByDbReportDatetime(string $report_datetime) Return CcFiles objects filtered by the report_datetime column - * @method array findByDbReportLocation(string $report_location) Return CcFiles objects filtered by the report_location column - * @method array findByDbReportOrganization(string $report_organization) Return CcFiles objects filtered by the report_organization column - * @method array findByDbSubject(string $subject) Return CcFiles objects filtered by the subject column - * @method array findByDbContributor(string $contributor) Return CcFiles objects filtered by the contributor column - * @method array findByDbLanguage(string $language) Return CcFiles objects filtered by the language column - * @method array findByDbFileExists(boolean $file_exists) Return CcFiles objects filtered by the file_exists column - * @method array findByDbSoundcloudId(int $soundcloud_id) Return CcFiles objects filtered by the soundcloud_id column - * @method array findByDbSoundcloudErrorCode(int $soundcloud_error_code) Return CcFiles objects filtered by the soundcloud_error_code column - * @method array findByDbSoundcloudErrorMsg(string $soundcloud_error_msg) Return CcFiles objects filtered by the soundcloud_error_msg column - * @method array findByDbSoundcloudLinkToFile(string $soundcloud_link_to_file) Return CcFiles objects filtered by the soundcloud_link_to_file column - * @method array findByDbSoundCloundUploadTime(string $soundcloud_upload_time) Return CcFiles objects filtered by the soundcloud_upload_time column - * @method array findByDbReplayGain(string $replay_gain) Return CcFiles objects filtered by the replay_gain column - * @method array findByDbOwnerId(int $owner_id) Return CcFiles objects filtered by the owner_id column - * @method array findByDbCuein(string $cuein) Return CcFiles objects filtered by the cuein column - * @method array findByDbCueout(string $cueout) Return CcFiles objects filtered by the cueout column - * @method array findByDbSilanCheck(boolean $silan_check) Return CcFiles objects filtered by the silan_check column - * @method array findByDbHidden(boolean $hidden) Return CcFiles objects filtered by the hidden column - * @method array findByDbIsScheduled(boolean $is_scheduled) Return CcFiles objects filtered by the is_scheduled column - * @method array findByDbIsPlaylist(boolean $is_playlist) Return CcFiles objects filtered by the is_playlist column - * @method array findByDbResourceId(string $resource_id) Return CcFiles objects filtered by the resource_id column + * @method CcFiles findOneByDbName(string $name) Return the first CcFiles filtered by the name column + * @method CcFiles findOneByDbMime(string $mime) Return the first CcFiles filtered by the mime column + * @method CcFiles findOneByDbFtype(string $ftype) Return the first CcFiles filtered by the ftype column + * @method CcFiles findOneByDbDirectory(int $directory) Return the first CcFiles filtered by the directory column + * @method CcFiles findOneByDbFilepath(string $filepath) Return the first CcFiles filtered by the filepath column + * @method CcFiles findOneByDbImportStatus(int $import_status) Return the first CcFiles filtered by the import_status column + * @method CcFiles findOneByDbCurrentlyaccessing(int $currentlyaccessing) Return the first CcFiles filtered by the currentlyaccessing column + * @method CcFiles findOneByDbEditedby(int $editedby) Return the first CcFiles filtered by the editedby column + * @method CcFiles findOneByDbMtime(string $mtime) Return the first CcFiles filtered by the mtime column + * @method CcFiles findOneByDbUtime(string $utime) Return the first CcFiles filtered by the utime column + * @method CcFiles findOneByDbLPtime(string $lptime) Return the first CcFiles filtered by the lptime column + * @method CcFiles findOneByDbMd5(string $md5) Return the first CcFiles filtered by the md5 column + * @method CcFiles findOneByDbTrackTitle(string $track_title) Return the first CcFiles filtered by the track_title column + * @method CcFiles findOneByDbArtistName(string $artist_name) Return the first CcFiles filtered by the artist_name column + * @method CcFiles findOneByDbBitRate(int $bit_rate) Return the first CcFiles filtered by the bit_rate column + * @method CcFiles findOneByDbSampleRate(int $sample_rate) Return the first CcFiles filtered by the sample_rate column + * @method CcFiles findOneByDbFormat(string $format) Return the first CcFiles filtered by the format column + * @method CcFiles findOneByDbLength(string $length) Return the first CcFiles filtered by the length column + * @method CcFiles findOneByDbAlbumTitle(string $album_title) Return the first CcFiles filtered by the album_title column + * @method CcFiles findOneByDbGenre(string $genre) Return the first CcFiles filtered by the genre column + * @method CcFiles findOneByDbComments(string $comments) Return the first CcFiles filtered by the comments column + * @method CcFiles findOneByDbYear(string $year) Return the first CcFiles filtered by the year column + * @method CcFiles findOneByDbTrackNumber(int $track_number) Return the first CcFiles filtered by the track_number column + * @method CcFiles findOneByDbChannels(int $channels) Return the first CcFiles filtered by the channels column + * @method CcFiles findOneByDbUrl(string $url) Return the first CcFiles filtered by the url column + * @method CcFiles findOneByDbBpm(int $bpm) Return the first CcFiles filtered by the bpm column + * @method CcFiles findOneByDbRating(string $rating) Return the first CcFiles filtered by the rating column + * @method CcFiles findOneByDbEncodedBy(string $encoded_by) Return the first CcFiles filtered by the encoded_by column + * @method CcFiles findOneByDbDiscNumber(string $disc_number) Return the first CcFiles filtered by the disc_number column + * @method CcFiles findOneByDbMood(string $mood) Return the first CcFiles filtered by the mood column + * @method CcFiles findOneByDbLabel(string $label) Return the first CcFiles filtered by the label column + * @method CcFiles findOneByDbComposer(string $composer) Return the first CcFiles filtered by the composer column + * @method CcFiles findOneByDbEncoder(string $encoder) Return the first CcFiles filtered by the encoder column + * @method CcFiles findOneByDbChecksum(string $checksum) Return the first CcFiles filtered by the checksum column + * @method CcFiles findOneByDbLyrics(string $lyrics) Return the first CcFiles filtered by the lyrics column + * @method CcFiles findOneByDbOrchestra(string $orchestra) Return the first CcFiles filtered by the orchestra column + * @method CcFiles findOneByDbConductor(string $conductor) Return the first CcFiles filtered by the conductor column + * @method CcFiles findOneByDbLyricist(string $lyricist) Return the first CcFiles filtered by the lyricist column + * @method CcFiles findOneByDbOriginalLyricist(string $original_lyricist) Return the first CcFiles filtered by the original_lyricist column + * @method CcFiles findOneByDbRadioStationName(string $radio_station_name) Return the first CcFiles filtered by the radio_station_name column + * @method CcFiles findOneByDbInfoUrl(string $info_url) Return the first CcFiles filtered by the info_url column + * @method CcFiles findOneByDbArtistUrl(string $artist_url) Return the first CcFiles filtered by the artist_url column + * @method CcFiles findOneByDbAudioSourceUrl(string $audio_source_url) Return the first CcFiles filtered by the audio_source_url column + * @method CcFiles findOneByDbRadioStationUrl(string $radio_station_url) Return the first CcFiles filtered by the radio_station_url column + * @method CcFiles findOneByDbBuyThisUrl(string $buy_this_url) Return the first CcFiles filtered by the buy_this_url column + * @method CcFiles findOneByDbIsrcNumber(string $isrc_number) Return the first CcFiles filtered by the isrc_number column + * @method CcFiles findOneByDbCatalogNumber(string $catalog_number) Return the first CcFiles filtered by the catalog_number column + * @method CcFiles findOneByDbOriginalArtist(string $original_artist) Return the first CcFiles filtered by the original_artist column + * @method CcFiles findOneByDbCopyright(string $copyright) Return the first CcFiles filtered by the copyright column + * @method CcFiles findOneByDbReportDatetime(string $report_datetime) Return the first CcFiles filtered by the report_datetime column + * @method CcFiles findOneByDbReportLocation(string $report_location) Return the first CcFiles filtered by the report_location column + * @method CcFiles findOneByDbReportOrganization(string $report_organization) Return the first CcFiles filtered by the report_organization column + * @method CcFiles findOneByDbSubject(string $subject) Return the first CcFiles filtered by the subject column + * @method CcFiles findOneByDbContributor(string $contributor) Return the first CcFiles filtered by the contributor column + * @method CcFiles findOneByDbLanguage(string $language) Return the first CcFiles filtered by the language column + * @method CcFiles findOneByDbFileExists(boolean $file_exists) Return the first CcFiles filtered by the file_exists column + * @method CcFiles findOneByDbSoundcloudId(int $soundcloud_id) Return the first CcFiles filtered by the soundcloud_id column + * @method CcFiles findOneByDbSoundcloudErrorCode(int $soundcloud_error_code) Return the first CcFiles filtered by the soundcloud_error_code column + * @method CcFiles findOneByDbSoundcloudErrorMsg(string $soundcloud_error_msg) Return the first CcFiles filtered by the soundcloud_error_msg column + * @method CcFiles findOneByDbSoundcloudLinkToFile(string $soundcloud_link_to_file) Return the first CcFiles filtered by the soundcloud_link_to_file column + * @method CcFiles findOneByDbSoundCloundUploadTime(string $soundcloud_upload_time) Return the first CcFiles filtered by the soundcloud_upload_time column + * @method CcFiles findOneByDbReplayGain(string $replay_gain) Return the first CcFiles filtered by the replay_gain column + * @method CcFiles findOneByDbOwnerId(int $owner_id) Return the first CcFiles filtered by the owner_id column + * @method CcFiles findOneByDbCuein(string $cuein) Return the first CcFiles filtered by the cuein column + * @method CcFiles findOneByDbCueout(string $cueout) Return the first CcFiles filtered by the cueout column + * @method CcFiles findOneByDbSilanCheck(boolean $silan_check) Return the first CcFiles filtered by the silan_check column + * @method CcFiles findOneByDbHidden(boolean $hidden) Return the first CcFiles filtered by the hidden column + * @method CcFiles findOneByDbIsScheduled(boolean $is_scheduled) Return the first CcFiles filtered by the is_scheduled column + * @method CcFiles findOneByDbIsPlaylist(boolean $is_playlist) Return the first CcFiles filtered by the is_playlist column + * @method CcFiles findOneByDbResourceId(string $resource_id) Return the first CcFiles filtered by the resource_id column + * + * @method array findByDbId(int $id) Return CcFiles objects filtered by the id column + * @method array findByDbName(string $name) Return CcFiles objects filtered by the name column + * @method array findByDbMime(string $mime) Return CcFiles objects filtered by the mime column + * @method array findByDbFtype(string $ftype) Return CcFiles objects filtered by the ftype column + * @method array findByDbDirectory(int $directory) Return CcFiles objects filtered by the directory column + * @method array findByDbFilepath(string $filepath) Return CcFiles objects filtered by the filepath column + * @method array findByDbImportStatus(int $import_status) Return CcFiles objects filtered by the import_status column + * @method array findByDbCurrentlyaccessing(int $currentlyaccessing) Return CcFiles objects filtered by the currentlyaccessing column + * @method array findByDbEditedby(int $editedby) Return CcFiles objects filtered by the editedby column + * @method array findByDbMtime(string $mtime) Return CcFiles objects filtered by the mtime column + * @method array findByDbUtime(string $utime) Return CcFiles objects filtered by the utime column + * @method array findByDbLPtime(string $lptime) Return CcFiles objects filtered by the lptime column + * @method array findByDbMd5(string $md5) Return CcFiles objects filtered by the md5 column + * @method array findByDbTrackTitle(string $track_title) Return CcFiles objects filtered by the track_title column + * @method array findByDbArtistName(string $artist_name) Return CcFiles objects filtered by the artist_name column + * @method array findByDbBitRate(int $bit_rate) Return CcFiles objects filtered by the bit_rate column + * @method array findByDbSampleRate(int $sample_rate) Return CcFiles objects filtered by the sample_rate column + * @method array findByDbFormat(string $format) Return CcFiles objects filtered by the format column + * @method array findByDbLength(string $length) Return CcFiles objects filtered by the length column + * @method array findByDbAlbumTitle(string $album_title) Return CcFiles objects filtered by the album_title column + * @method array findByDbGenre(string $genre) Return CcFiles objects filtered by the genre column + * @method array findByDbComments(string $comments) Return CcFiles objects filtered by the comments column + * @method array findByDbYear(string $year) Return CcFiles objects filtered by the year column + * @method array findByDbTrackNumber(int $track_number) Return CcFiles objects filtered by the track_number column + * @method array findByDbChannels(int $channels) Return CcFiles objects filtered by the channels column + * @method array findByDbUrl(string $url) Return CcFiles objects filtered by the url column + * @method array findByDbBpm(int $bpm) Return CcFiles objects filtered by the bpm column + * @method array findByDbRating(string $rating) Return CcFiles objects filtered by the rating column + * @method array findByDbEncodedBy(string $encoded_by) Return CcFiles objects filtered by the encoded_by column + * @method array findByDbDiscNumber(string $disc_number) Return CcFiles objects filtered by the disc_number column + * @method array findByDbMood(string $mood) Return CcFiles objects filtered by the mood column + * @method array findByDbLabel(string $label) Return CcFiles objects filtered by the label column + * @method array findByDbComposer(string $composer) Return CcFiles objects filtered by the composer column + * @method array findByDbEncoder(string $encoder) Return CcFiles objects filtered by the encoder column + * @method array findByDbChecksum(string $checksum) Return CcFiles objects filtered by the checksum column + * @method array findByDbLyrics(string $lyrics) Return CcFiles objects filtered by the lyrics column + * @method array findByDbOrchestra(string $orchestra) Return CcFiles objects filtered by the orchestra column + * @method array findByDbConductor(string $conductor) Return CcFiles objects filtered by the conductor column + * @method array findByDbLyricist(string $lyricist) Return CcFiles objects filtered by the lyricist column + * @method array findByDbOriginalLyricist(string $original_lyricist) Return CcFiles objects filtered by the original_lyricist column + * @method array findByDbRadioStationName(string $radio_station_name) Return CcFiles objects filtered by the radio_station_name column + * @method array findByDbInfoUrl(string $info_url) Return CcFiles objects filtered by the info_url column + * @method array findByDbArtistUrl(string $artist_url) Return CcFiles objects filtered by the artist_url column + * @method array findByDbAudioSourceUrl(string $audio_source_url) Return CcFiles objects filtered by the audio_source_url column + * @method array findByDbRadioStationUrl(string $radio_station_url) Return CcFiles objects filtered by the radio_station_url column + * @method array findByDbBuyThisUrl(string $buy_this_url) Return CcFiles objects filtered by the buy_this_url column + * @method array findByDbIsrcNumber(string $isrc_number) Return CcFiles objects filtered by the isrc_number column + * @method array findByDbCatalogNumber(string $catalog_number) Return CcFiles objects filtered by the catalog_number column + * @method array findByDbOriginalArtist(string $original_artist) Return CcFiles objects filtered by the original_artist column + * @method array findByDbCopyright(string $copyright) Return CcFiles objects filtered by the copyright column + * @method array findByDbReportDatetime(string $report_datetime) Return CcFiles objects filtered by the report_datetime column + * @method array findByDbReportLocation(string $report_location) Return CcFiles objects filtered by the report_location column + * @method array findByDbReportOrganization(string $report_organization) Return CcFiles objects filtered by the report_organization column + * @method array findByDbSubject(string $subject) Return CcFiles objects filtered by the subject column + * @method array findByDbContributor(string $contributor) Return CcFiles objects filtered by the contributor column + * @method array findByDbLanguage(string $language) Return CcFiles objects filtered by the language column + * @method array findByDbFileExists(boolean $file_exists) Return CcFiles objects filtered by the file_exists column + * @method array findByDbSoundcloudId(int $soundcloud_id) Return CcFiles objects filtered by the soundcloud_id column + * @method array findByDbSoundcloudErrorCode(int $soundcloud_error_code) Return CcFiles objects filtered by the soundcloud_error_code column + * @method array findByDbSoundcloudErrorMsg(string $soundcloud_error_msg) Return CcFiles objects filtered by the soundcloud_error_msg column + * @method array findByDbSoundcloudLinkToFile(string $soundcloud_link_to_file) Return CcFiles objects filtered by the soundcloud_link_to_file column + * @method array findByDbSoundCloundUploadTime(string $soundcloud_upload_time) Return CcFiles objects filtered by the soundcloud_upload_time column + * @method array findByDbReplayGain(string $replay_gain) Return CcFiles objects filtered by the replay_gain column + * @method array findByDbOwnerId(int $owner_id) Return CcFiles objects filtered by the owner_id column + * @method array findByDbCuein(string $cuein) Return CcFiles objects filtered by the cuein column + * @method array findByDbCueout(string $cueout) Return CcFiles objects filtered by the cueout column + * @method array findByDbSilanCheck(boolean $silan_check) Return CcFiles objects filtered by the silan_check column + * @method array findByDbHidden(boolean $hidden) Return CcFiles objects filtered by the hidden column + * @method array findByDbIsScheduled(boolean $is_scheduled) Return CcFiles objects filtered by the is_scheduled column + * @method array findByDbIsPlaylist(boolean $is_playlist) Return CcFiles objects filtered by the is_playlist column + * @method array findByDbResourceId(string $resource_id) Return CcFiles objects filtered by the resource_id column * * @package propel.generator.airtime.om */ abstract class BaseCcFilesQuery extends ModelCriteria { - - /** - * Initializes internal state of BaseCcFilesQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcFiles', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcFilesQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcFilesQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcFilesQuery) { - return $criteria; - } - $query = new CcFilesQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcFiles|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcFilesPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcFilesPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcFilesPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcFilesPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the name column - * - * @param string $dbName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbName($dbName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbName)) { - $dbName = str_replace('*', '%', $dbName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::NAME, $dbName, $comparison); - } - - /** - * Filter the query on the mime column - * - * @param string $dbMime The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbMime($dbMime = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbMime)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbMime)) { - $dbMime = str_replace('*', '%', $dbMime); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::MIME, $dbMime, $comparison); - } - - /** - * Filter the query on the ftype column - * - * @param string $dbFtype The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbFtype($dbFtype = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbFtype)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbFtype)) { - $dbFtype = str_replace('*', '%', $dbFtype); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::FTYPE, $dbFtype, $comparison); - } - - /** - * Filter the query on the directory column - * - * @param int|array $dbDirectory The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbDirectory($dbDirectory = null, $comparison = null) - { - if (is_array($dbDirectory)) { - $useMinMax = false; - if (isset($dbDirectory['min'])) { - $this->addUsingAlias(CcFilesPeer::DIRECTORY, $dbDirectory['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbDirectory['max'])) { - $this->addUsingAlias(CcFilesPeer::DIRECTORY, $dbDirectory['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::DIRECTORY, $dbDirectory, $comparison); - } - - /** - * Filter the query on the filepath column - * - * @param string $dbFilepath The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbFilepath($dbFilepath = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbFilepath)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbFilepath)) { - $dbFilepath = str_replace('*', '%', $dbFilepath); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::FILEPATH, $dbFilepath, $comparison); - } - - /** - * Filter the query on the import_status column - * - * @param int|array $dbImportStatus The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbImportStatus($dbImportStatus = null, $comparison = null) - { - if (is_array($dbImportStatus)) { - $useMinMax = false; - if (isset($dbImportStatus['min'])) { - $this->addUsingAlias(CcFilesPeer::IMPORT_STATUS, $dbImportStatus['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbImportStatus['max'])) { - $this->addUsingAlias(CcFilesPeer::IMPORT_STATUS, $dbImportStatus['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::IMPORT_STATUS, $dbImportStatus, $comparison); - } - - /** - * Filter the query on the currentlyaccessing column - * - * @param int|array $dbCurrentlyaccessing The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbCurrentlyaccessing($dbCurrentlyaccessing = null, $comparison = null) - { - if (is_array($dbCurrentlyaccessing)) { - $useMinMax = false; - if (isset($dbCurrentlyaccessing['min'])) { - $this->addUsingAlias(CcFilesPeer::CURRENTLYACCESSING, $dbCurrentlyaccessing['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbCurrentlyaccessing['max'])) { - $this->addUsingAlias(CcFilesPeer::CURRENTLYACCESSING, $dbCurrentlyaccessing['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::CURRENTLYACCESSING, $dbCurrentlyaccessing, $comparison); - } - - /** - * Filter the query on the editedby column - * - * @param int|array $dbEditedby The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbEditedby($dbEditedby = null, $comparison = null) - { - if (is_array($dbEditedby)) { - $useMinMax = false; - if (isset($dbEditedby['min'])) { - $this->addUsingAlias(CcFilesPeer::EDITEDBY, $dbEditedby['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbEditedby['max'])) { - $this->addUsingAlias(CcFilesPeer::EDITEDBY, $dbEditedby['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::EDITEDBY, $dbEditedby, $comparison); - } - - /** - * Filter the query on the mtime column - * - * @param string|array $dbMtime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbMtime($dbMtime = null, $comparison = null) - { - if (is_array($dbMtime)) { - $useMinMax = false; - if (isset($dbMtime['min'])) { - $this->addUsingAlias(CcFilesPeer::MTIME, $dbMtime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbMtime['max'])) { - $this->addUsingAlias(CcFilesPeer::MTIME, $dbMtime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::MTIME, $dbMtime, $comparison); - } - - /** - * Filter the query on the utime column - * - * @param string|array $dbUtime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbUtime($dbUtime = null, $comparison = null) - { - if (is_array($dbUtime)) { - $useMinMax = false; - if (isset($dbUtime['min'])) { - $this->addUsingAlias(CcFilesPeer::UTIME, $dbUtime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbUtime['max'])) { - $this->addUsingAlias(CcFilesPeer::UTIME, $dbUtime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::UTIME, $dbUtime, $comparison); - } - - /** - * Filter the query on the lptime column - * - * @param string|array $dbLPtime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbLPtime($dbLPtime = null, $comparison = null) - { - if (is_array($dbLPtime)) { - $useMinMax = false; - if (isset($dbLPtime['min'])) { - $this->addUsingAlias(CcFilesPeer::LPTIME, $dbLPtime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbLPtime['max'])) { - $this->addUsingAlias(CcFilesPeer::LPTIME, $dbLPtime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::LPTIME, $dbLPtime, $comparison); - } - - /** - * Filter the query on the md5 column - * - * @param string $dbMd5 The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbMd5($dbMd5 = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbMd5)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbMd5)) { - $dbMd5 = str_replace('*', '%', $dbMd5); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::MD5, $dbMd5, $comparison); - } - - /** - * Filter the query on the track_title column - * - * @param string $dbTrackTitle The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbTrackTitle($dbTrackTitle = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbTrackTitle)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbTrackTitle)) { - $dbTrackTitle = str_replace('*', '%', $dbTrackTitle); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::TRACK_TITLE, $dbTrackTitle, $comparison); - } - - /** - * Filter the query on the artist_name column - * - * @param string $dbArtistName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbArtistName($dbArtistName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbArtistName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbArtistName)) { - $dbArtistName = str_replace('*', '%', $dbArtistName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::ARTIST_NAME, $dbArtistName, $comparison); - } - - /** - * Filter the query on the bit_rate column - * - * @param int|array $dbBitRate The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbBitRate($dbBitRate = null, $comparison = null) - { - if (is_array($dbBitRate)) { - $useMinMax = false; - if (isset($dbBitRate['min'])) { - $this->addUsingAlias(CcFilesPeer::BIT_RATE, $dbBitRate['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbBitRate['max'])) { - $this->addUsingAlias(CcFilesPeer::BIT_RATE, $dbBitRate['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::BIT_RATE, $dbBitRate, $comparison); - } - - /** - * Filter the query on the sample_rate column - * - * @param int|array $dbSampleRate The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbSampleRate($dbSampleRate = null, $comparison = null) - { - if (is_array($dbSampleRate)) { - $useMinMax = false; - if (isset($dbSampleRate['min'])) { - $this->addUsingAlias(CcFilesPeer::SAMPLE_RATE, $dbSampleRate['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbSampleRate['max'])) { - $this->addUsingAlias(CcFilesPeer::SAMPLE_RATE, $dbSampleRate['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::SAMPLE_RATE, $dbSampleRate, $comparison); - } - - /** - * Filter the query on the format column - * - * @param string $dbFormat The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbFormat($dbFormat = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbFormat)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbFormat)) { - $dbFormat = str_replace('*', '%', $dbFormat); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::FORMAT, $dbFormat, $comparison); - } - - /** - * Filter the query on the length column - * - * @param string $dbLength The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbLength($dbLength = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLength)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLength)) { - $dbLength = str_replace('*', '%', $dbLength); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::LENGTH, $dbLength, $comparison); - } - - /** - * Filter the query on the album_title column - * - * @param string $dbAlbumTitle The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbAlbumTitle($dbAlbumTitle = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbAlbumTitle)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbAlbumTitle)) { - $dbAlbumTitle = str_replace('*', '%', $dbAlbumTitle); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::ALBUM_TITLE, $dbAlbumTitle, $comparison); - } - - /** - * Filter the query on the genre column - * - * @param string $dbGenre The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbGenre($dbGenre = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbGenre)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbGenre)) { - $dbGenre = str_replace('*', '%', $dbGenre); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::GENRE, $dbGenre, $comparison); - } - - /** - * Filter the query on the comments column - * - * @param string $dbComments The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbComments($dbComments = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbComments)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbComments)) { - $dbComments = str_replace('*', '%', $dbComments); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::COMMENTS, $dbComments, $comparison); - } - - /** - * Filter the query on the year column - * - * @param string $dbYear The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbYear($dbYear = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbYear)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbYear)) { - $dbYear = str_replace('*', '%', $dbYear); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::YEAR, $dbYear, $comparison); - } - - /** - * Filter the query on the track_number column - * - * @param int|array $dbTrackNumber The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbTrackNumber($dbTrackNumber = null, $comparison = null) - { - if (is_array($dbTrackNumber)) { - $useMinMax = false; - if (isset($dbTrackNumber['min'])) { - $this->addUsingAlias(CcFilesPeer::TRACK_NUMBER, $dbTrackNumber['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbTrackNumber['max'])) { - $this->addUsingAlias(CcFilesPeer::TRACK_NUMBER, $dbTrackNumber['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::TRACK_NUMBER, $dbTrackNumber, $comparison); - } - - /** - * Filter the query on the channels column - * - * @param int|array $dbChannels The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbChannels($dbChannels = null, $comparison = null) - { - if (is_array($dbChannels)) { - $useMinMax = false; - if (isset($dbChannels['min'])) { - $this->addUsingAlias(CcFilesPeer::CHANNELS, $dbChannels['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbChannels['max'])) { - $this->addUsingAlias(CcFilesPeer::CHANNELS, $dbChannels['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::CHANNELS, $dbChannels, $comparison); - } - - /** - * Filter the query on the url column - * - * @param string $dbUrl The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbUrl($dbUrl = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbUrl)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbUrl)) { - $dbUrl = str_replace('*', '%', $dbUrl); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::URL, $dbUrl, $comparison); - } - - /** - * Filter the query on the bpm column - * - * @param int|array $dbBpm The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbBpm($dbBpm = null, $comparison = null) - { - if (is_array($dbBpm)) { - $useMinMax = false; - if (isset($dbBpm['min'])) { - $this->addUsingAlias(CcFilesPeer::BPM, $dbBpm['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbBpm['max'])) { - $this->addUsingAlias(CcFilesPeer::BPM, $dbBpm['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::BPM, $dbBpm, $comparison); - } - - /** - * Filter the query on the rating column - * - * @param string $dbRating The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbRating($dbRating = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbRating)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbRating)) { - $dbRating = str_replace('*', '%', $dbRating); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::RATING, $dbRating, $comparison); - } - - /** - * Filter the query on the encoded_by column - * - * @param string $dbEncodedBy The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbEncodedBy($dbEncodedBy = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbEncodedBy)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbEncodedBy)) { - $dbEncodedBy = str_replace('*', '%', $dbEncodedBy); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::ENCODED_BY, $dbEncodedBy, $comparison); - } - - /** - * Filter the query on the disc_number column - * - * @param string $dbDiscNumber The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbDiscNumber($dbDiscNumber = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbDiscNumber)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbDiscNumber)) { - $dbDiscNumber = str_replace('*', '%', $dbDiscNumber); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::DISC_NUMBER, $dbDiscNumber, $comparison); - } - - /** - * Filter the query on the mood column - * - * @param string $dbMood The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbMood($dbMood = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbMood)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbMood)) { - $dbMood = str_replace('*', '%', $dbMood); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::MOOD, $dbMood, $comparison); - } - - /** - * Filter the query on the label column - * - * @param string $dbLabel The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbLabel($dbLabel = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLabel)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLabel)) { - $dbLabel = str_replace('*', '%', $dbLabel); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::LABEL, $dbLabel, $comparison); - } - - /** - * Filter the query on the composer column - * - * @param string $dbComposer The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbComposer($dbComposer = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbComposer)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbComposer)) { - $dbComposer = str_replace('*', '%', $dbComposer); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::COMPOSER, $dbComposer, $comparison); - } - - /** - * Filter the query on the encoder column - * - * @param string $dbEncoder The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbEncoder($dbEncoder = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbEncoder)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbEncoder)) { - $dbEncoder = str_replace('*', '%', $dbEncoder); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::ENCODER, $dbEncoder, $comparison); - } - - /** - * Filter the query on the checksum column - * - * @param string $dbChecksum The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbChecksum($dbChecksum = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbChecksum)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbChecksum)) { - $dbChecksum = str_replace('*', '%', $dbChecksum); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::CHECKSUM, $dbChecksum, $comparison); - } - - /** - * Filter the query on the lyrics column - * - * @param string $dbLyrics The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbLyrics($dbLyrics = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLyrics)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLyrics)) { - $dbLyrics = str_replace('*', '%', $dbLyrics); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::LYRICS, $dbLyrics, $comparison); - } - - /** - * Filter the query on the orchestra column - * - * @param string $dbOrchestra The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbOrchestra($dbOrchestra = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbOrchestra)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbOrchestra)) { - $dbOrchestra = str_replace('*', '%', $dbOrchestra); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::ORCHESTRA, $dbOrchestra, $comparison); - } - - /** - * Filter the query on the conductor column - * - * @param string $dbConductor The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbConductor($dbConductor = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbConductor)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbConductor)) { - $dbConductor = str_replace('*', '%', $dbConductor); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::CONDUCTOR, $dbConductor, $comparison); - } - - /** - * Filter the query on the lyricist column - * - * @param string $dbLyricist The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbLyricist($dbLyricist = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLyricist)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLyricist)) { - $dbLyricist = str_replace('*', '%', $dbLyricist); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::LYRICIST, $dbLyricist, $comparison); - } - - /** - * Filter the query on the original_lyricist column - * - * @param string $dbOriginalLyricist The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbOriginalLyricist($dbOriginalLyricist = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbOriginalLyricist)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbOriginalLyricist)) { - $dbOriginalLyricist = str_replace('*', '%', $dbOriginalLyricist); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::ORIGINAL_LYRICIST, $dbOriginalLyricist, $comparison); - } - - /** - * Filter the query on the radio_station_name column - * - * @param string $dbRadioStationName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbRadioStationName($dbRadioStationName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbRadioStationName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbRadioStationName)) { - $dbRadioStationName = str_replace('*', '%', $dbRadioStationName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::RADIO_STATION_NAME, $dbRadioStationName, $comparison); - } - - /** - * Filter the query on the info_url column - * - * @param string $dbInfoUrl The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbInfoUrl($dbInfoUrl = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbInfoUrl)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbInfoUrl)) { - $dbInfoUrl = str_replace('*', '%', $dbInfoUrl); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::INFO_URL, $dbInfoUrl, $comparison); - } - - /** - * Filter the query on the artist_url column - * - * @param string $dbArtistUrl The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbArtistUrl($dbArtistUrl = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbArtistUrl)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbArtistUrl)) { - $dbArtistUrl = str_replace('*', '%', $dbArtistUrl); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::ARTIST_URL, $dbArtistUrl, $comparison); - } - - /** - * Filter the query on the audio_source_url column - * - * @param string $dbAudioSourceUrl The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbAudioSourceUrl($dbAudioSourceUrl = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbAudioSourceUrl)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbAudioSourceUrl)) { - $dbAudioSourceUrl = str_replace('*', '%', $dbAudioSourceUrl); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::AUDIO_SOURCE_URL, $dbAudioSourceUrl, $comparison); - } - - /** - * Filter the query on the radio_station_url column - * - * @param string $dbRadioStationUrl The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbRadioStationUrl($dbRadioStationUrl = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbRadioStationUrl)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbRadioStationUrl)) { - $dbRadioStationUrl = str_replace('*', '%', $dbRadioStationUrl); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::RADIO_STATION_URL, $dbRadioStationUrl, $comparison); - } - - /** - * Filter the query on the buy_this_url column - * - * @param string $dbBuyThisUrl The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbBuyThisUrl($dbBuyThisUrl = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbBuyThisUrl)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbBuyThisUrl)) { - $dbBuyThisUrl = str_replace('*', '%', $dbBuyThisUrl); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::BUY_THIS_URL, $dbBuyThisUrl, $comparison); - } - - /** - * Filter the query on the isrc_number column - * - * @param string $dbIsrcNumber The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbIsrcNumber($dbIsrcNumber = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbIsrcNumber)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbIsrcNumber)) { - $dbIsrcNumber = str_replace('*', '%', $dbIsrcNumber); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::ISRC_NUMBER, $dbIsrcNumber, $comparison); - } - - /** - * Filter the query on the catalog_number column - * - * @param string $dbCatalogNumber The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbCatalogNumber($dbCatalogNumber = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCatalogNumber)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCatalogNumber)) { - $dbCatalogNumber = str_replace('*', '%', $dbCatalogNumber); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::CATALOG_NUMBER, $dbCatalogNumber, $comparison); - } - - /** - * Filter the query on the original_artist column - * - * @param string $dbOriginalArtist The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbOriginalArtist($dbOriginalArtist = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbOriginalArtist)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbOriginalArtist)) { - $dbOriginalArtist = str_replace('*', '%', $dbOriginalArtist); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::ORIGINAL_ARTIST, $dbOriginalArtist, $comparison); - } - - /** - * Filter the query on the copyright column - * - * @param string $dbCopyright The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbCopyright($dbCopyright = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCopyright)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCopyright)) { - $dbCopyright = str_replace('*', '%', $dbCopyright); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::COPYRIGHT, $dbCopyright, $comparison); - } - - /** - * Filter the query on the report_datetime column - * - * @param string $dbReportDatetime The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbReportDatetime($dbReportDatetime = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbReportDatetime)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbReportDatetime)) { - $dbReportDatetime = str_replace('*', '%', $dbReportDatetime); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::REPORT_DATETIME, $dbReportDatetime, $comparison); - } - - /** - * Filter the query on the report_location column - * - * @param string $dbReportLocation The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbReportLocation($dbReportLocation = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbReportLocation)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbReportLocation)) { - $dbReportLocation = str_replace('*', '%', $dbReportLocation); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::REPORT_LOCATION, $dbReportLocation, $comparison); - } - - /** - * Filter the query on the report_organization column - * - * @param string $dbReportOrganization The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbReportOrganization($dbReportOrganization = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbReportOrganization)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbReportOrganization)) { - $dbReportOrganization = str_replace('*', '%', $dbReportOrganization); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::REPORT_ORGANIZATION, $dbReportOrganization, $comparison); - } - - /** - * Filter the query on the subject column - * - * @param string $dbSubject The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbSubject($dbSubject = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbSubject)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbSubject)) { - $dbSubject = str_replace('*', '%', $dbSubject); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::SUBJECT, $dbSubject, $comparison); - } - - /** - * Filter the query on the contributor column - * - * @param string $dbContributor The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbContributor($dbContributor = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbContributor)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbContributor)) { - $dbContributor = str_replace('*', '%', $dbContributor); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::CONTRIBUTOR, $dbContributor, $comparison); - } - - /** - * Filter the query on the language column - * - * @param string $dbLanguage The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbLanguage($dbLanguage = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLanguage)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLanguage)) { - $dbLanguage = str_replace('*', '%', $dbLanguage); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::LANGUAGE, $dbLanguage, $comparison); - } - - /** - * Filter the query on the file_exists column - * - * @param boolean|string $dbFileExists The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbFileExists($dbFileExists = null, $comparison = null) - { - if (is_string($dbFileExists)) { - $file_exists = in_array(strtolower($dbFileExists), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcFilesPeer::FILE_EXISTS, $dbFileExists, $comparison); - } - - /** - * Filter the query on the soundcloud_id column - * - * @param int|array $dbSoundcloudId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbSoundcloudId($dbSoundcloudId = null, $comparison = null) - { - if (is_array($dbSoundcloudId)) { - $useMinMax = false; - if (isset($dbSoundcloudId['min'])) { - $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ID, $dbSoundcloudId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbSoundcloudId['max'])) { - $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ID, $dbSoundcloudId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ID, $dbSoundcloudId, $comparison); - } - - /** - * Filter the query on the soundcloud_error_code column - * - * @param int|array $dbSoundcloudErrorCode The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbSoundcloudErrorCode($dbSoundcloudErrorCode = null, $comparison = null) - { - if (is_array($dbSoundcloudErrorCode)) { - $useMinMax = false; - if (isset($dbSoundcloudErrorCode['min'])) { - $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ERROR_CODE, $dbSoundcloudErrorCode['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbSoundcloudErrorCode['max'])) { - $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ERROR_CODE, $dbSoundcloudErrorCode['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ERROR_CODE, $dbSoundcloudErrorCode, $comparison); - } - - /** - * Filter the query on the soundcloud_error_msg column - * - * @param string $dbSoundcloudErrorMsg The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbSoundcloudErrorMsg($dbSoundcloudErrorMsg = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbSoundcloudErrorMsg)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbSoundcloudErrorMsg)) { - $dbSoundcloudErrorMsg = str_replace('*', '%', $dbSoundcloudErrorMsg); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ERROR_MSG, $dbSoundcloudErrorMsg, $comparison); - } - - /** - * Filter the query on the soundcloud_link_to_file column - * - * @param string $dbSoundcloudLinkToFile The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbSoundcloudLinkToFile($dbSoundcloudLinkToFile = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbSoundcloudLinkToFile)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbSoundcloudLinkToFile)) { - $dbSoundcloudLinkToFile = str_replace('*', '%', $dbSoundcloudLinkToFile); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE, $dbSoundcloudLinkToFile, $comparison); - } - - /** - * Filter the query on the soundcloud_upload_time column - * - * @param string|array $dbSoundCloundUploadTime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbSoundCloundUploadTime($dbSoundCloundUploadTime = null, $comparison = null) - { - if (is_array($dbSoundCloundUploadTime)) { - $useMinMax = false; - if (isset($dbSoundCloundUploadTime['min'])) { - $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, $dbSoundCloundUploadTime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbSoundCloundUploadTime['max'])) { - $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, $dbSoundCloundUploadTime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, $dbSoundCloundUploadTime, $comparison); - } - - /** - * Filter the query on the replay_gain column - * - * @param string|array $dbReplayGain The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbReplayGain($dbReplayGain = null, $comparison = null) - { - if (is_array($dbReplayGain)) { - $useMinMax = false; - if (isset($dbReplayGain['min'])) { - $this->addUsingAlias(CcFilesPeer::REPLAY_GAIN, $dbReplayGain['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbReplayGain['max'])) { - $this->addUsingAlias(CcFilesPeer::REPLAY_GAIN, $dbReplayGain['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::REPLAY_GAIN, $dbReplayGain, $comparison); - } - - /** - * Filter the query on the owner_id column - * - * @param int|array $dbOwnerId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbOwnerId($dbOwnerId = null, $comparison = null) - { - if (is_array($dbOwnerId)) { - $useMinMax = false; - if (isset($dbOwnerId['min'])) { - $this->addUsingAlias(CcFilesPeer::OWNER_ID, $dbOwnerId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbOwnerId['max'])) { - $this->addUsingAlias(CcFilesPeer::OWNER_ID, $dbOwnerId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcFilesPeer::OWNER_ID, $dbOwnerId, $comparison); - } - - /** - * Filter the query on the cuein column - * - * @param string $dbCuein The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbCuein($dbCuein = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCuein)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCuein)) { - $dbCuein = str_replace('*', '%', $dbCuein); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::CUEIN, $dbCuein, $comparison); - } - - /** - * Filter the query on the cueout column - * - * @param string $dbCueout The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbCueout($dbCueout = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCueout)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCueout)) { - $dbCueout = str_replace('*', '%', $dbCueout); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::CUEOUT, $dbCueout, $comparison); - } - - /** - * Filter the query on the silan_check column - * - * @param boolean|string $dbSilanCheck The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbSilanCheck($dbSilanCheck = null, $comparison = null) - { - if (is_string($dbSilanCheck)) { - $silan_check = in_array(strtolower($dbSilanCheck), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcFilesPeer::SILAN_CHECK, $dbSilanCheck, $comparison); - } - - /** - * Filter the query on the hidden column - * - * @param boolean|string $dbHidden The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbHidden($dbHidden = null, $comparison = null) - { - if (is_string($dbHidden)) { - $hidden = in_array(strtolower($dbHidden), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcFilesPeer::HIDDEN, $dbHidden, $comparison); - } - - /** - * Filter the query on the is_scheduled column - * - * @param boolean|string $dbIsScheduled The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbIsScheduled($dbIsScheduled = null, $comparison = null) - { - if (is_string($dbIsScheduled)) { - $is_scheduled = in_array(strtolower($dbIsScheduled), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcFilesPeer::IS_SCHEDULED, $dbIsScheduled, $comparison); - } - - /** - * Filter the query on the is_playlist column - * - * @param boolean|string $dbIsPlaylist The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbIsPlaylist($dbIsPlaylist = null, $comparison = null) - { - if (is_string($dbIsPlaylist)) { - $is_playlist = in_array(strtolower($dbIsPlaylist), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcFilesPeer::IS_PLAYLIST, $dbIsPlaylist, $comparison); - } - - /** - * Filter the query on the resource_id column - * - * @param string $dbResourceId The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbResourceId($dbResourceId = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbResourceId)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbResourceId)) { - $dbResourceId = str_replace('*', '%', $dbResourceId); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcFilesPeer::RESOURCE_ID, $dbResourceId, $comparison); - } - - /** - * Filter the query by a related CcSubjs object - * - * @param CcSubjs $ccSubjs the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByFkOwner($ccSubjs, $comparison = null) - { - return $this - ->addUsingAlias(CcFilesPeer::OWNER_ID, $ccSubjs->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the FkOwner relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function joinFkOwner($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('FkOwner'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'FkOwner'); - } - - return $this; - } - - /** - * Use the FkOwner relation CcSubjs object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery A secondary query class using the current class as primary query - */ - public function useFkOwnerQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinFkOwner($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'FkOwner', 'CcSubjsQuery'); - } - - /** - * Filter the query by a related CcSubjs object - * - * @param CcSubjs $ccSubjs the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByCcSubjsRelatedByDbEditedby($ccSubjs, $comparison = null) - { - return $this - ->addUsingAlias(CcFilesPeer::EDITEDBY, $ccSubjs->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSubjsRelatedByDbEditedby relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function joinCcSubjsRelatedByDbEditedby($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSubjsRelatedByDbEditedby'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSubjsRelatedByDbEditedby'); - } - - return $this; - } - - /** - * Use the CcSubjsRelatedByDbEditedby relation CcSubjs object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery A secondary query class using the current class as primary query - */ - public function useCcSubjsRelatedByDbEditedbyQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcSubjsRelatedByDbEditedby($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSubjsRelatedByDbEditedby', 'CcSubjsQuery'); - } - - /** - * Filter the query by a related CcMusicDirs object - * - * @param CcMusicDirs $ccMusicDirs the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByCcMusicDirs($ccMusicDirs, $comparison = null) - { - return $this - ->addUsingAlias(CcFilesPeer::DIRECTORY, $ccMusicDirs->getId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcMusicDirs relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function joinCcMusicDirs($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcMusicDirs'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcMusicDirs'); - } - - return $this; - } - - /** - * Use the CcMusicDirs relation CcMusicDirs object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcMusicDirsQuery A secondary query class using the current class as primary query - */ - public function useCcMusicDirsQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcMusicDirs($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcMusicDirs', 'CcMusicDirsQuery'); - } - - /** - * Filter the query by a related CcShowInstances object - * - * @param CcShowInstances $ccShowInstances the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByCcShowInstances($ccShowInstances, $comparison = null) - { - return $this - ->addUsingAlias(CcFilesPeer::ID, $ccShowInstances->getDbRecordedFile(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShowInstances relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function joinCcShowInstances($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShowInstances'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShowInstances'); - } - - return $this; - } - - /** - * Use the CcShowInstances relation CcShowInstances object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowInstancesQuery A secondary query class using the current class as primary query - */ - public function useCcShowInstancesQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcShowInstances($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShowInstances', 'CcShowInstancesQuery'); - } - - /** - * Filter the query by a related CcPlaylistcontents object - * - * @param CcPlaylistcontents $ccPlaylistcontents the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByCcPlaylistcontents($ccPlaylistcontents, $comparison = null) - { - return $this - ->addUsingAlias(CcFilesPeer::ID, $ccPlaylistcontents->getDbFileId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcPlaylistcontents relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function joinCcPlaylistcontents($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcPlaylistcontents'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcPlaylistcontents'); - } - - return $this; - } - - /** - * Use the CcPlaylistcontents relation CcPlaylistcontents object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlaylistcontentsQuery A secondary query class using the current class as primary query - */ - public function useCcPlaylistcontentsQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcPlaylistcontents($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcPlaylistcontents', 'CcPlaylistcontentsQuery'); - } - - /** - * Filter the query by a related CcBlockcontents object - * - * @param CcBlockcontents $ccBlockcontents the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByCcBlockcontents($ccBlockcontents, $comparison = null) - { - return $this - ->addUsingAlias(CcFilesPeer::ID, $ccBlockcontents->getDbFileId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcBlockcontents relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function joinCcBlockcontents($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcBlockcontents'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcBlockcontents'); - } - - return $this; - } - - /** - * Use the CcBlockcontents relation CcBlockcontents object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockcontentsQuery A secondary query class using the current class as primary query - */ - public function useCcBlockcontentsQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcBlockcontents($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcBlockcontents', 'CcBlockcontentsQuery'); - } - - /** - * Filter the query by a related CcSchedule object - * - * @param CcSchedule $ccSchedule the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByCcSchedule($ccSchedule, $comparison = null) - { - return $this - ->addUsingAlias(CcFilesPeer::ID, $ccSchedule->getDbFileId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSchedule relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function joinCcSchedule($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSchedule'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSchedule'); - } - - return $this; - } - - /** - * Use the CcSchedule relation CcSchedule object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcScheduleQuery A secondary query class using the current class as primary query - */ - public function useCcScheduleQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcSchedule($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSchedule', 'CcScheduleQuery'); - } - - /** - * Filter the query by a related CcPlayoutHistory object - * - * @param CcPlayoutHistory $ccPlayoutHistory the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByCcPlayoutHistory($ccPlayoutHistory, $comparison = null) - { - return $this - ->addUsingAlias(CcFilesPeer::ID, $ccPlayoutHistory->getDbFileId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcPlayoutHistory relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function joinCcPlayoutHistory($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcPlayoutHistory'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcPlayoutHistory'); - } - - return $this; - } - - /** - * Use the CcPlayoutHistory relation CcPlayoutHistory object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlayoutHistoryQuery A secondary query class using the current class as primary query - */ - public function useCcPlayoutHistoryQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcPlayoutHistory($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistory', 'CcPlayoutHistoryQuery'); - } - - /** - * Exclude object from result - * - * @param CcFiles $ccFiles Object to remove from the list of results - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function prune($ccFiles = null) - { - if ($ccFiles) { - $this->addUsingAlias(CcFilesPeer::ID, $ccFiles->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcFilesQuery + /** + * Initializes internal state of BaseCcFilesQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcFiles'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcFilesQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcFilesQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcFilesQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcFilesQuery) { + return $criteria; + } + $query = new CcFilesQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcFiles|CcFiles[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcFilesPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcFiles A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcFiles A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "name", "mime", "ftype", "directory", "filepath", "import_status", "currentlyaccessing", "editedby", "mtime", "utime", "lptime", "md5", "track_title", "artist_name", "bit_rate", "sample_rate", "format", "length", "album_title", "genre", "comments", "year", "track_number", "channels", "url", "bpm", "rating", "encoded_by", "disc_number", "mood", "label", "composer", "encoder", "checksum", "lyrics", "orchestra", "conductor", "lyricist", "original_lyricist", "radio_station_name", "info_url", "artist_url", "audio_source_url", "radio_station_url", "buy_this_url", "isrc_number", "catalog_number", "original_artist", "copyright", "report_datetime", "report_location", "report_organization", "subject", "contributor", "language", "file_exists", "soundcloud_id", "soundcloud_error_code", "soundcloud_error_msg", "soundcloud_link_to_file", "soundcloud_upload_time", "replay_gain", "owner_id", "cuein", "cueout", "silan_check", "hidden", "is_scheduled", "is_playlist", "resource_id" FROM "cc_files" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcFiles(); + $obj->hydrate($row); + CcFilesPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcFiles|CcFiles[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcFiles[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcFilesPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcFilesPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcFilesPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcFilesPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the name column + * + * Example usage: + * + * $query->filterByDbName('fooValue'); // WHERE name = 'fooValue' + * $query->filterByDbName('%fooValue%'); // WHERE name LIKE '%fooValue%' + * + * + * @param string $dbName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbName($dbName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbName)) { + $dbName = str_replace('*', '%', $dbName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::NAME, $dbName, $comparison); + } + + /** + * Filter the query on the mime column + * + * Example usage: + * + * $query->filterByDbMime('fooValue'); // WHERE mime = 'fooValue' + * $query->filterByDbMime('%fooValue%'); // WHERE mime LIKE '%fooValue%' + * + * + * @param string $dbMime The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbMime($dbMime = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbMime)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbMime)) { + $dbMime = str_replace('*', '%', $dbMime); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::MIME, $dbMime, $comparison); + } + + /** + * Filter the query on the ftype column + * + * Example usage: + * + * $query->filterByDbFtype('fooValue'); // WHERE ftype = 'fooValue' + * $query->filterByDbFtype('%fooValue%'); // WHERE ftype LIKE '%fooValue%' + * + * + * @param string $dbFtype The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbFtype($dbFtype = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbFtype)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbFtype)) { + $dbFtype = str_replace('*', '%', $dbFtype); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::FTYPE, $dbFtype, $comparison); + } + + /** + * Filter the query on the directory column + * + * Example usage: + * + * $query->filterByDbDirectory(1234); // WHERE directory = 1234 + * $query->filterByDbDirectory(array(12, 34)); // WHERE directory IN (12, 34) + * $query->filterByDbDirectory(array('min' => 12)); // WHERE directory >= 12 + * $query->filterByDbDirectory(array('max' => 12)); // WHERE directory <= 12 + * + * + * @see filterByCcMusicDirs() + * + * @param mixed $dbDirectory The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbDirectory($dbDirectory = null, $comparison = null) + { + if (is_array($dbDirectory)) { + $useMinMax = false; + if (isset($dbDirectory['min'])) { + $this->addUsingAlias(CcFilesPeer::DIRECTORY, $dbDirectory['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbDirectory['max'])) { + $this->addUsingAlias(CcFilesPeer::DIRECTORY, $dbDirectory['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::DIRECTORY, $dbDirectory, $comparison); + } + + /** + * Filter the query on the filepath column + * + * Example usage: + * + * $query->filterByDbFilepath('fooValue'); // WHERE filepath = 'fooValue' + * $query->filterByDbFilepath('%fooValue%'); // WHERE filepath LIKE '%fooValue%' + * + * + * @param string $dbFilepath The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbFilepath($dbFilepath = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbFilepath)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbFilepath)) { + $dbFilepath = str_replace('*', '%', $dbFilepath); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::FILEPATH, $dbFilepath, $comparison); + } + + /** + * Filter the query on the import_status column + * + * Example usage: + * + * $query->filterByDbImportStatus(1234); // WHERE import_status = 1234 + * $query->filterByDbImportStatus(array(12, 34)); // WHERE import_status IN (12, 34) + * $query->filterByDbImportStatus(array('min' => 12)); // WHERE import_status >= 12 + * $query->filterByDbImportStatus(array('max' => 12)); // WHERE import_status <= 12 + * + * + * @param mixed $dbImportStatus The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbImportStatus($dbImportStatus = null, $comparison = null) + { + if (is_array($dbImportStatus)) { + $useMinMax = false; + if (isset($dbImportStatus['min'])) { + $this->addUsingAlias(CcFilesPeer::IMPORT_STATUS, $dbImportStatus['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbImportStatus['max'])) { + $this->addUsingAlias(CcFilesPeer::IMPORT_STATUS, $dbImportStatus['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::IMPORT_STATUS, $dbImportStatus, $comparison); + } + + /** + * Filter the query on the currentlyaccessing column + * + * Example usage: + * + * $query->filterByDbCurrentlyaccessing(1234); // WHERE currentlyaccessing = 1234 + * $query->filterByDbCurrentlyaccessing(array(12, 34)); // WHERE currentlyaccessing IN (12, 34) + * $query->filterByDbCurrentlyaccessing(array('min' => 12)); // WHERE currentlyaccessing >= 12 + * $query->filterByDbCurrentlyaccessing(array('max' => 12)); // WHERE currentlyaccessing <= 12 + * + * + * @param mixed $dbCurrentlyaccessing The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbCurrentlyaccessing($dbCurrentlyaccessing = null, $comparison = null) + { + if (is_array($dbCurrentlyaccessing)) { + $useMinMax = false; + if (isset($dbCurrentlyaccessing['min'])) { + $this->addUsingAlias(CcFilesPeer::CURRENTLYACCESSING, $dbCurrentlyaccessing['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbCurrentlyaccessing['max'])) { + $this->addUsingAlias(CcFilesPeer::CURRENTLYACCESSING, $dbCurrentlyaccessing['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::CURRENTLYACCESSING, $dbCurrentlyaccessing, $comparison); + } + + /** + * Filter the query on the editedby column + * + * Example usage: + * + * $query->filterByDbEditedby(1234); // WHERE editedby = 1234 + * $query->filterByDbEditedby(array(12, 34)); // WHERE editedby IN (12, 34) + * $query->filterByDbEditedby(array('min' => 12)); // WHERE editedby >= 12 + * $query->filterByDbEditedby(array('max' => 12)); // WHERE editedby <= 12 + * + * + * @see filterByCcSubjsRelatedByDbEditedby() + * + * @param mixed $dbEditedby The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbEditedby($dbEditedby = null, $comparison = null) + { + if (is_array($dbEditedby)) { + $useMinMax = false; + if (isset($dbEditedby['min'])) { + $this->addUsingAlias(CcFilesPeer::EDITEDBY, $dbEditedby['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbEditedby['max'])) { + $this->addUsingAlias(CcFilesPeer::EDITEDBY, $dbEditedby['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::EDITEDBY, $dbEditedby, $comparison); + } + + /** + * Filter the query on the mtime column + * + * Example usage: + * + * $query->filterByDbMtime('2011-03-14'); // WHERE mtime = '2011-03-14' + * $query->filterByDbMtime('now'); // WHERE mtime = '2011-03-14' + * $query->filterByDbMtime(array('max' => 'yesterday')); // WHERE mtime < '2011-03-13' + * + * + * @param mixed $dbMtime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbMtime($dbMtime = null, $comparison = null) + { + if (is_array($dbMtime)) { + $useMinMax = false; + if (isset($dbMtime['min'])) { + $this->addUsingAlias(CcFilesPeer::MTIME, $dbMtime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbMtime['max'])) { + $this->addUsingAlias(CcFilesPeer::MTIME, $dbMtime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::MTIME, $dbMtime, $comparison); + } + + /** + * Filter the query on the utime column + * + * Example usage: + * + * $query->filterByDbUtime('2011-03-14'); // WHERE utime = '2011-03-14' + * $query->filterByDbUtime('now'); // WHERE utime = '2011-03-14' + * $query->filterByDbUtime(array('max' => 'yesterday')); // WHERE utime < '2011-03-13' + * + * + * @param mixed $dbUtime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbUtime($dbUtime = null, $comparison = null) + { + if (is_array($dbUtime)) { + $useMinMax = false; + if (isset($dbUtime['min'])) { + $this->addUsingAlias(CcFilesPeer::UTIME, $dbUtime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbUtime['max'])) { + $this->addUsingAlias(CcFilesPeer::UTIME, $dbUtime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::UTIME, $dbUtime, $comparison); + } + + /** + * Filter the query on the lptime column + * + * Example usage: + * + * $query->filterByDbLPtime('2011-03-14'); // WHERE lptime = '2011-03-14' + * $query->filterByDbLPtime('now'); // WHERE lptime = '2011-03-14' + * $query->filterByDbLPtime(array('max' => 'yesterday')); // WHERE lptime < '2011-03-13' + * + * + * @param mixed $dbLPtime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbLPtime($dbLPtime = null, $comparison = null) + { + if (is_array($dbLPtime)) { + $useMinMax = false; + if (isset($dbLPtime['min'])) { + $this->addUsingAlias(CcFilesPeer::LPTIME, $dbLPtime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbLPtime['max'])) { + $this->addUsingAlias(CcFilesPeer::LPTIME, $dbLPtime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::LPTIME, $dbLPtime, $comparison); + } + + /** + * Filter the query on the md5 column + * + * Example usage: + * + * $query->filterByDbMd5('fooValue'); // WHERE md5 = 'fooValue' + * $query->filterByDbMd5('%fooValue%'); // WHERE md5 LIKE '%fooValue%' + * + * + * @param string $dbMd5 The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbMd5($dbMd5 = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbMd5)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbMd5)) { + $dbMd5 = str_replace('*', '%', $dbMd5); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::MD5, $dbMd5, $comparison); + } + + /** + * Filter the query on the track_title column + * + * Example usage: + * + * $query->filterByDbTrackTitle('fooValue'); // WHERE track_title = 'fooValue' + * $query->filterByDbTrackTitle('%fooValue%'); // WHERE track_title LIKE '%fooValue%' + * + * + * @param string $dbTrackTitle The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbTrackTitle($dbTrackTitle = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbTrackTitle)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbTrackTitle)) { + $dbTrackTitle = str_replace('*', '%', $dbTrackTitle); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::TRACK_TITLE, $dbTrackTitle, $comparison); + } + + /** + * Filter the query on the artist_name column + * + * Example usage: + * + * $query->filterByDbArtistName('fooValue'); // WHERE artist_name = 'fooValue' + * $query->filterByDbArtistName('%fooValue%'); // WHERE artist_name LIKE '%fooValue%' + * + * + * @param string $dbArtistName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbArtistName($dbArtistName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbArtistName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbArtistName)) { + $dbArtistName = str_replace('*', '%', $dbArtistName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::ARTIST_NAME, $dbArtistName, $comparison); + } + + /** + * Filter the query on the bit_rate column + * + * Example usage: + * + * $query->filterByDbBitRate(1234); // WHERE bit_rate = 1234 + * $query->filterByDbBitRate(array(12, 34)); // WHERE bit_rate IN (12, 34) + * $query->filterByDbBitRate(array('min' => 12)); // WHERE bit_rate >= 12 + * $query->filterByDbBitRate(array('max' => 12)); // WHERE bit_rate <= 12 + * + * + * @param mixed $dbBitRate The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbBitRate($dbBitRate = null, $comparison = null) + { + if (is_array($dbBitRate)) { + $useMinMax = false; + if (isset($dbBitRate['min'])) { + $this->addUsingAlias(CcFilesPeer::BIT_RATE, $dbBitRate['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbBitRate['max'])) { + $this->addUsingAlias(CcFilesPeer::BIT_RATE, $dbBitRate['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::BIT_RATE, $dbBitRate, $comparison); + } + + /** + * Filter the query on the sample_rate column + * + * Example usage: + * + * $query->filterByDbSampleRate(1234); // WHERE sample_rate = 1234 + * $query->filterByDbSampleRate(array(12, 34)); // WHERE sample_rate IN (12, 34) + * $query->filterByDbSampleRate(array('min' => 12)); // WHERE sample_rate >= 12 + * $query->filterByDbSampleRate(array('max' => 12)); // WHERE sample_rate <= 12 + * + * + * @param mixed $dbSampleRate The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbSampleRate($dbSampleRate = null, $comparison = null) + { + if (is_array($dbSampleRate)) { + $useMinMax = false; + if (isset($dbSampleRate['min'])) { + $this->addUsingAlias(CcFilesPeer::SAMPLE_RATE, $dbSampleRate['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbSampleRate['max'])) { + $this->addUsingAlias(CcFilesPeer::SAMPLE_RATE, $dbSampleRate['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::SAMPLE_RATE, $dbSampleRate, $comparison); + } + + /** + * Filter the query on the format column + * + * Example usage: + * + * $query->filterByDbFormat('fooValue'); // WHERE format = 'fooValue' + * $query->filterByDbFormat('%fooValue%'); // WHERE format LIKE '%fooValue%' + * + * + * @param string $dbFormat The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbFormat($dbFormat = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbFormat)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbFormat)) { + $dbFormat = str_replace('*', '%', $dbFormat); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::FORMAT, $dbFormat, $comparison); + } + + /** + * Filter the query on the length column + * + * Example usage: + * + * $query->filterByDbLength('fooValue'); // WHERE length = 'fooValue' + * $query->filterByDbLength('%fooValue%'); // WHERE length LIKE '%fooValue%' + * + * + * @param string $dbLength The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbLength($dbLength = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLength)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLength)) { + $dbLength = str_replace('*', '%', $dbLength); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::LENGTH, $dbLength, $comparison); + } + + /** + * Filter the query on the album_title column + * + * Example usage: + * + * $query->filterByDbAlbumTitle('fooValue'); // WHERE album_title = 'fooValue' + * $query->filterByDbAlbumTitle('%fooValue%'); // WHERE album_title LIKE '%fooValue%' + * + * + * @param string $dbAlbumTitle The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbAlbumTitle($dbAlbumTitle = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbAlbumTitle)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbAlbumTitle)) { + $dbAlbumTitle = str_replace('*', '%', $dbAlbumTitle); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::ALBUM_TITLE, $dbAlbumTitle, $comparison); + } + + /** + * Filter the query on the genre column + * + * Example usage: + * + * $query->filterByDbGenre('fooValue'); // WHERE genre = 'fooValue' + * $query->filterByDbGenre('%fooValue%'); // WHERE genre LIKE '%fooValue%' + * + * + * @param string $dbGenre The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbGenre($dbGenre = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbGenre)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbGenre)) { + $dbGenre = str_replace('*', '%', $dbGenre); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::GENRE, $dbGenre, $comparison); + } + + /** + * Filter the query on the comments column + * + * Example usage: + * + * $query->filterByDbComments('fooValue'); // WHERE comments = 'fooValue' + * $query->filterByDbComments('%fooValue%'); // WHERE comments LIKE '%fooValue%' + * + * + * @param string $dbComments The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbComments($dbComments = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbComments)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbComments)) { + $dbComments = str_replace('*', '%', $dbComments); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::COMMENTS, $dbComments, $comparison); + } + + /** + * Filter the query on the year column + * + * Example usage: + * + * $query->filterByDbYear('fooValue'); // WHERE year = 'fooValue' + * $query->filterByDbYear('%fooValue%'); // WHERE year LIKE '%fooValue%' + * + * + * @param string $dbYear The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbYear($dbYear = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbYear)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbYear)) { + $dbYear = str_replace('*', '%', $dbYear); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::YEAR, $dbYear, $comparison); + } + + /** + * Filter the query on the track_number column + * + * Example usage: + * + * $query->filterByDbTrackNumber(1234); // WHERE track_number = 1234 + * $query->filterByDbTrackNumber(array(12, 34)); // WHERE track_number IN (12, 34) + * $query->filterByDbTrackNumber(array('min' => 12)); // WHERE track_number >= 12 + * $query->filterByDbTrackNumber(array('max' => 12)); // WHERE track_number <= 12 + * + * + * @param mixed $dbTrackNumber The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbTrackNumber($dbTrackNumber = null, $comparison = null) + { + if (is_array($dbTrackNumber)) { + $useMinMax = false; + if (isset($dbTrackNumber['min'])) { + $this->addUsingAlias(CcFilesPeer::TRACK_NUMBER, $dbTrackNumber['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbTrackNumber['max'])) { + $this->addUsingAlias(CcFilesPeer::TRACK_NUMBER, $dbTrackNumber['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::TRACK_NUMBER, $dbTrackNumber, $comparison); + } + + /** + * Filter the query on the channels column + * + * Example usage: + * + * $query->filterByDbChannels(1234); // WHERE channels = 1234 + * $query->filterByDbChannels(array(12, 34)); // WHERE channels IN (12, 34) + * $query->filterByDbChannels(array('min' => 12)); // WHERE channels >= 12 + * $query->filterByDbChannels(array('max' => 12)); // WHERE channels <= 12 + * + * + * @param mixed $dbChannels The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbChannels($dbChannels = null, $comparison = null) + { + if (is_array($dbChannels)) { + $useMinMax = false; + if (isset($dbChannels['min'])) { + $this->addUsingAlias(CcFilesPeer::CHANNELS, $dbChannels['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbChannels['max'])) { + $this->addUsingAlias(CcFilesPeer::CHANNELS, $dbChannels['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::CHANNELS, $dbChannels, $comparison); + } + + /** + * Filter the query on the url column + * + * Example usage: + * + * $query->filterByDbUrl('fooValue'); // WHERE url = 'fooValue' + * $query->filterByDbUrl('%fooValue%'); // WHERE url LIKE '%fooValue%' + * + * + * @param string $dbUrl The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbUrl($dbUrl = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbUrl)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbUrl)) { + $dbUrl = str_replace('*', '%', $dbUrl); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::URL, $dbUrl, $comparison); + } + + /** + * Filter the query on the bpm column + * + * Example usage: + * + * $query->filterByDbBpm(1234); // WHERE bpm = 1234 + * $query->filterByDbBpm(array(12, 34)); // WHERE bpm IN (12, 34) + * $query->filterByDbBpm(array('min' => 12)); // WHERE bpm >= 12 + * $query->filterByDbBpm(array('max' => 12)); // WHERE bpm <= 12 + * + * + * @param mixed $dbBpm The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbBpm($dbBpm = null, $comparison = null) + { + if (is_array($dbBpm)) { + $useMinMax = false; + if (isset($dbBpm['min'])) { + $this->addUsingAlias(CcFilesPeer::BPM, $dbBpm['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbBpm['max'])) { + $this->addUsingAlias(CcFilesPeer::BPM, $dbBpm['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::BPM, $dbBpm, $comparison); + } + + /** + * Filter the query on the rating column + * + * Example usage: + * + * $query->filterByDbRating('fooValue'); // WHERE rating = 'fooValue' + * $query->filterByDbRating('%fooValue%'); // WHERE rating LIKE '%fooValue%' + * + * + * @param string $dbRating The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbRating($dbRating = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbRating)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbRating)) { + $dbRating = str_replace('*', '%', $dbRating); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::RATING, $dbRating, $comparison); + } + + /** + * Filter the query on the encoded_by column + * + * Example usage: + * + * $query->filterByDbEncodedBy('fooValue'); // WHERE encoded_by = 'fooValue' + * $query->filterByDbEncodedBy('%fooValue%'); // WHERE encoded_by LIKE '%fooValue%' + * + * + * @param string $dbEncodedBy The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbEncodedBy($dbEncodedBy = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbEncodedBy)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbEncodedBy)) { + $dbEncodedBy = str_replace('*', '%', $dbEncodedBy); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::ENCODED_BY, $dbEncodedBy, $comparison); + } + + /** + * Filter the query on the disc_number column + * + * Example usage: + * + * $query->filterByDbDiscNumber('fooValue'); // WHERE disc_number = 'fooValue' + * $query->filterByDbDiscNumber('%fooValue%'); // WHERE disc_number LIKE '%fooValue%' + * + * + * @param string $dbDiscNumber The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbDiscNumber($dbDiscNumber = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbDiscNumber)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbDiscNumber)) { + $dbDiscNumber = str_replace('*', '%', $dbDiscNumber); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::DISC_NUMBER, $dbDiscNumber, $comparison); + } + + /** + * Filter the query on the mood column + * + * Example usage: + * + * $query->filterByDbMood('fooValue'); // WHERE mood = 'fooValue' + * $query->filterByDbMood('%fooValue%'); // WHERE mood LIKE '%fooValue%' + * + * + * @param string $dbMood The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbMood($dbMood = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbMood)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbMood)) { + $dbMood = str_replace('*', '%', $dbMood); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::MOOD, $dbMood, $comparison); + } + + /** + * Filter the query on the label column + * + * Example usage: + * + * $query->filterByDbLabel('fooValue'); // WHERE label = 'fooValue' + * $query->filterByDbLabel('%fooValue%'); // WHERE label LIKE '%fooValue%' + * + * + * @param string $dbLabel The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbLabel($dbLabel = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLabel)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLabel)) { + $dbLabel = str_replace('*', '%', $dbLabel); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::LABEL, $dbLabel, $comparison); + } + + /** + * Filter the query on the composer column + * + * Example usage: + * + * $query->filterByDbComposer('fooValue'); // WHERE composer = 'fooValue' + * $query->filterByDbComposer('%fooValue%'); // WHERE composer LIKE '%fooValue%' + * + * + * @param string $dbComposer The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbComposer($dbComposer = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbComposer)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbComposer)) { + $dbComposer = str_replace('*', '%', $dbComposer); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::COMPOSER, $dbComposer, $comparison); + } + + /** + * Filter the query on the encoder column + * + * Example usage: + * + * $query->filterByDbEncoder('fooValue'); // WHERE encoder = 'fooValue' + * $query->filterByDbEncoder('%fooValue%'); // WHERE encoder LIKE '%fooValue%' + * + * + * @param string $dbEncoder The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbEncoder($dbEncoder = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbEncoder)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbEncoder)) { + $dbEncoder = str_replace('*', '%', $dbEncoder); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::ENCODER, $dbEncoder, $comparison); + } + + /** + * Filter the query on the checksum column + * + * Example usage: + * + * $query->filterByDbChecksum('fooValue'); // WHERE checksum = 'fooValue' + * $query->filterByDbChecksum('%fooValue%'); // WHERE checksum LIKE '%fooValue%' + * + * + * @param string $dbChecksum The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbChecksum($dbChecksum = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbChecksum)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbChecksum)) { + $dbChecksum = str_replace('*', '%', $dbChecksum); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::CHECKSUM, $dbChecksum, $comparison); + } + + /** + * Filter the query on the lyrics column + * + * Example usage: + * + * $query->filterByDbLyrics('fooValue'); // WHERE lyrics = 'fooValue' + * $query->filterByDbLyrics('%fooValue%'); // WHERE lyrics LIKE '%fooValue%' + * + * + * @param string $dbLyrics The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbLyrics($dbLyrics = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLyrics)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLyrics)) { + $dbLyrics = str_replace('*', '%', $dbLyrics); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::LYRICS, $dbLyrics, $comparison); + } + + /** + * Filter the query on the orchestra column + * + * Example usage: + * + * $query->filterByDbOrchestra('fooValue'); // WHERE orchestra = 'fooValue' + * $query->filterByDbOrchestra('%fooValue%'); // WHERE orchestra LIKE '%fooValue%' + * + * + * @param string $dbOrchestra The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbOrchestra($dbOrchestra = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbOrchestra)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbOrchestra)) { + $dbOrchestra = str_replace('*', '%', $dbOrchestra); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::ORCHESTRA, $dbOrchestra, $comparison); + } + + /** + * Filter the query on the conductor column + * + * Example usage: + * + * $query->filterByDbConductor('fooValue'); // WHERE conductor = 'fooValue' + * $query->filterByDbConductor('%fooValue%'); // WHERE conductor LIKE '%fooValue%' + * + * + * @param string $dbConductor The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbConductor($dbConductor = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbConductor)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbConductor)) { + $dbConductor = str_replace('*', '%', $dbConductor); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::CONDUCTOR, $dbConductor, $comparison); + } + + /** + * Filter the query on the lyricist column + * + * Example usage: + * + * $query->filterByDbLyricist('fooValue'); // WHERE lyricist = 'fooValue' + * $query->filterByDbLyricist('%fooValue%'); // WHERE lyricist LIKE '%fooValue%' + * + * + * @param string $dbLyricist The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbLyricist($dbLyricist = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLyricist)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLyricist)) { + $dbLyricist = str_replace('*', '%', $dbLyricist); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::LYRICIST, $dbLyricist, $comparison); + } + + /** + * Filter the query on the original_lyricist column + * + * Example usage: + * + * $query->filterByDbOriginalLyricist('fooValue'); // WHERE original_lyricist = 'fooValue' + * $query->filterByDbOriginalLyricist('%fooValue%'); // WHERE original_lyricist LIKE '%fooValue%' + * + * + * @param string $dbOriginalLyricist The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbOriginalLyricist($dbOriginalLyricist = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbOriginalLyricist)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbOriginalLyricist)) { + $dbOriginalLyricist = str_replace('*', '%', $dbOriginalLyricist); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::ORIGINAL_LYRICIST, $dbOriginalLyricist, $comparison); + } + + /** + * Filter the query on the radio_station_name column + * + * Example usage: + * + * $query->filterByDbRadioStationName('fooValue'); // WHERE radio_station_name = 'fooValue' + * $query->filterByDbRadioStationName('%fooValue%'); // WHERE radio_station_name LIKE '%fooValue%' + * + * + * @param string $dbRadioStationName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbRadioStationName($dbRadioStationName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbRadioStationName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbRadioStationName)) { + $dbRadioStationName = str_replace('*', '%', $dbRadioStationName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::RADIO_STATION_NAME, $dbRadioStationName, $comparison); + } + + /** + * Filter the query on the info_url column + * + * Example usage: + * + * $query->filterByDbInfoUrl('fooValue'); // WHERE info_url = 'fooValue' + * $query->filterByDbInfoUrl('%fooValue%'); // WHERE info_url LIKE '%fooValue%' + * + * + * @param string $dbInfoUrl The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbInfoUrl($dbInfoUrl = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbInfoUrl)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbInfoUrl)) { + $dbInfoUrl = str_replace('*', '%', $dbInfoUrl); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::INFO_URL, $dbInfoUrl, $comparison); + } + + /** + * Filter the query on the artist_url column + * + * Example usage: + * + * $query->filterByDbArtistUrl('fooValue'); // WHERE artist_url = 'fooValue' + * $query->filterByDbArtistUrl('%fooValue%'); // WHERE artist_url LIKE '%fooValue%' + * + * + * @param string $dbArtistUrl The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbArtistUrl($dbArtistUrl = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbArtistUrl)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbArtistUrl)) { + $dbArtistUrl = str_replace('*', '%', $dbArtistUrl); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::ARTIST_URL, $dbArtistUrl, $comparison); + } + + /** + * Filter the query on the audio_source_url column + * + * Example usage: + * + * $query->filterByDbAudioSourceUrl('fooValue'); // WHERE audio_source_url = 'fooValue' + * $query->filterByDbAudioSourceUrl('%fooValue%'); // WHERE audio_source_url LIKE '%fooValue%' + * + * + * @param string $dbAudioSourceUrl The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbAudioSourceUrl($dbAudioSourceUrl = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbAudioSourceUrl)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbAudioSourceUrl)) { + $dbAudioSourceUrl = str_replace('*', '%', $dbAudioSourceUrl); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::AUDIO_SOURCE_URL, $dbAudioSourceUrl, $comparison); + } + + /** + * Filter the query on the radio_station_url column + * + * Example usage: + * + * $query->filterByDbRadioStationUrl('fooValue'); // WHERE radio_station_url = 'fooValue' + * $query->filterByDbRadioStationUrl('%fooValue%'); // WHERE radio_station_url LIKE '%fooValue%' + * + * + * @param string $dbRadioStationUrl The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbRadioStationUrl($dbRadioStationUrl = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbRadioStationUrl)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbRadioStationUrl)) { + $dbRadioStationUrl = str_replace('*', '%', $dbRadioStationUrl); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::RADIO_STATION_URL, $dbRadioStationUrl, $comparison); + } + + /** + * Filter the query on the buy_this_url column + * + * Example usage: + * + * $query->filterByDbBuyThisUrl('fooValue'); // WHERE buy_this_url = 'fooValue' + * $query->filterByDbBuyThisUrl('%fooValue%'); // WHERE buy_this_url LIKE '%fooValue%' + * + * + * @param string $dbBuyThisUrl The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbBuyThisUrl($dbBuyThisUrl = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbBuyThisUrl)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbBuyThisUrl)) { + $dbBuyThisUrl = str_replace('*', '%', $dbBuyThisUrl); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::BUY_THIS_URL, $dbBuyThisUrl, $comparison); + } + + /** + * Filter the query on the isrc_number column + * + * Example usage: + * + * $query->filterByDbIsrcNumber('fooValue'); // WHERE isrc_number = 'fooValue' + * $query->filterByDbIsrcNumber('%fooValue%'); // WHERE isrc_number LIKE '%fooValue%' + * + * + * @param string $dbIsrcNumber The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbIsrcNumber($dbIsrcNumber = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbIsrcNumber)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbIsrcNumber)) { + $dbIsrcNumber = str_replace('*', '%', $dbIsrcNumber); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::ISRC_NUMBER, $dbIsrcNumber, $comparison); + } + + /** + * Filter the query on the catalog_number column + * + * Example usage: + * + * $query->filterByDbCatalogNumber('fooValue'); // WHERE catalog_number = 'fooValue' + * $query->filterByDbCatalogNumber('%fooValue%'); // WHERE catalog_number LIKE '%fooValue%' + * + * + * @param string $dbCatalogNumber The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbCatalogNumber($dbCatalogNumber = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCatalogNumber)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCatalogNumber)) { + $dbCatalogNumber = str_replace('*', '%', $dbCatalogNumber); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::CATALOG_NUMBER, $dbCatalogNumber, $comparison); + } + + /** + * Filter the query on the original_artist column + * + * Example usage: + * + * $query->filterByDbOriginalArtist('fooValue'); // WHERE original_artist = 'fooValue' + * $query->filterByDbOriginalArtist('%fooValue%'); // WHERE original_artist LIKE '%fooValue%' + * + * + * @param string $dbOriginalArtist The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbOriginalArtist($dbOriginalArtist = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbOriginalArtist)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbOriginalArtist)) { + $dbOriginalArtist = str_replace('*', '%', $dbOriginalArtist); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::ORIGINAL_ARTIST, $dbOriginalArtist, $comparison); + } + + /** + * Filter the query on the copyright column + * + * Example usage: + * + * $query->filterByDbCopyright('fooValue'); // WHERE copyright = 'fooValue' + * $query->filterByDbCopyright('%fooValue%'); // WHERE copyright LIKE '%fooValue%' + * + * + * @param string $dbCopyright The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbCopyright($dbCopyright = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCopyright)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCopyright)) { + $dbCopyright = str_replace('*', '%', $dbCopyright); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::COPYRIGHT, $dbCopyright, $comparison); + } + + /** + * Filter the query on the report_datetime column + * + * Example usage: + * + * $query->filterByDbReportDatetime('fooValue'); // WHERE report_datetime = 'fooValue' + * $query->filterByDbReportDatetime('%fooValue%'); // WHERE report_datetime LIKE '%fooValue%' + * + * + * @param string $dbReportDatetime The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbReportDatetime($dbReportDatetime = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbReportDatetime)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbReportDatetime)) { + $dbReportDatetime = str_replace('*', '%', $dbReportDatetime); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::REPORT_DATETIME, $dbReportDatetime, $comparison); + } + + /** + * Filter the query on the report_location column + * + * Example usage: + * + * $query->filterByDbReportLocation('fooValue'); // WHERE report_location = 'fooValue' + * $query->filterByDbReportLocation('%fooValue%'); // WHERE report_location LIKE '%fooValue%' + * + * + * @param string $dbReportLocation The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbReportLocation($dbReportLocation = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbReportLocation)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbReportLocation)) { + $dbReportLocation = str_replace('*', '%', $dbReportLocation); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::REPORT_LOCATION, $dbReportLocation, $comparison); + } + + /** + * Filter the query on the report_organization column + * + * Example usage: + * + * $query->filterByDbReportOrganization('fooValue'); // WHERE report_organization = 'fooValue' + * $query->filterByDbReportOrganization('%fooValue%'); // WHERE report_organization LIKE '%fooValue%' + * + * + * @param string $dbReportOrganization The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbReportOrganization($dbReportOrganization = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbReportOrganization)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbReportOrganization)) { + $dbReportOrganization = str_replace('*', '%', $dbReportOrganization); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::REPORT_ORGANIZATION, $dbReportOrganization, $comparison); + } + + /** + * Filter the query on the subject column + * + * Example usage: + * + * $query->filterByDbSubject('fooValue'); // WHERE subject = 'fooValue' + * $query->filterByDbSubject('%fooValue%'); // WHERE subject LIKE '%fooValue%' + * + * + * @param string $dbSubject The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbSubject($dbSubject = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbSubject)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbSubject)) { + $dbSubject = str_replace('*', '%', $dbSubject); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::SUBJECT, $dbSubject, $comparison); + } + + /** + * Filter the query on the contributor column + * + * Example usage: + * + * $query->filterByDbContributor('fooValue'); // WHERE contributor = 'fooValue' + * $query->filterByDbContributor('%fooValue%'); // WHERE contributor LIKE '%fooValue%' + * + * + * @param string $dbContributor The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbContributor($dbContributor = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbContributor)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbContributor)) { + $dbContributor = str_replace('*', '%', $dbContributor); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::CONTRIBUTOR, $dbContributor, $comparison); + } + + /** + * Filter the query on the language column + * + * Example usage: + * + * $query->filterByDbLanguage('fooValue'); // WHERE language = 'fooValue' + * $query->filterByDbLanguage('%fooValue%'); // WHERE language LIKE '%fooValue%' + * + * + * @param string $dbLanguage The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbLanguage($dbLanguage = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLanguage)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLanguage)) { + $dbLanguage = str_replace('*', '%', $dbLanguage); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::LANGUAGE, $dbLanguage, $comparison); + } + + /** + * Filter the query on the file_exists column + * + * Example usage: + * + * $query->filterByDbFileExists(true); // WHERE file_exists = true + * $query->filterByDbFileExists('yes'); // WHERE file_exists = true + * + * + * @param boolean|string $dbFileExists The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbFileExists($dbFileExists = null, $comparison = null) + { + if (is_string($dbFileExists)) { + $dbFileExists = in_array(strtolower($dbFileExists), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcFilesPeer::FILE_EXISTS, $dbFileExists, $comparison); + } + + /** + * Filter the query on the soundcloud_id column + * + * Example usage: + * + * $query->filterByDbSoundcloudId(1234); // WHERE soundcloud_id = 1234 + * $query->filterByDbSoundcloudId(array(12, 34)); // WHERE soundcloud_id IN (12, 34) + * $query->filterByDbSoundcloudId(array('min' => 12)); // WHERE soundcloud_id >= 12 + * $query->filterByDbSoundcloudId(array('max' => 12)); // WHERE soundcloud_id <= 12 + * + * + * @param mixed $dbSoundcloudId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbSoundcloudId($dbSoundcloudId = null, $comparison = null) + { + if (is_array($dbSoundcloudId)) { + $useMinMax = false; + if (isset($dbSoundcloudId['min'])) { + $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ID, $dbSoundcloudId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbSoundcloudId['max'])) { + $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ID, $dbSoundcloudId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ID, $dbSoundcloudId, $comparison); + } + + /** + * Filter the query on the soundcloud_error_code column + * + * Example usage: + * + * $query->filterByDbSoundcloudErrorCode(1234); // WHERE soundcloud_error_code = 1234 + * $query->filterByDbSoundcloudErrorCode(array(12, 34)); // WHERE soundcloud_error_code IN (12, 34) + * $query->filterByDbSoundcloudErrorCode(array('min' => 12)); // WHERE soundcloud_error_code >= 12 + * $query->filterByDbSoundcloudErrorCode(array('max' => 12)); // WHERE soundcloud_error_code <= 12 + * + * + * @param mixed $dbSoundcloudErrorCode The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbSoundcloudErrorCode($dbSoundcloudErrorCode = null, $comparison = null) + { + if (is_array($dbSoundcloudErrorCode)) { + $useMinMax = false; + if (isset($dbSoundcloudErrorCode['min'])) { + $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ERROR_CODE, $dbSoundcloudErrorCode['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbSoundcloudErrorCode['max'])) { + $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ERROR_CODE, $dbSoundcloudErrorCode['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ERROR_CODE, $dbSoundcloudErrorCode, $comparison); + } + + /** + * Filter the query on the soundcloud_error_msg column + * + * Example usage: + * + * $query->filterByDbSoundcloudErrorMsg('fooValue'); // WHERE soundcloud_error_msg = 'fooValue' + * $query->filterByDbSoundcloudErrorMsg('%fooValue%'); // WHERE soundcloud_error_msg LIKE '%fooValue%' + * + * + * @param string $dbSoundcloudErrorMsg The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbSoundcloudErrorMsg($dbSoundcloudErrorMsg = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbSoundcloudErrorMsg)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbSoundcloudErrorMsg)) { + $dbSoundcloudErrorMsg = str_replace('*', '%', $dbSoundcloudErrorMsg); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_ERROR_MSG, $dbSoundcloudErrorMsg, $comparison); + } + + /** + * Filter the query on the soundcloud_link_to_file column + * + * Example usage: + * + * $query->filterByDbSoundcloudLinkToFile('fooValue'); // WHERE soundcloud_link_to_file = 'fooValue' + * $query->filterByDbSoundcloudLinkToFile('%fooValue%'); // WHERE soundcloud_link_to_file LIKE '%fooValue%' + * + * + * @param string $dbSoundcloudLinkToFile The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbSoundcloudLinkToFile($dbSoundcloudLinkToFile = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbSoundcloudLinkToFile)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbSoundcloudLinkToFile)) { + $dbSoundcloudLinkToFile = str_replace('*', '%', $dbSoundcloudLinkToFile); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE, $dbSoundcloudLinkToFile, $comparison); + } + + /** + * Filter the query on the soundcloud_upload_time column + * + * Example usage: + * + * $query->filterByDbSoundCloundUploadTime('2011-03-14'); // WHERE soundcloud_upload_time = '2011-03-14' + * $query->filterByDbSoundCloundUploadTime('now'); // WHERE soundcloud_upload_time = '2011-03-14' + * $query->filterByDbSoundCloundUploadTime(array('max' => 'yesterday')); // WHERE soundcloud_upload_time < '2011-03-13' + * + * + * @param mixed $dbSoundCloundUploadTime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbSoundCloundUploadTime($dbSoundCloundUploadTime = null, $comparison = null) + { + if (is_array($dbSoundCloundUploadTime)) { + $useMinMax = false; + if (isset($dbSoundCloundUploadTime['min'])) { + $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, $dbSoundCloundUploadTime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbSoundCloundUploadTime['max'])) { + $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, $dbSoundCloundUploadTime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, $dbSoundCloundUploadTime, $comparison); + } + + /** + * Filter the query on the replay_gain column + * + * Example usage: + * + * $query->filterByDbReplayGain(1234); // WHERE replay_gain = 1234 + * $query->filterByDbReplayGain(array(12, 34)); // WHERE replay_gain IN (12, 34) + * $query->filterByDbReplayGain(array('min' => 12)); // WHERE replay_gain >= 12 + * $query->filterByDbReplayGain(array('max' => 12)); // WHERE replay_gain <= 12 + * + * + * @param mixed $dbReplayGain The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbReplayGain($dbReplayGain = null, $comparison = null) + { + if (is_array($dbReplayGain)) { + $useMinMax = false; + if (isset($dbReplayGain['min'])) { + $this->addUsingAlias(CcFilesPeer::REPLAY_GAIN, $dbReplayGain['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbReplayGain['max'])) { + $this->addUsingAlias(CcFilesPeer::REPLAY_GAIN, $dbReplayGain['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::REPLAY_GAIN, $dbReplayGain, $comparison); + } + + /** + * Filter the query on the owner_id column + * + * Example usage: + * + * $query->filterByDbOwnerId(1234); // WHERE owner_id = 1234 + * $query->filterByDbOwnerId(array(12, 34)); // WHERE owner_id IN (12, 34) + * $query->filterByDbOwnerId(array('min' => 12)); // WHERE owner_id >= 12 + * $query->filterByDbOwnerId(array('max' => 12)); // WHERE owner_id <= 12 + * + * + * @see filterByFkOwner() + * + * @param mixed $dbOwnerId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbOwnerId($dbOwnerId = null, $comparison = null) + { + if (is_array($dbOwnerId)) { + $useMinMax = false; + if (isset($dbOwnerId['min'])) { + $this->addUsingAlias(CcFilesPeer::OWNER_ID, $dbOwnerId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbOwnerId['max'])) { + $this->addUsingAlias(CcFilesPeer::OWNER_ID, $dbOwnerId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcFilesPeer::OWNER_ID, $dbOwnerId, $comparison); + } + + /** + * Filter the query on the cuein column + * + * Example usage: + * + * $query->filterByDbCuein('fooValue'); // WHERE cuein = 'fooValue' + * $query->filterByDbCuein('%fooValue%'); // WHERE cuein LIKE '%fooValue%' + * + * + * @param string $dbCuein The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbCuein($dbCuein = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCuein)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCuein)) { + $dbCuein = str_replace('*', '%', $dbCuein); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::CUEIN, $dbCuein, $comparison); + } + + /** + * Filter the query on the cueout column + * + * Example usage: + * + * $query->filterByDbCueout('fooValue'); // WHERE cueout = 'fooValue' + * $query->filterByDbCueout('%fooValue%'); // WHERE cueout LIKE '%fooValue%' + * + * + * @param string $dbCueout The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbCueout($dbCueout = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCueout)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCueout)) { + $dbCueout = str_replace('*', '%', $dbCueout); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::CUEOUT, $dbCueout, $comparison); + } + + /** + * Filter the query on the silan_check column + * + * Example usage: + * + * $query->filterByDbSilanCheck(true); // WHERE silan_check = true + * $query->filterByDbSilanCheck('yes'); // WHERE silan_check = true + * + * + * @param boolean|string $dbSilanCheck The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbSilanCheck($dbSilanCheck = null, $comparison = null) + { + if (is_string($dbSilanCheck)) { + $dbSilanCheck = in_array(strtolower($dbSilanCheck), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcFilesPeer::SILAN_CHECK, $dbSilanCheck, $comparison); + } + + /** + * Filter the query on the hidden column + * + * Example usage: + * + * $query->filterByDbHidden(true); // WHERE hidden = true + * $query->filterByDbHidden('yes'); // WHERE hidden = true + * + * + * @param boolean|string $dbHidden The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbHidden($dbHidden = null, $comparison = null) + { + if (is_string($dbHidden)) { + $dbHidden = in_array(strtolower($dbHidden), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcFilesPeer::HIDDEN, $dbHidden, $comparison); + } + + /** + * Filter the query on the is_scheduled column + * + * Example usage: + * + * $query->filterByDbIsScheduled(true); // WHERE is_scheduled = true + * $query->filterByDbIsScheduled('yes'); // WHERE is_scheduled = true + * + * + * @param boolean|string $dbIsScheduled The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbIsScheduled($dbIsScheduled = null, $comparison = null) + { + if (is_string($dbIsScheduled)) { + $dbIsScheduled = in_array(strtolower($dbIsScheduled), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcFilesPeer::IS_SCHEDULED, $dbIsScheduled, $comparison); + } + + /** + * Filter the query on the is_playlist column + * + * Example usage: + * + * $query->filterByDbIsPlaylist(true); // WHERE is_playlist = true + * $query->filterByDbIsPlaylist('yes'); // WHERE is_playlist = true + * + * + * @param boolean|string $dbIsPlaylist The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbIsPlaylist($dbIsPlaylist = null, $comparison = null) + { + if (is_string($dbIsPlaylist)) { + $dbIsPlaylist = in_array(strtolower($dbIsPlaylist), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcFilesPeer::IS_PLAYLIST, $dbIsPlaylist, $comparison); + } + + /** + * Filter the query on the resource_id column + * + * Example usage: + * + * $query->filterByDbResourceId('fooValue'); // WHERE resource_id = 'fooValue' + * $query->filterByDbResourceId('%fooValue%'); // WHERE resource_id LIKE '%fooValue%' + * + * + * @param string $dbResourceId The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function filterByDbResourceId($dbResourceId = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbResourceId)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbResourceId)) { + $dbResourceId = str_replace('*', '%', $dbResourceId); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::RESOURCE_ID, $dbResourceId, $comparison); + } + + /** + * Filter the query by a related CcSubjs object + * + * @param CcSubjs|PropelObjectCollection $ccSubjs The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByFkOwner($ccSubjs, $comparison = null) + { + if ($ccSubjs instanceof CcSubjs) { + return $this + ->addUsingAlias(CcFilesPeer::OWNER_ID, $ccSubjs->getDbId(), $comparison); + } elseif ($ccSubjs instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcFilesPeer::OWNER_ID, $ccSubjs->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByFkOwner() only accepts arguments of type CcSubjs or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the FkOwner relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function joinFkOwner($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('FkOwner'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'FkOwner'); + } + + return $this; + } + + /** + * Use the FkOwner relation CcSubjs object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery A secondary query class using the current class as primary query + */ + public function useFkOwnerQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinFkOwner($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'FkOwner', 'CcSubjsQuery'); + } + + /** + * Filter the query by a related CcSubjs object + * + * @param CcSubjs|PropelObjectCollection $ccSubjs The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSubjsRelatedByDbEditedby($ccSubjs, $comparison = null) + { + if ($ccSubjs instanceof CcSubjs) { + return $this + ->addUsingAlias(CcFilesPeer::EDITEDBY, $ccSubjs->getDbId(), $comparison); + } elseif ($ccSubjs instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcFilesPeer::EDITEDBY, $ccSubjs->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcSubjsRelatedByDbEditedby() only accepts arguments of type CcSubjs or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSubjsRelatedByDbEditedby relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function joinCcSubjsRelatedByDbEditedby($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSubjsRelatedByDbEditedby'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSubjsRelatedByDbEditedby'); + } + + return $this; + } + + /** + * Use the CcSubjsRelatedByDbEditedby relation CcSubjs object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery A secondary query class using the current class as primary query + */ + public function useCcSubjsRelatedByDbEditedbyQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcSubjsRelatedByDbEditedby($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSubjsRelatedByDbEditedby', 'CcSubjsQuery'); + } + + /** + * Filter the query by a related CcMusicDirs object + * + * @param CcMusicDirs|PropelObjectCollection $ccMusicDirs The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcMusicDirs($ccMusicDirs, $comparison = null) + { + if ($ccMusicDirs instanceof CcMusicDirs) { + return $this + ->addUsingAlias(CcFilesPeer::DIRECTORY, $ccMusicDirs->getId(), $comparison); + } elseif ($ccMusicDirs instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcFilesPeer::DIRECTORY, $ccMusicDirs->toKeyValue('PrimaryKey', 'Id'), $comparison); + } else { + throw new PropelException('filterByCcMusicDirs() only accepts arguments of type CcMusicDirs or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcMusicDirs relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function joinCcMusicDirs($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcMusicDirs'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcMusicDirs'); + } + + return $this; + } + + /** + * Use the CcMusicDirs relation CcMusicDirs object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcMusicDirsQuery A secondary query class using the current class as primary query + */ + public function useCcMusicDirsQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcMusicDirs($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcMusicDirs', 'CcMusicDirsQuery'); + } + + /** + * Filter the query by a related CcShowInstances object + * + * @param CcShowInstances|PropelObjectCollection $ccShowInstances the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShowInstances($ccShowInstances, $comparison = null) + { + if ($ccShowInstances instanceof CcShowInstances) { + return $this + ->addUsingAlias(CcFilesPeer::ID, $ccShowInstances->getDbRecordedFile(), $comparison); + } elseif ($ccShowInstances instanceof PropelObjectCollection) { + return $this + ->useCcShowInstancesQuery() + ->filterByPrimaryKeys($ccShowInstances->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcShowInstances() only accepts arguments of type CcShowInstances or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShowInstances relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function joinCcShowInstances($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShowInstances'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShowInstances'); + } + + return $this; + } + + /** + * Use the CcShowInstances relation CcShowInstances object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowInstancesQuery A secondary query class using the current class as primary query + */ + public function useCcShowInstancesQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcShowInstances($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShowInstances', 'CcShowInstancesQuery'); + } + + /** + * Filter the query by a related CcPlaylistcontents object + * + * @param CcPlaylistcontents|PropelObjectCollection $ccPlaylistcontents the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcPlaylistcontents($ccPlaylistcontents, $comparison = null) + { + if ($ccPlaylistcontents instanceof CcPlaylistcontents) { + return $this + ->addUsingAlias(CcFilesPeer::ID, $ccPlaylistcontents->getDbFileId(), $comparison); + } elseif ($ccPlaylistcontents instanceof PropelObjectCollection) { + return $this + ->useCcPlaylistcontentsQuery() + ->filterByPrimaryKeys($ccPlaylistcontents->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcPlaylistcontents() only accepts arguments of type CcPlaylistcontents or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcPlaylistcontents relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function joinCcPlaylistcontents($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcPlaylistcontents'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcPlaylistcontents'); + } + + return $this; + } + + /** + * Use the CcPlaylistcontents relation CcPlaylistcontents object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlaylistcontentsQuery A secondary query class using the current class as primary query + */ + public function useCcPlaylistcontentsQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcPlaylistcontents($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcPlaylistcontents', 'CcPlaylistcontentsQuery'); + } + + /** + * Filter the query by a related CcBlockcontents object + * + * @param CcBlockcontents|PropelObjectCollection $ccBlockcontents the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcBlockcontents($ccBlockcontents, $comparison = null) + { + if ($ccBlockcontents instanceof CcBlockcontents) { + return $this + ->addUsingAlias(CcFilesPeer::ID, $ccBlockcontents->getDbFileId(), $comparison); + } elseif ($ccBlockcontents instanceof PropelObjectCollection) { + return $this + ->useCcBlockcontentsQuery() + ->filterByPrimaryKeys($ccBlockcontents->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcBlockcontents() only accepts arguments of type CcBlockcontents or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcBlockcontents relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function joinCcBlockcontents($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcBlockcontents'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcBlockcontents'); + } + + return $this; + } + + /** + * Use the CcBlockcontents relation CcBlockcontents object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockcontentsQuery A secondary query class using the current class as primary query + */ + public function useCcBlockcontentsQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcBlockcontents($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcBlockcontents', 'CcBlockcontentsQuery'); + } + + /** + * Filter the query by a related CcSchedule object + * + * @param CcSchedule|PropelObjectCollection $ccSchedule the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSchedule($ccSchedule, $comparison = null) + { + if ($ccSchedule instanceof CcSchedule) { + return $this + ->addUsingAlias(CcFilesPeer::ID, $ccSchedule->getDbFileId(), $comparison); + } elseif ($ccSchedule instanceof PropelObjectCollection) { + return $this + ->useCcScheduleQuery() + ->filterByPrimaryKeys($ccSchedule->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcSchedule() only accepts arguments of type CcSchedule or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSchedule relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function joinCcSchedule($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSchedule'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSchedule'); + } + + return $this; + } + + /** + * Use the CcSchedule relation CcSchedule object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcScheduleQuery A secondary query class using the current class as primary query + */ + public function useCcScheduleQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcSchedule($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSchedule', 'CcScheduleQuery'); + } + + /** + * Filter the query by a related CcPlayoutHistory object + * + * @param CcPlayoutHistory|PropelObjectCollection $ccPlayoutHistory the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcPlayoutHistory($ccPlayoutHistory, $comparison = null) + { + if ($ccPlayoutHistory instanceof CcPlayoutHistory) { + return $this + ->addUsingAlias(CcFilesPeer::ID, $ccPlayoutHistory->getDbFileId(), $comparison); + } elseif ($ccPlayoutHistory instanceof PropelObjectCollection) { + return $this + ->useCcPlayoutHistoryQuery() + ->filterByPrimaryKeys($ccPlayoutHistory->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcPlayoutHistory() only accepts arguments of type CcPlayoutHistory or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcPlayoutHistory relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function joinCcPlayoutHistory($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcPlayoutHistory'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcPlayoutHistory'); + } + + return $this; + } + + /** + * Use the CcPlayoutHistory relation CcPlayoutHistory object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlayoutHistoryQuery A secondary query class using the current class as primary query + */ + public function useCcPlayoutHistoryQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcPlayoutHistory($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistory', 'CcPlayoutHistoryQuery'); + } + + /** + * Exclude object from result + * + * @param CcFiles $ccFiles Object to remove from the list of results + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function prune($ccFiles = null) + { + if ($ccFiles) { + $this->addUsingAlias(CcFilesPeer::ID, $ccFiles->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcListenerCount.php b/airtime_mvc/application/models/airtime/om/BaseCcListenerCount.php index 42c435123c..bd6044c339 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcListenerCount.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcListenerCount.php @@ -4,981 +4,1133 @@ /** * Base class that represents a row from the 'cc_listener_count' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcListenerCount extends BaseObject implements Persistent +abstract class BaseCcListenerCount extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcListenerCountPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcListenerCountPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the timestamp_id field. - * @var int - */ - protected $timestamp_id; - - /** - * The value for the mount_name_id field. - * @var int - */ - protected $mount_name_id; - - /** - * The value for the listener_count field. - * @var int - */ - protected $listener_count; - - /** - * @var CcTimestamp - */ - protected $aCcTimestamp; - - /** - * @var CcMountName - */ - protected $aCcMountName; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [timestamp_id] column value. - * - * @return int - */ - public function getDbTimestampId() - { - return $this->timestamp_id; - } - - /** - * Get the [mount_name_id] column value. - * - * @return int - */ - public function getDbMountNameId() - { - return $this->mount_name_id; - } - - /** - * Get the [listener_count] column value. - * - * @return int - */ - public function getDbListenerCount() - { - return $this->listener_count; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcListenerCount The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcListenerCountPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [timestamp_id] column. - * - * @param int $v new value - * @return CcListenerCount The current object (for fluent API support) - */ - public function setDbTimestampId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->timestamp_id !== $v) { - $this->timestamp_id = $v; - $this->modifiedColumns[] = CcListenerCountPeer::TIMESTAMP_ID; - } - - if ($this->aCcTimestamp !== null && $this->aCcTimestamp->getDbId() !== $v) { - $this->aCcTimestamp = null; - } - - return $this; - } // setDbTimestampId() - - /** - * Set the value of [mount_name_id] column. - * - * @param int $v new value - * @return CcListenerCount The current object (for fluent API support) - */ - public function setDbMountNameId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->mount_name_id !== $v) { - $this->mount_name_id = $v; - $this->modifiedColumns[] = CcListenerCountPeer::MOUNT_NAME_ID; - } - - if ($this->aCcMountName !== null && $this->aCcMountName->getDbId() !== $v) { - $this->aCcMountName = null; - } - - return $this; - } // setDbMountNameId() - - /** - * Set the value of [listener_count] column. - * - * @param int $v new value - * @return CcListenerCount The current object (for fluent API support) - */ - public function setDbListenerCount($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->listener_count !== $v) { - $this->listener_count = $v; - $this->modifiedColumns[] = CcListenerCountPeer::LISTENER_COUNT; - } - - return $this; - } // setDbListenerCount() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->timestamp_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->mount_name_id = ($row[$startcol + 2] !== null) ? (int) $row[$startcol + 2] : null; - $this->listener_count = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 4; // 4 = CcListenerCountPeer::NUM_COLUMNS - CcListenerCountPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcListenerCount object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcTimestamp !== null && $this->timestamp_id !== $this->aCcTimestamp->getDbId()) { - $this->aCcTimestamp = null; - } - if ($this->aCcMountName !== null && $this->mount_name_id !== $this->aCcMountName->getDbId()) { - $this->aCcMountName = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcListenerCountPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcTimestamp = null; - $this->aCcMountName = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcListenerCountQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcListenerCountPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcTimestamp !== null) { - if ($this->aCcTimestamp->isModified() || $this->aCcTimestamp->isNew()) { - $affectedRows += $this->aCcTimestamp->save($con); - } - $this->setCcTimestamp($this->aCcTimestamp); - } - - if ($this->aCcMountName !== null) { - if ($this->aCcMountName->isModified() || $this->aCcMountName->isNew()) { - $affectedRows += $this->aCcMountName->save($con); - } - $this->setCcMountName($this->aCcMountName); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcListenerCountPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcListenerCountPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcListenerCountPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcListenerCountPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcTimestamp !== null) { - if (!$this->aCcTimestamp->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcTimestamp->getValidationFailures()); - } - } - - if ($this->aCcMountName !== null) { - if (!$this->aCcMountName->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcMountName->getValidationFailures()); - } - } - - - if (($retval = CcListenerCountPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcListenerCountPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbTimestampId(); - break; - case 2: - return $this->getDbMountNameId(); - break; - case 3: - return $this->getDbListenerCount(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcListenerCountPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbTimestampId(), - $keys[2] => $this->getDbMountNameId(), - $keys[3] => $this->getDbListenerCount(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcTimestamp) { - $result['CcTimestamp'] = $this->aCcTimestamp->toArray($keyType, $includeLazyLoadColumns, true); - } - if (null !== $this->aCcMountName) { - $result['CcMountName'] = $this->aCcMountName->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcListenerCountPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbTimestampId($value); - break; - case 2: - $this->setDbMountNameId($value); - break; - case 3: - $this->setDbListenerCount($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcListenerCountPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbTimestampId($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbMountNameId($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbListenerCount($arr[$keys[3]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcListenerCountPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcListenerCountPeer::ID)) $criteria->add(CcListenerCountPeer::ID, $this->id); - if ($this->isColumnModified(CcListenerCountPeer::TIMESTAMP_ID)) $criteria->add(CcListenerCountPeer::TIMESTAMP_ID, $this->timestamp_id); - if ($this->isColumnModified(CcListenerCountPeer::MOUNT_NAME_ID)) $criteria->add(CcListenerCountPeer::MOUNT_NAME_ID, $this->mount_name_id); - if ($this->isColumnModified(CcListenerCountPeer::LISTENER_COUNT)) $criteria->add(CcListenerCountPeer::LISTENER_COUNT, $this->listener_count); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcListenerCountPeer::DATABASE_NAME); - $criteria->add(CcListenerCountPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcListenerCount (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbTimestampId($this->timestamp_id); - $copyObj->setDbMountNameId($this->mount_name_id); - $copyObj->setDbListenerCount($this->listener_count); - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcListenerCount Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcListenerCountPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcListenerCountPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcTimestamp object. - * - * @param CcTimestamp $v - * @return CcListenerCount The current object (for fluent API support) - * @throws PropelException - */ - public function setCcTimestamp(CcTimestamp $v = null) - { - if ($v === null) { - $this->setDbTimestampId(NULL); - } else { - $this->setDbTimestampId($v->getDbId()); - } - - $this->aCcTimestamp = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcTimestamp object, it will not be re-added. - if ($v !== null) { - $v->addCcListenerCount($this); - } - - return $this; - } - - - /** - * Get the associated CcTimestamp object - * - * @param PropelPDO Optional Connection object. - * @return CcTimestamp The associated CcTimestamp object. - * @throws PropelException - */ - public function getCcTimestamp(PropelPDO $con = null) - { - if ($this->aCcTimestamp === null && ($this->timestamp_id !== null)) { - $this->aCcTimestamp = CcTimestampQuery::create()->findPk($this->timestamp_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcTimestamp->addCcListenerCounts($this); - */ - } - return $this->aCcTimestamp; - } - - /** - * Declares an association between this object and a CcMountName object. - * - * @param CcMountName $v - * @return CcListenerCount The current object (for fluent API support) - * @throws PropelException - */ - public function setCcMountName(CcMountName $v = null) - { - if ($v === null) { - $this->setDbMountNameId(NULL); - } else { - $this->setDbMountNameId($v->getDbId()); - } - - $this->aCcMountName = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcMountName object, it will not be re-added. - if ($v !== null) { - $v->addCcListenerCount($this); - } - - return $this; - } - - - /** - * Get the associated CcMountName object - * - * @param PropelPDO Optional Connection object. - * @return CcMountName The associated CcMountName object. - * @throws PropelException - */ - public function getCcMountName(PropelPDO $con = null) - { - if ($this->aCcMountName === null && ($this->mount_name_id !== null)) { - $this->aCcMountName = CcMountNameQuery::create()->findPk($this->mount_name_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcMountName->addCcListenerCounts($this); - */ - } - return $this->aCcMountName; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->timestamp_id = null; - $this->mount_name_id = null; - $this->listener_count = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcTimestamp = null; - $this->aCcMountName = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcListenerCount + /** + * Peer class name + */ + const PEER = 'CcListenerCountPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcListenerCountPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the timestamp_id field. + * @var int + */ + protected $timestamp_id; + + /** + * The value for the mount_name_id field. + * @var int + */ + protected $mount_name_id; + + /** + * The value for the listener_count field. + * @var int + */ + protected $listener_count; + + /** + * @var CcTimestamp + */ + protected $aCcTimestamp; + + /** + * @var CcMountName + */ + protected $aCcMountName; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [timestamp_id] column value. + * + * @return int + */ + public function getDbTimestampId() + { + + return $this->timestamp_id; + } + + /** + * Get the [mount_name_id] column value. + * + * @return int + */ + public function getDbMountNameId() + { + + return $this->mount_name_id; + } + + /** + * Get the [listener_count] column value. + * + * @return int + */ + public function getDbListenerCount() + { + + return $this->listener_count; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcListenerCount The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcListenerCountPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [timestamp_id] column. + * + * @param int $v new value + * @return CcListenerCount The current object (for fluent API support) + */ + public function setDbTimestampId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->timestamp_id !== $v) { + $this->timestamp_id = $v; + $this->modifiedColumns[] = CcListenerCountPeer::TIMESTAMP_ID; + } + + if ($this->aCcTimestamp !== null && $this->aCcTimestamp->getDbId() !== $v) { + $this->aCcTimestamp = null; + } + + + return $this; + } // setDbTimestampId() + + /** + * Set the value of [mount_name_id] column. + * + * @param int $v new value + * @return CcListenerCount The current object (for fluent API support) + */ + public function setDbMountNameId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->mount_name_id !== $v) { + $this->mount_name_id = $v; + $this->modifiedColumns[] = CcListenerCountPeer::MOUNT_NAME_ID; + } + + if ($this->aCcMountName !== null && $this->aCcMountName->getDbId() !== $v) { + $this->aCcMountName = null; + } + + + return $this; + } // setDbMountNameId() + + /** + * Set the value of [listener_count] column. + * + * @param int $v new value + * @return CcListenerCount The current object (for fluent API support) + */ + public function setDbListenerCount($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->listener_count !== $v) { + $this->listener_count = $v; + $this->modifiedColumns[] = CcListenerCountPeer::LISTENER_COUNT; + } + + + return $this; + } // setDbListenerCount() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->timestamp_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->mount_name_id = ($row[$startcol + 2] !== null) ? (int) $row[$startcol + 2] : null; + $this->listener_count = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 4; // 4 = CcListenerCountPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcListenerCount object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcTimestamp !== null && $this->timestamp_id !== $this->aCcTimestamp->getDbId()) { + $this->aCcTimestamp = null; + } + if ($this->aCcMountName !== null && $this->mount_name_id !== $this->aCcMountName->getDbId()) { + $this->aCcMountName = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcListenerCountPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcTimestamp = null; + $this->aCcMountName = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcListenerCountQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcListenerCountPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcTimestamp !== null) { + if ($this->aCcTimestamp->isModified() || $this->aCcTimestamp->isNew()) { + $affectedRows += $this->aCcTimestamp->save($con); + } + $this->setCcTimestamp($this->aCcTimestamp); + } + + if ($this->aCcMountName !== null) { + if ($this->aCcMountName->isModified() || $this->aCcMountName->isNew()) { + $affectedRows += $this->aCcMountName->save($con); + } + $this->setCcMountName($this->aCcMountName); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcListenerCountPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcListenerCountPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_listener_count_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcListenerCountPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcListenerCountPeer::TIMESTAMP_ID)) { + $modifiedColumns[':p' . $index++] = '"timestamp_id"'; + } + if ($this->isColumnModified(CcListenerCountPeer::MOUNT_NAME_ID)) { + $modifiedColumns[':p' . $index++] = '"mount_name_id"'; + } + if ($this->isColumnModified(CcListenerCountPeer::LISTENER_COUNT)) { + $modifiedColumns[':p' . $index++] = '"listener_count"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_listener_count" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"timestamp_id"': + $stmt->bindValue($identifier, $this->timestamp_id, PDO::PARAM_INT); + break; + case '"mount_name_id"': + $stmt->bindValue($identifier, $this->mount_name_id, PDO::PARAM_INT); + break; + case '"listener_count"': + $stmt->bindValue($identifier, $this->listener_count, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcTimestamp !== null) { + if (!$this->aCcTimestamp->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcTimestamp->getValidationFailures()); + } + } + + if ($this->aCcMountName !== null) { + if (!$this->aCcMountName->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcMountName->getValidationFailures()); + } + } + + + if (($retval = CcListenerCountPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcListenerCountPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbTimestampId(); + break; + case 2: + return $this->getDbMountNameId(); + break; + case 3: + return $this->getDbListenerCount(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcListenerCount'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcListenerCount'][$this->getPrimaryKey()] = true; + $keys = CcListenerCountPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbTimestampId(), + $keys[2] => $this->getDbMountNameId(), + $keys[3] => $this->getDbListenerCount(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcTimestamp) { + $result['CcTimestamp'] = $this->aCcTimestamp->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->aCcMountName) { + $result['CcMountName'] = $this->aCcMountName->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcListenerCountPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbTimestampId($value); + break; + case 2: + $this->setDbMountNameId($value); + break; + case 3: + $this->setDbListenerCount($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcListenerCountPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbTimestampId($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbMountNameId($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbListenerCount($arr[$keys[3]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcListenerCountPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcListenerCountPeer::ID)) $criteria->add(CcListenerCountPeer::ID, $this->id); + if ($this->isColumnModified(CcListenerCountPeer::TIMESTAMP_ID)) $criteria->add(CcListenerCountPeer::TIMESTAMP_ID, $this->timestamp_id); + if ($this->isColumnModified(CcListenerCountPeer::MOUNT_NAME_ID)) $criteria->add(CcListenerCountPeer::MOUNT_NAME_ID, $this->mount_name_id); + if ($this->isColumnModified(CcListenerCountPeer::LISTENER_COUNT)) $criteria->add(CcListenerCountPeer::LISTENER_COUNT, $this->listener_count); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcListenerCountPeer::DATABASE_NAME); + $criteria->add(CcListenerCountPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcListenerCount (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbTimestampId($this->getDbTimestampId()); + $copyObj->setDbMountNameId($this->getDbMountNameId()); + $copyObj->setDbListenerCount($this->getDbListenerCount()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcListenerCount Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcListenerCountPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcListenerCountPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcTimestamp object. + * + * @param CcTimestamp $v + * @return CcListenerCount The current object (for fluent API support) + * @throws PropelException + */ + public function setCcTimestamp(CcTimestamp $v = null) + { + if ($v === null) { + $this->setDbTimestampId(NULL); + } else { + $this->setDbTimestampId($v->getDbId()); + } + + $this->aCcTimestamp = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcTimestamp object, it will not be re-added. + if ($v !== null) { + $v->addCcListenerCount($this); + } + + + return $this; + } + + + /** + * Get the associated CcTimestamp object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcTimestamp The associated CcTimestamp object. + * @throws PropelException + */ + public function getCcTimestamp(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcTimestamp === null && ($this->timestamp_id !== null) && $doQuery) { + $this->aCcTimestamp = CcTimestampQuery::create()->findPk($this->timestamp_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcTimestamp->addCcListenerCounts($this); + */ + } + + return $this->aCcTimestamp; + } + + /** + * Declares an association between this object and a CcMountName object. + * + * @param CcMountName $v + * @return CcListenerCount The current object (for fluent API support) + * @throws PropelException + */ + public function setCcMountName(CcMountName $v = null) + { + if ($v === null) { + $this->setDbMountNameId(NULL); + } else { + $this->setDbMountNameId($v->getDbId()); + } + + $this->aCcMountName = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcMountName object, it will not be re-added. + if ($v !== null) { + $v->addCcListenerCount($this); + } + + + return $this; + } + + + /** + * Get the associated CcMountName object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcMountName The associated CcMountName object. + * @throws PropelException + */ + public function getCcMountName(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcMountName === null && ($this->mount_name_id !== null) && $doQuery) { + $this->aCcMountName = CcMountNameQuery::create()->findPk($this->mount_name_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcMountName->addCcListenerCounts($this); + */ + } + + return $this->aCcMountName; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->timestamp_id = null; + $this->mount_name_id = null; + $this->listener_count = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcTimestamp instanceof Persistent) { + $this->aCcTimestamp->clearAllReferences($deep); + } + if ($this->aCcMountName instanceof Persistent) { + $this->aCcMountName->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcTimestamp = null; + $this->aCcMountName = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcListenerCountPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcListenerCountPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcListenerCountPeer.php index dad3a53b94..22898a8dd5 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcListenerCountPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcListenerCountPeer.php @@ -4,1363 +4,1395 @@ /** * Base static class for performing query and update operations on the 'cc_listener_count' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcListenerCountPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_listener_count'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcListenerCount'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcListenerCount'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcListenerCountTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 4; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_listener_count.ID'; - - /** the column name for the TIMESTAMP_ID field */ - const TIMESTAMP_ID = 'cc_listener_count.TIMESTAMP_ID'; - - /** the column name for the MOUNT_NAME_ID field */ - const MOUNT_NAME_ID = 'cc_listener_count.MOUNT_NAME_ID'; - - /** the column name for the LISTENER_COUNT field */ - const LISTENER_COUNT = 'cc_listener_count.LISTENER_COUNT'; - - /** - * An identiy map to hold any loaded instances of CcListenerCount objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcListenerCount[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbTimestampId', 'DbMountNameId', 'DbListenerCount', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbTimestampId', 'dbMountNameId', 'dbListenerCount', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::TIMESTAMP_ID, self::MOUNT_NAME_ID, self::LISTENER_COUNT, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'TIMESTAMP_ID', 'MOUNT_NAME_ID', 'LISTENER_COUNT', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'timestamp_id', 'mount_name_id', 'listener_count', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbTimestampId' => 1, 'DbMountNameId' => 2, 'DbListenerCount' => 3, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbTimestampId' => 1, 'dbMountNameId' => 2, 'dbListenerCount' => 3, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::TIMESTAMP_ID => 1, self::MOUNT_NAME_ID => 2, self::LISTENER_COUNT => 3, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'TIMESTAMP_ID' => 1, 'MOUNT_NAME_ID' => 2, 'LISTENER_COUNT' => 3, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'timestamp_id' => 1, 'mount_name_id' => 2, 'listener_count' => 3, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcListenerCountPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcListenerCountPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcListenerCountPeer::ID); - $criteria->addSelectColumn(CcListenerCountPeer::TIMESTAMP_ID); - $criteria->addSelectColumn(CcListenerCountPeer::MOUNT_NAME_ID); - $criteria->addSelectColumn(CcListenerCountPeer::LISTENER_COUNT); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.TIMESTAMP_ID'); - $criteria->addSelectColumn($alias . '.MOUNT_NAME_ID'); - $criteria->addSelectColumn($alias . '.LISTENER_COUNT'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcListenerCountPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcListenerCount - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcListenerCountPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcListenerCountPeer::populateObjects(CcListenerCountPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcListenerCountPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcListenerCount $value A CcListenerCount object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcListenerCount $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcListenerCount object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcListenerCount) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcListenerCount object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcListenerCount Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_listener_count - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcListenerCountPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcListenerCountPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcListenerCountPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcListenerCount object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcListenerCountPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcListenerCountPeer::NUM_COLUMNS; - } else { - $cls = CcListenerCountPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcListenerCountPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcTimestamp table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcTimestamp(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcListenerCountPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcListenerCountPeer::TIMESTAMP_ID, CcTimestampPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcMountName table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcMountName(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcListenerCountPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcListenerCountPeer::MOUNT_NAME_ID, CcMountNamePeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcListenerCount objects pre-filled with their CcTimestamp objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcListenerCount objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcTimestamp(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcListenerCountPeer::addSelectColumns($criteria); - $startcol = (CcListenerCountPeer::NUM_COLUMNS - CcListenerCountPeer::NUM_LAZY_LOAD_COLUMNS); - CcTimestampPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcListenerCountPeer::TIMESTAMP_ID, CcTimestampPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcListenerCountPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcListenerCountPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcListenerCountPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcTimestampPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcTimestampPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcTimestampPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcTimestampPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcListenerCount) to $obj2 (CcTimestamp) - $obj2->addCcListenerCount($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcListenerCount objects pre-filled with their CcMountName objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcListenerCount objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcMountName(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcListenerCountPeer::addSelectColumns($criteria); - $startcol = (CcListenerCountPeer::NUM_COLUMNS - CcListenerCountPeer::NUM_LAZY_LOAD_COLUMNS); - CcMountNamePeer::addSelectColumns($criteria); - - $criteria->addJoin(CcListenerCountPeer::MOUNT_NAME_ID, CcMountNamePeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcListenerCountPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcListenerCountPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcListenerCountPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcMountNamePeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcMountNamePeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcMountNamePeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcMountNamePeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcListenerCount) to $obj2 (CcMountName) - $obj2->addCcListenerCount($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcListenerCountPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcListenerCountPeer::TIMESTAMP_ID, CcTimestampPeer::ID, $join_behavior); - - $criteria->addJoin(CcListenerCountPeer::MOUNT_NAME_ID, CcMountNamePeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcListenerCount objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcListenerCount objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcListenerCountPeer::addSelectColumns($criteria); - $startcol2 = (CcListenerCountPeer::NUM_COLUMNS - CcListenerCountPeer::NUM_LAZY_LOAD_COLUMNS); - - CcTimestampPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcTimestampPeer::NUM_COLUMNS - CcTimestampPeer::NUM_LAZY_LOAD_COLUMNS); - - CcMountNamePeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcMountNamePeer::NUM_COLUMNS - CcMountNamePeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcListenerCountPeer::TIMESTAMP_ID, CcTimestampPeer::ID, $join_behavior); - - $criteria->addJoin(CcListenerCountPeer::MOUNT_NAME_ID, CcMountNamePeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcListenerCountPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcListenerCountPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcListenerCountPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcTimestamp rows - - $key2 = CcTimestampPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcTimestampPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcTimestampPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcTimestampPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcListenerCount) to the collection in $obj2 (CcTimestamp) - $obj2->addCcListenerCount($obj1); - } // if joined row not null - - // Add objects for joined CcMountName rows - - $key3 = CcMountNamePeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcMountNamePeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcMountNamePeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcMountNamePeer::addInstanceToPool($obj3, $key3); - } // if obj3 loaded - - // Add the $obj1 (CcListenerCount) to the collection in $obj3 (CcMountName) - $obj3->addCcListenerCount($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcTimestamp table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcTimestamp(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcListenerCountPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcListenerCountPeer::MOUNT_NAME_ID, CcMountNamePeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcMountName table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcMountName(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcListenerCountPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcListenerCountPeer::TIMESTAMP_ID, CcTimestampPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcListenerCount objects pre-filled with all related objects except CcTimestamp. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcListenerCount objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcTimestamp(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcListenerCountPeer::addSelectColumns($criteria); - $startcol2 = (CcListenerCountPeer::NUM_COLUMNS - CcListenerCountPeer::NUM_LAZY_LOAD_COLUMNS); - - CcMountNamePeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcMountNamePeer::NUM_COLUMNS - CcMountNamePeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcListenerCountPeer::MOUNT_NAME_ID, CcMountNamePeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcListenerCountPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcListenerCountPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcListenerCountPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcMountName rows - - $key2 = CcMountNamePeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcMountNamePeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcMountNamePeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcMountNamePeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcListenerCount) to the collection in $obj2 (CcMountName) - $obj2->addCcListenerCount($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcListenerCount objects pre-filled with all related objects except CcMountName. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcListenerCount objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcMountName(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcListenerCountPeer::addSelectColumns($criteria); - $startcol2 = (CcListenerCountPeer::NUM_COLUMNS - CcListenerCountPeer::NUM_LAZY_LOAD_COLUMNS); - - CcTimestampPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcTimestampPeer::NUM_COLUMNS - CcTimestampPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcListenerCountPeer::TIMESTAMP_ID, CcTimestampPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcListenerCountPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcListenerCountPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcListenerCountPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcTimestamp rows - - $key2 = CcTimestampPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcTimestampPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcTimestampPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcTimestampPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcListenerCount) to the collection in $obj2 (CcTimestamp) - $obj2->addCcListenerCount($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcListenerCountPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcListenerCountPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcListenerCountTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcListenerCountPeer::CLASS_DEFAULT : CcListenerCountPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcListenerCount or Criteria object. - * - * @param mixed $values Criteria or CcListenerCount object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcListenerCount object - } - - if ($criteria->containsKey(CcListenerCountPeer::ID) && $criteria->keyContainsValue(CcListenerCountPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcListenerCountPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcListenerCount or Criteria object. - * - * @param mixed $values Criteria or CcListenerCount object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcListenerCountPeer::ID); - $value = $criteria->remove(CcListenerCountPeer::ID); - if ($value) { - $selectCriteria->add(CcListenerCountPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); - } - - } else { // $values is CcListenerCount object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_listener_count table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcListenerCountPeer::TABLE_NAME, $con, CcListenerCountPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcListenerCountPeer::clearInstancePool(); - CcListenerCountPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcListenerCount or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcListenerCount object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcListenerCountPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcListenerCount) { // it's a model object - // invalidate the cache for this single object - CcListenerCountPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcListenerCountPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcListenerCountPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcListenerCountPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcListenerCount object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcListenerCount $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcListenerCount $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcListenerCountPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcListenerCountPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcListenerCountPeer::DATABASE_NAME, CcListenerCountPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcListenerCount - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcListenerCountPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcListenerCountPeer::DATABASE_NAME); - $criteria->add(CcListenerCountPeer::ID, $pk); - - $v = CcListenerCountPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcListenerCountPeer::DATABASE_NAME); - $criteria->add(CcListenerCountPeer::ID, $pks, Criteria::IN); - $objs = CcListenerCountPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcListenerCountPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_listener_count'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcListenerCount'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcListenerCountTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 4; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 4; + + /** the column name for the id field */ + const ID = 'cc_listener_count.id'; + + /** the column name for the timestamp_id field */ + const TIMESTAMP_ID = 'cc_listener_count.timestamp_id'; + + /** the column name for the mount_name_id field */ + const MOUNT_NAME_ID = 'cc_listener_count.mount_name_id'; + + /** the column name for the listener_count field */ + const LISTENER_COUNT = 'cc_listener_count.listener_count'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcListenerCount objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcListenerCount[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcListenerCountPeer::$fieldNames[CcListenerCountPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbTimestampId', 'DbMountNameId', 'DbListenerCount', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbTimestampId', 'dbMountNameId', 'dbListenerCount', ), + BasePeer::TYPE_COLNAME => array (CcListenerCountPeer::ID, CcListenerCountPeer::TIMESTAMP_ID, CcListenerCountPeer::MOUNT_NAME_ID, CcListenerCountPeer::LISTENER_COUNT, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'TIMESTAMP_ID', 'MOUNT_NAME_ID', 'LISTENER_COUNT', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'timestamp_id', 'mount_name_id', 'listener_count', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcListenerCountPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbTimestampId' => 1, 'DbMountNameId' => 2, 'DbListenerCount' => 3, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbTimestampId' => 1, 'dbMountNameId' => 2, 'dbListenerCount' => 3, ), + BasePeer::TYPE_COLNAME => array (CcListenerCountPeer::ID => 0, CcListenerCountPeer::TIMESTAMP_ID => 1, CcListenerCountPeer::MOUNT_NAME_ID => 2, CcListenerCountPeer::LISTENER_COUNT => 3, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'TIMESTAMP_ID' => 1, 'MOUNT_NAME_ID' => 2, 'LISTENER_COUNT' => 3, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'timestamp_id' => 1, 'mount_name_id' => 2, 'listener_count' => 3, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcListenerCountPeer::getFieldNames($toType); + $key = isset(CcListenerCountPeer::$fieldKeys[$fromType][$name]) ? CcListenerCountPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcListenerCountPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcListenerCountPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcListenerCountPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcListenerCountPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcListenerCountPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcListenerCountPeer::ID); + $criteria->addSelectColumn(CcListenerCountPeer::TIMESTAMP_ID); + $criteria->addSelectColumn(CcListenerCountPeer::MOUNT_NAME_ID); + $criteria->addSelectColumn(CcListenerCountPeer::LISTENER_COUNT); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.timestamp_id'); + $criteria->addSelectColumn($alias . '.mount_name_id'); + $criteria->addSelectColumn($alias . '.listener_count'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcListenerCountPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcListenerCount + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcListenerCountPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcListenerCountPeer::populateObjects(CcListenerCountPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcListenerCountPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcListenerCount $obj A CcListenerCount object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcListenerCountPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcListenerCount object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcListenerCount) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcListenerCount object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcListenerCountPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcListenerCount Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcListenerCountPeer::$instances[$key])) { + return CcListenerCountPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcListenerCountPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcListenerCountPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_listener_count + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcListenerCountPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcListenerCountPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcListenerCountPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcListenerCount object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcListenerCountPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcListenerCountPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcListenerCountPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcListenerCountPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcTimestamp table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcTimestamp(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcListenerCountPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcListenerCountPeer::TIMESTAMP_ID, CcTimestampPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcMountName table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcMountName(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcListenerCountPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcListenerCountPeer::MOUNT_NAME_ID, CcMountNamePeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcListenerCount objects pre-filled with their CcTimestamp objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcListenerCount objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcTimestamp(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + } + + CcListenerCountPeer::addSelectColumns($criteria); + $startcol = CcListenerCountPeer::NUM_HYDRATE_COLUMNS; + CcTimestampPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcListenerCountPeer::TIMESTAMP_ID, CcTimestampPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcListenerCountPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcListenerCountPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcListenerCountPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcTimestampPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcTimestampPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcTimestampPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcTimestampPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcListenerCount) to $obj2 (CcTimestamp) + $obj2->addCcListenerCount($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcListenerCount objects pre-filled with their CcMountName objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcListenerCount objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcMountName(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + } + + CcListenerCountPeer::addSelectColumns($criteria); + $startcol = CcListenerCountPeer::NUM_HYDRATE_COLUMNS; + CcMountNamePeer::addSelectColumns($criteria); + + $criteria->addJoin(CcListenerCountPeer::MOUNT_NAME_ID, CcMountNamePeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcListenerCountPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcListenerCountPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcListenerCountPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcMountNamePeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcMountNamePeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcMountNamePeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcMountNamePeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcListenerCount) to $obj2 (CcMountName) + $obj2->addCcListenerCount($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcListenerCountPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcListenerCountPeer::TIMESTAMP_ID, CcTimestampPeer::ID, $join_behavior); + + $criteria->addJoin(CcListenerCountPeer::MOUNT_NAME_ID, CcMountNamePeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcListenerCount objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcListenerCount objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + } + + CcListenerCountPeer::addSelectColumns($criteria); + $startcol2 = CcListenerCountPeer::NUM_HYDRATE_COLUMNS; + + CcTimestampPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcTimestampPeer::NUM_HYDRATE_COLUMNS; + + CcMountNamePeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcMountNamePeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcListenerCountPeer::TIMESTAMP_ID, CcTimestampPeer::ID, $join_behavior); + + $criteria->addJoin(CcListenerCountPeer::MOUNT_NAME_ID, CcMountNamePeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcListenerCountPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcListenerCountPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcListenerCountPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcTimestamp rows + + $key2 = CcTimestampPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcTimestampPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcTimestampPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcTimestampPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcListenerCount) to the collection in $obj2 (CcTimestamp) + $obj2->addCcListenerCount($obj1); + } // if joined row not null + + // Add objects for joined CcMountName rows + + $key3 = CcMountNamePeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcMountNamePeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcMountNamePeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcMountNamePeer::addInstanceToPool($obj3, $key3); + } // if obj3 loaded + + // Add the $obj1 (CcListenerCount) to the collection in $obj3 (CcMountName) + $obj3->addCcListenerCount($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcTimestamp table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcTimestamp(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcListenerCountPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcListenerCountPeer::MOUNT_NAME_ID, CcMountNamePeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcMountName table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcMountName(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcListenerCountPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcListenerCountPeer::TIMESTAMP_ID, CcTimestampPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcListenerCount objects pre-filled with all related objects except CcTimestamp. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcListenerCount objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcTimestamp(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + } + + CcListenerCountPeer::addSelectColumns($criteria); + $startcol2 = CcListenerCountPeer::NUM_HYDRATE_COLUMNS; + + CcMountNamePeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcMountNamePeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcListenerCountPeer::MOUNT_NAME_ID, CcMountNamePeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcListenerCountPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcListenerCountPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcListenerCountPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcMountName rows + + $key2 = CcMountNamePeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcMountNamePeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcMountNamePeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcMountNamePeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcListenerCount) to the collection in $obj2 (CcMountName) + $obj2->addCcListenerCount($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcListenerCount objects pre-filled with all related objects except CcMountName. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcListenerCount objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcMountName(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + } + + CcListenerCountPeer::addSelectColumns($criteria); + $startcol2 = CcListenerCountPeer::NUM_HYDRATE_COLUMNS; + + CcTimestampPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcTimestampPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcListenerCountPeer::TIMESTAMP_ID, CcTimestampPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcListenerCountPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcListenerCountPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcListenerCountPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcListenerCountPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcTimestamp rows + + $key2 = CcTimestampPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcTimestampPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcTimestampPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcTimestampPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcListenerCount) to the collection in $obj2 (CcTimestamp) + $obj2->addCcListenerCount($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcListenerCountPeer::DATABASE_NAME)->getTable(CcListenerCountPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcListenerCountPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcListenerCountPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcListenerCountTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcListenerCountPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcListenerCount or Criteria object. + * + * @param mixed $values Criteria or CcListenerCount object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcListenerCount object + } + + if ($criteria->containsKey(CcListenerCountPeer::ID) && $criteria->keyContainsValue(CcListenerCountPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcListenerCountPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcListenerCount or Criteria object. + * + * @param mixed $values Criteria or CcListenerCount object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcListenerCountPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcListenerCountPeer::ID); + $value = $criteria->remove(CcListenerCountPeer::ID); + if ($value) { + $selectCriteria->add(CcListenerCountPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcListenerCountPeer::TABLE_NAME); + } + + } else { // $values is CcListenerCount object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_listener_count table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcListenerCountPeer::TABLE_NAME, $con, CcListenerCountPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcListenerCountPeer::clearInstancePool(); + CcListenerCountPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcListenerCount or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcListenerCount object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcListenerCountPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcListenerCount) { // it's a model object + // invalidate the cache for this single object + CcListenerCountPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcListenerCountPeer::DATABASE_NAME); + $criteria->add(CcListenerCountPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcListenerCountPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcListenerCountPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcListenerCountPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcListenerCount object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcListenerCount $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcListenerCountPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcListenerCountPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcListenerCountPeer::DATABASE_NAME, CcListenerCountPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcListenerCount + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcListenerCountPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcListenerCountPeer::DATABASE_NAME); + $criteria->add(CcListenerCountPeer::ID, $pk); + + $v = CcListenerCountPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcListenerCount[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcListenerCountPeer::DATABASE_NAME); + $criteria->add(CcListenerCountPeer::ID, $pks, Criteria::IN); + $objs = CcListenerCountPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcListenerCountPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcListenerCountQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcListenerCountQuery.php index 30c702e6ef..24c5a1f1a1 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcListenerCountQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcListenerCountQuery.php @@ -4,403 +4,575 @@ /** * Base class that represents a query for the 'cc_listener_count' table. * - * * - * @method CcListenerCountQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcListenerCountQuery orderByDbTimestampId($order = Criteria::ASC) Order by the timestamp_id column - * @method CcListenerCountQuery orderByDbMountNameId($order = Criteria::ASC) Order by the mount_name_id column - * @method CcListenerCountQuery orderByDbListenerCount($order = Criteria::ASC) Order by the listener_count column * - * @method CcListenerCountQuery groupByDbId() Group by the id column - * @method CcListenerCountQuery groupByDbTimestampId() Group by the timestamp_id column - * @method CcListenerCountQuery groupByDbMountNameId() Group by the mount_name_id column - * @method CcListenerCountQuery groupByDbListenerCount() Group by the listener_count column + * @method CcListenerCountQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcListenerCountQuery orderByDbTimestampId($order = Criteria::ASC) Order by the timestamp_id column + * @method CcListenerCountQuery orderByDbMountNameId($order = Criteria::ASC) Order by the mount_name_id column + * @method CcListenerCountQuery orderByDbListenerCount($order = Criteria::ASC) Order by the listener_count column * - * @method CcListenerCountQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcListenerCountQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcListenerCountQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcListenerCountQuery groupByDbId() Group by the id column + * @method CcListenerCountQuery groupByDbTimestampId() Group by the timestamp_id column + * @method CcListenerCountQuery groupByDbMountNameId() Group by the mount_name_id column + * @method CcListenerCountQuery groupByDbListenerCount() Group by the listener_count column * - * @method CcListenerCountQuery leftJoinCcTimestamp($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcTimestamp relation - * @method CcListenerCountQuery rightJoinCcTimestamp($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcTimestamp relation - * @method CcListenerCountQuery innerJoinCcTimestamp($relationAlias = '') Adds a INNER JOIN clause to the query using the CcTimestamp relation + * @method CcListenerCountQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcListenerCountQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcListenerCountQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcListenerCountQuery leftJoinCcMountName($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcMountName relation - * @method CcListenerCountQuery rightJoinCcMountName($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcMountName relation - * @method CcListenerCountQuery innerJoinCcMountName($relationAlias = '') Adds a INNER JOIN clause to the query using the CcMountName relation + * @method CcListenerCountQuery leftJoinCcTimestamp($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcTimestamp relation + * @method CcListenerCountQuery rightJoinCcTimestamp($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcTimestamp relation + * @method CcListenerCountQuery innerJoinCcTimestamp($relationAlias = null) Adds a INNER JOIN clause to the query using the CcTimestamp relation * - * @method CcListenerCount findOne(PropelPDO $con = null) Return the first CcListenerCount matching the query - * @method CcListenerCount findOneOrCreate(PropelPDO $con = null) Return the first CcListenerCount matching the query, or a new CcListenerCount object populated from the query conditions when no match is found + * @method CcListenerCountQuery leftJoinCcMountName($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcMountName relation + * @method CcListenerCountQuery rightJoinCcMountName($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcMountName relation + * @method CcListenerCountQuery innerJoinCcMountName($relationAlias = null) Adds a INNER JOIN clause to the query using the CcMountName relation * - * @method CcListenerCount findOneByDbId(int $id) Return the first CcListenerCount filtered by the id column - * @method CcListenerCount findOneByDbTimestampId(int $timestamp_id) Return the first CcListenerCount filtered by the timestamp_id column - * @method CcListenerCount findOneByDbMountNameId(int $mount_name_id) Return the first CcListenerCount filtered by the mount_name_id column - * @method CcListenerCount findOneByDbListenerCount(int $listener_count) Return the first CcListenerCount filtered by the listener_count column + * @method CcListenerCount findOne(PropelPDO $con = null) Return the first CcListenerCount matching the query + * @method CcListenerCount findOneOrCreate(PropelPDO $con = null) Return the first CcListenerCount matching the query, or a new CcListenerCount object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcListenerCount objects filtered by the id column - * @method array findByDbTimestampId(int $timestamp_id) Return CcListenerCount objects filtered by the timestamp_id column - * @method array findByDbMountNameId(int $mount_name_id) Return CcListenerCount objects filtered by the mount_name_id column - * @method array findByDbListenerCount(int $listener_count) Return CcListenerCount objects filtered by the listener_count column + * @method CcListenerCount findOneByDbTimestampId(int $timestamp_id) Return the first CcListenerCount filtered by the timestamp_id column + * @method CcListenerCount findOneByDbMountNameId(int $mount_name_id) Return the first CcListenerCount filtered by the mount_name_id column + * @method CcListenerCount findOneByDbListenerCount(int $listener_count) Return the first CcListenerCount filtered by the listener_count column + * + * @method array findByDbId(int $id) Return CcListenerCount objects filtered by the id column + * @method array findByDbTimestampId(int $timestamp_id) Return CcListenerCount objects filtered by the timestamp_id column + * @method array findByDbMountNameId(int $mount_name_id) Return CcListenerCount objects filtered by the mount_name_id column + * @method array findByDbListenerCount(int $listener_count) Return CcListenerCount objects filtered by the listener_count column * * @package propel.generator.airtime.om */ abstract class BaseCcListenerCountQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcListenerCountQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcListenerCount'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcListenerCountQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcListenerCountQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcListenerCountQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcListenerCountQuery) { + return $criteria; + } + $query = new CcListenerCountQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcListenerCount|CcListenerCount[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcListenerCountPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcListenerCountPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcListenerCount A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcListenerCount A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "timestamp_id", "mount_name_id", "listener_count" FROM "cc_listener_count" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcListenerCount(); + $obj->hydrate($row); + CcListenerCountPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcListenerCount|CcListenerCount[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcListenerCount[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcListenerCountQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcListenerCountPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcListenerCountQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcListenerCountPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcListenerCountQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcListenerCountPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcListenerCountPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcListenerCountPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the timestamp_id column + * + * Example usage: + * + * $query->filterByDbTimestampId(1234); // WHERE timestamp_id = 1234 + * $query->filterByDbTimestampId(array(12, 34)); // WHERE timestamp_id IN (12, 34) + * $query->filterByDbTimestampId(array('min' => 12)); // WHERE timestamp_id >= 12 + * $query->filterByDbTimestampId(array('max' => 12)); // WHERE timestamp_id <= 12 + * + * + * @see filterByCcTimestamp() + * + * @param mixed $dbTimestampId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcListenerCountQuery The current query, for fluid interface + */ + public function filterByDbTimestampId($dbTimestampId = null, $comparison = null) + { + if (is_array($dbTimestampId)) { + $useMinMax = false; + if (isset($dbTimestampId['min'])) { + $this->addUsingAlias(CcListenerCountPeer::TIMESTAMP_ID, $dbTimestampId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbTimestampId['max'])) { + $this->addUsingAlias(CcListenerCountPeer::TIMESTAMP_ID, $dbTimestampId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcListenerCountPeer::TIMESTAMP_ID, $dbTimestampId, $comparison); + } + + /** + * Filter the query on the mount_name_id column + * + * Example usage: + * + * $query->filterByDbMountNameId(1234); // WHERE mount_name_id = 1234 + * $query->filterByDbMountNameId(array(12, 34)); // WHERE mount_name_id IN (12, 34) + * $query->filterByDbMountNameId(array('min' => 12)); // WHERE mount_name_id >= 12 + * $query->filterByDbMountNameId(array('max' => 12)); // WHERE mount_name_id <= 12 + * + * + * @see filterByCcMountName() + * + * @param mixed $dbMountNameId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcListenerCountQuery The current query, for fluid interface + */ + public function filterByDbMountNameId($dbMountNameId = null, $comparison = null) + { + if (is_array($dbMountNameId)) { + $useMinMax = false; + if (isset($dbMountNameId['min'])) { + $this->addUsingAlias(CcListenerCountPeer::MOUNT_NAME_ID, $dbMountNameId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbMountNameId['max'])) { + $this->addUsingAlias(CcListenerCountPeer::MOUNT_NAME_ID, $dbMountNameId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcListenerCountPeer::MOUNT_NAME_ID, $dbMountNameId, $comparison); + } + + /** + * Filter the query on the listener_count column + * + * Example usage: + * + * $query->filterByDbListenerCount(1234); // WHERE listener_count = 1234 + * $query->filterByDbListenerCount(array(12, 34)); // WHERE listener_count IN (12, 34) + * $query->filterByDbListenerCount(array('min' => 12)); // WHERE listener_count >= 12 + * $query->filterByDbListenerCount(array('max' => 12)); // WHERE listener_count <= 12 + * + * + * @param mixed $dbListenerCount The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcListenerCountQuery The current query, for fluid interface + */ + public function filterByDbListenerCount($dbListenerCount = null, $comparison = null) + { + if (is_array($dbListenerCount)) { + $useMinMax = false; + if (isset($dbListenerCount['min'])) { + $this->addUsingAlias(CcListenerCountPeer::LISTENER_COUNT, $dbListenerCount['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbListenerCount['max'])) { + $this->addUsingAlias(CcListenerCountPeer::LISTENER_COUNT, $dbListenerCount['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcListenerCountPeer::LISTENER_COUNT, $dbListenerCount, $comparison); + } + + /** + * Filter the query by a related CcTimestamp object + * + * @param CcTimestamp|PropelObjectCollection $ccTimestamp The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcListenerCountQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcTimestamp($ccTimestamp, $comparison = null) + { + if ($ccTimestamp instanceof CcTimestamp) { + return $this + ->addUsingAlias(CcListenerCountPeer::TIMESTAMP_ID, $ccTimestamp->getDbId(), $comparison); + } elseif ($ccTimestamp instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcListenerCountPeer::TIMESTAMP_ID, $ccTimestamp->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcTimestamp() only accepts arguments of type CcTimestamp or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcTimestamp relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcListenerCountQuery The current query, for fluid interface + */ + public function joinCcTimestamp($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcTimestamp'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcTimestamp'); + } + + return $this; + } + + /** + * Use the CcTimestamp relation CcTimestamp object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcTimestampQuery A secondary query class using the current class as primary query + */ + public function useCcTimestampQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcTimestamp($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcTimestamp', 'CcTimestampQuery'); + } + + /** + * Filter the query by a related CcMountName object + * + * @param CcMountName|PropelObjectCollection $ccMountName The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcListenerCountQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcMountName($ccMountName, $comparison = null) + { + if ($ccMountName instanceof CcMountName) { + return $this + ->addUsingAlias(CcListenerCountPeer::MOUNT_NAME_ID, $ccMountName->getDbId(), $comparison); + } elseif ($ccMountName instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcListenerCountPeer::MOUNT_NAME_ID, $ccMountName->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcMountName() only accepts arguments of type CcMountName or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcMountName relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcListenerCountQuery The current query, for fluid interface + */ + public function joinCcMountName($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcMountName'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcMountName'); + } + + return $this; + } + + /** + * Use the CcMountName relation CcMountName object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcMountNameQuery A secondary query class using the current class as primary query + */ + public function useCcMountNameQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcMountName($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcMountName', 'CcMountNameQuery'); + } + + /** + * Exclude object from result + * + * @param CcListenerCount $ccListenerCount Object to remove from the list of results + * + * @return CcListenerCountQuery The current query, for fluid interface + */ + public function prune($ccListenerCount = null) + { + if ($ccListenerCount) { + $this->addUsingAlias(CcListenerCountPeer::ID, $ccListenerCount->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcListenerCountQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcListenerCount', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcListenerCountQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcListenerCountQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcListenerCountQuery) { - return $criteria; - } - $query = new CcListenerCountQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcListenerCount|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcListenerCountPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcListenerCountQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcListenerCountPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcListenerCountQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcListenerCountPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcListenerCountQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcListenerCountPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the timestamp_id column - * - * @param int|array $dbTimestampId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcListenerCountQuery The current query, for fluid interface - */ - public function filterByDbTimestampId($dbTimestampId = null, $comparison = null) - { - if (is_array($dbTimestampId)) { - $useMinMax = false; - if (isset($dbTimestampId['min'])) { - $this->addUsingAlias(CcListenerCountPeer::TIMESTAMP_ID, $dbTimestampId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbTimestampId['max'])) { - $this->addUsingAlias(CcListenerCountPeer::TIMESTAMP_ID, $dbTimestampId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcListenerCountPeer::TIMESTAMP_ID, $dbTimestampId, $comparison); - } - - /** - * Filter the query on the mount_name_id column - * - * @param int|array $dbMountNameId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcListenerCountQuery The current query, for fluid interface - */ - public function filterByDbMountNameId($dbMountNameId = null, $comparison = null) - { - if (is_array($dbMountNameId)) { - $useMinMax = false; - if (isset($dbMountNameId['min'])) { - $this->addUsingAlias(CcListenerCountPeer::MOUNT_NAME_ID, $dbMountNameId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbMountNameId['max'])) { - $this->addUsingAlias(CcListenerCountPeer::MOUNT_NAME_ID, $dbMountNameId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcListenerCountPeer::MOUNT_NAME_ID, $dbMountNameId, $comparison); - } - - /** - * Filter the query on the listener_count column - * - * @param int|array $dbListenerCount The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcListenerCountQuery The current query, for fluid interface - */ - public function filterByDbListenerCount($dbListenerCount = null, $comparison = null) - { - if (is_array($dbListenerCount)) { - $useMinMax = false; - if (isset($dbListenerCount['min'])) { - $this->addUsingAlias(CcListenerCountPeer::LISTENER_COUNT, $dbListenerCount['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbListenerCount['max'])) { - $this->addUsingAlias(CcListenerCountPeer::LISTENER_COUNT, $dbListenerCount['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcListenerCountPeer::LISTENER_COUNT, $dbListenerCount, $comparison); - } - - /** - * Filter the query by a related CcTimestamp object - * - * @param CcTimestamp $ccTimestamp the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcListenerCountQuery The current query, for fluid interface - */ - public function filterByCcTimestamp($ccTimestamp, $comparison = null) - { - return $this - ->addUsingAlias(CcListenerCountPeer::TIMESTAMP_ID, $ccTimestamp->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcTimestamp relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcListenerCountQuery The current query, for fluid interface - */ - public function joinCcTimestamp($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcTimestamp'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcTimestamp'); - } - - return $this; - } - - /** - * Use the CcTimestamp relation CcTimestamp object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcTimestampQuery A secondary query class using the current class as primary query - */ - public function useCcTimestampQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcTimestamp($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcTimestamp', 'CcTimestampQuery'); - } - - /** - * Filter the query by a related CcMountName object - * - * @param CcMountName $ccMountName the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcListenerCountQuery The current query, for fluid interface - */ - public function filterByCcMountName($ccMountName, $comparison = null) - { - return $this - ->addUsingAlias(CcListenerCountPeer::MOUNT_NAME_ID, $ccMountName->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcMountName relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcListenerCountQuery The current query, for fluid interface - */ - public function joinCcMountName($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcMountName'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcMountName'); - } - - return $this; - } - - /** - * Use the CcMountName relation CcMountName object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcMountNameQuery A secondary query class using the current class as primary query - */ - public function useCcMountNameQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcMountName($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcMountName', 'CcMountNameQuery'); - } - - /** - * Exclude object from result - * - * @param CcListenerCount $ccListenerCount Object to remove from the list of results - * - * @return CcListenerCountQuery The current query, for fluid interface - */ - public function prune($ccListenerCount = null) - { - if ($ccListenerCount) { - $this->addUsingAlias(CcListenerCountPeer::ID, $ccListenerCount->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcListenerCountQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcLiveLog.php b/airtime_mvc/application/models/airtime/om/BaseCcLiveLog.php index 583630ee68..cacb87395b 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcLiveLog.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcLiveLog.php @@ -4,913 +4,989 @@ /** * Base class that represents a row from the 'cc_live_log' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcLiveLog extends BaseObject implements Persistent +abstract class BaseCcLiveLog extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcLiveLogPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcLiveLogPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the state field. - * @var string - */ - protected $state; - - /** - * The value for the start_time field. - * @var string - */ - protected $start_time; - - /** - * The value for the end_time field. - * @var string - */ - protected $end_time; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [state] column value. - * - * @return string - */ - public function getDbState() - { - return $this->state; - } - - /** - * Get the [optionally formatted] temporal [start_time] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbStartTime($format = 'Y-m-d H:i:s') - { - if ($this->start_time === null) { - return null; - } - - - - try { - $dt = new DateTime($this->start_time); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->start_time, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [end_time] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbEndTime($format = 'Y-m-d H:i:s') - { - if ($this->end_time === null) { - return null; - } - - - - try { - $dt = new DateTime($this->end_time); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->end_time, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcLiveLog The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcLiveLogPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [state] column. - * - * @param string $v new value - * @return CcLiveLog The current object (for fluent API support) - */ - public function setDbState($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->state !== $v) { - $this->state = $v; - $this->modifiedColumns[] = CcLiveLogPeer::STATE; - } - - return $this; - } // setDbState() - - /** - * Sets the value of [start_time] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcLiveLog The current object (for fluent API support) - */ - public function setDbStartTime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->start_time !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->start_time !== null && $tmpDt = new DateTime($this->start_time)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->start_time = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcLiveLogPeer::START_TIME; - } - } // if either are not null - - return $this; - } // setDbStartTime() - - /** - * Sets the value of [end_time] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcLiveLog The current object (for fluent API support) - */ - public function setDbEndTime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->end_time !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->end_time !== null && $tmpDt = new DateTime($this->end_time)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->end_time = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcLiveLogPeer::END_TIME; - } - } // if either are not null - - return $this; - } // setDbEndTime() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->state = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->start_time = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->end_time = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 4; // 4 = CcLiveLogPeer::NUM_COLUMNS - CcLiveLogPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcLiveLog object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcLiveLogPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcLiveLogQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcLiveLogPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcLiveLogPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcLiveLogPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcLiveLogPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows = CcLiveLogPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcLiveLogPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcLiveLogPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbState(); - break; - case 2: - return $this->getDbStartTime(); - break; - case 3: - return $this->getDbEndTime(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcLiveLogPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbState(), - $keys[2] => $this->getDbStartTime(), - $keys[3] => $this->getDbEndTime(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcLiveLogPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbState($value); - break; - case 2: - $this->setDbStartTime($value); - break; - case 3: - $this->setDbEndTime($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcLiveLogPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbState($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbStartTime($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbEndTime($arr[$keys[3]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcLiveLogPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcLiveLogPeer::ID)) $criteria->add(CcLiveLogPeer::ID, $this->id); - if ($this->isColumnModified(CcLiveLogPeer::STATE)) $criteria->add(CcLiveLogPeer::STATE, $this->state); - if ($this->isColumnModified(CcLiveLogPeer::START_TIME)) $criteria->add(CcLiveLogPeer::START_TIME, $this->start_time); - if ($this->isColumnModified(CcLiveLogPeer::END_TIME)) $criteria->add(CcLiveLogPeer::END_TIME, $this->end_time); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcLiveLogPeer::DATABASE_NAME); - $criteria->add(CcLiveLogPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcLiveLog (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbState($this->state); - $copyObj->setDbStartTime($this->start_time); - $copyObj->setDbEndTime($this->end_time); - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcLiveLog Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcLiveLogPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcLiveLogPeer(); - } - return self::$peer; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->state = null; - $this->start_time = null; - $this->end_time = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcLiveLog + /** + * Peer class name + */ + const PEER = 'CcLiveLogPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcLiveLogPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the state field. + * @var string + */ + protected $state; + + /** + * The value for the start_time field. + * @var string + */ + protected $start_time; + + /** + * The value for the end_time field. + * @var string + */ + protected $end_time; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [state] column value. + * + * @return string + */ + public function getDbState() + { + + return $this->state; + } + + /** + * Get the [optionally formatted] temporal [start_time] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbStartTime($format = 'Y-m-d H:i:s') + { + if ($this->start_time === null) { + return null; + } + + + try { + $dt = new DateTime($this->start_time); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->start_time, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [end_time] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbEndTime($format = 'Y-m-d H:i:s') + { + if ($this->end_time === null) { + return null; + } + + + try { + $dt = new DateTime($this->end_time); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->end_time, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcLiveLog The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcLiveLogPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [state] column. + * + * @param string $v new value + * @return CcLiveLog The current object (for fluent API support) + */ + public function setDbState($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->state !== $v) { + $this->state = $v; + $this->modifiedColumns[] = CcLiveLogPeer::STATE; + } + + + return $this; + } // setDbState() + + /** + * Sets the value of [start_time] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcLiveLog The current object (for fluent API support) + */ + public function setDbStartTime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->start_time !== null || $dt !== null) { + $currentDateAsString = ($this->start_time !== null && $tmpDt = new DateTime($this->start_time)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->start_time = $newDateAsString; + $this->modifiedColumns[] = CcLiveLogPeer::START_TIME; + } + } // if either are not null + + + return $this; + } // setDbStartTime() + + /** + * Sets the value of [end_time] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcLiveLog The current object (for fluent API support) + */ + public function setDbEndTime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->end_time !== null || $dt !== null) { + $currentDateAsString = ($this->end_time !== null && $tmpDt = new DateTime($this->end_time)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->end_time = $newDateAsString; + $this->modifiedColumns[] = CcLiveLogPeer::END_TIME; + } + } // if either are not null + + + return $this; + } // setDbEndTime() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->state = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->start_time = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->end_time = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 4; // 4 = CcLiveLogPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcLiveLog object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcLiveLogPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcLiveLogQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcLiveLogPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcLiveLogPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcLiveLogPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_live_log_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcLiveLogPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcLiveLogPeer::STATE)) { + $modifiedColumns[':p' . $index++] = '"state"'; + } + if ($this->isColumnModified(CcLiveLogPeer::START_TIME)) { + $modifiedColumns[':p' . $index++] = '"start_time"'; + } + if ($this->isColumnModified(CcLiveLogPeer::END_TIME)) { + $modifiedColumns[':p' . $index++] = '"end_time"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_live_log" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"state"': + $stmt->bindValue($identifier, $this->state, PDO::PARAM_STR); + break; + case '"start_time"': + $stmt->bindValue($identifier, $this->start_time, PDO::PARAM_STR); + break; + case '"end_time"': + $stmt->bindValue($identifier, $this->end_time, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcLiveLogPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcLiveLogPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbState(); + break; + case 2: + return $this->getDbStartTime(); + break; + case 3: + return $this->getDbEndTime(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array()) + { + if (isset($alreadyDumpedObjects['CcLiveLog'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcLiveLog'][$this->getPrimaryKey()] = true; + $keys = CcLiveLogPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbState(), + $keys[2] => $this->getDbStartTime(), + $keys[3] => $this->getDbEndTime(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcLiveLogPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbState($value); + break; + case 2: + $this->setDbStartTime($value); + break; + case 3: + $this->setDbEndTime($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcLiveLogPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbState($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbStartTime($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbEndTime($arr[$keys[3]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcLiveLogPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcLiveLogPeer::ID)) $criteria->add(CcLiveLogPeer::ID, $this->id); + if ($this->isColumnModified(CcLiveLogPeer::STATE)) $criteria->add(CcLiveLogPeer::STATE, $this->state); + if ($this->isColumnModified(CcLiveLogPeer::START_TIME)) $criteria->add(CcLiveLogPeer::START_TIME, $this->start_time); + if ($this->isColumnModified(CcLiveLogPeer::END_TIME)) $criteria->add(CcLiveLogPeer::END_TIME, $this->end_time); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcLiveLogPeer::DATABASE_NAME); + $criteria->add(CcLiveLogPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcLiveLog (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbState($this->getDbState()); + $copyObj->setDbStartTime($this->getDbStartTime()); + $copyObj->setDbEndTime($this->getDbEndTime()); + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcLiveLog Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcLiveLogPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcLiveLogPeer(); + } + + return self::$peer; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->state = null; + $this->start_time = null; + $this->end_time = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcLiveLogPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcLiveLogPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcLiveLogPeer.php index 0a8cb69c5b..1d564519dd 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcLiveLogPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcLiveLogPeer.php @@ -4,742 +4,764 @@ /** * Base static class for performing query and update operations on the 'cc_live_log' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcLiveLogPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_live_log'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcLiveLog'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcLiveLog'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcLiveLogTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 4; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_live_log.ID'; - - /** the column name for the STATE field */ - const STATE = 'cc_live_log.STATE'; - - /** the column name for the START_TIME field */ - const START_TIME = 'cc_live_log.START_TIME'; - - /** the column name for the END_TIME field */ - const END_TIME = 'cc_live_log.END_TIME'; - - /** - * An identiy map to hold any loaded instances of CcLiveLog objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcLiveLog[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbState', 'DbStartTime', 'DbEndTime', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbState', 'dbStartTime', 'dbEndTime', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::STATE, self::START_TIME, self::END_TIME, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'STATE', 'START_TIME', 'END_TIME', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'state', 'start_time', 'end_time', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbState' => 1, 'DbStartTime' => 2, 'DbEndTime' => 3, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbState' => 1, 'dbStartTime' => 2, 'dbEndTime' => 3, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::STATE => 1, self::START_TIME => 2, self::END_TIME => 3, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'STATE' => 1, 'START_TIME' => 2, 'END_TIME' => 3, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'state' => 1, 'start_time' => 2, 'end_time' => 3, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcLiveLogPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcLiveLogPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcLiveLogPeer::ID); - $criteria->addSelectColumn(CcLiveLogPeer::STATE); - $criteria->addSelectColumn(CcLiveLogPeer::START_TIME); - $criteria->addSelectColumn(CcLiveLogPeer::END_TIME); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.STATE'); - $criteria->addSelectColumn($alias . '.START_TIME'); - $criteria->addSelectColumn($alias . '.END_TIME'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcLiveLogPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcLiveLogPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcLiveLog - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcLiveLogPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcLiveLogPeer::populateObjects(CcLiveLogPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcLiveLogPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcLiveLog $value A CcLiveLog object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcLiveLog $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcLiveLog object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcLiveLog) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcLiveLog object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcLiveLog Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_live_log - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcLiveLogPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcLiveLogPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcLiveLogPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcLiveLogPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcLiveLog object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcLiveLogPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcLiveLogPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcLiveLogPeer::NUM_COLUMNS; - } else { - $cls = CcLiveLogPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcLiveLogPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcLiveLogPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcLiveLogPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcLiveLogTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcLiveLogPeer::CLASS_DEFAULT : CcLiveLogPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcLiveLog or Criteria object. - * - * @param mixed $values Criteria or CcLiveLog object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcLiveLog object - } - - if ($criteria->containsKey(CcLiveLogPeer::ID) && $criteria->keyContainsValue(CcLiveLogPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcLiveLogPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcLiveLog or Criteria object. - * - * @param mixed $values Criteria or CcLiveLog object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcLiveLogPeer::ID); - $value = $criteria->remove(CcLiveLogPeer::ID); - if ($value) { - $selectCriteria->add(CcLiveLogPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcLiveLogPeer::TABLE_NAME); - } - - } else { // $values is CcLiveLog object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_live_log table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcLiveLogPeer::TABLE_NAME, $con, CcLiveLogPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcLiveLogPeer::clearInstancePool(); - CcLiveLogPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcLiveLog or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcLiveLog object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcLiveLogPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcLiveLog) { // it's a model object - // invalidate the cache for this single object - CcLiveLogPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcLiveLogPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcLiveLogPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcLiveLogPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcLiveLog object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcLiveLog $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcLiveLog $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcLiveLogPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcLiveLogPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcLiveLogPeer::DATABASE_NAME, CcLiveLogPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcLiveLog - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcLiveLogPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcLiveLogPeer::DATABASE_NAME); - $criteria->add(CcLiveLogPeer::ID, $pk); - - $v = CcLiveLogPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcLiveLogPeer::DATABASE_NAME); - $criteria->add(CcLiveLogPeer::ID, $pks, Criteria::IN); - $objs = CcLiveLogPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcLiveLogPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_live_log'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcLiveLog'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcLiveLogTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 4; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 4; + + /** the column name for the id field */ + const ID = 'cc_live_log.id'; + + /** the column name for the state field */ + const STATE = 'cc_live_log.state'; + + /** the column name for the start_time field */ + const START_TIME = 'cc_live_log.start_time'; + + /** the column name for the end_time field */ + const END_TIME = 'cc_live_log.end_time'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcLiveLog objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcLiveLog[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcLiveLogPeer::$fieldNames[CcLiveLogPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbState', 'DbStartTime', 'DbEndTime', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbState', 'dbStartTime', 'dbEndTime', ), + BasePeer::TYPE_COLNAME => array (CcLiveLogPeer::ID, CcLiveLogPeer::STATE, CcLiveLogPeer::START_TIME, CcLiveLogPeer::END_TIME, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'STATE', 'START_TIME', 'END_TIME', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'state', 'start_time', 'end_time', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcLiveLogPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbState' => 1, 'DbStartTime' => 2, 'DbEndTime' => 3, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbState' => 1, 'dbStartTime' => 2, 'dbEndTime' => 3, ), + BasePeer::TYPE_COLNAME => array (CcLiveLogPeer::ID => 0, CcLiveLogPeer::STATE => 1, CcLiveLogPeer::START_TIME => 2, CcLiveLogPeer::END_TIME => 3, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'STATE' => 1, 'START_TIME' => 2, 'END_TIME' => 3, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'state' => 1, 'start_time' => 2, 'end_time' => 3, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcLiveLogPeer::getFieldNames($toType); + $key = isset(CcLiveLogPeer::$fieldKeys[$fromType][$name]) ? CcLiveLogPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcLiveLogPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcLiveLogPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcLiveLogPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcLiveLogPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcLiveLogPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcLiveLogPeer::ID); + $criteria->addSelectColumn(CcLiveLogPeer::STATE); + $criteria->addSelectColumn(CcLiveLogPeer::START_TIME); + $criteria->addSelectColumn(CcLiveLogPeer::END_TIME); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.state'); + $criteria->addSelectColumn($alias . '.start_time'); + $criteria->addSelectColumn($alias . '.end_time'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcLiveLogPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcLiveLogPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcLiveLogPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcLiveLog + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcLiveLogPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcLiveLogPeer::populateObjects(CcLiveLogPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcLiveLogPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcLiveLogPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcLiveLog $obj A CcLiveLog object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcLiveLogPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcLiveLog object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcLiveLog) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcLiveLog object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcLiveLogPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcLiveLog Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcLiveLogPeer::$instances[$key])) { + return CcLiveLogPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcLiveLogPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcLiveLogPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_live_log + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcLiveLogPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcLiveLogPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcLiveLogPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcLiveLogPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcLiveLog object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcLiveLogPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcLiveLogPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcLiveLogPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcLiveLogPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcLiveLogPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcLiveLogPeer::DATABASE_NAME)->getTable(CcLiveLogPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcLiveLogPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcLiveLogPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcLiveLogTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcLiveLogPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcLiveLog or Criteria object. + * + * @param mixed $values Criteria or CcLiveLog object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcLiveLog object + } + + if ($criteria->containsKey(CcLiveLogPeer::ID) && $criteria->keyContainsValue(CcLiveLogPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcLiveLogPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcLiveLogPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcLiveLog or Criteria object. + * + * @param mixed $values Criteria or CcLiveLog object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcLiveLogPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcLiveLogPeer::ID); + $value = $criteria->remove(CcLiveLogPeer::ID); + if ($value) { + $selectCriteria->add(CcLiveLogPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcLiveLogPeer::TABLE_NAME); + } + + } else { // $values is CcLiveLog object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcLiveLogPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_live_log table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcLiveLogPeer::TABLE_NAME, $con, CcLiveLogPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcLiveLogPeer::clearInstancePool(); + CcLiveLogPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcLiveLog or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcLiveLog object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcLiveLogPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcLiveLog) { // it's a model object + // invalidate the cache for this single object + CcLiveLogPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcLiveLogPeer::DATABASE_NAME); + $criteria->add(CcLiveLogPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcLiveLogPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcLiveLogPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcLiveLogPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcLiveLog object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcLiveLog $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcLiveLogPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcLiveLogPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcLiveLogPeer::DATABASE_NAME, CcLiveLogPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcLiveLog + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcLiveLogPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcLiveLogPeer::DATABASE_NAME); + $criteria->add(CcLiveLogPeer::ID, $pk); + + $v = CcLiveLogPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcLiveLog[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcLiveLogPeer::DATABASE_NAME); + $criteria->add(CcLiveLogPeer::ID, $pks, Criteria::IN); + $objs = CcLiveLogPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcLiveLogPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcLiveLogQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcLiveLogQuery.php index 723d568de4..c2badd5d41 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcLiveLogQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcLiveLogQuery.php @@ -4,258 +4,400 @@ /** * Base class that represents a query for the 'cc_live_log' table. * - * * - * @method CcLiveLogQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcLiveLogQuery orderByDbState($order = Criteria::ASC) Order by the state column - * @method CcLiveLogQuery orderByDbStartTime($order = Criteria::ASC) Order by the start_time column - * @method CcLiveLogQuery orderByDbEndTime($order = Criteria::ASC) Order by the end_time column * - * @method CcLiveLogQuery groupByDbId() Group by the id column - * @method CcLiveLogQuery groupByDbState() Group by the state column - * @method CcLiveLogQuery groupByDbStartTime() Group by the start_time column - * @method CcLiveLogQuery groupByDbEndTime() Group by the end_time column + * @method CcLiveLogQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcLiveLogQuery orderByDbState($order = Criteria::ASC) Order by the state column + * @method CcLiveLogQuery orderByDbStartTime($order = Criteria::ASC) Order by the start_time column + * @method CcLiveLogQuery orderByDbEndTime($order = Criteria::ASC) Order by the end_time column * - * @method CcLiveLogQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcLiveLogQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcLiveLogQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcLiveLogQuery groupByDbId() Group by the id column + * @method CcLiveLogQuery groupByDbState() Group by the state column + * @method CcLiveLogQuery groupByDbStartTime() Group by the start_time column + * @method CcLiveLogQuery groupByDbEndTime() Group by the end_time column * - * @method CcLiveLog findOne(PropelPDO $con = null) Return the first CcLiveLog matching the query - * @method CcLiveLog findOneOrCreate(PropelPDO $con = null) Return the first CcLiveLog matching the query, or a new CcLiveLog object populated from the query conditions when no match is found + * @method CcLiveLogQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcLiveLogQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcLiveLogQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcLiveLog findOneByDbId(int $id) Return the first CcLiveLog filtered by the id column - * @method CcLiveLog findOneByDbState(string $state) Return the first CcLiveLog filtered by the state column - * @method CcLiveLog findOneByDbStartTime(string $start_time) Return the first CcLiveLog filtered by the start_time column - * @method CcLiveLog findOneByDbEndTime(string $end_time) Return the first CcLiveLog filtered by the end_time column + * @method CcLiveLog findOne(PropelPDO $con = null) Return the first CcLiveLog matching the query + * @method CcLiveLog findOneOrCreate(PropelPDO $con = null) Return the first CcLiveLog matching the query, or a new CcLiveLog object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcLiveLog objects filtered by the id column - * @method array findByDbState(string $state) Return CcLiveLog objects filtered by the state column - * @method array findByDbStartTime(string $start_time) Return CcLiveLog objects filtered by the start_time column - * @method array findByDbEndTime(string $end_time) Return CcLiveLog objects filtered by the end_time column + * @method CcLiveLog findOneByDbState(string $state) Return the first CcLiveLog filtered by the state column + * @method CcLiveLog findOneByDbStartTime(string $start_time) Return the first CcLiveLog filtered by the start_time column + * @method CcLiveLog findOneByDbEndTime(string $end_time) Return the first CcLiveLog filtered by the end_time column + * + * @method array findByDbId(int $id) Return CcLiveLog objects filtered by the id column + * @method array findByDbState(string $state) Return CcLiveLog objects filtered by the state column + * @method array findByDbStartTime(string $start_time) Return CcLiveLog objects filtered by the start_time column + * @method array findByDbEndTime(string $end_time) Return CcLiveLog objects filtered by the end_time column * * @package propel.generator.airtime.om */ abstract class BaseCcLiveLogQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcLiveLogQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcLiveLog'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcLiveLogQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcLiveLogQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcLiveLogQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcLiveLogQuery) { + return $criteria; + } + $query = new CcLiveLogQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcLiveLog|CcLiveLog[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcLiveLogPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcLiveLogPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcLiveLog A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcLiveLog A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "state", "start_time", "end_time" FROM "cc_live_log" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcLiveLog(); + $obj->hydrate($row); + CcLiveLogPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcLiveLog|CcLiveLog[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcLiveLog[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcLiveLogQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcLiveLogPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcLiveLogQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { - /** - * Initializes internal state of BaseCcLiveLogQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcLiveLog', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } + return $this->addUsingAlias(CcLiveLogPeer::ID, $keys, Criteria::IN); + } - /** - * Returns a new CcLiveLogQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcLiveLogQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcLiveLogQuery) { - return $criteria; - } - $query = new CcLiveLogQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcLiveLogQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcLiveLogPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcLiveLogPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcLiveLog|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcLiveLogPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } + return $this->addUsingAlias(CcLiveLogPeer::ID, $dbId, $comparison); + } - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } + /** + * Filter the query on the state column + * + * Example usage: + * + * $query->filterByDbState('fooValue'); // WHERE state = 'fooValue' + * $query->filterByDbState('%fooValue%'); // WHERE state LIKE '%fooValue%' + * + * + * @param string $dbState The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcLiveLogQuery The current query, for fluid interface + */ + public function filterByDbState($dbState = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbState)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbState)) { + $dbState = str_replace('*', '%', $dbState); + $comparison = Criteria::LIKE; + } + } - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcLiveLogQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcLiveLogPeer::ID, $key, Criteria::EQUAL); - } + return $this->addUsingAlias(CcLiveLogPeer::STATE, $dbState, $comparison); + } - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcLiveLogQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcLiveLogPeer::ID, $keys, Criteria::IN); - } + /** + * Filter the query on the start_time column + * + * Example usage: + * + * $query->filterByDbStartTime('2011-03-14'); // WHERE start_time = '2011-03-14' + * $query->filterByDbStartTime('now'); // WHERE start_time = '2011-03-14' + * $query->filterByDbStartTime(array('max' => 'yesterday')); // WHERE start_time < '2011-03-13' + * + * + * @param mixed $dbStartTime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcLiveLogQuery The current query, for fluid interface + */ + public function filterByDbStartTime($dbStartTime = null, $comparison = null) + { + if (is_array($dbStartTime)) { + $useMinMax = false; + if (isset($dbStartTime['min'])) { + $this->addUsingAlias(CcLiveLogPeer::START_TIME, $dbStartTime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbStartTime['max'])) { + $this->addUsingAlias(CcLiveLogPeer::START_TIME, $dbStartTime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcLiveLogQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcLiveLogPeer::ID, $dbId, $comparison); - } + return $this->addUsingAlias(CcLiveLogPeer::START_TIME, $dbStartTime, $comparison); + } - /** - * Filter the query on the state column - * - * @param string $dbState The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcLiveLogQuery The current query, for fluid interface - */ - public function filterByDbState($dbState = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbState)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbState)) { - $dbState = str_replace('*', '%', $dbState); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcLiveLogPeer::STATE, $dbState, $comparison); - } + /** + * Filter the query on the end_time column + * + * Example usage: + * + * $query->filterByDbEndTime('2011-03-14'); // WHERE end_time = '2011-03-14' + * $query->filterByDbEndTime('now'); // WHERE end_time = '2011-03-14' + * $query->filterByDbEndTime(array('max' => 'yesterday')); // WHERE end_time < '2011-03-13' + * + * + * @param mixed $dbEndTime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcLiveLogQuery The current query, for fluid interface + */ + public function filterByDbEndTime($dbEndTime = null, $comparison = null) + { + if (is_array($dbEndTime)) { + $useMinMax = false; + if (isset($dbEndTime['min'])) { + $this->addUsingAlias(CcLiveLogPeer::END_TIME, $dbEndTime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbEndTime['max'])) { + $this->addUsingAlias(CcLiveLogPeer::END_TIME, $dbEndTime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } - /** - * Filter the query on the start_time column - * - * @param string|array $dbStartTime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcLiveLogQuery The current query, for fluid interface - */ - public function filterByDbStartTime($dbStartTime = null, $comparison = null) - { - if (is_array($dbStartTime)) { - $useMinMax = false; - if (isset($dbStartTime['min'])) { - $this->addUsingAlias(CcLiveLogPeer::START_TIME, $dbStartTime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbStartTime['max'])) { - $this->addUsingAlias(CcLiveLogPeer::START_TIME, $dbStartTime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcLiveLogPeer::START_TIME, $dbStartTime, $comparison); - } + return $this->addUsingAlias(CcLiveLogPeer::END_TIME, $dbEndTime, $comparison); + } - /** - * Filter the query on the end_time column - * - * @param string|array $dbEndTime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcLiveLogQuery The current query, for fluid interface - */ - public function filterByDbEndTime($dbEndTime = null, $comparison = null) - { - if (is_array($dbEndTime)) { - $useMinMax = false; - if (isset($dbEndTime['min'])) { - $this->addUsingAlias(CcLiveLogPeer::END_TIME, $dbEndTime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbEndTime['max'])) { - $this->addUsingAlias(CcLiveLogPeer::END_TIME, $dbEndTime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcLiveLogPeer::END_TIME, $dbEndTime, $comparison); - } + /** + * Exclude object from result + * + * @param CcLiveLog $ccLiveLog Object to remove from the list of results + * + * @return CcLiveLogQuery The current query, for fluid interface + */ + public function prune($ccLiveLog = null) + { + if ($ccLiveLog) { + $this->addUsingAlias(CcLiveLogPeer::ID, $ccLiveLog->getDbId(), Criteria::NOT_EQUAL); + } - /** - * Exclude object from result - * - * @param CcLiveLog $ccLiveLog Object to remove from the list of results - * - * @return CcLiveLogQuery The current query, for fluid interface - */ - public function prune($ccLiveLog = null) - { - if ($ccLiveLog) { - $this->addUsingAlias(CcLiveLogPeer::ID, $ccLiveLog->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } + return $this; + } -} // BaseCcLiveLogQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcLocale.php b/airtime_mvc/application/models/airtime/om/BaseCcLocale.php index fdd4d43d8e..651c3f1efc 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcLocale.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcLocale.php @@ -4,761 +4,881 @@ /** * Base class that represents a row from the 'cc_locale' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcLocale extends BaseObject implements Persistent +abstract class BaseCcLocale extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcLocalePeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcLocalePeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the locale_code field. - * @var string - */ - protected $locale_code; - - /** - * The value for the locale_lang field. - * @var string - */ - protected $locale_lang; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [locale_code] column value. - * - * @return string - */ - public function getDbLocaleCode() - { - return $this->locale_code; - } - - /** - * Get the [locale_lang] column value. - * - * @return string - */ - public function getDbLocaleLang() - { - return $this->locale_lang; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcLocale The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcLocalePeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [locale_code] column. - * - * @param string $v new value - * @return CcLocale The current object (for fluent API support) - */ - public function setDbLocaleCode($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->locale_code !== $v) { - $this->locale_code = $v; - $this->modifiedColumns[] = CcLocalePeer::LOCALE_CODE; - } - - return $this; - } // setDbLocaleCode() - - /** - * Set the value of [locale_lang] column. - * - * @param string $v new value - * @return CcLocale The current object (for fluent API support) - */ - public function setDbLocaleLang($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->locale_lang !== $v) { - $this->locale_lang = $v; - $this->modifiedColumns[] = CcLocalePeer::LOCALE_LANG; - } - - return $this; - } // setDbLocaleLang() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->locale_code = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->locale_lang = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 3; // 3 = CcLocalePeer::NUM_COLUMNS - CcLocalePeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcLocale object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcLocalePeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcLocaleQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcLocalePeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcLocalePeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcLocalePeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcLocalePeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows = CcLocalePeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcLocalePeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcLocalePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbLocaleCode(); - break; - case 2: - return $this->getDbLocaleLang(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcLocalePeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbLocaleCode(), - $keys[2] => $this->getDbLocaleLang(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcLocalePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbLocaleCode($value); - break; - case 2: - $this->setDbLocaleLang($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcLocalePeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbLocaleCode($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbLocaleLang($arr[$keys[2]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcLocalePeer::DATABASE_NAME); - - if ($this->isColumnModified(CcLocalePeer::ID)) $criteria->add(CcLocalePeer::ID, $this->id); - if ($this->isColumnModified(CcLocalePeer::LOCALE_CODE)) $criteria->add(CcLocalePeer::LOCALE_CODE, $this->locale_code); - if ($this->isColumnModified(CcLocalePeer::LOCALE_LANG)) $criteria->add(CcLocalePeer::LOCALE_LANG, $this->locale_lang); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcLocalePeer::DATABASE_NAME); - $criteria->add(CcLocalePeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcLocale (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbLocaleCode($this->locale_code); - $copyObj->setDbLocaleLang($this->locale_lang); - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcLocale Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcLocalePeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcLocalePeer(); - } - return self::$peer; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->locale_code = null; - $this->locale_lang = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcLocale + /** + * Peer class name + */ + const PEER = 'CcLocalePeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcLocalePeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the locale_code field. + * @var string + */ + protected $locale_code; + + /** + * The value for the locale_lang field. + * @var string + */ + protected $locale_lang; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [locale_code] column value. + * + * @return string + */ + public function getDbLocaleCode() + { + + return $this->locale_code; + } + + /** + * Get the [locale_lang] column value. + * + * @return string + */ + public function getDbLocaleLang() + { + + return $this->locale_lang; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcLocale The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcLocalePeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [locale_code] column. + * + * @param string $v new value + * @return CcLocale The current object (for fluent API support) + */ + public function setDbLocaleCode($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->locale_code !== $v) { + $this->locale_code = $v; + $this->modifiedColumns[] = CcLocalePeer::LOCALE_CODE; + } + + + return $this; + } // setDbLocaleCode() + + /** + * Set the value of [locale_lang] column. + * + * @param string $v new value + * @return CcLocale The current object (for fluent API support) + */ + public function setDbLocaleLang($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->locale_lang !== $v) { + $this->locale_lang = $v; + $this->modifiedColumns[] = CcLocalePeer::LOCALE_LANG; + } + + + return $this; + } // setDbLocaleLang() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->locale_code = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->locale_lang = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 3; // 3 = CcLocalePeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcLocale object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcLocalePeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcLocaleQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcLocalePeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcLocalePeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcLocalePeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_locale_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcLocalePeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcLocalePeer::LOCALE_CODE)) { + $modifiedColumns[':p' . $index++] = '"locale_code"'; + } + if ($this->isColumnModified(CcLocalePeer::LOCALE_LANG)) { + $modifiedColumns[':p' . $index++] = '"locale_lang"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_locale" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"locale_code"': + $stmt->bindValue($identifier, $this->locale_code, PDO::PARAM_STR); + break; + case '"locale_lang"': + $stmt->bindValue($identifier, $this->locale_lang, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcLocalePeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcLocalePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbLocaleCode(); + break; + case 2: + return $this->getDbLocaleLang(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array()) + { + if (isset($alreadyDumpedObjects['CcLocale'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcLocale'][$this->getPrimaryKey()] = true; + $keys = CcLocalePeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbLocaleCode(), + $keys[2] => $this->getDbLocaleLang(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcLocalePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbLocaleCode($value); + break; + case 2: + $this->setDbLocaleLang($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcLocalePeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbLocaleCode($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbLocaleLang($arr[$keys[2]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcLocalePeer::DATABASE_NAME); + + if ($this->isColumnModified(CcLocalePeer::ID)) $criteria->add(CcLocalePeer::ID, $this->id); + if ($this->isColumnModified(CcLocalePeer::LOCALE_CODE)) $criteria->add(CcLocalePeer::LOCALE_CODE, $this->locale_code); + if ($this->isColumnModified(CcLocalePeer::LOCALE_LANG)) $criteria->add(CcLocalePeer::LOCALE_LANG, $this->locale_lang); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcLocalePeer::DATABASE_NAME); + $criteria->add(CcLocalePeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcLocale (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbLocaleCode($this->getDbLocaleCode()); + $copyObj->setDbLocaleLang($this->getDbLocaleLang()); + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcLocale Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcLocalePeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcLocalePeer(); + } + + return self::$peer; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->locale_code = null; + $this->locale_lang = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcLocalePeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcLocalePeer.php b/airtime_mvc/application/models/airtime/om/BaseCcLocalePeer.php index eebb6a0024..73658ced3c 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcLocalePeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcLocalePeer.php @@ -4,737 +4,759 @@ /** * Base static class for performing query and update operations on the 'cc_locale' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcLocalePeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_locale'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcLocale'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcLocale'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcLocaleTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 3; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_locale.ID'; - - /** the column name for the LOCALE_CODE field */ - const LOCALE_CODE = 'cc_locale.LOCALE_CODE'; - - /** the column name for the LOCALE_LANG field */ - const LOCALE_LANG = 'cc_locale.LOCALE_LANG'; - - /** - * An identiy map to hold any loaded instances of CcLocale objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcLocale[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbLocaleCode', 'DbLocaleLang', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbLocaleCode', 'dbLocaleLang', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::LOCALE_CODE, self::LOCALE_LANG, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'LOCALE_CODE', 'LOCALE_LANG', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'locale_code', 'locale_lang', ), - BasePeer::TYPE_NUM => array (0, 1, 2, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbLocaleCode' => 1, 'DbLocaleLang' => 2, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbLocaleCode' => 1, 'dbLocaleLang' => 2, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::LOCALE_CODE => 1, self::LOCALE_LANG => 2, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'LOCALE_CODE' => 1, 'LOCALE_LANG' => 2, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'locale_code' => 1, 'locale_lang' => 2, ), - BasePeer::TYPE_NUM => array (0, 1, 2, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcLocalePeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcLocalePeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcLocalePeer::ID); - $criteria->addSelectColumn(CcLocalePeer::LOCALE_CODE); - $criteria->addSelectColumn(CcLocalePeer::LOCALE_LANG); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.LOCALE_CODE'); - $criteria->addSelectColumn($alias . '.LOCALE_LANG'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcLocalePeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcLocalePeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcLocale - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcLocalePeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcLocalePeer::populateObjects(CcLocalePeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcLocalePeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcLocale $value A CcLocale object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcLocale $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcLocale object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcLocale) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcLocale object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcLocale Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_locale - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcLocalePeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcLocalePeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcLocalePeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcLocalePeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcLocale object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcLocalePeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcLocalePeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcLocalePeer::NUM_COLUMNS; - } else { - $cls = CcLocalePeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcLocalePeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcLocalePeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcLocalePeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcLocaleTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcLocalePeer::CLASS_DEFAULT : CcLocalePeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcLocale or Criteria object. - * - * @param mixed $values Criteria or CcLocale object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcLocale object - } - - if ($criteria->containsKey(CcLocalePeer::ID) && $criteria->keyContainsValue(CcLocalePeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcLocalePeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcLocale or Criteria object. - * - * @param mixed $values Criteria or CcLocale object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcLocalePeer::ID); - $value = $criteria->remove(CcLocalePeer::ID); - if ($value) { - $selectCriteria->add(CcLocalePeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcLocalePeer::TABLE_NAME); - } - - } else { // $values is CcLocale object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_locale table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcLocalePeer::TABLE_NAME, $con, CcLocalePeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcLocalePeer::clearInstancePool(); - CcLocalePeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcLocale or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcLocale object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcLocalePeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcLocale) { // it's a model object - // invalidate the cache for this single object - CcLocalePeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcLocalePeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcLocalePeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcLocalePeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcLocale object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcLocale $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcLocale $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcLocalePeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcLocalePeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcLocalePeer::DATABASE_NAME, CcLocalePeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcLocale - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcLocalePeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcLocalePeer::DATABASE_NAME); - $criteria->add(CcLocalePeer::ID, $pk); - - $v = CcLocalePeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcLocalePeer::DATABASE_NAME); - $criteria->add(CcLocalePeer::ID, $pks, Criteria::IN); - $objs = CcLocalePeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcLocalePeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_locale'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcLocale'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcLocaleTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 3; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 3; + + /** the column name for the id field */ + const ID = 'cc_locale.id'; + + /** the column name for the locale_code field */ + const LOCALE_CODE = 'cc_locale.locale_code'; + + /** the column name for the locale_lang field */ + const LOCALE_LANG = 'cc_locale.locale_lang'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcLocale objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcLocale[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcLocalePeer::$fieldNames[CcLocalePeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbLocaleCode', 'DbLocaleLang', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbLocaleCode', 'dbLocaleLang', ), + BasePeer::TYPE_COLNAME => array (CcLocalePeer::ID, CcLocalePeer::LOCALE_CODE, CcLocalePeer::LOCALE_LANG, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'LOCALE_CODE', 'LOCALE_LANG', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'locale_code', 'locale_lang', ), + BasePeer::TYPE_NUM => array (0, 1, 2, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcLocalePeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbLocaleCode' => 1, 'DbLocaleLang' => 2, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbLocaleCode' => 1, 'dbLocaleLang' => 2, ), + BasePeer::TYPE_COLNAME => array (CcLocalePeer::ID => 0, CcLocalePeer::LOCALE_CODE => 1, CcLocalePeer::LOCALE_LANG => 2, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'LOCALE_CODE' => 1, 'LOCALE_LANG' => 2, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'locale_code' => 1, 'locale_lang' => 2, ), + BasePeer::TYPE_NUM => array (0, 1, 2, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcLocalePeer::getFieldNames($toType); + $key = isset(CcLocalePeer::$fieldKeys[$fromType][$name]) ? CcLocalePeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcLocalePeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcLocalePeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcLocalePeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcLocalePeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcLocalePeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcLocalePeer::ID); + $criteria->addSelectColumn(CcLocalePeer::LOCALE_CODE); + $criteria->addSelectColumn(CcLocalePeer::LOCALE_LANG); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.locale_code'); + $criteria->addSelectColumn($alias . '.locale_lang'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcLocalePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcLocalePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcLocalePeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcLocale + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcLocalePeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcLocalePeer::populateObjects(CcLocalePeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcLocalePeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcLocalePeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcLocale $obj A CcLocale object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcLocalePeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcLocale object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcLocale) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcLocale object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcLocalePeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcLocale Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcLocalePeer::$instances[$key])) { + return CcLocalePeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcLocalePeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcLocalePeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_locale + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcLocalePeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcLocalePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcLocalePeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcLocalePeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcLocale object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcLocalePeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcLocalePeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcLocalePeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcLocalePeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcLocalePeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcLocalePeer::DATABASE_NAME)->getTable(CcLocalePeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcLocalePeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcLocalePeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcLocaleTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcLocalePeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcLocale or Criteria object. + * + * @param mixed $values Criteria or CcLocale object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcLocale object + } + + if ($criteria->containsKey(CcLocalePeer::ID) && $criteria->keyContainsValue(CcLocalePeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcLocalePeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcLocalePeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcLocale or Criteria object. + * + * @param mixed $values Criteria or CcLocale object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcLocalePeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcLocalePeer::ID); + $value = $criteria->remove(CcLocalePeer::ID); + if ($value) { + $selectCriteria->add(CcLocalePeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcLocalePeer::TABLE_NAME); + } + + } else { // $values is CcLocale object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcLocalePeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_locale table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcLocalePeer::TABLE_NAME, $con, CcLocalePeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcLocalePeer::clearInstancePool(); + CcLocalePeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcLocale or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcLocale object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcLocalePeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcLocale) { // it's a model object + // invalidate the cache for this single object + CcLocalePeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcLocalePeer::DATABASE_NAME); + $criteria->add(CcLocalePeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcLocalePeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcLocalePeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcLocalePeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcLocale object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcLocale $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcLocalePeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcLocalePeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcLocalePeer::DATABASE_NAME, CcLocalePeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcLocale + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcLocalePeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcLocalePeer::DATABASE_NAME); + $criteria->add(CcLocalePeer::ID, $pk); + + $v = CcLocalePeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcLocale[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcLocalePeer::DATABASE_NAME); + $criteria->add(CcLocalePeer::ID, $pks, Criteria::IN); + $objs = CcLocalePeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcLocalePeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcLocaleQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcLocaleQuery.php index e12a5971b0..ab5960d9b5 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcLocaleQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcLocaleQuery.php @@ -4,214 +4,339 @@ /** * Base class that represents a query for the 'cc_locale' table. * - * * - * @method CcLocaleQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcLocaleQuery orderByDbLocaleCode($order = Criteria::ASC) Order by the locale_code column - * @method CcLocaleQuery orderByDbLocaleLang($order = Criteria::ASC) Order by the locale_lang column * - * @method CcLocaleQuery groupByDbId() Group by the id column - * @method CcLocaleQuery groupByDbLocaleCode() Group by the locale_code column - * @method CcLocaleQuery groupByDbLocaleLang() Group by the locale_lang column + * @method CcLocaleQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcLocaleQuery orderByDbLocaleCode($order = Criteria::ASC) Order by the locale_code column + * @method CcLocaleQuery orderByDbLocaleLang($order = Criteria::ASC) Order by the locale_lang column * - * @method CcLocaleQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcLocaleQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcLocaleQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcLocaleQuery groupByDbId() Group by the id column + * @method CcLocaleQuery groupByDbLocaleCode() Group by the locale_code column + * @method CcLocaleQuery groupByDbLocaleLang() Group by the locale_lang column * - * @method CcLocale findOne(PropelPDO $con = null) Return the first CcLocale matching the query - * @method CcLocale findOneOrCreate(PropelPDO $con = null) Return the first CcLocale matching the query, or a new CcLocale object populated from the query conditions when no match is found + * @method CcLocaleQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcLocaleQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcLocaleQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcLocale findOneByDbId(int $id) Return the first CcLocale filtered by the id column - * @method CcLocale findOneByDbLocaleCode(string $locale_code) Return the first CcLocale filtered by the locale_code column - * @method CcLocale findOneByDbLocaleLang(string $locale_lang) Return the first CcLocale filtered by the locale_lang column + * @method CcLocale findOne(PropelPDO $con = null) Return the first CcLocale matching the query + * @method CcLocale findOneOrCreate(PropelPDO $con = null) Return the first CcLocale matching the query, or a new CcLocale object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcLocale objects filtered by the id column - * @method array findByDbLocaleCode(string $locale_code) Return CcLocale objects filtered by the locale_code column - * @method array findByDbLocaleLang(string $locale_lang) Return CcLocale objects filtered by the locale_lang column + * @method CcLocale findOneByDbLocaleCode(string $locale_code) Return the first CcLocale filtered by the locale_code column + * @method CcLocale findOneByDbLocaleLang(string $locale_lang) Return the first CcLocale filtered by the locale_lang column + * + * @method array findByDbId(int $id) Return CcLocale objects filtered by the id column + * @method array findByDbLocaleCode(string $locale_code) Return CcLocale objects filtered by the locale_code column + * @method array findByDbLocaleLang(string $locale_lang) Return CcLocale objects filtered by the locale_lang column * * @package propel.generator.airtime.om */ abstract class BaseCcLocaleQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcLocaleQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcLocale'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcLocaleQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcLocaleQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcLocaleQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcLocaleQuery) { + return $criteria; + } + $query = new CcLocaleQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcLocale|CcLocale[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcLocalePeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcLocalePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcLocale A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcLocale A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "locale_code", "locale_lang" FROM "cc_locale" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcLocale(); + $obj->hydrate($row); + CcLocalePeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcLocale|CcLocale[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcLocale[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcLocaleQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcLocalePeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcLocaleQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcLocalePeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcLocaleQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcLocalePeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcLocalePeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcLocalePeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the locale_code column + * + * Example usage: + * + * $query->filterByDbLocaleCode('fooValue'); // WHERE locale_code = 'fooValue' + * $query->filterByDbLocaleCode('%fooValue%'); // WHERE locale_code LIKE '%fooValue%' + * + * + * @param string $dbLocaleCode The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcLocaleQuery The current query, for fluid interface + */ + public function filterByDbLocaleCode($dbLocaleCode = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLocaleCode)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLocaleCode)) { + $dbLocaleCode = str_replace('*', '%', $dbLocaleCode); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcLocalePeer::LOCALE_CODE, $dbLocaleCode, $comparison); + } + + /** + * Filter the query on the locale_lang column + * + * Example usage: + * + * $query->filterByDbLocaleLang('fooValue'); // WHERE locale_lang = 'fooValue' + * $query->filterByDbLocaleLang('%fooValue%'); // WHERE locale_lang LIKE '%fooValue%' + * + * + * @param string $dbLocaleLang The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcLocaleQuery The current query, for fluid interface + */ + public function filterByDbLocaleLang($dbLocaleLang = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLocaleLang)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLocaleLang)) { + $dbLocaleLang = str_replace('*', '%', $dbLocaleLang); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcLocalePeer::LOCALE_LANG, $dbLocaleLang, $comparison); + } + + /** + * Exclude object from result + * + * @param CcLocale $ccLocale Object to remove from the list of results + * + * @return CcLocaleQuery The current query, for fluid interface + */ + public function prune($ccLocale = null) + { + if ($ccLocale) { + $this->addUsingAlias(CcLocalePeer::ID, $ccLocale->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcLocaleQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcLocale', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcLocaleQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcLocaleQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcLocaleQuery) { - return $criteria; - } - $query = new CcLocaleQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcLocale|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcLocalePeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcLocaleQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcLocalePeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcLocaleQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcLocalePeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcLocaleQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcLocalePeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the locale_code column - * - * @param string $dbLocaleCode The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcLocaleQuery The current query, for fluid interface - */ - public function filterByDbLocaleCode($dbLocaleCode = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLocaleCode)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLocaleCode)) { - $dbLocaleCode = str_replace('*', '%', $dbLocaleCode); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcLocalePeer::LOCALE_CODE, $dbLocaleCode, $comparison); - } - - /** - * Filter the query on the locale_lang column - * - * @param string $dbLocaleLang The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcLocaleQuery The current query, for fluid interface - */ - public function filterByDbLocaleLang($dbLocaleLang = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLocaleLang)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLocaleLang)) { - $dbLocaleLang = str_replace('*', '%', $dbLocaleLang); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcLocalePeer::LOCALE_LANG, $dbLocaleLang, $comparison); - } - - /** - * Exclude object from result - * - * @param CcLocale $ccLocale Object to remove from the list of results - * - * @return CcLocaleQuery The current query, for fluid interface - */ - public function prune($ccLocale = null) - { - if ($ccLocale) { - $this->addUsingAlias(CcLocalePeer::ID, $ccLocale->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcLocaleQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcLoginAttempts.php b/airtime_mvc/application/models/airtime/om/BaseCcLoginAttempts.php index b529e12d59..bccc85ab19 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcLoginAttempts.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcLoginAttempts.php @@ -4,732 +4,838 @@ /** * Base class that represents a row from the 'cc_login_attempts' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcLoginAttempts extends BaseObject implements Persistent +abstract class BaseCcLoginAttempts extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcLoginAttemptsPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcLoginAttemptsPeer - */ - protected static $peer; - - /** - * The value for the ip field. - * @var string - */ - protected $ip; - - /** - * The value for the attempts field. - * Note: this column has a database default value of: 0 - * @var int - */ - protected $attempts; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->attempts = 0; - } - - /** - * Initializes internal state of BaseCcLoginAttempts object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [ip] column value. - * - * @return string - */ - public function getDbIP() - { - return $this->ip; - } - - /** - * Get the [attempts] column value. - * - * @return int - */ - public function getDbAttempts() - { - return $this->attempts; - } - - /** - * Set the value of [ip] column. - * - * @param string $v new value - * @return CcLoginAttempts The current object (for fluent API support) - */ - public function setDbIP($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->ip !== $v) { - $this->ip = $v; - $this->modifiedColumns[] = CcLoginAttemptsPeer::IP; - } - - return $this; - } // setDbIP() - - /** - * Set the value of [attempts] column. - * - * @param int $v new value - * @return CcLoginAttempts The current object (for fluent API support) - */ - public function setDbAttempts($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->attempts !== $v || $this->isNew()) { - $this->attempts = $v; - $this->modifiedColumns[] = CcLoginAttemptsPeer::ATTEMPTS; - } - - return $this; - } // setDbAttempts() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->attempts !== 0) { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->ip = ($row[$startcol + 0] !== null) ? (string) $row[$startcol + 0] : null; - $this->attempts = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 2; // 2 = CcLoginAttemptsPeer::NUM_COLUMNS - CcLoginAttemptsPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcLoginAttempts object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcLoginAttemptsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcLoginAttemptsQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcLoginAttemptsPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setNew(false); - } else { - $affectedRows = CcLoginAttemptsPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcLoginAttemptsPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcLoginAttemptsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbIP(); - break; - case 1: - return $this->getDbAttempts(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcLoginAttemptsPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbIP(), - $keys[1] => $this->getDbAttempts(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcLoginAttemptsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbIP($value); - break; - case 1: - $this->setDbAttempts($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcLoginAttemptsPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbIP($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbAttempts($arr[$keys[1]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcLoginAttemptsPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcLoginAttemptsPeer::IP)) $criteria->add(CcLoginAttemptsPeer::IP, $this->ip); - if ($this->isColumnModified(CcLoginAttemptsPeer::ATTEMPTS)) $criteria->add(CcLoginAttemptsPeer::ATTEMPTS, $this->attempts); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcLoginAttemptsPeer::DATABASE_NAME); - $criteria->add(CcLoginAttemptsPeer::IP, $this->ip); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return string - */ - public function getPrimaryKey() - { - return $this->getDbIP(); - } - - /** - * Generic method to set the primary key (ip column). - * - * @param string $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbIP($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbIP(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcLoginAttempts (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbIP($this->ip); - $copyObj->setDbAttempts($this->attempts); - - $copyObj->setNew(true); - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcLoginAttempts Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcLoginAttemptsPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcLoginAttemptsPeer(); - } - return self::$peer; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->ip = null; - $this->attempts = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcLoginAttempts + /** + * Peer class name + */ + const PEER = 'CcLoginAttemptsPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcLoginAttemptsPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the ip field. + * @var string + */ + protected $ip; + + /** + * The value for the attempts field. + * Note: this column has a database default value of: 0 + * @var int + */ + protected $attempts; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->attempts = 0; + } + + /** + * Initializes internal state of BaseCcLoginAttempts object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [ip] column value. + * + * @return string + */ + public function getDbIP() + { + + return $this->ip; + } + + /** + * Get the [attempts] column value. + * + * @return int + */ + public function getDbAttempts() + { + + return $this->attempts; + } + + /** + * Set the value of [ip] column. + * + * @param string $v new value + * @return CcLoginAttempts The current object (for fluent API support) + */ + public function setDbIP($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->ip !== $v) { + $this->ip = $v; + $this->modifiedColumns[] = CcLoginAttemptsPeer::IP; + } + + + return $this; + } // setDbIP() + + /** + * Set the value of [attempts] column. + * + * @param int $v new value + * @return CcLoginAttempts The current object (for fluent API support) + */ + public function setDbAttempts($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->attempts !== $v) { + $this->attempts = $v; + $this->modifiedColumns[] = CcLoginAttemptsPeer::ATTEMPTS; + } + + + return $this; + } // setDbAttempts() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->attempts !== 0) { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->ip = ($row[$startcol + 0] !== null) ? (string) $row[$startcol + 0] : null; + $this->attempts = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 2; // 2 = CcLoginAttemptsPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcLoginAttempts object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcLoginAttemptsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcLoginAttemptsQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcLoginAttemptsPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcLoginAttemptsPeer::IP)) { + $modifiedColumns[':p' . $index++] = '"ip"'; + } + if ($this->isColumnModified(CcLoginAttemptsPeer::ATTEMPTS)) { + $modifiedColumns[':p' . $index++] = '"attempts"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_login_attempts" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"ip"': + $stmt->bindValue($identifier, $this->ip, PDO::PARAM_STR); + break; + case '"attempts"': + $stmt->bindValue($identifier, $this->attempts, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcLoginAttemptsPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcLoginAttemptsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbIP(); + break; + case 1: + return $this->getDbAttempts(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array()) + { + if (isset($alreadyDumpedObjects['CcLoginAttempts'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcLoginAttempts'][$this->getPrimaryKey()] = true; + $keys = CcLoginAttemptsPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbIP(), + $keys[1] => $this->getDbAttempts(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcLoginAttemptsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbIP($value); + break; + case 1: + $this->setDbAttempts($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcLoginAttemptsPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbIP($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbAttempts($arr[$keys[1]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcLoginAttemptsPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcLoginAttemptsPeer::IP)) $criteria->add(CcLoginAttemptsPeer::IP, $this->ip); + if ($this->isColumnModified(CcLoginAttemptsPeer::ATTEMPTS)) $criteria->add(CcLoginAttemptsPeer::ATTEMPTS, $this->attempts); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcLoginAttemptsPeer::DATABASE_NAME); + $criteria->add(CcLoginAttemptsPeer::IP, $this->ip); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return string + */ + public function getPrimaryKey() + { + return $this->getDbIP(); + } + + /** + * Generic method to set the primary key (ip column). + * + * @param string $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbIP($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbIP(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcLoginAttempts (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbAttempts($this->getDbAttempts()); + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbIP(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcLoginAttempts Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcLoginAttemptsPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcLoginAttemptsPeer(); + } + + return self::$peer; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->ip = null; + $this->attempts = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcLoginAttemptsPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcLoginAttemptsPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcLoginAttemptsPeer.php index 27b4cd90c7..b9fcca697a 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcLoginAttemptsPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcLoginAttemptsPeer.php @@ -4,728 +4,750 @@ /** * Base static class for performing query and update operations on the 'cc_login_attempts' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcLoginAttemptsPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_login_attempts'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcLoginAttempts'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcLoginAttempts'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcLoginAttemptsTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 2; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the IP field */ - const IP = 'cc_login_attempts.IP'; - - /** the column name for the ATTEMPTS field */ - const ATTEMPTS = 'cc_login_attempts.ATTEMPTS'; - - /** - * An identiy map to hold any loaded instances of CcLoginAttempts objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcLoginAttempts[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbIP', 'DbAttempts', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbIP', 'dbAttempts', ), - BasePeer::TYPE_COLNAME => array (self::IP, self::ATTEMPTS, ), - BasePeer::TYPE_RAW_COLNAME => array ('IP', 'ATTEMPTS', ), - BasePeer::TYPE_FIELDNAME => array ('ip', 'attempts', ), - BasePeer::TYPE_NUM => array (0, 1, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbIP' => 0, 'DbAttempts' => 1, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbIP' => 0, 'dbAttempts' => 1, ), - BasePeer::TYPE_COLNAME => array (self::IP => 0, self::ATTEMPTS => 1, ), - BasePeer::TYPE_RAW_COLNAME => array ('IP' => 0, 'ATTEMPTS' => 1, ), - BasePeer::TYPE_FIELDNAME => array ('ip' => 0, 'attempts' => 1, ), - BasePeer::TYPE_NUM => array (0, 1, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcLoginAttemptsPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcLoginAttemptsPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcLoginAttemptsPeer::IP); - $criteria->addSelectColumn(CcLoginAttemptsPeer::ATTEMPTS); - } else { - $criteria->addSelectColumn($alias . '.IP'); - $criteria->addSelectColumn($alias . '.ATTEMPTS'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcLoginAttemptsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcLoginAttemptsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcLoginAttempts - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcLoginAttemptsPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcLoginAttemptsPeer::populateObjects(CcLoginAttemptsPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcLoginAttemptsPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcLoginAttempts $value A CcLoginAttempts object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcLoginAttempts $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbIP(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcLoginAttempts object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcLoginAttempts) { - $key = (string) $value->getDbIP(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcLoginAttempts object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcLoginAttempts Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_login_attempts - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (string) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcLoginAttemptsPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcLoginAttemptsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcLoginAttemptsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcLoginAttemptsPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcLoginAttempts object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcLoginAttemptsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcLoginAttemptsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcLoginAttemptsPeer::NUM_COLUMNS; - } else { - $cls = CcLoginAttemptsPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcLoginAttemptsPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcLoginAttemptsPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcLoginAttemptsPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcLoginAttemptsTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcLoginAttemptsPeer::CLASS_DEFAULT : CcLoginAttemptsPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcLoginAttempts or Criteria object. - * - * @param mixed $values Criteria or CcLoginAttempts object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcLoginAttempts object - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcLoginAttempts or Criteria object. - * - * @param mixed $values Criteria or CcLoginAttempts object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcLoginAttemptsPeer::IP); - $value = $criteria->remove(CcLoginAttemptsPeer::IP); - if ($value) { - $selectCriteria->add(CcLoginAttemptsPeer::IP, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcLoginAttemptsPeer::TABLE_NAME); - } - - } else { // $values is CcLoginAttempts object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_login_attempts table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcLoginAttemptsPeer::TABLE_NAME, $con, CcLoginAttemptsPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcLoginAttemptsPeer::clearInstancePool(); - CcLoginAttemptsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcLoginAttempts or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcLoginAttempts object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcLoginAttemptsPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcLoginAttempts) { // it's a model object - // invalidate the cache for this single object - CcLoginAttemptsPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcLoginAttemptsPeer::IP, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcLoginAttemptsPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcLoginAttemptsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcLoginAttempts object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcLoginAttempts $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcLoginAttempts $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcLoginAttemptsPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcLoginAttemptsPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcLoginAttemptsPeer::DATABASE_NAME, CcLoginAttemptsPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param string $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcLoginAttempts - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcLoginAttemptsPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcLoginAttemptsPeer::DATABASE_NAME); - $criteria->add(CcLoginAttemptsPeer::IP, $pk); - - $v = CcLoginAttemptsPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcLoginAttemptsPeer::DATABASE_NAME); - $criteria->add(CcLoginAttemptsPeer::IP, $pks, Criteria::IN); - $objs = CcLoginAttemptsPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcLoginAttemptsPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_login_attempts'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcLoginAttempts'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcLoginAttemptsTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 2; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 2; + + /** the column name for the ip field */ + const IP = 'cc_login_attempts.ip'; + + /** the column name for the attempts field */ + const ATTEMPTS = 'cc_login_attempts.attempts'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcLoginAttempts objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcLoginAttempts[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcLoginAttemptsPeer::$fieldNames[CcLoginAttemptsPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbIP', 'DbAttempts', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbIP', 'dbAttempts', ), + BasePeer::TYPE_COLNAME => array (CcLoginAttemptsPeer::IP, CcLoginAttemptsPeer::ATTEMPTS, ), + BasePeer::TYPE_RAW_COLNAME => array ('IP', 'ATTEMPTS', ), + BasePeer::TYPE_FIELDNAME => array ('ip', 'attempts', ), + BasePeer::TYPE_NUM => array (0, 1, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcLoginAttemptsPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbIP' => 0, 'DbAttempts' => 1, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbIP' => 0, 'dbAttempts' => 1, ), + BasePeer::TYPE_COLNAME => array (CcLoginAttemptsPeer::IP => 0, CcLoginAttemptsPeer::ATTEMPTS => 1, ), + BasePeer::TYPE_RAW_COLNAME => array ('IP' => 0, 'ATTEMPTS' => 1, ), + BasePeer::TYPE_FIELDNAME => array ('ip' => 0, 'attempts' => 1, ), + BasePeer::TYPE_NUM => array (0, 1, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcLoginAttemptsPeer::getFieldNames($toType); + $key = isset(CcLoginAttemptsPeer::$fieldKeys[$fromType][$name]) ? CcLoginAttemptsPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcLoginAttemptsPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcLoginAttemptsPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcLoginAttemptsPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcLoginAttemptsPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcLoginAttemptsPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcLoginAttemptsPeer::IP); + $criteria->addSelectColumn(CcLoginAttemptsPeer::ATTEMPTS); + } else { + $criteria->addSelectColumn($alias . '.ip'); + $criteria->addSelectColumn($alias . '.attempts'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcLoginAttemptsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcLoginAttemptsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcLoginAttemptsPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcLoginAttempts + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcLoginAttemptsPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcLoginAttemptsPeer::populateObjects(CcLoginAttemptsPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcLoginAttemptsPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcLoginAttemptsPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcLoginAttempts $obj A CcLoginAttempts object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbIP(); + } // if key === null + CcLoginAttemptsPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcLoginAttempts object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcLoginAttempts) { + $key = (string) $value->getDbIP(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcLoginAttempts object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcLoginAttemptsPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcLoginAttempts Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcLoginAttemptsPeer::$instances[$key])) { + return CcLoginAttemptsPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcLoginAttemptsPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcLoginAttemptsPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_login_attempts + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (string) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcLoginAttemptsPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcLoginAttemptsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcLoginAttemptsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcLoginAttemptsPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcLoginAttempts object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcLoginAttemptsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcLoginAttemptsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcLoginAttemptsPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcLoginAttemptsPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcLoginAttemptsPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcLoginAttemptsPeer::DATABASE_NAME)->getTable(CcLoginAttemptsPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcLoginAttemptsPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcLoginAttemptsPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcLoginAttemptsTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcLoginAttemptsPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcLoginAttempts or Criteria object. + * + * @param mixed $values Criteria or CcLoginAttempts object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcLoginAttempts object + } + + + // Set the correct dbName + $criteria->setDbName(CcLoginAttemptsPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcLoginAttempts or Criteria object. + * + * @param mixed $values Criteria or CcLoginAttempts object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcLoginAttemptsPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcLoginAttemptsPeer::IP); + $value = $criteria->remove(CcLoginAttemptsPeer::IP); + if ($value) { + $selectCriteria->add(CcLoginAttemptsPeer::IP, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcLoginAttemptsPeer::TABLE_NAME); + } + + } else { // $values is CcLoginAttempts object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcLoginAttemptsPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_login_attempts table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcLoginAttemptsPeer::TABLE_NAME, $con, CcLoginAttemptsPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcLoginAttemptsPeer::clearInstancePool(); + CcLoginAttemptsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcLoginAttempts or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcLoginAttempts object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcLoginAttemptsPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcLoginAttempts) { // it's a model object + // invalidate the cache for this single object + CcLoginAttemptsPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcLoginAttemptsPeer::DATABASE_NAME); + $criteria->add(CcLoginAttemptsPeer::IP, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcLoginAttemptsPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcLoginAttemptsPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcLoginAttemptsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcLoginAttempts object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcLoginAttempts $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcLoginAttemptsPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcLoginAttemptsPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcLoginAttemptsPeer::DATABASE_NAME, CcLoginAttemptsPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param string $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcLoginAttempts + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcLoginAttemptsPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcLoginAttemptsPeer::DATABASE_NAME); + $criteria->add(CcLoginAttemptsPeer::IP, $pk); + + $v = CcLoginAttemptsPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcLoginAttempts[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcLoginAttemptsPeer::DATABASE_NAME); + $criteria->add(CcLoginAttemptsPeer::IP, $pks, Criteria::IN); + $objs = CcLoginAttemptsPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcLoginAttemptsPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcLoginAttemptsQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcLoginAttemptsQuery.php index 930f32edaf..eb29818c99 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcLoginAttemptsQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcLoginAttemptsQuery.php @@ -4,202 +4,306 @@ /** * Base class that represents a query for the 'cc_login_attempts' table. * - * * - * @method CcLoginAttemptsQuery orderByDbIP($order = Criteria::ASC) Order by the ip column - * @method CcLoginAttemptsQuery orderByDbAttempts($order = Criteria::ASC) Order by the attempts column * - * @method CcLoginAttemptsQuery groupByDbIP() Group by the ip column - * @method CcLoginAttemptsQuery groupByDbAttempts() Group by the attempts column + * @method CcLoginAttemptsQuery orderByDbIP($order = Criteria::ASC) Order by the ip column + * @method CcLoginAttemptsQuery orderByDbAttempts($order = Criteria::ASC) Order by the attempts column * - * @method CcLoginAttemptsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcLoginAttemptsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcLoginAttemptsQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcLoginAttemptsQuery groupByDbIP() Group by the ip column + * @method CcLoginAttemptsQuery groupByDbAttempts() Group by the attempts column * - * @method CcLoginAttempts findOne(PropelPDO $con = null) Return the first CcLoginAttempts matching the query - * @method CcLoginAttempts findOneOrCreate(PropelPDO $con = null) Return the first CcLoginAttempts matching the query, or a new CcLoginAttempts object populated from the query conditions when no match is found + * @method CcLoginAttemptsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcLoginAttemptsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcLoginAttemptsQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcLoginAttempts findOneByDbIP(string $ip) Return the first CcLoginAttempts filtered by the ip column - * @method CcLoginAttempts findOneByDbAttempts(int $attempts) Return the first CcLoginAttempts filtered by the attempts column + * @method CcLoginAttempts findOne(PropelPDO $con = null) Return the first CcLoginAttempts matching the query + * @method CcLoginAttempts findOneOrCreate(PropelPDO $con = null) Return the first CcLoginAttempts matching the query, or a new CcLoginAttempts object populated from the query conditions when no match is found * - * @method array findByDbIP(string $ip) Return CcLoginAttempts objects filtered by the ip column - * @method array findByDbAttempts(int $attempts) Return CcLoginAttempts objects filtered by the attempts column + * @method CcLoginAttempts findOneByDbAttempts(int $attempts) Return the first CcLoginAttempts filtered by the attempts column + * + * @method array findByDbIP(string $ip) Return CcLoginAttempts objects filtered by the ip column + * @method array findByDbAttempts(int $attempts) Return CcLoginAttempts objects filtered by the attempts column * * @package propel.generator.airtime.om */ abstract class BaseCcLoginAttemptsQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcLoginAttemptsQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcLoginAttempts'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcLoginAttemptsQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcLoginAttemptsQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcLoginAttemptsQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcLoginAttemptsQuery) { + return $criteria; + } + $query = new CcLoginAttemptsQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcLoginAttempts|CcLoginAttempts[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcLoginAttemptsPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcLoginAttemptsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcLoginAttempts A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbIP($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcLoginAttempts A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "ip", "attempts" FROM "cc_login_attempts" WHERE "ip" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_STR); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcLoginAttempts(); + $obj->hydrate($row); + CcLoginAttemptsPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcLoginAttempts|CcLoginAttempts[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcLoginAttempts[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcLoginAttemptsQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcLoginAttemptsPeer::IP, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcLoginAttemptsQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcLoginAttemptsPeer::IP, $keys, Criteria::IN); + } + + /** + * Filter the query on the ip column + * + * Example usage: + * + * $query->filterByDbIP('fooValue'); // WHERE ip = 'fooValue' + * $query->filterByDbIP('%fooValue%'); // WHERE ip LIKE '%fooValue%' + * + * + * @param string $dbIP The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcLoginAttemptsQuery The current query, for fluid interface + */ + public function filterByDbIP($dbIP = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbIP)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbIP)) { + $dbIP = str_replace('*', '%', $dbIP); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcLoginAttemptsPeer::IP, $dbIP, $comparison); + } + + /** + * Filter the query on the attempts column + * + * Example usage: + * + * $query->filterByDbAttempts(1234); // WHERE attempts = 1234 + * $query->filterByDbAttempts(array(12, 34)); // WHERE attempts IN (12, 34) + * $query->filterByDbAttempts(array('min' => 12)); // WHERE attempts >= 12 + * $query->filterByDbAttempts(array('max' => 12)); // WHERE attempts <= 12 + * + * + * @param mixed $dbAttempts The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcLoginAttemptsQuery The current query, for fluid interface + */ + public function filterByDbAttempts($dbAttempts = null, $comparison = null) + { + if (is_array($dbAttempts)) { + $useMinMax = false; + if (isset($dbAttempts['min'])) { + $this->addUsingAlias(CcLoginAttemptsPeer::ATTEMPTS, $dbAttempts['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbAttempts['max'])) { + $this->addUsingAlias(CcLoginAttemptsPeer::ATTEMPTS, $dbAttempts['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcLoginAttemptsPeer::ATTEMPTS, $dbAttempts, $comparison); + } + + /** + * Exclude object from result + * + * @param CcLoginAttempts $ccLoginAttempts Object to remove from the list of results + * + * @return CcLoginAttemptsQuery The current query, for fluid interface + */ + public function prune($ccLoginAttempts = null) + { + if ($ccLoginAttempts) { + $this->addUsingAlias(CcLoginAttemptsPeer::IP, $ccLoginAttempts->getDbIP(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcLoginAttemptsQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcLoginAttempts', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcLoginAttemptsQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcLoginAttemptsQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcLoginAttemptsQuery) { - return $criteria; - } - $query = new CcLoginAttemptsQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcLoginAttempts|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcLoginAttemptsPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcLoginAttemptsQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcLoginAttemptsPeer::IP, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcLoginAttemptsQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcLoginAttemptsPeer::IP, $keys, Criteria::IN); - } - - /** - * Filter the query on the ip column - * - * @param string $dbIP The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcLoginAttemptsQuery The current query, for fluid interface - */ - public function filterByDbIP($dbIP = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbIP)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbIP)) { - $dbIP = str_replace('*', '%', $dbIP); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcLoginAttemptsPeer::IP, $dbIP, $comparison); - } - - /** - * Filter the query on the attempts column - * - * @param int|array $dbAttempts The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcLoginAttemptsQuery The current query, for fluid interface - */ - public function filterByDbAttempts($dbAttempts = null, $comparison = null) - { - if (is_array($dbAttempts)) { - $useMinMax = false; - if (isset($dbAttempts['min'])) { - $this->addUsingAlias(CcLoginAttemptsPeer::ATTEMPTS, $dbAttempts['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbAttempts['max'])) { - $this->addUsingAlias(CcLoginAttemptsPeer::ATTEMPTS, $dbAttempts['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcLoginAttemptsPeer::ATTEMPTS, $dbAttempts, $comparison); - } - - /** - * Exclude object from result - * - * @param CcLoginAttempts $ccLoginAttempts Object to remove from the list of results - * - * @return CcLoginAttemptsQuery The current query, for fluid interface - */ - public function prune($ccLoginAttempts = null) - { - if ($ccLoginAttempts) { - $this->addUsingAlias(CcLoginAttemptsPeer::IP, $ccLoginAttempts->getDbIP(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcLoginAttemptsQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcMountName.php b/airtime_mvc/application/models/airtime/om/BaseCcMountName.php index b476f05a8e..6917ae1efd 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcMountName.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcMountName.php @@ -4,890 +4,1163 @@ /** * Base class that represents a row from the 'cc_mount_name' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcMountName extends BaseObject implements Persistent +abstract class BaseCcMountName extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcMountNamePeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcMountNamePeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the mount_name field. - * @var string - */ - protected $mount_name; - - /** - * @var array CcListenerCount[] Collection to store aggregation of CcListenerCount objects. - */ - protected $collCcListenerCounts; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [mount_name] column value. - * - * @return string - */ - public function getDbMountName() - { - return $this->mount_name; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcMountName The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcMountNamePeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [mount_name] column. - * - * @param string $v new value - * @return CcMountName The current object (for fluent API support) - */ - public function setDbMountName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->mount_name !== $v) { - $this->mount_name = $v; - $this->modifiedColumns[] = CcMountNamePeer::MOUNT_NAME; - } - - return $this; - } // setDbMountName() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->mount_name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 2; // 2 = CcMountNamePeer::NUM_COLUMNS - CcMountNamePeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcMountName object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcMountNamePeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->collCcListenerCounts = null; - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcMountNameQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcMountNamePeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcMountNamePeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcMountNamePeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcMountNamePeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows = CcMountNamePeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - if ($this->collCcListenerCounts !== null) { - foreach ($this->collCcListenerCounts as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcMountNamePeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - if ($this->collCcListenerCounts !== null) { - foreach ($this->collCcListenerCounts as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcMountNamePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbMountName(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcMountNamePeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbMountName(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcMountNamePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbMountName($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcMountNamePeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbMountName($arr[$keys[1]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcMountNamePeer::DATABASE_NAME); - - if ($this->isColumnModified(CcMountNamePeer::ID)) $criteria->add(CcMountNamePeer::ID, $this->id); - if ($this->isColumnModified(CcMountNamePeer::MOUNT_NAME)) $criteria->add(CcMountNamePeer::MOUNT_NAME, $this->mount_name); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcMountNamePeer::DATABASE_NAME); - $criteria->add(CcMountNamePeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcMountName (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbMountName($this->mount_name); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getCcListenerCounts() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcListenerCount($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcMountName Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcMountNamePeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcMountNamePeer(); - } - return self::$peer; - } - - /** - * Clears out the collCcListenerCounts collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcListenerCounts() - */ - public function clearCcListenerCounts() - { - $this->collCcListenerCounts = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcListenerCounts collection. - * - * By default this just sets the collCcListenerCounts collection to an empty array (like clearcollCcListenerCounts()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcListenerCounts() - { - $this->collCcListenerCounts = new PropelObjectCollection(); - $this->collCcListenerCounts->setModel('CcListenerCount'); - } - - /** - * Gets an array of CcListenerCount objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcMountName is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcListenerCount[] List of CcListenerCount objects - * @throws PropelException - */ - public function getCcListenerCounts($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcListenerCounts || null !== $criteria) { - if ($this->isNew() && null === $this->collCcListenerCounts) { - // return empty collection - $this->initCcListenerCounts(); - } else { - $collCcListenerCounts = CcListenerCountQuery::create(null, $criteria) - ->filterByCcMountName($this) - ->find($con); - if (null !== $criteria) { - return $collCcListenerCounts; - } - $this->collCcListenerCounts = $collCcListenerCounts; - } - } - return $this->collCcListenerCounts; - } - - /** - * Returns the number of related CcListenerCount objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcListenerCount objects. - * @throws PropelException - */ - public function countCcListenerCounts(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcListenerCounts || null !== $criteria) { - if ($this->isNew() && null === $this->collCcListenerCounts) { - return 0; - } else { - $query = CcListenerCountQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcMountName($this) - ->count($con); - } - } else { - return count($this->collCcListenerCounts); - } - } - - /** - * Method called to associate a CcListenerCount object to this object - * through the CcListenerCount foreign key attribute. - * - * @param CcListenerCount $l CcListenerCount - * @return void - * @throws PropelException - */ - public function addCcListenerCount(CcListenerCount $l) - { - if ($this->collCcListenerCounts === null) { - $this->initCcListenerCounts(); - } - if (!$this->collCcListenerCounts->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcListenerCounts[]= $l; - $l->setCcMountName($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcMountName is new, it will return - * an empty collection; or if this CcMountName has previously - * been saved, it will retrieve related CcListenerCounts from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcMountName. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcListenerCount[] List of CcListenerCount objects - */ - public function getCcListenerCountsJoinCcTimestamp($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcListenerCountQuery::create(null, $criteria); - $query->joinWith('CcTimestamp', $join_behavior); - - return $this->getCcListenerCounts($query, $con); - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->mount_name = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - if ($this->collCcListenerCounts) { - foreach ((array) $this->collCcListenerCounts as $o) { - $o->clearAllReferences($deep); - } - } - } // if ($deep) - - $this->collCcListenerCounts = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcMountName + /** + * Peer class name + */ + const PEER = 'CcMountNamePeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcMountNamePeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the mount_name field. + * @var string + */ + protected $mount_name; + + /** + * @var PropelObjectCollection|CcListenerCount[] Collection to store aggregation of CcListenerCount objects. + */ + protected $collCcListenerCounts; + protected $collCcListenerCountsPartial; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccListenerCountsScheduledForDeletion = null; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [mount_name] column value. + * + * @return string + */ + public function getDbMountName() + { + + return $this->mount_name; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcMountName The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcMountNamePeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [mount_name] column. + * + * @param string $v new value + * @return CcMountName The current object (for fluent API support) + */ + public function setDbMountName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->mount_name !== $v) { + $this->mount_name = $v; + $this->modifiedColumns[] = CcMountNamePeer::MOUNT_NAME; + } + + + return $this; + } // setDbMountName() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->mount_name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 2; // 2 = CcMountNamePeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcMountName object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcMountNamePeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->collCcListenerCounts = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcMountNameQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcMountNamePeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->ccListenerCountsScheduledForDeletion !== null) { + if (!$this->ccListenerCountsScheduledForDeletion->isEmpty()) { + CcListenerCountQuery::create() + ->filterByPrimaryKeys($this->ccListenerCountsScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccListenerCountsScheduledForDeletion = null; + } + } + + if ($this->collCcListenerCounts !== null) { + foreach ($this->collCcListenerCounts as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcMountNamePeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcMountNamePeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_mount_name_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcMountNamePeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcMountNamePeer::MOUNT_NAME)) { + $modifiedColumns[':p' . $index++] = '"mount_name"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_mount_name" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"mount_name"': + $stmt->bindValue($identifier, $this->mount_name, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcMountNamePeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + if ($this->collCcListenerCounts !== null) { + foreach ($this->collCcListenerCounts as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcMountNamePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbMountName(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcMountName'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcMountName'][$this->getPrimaryKey()] = true; + $keys = CcMountNamePeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbMountName(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->collCcListenerCounts) { + $result['CcListenerCounts'] = $this->collCcListenerCounts->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcMountNamePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbMountName($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcMountNamePeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbMountName($arr[$keys[1]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcMountNamePeer::DATABASE_NAME); + + if ($this->isColumnModified(CcMountNamePeer::ID)) $criteria->add(CcMountNamePeer::ID, $this->id); + if ($this->isColumnModified(CcMountNamePeer::MOUNT_NAME)) $criteria->add(CcMountNamePeer::MOUNT_NAME, $this->mount_name); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcMountNamePeer::DATABASE_NAME); + $criteria->add(CcMountNamePeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcMountName (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbMountName($this->getDbMountName()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + foreach ($this->getCcListenerCounts() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcListenerCount($relObj->copy($deepCopy)); + } + } + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcMountName Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcMountNamePeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcMountNamePeer(); + } + + return self::$peer; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CcListenerCount' == $relationName) { + $this->initCcListenerCounts(); + } + } + + /** + * Clears out the collCcListenerCounts collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcMountName The current object (for fluent API support) + * @see addCcListenerCounts() + */ + public function clearCcListenerCounts() + { + $this->collCcListenerCounts = null; // important to set this to null since that means it is uninitialized + $this->collCcListenerCountsPartial = null; + + return $this; + } + + /** + * reset is the collCcListenerCounts collection loaded partially + * + * @return void + */ + public function resetPartialCcListenerCounts($v = true) + { + $this->collCcListenerCountsPartial = $v; + } + + /** + * Initializes the collCcListenerCounts collection. + * + * By default this just sets the collCcListenerCounts collection to an empty array (like clearcollCcListenerCounts()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcListenerCounts($overrideExisting = true) + { + if (null !== $this->collCcListenerCounts && !$overrideExisting) { + return; + } + $this->collCcListenerCounts = new PropelObjectCollection(); + $this->collCcListenerCounts->setModel('CcListenerCount'); + } + + /** + * Gets an array of CcListenerCount objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcMountName is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcListenerCount[] List of CcListenerCount objects + * @throws PropelException + */ + public function getCcListenerCounts($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcListenerCountsPartial && !$this->isNew(); + if (null === $this->collCcListenerCounts || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcListenerCounts) { + // return empty collection + $this->initCcListenerCounts(); + } else { + $collCcListenerCounts = CcListenerCountQuery::create(null, $criteria) + ->filterByCcMountName($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcListenerCountsPartial && count($collCcListenerCounts)) { + $this->initCcListenerCounts(false); + + foreach ($collCcListenerCounts as $obj) { + if (false == $this->collCcListenerCounts->contains($obj)) { + $this->collCcListenerCounts->append($obj); + } + } + + $this->collCcListenerCountsPartial = true; + } + + $collCcListenerCounts->getInternalIterator()->rewind(); + + return $collCcListenerCounts; + } + + if ($partial && $this->collCcListenerCounts) { + foreach ($this->collCcListenerCounts as $obj) { + if ($obj->isNew()) { + $collCcListenerCounts[] = $obj; + } + } + } + + $this->collCcListenerCounts = $collCcListenerCounts; + $this->collCcListenerCountsPartial = false; + } + } + + return $this->collCcListenerCounts; + } + + /** + * Sets a collection of CcListenerCount objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccListenerCounts A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcMountName The current object (for fluent API support) + */ + public function setCcListenerCounts(PropelCollection $ccListenerCounts, PropelPDO $con = null) + { + $ccListenerCountsToDelete = $this->getCcListenerCounts(new Criteria(), $con)->diff($ccListenerCounts); + + + $this->ccListenerCountsScheduledForDeletion = $ccListenerCountsToDelete; + + foreach ($ccListenerCountsToDelete as $ccListenerCountRemoved) { + $ccListenerCountRemoved->setCcMountName(null); + } + + $this->collCcListenerCounts = null; + foreach ($ccListenerCounts as $ccListenerCount) { + $this->addCcListenerCount($ccListenerCount); + } + + $this->collCcListenerCounts = $ccListenerCounts; + $this->collCcListenerCountsPartial = false; + + return $this; + } + + /** + * Returns the number of related CcListenerCount objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcListenerCount objects. + * @throws PropelException + */ + public function countCcListenerCounts(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcListenerCountsPartial && !$this->isNew(); + if (null === $this->collCcListenerCounts || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcListenerCounts) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcListenerCounts()); + } + $query = CcListenerCountQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcMountName($this) + ->count($con); + } + + return count($this->collCcListenerCounts); + } + + /** + * Method called to associate a CcListenerCount object to this object + * through the CcListenerCount foreign key attribute. + * + * @param CcListenerCount $l CcListenerCount + * @return CcMountName The current object (for fluent API support) + */ + public function addCcListenerCount(CcListenerCount $l) + { + if ($this->collCcListenerCounts === null) { + $this->initCcListenerCounts(); + $this->collCcListenerCountsPartial = true; + } + + if (!in_array($l, $this->collCcListenerCounts->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcListenerCount($l); + + if ($this->ccListenerCountsScheduledForDeletion and $this->ccListenerCountsScheduledForDeletion->contains($l)) { + $this->ccListenerCountsScheduledForDeletion->remove($this->ccListenerCountsScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcListenerCount $ccListenerCount The ccListenerCount object to add. + */ + protected function doAddCcListenerCount($ccListenerCount) + { + $this->collCcListenerCounts[]= $ccListenerCount; + $ccListenerCount->setCcMountName($this); + } + + /** + * @param CcListenerCount $ccListenerCount The ccListenerCount object to remove. + * @return CcMountName The current object (for fluent API support) + */ + public function removeCcListenerCount($ccListenerCount) + { + if ($this->getCcListenerCounts()->contains($ccListenerCount)) { + $this->collCcListenerCounts->remove($this->collCcListenerCounts->search($ccListenerCount)); + if (null === $this->ccListenerCountsScheduledForDeletion) { + $this->ccListenerCountsScheduledForDeletion = clone $this->collCcListenerCounts; + $this->ccListenerCountsScheduledForDeletion->clear(); + } + $this->ccListenerCountsScheduledForDeletion[]= clone $ccListenerCount; + $ccListenerCount->setCcMountName(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcMountName is new, it will return + * an empty collection; or if this CcMountName has previously + * been saved, it will retrieve related CcListenerCounts from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcMountName. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcListenerCount[] List of CcListenerCount objects + */ + public function getCcListenerCountsJoinCcTimestamp($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcListenerCountQuery::create(null, $criteria); + $query->joinWith('CcTimestamp', $join_behavior); + + return $this->getCcListenerCounts($query, $con); + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->mount_name = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCcListenerCounts) { + foreach ($this->collCcListenerCounts as $o) { + $o->clearAllReferences($deep); + } + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + if ($this->collCcListenerCounts instanceof PropelCollection) { + $this->collCcListenerCounts->clearIterator(); + } + $this->collCcListenerCounts = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcMountNamePeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcMountNamePeer.php b/airtime_mvc/application/models/airtime/om/BaseCcMountNamePeer.php index af2e416b17..ebbdb596ed 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcMountNamePeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcMountNamePeer.php @@ -4,735 +4,757 @@ /** * Base static class for performing query and update operations on the 'cc_mount_name' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcMountNamePeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_mount_name'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcMountName'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcMountName'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcMountNameTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 2; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_mount_name.ID'; - - /** the column name for the MOUNT_NAME field */ - const MOUNT_NAME = 'cc_mount_name.MOUNT_NAME'; - - /** - * An identiy map to hold any loaded instances of CcMountName objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcMountName[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbMountName', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbMountName', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::MOUNT_NAME, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'MOUNT_NAME', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'mount_name', ), - BasePeer::TYPE_NUM => array (0, 1, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbMountName' => 1, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbMountName' => 1, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::MOUNT_NAME => 1, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'MOUNT_NAME' => 1, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'mount_name' => 1, ), - BasePeer::TYPE_NUM => array (0, 1, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcMountNamePeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcMountNamePeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcMountNamePeer::ID); - $criteria->addSelectColumn(CcMountNamePeer::MOUNT_NAME); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.MOUNT_NAME'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcMountNamePeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcMountNamePeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcMountName - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcMountNamePeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcMountNamePeer::populateObjects(CcMountNamePeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcMountNamePeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcMountName $value A CcMountName object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcMountName $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcMountName object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcMountName) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcMountName object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcMountName Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_mount_name - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - // Invalidate objects in CcListenerCountPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcListenerCountPeer::clearInstancePool(); - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcMountNamePeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcMountNamePeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcMountNamePeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcMountNamePeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcMountName object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcMountNamePeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcMountNamePeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcMountNamePeer::NUM_COLUMNS; - } else { - $cls = CcMountNamePeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcMountNamePeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcMountNamePeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcMountNamePeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcMountNameTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcMountNamePeer::CLASS_DEFAULT : CcMountNamePeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcMountName or Criteria object. - * - * @param mixed $values Criteria or CcMountName object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcMountName object - } - - if ($criteria->containsKey(CcMountNamePeer::ID) && $criteria->keyContainsValue(CcMountNamePeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcMountNamePeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcMountName or Criteria object. - * - * @param mixed $values Criteria or CcMountName object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcMountNamePeer::ID); - $value = $criteria->remove(CcMountNamePeer::ID); - if ($value) { - $selectCriteria->add(CcMountNamePeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcMountNamePeer::TABLE_NAME); - } - - } else { // $values is CcMountName object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_mount_name table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcMountNamePeer::TABLE_NAME, $con, CcMountNamePeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcMountNamePeer::clearInstancePool(); - CcMountNamePeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcMountName or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcMountName object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcMountNamePeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcMountName) { // it's a model object - // invalidate the cache for this single object - CcMountNamePeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcMountNamePeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcMountNamePeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcMountNamePeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcMountName object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcMountName $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcMountName $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcMountNamePeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcMountNamePeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcMountNamePeer::DATABASE_NAME, CcMountNamePeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcMountName - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcMountNamePeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcMountNamePeer::DATABASE_NAME); - $criteria->add(CcMountNamePeer::ID, $pk); - - $v = CcMountNamePeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcMountNamePeer::DATABASE_NAME); - $criteria->add(CcMountNamePeer::ID, $pks, Criteria::IN); - $objs = CcMountNamePeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcMountNamePeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_mount_name'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcMountName'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcMountNameTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 2; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 2; + + /** the column name for the id field */ + const ID = 'cc_mount_name.id'; + + /** the column name for the mount_name field */ + const MOUNT_NAME = 'cc_mount_name.mount_name'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcMountName objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcMountName[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcMountNamePeer::$fieldNames[CcMountNamePeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbMountName', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbMountName', ), + BasePeer::TYPE_COLNAME => array (CcMountNamePeer::ID, CcMountNamePeer::MOUNT_NAME, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'MOUNT_NAME', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'mount_name', ), + BasePeer::TYPE_NUM => array (0, 1, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcMountNamePeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbMountName' => 1, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbMountName' => 1, ), + BasePeer::TYPE_COLNAME => array (CcMountNamePeer::ID => 0, CcMountNamePeer::MOUNT_NAME => 1, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'MOUNT_NAME' => 1, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'mount_name' => 1, ), + BasePeer::TYPE_NUM => array (0, 1, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcMountNamePeer::getFieldNames($toType); + $key = isset(CcMountNamePeer::$fieldKeys[$fromType][$name]) ? CcMountNamePeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcMountNamePeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcMountNamePeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcMountNamePeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcMountNamePeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcMountNamePeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcMountNamePeer::ID); + $criteria->addSelectColumn(CcMountNamePeer::MOUNT_NAME); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.mount_name'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcMountNamePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcMountNamePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcMountNamePeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcMountName + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcMountNamePeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcMountNamePeer::populateObjects(CcMountNamePeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcMountNamePeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcMountNamePeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcMountName $obj A CcMountName object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcMountNamePeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcMountName object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcMountName) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcMountName object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcMountNamePeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcMountName Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcMountNamePeer::$instances[$key])) { + return CcMountNamePeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcMountNamePeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcMountNamePeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_mount_name + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in CcListenerCountPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcListenerCountPeer::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcMountNamePeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcMountNamePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcMountNamePeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcMountNamePeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcMountName object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcMountNamePeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcMountNamePeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcMountNamePeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcMountNamePeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcMountNamePeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcMountNamePeer::DATABASE_NAME)->getTable(CcMountNamePeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcMountNamePeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcMountNamePeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcMountNameTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcMountNamePeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcMountName or Criteria object. + * + * @param mixed $values Criteria or CcMountName object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcMountName object + } + + if ($criteria->containsKey(CcMountNamePeer::ID) && $criteria->keyContainsValue(CcMountNamePeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcMountNamePeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcMountNamePeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcMountName or Criteria object. + * + * @param mixed $values Criteria or CcMountName object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcMountNamePeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcMountNamePeer::ID); + $value = $criteria->remove(CcMountNamePeer::ID); + if ($value) { + $selectCriteria->add(CcMountNamePeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcMountNamePeer::TABLE_NAME); + } + + } else { // $values is CcMountName object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcMountNamePeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_mount_name table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcMountNamePeer::TABLE_NAME, $con, CcMountNamePeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcMountNamePeer::clearInstancePool(); + CcMountNamePeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcMountName or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcMountName object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcMountNamePeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcMountName) { // it's a model object + // invalidate the cache for this single object + CcMountNamePeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcMountNamePeer::DATABASE_NAME); + $criteria->add(CcMountNamePeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcMountNamePeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcMountNamePeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcMountNamePeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcMountName object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcMountName $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcMountNamePeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcMountNamePeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcMountNamePeer::DATABASE_NAME, CcMountNamePeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcMountName + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcMountNamePeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcMountNamePeer::DATABASE_NAME); + $criteria->add(CcMountNamePeer::ID, $pk); + + $v = CcMountNamePeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcMountName[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcMountNamePeer::DATABASE_NAME); + $criteria->add(CcMountNamePeer::ID, $pks, Criteria::IN); + $objs = CcMountNamePeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcMountNamePeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcMountNameQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcMountNameQuery.php index 52af75f382..af0f6befc2 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcMountNameQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcMountNameQuery.php @@ -4,256 +4,384 @@ /** * Base class that represents a query for the 'cc_mount_name' table. * - * * - * @method CcMountNameQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcMountNameQuery orderByDbMountName($order = Criteria::ASC) Order by the mount_name column * - * @method CcMountNameQuery groupByDbId() Group by the id column - * @method CcMountNameQuery groupByDbMountName() Group by the mount_name column + * @method CcMountNameQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcMountNameQuery orderByDbMountName($order = Criteria::ASC) Order by the mount_name column * - * @method CcMountNameQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcMountNameQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcMountNameQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcMountNameQuery groupByDbId() Group by the id column + * @method CcMountNameQuery groupByDbMountName() Group by the mount_name column * - * @method CcMountNameQuery leftJoinCcListenerCount($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcListenerCount relation - * @method CcMountNameQuery rightJoinCcListenerCount($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcListenerCount relation - * @method CcMountNameQuery innerJoinCcListenerCount($relationAlias = '') Adds a INNER JOIN clause to the query using the CcListenerCount relation + * @method CcMountNameQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcMountNameQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcMountNameQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcMountName findOne(PropelPDO $con = null) Return the first CcMountName matching the query - * @method CcMountName findOneOrCreate(PropelPDO $con = null) Return the first CcMountName matching the query, or a new CcMountName object populated from the query conditions when no match is found + * @method CcMountNameQuery leftJoinCcListenerCount($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcListenerCount relation + * @method CcMountNameQuery rightJoinCcListenerCount($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcListenerCount relation + * @method CcMountNameQuery innerJoinCcListenerCount($relationAlias = null) Adds a INNER JOIN clause to the query using the CcListenerCount relation * - * @method CcMountName findOneByDbId(int $id) Return the first CcMountName filtered by the id column - * @method CcMountName findOneByDbMountName(string $mount_name) Return the first CcMountName filtered by the mount_name column + * @method CcMountName findOne(PropelPDO $con = null) Return the first CcMountName matching the query + * @method CcMountName findOneOrCreate(PropelPDO $con = null) Return the first CcMountName matching the query, or a new CcMountName object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcMountName objects filtered by the id column - * @method array findByDbMountName(string $mount_name) Return CcMountName objects filtered by the mount_name column + * @method CcMountName findOneByDbMountName(string $mount_name) Return the first CcMountName filtered by the mount_name column + * + * @method array findByDbId(int $id) Return CcMountName objects filtered by the id column + * @method array findByDbMountName(string $mount_name) Return CcMountName objects filtered by the mount_name column * * @package propel.generator.airtime.om */ abstract class BaseCcMountNameQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcMountNameQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcMountName'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcMountNameQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcMountNameQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcMountNameQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcMountNameQuery) { + return $criteria; + } + $query = new CcMountNameQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcMountName|CcMountName[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcMountNamePeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcMountNamePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcMountName A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcMountName A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "mount_name" FROM "cc_mount_name" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcMountName(); + $obj->hydrate($row); + CcMountNamePeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcMountName|CcMountName[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcMountName[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcMountNameQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcMountNamePeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcMountNameQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcMountNamePeer::ID, $keys, Criteria::IN); + } - /** - * Initializes internal state of BaseCcMountNameQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcMountName', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcMountNameQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcMountNamePeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcMountNamePeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } - /** - * Returns a new CcMountNameQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcMountNameQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcMountNameQuery) { - return $criteria; - } - $query = new CcMountNameQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } + return $this->addUsingAlias(CcMountNamePeer::ID, $dbId, $comparison); + } - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcMountName|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcMountNamePeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } + /** + * Filter the query on the mount_name column + * + * Example usage: + * + * $query->filterByDbMountName('fooValue'); // WHERE mount_name = 'fooValue' + * $query->filterByDbMountName('%fooValue%'); // WHERE mount_name LIKE '%fooValue%' + * + * + * @param string $dbMountName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcMountNameQuery The current query, for fluid interface + */ + public function filterByDbMountName($dbMountName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbMountName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbMountName)) { + $dbMountName = str_replace('*', '%', $dbMountName); + $comparison = Criteria::LIKE; + } + } - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } + return $this->addUsingAlias(CcMountNamePeer::MOUNT_NAME, $dbMountName, $comparison); + } - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcMountNameQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcMountNamePeer::ID, $key, Criteria::EQUAL); - } + /** + * Filter the query by a related CcListenerCount object + * + * @param CcListenerCount|PropelObjectCollection $ccListenerCount the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcMountNameQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcListenerCount($ccListenerCount, $comparison = null) + { + if ($ccListenerCount instanceof CcListenerCount) { + return $this + ->addUsingAlias(CcMountNamePeer::ID, $ccListenerCount->getDbMountNameId(), $comparison); + } elseif ($ccListenerCount instanceof PropelObjectCollection) { + return $this + ->useCcListenerCountQuery() + ->filterByPrimaryKeys($ccListenerCount->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcListenerCount() only accepts arguments of type CcListenerCount or PropelCollection'); + } + } - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcMountNameQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcMountNamePeer::ID, $keys, Criteria::IN); - } + /** + * Adds a JOIN clause to the query using the CcListenerCount relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcMountNameQuery The current query, for fluid interface + */ + public function joinCcListenerCount($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcListenerCount'); - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcMountNameQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcMountNamePeer::ID, $dbId, $comparison); - } + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } - /** - * Filter the query on the mount_name column - * - * @param string $dbMountName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcMountNameQuery The current query, for fluid interface - */ - public function filterByDbMountName($dbMountName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbMountName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbMountName)) { - $dbMountName = str_replace('*', '%', $dbMountName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcMountNamePeer::MOUNT_NAME, $dbMountName, $comparison); - } + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcListenerCount'); + } - /** - * Filter the query by a related CcListenerCount object - * - * @param CcListenerCount $ccListenerCount the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcMountNameQuery The current query, for fluid interface - */ - public function filterByCcListenerCount($ccListenerCount, $comparison = null) - { - return $this - ->addUsingAlias(CcMountNamePeer::ID, $ccListenerCount->getDbMountNameId(), $comparison); - } + return $this; + } - /** - * Adds a JOIN clause to the query using the CcListenerCount relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcMountNameQuery The current query, for fluid interface - */ - public function joinCcListenerCount($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcListenerCount'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcListenerCount'); - } - - return $this; - } + /** + * Use the CcListenerCount relation CcListenerCount object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcListenerCountQuery A secondary query class using the current class as primary query + */ + public function useCcListenerCountQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcListenerCount($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcListenerCount', 'CcListenerCountQuery'); + } - /** - * Use the CcListenerCount relation CcListenerCount object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcListenerCountQuery A secondary query class using the current class as primary query - */ - public function useCcListenerCountQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcListenerCount($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcListenerCount', 'CcListenerCountQuery'); - } + /** + * Exclude object from result + * + * @param CcMountName $ccMountName Object to remove from the list of results + * + * @return CcMountNameQuery The current query, for fluid interface + */ + public function prune($ccMountName = null) + { + if ($ccMountName) { + $this->addUsingAlias(CcMountNamePeer::ID, $ccMountName->getDbId(), Criteria::NOT_EQUAL); + } - /** - * Exclude object from result - * - * @param CcMountName $ccMountName Object to remove from the list of results - * - * @return CcMountNameQuery The current query, for fluid interface - */ - public function prune($ccMountName = null) - { - if ($ccMountName) { - $this->addUsingAlias(CcMountNamePeer::ID, $ccMountName->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } + return $this; + } -} // BaseCcMountNameQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcMusicDirs.php b/airtime_mvc/application/models/airtime/om/BaseCcMusicDirs.php index f589159451..97718b7290 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcMusicDirs.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcMusicDirs.php @@ -4,1092 +4,1406 @@ /** * Base class that represents a row from the 'cc_music_dirs' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcMusicDirs extends BaseObject implements Persistent +abstract class BaseCcMusicDirs extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcMusicDirsPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcMusicDirsPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the directory field. - * @var string - */ - protected $directory; - - /** - * The value for the type field. - * @var string - */ - protected $type; - - /** - * The value for the exists field. - * Note: this column has a database default value of: true - * @var boolean - */ - protected $exists; - - /** - * The value for the watched field. - * Note: this column has a database default value of: true - * @var boolean - */ - protected $watched; - - /** - * @var array CcFiles[] Collection to store aggregation of CcFiles objects. - */ - protected $collCcFiless; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->exists = true; - $this->watched = true; - } - - /** - * Initializes internal state of BaseCcMusicDirs object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getId() - { - return $this->id; - } - - /** - * Get the [directory] column value. - * - * @return string - */ - public function getDirectory() - { - return $this->directory; - } - - /** - * Get the [type] column value. - * - * @return string - */ - public function getType() - { - return $this->type; - } - - /** - * Get the [exists] column value. - * - * @return boolean - */ - public function getExists() - { - return $this->exists; - } - - /** - * Get the [watched] column value. - * - * @return boolean - */ - public function getWatched() - { - return $this->watched; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcMusicDirs The current object (for fluent API support) - */ - public function setId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcMusicDirsPeer::ID; - } - - return $this; - } // setId() - - /** - * Set the value of [directory] column. - * - * @param string $v new value - * @return CcMusicDirs The current object (for fluent API support) - */ - public function setDirectory($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->directory !== $v) { - $this->directory = $v; - $this->modifiedColumns[] = CcMusicDirsPeer::DIRECTORY; - } - - return $this; - } // setDirectory() - - /** - * Set the value of [type] column. - * - * @param string $v new value - * @return CcMusicDirs The current object (for fluent API support) - */ - public function setType($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->type !== $v) { - $this->type = $v; - $this->modifiedColumns[] = CcMusicDirsPeer::TYPE; - } - - return $this; - } // setType() - - /** - * Set the value of [exists] column. - * - * @param boolean $v new value - * @return CcMusicDirs The current object (for fluent API support) - */ - public function setExists($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->exists !== $v || $this->isNew()) { - $this->exists = $v; - $this->modifiedColumns[] = CcMusicDirsPeer::EXISTS; - } - - return $this; - } // setExists() - - /** - * Set the value of [watched] column. - * - * @param boolean $v new value - * @return CcMusicDirs The current object (for fluent API support) - */ - public function setWatched($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->watched !== $v || $this->isNew()) { - $this->watched = $v; - $this->modifiedColumns[] = CcMusicDirsPeer::WATCHED; - } - - return $this; - } // setWatched() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->exists !== true) { - return false; - } - - if ($this->watched !== true) { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->directory = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->type = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->exists = ($row[$startcol + 3] !== null) ? (boolean) $row[$startcol + 3] : null; - $this->watched = ($row[$startcol + 4] !== null) ? (boolean) $row[$startcol + 4] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 5; // 5 = CcMusicDirsPeer::NUM_COLUMNS - CcMusicDirsPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcMusicDirs object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcMusicDirsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->collCcFiless = null; - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcMusicDirsQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcMusicDirsPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcMusicDirsPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcMusicDirsPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcMusicDirsPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows = CcMusicDirsPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - if ($this->collCcFiless !== null) { - foreach ($this->collCcFiless as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcMusicDirsPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - if ($this->collCcFiless !== null) { - foreach ($this->collCcFiless as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcMusicDirsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getId(); - break; - case 1: - return $this->getDirectory(); - break; - case 2: - return $this->getType(); - break; - case 3: - return $this->getExists(); - break; - case 4: - return $this->getWatched(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcMusicDirsPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getId(), - $keys[1] => $this->getDirectory(), - $keys[2] => $this->getType(), - $keys[3] => $this->getExists(), - $keys[4] => $this->getWatched(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcMusicDirsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setId($value); - break; - case 1: - $this->setDirectory($value); - break; - case 2: - $this->setType($value); - break; - case 3: - $this->setExists($value); - break; - case 4: - $this->setWatched($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcMusicDirsPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDirectory($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setType($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setExists($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setWatched($arr[$keys[4]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcMusicDirsPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcMusicDirsPeer::ID)) $criteria->add(CcMusicDirsPeer::ID, $this->id); - if ($this->isColumnModified(CcMusicDirsPeer::DIRECTORY)) $criteria->add(CcMusicDirsPeer::DIRECTORY, $this->directory); - if ($this->isColumnModified(CcMusicDirsPeer::TYPE)) $criteria->add(CcMusicDirsPeer::TYPE, $this->type); - if ($this->isColumnModified(CcMusicDirsPeer::EXISTS)) $criteria->add(CcMusicDirsPeer::EXISTS, $this->exists); - if ($this->isColumnModified(CcMusicDirsPeer::WATCHED)) $criteria->add(CcMusicDirsPeer::WATCHED, $this->watched); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcMusicDirsPeer::DATABASE_NAME); - $criteria->add(CcMusicDirsPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcMusicDirs (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDirectory($this->directory); - $copyObj->setType($this->type); - $copyObj->setExists($this->exists); - $copyObj->setWatched($this->watched); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getCcFiless() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcFiles($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - - - $copyObj->setNew(true); - $copyObj->setId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcMusicDirs Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcMusicDirsPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcMusicDirsPeer(); - } - return self::$peer; - } - - /** - * Clears out the collCcFiless collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcFiless() - */ - public function clearCcFiless() - { - $this->collCcFiless = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcFiless collection. - * - * By default this just sets the collCcFiless collection to an empty array (like clearcollCcFiless()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcFiless() - { - $this->collCcFiless = new PropelObjectCollection(); - $this->collCcFiless->setModel('CcFiles'); - } - - /** - * Gets an array of CcFiles objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcMusicDirs is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcFiles[] List of CcFiles objects - * @throws PropelException - */ - public function getCcFiless($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcFiless || null !== $criteria) { - if ($this->isNew() && null === $this->collCcFiless) { - // return empty collection - $this->initCcFiless(); - } else { - $collCcFiless = CcFilesQuery::create(null, $criteria) - ->filterByCcMusicDirs($this) - ->find($con); - if (null !== $criteria) { - return $collCcFiless; - } - $this->collCcFiless = $collCcFiless; - } - } - return $this->collCcFiless; - } - - /** - * Returns the number of related CcFiles objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcFiles objects. - * @throws PropelException - */ - public function countCcFiless(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcFiless || null !== $criteria) { - if ($this->isNew() && null === $this->collCcFiless) { - return 0; - } else { - $query = CcFilesQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcMusicDirs($this) - ->count($con); - } - } else { - return count($this->collCcFiless); - } - } - - /** - * Method called to associate a CcFiles object to this object - * through the CcFiles foreign key attribute. - * - * @param CcFiles $l CcFiles - * @return void - * @throws PropelException - */ - public function addCcFiles(CcFiles $l) - { - if ($this->collCcFiless === null) { - $this->initCcFiless(); - } - if (!$this->collCcFiless->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcFiless[]= $l; - $l->setCcMusicDirs($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcMusicDirs is new, it will return - * an empty collection; or if this CcMusicDirs has previously - * been saved, it will retrieve related CcFiless from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcMusicDirs. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcFiles[] List of CcFiles objects - */ - public function getCcFilessJoinFkOwner($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcFilesQuery::create(null, $criteria); - $query->joinWith('FkOwner', $join_behavior); - - return $this->getCcFiless($query, $con); - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcMusicDirs is new, it will return - * an empty collection; or if this CcMusicDirs has previously - * been saved, it will retrieve related CcFiless from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcMusicDirs. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcFiles[] List of CcFiles objects - */ - public function getCcFilessJoinCcSubjsRelatedByDbEditedby($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcFilesQuery::create(null, $criteria); - $query->joinWith('CcSubjsRelatedByDbEditedby', $join_behavior); - - return $this->getCcFiless($query, $con); - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->directory = null; - $this->type = null; - $this->exists = null; - $this->watched = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - if ($this->collCcFiless) { - foreach ((array) $this->collCcFiless as $o) { - $o->clearAllReferences($deep); - } - } - } // if ($deep) - - $this->collCcFiless = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcMusicDirs + /** + * Peer class name + */ + const PEER = 'CcMusicDirsPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcMusicDirsPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the directory field. + * @var string + */ + protected $directory; + + /** + * The value for the type field. + * @var string + */ + protected $type; + + /** + * The value for the exists field. + * Note: this column has a database default value of: true + * @var boolean + */ + protected $exists; + + /** + * The value for the watched field. + * Note: this column has a database default value of: true + * @var boolean + */ + protected $watched; + + /** + * @var PropelObjectCollection|CcFiles[] Collection to store aggregation of CcFiles objects. + */ + protected $collCcFiless; + protected $collCcFilessPartial; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccFilessScheduledForDeletion = null; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->exists = true; + $this->watched = true; + } + + /** + * Initializes internal state of BaseCcMusicDirs object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getId() + { + + return $this->id; + } + + /** + * Get the [directory] column value. + * + * @return string + */ + public function getDirectory() + { + + return $this->directory; + } + + /** + * Get the [type] column value. + * + * @return string + */ + public function getType() + { + + return $this->type; + } + + /** + * Get the [exists] column value. + * + * @return boolean + */ + public function getExists() + { + + return $this->exists; + } + + /** + * Get the [watched] column value. + * + * @return boolean + */ + public function getWatched() + { + + return $this->watched; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcMusicDirs The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcMusicDirsPeer::ID; + } + + + return $this; + } // setId() + + /** + * Set the value of [directory] column. + * + * @param string $v new value + * @return CcMusicDirs The current object (for fluent API support) + */ + public function setDirectory($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->directory !== $v) { + $this->directory = $v; + $this->modifiedColumns[] = CcMusicDirsPeer::DIRECTORY; + } + + + return $this; + } // setDirectory() + + /** + * Set the value of [type] column. + * + * @param string $v new value + * @return CcMusicDirs The current object (for fluent API support) + */ + public function setType($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->type !== $v) { + $this->type = $v; + $this->modifiedColumns[] = CcMusicDirsPeer::TYPE; + } + + + return $this; + } // setType() + + /** + * Sets the value of the [exists] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcMusicDirs The current object (for fluent API support) + */ + public function setExists($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->exists !== $v) { + $this->exists = $v; + $this->modifiedColumns[] = CcMusicDirsPeer::EXISTS; + } + + + return $this; + } // setExists() + + /** + * Sets the value of the [watched] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcMusicDirs The current object (for fluent API support) + */ + public function setWatched($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->watched !== $v) { + $this->watched = $v; + $this->modifiedColumns[] = CcMusicDirsPeer::WATCHED; + } + + + return $this; + } // setWatched() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->exists !== true) { + return false; + } + + if ($this->watched !== true) { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->directory = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->type = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->exists = ($row[$startcol + 3] !== null) ? (boolean) $row[$startcol + 3] : null; + $this->watched = ($row[$startcol + 4] !== null) ? (boolean) $row[$startcol + 4] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 5; // 5 = CcMusicDirsPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcMusicDirs object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcMusicDirsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->collCcFiless = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcMusicDirsQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcMusicDirsPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->ccFilessScheduledForDeletion !== null) { + if (!$this->ccFilessScheduledForDeletion->isEmpty()) { + foreach ($this->ccFilessScheduledForDeletion as $ccFiles) { + // need to save related object because we set the relation to null + $ccFiles->save($con); + } + $this->ccFilessScheduledForDeletion = null; + } + } + + if ($this->collCcFiless !== null) { + foreach ($this->collCcFiless as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcMusicDirsPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcMusicDirsPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_music_dirs_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcMusicDirsPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcMusicDirsPeer::DIRECTORY)) { + $modifiedColumns[':p' . $index++] = '"directory"'; + } + if ($this->isColumnModified(CcMusicDirsPeer::TYPE)) { + $modifiedColumns[':p' . $index++] = '"type"'; + } + if ($this->isColumnModified(CcMusicDirsPeer::EXISTS)) { + $modifiedColumns[':p' . $index++] = '"exists"'; + } + if ($this->isColumnModified(CcMusicDirsPeer::WATCHED)) { + $modifiedColumns[':p' . $index++] = '"watched"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_music_dirs" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"directory"': + $stmt->bindValue($identifier, $this->directory, PDO::PARAM_STR); + break; + case '"type"': + $stmt->bindValue($identifier, $this->type, PDO::PARAM_STR); + break; + case '"exists"': + $stmt->bindValue($identifier, $this->exists, PDO::PARAM_BOOL); + break; + case '"watched"': + $stmt->bindValue($identifier, $this->watched, PDO::PARAM_BOOL); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcMusicDirsPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + if ($this->collCcFiless !== null) { + foreach ($this->collCcFiless as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcMusicDirsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getDirectory(); + break; + case 2: + return $this->getType(); + break; + case 3: + return $this->getExists(); + break; + case 4: + return $this->getWatched(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcMusicDirs'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcMusicDirs'][$this->getPrimaryKey()] = true; + $keys = CcMusicDirsPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getDirectory(), + $keys[2] => $this->getType(), + $keys[3] => $this->getExists(), + $keys[4] => $this->getWatched(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->collCcFiless) { + $result['CcFiless'] = $this->collCcFiless->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcMusicDirsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setDirectory($value); + break; + case 2: + $this->setType($value); + break; + case 3: + $this->setExists($value); + break; + case 4: + $this->setWatched($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcMusicDirsPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDirectory($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setType($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setExists($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setWatched($arr[$keys[4]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcMusicDirsPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcMusicDirsPeer::ID)) $criteria->add(CcMusicDirsPeer::ID, $this->id); + if ($this->isColumnModified(CcMusicDirsPeer::DIRECTORY)) $criteria->add(CcMusicDirsPeer::DIRECTORY, $this->directory); + if ($this->isColumnModified(CcMusicDirsPeer::TYPE)) $criteria->add(CcMusicDirsPeer::TYPE, $this->type); + if ($this->isColumnModified(CcMusicDirsPeer::EXISTS)) $criteria->add(CcMusicDirsPeer::EXISTS, $this->exists); + if ($this->isColumnModified(CcMusicDirsPeer::WATCHED)) $criteria->add(CcMusicDirsPeer::WATCHED, $this->watched); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcMusicDirsPeer::DATABASE_NAME); + $criteria->add(CcMusicDirsPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcMusicDirs (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDirectory($this->getDirectory()); + $copyObj->setType($this->getType()); + $copyObj->setExists($this->getExists()); + $copyObj->setWatched($this->getWatched()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + foreach ($this->getCcFiless() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcFiles($relObj->copy($deepCopy)); + } + } + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcMusicDirs Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcMusicDirsPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcMusicDirsPeer(); + } + + return self::$peer; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CcFiles' == $relationName) { + $this->initCcFiless(); + } + } + + /** + * Clears out the collCcFiless collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcMusicDirs The current object (for fluent API support) + * @see addCcFiless() + */ + public function clearCcFiless() + { + $this->collCcFiless = null; // important to set this to null since that means it is uninitialized + $this->collCcFilessPartial = null; + + return $this; + } + + /** + * reset is the collCcFiless collection loaded partially + * + * @return void + */ + public function resetPartialCcFiless($v = true) + { + $this->collCcFilessPartial = $v; + } + + /** + * Initializes the collCcFiless collection. + * + * By default this just sets the collCcFiless collection to an empty array (like clearcollCcFiless()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcFiless($overrideExisting = true) + { + if (null !== $this->collCcFiless && !$overrideExisting) { + return; + } + $this->collCcFiless = new PropelObjectCollection(); + $this->collCcFiless->setModel('CcFiles'); + } + + /** + * Gets an array of CcFiles objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcMusicDirs is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcFiles[] List of CcFiles objects + * @throws PropelException + */ + public function getCcFiless($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcFilessPartial && !$this->isNew(); + if (null === $this->collCcFiless || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcFiless) { + // return empty collection + $this->initCcFiless(); + } else { + $collCcFiless = CcFilesQuery::create(null, $criteria) + ->filterByCcMusicDirs($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcFilessPartial && count($collCcFiless)) { + $this->initCcFiless(false); + + foreach ($collCcFiless as $obj) { + if (false == $this->collCcFiless->contains($obj)) { + $this->collCcFiless->append($obj); + } + } + + $this->collCcFilessPartial = true; + } + + $collCcFiless->getInternalIterator()->rewind(); + + return $collCcFiless; + } + + if ($partial && $this->collCcFiless) { + foreach ($this->collCcFiless as $obj) { + if ($obj->isNew()) { + $collCcFiless[] = $obj; + } + } + } + + $this->collCcFiless = $collCcFiless; + $this->collCcFilessPartial = false; + } + } + + return $this->collCcFiless; + } + + /** + * Sets a collection of CcFiles objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccFiless A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcMusicDirs The current object (for fluent API support) + */ + public function setCcFiless(PropelCollection $ccFiless, PropelPDO $con = null) + { + $ccFilessToDelete = $this->getCcFiless(new Criteria(), $con)->diff($ccFiless); + + + $this->ccFilessScheduledForDeletion = $ccFilessToDelete; + + foreach ($ccFilessToDelete as $ccFilesRemoved) { + $ccFilesRemoved->setCcMusicDirs(null); + } + + $this->collCcFiless = null; + foreach ($ccFiless as $ccFiles) { + $this->addCcFiles($ccFiles); + } + + $this->collCcFiless = $ccFiless; + $this->collCcFilessPartial = false; + + return $this; + } + + /** + * Returns the number of related CcFiles objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcFiles objects. + * @throws PropelException + */ + public function countCcFiless(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcFilessPartial && !$this->isNew(); + if (null === $this->collCcFiless || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcFiless) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcFiless()); + } + $query = CcFilesQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcMusicDirs($this) + ->count($con); + } + + return count($this->collCcFiless); + } + + /** + * Method called to associate a CcFiles object to this object + * through the CcFiles foreign key attribute. + * + * @param CcFiles $l CcFiles + * @return CcMusicDirs The current object (for fluent API support) + */ + public function addCcFiles(CcFiles $l) + { + if ($this->collCcFiless === null) { + $this->initCcFiless(); + $this->collCcFilessPartial = true; + } + + if (!in_array($l, $this->collCcFiless->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcFiles($l); + + if ($this->ccFilessScheduledForDeletion and $this->ccFilessScheduledForDeletion->contains($l)) { + $this->ccFilessScheduledForDeletion->remove($this->ccFilessScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcFiles $ccFiles The ccFiles object to add. + */ + protected function doAddCcFiles($ccFiles) + { + $this->collCcFiless[]= $ccFiles; + $ccFiles->setCcMusicDirs($this); + } + + /** + * @param CcFiles $ccFiles The ccFiles object to remove. + * @return CcMusicDirs The current object (for fluent API support) + */ + public function removeCcFiles($ccFiles) + { + if ($this->getCcFiless()->contains($ccFiles)) { + $this->collCcFiless->remove($this->collCcFiless->search($ccFiles)); + if (null === $this->ccFilessScheduledForDeletion) { + $this->ccFilessScheduledForDeletion = clone $this->collCcFiless; + $this->ccFilessScheduledForDeletion->clear(); + } + $this->ccFilessScheduledForDeletion[]= $ccFiles; + $ccFiles->setCcMusicDirs(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcMusicDirs is new, it will return + * an empty collection; or if this CcMusicDirs has previously + * been saved, it will retrieve related CcFiless from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcMusicDirs. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcFiles[] List of CcFiles objects + */ + public function getCcFilessJoinFkOwner($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcFilesQuery::create(null, $criteria); + $query->joinWith('FkOwner', $join_behavior); + + return $this->getCcFiless($query, $con); + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcMusicDirs is new, it will return + * an empty collection; or if this CcMusicDirs has previously + * been saved, it will retrieve related CcFiless from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcMusicDirs. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcFiles[] List of CcFiles objects + */ + public function getCcFilessJoinCcSubjsRelatedByDbEditedby($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcFilesQuery::create(null, $criteria); + $query->joinWith('CcSubjsRelatedByDbEditedby', $join_behavior); + + return $this->getCcFiless($query, $con); + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->directory = null; + $this->type = null; + $this->exists = null; + $this->watched = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCcFiless) { + foreach ($this->collCcFiless as $o) { + $o->clearAllReferences($deep); + } + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + if ($this->collCcFiless instanceof PropelCollection) { + $this->collCcFiless->clearIterator(); + } + $this->collCcFiless = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcMusicDirsPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcMusicDirsPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcMusicDirsPeer.php index 22f30f9602..8e4ca38b13 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcMusicDirsPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcMusicDirsPeer.php @@ -4,747 +4,769 @@ /** * Base static class for performing query and update operations on the 'cc_music_dirs' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcMusicDirsPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_music_dirs'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcMusicDirs'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcMusicDirs'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcMusicDirsTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 5; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_music_dirs.ID'; - - /** the column name for the DIRECTORY field */ - const DIRECTORY = 'cc_music_dirs.DIRECTORY'; - - /** the column name for the TYPE field */ - const TYPE = 'cc_music_dirs.TYPE'; - - /** the column name for the EXISTS field */ - const EXISTS = 'cc_music_dirs.EXISTS'; - - /** the column name for the WATCHED field */ - const WATCHED = 'cc_music_dirs.WATCHED'; - - /** - * An identiy map to hold any loaded instances of CcMusicDirs objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcMusicDirs[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('Id', 'Directory', 'Type', 'Exists', 'Watched', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('id', 'directory', 'type', 'exists', 'watched', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::DIRECTORY, self::TYPE, self::EXISTS, self::WATCHED, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'DIRECTORY', 'TYPE', 'EXISTS', 'WATCHED', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'directory', 'type', 'exists', 'watched', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('Id' => 0, 'Directory' => 1, 'Type' => 2, 'Exists' => 3, 'Watched' => 4, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('id' => 0, 'directory' => 1, 'type' => 2, 'exists' => 3, 'watched' => 4, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::DIRECTORY => 1, self::TYPE => 2, self::EXISTS => 3, self::WATCHED => 4, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'DIRECTORY' => 1, 'TYPE' => 2, 'EXISTS' => 3, 'WATCHED' => 4, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'directory' => 1, 'type' => 2, 'exists' => 3, 'watched' => 4, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcMusicDirsPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcMusicDirsPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcMusicDirsPeer::ID); - $criteria->addSelectColumn(CcMusicDirsPeer::DIRECTORY); - $criteria->addSelectColumn(CcMusicDirsPeer::TYPE); - $criteria->addSelectColumn(CcMusicDirsPeer::EXISTS); - $criteria->addSelectColumn(CcMusicDirsPeer::WATCHED); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.DIRECTORY'); - $criteria->addSelectColumn($alias . '.TYPE'); - $criteria->addSelectColumn($alias . '.EXISTS'); - $criteria->addSelectColumn($alias . '.WATCHED'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcMusicDirsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcMusicDirsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcMusicDirs - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcMusicDirsPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcMusicDirsPeer::populateObjects(CcMusicDirsPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcMusicDirsPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcMusicDirs $value A CcMusicDirs object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcMusicDirs $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcMusicDirs object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcMusicDirs) { - $key = (string) $value->getId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcMusicDirs object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcMusicDirs Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_music_dirs - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcMusicDirsPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcMusicDirsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcMusicDirsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcMusicDirsPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcMusicDirs object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcMusicDirsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcMusicDirsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcMusicDirsPeer::NUM_COLUMNS; - } else { - $cls = CcMusicDirsPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcMusicDirsPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcMusicDirsPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcMusicDirsPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcMusicDirsTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcMusicDirsPeer::CLASS_DEFAULT : CcMusicDirsPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcMusicDirs or Criteria object. - * - * @param mixed $values Criteria or CcMusicDirs object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcMusicDirs object - } - - if ($criteria->containsKey(CcMusicDirsPeer::ID) && $criteria->keyContainsValue(CcMusicDirsPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcMusicDirsPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcMusicDirs or Criteria object. - * - * @param mixed $values Criteria or CcMusicDirs object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcMusicDirsPeer::ID); - $value = $criteria->remove(CcMusicDirsPeer::ID); - if ($value) { - $selectCriteria->add(CcMusicDirsPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcMusicDirsPeer::TABLE_NAME); - } - - } else { // $values is CcMusicDirs object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_music_dirs table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcMusicDirsPeer::TABLE_NAME, $con, CcMusicDirsPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcMusicDirsPeer::clearInstancePool(); - CcMusicDirsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcMusicDirs or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcMusicDirs object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcMusicDirsPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcMusicDirs) { // it's a model object - // invalidate the cache for this single object - CcMusicDirsPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcMusicDirsPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcMusicDirsPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcMusicDirsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcMusicDirs object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcMusicDirs $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcMusicDirs $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcMusicDirsPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcMusicDirsPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcMusicDirsPeer::DATABASE_NAME, CcMusicDirsPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcMusicDirs - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcMusicDirsPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcMusicDirsPeer::DATABASE_NAME); - $criteria->add(CcMusicDirsPeer::ID, $pk); - - $v = CcMusicDirsPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcMusicDirsPeer::DATABASE_NAME); - $criteria->add(CcMusicDirsPeer::ID, $pks, Criteria::IN); - $objs = CcMusicDirsPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcMusicDirsPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_music_dirs'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcMusicDirs'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcMusicDirsTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 5; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 5; + + /** the column name for the id field */ + const ID = 'cc_music_dirs.id'; + + /** the column name for the directory field */ + const DIRECTORY = 'cc_music_dirs.directory'; + + /** the column name for the type field */ + const TYPE = 'cc_music_dirs.type'; + + /** the column name for the exists field */ + const EXISTS = 'cc_music_dirs.exists'; + + /** the column name for the watched field */ + const WATCHED = 'cc_music_dirs.watched'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcMusicDirs objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcMusicDirs[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcMusicDirsPeer::$fieldNames[CcMusicDirsPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('Id', 'Directory', 'Type', 'Exists', 'Watched', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('id', 'directory', 'type', 'exists', 'watched', ), + BasePeer::TYPE_COLNAME => array (CcMusicDirsPeer::ID, CcMusicDirsPeer::DIRECTORY, CcMusicDirsPeer::TYPE, CcMusicDirsPeer::EXISTS, CcMusicDirsPeer::WATCHED, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'DIRECTORY', 'TYPE', 'EXISTS', 'WATCHED', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'directory', 'type', 'exists', 'watched', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcMusicDirsPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('Id' => 0, 'Directory' => 1, 'Type' => 2, 'Exists' => 3, 'Watched' => 4, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('id' => 0, 'directory' => 1, 'type' => 2, 'exists' => 3, 'watched' => 4, ), + BasePeer::TYPE_COLNAME => array (CcMusicDirsPeer::ID => 0, CcMusicDirsPeer::DIRECTORY => 1, CcMusicDirsPeer::TYPE => 2, CcMusicDirsPeer::EXISTS => 3, CcMusicDirsPeer::WATCHED => 4, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'DIRECTORY' => 1, 'TYPE' => 2, 'EXISTS' => 3, 'WATCHED' => 4, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'directory' => 1, 'type' => 2, 'exists' => 3, 'watched' => 4, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcMusicDirsPeer::getFieldNames($toType); + $key = isset(CcMusicDirsPeer::$fieldKeys[$fromType][$name]) ? CcMusicDirsPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcMusicDirsPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcMusicDirsPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcMusicDirsPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcMusicDirsPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcMusicDirsPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcMusicDirsPeer::ID); + $criteria->addSelectColumn(CcMusicDirsPeer::DIRECTORY); + $criteria->addSelectColumn(CcMusicDirsPeer::TYPE); + $criteria->addSelectColumn(CcMusicDirsPeer::EXISTS); + $criteria->addSelectColumn(CcMusicDirsPeer::WATCHED); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.directory'); + $criteria->addSelectColumn($alias . '.type'); + $criteria->addSelectColumn($alias . '.exists'); + $criteria->addSelectColumn($alias . '.watched'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcMusicDirsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcMusicDirsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcMusicDirsPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcMusicDirs + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcMusicDirsPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcMusicDirsPeer::populateObjects(CcMusicDirsPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcMusicDirsPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcMusicDirsPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcMusicDirs $obj A CcMusicDirs object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getId(); + } // if key === null + CcMusicDirsPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcMusicDirs object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcMusicDirs) { + $key = (string) $value->getId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcMusicDirs object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcMusicDirsPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcMusicDirs Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcMusicDirsPeer::$instances[$key])) { + return CcMusicDirsPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcMusicDirsPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcMusicDirsPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_music_dirs + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcMusicDirsPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcMusicDirsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcMusicDirsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcMusicDirsPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcMusicDirs object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcMusicDirsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcMusicDirsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcMusicDirsPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcMusicDirsPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcMusicDirsPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcMusicDirsPeer::DATABASE_NAME)->getTable(CcMusicDirsPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcMusicDirsPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcMusicDirsPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcMusicDirsTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcMusicDirsPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcMusicDirs or Criteria object. + * + * @param mixed $values Criteria or CcMusicDirs object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcMusicDirs object + } + + if ($criteria->containsKey(CcMusicDirsPeer::ID) && $criteria->keyContainsValue(CcMusicDirsPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcMusicDirsPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcMusicDirsPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcMusicDirs or Criteria object. + * + * @param mixed $values Criteria or CcMusicDirs object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcMusicDirsPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcMusicDirsPeer::ID); + $value = $criteria->remove(CcMusicDirsPeer::ID); + if ($value) { + $selectCriteria->add(CcMusicDirsPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcMusicDirsPeer::TABLE_NAME); + } + + } else { // $values is CcMusicDirs object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcMusicDirsPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_music_dirs table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcMusicDirsPeer::TABLE_NAME, $con, CcMusicDirsPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcMusicDirsPeer::clearInstancePool(); + CcMusicDirsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcMusicDirs or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcMusicDirs object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcMusicDirsPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcMusicDirs) { // it's a model object + // invalidate the cache for this single object + CcMusicDirsPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcMusicDirsPeer::DATABASE_NAME); + $criteria->add(CcMusicDirsPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcMusicDirsPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcMusicDirsPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcMusicDirsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcMusicDirs object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcMusicDirs $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcMusicDirsPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcMusicDirsPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcMusicDirsPeer::DATABASE_NAME, CcMusicDirsPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcMusicDirs + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcMusicDirsPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcMusicDirsPeer::DATABASE_NAME); + $criteria->add(CcMusicDirsPeer::ID, $pk); + + $v = CcMusicDirsPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcMusicDirs[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcMusicDirsPeer::DATABASE_NAME); + $criteria->add(CcMusicDirsPeer::ID, $pks, Criteria::IN); + $objs = CcMusicDirsPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcMusicDirsPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcMusicDirsQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcMusicDirsQuery.php index 31bbec3d41..016ba51e0b 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcMusicDirsQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcMusicDirsQuery.php @@ -4,324 +4,479 @@ /** * Base class that represents a query for the 'cc_music_dirs' table. * - * * - * @method CcMusicDirsQuery orderById($order = Criteria::ASC) Order by the id column - * @method CcMusicDirsQuery orderByDirectory($order = Criteria::ASC) Order by the directory column - * @method CcMusicDirsQuery orderByType($order = Criteria::ASC) Order by the type column - * @method CcMusicDirsQuery orderByExists($order = Criteria::ASC) Order by the exists column - * @method CcMusicDirsQuery orderByWatched($order = Criteria::ASC) Order by the watched column * - * @method CcMusicDirsQuery groupById() Group by the id column - * @method CcMusicDirsQuery groupByDirectory() Group by the directory column - * @method CcMusicDirsQuery groupByType() Group by the type column - * @method CcMusicDirsQuery groupByExists() Group by the exists column - * @method CcMusicDirsQuery groupByWatched() Group by the watched column + * @method CcMusicDirsQuery orderById($order = Criteria::ASC) Order by the id column + * @method CcMusicDirsQuery orderByDirectory($order = Criteria::ASC) Order by the directory column + * @method CcMusicDirsQuery orderByType($order = Criteria::ASC) Order by the type column + * @method CcMusicDirsQuery orderByExists($order = Criteria::ASC) Order by the exists column + * @method CcMusicDirsQuery orderByWatched($order = Criteria::ASC) Order by the watched column * - * @method CcMusicDirsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcMusicDirsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcMusicDirsQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcMusicDirsQuery groupById() Group by the id column + * @method CcMusicDirsQuery groupByDirectory() Group by the directory column + * @method CcMusicDirsQuery groupByType() Group by the type column + * @method CcMusicDirsQuery groupByExists() Group by the exists column + * @method CcMusicDirsQuery groupByWatched() Group by the watched column * - * @method CcMusicDirsQuery leftJoinCcFiles($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcFiles relation - * @method CcMusicDirsQuery rightJoinCcFiles($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcFiles relation - * @method CcMusicDirsQuery innerJoinCcFiles($relationAlias = '') Adds a INNER JOIN clause to the query using the CcFiles relation + * @method CcMusicDirsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcMusicDirsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcMusicDirsQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcMusicDirs findOne(PropelPDO $con = null) Return the first CcMusicDirs matching the query - * @method CcMusicDirs findOneOrCreate(PropelPDO $con = null) Return the first CcMusicDirs matching the query, or a new CcMusicDirs object populated from the query conditions when no match is found + * @method CcMusicDirsQuery leftJoinCcFiles($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcFiles relation + * @method CcMusicDirsQuery rightJoinCcFiles($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcFiles relation + * @method CcMusicDirsQuery innerJoinCcFiles($relationAlias = null) Adds a INNER JOIN clause to the query using the CcFiles relation * - * @method CcMusicDirs findOneById(int $id) Return the first CcMusicDirs filtered by the id column - * @method CcMusicDirs findOneByDirectory(string $directory) Return the first CcMusicDirs filtered by the directory column - * @method CcMusicDirs findOneByType(string $type) Return the first CcMusicDirs filtered by the type column - * @method CcMusicDirs findOneByExists(boolean $exists) Return the first CcMusicDirs filtered by the exists column - * @method CcMusicDirs findOneByWatched(boolean $watched) Return the first CcMusicDirs filtered by the watched column + * @method CcMusicDirs findOne(PropelPDO $con = null) Return the first CcMusicDirs matching the query + * @method CcMusicDirs findOneOrCreate(PropelPDO $con = null) Return the first CcMusicDirs matching the query, or a new CcMusicDirs object populated from the query conditions when no match is found * - * @method array findById(int $id) Return CcMusicDirs objects filtered by the id column - * @method array findByDirectory(string $directory) Return CcMusicDirs objects filtered by the directory column - * @method array findByType(string $type) Return CcMusicDirs objects filtered by the type column - * @method array findByExists(boolean $exists) Return CcMusicDirs objects filtered by the exists column - * @method array findByWatched(boolean $watched) Return CcMusicDirs objects filtered by the watched column + * @method CcMusicDirs findOneByDirectory(string $directory) Return the first CcMusicDirs filtered by the directory column + * @method CcMusicDirs findOneByType(string $type) Return the first CcMusicDirs filtered by the type column + * @method CcMusicDirs findOneByExists(boolean $exists) Return the first CcMusicDirs filtered by the exists column + * @method CcMusicDirs findOneByWatched(boolean $watched) Return the first CcMusicDirs filtered by the watched column + * + * @method array findById(int $id) Return CcMusicDirs objects filtered by the id column + * @method array findByDirectory(string $directory) Return CcMusicDirs objects filtered by the directory column + * @method array findByType(string $type) Return CcMusicDirs objects filtered by the type column + * @method array findByExists(boolean $exists) Return CcMusicDirs objects filtered by the exists column + * @method array findByWatched(boolean $watched) Return CcMusicDirs objects filtered by the watched column * * @package propel.generator.airtime.om */ abstract class BaseCcMusicDirsQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcMusicDirsQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcMusicDirs'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcMusicDirsQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcMusicDirsQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcMusicDirsQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcMusicDirsQuery) { + return $criteria; + } + $query = new CcMusicDirsQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcMusicDirs|CcMusicDirs[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcMusicDirsPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcMusicDirsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcMusicDirs A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneById($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcMusicDirs A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "directory", "type", "exists", "watched" FROM "cc_music_dirs" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcMusicDirs(); + $obj->hydrate($row); + CcMusicDirsPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcMusicDirs|CcMusicDirs[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcMusicDirs[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcMusicDirsQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcMusicDirsPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcMusicDirsQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcMusicDirsPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id >= 12 + * $query->filterById(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcMusicDirsQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(CcMusicDirsPeer::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(CcMusicDirsPeer::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcMusicDirsPeer::ID, $id, $comparison); + } + + /** + * Filter the query on the directory column + * + * Example usage: + * + * $query->filterByDirectory('fooValue'); // WHERE directory = 'fooValue' + * $query->filterByDirectory('%fooValue%'); // WHERE directory LIKE '%fooValue%' + * + * + * @param string $directory The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcMusicDirsQuery The current query, for fluid interface + */ + public function filterByDirectory($directory = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($directory)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $directory)) { + $directory = str_replace('*', '%', $directory); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcMusicDirsPeer::DIRECTORY, $directory, $comparison); + } + + /** + * Filter the query on the type column + * + * Example usage: + * + * $query->filterByType('fooValue'); // WHERE type = 'fooValue' + * $query->filterByType('%fooValue%'); // WHERE type LIKE '%fooValue%' + * + * + * @param string $type The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcMusicDirsQuery The current query, for fluid interface + */ + public function filterByType($type = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($type)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $type)) { + $type = str_replace('*', '%', $type); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcMusicDirsPeer::TYPE, $type, $comparison); + } + + /** + * Filter the query on the exists column + * + * Example usage: + * + * $query->filterByExists(true); // WHERE exists = true + * $query->filterByExists('yes'); // WHERE exists = true + * + * + * @param boolean|string $exists The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcMusicDirsQuery The current query, for fluid interface + */ + public function filterByExists($exists = null, $comparison = null) + { + if (is_string($exists)) { + $exists = in_array(strtolower($exists), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcMusicDirsPeer::EXISTS, $exists, $comparison); + } + + /** + * Filter the query on the watched column + * + * Example usage: + * + * $query->filterByWatched(true); // WHERE watched = true + * $query->filterByWatched('yes'); // WHERE watched = true + * + * + * @param boolean|string $watched The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcMusicDirsQuery The current query, for fluid interface + */ + public function filterByWatched($watched = null, $comparison = null) + { + if (is_string($watched)) { + $watched = in_array(strtolower($watched), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcMusicDirsPeer::WATCHED, $watched, $comparison); + } + + /** + * Filter the query by a related CcFiles object + * + * @param CcFiles|PropelObjectCollection $ccFiles the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcMusicDirsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcFiles($ccFiles, $comparison = null) + { + if ($ccFiles instanceof CcFiles) { + return $this + ->addUsingAlias(CcMusicDirsPeer::ID, $ccFiles->getDbDirectory(), $comparison); + } elseif ($ccFiles instanceof PropelObjectCollection) { + return $this + ->useCcFilesQuery() + ->filterByPrimaryKeys($ccFiles->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcFiles() only accepts arguments of type CcFiles or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcFiles relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcMusicDirsQuery The current query, for fluid interface + */ + public function joinCcFiles($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcFiles'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcFiles'); + } + + return $this; + } + + /** + * Use the CcFiles relation CcFiles object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery A secondary query class using the current class as primary query + */ + public function useCcFilesQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcFiles($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery'); + } + + /** + * Exclude object from result + * + * @param CcMusicDirs $ccMusicDirs Object to remove from the list of results + * + * @return CcMusicDirsQuery The current query, for fluid interface + */ + public function prune($ccMusicDirs = null) + { + if ($ccMusicDirs) { + $this->addUsingAlias(CcMusicDirsPeer::ID, $ccMusicDirs->getId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcMusicDirsQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcMusicDirs', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcMusicDirsQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcMusicDirsQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcMusicDirsQuery) { - return $criteria; - } - $query = new CcMusicDirsQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcMusicDirs|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcMusicDirsPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcMusicDirsQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcMusicDirsPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcMusicDirsQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcMusicDirsPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $id The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcMusicDirsQuery The current query, for fluid interface - */ - public function filterById($id = null, $comparison = null) - { - if (is_array($id) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcMusicDirsPeer::ID, $id, $comparison); - } - - /** - * Filter the query on the directory column - * - * @param string $directory The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcMusicDirsQuery The current query, for fluid interface - */ - public function filterByDirectory($directory = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($directory)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $directory)) { - $directory = str_replace('*', '%', $directory); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcMusicDirsPeer::DIRECTORY, $directory, $comparison); - } - - /** - * Filter the query on the type column - * - * @param string $type The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcMusicDirsQuery The current query, for fluid interface - */ - public function filterByType($type = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($type)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $type)) { - $type = str_replace('*', '%', $type); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcMusicDirsPeer::TYPE, $type, $comparison); - } - - /** - * Filter the query on the exists column - * - * @param boolean|string $exists The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcMusicDirsQuery The current query, for fluid interface - */ - public function filterByExists($exists = null, $comparison = null) - { - if (is_string($exists)) { - $exists = in_array(strtolower($exists), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcMusicDirsPeer::EXISTS, $exists, $comparison); - } - - /** - * Filter the query on the watched column - * - * @param boolean|string $watched The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcMusicDirsQuery The current query, for fluid interface - */ - public function filterByWatched($watched = null, $comparison = null) - { - if (is_string($watched)) { - $watched = in_array(strtolower($watched), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcMusicDirsPeer::WATCHED, $watched, $comparison); - } - - /** - * Filter the query by a related CcFiles object - * - * @param CcFiles $ccFiles the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcMusicDirsQuery The current query, for fluid interface - */ - public function filterByCcFiles($ccFiles, $comparison = null) - { - return $this - ->addUsingAlias(CcMusicDirsPeer::ID, $ccFiles->getDbDirectory(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcFiles relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcMusicDirsQuery The current query, for fluid interface - */ - public function joinCcFiles($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcFiles'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcFiles'); - } - - return $this; - } - - /** - * Use the CcFiles relation CcFiles object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery A secondary query class using the current class as primary query - */ - public function useCcFilesQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcFiles($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery'); - } - - /** - * Exclude object from result - * - * @param CcMusicDirs $ccMusicDirs Object to remove from the list of results - * - * @return CcMusicDirsQuery The current query, for fluid interface - */ - public function prune($ccMusicDirs = null) - { - if ($ccMusicDirs) { - $this->addUsingAlias(CcMusicDirsPeer::ID, $ccMusicDirs->getId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcMusicDirsQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPerms.php b/airtime_mvc/application/models/airtime/om/BaseCcPerms.php index a86413fc1a..edb76be710 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPerms.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPerms.php @@ -4,942 +4,1090 @@ /** * Base class that represents a row from the 'cc_perms' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcPerms extends BaseObject implements Persistent +abstract class BaseCcPerms extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcPermsPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcPermsPeer - */ - protected static $peer; - - /** - * The value for the permid field. - * @var int - */ - protected $permid; - - /** - * The value for the subj field. - * @var int - */ - protected $subj; - - /** - * The value for the action field. - * @var string - */ - protected $action; - - /** - * The value for the obj field. - * @var int - */ - protected $obj; - - /** - * The value for the type field. - * @var string - */ - protected $type; - - /** - * @var CcSubjs - */ - protected $aCcSubjs; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [permid] column value. - * - * @return int - */ - public function getPermid() - { - return $this->permid; - } - - /** - * Get the [subj] column value. - * - * @return int - */ - public function getSubj() - { - return $this->subj; - } - - /** - * Get the [action] column value. - * - * @return string - */ - public function getAction() - { - return $this->action; - } - - /** - * Get the [obj] column value. - * - * @return int - */ - public function getObj() - { - return $this->obj; - } - - /** - * Get the [type] column value. - * - * @return string - */ - public function getType() - { - return $this->type; - } - - /** - * Set the value of [permid] column. - * - * @param int $v new value - * @return CcPerms The current object (for fluent API support) - */ - public function setPermid($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->permid !== $v) { - $this->permid = $v; - $this->modifiedColumns[] = CcPermsPeer::PERMID; - } - - return $this; - } // setPermid() - - /** - * Set the value of [subj] column. - * - * @param int $v new value - * @return CcPerms The current object (for fluent API support) - */ - public function setSubj($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->subj !== $v) { - $this->subj = $v; - $this->modifiedColumns[] = CcPermsPeer::SUBJ; - } - - if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { - $this->aCcSubjs = null; - } - - return $this; - } // setSubj() - - /** - * Set the value of [action] column. - * - * @param string $v new value - * @return CcPerms The current object (for fluent API support) - */ - public function setAction($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->action !== $v) { - $this->action = $v; - $this->modifiedColumns[] = CcPermsPeer::ACTION; - } - - return $this; - } // setAction() - - /** - * Set the value of [obj] column. - * - * @param int $v new value - * @return CcPerms The current object (for fluent API support) - */ - public function setObj($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->obj !== $v) { - $this->obj = $v; - $this->modifiedColumns[] = CcPermsPeer::OBJ; - } - - return $this; - } // setObj() - - /** - * Set the value of [type] column. - * - * @param string $v new value - * @return CcPerms The current object (for fluent API support) - */ - public function setType($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->type !== $v) { - $this->type = $v; - $this->modifiedColumns[] = CcPermsPeer::TYPE; - } - - return $this; - } // setType() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->permid = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->subj = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->action = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->obj = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; - $this->type = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 5; // 5 = CcPermsPeer::NUM_COLUMNS - CcPermsPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcPerms object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcSubjs !== null && $this->subj !== $this->aCcSubjs->getDbId()) { - $this->aCcSubjs = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcPermsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcSubjs = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcPermsQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcPermsPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSubjs !== null) { - if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { - $affectedRows += $this->aCcSubjs->save($con); - } - $this->setCcSubjs($this->aCcSubjs); - } - - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setNew(false); - } else { - $affectedRows += CcPermsPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSubjs !== null) { - if (!$this->aCcSubjs->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); - } - } - - - if (($retval = CcPermsPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPermsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getPermid(); - break; - case 1: - return $this->getSubj(); - break; - case 2: - return $this->getAction(); - break; - case 3: - return $this->getObj(); - break; - case 4: - return $this->getType(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcPermsPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getPermid(), - $keys[1] => $this->getSubj(), - $keys[2] => $this->getAction(), - $keys[3] => $this->getObj(), - $keys[4] => $this->getType(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcSubjs) { - $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPermsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setPermid($value); - break; - case 1: - $this->setSubj($value); - break; - case 2: - $this->setAction($value); - break; - case 3: - $this->setObj($value); - break; - case 4: - $this->setType($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcPermsPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setPermid($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setSubj($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setAction($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setObj($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setType($arr[$keys[4]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcPermsPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcPermsPeer::PERMID)) $criteria->add(CcPermsPeer::PERMID, $this->permid); - if ($this->isColumnModified(CcPermsPeer::SUBJ)) $criteria->add(CcPermsPeer::SUBJ, $this->subj); - if ($this->isColumnModified(CcPermsPeer::ACTION)) $criteria->add(CcPermsPeer::ACTION, $this->action); - if ($this->isColumnModified(CcPermsPeer::OBJ)) $criteria->add(CcPermsPeer::OBJ, $this->obj); - if ($this->isColumnModified(CcPermsPeer::TYPE)) $criteria->add(CcPermsPeer::TYPE, $this->type); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcPermsPeer::DATABASE_NAME); - $criteria->add(CcPermsPeer::PERMID, $this->permid); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getPermid(); - } - - /** - * Generic method to set the primary key (permid column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setPermid($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getPermid(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcPerms (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setPermid($this->permid); - $copyObj->setSubj($this->subj); - $copyObj->setAction($this->action); - $copyObj->setObj($this->obj); - $copyObj->setType($this->type); - - $copyObj->setNew(true); - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcPerms Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcPermsPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcPermsPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcSubjs object. - * - * @param CcSubjs $v - * @return CcPerms The current object (for fluent API support) - * @throws PropelException - */ - public function setCcSubjs(CcSubjs $v = null) - { - if ($v === null) { - $this->setSubj(NULL); - } else { - $this->setSubj($v->getDbId()); - } - - $this->aCcSubjs = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcSubjs object, it will not be re-added. - if ($v !== null) { - $v->addCcPerms($this); - } - - return $this; - } - - - /** - * Get the associated CcSubjs object - * - * @param PropelPDO Optional Connection object. - * @return CcSubjs The associated CcSubjs object. - * @throws PropelException - */ - public function getCcSubjs(PropelPDO $con = null) - { - if ($this->aCcSubjs === null && ($this->subj !== null)) { - $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->subj, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcSubjs->addCcPermss($this); - */ - } - return $this->aCcSubjs; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->permid = null; - $this->subj = null; - $this->action = null; - $this->obj = null; - $this->type = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcSubjs = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcPerms + /** + * Peer class name + */ + const PEER = 'CcPermsPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcPermsPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the permid field. + * @var int + */ + protected $permid; + + /** + * The value for the subj field. + * @var int + */ + protected $subj; + + /** + * The value for the action field. + * @var string + */ + protected $action; + + /** + * The value for the obj field. + * @var int + */ + protected $obj; + + /** + * The value for the type field. + * @var string + */ + protected $type; + + /** + * @var CcSubjs + */ + protected $aCcSubjs; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [permid] column value. + * + * @return int + */ + public function getPermid() + { + + return $this->permid; + } + + /** + * Get the [subj] column value. + * + * @return int + */ + public function getSubj() + { + + return $this->subj; + } + + /** + * Get the [action] column value. + * + * @return string + */ + public function getAction() + { + + return $this->action; + } + + /** + * Get the [obj] column value. + * + * @return int + */ + public function getObj() + { + + return $this->obj; + } + + /** + * Get the [type] column value. + * + * @return string + */ + public function getType() + { + + return $this->type; + } + + /** + * Set the value of [permid] column. + * + * @param int $v new value + * @return CcPerms The current object (for fluent API support) + */ + public function setPermid($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->permid !== $v) { + $this->permid = $v; + $this->modifiedColumns[] = CcPermsPeer::PERMID; + } + + + return $this; + } // setPermid() + + /** + * Set the value of [subj] column. + * + * @param int $v new value + * @return CcPerms The current object (for fluent API support) + */ + public function setSubj($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->subj !== $v) { + $this->subj = $v; + $this->modifiedColumns[] = CcPermsPeer::SUBJ; + } + + if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { + $this->aCcSubjs = null; + } + + + return $this; + } // setSubj() + + /** + * Set the value of [action] column. + * + * @param string $v new value + * @return CcPerms The current object (for fluent API support) + */ + public function setAction($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->action !== $v) { + $this->action = $v; + $this->modifiedColumns[] = CcPermsPeer::ACTION; + } + + + return $this; + } // setAction() + + /** + * Set the value of [obj] column. + * + * @param int $v new value + * @return CcPerms The current object (for fluent API support) + */ + public function setObj($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->obj !== $v) { + $this->obj = $v; + $this->modifiedColumns[] = CcPermsPeer::OBJ; + } + + + return $this; + } // setObj() + + /** + * Set the value of [type] column. + * + * @param string $v new value + * @return CcPerms The current object (for fluent API support) + */ + public function setType($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->type !== $v) { + $this->type = $v; + $this->modifiedColumns[] = CcPermsPeer::TYPE; + } + + + return $this; + } // setType() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->permid = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->subj = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->action = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->obj = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; + $this->type = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 5; // 5 = CcPermsPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcPerms object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcSubjs !== null && $this->subj !== $this->aCcSubjs->getDbId()) { + $this->aCcSubjs = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcPermsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcSubjs = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcPermsQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcPermsPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSubjs !== null) { + if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { + $affectedRows += $this->aCcSubjs->save($con); + } + $this->setCcSubjs($this->aCcSubjs); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcPermsPeer::PERMID)) { + $modifiedColumns[':p' . $index++] = '"permid"'; + } + if ($this->isColumnModified(CcPermsPeer::SUBJ)) { + $modifiedColumns[':p' . $index++] = '"subj"'; + } + if ($this->isColumnModified(CcPermsPeer::ACTION)) { + $modifiedColumns[':p' . $index++] = '"action"'; + } + if ($this->isColumnModified(CcPermsPeer::OBJ)) { + $modifiedColumns[':p' . $index++] = '"obj"'; + } + if ($this->isColumnModified(CcPermsPeer::TYPE)) { + $modifiedColumns[':p' . $index++] = '"type"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_perms" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"permid"': + $stmt->bindValue($identifier, $this->permid, PDO::PARAM_INT); + break; + case '"subj"': + $stmt->bindValue($identifier, $this->subj, PDO::PARAM_INT); + break; + case '"action"': + $stmt->bindValue($identifier, $this->action, PDO::PARAM_STR); + break; + case '"obj"': + $stmt->bindValue($identifier, $this->obj, PDO::PARAM_INT); + break; + case '"type"': + $stmt->bindValue($identifier, $this->type, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSubjs !== null) { + if (!$this->aCcSubjs->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); + } + } + + + if (($retval = CcPermsPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPermsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getPermid(); + break; + case 1: + return $this->getSubj(); + break; + case 2: + return $this->getAction(); + break; + case 3: + return $this->getObj(); + break; + case 4: + return $this->getType(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcPerms'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcPerms'][$this->getPrimaryKey()] = true; + $keys = CcPermsPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getPermid(), + $keys[1] => $this->getSubj(), + $keys[2] => $this->getAction(), + $keys[3] => $this->getObj(), + $keys[4] => $this->getType(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcSubjs) { + $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPermsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setPermid($value); + break; + case 1: + $this->setSubj($value); + break; + case 2: + $this->setAction($value); + break; + case 3: + $this->setObj($value); + break; + case 4: + $this->setType($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcPermsPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setPermid($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setSubj($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setAction($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setObj($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setType($arr[$keys[4]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcPermsPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcPermsPeer::PERMID)) $criteria->add(CcPermsPeer::PERMID, $this->permid); + if ($this->isColumnModified(CcPermsPeer::SUBJ)) $criteria->add(CcPermsPeer::SUBJ, $this->subj); + if ($this->isColumnModified(CcPermsPeer::ACTION)) $criteria->add(CcPermsPeer::ACTION, $this->action); + if ($this->isColumnModified(CcPermsPeer::OBJ)) $criteria->add(CcPermsPeer::OBJ, $this->obj); + if ($this->isColumnModified(CcPermsPeer::TYPE)) $criteria->add(CcPermsPeer::TYPE, $this->type); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcPermsPeer::DATABASE_NAME); + $criteria->add(CcPermsPeer::PERMID, $this->permid); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getPermid(); + } + + /** + * Generic method to set the primary key (permid column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setPermid($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getPermid(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcPerms (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setSubj($this->getSubj()); + $copyObj->setAction($this->getAction()); + $copyObj->setObj($this->getObj()); + $copyObj->setType($this->getType()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setPermid(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcPerms Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcPermsPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcPermsPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcSubjs object. + * + * @param CcSubjs $v + * @return CcPerms The current object (for fluent API support) + * @throws PropelException + */ + public function setCcSubjs(CcSubjs $v = null) + { + if ($v === null) { + $this->setSubj(NULL); + } else { + $this->setSubj($v->getDbId()); + } + + $this->aCcSubjs = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcSubjs object, it will not be re-added. + if ($v !== null) { + $v->addCcPerms($this); + } + + + return $this; + } + + + /** + * Get the associated CcSubjs object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcSubjs The associated CcSubjs object. + * @throws PropelException + */ + public function getCcSubjs(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcSubjs === null && ($this->subj !== null) && $doQuery) { + $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->subj, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcSubjs->addCcPermss($this); + */ + } + + return $this->aCcSubjs; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->permid = null; + $this->subj = null; + $this->action = null; + $this->obj = null; + $this->type = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcSubjs instanceof Persistent) { + $this->aCcSubjs->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcSubjs = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcPermsPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPermsPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcPermsPeer.php index 4bd4c07ea7..ce8abcd4a2 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPermsPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPermsPeer.php @@ -4,977 +4,1003 @@ /** * Base static class for performing query and update operations on the 'cc_perms' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcPermsPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_perms'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcPerms'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcPerms'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcPermsTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 5; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the PERMID field */ - const PERMID = 'cc_perms.PERMID'; - - /** the column name for the SUBJ field */ - const SUBJ = 'cc_perms.SUBJ'; - - /** the column name for the ACTION field */ - const ACTION = 'cc_perms.ACTION'; - - /** the column name for the OBJ field */ - const OBJ = 'cc_perms.OBJ'; - - /** the column name for the TYPE field */ - const TYPE = 'cc_perms.TYPE'; - - /** - * An identiy map to hold any loaded instances of CcPerms objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcPerms[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('Permid', 'Subj', 'Action', 'Obj', 'Type', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('permid', 'subj', 'action', 'obj', 'type', ), - BasePeer::TYPE_COLNAME => array (self::PERMID, self::SUBJ, self::ACTION, self::OBJ, self::TYPE, ), - BasePeer::TYPE_RAW_COLNAME => array ('PERMID', 'SUBJ', 'ACTION', 'OBJ', 'TYPE', ), - BasePeer::TYPE_FIELDNAME => array ('permid', 'subj', 'action', 'obj', 'type', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('Permid' => 0, 'Subj' => 1, 'Action' => 2, 'Obj' => 3, 'Type' => 4, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('permid' => 0, 'subj' => 1, 'action' => 2, 'obj' => 3, 'type' => 4, ), - BasePeer::TYPE_COLNAME => array (self::PERMID => 0, self::SUBJ => 1, self::ACTION => 2, self::OBJ => 3, self::TYPE => 4, ), - BasePeer::TYPE_RAW_COLNAME => array ('PERMID' => 0, 'SUBJ' => 1, 'ACTION' => 2, 'OBJ' => 3, 'TYPE' => 4, ), - BasePeer::TYPE_FIELDNAME => array ('permid' => 0, 'subj' => 1, 'action' => 2, 'obj' => 3, 'type' => 4, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcPermsPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcPermsPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcPermsPeer::PERMID); - $criteria->addSelectColumn(CcPermsPeer::SUBJ); - $criteria->addSelectColumn(CcPermsPeer::ACTION); - $criteria->addSelectColumn(CcPermsPeer::OBJ); - $criteria->addSelectColumn(CcPermsPeer::TYPE); - } else { - $criteria->addSelectColumn($alias . '.PERMID'); - $criteria->addSelectColumn($alias . '.SUBJ'); - $criteria->addSelectColumn($alias . '.ACTION'); - $criteria->addSelectColumn($alias . '.OBJ'); - $criteria->addSelectColumn($alias . '.TYPE'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPermsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPermsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcPerms - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcPermsPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcPermsPeer::populateObjects(CcPermsPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcPermsPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcPerms $value A CcPerms object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcPerms $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getPermid(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcPerms object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcPerms) { - $key = (string) $value->getPermid(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPerms object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcPerms Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_perms - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcPermsPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcPermsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcPermsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcPermsPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcPerms object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcPermsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcPermsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcPermsPeer::NUM_COLUMNS; - } else { - $cls = CcPermsPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcPermsPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcSubjs table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPermsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPermsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPermsPeer::SUBJ, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcPerms objects pre-filled with their CcSubjs objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPerms objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPermsPeer::addSelectColumns($criteria); - $startcol = (CcPermsPeer::NUM_COLUMNS - CcPermsPeer::NUM_LAZY_LOAD_COLUMNS); - CcSubjsPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcPermsPeer::SUBJ, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPermsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPermsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcPermsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPermsPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcPerms) to $obj2 (CcSubjs) - $obj2->addCcPerms($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPermsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPermsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPermsPeer::SUBJ, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcPerms objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPerms objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPermsPeer::addSelectColumns($criteria); - $startcol2 = (CcPermsPeer::NUM_COLUMNS - CcPermsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcSubjsPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcSubjsPeer::NUM_COLUMNS - CcSubjsPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcPermsPeer::SUBJ, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPermsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPermsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcPermsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPermsPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcSubjs rows - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcPerms) to the collection in $obj2 (CcSubjs) - $obj2->addCcPerms($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcPermsPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcPermsPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcPermsTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcPermsPeer::CLASS_DEFAULT : CcPermsPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcPerms or Criteria object. - * - * @param mixed $values Criteria or CcPerms object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcPerms object - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcPerms or Criteria object. - * - * @param mixed $values Criteria or CcPerms object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcPermsPeer::PERMID); - $value = $criteria->remove(CcPermsPeer::PERMID); - if ($value) { - $selectCriteria->add(CcPermsPeer::PERMID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcPermsPeer::TABLE_NAME); - } - - } else { // $values is CcPerms object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_perms table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcPermsPeer::TABLE_NAME, $con, CcPermsPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcPermsPeer::clearInstancePool(); - CcPermsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcPerms or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcPerms object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcPermsPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcPerms) { // it's a model object - // invalidate the cache for this single object - CcPermsPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcPermsPeer::PERMID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcPermsPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcPermsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcPerms object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcPerms $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcPerms $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcPermsPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcPermsPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcPermsPeer::DATABASE_NAME, CcPermsPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcPerms - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcPermsPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcPermsPeer::DATABASE_NAME); - $criteria->add(CcPermsPeer::PERMID, $pk); - - $v = CcPermsPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcPermsPeer::DATABASE_NAME); - $criteria->add(CcPermsPeer::PERMID, $pks, Criteria::IN); - $objs = CcPermsPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcPermsPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_perms'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcPerms'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcPermsTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 5; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 5; + + /** the column name for the permid field */ + const PERMID = 'cc_perms.permid'; + + /** the column name for the subj field */ + const SUBJ = 'cc_perms.subj'; + + /** the column name for the action field */ + const ACTION = 'cc_perms.action'; + + /** the column name for the obj field */ + const OBJ = 'cc_perms.obj'; + + /** the column name for the type field */ + const TYPE = 'cc_perms.type'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcPerms objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcPerms[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcPermsPeer::$fieldNames[CcPermsPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('Permid', 'Subj', 'Action', 'Obj', 'Type', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('permid', 'subj', 'action', 'obj', 'type', ), + BasePeer::TYPE_COLNAME => array (CcPermsPeer::PERMID, CcPermsPeer::SUBJ, CcPermsPeer::ACTION, CcPermsPeer::OBJ, CcPermsPeer::TYPE, ), + BasePeer::TYPE_RAW_COLNAME => array ('PERMID', 'SUBJ', 'ACTION', 'OBJ', 'TYPE', ), + BasePeer::TYPE_FIELDNAME => array ('permid', 'subj', 'action', 'obj', 'type', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcPermsPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('Permid' => 0, 'Subj' => 1, 'Action' => 2, 'Obj' => 3, 'Type' => 4, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('permid' => 0, 'subj' => 1, 'action' => 2, 'obj' => 3, 'type' => 4, ), + BasePeer::TYPE_COLNAME => array (CcPermsPeer::PERMID => 0, CcPermsPeer::SUBJ => 1, CcPermsPeer::ACTION => 2, CcPermsPeer::OBJ => 3, CcPermsPeer::TYPE => 4, ), + BasePeer::TYPE_RAW_COLNAME => array ('PERMID' => 0, 'SUBJ' => 1, 'ACTION' => 2, 'OBJ' => 3, 'TYPE' => 4, ), + BasePeer::TYPE_FIELDNAME => array ('permid' => 0, 'subj' => 1, 'action' => 2, 'obj' => 3, 'type' => 4, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcPermsPeer::getFieldNames($toType); + $key = isset(CcPermsPeer::$fieldKeys[$fromType][$name]) ? CcPermsPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcPermsPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcPermsPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcPermsPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcPermsPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcPermsPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcPermsPeer::PERMID); + $criteria->addSelectColumn(CcPermsPeer::SUBJ); + $criteria->addSelectColumn(CcPermsPeer::ACTION); + $criteria->addSelectColumn(CcPermsPeer::OBJ); + $criteria->addSelectColumn(CcPermsPeer::TYPE); + } else { + $criteria->addSelectColumn($alias . '.permid'); + $criteria->addSelectColumn($alias . '.subj'); + $criteria->addSelectColumn($alias . '.action'); + $criteria->addSelectColumn($alias . '.obj'); + $criteria->addSelectColumn($alias . '.type'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPermsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPermsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcPermsPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcPerms + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcPermsPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcPermsPeer::populateObjects(CcPermsPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcPermsPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcPermsPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcPerms $obj A CcPerms object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getPermid(); + } // if key === null + CcPermsPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcPerms object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcPerms) { + $key = (string) $value->getPermid(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPerms object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcPermsPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcPerms Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcPermsPeer::$instances[$key])) { + return CcPermsPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcPermsPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcPermsPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_perms + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcPermsPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcPermsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcPermsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcPermsPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcPerms object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcPermsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcPermsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcPermsPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcPermsPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcPermsPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcSubjs table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPermsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPermsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPermsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPermsPeer::SUBJ, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcPerms objects pre-filled with their CcSubjs objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPerms objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPermsPeer::DATABASE_NAME); + } + + CcPermsPeer::addSelectColumns($criteria); + $startcol = CcPermsPeer::NUM_HYDRATE_COLUMNS; + CcSubjsPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcPermsPeer::SUBJ, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPermsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPermsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcPermsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPermsPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcPerms) to $obj2 (CcSubjs) + $obj2->addCcPerms($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPermsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPermsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPermsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPermsPeer::SUBJ, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcPerms objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPerms objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPermsPeer::DATABASE_NAME); + } + + CcPermsPeer::addSelectColumns($criteria); + $startcol2 = CcPermsPeer::NUM_HYDRATE_COLUMNS; + + CcSubjsPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcSubjsPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcPermsPeer::SUBJ, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPermsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPermsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcPermsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPermsPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcSubjs rows + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcPerms) to the collection in $obj2 (CcSubjs) + $obj2->addCcPerms($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcPermsPeer::DATABASE_NAME)->getTable(CcPermsPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcPermsPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcPermsPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcPermsTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcPermsPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcPerms or Criteria object. + * + * @param mixed $values Criteria or CcPerms object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcPerms object + } + + + // Set the correct dbName + $criteria->setDbName(CcPermsPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcPerms or Criteria object. + * + * @param mixed $values Criteria or CcPerms object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcPermsPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcPermsPeer::PERMID); + $value = $criteria->remove(CcPermsPeer::PERMID); + if ($value) { + $selectCriteria->add(CcPermsPeer::PERMID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcPermsPeer::TABLE_NAME); + } + + } else { // $values is CcPerms object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcPermsPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_perms table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcPermsPeer::TABLE_NAME, $con, CcPermsPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcPermsPeer::clearInstancePool(); + CcPermsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcPerms or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcPerms object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcPermsPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcPerms) { // it's a model object + // invalidate the cache for this single object + CcPermsPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcPermsPeer::DATABASE_NAME); + $criteria->add(CcPermsPeer::PERMID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcPermsPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcPermsPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcPermsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcPerms object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcPerms $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcPermsPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcPermsPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcPermsPeer::DATABASE_NAME, CcPermsPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcPerms + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcPermsPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcPermsPeer::DATABASE_NAME); + $criteria->add(CcPermsPeer::PERMID, $pk); + + $v = CcPermsPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcPerms[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcPermsPeer::DATABASE_NAME); + $criteria->add(CcPermsPeer::PERMID, $pks, Criteria::IN); + $objs = CcPermsPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcPermsPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPermsQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcPermsQuery.php index 5866aa4889..f01a73a224 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPermsQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPermsQuery.php @@ -4,352 +4,513 @@ /** * Base class that represents a query for the 'cc_perms' table. * - * * - * @method CcPermsQuery orderByPermid($order = Criteria::ASC) Order by the permid column - * @method CcPermsQuery orderBySubj($order = Criteria::ASC) Order by the subj column - * @method CcPermsQuery orderByAction($order = Criteria::ASC) Order by the action column - * @method CcPermsQuery orderByObj($order = Criteria::ASC) Order by the obj column - * @method CcPermsQuery orderByType($order = Criteria::ASC) Order by the type column * - * @method CcPermsQuery groupByPermid() Group by the permid column - * @method CcPermsQuery groupBySubj() Group by the subj column - * @method CcPermsQuery groupByAction() Group by the action column - * @method CcPermsQuery groupByObj() Group by the obj column - * @method CcPermsQuery groupByType() Group by the type column + * @method CcPermsQuery orderByPermid($order = Criteria::ASC) Order by the permid column + * @method CcPermsQuery orderBySubj($order = Criteria::ASC) Order by the subj column + * @method CcPermsQuery orderByAction($order = Criteria::ASC) Order by the action column + * @method CcPermsQuery orderByObj($order = Criteria::ASC) Order by the obj column + * @method CcPermsQuery orderByType($order = Criteria::ASC) Order by the type column * - * @method CcPermsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcPermsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcPermsQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcPermsQuery groupByPermid() Group by the permid column + * @method CcPermsQuery groupBySubj() Group by the subj column + * @method CcPermsQuery groupByAction() Group by the action column + * @method CcPermsQuery groupByObj() Group by the obj column + * @method CcPermsQuery groupByType() Group by the type column * - * @method CcPermsQuery leftJoinCcSubjs($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSubjs relation - * @method CcPermsQuery rightJoinCcSubjs($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSubjs relation - * @method CcPermsQuery innerJoinCcSubjs($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSubjs relation + * @method CcPermsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcPermsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcPermsQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcPerms findOne(PropelPDO $con = null) Return the first CcPerms matching the query - * @method CcPerms findOneOrCreate(PropelPDO $con = null) Return the first CcPerms matching the query, or a new CcPerms object populated from the query conditions when no match is found + * @method CcPermsQuery leftJoinCcSubjs($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSubjs relation + * @method CcPermsQuery rightJoinCcSubjs($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSubjs relation + * @method CcPermsQuery innerJoinCcSubjs($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSubjs relation * - * @method CcPerms findOneByPermid(int $permid) Return the first CcPerms filtered by the permid column - * @method CcPerms findOneBySubj(int $subj) Return the first CcPerms filtered by the subj column - * @method CcPerms findOneByAction(string $action) Return the first CcPerms filtered by the action column - * @method CcPerms findOneByObj(int $obj) Return the first CcPerms filtered by the obj column - * @method CcPerms findOneByType(string $type) Return the first CcPerms filtered by the type column + * @method CcPerms findOne(PropelPDO $con = null) Return the first CcPerms matching the query + * @method CcPerms findOneOrCreate(PropelPDO $con = null) Return the first CcPerms matching the query, or a new CcPerms object populated from the query conditions when no match is found * - * @method array findByPermid(int $permid) Return CcPerms objects filtered by the permid column - * @method array findBySubj(int $subj) Return CcPerms objects filtered by the subj column - * @method array findByAction(string $action) Return CcPerms objects filtered by the action column - * @method array findByObj(int $obj) Return CcPerms objects filtered by the obj column - * @method array findByType(string $type) Return CcPerms objects filtered by the type column + * @method CcPerms findOneBySubj(int $subj) Return the first CcPerms filtered by the subj column + * @method CcPerms findOneByAction(string $action) Return the first CcPerms filtered by the action column + * @method CcPerms findOneByObj(int $obj) Return the first CcPerms filtered by the obj column + * @method CcPerms findOneByType(string $type) Return the first CcPerms filtered by the type column + * + * @method array findByPermid(int $permid) Return CcPerms objects filtered by the permid column + * @method array findBySubj(int $subj) Return CcPerms objects filtered by the subj column + * @method array findByAction(string $action) Return CcPerms objects filtered by the action column + * @method array findByObj(int $obj) Return CcPerms objects filtered by the obj column + * @method array findByType(string $type) Return CcPerms objects filtered by the type column * * @package propel.generator.airtime.om */ abstract class BaseCcPermsQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcPermsQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcPerms'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcPermsQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcPermsQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcPermsQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcPermsQuery) { + return $criteria; + } + $query = new CcPermsQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcPerms|CcPerms[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcPermsPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcPermsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPerms A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByPermid($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPerms A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "permid", "subj", "action", "obj", "type" FROM "cc_perms" WHERE "permid" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcPerms(); + $obj->hydrate($row); + CcPermsPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPerms|CcPerms[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcPerms[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcPermsQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcPermsPeer::PERMID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcPermsQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcPermsPeer::PERMID, $keys, Criteria::IN); + } + + /** + * Filter the query on the permid column + * + * Example usage: + * + * $query->filterByPermid(1234); // WHERE permid = 1234 + * $query->filterByPermid(array(12, 34)); // WHERE permid IN (12, 34) + * $query->filterByPermid(array('min' => 12)); // WHERE permid >= 12 + * $query->filterByPermid(array('max' => 12)); // WHERE permid <= 12 + * + * + * @param mixed $permid The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPermsQuery The current query, for fluid interface + */ + public function filterByPermid($permid = null, $comparison = null) + { + if (is_array($permid)) { + $useMinMax = false; + if (isset($permid['min'])) { + $this->addUsingAlias(CcPermsPeer::PERMID, $permid['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($permid['max'])) { + $this->addUsingAlias(CcPermsPeer::PERMID, $permid['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPermsPeer::PERMID, $permid, $comparison); + } + + /** + * Filter the query on the subj column + * + * Example usage: + * + * $query->filterBySubj(1234); // WHERE subj = 1234 + * $query->filterBySubj(array(12, 34)); // WHERE subj IN (12, 34) + * $query->filterBySubj(array('min' => 12)); // WHERE subj >= 12 + * $query->filterBySubj(array('max' => 12)); // WHERE subj <= 12 + * + * + * @see filterByCcSubjs() + * + * @param mixed $subj The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPermsQuery The current query, for fluid interface + */ + public function filterBySubj($subj = null, $comparison = null) + { + if (is_array($subj)) { + $useMinMax = false; + if (isset($subj['min'])) { + $this->addUsingAlias(CcPermsPeer::SUBJ, $subj['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($subj['max'])) { + $this->addUsingAlias(CcPermsPeer::SUBJ, $subj['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPermsPeer::SUBJ, $subj, $comparison); + } + + /** + * Filter the query on the action column + * + * Example usage: + * + * $query->filterByAction('fooValue'); // WHERE action = 'fooValue' + * $query->filterByAction('%fooValue%'); // WHERE action LIKE '%fooValue%' + * + * + * @param string $action The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPermsQuery The current query, for fluid interface + */ + public function filterByAction($action = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($action)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $action)) { + $action = str_replace('*', '%', $action); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPermsPeer::ACTION, $action, $comparison); + } + + /** + * Filter the query on the obj column + * + * Example usage: + * + * $query->filterByObj(1234); // WHERE obj = 1234 + * $query->filterByObj(array(12, 34)); // WHERE obj IN (12, 34) + * $query->filterByObj(array('min' => 12)); // WHERE obj >= 12 + * $query->filterByObj(array('max' => 12)); // WHERE obj <= 12 + * + * + * @param mixed $obj The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPermsQuery The current query, for fluid interface + */ + public function filterByObj($obj = null, $comparison = null) + { + if (is_array($obj)) { + $useMinMax = false; + if (isset($obj['min'])) { + $this->addUsingAlias(CcPermsPeer::OBJ, $obj['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($obj['max'])) { + $this->addUsingAlias(CcPermsPeer::OBJ, $obj['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPermsPeer::OBJ, $obj, $comparison); + } + + /** + * Filter the query on the type column + * + * Example usage: + * + * $query->filterByType('fooValue'); // WHERE type = 'fooValue' + * $query->filterByType('%fooValue%'); // WHERE type LIKE '%fooValue%' + * + * + * @param string $type The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPermsQuery The current query, for fluid interface + */ + public function filterByType($type = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($type)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $type)) { + $type = str_replace('*', '%', $type); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPermsPeer::TYPE, $type, $comparison); + } + + /** + * Filter the query by a related CcSubjs object + * + * @param CcSubjs|PropelObjectCollection $ccSubjs The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPermsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSubjs($ccSubjs, $comparison = null) + { + if ($ccSubjs instanceof CcSubjs) { + return $this + ->addUsingAlias(CcPermsPeer::SUBJ, $ccSubjs->getDbId(), $comparison); + } elseif ($ccSubjs instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcPermsPeer::SUBJ, $ccSubjs->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcSubjs() only accepts arguments of type CcSubjs or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSubjs relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPermsQuery The current query, for fluid interface + */ + public function joinCcSubjs($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSubjs'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSubjs'); + } + + return $this; + } + + /** + * Use the CcSubjs relation CcSubjs object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery A secondary query class using the current class as primary query + */ + public function useCcSubjsQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcSubjs($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); + } + + /** + * Exclude object from result + * + * @param CcPerms $ccPerms Object to remove from the list of results + * + * @return CcPermsQuery The current query, for fluid interface + */ + public function prune($ccPerms = null) + { + if ($ccPerms) { + $this->addUsingAlias(CcPermsPeer::PERMID, $ccPerms->getPermid(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcPermsQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcPerms', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcPermsQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcPermsQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcPermsQuery) { - return $criteria; - } - $query = new CcPermsQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcPerms|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcPermsPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcPermsQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcPermsPeer::PERMID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcPermsQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcPermsPeer::PERMID, $keys, Criteria::IN); - } - - /** - * Filter the query on the permid column - * - * @param int|array $permid The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPermsQuery The current query, for fluid interface - */ - public function filterByPermid($permid = null, $comparison = null) - { - if (is_array($permid) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcPermsPeer::PERMID, $permid, $comparison); - } - - /** - * Filter the query on the subj column - * - * @param int|array $subj The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPermsQuery The current query, for fluid interface - */ - public function filterBySubj($subj = null, $comparison = null) - { - if (is_array($subj)) { - $useMinMax = false; - if (isset($subj['min'])) { - $this->addUsingAlias(CcPermsPeer::SUBJ, $subj['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($subj['max'])) { - $this->addUsingAlias(CcPermsPeer::SUBJ, $subj['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPermsPeer::SUBJ, $subj, $comparison); - } - - /** - * Filter the query on the action column - * - * @param string $action The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPermsQuery The current query, for fluid interface - */ - public function filterByAction($action = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($action)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $action)) { - $action = str_replace('*', '%', $action); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPermsPeer::ACTION, $action, $comparison); - } - - /** - * Filter the query on the obj column - * - * @param int|array $obj The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPermsQuery The current query, for fluid interface - */ - public function filterByObj($obj = null, $comparison = null) - { - if (is_array($obj)) { - $useMinMax = false; - if (isset($obj['min'])) { - $this->addUsingAlias(CcPermsPeer::OBJ, $obj['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($obj['max'])) { - $this->addUsingAlias(CcPermsPeer::OBJ, $obj['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPermsPeer::OBJ, $obj, $comparison); - } - - /** - * Filter the query on the type column - * - * @param string $type The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPermsQuery The current query, for fluid interface - */ - public function filterByType($type = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($type)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $type)) { - $type = str_replace('*', '%', $type); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPermsPeer::TYPE, $type, $comparison); - } - - /** - * Filter the query by a related CcSubjs object - * - * @param CcSubjs $ccSubjs the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPermsQuery The current query, for fluid interface - */ - public function filterByCcSubjs($ccSubjs, $comparison = null) - { - return $this - ->addUsingAlias(CcPermsPeer::SUBJ, $ccSubjs->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSubjs relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPermsQuery The current query, for fluid interface - */ - public function joinCcSubjs($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSubjs'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSubjs'); - } - - return $this; - } - - /** - * Use the CcSubjs relation CcSubjs object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery A secondary query class using the current class as primary query - */ - public function useCcSubjsQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcSubjs($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); - } - - /** - * Exclude object from result - * - * @param CcPerms $ccPerms Object to remove from the list of results - * - * @return CcPermsQuery The current query, for fluid interface - */ - public function prune($ccPerms = null) - { - if ($ccPerms) { - $this->addUsingAlias(CcPermsPeer::PERMID, $ccPerms->getPermid(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcPermsQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlaylist.php b/airtime_mvc/application/models/airtime/om/BaseCcPlaylist.php index 73b0817089..29783a9529 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlaylist.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlaylist.php @@ -4,1413 +4,1684 @@ /** * Base class that represents a row from the 'cc_playlist' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcPlaylist extends BaseObject implements Persistent +abstract class BaseCcPlaylist extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcPlaylistPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcPlaylistPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the name field. - * Note: this column has a database default value of: '' - * @var string - */ - protected $name; - - /** - * The value for the mtime field. - * @var string - */ - protected $mtime; - - /** - * The value for the utime field. - * @var string - */ - protected $utime; - - /** - * The value for the creator_id field. - * @var int - */ - protected $creator_id; - - /** - * The value for the description field. - * @var string - */ - protected $description; - - /** - * The value for the length field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $length; - - /** - * @var CcSubjs - */ - protected $aCcSubjs; - - /** - * @var array CcPlaylistcontents[] Collection to store aggregation of CcPlaylistcontents objects. - */ - protected $collCcPlaylistcontentss; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->name = ''; - $this->length = '00:00:00'; - } - - /** - * Initializes internal state of BaseCcPlaylist object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [name] column value. - * - * @return string - */ - public function getDbName() - { - return $this->name; - } - - /** - * Get the [optionally formatted] temporal [mtime] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbMtime($format = 'Y-m-d H:i:s') - { - if ($this->mtime === null) { - return null; - } - - - - try { - $dt = new DateTime($this->mtime); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->mtime, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [utime] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbUtime($format = 'Y-m-d H:i:s') - { - if ($this->utime === null) { - return null; - } - - - - try { - $dt = new DateTime($this->utime); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->utime, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [creator_id] column value. - * - * @return int - */ - public function getDbCreatorId() - { - return $this->creator_id; - } - - /** - * Get the [description] column value. - * - * @return string - */ - public function getDbDescription() - { - return $this->description; - } - - /** - * Get the [length] column value. - * - * @return string - */ - public function getDbLength() - { - return $this->length; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcPlaylist The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcPlaylistPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [name] column. - * - * @param string $v new value - * @return CcPlaylist The current object (for fluent API support) - */ - public function setDbName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->name !== $v || $this->isNew()) { - $this->name = $v; - $this->modifiedColumns[] = CcPlaylistPeer::NAME; - } - - return $this; - } // setDbName() - - /** - * Sets the value of [mtime] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcPlaylist The current object (for fluent API support) - */ - public function setDbMtime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->mtime !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->mtime !== null && $tmpDt = new DateTime($this->mtime)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->mtime = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcPlaylistPeer::MTIME; - } - } // if either are not null - - return $this; - } // setDbMtime() - - /** - * Sets the value of [utime] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcPlaylist The current object (for fluent API support) - */ - public function setDbUtime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->utime !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->utime !== null && $tmpDt = new DateTime($this->utime)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->utime = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcPlaylistPeer::UTIME; - } - } // if either are not null - - return $this; - } // setDbUtime() - - /** - * Set the value of [creator_id] column. - * - * @param int $v new value - * @return CcPlaylist The current object (for fluent API support) - */ - public function setDbCreatorId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->creator_id !== $v) { - $this->creator_id = $v; - $this->modifiedColumns[] = CcPlaylistPeer::CREATOR_ID; - } - - if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { - $this->aCcSubjs = null; - } - - return $this; - } // setDbCreatorId() - - /** - * Set the value of [description] column. - * - * @param string $v new value - * @return CcPlaylist The current object (for fluent API support) - */ - public function setDbDescription($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->description !== $v) { - $this->description = $v; - $this->modifiedColumns[] = CcPlaylistPeer::DESCRIPTION; - } - - return $this; - } // setDbDescription() - - /** - * Set the value of [length] column. - * - * @param string $v new value - * @return CcPlaylist The current object (for fluent API support) - */ - public function setDbLength($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->length !== $v || $this->isNew()) { - $this->length = $v; - $this->modifiedColumns[] = CcPlaylistPeer::LENGTH; - } - - return $this; - } // setDbLength() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->name !== '') { - return false; - } - - if ($this->length !== '00:00:00') { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->mtime = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->utime = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->creator_id = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; - $this->description = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; - $this->length = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 7; // 7 = CcPlaylistPeer::NUM_COLUMNS - CcPlaylistPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcPlaylist object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcSubjs !== null && $this->creator_id !== $this->aCcSubjs->getDbId()) { - $this->aCcSubjs = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcPlaylistPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcSubjs = null; - $this->collCcPlaylistcontentss = null; - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcPlaylistQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcPlaylistPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSubjs !== null) { - if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { - $affectedRows += $this->aCcSubjs->save($con); - } - $this->setCcSubjs($this->aCcSubjs); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcPlaylistPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcPlaylistPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlaylistPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcPlaylistPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - if ($this->collCcPlaylistcontentss !== null) { - foreach ($this->collCcPlaylistcontentss as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSubjs !== null) { - if (!$this->aCcSubjs->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); - } - } - - - if (($retval = CcPlaylistPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - if ($this->collCcPlaylistcontentss !== null) { - foreach ($this->collCcPlaylistcontentss as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPlaylistPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbName(); - break; - case 2: - return $this->getDbMtime(); - break; - case 3: - return $this->getDbUtime(); - break; - case 4: - return $this->getDbCreatorId(); - break; - case 5: - return $this->getDbDescription(); - break; - case 6: - return $this->getDbLength(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcPlaylistPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbName(), - $keys[2] => $this->getDbMtime(), - $keys[3] => $this->getDbUtime(), - $keys[4] => $this->getDbCreatorId(), - $keys[5] => $this->getDbDescription(), - $keys[6] => $this->getDbLength(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcSubjs) { - $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPlaylistPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbName($value); - break; - case 2: - $this->setDbMtime($value); - break; - case 3: - $this->setDbUtime($value); - break; - case 4: - $this->setDbCreatorId($value); - break; - case 5: - $this->setDbDescription($value); - break; - case 6: - $this->setDbLength($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcPlaylistPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbMtime($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbUtime($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbCreatorId($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setDbDescription($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setDbLength($arr[$keys[6]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcPlaylistPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcPlaylistPeer::ID)) $criteria->add(CcPlaylistPeer::ID, $this->id); - if ($this->isColumnModified(CcPlaylistPeer::NAME)) $criteria->add(CcPlaylistPeer::NAME, $this->name); - if ($this->isColumnModified(CcPlaylistPeer::MTIME)) $criteria->add(CcPlaylistPeer::MTIME, $this->mtime); - if ($this->isColumnModified(CcPlaylistPeer::UTIME)) $criteria->add(CcPlaylistPeer::UTIME, $this->utime); - if ($this->isColumnModified(CcPlaylistPeer::CREATOR_ID)) $criteria->add(CcPlaylistPeer::CREATOR_ID, $this->creator_id); - if ($this->isColumnModified(CcPlaylistPeer::DESCRIPTION)) $criteria->add(CcPlaylistPeer::DESCRIPTION, $this->description); - if ($this->isColumnModified(CcPlaylistPeer::LENGTH)) $criteria->add(CcPlaylistPeer::LENGTH, $this->length); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcPlaylistPeer::DATABASE_NAME); - $criteria->add(CcPlaylistPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcPlaylist (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbName($this->name); - $copyObj->setDbMtime($this->mtime); - $copyObj->setDbUtime($this->utime); - $copyObj->setDbCreatorId($this->creator_id); - $copyObj->setDbDescription($this->description); - $copyObj->setDbLength($this->length); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getCcPlaylistcontentss() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcPlaylistcontents($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcPlaylist Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcPlaylistPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcPlaylistPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcSubjs object. - * - * @param CcSubjs $v - * @return CcPlaylist The current object (for fluent API support) - * @throws PropelException - */ - public function setCcSubjs(CcSubjs $v = null) - { - if ($v === null) { - $this->setDbCreatorId(NULL); - } else { - $this->setDbCreatorId($v->getDbId()); - } - - $this->aCcSubjs = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcSubjs object, it will not be re-added. - if ($v !== null) { - $v->addCcPlaylist($this); - } - - return $this; - } - - - /** - * Get the associated CcSubjs object - * - * @param PropelPDO Optional Connection object. - * @return CcSubjs The associated CcSubjs object. - * @throws PropelException - */ - public function getCcSubjs(PropelPDO $con = null) - { - if ($this->aCcSubjs === null && ($this->creator_id !== null)) { - $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->creator_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcSubjs->addCcPlaylists($this); - */ - } - return $this->aCcSubjs; - } - - /** - * Clears out the collCcPlaylistcontentss collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcPlaylistcontentss() - */ - public function clearCcPlaylistcontentss() - { - $this->collCcPlaylistcontentss = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcPlaylistcontentss collection. - * - * By default this just sets the collCcPlaylistcontentss collection to an empty array (like clearcollCcPlaylistcontentss()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcPlaylistcontentss() - { - $this->collCcPlaylistcontentss = new PropelObjectCollection(); - $this->collCcPlaylistcontentss->setModel('CcPlaylistcontents'); - } - - /** - * Gets an array of CcPlaylistcontents objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcPlaylist is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcPlaylistcontents[] List of CcPlaylistcontents objects - * @throws PropelException - */ - public function getCcPlaylistcontentss($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcPlaylistcontentss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlaylistcontentss) { - // return empty collection - $this->initCcPlaylistcontentss(); - } else { - $collCcPlaylistcontentss = CcPlaylistcontentsQuery::create(null, $criteria) - ->filterByCcPlaylist($this) - ->find($con); - if (null !== $criteria) { - return $collCcPlaylistcontentss; - } - $this->collCcPlaylistcontentss = $collCcPlaylistcontentss; - } - } - return $this->collCcPlaylistcontentss; - } - - /** - * Returns the number of related CcPlaylistcontents objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcPlaylistcontents objects. - * @throws PropelException - */ - public function countCcPlaylistcontentss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcPlaylistcontentss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlaylistcontentss) { - return 0; - } else { - $query = CcPlaylistcontentsQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcPlaylist($this) - ->count($con); - } - } else { - return count($this->collCcPlaylistcontentss); - } - } - - /** - * Method called to associate a CcPlaylistcontents object to this object - * through the CcPlaylistcontents foreign key attribute. - * - * @param CcPlaylistcontents $l CcPlaylistcontents - * @return void - * @throws PropelException - */ - public function addCcPlaylistcontents(CcPlaylistcontents $l) - { - if ($this->collCcPlaylistcontentss === null) { - $this->initCcPlaylistcontentss(); - } - if (!$this->collCcPlaylistcontentss->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcPlaylistcontentss[]= $l; - $l->setCcPlaylist($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcPlaylist is new, it will return - * an empty collection; or if this CcPlaylist has previously - * been saved, it will retrieve related CcPlaylistcontentss from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcPlaylist. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcPlaylistcontents[] List of CcPlaylistcontents objects - */ - public function getCcPlaylistcontentssJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcPlaylistcontentsQuery::create(null, $criteria); - $query->joinWith('CcFiles', $join_behavior); - - return $this->getCcPlaylistcontentss($query, $con); - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcPlaylist is new, it will return - * an empty collection; or if this CcPlaylist has previously - * been saved, it will retrieve related CcPlaylistcontentss from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcPlaylist. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcPlaylistcontents[] List of CcPlaylistcontents objects - */ - public function getCcPlaylistcontentssJoinCcBlock($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcPlaylistcontentsQuery::create(null, $criteria); - $query->joinWith('CcBlock', $join_behavior); - - return $this->getCcPlaylistcontentss($query, $con); - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->name = null; - $this->mtime = null; - $this->utime = null; - $this->creator_id = null; - $this->description = null; - $this->length = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - if ($this->collCcPlaylistcontentss) { - foreach ((array) $this->collCcPlaylistcontentss as $o) { - $o->clearAllReferences($deep); - } - } - } // if ($deep) - - $this->collCcPlaylistcontentss = null; - $this->aCcSubjs = null; - } - - // aggregate_column behavior - - /** - * Computes the value of the aggregate column length - * - * @param PropelPDO $con A connection object - * - * @return mixed The scalar result from the aggregate query - */ - public function computeDbLength(PropelPDO $con) - { - $stmt = $con->prepare('SELECT SUM(cliplength) FROM "cc_playlistcontents" WHERE cc_playlistcontents.PLAYLIST_ID = :p1'); - $stmt->bindValue(':p1', $this->getDbId()); - $stmt->execute(); - return $stmt->fetchColumn(); - } - - /** - * Updates the aggregate column length - * - * @param PropelPDO $con A connection object - */ - public function updateDbLength(PropelPDO $con) - { - $this->setDbLength($this->computeDbLength($con)); - $this->save($con); - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcPlaylist + /** + * Peer class name + */ + const PEER = 'CcPlaylistPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcPlaylistPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the name field. + * Note: this column has a database default value of: '' + * @var string + */ + protected $name; + + /** + * The value for the mtime field. + * @var string + */ + protected $mtime; + + /** + * The value for the utime field. + * @var string + */ + protected $utime; + + /** + * The value for the creator_id field. + * @var int + */ + protected $creator_id; + + /** + * The value for the description field. + * @var string + */ + protected $description; + + /** + * The value for the length field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $length; + + /** + * @var CcSubjs + */ + protected $aCcSubjs; + + /** + * @var PropelObjectCollection|CcPlaylistcontents[] Collection to store aggregation of CcPlaylistcontents objects. + */ + protected $collCcPlaylistcontentss; + protected $collCcPlaylistcontentssPartial; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccPlaylistcontentssScheduledForDeletion = null; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->name = ''; + $this->length = '00:00:00'; + } + + /** + * Initializes internal state of BaseCcPlaylist object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [name] column value. + * + * @return string + */ + public function getDbName() + { + + return $this->name; + } + + /** + * Get the [optionally formatted] temporal [mtime] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbMtime($format = 'Y-m-d H:i:s') + { + if ($this->mtime === null) { + return null; + } + + + try { + $dt = new DateTime($this->mtime); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->mtime, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [utime] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbUtime($format = 'Y-m-d H:i:s') + { + if ($this->utime === null) { + return null; + } + + + try { + $dt = new DateTime($this->utime); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->utime, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [creator_id] column value. + * + * @return int + */ + public function getDbCreatorId() + { + + return $this->creator_id; + } + + /** + * Get the [description] column value. + * + * @return string + */ + public function getDbDescription() + { + + return $this->description; + } + + /** + * Get the [length] column value. + * + * @return string + */ + public function getDbLength() + { + + return $this->length; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcPlaylist The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcPlaylistPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [name] column. + * + * @param string $v new value + * @return CcPlaylist The current object (for fluent API support) + */ + public function setDbName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->name !== $v) { + $this->name = $v; + $this->modifiedColumns[] = CcPlaylistPeer::NAME; + } + + + return $this; + } // setDbName() + + /** + * Sets the value of [mtime] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcPlaylist The current object (for fluent API support) + */ + public function setDbMtime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->mtime !== null || $dt !== null) { + $currentDateAsString = ($this->mtime !== null && $tmpDt = new DateTime($this->mtime)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->mtime = $newDateAsString; + $this->modifiedColumns[] = CcPlaylistPeer::MTIME; + } + } // if either are not null + + + return $this; + } // setDbMtime() + + /** + * Sets the value of [utime] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcPlaylist The current object (for fluent API support) + */ + public function setDbUtime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->utime !== null || $dt !== null) { + $currentDateAsString = ($this->utime !== null && $tmpDt = new DateTime($this->utime)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->utime = $newDateAsString; + $this->modifiedColumns[] = CcPlaylistPeer::UTIME; + } + } // if either are not null + + + return $this; + } // setDbUtime() + + /** + * Set the value of [creator_id] column. + * + * @param int $v new value + * @return CcPlaylist The current object (for fluent API support) + */ + public function setDbCreatorId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->creator_id !== $v) { + $this->creator_id = $v; + $this->modifiedColumns[] = CcPlaylistPeer::CREATOR_ID; + } + + if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { + $this->aCcSubjs = null; + } + + + return $this; + } // setDbCreatorId() + + /** + * Set the value of [description] column. + * + * @param string $v new value + * @return CcPlaylist The current object (for fluent API support) + */ + public function setDbDescription($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->description !== $v) { + $this->description = $v; + $this->modifiedColumns[] = CcPlaylistPeer::DESCRIPTION; + } + + + return $this; + } // setDbDescription() + + /** + * Set the value of [length] column. + * + * @param string $v new value + * @return CcPlaylist The current object (for fluent API support) + */ + public function setDbLength($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->length !== $v) { + $this->length = $v; + $this->modifiedColumns[] = CcPlaylistPeer::LENGTH; + } + + + return $this; + } // setDbLength() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->name !== '') { + return false; + } + + if ($this->length !== '00:00:00') { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->mtime = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->utime = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->creator_id = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; + $this->description = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; + $this->length = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 7; // 7 = CcPlaylistPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcPlaylist object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcSubjs !== null && $this->creator_id !== $this->aCcSubjs->getDbId()) { + $this->aCcSubjs = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcPlaylistPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcSubjs = null; + $this->collCcPlaylistcontentss = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcPlaylistQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + // aggregate_column behavior + if (null !== $this->collCcPlaylistcontentss) { + $this->setDbLength($this->computeDbLength($con)); + if ($this->isModified()) { + $this->save($con); + } + } + + CcPlaylistPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSubjs !== null) { + if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { + $affectedRows += $this->aCcSubjs->save($con); + } + $this->setCcSubjs($this->aCcSubjs); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->ccPlaylistcontentssScheduledForDeletion !== null) { + if (!$this->ccPlaylistcontentssScheduledForDeletion->isEmpty()) { + CcPlaylistcontentsQuery::create() + ->filterByPrimaryKeys($this->ccPlaylistcontentssScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccPlaylistcontentssScheduledForDeletion = null; + } + } + + if ($this->collCcPlaylistcontentss !== null) { + foreach ($this->collCcPlaylistcontentss as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcPlaylistPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcPlaylistPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_playlist_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcPlaylistPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcPlaylistPeer::NAME)) { + $modifiedColumns[':p' . $index++] = '"name"'; + } + if ($this->isColumnModified(CcPlaylistPeer::MTIME)) { + $modifiedColumns[':p' . $index++] = '"mtime"'; + } + if ($this->isColumnModified(CcPlaylistPeer::UTIME)) { + $modifiedColumns[':p' . $index++] = '"utime"'; + } + if ($this->isColumnModified(CcPlaylistPeer::CREATOR_ID)) { + $modifiedColumns[':p' . $index++] = '"creator_id"'; + } + if ($this->isColumnModified(CcPlaylistPeer::DESCRIPTION)) { + $modifiedColumns[':p' . $index++] = '"description"'; + } + if ($this->isColumnModified(CcPlaylistPeer::LENGTH)) { + $modifiedColumns[':p' . $index++] = '"length"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_playlist" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"name"': + $stmt->bindValue($identifier, $this->name, PDO::PARAM_STR); + break; + case '"mtime"': + $stmt->bindValue($identifier, $this->mtime, PDO::PARAM_STR); + break; + case '"utime"': + $stmt->bindValue($identifier, $this->utime, PDO::PARAM_STR); + break; + case '"creator_id"': + $stmt->bindValue($identifier, $this->creator_id, PDO::PARAM_INT); + break; + case '"description"': + $stmt->bindValue($identifier, $this->description, PDO::PARAM_STR); + break; + case '"length"': + $stmt->bindValue($identifier, $this->length, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSubjs !== null) { + if (!$this->aCcSubjs->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); + } + } + + + if (($retval = CcPlaylistPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + if ($this->collCcPlaylistcontentss !== null) { + foreach ($this->collCcPlaylistcontentss as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPlaylistPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbName(); + break; + case 2: + return $this->getDbMtime(); + break; + case 3: + return $this->getDbUtime(); + break; + case 4: + return $this->getDbCreatorId(); + break; + case 5: + return $this->getDbDescription(); + break; + case 6: + return $this->getDbLength(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcPlaylist'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcPlaylist'][$this->getPrimaryKey()] = true; + $keys = CcPlaylistPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbName(), + $keys[2] => $this->getDbMtime(), + $keys[3] => $this->getDbUtime(), + $keys[4] => $this->getDbCreatorId(), + $keys[5] => $this->getDbDescription(), + $keys[6] => $this->getDbLength(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcSubjs) { + $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->collCcPlaylistcontentss) { + $result['CcPlaylistcontentss'] = $this->collCcPlaylistcontentss->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPlaylistPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbName($value); + break; + case 2: + $this->setDbMtime($value); + break; + case 3: + $this->setDbUtime($value); + break; + case 4: + $this->setDbCreatorId($value); + break; + case 5: + $this->setDbDescription($value); + break; + case 6: + $this->setDbLength($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcPlaylistPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbMtime($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbUtime($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbCreatorId($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setDbDescription($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setDbLength($arr[$keys[6]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcPlaylistPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcPlaylistPeer::ID)) $criteria->add(CcPlaylistPeer::ID, $this->id); + if ($this->isColumnModified(CcPlaylistPeer::NAME)) $criteria->add(CcPlaylistPeer::NAME, $this->name); + if ($this->isColumnModified(CcPlaylistPeer::MTIME)) $criteria->add(CcPlaylistPeer::MTIME, $this->mtime); + if ($this->isColumnModified(CcPlaylistPeer::UTIME)) $criteria->add(CcPlaylistPeer::UTIME, $this->utime); + if ($this->isColumnModified(CcPlaylistPeer::CREATOR_ID)) $criteria->add(CcPlaylistPeer::CREATOR_ID, $this->creator_id); + if ($this->isColumnModified(CcPlaylistPeer::DESCRIPTION)) $criteria->add(CcPlaylistPeer::DESCRIPTION, $this->description); + if ($this->isColumnModified(CcPlaylistPeer::LENGTH)) $criteria->add(CcPlaylistPeer::LENGTH, $this->length); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcPlaylistPeer::DATABASE_NAME); + $criteria->add(CcPlaylistPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcPlaylist (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbName($this->getDbName()); + $copyObj->setDbMtime($this->getDbMtime()); + $copyObj->setDbUtime($this->getDbUtime()); + $copyObj->setDbCreatorId($this->getDbCreatorId()); + $copyObj->setDbDescription($this->getDbDescription()); + $copyObj->setDbLength($this->getDbLength()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + foreach ($this->getCcPlaylistcontentss() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcPlaylistcontents($relObj->copy($deepCopy)); + } + } + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcPlaylist Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcPlaylistPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcPlaylistPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcSubjs object. + * + * @param CcSubjs $v + * @return CcPlaylist The current object (for fluent API support) + * @throws PropelException + */ + public function setCcSubjs(CcSubjs $v = null) + { + if ($v === null) { + $this->setDbCreatorId(NULL); + } else { + $this->setDbCreatorId($v->getDbId()); + } + + $this->aCcSubjs = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcSubjs object, it will not be re-added. + if ($v !== null) { + $v->addCcPlaylist($this); + } + + + return $this; + } + + + /** + * Get the associated CcSubjs object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcSubjs The associated CcSubjs object. + * @throws PropelException + */ + public function getCcSubjs(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcSubjs === null && ($this->creator_id !== null) && $doQuery) { + $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->creator_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcSubjs->addCcPlaylists($this); + */ + } + + return $this->aCcSubjs; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CcPlaylistcontents' == $relationName) { + $this->initCcPlaylistcontentss(); + } + } + + /** + * Clears out the collCcPlaylistcontentss collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcPlaylist The current object (for fluent API support) + * @see addCcPlaylistcontentss() + */ + public function clearCcPlaylistcontentss() + { + $this->collCcPlaylistcontentss = null; // important to set this to null since that means it is uninitialized + $this->collCcPlaylistcontentssPartial = null; + + return $this; + } + + /** + * reset is the collCcPlaylistcontentss collection loaded partially + * + * @return void + */ + public function resetPartialCcPlaylistcontentss($v = true) + { + $this->collCcPlaylistcontentssPartial = $v; + } + + /** + * Initializes the collCcPlaylistcontentss collection. + * + * By default this just sets the collCcPlaylistcontentss collection to an empty array (like clearcollCcPlaylistcontentss()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcPlaylistcontentss($overrideExisting = true) + { + if (null !== $this->collCcPlaylistcontentss && !$overrideExisting) { + return; + } + $this->collCcPlaylistcontentss = new PropelObjectCollection(); + $this->collCcPlaylistcontentss->setModel('CcPlaylistcontents'); + } + + /** + * Gets an array of CcPlaylistcontents objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcPlaylist is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcPlaylistcontents[] List of CcPlaylistcontents objects + * @throws PropelException + */ + public function getCcPlaylistcontentss($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcPlaylistcontentssPartial && !$this->isNew(); + if (null === $this->collCcPlaylistcontentss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlaylistcontentss) { + // return empty collection + $this->initCcPlaylistcontentss(); + } else { + $collCcPlaylistcontentss = CcPlaylistcontentsQuery::create(null, $criteria) + ->filterByCcPlaylist($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcPlaylistcontentssPartial && count($collCcPlaylistcontentss)) { + $this->initCcPlaylistcontentss(false); + + foreach ($collCcPlaylistcontentss as $obj) { + if (false == $this->collCcPlaylistcontentss->contains($obj)) { + $this->collCcPlaylistcontentss->append($obj); + } + } + + $this->collCcPlaylistcontentssPartial = true; + } + + $collCcPlaylistcontentss->getInternalIterator()->rewind(); + + return $collCcPlaylistcontentss; + } + + if ($partial && $this->collCcPlaylistcontentss) { + foreach ($this->collCcPlaylistcontentss as $obj) { + if ($obj->isNew()) { + $collCcPlaylistcontentss[] = $obj; + } + } + } + + $this->collCcPlaylistcontentss = $collCcPlaylistcontentss; + $this->collCcPlaylistcontentssPartial = false; + } + } + + return $this->collCcPlaylistcontentss; + } + + /** + * Sets a collection of CcPlaylistcontents objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccPlaylistcontentss A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcPlaylist The current object (for fluent API support) + */ + public function setCcPlaylistcontentss(PropelCollection $ccPlaylistcontentss, PropelPDO $con = null) + { + $ccPlaylistcontentssToDelete = $this->getCcPlaylistcontentss(new Criteria(), $con)->diff($ccPlaylistcontentss); + + + $this->ccPlaylistcontentssScheduledForDeletion = $ccPlaylistcontentssToDelete; + + foreach ($ccPlaylistcontentssToDelete as $ccPlaylistcontentsRemoved) { + $ccPlaylistcontentsRemoved->setCcPlaylist(null); + } + + $this->collCcPlaylistcontentss = null; + foreach ($ccPlaylistcontentss as $ccPlaylistcontents) { + $this->addCcPlaylistcontents($ccPlaylistcontents); + } + + $this->collCcPlaylistcontentss = $ccPlaylistcontentss; + $this->collCcPlaylistcontentssPartial = false; + + return $this; + } + + /** + * Returns the number of related CcPlaylistcontents objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcPlaylistcontents objects. + * @throws PropelException + */ + public function countCcPlaylistcontentss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcPlaylistcontentssPartial && !$this->isNew(); + if (null === $this->collCcPlaylistcontentss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlaylistcontentss) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcPlaylistcontentss()); + } + $query = CcPlaylistcontentsQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcPlaylist($this) + ->count($con); + } + + return count($this->collCcPlaylistcontentss); + } + + /** + * Method called to associate a CcPlaylistcontents object to this object + * through the CcPlaylistcontents foreign key attribute. + * + * @param CcPlaylistcontents $l CcPlaylistcontents + * @return CcPlaylist The current object (for fluent API support) + */ + public function addCcPlaylistcontents(CcPlaylistcontents $l) + { + if ($this->collCcPlaylistcontentss === null) { + $this->initCcPlaylistcontentss(); + $this->collCcPlaylistcontentssPartial = true; + } + + if (!in_array($l, $this->collCcPlaylistcontentss->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcPlaylistcontents($l); + + if ($this->ccPlaylistcontentssScheduledForDeletion and $this->ccPlaylistcontentssScheduledForDeletion->contains($l)) { + $this->ccPlaylistcontentssScheduledForDeletion->remove($this->ccPlaylistcontentssScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcPlaylistcontents $ccPlaylistcontents The ccPlaylistcontents object to add. + */ + protected function doAddCcPlaylistcontents($ccPlaylistcontents) + { + $this->collCcPlaylistcontentss[]= $ccPlaylistcontents; + $ccPlaylistcontents->setCcPlaylist($this); + } + + /** + * @param CcPlaylistcontents $ccPlaylistcontents The ccPlaylistcontents object to remove. + * @return CcPlaylist The current object (for fluent API support) + */ + public function removeCcPlaylistcontents($ccPlaylistcontents) + { + if ($this->getCcPlaylistcontentss()->contains($ccPlaylistcontents)) { + $this->collCcPlaylistcontentss->remove($this->collCcPlaylistcontentss->search($ccPlaylistcontents)); + if (null === $this->ccPlaylistcontentssScheduledForDeletion) { + $this->ccPlaylistcontentssScheduledForDeletion = clone $this->collCcPlaylistcontentss; + $this->ccPlaylistcontentssScheduledForDeletion->clear(); + } + $this->ccPlaylistcontentssScheduledForDeletion[]= $ccPlaylistcontents; + $ccPlaylistcontents->setCcPlaylist(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcPlaylist is new, it will return + * an empty collection; or if this CcPlaylist has previously + * been saved, it will retrieve related CcPlaylistcontentss from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcPlaylist. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcPlaylistcontents[] List of CcPlaylistcontents objects + */ + public function getCcPlaylistcontentssJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcPlaylistcontentsQuery::create(null, $criteria); + $query->joinWith('CcFiles', $join_behavior); + + return $this->getCcPlaylistcontentss($query, $con); + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcPlaylist is new, it will return + * an empty collection; or if this CcPlaylist has previously + * been saved, it will retrieve related CcPlaylistcontentss from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcPlaylist. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcPlaylistcontents[] List of CcPlaylistcontents objects + */ + public function getCcPlaylistcontentssJoinCcBlock($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcPlaylistcontentsQuery::create(null, $criteria); + $query->joinWith('CcBlock', $join_behavior); + + return $this->getCcPlaylistcontentss($query, $con); + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->name = null; + $this->mtime = null; + $this->utime = null; + $this->creator_id = null; + $this->description = null; + $this->length = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCcPlaylistcontentss) { + foreach ($this->collCcPlaylistcontentss as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->aCcSubjs instanceof Persistent) { + $this->aCcSubjs->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + if ($this->collCcPlaylistcontentss instanceof PropelCollection) { + $this->collCcPlaylistcontentss->clearIterator(); + } + $this->collCcPlaylistcontentss = null; + $this->aCcSubjs = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcPlaylistPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + + // aggregate_column behavior + + /** + * Computes the value of the aggregate column length * + * @param PropelPDO $con A connection object + * + * @return mixed The scalar result from the aggregate query + */ + public function computeDbLength(PropelPDO $con) + { + $stmt = $con->prepare('SELECT SUM(cliplength) FROM "cc_playlistcontents" WHERE cc_playlistcontents.playlist_id = :p1'); + $stmt->bindValue(':p1', $this->getDbId()); + $stmt->execute(); + + return $stmt->fetchColumn(); + } + + /** + * Updates the aggregate column length * + * @param PropelPDO $con A connection object + */ + public function updateDbLength(PropelPDO $con) + { + $this->setDbLength($this->computeDbLength($con)); + $this->save($con); + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlaylistPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcPlaylistPeer.php index da3593e02c..11515ef0cb 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlaylistPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlaylistPeer.php @@ -4,994 +4,1020 @@ /** * Base static class for performing query and update operations on the 'cc_playlist' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcPlaylistPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_playlist'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcPlaylist'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcPlaylist'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcPlaylistTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 7; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_playlist.ID'; - - /** the column name for the NAME field */ - const NAME = 'cc_playlist.NAME'; - - /** the column name for the MTIME field */ - const MTIME = 'cc_playlist.MTIME'; - - /** the column name for the UTIME field */ - const UTIME = 'cc_playlist.UTIME'; - - /** the column name for the CREATOR_ID field */ - const CREATOR_ID = 'cc_playlist.CREATOR_ID'; - - /** the column name for the DESCRIPTION field */ - const DESCRIPTION = 'cc_playlist.DESCRIPTION'; - - /** the column name for the LENGTH field */ - const LENGTH = 'cc_playlist.LENGTH'; - - /** - * An identiy map to hold any loaded instances of CcPlaylist objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcPlaylist[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMtime', 'DbUtime', 'DbCreatorId', 'DbDescription', 'DbLength', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMtime', 'dbUtime', 'dbCreatorId', 'dbDescription', 'dbLength', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::NAME, self::MTIME, self::UTIME, self::CREATOR_ID, self::DESCRIPTION, self::LENGTH, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MTIME', 'UTIME', 'CREATOR_ID', 'DESCRIPTION', 'LENGTH', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mtime', 'utime', 'creator_id', 'description', 'length', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMtime' => 2, 'DbUtime' => 3, 'DbCreatorId' => 4, 'DbDescription' => 5, 'DbLength' => 6, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMtime' => 2, 'dbUtime' => 3, 'dbCreatorId' => 4, 'dbDescription' => 5, 'dbLength' => 6, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::NAME => 1, self::MTIME => 2, self::UTIME => 3, self::CREATOR_ID => 4, self::DESCRIPTION => 5, self::LENGTH => 6, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MTIME' => 2, 'UTIME' => 3, 'CREATOR_ID' => 4, 'DESCRIPTION' => 5, 'LENGTH' => 6, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mtime' => 2, 'utime' => 3, 'creator_id' => 4, 'description' => 5, 'length' => 6, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcPlaylistPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcPlaylistPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcPlaylistPeer::ID); - $criteria->addSelectColumn(CcPlaylistPeer::NAME); - $criteria->addSelectColumn(CcPlaylistPeer::MTIME); - $criteria->addSelectColumn(CcPlaylistPeer::UTIME); - $criteria->addSelectColumn(CcPlaylistPeer::CREATOR_ID); - $criteria->addSelectColumn(CcPlaylistPeer::DESCRIPTION); - $criteria->addSelectColumn(CcPlaylistPeer::LENGTH); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.NAME'); - $criteria->addSelectColumn($alias . '.MTIME'); - $criteria->addSelectColumn($alias . '.UTIME'); - $criteria->addSelectColumn($alias . '.CREATOR_ID'); - $criteria->addSelectColumn($alias . '.DESCRIPTION'); - $criteria->addSelectColumn($alias . '.LENGTH'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlaylistPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlaylistPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcPlaylist - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcPlaylistPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcPlaylistPeer::populateObjects(CcPlaylistPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcPlaylistPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcPlaylist $value A CcPlaylist object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcPlaylist $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcPlaylist object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcPlaylist) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPlaylist object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcPlaylist Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_playlist - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - // Invalidate objects in CcPlaylistcontentsPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcPlaylistcontentsPeer::clearInstancePool(); - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcPlaylistPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcPlaylistPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcPlaylistPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcPlaylist object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcPlaylistPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcPlaylistPeer::NUM_COLUMNS; - } else { - $cls = CcPlaylistPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcPlaylistPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcSubjs table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlaylistPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlaylistPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlaylistPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcPlaylist objects pre-filled with their CcSubjs objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlaylist objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlaylistPeer::addSelectColumns($criteria); - $startcol = (CcPlaylistPeer::NUM_COLUMNS - CcPlaylistPeer::NUM_LAZY_LOAD_COLUMNS); - CcSubjsPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcPlaylistPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlaylistPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcPlaylistPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlaylistPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcPlaylist) to $obj2 (CcSubjs) - $obj2->addCcPlaylist($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlaylistPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlaylistPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlaylistPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcPlaylist objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlaylist objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlaylistPeer::addSelectColumns($criteria); - $startcol2 = (CcPlaylistPeer::NUM_COLUMNS - CcPlaylistPeer::NUM_LAZY_LOAD_COLUMNS); - - CcSubjsPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcSubjsPeer::NUM_COLUMNS - CcSubjsPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcPlaylistPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlaylistPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcPlaylistPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlaylistPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcSubjs rows - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcPlaylist) to the collection in $obj2 (CcSubjs) - $obj2->addCcPlaylist($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcPlaylistPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcPlaylistPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcPlaylistTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcPlaylistPeer::CLASS_DEFAULT : CcPlaylistPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcPlaylist or Criteria object. - * - * @param mixed $values Criteria or CcPlaylist object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcPlaylist object - } - - if ($criteria->containsKey(CcPlaylistPeer::ID) && $criteria->keyContainsValue(CcPlaylistPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlaylistPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcPlaylist or Criteria object. - * - * @param mixed $values Criteria or CcPlaylist object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcPlaylistPeer::ID); - $value = $criteria->remove(CcPlaylistPeer::ID); - if ($value) { - $selectCriteria->add(CcPlaylistPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcPlaylistPeer::TABLE_NAME); - } - - } else { // $values is CcPlaylist object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_playlist table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcPlaylistPeer::TABLE_NAME, $con, CcPlaylistPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcPlaylistPeer::clearInstancePool(); - CcPlaylistPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcPlaylist or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcPlaylist object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcPlaylistPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcPlaylist) { // it's a model object - // invalidate the cache for this single object - CcPlaylistPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcPlaylistPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcPlaylistPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcPlaylistPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcPlaylist object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcPlaylist $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcPlaylist $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcPlaylistPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcPlaylistPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcPlaylistPeer::DATABASE_NAME, CcPlaylistPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcPlaylist - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcPlaylistPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcPlaylistPeer::DATABASE_NAME); - $criteria->add(CcPlaylistPeer::ID, $pk); - - $v = CcPlaylistPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcPlaylistPeer::DATABASE_NAME); - $criteria->add(CcPlaylistPeer::ID, $pks, Criteria::IN); - $objs = CcPlaylistPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcPlaylistPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_playlist'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcPlaylist'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcPlaylistTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 7; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 7; + + /** the column name for the id field */ + const ID = 'cc_playlist.id'; + + /** the column name for the name field */ + const NAME = 'cc_playlist.name'; + + /** the column name for the mtime field */ + const MTIME = 'cc_playlist.mtime'; + + /** the column name for the utime field */ + const UTIME = 'cc_playlist.utime'; + + /** the column name for the creator_id field */ + const CREATOR_ID = 'cc_playlist.creator_id'; + + /** the column name for the description field */ + const DESCRIPTION = 'cc_playlist.description'; + + /** the column name for the length field */ + const LENGTH = 'cc_playlist.length'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcPlaylist objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcPlaylist[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcPlaylistPeer::$fieldNames[CcPlaylistPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMtime', 'DbUtime', 'DbCreatorId', 'DbDescription', 'DbLength', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMtime', 'dbUtime', 'dbCreatorId', 'dbDescription', 'dbLength', ), + BasePeer::TYPE_COLNAME => array (CcPlaylistPeer::ID, CcPlaylistPeer::NAME, CcPlaylistPeer::MTIME, CcPlaylistPeer::UTIME, CcPlaylistPeer::CREATOR_ID, CcPlaylistPeer::DESCRIPTION, CcPlaylistPeer::LENGTH, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MTIME', 'UTIME', 'CREATOR_ID', 'DESCRIPTION', 'LENGTH', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mtime', 'utime', 'creator_id', 'description', 'length', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcPlaylistPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMtime' => 2, 'DbUtime' => 3, 'DbCreatorId' => 4, 'DbDescription' => 5, 'DbLength' => 6, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMtime' => 2, 'dbUtime' => 3, 'dbCreatorId' => 4, 'dbDescription' => 5, 'dbLength' => 6, ), + BasePeer::TYPE_COLNAME => array (CcPlaylistPeer::ID => 0, CcPlaylistPeer::NAME => 1, CcPlaylistPeer::MTIME => 2, CcPlaylistPeer::UTIME => 3, CcPlaylistPeer::CREATOR_ID => 4, CcPlaylistPeer::DESCRIPTION => 5, CcPlaylistPeer::LENGTH => 6, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MTIME' => 2, 'UTIME' => 3, 'CREATOR_ID' => 4, 'DESCRIPTION' => 5, 'LENGTH' => 6, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mtime' => 2, 'utime' => 3, 'creator_id' => 4, 'description' => 5, 'length' => 6, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcPlaylistPeer::getFieldNames($toType); + $key = isset(CcPlaylistPeer::$fieldKeys[$fromType][$name]) ? CcPlaylistPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcPlaylistPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcPlaylistPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcPlaylistPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcPlaylistPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcPlaylistPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcPlaylistPeer::ID); + $criteria->addSelectColumn(CcPlaylistPeer::NAME); + $criteria->addSelectColumn(CcPlaylistPeer::MTIME); + $criteria->addSelectColumn(CcPlaylistPeer::UTIME); + $criteria->addSelectColumn(CcPlaylistPeer::CREATOR_ID); + $criteria->addSelectColumn(CcPlaylistPeer::DESCRIPTION); + $criteria->addSelectColumn(CcPlaylistPeer::LENGTH); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.name'); + $criteria->addSelectColumn($alias . '.mtime'); + $criteria->addSelectColumn($alias . '.utime'); + $criteria->addSelectColumn($alias . '.creator_id'); + $criteria->addSelectColumn($alias . '.description'); + $criteria->addSelectColumn($alias . '.length'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlaylistPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlaylistPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcPlaylistPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcPlaylist + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcPlaylistPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcPlaylistPeer::populateObjects(CcPlaylistPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcPlaylistPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcPlaylistPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcPlaylist $obj A CcPlaylist object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcPlaylistPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcPlaylist object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcPlaylist) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPlaylist object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcPlaylistPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcPlaylist Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcPlaylistPeer::$instances[$key])) { + return CcPlaylistPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcPlaylistPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcPlaylistPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_playlist + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in CcPlaylistcontentsPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcPlaylistcontentsPeer::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcPlaylistPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcPlaylistPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcPlaylistPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcPlaylist object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcPlaylistPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcPlaylistPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcPlaylistPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcPlaylistPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcSubjs table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlaylistPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlaylistPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPlaylistPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlaylistPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcPlaylist objects pre-filled with their CcSubjs objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlaylist objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlaylistPeer::DATABASE_NAME); + } + + CcPlaylistPeer::addSelectColumns($criteria); + $startcol = CcPlaylistPeer::NUM_HYDRATE_COLUMNS; + CcSubjsPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcPlaylistPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlaylistPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcPlaylistPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlaylistPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcPlaylist) to $obj2 (CcSubjs) + $obj2->addCcPlaylist($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlaylistPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlaylistPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPlaylistPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlaylistPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcPlaylist objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlaylist objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlaylistPeer::DATABASE_NAME); + } + + CcPlaylistPeer::addSelectColumns($criteria); + $startcol2 = CcPlaylistPeer::NUM_HYDRATE_COLUMNS; + + CcSubjsPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcSubjsPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcPlaylistPeer::CREATOR_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlaylistPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcPlaylistPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlaylistPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcSubjs rows + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcPlaylist) to the collection in $obj2 (CcSubjs) + $obj2->addCcPlaylist($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcPlaylistPeer::DATABASE_NAME)->getTable(CcPlaylistPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcPlaylistPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcPlaylistPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcPlaylistTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcPlaylistPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcPlaylist or Criteria object. + * + * @param mixed $values Criteria or CcPlaylist object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcPlaylist object + } + + if ($criteria->containsKey(CcPlaylistPeer::ID) && $criteria->keyContainsValue(CcPlaylistPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlaylistPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcPlaylistPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcPlaylist or Criteria object. + * + * @param mixed $values Criteria or CcPlaylist object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcPlaylistPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcPlaylistPeer::ID); + $value = $criteria->remove(CcPlaylistPeer::ID); + if ($value) { + $selectCriteria->add(CcPlaylistPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcPlaylistPeer::TABLE_NAME); + } + + } else { // $values is CcPlaylist object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcPlaylistPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_playlist table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcPlaylistPeer::TABLE_NAME, $con, CcPlaylistPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcPlaylistPeer::clearInstancePool(); + CcPlaylistPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcPlaylist or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcPlaylist object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcPlaylistPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcPlaylist) { // it's a model object + // invalidate the cache for this single object + CcPlaylistPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcPlaylistPeer::DATABASE_NAME); + $criteria->add(CcPlaylistPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcPlaylistPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcPlaylistPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcPlaylistPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcPlaylist object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcPlaylist $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcPlaylistPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcPlaylistPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcPlaylistPeer::DATABASE_NAME, CcPlaylistPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcPlaylist + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcPlaylistPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcPlaylistPeer::DATABASE_NAME); + $criteria->add(CcPlaylistPeer::ID, $pk); + + $v = CcPlaylistPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcPlaylist[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcPlaylistPeer::DATABASE_NAME); + $criteria->add(CcPlaylistPeer::ID, $pks, Criteria::IN); + $objs = CcPlaylistPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcPlaylistPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlaylistQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcPlaylistQuery.php index 66b50e1c23..8e66d8f546 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlaylistQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlaylistQuery.php @@ -4,481 +4,672 @@ /** * Base class that represents a query for the 'cc_playlist' table. * - * * - * @method CcPlaylistQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcPlaylistQuery orderByDbName($order = Criteria::ASC) Order by the name column - * @method CcPlaylistQuery orderByDbMtime($order = Criteria::ASC) Order by the mtime column - * @method CcPlaylistQuery orderByDbUtime($order = Criteria::ASC) Order by the utime column - * @method CcPlaylistQuery orderByDbCreatorId($order = Criteria::ASC) Order by the creator_id column - * @method CcPlaylistQuery orderByDbDescription($order = Criteria::ASC) Order by the description column - * @method CcPlaylistQuery orderByDbLength($order = Criteria::ASC) Order by the length column * - * @method CcPlaylistQuery groupByDbId() Group by the id column - * @method CcPlaylistQuery groupByDbName() Group by the name column - * @method CcPlaylistQuery groupByDbMtime() Group by the mtime column - * @method CcPlaylistQuery groupByDbUtime() Group by the utime column - * @method CcPlaylistQuery groupByDbCreatorId() Group by the creator_id column - * @method CcPlaylistQuery groupByDbDescription() Group by the description column - * @method CcPlaylistQuery groupByDbLength() Group by the length column + * @method CcPlaylistQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcPlaylistQuery orderByDbName($order = Criteria::ASC) Order by the name column + * @method CcPlaylistQuery orderByDbMtime($order = Criteria::ASC) Order by the mtime column + * @method CcPlaylistQuery orderByDbUtime($order = Criteria::ASC) Order by the utime column + * @method CcPlaylistQuery orderByDbCreatorId($order = Criteria::ASC) Order by the creator_id column + * @method CcPlaylistQuery orderByDbDescription($order = Criteria::ASC) Order by the description column + * @method CcPlaylistQuery orderByDbLength($order = Criteria::ASC) Order by the length column * - * @method CcPlaylistQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcPlaylistQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcPlaylistQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcPlaylistQuery groupByDbId() Group by the id column + * @method CcPlaylistQuery groupByDbName() Group by the name column + * @method CcPlaylistQuery groupByDbMtime() Group by the mtime column + * @method CcPlaylistQuery groupByDbUtime() Group by the utime column + * @method CcPlaylistQuery groupByDbCreatorId() Group by the creator_id column + * @method CcPlaylistQuery groupByDbDescription() Group by the description column + * @method CcPlaylistQuery groupByDbLength() Group by the length column * - * @method CcPlaylistQuery leftJoinCcSubjs($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSubjs relation - * @method CcPlaylistQuery rightJoinCcSubjs($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSubjs relation - * @method CcPlaylistQuery innerJoinCcSubjs($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSubjs relation + * @method CcPlaylistQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcPlaylistQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcPlaylistQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcPlaylistQuery leftJoinCcPlaylistcontents($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcPlaylistcontents relation - * @method CcPlaylistQuery rightJoinCcPlaylistcontents($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcPlaylistcontents relation - * @method CcPlaylistQuery innerJoinCcPlaylistcontents($relationAlias = '') Adds a INNER JOIN clause to the query using the CcPlaylistcontents relation + * @method CcPlaylistQuery leftJoinCcSubjs($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSubjs relation + * @method CcPlaylistQuery rightJoinCcSubjs($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSubjs relation + * @method CcPlaylistQuery innerJoinCcSubjs($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSubjs relation * - * @method CcPlaylist findOne(PropelPDO $con = null) Return the first CcPlaylist matching the query - * @method CcPlaylist findOneOrCreate(PropelPDO $con = null) Return the first CcPlaylist matching the query, or a new CcPlaylist object populated from the query conditions when no match is found + * @method CcPlaylistQuery leftJoinCcPlaylistcontents($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPlaylistcontents relation + * @method CcPlaylistQuery rightJoinCcPlaylistcontents($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlaylistcontents relation + * @method CcPlaylistQuery innerJoinCcPlaylistcontents($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlaylistcontents relation * - * @method CcPlaylist findOneByDbId(int $id) Return the first CcPlaylist filtered by the id column - * @method CcPlaylist findOneByDbName(string $name) Return the first CcPlaylist filtered by the name column - * @method CcPlaylist findOneByDbMtime(string $mtime) Return the first CcPlaylist filtered by the mtime column - * @method CcPlaylist findOneByDbUtime(string $utime) Return the first CcPlaylist filtered by the utime column - * @method CcPlaylist findOneByDbCreatorId(int $creator_id) Return the first CcPlaylist filtered by the creator_id column - * @method CcPlaylist findOneByDbDescription(string $description) Return the first CcPlaylist filtered by the description column - * @method CcPlaylist findOneByDbLength(string $length) Return the first CcPlaylist filtered by the length column + * @method CcPlaylist findOne(PropelPDO $con = null) Return the first CcPlaylist matching the query + * @method CcPlaylist findOneOrCreate(PropelPDO $con = null) Return the first CcPlaylist matching the query, or a new CcPlaylist object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcPlaylist objects filtered by the id column - * @method array findByDbName(string $name) Return CcPlaylist objects filtered by the name column - * @method array findByDbMtime(string $mtime) Return CcPlaylist objects filtered by the mtime column - * @method array findByDbUtime(string $utime) Return CcPlaylist objects filtered by the utime column - * @method array findByDbCreatorId(int $creator_id) Return CcPlaylist objects filtered by the creator_id column - * @method array findByDbDescription(string $description) Return CcPlaylist objects filtered by the description column - * @method array findByDbLength(string $length) Return CcPlaylist objects filtered by the length column + * @method CcPlaylist findOneByDbName(string $name) Return the first CcPlaylist filtered by the name column + * @method CcPlaylist findOneByDbMtime(string $mtime) Return the first CcPlaylist filtered by the mtime column + * @method CcPlaylist findOneByDbUtime(string $utime) Return the first CcPlaylist filtered by the utime column + * @method CcPlaylist findOneByDbCreatorId(int $creator_id) Return the first CcPlaylist filtered by the creator_id column + * @method CcPlaylist findOneByDbDescription(string $description) Return the first CcPlaylist filtered by the description column + * @method CcPlaylist findOneByDbLength(string $length) Return the first CcPlaylist filtered by the length column + * + * @method array findByDbId(int $id) Return CcPlaylist objects filtered by the id column + * @method array findByDbName(string $name) Return CcPlaylist objects filtered by the name column + * @method array findByDbMtime(string $mtime) Return CcPlaylist objects filtered by the mtime column + * @method array findByDbUtime(string $utime) Return CcPlaylist objects filtered by the utime column + * @method array findByDbCreatorId(int $creator_id) Return CcPlaylist objects filtered by the creator_id column + * @method array findByDbDescription(string $description) Return CcPlaylist objects filtered by the description column + * @method array findByDbLength(string $length) Return CcPlaylist objects filtered by the length column * * @package propel.generator.airtime.om */ abstract class BaseCcPlaylistQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcPlaylistQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcPlaylist'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcPlaylistQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcPlaylistQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcPlaylistQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcPlaylistQuery) { + return $criteria; + } + $query = new CcPlaylistQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcPlaylist|CcPlaylist[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcPlaylistPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlaylist A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlaylist A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "name", "mtime", "utime", "creator_id", "description", "length" FROM "cc_playlist" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcPlaylist(); + $obj->hydrate($row); + CcPlaylistPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlaylist|CcPlaylist[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcPlaylist[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcPlaylistQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcPlaylistPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcPlaylistQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcPlaylistPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcPlaylistPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcPlaylistPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the name column + * + * Example usage: + * + * $query->filterByDbName('fooValue'); // WHERE name = 'fooValue' + * $query->filterByDbName('%fooValue%'); // WHERE name LIKE '%fooValue%' + * + * + * @param string $dbName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistQuery The current query, for fluid interface + */ + public function filterByDbName($dbName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbName)) { + $dbName = str_replace('*', '%', $dbName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPlaylistPeer::NAME, $dbName, $comparison); + } + + /** + * Filter the query on the mtime column + * + * Example usage: + * + * $query->filterByDbMtime('2011-03-14'); // WHERE mtime = '2011-03-14' + * $query->filterByDbMtime('now'); // WHERE mtime = '2011-03-14' + * $query->filterByDbMtime(array('max' => 'yesterday')); // WHERE mtime < '2011-03-13' + * + * + * @param mixed $dbMtime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistQuery The current query, for fluid interface + */ + public function filterByDbMtime($dbMtime = null, $comparison = null) + { + if (is_array($dbMtime)) { + $useMinMax = false; + if (isset($dbMtime['min'])) { + $this->addUsingAlias(CcPlaylistPeer::MTIME, $dbMtime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbMtime['max'])) { + $this->addUsingAlias(CcPlaylistPeer::MTIME, $dbMtime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistPeer::MTIME, $dbMtime, $comparison); + } + + /** + * Filter the query on the utime column + * + * Example usage: + * + * $query->filterByDbUtime('2011-03-14'); // WHERE utime = '2011-03-14' + * $query->filterByDbUtime('now'); // WHERE utime = '2011-03-14' + * $query->filterByDbUtime(array('max' => 'yesterday')); // WHERE utime < '2011-03-13' + * + * + * @param mixed $dbUtime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistQuery The current query, for fluid interface + */ + public function filterByDbUtime($dbUtime = null, $comparison = null) + { + if (is_array($dbUtime)) { + $useMinMax = false; + if (isset($dbUtime['min'])) { + $this->addUsingAlias(CcPlaylistPeer::UTIME, $dbUtime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbUtime['max'])) { + $this->addUsingAlias(CcPlaylistPeer::UTIME, $dbUtime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistPeer::UTIME, $dbUtime, $comparison); + } + + /** + * Filter the query on the creator_id column + * + * Example usage: + * + * $query->filterByDbCreatorId(1234); // WHERE creator_id = 1234 + * $query->filterByDbCreatorId(array(12, 34)); // WHERE creator_id IN (12, 34) + * $query->filterByDbCreatorId(array('min' => 12)); // WHERE creator_id >= 12 + * $query->filterByDbCreatorId(array('max' => 12)); // WHERE creator_id <= 12 + * + * + * @see filterByCcSubjs() + * + * @param mixed $dbCreatorId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistQuery The current query, for fluid interface + */ + public function filterByDbCreatorId($dbCreatorId = null, $comparison = null) + { + if (is_array($dbCreatorId)) { + $useMinMax = false; + if (isset($dbCreatorId['min'])) { + $this->addUsingAlias(CcPlaylistPeer::CREATOR_ID, $dbCreatorId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbCreatorId['max'])) { + $this->addUsingAlias(CcPlaylistPeer::CREATOR_ID, $dbCreatorId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistPeer::CREATOR_ID, $dbCreatorId, $comparison); + } + + /** + * Filter the query on the description column + * + * Example usage: + * + * $query->filterByDbDescription('fooValue'); // WHERE description = 'fooValue' + * $query->filterByDbDescription('%fooValue%'); // WHERE description LIKE '%fooValue%' + * + * + * @param string $dbDescription The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistQuery The current query, for fluid interface + */ + public function filterByDbDescription($dbDescription = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbDescription)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbDescription)) { + $dbDescription = str_replace('*', '%', $dbDescription); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPlaylistPeer::DESCRIPTION, $dbDescription, $comparison); + } + + /** + * Filter the query on the length column + * + * Example usage: + * + * $query->filterByDbLength('fooValue'); // WHERE length = 'fooValue' + * $query->filterByDbLength('%fooValue%'); // WHERE length LIKE '%fooValue%' + * + * + * @param string $dbLength The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistQuery The current query, for fluid interface + */ + public function filterByDbLength($dbLength = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLength)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLength)) { + $dbLength = str_replace('*', '%', $dbLength); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPlaylistPeer::LENGTH, $dbLength, $comparison); + } + + /** + * Filter the query by a related CcSubjs object + * + * @param CcSubjs|PropelObjectCollection $ccSubjs The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSubjs($ccSubjs, $comparison = null) + { + if ($ccSubjs instanceof CcSubjs) { + return $this + ->addUsingAlias(CcPlaylistPeer::CREATOR_ID, $ccSubjs->getDbId(), $comparison); + } elseif ($ccSubjs instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcPlaylistPeer::CREATOR_ID, $ccSubjs->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcSubjs() only accepts arguments of type CcSubjs or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSubjs relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlaylistQuery The current query, for fluid interface + */ + public function joinCcSubjs($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSubjs'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSubjs'); + } + + return $this; + } + + /** + * Use the CcSubjs relation CcSubjs object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery A secondary query class using the current class as primary query + */ + public function useCcSubjsQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcSubjs($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); + } + + /** + * Filter the query by a related CcPlaylistcontents object + * + * @param CcPlaylistcontents|PropelObjectCollection $ccPlaylistcontents the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcPlaylistcontents($ccPlaylistcontents, $comparison = null) + { + if ($ccPlaylistcontents instanceof CcPlaylistcontents) { + return $this + ->addUsingAlias(CcPlaylistPeer::ID, $ccPlaylistcontents->getDbPlaylistId(), $comparison); + } elseif ($ccPlaylistcontents instanceof PropelObjectCollection) { + return $this + ->useCcPlaylistcontentsQuery() + ->filterByPrimaryKeys($ccPlaylistcontents->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcPlaylistcontents() only accepts arguments of type CcPlaylistcontents or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcPlaylistcontents relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlaylistQuery The current query, for fluid interface + */ + public function joinCcPlaylistcontents($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcPlaylistcontents'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcPlaylistcontents'); + } + + return $this; + } + + /** + * Use the CcPlaylistcontents relation CcPlaylistcontents object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlaylistcontentsQuery A secondary query class using the current class as primary query + */ + public function useCcPlaylistcontentsQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcPlaylistcontents($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcPlaylistcontents', 'CcPlaylistcontentsQuery'); + } + + /** + * Exclude object from result + * + * @param CcPlaylist $ccPlaylist Object to remove from the list of results + * + * @return CcPlaylistQuery The current query, for fluid interface + */ + public function prune($ccPlaylist = null) + { + if ($ccPlaylist) { + $this->addUsingAlias(CcPlaylistPeer::ID, $ccPlaylist->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcPlaylistQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcPlaylist', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcPlaylistQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcPlaylistQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcPlaylistQuery) { - return $criteria; - } - $query = new CcPlaylistQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcPlaylist|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcPlaylistPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcPlaylistPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcPlaylistPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcPlaylistPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the name column - * - * @param string $dbName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function filterByDbName($dbName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbName)) { - $dbName = str_replace('*', '%', $dbName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPlaylistPeer::NAME, $dbName, $comparison); - } - - /** - * Filter the query on the mtime column - * - * @param string|array $dbMtime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function filterByDbMtime($dbMtime = null, $comparison = null) - { - if (is_array($dbMtime)) { - $useMinMax = false; - if (isset($dbMtime['min'])) { - $this->addUsingAlias(CcPlaylistPeer::MTIME, $dbMtime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbMtime['max'])) { - $this->addUsingAlias(CcPlaylistPeer::MTIME, $dbMtime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlaylistPeer::MTIME, $dbMtime, $comparison); - } - - /** - * Filter the query on the utime column - * - * @param string|array $dbUtime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function filterByDbUtime($dbUtime = null, $comparison = null) - { - if (is_array($dbUtime)) { - $useMinMax = false; - if (isset($dbUtime['min'])) { - $this->addUsingAlias(CcPlaylistPeer::UTIME, $dbUtime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbUtime['max'])) { - $this->addUsingAlias(CcPlaylistPeer::UTIME, $dbUtime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlaylistPeer::UTIME, $dbUtime, $comparison); - } - - /** - * Filter the query on the creator_id column - * - * @param int|array $dbCreatorId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function filterByDbCreatorId($dbCreatorId = null, $comparison = null) - { - if (is_array($dbCreatorId)) { - $useMinMax = false; - if (isset($dbCreatorId['min'])) { - $this->addUsingAlias(CcPlaylistPeer::CREATOR_ID, $dbCreatorId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbCreatorId['max'])) { - $this->addUsingAlias(CcPlaylistPeer::CREATOR_ID, $dbCreatorId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlaylistPeer::CREATOR_ID, $dbCreatorId, $comparison); - } - - /** - * Filter the query on the description column - * - * @param string $dbDescription The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function filterByDbDescription($dbDescription = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbDescription)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbDescription)) { - $dbDescription = str_replace('*', '%', $dbDescription); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPlaylistPeer::DESCRIPTION, $dbDescription, $comparison); - } - - /** - * Filter the query on the length column - * - * @param string $dbLength The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function filterByDbLength($dbLength = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLength)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLength)) { - $dbLength = str_replace('*', '%', $dbLength); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPlaylistPeer::LENGTH, $dbLength, $comparison); - } - - /** - * Filter the query by a related CcSubjs object - * - * @param CcSubjs $ccSubjs the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function filterByCcSubjs($ccSubjs, $comparison = null) - { - return $this - ->addUsingAlias(CcPlaylistPeer::CREATOR_ID, $ccSubjs->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSubjs relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function joinCcSubjs($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSubjs'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSubjs'); - } - - return $this; - } - - /** - * Use the CcSubjs relation CcSubjs object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery A secondary query class using the current class as primary query - */ - public function useCcSubjsQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcSubjs($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); - } - - /** - * Filter the query by a related CcPlaylistcontents object - * - * @param CcPlaylistcontents $ccPlaylistcontents the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function filterByCcPlaylistcontents($ccPlaylistcontents, $comparison = null) - { - return $this - ->addUsingAlias(CcPlaylistPeer::ID, $ccPlaylistcontents->getDbPlaylistId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcPlaylistcontents relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function joinCcPlaylistcontents($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcPlaylistcontents'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcPlaylistcontents'); - } - - return $this; - } - - /** - * Use the CcPlaylistcontents relation CcPlaylistcontents object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlaylistcontentsQuery A secondary query class using the current class as primary query - */ - public function useCcPlaylistcontentsQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcPlaylistcontents($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcPlaylistcontents', 'CcPlaylistcontentsQuery'); - } - - /** - * Exclude object from result - * - * @param CcPlaylist $ccPlaylist Object to remove from the list of results - * - * @return CcPlaylistQuery The current query, for fluid interface - */ - public function prune($ccPlaylist = null) - { - if ($ccPlaylist) { - $this->addUsingAlias(CcPlaylistPeer::ID, $ccPlaylist->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcPlaylistQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontents.php b/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontents.php index cf6e53a98e..1c634b3821 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontents.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontents.php @@ -4,1688 +4,1870 @@ /** * Base class that represents a row from the 'cc_playlistcontents' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcPlaylistcontents extends BaseObject implements Persistent +abstract class BaseCcPlaylistcontents extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcPlaylistcontentsPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcPlaylistcontentsPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the playlist_id field. - * @var int - */ - protected $playlist_id; - - /** - * The value for the file_id field. - * @var int - */ - protected $file_id; - - /** - * The value for the block_id field. - * @var int - */ - protected $block_id; - - /** - * The value for the stream_id field. - * @var int - */ - protected $stream_id; - - /** - * The value for the type field. - * Note: this column has a database default value of: 0 - * @var int - */ - protected $type; - - /** - * The value for the position field. - * @var int - */ - protected $position; - - /** - * The value for the trackoffset field. - * Note: this column has a database default value of: 0 - * @var double - */ - protected $trackoffset; - - /** - * The value for the cliplength field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $cliplength; - - /** - * The value for the cuein field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $cuein; - - /** - * The value for the cueout field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $cueout; - - /** - * The value for the fadein field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $fadein; - - /** - * The value for the fadeout field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $fadeout; - - /** - * @var CcFiles - */ - protected $aCcFiles; - - /** - * @var CcBlock - */ - protected $aCcBlock; - - /** - * @var CcPlaylist - */ - protected $aCcPlaylist; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - // aggregate_column_relation behavior - protected $oldCcPlaylist; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->type = 0; - $this->trackoffset = 0; - $this->cliplength = '00:00:00'; - $this->cuein = '00:00:00'; - $this->cueout = '00:00:00'; - $this->fadein = '00:00:00'; - $this->fadeout = '00:00:00'; - } - - /** - * Initializes internal state of BaseCcPlaylistcontents object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [playlist_id] column value. - * - * @return int - */ - public function getDbPlaylistId() - { - return $this->playlist_id; - } - - /** - * Get the [file_id] column value. - * - * @return int - */ - public function getDbFileId() - { - return $this->file_id; - } - - /** - * Get the [block_id] column value. - * - * @return int - */ - public function getDbBlockId() - { - return $this->block_id; - } - - /** - * Get the [stream_id] column value. - * - * @return int - */ - public function getDbStreamId() - { - return $this->stream_id; - } - - /** - * Get the [type] column value. - * - * @return int - */ - public function getDbType() - { - return $this->type; - } - - /** - * Get the [position] column value. - * - * @return int - */ - public function getDbPosition() - { - return $this->position; - } - - /** - * Get the [trackoffset] column value. - * - * @return double - */ - public function getDbTrackOffset() - { - return $this->trackoffset; - } - - /** - * Get the [cliplength] column value. - * - * @return string - */ - public function getDbCliplength() - { - return $this->cliplength; - } - - /** - * Get the [cuein] column value. - * - * @return string - */ - public function getDbCuein() - { - return $this->cuein; - } - - /** - * Get the [cueout] column value. - * - * @return string - */ - public function getDbCueout() - { - return $this->cueout; - } - - /** - * Get the [optionally formatted] temporal [fadein] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbFadein($format = '%X') - { - if ($this->fadein === null) { - return null; - } - - - - try { - $dt = new DateTime($this->fadein); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->fadein, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [fadeout] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbFadeout($format = '%X') - { - if ($this->fadeout === null) { - return null; - } - - - - try { - $dt = new DateTime($this->fadeout); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->fadeout, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcPlaylistcontents The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcPlaylistcontentsPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [playlist_id] column. - * - * @param int $v new value - * @return CcPlaylistcontents The current object (for fluent API support) - */ - public function setDbPlaylistId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->playlist_id !== $v) { - $this->playlist_id = $v; - $this->modifiedColumns[] = CcPlaylistcontentsPeer::PLAYLIST_ID; - } - - if ($this->aCcPlaylist !== null && $this->aCcPlaylist->getDbId() !== $v) { - $this->aCcPlaylist = null; - } - - return $this; - } // setDbPlaylistId() - - /** - * Set the value of [file_id] column. - * - * @param int $v new value - * @return CcPlaylistcontents The current object (for fluent API support) - */ - public function setDbFileId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->file_id !== $v) { - $this->file_id = $v; - $this->modifiedColumns[] = CcPlaylistcontentsPeer::FILE_ID; - } - - if ($this->aCcFiles !== null && $this->aCcFiles->getDbId() !== $v) { - $this->aCcFiles = null; - } - - return $this; - } // setDbFileId() - - /** - * Set the value of [block_id] column. - * - * @param int $v new value - * @return CcPlaylistcontents The current object (for fluent API support) - */ - public function setDbBlockId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->block_id !== $v) { - $this->block_id = $v; - $this->modifiedColumns[] = CcPlaylistcontentsPeer::BLOCK_ID; - } - - if ($this->aCcBlock !== null && $this->aCcBlock->getDbId() !== $v) { - $this->aCcBlock = null; - } - - return $this; - } // setDbBlockId() - - /** - * Set the value of [stream_id] column. - * - * @param int $v new value - * @return CcPlaylistcontents The current object (for fluent API support) - */ - public function setDbStreamId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->stream_id !== $v) { - $this->stream_id = $v; - $this->modifiedColumns[] = CcPlaylistcontentsPeer::STREAM_ID; - } - - return $this; - } // setDbStreamId() - - /** - * Set the value of [type] column. - * - * @param int $v new value - * @return CcPlaylistcontents The current object (for fluent API support) - */ - public function setDbType($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->type !== $v || $this->isNew()) { - $this->type = $v; - $this->modifiedColumns[] = CcPlaylistcontentsPeer::TYPE; - } - - return $this; - } // setDbType() - - /** - * Set the value of [position] column. - * - * @param int $v new value - * @return CcPlaylistcontents The current object (for fluent API support) - */ - public function setDbPosition($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->position !== $v) { - $this->position = $v; - $this->modifiedColumns[] = CcPlaylistcontentsPeer::POSITION; - } - - return $this; - } // setDbPosition() - - /** - * Set the value of [trackoffset] column. - * - * @param double $v new value - * @return CcPlaylistcontents The current object (for fluent API support) - */ - public function setDbTrackOffset($v) - { - if ($v !== null) { - $v = (double) $v; - } - - if ($this->trackoffset !== $v || $this->isNew()) { - $this->trackoffset = $v; - $this->modifiedColumns[] = CcPlaylistcontentsPeer::TRACKOFFSET; - } - - return $this; - } // setDbTrackOffset() - - /** - * Set the value of [cliplength] column. - * - * @param string $v new value - * @return CcPlaylistcontents The current object (for fluent API support) - */ - public function setDbCliplength($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->cliplength !== $v || $this->isNew()) { - $this->cliplength = $v; - $this->modifiedColumns[] = CcPlaylistcontentsPeer::CLIPLENGTH; - } - - return $this; - } // setDbCliplength() - - /** - * Set the value of [cuein] column. - * - * @param string $v new value - * @return CcPlaylistcontents The current object (for fluent API support) - */ - public function setDbCuein($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->cuein !== $v || $this->isNew()) { - $this->cuein = $v; - $this->modifiedColumns[] = CcPlaylistcontentsPeer::CUEIN; - } - - return $this; - } // setDbCuein() - - /** - * Set the value of [cueout] column. - * - * @param string $v new value - * @return CcPlaylistcontents The current object (for fluent API support) - */ - public function setDbCueout($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->cueout !== $v || $this->isNew()) { - $this->cueout = $v; - $this->modifiedColumns[] = CcPlaylistcontentsPeer::CUEOUT; - } - - return $this; - } // setDbCueout() - - /** - * Sets the value of [fadein] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcPlaylistcontents The current object (for fluent API support) - */ - public function setDbFadein($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->fadein !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->fadein !== null && $tmpDt = new DateTime($this->fadein)) ? $tmpDt->format('H:i:s') : null; - $newNorm = ($dt !== null) ? $dt->format('H:i:s') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - || ($dt->format('H:i:s') === '00:00:00') // or the entered value matches the default - ) - { - $this->fadein = ($dt ? $dt->format('H:i:s') : null); - $this->modifiedColumns[] = CcPlaylistcontentsPeer::FADEIN; - } - } // if either are not null - - return $this; - } // setDbFadein() - - /** - * Sets the value of [fadeout] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcPlaylistcontents The current object (for fluent API support) - */ - public function setDbFadeout($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->fadeout !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->fadeout !== null && $tmpDt = new DateTime($this->fadeout)) ? $tmpDt->format('H:i:s') : null; - $newNorm = ($dt !== null) ? $dt->format('H:i:s') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - || ($dt->format('H:i:s') === '00:00:00') // or the entered value matches the default - ) - { - $this->fadeout = ($dt ? $dt->format('H:i:s') : null); - $this->modifiedColumns[] = CcPlaylistcontentsPeer::FADEOUT; - } - } // if either are not null - - return $this; - } // setDbFadeout() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->type !== 0) { - return false; - } - - if ($this->trackoffset !== 0) { - return false; - } - - if ($this->cliplength !== '00:00:00') { - return false; - } - - if ($this->cuein !== '00:00:00') { - return false; - } - - if ($this->cueout !== '00:00:00') { - return false; - } - - if ($this->fadein !== '00:00:00') { - return false; - } - - if ($this->fadeout !== '00:00:00') { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->playlist_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->file_id = ($row[$startcol + 2] !== null) ? (int) $row[$startcol + 2] : null; - $this->block_id = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; - $this->stream_id = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; - $this->type = ($row[$startcol + 5] !== null) ? (int) $row[$startcol + 5] : null; - $this->position = ($row[$startcol + 6] !== null) ? (int) $row[$startcol + 6] : null; - $this->trackoffset = ($row[$startcol + 7] !== null) ? (double) $row[$startcol + 7] : null; - $this->cliplength = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; - $this->cuein = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; - $this->cueout = ($row[$startcol + 10] !== null) ? (string) $row[$startcol + 10] : null; - $this->fadein = ($row[$startcol + 11] !== null) ? (string) $row[$startcol + 11] : null; - $this->fadeout = ($row[$startcol + 12] !== null) ? (string) $row[$startcol + 12] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 13; // 13 = CcPlaylistcontentsPeer::NUM_COLUMNS - CcPlaylistcontentsPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcPlaylistcontents object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcPlaylist !== null && $this->playlist_id !== $this->aCcPlaylist->getDbId()) { - $this->aCcPlaylist = null; - } - if ($this->aCcFiles !== null && $this->file_id !== $this->aCcFiles->getDbId()) { - $this->aCcFiles = null; - } - if ($this->aCcBlock !== null && $this->block_id !== $this->aCcBlock->getDbId()) { - $this->aCcBlock = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcPlaylistcontentsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcFiles = null; - $this->aCcBlock = null; - $this->aCcPlaylist = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcPlaylistcontentsQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - // aggregate_column_relation behavior - $this->updateRelatedCcPlaylist($con); - CcPlaylistcontentsPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcFiles !== null) { - if ($this->aCcFiles->isModified() || $this->aCcFiles->isNew()) { - $affectedRows += $this->aCcFiles->save($con); - } - $this->setCcFiles($this->aCcFiles); - } - - if ($this->aCcBlock !== null) { - if ($this->aCcBlock->isModified() || $this->aCcBlock->isNew()) { - $affectedRows += $this->aCcBlock->save($con); - } - $this->setCcBlock($this->aCcBlock); - } - - if ($this->aCcPlaylist !== null) { - if ($this->aCcPlaylist->isModified() || $this->aCcPlaylist->isNew()) { - $affectedRows += $this->aCcPlaylist->save($con); - } - $this->setCcPlaylist($this->aCcPlaylist); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcPlaylistcontentsPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcPlaylistcontentsPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlaylistcontentsPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcPlaylistcontentsPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcFiles !== null) { - if (!$this->aCcFiles->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcFiles->getValidationFailures()); - } - } - - if ($this->aCcBlock !== null) { - if (!$this->aCcBlock->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcBlock->getValidationFailures()); - } - } - - if ($this->aCcPlaylist !== null) { - if (!$this->aCcPlaylist->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcPlaylist->getValidationFailures()); - } - } - - - if (($retval = CcPlaylistcontentsPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPlaylistcontentsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbPlaylistId(); - break; - case 2: - return $this->getDbFileId(); - break; - case 3: - return $this->getDbBlockId(); - break; - case 4: - return $this->getDbStreamId(); - break; - case 5: - return $this->getDbType(); - break; - case 6: - return $this->getDbPosition(); - break; - case 7: - return $this->getDbTrackOffset(); - break; - case 8: - return $this->getDbCliplength(); - break; - case 9: - return $this->getDbCuein(); - break; - case 10: - return $this->getDbCueout(); - break; - case 11: - return $this->getDbFadein(); - break; - case 12: - return $this->getDbFadeout(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcPlaylistcontentsPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbPlaylistId(), - $keys[2] => $this->getDbFileId(), - $keys[3] => $this->getDbBlockId(), - $keys[4] => $this->getDbStreamId(), - $keys[5] => $this->getDbType(), - $keys[6] => $this->getDbPosition(), - $keys[7] => $this->getDbTrackOffset(), - $keys[8] => $this->getDbCliplength(), - $keys[9] => $this->getDbCuein(), - $keys[10] => $this->getDbCueout(), - $keys[11] => $this->getDbFadein(), - $keys[12] => $this->getDbFadeout(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcFiles) { - $result['CcFiles'] = $this->aCcFiles->toArray($keyType, $includeLazyLoadColumns, true); - } - if (null !== $this->aCcBlock) { - $result['CcBlock'] = $this->aCcBlock->toArray($keyType, $includeLazyLoadColumns, true); - } - if (null !== $this->aCcPlaylist) { - $result['CcPlaylist'] = $this->aCcPlaylist->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPlaylistcontentsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbPlaylistId($value); - break; - case 2: - $this->setDbFileId($value); - break; - case 3: - $this->setDbBlockId($value); - break; - case 4: - $this->setDbStreamId($value); - break; - case 5: - $this->setDbType($value); - break; - case 6: - $this->setDbPosition($value); - break; - case 7: - $this->setDbTrackOffset($value); - break; - case 8: - $this->setDbCliplength($value); - break; - case 9: - $this->setDbCuein($value); - break; - case 10: - $this->setDbCueout($value); - break; - case 11: - $this->setDbFadein($value); - break; - case 12: - $this->setDbFadeout($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcPlaylistcontentsPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbPlaylistId($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbFileId($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbBlockId($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbStreamId($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setDbType($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setDbPosition($arr[$keys[6]]); - if (array_key_exists($keys[7], $arr)) $this->setDbTrackOffset($arr[$keys[7]]); - if (array_key_exists($keys[8], $arr)) $this->setDbCliplength($arr[$keys[8]]); - if (array_key_exists($keys[9], $arr)) $this->setDbCuein($arr[$keys[9]]); - if (array_key_exists($keys[10], $arr)) $this->setDbCueout($arr[$keys[10]]); - if (array_key_exists($keys[11], $arr)) $this->setDbFadein($arr[$keys[11]]); - if (array_key_exists($keys[12], $arr)) $this->setDbFadeout($arr[$keys[12]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcPlaylistcontentsPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcPlaylistcontentsPeer::ID)) $criteria->add(CcPlaylistcontentsPeer::ID, $this->id); - if ($this->isColumnModified(CcPlaylistcontentsPeer::PLAYLIST_ID)) $criteria->add(CcPlaylistcontentsPeer::PLAYLIST_ID, $this->playlist_id); - if ($this->isColumnModified(CcPlaylistcontentsPeer::FILE_ID)) $criteria->add(CcPlaylistcontentsPeer::FILE_ID, $this->file_id); - if ($this->isColumnModified(CcPlaylistcontentsPeer::BLOCK_ID)) $criteria->add(CcPlaylistcontentsPeer::BLOCK_ID, $this->block_id); - if ($this->isColumnModified(CcPlaylistcontentsPeer::STREAM_ID)) $criteria->add(CcPlaylistcontentsPeer::STREAM_ID, $this->stream_id); - if ($this->isColumnModified(CcPlaylistcontentsPeer::TYPE)) $criteria->add(CcPlaylistcontentsPeer::TYPE, $this->type); - if ($this->isColumnModified(CcPlaylistcontentsPeer::POSITION)) $criteria->add(CcPlaylistcontentsPeer::POSITION, $this->position); - if ($this->isColumnModified(CcPlaylistcontentsPeer::TRACKOFFSET)) $criteria->add(CcPlaylistcontentsPeer::TRACKOFFSET, $this->trackoffset); - if ($this->isColumnModified(CcPlaylistcontentsPeer::CLIPLENGTH)) $criteria->add(CcPlaylistcontentsPeer::CLIPLENGTH, $this->cliplength); - if ($this->isColumnModified(CcPlaylistcontentsPeer::CUEIN)) $criteria->add(CcPlaylistcontentsPeer::CUEIN, $this->cuein); - if ($this->isColumnModified(CcPlaylistcontentsPeer::CUEOUT)) $criteria->add(CcPlaylistcontentsPeer::CUEOUT, $this->cueout); - if ($this->isColumnModified(CcPlaylistcontentsPeer::FADEIN)) $criteria->add(CcPlaylistcontentsPeer::FADEIN, $this->fadein); - if ($this->isColumnModified(CcPlaylistcontentsPeer::FADEOUT)) $criteria->add(CcPlaylistcontentsPeer::FADEOUT, $this->fadeout); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcPlaylistcontentsPeer::DATABASE_NAME); - $criteria->add(CcPlaylistcontentsPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcPlaylistcontents (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbPlaylistId($this->playlist_id); - $copyObj->setDbFileId($this->file_id); - $copyObj->setDbBlockId($this->block_id); - $copyObj->setDbStreamId($this->stream_id); - $copyObj->setDbType($this->type); - $copyObj->setDbPosition($this->position); - $copyObj->setDbTrackOffset($this->trackoffset); - $copyObj->setDbCliplength($this->cliplength); - $copyObj->setDbCuein($this->cuein); - $copyObj->setDbCueout($this->cueout); - $copyObj->setDbFadein($this->fadein); - $copyObj->setDbFadeout($this->fadeout); - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcPlaylistcontents Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcPlaylistcontentsPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcPlaylistcontentsPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcFiles object. - * - * @param CcFiles $v - * @return CcPlaylistcontents The current object (for fluent API support) - * @throws PropelException - */ - public function setCcFiles(CcFiles $v = null) - { - if ($v === null) { - $this->setDbFileId(NULL); - } else { - $this->setDbFileId($v->getDbId()); - } - - $this->aCcFiles = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcFiles object, it will not be re-added. - if ($v !== null) { - $v->addCcPlaylistcontents($this); - } - - return $this; - } - - - /** - * Get the associated CcFiles object - * - * @param PropelPDO Optional Connection object. - * @return CcFiles The associated CcFiles object. - * @throws PropelException - */ - public function getCcFiles(PropelPDO $con = null) - { - if ($this->aCcFiles === null && ($this->file_id !== null)) { - $this->aCcFiles = CcFilesQuery::create()->findPk($this->file_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcFiles->addCcPlaylistcontentss($this); - */ - } - return $this->aCcFiles; - } - - /** - * Declares an association between this object and a CcBlock object. - * - * @param CcBlock $v - * @return CcPlaylistcontents The current object (for fluent API support) - * @throws PropelException - */ - public function setCcBlock(CcBlock $v = null) - { - if ($v === null) { - $this->setDbBlockId(NULL); - } else { - $this->setDbBlockId($v->getDbId()); - } - - $this->aCcBlock = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcBlock object, it will not be re-added. - if ($v !== null) { - $v->addCcPlaylistcontents($this); - } - - return $this; - } - - - /** - * Get the associated CcBlock object - * - * @param PropelPDO Optional Connection object. - * @return CcBlock The associated CcBlock object. - * @throws PropelException - */ - public function getCcBlock(PropelPDO $con = null) - { - if ($this->aCcBlock === null && ($this->block_id !== null)) { - $this->aCcBlock = CcBlockQuery::create()->findPk($this->block_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcBlock->addCcPlaylistcontentss($this); - */ - } - return $this->aCcBlock; - } - - /** - * Declares an association between this object and a CcPlaylist object. - * - * @param CcPlaylist $v - * @return CcPlaylistcontents The current object (for fluent API support) - * @throws PropelException - */ - public function setCcPlaylist(CcPlaylist $v = null) - { - // aggregate_column_relation behavior - if (null !== $this->aCcPlaylist && $v !== $this->aCcPlaylist) { - $this->oldCcPlaylist = $this->aCcPlaylist; - } - if ($v === null) { - $this->setDbPlaylistId(NULL); - } else { - $this->setDbPlaylistId($v->getDbId()); - } - - $this->aCcPlaylist = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcPlaylist object, it will not be re-added. - if ($v !== null) { - $v->addCcPlaylistcontents($this); - } - - return $this; - } - - - /** - * Get the associated CcPlaylist object - * - * @param PropelPDO Optional Connection object. - * @return CcPlaylist The associated CcPlaylist object. - * @throws PropelException - */ - public function getCcPlaylist(PropelPDO $con = null) - { - if ($this->aCcPlaylist === null && ($this->playlist_id !== null)) { - $this->aCcPlaylist = CcPlaylistQuery::create()->findPk($this->playlist_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcPlaylist->addCcPlaylistcontentss($this); - */ - } - return $this->aCcPlaylist; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->playlist_id = null; - $this->file_id = null; - $this->block_id = null; - $this->stream_id = null; - $this->type = null; - $this->position = null; - $this->trackoffset = null; - $this->cliplength = null; - $this->cuein = null; - $this->cueout = null; - $this->fadein = null; - $this->fadeout = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcFiles = null; - $this->aCcBlock = null; - $this->aCcPlaylist = null; - } - - // aggregate_column_relation behavior - - /** - * Update the aggregate column in the related CcPlaylist object - * - * @param PropelPDO $con A connection object - */ - protected function updateRelatedCcPlaylist(PropelPDO $con) - { - if ($ccPlaylist = $this->getCcPlaylist()) { - $ccPlaylist->updateDbLength($con); - } - if ($this->oldCcPlaylist) { - $this->oldCcPlaylist->updateDbLength($con); - $this->oldCcPlaylist = null; - } - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcPlaylistcontents + /** + * Peer class name + */ + const PEER = 'CcPlaylistcontentsPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcPlaylistcontentsPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the playlist_id field. + * @var int + */ + protected $playlist_id; + + /** + * The value for the file_id field. + * @var int + */ + protected $file_id; + + /** + * The value for the block_id field. + * @var int + */ + protected $block_id; + + /** + * The value for the stream_id field. + * @var int + */ + protected $stream_id; + + /** + * The value for the type field. + * Note: this column has a database default value of: 0 + * @var int + */ + protected $type; + + /** + * The value for the position field. + * @var int + */ + protected $position; + + /** + * The value for the trackoffset field. + * Note: this column has a database default value of: 0 + * @var double + */ + protected $trackoffset; + + /** + * The value for the cliplength field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $cliplength; + + /** + * The value for the cuein field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $cuein; + + /** + * The value for the cueout field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $cueout; + + /** + * The value for the fadein field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $fadein; + + /** + * The value for the fadeout field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $fadeout; + + /** + * @var CcFiles + */ + protected $aCcFiles; + + /** + * @var CcBlock + */ + protected $aCcBlock; + + /** + * @var CcPlaylist + */ + protected $aCcPlaylist; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + // aggregate_column_relation behavior + protected $oldCcPlaylist; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->type = 0; + $this->trackoffset = 0; + $this->cliplength = '00:00:00'; + $this->cuein = '00:00:00'; + $this->cueout = '00:00:00'; + $this->fadein = '00:00:00'; + $this->fadeout = '00:00:00'; + } + + /** + * Initializes internal state of BaseCcPlaylistcontents object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [playlist_id] column value. + * + * @return int + */ + public function getDbPlaylistId() + { + + return $this->playlist_id; + } + + /** + * Get the [file_id] column value. + * + * @return int + */ + public function getDbFileId() + { + + return $this->file_id; + } + + /** + * Get the [block_id] column value. + * + * @return int + */ + public function getDbBlockId() + { + + return $this->block_id; + } + + /** + * Get the [stream_id] column value. + * + * @return int + */ + public function getDbStreamId() + { + + return $this->stream_id; + } + + /** + * Get the [type] column value. + * + * @return int + */ + public function getDbType() + { + + return $this->type; + } + + /** + * Get the [position] column value. + * + * @return int + */ + public function getDbPosition() + { + + return $this->position; + } + + /** + * Get the [trackoffset] column value. + * + * @return double + */ + public function getDbTrackOffset() + { + + return $this->trackoffset; + } + + /** + * Get the [cliplength] column value. + * + * @return string + */ + public function getDbCliplength() + { + + return $this->cliplength; + } + + /** + * Get the [cuein] column value. + * + * @return string + */ + public function getDbCuein() + { + + return $this->cuein; + } + + /** + * Get the [cueout] column value. + * + * @return string + */ + public function getDbCueout() + { + + return $this->cueout; + } + + /** + * Get the [optionally formatted] temporal [fadein] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbFadein($format = '%X') + { + if ($this->fadein === null) { + return null; + } + + + try { + $dt = new DateTime($this->fadein); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->fadein, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [fadeout] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbFadeout($format = '%X') + { + if ($this->fadeout === null) { + return null; + } + + + try { + $dt = new DateTime($this->fadeout); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->fadeout, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcPlaylistcontents The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcPlaylistcontentsPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [playlist_id] column. + * + * @param int $v new value + * @return CcPlaylistcontents The current object (for fluent API support) + */ + public function setDbPlaylistId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->playlist_id !== $v) { + $this->playlist_id = $v; + $this->modifiedColumns[] = CcPlaylistcontentsPeer::PLAYLIST_ID; + } + + if ($this->aCcPlaylist !== null && $this->aCcPlaylist->getDbId() !== $v) { + $this->aCcPlaylist = null; + } + + + return $this; + } // setDbPlaylistId() + + /** + * Set the value of [file_id] column. + * + * @param int $v new value + * @return CcPlaylistcontents The current object (for fluent API support) + */ + public function setDbFileId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->file_id !== $v) { + $this->file_id = $v; + $this->modifiedColumns[] = CcPlaylistcontentsPeer::FILE_ID; + } + + if ($this->aCcFiles !== null && $this->aCcFiles->getDbId() !== $v) { + $this->aCcFiles = null; + } + + + return $this; + } // setDbFileId() + + /** + * Set the value of [block_id] column. + * + * @param int $v new value + * @return CcPlaylistcontents The current object (for fluent API support) + */ + public function setDbBlockId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->block_id !== $v) { + $this->block_id = $v; + $this->modifiedColumns[] = CcPlaylistcontentsPeer::BLOCK_ID; + } + + if ($this->aCcBlock !== null && $this->aCcBlock->getDbId() !== $v) { + $this->aCcBlock = null; + } + + + return $this; + } // setDbBlockId() + + /** + * Set the value of [stream_id] column. + * + * @param int $v new value + * @return CcPlaylistcontents The current object (for fluent API support) + */ + public function setDbStreamId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->stream_id !== $v) { + $this->stream_id = $v; + $this->modifiedColumns[] = CcPlaylistcontentsPeer::STREAM_ID; + } + + + return $this; + } // setDbStreamId() + + /** + * Set the value of [type] column. + * + * @param int $v new value + * @return CcPlaylistcontents The current object (for fluent API support) + */ + public function setDbType($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->type !== $v) { + $this->type = $v; + $this->modifiedColumns[] = CcPlaylistcontentsPeer::TYPE; + } + + + return $this; + } // setDbType() + + /** + * Set the value of [position] column. + * + * @param int $v new value + * @return CcPlaylistcontents The current object (for fluent API support) + */ + public function setDbPosition($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->position !== $v) { + $this->position = $v; + $this->modifiedColumns[] = CcPlaylistcontentsPeer::POSITION; + } + + + return $this; + } // setDbPosition() + + /** + * Set the value of [trackoffset] column. + * + * @param double $v new value + * @return CcPlaylistcontents The current object (for fluent API support) + */ + public function setDbTrackOffset($v) + { + if ($v !== null && is_numeric($v)) { + $v = (double) $v; + } + + if ($this->trackoffset !== $v) { + $this->trackoffset = $v; + $this->modifiedColumns[] = CcPlaylistcontentsPeer::TRACKOFFSET; + } + + + return $this; + } // setDbTrackOffset() + + /** + * Set the value of [cliplength] column. + * + * @param string $v new value + * @return CcPlaylistcontents The current object (for fluent API support) + */ + public function setDbCliplength($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->cliplength !== $v) { + $this->cliplength = $v; + $this->modifiedColumns[] = CcPlaylistcontentsPeer::CLIPLENGTH; + } + + + return $this; + } // setDbCliplength() + + /** + * Set the value of [cuein] column. + * + * @param string $v new value + * @return CcPlaylistcontents The current object (for fluent API support) + */ + public function setDbCuein($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->cuein !== $v) { + $this->cuein = $v; + $this->modifiedColumns[] = CcPlaylistcontentsPeer::CUEIN; + } + + + return $this; + } // setDbCuein() + + /** + * Set the value of [cueout] column. + * + * @param string $v new value + * @return CcPlaylistcontents The current object (for fluent API support) + */ + public function setDbCueout($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->cueout !== $v) { + $this->cueout = $v; + $this->modifiedColumns[] = CcPlaylistcontentsPeer::CUEOUT; + } + + + return $this; + } // setDbCueout() + + /** + * Sets the value of [fadein] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcPlaylistcontents The current object (for fluent API support) + */ + public function setDbFadein($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->fadein !== null || $dt !== null) { + $currentDateAsString = ($this->fadein !== null && $tmpDt = new DateTime($this->fadein)) ? $tmpDt->format('H:i:s') : null; + $newDateAsString = $dt ? $dt->format('H:i:s') : null; + if ( ($currentDateAsString !== $newDateAsString) // normalized values don't match + || ($dt->format('H:i:s') === '00:00:00') // or the entered value matches the default + ) { + $this->fadein = $newDateAsString; + $this->modifiedColumns[] = CcPlaylistcontentsPeer::FADEIN; + } + } // if either are not null + + + return $this; + } // setDbFadein() + + /** + * Sets the value of [fadeout] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcPlaylistcontents The current object (for fluent API support) + */ + public function setDbFadeout($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->fadeout !== null || $dt !== null) { + $currentDateAsString = ($this->fadeout !== null && $tmpDt = new DateTime($this->fadeout)) ? $tmpDt->format('H:i:s') : null; + $newDateAsString = $dt ? $dt->format('H:i:s') : null; + if ( ($currentDateAsString !== $newDateAsString) // normalized values don't match + || ($dt->format('H:i:s') === '00:00:00') // or the entered value matches the default + ) { + $this->fadeout = $newDateAsString; + $this->modifiedColumns[] = CcPlaylistcontentsPeer::FADEOUT; + } + } // if either are not null + + + return $this; + } // setDbFadeout() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->type !== 0) { + return false; + } + + if ($this->trackoffset !== 0) { + return false; + } + + if ($this->cliplength !== '00:00:00') { + return false; + } + + if ($this->cuein !== '00:00:00') { + return false; + } + + if ($this->cueout !== '00:00:00') { + return false; + } + + if ($this->fadein !== '00:00:00') { + return false; + } + + if ($this->fadeout !== '00:00:00') { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->playlist_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->file_id = ($row[$startcol + 2] !== null) ? (int) $row[$startcol + 2] : null; + $this->block_id = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; + $this->stream_id = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; + $this->type = ($row[$startcol + 5] !== null) ? (int) $row[$startcol + 5] : null; + $this->position = ($row[$startcol + 6] !== null) ? (int) $row[$startcol + 6] : null; + $this->trackoffset = ($row[$startcol + 7] !== null) ? (double) $row[$startcol + 7] : null; + $this->cliplength = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; + $this->cuein = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; + $this->cueout = ($row[$startcol + 10] !== null) ? (string) $row[$startcol + 10] : null; + $this->fadein = ($row[$startcol + 11] !== null) ? (string) $row[$startcol + 11] : null; + $this->fadeout = ($row[$startcol + 12] !== null) ? (string) $row[$startcol + 12] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 13; // 13 = CcPlaylistcontentsPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcPlaylistcontents object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcPlaylist !== null && $this->playlist_id !== $this->aCcPlaylist->getDbId()) { + $this->aCcPlaylist = null; + } + if ($this->aCcFiles !== null && $this->file_id !== $this->aCcFiles->getDbId()) { + $this->aCcFiles = null; + } + if ($this->aCcBlock !== null && $this->block_id !== $this->aCcBlock->getDbId()) { + $this->aCcBlock = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcPlaylistcontentsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcFiles = null; + $this->aCcBlock = null; + $this->aCcPlaylist = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcPlaylistcontentsQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + // aggregate_column_relation behavior + $this->updateRelatedCcPlaylist($con); + CcPlaylistcontentsPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcFiles !== null) { + if ($this->aCcFiles->isModified() || $this->aCcFiles->isNew()) { + $affectedRows += $this->aCcFiles->save($con); + } + $this->setCcFiles($this->aCcFiles); + } + + if ($this->aCcBlock !== null) { + if ($this->aCcBlock->isModified() || $this->aCcBlock->isNew()) { + $affectedRows += $this->aCcBlock->save($con); + } + $this->setCcBlock($this->aCcBlock); + } + + if ($this->aCcPlaylist !== null) { + if ($this->aCcPlaylist->isModified() || $this->aCcPlaylist->isNew()) { + $affectedRows += $this->aCcPlaylist->save($con); + } + $this->setCcPlaylist($this->aCcPlaylist); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcPlaylistcontentsPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcPlaylistcontentsPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_playlistcontents_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcPlaylistcontentsPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcPlaylistcontentsPeer::PLAYLIST_ID)) { + $modifiedColumns[':p' . $index++] = '"playlist_id"'; + } + if ($this->isColumnModified(CcPlaylistcontentsPeer::FILE_ID)) { + $modifiedColumns[':p' . $index++] = '"file_id"'; + } + if ($this->isColumnModified(CcPlaylistcontentsPeer::BLOCK_ID)) { + $modifiedColumns[':p' . $index++] = '"block_id"'; + } + if ($this->isColumnModified(CcPlaylistcontentsPeer::STREAM_ID)) { + $modifiedColumns[':p' . $index++] = '"stream_id"'; + } + if ($this->isColumnModified(CcPlaylistcontentsPeer::TYPE)) { + $modifiedColumns[':p' . $index++] = '"type"'; + } + if ($this->isColumnModified(CcPlaylistcontentsPeer::POSITION)) { + $modifiedColumns[':p' . $index++] = '"position"'; + } + if ($this->isColumnModified(CcPlaylistcontentsPeer::TRACKOFFSET)) { + $modifiedColumns[':p' . $index++] = '"trackoffset"'; + } + if ($this->isColumnModified(CcPlaylistcontentsPeer::CLIPLENGTH)) { + $modifiedColumns[':p' . $index++] = '"cliplength"'; + } + if ($this->isColumnModified(CcPlaylistcontentsPeer::CUEIN)) { + $modifiedColumns[':p' . $index++] = '"cuein"'; + } + if ($this->isColumnModified(CcPlaylistcontentsPeer::CUEOUT)) { + $modifiedColumns[':p' . $index++] = '"cueout"'; + } + if ($this->isColumnModified(CcPlaylistcontentsPeer::FADEIN)) { + $modifiedColumns[':p' . $index++] = '"fadein"'; + } + if ($this->isColumnModified(CcPlaylistcontentsPeer::FADEOUT)) { + $modifiedColumns[':p' . $index++] = '"fadeout"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_playlistcontents" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"playlist_id"': + $stmt->bindValue($identifier, $this->playlist_id, PDO::PARAM_INT); + break; + case '"file_id"': + $stmt->bindValue($identifier, $this->file_id, PDO::PARAM_INT); + break; + case '"block_id"': + $stmt->bindValue($identifier, $this->block_id, PDO::PARAM_INT); + break; + case '"stream_id"': + $stmt->bindValue($identifier, $this->stream_id, PDO::PARAM_INT); + break; + case '"type"': + $stmt->bindValue($identifier, $this->type, PDO::PARAM_INT); + break; + case '"position"': + $stmt->bindValue($identifier, $this->position, PDO::PARAM_INT); + break; + case '"trackoffset"': + $stmt->bindValue($identifier, $this->trackoffset, PDO::PARAM_STR); + break; + case '"cliplength"': + $stmt->bindValue($identifier, $this->cliplength, PDO::PARAM_STR); + break; + case '"cuein"': + $stmt->bindValue($identifier, $this->cuein, PDO::PARAM_STR); + break; + case '"cueout"': + $stmt->bindValue($identifier, $this->cueout, PDO::PARAM_STR); + break; + case '"fadein"': + $stmt->bindValue($identifier, $this->fadein, PDO::PARAM_STR); + break; + case '"fadeout"': + $stmt->bindValue($identifier, $this->fadeout, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcFiles !== null) { + if (!$this->aCcFiles->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcFiles->getValidationFailures()); + } + } + + if ($this->aCcBlock !== null) { + if (!$this->aCcBlock->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcBlock->getValidationFailures()); + } + } + + if ($this->aCcPlaylist !== null) { + if (!$this->aCcPlaylist->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcPlaylist->getValidationFailures()); + } + } + + + if (($retval = CcPlaylistcontentsPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPlaylistcontentsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbPlaylistId(); + break; + case 2: + return $this->getDbFileId(); + break; + case 3: + return $this->getDbBlockId(); + break; + case 4: + return $this->getDbStreamId(); + break; + case 5: + return $this->getDbType(); + break; + case 6: + return $this->getDbPosition(); + break; + case 7: + return $this->getDbTrackOffset(); + break; + case 8: + return $this->getDbCliplength(); + break; + case 9: + return $this->getDbCuein(); + break; + case 10: + return $this->getDbCueout(); + break; + case 11: + return $this->getDbFadein(); + break; + case 12: + return $this->getDbFadeout(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcPlaylistcontents'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcPlaylistcontents'][$this->getPrimaryKey()] = true; + $keys = CcPlaylistcontentsPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbPlaylistId(), + $keys[2] => $this->getDbFileId(), + $keys[3] => $this->getDbBlockId(), + $keys[4] => $this->getDbStreamId(), + $keys[5] => $this->getDbType(), + $keys[6] => $this->getDbPosition(), + $keys[7] => $this->getDbTrackOffset(), + $keys[8] => $this->getDbCliplength(), + $keys[9] => $this->getDbCuein(), + $keys[10] => $this->getDbCueout(), + $keys[11] => $this->getDbFadein(), + $keys[12] => $this->getDbFadeout(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcFiles) { + $result['CcFiles'] = $this->aCcFiles->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->aCcBlock) { + $result['CcBlock'] = $this->aCcBlock->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->aCcPlaylist) { + $result['CcPlaylist'] = $this->aCcPlaylist->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPlaylistcontentsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbPlaylistId($value); + break; + case 2: + $this->setDbFileId($value); + break; + case 3: + $this->setDbBlockId($value); + break; + case 4: + $this->setDbStreamId($value); + break; + case 5: + $this->setDbType($value); + break; + case 6: + $this->setDbPosition($value); + break; + case 7: + $this->setDbTrackOffset($value); + break; + case 8: + $this->setDbCliplength($value); + break; + case 9: + $this->setDbCuein($value); + break; + case 10: + $this->setDbCueout($value); + break; + case 11: + $this->setDbFadein($value); + break; + case 12: + $this->setDbFadeout($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcPlaylistcontentsPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbPlaylistId($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbFileId($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbBlockId($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbStreamId($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setDbType($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setDbPosition($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setDbTrackOffset($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setDbCliplength($arr[$keys[8]]); + if (array_key_exists($keys[9], $arr)) $this->setDbCuein($arr[$keys[9]]); + if (array_key_exists($keys[10], $arr)) $this->setDbCueout($arr[$keys[10]]); + if (array_key_exists($keys[11], $arr)) $this->setDbFadein($arr[$keys[11]]); + if (array_key_exists($keys[12], $arr)) $this->setDbFadeout($arr[$keys[12]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcPlaylistcontentsPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcPlaylistcontentsPeer::ID)) $criteria->add(CcPlaylistcontentsPeer::ID, $this->id); + if ($this->isColumnModified(CcPlaylistcontentsPeer::PLAYLIST_ID)) $criteria->add(CcPlaylistcontentsPeer::PLAYLIST_ID, $this->playlist_id); + if ($this->isColumnModified(CcPlaylistcontentsPeer::FILE_ID)) $criteria->add(CcPlaylistcontentsPeer::FILE_ID, $this->file_id); + if ($this->isColumnModified(CcPlaylistcontentsPeer::BLOCK_ID)) $criteria->add(CcPlaylistcontentsPeer::BLOCK_ID, $this->block_id); + if ($this->isColumnModified(CcPlaylistcontentsPeer::STREAM_ID)) $criteria->add(CcPlaylistcontentsPeer::STREAM_ID, $this->stream_id); + if ($this->isColumnModified(CcPlaylistcontentsPeer::TYPE)) $criteria->add(CcPlaylistcontentsPeer::TYPE, $this->type); + if ($this->isColumnModified(CcPlaylistcontentsPeer::POSITION)) $criteria->add(CcPlaylistcontentsPeer::POSITION, $this->position); + if ($this->isColumnModified(CcPlaylistcontentsPeer::TRACKOFFSET)) $criteria->add(CcPlaylistcontentsPeer::TRACKOFFSET, $this->trackoffset); + if ($this->isColumnModified(CcPlaylistcontentsPeer::CLIPLENGTH)) $criteria->add(CcPlaylistcontentsPeer::CLIPLENGTH, $this->cliplength); + if ($this->isColumnModified(CcPlaylistcontentsPeer::CUEIN)) $criteria->add(CcPlaylistcontentsPeer::CUEIN, $this->cuein); + if ($this->isColumnModified(CcPlaylistcontentsPeer::CUEOUT)) $criteria->add(CcPlaylistcontentsPeer::CUEOUT, $this->cueout); + if ($this->isColumnModified(CcPlaylistcontentsPeer::FADEIN)) $criteria->add(CcPlaylistcontentsPeer::FADEIN, $this->fadein); + if ($this->isColumnModified(CcPlaylistcontentsPeer::FADEOUT)) $criteria->add(CcPlaylistcontentsPeer::FADEOUT, $this->fadeout); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcPlaylistcontentsPeer::DATABASE_NAME); + $criteria->add(CcPlaylistcontentsPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcPlaylistcontents (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbPlaylistId($this->getDbPlaylistId()); + $copyObj->setDbFileId($this->getDbFileId()); + $copyObj->setDbBlockId($this->getDbBlockId()); + $copyObj->setDbStreamId($this->getDbStreamId()); + $copyObj->setDbType($this->getDbType()); + $copyObj->setDbPosition($this->getDbPosition()); + $copyObj->setDbTrackOffset($this->getDbTrackOffset()); + $copyObj->setDbCliplength($this->getDbCliplength()); + $copyObj->setDbCuein($this->getDbCuein()); + $copyObj->setDbCueout($this->getDbCueout()); + $copyObj->setDbFadein($this->getDbFadein()); + $copyObj->setDbFadeout($this->getDbFadeout()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcPlaylistcontents Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcPlaylistcontentsPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcPlaylistcontentsPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcFiles object. + * + * @param CcFiles $v + * @return CcPlaylistcontents The current object (for fluent API support) + * @throws PropelException + */ + public function setCcFiles(CcFiles $v = null) + { + if ($v === null) { + $this->setDbFileId(NULL); + } else { + $this->setDbFileId($v->getDbId()); + } + + $this->aCcFiles = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcFiles object, it will not be re-added. + if ($v !== null) { + $v->addCcPlaylistcontents($this); + } + + + return $this; + } + + + /** + * Get the associated CcFiles object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcFiles The associated CcFiles object. + * @throws PropelException + */ + public function getCcFiles(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcFiles === null && ($this->file_id !== null) && $doQuery) { + $this->aCcFiles = CcFilesQuery::create()->findPk($this->file_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcFiles->addCcPlaylistcontentss($this); + */ + } + + return $this->aCcFiles; + } + + /** + * Declares an association between this object and a CcBlock object. + * + * @param CcBlock $v + * @return CcPlaylistcontents The current object (for fluent API support) + * @throws PropelException + */ + public function setCcBlock(CcBlock $v = null) + { + if ($v === null) { + $this->setDbBlockId(NULL); + } else { + $this->setDbBlockId($v->getDbId()); + } + + $this->aCcBlock = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcBlock object, it will not be re-added. + if ($v !== null) { + $v->addCcPlaylistcontents($this); + } + + + return $this; + } + + + /** + * Get the associated CcBlock object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcBlock The associated CcBlock object. + * @throws PropelException + */ + public function getCcBlock(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcBlock === null && ($this->block_id !== null) && $doQuery) { + $this->aCcBlock = CcBlockQuery::create()->findPk($this->block_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcBlock->addCcPlaylistcontentss($this); + */ + } + + return $this->aCcBlock; + } + + /** + * Declares an association between this object and a CcPlaylist object. + * + * @param CcPlaylist $v + * @return CcPlaylistcontents The current object (for fluent API support) + * @throws PropelException + */ + public function setCcPlaylist(CcPlaylist $v = null) + { + // aggregate_column_relation behavior + if (null !== $this->aCcPlaylist && $v !== $this->aCcPlaylist) { + $this->oldCcPlaylist = $this->aCcPlaylist; + } + if ($v === null) { + $this->setDbPlaylistId(NULL); + } else { + $this->setDbPlaylistId($v->getDbId()); + } + + $this->aCcPlaylist = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcPlaylist object, it will not be re-added. + if ($v !== null) { + $v->addCcPlaylistcontents($this); + } + + + return $this; + } + + + /** + * Get the associated CcPlaylist object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcPlaylist The associated CcPlaylist object. + * @throws PropelException + */ + public function getCcPlaylist(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcPlaylist === null && ($this->playlist_id !== null) && $doQuery) { + $this->aCcPlaylist = CcPlaylistQuery::create()->findPk($this->playlist_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcPlaylist->addCcPlaylistcontentss($this); + */ + } + + return $this->aCcPlaylist; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->playlist_id = null; + $this->file_id = null; + $this->block_id = null; + $this->stream_id = null; + $this->type = null; + $this->position = null; + $this->trackoffset = null; + $this->cliplength = null; + $this->cuein = null; + $this->cueout = null; + $this->fadein = null; + $this->fadeout = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcFiles instanceof Persistent) { + $this->aCcFiles->clearAllReferences($deep); + } + if ($this->aCcBlock instanceof Persistent) { + $this->aCcBlock->clearAllReferences($deep); + } + if ($this->aCcPlaylist instanceof Persistent) { + $this->aCcPlaylist->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcFiles = null; + $this->aCcBlock = null; + $this->aCcPlaylist = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcPlaylistcontentsPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + + // aggregate_column_relation behavior + + /** + * Update the aggregate column in the related CcPlaylist object + * + * @param PropelPDO $con A connection object + */ + protected function updateRelatedCcPlaylist(PropelPDO $con) + { + if ($ccPlaylist = $this->getCcPlaylist()) { + if (!$ccPlaylist->isAlreadyInSave()) { + $ccPlaylist->updateDbLength($con); + } + } + if ($this->oldCcPlaylist) { + $this->oldCcPlaylist->updateDbLength($con); + $this->oldCcPlaylist = null; + } + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontentsPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontentsPeer.php index 0e23f44c36..5f55d962f8 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontentsPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontentsPeer.php @@ -4,1750 +4,1786 @@ /** * Base static class for performing query and update operations on the 'cc_playlistcontents' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcPlaylistcontentsPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_playlistcontents'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcPlaylistcontents'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcPlaylistcontents'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcPlaylistcontentsTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 13; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_playlistcontents.ID'; - - /** the column name for the PLAYLIST_ID field */ - const PLAYLIST_ID = 'cc_playlistcontents.PLAYLIST_ID'; - - /** the column name for the FILE_ID field */ - const FILE_ID = 'cc_playlistcontents.FILE_ID'; - - /** the column name for the BLOCK_ID field */ - const BLOCK_ID = 'cc_playlistcontents.BLOCK_ID'; - - /** the column name for the STREAM_ID field */ - const STREAM_ID = 'cc_playlistcontents.STREAM_ID'; - - /** the column name for the TYPE field */ - const TYPE = 'cc_playlistcontents.TYPE'; - - /** the column name for the POSITION field */ - const POSITION = 'cc_playlistcontents.POSITION'; - - /** the column name for the TRACKOFFSET field */ - const TRACKOFFSET = 'cc_playlistcontents.TRACKOFFSET'; - - /** the column name for the CLIPLENGTH field */ - const CLIPLENGTH = 'cc_playlistcontents.CLIPLENGTH'; - - /** the column name for the CUEIN field */ - const CUEIN = 'cc_playlistcontents.CUEIN'; - - /** the column name for the CUEOUT field */ - const CUEOUT = 'cc_playlistcontents.CUEOUT'; - - /** the column name for the FADEIN field */ - const FADEIN = 'cc_playlistcontents.FADEIN'; - - /** the column name for the FADEOUT field */ - const FADEOUT = 'cc_playlistcontents.FADEOUT'; - - /** - * An identiy map to hold any loaded instances of CcPlaylistcontents objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcPlaylistcontents[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbPlaylistId', 'DbFileId', 'DbBlockId', 'DbStreamId', 'DbType', 'DbPosition', 'DbTrackOffset', 'DbCliplength', 'DbCuein', 'DbCueout', 'DbFadein', 'DbFadeout', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbPlaylistId', 'dbFileId', 'dbBlockId', 'dbStreamId', 'dbType', 'dbPosition', 'dbTrackOffset', 'dbCliplength', 'dbCuein', 'dbCueout', 'dbFadein', 'dbFadeout', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::PLAYLIST_ID, self::FILE_ID, self::BLOCK_ID, self::STREAM_ID, self::TYPE, self::POSITION, self::TRACKOFFSET, self::CLIPLENGTH, self::CUEIN, self::CUEOUT, self::FADEIN, self::FADEOUT, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'PLAYLIST_ID', 'FILE_ID', 'BLOCK_ID', 'STREAM_ID', 'TYPE', 'POSITION', 'TRACKOFFSET', 'CLIPLENGTH', 'CUEIN', 'CUEOUT', 'FADEIN', 'FADEOUT', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'playlist_id', 'file_id', 'block_id', 'stream_id', 'type', 'position', 'trackoffset', 'cliplength', 'cuein', 'cueout', 'fadein', 'fadeout', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbPlaylistId' => 1, 'DbFileId' => 2, 'DbBlockId' => 3, 'DbStreamId' => 4, 'DbType' => 5, 'DbPosition' => 6, 'DbTrackOffset' => 7, 'DbCliplength' => 8, 'DbCuein' => 9, 'DbCueout' => 10, 'DbFadein' => 11, 'DbFadeout' => 12, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbPlaylistId' => 1, 'dbFileId' => 2, 'dbBlockId' => 3, 'dbStreamId' => 4, 'dbType' => 5, 'dbPosition' => 6, 'dbTrackOffset' => 7, 'dbCliplength' => 8, 'dbCuein' => 9, 'dbCueout' => 10, 'dbFadein' => 11, 'dbFadeout' => 12, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::PLAYLIST_ID => 1, self::FILE_ID => 2, self::BLOCK_ID => 3, self::STREAM_ID => 4, self::TYPE => 5, self::POSITION => 6, self::TRACKOFFSET => 7, self::CLIPLENGTH => 8, self::CUEIN => 9, self::CUEOUT => 10, self::FADEIN => 11, self::FADEOUT => 12, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'PLAYLIST_ID' => 1, 'FILE_ID' => 2, 'BLOCK_ID' => 3, 'STREAM_ID' => 4, 'TYPE' => 5, 'POSITION' => 6, 'TRACKOFFSET' => 7, 'CLIPLENGTH' => 8, 'CUEIN' => 9, 'CUEOUT' => 10, 'FADEIN' => 11, 'FADEOUT' => 12, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'playlist_id' => 1, 'file_id' => 2, 'block_id' => 3, 'stream_id' => 4, 'type' => 5, 'position' => 6, 'trackoffset' => 7, 'cliplength' => 8, 'cuein' => 9, 'cueout' => 10, 'fadein' => 11, 'fadeout' => 12, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcPlaylistcontentsPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcPlaylistcontentsPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcPlaylistcontentsPeer::ID); - $criteria->addSelectColumn(CcPlaylistcontentsPeer::PLAYLIST_ID); - $criteria->addSelectColumn(CcPlaylistcontentsPeer::FILE_ID); - $criteria->addSelectColumn(CcPlaylistcontentsPeer::BLOCK_ID); - $criteria->addSelectColumn(CcPlaylistcontentsPeer::STREAM_ID); - $criteria->addSelectColumn(CcPlaylistcontentsPeer::TYPE); - $criteria->addSelectColumn(CcPlaylistcontentsPeer::POSITION); - $criteria->addSelectColumn(CcPlaylistcontentsPeer::TRACKOFFSET); - $criteria->addSelectColumn(CcPlaylistcontentsPeer::CLIPLENGTH); - $criteria->addSelectColumn(CcPlaylistcontentsPeer::CUEIN); - $criteria->addSelectColumn(CcPlaylistcontentsPeer::CUEOUT); - $criteria->addSelectColumn(CcPlaylistcontentsPeer::FADEIN); - $criteria->addSelectColumn(CcPlaylistcontentsPeer::FADEOUT); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.PLAYLIST_ID'); - $criteria->addSelectColumn($alias . '.FILE_ID'); - $criteria->addSelectColumn($alias . '.BLOCK_ID'); - $criteria->addSelectColumn($alias . '.STREAM_ID'); - $criteria->addSelectColumn($alias . '.TYPE'); - $criteria->addSelectColumn($alias . '.POSITION'); - $criteria->addSelectColumn($alias . '.TRACKOFFSET'); - $criteria->addSelectColumn($alias . '.CLIPLENGTH'); - $criteria->addSelectColumn($alias . '.CUEIN'); - $criteria->addSelectColumn($alias . '.CUEOUT'); - $criteria->addSelectColumn($alias . '.FADEIN'); - $criteria->addSelectColumn($alias . '.FADEOUT'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlaylistcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcPlaylistcontents - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcPlaylistcontentsPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcPlaylistcontentsPeer::populateObjects(CcPlaylistcontentsPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcPlaylistcontentsPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcPlaylistcontents $value A CcPlaylistcontents object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcPlaylistcontents $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcPlaylistcontents object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcPlaylistcontents) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPlaylistcontents object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcPlaylistcontents Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_playlistcontents - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcPlaylistcontentsPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcPlaylistcontentsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcPlaylistcontentsPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcPlaylistcontents object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcPlaylistcontentsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcPlaylistcontentsPeer::NUM_COLUMNS; - } else { - $cls = CcPlaylistcontentsPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcPlaylistcontentsPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcFiles table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlaylistcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcBlock table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcBlock(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlaylistcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcPlaylist table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcPlaylist(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlaylistcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcPlaylistcontents objects pre-filled with their CcFiles objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlaylistcontents objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlaylistcontentsPeer::addSelectColumns($criteria); - $startcol = (CcPlaylistcontentsPeer::NUM_COLUMNS - CcPlaylistcontentsPeer::NUM_LAZY_LOAD_COLUMNS); - CcFilesPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcPlaylistcontentsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcPlaylistcontents) to $obj2 (CcFiles) - $obj2->addCcPlaylistcontents($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcPlaylistcontents objects pre-filled with their CcBlock objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlaylistcontents objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcBlock(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlaylistcontentsPeer::addSelectColumns($criteria); - $startcol = (CcPlaylistcontentsPeer::NUM_COLUMNS - CcPlaylistcontentsPeer::NUM_LAZY_LOAD_COLUMNS); - CcBlockPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcPlaylistcontentsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcBlockPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcBlockPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcBlockPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcPlaylistcontents) to $obj2 (CcBlock) - $obj2->addCcPlaylistcontents($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcPlaylistcontents objects pre-filled with their CcPlaylist objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlaylistcontents objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcPlaylist(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlaylistcontentsPeer::addSelectColumns($criteria); - $startcol = (CcPlaylistcontentsPeer::NUM_COLUMNS - CcPlaylistcontentsPeer::NUM_LAZY_LOAD_COLUMNS); - CcPlaylistPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcPlaylistcontentsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcPlaylistPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcPlaylistPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcPlaylistPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcPlaylistcontents) to $obj2 (CcPlaylist) - $obj2->addCcPlaylistcontents($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlaylistcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcPlaylistcontents objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlaylistcontents objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlaylistcontentsPeer::addSelectColumns($criteria); - $startcol2 = (CcPlaylistcontentsPeer::NUM_COLUMNS - CcPlaylistcontentsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcFilesPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcBlockPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcBlockPeer::NUM_COLUMNS - CcBlockPeer::NUM_LAZY_LOAD_COLUMNS); - - CcPlaylistPeer::addSelectColumns($criteria); - $startcol5 = $startcol4 + (CcPlaylistPeer::NUM_COLUMNS - CcPlaylistPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcPlaylistcontentsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcFiles rows - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcPlaylistcontents) to the collection in $obj2 (CcFiles) - $obj2->addCcPlaylistcontents($obj1); - } // if joined row not null - - // Add objects for joined CcBlock rows - - $key3 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcBlockPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcBlockPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcBlockPeer::addInstanceToPool($obj3, $key3); - } // if obj3 loaded - - // Add the $obj1 (CcPlaylistcontents) to the collection in $obj3 (CcBlock) - $obj3->addCcPlaylistcontents($obj1); - } // if joined row not null - - // Add objects for joined CcPlaylist rows - - $key4 = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, $startcol4); - if ($key4 !== null) { - $obj4 = CcPlaylistPeer::getInstanceFromPool($key4); - if (!$obj4) { - - $cls = CcPlaylistPeer::getOMClass(false); - - $obj4 = new $cls(); - $obj4->hydrate($row, $startcol4); - CcPlaylistPeer::addInstanceToPool($obj4, $key4); - } // if obj4 loaded - - // Add the $obj1 (CcPlaylistcontents) to the collection in $obj4 (CcPlaylist) - $obj4->addCcPlaylistcontents($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcFiles table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlaylistcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcBlock table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcBlock(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlaylistcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcPlaylist table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcPlaylist(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlaylistcontentsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcPlaylistcontents objects pre-filled with all related objects except CcFiles. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlaylistcontents objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlaylistcontentsPeer::addSelectColumns($criteria); - $startcol2 = (CcPlaylistcontentsPeer::NUM_COLUMNS - CcPlaylistcontentsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcBlockPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcBlockPeer::NUM_COLUMNS - CcBlockPeer::NUM_LAZY_LOAD_COLUMNS); - - CcPlaylistPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcPlaylistPeer::NUM_COLUMNS - CcPlaylistPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcPlaylistcontentsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcBlock rows - - $key2 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcBlockPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcBlockPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcBlockPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcPlaylistcontents) to the collection in $obj2 (CcBlock) - $obj2->addCcPlaylistcontents($obj1); - - } // if joined row is not null - - // Add objects for joined CcPlaylist rows - - $key3 = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcPlaylistPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcPlaylistPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcPlaylistPeer::addInstanceToPool($obj3, $key3); - } // if $obj3 already loaded - - // Add the $obj1 (CcPlaylistcontents) to the collection in $obj3 (CcPlaylist) - $obj3->addCcPlaylistcontents($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcPlaylistcontents objects pre-filled with all related objects except CcBlock. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlaylistcontents objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcBlock(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlaylistcontentsPeer::addSelectColumns($criteria); - $startcol2 = (CcPlaylistcontentsPeer::NUM_COLUMNS - CcPlaylistcontentsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcFilesPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcPlaylistPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcPlaylistPeer::NUM_COLUMNS - CcPlaylistPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); +abstract class BaseCcPlaylistcontentsPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_playlistcontents'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcPlaylistcontents'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcPlaylistcontentsTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 13; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 13; + + /** the column name for the id field */ + const ID = 'cc_playlistcontents.id'; + + /** the column name for the playlist_id field */ + const PLAYLIST_ID = 'cc_playlistcontents.playlist_id'; + + /** the column name for the file_id field */ + const FILE_ID = 'cc_playlistcontents.file_id'; + + /** the column name for the block_id field */ + const BLOCK_ID = 'cc_playlistcontents.block_id'; + + /** the column name for the stream_id field */ + const STREAM_ID = 'cc_playlistcontents.stream_id'; + + /** the column name for the type field */ + const TYPE = 'cc_playlistcontents.type'; + + /** the column name for the position field */ + const POSITION = 'cc_playlistcontents.position'; + + /** the column name for the trackoffset field */ + const TRACKOFFSET = 'cc_playlistcontents.trackoffset'; + + /** the column name for the cliplength field */ + const CLIPLENGTH = 'cc_playlistcontents.cliplength'; + + /** the column name for the cuein field */ + const CUEIN = 'cc_playlistcontents.cuein'; + + /** the column name for the cueout field */ + const CUEOUT = 'cc_playlistcontents.cueout'; + + /** the column name for the fadein field */ + const FADEIN = 'cc_playlistcontents.fadein'; + + /** the column name for the fadeout field */ + const FADEOUT = 'cc_playlistcontents.fadeout'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcPlaylistcontents objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcPlaylistcontents[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcPlaylistcontentsPeer::$fieldNames[CcPlaylistcontentsPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbPlaylistId', 'DbFileId', 'DbBlockId', 'DbStreamId', 'DbType', 'DbPosition', 'DbTrackOffset', 'DbCliplength', 'DbCuein', 'DbCueout', 'DbFadein', 'DbFadeout', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbPlaylistId', 'dbFileId', 'dbBlockId', 'dbStreamId', 'dbType', 'dbPosition', 'dbTrackOffset', 'dbCliplength', 'dbCuein', 'dbCueout', 'dbFadein', 'dbFadeout', ), + BasePeer::TYPE_COLNAME => array (CcPlaylistcontentsPeer::ID, CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistcontentsPeer::FILE_ID, CcPlaylistcontentsPeer::BLOCK_ID, CcPlaylistcontentsPeer::STREAM_ID, CcPlaylistcontentsPeer::TYPE, CcPlaylistcontentsPeer::POSITION, CcPlaylistcontentsPeer::TRACKOFFSET, CcPlaylistcontentsPeer::CLIPLENGTH, CcPlaylistcontentsPeer::CUEIN, CcPlaylistcontentsPeer::CUEOUT, CcPlaylistcontentsPeer::FADEIN, CcPlaylistcontentsPeer::FADEOUT, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'PLAYLIST_ID', 'FILE_ID', 'BLOCK_ID', 'STREAM_ID', 'TYPE', 'POSITION', 'TRACKOFFSET', 'CLIPLENGTH', 'CUEIN', 'CUEOUT', 'FADEIN', 'FADEOUT', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'playlist_id', 'file_id', 'block_id', 'stream_id', 'type', 'position', 'trackoffset', 'cliplength', 'cuein', 'cueout', 'fadein', 'fadeout', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcPlaylistcontentsPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbPlaylistId' => 1, 'DbFileId' => 2, 'DbBlockId' => 3, 'DbStreamId' => 4, 'DbType' => 5, 'DbPosition' => 6, 'DbTrackOffset' => 7, 'DbCliplength' => 8, 'DbCuein' => 9, 'DbCueout' => 10, 'DbFadein' => 11, 'DbFadeout' => 12, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbPlaylistId' => 1, 'dbFileId' => 2, 'dbBlockId' => 3, 'dbStreamId' => 4, 'dbType' => 5, 'dbPosition' => 6, 'dbTrackOffset' => 7, 'dbCliplength' => 8, 'dbCuein' => 9, 'dbCueout' => 10, 'dbFadein' => 11, 'dbFadeout' => 12, ), + BasePeer::TYPE_COLNAME => array (CcPlaylistcontentsPeer::ID => 0, CcPlaylistcontentsPeer::PLAYLIST_ID => 1, CcPlaylistcontentsPeer::FILE_ID => 2, CcPlaylistcontentsPeer::BLOCK_ID => 3, CcPlaylistcontentsPeer::STREAM_ID => 4, CcPlaylistcontentsPeer::TYPE => 5, CcPlaylistcontentsPeer::POSITION => 6, CcPlaylistcontentsPeer::TRACKOFFSET => 7, CcPlaylistcontentsPeer::CLIPLENGTH => 8, CcPlaylistcontentsPeer::CUEIN => 9, CcPlaylistcontentsPeer::CUEOUT => 10, CcPlaylistcontentsPeer::FADEIN => 11, CcPlaylistcontentsPeer::FADEOUT => 12, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'PLAYLIST_ID' => 1, 'FILE_ID' => 2, 'BLOCK_ID' => 3, 'STREAM_ID' => 4, 'TYPE' => 5, 'POSITION' => 6, 'TRACKOFFSET' => 7, 'CLIPLENGTH' => 8, 'CUEIN' => 9, 'CUEOUT' => 10, 'FADEIN' => 11, 'FADEOUT' => 12, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'playlist_id' => 1, 'file_id' => 2, 'block_id' => 3, 'stream_id' => 4, 'type' => 5, 'position' => 6, 'trackoffset' => 7, 'cliplength' => 8, 'cuein' => 9, 'cueout' => 10, 'fadein' => 11, 'fadeout' => 12, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcPlaylistcontentsPeer::getFieldNames($toType); + $key = isset(CcPlaylistcontentsPeer::$fieldKeys[$fromType][$name]) ? CcPlaylistcontentsPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcPlaylistcontentsPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcPlaylistcontentsPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcPlaylistcontentsPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcPlaylistcontentsPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcPlaylistcontentsPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcPlaylistcontentsPeer::ID); + $criteria->addSelectColumn(CcPlaylistcontentsPeer::PLAYLIST_ID); + $criteria->addSelectColumn(CcPlaylistcontentsPeer::FILE_ID); + $criteria->addSelectColumn(CcPlaylistcontentsPeer::BLOCK_ID); + $criteria->addSelectColumn(CcPlaylistcontentsPeer::STREAM_ID); + $criteria->addSelectColumn(CcPlaylistcontentsPeer::TYPE); + $criteria->addSelectColumn(CcPlaylistcontentsPeer::POSITION); + $criteria->addSelectColumn(CcPlaylistcontentsPeer::TRACKOFFSET); + $criteria->addSelectColumn(CcPlaylistcontentsPeer::CLIPLENGTH); + $criteria->addSelectColumn(CcPlaylistcontentsPeer::CUEIN); + $criteria->addSelectColumn(CcPlaylistcontentsPeer::CUEOUT); + $criteria->addSelectColumn(CcPlaylistcontentsPeer::FADEIN); + $criteria->addSelectColumn(CcPlaylistcontentsPeer::FADEOUT); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.playlist_id'); + $criteria->addSelectColumn($alias . '.file_id'); + $criteria->addSelectColumn($alias . '.block_id'); + $criteria->addSelectColumn($alias . '.stream_id'); + $criteria->addSelectColumn($alias . '.type'); + $criteria->addSelectColumn($alias . '.position'); + $criteria->addSelectColumn($alias . '.trackoffset'); + $criteria->addSelectColumn($alias . '.cliplength'); + $criteria->addSelectColumn($alias . '.cuein'); + $criteria->addSelectColumn($alias . '.cueout'); + $criteria->addSelectColumn($alias . '.fadein'); + $criteria->addSelectColumn($alias . '.fadeout'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlaylistcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcPlaylistcontents + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcPlaylistcontentsPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcPlaylistcontentsPeer::populateObjects(CcPlaylistcontentsPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcPlaylistcontentsPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcPlaylistcontents $obj A CcPlaylistcontents object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcPlaylistcontentsPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcPlaylistcontents object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcPlaylistcontents) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPlaylistcontents object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcPlaylistcontentsPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcPlaylistcontents Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcPlaylistcontentsPeer::$instances[$key])) { + return CcPlaylistcontentsPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcPlaylistcontentsPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcPlaylistcontentsPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_playlistcontents + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcPlaylistcontentsPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcPlaylistcontentsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcPlaylistcontentsPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcPlaylistcontents object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcPlaylistcontentsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcPlaylistcontentsPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcPlaylistcontentsPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcPlaylistcontentsPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcFiles table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlaylistcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcBlock table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcBlock(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlaylistcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcPlaylist table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcPlaylist(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlaylistcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcPlaylistcontents objects pre-filled with their CcFiles objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlaylistcontents objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + } + + CcPlaylistcontentsPeer::addSelectColumns($criteria); + $startcol = CcPlaylistcontentsPeer::NUM_HYDRATE_COLUMNS; + CcFilesPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcPlaylistcontentsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcPlaylistcontents) to $obj2 (CcFiles) + $obj2->addCcPlaylistcontents($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcPlaylistcontents objects pre-filled with their CcBlock objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlaylistcontents objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcBlock(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + } + + CcPlaylistcontentsPeer::addSelectColumns($criteria); + $startcol = CcPlaylistcontentsPeer::NUM_HYDRATE_COLUMNS; + CcBlockPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcPlaylistcontentsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcBlockPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcBlockPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcBlockPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcPlaylistcontents) to $obj2 (CcBlock) + $obj2->addCcPlaylistcontents($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcPlaylistcontents objects pre-filled with their CcPlaylist objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlaylistcontents objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcPlaylist(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + } + + CcPlaylistcontentsPeer::addSelectColumns($criteria); + $startcol = CcPlaylistcontentsPeer::NUM_HYDRATE_COLUMNS; + CcPlaylistPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcPlaylistcontentsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcPlaylistPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcPlaylistPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcPlaylistPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcPlaylistcontents) to $obj2 (CcPlaylist) + $obj2->addCcPlaylistcontents($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlaylistcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcPlaylistcontents objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlaylistcontents objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + } + + CcPlaylistcontentsPeer::addSelectColumns($criteria); + $startcol2 = CcPlaylistcontentsPeer::NUM_HYDRATE_COLUMNS; + + CcFilesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + + CcBlockPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcBlockPeer::NUM_HYDRATE_COLUMNS; + + CcPlaylistPeer::addSelectColumns($criteria); + $startcol5 = $startcol4 + CcPlaylistPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcPlaylistcontentsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcFiles rows + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcPlaylistcontents) to the collection in $obj2 (CcFiles) + $obj2->addCcPlaylistcontents($obj1); + } // if joined row not null + + // Add objects for joined CcBlock rows + + $key3 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcBlockPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcBlockPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcBlockPeer::addInstanceToPool($obj3, $key3); + } // if obj3 loaded + + // Add the $obj1 (CcPlaylistcontents) to the collection in $obj3 (CcBlock) + $obj3->addCcPlaylistcontents($obj1); + } // if joined row not null + + // Add objects for joined CcPlaylist rows + + $key4 = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, $startcol4); + if ($key4 !== null) { + $obj4 = CcPlaylistPeer::getInstanceFromPool($key4); + if (!$obj4) { + + $cls = CcPlaylistPeer::getOMClass(); + + $obj4 = new $cls(); + $obj4->hydrate($row, $startcol4); + CcPlaylistPeer::addInstanceToPool($obj4, $key4); + } // if obj4 loaded + + // Add the $obj1 (CcPlaylistcontents) to the collection in $obj4 (CcPlaylist) + $obj4->addCcPlaylistcontents($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcFiles table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlaylistcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcBlock table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcBlock(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlaylistcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcPlaylist table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcPlaylist(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlaylistcontentsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcPlaylistcontents objects pre-filled with all related objects except CcFiles. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlaylistcontents objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + } + + CcPlaylistcontentsPeer::addSelectColumns($criteria); + $startcol2 = CcPlaylistcontentsPeer::NUM_HYDRATE_COLUMNS; + + CcBlockPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcBlockPeer::NUM_HYDRATE_COLUMNS; + + CcPlaylistPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcPlaylistPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcPlaylistcontentsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcBlock rows + + $key2 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcBlockPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcBlockPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcBlockPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcPlaylistcontents) to the collection in $obj2 (CcBlock) + $obj2->addCcPlaylistcontents($obj1); + + } // if joined row is not null + + // Add objects for joined CcPlaylist rows + + $key3 = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcPlaylistPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcPlaylistPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcPlaylistPeer::addInstanceToPool($obj3, $key3); + } // if $obj3 already loaded + + // Add the $obj1 (CcPlaylistcontents) to the collection in $obj3 (CcPlaylist) + $obj3->addCcPlaylistcontents($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcPlaylistcontents objects pre-filled with all related objects except CcBlock. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlaylistcontents objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcBlock(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + } + + CcPlaylistcontentsPeer::addSelectColumns($criteria); + $startcol2 = CcPlaylistcontentsPeer::NUM_HYDRATE_COLUMNS; + + CcFilesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + + CcPlaylistPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcPlaylistPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $criteria->addJoin(CcPlaylistcontentsPeer::PLAYLIST_ID, CcPlaylistPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcPlaylistcontentsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcFiles rows + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcPlaylistcontents) to the collection in $obj2 (CcFiles) + $obj2->addCcPlaylistcontents($obj1); + + } // if joined row is not null + + // Add objects for joined CcPlaylist rows + + $key3 = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcPlaylistPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcPlaylistPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcPlaylistPeer::addInstanceToPool($obj3, $key3); + } // if $obj3 already loaded + + // Add the $obj1 (CcPlaylistcontents) to the collection in $obj3 (CcPlaylist) + $obj3->addCcPlaylistcontents($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcPlaylistcontents objects pre-filled with all related objects except CcPlaylist. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlaylistcontents objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcPlaylist(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + } + + CcPlaylistcontentsPeer::addSelectColumns($criteria); + $startcol2 = CcPlaylistcontentsPeer::NUM_HYDRATE_COLUMNS; + + CcFilesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + CcBlockPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcBlockPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcPlaylistcontentsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcFiles rows - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcPlaylistcontents) to the collection in $obj2 (CcFiles) - $obj2->addCcPlaylistcontents($obj1); - - } // if joined row is not null - - // Add objects for joined CcPlaylist rows - - $key3 = CcPlaylistPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcPlaylistPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcPlaylistPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcPlaylistPeer::addInstanceToPool($obj3, $key3); - } // if $obj3 already loaded - - // Add the $obj1 (CcPlaylistcontents) to the collection in $obj3 (CcPlaylist) - $obj3->addCcPlaylistcontents($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcPlaylistcontents objects pre-filled with all related objects except CcPlaylist. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlaylistcontents objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcPlaylist(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlaylistcontentsPeer::addSelectColumns($criteria); - $startcol2 = (CcPlaylistcontentsPeer::NUM_COLUMNS - CcPlaylistcontentsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcFilesPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcBlockPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcBlockPeer::NUM_COLUMNS - CcBlockPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcPlaylistcontentsPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcPlaylistcontentsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcFiles rows - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcPlaylistcontents) to the collection in $obj2 (CcFiles) - $obj2->addCcPlaylistcontents($obj1); - - } // if joined row is not null - - // Add objects for joined CcBlock rows - - $key3 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcBlockPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcBlockPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcBlockPeer::addInstanceToPool($obj3, $key3); - } // if $obj3 already loaded - - // Add the $obj1 (CcPlaylistcontents) to the collection in $obj3 (CcBlock) - $obj3->addCcPlaylistcontents($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcPlaylistcontentsPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcPlaylistcontentsPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcPlaylistcontentsTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcPlaylistcontentsPeer::CLASS_DEFAULT : CcPlaylistcontentsPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcPlaylistcontents or Criteria object. - * - * @param mixed $values Criteria or CcPlaylistcontents object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcPlaylistcontents object - } - - if ($criteria->containsKey(CcPlaylistcontentsPeer::ID) && $criteria->keyContainsValue(CcPlaylistcontentsPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlaylistcontentsPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcPlaylistcontents or Criteria object. - * - * @param mixed $values Criteria or CcPlaylistcontents object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcPlaylistcontentsPeer::ID); - $value = $criteria->remove(CcPlaylistcontentsPeer::ID); - if ($value) { - $selectCriteria->add(CcPlaylistcontentsPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); - } - - } else { // $values is CcPlaylistcontents object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_playlistcontents table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcPlaylistcontentsPeer::TABLE_NAME, $con, CcPlaylistcontentsPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcPlaylistcontentsPeer::clearInstancePool(); - CcPlaylistcontentsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcPlaylistcontents or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcPlaylistcontents object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcPlaylistcontentsPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcPlaylistcontents) { // it's a model object - // invalidate the cache for this single object - CcPlaylistcontentsPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcPlaylistcontentsPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcPlaylistcontentsPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcPlaylistcontentsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcPlaylistcontents object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcPlaylistcontents $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcPlaylistcontents $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcPlaylistcontentsPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcPlaylistcontentsPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcPlaylistcontentsPeer::DATABASE_NAME, CcPlaylistcontentsPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcPlaylistcontents - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcPlaylistcontentsPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcPlaylistcontentsPeer::DATABASE_NAME); - $criteria->add(CcPlaylistcontentsPeer::ID, $pk); - - $v = CcPlaylistcontentsPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcPlaylistcontentsPeer::DATABASE_NAME); - $criteria->add(CcPlaylistcontentsPeer::ID, $pks, Criteria::IN); - $objs = CcPlaylistcontentsPeer::doSelect($criteria, $con); - } - return $objs; - } + $criteria->addJoin(CcPlaylistcontentsPeer::BLOCK_ID, CcBlockPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlaylistcontentsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlaylistcontentsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcPlaylistcontentsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlaylistcontentsPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcFiles rows + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcPlaylistcontents) to the collection in $obj2 (CcFiles) + $obj2->addCcPlaylistcontents($obj1); + + } // if joined row is not null + + // Add objects for joined CcBlock rows + + $key3 = CcBlockPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcBlockPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcBlockPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcBlockPeer::addInstanceToPool($obj3, $key3); + } // if $obj3 already loaded + + // Add the $obj1 (CcPlaylistcontents) to the collection in $obj3 (CcBlock) + $obj3->addCcPlaylistcontents($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcPlaylistcontentsPeer::DATABASE_NAME)->getTable(CcPlaylistcontentsPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcPlaylistcontentsPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcPlaylistcontentsPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcPlaylistcontentsTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcPlaylistcontentsPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcPlaylistcontents or Criteria object. + * + * @param mixed $values Criteria or CcPlaylistcontents object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcPlaylistcontents object + } + + if ($criteria->containsKey(CcPlaylistcontentsPeer::ID) && $criteria->keyContainsValue(CcPlaylistcontentsPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlaylistcontentsPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcPlaylistcontents or Criteria object. + * + * @param mixed $values Criteria or CcPlaylistcontents object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcPlaylistcontentsPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcPlaylistcontentsPeer::ID); + $value = $criteria->remove(CcPlaylistcontentsPeer::ID); + if ($value) { + $selectCriteria->add(CcPlaylistcontentsPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcPlaylistcontentsPeer::TABLE_NAME); + } + + } else { // $values is CcPlaylistcontents object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_playlistcontents table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcPlaylistcontentsPeer::TABLE_NAME, $con, CcPlaylistcontentsPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcPlaylistcontentsPeer::clearInstancePool(); + CcPlaylistcontentsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcPlaylistcontents or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcPlaylistcontents object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcPlaylistcontentsPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcPlaylistcontents) { // it's a model object + // invalidate the cache for this single object + CcPlaylistcontentsPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcPlaylistcontentsPeer::DATABASE_NAME); + $criteria->add(CcPlaylistcontentsPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcPlaylistcontentsPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcPlaylistcontentsPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcPlaylistcontentsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcPlaylistcontents object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcPlaylistcontents $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcPlaylistcontentsPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcPlaylistcontentsPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcPlaylistcontentsPeer::DATABASE_NAME, CcPlaylistcontentsPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcPlaylistcontents + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcPlaylistcontentsPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcPlaylistcontentsPeer::DATABASE_NAME); + $criteria->add(CcPlaylistcontentsPeer::ID, $pk); + + $v = CcPlaylistcontentsPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcPlaylistcontents[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcPlaylistcontentsPeer::DATABASE_NAME); + $criteria->add(CcPlaylistcontentsPeer::ID, $pks, Criteria::IN); + $objs = CcPlaylistcontentsPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcPlaylistcontentsPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontentsQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontentsQuery.php index ef3d3877a2..ea0aaaec61 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontentsQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontentsQuery.php @@ -4,845 +4,1120 @@ /** * Base class that represents a query for the 'cc_playlistcontents' table. * - * * - * @method CcPlaylistcontentsQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcPlaylistcontentsQuery orderByDbPlaylistId($order = Criteria::ASC) Order by the playlist_id column - * @method CcPlaylistcontentsQuery orderByDbFileId($order = Criteria::ASC) Order by the file_id column - * @method CcPlaylistcontentsQuery orderByDbBlockId($order = Criteria::ASC) Order by the block_id column - * @method CcPlaylistcontentsQuery orderByDbStreamId($order = Criteria::ASC) Order by the stream_id column - * @method CcPlaylistcontentsQuery orderByDbType($order = Criteria::ASC) Order by the type column - * @method CcPlaylistcontentsQuery orderByDbPosition($order = Criteria::ASC) Order by the position column - * @method CcPlaylistcontentsQuery orderByDbTrackOffset($order = Criteria::ASC) Order by the trackoffset column - * @method CcPlaylistcontentsQuery orderByDbCliplength($order = Criteria::ASC) Order by the cliplength column - * @method CcPlaylistcontentsQuery orderByDbCuein($order = Criteria::ASC) Order by the cuein column - * @method CcPlaylistcontentsQuery orderByDbCueout($order = Criteria::ASC) Order by the cueout column - * @method CcPlaylistcontentsQuery orderByDbFadein($order = Criteria::ASC) Order by the fadein column - * @method CcPlaylistcontentsQuery orderByDbFadeout($order = Criteria::ASC) Order by the fadeout column * - * @method CcPlaylistcontentsQuery groupByDbId() Group by the id column - * @method CcPlaylistcontentsQuery groupByDbPlaylistId() Group by the playlist_id column - * @method CcPlaylistcontentsQuery groupByDbFileId() Group by the file_id column - * @method CcPlaylistcontentsQuery groupByDbBlockId() Group by the block_id column - * @method CcPlaylistcontentsQuery groupByDbStreamId() Group by the stream_id column - * @method CcPlaylistcontentsQuery groupByDbType() Group by the type column - * @method CcPlaylistcontentsQuery groupByDbPosition() Group by the position column - * @method CcPlaylistcontentsQuery groupByDbTrackOffset() Group by the trackoffset column - * @method CcPlaylistcontentsQuery groupByDbCliplength() Group by the cliplength column - * @method CcPlaylistcontentsQuery groupByDbCuein() Group by the cuein column - * @method CcPlaylistcontentsQuery groupByDbCueout() Group by the cueout column - * @method CcPlaylistcontentsQuery groupByDbFadein() Group by the fadein column - * @method CcPlaylistcontentsQuery groupByDbFadeout() Group by the fadeout column + * @method CcPlaylistcontentsQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcPlaylistcontentsQuery orderByDbPlaylistId($order = Criteria::ASC) Order by the playlist_id column + * @method CcPlaylistcontentsQuery orderByDbFileId($order = Criteria::ASC) Order by the file_id column + * @method CcPlaylistcontentsQuery orderByDbBlockId($order = Criteria::ASC) Order by the block_id column + * @method CcPlaylistcontentsQuery orderByDbStreamId($order = Criteria::ASC) Order by the stream_id column + * @method CcPlaylistcontentsQuery orderByDbType($order = Criteria::ASC) Order by the type column + * @method CcPlaylistcontentsQuery orderByDbPosition($order = Criteria::ASC) Order by the position column + * @method CcPlaylistcontentsQuery orderByDbTrackOffset($order = Criteria::ASC) Order by the trackoffset column + * @method CcPlaylistcontentsQuery orderByDbCliplength($order = Criteria::ASC) Order by the cliplength column + * @method CcPlaylistcontentsQuery orderByDbCuein($order = Criteria::ASC) Order by the cuein column + * @method CcPlaylistcontentsQuery orderByDbCueout($order = Criteria::ASC) Order by the cueout column + * @method CcPlaylistcontentsQuery orderByDbFadein($order = Criteria::ASC) Order by the fadein column + * @method CcPlaylistcontentsQuery orderByDbFadeout($order = Criteria::ASC) Order by the fadeout column * - * @method CcPlaylistcontentsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcPlaylistcontentsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcPlaylistcontentsQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcPlaylistcontentsQuery groupByDbId() Group by the id column + * @method CcPlaylistcontentsQuery groupByDbPlaylistId() Group by the playlist_id column + * @method CcPlaylistcontentsQuery groupByDbFileId() Group by the file_id column + * @method CcPlaylistcontentsQuery groupByDbBlockId() Group by the block_id column + * @method CcPlaylistcontentsQuery groupByDbStreamId() Group by the stream_id column + * @method CcPlaylistcontentsQuery groupByDbType() Group by the type column + * @method CcPlaylistcontentsQuery groupByDbPosition() Group by the position column + * @method CcPlaylistcontentsQuery groupByDbTrackOffset() Group by the trackoffset column + * @method CcPlaylistcontentsQuery groupByDbCliplength() Group by the cliplength column + * @method CcPlaylistcontentsQuery groupByDbCuein() Group by the cuein column + * @method CcPlaylistcontentsQuery groupByDbCueout() Group by the cueout column + * @method CcPlaylistcontentsQuery groupByDbFadein() Group by the fadein column + * @method CcPlaylistcontentsQuery groupByDbFadeout() Group by the fadeout column * - * @method CcPlaylistcontentsQuery leftJoinCcFiles($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcFiles relation - * @method CcPlaylistcontentsQuery rightJoinCcFiles($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcFiles relation - * @method CcPlaylistcontentsQuery innerJoinCcFiles($relationAlias = '') Adds a INNER JOIN clause to the query using the CcFiles relation + * @method CcPlaylistcontentsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcPlaylistcontentsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcPlaylistcontentsQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcPlaylistcontentsQuery leftJoinCcBlock($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcBlock relation - * @method CcPlaylistcontentsQuery rightJoinCcBlock($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcBlock relation - * @method CcPlaylistcontentsQuery innerJoinCcBlock($relationAlias = '') Adds a INNER JOIN clause to the query using the CcBlock relation + * @method CcPlaylistcontentsQuery leftJoinCcFiles($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcFiles relation + * @method CcPlaylistcontentsQuery rightJoinCcFiles($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcFiles relation + * @method CcPlaylistcontentsQuery innerJoinCcFiles($relationAlias = null) Adds a INNER JOIN clause to the query using the CcFiles relation * - * @method CcPlaylistcontentsQuery leftJoinCcPlaylist($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcPlaylist relation - * @method CcPlaylistcontentsQuery rightJoinCcPlaylist($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcPlaylist relation - * @method CcPlaylistcontentsQuery innerJoinCcPlaylist($relationAlias = '') Adds a INNER JOIN clause to the query using the CcPlaylist relation + * @method CcPlaylistcontentsQuery leftJoinCcBlock($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcBlock relation + * @method CcPlaylistcontentsQuery rightJoinCcBlock($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcBlock relation + * @method CcPlaylistcontentsQuery innerJoinCcBlock($relationAlias = null) Adds a INNER JOIN clause to the query using the CcBlock relation * - * @method CcPlaylistcontents findOne(PropelPDO $con = null) Return the first CcPlaylistcontents matching the query - * @method CcPlaylistcontents findOneOrCreate(PropelPDO $con = null) Return the first CcPlaylistcontents matching the query, or a new CcPlaylistcontents object populated from the query conditions when no match is found + * @method CcPlaylistcontentsQuery leftJoinCcPlaylist($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPlaylist relation + * @method CcPlaylistcontentsQuery rightJoinCcPlaylist($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlaylist relation + * @method CcPlaylistcontentsQuery innerJoinCcPlaylist($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlaylist relation * - * @method CcPlaylistcontents findOneByDbId(int $id) Return the first CcPlaylistcontents filtered by the id column - * @method CcPlaylistcontents findOneByDbPlaylistId(int $playlist_id) Return the first CcPlaylistcontents filtered by the playlist_id column - * @method CcPlaylistcontents findOneByDbFileId(int $file_id) Return the first CcPlaylistcontents filtered by the file_id column - * @method CcPlaylistcontents findOneByDbBlockId(int $block_id) Return the first CcPlaylistcontents filtered by the block_id column - * @method CcPlaylistcontents findOneByDbStreamId(int $stream_id) Return the first CcPlaylistcontents filtered by the stream_id column - * @method CcPlaylistcontents findOneByDbType(int $type) Return the first CcPlaylistcontents filtered by the type column - * @method CcPlaylistcontents findOneByDbPosition(int $position) Return the first CcPlaylistcontents filtered by the position column - * @method CcPlaylistcontents findOneByDbTrackOffset(double $trackoffset) Return the first CcPlaylistcontents filtered by the trackoffset column - * @method CcPlaylistcontents findOneByDbCliplength(string $cliplength) Return the first CcPlaylistcontents filtered by the cliplength column - * @method CcPlaylistcontents findOneByDbCuein(string $cuein) Return the first CcPlaylistcontents filtered by the cuein column - * @method CcPlaylistcontents findOneByDbCueout(string $cueout) Return the first CcPlaylistcontents filtered by the cueout column - * @method CcPlaylistcontents findOneByDbFadein(string $fadein) Return the first CcPlaylistcontents filtered by the fadein column - * @method CcPlaylistcontents findOneByDbFadeout(string $fadeout) Return the first CcPlaylistcontents filtered by the fadeout column + * @method CcPlaylistcontents findOne(PropelPDO $con = null) Return the first CcPlaylistcontents matching the query + * @method CcPlaylistcontents findOneOrCreate(PropelPDO $con = null) Return the first CcPlaylistcontents matching the query, or a new CcPlaylistcontents object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcPlaylistcontents objects filtered by the id column - * @method array findByDbPlaylistId(int $playlist_id) Return CcPlaylistcontents objects filtered by the playlist_id column - * @method array findByDbFileId(int $file_id) Return CcPlaylistcontents objects filtered by the file_id column - * @method array findByDbBlockId(int $block_id) Return CcPlaylistcontents objects filtered by the block_id column - * @method array findByDbStreamId(int $stream_id) Return CcPlaylistcontents objects filtered by the stream_id column - * @method array findByDbType(int $type) Return CcPlaylistcontents objects filtered by the type column - * @method array findByDbPosition(int $position) Return CcPlaylistcontents objects filtered by the position column - * @method array findByDbTrackOffset(double $trackoffset) Return CcPlaylistcontents objects filtered by the trackoffset column - * @method array findByDbCliplength(string $cliplength) Return CcPlaylistcontents objects filtered by the cliplength column - * @method array findByDbCuein(string $cuein) Return CcPlaylistcontents objects filtered by the cuein column - * @method array findByDbCueout(string $cueout) Return CcPlaylistcontents objects filtered by the cueout column - * @method array findByDbFadein(string $fadein) Return CcPlaylistcontents objects filtered by the fadein column - * @method array findByDbFadeout(string $fadeout) Return CcPlaylistcontents objects filtered by the fadeout column + * @method CcPlaylistcontents findOneByDbPlaylistId(int $playlist_id) Return the first CcPlaylistcontents filtered by the playlist_id column + * @method CcPlaylistcontents findOneByDbFileId(int $file_id) Return the first CcPlaylistcontents filtered by the file_id column + * @method CcPlaylistcontents findOneByDbBlockId(int $block_id) Return the first CcPlaylistcontents filtered by the block_id column + * @method CcPlaylistcontents findOneByDbStreamId(int $stream_id) Return the first CcPlaylistcontents filtered by the stream_id column + * @method CcPlaylistcontents findOneByDbType(int $type) Return the first CcPlaylistcontents filtered by the type column + * @method CcPlaylistcontents findOneByDbPosition(int $position) Return the first CcPlaylistcontents filtered by the position column + * @method CcPlaylistcontents findOneByDbTrackOffset(double $trackoffset) Return the first CcPlaylistcontents filtered by the trackoffset column + * @method CcPlaylistcontents findOneByDbCliplength(string $cliplength) Return the first CcPlaylistcontents filtered by the cliplength column + * @method CcPlaylistcontents findOneByDbCuein(string $cuein) Return the first CcPlaylistcontents filtered by the cuein column + * @method CcPlaylistcontents findOneByDbCueout(string $cueout) Return the first CcPlaylistcontents filtered by the cueout column + * @method CcPlaylistcontents findOneByDbFadein(string $fadein) Return the first CcPlaylistcontents filtered by the fadein column + * @method CcPlaylistcontents findOneByDbFadeout(string $fadeout) Return the first CcPlaylistcontents filtered by the fadeout column + * + * @method array findByDbId(int $id) Return CcPlaylistcontents objects filtered by the id column + * @method array findByDbPlaylistId(int $playlist_id) Return CcPlaylistcontents objects filtered by the playlist_id column + * @method array findByDbFileId(int $file_id) Return CcPlaylistcontents objects filtered by the file_id column + * @method array findByDbBlockId(int $block_id) Return CcPlaylistcontents objects filtered by the block_id column + * @method array findByDbStreamId(int $stream_id) Return CcPlaylistcontents objects filtered by the stream_id column + * @method array findByDbType(int $type) Return CcPlaylistcontents objects filtered by the type column + * @method array findByDbPosition(int $position) Return CcPlaylistcontents objects filtered by the position column + * @method array findByDbTrackOffset(double $trackoffset) Return CcPlaylistcontents objects filtered by the trackoffset column + * @method array findByDbCliplength(string $cliplength) Return CcPlaylistcontents objects filtered by the cliplength column + * @method array findByDbCuein(string $cuein) Return CcPlaylistcontents objects filtered by the cuein column + * @method array findByDbCueout(string $cueout) Return CcPlaylistcontents objects filtered by the cueout column + * @method array findByDbFadein(string $fadein) Return CcPlaylistcontents objects filtered by the fadein column + * @method array findByDbFadeout(string $fadeout) Return CcPlaylistcontents objects filtered by the fadeout column * * @package propel.generator.airtime.om */ abstract class BaseCcPlaylistcontentsQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcPlaylistcontentsQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcPlaylistcontents'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcPlaylistcontentsQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcPlaylistcontentsQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcPlaylistcontentsQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcPlaylistcontentsQuery) { + return $criteria; + } + $query = new CcPlaylistcontentsQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcPlaylistcontents|CcPlaylistcontents[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcPlaylistcontentsPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcPlaylistcontentsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlaylistcontents A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlaylistcontents A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "playlist_id", "file_id", "block_id", "stream_id", "type", "position", "trackoffset", "cliplength", "cuein", "cueout", "fadein", "fadeout" FROM "cc_playlistcontents" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcPlaylistcontents(); + $obj->hydrate($row); + CcPlaylistcontentsPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlaylistcontents|CcPlaylistcontents[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcPlaylistcontents[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcPlaylistcontentsPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcPlaylistcontentsPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistcontentsPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the playlist_id column + * + * Example usage: + * + * $query->filterByDbPlaylistId(1234); // WHERE playlist_id = 1234 + * $query->filterByDbPlaylistId(array(12, 34)); // WHERE playlist_id IN (12, 34) + * $query->filterByDbPlaylistId(array('min' => 12)); // WHERE playlist_id >= 12 + * $query->filterByDbPlaylistId(array('max' => 12)); // WHERE playlist_id <= 12 + * + * + * @see filterByCcPlaylist() + * + * @param mixed $dbPlaylistId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByDbPlaylistId($dbPlaylistId = null, $comparison = null) + { + if (is_array($dbPlaylistId)) { + $useMinMax = false; + if (isset($dbPlaylistId['min'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::PLAYLIST_ID, $dbPlaylistId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbPlaylistId['max'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::PLAYLIST_ID, $dbPlaylistId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistcontentsPeer::PLAYLIST_ID, $dbPlaylistId, $comparison); + } + + /** + * Filter the query on the file_id column + * + * Example usage: + * + * $query->filterByDbFileId(1234); // WHERE file_id = 1234 + * $query->filterByDbFileId(array(12, 34)); // WHERE file_id IN (12, 34) + * $query->filterByDbFileId(array('min' => 12)); // WHERE file_id >= 12 + * $query->filterByDbFileId(array('max' => 12)); // WHERE file_id <= 12 + * + * + * @see filterByCcFiles() + * + * @param mixed $dbFileId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByDbFileId($dbFileId = null, $comparison = null) + { + if (is_array($dbFileId)) { + $useMinMax = false; + if (isset($dbFileId['min'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::FILE_ID, $dbFileId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbFileId['max'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::FILE_ID, $dbFileId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistcontentsPeer::FILE_ID, $dbFileId, $comparison); + } + + /** + * Filter the query on the block_id column + * + * Example usage: + * + * $query->filterByDbBlockId(1234); // WHERE block_id = 1234 + * $query->filterByDbBlockId(array(12, 34)); // WHERE block_id IN (12, 34) + * $query->filterByDbBlockId(array('min' => 12)); // WHERE block_id >= 12 + * $query->filterByDbBlockId(array('max' => 12)); // WHERE block_id <= 12 + * + * + * @see filterByCcBlock() + * + * @param mixed $dbBlockId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByDbBlockId($dbBlockId = null, $comparison = null) + { + if (is_array($dbBlockId)) { + $useMinMax = false; + if (isset($dbBlockId['min'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::BLOCK_ID, $dbBlockId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbBlockId['max'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::BLOCK_ID, $dbBlockId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistcontentsPeer::BLOCK_ID, $dbBlockId, $comparison); + } + + /** + * Filter the query on the stream_id column + * + * Example usage: + * + * $query->filterByDbStreamId(1234); // WHERE stream_id = 1234 + * $query->filterByDbStreamId(array(12, 34)); // WHERE stream_id IN (12, 34) + * $query->filterByDbStreamId(array('min' => 12)); // WHERE stream_id >= 12 + * $query->filterByDbStreamId(array('max' => 12)); // WHERE stream_id <= 12 + * + * + * @param mixed $dbStreamId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByDbStreamId($dbStreamId = null, $comparison = null) + { + if (is_array($dbStreamId)) { + $useMinMax = false; + if (isset($dbStreamId['min'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::STREAM_ID, $dbStreamId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbStreamId['max'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::STREAM_ID, $dbStreamId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistcontentsPeer::STREAM_ID, $dbStreamId, $comparison); + } + + /** + * Filter the query on the type column + * + * Example usage: + * + * $query->filterByDbType(1234); // WHERE type = 1234 + * $query->filterByDbType(array(12, 34)); // WHERE type IN (12, 34) + * $query->filterByDbType(array('min' => 12)); // WHERE type >= 12 + * $query->filterByDbType(array('max' => 12)); // WHERE type <= 12 + * + * + * @param mixed $dbType The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByDbType($dbType = null, $comparison = null) + { + if (is_array($dbType)) { + $useMinMax = false; + if (isset($dbType['min'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::TYPE, $dbType['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbType['max'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::TYPE, $dbType['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistcontentsPeer::TYPE, $dbType, $comparison); + } + + /** + * Filter the query on the position column + * + * Example usage: + * + * $query->filterByDbPosition(1234); // WHERE position = 1234 + * $query->filterByDbPosition(array(12, 34)); // WHERE position IN (12, 34) + * $query->filterByDbPosition(array('min' => 12)); // WHERE position >= 12 + * $query->filterByDbPosition(array('max' => 12)); // WHERE position <= 12 + * + * + * @param mixed $dbPosition The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByDbPosition($dbPosition = null, $comparison = null) + { + if (is_array($dbPosition)) { + $useMinMax = false; + if (isset($dbPosition['min'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::POSITION, $dbPosition['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbPosition['max'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::POSITION, $dbPosition['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistcontentsPeer::POSITION, $dbPosition, $comparison); + } + + /** + * Filter the query on the trackoffset column + * + * Example usage: + * + * $query->filterByDbTrackOffset(1234); // WHERE trackoffset = 1234 + * $query->filterByDbTrackOffset(array(12, 34)); // WHERE trackoffset IN (12, 34) + * $query->filterByDbTrackOffset(array('min' => 12)); // WHERE trackoffset >= 12 + * $query->filterByDbTrackOffset(array('max' => 12)); // WHERE trackoffset <= 12 + * + * + * @param mixed $dbTrackOffset The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByDbTrackOffset($dbTrackOffset = null, $comparison = null) + { + if (is_array($dbTrackOffset)) { + $useMinMax = false; + if (isset($dbTrackOffset['min'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::TRACKOFFSET, $dbTrackOffset['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbTrackOffset['max'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::TRACKOFFSET, $dbTrackOffset['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistcontentsPeer::TRACKOFFSET, $dbTrackOffset, $comparison); + } + + /** + * Filter the query on the cliplength column + * + * Example usage: + * + * $query->filterByDbCliplength('fooValue'); // WHERE cliplength = 'fooValue' + * $query->filterByDbCliplength('%fooValue%'); // WHERE cliplength LIKE '%fooValue%' + * + * + * @param string $dbCliplength The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByDbCliplength($dbCliplength = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCliplength)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCliplength)) { + $dbCliplength = str_replace('*', '%', $dbCliplength); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPlaylistcontentsPeer::CLIPLENGTH, $dbCliplength, $comparison); + } + + /** + * Filter the query on the cuein column + * + * Example usage: + * + * $query->filterByDbCuein('fooValue'); // WHERE cuein = 'fooValue' + * $query->filterByDbCuein('%fooValue%'); // WHERE cuein LIKE '%fooValue%' + * + * + * @param string $dbCuein The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByDbCuein($dbCuein = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCuein)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCuein)) { + $dbCuein = str_replace('*', '%', $dbCuein); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPlaylistcontentsPeer::CUEIN, $dbCuein, $comparison); + } + + /** + * Filter the query on the cueout column + * + * Example usage: + * + * $query->filterByDbCueout('fooValue'); // WHERE cueout = 'fooValue' + * $query->filterByDbCueout('%fooValue%'); // WHERE cueout LIKE '%fooValue%' + * + * + * @param string $dbCueout The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByDbCueout($dbCueout = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCueout)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCueout)) { + $dbCueout = str_replace('*', '%', $dbCueout); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPlaylistcontentsPeer::CUEOUT, $dbCueout, $comparison); + } + + /** + * Filter the query on the fadein column + * + * Example usage: + * + * $query->filterByDbFadein('2011-03-14'); // WHERE fadein = '2011-03-14' + * $query->filterByDbFadein('now'); // WHERE fadein = '2011-03-14' + * $query->filterByDbFadein(array('max' => 'yesterday')); // WHERE fadein < '2011-03-13' + * + * + * @param mixed $dbFadein The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByDbFadein($dbFadein = null, $comparison = null) + { + if (is_array($dbFadein)) { + $useMinMax = false; + if (isset($dbFadein['min'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::FADEIN, $dbFadein['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbFadein['max'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::FADEIN, $dbFadein['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistcontentsPeer::FADEIN, $dbFadein, $comparison); + } + + /** + * Filter the query on the fadeout column + * + * Example usage: + * + * $query->filterByDbFadeout('2011-03-14'); // WHERE fadeout = '2011-03-14' + * $query->filterByDbFadeout('now'); // WHERE fadeout = '2011-03-14' + * $query->filterByDbFadeout(array('max' => 'yesterday')); // WHERE fadeout < '2011-03-13' + * + * + * @param mixed $dbFadeout The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function filterByDbFadeout($dbFadeout = null, $comparison = null) + { + if (is_array($dbFadeout)) { + $useMinMax = false; + if (isset($dbFadeout['min'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::FADEOUT, $dbFadeout['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbFadeout['max'])) { + $this->addUsingAlias(CcPlaylistcontentsPeer::FADEOUT, $dbFadeout['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlaylistcontentsPeer::FADEOUT, $dbFadeout, $comparison); + } + + /** + * Filter the query by a related CcFiles object + * + * @param CcFiles|PropelObjectCollection $ccFiles The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcFiles($ccFiles, $comparison = null) + { + if ($ccFiles instanceof CcFiles) { + return $this + ->addUsingAlias(CcPlaylistcontentsPeer::FILE_ID, $ccFiles->getDbId(), $comparison); + } elseif ($ccFiles instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcPlaylistcontentsPeer::FILE_ID, $ccFiles->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcFiles() only accepts arguments of type CcFiles or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcFiles relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function joinCcFiles($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcFiles'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcFiles'); + } + + return $this; + } + + /** + * Use the CcFiles relation CcFiles object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery A secondary query class using the current class as primary query + */ + public function useCcFilesQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcFiles($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery'); + } + + /** + * Filter the query by a related CcBlock object + * + * @param CcBlock|PropelObjectCollection $ccBlock The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcBlock($ccBlock, $comparison = null) + { + if ($ccBlock instanceof CcBlock) { + return $this + ->addUsingAlias(CcPlaylistcontentsPeer::BLOCK_ID, $ccBlock->getDbId(), $comparison); + } elseif ($ccBlock instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcPlaylistcontentsPeer::BLOCK_ID, $ccBlock->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcBlock() only accepts arguments of type CcBlock or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcBlock relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function joinCcBlock($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcBlock'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcBlock'); + } + + return $this; + } + + /** + * Use the CcBlock relation CcBlock object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockQuery A secondary query class using the current class as primary query + */ + public function useCcBlockQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcBlock($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcBlock', 'CcBlockQuery'); + } + + /** + * Filter the query by a related CcPlaylist object + * + * @param CcPlaylist|PropelObjectCollection $ccPlaylist The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcPlaylist($ccPlaylist, $comparison = null) + { + if ($ccPlaylist instanceof CcPlaylist) { + return $this + ->addUsingAlias(CcPlaylistcontentsPeer::PLAYLIST_ID, $ccPlaylist->getDbId(), $comparison); + } elseif ($ccPlaylist instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcPlaylistcontentsPeer::PLAYLIST_ID, $ccPlaylist->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcPlaylist() only accepts arguments of type CcPlaylist or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcPlaylist relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function joinCcPlaylist($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcPlaylist'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcPlaylist'); + } + + return $this; + } + + /** + * Use the CcPlaylist relation CcPlaylist object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlaylistQuery A secondary query class using the current class as primary query + */ + public function useCcPlaylistQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcPlaylist($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcPlaylist', 'CcPlaylistQuery'); + } + + /** + * Exclude object from result + * + * @param CcPlaylistcontents $ccPlaylistcontents Object to remove from the list of results + * + * @return CcPlaylistcontentsQuery The current query, for fluid interface + */ + public function prune($ccPlaylistcontents = null) + { + if ($ccPlaylistcontents) { + $this->addUsingAlias(CcPlaylistcontentsPeer::ID, $ccPlaylistcontents->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } + + /** + * Code to execute before every DELETE statement + * + * @param PropelPDO $con The connection object used by the query + */ + protected function basePreDelete(PropelPDO $con) + { + // aggregate_column_relation behavior + $this->findRelatedCcPlaylists($con); + + return $this->preDelete($con); + } + + /** + * Code to execute after every DELETE statement + * + * @param int $affectedRows the number of deleted rows + * @param PropelPDO $con The connection object used by the query + */ + protected function basePostDelete($affectedRows, PropelPDO $con) + { + // aggregate_column_relation behavior + $this->updateRelatedCcPlaylists($con); + + return $this->postDelete($affectedRows, $con); + } + + /** + * Code to execute before every UPDATE statement + * + * @param array $values The associative array of columns and values for the update + * @param PropelPDO $con The connection object used by the query + * @param boolean $forceIndividualSaves If false (default), the resulting call is a BasePeer::doUpdate(), otherwise it is a series of save() calls on all the found objects + */ + protected function basePreUpdate(&$values, PropelPDO $con, $forceIndividualSaves = false) + { + // aggregate_column_relation behavior + $this->findRelatedCcPlaylists($con); + + return $this->preUpdate($values, $con, $forceIndividualSaves); + } + + /** + * Code to execute after every UPDATE statement + * + * @param int $affectedRows the number of updated rows + * @param PropelPDO $con The connection object used by the query + */ + protected function basePostUpdate($affectedRows, PropelPDO $con) + { + // aggregate_column_relation behavior + $this->updateRelatedCcPlaylists($con); + + return $this->postUpdate($affectedRows, $con); + } + + // aggregate_column_relation behavior + + /** + * Finds the related CcPlaylist objects and keep them for later + * + * @param PropelPDO $con A connection object + */ + protected function findRelatedCcPlaylists($con) + { + $criteria = clone $this; + if ($this->useAliasInSQL) { + $alias = $this->getModelAlias(); + $criteria->removeAlias($alias); + } else { + $alias = ''; + } + $this->ccPlaylists = CcPlaylistQuery::create() + ->joinCcPlaylistcontents($alias) + ->mergeWith($criteria) + ->find($con); + } + + protected function updateRelatedCcPlaylists($con) + { + foreach ($this->ccPlaylists as $ccPlaylist) { + $ccPlaylist->updateDbLength($con); + } + $this->ccPlaylists = array(); + } - /** - * Initializes internal state of BaseCcPlaylistcontentsQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcPlaylistcontents', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcPlaylistcontentsQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcPlaylistcontentsQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcPlaylistcontentsQuery) { - return $criteria; - } - $query = new CcPlaylistcontentsQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcPlaylistcontents|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcPlaylistcontentsPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcPlaylistcontentsPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcPlaylistcontentsPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcPlaylistcontentsPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the playlist_id column - * - * @param int|array $dbPlaylistId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByDbPlaylistId($dbPlaylistId = null, $comparison = null) - { - if (is_array($dbPlaylistId)) { - $useMinMax = false; - if (isset($dbPlaylistId['min'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::PLAYLIST_ID, $dbPlaylistId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbPlaylistId['max'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::PLAYLIST_ID, $dbPlaylistId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlaylistcontentsPeer::PLAYLIST_ID, $dbPlaylistId, $comparison); - } - - /** - * Filter the query on the file_id column - * - * @param int|array $dbFileId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByDbFileId($dbFileId = null, $comparison = null) - { - if (is_array($dbFileId)) { - $useMinMax = false; - if (isset($dbFileId['min'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::FILE_ID, $dbFileId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbFileId['max'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::FILE_ID, $dbFileId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlaylistcontentsPeer::FILE_ID, $dbFileId, $comparison); - } - - /** - * Filter the query on the block_id column - * - * @param int|array $dbBlockId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByDbBlockId($dbBlockId = null, $comparison = null) - { - if (is_array($dbBlockId)) { - $useMinMax = false; - if (isset($dbBlockId['min'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::BLOCK_ID, $dbBlockId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbBlockId['max'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::BLOCK_ID, $dbBlockId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlaylistcontentsPeer::BLOCK_ID, $dbBlockId, $comparison); - } - - /** - * Filter the query on the stream_id column - * - * @param int|array $dbStreamId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByDbStreamId($dbStreamId = null, $comparison = null) - { - if (is_array($dbStreamId)) { - $useMinMax = false; - if (isset($dbStreamId['min'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::STREAM_ID, $dbStreamId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbStreamId['max'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::STREAM_ID, $dbStreamId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlaylistcontentsPeer::STREAM_ID, $dbStreamId, $comparison); - } - - /** - * Filter the query on the type column - * - * @param int|array $dbType The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByDbType($dbType = null, $comparison = null) - { - if (is_array($dbType)) { - $useMinMax = false; - if (isset($dbType['min'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::TYPE, $dbType['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbType['max'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::TYPE, $dbType['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlaylistcontentsPeer::TYPE, $dbType, $comparison); - } - - /** - * Filter the query on the position column - * - * @param int|array $dbPosition The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByDbPosition($dbPosition = null, $comparison = null) - { - if (is_array($dbPosition)) { - $useMinMax = false; - if (isset($dbPosition['min'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::POSITION, $dbPosition['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbPosition['max'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::POSITION, $dbPosition['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlaylistcontentsPeer::POSITION, $dbPosition, $comparison); - } - - /** - * Filter the query on the trackoffset column - * - * @param double|array $dbTrackOffset The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByDbTrackOffset($dbTrackOffset = null, $comparison = null) - { - if (is_array($dbTrackOffset)) { - $useMinMax = false; - if (isset($dbTrackOffset['min'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::TRACKOFFSET, $dbTrackOffset['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbTrackOffset['max'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::TRACKOFFSET, $dbTrackOffset['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlaylistcontentsPeer::TRACKOFFSET, $dbTrackOffset, $comparison); - } - - /** - * Filter the query on the cliplength column - * - * @param string $dbCliplength The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByDbCliplength($dbCliplength = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCliplength)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCliplength)) { - $dbCliplength = str_replace('*', '%', $dbCliplength); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPlaylistcontentsPeer::CLIPLENGTH, $dbCliplength, $comparison); - } - - /** - * Filter the query on the cuein column - * - * @param string $dbCuein The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByDbCuein($dbCuein = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCuein)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCuein)) { - $dbCuein = str_replace('*', '%', $dbCuein); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPlaylistcontentsPeer::CUEIN, $dbCuein, $comparison); - } - - /** - * Filter the query on the cueout column - * - * @param string $dbCueout The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByDbCueout($dbCueout = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCueout)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCueout)) { - $dbCueout = str_replace('*', '%', $dbCueout); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPlaylistcontentsPeer::CUEOUT, $dbCueout, $comparison); - } - - /** - * Filter the query on the fadein column - * - * @param string|array $dbFadein The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByDbFadein($dbFadein = null, $comparison = null) - { - if (is_array($dbFadein)) { - $useMinMax = false; - if (isset($dbFadein['min'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::FADEIN, $dbFadein['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbFadein['max'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::FADEIN, $dbFadein['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlaylistcontentsPeer::FADEIN, $dbFadein, $comparison); - } - - /** - * Filter the query on the fadeout column - * - * @param string|array $dbFadeout The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByDbFadeout($dbFadeout = null, $comparison = null) - { - if (is_array($dbFadeout)) { - $useMinMax = false; - if (isset($dbFadeout['min'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::FADEOUT, $dbFadeout['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbFadeout['max'])) { - $this->addUsingAlias(CcPlaylistcontentsPeer::FADEOUT, $dbFadeout['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlaylistcontentsPeer::FADEOUT, $dbFadeout, $comparison); - } - - /** - * Filter the query by a related CcFiles object - * - * @param CcFiles $ccFiles the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByCcFiles($ccFiles, $comparison = null) - { - return $this - ->addUsingAlias(CcPlaylistcontentsPeer::FILE_ID, $ccFiles->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcFiles relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function joinCcFiles($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcFiles'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcFiles'); - } - - return $this; - } - - /** - * Use the CcFiles relation CcFiles object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery A secondary query class using the current class as primary query - */ - public function useCcFilesQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcFiles($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery'); - } - - /** - * Filter the query by a related CcBlock object - * - * @param CcBlock $ccBlock the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByCcBlock($ccBlock, $comparison = null) - { - return $this - ->addUsingAlias(CcPlaylistcontentsPeer::BLOCK_ID, $ccBlock->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcBlock relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function joinCcBlock($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcBlock'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcBlock'); - } - - return $this; - } - - /** - * Use the CcBlock relation CcBlock object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockQuery A secondary query class using the current class as primary query - */ - public function useCcBlockQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcBlock($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcBlock', 'CcBlockQuery'); - } - - /** - * Filter the query by a related CcPlaylist object - * - * @param CcPlaylist $ccPlaylist the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function filterByCcPlaylist($ccPlaylist, $comparison = null) - { - return $this - ->addUsingAlias(CcPlaylistcontentsPeer::PLAYLIST_ID, $ccPlaylist->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcPlaylist relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function joinCcPlaylist($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcPlaylist'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcPlaylist'); - } - - return $this; - } - - /** - * Use the CcPlaylist relation CcPlaylist object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlaylistQuery A secondary query class using the current class as primary query - */ - public function useCcPlaylistQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcPlaylist($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcPlaylist', 'CcPlaylistQuery'); - } - - /** - * Exclude object from result - * - * @param CcPlaylistcontents $ccPlaylistcontents Object to remove from the list of results - * - * @return CcPlaylistcontentsQuery The current query, for fluid interface - */ - public function prune($ccPlaylistcontents = null) - { - if ($ccPlaylistcontents) { - $this->addUsingAlias(CcPlaylistcontentsPeer::ID, $ccPlaylistcontents->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - - /** - * Code to execute before every DELETE statement - * - * @param PropelPDO $con The connection object used by the query - */ - protected function basePreDelete(PropelPDO $con) - { - // aggregate_column_relation behavior - $this->findRelatedCcPlaylists($con); - - return $this->preDelete($con); - } - - /** - * Code to execute after every DELETE statement - * - * @param int $affectedRows the number of deleted rows - * @param PropelPDO $con The connection object used by the query - */ - protected function basePostDelete($affectedRows, PropelPDO $con) - { - // aggregate_column_relation behavior - $this->updateRelatedCcPlaylists($con); - - return $this->postDelete($affectedRows, $con); - } - - /** - * Code to execute before every UPDATE statement - * - * @param array $values The associatiove array of columns and values for the update - * @param PropelPDO $con The connection object used by the query - * @param boolean $forceIndividualSaves If false (default), the resulting call is a BasePeer::doUpdate(), ortherwise it is a series of save() calls on all the found objects - */ - protected function basePreUpdate(&$values, PropelPDO $con, $forceIndividualSaves = false) - { - // aggregate_column_relation behavior - $this->findRelatedCcPlaylists($con); - - return $this->preUpdate($values, $con, $forceIndividualSaves); - } - - /** - * Code to execute after every UPDATE statement - * - * @param int $affectedRows the number of udated rows - * @param PropelPDO $con The connection object used by the query - */ - protected function basePostUpdate($affectedRows, PropelPDO $con) - { - // aggregate_column_relation behavior - $this->updateRelatedCcPlaylists($con); - - return $this->postUpdate($affectedRows, $con); - } - - // aggregate_column_relation behavior - - /** - * Finds the related CcPlaylist objects and keep them for later - * - * @param PropelPDO $con A connection object - */ - protected function findRelatedCcPlaylists($con) - { - $criteria = clone $this; - if ($this->useAliasInSQL) { - $alias = $this->getModelAlias(); - $criteria->removeAlias($alias); - } else { - $alias = ''; - } - $this->ccPlaylists = CcPlaylistQuery::create() - ->joinCcPlaylistcontents($alias) - ->mergeWith($criteria) - ->find($con); - } - - protected function updateRelatedCcPlaylists($con) - { - foreach ($this->ccPlaylists as $ccPlaylist) { - $ccPlaylist->updateDbLength($con); - } - $this->ccPlaylists = array(); - } - -} // BaseCcPlaylistcontentsQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistory.php b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistory.php index 2e55a484fd..8c172ac0e0 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistory.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistory.php @@ -4,1285 +4,1539 @@ /** * Base class that represents a row from the 'cc_playout_history' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcPlayoutHistory extends BaseObject implements Persistent +abstract class BaseCcPlayoutHistory extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcPlayoutHistoryPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcPlayoutHistoryPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the file_id field. - * @var int - */ - protected $file_id; - - /** - * The value for the starts field. - * @var string - */ - protected $starts; - - /** - * The value for the ends field. - * @var string - */ - protected $ends; - - /** - * The value for the instance_id field. - * @var int - */ - protected $instance_id; - - /** - * @var CcFiles - */ - protected $aCcFiles; - - /** - * @var CcShowInstances - */ - protected $aCcShowInstances; - - /** - * @var array CcPlayoutHistoryMetaData[] Collection to store aggregation of CcPlayoutHistoryMetaData objects. - */ - protected $collCcPlayoutHistoryMetaDatas; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [file_id] column value. - * - * @return int - */ - public function getDbFileId() - { - return $this->file_id; - } - - /** - * Get the [optionally formatted] temporal [starts] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbStarts($format = 'Y-m-d H:i:s') - { - if ($this->starts === null) { - return null; - } - - - - try { - $dt = new DateTime($this->starts); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->starts, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [ends] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbEnds($format = 'Y-m-d H:i:s') - { - if ($this->ends === null) { - return null; - } - - - - try { - $dt = new DateTime($this->ends); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->ends, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [instance_id] column value. - * - * @return int - */ - public function getDbInstanceId() - { - return $this->instance_id; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcPlayoutHistory The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcPlayoutHistoryPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [file_id] column. - * - * @param int $v new value - * @return CcPlayoutHistory The current object (for fluent API support) - */ - public function setDbFileId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->file_id !== $v) { - $this->file_id = $v; - $this->modifiedColumns[] = CcPlayoutHistoryPeer::FILE_ID; - } - - if ($this->aCcFiles !== null && $this->aCcFiles->getDbId() !== $v) { - $this->aCcFiles = null; - } - - return $this; - } // setDbFileId() - - /** - * Sets the value of [starts] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcPlayoutHistory The current object (for fluent API support) - */ - public function setDbStarts($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->starts !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->starts !== null && $tmpDt = new DateTime($this->starts)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->starts = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcPlayoutHistoryPeer::STARTS; - } - } // if either are not null - - return $this; - } // setDbStarts() - - /** - * Sets the value of [ends] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcPlayoutHistory The current object (for fluent API support) - */ - public function setDbEnds($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->ends !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->ends !== null && $tmpDt = new DateTime($this->ends)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->ends = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcPlayoutHistoryPeer::ENDS; - } - } // if either are not null - - return $this; - } // setDbEnds() - - /** - * Set the value of [instance_id] column. - * - * @param int $v new value - * @return CcPlayoutHistory The current object (for fluent API support) - */ - public function setDbInstanceId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->instance_id !== $v) { - $this->instance_id = $v; - $this->modifiedColumns[] = CcPlayoutHistoryPeer::INSTANCE_ID; - } - - if ($this->aCcShowInstances !== null && $this->aCcShowInstances->getDbId() !== $v) { - $this->aCcShowInstances = null; - } - - return $this; - } // setDbInstanceId() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->file_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->starts = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->ends = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->instance_id = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 5; // 5 = CcPlayoutHistoryPeer::NUM_COLUMNS - CcPlayoutHistoryPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcPlayoutHistory object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcFiles !== null && $this->file_id !== $this->aCcFiles->getDbId()) { - $this->aCcFiles = null; - } - if ($this->aCcShowInstances !== null && $this->instance_id !== $this->aCcShowInstances->getDbId()) { - $this->aCcShowInstances = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcPlayoutHistoryPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcFiles = null; - $this->aCcShowInstances = null; - $this->collCcPlayoutHistoryMetaDatas = null; - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcPlayoutHistoryQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcPlayoutHistoryPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcFiles !== null) { - if ($this->aCcFiles->isModified() || $this->aCcFiles->isNew()) { - $affectedRows += $this->aCcFiles->save($con); - } - $this->setCcFiles($this->aCcFiles); - } - - if ($this->aCcShowInstances !== null) { - if ($this->aCcShowInstances->isModified() || $this->aCcShowInstances->isNew()) { - $affectedRows += $this->aCcShowInstances->save($con); - } - $this->setCcShowInstances($this->aCcShowInstances); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcPlayoutHistoryPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcPlayoutHistoryPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlayoutHistoryPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcPlayoutHistoryPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - if ($this->collCcPlayoutHistoryMetaDatas !== null) { - foreach ($this->collCcPlayoutHistoryMetaDatas as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcFiles !== null) { - if (!$this->aCcFiles->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcFiles->getValidationFailures()); - } - } - - if ($this->aCcShowInstances !== null) { - if (!$this->aCcShowInstances->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcShowInstances->getValidationFailures()); - } - } - - - if (($retval = CcPlayoutHistoryPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - if ($this->collCcPlayoutHistoryMetaDatas !== null) { - foreach ($this->collCcPlayoutHistoryMetaDatas as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPlayoutHistoryPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbFileId(); - break; - case 2: - return $this->getDbStarts(); - break; - case 3: - return $this->getDbEnds(); - break; - case 4: - return $this->getDbInstanceId(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcPlayoutHistoryPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbFileId(), - $keys[2] => $this->getDbStarts(), - $keys[3] => $this->getDbEnds(), - $keys[4] => $this->getDbInstanceId(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcFiles) { - $result['CcFiles'] = $this->aCcFiles->toArray($keyType, $includeLazyLoadColumns, true); - } - if (null !== $this->aCcShowInstances) { - $result['CcShowInstances'] = $this->aCcShowInstances->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPlayoutHistoryPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbFileId($value); - break; - case 2: - $this->setDbStarts($value); - break; - case 3: - $this->setDbEnds($value); - break; - case 4: - $this->setDbInstanceId($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcPlayoutHistoryPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbFileId($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbStarts($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbEnds($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbInstanceId($arr[$keys[4]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcPlayoutHistoryPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcPlayoutHistoryPeer::ID)) $criteria->add(CcPlayoutHistoryPeer::ID, $this->id); - if ($this->isColumnModified(CcPlayoutHistoryPeer::FILE_ID)) $criteria->add(CcPlayoutHistoryPeer::FILE_ID, $this->file_id); - if ($this->isColumnModified(CcPlayoutHistoryPeer::STARTS)) $criteria->add(CcPlayoutHistoryPeer::STARTS, $this->starts); - if ($this->isColumnModified(CcPlayoutHistoryPeer::ENDS)) $criteria->add(CcPlayoutHistoryPeer::ENDS, $this->ends); - if ($this->isColumnModified(CcPlayoutHistoryPeer::INSTANCE_ID)) $criteria->add(CcPlayoutHistoryPeer::INSTANCE_ID, $this->instance_id); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcPlayoutHistoryPeer::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcPlayoutHistory (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbFileId($this->file_id); - $copyObj->setDbStarts($this->starts); - $copyObj->setDbEnds($this->ends); - $copyObj->setDbInstanceId($this->instance_id); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getCcPlayoutHistoryMetaDatas() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcPlayoutHistoryMetaData($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcPlayoutHistory Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcPlayoutHistoryPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcPlayoutHistoryPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcFiles object. - * - * @param CcFiles $v - * @return CcPlayoutHistory The current object (for fluent API support) - * @throws PropelException - */ - public function setCcFiles(CcFiles $v = null) - { - if ($v === null) { - $this->setDbFileId(NULL); - } else { - $this->setDbFileId($v->getDbId()); - } - - $this->aCcFiles = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcFiles object, it will not be re-added. - if ($v !== null) { - $v->addCcPlayoutHistory($this); - } - - return $this; - } - - - /** - * Get the associated CcFiles object - * - * @param PropelPDO Optional Connection object. - * @return CcFiles The associated CcFiles object. - * @throws PropelException - */ - public function getCcFiles(PropelPDO $con = null) - { - if ($this->aCcFiles === null && ($this->file_id !== null)) { - $this->aCcFiles = CcFilesQuery::create()->findPk($this->file_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcFiles->addCcPlayoutHistorys($this); - */ - } - return $this->aCcFiles; - } - - /** - * Declares an association between this object and a CcShowInstances object. - * - * @param CcShowInstances $v - * @return CcPlayoutHistory The current object (for fluent API support) - * @throws PropelException - */ - public function setCcShowInstances(CcShowInstances $v = null) - { - if ($v === null) { - $this->setDbInstanceId(NULL); - } else { - $this->setDbInstanceId($v->getDbId()); - } - - $this->aCcShowInstances = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcShowInstances object, it will not be re-added. - if ($v !== null) { - $v->addCcPlayoutHistory($this); - } - - return $this; - } - - - /** - * Get the associated CcShowInstances object - * - * @param PropelPDO Optional Connection object. - * @return CcShowInstances The associated CcShowInstances object. - * @throws PropelException - */ - public function getCcShowInstances(PropelPDO $con = null) - { - if ($this->aCcShowInstances === null && ($this->instance_id !== null)) { - $this->aCcShowInstances = CcShowInstancesQuery::create()->findPk($this->instance_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcShowInstances->addCcPlayoutHistorys($this); - */ - } - return $this->aCcShowInstances; - } - - /** - * Clears out the collCcPlayoutHistoryMetaDatas collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcPlayoutHistoryMetaDatas() - */ - public function clearCcPlayoutHistoryMetaDatas() - { - $this->collCcPlayoutHistoryMetaDatas = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcPlayoutHistoryMetaDatas collection. - * - * By default this just sets the collCcPlayoutHistoryMetaDatas collection to an empty array (like clearcollCcPlayoutHistoryMetaDatas()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcPlayoutHistoryMetaDatas() - { - $this->collCcPlayoutHistoryMetaDatas = new PropelObjectCollection(); - $this->collCcPlayoutHistoryMetaDatas->setModel('CcPlayoutHistoryMetaData'); - } - - /** - * Gets an array of CcPlayoutHistoryMetaData objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcPlayoutHistory is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcPlayoutHistoryMetaData[] List of CcPlayoutHistoryMetaData objects - * @throws PropelException - */ - public function getCcPlayoutHistoryMetaDatas($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcPlayoutHistoryMetaDatas || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlayoutHistoryMetaDatas) { - // return empty collection - $this->initCcPlayoutHistoryMetaDatas(); - } else { - $collCcPlayoutHistoryMetaDatas = CcPlayoutHistoryMetaDataQuery::create(null, $criteria) - ->filterByCcPlayoutHistory($this) - ->find($con); - if (null !== $criteria) { - return $collCcPlayoutHistoryMetaDatas; - } - $this->collCcPlayoutHistoryMetaDatas = $collCcPlayoutHistoryMetaDatas; - } - } - return $this->collCcPlayoutHistoryMetaDatas; - } - - /** - * Returns the number of related CcPlayoutHistoryMetaData objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcPlayoutHistoryMetaData objects. - * @throws PropelException - */ - public function countCcPlayoutHistoryMetaDatas(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcPlayoutHistoryMetaDatas || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlayoutHistoryMetaDatas) { - return 0; - } else { - $query = CcPlayoutHistoryMetaDataQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcPlayoutHistory($this) - ->count($con); - } - } else { - return count($this->collCcPlayoutHistoryMetaDatas); - } - } - - /** - * Method called to associate a CcPlayoutHistoryMetaData object to this object - * through the CcPlayoutHistoryMetaData foreign key attribute. - * - * @param CcPlayoutHistoryMetaData $l CcPlayoutHistoryMetaData - * @return void - * @throws PropelException - */ - public function addCcPlayoutHistoryMetaData(CcPlayoutHistoryMetaData $l) - { - if ($this->collCcPlayoutHistoryMetaDatas === null) { - $this->initCcPlayoutHistoryMetaDatas(); - } - if (!$this->collCcPlayoutHistoryMetaDatas->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcPlayoutHistoryMetaDatas[]= $l; - $l->setCcPlayoutHistory($this); - } - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->file_id = null; - $this->starts = null; - $this->ends = null; - $this->instance_id = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - if ($this->collCcPlayoutHistoryMetaDatas) { - foreach ((array) $this->collCcPlayoutHistoryMetaDatas as $o) { - $o->clearAllReferences($deep); - } - } - } // if ($deep) - - $this->collCcPlayoutHistoryMetaDatas = null; - $this->aCcFiles = null; - $this->aCcShowInstances = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcPlayoutHistory + /** + * Peer class name + */ + const PEER = 'CcPlayoutHistoryPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcPlayoutHistoryPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the file_id field. + * @var int + */ + protected $file_id; + + /** + * The value for the starts field. + * @var string + */ + protected $starts; + + /** + * The value for the ends field. + * @var string + */ + protected $ends; + + /** + * The value for the instance_id field. + * @var int + */ + protected $instance_id; + + /** + * @var CcFiles + */ + protected $aCcFiles; + + /** + * @var CcShowInstances + */ + protected $aCcShowInstances; + + /** + * @var PropelObjectCollection|CcPlayoutHistoryMetaData[] Collection to store aggregation of CcPlayoutHistoryMetaData objects. + */ + protected $collCcPlayoutHistoryMetaDatas; + protected $collCcPlayoutHistoryMetaDatasPartial; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccPlayoutHistoryMetaDatasScheduledForDeletion = null; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [file_id] column value. + * + * @return int + */ + public function getDbFileId() + { + + return $this->file_id; + } + + /** + * Get the [optionally formatted] temporal [starts] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbStarts($format = 'Y-m-d H:i:s') + { + if ($this->starts === null) { + return null; + } + + + try { + $dt = new DateTime($this->starts); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->starts, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [ends] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbEnds($format = 'Y-m-d H:i:s') + { + if ($this->ends === null) { + return null; + } + + + try { + $dt = new DateTime($this->ends); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->ends, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [instance_id] column value. + * + * @return int + */ + public function getDbInstanceId() + { + + return $this->instance_id; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcPlayoutHistory The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcPlayoutHistoryPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [file_id] column. + * + * @param int $v new value + * @return CcPlayoutHistory The current object (for fluent API support) + */ + public function setDbFileId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->file_id !== $v) { + $this->file_id = $v; + $this->modifiedColumns[] = CcPlayoutHistoryPeer::FILE_ID; + } + + if ($this->aCcFiles !== null && $this->aCcFiles->getDbId() !== $v) { + $this->aCcFiles = null; + } + + + return $this; + } // setDbFileId() + + /** + * Sets the value of [starts] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcPlayoutHistory The current object (for fluent API support) + */ + public function setDbStarts($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->starts !== null || $dt !== null) { + $currentDateAsString = ($this->starts !== null && $tmpDt = new DateTime($this->starts)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->starts = $newDateAsString; + $this->modifiedColumns[] = CcPlayoutHistoryPeer::STARTS; + } + } // if either are not null + + + return $this; + } // setDbStarts() + + /** + * Sets the value of [ends] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcPlayoutHistory The current object (for fluent API support) + */ + public function setDbEnds($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->ends !== null || $dt !== null) { + $currentDateAsString = ($this->ends !== null && $tmpDt = new DateTime($this->ends)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->ends = $newDateAsString; + $this->modifiedColumns[] = CcPlayoutHistoryPeer::ENDS; + } + } // if either are not null + + + return $this; + } // setDbEnds() + + /** + * Set the value of [instance_id] column. + * + * @param int $v new value + * @return CcPlayoutHistory The current object (for fluent API support) + */ + public function setDbInstanceId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->instance_id !== $v) { + $this->instance_id = $v; + $this->modifiedColumns[] = CcPlayoutHistoryPeer::INSTANCE_ID; + } + + if ($this->aCcShowInstances !== null && $this->aCcShowInstances->getDbId() !== $v) { + $this->aCcShowInstances = null; + } + + + return $this; + } // setDbInstanceId() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->file_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->starts = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->ends = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->instance_id = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 5; // 5 = CcPlayoutHistoryPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcPlayoutHistory object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcFiles !== null && $this->file_id !== $this->aCcFiles->getDbId()) { + $this->aCcFiles = null; + } + if ($this->aCcShowInstances !== null && $this->instance_id !== $this->aCcShowInstances->getDbId()) { + $this->aCcShowInstances = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcPlayoutHistoryPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcFiles = null; + $this->aCcShowInstances = null; + $this->collCcPlayoutHistoryMetaDatas = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcPlayoutHistoryQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcPlayoutHistoryPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcFiles !== null) { + if ($this->aCcFiles->isModified() || $this->aCcFiles->isNew()) { + $affectedRows += $this->aCcFiles->save($con); + } + $this->setCcFiles($this->aCcFiles); + } + + if ($this->aCcShowInstances !== null) { + if ($this->aCcShowInstances->isModified() || $this->aCcShowInstances->isNew()) { + $affectedRows += $this->aCcShowInstances->save($con); + } + $this->setCcShowInstances($this->aCcShowInstances); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->ccPlayoutHistoryMetaDatasScheduledForDeletion !== null) { + if (!$this->ccPlayoutHistoryMetaDatasScheduledForDeletion->isEmpty()) { + CcPlayoutHistoryMetaDataQuery::create() + ->filterByPrimaryKeys($this->ccPlayoutHistoryMetaDatasScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccPlayoutHistoryMetaDatasScheduledForDeletion = null; + } + } + + if ($this->collCcPlayoutHistoryMetaDatas !== null) { + foreach ($this->collCcPlayoutHistoryMetaDatas as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcPlayoutHistoryPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcPlayoutHistoryPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_playout_history_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcPlayoutHistoryPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcPlayoutHistoryPeer::FILE_ID)) { + $modifiedColumns[':p' . $index++] = '"file_id"'; + } + if ($this->isColumnModified(CcPlayoutHistoryPeer::STARTS)) { + $modifiedColumns[':p' . $index++] = '"starts"'; + } + if ($this->isColumnModified(CcPlayoutHistoryPeer::ENDS)) { + $modifiedColumns[':p' . $index++] = '"ends"'; + } + if ($this->isColumnModified(CcPlayoutHistoryPeer::INSTANCE_ID)) { + $modifiedColumns[':p' . $index++] = '"instance_id"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_playout_history" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"file_id"': + $stmt->bindValue($identifier, $this->file_id, PDO::PARAM_INT); + break; + case '"starts"': + $stmt->bindValue($identifier, $this->starts, PDO::PARAM_STR); + break; + case '"ends"': + $stmt->bindValue($identifier, $this->ends, PDO::PARAM_STR); + break; + case '"instance_id"': + $stmt->bindValue($identifier, $this->instance_id, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcFiles !== null) { + if (!$this->aCcFiles->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcFiles->getValidationFailures()); + } + } + + if ($this->aCcShowInstances !== null) { + if (!$this->aCcShowInstances->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcShowInstances->getValidationFailures()); + } + } + + + if (($retval = CcPlayoutHistoryPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + if ($this->collCcPlayoutHistoryMetaDatas !== null) { + foreach ($this->collCcPlayoutHistoryMetaDatas as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPlayoutHistoryPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbFileId(); + break; + case 2: + return $this->getDbStarts(); + break; + case 3: + return $this->getDbEnds(); + break; + case 4: + return $this->getDbInstanceId(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcPlayoutHistory'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcPlayoutHistory'][$this->getPrimaryKey()] = true; + $keys = CcPlayoutHistoryPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbFileId(), + $keys[2] => $this->getDbStarts(), + $keys[3] => $this->getDbEnds(), + $keys[4] => $this->getDbInstanceId(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcFiles) { + $result['CcFiles'] = $this->aCcFiles->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->aCcShowInstances) { + $result['CcShowInstances'] = $this->aCcShowInstances->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->collCcPlayoutHistoryMetaDatas) { + $result['CcPlayoutHistoryMetaDatas'] = $this->collCcPlayoutHistoryMetaDatas->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPlayoutHistoryPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbFileId($value); + break; + case 2: + $this->setDbStarts($value); + break; + case 3: + $this->setDbEnds($value); + break; + case 4: + $this->setDbInstanceId($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcPlayoutHistoryPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbFileId($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbStarts($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbEnds($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbInstanceId($arr[$keys[4]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcPlayoutHistoryPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcPlayoutHistoryPeer::ID)) $criteria->add(CcPlayoutHistoryPeer::ID, $this->id); + if ($this->isColumnModified(CcPlayoutHistoryPeer::FILE_ID)) $criteria->add(CcPlayoutHistoryPeer::FILE_ID, $this->file_id); + if ($this->isColumnModified(CcPlayoutHistoryPeer::STARTS)) $criteria->add(CcPlayoutHistoryPeer::STARTS, $this->starts); + if ($this->isColumnModified(CcPlayoutHistoryPeer::ENDS)) $criteria->add(CcPlayoutHistoryPeer::ENDS, $this->ends); + if ($this->isColumnModified(CcPlayoutHistoryPeer::INSTANCE_ID)) $criteria->add(CcPlayoutHistoryPeer::INSTANCE_ID, $this->instance_id); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcPlayoutHistoryPeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcPlayoutHistory (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbFileId($this->getDbFileId()); + $copyObj->setDbStarts($this->getDbStarts()); + $copyObj->setDbEnds($this->getDbEnds()); + $copyObj->setDbInstanceId($this->getDbInstanceId()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + foreach ($this->getCcPlayoutHistoryMetaDatas() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcPlayoutHistoryMetaData($relObj->copy($deepCopy)); + } + } + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcPlayoutHistory Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcPlayoutHistoryPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcPlayoutHistoryPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcFiles object. + * + * @param CcFiles $v + * @return CcPlayoutHistory The current object (for fluent API support) + * @throws PropelException + */ + public function setCcFiles(CcFiles $v = null) + { + if ($v === null) { + $this->setDbFileId(NULL); + } else { + $this->setDbFileId($v->getDbId()); + } + + $this->aCcFiles = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcFiles object, it will not be re-added. + if ($v !== null) { + $v->addCcPlayoutHistory($this); + } + + + return $this; + } + + + /** + * Get the associated CcFiles object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcFiles The associated CcFiles object. + * @throws PropelException + */ + public function getCcFiles(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcFiles === null && ($this->file_id !== null) && $doQuery) { + $this->aCcFiles = CcFilesQuery::create()->findPk($this->file_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcFiles->addCcPlayoutHistorys($this); + */ + } + + return $this->aCcFiles; + } + + /** + * Declares an association between this object and a CcShowInstances object. + * + * @param CcShowInstances $v + * @return CcPlayoutHistory The current object (for fluent API support) + * @throws PropelException + */ + public function setCcShowInstances(CcShowInstances $v = null) + { + if ($v === null) { + $this->setDbInstanceId(NULL); + } else { + $this->setDbInstanceId($v->getDbId()); + } + + $this->aCcShowInstances = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcShowInstances object, it will not be re-added. + if ($v !== null) { + $v->addCcPlayoutHistory($this); + } + + + return $this; + } + + + /** + * Get the associated CcShowInstances object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcShowInstances The associated CcShowInstances object. + * @throws PropelException + */ + public function getCcShowInstances(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcShowInstances === null && ($this->instance_id !== null) && $doQuery) { + $this->aCcShowInstances = CcShowInstancesQuery::create()->findPk($this->instance_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcShowInstances->addCcPlayoutHistorys($this); + */ + } + + return $this->aCcShowInstances; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CcPlayoutHistoryMetaData' == $relationName) { + $this->initCcPlayoutHistoryMetaDatas(); + } + } + + /** + * Clears out the collCcPlayoutHistoryMetaDatas collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcPlayoutHistory The current object (for fluent API support) + * @see addCcPlayoutHistoryMetaDatas() + */ + public function clearCcPlayoutHistoryMetaDatas() + { + $this->collCcPlayoutHistoryMetaDatas = null; // important to set this to null since that means it is uninitialized + $this->collCcPlayoutHistoryMetaDatasPartial = null; + + return $this; + } + + /** + * reset is the collCcPlayoutHistoryMetaDatas collection loaded partially + * + * @return void + */ + public function resetPartialCcPlayoutHistoryMetaDatas($v = true) + { + $this->collCcPlayoutHistoryMetaDatasPartial = $v; + } + + /** + * Initializes the collCcPlayoutHistoryMetaDatas collection. + * + * By default this just sets the collCcPlayoutHistoryMetaDatas collection to an empty array (like clearcollCcPlayoutHistoryMetaDatas()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcPlayoutHistoryMetaDatas($overrideExisting = true) + { + if (null !== $this->collCcPlayoutHistoryMetaDatas && !$overrideExisting) { + return; + } + $this->collCcPlayoutHistoryMetaDatas = new PropelObjectCollection(); + $this->collCcPlayoutHistoryMetaDatas->setModel('CcPlayoutHistoryMetaData'); + } + + /** + * Gets an array of CcPlayoutHistoryMetaData objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcPlayoutHistory is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcPlayoutHistoryMetaData[] List of CcPlayoutHistoryMetaData objects + * @throws PropelException + */ + public function getCcPlayoutHistoryMetaDatas($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcPlayoutHistoryMetaDatasPartial && !$this->isNew(); + if (null === $this->collCcPlayoutHistoryMetaDatas || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlayoutHistoryMetaDatas) { + // return empty collection + $this->initCcPlayoutHistoryMetaDatas(); + } else { + $collCcPlayoutHistoryMetaDatas = CcPlayoutHistoryMetaDataQuery::create(null, $criteria) + ->filterByCcPlayoutHistory($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcPlayoutHistoryMetaDatasPartial && count($collCcPlayoutHistoryMetaDatas)) { + $this->initCcPlayoutHistoryMetaDatas(false); + + foreach ($collCcPlayoutHistoryMetaDatas as $obj) { + if (false == $this->collCcPlayoutHistoryMetaDatas->contains($obj)) { + $this->collCcPlayoutHistoryMetaDatas->append($obj); + } + } + + $this->collCcPlayoutHistoryMetaDatasPartial = true; + } + + $collCcPlayoutHistoryMetaDatas->getInternalIterator()->rewind(); + + return $collCcPlayoutHistoryMetaDatas; + } + + if ($partial && $this->collCcPlayoutHistoryMetaDatas) { + foreach ($this->collCcPlayoutHistoryMetaDatas as $obj) { + if ($obj->isNew()) { + $collCcPlayoutHistoryMetaDatas[] = $obj; + } + } + } + + $this->collCcPlayoutHistoryMetaDatas = $collCcPlayoutHistoryMetaDatas; + $this->collCcPlayoutHistoryMetaDatasPartial = false; + } + } + + return $this->collCcPlayoutHistoryMetaDatas; + } + + /** + * Sets a collection of CcPlayoutHistoryMetaData objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccPlayoutHistoryMetaDatas A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcPlayoutHistory The current object (for fluent API support) + */ + public function setCcPlayoutHistoryMetaDatas(PropelCollection $ccPlayoutHistoryMetaDatas, PropelPDO $con = null) + { + $ccPlayoutHistoryMetaDatasToDelete = $this->getCcPlayoutHistoryMetaDatas(new Criteria(), $con)->diff($ccPlayoutHistoryMetaDatas); + + + $this->ccPlayoutHistoryMetaDatasScheduledForDeletion = $ccPlayoutHistoryMetaDatasToDelete; + + foreach ($ccPlayoutHistoryMetaDatasToDelete as $ccPlayoutHistoryMetaDataRemoved) { + $ccPlayoutHistoryMetaDataRemoved->setCcPlayoutHistory(null); + } + + $this->collCcPlayoutHistoryMetaDatas = null; + foreach ($ccPlayoutHistoryMetaDatas as $ccPlayoutHistoryMetaData) { + $this->addCcPlayoutHistoryMetaData($ccPlayoutHistoryMetaData); + } + + $this->collCcPlayoutHistoryMetaDatas = $ccPlayoutHistoryMetaDatas; + $this->collCcPlayoutHistoryMetaDatasPartial = false; + + return $this; + } + + /** + * Returns the number of related CcPlayoutHistoryMetaData objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcPlayoutHistoryMetaData objects. + * @throws PropelException + */ + public function countCcPlayoutHistoryMetaDatas(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcPlayoutHistoryMetaDatasPartial && !$this->isNew(); + if (null === $this->collCcPlayoutHistoryMetaDatas || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlayoutHistoryMetaDatas) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcPlayoutHistoryMetaDatas()); + } + $query = CcPlayoutHistoryMetaDataQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcPlayoutHistory($this) + ->count($con); + } + + return count($this->collCcPlayoutHistoryMetaDatas); + } + + /** + * Method called to associate a CcPlayoutHistoryMetaData object to this object + * through the CcPlayoutHistoryMetaData foreign key attribute. + * + * @param CcPlayoutHistoryMetaData $l CcPlayoutHistoryMetaData + * @return CcPlayoutHistory The current object (for fluent API support) + */ + public function addCcPlayoutHistoryMetaData(CcPlayoutHistoryMetaData $l) + { + if ($this->collCcPlayoutHistoryMetaDatas === null) { + $this->initCcPlayoutHistoryMetaDatas(); + $this->collCcPlayoutHistoryMetaDatasPartial = true; + } + + if (!in_array($l, $this->collCcPlayoutHistoryMetaDatas->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcPlayoutHistoryMetaData($l); + + if ($this->ccPlayoutHistoryMetaDatasScheduledForDeletion and $this->ccPlayoutHistoryMetaDatasScheduledForDeletion->contains($l)) { + $this->ccPlayoutHistoryMetaDatasScheduledForDeletion->remove($this->ccPlayoutHistoryMetaDatasScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcPlayoutHistoryMetaData $ccPlayoutHistoryMetaData The ccPlayoutHistoryMetaData object to add. + */ + protected function doAddCcPlayoutHistoryMetaData($ccPlayoutHistoryMetaData) + { + $this->collCcPlayoutHistoryMetaDatas[]= $ccPlayoutHistoryMetaData; + $ccPlayoutHistoryMetaData->setCcPlayoutHistory($this); + } + + /** + * @param CcPlayoutHistoryMetaData $ccPlayoutHistoryMetaData The ccPlayoutHistoryMetaData object to remove. + * @return CcPlayoutHistory The current object (for fluent API support) + */ + public function removeCcPlayoutHistoryMetaData($ccPlayoutHistoryMetaData) + { + if ($this->getCcPlayoutHistoryMetaDatas()->contains($ccPlayoutHistoryMetaData)) { + $this->collCcPlayoutHistoryMetaDatas->remove($this->collCcPlayoutHistoryMetaDatas->search($ccPlayoutHistoryMetaData)); + if (null === $this->ccPlayoutHistoryMetaDatasScheduledForDeletion) { + $this->ccPlayoutHistoryMetaDatasScheduledForDeletion = clone $this->collCcPlayoutHistoryMetaDatas; + $this->ccPlayoutHistoryMetaDatasScheduledForDeletion->clear(); + } + $this->ccPlayoutHistoryMetaDatasScheduledForDeletion[]= clone $ccPlayoutHistoryMetaData; + $ccPlayoutHistoryMetaData->setCcPlayoutHistory(null); + } + + return $this; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->file_id = null; + $this->starts = null; + $this->ends = null; + $this->instance_id = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCcPlayoutHistoryMetaDatas) { + foreach ($this->collCcPlayoutHistoryMetaDatas as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->aCcFiles instanceof Persistent) { + $this->aCcFiles->clearAllReferences($deep); + } + if ($this->aCcShowInstances instanceof Persistent) { + $this->aCcShowInstances->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + if ($this->collCcPlayoutHistoryMetaDatas instanceof PropelCollection) { + $this->collCcPlayoutHistoryMetaDatas->clearIterator(); + } + $this->collCcPlayoutHistoryMetaDatas = null; + $this->aCcFiles = null; + $this->aCcShowInstances = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcPlayoutHistoryPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryMetaData.php b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryMetaData.php index a0cbb9539b..84747072b5 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryMetaData.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryMetaData.php @@ -4,902 +4,1048 @@ /** * Base class that represents a row from the 'cc_playout_history_metadata' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcPlayoutHistoryMetaData extends BaseObject implements Persistent +abstract class BaseCcPlayoutHistoryMetaData extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcPlayoutHistoryMetaDataPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcPlayoutHistoryMetaDataPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the history_id field. - * @var int - */ - protected $history_id; - - /** - * The value for the key field. - * @var string - */ - protected $key; - - /** - * The value for the value field. - * @var string - */ - protected $value; - - /** - * @var CcPlayoutHistory - */ - protected $aCcPlayoutHistory; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [history_id] column value. - * - * @return int - */ - public function getDbHistoryId() - { - return $this->history_id; - } - - /** - * Get the [key] column value. - * - * @return string - */ - public function getDbKey() - { - return $this->key; - } - - /** - * Get the [value] column value. - * - * @return string - */ - public function getDbValue() - { - return $this->value; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcPlayoutHistoryMetaData The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcPlayoutHistoryMetaDataPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [history_id] column. - * - * @param int $v new value - * @return CcPlayoutHistoryMetaData The current object (for fluent API support) - */ - public function setDbHistoryId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->history_id !== $v) { - $this->history_id = $v; - $this->modifiedColumns[] = CcPlayoutHistoryMetaDataPeer::HISTORY_ID; - } - - if ($this->aCcPlayoutHistory !== null && $this->aCcPlayoutHistory->getDbId() !== $v) { - $this->aCcPlayoutHistory = null; - } - - return $this; - } // setDbHistoryId() - - /** - * Set the value of [key] column. - * - * @param string $v new value - * @return CcPlayoutHistoryMetaData The current object (for fluent API support) - */ - public function setDbKey($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->key !== $v) { - $this->key = $v; - $this->modifiedColumns[] = CcPlayoutHistoryMetaDataPeer::KEY; - } - - return $this; - } // setDbKey() - - /** - * Set the value of [value] column. - * - * @param string $v new value - * @return CcPlayoutHistoryMetaData The current object (for fluent API support) - */ - public function setDbValue($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->value !== $v) { - $this->value = $v; - $this->modifiedColumns[] = CcPlayoutHistoryMetaDataPeer::VALUE; - } - - return $this; - } // setDbValue() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->history_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->key = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->value = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 4; // 4 = CcPlayoutHistoryMetaDataPeer::NUM_COLUMNS - CcPlayoutHistoryMetaDataPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcPlayoutHistoryMetaData object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcPlayoutHistory !== null && $this->history_id !== $this->aCcPlayoutHistory->getDbId()) { - $this->aCcPlayoutHistory = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcPlayoutHistoryMetaDataPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcPlayoutHistory = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcPlayoutHistoryMetaDataQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcPlayoutHistoryMetaDataPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcPlayoutHistory !== null) { - if ($this->aCcPlayoutHistory->isModified() || $this->aCcPlayoutHistory->isNew()) { - $affectedRows += $this->aCcPlayoutHistory->save($con); - } - $this->setCcPlayoutHistory($this->aCcPlayoutHistory); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcPlayoutHistoryMetaDataPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcPlayoutHistoryMetaDataPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlayoutHistoryMetaDataPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcPlayoutHistoryMetaDataPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcPlayoutHistory !== null) { - if (!$this->aCcPlayoutHistory->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcPlayoutHistory->getValidationFailures()); - } - } - - - if (($retval = CcPlayoutHistoryMetaDataPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPlayoutHistoryMetaDataPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbHistoryId(); - break; - case 2: - return $this->getDbKey(); - break; - case 3: - return $this->getDbValue(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcPlayoutHistoryMetaDataPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbHistoryId(), - $keys[2] => $this->getDbKey(), - $keys[3] => $this->getDbValue(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcPlayoutHistory) { - $result['CcPlayoutHistory'] = $this->aCcPlayoutHistory->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPlayoutHistoryMetaDataPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbHistoryId($value); - break; - case 2: - $this->setDbKey($value); - break; - case 3: - $this->setDbValue($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcPlayoutHistoryMetaDataPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbHistoryId($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbKey($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbValue($arr[$keys[3]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcPlayoutHistoryMetaDataPeer::ID)) $criteria->add(CcPlayoutHistoryMetaDataPeer::ID, $this->id); - if ($this->isColumnModified(CcPlayoutHistoryMetaDataPeer::HISTORY_ID)) $criteria->add(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, $this->history_id); - if ($this->isColumnModified(CcPlayoutHistoryMetaDataPeer::KEY)) $criteria->add(CcPlayoutHistoryMetaDataPeer::KEY, $this->key); - if ($this->isColumnModified(CcPlayoutHistoryMetaDataPeer::VALUE)) $criteria->add(CcPlayoutHistoryMetaDataPeer::VALUE, $this->value); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryMetaDataPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcPlayoutHistoryMetaData (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbHistoryId($this->history_id); - $copyObj->setDbKey($this->key); - $copyObj->setDbValue($this->value); - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcPlayoutHistoryMetaData Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcPlayoutHistoryMetaDataPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcPlayoutHistoryMetaDataPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcPlayoutHistory object. - * - * @param CcPlayoutHistory $v - * @return CcPlayoutHistoryMetaData The current object (for fluent API support) - * @throws PropelException - */ - public function setCcPlayoutHistory(CcPlayoutHistory $v = null) - { - if ($v === null) { - $this->setDbHistoryId(NULL); - } else { - $this->setDbHistoryId($v->getDbId()); - } - - $this->aCcPlayoutHistory = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcPlayoutHistory object, it will not be re-added. - if ($v !== null) { - $v->addCcPlayoutHistoryMetaData($this); - } - - return $this; - } - - - /** - * Get the associated CcPlayoutHistory object - * - * @param PropelPDO Optional Connection object. - * @return CcPlayoutHistory The associated CcPlayoutHistory object. - * @throws PropelException - */ - public function getCcPlayoutHistory(PropelPDO $con = null) - { - if ($this->aCcPlayoutHistory === null && ($this->history_id !== null)) { - $this->aCcPlayoutHistory = CcPlayoutHistoryQuery::create()->findPk($this->history_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcPlayoutHistory->addCcPlayoutHistoryMetaDatas($this); - */ - } - return $this->aCcPlayoutHistory; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->history_id = null; - $this->key = null; - $this->value = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcPlayoutHistory = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcPlayoutHistoryMetaData + /** + * Peer class name + */ + const PEER = 'CcPlayoutHistoryMetaDataPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcPlayoutHistoryMetaDataPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the history_id field. + * @var int + */ + protected $history_id; + + /** + * The value for the key field. + * @var string + */ + protected $key; + + /** + * The value for the value field. + * @var string + */ + protected $value; + + /** + * @var CcPlayoutHistory + */ + protected $aCcPlayoutHistory; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [history_id] column value. + * + * @return int + */ + public function getDbHistoryId() + { + + return $this->history_id; + } + + /** + * Get the [key] column value. + * + * @return string + */ + public function getDbKey() + { + + return $this->key; + } + + /** + * Get the [value] column value. + * + * @return string + */ + public function getDbValue() + { + + return $this->value; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcPlayoutHistoryMetaData The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcPlayoutHistoryMetaDataPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [history_id] column. + * + * @param int $v new value + * @return CcPlayoutHistoryMetaData The current object (for fluent API support) + */ + public function setDbHistoryId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->history_id !== $v) { + $this->history_id = $v; + $this->modifiedColumns[] = CcPlayoutHistoryMetaDataPeer::HISTORY_ID; + } + + if ($this->aCcPlayoutHistory !== null && $this->aCcPlayoutHistory->getDbId() !== $v) { + $this->aCcPlayoutHistory = null; + } + + + return $this; + } // setDbHistoryId() + + /** + * Set the value of [key] column. + * + * @param string $v new value + * @return CcPlayoutHistoryMetaData The current object (for fluent API support) + */ + public function setDbKey($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->key !== $v) { + $this->key = $v; + $this->modifiedColumns[] = CcPlayoutHistoryMetaDataPeer::KEY; + } + + + return $this; + } // setDbKey() + + /** + * Set the value of [value] column. + * + * @param string $v new value + * @return CcPlayoutHistoryMetaData The current object (for fluent API support) + */ + public function setDbValue($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->value !== $v) { + $this->value = $v; + $this->modifiedColumns[] = CcPlayoutHistoryMetaDataPeer::VALUE; + } + + + return $this; + } // setDbValue() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->history_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->key = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->value = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 4; // 4 = CcPlayoutHistoryMetaDataPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcPlayoutHistoryMetaData object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcPlayoutHistory !== null && $this->history_id !== $this->aCcPlayoutHistory->getDbId()) { + $this->aCcPlayoutHistory = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcPlayoutHistoryMetaDataPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcPlayoutHistory = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcPlayoutHistoryMetaDataQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcPlayoutHistoryMetaDataPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcPlayoutHistory !== null) { + if ($this->aCcPlayoutHistory->isModified() || $this->aCcPlayoutHistory->isNew()) { + $affectedRows += $this->aCcPlayoutHistory->save($con); + } + $this->setCcPlayoutHistory($this->aCcPlayoutHistory); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcPlayoutHistoryMetaDataPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcPlayoutHistoryMetaDataPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_playout_history_metadata_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcPlayoutHistoryMetaDataPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcPlayoutHistoryMetaDataPeer::HISTORY_ID)) { + $modifiedColumns[':p' . $index++] = '"history_id"'; + } + if ($this->isColumnModified(CcPlayoutHistoryMetaDataPeer::KEY)) { + $modifiedColumns[':p' . $index++] = '"key"'; + } + if ($this->isColumnModified(CcPlayoutHistoryMetaDataPeer::VALUE)) { + $modifiedColumns[':p' . $index++] = '"value"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_playout_history_metadata" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"history_id"': + $stmt->bindValue($identifier, $this->history_id, PDO::PARAM_INT); + break; + case '"key"': + $stmt->bindValue($identifier, $this->key, PDO::PARAM_STR); + break; + case '"value"': + $stmt->bindValue($identifier, $this->value, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcPlayoutHistory !== null) { + if (!$this->aCcPlayoutHistory->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcPlayoutHistory->getValidationFailures()); + } + } + + + if (($retval = CcPlayoutHistoryMetaDataPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPlayoutHistoryMetaDataPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbHistoryId(); + break; + case 2: + return $this->getDbKey(); + break; + case 3: + return $this->getDbValue(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcPlayoutHistoryMetaData'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcPlayoutHistoryMetaData'][$this->getPrimaryKey()] = true; + $keys = CcPlayoutHistoryMetaDataPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbHistoryId(), + $keys[2] => $this->getDbKey(), + $keys[3] => $this->getDbValue(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcPlayoutHistory) { + $result['CcPlayoutHistory'] = $this->aCcPlayoutHistory->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPlayoutHistoryMetaDataPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbHistoryId($value); + break; + case 2: + $this->setDbKey($value); + break; + case 3: + $this->setDbValue($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcPlayoutHistoryMetaDataPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbHistoryId($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbKey($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbValue($arr[$keys[3]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcPlayoutHistoryMetaDataPeer::ID)) $criteria->add(CcPlayoutHistoryMetaDataPeer::ID, $this->id); + if ($this->isColumnModified(CcPlayoutHistoryMetaDataPeer::HISTORY_ID)) $criteria->add(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, $this->history_id); + if ($this->isColumnModified(CcPlayoutHistoryMetaDataPeer::KEY)) $criteria->add(CcPlayoutHistoryMetaDataPeer::KEY, $this->key); + if ($this->isColumnModified(CcPlayoutHistoryMetaDataPeer::VALUE)) $criteria->add(CcPlayoutHistoryMetaDataPeer::VALUE, $this->value); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryMetaDataPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcPlayoutHistoryMetaData (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbHistoryId($this->getDbHistoryId()); + $copyObj->setDbKey($this->getDbKey()); + $copyObj->setDbValue($this->getDbValue()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcPlayoutHistoryMetaData Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcPlayoutHistoryMetaDataPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcPlayoutHistoryMetaDataPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcPlayoutHistory object. + * + * @param CcPlayoutHistory $v + * @return CcPlayoutHistoryMetaData The current object (for fluent API support) + * @throws PropelException + */ + public function setCcPlayoutHistory(CcPlayoutHistory $v = null) + { + if ($v === null) { + $this->setDbHistoryId(NULL); + } else { + $this->setDbHistoryId($v->getDbId()); + } + + $this->aCcPlayoutHistory = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcPlayoutHistory object, it will not be re-added. + if ($v !== null) { + $v->addCcPlayoutHistoryMetaData($this); + } + + + return $this; + } + + + /** + * Get the associated CcPlayoutHistory object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcPlayoutHistory The associated CcPlayoutHistory object. + * @throws PropelException + */ + public function getCcPlayoutHistory(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcPlayoutHistory === null && ($this->history_id !== null) && $doQuery) { + $this->aCcPlayoutHistory = CcPlayoutHistoryQuery::create()->findPk($this->history_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcPlayoutHistory->addCcPlayoutHistoryMetaDatas($this); + */ + } + + return $this->aCcPlayoutHistory; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->history_id = null; + $this->key = null; + $this->value = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcPlayoutHistory instanceof Persistent) { + $this->aCcPlayoutHistory->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcPlayoutHistory = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcPlayoutHistoryMetaDataPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryMetaDataPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryMetaDataPeer.php index 0b980ec4ee..f4d8560f8a 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryMetaDataPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryMetaDataPeer.php @@ -4,976 +4,1002 @@ /** * Base static class for performing query and update operations on the 'cc_playout_history_metadata' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcPlayoutHistoryMetaDataPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_playout_history_metadata'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcPlayoutHistoryMetaData'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcPlayoutHistoryMetaData'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcPlayoutHistoryMetaDataTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 4; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_playout_history_metadata.ID'; - - /** the column name for the HISTORY_ID field */ - const HISTORY_ID = 'cc_playout_history_metadata.HISTORY_ID'; - - /** the column name for the KEY field */ - const KEY = 'cc_playout_history_metadata.KEY'; - - /** the column name for the VALUE field */ - const VALUE = 'cc_playout_history_metadata.VALUE'; - - /** - * An identiy map to hold any loaded instances of CcPlayoutHistoryMetaData objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcPlayoutHistoryMetaData[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbHistoryId', 'DbKey', 'DbValue', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbHistoryId', 'dbKey', 'dbValue', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::HISTORY_ID, self::KEY, self::VALUE, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'HISTORY_ID', 'KEY', 'VALUE', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'history_id', 'key', 'value', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbHistoryId' => 1, 'DbKey' => 2, 'DbValue' => 3, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbHistoryId' => 1, 'dbKey' => 2, 'dbValue' => 3, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::HISTORY_ID => 1, self::KEY => 2, self::VALUE => 3, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'HISTORY_ID' => 1, 'KEY' => 2, 'VALUE' => 3, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'history_id' => 1, 'key' => 2, 'value' => 3, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcPlayoutHistoryMetaDataPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcPlayoutHistoryMetaDataPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcPlayoutHistoryMetaDataPeer::ID); - $criteria->addSelectColumn(CcPlayoutHistoryMetaDataPeer::HISTORY_ID); - $criteria->addSelectColumn(CcPlayoutHistoryMetaDataPeer::KEY); - $criteria->addSelectColumn(CcPlayoutHistoryMetaDataPeer::VALUE); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.HISTORY_ID'); - $criteria->addSelectColumn($alias . '.KEY'); - $criteria->addSelectColumn($alias . '.VALUE'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlayoutHistoryMetaDataPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlayoutHistoryMetaDataPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcPlayoutHistoryMetaData - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcPlayoutHistoryMetaDataPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcPlayoutHistoryMetaDataPeer::populateObjects(CcPlayoutHistoryMetaDataPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcPlayoutHistoryMetaDataPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcPlayoutHistoryMetaData $value A CcPlayoutHistoryMetaData object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcPlayoutHistoryMetaData $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcPlayoutHistoryMetaData object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcPlayoutHistoryMetaData) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPlayoutHistoryMetaData object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcPlayoutHistoryMetaData Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_playout_history_metadata - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcPlayoutHistoryMetaDataPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcPlayoutHistoryMetaDataPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcPlayoutHistoryMetaDataPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcPlayoutHistoryMetaDataPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcPlayoutHistoryMetaData object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcPlayoutHistoryMetaDataPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcPlayoutHistoryMetaDataPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcPlayoutHistoryMetaDataPeer::NUM_COLUMNS; - } else { - $cls = CcPlayoutHistoryMetaDataPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcPlayoutHistoryMetaDataPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcPlayoutHistory table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcPlayoutHistory(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlayoutHistoryMetaDataPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlayoutHistoryMetaDataPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, CcPlayoutHistoryPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcPlayoutHistoryMetaData objects pre-filled with their CcPlayoutHistory objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlayoutHistoryMetaData objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcPlayoutHistory(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlayoutHistoryMetaDataPeer::addSelectColumns($criteria); - $startcol = (CcPlayoutHistoryMetaDataPeer::NUM_COLUMNS - CcPlayoutHistoryMetaDataPeer::NUM_LAZY_LOAD_COLUMNS); - CcPlayoutHistoryPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, CcPlayoutHistoryPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlayoutHistoryMetaDataPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlayoutHistoryMetaDataPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcPlayoutHistoryMetaDataPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlayoutHistoryMetaDataPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcPlayoutHistoryPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcPlayoutHistoryPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcPlayoutHistoryPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcPlayoutHistoryMetaData) to $obj2 (CcPlayoutHistory) - $obj2->addCcPlayoutHistoryMetaData($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlayoutHistoryMetaDataPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlayoutHistoryMetaDataPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, CcPlayoutHistoryPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcPlayoutHistoryMetaData objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlayoutHistoryMetaData objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlayoutHistoryMetaDataPeer::addSelectColumns($criteria); - $startcol2 = (CcPlayoutHistoryMetaDataPeer::NUM_COLUMNS - CcPlayoutHistoryMetaDataPeer::NUM_LAZY_LOAD_COLUMNS); - - CcPlayoutHistoryPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcPlayoutHistoryPeer::NUM_COLUMNS - CcPlayoutHistoryPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, CcPlayoutHistoryPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlayoutHistoryMetaDataPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlayoutHistoryMetaDataPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcPlayoutHistoryMetaDataPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlayoutHistoryMetaDataPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcPlayoutHistory rows - - $key2 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcPlayoutHistoryPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcPlayoutHistoryPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcPlayoutHistoryPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcPlayoutHistoryMetaData) to the collection in $obj2 (CcPlayoutHistory) - $obj2->addCcPlayoutHistoryMetaData($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcPlayoutHistoryMetaDataPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcPlayoutHistoryMetaDataPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcPlayoutHistoryMetaDataTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcPlayoutHistoryMetaDataPeer::CLASS_DEFAULT : CcPlayoutHistoryMetaDataPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcPlayoutHistoryMetaData or Criteria object. - * - * @param mixed $values Criteria or CcPlayoutHistoryMetaData object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcPlayoutHistoryMetaData object - } - - if ($criteria->containsKey(CcPlayoutHistoryMetaDataPeer::ID) && $criteria->keyContainsValue(CcPlayoutHistoryMetaDataPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlayoutHistoryMetaDataPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcPlayoutHistoryMetaData or Criteria object. - * - * @param mixed $values Criteria or CcPlayoutHistoryMetaData object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcPlayoutHistoryMetaDataPeer::ID); - $value = $criteria->remove(CcPlayoutHistoryMetaDataPeer::ID); - if ($value) { - $selectCriteria->add(CcPlayoutHistoryMetaDataPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcPlayoutHistoryMetaDataPeer::TABLE_NAME); - } - - } else { // $values is CcPlayoutHistoryMetaData object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_playout_history_metadata table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcPlayoutHistoryMetaDataPeer::TABLE_NAME, $con, CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcPlayoutHistoryMetaDataPeer::clearInstancePool(); - CcPlayoutHistoryMetaDataPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcPlayoutHistoryMetaData or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcPlayoutHistoryMetaData object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcPlayoutHistoryMetaDataPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcPlayoutHistoryMetaData) { // it's a model object - // invalidate the cache for this single object - CcPlayoutHistoryMetaDataPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryMetaDataPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcPlayoutHistoryMetaDataPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcPlayoutHistoryMetaDataPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcPlayoutHistoryMetaData object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcPlayoutHistoryMetaData $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcPlayoutHistoryMetaData $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcPlayoutHistoryMetaDataPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, CcPlayoutHistoryMetaDataPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcPlayoutHistoryMetaData - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcPlayoutHistoryMetaDataPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryMetaDataPeer::ID, $pk); - - $v = CcPlayoutHistoryMetaDataPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryMetaDataPeer::ID, $pks, Criteria::IN); - $objs = CcPlayoutHistoryMetaDataPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcPlayoutHistoryMetaDataPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_playout_history_metadata'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcPlayoutHistoryMetaData'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcPlayoutHistoryMetaDataTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 4; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 4; + + /** the column name for the id field */ + const ID = 'cc_playout_history_metadata.id'; + + /** the column name for the history_id field */ + const HISTORY_ID = 'cc_playout_history_metadata.history_id'; + + /** the column name for the key field */ + const KEY = 'cc_playout_history_metadata.key'; + + /** the column name for the value field */ + const VALUE = 'cc_playout_history_metadata.value'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcPlayoutHistoryMetaData objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcPlayoutHistoryMetaData[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcPlayoutHistoryMetaDataPeer::$fieldNames[CcPlayoutHistoryMetaDataPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbHistoryId', 'DbKey', 'DbValue', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbHistoryId', 'dbKey', 'dbValue', ), + BasePeer::TYPE_COLNAME => array (CcPlayoutHistoryMetaDataPeer::ID, CcPlayoutHistoryMetaDataPeer::HISTORY_ID, CcPlayoutHistoryMetaDataPeer::KEY, CcPlayoutHistoryMetaDataPeer::VALUE, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'HISTORY_ID', 'KEY', 'VALUE', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'history_id', 'key', 'value', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcPlayoutHistoryMetaDataPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbHistoryId' => 1, 'DbKey' => 2, 'DbValue' => 3, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbHistoryId' => 1, 'dbKey' => 2, 'dbValue' => 3, ), + BasePeer::TYPE_COLNAME => array (CcPlayoutHistoryMetaDataPeer::ID => 0, CcPlayoutHistoryMetaDataPeer::HISTORY_ID => 1, CcPlayoutHistoryMetaDataPeer::KEY => 2, CcPlayoutHistoryMetaDataPeer::VALUE => 3, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'HISTORY_ID' => 1, 'KEY' => 2, 'VALUE' => 3, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'history_id' => 1, 'key' => 2, 'value' => 3, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcPlayoutHistoryMetaDataPeer::getFieldNames($toType); + $key = isset(CcPlayoutHistoryMetaDataPeer::$fieldKeys[$fromType][$name]) ? CcPlayoutHistoryMetaDataPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcPlayoutHistoryMetaDataPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcPlayoutHistoryMetaDataPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcPlayoutHistoryMetaDataPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcPlayoutHistoryMetaDataPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcPlayoutHistoryMetaDataPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcPlayoutHistoryMetaDataPeer::ID); + $criteria->addSelectColumn(CcPlayoutHistoryMetaDataPeer::HISTORY_ID); + $criteria->addSelectColumn(CcPlayoutHistoryMetaDataPeer::KEY); + $criteria->addSelectColumn(CcPlayoutHistoryMetaDataPeer::VALUE); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.history_id'); + $criteria->addSelectColumn($alias . '.key'); + $criteria->addSelectColumn($alias . '.value'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlayoutHistoryMetaDataPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlayoutHistoryMetaDataPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcPlayoutHistoryMetaData + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcPlayoutHistoryMetaDataPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcPlayoutHistoryMetaDataPeer::populateObjects(CcPlayoutHistoryMetaDataPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcPlayoutHistoryMetaDataPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcPlayoutHistoryMetaData $obj A CcPlayoutHistoryMetaData object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcPlayoutHistoryMetaDataPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcPlayoutHistoryMetaData object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcPlayoutHistoryMetaData) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPlayoutHistoryMetaData object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcPlayoutHistoryMetaDataPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcPlayoutHistoryMetaData Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcPlayoutHistoryMetaDataPeer::$instances[$key])) { + return CcPlayoutHistoryMetaDataPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcPlayoutHistoryMetaDataPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcPlayoutHistoryMetaDataPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_playout_history_metadata + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcPlayoutHistoryMetaDataPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcPlayoutHistoryMetaDataPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcPlayoutHistoryMetaDataPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcPlayoutHistoryMetaDataPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcPlayoutHistoryMetaData object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcPlayoutHistoryMetaDataPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcPlayoutHistoryMetaDataPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcPlayoutHistoryMetaDataPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcPlayoutHistoryMetaDataPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcPlayoutHistoryMetaDataPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcPlayoutHistory table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcPlayoutHistory(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlayoutHistoryMetaDataPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlayoutHistoryMetaDataPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, CcPlayoutHistoryPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcPlayoutHistoryMetaData objects pre-filled with their CcPlayoutHistory objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlayoutHistoryMetaData objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcPlayoutHistory(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + } + + CcPlayoutHistoryMetaDataPeer::addSelectColumns($criteria); + $startcol = CcPlayoutHistoryMetaDataPeer::NUM_HYDRATE_COLUMNS; + CcPlayoutHistoryPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, CcPlayoutHistoryPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlayoutHistoryMetaDataPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlayoutHistoryMetaDataPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcPlayoutHistoryMetaDataPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlayoutHistoryMetaDataPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcPlayoutHistoryPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcPlayoutHistoryPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcPlayoutHistoryPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcPlayoutHistoryMetaData) to $obj2 (CcPlayoutHistory) + $obj2->addCcPlayoutHistoryMetaData($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlayoutHistoryMetaDataPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlayoutHistoryMetaDataPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, CcPlayoutHistoryPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcPlayoutHistoryMetaData objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlayoutHistoryMetaData objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + } + + CcPlayoutHistoryMetaDataPeer::addSelectColumns($criteria); + $startcol2 = CcPlayoutHistoryMetaDataPeer::NUM_HYDRATE_COLUMNS; + + CcPlayoutHistoryPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcPlayoutHistoryPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, CcPlayoutHistoryPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlayoutHistoryMetaDataPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlayoutHistoryMetaDataPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcPlayoutHistoryMetaDataPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlayoutHistoryMetaDataPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcPlayoutHistory rows + + $key2 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcPlayoutHistoryPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcPlayoutHistoryPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcPlayoutHistoryPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcPlayoutHistoryMetaData) to the collection in $obj2 (CcPlayoutHistory) + $obj2->addCcPlayoutHistoryMetaData($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME)->getTable(CcPlayoutHistoryMetaDataPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcPlayoutHistoryMetaDataPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcPlayoutHistoryMetaDataTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcPlayoutHistoryMetaDataPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcPlayoutHistoryMetaData or Criteria object. + * + * @param mixed $values Criteria or CcPlayoutHistoryMetaData object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcPlayoutHistoryMetaData object + } + + if ($criteria->containsKey(CcPlayoutHistoryMetaDataPeer::ID) && $criteria->keyContainsValue(CcPlayoutHistoryMetaDataPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlayoutHistoryMetaDataPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcPlayoutHistoryMetaData or Criteria object. + * + * @param mixed $values Criteria or CcPlayoutHistoryMetaData object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcPlayoutHistoryMetaDataPeer::ID); + $value = $criteria->remove(CcPlayoutHistoryMetaDataPeer::ID); + if ($value) { + $selectCriteria->add(CcPlayoutHistoryMetaDataPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcPlayoutHistoryMetaDataPeer::TABLE_NAME); + } + + } else { // $values is CcPlayoutHistoryMetaData object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_playout_history_metadata table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcPlayoutHistoryMetaDataPeer::TABLE_NAME, $con, CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcPlayoutHistoryMetaDataPeer::clearInstancePool(); + CcPlayoutHistoryMetaDataPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcPlayoutHistoryMetaData or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcPlayoutHistoryMetaData object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcPlayoutHistoryMetaDataPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcPlayoutHistoryMetaData) { // it's a model object + // invalidate the cache for this single object + CcPlayoutHistoryMetaDataPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryMetaDataPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcPlayoutHistoryMetaDataPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcPlayoutHistoryMetaDataPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcPlayoutHistoryMetaData object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcPlayoutHistoryMetaData $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcPlayoutHistoryMetaDataPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, CcPlayoutHistoryMetaDataPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcPlayoutHistoryMetaData + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcPlayoutHistoryMetaDataPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryMetaDataPeer::ID, $pk); + + $v = CcPlayoutHistoryMetaDataPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcPlayoutHistoryMetaData[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryMetaDataPeer::ID, $pks, Criteria::IN); + $objs = CcPlayoutHistoryMetaDataPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcPlayoutHistoryMetaDataPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryMetaDataQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryMetaDataQuery.php index 7a27c61afa..94246ff895 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryMetaDataQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryMetaDataQuery.php @@ -4,317 +4,467 @@ /** * Base class that represents a query for the 'cc_playout_history_metadata' table. * - * * - * @method CcPlayoutHistoryMetaDataQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcPlayoutHistoryMetaDataQuery orderByDbHistoryId($order = Criteria::ASC) Order by the history_id column - * @method CcPlayoutHistoryMetaDataQuery orderByDbKey($order = Criteria::ASC) Order by the key column - * @method CcPlayoutHistoryMetaDataQuery orderByDbValue($order = Criteria::ASC) Order by the value column * - * @method CcPlayoutHistoryMetaDataQuery groupByDbId() Group by the id column - * @method CcPlayoutHistoryMetaDataQuery groupByDbHistoryId() Group by the history_id column - * @method CcPlayoutHistoryMetaDataQuery groupByDbKey() Group by the key column - * @method CcPlayoutHistoryMetaDataQuery groupByDbValue() Group by the value column + * @method CcPlayoutHistoryMetaDataQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcPlayoutHistoryMetaDataQuery orderByDbHistoryId($order = Criteria::ASC) Order by the history_id column + * @method CcPlayoutHistoryMetaDataQuery orderByDbKey($order = Criteria::ASC) Order by the key column + * @method CcPlayoutHistoryMetaDataQuery orderByDbValue($order = Criteria::ASC) Order by the value column * - * @method CcPlayoutHistoryMetaDataQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcPlayoutHistoryMetaDataQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcPlayoutHistoryMetaDataQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcPlayoutHistoryMetaDataQuery groupByDbId() Group by the id column + * @method CcPlayoutHistoryMetaDataQuery groupByDbHistoryId() Group by the history_id column + * @method CcPlayoutHistoryMetaDataQuery groupByDbKey() Group by the key column + * @method CcPlayoutHistoryMetaDataQuery groupByDbValue() Group by the value column * - * @method CcPlayoutHistoryMetaDataQuery leftJoinCcPlayoutHistory($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcPlayoutHistory relation - * @method CcPlayoutHistoryMetaDataQuery rightJoinCcPlayoutHistory($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcPlayoutHistory relation - * @method CcPlayoutHistoryMetaDataQuery innerJoinCcPlayoutHistory($relationAlias = '') Adds a INNER JOIN clause to the query using the CcPlayoutHistory relation + * @method CcPlayoutHistoryMetaDataQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcPlayoutHistoryMetaDataQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcPlayoutHistoryMetaDataQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcPlayoutHistoryMetaData findOne(PropelPDO $con = null) Return the first CcPlayoutHistoryMetaData matching the query - * @method CcPlayoutHistoryMetaData findOneOrCreate(PropelPDO $con = null) Return the first CcPlayoutHistoryMetaData matching the query, or a new CcPlayoutHistoryMetaData object populated from the query conditions when no match is found + * @method CcPlayoutHistoryMetaDataQuery leftJoinCcPlayoutHistory($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPlayoutHistory relation + * @method CcPlayoutHistoryMetaDataQuery rightJoinCcPlayoutHistory($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlayoutHistory relation + * @method CcPlayoutHistoryMetaDataQuery innerJoinCcPlayoutHistory($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlayoutHistory relation * - * @method CcPlayoutHistoryMetaData findOneByDbId(int $id) Return the first CcPlayoutHistoryMetaData filtered by the id column - * @method CcPlayoutHistoryMetaData findOneByDbHistoryId(int $history_id) Return the first CcPlayoutHistoryMetaData filtered by the history_id column - * @method CcPlayoutHistoryMetaData findOneByDbKey(string $key) Return the first CcPlayoutHistoryMetaData filtered by the key column - * @method CcPlayoutHistoryMetaData findOneByDbValue(string $value) Return the first CcPlayoutHistoryMetaData filtered by the value column + * @method CcPlayoutHistoryMetaData findOne(PropelPDO $con = null) Return the first CcPlayoutHistoryMetaData matching the query + * @method CcPlayoutHistoryMetaData findOneOrCreate(PropelPDO $con = null) Return the first CcPlayoutHistoryMetaData matching the query, or a new CcPlayoutHistoryMetaData object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcPlayoutHistoryMetaData objects filtered by the id column - * @method array findByDbHistoryId(int $history_id) Return CcPlayoutHistoryMetaData objects filtered by the history_id column - * @method array findByDbKey(string $key) Return CcPlayoutHistoryMetaData objects filtered by the key column - * @method array findByDbValue(string $value) Return CcPlayoutHistoryMetaData objects filtered by the value column + * @method CcPlayoutHistoryMetaData findOneByDbHistoryId(int $history_id) Return the first CcPlayoutHistoryMetaData filtered by the history_id column + * @method CcPlayoutHistoryMetaData findOneByDbKey(string $key) Return the first CcPlayoutHistoryMetaData filtered by the key column + * @method CcPlayoutHistoryMetaData findOneByDbValue(string $value) Return the first CcPlayoutHistoryMetaData filtered by the value column + * + * @method array findByDbId(int $id) Return CcPlayoutHistoryMetaData objects filtered by the id column + * @method array findByDbHistoryId(int $history_id) Return CcPlayoutHistoryMetaData objects filtered by the history_id column + * @method array findByDbKey(string $key) Return CcPlayoutHistoryMetaData objects filtered by the key column + * @method array findByDbValue(string $value) Return CcPlayoutHistoryMetaData objects filtered by the value column * * @package propel.generator.airtime.om */ abstract class BaseCcPlayoutHistoryMetaDataQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcPlayoutHistoryMetaDataQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcPlayoutHistoryMetaData'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcPlayoutHistoryMetaDataQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcPlayoutHistoryMetaDataQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcPlayoutHistoryMetaDataQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcPlayoutHistoryMetaDataQuery) { + return $criteria; + } + $query = new CcPlayoutHistoryMetaDataQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcPlayoutHistoryMetaData|CcPlayoutHistoryMetaData[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcPlayoutHistoryMetaDataPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryMetaDataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlayoutHistoryMetaData A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlayoutHistoryMetaData A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "history_id", "key", "value" FROM "cc_playout_history_metadata" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcPlayoutHistoryMetaData(); + $obj->hydrate($row); + CcPlayoutHistoryMetaDataPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlayoutHistoryMetaData|CcPlayoutHistoryMetaData[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcPlayoutHistoryMetaData[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the history_id column + * + * Example usage: + * + * $query->filterByDbHistoryId(1234); // WHERE history_id = 1234 + * $query->filterByDbHistoryId(array(12, 34)); // WHERE history_id IN (12, 34) + * $query->filterByDbHistoryId(array('min' => 12)); // WHERE history_id >= 12 + * $query->filterByDbHistoryId(array('max' => 12)); // WHERE history_id <= 12 + * + * + * @see filterByCcPlayoutHistory() + * + * @param mixed $dbHistoryId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface + */ + public function filterByDbHistoryId($dbHistoryId = null, $comparison = null) + { + if (is_array($dbHistoryId)) { + $useMinMax = false; + if (isset($dbHistoryId['min'])) { + $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, $dbHistoryId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbHistoryId['max'])) { + $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, $dbHistoryId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, $dbHistoryId, $comparison); + } + + /** + * Filter the query on the key column + * + * Example usage: + * + * $query->filterByDbKey('fooValue'); // WHERE key = 'fooValue' + * $query->filterByDbKey('%fooValue%'); // WHERE key LIKE '%fooValue%' + * + * + * @param string $dbKey The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface + */ + public function filterByDbKey($dbKey = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbKey)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbKey)) { + $dbKey = str_replace('*', '%', $dbKey); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::KEY, $dbKey, $comparison); + } + + /** + * Filter the query on the value column + * + * Example usage: + * + * $query->filterByDbValue('fooValue'); // WHERE value = 'fooValue' + * $query->filterByDbValue('%fooValue%'); // WHERE value LIKE '%fooValue%' + * + * + * @param string $dbValue The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface + */ + public function filterByDbValue($dbValue = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbValue)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbValue)) { + $dbValue = str_replace('*', '%', $dbValue); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::VALUE, $dbValue, $comparison); + } + + /** + * Filter the query by a related CcPlayoutHistory object + * + * @param CcPlayoutHistory|PropelObjectCollection $ccPlayoutHistory The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcPlayoutHistory($ccPlayoutHistory, $comparison = null) + { + if ($ccPlayoutHistory instanceof CcPlayoutHistory) { + return $this + ->addUsingAlias(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, $ccPlayoutHistory->getDbId(), $comparison); + } elseif ($ccPlayoutHistory instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, $ccPlayoutHistory->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcPlayoutHistory() only accepts arguments of type CcPlayoutHistory or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcPlayoutHistory relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface + */ + public function joinCcPlayoutHistory($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcPlayoutHistory'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcPlayoutHistory'); + } + + return $this; + } + + /** + * Use the CcPlayoutHistory relation CcPlayoutHistory object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlayoutHistoryQuery A secondary query class using the current class as primary query + */ + public function useCcPlayoutHistoryQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcPlayoutHistory($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistory', 'CcPlayoutHistoryQuery'); + } + + /** + * Exclude object from result + * + * @param CcPlayoutHistoryMetaData $ccPlayoutHistoryMetaData Object to remove from the list of results + * + * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface + */ + public function prune($ccPlayoutHistoryMetaData = null) + { + if ($ccPlayoutHistoryMetaData) { + $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::ID, $ccPlayoutHistoryMetaData->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcPlayoutHistoryMetaDataQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcPlayoutHistoryMetaData', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcPlayoutHistoryMetaDataQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcPlayoutHistoryMetaDataQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcPlayoutHistoryMetaDataQuery) { - return $criteria; - } - $query = new CcPlayoutHistoryMetaDataQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcPlayoutHistoryMetaData|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcPlayoutHistoryMetaDataPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the history_id column - * - * @param int|array $dbHistoryId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface - */ - public function filterByDbHistoryId($dbHistoryId = null, $comparison = null) - { - if (is_array($dbHistoryId)) { - $useMinMax = false; - if (isset($dbHistoryId['min'])) { - $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, $dbHistoryId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbHistoryId['max'])) { - $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, $dbHistoryId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, $dbHistoryId, $comparison); - } - - /** - * Filter the query on the key column - * - * @param string $dbKey The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface - */ - public function filterByDbKey($dbKey = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbKey)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbKey)) { - $dbKey = str_replace('*', '%', $dbKey); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::KEY, $dbKey, $comparison); - } - - /** - * Filter the query on the value column - * - * @param string $dbValue The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface - */ - public function filterByDbValue($dbValue = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbValue)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbValue)) { - $dbValue = str_replace('*', '%', $dbValue); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::VALUE, $dbValue, $comparison); - } - - /** - * Filter the query by a related CcPlayoutHistory object - * - * @param CcPlayoutHistory $ccPlayoutHistory the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface - */ - public function filterByCcPlayoutHistory($ccPlayoutHistory, $comparison = null) - { - return $this - ->addUsingAlias(CcPlayoutHistoryMetaDataPeer::HISTORY_ID, $ccPlayoutHistory->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcPlayoutHistory relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface - */ - public function joinCcPlayoutHistory($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcPlayoutHistory'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcPlayoutHistory'); - } - - return $this; - } - - /** - * Use the CcPlayoutHistory relation CcPlayoutHistory object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlayoutHistoryQuery A secondary query class using the current class as primary query - */ - public function useCcPlayoutHistoryQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcPlayoutHistory($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistory', 'CcPlayoutHistoryQuery'); - } - - /** - * Exclude object from result - * - * @param CcPlayoutHistoryMetaData $ccPlayoutHistoryMetaData Object to remove from the list of results - * - * @return CcPlayoutHistoryMetaDataQuery The current query, for fluid interface - */ - public function prune($ccPlayoutHistoryMetaData = null) - { - if ($ccPlayoutHistoryMetaData) { - $this->addUsingAlias(CcPlayoutHistoryMetaDataPeer::ID, $ccPlayoutHistoryMetaData->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcPlayoutHistoryMetaDataQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryPeer.php index 01b944a65e..7ff20cbce6 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryPeer.php @@ -4,1371 +4,1403 @@ /** * Base static class for performing query and update operations on the 'cc_playout_history' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcPlayoutHistoryPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_playout_history'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcPlayoutHistory'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcPlayoutHistory'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcPlayoutHistoryTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 5; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_playout_history.ID'; - - /** the column name for the FILE_ID field */ - const FILE_ID = 'cc_playout_history.FILE_ID'; - - /** the column name for the STARTS field */ - const STARTS = 'cc_playout_history.STARTS'; - - /** the column name for the ENDS field */ - const ENDS = 'cc_playout_history.ENDS'; - - /** the column name for the INSTANCE_ID field */ - const INSTANCE_ID = 'cc_playout_history.INSTANCE_ID'; - - /** - * An identiy map to hold any loaded instances of CcPlayoutHistory objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcPlayoutHistory[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbFileId', 'DbStarts', 'DbEnds', 'DbInstanceId', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbFileId', 'dbStarts', 'dbEnds', 'dbInstanceId', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::FILE_ID, self::STARTS, self::ENDS, self::INSTANCE_ID, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'FILE_ID', 'STARTS', 'ENDS', 'INSTANCE_ID', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'file_id', 'starts', 'ends', 'instance_id', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbFileId' => 1, 'DbStarts' => 2, 'DbEnds' => 3, 'DbInstanceId' => 4, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbFileId' => 1, 'dbStarts' => 2, 'dbEnds' => 3, 'dbInstanceId' => 4, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::FILE_ID => 1, self::STARTS => 2, self::ENDS => 3, self::INSTANCE_ID => 4, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'FILE_ID' => 1, 'STARTS' => 2, 'ENDS' => 3, 'INSTANCE_ID' => 4, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'file_id' => 1, 'starts' => 2, 'ends' => 3, 'instance_id' => 4, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcPlayoutHistoryPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcPlayoutHistoryPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcPlayoutHistoryPeer::ID); - $criteria->addSelectColumn(CcPlayoutHistoryPeer::FILE_ID); - $criteria->addSelectColumn(CcPlayoutHistoryPeer::STARTS); - $criteria->addSelectColumn(CcPlayoutHistoryPeer::ENDS); - $criteria->addSelectColumn(CcPlayoutHistoryPeer::INSTANCE_ID); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.FILE_ID'); - $criteria->addSelectColumn($alias . '.STARTS'); - $criteria->addSelectColumn($alias . '.ENDS'); - $criteria->addSelectColumn($alias . '.INSTANCE_ID'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlayoutHistoryPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcPlayoutHistory - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcPlayoutHistoryPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcPlayoutHistoryPeer::populateObjects(CcPlayoutHistoryPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcPlayoutHistoryPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcPlayoutHistory $value A CcPlayoutHistory object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcPlayoutHistory $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcPlayoutHistory object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcPlayoutHistory) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPlayoutHistory object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcPlayoutHistory Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_playout_history - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - // Invalidate objects in CcPlayoutHistoryMetaDataPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcPlayoutHistoryMetaDataPeer::clearInstancePool(); - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcPlayoutHistoryPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcPlayoutHistoryPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcPlayoutHistoryPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcPlayoutHistory object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcPlayoutHistoryPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcPlayoutHistoryPeer::NUM_COLUMNS; - } else { - $cls = CcPlayoutHistoryPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcPlayoutHistoryPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcFiles table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlayoutHistoryPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlayoutHistoryPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcShowInstances table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcShowInstances(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlayoutHistoryPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlayoutHistoryPeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcPlayoutHistory objects pre-filled with their CcFiles objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlayoutHistory objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlayoutHistoryPeer::addSelectColumns($criteria); - $startcol = (CcPlayoutHistoryPeer::NUM_COLUMNS - CcPlayoutHistoryPeer::NUM_LAZY_LOAD_COLUMNS); - CcFilesPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcPlayoutHistoryPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlayoutHistoryPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcPlayoutHistoryPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlayoutHistoryPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcPlayoutHistory) to $obj2 (CcFiles) - $obj2->addCcPlayoutHistory($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcPlayoutHistory objects pre-filled with their CcShowInstances objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlayoutHistory objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcShowInstances(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlayoutHistoryPeer::addSelectColumns($criteria); - $startcol = (CcPlayoutHistoryPeer::NUM_COLUMNS - CcPlayoutHistoryPeer::NUM_LAZY_LOAD_COLUMNS); - CcShowInstancesPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcPlayoutHistoryPeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlayoutHistoryPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcPlayoutHistoryPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlayoutHistoryPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcShowInstancesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowInstancesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcShowInstancesPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcPlayoutHistory) to $obj2 (CcShowInstances) - $obj2->addCcPlayoutHistory($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlayoutHistoryPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlayoutHistoryPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcPlayoutHistoryPeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcPlayoutHistory objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlayoutHistory objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlayoutHistoryPeer::addSelectColumns($criteria); - $startcol2 = (CcPlayoutHistoryPeer::NUM_COLUMNS - CcPlayoutHistoryPeer::NUM_LAZY_LOAD_COLUMNS); - - CcFilesPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcShowInstancesPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcShowInstancesPeer::NUM_COLUMNS - CcShowInstancesPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcPlayoutHistoryPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcPlayoutHistoryPeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlayoutHistoryPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcPlayoutHistoryPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlayoutHistoryPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcFiles rows - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcPlayoutHistory) to the collection in $obj2 (CcFiles) - $obj2->addCcPlayoutHistory($obj1); - } // if joined row not null - - // Add objects for joined CcShowInstances rows - - $key3 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcShowInstancesPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcShowInstancesPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcShowInstancesPeer::addInstanceToPool($obj3, $key3); - } // if obj3 loaded - - // Add the $obj1 (CcPlayoutHistory) to the collection in $obj3 (CcShowInstances) - $obj3->addCcPlayoutHistory($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcFiles table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlayoutHistoryPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlayoutHistoryPeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcShowInstances table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcShowInstances(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlayoutHistoryPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlayoutHistoryPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcPlayoutHistory objects pre-filled with all related objects except CcFiles. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlayoutHistory objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlayoutHistoryPeer::addSelectColumns($criteria); - $startcol2 = (CcPlayoutHistoryPeer::NUM_COLUMNS - CcPlayoutHistoryPeer::NUM_LAZY_LOAD_COLUMNS); - - CcShowInstancesPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcShowInstancesPeer::NUM_COLUMNS - CcShowInstancesPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcPlayoutHistoryPeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlayoutHistoryPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcPlayoutHistoryPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlayoutHistoryPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcShowInstances rows - - $key2 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcShowInstancesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowInstancesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcShowInstancesPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcPlayoutHistory) to the collection in $obj2 (CcShowInstances) - $obj2->addCcPlayoutHistory($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcPlayoutHistory objects pre-filled with all related objects except CcShowInstances. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlayoutHistory objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcShowInstances(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlayoutHistoryPeer::addSelectColumns($criteria); - $startcol2 = (CcPlayoutHistoryPeer::NUM_COLUMNS - CcPlayoutHistoryPeer::NUM_LAZY_LOAD_COLUMNS); - - CcFilesPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcPlayoutHistoryPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlayoutHistoryPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcPlayoutHistoryPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlayoutHistoryPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcFiles rows - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcPlayoutHistory) to the collection in $obj2 (CcFiles) - $obj2->addCcPlayoutHistory($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcPlayoutHistoryPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcPlayoutHistoryPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcPlayoutHistoryTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcPlayoutHistoryPeer::CLASS_DEFAULT : CcPlayoutHistoryPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcPlayoutHistory or Criteria object. - * - * @param mixed $values Criteria or CcPlayoutHistory object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcPlayoutHistory object - } - - if ($criteria->containsKey(CcPlayoutHistoryPeer::ID) && $criteria->keyContainsValue(CcPlayoutHistoryPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlayoutHistoryPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcPlayoutHistory or Criteria object. - * - * @param mixed $values Criteria or CcPlayoutHistory object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcPlayoutHistoryPeer::ID); - $value = $criteria->remove(CcPlayoutHistoryPeer::ID); - if ($value) { - $selectCriteria->add(CcPlayoutHistoryPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); - } - - } else { // $values is CcPlayoutHistory object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_playout_history table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcPlayoutHistoryPeer::TABLE_NAME, $con, CcPlayoutHistoryPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcPlayoutHistoryPeer::clearInstancePool(); - CcPlayoutHistoryPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcPlayoutHistory or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcPlayoutHistory object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcPlayoutHistoryPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcPlayoutHistory) { // it's a model object - // invalidate the cache for this single object - CcPlayoutHistoryPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcPlayoutHistoryPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcPlayoutHistoryPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcPlayoutHistory object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcPlayoutHistory $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcPlayoutHistory $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcPlayoutHistoryPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcPlayoutHistoryPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcPlayoutHistoryPeer::DATABASE_NAME, CcPlayoutHistoryPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcPlayoutHistory - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcPlayoutHistoryPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcPlayoutHistoryPeer::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryPeer::ID, $pk); - - $v = CcPlayoutHistoryPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcPlayoutHistoryPeer::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryPeer::ID, $pks, Criteria::IN); - $objs = CcPlayoutHistoryPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcPlayoutHistoryPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_playout_history'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcPlayoutHistory'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcPlayoutHistoryTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 5; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 5; + + /** the column name for the id field */ + const ID = 'cc_playout_history.id'; + + /** the column name for the file_id field */ + const FILE_ID = 'cc_playout_history.file_id'; + + /** the column name for the starts field */ + const STARTS = 'cc_playout_history.starts'; + + /** the column name for the ends field */ + const ENDS = 'cc_playout_history.ends'; + + /** the column name for the instance_id field */ + const INSTANCE_ID = 'cc_playout_history.instance_id'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcPlayoutHistory objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcPlayoutHistory[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcPlayoutHistoryPeer::$fieldNames[CcPlayoutHistoryPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbFileId', 'DbStarts', 'DbEnds', 'DbInstanceId', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbFileId', 'dbStarts', 'dbEnds', 'dbInstanceId', ), + BasePeer::TYPE_COLNAME => array (CcPlayoutHistoryPeer::ID, CcPlayoutHistoryPeer::FILE_ID, CcPlayoutHistoryPeer::STARTS, CcPlayoutHistoryPeer::ENDS, CcPlayoutHistoryPeer::INSTANCE_ID, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'FILE_ID', 'STARTS', 'ENDS', 'INSTANCE_ID', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'file_id', 'starts', 'ends', 'instance_id', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcPlayoutHistoryPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbFileId' => 1, 'DbStarts' => 2, 'DbEnds' => 3, 'DbInstanceId' => 4, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbFileId' => 1, 'dbStarts' => 2, 'dbEnds' => 3, 'dbInstanceId' => 4, ), + BasePeer::TYPE_COLNAME => array (CcPlayoutHistoryPeer::ID => 0, CcPlayoutHistoryPeer::FILE_ID => 1, CcPlayoutHistoryPeer::STARTS => 2, CcPlayoutHistoryPeer::ENDS => 3, CcPlayoutHistoryPeer::INSTANCE_ID => 4, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'FILE_ID' => 1, 'STARTS' => 2, 'ENDS' => 3, 'INSTANCE_ID' => 4, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'file_id' => 1, 'starts' => 2, 'ends' => 3, 'instance_id' => 4, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcPlayoutHistoryPeer::getFieldNames($toType); + $key = isset(CcPlayoutHistoryPeer::$fieldKeys[$fromType][$name]) ? CcPlayoutHistoryPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcPlayoutHistoryPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcPlayoutHistoryPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcPlayoutHistoryPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcPlayoutHistoryPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcPlayoutHistoryPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcPlayoutHistoryPeer::ID); + $criteria->addSelectColumn(CcPlayoutHistoryPeer::FILE_ID); + $criteria->addSelectColumn(CcPlayoutHistoryPeer::STARTS); + $criteria->addSelectColumn(CcPlayoutHistoryPeer::ENDS); + $criteria->addSelectColumn(CcPlayoutHistoryPeer::INSTANCE_ID); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.file_id'); + $criteria->addSelectColumn($alias . '.starts'); + $criteria->addSelectColumn($alias . '.ends'); + $criteria->addSelectColumn($alias . '.instance_id'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlayoutHistoryPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcPlayoutHistory + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcPlayoutHistoryPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcPlayoutHistoryPeer::populateObjects(CcPlayoutHistoryPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcPlayoutHistoryPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcPlayoutHistory $obj A CcPlayoutHistory object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcPlayoutHistoryPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcPlayoutHistory object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcPlayoutHistory) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPlayoutHistory object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcPlayoutHistoryPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcPlayoutHistory Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcPlayoutHistoryPeer::$instances[$key])) { + return CcPlayoutHistoryPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcPlayoutHistoryPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcPlayoutHistoryPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_playout_history + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in CcPlayoutHistoryMetaDataPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcPlayoutHistoryMetaDataPeer::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcPlayoutHistoryPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcPlayoutHistoryPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcPlayoutHistoryPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcPlayoutHistory object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcPlayoutHistoryPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcPlayoutHistoryPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcPlayoutHistoryPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcPlayoutHistoryPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcFiles table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlayoutHistoryPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlayoutHistoryPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcShowInstances table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcShowInstances(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlayoutHistoryPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlayoutHistoryPeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcPlayoutHistory objects pre-filled with their CcFiles objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlayoutHistory objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + } + + CcPlayoutHistoryPeer::addSelectColumns($criteria); + $startcol = CcPlayoutHistoryPeer::NUM_HYDRATE_COLUMNS; + CcFilesPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcPlayoutHistoryPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlayoutHistoryPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcPlayoutHistoryPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlayoutHistoryPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcPlayoutHistory) to $obj2 (CcFiles) + $obj2->addCcPlayoutHistory($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcPlayoutHistory objects pre-filled with their CcShowInstances objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlayoutHistory objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcShowInstances(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + } + + CcPlayoutHistoryPeer::addSelectColumns($criteria); + $startcol = CcPlayoutHistoryPeer::NUM_HYDRATE_COLUMNS; + CcShowInstancesPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcPlayoutHistoryPeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlayoutHistoryPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcPlayoutHistoryPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlayoutHistoryPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcShowInstancesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowInstancesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcShowInstancesPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcPlayoutHistory) to $obj2 (CcShowInstances) + $obj2->addCcPlayoutHistory($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlayoutHistoryPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlayoutHistoryPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $criteria->addJoin(CcPlayoutHistoryPeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcPlayoutHistory objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlayoutHistory objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + } + + CcPlayoutHistoryPeer::addSelectColumns($criteria); + $startcol2 = CcPlayoutHistoryPeer::NUM_HYDRATE_COLUMNS; + + CcFilesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + + CcShowInstancesPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcShowInstancesPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcPlayoutHistoryPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $criteria->addJoin(CcPlayoutHistoryPeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlayoutHistoryPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcPlayoutHistoryPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlayoutHistoryPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcFiles rows + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcPlayoutHistory) to the collection in $obj2 (CcFiles) + $obj2->addCcPlayoutHistory($obj1); + } // if joined row not null + + // Add objects for joined CcShowInstances rows + + $key3 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcShowInstancesPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcShowInstancesPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcShowInstancesPeer::addInstanceToPool($obj3, $key3); + } // if obj3 loaded + + // Add the $obj1 (CcPlayoutHistory) to the collection in $obj3 (CcShowInstances) + $obj3->addCcPlayoutHistory($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcFiles table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlayoutHistoryPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlayoutHistoryPeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcShowInstances table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcShowInstances(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlayoutHistoryPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlayoutHistoryPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcPlayoutHistory objects pre-filled with all related objects except CcFiles. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlayoutHistory objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + } + + CcPlayoutHistoryPeer::addSelectColumns($criteria); + $startcol2 = CcPlayoutHistoryPeer::NUM_HYDRATE_COLUMNS; + + CcShowInstancesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcShowInstancesPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcPlayoutHistoryPeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlayoutHistoryPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcPlayoutHistoryPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlayoutHistoryPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcShowInstances rows + + $key2 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcShowInstancesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowInstancesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcShowInstancesPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcPlayoutHistory) to the collection in $obj2 (CcShowInstances) + $obj2->addCcPlayoutHistory($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcPlayoutHistory objects pre-filled with all related objects except CcShowInstances. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlayoutHistory objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcShowInstances(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + } + + CcPlayoutHistoryPeer::addSelectColumns($criteria); + $startcol2 = CcPlayoutHistoryPeer::NUM_HYDRATE_COLUMNS; + + CcFilesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcPlayoutHistoryPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlayoutHistoryPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlayoutHistoryPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcPlayoutHistoryPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlayoutHistoryPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcFiles rows + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcPlayoutHistory) to the collection in $obj2 (CcFiles) + $obj2->addCcPlayoutHistory($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcPlayoutHistoryPeer::DATABASE_NAME)->getTable(CcPlayoutHistoryPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcPlayoutHistoryPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcPlayoutHistoryPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcPlayoutHistoryTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcPlayoutHistoryPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcPlayoutHistory or Criteria object. + * + * @param mixed $values Criteria or CcPlayoutHistory object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcPlayoutHistory object + } + + if ($criteria->containsKey(CcPlayoutHistoryPeer::ID) && $criteria->keyContainsValue(CcPlayoutHistoryPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlayoutHistoryPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcPlayoutHistory or Criteria object. + * + * @param mixed $values Criteria or CcPlayoutHistory object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcPlayoutHistoryPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcPlayoutHistoryPeer::ID); + $value = $criteria->remove(CcPlayoutHistoryPeer::ID); + if ($value) { + $selectCriteria->add(CcPlayoutHistoryPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcPlayoutHistoryPeer::TABLE_NAME); + } + + } else { // $values is CcPlayoutHistory object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_playout_history table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcPlayoutHistoryPeer::TABLE_NAME, $con, CcPlayoutHistoryPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcPlayoutHistoryPeer::clearInstancePool(); + CcPlayoutHistoryPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcPlayoutHistory or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcPlayoutHistory object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcPlayoutHistoryPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcPlayoutHistory) { // it's a model object + // invalidate the cache for this single object + CcPlayoutHistoryPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcPlayoutHistoryPeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcPlayoutHistoryPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcPlayoutHistoryPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcPlayoutHistory object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcPlayoutHistory $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcPlayoutHistoryPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcPlayoutHistoryPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcPlayoutHistoryPeer::DATABASE_NAME, CcPlayoutHistoryPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcPlayoutHistory + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcPlayoutHistoryPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcPlayoutHistoryPeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryPeer::ID, $pk); + + $v = CcPlayoutHistoryPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcPlayoutHistory[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcPlayoutHistoryPeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryPeer::ID, $pks, Criteria::IN); + $objs = CcPlayoutHistoryPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcPlayoutHistoryPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryQuery.php index b772a0d7ab..f9fcc3ee69 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryQuery.php @@ -4,506 +4,701 @@ /** * Base class that represents a query for the 'cc_playout_history' table. * - * * - * @method CcPlayoutHistoryQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcPlayoutHistoryQuery orderByDbFileId($order = Criteria::ASC) Order by the file_id column - * @method CcPlayoutHistoryQuery orderByDbStarts($order = Criteria::ASC) Order by the starts column - * @method CcPlayoutHistoryQuery orderByDbEnds($order = Criteria::ASC) Order by the ends column - * @method CcPlayoutHistoryQuery orderByDbInstanceId($order = Criteria::ASC) Order by the instance_id column * - * @method CcPlayoutHistoryQuery groupByDbId() Group by the id column - * @method CcPlayoutHistoryQuery groupByDbFileId() Group by the file_id column - * @method CcPlayoutHistoryQuery groupByDbStarts() Group by the starts column - * @method CcPlayoutHistoryQuery groupByDbEnds() Group by the ends column - * @method CcPlayoutHistoryQuery groupByDbInstanceId() Group by the instance_id column + * @method CcPlayoutHistoryQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcPlayoutHistoryQuery orderByDbFileId($order = Criteria::ASC) Order by the file_id column + * @method CcPlayoutHistoryQuery orderByDbStarts($order = Criteria::ASC) Order by the starts column + * @method CcPlayoutHistoryQuery orderByDbEnds($order = Criteria::ASC) Order by the ends column + * @method CcPlayoutHistoryQuery orderByDbInstanceId($order = Criteria::ASC) Order by the instance_id column * - * @method CcPlayoutHistoryQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcPlayoutHistoryQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcPlayoutHistoryQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcPlayoutHistoryQuery groupByDbId() Group by the id column + * @method CcPlayoutHistoryQuery groupByDbFileId() Group by the file_id column + * @method CcPlayoutHistoryQuery groupByDbStarts() Group by the starts column + * @method CcPlayoutHistoryQuery groupByDbEnds() Group by the ends column + * @method CcPlayoutHistoryQuery groupByDbInstanceId() Group by the instance_id column * - * @method CcPlayoutHistoryQuery leftJoinCcFiles($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcFiles relation - * @method CcPlayoutHistoryQuery rightJoinCcFiles($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcFiles relation - * @method CcPlayoutHistoryQuery innerJoinCcFiles($relationAlias = '') Adds a INNER JOIN clause to the query using the CcFiles relation + * @method CcPlayoutHistoryQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcPlayoutHistoryQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcPlayoutHistoryQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcPlayoutHistoryQuery leftJoinCcShowInstances($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShowInstances relation - * @method CcPlayoutHistoryQuery rightJoinCcShowInstances($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShowInstances relation - * @method CcPlayoutHistoryQuery innerJoinCcShowInstances($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShowInstances relation + * @method CcPlayoutHistoryQuery leftJoinCcFiles($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcFiles relation + * @method CcPlayoutHistoryQuery rightJoinCcFiles($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcFiles relation + * @method CcPlayoutHistoryQuery innerJoinCcFiles($relationAlias = null) Adds a INNER JOIN clause to the query using the CcFiles relation * - * @method CcPlayoutHistoryQuery leftJoinCcPlayoutHistoryMetaData($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcPlayoutHistoryMetaData relation - * @method CcPlayoutHistoryQuery rightJoinCcPlayoutHistoryMetaData($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcPlayoutHistoryMetaData relation - * @method CcPlayoutHistoryQuery innerJoinCcPlayoutHistoryMetaData($relationAlias = '') Adds a INNER JOIN clause to the query using the CcPlayoutHistoryMetaData relation + * @method CcPlayoutHistoryQuery leftJoinCcShowInstances($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShowInstances relation + * @method CcPlayoutHistoryQuery rightJoinCcShowInstances($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShowInstances relation + * @method CcPlayoutHistoryQuery innerJoinCcShowInstances($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShowInstances relation * - * @method CcPlayoutHistory findOne(PropelPDO $con = null) Return the first CcPlayoutHistory matching the query - * @method CcPlayoutHistory findOneOrCreate(PropelPDO $con = null) Return the first CcPlayoutHistory matching the query, or a new CcPlayoutHistory object populated from the query conditions when no match is found + * @method CcPlayoutHistoryQuery leftJoinCcPlayoutHistoryMetaData($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPlayoutHistoryMetaData relation + * @method CcPlayoutHistoryQuery rightJoinCcPlayoutHistoryMetaData($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlayoutHistoryMetaData relation + * @method CcPlayoutHistoryQuery innerJoinCcPlayoutHistoryMetaData($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlayoutHistoryMetaData relation * - * @method CcPlayoutHistory findOneByDbId(int $id) Return the first CcPlayoutHistory filtered by the id column - * @method CcPlayoutHistory findOneByDbFileId(int $file_id) Return the first CcPlayoutHistory filtered by the file_id column - * @method CcPlayoutHistory findOneByDbStarts(string $starts) Return the first CcPlayoutHistory filtered by the starts column - * @method CcPlayoutHistory findOneByDbEnds(string $ends) Return the first CcPlayoutHistory filtered by the ends column - * @method CcPlayoutHistory findOneByDbInstanceId(int $instance_id) Return the first CcPlayoutHistory filtered by the instance_id column + * @method CcPlayoutHistory findOne(PropelPDO $con = null) Return the first CcPlayoutHistory matching the query + * @method CcPlayoutHistory findOneOrCreate(PropelPDO $con = null) Return the first CcPlayoutHistory matching the query, or a new CcPlayoutHistory object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcPlayoutHistory objects filtered by the id column - * @method array findByDbFileId(int $file_id) Return CcPlayoutHistory objects filtered by the file_id column - * @method array findByDbStarts(string $starts) Return CcPlayoutHistory objects filtered by the starts column - * @method array findByDbEnds(string $ends) Return CcPlayoutHistory objects filtered by the ends column - * @method array findByDbInstanceId(int $instance_id) Return CcPlayoutHistory objects filtered by the instance_id column + * @method CcPlayoutHistory findOneByDbFileId(int $file_id) Return the first CcPlayoutHistory filtered by the file_id column + * @method CcPlayoutHistory findOneByDbStarts(string $starts) Return the first CcPlayoutHistory filtered by the starts column + * @method CcPlayoutHistory findOneByDbEnds(string $ends) Return the first CcPlayoutHistory filtered by the ends column + * @method CcPlayoutHistory findOneByDbInstanceId(int $instance_id) Return the first CcPlayoutHistory filtered by the instance_id column + * + * @method array findByDbId(int $id) Return CcPlayoutHistory objects filtered by the id column + * @method array findByDbFileId(int $file_id) Return CcPlayoutHistory objects filtered by the file_id column + * @method array findByDbStarts(string $starts) Return CcPlayoutHistory objects filtered by the starts column + * @method array findByDbEnds(string $ends) Return CcPlayoutHistory objects filtered by the ends column + * @method array findByDbInstanceId(int $instance_id) Return CcPlayoutHistory objects filtered by the instance_id column * * @package propel.generator.airtime.om */ abstract class BaseCcPlayoutHistoryQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcPlayoutHistoryQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcPlayoutHistory'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcPlayoutHistoryQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcPlayoutHistoryQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcPlayoutHistoryQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcPlayoutHistoryQuery) { + return $criteria; + } + $query = new CcPlayoutHistoryQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcPlayoutHistory|CcPlayoutHistory[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcPlayoutHistoryPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlayoutHistory A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlayoutHistory A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "file_id", "starts", "ends", "instance_id" FROM "cc_playout_history" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcPlayoutHistory(); + $obj->hydrate($row); + CcPlayoutHistoryPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlayoutHistory|CcPlayoutHistory[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcPlayoutHistory[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcPlayoutHistoryPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcPlayoutHistoryPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcPlayoutHistoryPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcPlayoutHistoryPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the file_id column + * + * Example usage: + * + * $query->filterByDbFileId(1234); // WHERE file_id = 1234 + * $query->filterByDbFileId(array(12, 34)); // WHERE file_id IN (12, 34) + * $query->filterByDbFileId(array('min' => 12)); // WHERE file_id >= 12 + * $query->filterByDbFileId(array('max' => 12)); // WHERE file_id <= 12 + * + * + * @see filterByCcFiles() + * + * @param mixed $dbFileId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + */ + public function filterByDbFileId($dbFileId = null, $comparison = null) + { + if (is_array($dbFileId)) { + $useMinMax = false; + if (isset($dbFileId['min'])) { + $this->addUsingAlias(CcPlayoutHistoryPeer::FILE_ID, $dbFileId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbFileId['max'])) { + $this->addUsingAlias(CcPlayoutHistoryPeer::FILE_ID, $dbFileId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryPeer::FILE_ID, $dbFileId, $comparison); + } + + /** + * Filter the query on the starts column + * + * Example usage: + * + * $query->filterByDbStarts('2011-03-14'); // WHERE starts = '2011-03-14' + * $query->filterByDbStarts('now'); // WHERE starts = '2011-03-14' + * $query->filterByDbStarts(array('max' => 'yesterday')); // WHERE starts < '2011-03-13' + * + * + * @param mixed $dbStarts The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + */ + public function filterByDbStarts($dbStarts = null, $comparison = null) + { + if (is_array($dbStarts)) { + $useMinMax = false; + if (isset($dbStarts['min'])) { + $this->addUsingAlias(CcPlayoutHistoryPeer::STARTS, $dbStarts['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbStarts['max'])) { + $this->addUsingAlias(CcPlayoutHistoryPeer::STARTS, $dbStarts['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryPeer::STARTS, $dbStarts, $comparison); + } + + /** + * Filter the query on the ends column + * + * Example usage: + * + * $query->filterByDbEnds('2011-03-14'); // WHERE ends = '2011-03-14' + * $query->filterByDbEnds('now'); // WHERE ends = '2011-03-14' + * $query->filterByDbEnds(array('max' => 'yesterday')); // WHERE ends < '2011-03-13' + * + * + * @param mixed $dbEnds The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + */ + public function filterByDbEnds($dbEnds = null, $comparison = null) + { + if (is_array($dbEnds)) { + $useMinMax = false; + if (isset($dbEnds['min'])) { + $this->addUsingAlias(CcPlayoutHistoryPeer::ENDS, $dbEnds['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbEnds['max'])) { + $this->addUsingAlias(CcPlayoutHistoryPeer::ENDS, $dbEnds['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryPeer::ENDS, $dbEnds, $comparison); + } + + /** + * Filter the query on the instance_id column + * + * Example usage: + * + * $query->filterByDbInstanceId(1234); // WHERE instance_id = 1234 + * $query->filterByDbInstanceId(array(12, 34)); // WHERE instance_id IN (12, 34) + * $query->filterByDbInstanceId(array('min' => 12)); // WHERE instance_id >= 12 + * $query->filterByDbInstanceId(array('max' => 12)); // WHERE instance_id <= 12 + * + * + * @see filterByCcShowInstances() + * + * @param mixed $dbInstanceId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + */ + public function filterByDbInstanceId($dbInstanceId = null, $comparison = null) + { + if (is_array($dbInstanceId)) { + $useMinMax = false; + if (isset($dbInstanceId['min'])) { + $this->addUsingAlias(CcPlayoutHistoryPeer::INSTANCE_ID, $dbInstanceId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbInstanceId['max'])) { + $this->addUsingAlias(CcPlayoutHistoryPeer::INSTANCE_ID, $dbInstanceId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryPeer::INSTANCE_ID, $dbInstanceId, $comparison); + } + + /** + * Filter the query by a related CcFiles object + * + * @param CcFiles|PropelObjectCollection $ccFiles The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcFiles($ccFiles, $comparison = null) + { + if ($ccFiles instanceof CcFiles) { + return $this + ->addUsingAlias(CcPlayoutHistoryPeer::FILE_ID, $ccFiles->getDbId(), $comparison); + } elseif ($ccFiles instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcPlayoutHistoryPeer::FILE_ID, $ccFiles->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcFiles() only accepts arguments of type CcFiles or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcFiles relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + */ + public function joinCcFiles($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcFiles'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcFiles'); + } + + return $this; + } + + /** + * Use the CcFiles relation CcFiles object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery A secondary query class using the current class as primary query + */ + public function useCcFilesQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcFiles($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery'); + } + + /** + * Filter the query by a related CcShowInstances object + * + * @param CcShowInstances|PropelObjectCollection $ccShowInstances The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShowInstances($ccShowInstances, $comparison = null) + { + if ($ccShowInstances instanceof CcShowInstances) { + return $this + ->addUsingAlias(CcPlayoutHistoryPeer::INSTANCE_ID, $ccShowInstances->getDbId(), $comparison); + } elseif ($ccShowInstances instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcPlayoutHistoryPeer::INSTANCE_ID, $ccShowInstances->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcShowInstances() only accepts arguments of type CcShowInstances or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShowInstances relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + */ + public function joinCcShowInstances($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShowInstances'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShowInstances'); + } + + return $this; + } + + /** + * Use the CcShowInstances relation CcShowInstances object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowInstancesQuery A secondary query class using the current class as primary query + */ + public function useCcShowInstancesQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcShowInstances($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShowInstances', 'CcShowInstancesQuery'); + } + + /** + * Filter the query by a related CcPlayoutHistoryMetaData object + * + * @param CcPlayoutHistoryMetaData|PropelObjectCollection $ccPlayoutHistoryMetaData the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcPlayoutHistoryMetaData($ccPlayoutHistoryMetaData, $comparison = null) + { + if ($ccPlayoutHistoryMetaData instanceof CcPlayoutHistoryMetaData) { + return $this + ->addUsingAlias(CcPlayoutHistoryPeer::ID, $ccPlayoutHistoryMetaData->getDbHistoryId(), $comparison); + } elseif ($ccPlayoutHistoryMetaData instanceof PropelObjectCollection) { + return $this + ->useCcPlayoutHistoryMetaDataQuery() + ->filterByPrimaryKeys($ccPlayoutHistoryMetaData->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcPlayoutHistoryMetaData() only accepts arguments of type CcPlayoutHistoryMetaData or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcPlayoutHistoryMetaData relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + */ + public function joinCcPlayoutHistoryMetaData($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcPlayoutHistoryMetaData'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcPlayoutHistoryMetaData'); + } + + return $this; + } + + /** + * Use the CcPlayoutHistoryMetaData relation CcPlayoutHistoryMetaData object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlayoutHistoryMetaDataQuery A secondary query class using the current class as primary query + */ + public function useCcPlayoutHistoryMetaDataQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcPlayoutHistoryMetaData($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistoryMetaData', 'CcPlayoutHistoryMetaDataQuery'); + } + + /** + * Exclude object from result + * + * @param CcPlayoutHistory $ccPlayoutHistory Object to remove from the list of results + * + * @return CcPlayoutHistoryQuery The current query, for fluid interface + */ + public function prune($ccPlayoutHistory = null) + { + if ($ccPlayoutHistory) { + $this->addUsingAlias(CcPlayoutHistoryPeer::ID, $ccPlayoutHistory->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcPlayoutHistoryQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcPlayoutHistory', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcPlayoutHistoryQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcPlayoutHistoryQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcPlayoutHistoryQuery) { - return $criteria; - } - $query = new CcPlayoutHistoryQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcPlayoutHistory|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcPlayoutHistoryPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcPlayoutHistoryPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcPlayoutHistoryPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcPlayoutHistoryPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the file_id column - * - * @param int|array $dbFileId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function filterByDbFileId($dbFileId = null, $comparison = null) - { - if (is_array($dbFileId)) { - $useMinMax = false; - if (isset($dbFileId['min'])) { - $this->addUsingAlias(CcPlayoutHistoryPeer::FILE_ID, $dbFileId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbFileId['max'])) { - $this->addUsingAlias(CcPlayoutHistoryPeer::FILE_ID, $dbFileId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlayoutHistoryPeer::FILE_ID, $dbFileId, $comparison); - } - - /** - * Filter the query on the starts column - * - * @param string|array $dbStarts The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function filterByDbStarts($dbStarts = null, $comparison = null) - { - if (is_array($dbStarts)) { - $useMinMax = false; - if (isset($dbStarts['min'])) { - $this->addUsingAlias(CcPlayoutHistoryPeer::STARTS, $dbStarts['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbStarts['max'])) { - $this->addUsingAlias(CcPlayoutHistoryPeer::STARTS, $dbStarts['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlayoutHistoryPeer::STARTS, $dbStarts, $comparison); - } - - /** - * Filter the query on the ends column - * - * @param string|array $dbEnds The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function filterByDbEnds($dbEnds = null, $comparison = null) - { - if (is_array($dbEnds)) { - $useMinMax = false; - if (isset($dbEnds['min'])) { - $this->addUsingAlias(CcPlayoutHistoryPeer::ENDS, $dbEnds['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbEnds['max'])) { - $this->addUsingAlias(CcPlayoutHistoryPeer::ENDS, $dbEnds['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlayoutHistoryPeer::ENDS, $dbEnds, $comparison); - } - - /** - * Filter the query on the instance_id column - * - * @param int|array $dbInstanceId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function filterByDbInstanceId($dbInstanceId = null, $comparison = null) - { - if (is_array($dbInstanceId)) { - $useMinMax = false; - if (isset($dbInstanceId['min'])) { - $this->addUsingAlias(CcPlayoutHistoryPeer::INSTANCE_ID, $dbInstanceId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbInstanceId['max'])) { - $this->addUsingAlias(CcPlayoutHistoryPeer::INSTANCE_ID, $dbInstanceId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlayoutHistoryPeer::INSTANCE_ID, $dbInstanceId, $comparison); - } - - /** - * Filter the query by a related CcFiles object - * - * @param CcFiles $ccFiles the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function filterByCcFiles($ccFiles, $comparison = null) - { - return $this - ->addUsingAlias(CcPlayoutHistoryPeer::FILE_ID, $ccFiles->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcFiles relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function joinCcFiles($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcFiles'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcFiles'); - } - - return $this; - } - - /** - * Use the CcFiles relation CcFiles object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery A secondary query class using the current class as primary query - */ - public function useCcFilesQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcFiles($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery'); - } - - /** - * Filter the query by a related CcShowInstances object - * - * @param CcShowInstances $ccShowInstances the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function filterByCcShowInstances($ccShowInstances, $comparison = null) - { - return $this - ->addUsingAlias(CcPlayoutHistoryPeer::INSTANCE_ID, $ccShowInstances->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShowInstances relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function joinCcShowInstances($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShowInstances'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShowInstances'); - } - - return $this; - } - - /** - * Use the CcShowInstances relation CcShowInstances object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowInstancesQuery A secondary query class using the current class as primary query - */ - public function useCcShowInstancesQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcShowInstances($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShowInstances', 'CcShowInstancesQuery'); - } - - /** - * Filter the query by a related CcPlayoutHistoryMetaData object - * - * @param CcPlayoutHistoryMetaData $ccPlayoutHistoryMetaData the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function filterByCcPlayoutHistoryMetaData($ccPlayoutHistoryMetaData, $comparison = null) - { - return $this - ->addUsingAlias(CcPlayoutHistoryPeer::ID, $ccPlayoutHistoryMetaData->getDbHistoryId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcPlayoutHistoryMetaData relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function joinCcPlayoutHistoryMetaData($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcPlayoutHistoryMetaData'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcPlayoutHistoryMetaData'); - } - - return $this; - } - - /** - * Use the CcPlayoutHistoryMetaData relation CcPlayoutHistoryMetaData object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlayoutHistoryMetaDataQuery A secondary query class using the current class as primary query - */ - public function useCcPlayoutHistoryMetaDataQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcPlayoutHistoryMetaData($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistoryMetaData', 'CcPlayoutHistoryMetaDataQuery'); - } - - /** - * Exclude object from result - * - * @param CcPlayoutHistory $ccPlayoutHistory Object to remove from the list of results - * - * @return CcPlayoutHistoryQuery The current query, for fluid interface - */ - public function prune($ccPlayoutHistory = null) - { - if ($ccPlayoutHistory) { - $this->addUsingAlias(CcPlayoutHistoryPeer::ID, $ccPlayoutHistory->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcPlayoutHistoryQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplate.php b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplate.php index 222227af62..6a2b9230f9 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplate.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplate.php @@ -4,913 +4,1194 @@ /** * Base class that represents a row from the 'cc_playout_history_template' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcPlayoutHistoryTemplate extends BaseObject implements Persistent +abstract class BaseCcPlayoutHistoryTemplate extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcPlayoutHistoryTemplatePeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcPlayoutHistoryTemplatePeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the name field. - * @var string - */ - protected $name; - - /** - * The value for the type field. - * @var string - */ - protected $type; - - /** - * @var array CcPlayoutHistoryTemplateField[] Collection to store aggregation of CcPlayoutHistoryTemplateField objects. - */ - protected $collCcPlayoutHistoryTemplateFields; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [name] column value. - * - * @return string - */ - public function getDbName() - { - return $this->name; - } - - /** - * Get the [type] column value. - * - * @return string - */ - public function getDbType() - { - return $this->type; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcPlayoutHistoryTemplate The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcPlayoutHistoryTemplatePeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [name] column. - * - * @param string $v new value - * @return CcPlayoutHistoryTemplate The current object (for fluent API support) - */ - public function setDbName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->name !== $v) { - $this->name = $v; - $this->modifiedColumns[] = CcPlayoutHistoryTemplatePeer::NAME; - } - - return $this; - } // setDbName() - - /** - * Set the value of [type] column. - * - * @param string $v new value - * @return CcPlayoutHistoryTemplate The current object (for fluent API support) - */ - public function setDbType($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->type !== $v) { - $this->type = $v; - $this->modifiedColumns[] = CcPlayoutHistoryTemplatePeer::TYPE; - } - - return $this; - } // setDbType() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->type = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 3; // 3 = CcPlayoutHistoryTemplatePeer::NUM_COLUMNS - CcPlayoutHistoryTemplatePeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcPlayoutHistoryTemplate object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcPlayoutHistoryTemplatePeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->collCcPlayoutHistoryTemplateFields = null; - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcPlayoutHistoryTemplateQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcPlayoutHistoryTemplatePeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcPlayoutHistoryTemplatePeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcPlayoutHistoryTemplatePeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlayoutHistoryTemplatePeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows = CcPlayoutHistoryTemplatePeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - if ($this->collCcPlayoutHistoryTemplateFields !== null) { - foreach ($this->collCcPlayoutHistoryTemplateFields as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcPlayoutHistoryTemplatePeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - if ($this->collCcPlayoutHistoryTemplateFields !== null) { - foreach ($this->collCcPlayoutHistoryTemplateFields as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPlayoutHistoryTemplatePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbName(); - break; - case 2: - return $this->getDbType(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcPlayoutHistoryTemplatePeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbName(), - $keys[2] => $this->getDbType(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPlayoutHistoryTemplatePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbName($value); - break; - case 2: - $this->setDbType($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcPlayoutHistoryTemplatePeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbType($arr[$keys[2]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); - - if ($this->isColumnModified(CcPlayoutHistoryTemplatePeer::ID)) $criteria->add(CcPlayoutHistoryTemplatePeer::ID, $this->id); - if ($this->isColumnModified(CcPlayoutHistoryTemplatePeer::NAME)) $criteria->add(CcPlayoutHistoryTemplatePeer::NAME, $this->name); - if ($this->isColumnModified(CcPlayoutHistoryTemplatePeer::TYPE)) $criteria->add(CcPlayoutHistoryTemplatePeer::TYPE, $this->type); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryTemplatePeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcPlayoutHistoryTemplate (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbName($this->name); - $copyObj->setDbType($this->type); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getCcPlayoutHistoryTemplateFields() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcPlayoutHistoryTemplateField($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcPlayoutHistoryTemplate Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcPlayoutHistoryTemplatePeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcPlayoutHistoryTemplatePeer(); - } - return self::$peer; - } - - /** - * Clears out the collCcPlayoutHistoryTemplateFields collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcPlayoutHistoryTemplateFields() - */ - public function clearCcPlayoutHistoryTemplateFields() - { - $this->collCcPlayoutHistoryTemplateFields = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcPlayoutHistoryTemplateFields collection. - * - * By default this just sets the collCcPlayoutHistoryTemplateFields collection to an empty array (like clearcollCcPlayoutHistoryTemplateFields()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcPlayoutHistoryTemplateFields() - { - $this->collCcPlayoutHistoryTemplateFields = new PropelObjectCollection(); - $this->collCcPlayoutHistoryTemplateFields->setModel('CcPlayoutHistoryTemplateField'); - } - - /** - * Gets an array of CcPlayoutHistoryTemplateField objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcPlayoutHistoryTemplate is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcPlayoutHistoryTemplateField[] List of CcPlayoutHistoryTemplateField objects - * @throws PropelException - */ - public function getCcPlayoutHistoryTemplateFields($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcPlayoutHistoryTemplateFields || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlayoutHistoryTemplateFields) { - // return empty collection - $this->initCcPlayoutHistoryTemplateFields(); - } else { - $collCcPlayoutHistoryTemplateFields = CcPlayoutHistoryTemplateFieldQuery::create(null, $criteria) - ->filterByCcPlayoutHistoryTemplate($this) - ->find($con); - if (null !== $criteria) { - return $collCcPlayoutHistoryTemplateFields; - } - $this->collCcPlayoutHistoryTemplateFields = $collCcPlayoutHistoryTemplateFields; - } - } - return $this->collCcPlayoutHistoryTemplateFields; - } - - /** - * Returns the number of related CcPlayoutHistoryTemplateField objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcPlayoutHistoryTemplateField objects. - * @throws PropelException - */ - public function countCcPlayoutHistoryTemplateFields(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcPlayoutHistoryTemplateFields || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlayoutHistoryTemplateFields) { - return 0; - } else { - $query = CcPlayoutHistoryTemplateFieldQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcPlayoutHistoryTemplate($this) - ->count($con); - } - } else { - return count($this->collCcPlayoutHistoryTemplateFields); - } - } - - /** - * Method called to associate a CcPlayoutHistoryTemplateField object to this object - * through the CcPlayoutHistoryTemplateField foreign key attribute. - * - * @param CcPlayoutHistoryTemplateField $l CcPlayoutHistoryTemplateField - * @return void - * @throws PropelException - */ - public function addCcPlayoutHistoryTemplateField(CcPlayoutHistoryTemplateField $l) - { - if ($this->collCcPlayoutHistoryTemplateFields === null) { - $this->initCcPlayoutHistoryTemplateFields(); - } - if (!$this->collCcPlayoutHistoryTemplateFields->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcPlayoutHistoryTemplateFields[]= $l; - $l->setCcPlayoutHistoryTemplate($this); - } - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->name = null; - $this->type = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - if ($this->collCcPlayoutHistoryTemplateFields) { - foreach ((array) $this->collCcPlayoutHistoryTemplateFields as $o) { - $o->clearAllReferences($deep); - } - } - } // if ($deep) - - $this->collCcPlayoutHistoryTemplateFields = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcPlayoutHistoryTemplate + /** + * Peer class name + */ + const PEER = 'CcPlayoutHistoryTemplatePeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcPlayoutHistoryTemplatePeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the name field. + * @var string + */ + protected $name; + + /** + * The value for the type field. + * @var string + */ + protected $type; + + /** + * @var PropelObjectCollection|CcPlayoutHistoryTemplateField[] Collection to store aggregation of CcPlayoutHistoryTemplateField objects. + */ + protected $collCcPlayoutHistoryTemplateFields; + protected $collCcPlayoutHistoryTemplateFieldsPartial; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccPlayoutHistoryTemplateFieldsScheduledForDeletion = null; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [name] column value. + * + * @return string + */ + public function getDbName() + { + + return $this->name; + } + + /** + * Get the [type] column value. + * + * @return string + */ + public function getDbType() + { + + return $this->type; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcPlayoutHistoryTemplate The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcPlayoutHistoryTemplatePeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [name] column. + * + * @param string $v new value + * @return CcPlayoutHistoryTemplate The current object (for fluent API support) + */ + public function setDbName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->name !== $v) { + $this->name = $v; + $this->modifiedColumns[] = CcPlayoutHistoryTemplatePeer::NAME; + } + + + return $this; + } // setDbName() + + /** + * Set the value of [type] column. + * + * @param string $v new value + * @return CcPlayoutHistoryTemplate The current object (for fluent API support) + */ + public function setDbType($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->type !== $v) { + $this->type = $v; + $this->modifiedColumns[] = CcPlayoutHistoryTemplatePeer::TYPE; + } + + + return $this; + } // setDbType() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->type = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 3; // 3 = CcPlayoutHistoryTemplatePeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcPlayoutHistoryTemplate object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcPlayoutHistoryTemplatePeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->collCcPlayoutHistoryTemplateFields = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcPlayoutHistoryTemplateQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcPlayoutHistoryTemplatePeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->ccPlayoutHistoryTemplateFieldsScheduledForDeletion !== null) { + if (!$this->ccPlayoutHistoryTemplateFieldsScheduledForDeletion->isEmpty()) { + CcPlayoutHistoryTemplateFieldQuery::create() + ->filterByPrimaryKeys($this->ccPlayoutHistoryTemplateFieldsScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccPlayoutHistoryTemplateFieldsScheduledForDeletion = null; + } + } + + if ($this->collCcPlayoutHistoryTemplateFields !== null) { + foreach ($this->collCcPlayoutHistoryTemplateFields as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcPlayoutHistoryTemplatePeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcPlayoutHistoryTemplatePeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_playout_history_template_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcPlayoutHistoryTemplatePeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcPlayoutHistoryTemplatePeer::NAME)) { + $modifiedColumns[':p' . $index++] = '"name"'; + } + if ($this->isColumnModified(CcPlayoutHistoryTemplatePeer::TYPE)) { + $modifiedColumns[':p' . $index++] = '"type"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_playout_history_template" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"name"': + $stmt->bindValue($identifier, $this->name, PDO::PARAM_STR); + break; + case '"type"': + $stmt->bindValue($identifier, $this->type, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcPlayoutHistoryTemplatePeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + if ($this->collCcPlayoutHistoryTemplateFields !== null) { + foreach ($this->collCcPlayoutHistoryTemplateFields as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPlayoutHistoryTemplatePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbName(); + break; + case 2: + return $this->getDbType(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcPlayoutHistoryTemplate'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcPlayoutHistoryTemplate'][$this->getPrimaryKey()] = true; + $keys = CcPlayoutHistoryTemplatePeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbName(), + $keys[2] => $this->getDbType(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->collCcPlayoutHistoryTemplateFields) { + $result['CcPlayoutHistoryTemplateFields'] = $this->collCcPlayoutHistoryTemplateFields->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPlayoutHistoryTemplatePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbName($value); + break; + case 2: + $this->setDbType($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcPlayoutHistoryTemplatePeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbType($arr[$keys[2]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); + + if ($this->isColumnModified(CcPlayoutHistoryTemplatePeer::ID)) $criteria->add(CcPlayoutHistoryTemplatePeer::ID, $this->id); + if ($this->isColumnModified(CcPlayoutHistoryTemplatePeer::NAME)) $criteria->add(CcPlayoutHistoryTemplatePeer::NAME, $this->name); + if ($this->isColumnModified(CcPlayoutHistoryTemplatePeer::TYPE)) $criteria->add(CcPlayoutHistoryTemplatePeer::TYPE, $this->type); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryTemplatePeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcPlayoutHistoryTemplate (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbName($this->getDbName()); + $copyObj->setDbType($this->getDbType()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + foreach ($this->getCcPlayoutHistoryTemplateFields() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcPlayoutHistoryTemplateField($relObj->copy($deepCopy)); + } + } + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcPlayoutHistoryTemplate Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcPlayoutHistoryTemplatePeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcPlayoutHistoryTemplatePeer(); + } + + return self::$peer; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CcPlayoutHistoryTemplateField' == $relationName) { + $this->initCcPlayoutHistoryTemplateFields(); + } + } + + /** + * Clears out the collCcPlayoutHistoryTemplateFields collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcPlayoutHistoryTemplate The current object (for fluent API support) + * @see addCcPlayoutHistoryTemplateFields() + */ + public function clearCcPlayoutHistoryTemplateFields() + { + $this->collCcPlayoutHistoryTemplateFields = null; // important to set this to null since that means it is uninitialized + $this->collCcPlayoutHistoryTemplateFieldsPartial = null; + + return $this; + } + + /** + * reset is the collCcPlayoutHistoryTemplateFields collection loaded partially + * + * @return void + */ + public function resetPartialCcPlayoutHistoryTemplateFields($v = true) + { + $this->collCcPlayoutHistoryTemplateFieldsPartial = $v; + } + + /** + * Initializes the collCcPlayoutHistoryTemplateFields collection. + * + * By default this just sets the collCcPlayoutHistoryTemplateFields collection to an empty array (like clearcollCcPlayoutHistoryTemplateFields()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcPlayoutHistoryTemplateFields($overrideExisting = true) + { + if (null !== $this->collCcPlayoutHistoryTemplateFields && !$overrideExisting) { + return; + } + $this->collCcPlayoutHistoryTemplateFields = new PropelObjectCollection(); + $this->collCcPlayoutHistoryTemplateFields->setModel('CcPlayoutHistoryTemplateField'); + } + + /** + * Gets an array of CcPlayoutHistoryTemplateField objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcPlayoutHistoryTemplate is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcPlayoutHistoryTemplateField[] List of CcPlayoutHistoryTemplateField objects + * @throws PropelException + */ + public function getCcPlayoutHistoryTemplateFields($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcPlayoutHistoryTemplateFieldsPartial && !$this->isNew(); + if (null === $this->collCcPlayoutHistoryTemplateFields || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlayoutHistoryTemplateFields) { + // return empty collection + $this->initCcPlayoutHistoryTemplateFields(); + } else { + $collCcPlayoutHistoryTemplateFields = CcPlayoutHistoryTemplateFieldQuery::create(null, $criteria) + ->filterByCcPlayoutHistoryTemplate($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcPlayoutHistoryTemplateFieldsPartial && count($collCcPlayoutHistoryTemplateFields)) { + $this->initCcPlayoutHistoryTemplateFields(false); + + foreach ($collCcPlayoutHistoryTemplateFields as $obj) { + if (false == $this->collCcPlayoutHistoryTemplateFields->contains($obj)) { + $this->collCcPlayoutHistoryTemplateFields->append($obj); + } + } + + $this->collCcPlayoutHistoryTemplateFieldsPartial = true; + } + + $collCcPlayoutHistoryTemplateFields->getInternalIterator()->rewind(); + + return $collCcPlayoutHistoryTemplateFields; + } + + if ($partial && $this->collCcPlayoutHistoryTemplateFields) { + foreach ($this->collCcPlayoutHistoryTemplateFields as $obj) { + if ($obj->isNew()) { + $collCcPlayoutHistoryTemplateFields[] = $obj; + } + } + } + + $this->collCcPlayoutHistoryTemplateFields = $collCcPlayoutHistoryTemplateFields; + $this->collCcPlayoutHistoryTemplateFieldsPartial = false; + } + } + + return $this->collCcPlayoutHistoryTemplateFields; + } + + /** + * Sets a collection of CcPlayoutHistoryTemplateField objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccPlayoutHistoryTemplateFields A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcPlayoutHistoryTemplate The current object (for fluent API support) + */ + public function setCcPlayoutHistoryTemplateFields(PropelCollection $ccPlayoutHistoryTemplateFields, PropelPDO $con = null) + { + $ccPlayoutHistoryTemplateFieldsToDelete = $this->getCcPlayoutHistoryTemplateFields(new Criteria(), $con)->diff($ccPlayoutHistoryTemplateFields); + + + $this->ccPlayoutHistoryTemplateFieldsScheduledForDeletion = $ccPlayoutHistoryTemplateFieldsToDelete; + + foreach ($ccPlayoutHistoryTemplateFieldsToDelete as $ccPlayoutHistoryTemplateFieldRemoved) { + $ccPlayoutHistoryTemplateFieldRemoved->setCcPlayoutHistoryTemplate(null); + } + + $this->collCcPlayoutHistoryTemplateFields = null; + foreach ($ccPlayoutHistoryTemplateFields as $ccPlayoutHistoryTemplateField) { + $this->addCcPlayoutHistoryTemplateField($ccPlayoutHistoryTemplateField); + } + + $this->collCcPlayoutHistoryTemplateFields = $ccPlayoutHistoryTemplateFields; + $this->collCcPlayoutHistoryTemplateFieldsPartial = false; + + return $this; + } + + /** + * Returns the number of related CcPlayoutHistoryTemplateField objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcPlayoutHistoryTemplateField objects. + * @throws PropelException + */ + public function countCcPlayoutHistoryTemplateFields(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcPlayoutHistoryTemplateFieldsPartial && !$this->isNew(); + if (null === $this->collCcPlayoutHistoryTemplateFields || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlayoutHistoryTemplateFields) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcPlayoutHistoryTemplateFields()); + } + $query = CcPlayoutHistoryTemplateFieldQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcPlayoutHistoryTemplate($this) + ->count($con); + } + + return count($this->collCcPlayoutHistoryTemplateFields); + } + + /** + * Method called to associate a CcPlayoutHistoryTemplateField object to this object + * through the CcPlayoutHistoryTemplateField foreign key attribute. + * + * @param CcPlayoutHistoryTemplateField $l CcPlayoutHistoryTemplateField + * @return CcPlayoutHistoryTemplate The current object (for fluent API support) + */ + public function addCcPlayoutHistoryTemplateField(CcPlayoutHistoryTemplateField $l) + { + if ($this->collCcPlayoutHistoryTemplateFields === null) { + $this->initCcPlayoutHistoryTemplateFields(); + $this->collCcPlayoutHistoryTemplateFieldsPartial = true; + } + + if (!in_array($l, $this->collCcPlayoutHistoryTemplateFields->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcPlayoutHistoryTemplateField($l); + + if ($this->ccPlayoutHistoryTemplateFieldsScheduledForDeletion and $this->ccPlayoutHistoryTemplateFieldsScheduledForDeletion->contains($l)) { + $this->ccPlayoutHistoryTemplateFieldsScheduledForDeletion->remove($this->ccPlayoutHistoryTemplateFieldsScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcPlayoutHistoryTemplateField $ccPlayoutHistoryTemplateField The ccPlayoutHistoryTemplateField object to add. + */ + protected function doAddCcPlayoutHistoryTemplateField($ccPlayoutHistoryTemplateField) + { + $this->collCcPlayoutHistoryTemplateFields[]= $ccPlayoutHistoryTemplateField; + $ccPlayoutHistoryTemplateField->setCcPlayoutHistoryTemplate($this); + } + + /** + * @param CcPlayoutHistoryTemplateField $ccPlayoutHistoryTemplateField The ccPlayoutHistoryTemplateField object to remove. + * @return CcPlayoutHistoryTemplate The current object (for fluent API support) + */ + public function removeCcPlayoutHistoryTemplateField($ccPlayoutHistoryTemplateField) + { + if ($this->getCcPlayoutHistoryTemplateFields()->contains($ccPlayoutHistoryTemplateField)) { + $this->collCcPlayoutHistoryTemplateFields->remove($this->collCcPlayoutHistoryTemplateFields->search($ccPlayoutHistoryTemplateField)); + if (null === $this->ccPlayoutHistoryTemplateFieldsScheduledForDeletion) { + $this->ccPlayoutHistoryTemplateFieldsScheduledForDeletion = clone $this->collCcPlayoutHistoryTemplateFields; + $this->ccPlayoutHistoryTemplateFieldsScheduledForDeletion->clear(); + } + $this->ccPlayoutHistoryTemplateFieldsScheduledForDeletion[]= clone $ccPlayoutHistoryTemplateField; + $ccPlayoutHistoryTemplateField->setCcPlayoutHistoryTemplate(null); + } + + return $this; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->name = null; + $this->type = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCcPlayoutHistoryTemplateFields) { + foreach ($this->collCcPlayoutHistoryTemplateFields as $o) { + $o->clearAllReferences($deep); + } + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + if ($this->collCcPlayoutHistoryTemplateFields instanceof PropelCollection) { + $this->collCcPlayoutHistoryTemplateFields->clearIterator(); + } + $this->collCcPlayoutHistoryTemplateFields = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcPlayoutHistoryTemplatePeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateField.php b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateField.php index 3476aa459d..7148c270de 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateField.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateField.php @@ -4,1073 +4,1251 @@ /** * Base class that represents a row from the 'cc_playout_history_template_field' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcPlayoutHistoryTemplateField extends BaseObject implements Persistent +abstract class BaseCcPlayoutHistoryTemplateField extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcPlayoutHistoryTemplateFieldPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcPlayoutHistoryTemplateFieldPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the template_id field. - * @var int - */ - protected $template_id; - - /** - * The value for the name field. - * @var string - */ - protected $name; - - /** - * The value for the label field. - * @var string - */ - protected $label; - - /** - * The value for the type field. - * @var string - */ - protected $type; - - /** - * The value for the is_file_md field. - * Note: this column has a database default value of: false - * @var boolean - */ - protected $is_file_md; - - /** - * The value for the position field. - * @var int - */ - protected $position; - - /** - * @var CcPlayoutHistoryTemplate - */ - protected $aCcPlayoutHistoryTemplate; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->is_file_md = false; - } - - /** - * Initializes internal state of BaseCcPlayoutHistoryTemplateField object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [template_id] column value. - * - * @return int - */ - public function getDbTemplateId() - { - return $this->template_id; - } - - /** - * Get the [name] column value. - * - * @return string - */ - public function getDbName() - { - return $this->name; - } - - /** - * Get the [label] column value. - * - * @return string - */ - public function getDbLabel() - { - return $this->label; - } - - /** - * Get the [type] column value. - * - * @return string - */ - public function getDbType() - { - return $this->type; - } - - /** - * Get the [is_file_md] column value. - * - * @return boolean - */ - public function getDbIsFileMD() - { - return $this->is_file_md; - } - - /** - * Get the [position] column value. - * - * @return int - */ - public function getDbPosition() - { - return $this->position; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [template_id] column. - * - * @param int $v new value - * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) - */ - public function setDbTemplateId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->template_id !== $v) { - $this->template_id = $v; - $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID; - } - - if ($this->aCcPlayoutHistoryTemplate !== null && $this->aCcPlayoutHistoryTemplate->getDbId() !== $v) { - $this->aCcPlayoutHistoryTemplate = null; - } - - return $this; - } // setDbTemplateId() - - /** - * Set the value of [name] column. - * - * @param string $v new value - * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) - */ - public function setDbName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->name !== $v) { - $this->name = $v; - $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::NAME; - } - - return $this; - } // setDbName() - - /** - * Set the value of [label] column. - * - * @param string $v new value - * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) - */ - public function setDbLabel($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->label !== $v) { - $this->label = $v; - $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::LABEL; - } - - return $this; - } // setDbLabel() - - /** - * Set the value of [type] column. - * - * @param string $v new value - * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) - */ - public function setDbType($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->type !== $v) { - $this->type = $v; - $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::TYPE; - } - - return $this; - } // setDbType() - - /** - * Set the value of [is_file_md] column. - * - * @param boolean $v new value - * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) - */ - public function setDbIsFileMD($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->is_file_md !== $v || $this->isNew()) { - $this->is_file_md = $v; - $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::IS_FILE_MD; - } - - return $this; - } // setDbIsFileMD() - - /** - * Set the value of [position] column. - * - * @param int $v new value - * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) - */ - public function setDbPosition($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->position !== $v) { - $this->position = $v; - $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::POSITION; - } - - return $this; - } // setDbPosition() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->is_file_md !== false) { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->template_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->name = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->label = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->type = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; - $this->is_file_md = ($row[$startcol + 5] !== null) ? (boolean) $row[$startcol + 5] : null; - $this->position = ($row[$startcol + 6] !== null) ? (int) $row[$startcol + 6] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 7; // 7 = CcPlayoutHistoryTemplateFieldPeer::NUM_COLUMNS - CcPlayoutHistoryTemplateFieldPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcPlayoutHistoryTemplateField object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcPlayoutHistoryTemplate !== null && $this->template_id !== $this->aCcPlayoutHistoryTemplate->getDbId()) { - $this->aCcPlayoutHistoryTemplate = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcPlayoutHistoryTemplateFieldPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcPlayoutHistoryTemplate = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcPlayoutHistoryTemplateFieldQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcPlayoutHistoryTemplateFieldPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcPlayoutHistoryTemplate !== null) { - if ($this->aCcPlayoutHistoryTemplate->isModified() || $this->aCcPlayoutHistoryTemplate->isNew()) { - $affectedRows += $this->aCcPlayoutHistoryTemplate->save($con); - } - $this->setCcPlayoutHistoryTemplate($this->aCcPlayoutHistoryTemplate); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcPlayoutHistoryTemplateFieldPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlayoutHistoryTemplateFieldPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcPlayoutHistoryTemplateFieldPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcPlayoutHistoryTemplate !== null) { - if (!$this->aCcPlayoutHistoryTemplate->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcPlayoutHistoryTemplate->getValidationFailures()); - } - } - - - if (($retval = CcPlayoutHistoryTemplateFieldPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPlayoutHistoryTemplateFieldPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbTemplateId(); - break; - case 2: - return $this->getDbName(); - break; - case 3: - return $this->getDbLabel(); - break; - case 4: - return $this->getDbType(); - break; - case 5: - return $this->getDbIsFileMD(); - break; - case 6: - return $this->getDbPosition(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcPlayoutHistoryTemplateFieldPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbTemplateId(), - $keys[2] => $this->getDbName(), - $keys[3] => $this->getDbLabel(), - $keys[4] => $this->getDbType(), - $keys[5] => $this->getDbIsFileMD(), - $keys[6] => $this->getDbPosition(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcPlayoutHistoryTemplate) { - $result['CcPlayoutHistoryTemplate'] = $this->aCcPlayoutHistoryTemplate->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPlayoutHistoryTemplateFieldPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbTemplateId($value); - break; - case 2: - $this->setDbName($value); - break; - case 3: - $this->setDbLabel($value); - break; - case 4: - $this->setDbType($value); - break; - case 5: - $this->setDbIsFileMD($value); - break; - case 6: - $this->setDbPosition($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcPlayoutHistoryTemplateFieldPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbTemplateId($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbName($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbLabel($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbType($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setDbIsFileMD($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setDbPosition($arr[$keys[6]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::ID)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::ID, $this->id); - if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, $this->template_id); - if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::NAME)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::NAME, $this->name); - if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::LABEL)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::LABEL, $this->label); - if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::TYPE)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::TYPE, $this->type); - if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::IS_FILE_MD)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::IS_FILE_MD, $this->is_file_md); - if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::POSITION)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::POSITION, $this->position); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryTemplateFieldPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcPlayoutHistoryTemplateField (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbTemplateId($this->template_id); - $copyObj->setDbName($this->name); - $copyObj->setDbLabel($this->label); - $copyObj->setDbType($this->type); - $copyObj->setDbIsFileMD($this->is_file_md); - $copyObj->setDbPosition($this->position); - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcPlayoutHistoryTemplateField Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcPlayoutHistoryTemplateFieldPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcPlayoutHistoryTemplateFieldPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcPlayoutHistoryTemplate object. - * - * @param CcPlayoutHistoryTemplate $v - * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) - * @throws PropelException - */ - public function setCcPlayoutHistoryTemplate(CcPlayoutHistoryTemplate $v = null) - { - if ($v === null) { - $this->setDbTemplateId(NULL); - } else { - $this->setDbTemplateId($v->getDbId()); - } - - $this->aCcPlayoutHistoryTemplate = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcPlayoutHistoryTemplate object, it will not be re-added. - if ($v !== null) { - $v->addCcPlayoutHistoryTemplateField($this); - } - - return $this; - } - - - /** - * Get the associated CcPlayoutHistoryTemplate object - * - * @param PropelPDO Optional Connection object. - * @return CcPlayoutHistoryTemplate The associated CcPlayoutHistoryTemplate object. - * @throws PropelException - */ - public function getCcPlayoutHistoryTemplate(PropelPDO $con = null) - { - if ($this->aCcPlayoutHistoryTemplate === null && ($this->template_id !== null)) { - $this->aCcPlayoutHistoryTemplate = CcPlayoutHistoryTemplateQuery::create()->findPk($this->template_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcPlayoutHistoryTemplate->addCcPlayoutHistoryTemplateFields($this); - */ - } - return $this->aCcPlayoutHistoryTemplate; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->template_id = null; - $this->name = null; - $this->label = null; - $this->type = null; - $this->is_file_md = null; - $this->position = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcPlayoutHistoryTemplate = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcPlayoutHistoryTemplateField + /** + * Peer class name + */ + const PEER = 'CcPlayoutHistoryTemplateFieldPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcPlayoutHistoryTemplateFieldPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the template_id field. + * @var int + */ + protected $template_id; + + /** + * The value for the name field. + * @var string + */ + protected $name; + + /** + * The value for the label field. + * @var string + */ + protected $label; + + /** + * The value for the type field. + * @var string + */ + protected $type; + + /** + * The value for the is_file_md field. + * Note: this column has a database default value of: false + * @var boolean + */ + protected $is_file_md; + + /** + * The value for the position field. + * @var int + */ + protected $position; + + /** + * @var CcPlayoutHistoryTemplate + */ + protected $aCcPlayoutHistoryTemplate; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->is_file_md = false; + } + + /** + * Initializes internal state of BaseCcPlayoutHistoryTemplateField object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [template_id] column value. + * + * @return int + */ + public function getDbTemplateId() + { + + return $this->template_id; + } + + /** + * Get the [name] column value. + * + * @return string + */ + public function getDbName() + { + + return $this->name; + } + + /** + * Get the [label] column value. + * + * @return string + */ + public function getDbLabel() + { + + return $this->label; + } + + /** + * Get the [type] column value. + * + * @return string + */ + public function getDbType() + { + + return $this->type; + } + + /** + * Get the [is_file_md] column value. + * + * @return boolean + */ + public function getDbIsFileMD() + { + + return $this->is_file_md; + } + + /** + * Get the [position] column value. + * + * @return int + */ + public function getDbPosition() + { + + return $this->position; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [template_id] column. + * + * @param int $v new value + * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) + */ + public function setDbTemplateId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->template_id !== $v) { + $this->template_id = $v; + $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID; + } + + if ($this->aCcPlayoutHistoryTemplate !== null && $this->aCcPlayoutHistoryTemplate->getDbId() !== $v) { + $this->aCcPlayoutHistoryTemplate = null; + } + + + return $this; + } // setDbTemplateId() + + /** + * Set the value of [name] column. + * + * @param string $v new value + * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) + */ + public function setDbName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->name !== $v) { + $this->name = $v; + $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::NAME; + } + + + return $this; + } // setDbName() + + /** + * Set the value of [label] column. + * + * @param string $v new value + * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) + */ + public function setDbLabel($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->label !== $v) { + $this->label = $v; + $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::LABEL; + } + + + return $this; + } // setDbLabel() + + /** + * Set the value of [type] column. + * + * @param string $v new value + * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) + */ + public function setDbType($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->type !== $v) { + $this->type = $v; + $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::TYPE; + } + + + return $this; + } // setDbType() + + /** + * Sets the value of the [is_file_md] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) + */ + public function setDbIsFileMD($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->is_file_md !== $v) { + $this->is_file_md = $v; + $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::IS_FILE_MD; + } + + + return $this; + } // setDbIsFileMD() + + /** + * Set the value of [position] column. + * + * @param int $v new value + * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) + */ + public function setDbPosition($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->position !== $v) { + $this->position = $v; + $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::POSITION; + } + + + return $this; + } // setDbPosition() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->is_file_md !== false) { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->template_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->name = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->label = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->type = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; + $this->is_file_md = ($row[$startcol + 5] !== null) ? (boolean) $row[$startcol + 5] : null; + $this->position = ($row[$startcol + 6] !== null) ? (int) $row[$startcol + 6] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 7; // 7 = CcPlayoutHistoryTemplateFieldPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcPlayoutHistoryTemplateField object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcPlayoutHistoryTemplate !== null && $this->template_id !== $this->aCcPlayoutHistoryTemplate->getDbId()) { + $this->aCcPlayoutHistoryTemplate = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcPlayoutHistoryTemplateFieldPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcPlayoutHistoryTemplate = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcPlayoutHistoryTemplateFieldQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcPlayoutHistoryTemplateFieldPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcPlayoutHistoryTemplate !== null) { + if ($this->aCcPlayoutHistoryTemplate->isModified() || $this->aCcPlayoutHistoryTemplate->isNew()) { + $affectedRows += $this->aCcPlayoutHistoryTemplate->save($con); + } + $this->setCcPlayoutHistoryTemplate($this->aCcPlayoutHistoryTemplate); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcPlayoutHistoryTemplateFieldPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcPlayoutHistoryTemplateFieldPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_playout_history_template_field_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID)) { + $modifiedColumns[':p' . $index++] = '"template_id"'; + } + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::NAME)) { + $modifiedColumns[':p' . $index++] = '"name"'; + } + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::LABEL)) { + $modifiedColumns[':p' . $index++] = '"label"'; + } + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::TYPE)) { + $modifiedColumns[':p' . $index++] = '"type"'; + } + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::IS_FILE_MD)) { + $modifiedColumns[':p' . $index++] = '"is_file_md"'; + } + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::POSITION)) { + $modifiedColumns[':p' . $index++] = '"position"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_playout_history_template_field" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"template_id"': + $stmt->bindValue($identifier, $this->template_id, PDO::PARAM_INT); + break; + case '"name"': + $stmt->bindValue($identifier, $this->name, PDO::PARAM_STR); + break; + case '"label"': + $stmt->bindValue($identifier, $this->label, PDO::PARAM_STR); + break; + case '"type"': + $stmt->bindValue($identifier, $this->type, PDO::PARAM_STR); + break; + case '"is_file_md"': + $stmt->bindValue($identifier, $this->is_file_md, PDO::PARAM_BOOL); + break; + case '"position"': + $stmt->bindValue($identifier, $this->position, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcPlayoutHistoryTemplate !== null) { + if (!$this->aCcPlayoutHistoryTemplate->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcPlayoutHistoryTemplate->getValidationFailures()); + } + } + + + if (($retval = CcPlayoutHistoryTemplateFieldPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPlayoutHistoryTemplateFieldPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbTemplateId(); + break; + case 2: + return $this->getDbName(); + break; + case 3: + return $this->getDbLabel(); + break; + case 4: + return $this->getDbType(); + break; + case 5: + return $this->getDbIsFileMD(); + break; + case 6: + return $this->getDbPosition(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcPlayoutHistoryTemplateField'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcPlayoutHistoryTemplateField'][$this->getPrimaryKey()] = true; + $keys = CcPlayoutHistoryTemplateFieldPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbTemplateId(), + $keys[2] => $this->getDbName(), + $keys[3] => $this->getDbLabel(), + $keys[4] => $this->getDbType(), + $keys[5] => $this->getDbIsFileMD(), + $keys[6] => $this->getDbPosition(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcPlayoutHistoryTemplate) { + $result['CcPlayoutHistoryTemplate'] = $this->aCcPlayoutHistoryTemplate->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPlayoutHistoryTemplateFieldPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbTemplateId($value); + break; + case 2: + $this->setDbName($value); + break; + case 3: + $this->setDbLabel($value); + break; + case 4: + $this->setDbType($value); + break; + case 5: + $this->setDbIsFileMD($value); + break; + case 6: + $this->setDbPosition($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcPlayoutHistoryTemplateFieldPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbTemplateId($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbName($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbLabel($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbType($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setDbIsFileMD($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setDbPosition($arr[$keys[6]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::ID)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::ID, $this->id); + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, $this->template_id); + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::NAME)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::NAME, $this->name); + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::LABEL)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::LABEL, $this->label); + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::TYPE)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::TYPE, $this->type); + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::IS_FILE_MD)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::IS_FILE_MD, $this->is_file_md); + if ($this->isColumnModified(CcPlayoutHistoryTemplateFieldPeer::POSITION)) $criteria->add(CcPlayoutHistoryTemplateFieldPeer::POSITION, $this->position); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryTemplateFieldPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcPlayoutHistoryTemplateField (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbTemplateId($this->getDbTemplateId()); + $copyObj->setDbName($this->getDbName()); + $copyObj->setDbLabel($this->getDbLabel()); + $copyObj->setDbType($this->getDbType()); + $copyObj->setDbIsFileMD($this->getDbIsFileMD()); + $copyObj->setDbPosition($this->getDbPosition()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcPlayoutHistoryTemplateField Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcPlayoutHistoryTemplateFieldPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcPlayoutHistoryTemplateFieldPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcPlayoutHistoryTemplate object. + * + * @param CcPlayoutHistoryTemplate $v + * @return CcPlayoutHistoryTemplateField The current object (for fluent API support) + * @throws PropelException + */ + public function setCcPlayoutHistoryTemplate(CcPlayoutHistoryTemplate $v = null) + { + if ($v === null) { + $this->setDbTemplateId(NULL); + } else { + $this->setDbTemplateId($v->getDbId()); + } + + $this->aCcPlayoutHistoryTemplate = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcPlayoutHistoryTemplate object, it will not be re-added. + if ($v !== null) { + $v->addCcPlayoutHistoryTemplateField($this); + } + + + return $this; + } + + + /** + * Get the associated CcPlayoutHistoryTemplate object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcPlayoutHistoryTemplate The associated CcPlayoutHistoryTemplate object. + * @throws PropelException + */ + public function getCcPlayoutHistoryTemplate(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcPlayoutHistoryTemplate === null && ($this->template_id !== null) && $doQuery) { + $this->aCcPlayoutHistoryTemplate = CcPlayoutHistoryTemplateQuery::create()->findPk($this->template_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcPlayoutHistoryTemplate->addCcPlayoutHistoryTemplateFields($this); + */ + } + + return $this->aCcPlayoutHistoryTemplate; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->template_id = null; + $this->name = null; + $this->label = null; + $this->type = null; + $this->is_file_md = null; + $this->position = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcPlayoutHistoryTemplate instanceof Persistent) { + $this->aCcPlayoutHistoryTemplate->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcPlayoutHistoryTemplate = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcPlayoutHistoryTemplateFieldPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateFieldPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateFieldPeer.php index 91586fa1d8..cd33ca808c 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateFieldPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateFieldPeer.php @@ -4,991 +4,1017 @@ /** * Base static class for performing query and update operations on the 'cc_playout_history_template_field' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcPlayoutHistoryTemplateFieldPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_playout_history_template_field'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcPlayoutHistoryTemplateField'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcPlayoutHistoryTemplateField'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcPlayoutHistoryTemplateFieldTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 7; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_playout_history_template_field.ID'; - - /** the column name for the TEMPLATE_ID field */ - const TEMPLATE_ID = 'cc_playout_history_template_field.TEMPLATE_ID'; - - /** the column name for the NAME field */ - const NAME = 'cc_playout_history_template_field.NAME'; - - /** the column name for the LABEL field */ - const LABEL = 'cc_playout_history_template_field.LABEL'; - - /** the column name for the TYPE field */ - const TYPE = 'cc_playout_history_template_field.TYPE'; - - /** the column name for the IS_FILE_MD field */ - const IS_FILE_MD = 'cc_playout_history_template_field.IS_FILE_MD'; - - /** the column name for the POSITION field */ - const POSITION = 'cc_playout_history_template_field.POSITION'; - - /** - * An identiy map to hold any loaded instances of CcPlayoutHistoryTemplateField objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcPlayoutHistoryTemplateField[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbTemplateId', 'DbName', 'DbLabel', 'DbType', 'DbIsFileMD', 'DbPosition', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbTemplateId', 'dbName', 'dbLabel', 'dbType', 'dbIsFileMD', 'dbPosition', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::TEMPLATE_ID, self::NAME, self::LABEL, self::TYPE, self::IS_FILE_MD, self::POSITION, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'TEMPLATE_ID', 'NAME', 'LABEL', 'TYPE', 'IS_FILE_MD', 'POSITION', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'template_id', 'name', 'label', 'type', 'is_file_md', 'position', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbTemplateId' => 1, 'DbName' => 2, 'DbLabel' => 3, 'DbType' => 4, 'DbIsFileMD' => 5, 'DbPosition' => 6, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbTemplateId' => 1, 'dbName' => 2, 'dbLabel' => 3, 'dbType' => 4, 'dbIsFileMD' => 5, 'dbPosition' => 6, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::TEMPLATE_ID => 1, self::NAME => 2, self::LABEL => 3, self::TYPE => 4, self::IS_FILE_MD => 5, self::POSITION => 6, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'TEMPLATE_ID' => 1, 'NAME' => 2, 'LABEL' => 3, 'TYPE' => 4, 'IS_FILE_MD' => 5, 'POSITION' => 6, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'template_id' => 1, 'name' => 2, 'label' => 3, 'type' => 4, 'is_file_md' => 5, 'position' => 6, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcPlayoutHistoryTemplateFieldPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::ID); - $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID); - $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::NAME); - $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::LABEL); - $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::TYPE); - $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::IS_FILE_MD); - $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::POSITION); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.TEMPLATE_ID'); - $criteria->addSelectColumn($alias . '.NAME'); - $criteria->addSelectColumn($alias . '.LABEL'); - $criteria->addSelectColumn($alias . '.TYPE'); - $criteria->addSelectColumn($alias . '.IS_FILE_MD'); - $criteria->addSelectColumn($alias . '.POSITION'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlayoutHistoryTemplateFieldPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcPlayoutHistoryTemplateField - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcPlayoutHistoryTemplateFieldPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcPlayoutHistoryTemplateFieldPeer::populateObjects(CcPlayoutHistoryTemplateFieldPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcPlayoutHistoryTemplateFieldPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcPlayoutHistoryTemplateField $value A CcPlayoutHistoryTemplateField object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcPlayoutHistoryTemplateField $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcPlayoutHistoryTemplateField object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcPlayoutHistoryTemplateField) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPlayoutHistoryTemplateField object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcPlayoutHistoryTemplateField Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_playout_history_template_field - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcPlayoutHistoryTemplateFieldPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcPlayoutHistoryTemplateFieldPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcPlayoutHistoryTemplateFieldPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcPlayoutHistoryTemplateFieldPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcPlayoutHistoryTemplateField object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcPlayoutHistoryTemplateFieldPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcPlayoutHistoryTemplateFieldPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcPlayoutHistoryTemplateFieldPeer::NUM_COLUMNS; - } else { - $cls = CcPlayoutHistoryTemplateFieldPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcPlayoutHistoryTemplateFieldPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcPlayoutHistoryTemplate table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcPlayoutHistoryTemplate(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlayoutHistoryTemplateFieldPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, CcPlayoutHistoryTemplatePeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcPlayoutHistoryTemplateField objects pre-filled with their CcPlayoutHistoryTemplate objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlayoutHistoryTemplateField objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcPlayoutHistoryTemplate(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlayoutHistoryTemplateFieldPeer::addSelectColumns($criteria); - $startcol = (CcPlayoutHistoryTemplateFieldPeer::NUM_COLUMNS - CcPlayoutHistoryTemplateFieldPeer::NUM_LAZY_LOAD_COLUMNS); - CcPlayoutHistoryTemplatePeer::addSelectColumns($criteria); - - $criteria->addJoin(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, CcPlayoutHistoryTemplatePeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlayoutHistoryTemplateFieldPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlayoutHistoryTemplateFieldPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcPlayoutHistoryTemplateFieldPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlayoutHistoryTemplateFieldPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcPlayoutHistoryTemplatePeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcPlayoutHistoryTemplatePeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcPlayoutHistoryTemplatePeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcPlayoutHistoryTemplatePeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcPlayoutHistoryTemplateField) to $obj2 (CcPlayoutHistoryTemplate) - $obj2->addCcPlayoutHistoryTemplateField($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlayoutHistoryTemplateFieldPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, CcPlayoutHistoryTemplatePeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcPlayoutHistoryTemplateField objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPlayoutHistoryTemplateField objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPlayoutHistoryTemplateFieldPeer::addSelectColumns($criteria); - $startcol2 = (CcPlayoutHistoryTemplateFieldPeer::NUM_COLUMNS - CcPlayoutHistoryTemplateFieldPeer::NUM_LAZY_LOAD_COLUMNS); - - CcPlayoutHistoryTemplatePeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcPlayoutHistoryTemplatePeer::NUM_COLUMNS - CcPlayoutHistoryTemplatePeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, CcPlayoutHistoryTemplatePeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPlayoutHistoryTemplateFieldPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPlayoutHistoryTemplateFieldPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcPlayoutHistoryTemplateFieldPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPlayoutHistoryTemplateFieldPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcPlayoutHistoryTemplate rows - - $key2 = CcPlayoutHistoryTemplatePeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcPlayoutHistoryTemplatePeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcPlayoutHistoryTemplatePeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcPlayoutHistoryTemplatePeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcPlayoutHistoryTemplateField) to the collection in $obj2 (CcPlayoutHistoryTemplate) - $obj2->addCcPlayoutHistoryTemplateField($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcPlayoutHistoryTemplateFieldPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcPlayoutHistoryTemplateFieldTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcPlayoutHistoryTemplateFieldPeer::CLASS_DEFAULT : CcPlayoutHistoryTemplateFieldPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcPlayoutHistoryTemplateField or Criteria object. - * - * @param mixed $values Criteria or CcPlayoutHistoryTemplateField object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcPlayoutHistoryTemplateField object - } - - if ($criteria->containsKey(CcPlayoutHistoryTemplateFieldPeer::ID) && $criteria->keyContainsValue(CcPlayoutHistoryTemplateFieldPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlayoutHistoryTemplateFieldPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcPlayoutHistoryTemplateField or Criteria object. - * - * @param mixed $values Criteria or CcPlayoutHistoryTemplateField object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcPlayoutHistoryTemplateFieldPeer::ID); - $value = $criteria->remove(CcPlayoutHistoryTemplateFieldPeer::ID); - if ($value) { - $selectCriteria->add(CcPlayoutHistoryTemplateFieldPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME); - } - - } else { // $values is CcPlayoutHistoryTemplateField object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_playout_history_template_field table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME, $con, CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcPlayoutHistoryTemplateFieldPeer::clearInstancePool(); - CcPlayoutHistoryTemplateFieldPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcPlayoutHistoryTemplateField or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcPlayoutHistoryTemplateField object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcPlayoutHistoryTemplateFieldPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcPlayoutHistoryTemplateField) { // it's a model object - // invalidate the cache for this single object - CcPlayoutHistoryTemplateFieldPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryTemplateFieldPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcPlayoutHistoryTemplateFieldPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcPlayoutHistoryTemplateFieldPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcPlayoutHistoryTemplateField object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcPlayoutHistoryTemplateField $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcPlayoutHistoryTemplateField $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcPlayoutHistoryTemplateField - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcPlayoutHistoryTemplateFieldPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryTemplateFieldPeer::ID, $pk); - - $v = CcPlayoutHistoryTemplateFieldPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryTemplateFieldPeer::ID, $pks, Criteria::IN); - $objs = CcPlayoutHistoryTemplateFieldPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcPlayoutHistoryTemplateFieldPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_playout_history_template_field'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcPlayoutHistoryTemplateField'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcPlayoutHistoryTemplateFieldTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 7; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 7; + + /** the column name for the id field */ + const ID = 'cc_playout_history_template_field.id'; + + /** the column name for the template_id field */ + const TEMPLATE_ID = 'cc_playout_history_template_field.template_id'; + + /** the column name for the name field */ + const NAME = 'cc_playout_history_template_field.name'; + + /** the column name for the label field */ + const LABEL = 'cc_playout_history_template_field.label'; + + /** the column name for the type field */ + const TYPE = 'cc_playout_history_template_field.type'; + + /** the column name for the is_file_md field */ + const IS_FILE_MD = 'cc_playout_history_template_field.is_file_md'; + + /** the column name for the position field */ + const POSITION = 'cc_playout_history_template_field.position'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcPlayoutHistoryTemplateField objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcPlayoutHistoryTemplateField[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcPlayoutHistoryTemplateFieldPeer::$fieldNames[CcPlayoutHistoryTemplateFieldPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbTemplateId', 'DbName', 'DbLabel', 'DbType', 'DbIsFileMD', 'DbPosition', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbTemplateId', 'dbName', 'dbLabel', 'dbType', 'dbIsFileMD', 'dbPosition', ), + BasePeer::TYPE_COLNAME => array (CcPlayoutHistoryTemplateFieldPeer::ID, CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, CcPlayoutHistoryTemplateFieldPeer::NAME, CcPlayoutHistoryTemplateFieldPeer::LABEL, CcPlayoutHistoryTemplateFieldPeer::TYPE, CcPlayoutHistoryTemplateFieldPeer::IS_FILE_MD, CcPlayoutHistoryTemplateFieldPeer::POSITION, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'TEMPLATE_ID', 'NAME', 'LABEL', 'TYPE', 'IS_FILE_MD', 'POSITION', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'template_id', 'name', 'label', 'type', 'is_file_md', 'position', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcPlayoutHistoryTemplateFieldPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbTemplateId' => 1, 'DbName' => 2, 'DbLabel' => 3, 'DbType' => 4, 'DbIsFileMD' => 5, 'DbPosition' => 6, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbTemplateId' => 1, 'dbName' => 2, 'dbLabel' => 3, 'dbType' => 4, 'dbIsFileMD' => 5, 'dbPosition' => 6, ), + BasePeer::TYPE_COLNAME => array (CcPlayoutHistoryTemplateFieldPeer::ID => 0, CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID => 1, CcPlayoutHistoryTemplateFieldPeer::NAME => 2, CcPlayoutHistoryTemplateFieldPeer::LABEL => 3, CcPlayoutHistoryTemplateFieldPeer::TYPE => 4, CcPlayoutHistoryTemplateFieldPeer::IS_FILE_MD => 5, CcPlayoutHistoryTemplateFieldPeer::POSITION => 6, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'TEMPLATE_ID' => 1, 'NAME' => 2, 'LABEL' => 3, 'TYPE' => 4, 'IS_FILE_MD' => 5, 'POSITION' => 6, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'template_id' => 1, 'name' => 2, 'label' => 3, 'type' => 4, 'is_file_md' => 5, 'position' => 6, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcPlayoutHistoryTemplateFieldPeer::getFieldNames($toType); + $key = isset(CcPlayoutHistoryTemplateFieldPeer::$fieldKeys[$fromType][$name]) ? CcPlayoutHistoryTemplateFieldPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcPlayoutHistoryTemplateFieldPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcPlayoutHistoryTemplateFieldPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcPlayoutHistoryTemplateFieldPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcPlayoutHistoryTemplateFieldPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::ID); + $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID); + $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::NAME); + $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::LABEL); + $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::TYPE); + $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::IS_FILE_MD); + $criteria->addSelectColumn(CcPlayoutHistoryTemplateFieldPeer::POSITION); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.template_id'); + $criteria->addSelectColumn($alias . '.name'); + $criteria->addSelectColumn($alias . '.label'); + $criteria->addSelectColumn($alias . '.type'); + $criteria->addSelectColumn($alias . '.is_file_md'); + $criteria->addSelectColumn($alias . '.position'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlayoutHistoryTemplateFieldPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcPlayoutHistoryTemplateField + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcPlayoutHistoryTemplateFieldPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcPlayoutHistoryTemplateFieldPeer::populateObjects(CcPlayoutHistoryTemplateFieldPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcPlayoutHistoryTemplateFieldPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcPlayoutHistoryTemplateField $obj A CcPlayoutHistoryTemplateField object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcPlayoutHistoryTemplateFieldPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcPlayoutHistoryTemplateField object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcPlayoutHistoryTemplateField) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPlayoutHistoryTemplateField object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcPlayoutHistoryTemplateFieldPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcPlayoutHistoryTemplateField Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcPlayoutHistoryTemplateFieldPeer::$instances[$key])) { + return CcPlayoutHistoryTemplateFieldPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcPlayoutHistoryTemplateFieldPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcPlayoutHistoryTemplateFieldPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_playout_history_template_field + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcPlayoutHistoryTemplateFieldPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcPlayoutHistoryTemplateFieldPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcPlayoutHistoryTemplateFieldPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcPlayoutHistoryTemplateFieldPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcPlayoutHistoryTemplateField object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcPlayoutHistoryTemplateFieldPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcPlayoutHistoryTemplateFieldPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcPlayoutHistoryTemplateFieldPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcPlayoutHistoryTemplateFieldPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcPlayoutHistoryTemplateFieldPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcPlayoutHistoryTemplate table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcPlayoutHistoryTemplate(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlayoutHistoryTemplateFieldPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, CcPlayoutHistoryTemplatePeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcPlayoutHistoryTemplateField objects pre-filled with their CcPlayoutHistoryTemplate objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlayoutHistoryTemplateField objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcPlayoutHistoryTemplate(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + } + + CcPlayoutHistoryTemplateFieldPeer::addSelectColumns($criteria); + $startcol = CcPlayoutHistoryTemplateFieldPeer::NUM_HYDRATE_COLUMNS; + CcPlayoutHistoryTemplatePeer::addSelectColumns($criteria); + + $criteria->addJoin(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, CcPlayoutHistoryTemplatePeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlayoutHistoryTemplateFieldPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlayoutHistoryTemplateFieldPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcPlayoutHistoryTemplateFieldPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlayoutHistoryTemplateFieldPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcPlayoutHistoryTemplatePeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcPlayoutHistoryTemplatePeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcPlayoutHistoryTemplatePeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcPlayoutHistoryTemplatePeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcPlayoutHistoryTemplateField) to $obj2 (CcPlayoutHistoryTemplate) + $obj2->addCcPlayoutHistoryTemplateField($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlayoutHistoryTemplateFieldPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, CcPlayoutHistoryTemplatePeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcPlayoutHistoryTemplateField objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPlayoutHistoryTemplateField objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + } + + CcPlayoutHistoryTemplateFieldPeer::addSelectColumns($criteria); + $startcol2 = CcPlayoutHistoryTemplateFieldPeer::NUM_HYDRATE_COLUMNS; + + CcPlayoutHistoryTemplatePeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcPlayoutHistoryTemplatePeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, CcPlayoutHistoryTemplatePeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPlayoutHistoryTemplateFieldPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPlayoutHistoryTemplateFieldPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcPlayoutHistoryTemplateFieldPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPlayoutHistoryTemplateFieldPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcPlayoutHistoryTemplate rows + + $key2 = CcPlayoutHistoryTemplatePeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcPlayoutHistoryTemplatePeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcPlayoutHistoryTemplatePeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcPlayoutHistoryTemplatePeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcPlayoutHistoryTemplateField) to the collection in $obj2 (CcPlayoutHistoryTemplate) + $obj2->addCcPlayoutHistoryTemplateField($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME)->getTable(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcPlayoutHistoryTemplateFieldPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcPlayoutHistoryTemplateFieldTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcPlayoutHistoryTemplateFieldPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcPlayoutHistoryTemplateField or Criteria object. + * + * @param mixed $values Criteria or CcPlayoutHistoryTemplateField object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcPlayoutHistoryTemplateField object + } + + if ($criteria->containsKey(CcPlayoutHistoryTemplateFieldPeer::ID) && $criteria->keyContainsValue(CcPlayoutHistoryTemplateFieldPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlayoutHistoryTemplateFieldPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcPlayoutHistoryTemplateField or Criteria object. + * + * @param mixed $values Criteria or CcPlayoutHistoryTemplateField object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcPlayoutHistoryTemplateFieldPeer::ID); + $value = $criteria->remove(CcPlayoutHistoryTemplateFieldPeer::ID); + if ($value) { + $selectCriteria->add(CcPlayoutHistoryTemplateFieldPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME); + } + + } else { // $values is CcPlayoutHistoryTemplateField object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_playout_history_template_field table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME, $con, CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcPlayoutHistoryTemplateFieldPeer::clearInstancePool(); + CcPlayoutHistoryTemplateFieldPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcPlayoutHistoryTemplateField or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcPlayoutHistoryTemplateField object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcPlayoutHistoryTemplateFieldPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcPlayoutHistoryTemplateField) { // it's a model object + // invalidate the cache for this single object + CcPlayoutHistoryTemplateFieldPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryTemplateFieldPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcPlayoutHistoryTemplateFieldPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcPlayoutHistoryTemplateFieldPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcPlayoutHistoryTemplateField object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcPlayoutHistoryTemplateField $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, CcPlayoutHistoryTemplateFieldPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcPlayoutHistoryTemplateField + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcPlayoutHistoryTemplateFieldPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryTemplateFieldPeer::ID, $pk); + + $v = CcPlayoutHistoryTemplateFieldPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcPlayoutHistoryTemplateField[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryTemplateFieldPeer::ID, $pks, Criteria::IN); + $objs = CcPlayoutHistoryTemplateFieldPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcPlayoutHistoryTemplateFieldPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateFieldQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateFieldQuery.php index 2bccd58ca2..873e192965 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateFieldQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateFieldQuery.php @@ -4,399 +4,577 @@ /** * Base class that represents a query for the 'cc_playout_history_template_field' table. * - * * - * @method CcPlayoutHistoryTemplateFieldQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcPlayoutHistoryTemplateFieldQuery orderByDbTemplateId($order = Criteria::ASC) Order by the template_id column - * @method CcPlayoutHistoryTemplateFieldQuery orderByDbName($order = Criteria::ASC) Order by the name column - * @method CcPlayoutHistoryTemplateFieldQuery orderByDbLabel($order = Criteria::ASC) Order by the label column - * @method CcPlayoutHistoryTemplateFieldQuery orderByDbType($order = Criteria::ASC) Order by the type column - * @method CcPlayoutHistoryTemplateFieldQuery orderByDbIsFileMD($order = Criteria::ASC) Order by the is_file_md column - * @method CcPlayoutHistoryTemplateFieldQuery orderByDbPosition($order = Criteria::ASC) Order by the position column * - * @method CcPlayoutHistoryTemplateFieldQuery groupByDbId() Group by the id column - * @method CcPlayoutHistoryTemplateFieldQuery groupByDbTemplateId() Group by the template_id column - * @method CcPlayoutHistoryTemplateFieldQuery groupByDbName() Group by the name column - * @method CcPlayoutHistoryTemplateFieldQuery groupByDbLabel() Group by the label column - * @method CcPlayoutHistoryTemplateFieldQuery groupByDbType() Group by the type column - * @method CcPlayoutHistoryTemplateFieldQuery groupByDbIsFileMD() Group by the is_file_md column - * @method CcPlayoutHistoryTemplateFieldQuery groupByDbPosition() Group by the position column + * @method CcPlayoutHistoryTemplateFieldQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcPlayoutHistoryTemplateFieldQuery orderByDbTemplateId($order = Criteria::ASC) Order by the template_id column + * @method CcPlayoutHistoryTemplateFieldQuery orderByDbName($order = Criteria::ASC) Order by the name column + * @method CcPlayoutHistoryTemplateFieldQuery orderByDbLabel($order = Criteria::ASC) Order by the label column + * @method CcPlayoutHistoryTemplateFieldQuery orderByDbType($order = Criteria::ASC) Order by the type column + * @method CcPlayoutHistoryTemplateFieldQuery orderByDbIsFileMD($order = Criteria::ASC) Order by the is_file_md column + * @method CcPlayoutHistoryTemplateFieldQuery orderByDbPosition($order = Criteria::ASC) Order by the position column * - * @method CcPlayoutHistoryTemplateFieldQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcPlayoutHistoryTemplateFieldQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcPlayoutHistoryTemplateFieldQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcPlayoutHistoryTemplateFieldQuery groupByDbId() Group by the id column + * @method CcPlayoutHistoryTemplateFieldQuery groupByDbTemplateId() Group by the template_id column + * @method CcPlayoutHistoryTemplateFieldQuery groupByDbName() Group by the name column + * @method CcPlayoutHistoryTemplateFieldQuery groupByDbLabel() Group by the label column + * @method CcPlayoutHistoryTemplateFieldQuery groupByDbType() Group by the type column + * @method CcPlayoutHistoryTemplateFieldQuery groupByDbIsFileMD() Group by the is_file_md column + * @method CcPlayoutHistoryTemplateFieldQuery groupByDbPosition() Group by the position column * - * @method CcPlayoutHistoryTemplateFieldQuery leftJoinCcPlayoutHistoryTemplate($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcPlayoutHistoryTemplate relation - * @method CcPlayoutHistoryTemplateFieldQuery rightJoinCcPlayoutHistoryTemplate($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcPlayoutHistoryTemplate relation - * @method CcPlayoutHistoryTemplateFieldQuery innerJoinCcPlayoutHistoryTemplate($relationAlias = '') Adds a INNER JOIN clause to the query using the CcPlayoutHistoryTemplate relation + * @method CcPlayoutHistoryTemplateFieldQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcPlayoutHistoryTemplateFieldQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcPlayoutHistoryTemplateFieldQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcPlayoutHistoryTemplateField findOne(PropelPDO $con = null) Return the first CcPlayoutHistoryTemplateField matching the query - * @method CcPlayoutHistoryTemplateField findOneOrCreate(PropelPDO $con = null) Return the first CcPlayoutHistoryTemplateField matching the query, or a new CcPlayoutHistoryTemplateField object populated from the query conditions when no match is found + * @method CcPlayoutHistoryTemplateFieldQuery leftJoinCcPlayoutHistoryTemplate($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPlayoutHistoryTemplate relation + * @method CcPlayoutHistoryTemplateFieldQuery rightJoinCcPlayoutHistoryTemplate($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlayoutHistoryTemplate relation + * @method CcPlayoutHistoryTemplateFieldQuery innerJoinCcPlayoutHistoryTemplate($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlayoutHistoryTemplate relation * - * @method CcPlayoutHistoryTemplateField findOneByDbId(int $id) Return the first CcPlayoutHistoryTemplateField filtered by the id column - * @method CcPlayoutHistoryTemplateField findOneByDbTemplateId(int $template_id) Return the first CcPlayoutHistoryTemplateField filtered by the template_id column - * @method CcPlayoutHistoryTemplateField findOneByDbName(string $name) Return the first CcPlayoutHistoryTemplateField filtered by the name column - * @method CcPlayoutHistoryTemplateField findOneByDbLabel(string $label) Return the first CcPlayoutHistoryTemplateField filtered by the label column - * @method CcPlayoutHistoryTemplateField findOneByDbType(string $type) Return the first CcPlayoutHistoryTemplateField filtered by the type column - * @method CcPlayoutHistoryTemplateField findOneByDbIsFileMD(boolean $is_file_md) Return the first CcPlayoutHistoryTemplateField filtered by the is_file_md column - * @method CcPlayoutHistoryTemplateField findOneByDbPosition(int $position) Return the first CcPlayoutHistoryTemplateField filtered by the position column + * @method CcPlayoutHistoryTemplateField findOne(PropelPDO $con = null) Return the first CcPlayoutHistoryTemplateField matching the query + * @method CcPlayoutHistoryTemplateField findOneOrCreate(PropelPDO $con = null) Return the first CcPlayoutHistoryTemplateField matching the query, or a new CcPlayoutHistoryTemplateField object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcPlayoutHistoryTemplateField objects filtered by the id column - * @method array findByDbTemplateId(int $template_id) Return CcPlayoutHistoryTemplateField objects filtered by the template_id column - * @method array findByDbName(string $name) Return CcPlayoutHistoryTemplateField objects filtered by the name column - * @method array findByDbLabel(string $label) Return CcPlayoutHistoryTemplateField objects filtered by the label column - * @method array findByDbType(string $type) Return CcPlayoutHistoryTemplateField objects filtered by the type column - * @method array findByDbIsFileMD(boolean $is_file_md) Return CcPlayoutHistoryTemplateField objects filtered by the is_file_md column - * @method array findByDbPosition(int $position) Return CcPlayoutHistoryTemplateField objects filtered by the position column + * @method CcPlayoutHistoryTemplateField findOneByDbTemplateId(int $template_id) Return the first CcPlayoutHistoryTemplateField filtered by the template_id column + * @method CcPlayoutHistoryTemplateField findOneByDbName(string $name) Return the first CcPlayoutHistoryTemplateField filtered by the name column + * @method CcPlayoutHistoryTemplateField findOneByDbLabel(string $label) Return the first CcPlayoutHistoryTemplateField filtered by the label column + * @method CcPlayoutHistoryTemplateField findOneByDbType(string $type) Return the first CcPlayoutHistoryTemplateField filtered by the type column + * @method CcPlayoutHistoryTemplateField findOneByDbIsFileMD(boolean $is_file_md) Return the first CcPlayoutHistoryTemplateField filtered by the is_file_md column + * @method CcPlayoutHistoryTemplateField findOneByDbPosition(int $position) Return the first CcPlayoutHistoryTemplateField filtered by the position column + * + * @method array findByDbId(int $id) Return CcPlayoutHistoryTemplateField objects filtered by the id column + * @method array findByDbTemplateId(int $template_id) Return CcPlayoutHistoryTemplateField objects filtered by the template_id column + * @method array findByDbName(string $name) Return CcPlayoutHistoryTemplateField objects filtered by the name column + * @method array findByDbLabel(string $label) Return CcPlayoutHistoryTemplateField objects filtered by the label column + * @method array findByDbType(string $type) Return CcPlayoutHistoryTemplateField objects filtered by the type column + * @method array findByDbIsFileMD(boolean $is_file_md) Return CcPlayoutHistoryTemplateField objects filtered by the is_file_md column + * @method array findByDbPosition(int $position) Return CcPlayoutHistoryTemplateField objects filtered by the position column * * @package propel.generator.airtime.om */ abstract class BaseCcPlayoutHistoryTemplateFieldQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcPlayoutHistoryTemplateFieldQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcPlayoutHistoryTemplateField'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcPlayoutHistoryTemplateFieldQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcPlayoutHistoryTemplateFieldQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcPlayoutHistoryTemplateFieldQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcPlayoutHistoryTemplateFieldQuery) { + return $criteria; + } + $query = new CcPlayoutHistoryTemplateFieldQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcPlayoutHistoryTemplateField|CcPlayoutHistoryTemplateField[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcPlayoutHistoryTemplateFieldPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplateFieldPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlayoutHistoryTemplateField A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlayoutHistoryTemplateField A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "template_id", "name", "label", "type", "is_file_md", "position" FROM "cc_playout_history_template_field" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcPlayoutHistoryTemplateField(); + $obj->hydrate($row); + CcPlayoutHistoryTemplateFieldPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlayoutHistoryTemplateField|CcPlayoutHistoryTemplateField[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcPlayoutHistoryTemplateField[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the template_id column + * + * Example usage: + * + * $query->filterByDbTemplateId(1234); // WHERE template_id = 1234 + * $query->filterByDbTemplateId(array(12, 34)); // WHERE template_id IN (12, 34) + * $query->filterByDbTemplateId(array('min' => 12)); // WHERE template_id >= 12 + * $query->filterByDbTemplateId(array('max' => 12)); // WHERE template_id <= 12 + * + * + * @see filterByCcPlayoutHistoryTemplate() + * + * @param mixed $dbTemplateId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface + */ + public function filterByDbTemplateId($dbTemplateId = null, $comparison = null) + { + if (is_array($dbTemplateId)) { + $useMinMax = false; + if (isset($dbTemplateId['min'])) { + $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, $dbTemplateId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbTemplateId['max'])) { + $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, $dbTemplateId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, $dbTemplateId, $comparison); + } + + /** + * Filter the query on the name column + * + * Example usage: + * + * $query->filterByDbName('fooValue'); // WHERE name = 'fooValue' + * $query->filterByDbName('%fooValue%'); // WHERE name LIKE '%fooValue%' + * + * + * @param string $dbName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface + */ + public function filterByDbName($dbName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbName)) { + $dbName = str_replace('*', '%', $dbName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::NAME, $dbName, $comparison); + } + + /** + * Filter the query on the label column + * + * Example usage: + * + * $query->filterByDbLabel('fooValue'); // WHERE label = 'fooValue' + * $query->filterByDbLabel('%fooValue%'); // WHERE label LIKE '%fooValue%' + * + * + * @param string $dbLabel The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface + */ + public function filterByDbLabel($dbLabel = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLabel)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLabel)) { + $dbLabel = str_replace('*', '%', $dbLabel); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::LABEL, $dbLabel, $comparison); + } + + /** + * Filter the query on the type column + * + * Example usage: + * + * $query->filterByDbType('fooValue'); // WHERE type = 'fooValue' + * $query->filterByDbType('%fooValue%'); // WHERE type LIKE '%fooValue%' + * + * + * @param string $dbType The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface + */ + public function filterByDbType($dbType = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbType)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbType)) { + $dbType = str_replace('*', '%', $dbType); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::TYPE, $dbType, $comparison); + } + + /** + * Filter the query on the is_file_md column + * + * Example usage: + * + * $query->filterByDbIsFileMD(true); // WHERE is_file_md = true + * $query->filterByDbIsFileMD('yes'); // WHERE is_file_md = true + * + * + * @param boolean|string $dbIsFileMD The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface + */ + public function filterByDbIsFileMD($dbIsFileMD = null, $comparison = null) + { + if (is_string($dbIsFileMD)) { + $dbIsFileMD = in_array(strtolower($dbIsFileMD), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::IS_FILE_MD, $dbIsFileMD, $comparison); + } + + /** + * Filter the query on the position column + * + * Example usage: + * + * $query->filterByDbPosition(1234); // WHERE position = 1234 + * $query->filterByDbPosition(array(12, 34)); // WHERE position IN (12, 34) + * $query->filterByDbPosition(array('min' => 12)); // WHERE position >= 12 + * $query->filterByDbPosition(array('max' => 12)); // WHERE position <= 12 + * + * + * @param mixed $dbPosition The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface + */ + public function filterByDbPosition($dbPosition = null, $comparison = null) + { + if (is_array($dbPosition)) { + $useMinMax = false; + if (isset($dbPosition['min'])) { + $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::POSITION, $dbPosition['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbPosition['max'])) { + $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::POSITION, $dbPosition['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::POSITION, $dbPosition, $comparison); + } + + /** + * Filter the query by a related CcPlayoutHistoryTemplate object + * + * @param CcPlayoutHistoryTemplate|PropelObjectCollection $ccPlayoutHistoryTemplate The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcPlayoutHistoryTemplate($ccPlayoutHistoryTemplate, $comparison = null) + { + if ($ccPlayoutHistoryTemplate instanceof CcPlayoutHistoryTemplate) { + return $this + ->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, $ccPlayoutHistoryTemplate->getDbId(), $comparison); + } elseif ($ccPlayoutHistoryTemplate instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, $ccPlayoutHistoryTemplate->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcPlayoutHistoryTemplate() only accepts arguments of type CcPlayoutHistoryTemplate or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcPlayoutHistoryTemplate relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface + */ + public function joinCcPlayoutHistoryTemplate($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcPlayoutHistoryTemplate'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcPlayoutHistoryTemplate'); + } + + return $this; + } + + /** + * Use the CcPlayoutHistoryTemplate relation CcPlayoutHistoryTemplate object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlayoutHistoryTemplateQuery A secondary query class using the current class as primary query + */ + public function useCcPlayoutHistoryTemplateQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcPlayoutHistoryTemplate($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistoryTemplate', 'CcPlayoutHistoryTemplateQuery'); + } + + /** + * Exclude object from result + * + * @param CcPlayoutHistoryTemplateField $ccPlayoutHistoryTemplateField Object to remove from the list of results + * + * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface + */ + public function prune($ccPlayoutHistoryTemplateField = null) + { + if ($ccPlayoutHistoryTemplateField) { + $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::ID, $ccPlayoutHistoryTemplateField->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcPlayoutHistoryTemplateFieldQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcPlayoutHistoryTemplateField', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcPlayoutHistoryTemplateFieldQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcPlayoutHistoryTemplateFieldQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcPlayoutHistoryTemplateFieldQuery) { - return $criteria; - } - $query = new CcPlayoutHistoryTemplateFieldQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcPlayoutHistoryTemplateField|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcPlayoutHistoryTemplateFieldPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the template_id column - * - * @param int|array $dbTemplateId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface - */ - public function filterByDbTemplateId($dbTemplateId = null, $comparison = null) - { - if (is_array($dbTemplateId)) { - $useMinMax = false; - if (isset($dbTemplateId['min'])) { - $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, $dbTemplateId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbTemplateId['max'])) { - $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, $dbTemplateId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, $dbTemplateId, $comparison); - } - - /** - * Filter the query on the name column - * - * @param string $dbName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface - */ - public function filterByDbName($dbName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbName)) { - $dbName = str_replace('*', '%', $dbName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::NAME, $dbName, $comparison); - } - - /** - * Filter the query on the label column - * - * @param string $dbLabel The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface - */ - public function filterByDbLabel($dbLabel = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLabel)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLabel)) { - $dbLabel = str_replace('*', '%', $dbLabel); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::LABEL, $dbLabel, $comparison); - } - - /** - * Filter the query on the type column - * - * @param string $dbType The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface - */ - public function filterByDbType($dbType = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbType)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbType)) { - $dbType = str_replace('*', '%', $dbType); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::TYPE, $dbType, $comparison); - } - - /** - * Filter the query on the is_file_md column - * - * @param boolean|string $dbIsFileMD The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface - */ - public function filterByDbIsFileMD($dbIsFileMD = null, $comparison = null) - { - if (is_string($dbIsFileMD)) { - $is_file_md = in_array(strtolower($dbIsFileMD), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::IS_FILE_MD, $dbIsFileMD, $comparison); - } - - /** - * Filter the query on the position column - * - * @param int|array $dbPosition The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface - */ - public function filterByDbPosition($dbPosition = null, $comparison = null) - { - if (is_array($dbPosition)) { - $useMinMax = false; - if (isset($dbPosition['min'])) { - $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::POSITION, $dbPosition['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbPosition['max'])) { - $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::POSITION, $dbPosition['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::POSITION, $dbPosition, $comparison); - } - - /** - * Filter the query by a related CcPlayoutHistoryTemplate object - * - * @param CcPlayoutHistoryTemplate $ccPlayoutHistoryTemplate the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface - */ - public function filterByCcPlayoutHistoryTemplate($ccPlayoutHistoryTemplate, $comparison = null) - { - return $this - ->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::TEMPLATE_ID, $ccPlayoutHistoryTemplate->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcPlayoutHistoryTemplate relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface - */ - public function joinCcPlayoutHistoryTemplate($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcPlayoutHistoryTemplate'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcPlayoutHistoryTemplate'); - } - - return $this; - } - - /** - * Use the CcPlayoutHistoryTemplate relation CcPlayoutHistoryTemplate object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlayoutHistoryTemplateQuery A secondary query class using the current class as primary query - */ - public function useCcPlayoutHistoryTemplateQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcPlayoutHistoryTemplate($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistoryTemplate', 'CcPlayoutHistoryTemplateQuery'); - } - - /** - * Exclude object from result - * - * @param CcPlayoutHistoryTemplateField $ccPlayoutHistoryTemplateField Object to remove from the list of results - * - * @return CcPlayoutHistoryTemplateFieldQuery The current query, for fluid interface - */ - public function prune($ccPlayoutHistoryTemplateField = null) - { - if ($ccPlayoutHistoryTemplateField) { - $this->addUsingAlias(CcPlayoutHistoryTemplateFieldPeer::ID, $ccPlayoutHistoryTemplateField->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcPlayoutHistoryTemplateFieldQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplatePeer.php b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplatePeer.php index 9e1d216f19..89c7cdc9d2 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplatePeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplatePeer.php @@ -4,740 +4,762 @@ /** * Base static class for performing query and update operations on the 'cc_playout_history_template' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcPlayoutHistoryTemplatePeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_playout_history_template'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcPlayoutHistoryTemplate'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcPlayoutHistoryTemplate'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcPlayoutHistoryTemplateTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 3; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_playout_history_template.ID'; - - /** the column name for the NAME field */ - const NAME = 'cc_playout_history_template.NAME'; - - /** the column name for the TYPE field */ - const TYPE = 'cc_playout_history_template.TYPE'; - - /** - * An identiy map to hold any loaded instances of CcPlayoutHistoryTemplate objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcPlayoutHistoryTemplate[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbType', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbType', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::NAME, self::TYPE, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'TYPE', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'type', ), - BasePeer::TYPE_NUM => array (0, 1, 2, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbType' => 2, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbType' => 2, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::NAME => 1, self::TYPE => 2, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'TYPE' => 2, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'type' => 2, ), - BasePeer::TYPE_NUM => array (0, 1, 2, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcPlayoutHistoryTemplatePeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcPlayoutHistoryTemplatePeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcPlayoutHistoryTemplatePeer::ID); - $criteria->addSelectColumn(CcPlayoutHistoryTemplatePeer::NAME); - $criteria->addSelectColumn(CcPlayoutHistoryTemplatePeer::TYPE); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.NAME'); - $criteria->addSelectColumn($alias . '.TYPE'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPlayoutHistoryTemplatePeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPlayoutHistoryTemplatePeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcPlayoutHistoryTemplate - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcPlayoutHistoryTemplatePeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcPlayoutHistoryTemplatePeer::populateObjects(CcPlayoutHistoryTemplatePeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcPlayoutHistoryTemplatePeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcPlayoutHistoryTemplate $value A CcPlayoutHistoryTemplate object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcPlayoutHistoryTemplate $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcPlayoutHistoryTemplate object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcPlayoutHistoryTemplate) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPlayoutHistoryTemplate object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcPlayoutHistoryTemplate Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_playout_history_template - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - // Invalidate objects in CcPlayoutHistoryTemplateFieldPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcPlayoutHistoryTemplateFieldPeer::clearInstancePool(); - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcPlayoutHistoryTemplatePeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcPlayoutHistoryTemplatePeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcPlayoutHistoryTemplatePeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcPlayoutHistoryTemplatePeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcPlayoutHistoryTemplate object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcPlayoutHistoryTemplatePeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcPlayoutHistoryTemplatePeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcPlayoutHistoryTemplatePeer::NUM_COLUMNS; - } else { - $cls = CcPlayoutHistoryTemplatePeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcPlayoutHistoryTemplatePeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcPlayoutHistoryTemplatePeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcPlayoutHistoryTemplatePeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcPlayoutHistoryTemplateTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcPlayoutHistoryTemplatePeer::CLASS_DEFAULT : CcPlayoutHistoryTemplatePeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcPlayoutHistoryTemplate or Criteria object. - * - * @param mixed $values Criteria or CcPlayoutHistoryTemplate object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcPlayoutHistoryTemplate object - } - - if ($criteria->containsKey(CcPlayoutHistoryTemplatePeer::ID) && $criteria->keyContainsValue(CcPlayoutHistoryTemplatePeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlayoutHistoryTemplatePeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcPlayoutHistoryTemplate or Criteria object. - * - * @param mixed $values Criteria or CcPlayoutHistoryTemplate object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcPlayoutHistoryTemplatePeer::ID); - $value = $criteria->remove(CcPlayoutHistoryTemplatePeer::ID); - if ($value) { - $selectCriteria->add(CcPlayoutHistoryTemplatePeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcPlayoutHistoryTemplatePeer::TABLE_NAME); - } - - } else { // $values is CcPlayoutHistoryTemplate object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_playout_history_template table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcPlayoutHistoryTemplatePeer::TABLE_NAME, $con, CcPlayoutHistoryTemplatePeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcPlayoutHistoryTemplatePeer::clearInstancePool(); - CcPlayoutHistoryTemplatePeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcPlayoutHistoryTemplate or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcPlayoutHistoryTemplate object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcPlayoutHistoryTemplatePeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcPlayoutHistoryTemplate) { // it's a model object - // invalidate the cache for this single object - CcPlayoutHistoryTemplatePeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryTemplatePeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcPlayoutHistoryTemplatePeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcPlayoutHistoryTemplatePeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcPlayoutHistoryTemplate object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcPlayoutHistoryTemplate $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcPlayoutHistoryTemplate $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcPlayoutHistoryTemplatePeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, CcPlayoutHistoryTemplatePeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcPlayoutHistoryTemplate - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcPlayoutHistoryTemplatePeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryTemplatePeer::ID, $pk); - - $v = CcPlayoutHistoryTemplatePeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); - $criteria->add(CcPlayoutHistoryTemplatePeer::ID, $pks, Criteria::IN); - $objs = CcPlayoutHistoryTemplatePeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcPlayoutHistoryTemplatePeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_playout_history_template'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcPlayoutHistoryTemplate'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcPlayoutHistoryTemplateTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 3; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 3; + + /** the column name for the id field */ + const ID = 'cc_playout_history_template.id'; + + /** the column name for the name field */ + const NAME = 'cc_playout_history_template.name'; + + /** the column name for the type field */ + const TYPE = 'cc_playout_history_template.type'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcPlayoutHistoryTemplate objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcPlayoutHistoryTemplate[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcPlayoutHistoryTemplatePeer::$fieldNames[CcPlayoutHistoryTemplatePeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbType', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbType', ), + BasePeer::TYPE_COLNAME => array (CcPlayoutHistoryTemplatePeer::ID, CcPlayoutHistoryTemplatePeer::NAME, CcPlayoutHistoryTemplatePeer::TYPE, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'TYPE', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'type', ), + BasePeer::TYPE_NUM => array (0, 1, 2, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcPlayoutHistoryTemplatePeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbType' => 2, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbType' => 2, ), + BasePeer::TYPE_COLNAME => array (CcPlayoutHistoryTemplatePeer::ID => 0, CcPlayoutHistoryTemplatePeer::NAME => 1, CcPlayoutHistoryTemplatePeer::TYPE => 2, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'TYPE' => 2, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'type' => 2, ), + BasePeer::TYPE_NUM => array (0, 1, 2, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcPlayoutHistoryTemplatePeer::getFieldNames($toType); + $key = isset(CcPlayoutHistoryTemplatePeer::$fieldKeys[$fromType][$name]) ? CcPlayoutHistoryTemplatePeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcPlayoutHistoryTemplatePeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcPlayoutHistoryTemplatePeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcPlayoutHistoryTemplatePeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcPlayoutHistoryTemplatePeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcPlayoutHistoryTemplatePeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcPlayoutHistoryTemplatePeer::ID); + $criteria->addSelectColumn(CcPlayoutHistoryTemplatePeer::NAME); + $criteria->addSelectColumn(CcPlayoutHistoryTemplatePeer::TYPE); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.name'); + $criteria->addSelectColumn($alias . '.type'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPlayoutHistoryTemplatePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPlayoutHistoryTemplatePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcPlayoutHistoryTemplate + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcPlayoutHistoryTemplatePeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcPlayoutHistoryTemplatePeer::populateObjects(CcPlayoutHistoryTemplatePeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcPlayoutHistoryTemplatePeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcPlayoutHistoryTemplate $obj A CcPlayoutHistoryTemplate object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcPlayoutHistoryTemplatePeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcPlayoutHistoryTemplate object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcPlayoutHistoryTemplate) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPlayoutHistoryTemplate object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcPlayoutHistoryTemplatePeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcPlayoutHistoryTemplate Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcPlayoutHistoryTemplatePeer::$instances[$key])) { + return CcPlayoutHistoryTemplatePeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcPlayoutHistoryTemplatePeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcPlayoutHistoryTemplatePeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_playout_history_template + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in CcPlayoutHistoryTemplateFieldPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcPlayoutHistoryTemplateFieldPeer::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcPlayoutHistoryTemplatePeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcPlayoutHistoryTemplatePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcPlayoutHistoryTemplatePeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcPlayoutHistoryTemplatePeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcPlayoutHistoryTemplate object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcPlayoutHistoryTemplatePeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcPlayoutHistoryTemplatePeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcPlayoutHistoryTemplatePeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcPlayoutHistoryTemplatePeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcPlayoutHistoryTemplatePeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcPlayoutHistoryTemplatePeer::DATABASE_NAME)->getTable(CcPlayoutHistoryTemplatePeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcPlayoutHistoryTemplatePeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcPlayoutHistoryTemplatePeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcPlayoutHistoryTemplateTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcPlayoutHistoryTemplatePeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcPlayoutHistoryTemplate or Criteria object. + * + * @param mixed $values Criteria or CcPlayoutHistoryTemplate object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcPlayoutHistoryTemplate object + } + + if ($criteria->containsKey(CcPlayoutHistoryTemplatePeer::ID) && $criteria->keyContainsValue(CcPlayoutHistoryTemplatePeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPlayoutHistoryTemplatePeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcPlayoutHistoryTemplate or Criteria object. + * + * @param mixed $values Criteria or CcPlayoutHistoryTemplate object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcPlayoutHistoryTemplatePeer::ID); + $value = $criteria->remove(CcPlayoutHistoryTemplatePeer::ID); + if ($value) { + $selectCriteria->add(CcPlayoutHistoryTemplatePeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcPlayoutHistoryTemplatePeer::TABLE_NAME); + } + + } else { // $values is CcPlayoutHistoryTemplate object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_playout_history_template table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcPlayoutHistoryTemplatePeer::TABLE_NAME, $con, CcPlayoutHistoryTemplatePeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcPlayoutHistoryTemplatePeer::clearInstancePool(); + CcPlayoutHistoryTemplatePeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcPlayoutHistoryTemplate or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcPlayoutHistoryTemplate object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcPlayoutHistoryTemplatePeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcPlayoutHistoryTemplate) { // it's a model object + // invalidate the cache for this single object + CcPlayoutHistoryTemplatePeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryTemplatePeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcPlayoutHistoryTemplatePeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcPlayoutHistoryTemplatePeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcPlayoutHistoryTemplate object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcPlayoutHistoryTemplate $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcPlayoutHistoryTemplatePeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, CcPlayoutHistoryTemplatePeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcPlayoutHistoryTemplate + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcPlayoutHistoryTemplatePeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryTemplatePeer::ID, $pk); + + $v = CcPlayoutHistoryTemplatePeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcPlayoutHistoryTemplate[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcPlayoutHistoryTemplatePeer::DATABASE_NAME); + $criteria->add(CcPlayoutHistoryTemplatePeer::ID, $pks, Criteria::IN); + $objs = CcPlayoutHistoryTemplatePeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcPlayoutHistoryTemplatePeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateQuery.php index ca2f84229c..262b0ee2cb 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlayoutHistoryTemplateQuery.php @@ -4,282 +4,417 @@ /** * Base class that represents a query for the 'cc_playout_history_template' table. * - * * - * @method CcPlayoutHistoryTemplateQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcPlayoutHistoryTemplateQuery orderByDbName($order = Criteria::ASC) Order by the name column - * @method CcPlayoutHistoryTemplateQuery orderByDbType($order = Criteria::ASC) Order by the type column * - * @method CcPlayoutHistoryTemplateQuery groupByDbId() Group by the id column - * @method CcPlayoutHistoryTemplateQuery groupByDbName() Group by the name column - * @method CcPlayoutHistoryTemplateQuery groupByDbType() Group by the type column + * @method CcPlayoutHistoryTemplateQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcPlayoutHistoryTemplateQuery orderByDbName($order = Criteria::ASC) Order by the name column + * @method CcPlayoutHistoryTemplateQuery orderByDbType($order = Criteria::ASC) Order by the type column * - * @method CcPlayoutHistoryTemplateQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcPlayoutHistoryTemplateQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcPlayoutHistoryTemplateQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcPlayoutHistoryTemplateQuery groupByDbId() Group by the id column + * @method CcPlayoutHistoryTemplateQuery groupByDbName() Group by the name column + * @method CcPlayoutHistoryTemplateQuery groupByDbType() Group by the type column * - * @method CcPlayoutHistoryTemplateQuery leftJoinCcPlayoutHistoryTemplateField($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcPlayoutHistoryTemplateField relation - * @method CcPlayoutHistoryTemplateQuery rightJoinCcPlayoutHistoryTemplateField($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcPlayoutHistoryTemplateField relation - * @method CcPlayoutHistoryTemplateQuery innerJoinCcPlayoutHistoryTemplateField($relationAlias = '') Adds a INNER JOIN clause to the query using the CcPlayoutHistoryTemplateField relation + * @method CcPlayoutHistoryTemplateQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcPlayoutHistoryTemplateQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcPlayoutHistoryTemplateQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcPlayoutHistoryTemplate findOne(PropelPDO $con = null) Return the first CcPlayoutHistoryTemplate matching the query - * @method CcPlayoutHistoryTemplate findOneOrCreate(PropelPDO $con = null) Return the first CcPlayoutHistoryTemplate matching the query, or a new CcPlayoutHistoryTemplate object populated from the query conditions when no match is found + * @method CcPlayoutHistoryTemplateQuery leftJoinCcPlayoutHistoryTemplateField($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPlayoutHistoryTemplateField relation + * @method CcPlayoutHistoryTemplateQuery rightJoinCcPlayoutHistoryTemplateField($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlayoutHistoryTemplateField relation + * @method CcPlayoutHistoryTemplateQuery innerJoinCcPlayoutHistoryTemplateField($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlayoutHistoryTemplateField relation * - * @method CcPlayoutHistoryTemplate findOneByDbId(int $id) Return the first CcPlayoutHistoryTemplate filtered by the id column - * @method CcPlayoutHistoryTemplate findOneByDbName(string $name) Return the first CcPlayoutHistoryTemplate filtered by the name column - * @method CcPlayoutHistoryTemplate findOneByDbType(string $type) Return the first CcPlayoutHistoryTemplate filtered by the type column + * @method CcPlayoutHistoryTemplate findOne(PropelPDO $con = null) Return the first CcPlayoutHistoryTemplate matching the query + * @method CcPlayoutHistoryTemplate findOneOrCreate(PropelPDO $con = null) Return the first CcPlayoutHistoryTemplate matching the query, or a new CcPlayoutHistoryTemplate object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcPlayoutHistoryTemplate objects filtered by the id column - * @method array findByDbName(string $name) Return CcPlayoutHistoryTemplate objects filtered by the name column - * @method array findByDbType(string $type) Return CcPlayoutHistoryTemplate objects filtered by the type column + * @method CcPlayoutHistoryTemplate findOneByDbName(string $name) Return the first CcPlayoutHistoryTemplate filtered by the name column + * @method CcPlayoutHistoryTemplate findOneByDbType(string $type) Return the first CcPlayoutHistoryTemplate filtered by the type column + * + * @method array findByDbId(int $id) Return CcPlayoutHistoryTemplate objects filtered by the id column + * @method array findByDbName(string $name) Return CcPlayoutHistoryTemplate objects filtered by the name column + * @method array findByDbType(string $type) Return CcPlayoutHistoryTemplate objects filtered by the type column * * @package propel.generator.airtime.om */ abstract class BaseCcPlayoutHistoryTemplateQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcPlayoutHistoryTemplateQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcPlayoutHistoryTemplate'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcPlayoutHistoryTemplateQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcPlayoutHistoryTemplateQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcPlayoutHistoryTemplateQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcPlayoutHistoryTemplateQuery) { + return $criteria; + } + $query = new CcPlayoutHistoryTemplateQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcPlayoutHistoryTemplate|CcPlayoutHistoryTemplate[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcPlayoutHistoryTemplatePeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcPlayoutHistoryTemplatePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlayoutHistoryTemplate A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlayoutHistoryTemplate A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "name", "type" FROM "cc_playout_history_template" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcPlayoutHistoryTemplate(); + $obj->hydrate($row); + CcPlayoutHistoryTemplatePeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPlayoutHistoryTemplate|CcPlayoutHistoryTemplate[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcPlayoutHistoryTemplate[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the name column + * + * Example usage: + * + * $query->filterByDbName('fooValue'); // WHERE name = 'fooValue' + * $query->filterByDbName('%fooValue%'); // WHERE name LIKE '%fooValue%' + * + * + * @param string $dbName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface + */ + public function filterByDbName($dbName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbName)) { + $dbName = str_replace('*', '%', $dbName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::NAME, $dbName, $comparison); + } + + /** + * Filter the query on the type column + * + * Example usage: + * + * $query->filterByDbType('fooValue'); // WHERE type = 'fooValue' + * $query->filterByDbType('%fooValue%'); // WHERE type LIKE '%fooValue%' + * + * + * @param string $dbType The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface + */ + public function filterByDbType($dbType = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbType)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbType)) { + $dbType = str_replace('*', '%', $dbType); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::TYPE, $dbType, $comparison); + } + + /** + * Filter the query by a related CcPlayoutHistoryTemplateField object + * + * @param CcPlayoutHistoryTemplateField|PropelObjectCollection $ccPlayoutHistoryTemplateField the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcPlayoutHistoryTemplateField($ccPlayoutHistoryTemplateField, $comparison = null) + { + if ($ccPlayoutHistoryTemplateField instanceof CcPlayoutHistoryTemplateField) { + return $this + ->addUsingAlias(CcPlayoutHistoryTemplatePeer::ID, $ccPlayoutHistoryTemplateField->getDbTemplateId(), $comparison); + } elseif ($ccPlayoutHistoryTemplateField instanceof PropelObjectCollection) { + return $this + ->useCcPlayoutHistoryTemplateFieldQuery() + ->filterByPrimaryKeys($ccPlayoutHistoryTemplateField->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcPlayoutHistoryTemplateField() only accepts arguments of type CcPlayoutHistoryTemplateField or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcPlayoutHistoryTemplateField relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface + */ + public function joinCcPlayoutHistoryTemplateField($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcPlayoutHistoryTemplateField'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcPlayoutHistoryTemplateField'); + } + + return $this; + } + + /** + * Use the CcPlayoutHistoryTemplateField relation CcPlayoutHistoryTemplateField object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlayoutHistoryTemplateFieldQuery A secondary query class using the current class as primary query + */ + public function useCcPlayoutHistoryTemplateFieldQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcPlayoutHistoryTemplateField($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistoryTemplateField', 'CcPlayoutHistoryTemplateFieldQuery'); + } + + /** + * Exclude object from result + * + * @param CcPlayoutHistoryTemplate $ccPlayoutHistoryTemplate Object to remove from the list of results + * + * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface + */ + public function prune($ccPlayoutHistoryTemplate = null) + { + if ($ccPlayoutHistoryTemplate) { + $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::ID, $ccPlayoutHistoryTemplate->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcPlayoutHistoryTemplateQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcPlayoutHistoryTemplate', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcPlayoutHistoryTemplateQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcPlayoutHistoryTemplateQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcPlayoutHistoryTemplateQuery) { - return $criteria; - } - $query = new CcPlayoutHistoryTemplateQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcPlayoutHistoryTemplate|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcPlayoutHistoryTemplatePeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the name column - * - * @param string $dbName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface - */ - public function filterByDbName($dbName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbName)) { - $dbName = str_replace('*', '%', $dbName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::NAME, $dbName, $comparison); - } - - /** - * Filter the query on the type column - * - * @param string $dbType The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface - */ - public function filterByDbType($dbType = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbType)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbType)) { - $dbType = str_replace('*', '%', $dbType); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::TYPE, $dbType, $comparison); - } - - /** - * Filter the query by a related CcPlayoutHistoryTemplateField object - * - * @param CcPlayoutHistoryTemplateField $ccPlayoutHistoryTemplateField the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface - */ - public function filterByCcPlayoutHistoryTemplateField($ccPlayoutHistoryTemplateField, $comparison = null) - { - return $this - ->addUsingAlias(CcPlayoutHistoryTemplatePeer::ID, $ccPlayoutHistoryTemplateField->getDbTemplateId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcPlayoutHistoryTemplateField relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface - */ - public function joinCcPlayoutHistoryTemplateField($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcPlayoutHistoryTemplateField'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcPlayoutHistoryTemplateField'); - } - - return $this; - } - - /** - * Use the CcPlayoutHistoryTemplateField relation CcPlayoutHistoryTemplateField object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlayoutHistoryTemplateFieldQuery A secondary query class using the current class as primary query - */ - public function useCcPlayoutHistoryTemplateFieldQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcPlayoutHistoryTemplateField($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistoryTemplateField', 'CcPlayoutHistoryTemplateFieldQuery'); - } - - /** - * Exclude object from result - * - * @param CcPlayoutHistoryTemplate $ccPlayoutHistoryTemplate Object to remove from the list of results - * - * @return CcPlayoutHistoryTemplateQuery The current query, for fluid interface - */ - public function prune($ccPlayoutHistoryTemplate = null) - { - if ($ccPlayoutHistoryTemplate) { - $this->addUsingAlias(CcPlayoutHistoryTemplatePeer::ID, $ccPlayoutHistoryTemplate->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcPlayoutHistoryTemplateQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPref.php b/airtime_mvc/application/models/airtime/om/BaseCcPref.php index b1d9a307ed..ce56f1f30d 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPref.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPref.php @@ -4,902 +4,1048 @@ /** * Base class that represents a row from the 'cc_pref' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcPref extends BaseObject implements Persistent +abstract class BaseCcPref extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcPrefPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcPrefPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the subjid field. - * @var int - */ - protected $subjid; - - /** - * The value for the keystr field. - * @var string - */ - protected $keystr; - - /** - * The value for the valstr field. - * @var string - */ - protected $valstr; - - /** - * @var CcSubjs - */ - protected $aCcSubjs; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getId() - { - return $this->id; - } - - /** - * Get the [subjid] column value. - * - * @return int - */ - public function getSubjid() - { - return $this->subjid; - } - - /** - * Get the [keystr] column value. - * - * @return string - */ - public function getKeystr() - { - return $this->keystr; - } - - /** - * Get the [valstr] column value. - * - * @return string - */ - public function getValstr() - { - return $this->valstr; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcPref The current object (for fluent API support) - */ - public function setId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcPrefPeer::ID; - } - - return $this; - } // setId() - - /** - * Set the value of [subjid] column. - * - * @param int $v new value - * @return CcPref The current object (for fluent API support) - */ - public function setSubjid($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->subjid !== $v) { - $this->subjid = $v; - $this->modifiedColumns[] = CcPrefPeer::SUBJID; - } - - if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { - $this->aCcSubjs = null; - } - - return $this; - } // setSubjid() - - /** - * Set the value of [keystr] column. - * - * @param string $v new value - * @return CcPref The current object (for fluent API support) - */ - public function setKeystr($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->keystr !== $v) { - $this->keystr = $v; - $this->modifiedColumns[] = CcPrefPeer::KEYSTR; - } - - return $this; - } // setKeystr() - - /** - * Set the value of [valstr] column. - * - * @param string $v new value - * @return CcPref The current object (for fluent API support) - */ - public function setValstr($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->valstr !== $v) { - $this->valstr = $v; - $this->modifiedColumns[] = CcPrefPeer::VALSTR; - } - - return $this; - } // setValstr() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->subjid = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->keystr = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->valstr = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 4; // 4 = CcPrefPeer::NUM_COLUMNS - CcPrefPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcPref object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcSubjs !== null && $this->subjid !== $this->aCcSubjs->getDbId()) { - $this->aCcSubjs = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcPrefPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcSubjs = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcPrefQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcPrefPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSubjs !== null) { - if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { - $affectedRows += $this->aCcSubjs->save($con); - } - $this->setCcSubjs($this->aCcSubjs); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcPrefPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcPrefPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPrefPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcPrefPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSubjs !== null) { - if (!$this->aCcSubjs->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); - } - } - - - if (($retval = CcPrefPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPrefPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getId(); - break; - case 1: - return $this->getSubjid(); - break; - case 2: - return $this->getKeystr(); - break; - case 3: - return $this->getValstr(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcPrefPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getId(), - $keys[1] => $this->getSubjid(), - $keys[2] => $this->getKeystr(), - $keys[3] => $this->getValstr(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcSubjs) { - $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcPrefPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setId($value); - break; - case 1: - $this->setSubjid($value); - break; - case 2: - $this->setKeystr($value); - break; - case 3: - $this->setValstr($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcPrefPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setSubjid($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setKeystr($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setValstr($arr[$keys[3]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcPrefPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcPrefPeer::ID)) $criteria->add(CcPrefPeer::ID, $this->id); - if ($this->isColumnModified(CcPrefPeer::SUBJID)) $criteria->add(CcPrefPeer::SUBJID, $this->subjid); - if ($this->isColumnModified(CcPrefPeer::KEYSTR)) $criteria->add(CcPrefPeer::KEYSTR, $this->keystr); - if ($this->isColumnModified(CcPrefPeer::VALSTR)) $criteria->add(CcPrefPeer::VALSTR, $this->valstr); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcPrefPeer::DATABASE_NAME); - $criteria->add(CcPrefPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcPref (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setSubjid($this->subjid); - $copyObj->setKeystr($this->keystr); - $copyObj->setValstr($this->valstr); - - $copyObj->setNew(true); - $copyObj->setId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcPref Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcPrefPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcPrefPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcSubjs object. - * - * @param CcSubjs $v - * @return CcPref The current object (for fluent API support) - * @throws PropelException - */ - public function setCcSubjs(CcSubjs $v = null) - { - if ($v === null) { - $this->setSubjid(NULL); - } else { - $this->setSubjid($v->getDbId()); - } - - $this->aCcSubjs = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcSubjs object, it will not be re-added. - if ($v !== null) { - $v->addCcPref($this); - } - - return $this; - } - - - /** - * Get the associated CcSubjs object - * - * @param PropelPDO Optional Connection object. - * @return CcSubjs The associated CcSubjs object. - * @throws PropelException - */ - public function getCcSubjs(PropelPDO $con = null) - { - if ($this->aCcSubjs === null && ($this->subjid !== null)) { - $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->subjid, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcSubjs->addCcPrefs($this); - */ - } - return $this->aCcSubjs; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->subjid = null; - $this->keystr = null; - $this->valstr = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcSubjs = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcPref + /** + * Peer class name + */ + const PEER = 'CcPrefPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcPrefPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the subjid field. + * @var int + */ + protected $subjid; + + /** + * The value for the keystr field. + * @var string + */ + protected $keystr; + + /** + * The value for the valstr field. + * @var string + */ + protected $valstr; + + /** + * @var CcSubjs + */ + protected $aCcSubjs; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getId() + { + + return $this->id; + } + + /** + * Get the [subjid] column value. + * + * @return int + */ + public function getSubjid() + { + + return $this->subjid; + } + + /** + * Get the [keystr] column value. + * + * @return string + */ + public function getKeystr() + { + + return $this->keystr; + } + + /** + * Get the [valstr] column value. + * + * @return string + */ + public function getValstr() + { + + return $this->valstr; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcPref The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcPrefPeer::ID; + } + + + return $this; + } // setId() + + /** + * Set the value of [subjid] column. + * + * @param int $v new value + * @return CcPref The current object (for fluent API support) + */ + public function setSubjid($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->subjid !== $v) { + $this->subjid = $v; + $this->modifiedColumns[] = CcPrefPeer::SUBJID; + } + + if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { + $this->aCcSubjs = null; + } + + + return $this; + } // setSubjid() + + /** + * Set the value of [keystr] column. + * + * @param string $v new value + * @return CcPref The current object (for fluent API support) + */ + public function setKeystr($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->keystr !== $v) { + $this->keystr = $v; + $this->modifiedColumns[] = CcPrefPeer::KEYSTR; + } + + + return $this; + } // setKeystr() + + /** + * Set the value of [valstr] column. + * + * @param string $v new value + * @return CcPref The current object (for fluent API support) + */ + public function setValstr($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->valstr !== $v) { + $this->valstr = $v; + $this->modifiedColumns[] = CcPrefPeer::VALSTR; + } + + + return $this; + } // setValstr() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->subjid = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->keystr = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->valstr = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 4; // 4 = CcPrefPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcPref object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcSubjs !== null && $this->subjid !== $this->aCcSubjs->getDbId()) { + $this->aCcSubjs = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcPrefPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcSubjs = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcPrefQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcPrefPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSubjs !== null) { + if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { + $affectedRows += $this->aCcSubjs->save($con); + } + $this->setCcSubjs($this->aCcSubjs); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcPrefPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcPrefPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_pref_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcPrefPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcPrefPeer::SUBJID)) { + $modifiedColumns[':p' . $index++] = '"subjid"'; + } + if ($this->isColumnModified(CcPrefPeer::KEYSTR)) { + $modifiedColumns[':p' . $index++] = '"keystr"'; + } + if ($this->isColumnModified(CcPrefPeer::VALSTR)) { + $modifiedColumns[':p' . $index++] = '"valstr"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_pref" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"subjid"': + $stmt->bindValue($identifier, $this->subjid, PDO::PARAM_INT); + break; + case '"keystr"': + $stmt->bindValue($identifier, $this->keystr, PDO::PARAM_STR); + break; + case '"valstr"': + $stmt->bindValue($identifier, $this->valstr, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSubjs !== null) { + if (!$this->aCcSubjs->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); + } + } + + + if (($retval = CcPrefPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPrefPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getSubjid(); + break; + case 2: + return $this->getKeystr(); + break; + case 3: + return $this->getValstr(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcPref'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcPref'][$this->getPrimaryKey()] = true; + $keys = CcPrefPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getSubjid(), + $keys[2] => $this->getKeystr(), + $keys[3] => $this->getValstr(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcSubjs) { + $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcPrefPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setSubjid($value); + break; + case 2: + $this->setKeystr($value); + break; + case 3: + $this->setValstr($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcPrefPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setSubjid($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setKeystr($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setValstr($arr[$keys[3]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcPrefPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcPrefPeer::ID)) $criteria->add(CcPrefPeer::ID, $this->id); + if ($this->isColumnModified(CcPrefPeer::SUBJID)) $criteria->add(CcPrefPeer::SUBJID, $this->subjid); + if ($this->isColumnModified(CcPrefPeer::KEYSTR)) $criteria->add(CcPrefPeer::KEYSTR, $this->keystr); + if ($this->isColumnModified(CcPrefPeer::VALSTR)) $criteria->add(CcPrefPeer::VALSTR, $this->valstr); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcPrefPeer::DATABASE_NAME); + $criteria->add(CcPrefPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcPref (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setSubjid($this->getSubjid()); + $copyObj->setKeystr($this->getKeystr()); + $copyObj->setValstr($this->getValstr()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcPref Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcPrefPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcPrefPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcSubjs object. + * + * @param CcSubjs $v + * @return CcPref The current object (for fluent API support) + * @throws PropelException + */ + public function setCcSubjs(CcSubjs $v = null) + { + if ($v === null) { + $this->setSubjid(NULL); + } else { + $this->setSubjid($v->getDbId()); + } + + $this->aCcSubjs = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcSubjs object, it will not be re-added. + if ($v !== null) { + $v->addCcPref($this); + } + + + return $this; + } + + + /** + * Get the associated CcSubjs object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcSubjs The associated CcSubjs object. + * @throws PropelException + */ + public function getCcSubjs(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcSubjs === null && ($this->subjid !== null) && $doQuery) { + $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->subjid, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcSubjs->addCcPrefs($this); + */ + } + + return $this->aCcSubjs; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->subjid = null; + $this->keystr = null; + $this->valstr = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcSubjs instanceof Persistent) { + $this->aCcSubjs->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcSubjs = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcPrefPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPrefPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcPrefPeer.php index cb6345eacd..4dceb1f211 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPrefPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPrefPeer.php @@ -4,976 +4,1002 @@ /** * Base static class for performing query and update operations on the 'cc_pref' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcPrefPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_pref'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcPref'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcPref'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcPrefTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 4; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_pref.ID'; - - /** the column name for the SUBJID field */ - const SUBJID = 'cc_pref.SUBJID'; - - /** the column name for the KEYSTR field */ - const KEYSTR = 'cc_pref.KEYSTR'; - - /** the column name for the VALSTR field */ - const VALSTR = 'cc_pref.VALSTR'; - - /** - * An identiy map to hold any loaded instances of CcPref objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcPref[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('Id', 'Subjid', 'Keystr', 'Valstr', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('id', 'subjid', 'keystr', 'valstr', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::SUBJID, self::KEYSTR, self::VALSTR, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'SUBJID', 'KEYSTR', 'VALSTR', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'subjid', 'keystr', 'valstr', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('Id' => 0, 'Subjid' => 1, 'Keystr' => 2, 'Valstr' => 3, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('id' => 0, 'subjid' => 1, 'keystr' => 2, 'valstr' => 3, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::SUBJID => 1, self::KEYSTR => 2, self::VALSTR => 3, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'SUBJID' => 1, 'KEYSTR' => 2, 'VALSTR' => 3, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'subjid' => 1, 'keystr' => 2, 'valstr' => 3, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcPrefPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcPrefPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcPrefPeer::ID); - $criteria->addSelectColumn(CcPrefPeer::SUBJID); - $criteria->addSelectColumn(CcPrefPeer::KEYSTR); - $criteria->addSelectColumn(CcPrefPeer::VALSTR); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.SUBJID'); - $criteria->addSelectColumn($alias . '.KEYSTR'); - $criteria->addSelectColumn($alias . '.VALSTR'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPrefPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPrefPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcPref - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcPrefPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcPrefPeer::populateObjects(CcPrefPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcPrefPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcPref $value A CcPref object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcPref $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcPref object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcPref) { - $key = (string) $value->getId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPref object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcPref Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_pref - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcPrefPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcPrefPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcPrefPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcPrefPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcPref object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcPrefPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcPrefPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcPrefPeer::NUM_COLUMNS; - } else { - $cls = CcPrefPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcPrefPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcSubjs table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPrefPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPrefPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPrefPeer::SUBJID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcPref objects pre-filled with their CcSubjs objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPref objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPrefPeer::addSelectColumns($criteria); - $startcol = (CcPrefPeer::NUM_COLUMNS - CcPrefPeer::NUM_LAZY_LOAD_COLUMNS); - CcSubjsPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcPrefPeer::SUBJID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPrefPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPrefPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcPrefPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPrefPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcPref) to $obj2 (CcSubjs) - $obj2->addCcPref($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcPrefPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcPrefPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcPrefPeer::SUBJID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcPref objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcPref objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcPrefPeer::addSelectColumns($criteria); - $startcol2 = (CcPrefPeer::NUM_COLUMNS - CcPrefPeer::NUM_LAZY_LOAD_COLUMNS); - - CcSubjsPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcSubjsPeer::NUM_COLUMNS - CcSubjsPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcPrefPeer::SUBJID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcPrefPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcPrefPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcPrefPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcPrefPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcSubjs rows - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcPref) to the collection in $obj2 (CcSubjs) - $obj2->addCcPref($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcPrefPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcPrefPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcPrefTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcPrefPeer::CLASS_DEFAULT : CcPrefPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcPref or Criteria object. - * - * @param mixed $values Criteria or CcPref object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcPref object - } - - if ($criteria->containsKey(CcPrefPeer::ID) && $criteria->keyContainsValue(CcPrefPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPrefPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcPref or Criteria object. - * - * @param mixed $values Criteria or CcPref object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcPrefPeer::ID); - $value = $criteria->remove(CcPrefPeer::ID); - if ($value) { - $selectCriteria->add(CcPrefPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcPrefPeer::TABLE_NAME); - } - - } else { // $values is CcPref object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_pref table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcPrefPeer::TABLE_NAME, $con, CcPrefPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcPrefPeer::clearInstancePool(); - CcPrefPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcPref or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcPref object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcPrefPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcPref) { // it's a model object - // invalidate the cache for this single object - CcPrefPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcPrefPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcPrefPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcPrefPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcPref object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcPref $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcPref $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcPrefPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcPrefPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcPrefPeer::DATABASE_NAME, CcPrefPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcPref - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcPrefPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcPrefPeer::DATABASE_NAME); - $criteria->add(CcPrefPeer::ID, $pk); - - $v = CcPrefPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcPrefPeer::DATABASE_NAME); - $criteria->add(CcPrefPeer::ID, $pks, Criteria::IN); - $objs = CcPrefPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcPrefPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_pref'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcPref'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcPrefTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 4; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 4; + + /** the column name for the id field */ + const ID = 'cc_pref.id'; + + /** the column name for the subjid field */ + const SUBJID = 'cc_pref.subjid'; + + /** the column name for the keystr field */ + const KEYSTR = 'cc_pref.keystr'; + + /** the column name for the valstr field */ + const VALSTR = 'cc_pref.valstr'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcPref objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcPref[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcPrefPeer::$fieldNames[CcPrefPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('Id', 'Subjid', 'Keystr', 'Valstr', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('id', 'subjid', 'keystr', 'valstr', ), + BasePeer::TYPE_COLNAME => array (CcPrefPeer::ID, CcPrefPeer::SUBJID, CcPrefPeer::KEYSTR, CcPrefPeer::VALSTR, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'SUBJID', 'KEYSTR', 'VALSTR', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'subjid', 'keystr', 'valstr', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcPrefPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('Id' => 0, 'Subjid' => 1, 'Keystr' => 2, 'Valstr' => 3, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('id' => 0, 'subjid' => 1, 'keystr' => 2, 'valstr' => 3, ), + BasePeer::TYPE_COLNAME => array (CcPrefPeer::ID => 0, CcPrefPeer::SUBJID => 1, CcPrefPeer::KEYSTR => 2, CcPrefPeer::VALSTR => 3, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'SUBJID' => 1, 'KEYSTR' => 2, 'VALSTR' => 3, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'subjid' => 1, 'keystr' => 2, 'valstr' => 3, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcPrefPeer::getFieldNames($toType); + $key = isset(CcPrefPeer::$fieldKeys[$fromType][$name]) ? CcPrefPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcPrefPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcPrefPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcPrefPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcPrefPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcPrefPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcPrefPeer::ID); + $criteria->addSelectColumn(CcPrefPeer::SUBJID); + $criteria->addSelectColumn(CcPrefPeer::KEYSTR); + $criteria->addSelectColumn(CcPrefPeer::VALSTR); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.subjid'); + $criteria->addSelectColumn($alias . '.keystr'); + $criteria->addSelectColumn($alias . '.valstr'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPrefPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPrefPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcPrefPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcPref + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcPrefPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcPrefPeer::populateObjects(CcPrefPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcPrefPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcPrefPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcPref $obj A CcPref object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getId(); + } // if key === null + CcPrefPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcPref object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcPref) { + $key = (string) $value->getId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcPref object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcPrefPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcPref Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcPrefPeer::$instances[$key])) { + return CcPrefPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcPrefPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcPrefPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_pref + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcPrefPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcPrefPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcPrefPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcPrefPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcPref object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcPrefPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcPrefPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcPrefPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcPrefPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcPrefPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcSubjs table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPrefPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPrefPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPrefPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPrefPeer::SUBJID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcPref objects pre-filled with their CcSubjs objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPref objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPrefPeer::DATABASE_NAME); + } + + CcPrefPeer::addSelectColumns($criteria); + $startcol = CcPrefPeer::NUM_HYDRATE_COLUMNS; + CcSubjsPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcPrefPeer::SUBJID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPrefPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPrefPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcPrefPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPrefPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcPref) to $obj2 (CcSubjs) + $obj2->addCcPref($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcPrefPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcPrefPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcPrefPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcPrefPeer::SUBJID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcPref objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcPref objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcPrefPeer::DATABASE_NAME); + } + + CcPrefPeer::addSelectColumns($criteria); + $startcol2 = CcPrefPeer::NUM_HYDRATE_COLUMNS; + + CcSubjsPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcSubjsPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcPrefPeer::SUBJID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcPrefPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcPrefPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcPrefPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcPrefPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcSubjs rows + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcPref) to the collection in $obj2 (CcSubjs) + $obj2->addCcPref($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcPrefPeer::DATABASE_NAME)->getTable(CcPrefPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcPrefPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcPrefPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcPrefTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcPrefPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcPref or Criteria object. + * + * @param mixed $values Criteria or CcPref object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcPref object + } + + if ($criteria->containsKey(CcPrefPeer::ID) && $criteria->keyContainsValue(CcPrefPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcPrefPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcPrefPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcPref or Criteria object. + * + * @param mixed $values Criteria or CcPref object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcPrefPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcPrefPeer::ID); + $value = $criteria->remove(CcPrefPeer::ID); + if ($value) { + $selectCriteria->add(CcPrefPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcPrefPeer::TABLE_NAME); + } + + } else { // $values is CcPref object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcPrefPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_pref table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcPrefPeer::TABLE_NAME, $con, CcPrefPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcPrefPeer::clearInstancePool(); + CcPrefPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcPref or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcPref object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcPrefPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcPref) { // it's a model object + // invalidate the cache for this single object + CcPrefPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcPrefPeer::DATABASE_NAME); + $criteria->add(CcPrefPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcPrefPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcPrefPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcPrefPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcPref object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcPref $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcPrefPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcPrefPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcPrefPeer::DATABASE_NAME, CcPrefPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcPref + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcPrefPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcPrefPeer::DATABASE_NAME); + $criteria->add(CcPrefPeer::ID, $pk); + + $v = CcPrefPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcPref[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcPrefPeer::DATABASE_NAME); + $criteria->add(CcPrefPeer::ID, $pks, Criteria::IN); + $objs = CcPrefPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcPrefPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPrefQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcPrefQuery.php index 473bafc987..5e300ab691 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPrefQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPrefQuery.php @@ -4,317 +4,467 @@ /** * Base class that represents a query for the 'cc_pref' table. * - * * - * @method CcPrefQuery orderById($order = Criteria::ASC) Order by the id column - * @method CcPrefQuery orderBySubjid($order = Criteria::ASC) Order by the subjid column - * @method CcPrefQuery orderByKeystr($order = Criteria::ASC) Order by the keystr column - * @method CcPrefQuery orderByValstr($order = Criteria::ASC) Order by the valstr column * - * @method CcPrefQuery groupById() Group by the id column - * @method CcPrefQuery groupBySubjid() Group by the subjid column - * @method CcPrefQuery groupByKeystr() Group by the keystr column - * @method CcPrefQuery groupByValstr() Group by the valstr column + * @method CcPrefQuery orderById($order = Criteria::ASC) Order by the id column + * @method CcPrefQuery orderBySubjid($order = Criteria::ASC) Order by the subjid column + * @method CcPrefQuery orderByKeystr($order = Criteria::ASC) Order by the keystr column + * @method CcPrefQuery orderByValstr($order = Criteria::ASC) Order by the valstr column * - * @method CcPrefQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcPrefQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcPrefQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcPrefQuery groupById() Group by the id column + * @method CcPrefQuery groupBySubjid() Group by the subjid column + * @method CcPrefQuery groupByKeystr() Group by the keystr column + * @method CcPrefQuery groupByValstr() Group by the valstr column * - * @method CcPrefQuery leftJoinCcSubjs($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSubjs relation - * @method CcPrefQuery rightJoinCcSubjs($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSubjs relation - * @method CcPrefQuery innerJoinCcSubjs($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSubjs relation + * @method CcPrefQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcPrefQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcPrefQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcPref findOne(PropelPDO $con = null) Return the first CcPref matching the query - * @method CcPref findOneOrCreate(PropelPDO $con = null) Return the first CcPref matching the query, or a new CcPref object populated from the query conditions when no match is found + * @method CcPrefQuery leftJoinCcSubjs($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSubjs relation + * @method CcPrefQuery rightJoinCcSubjs($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSubjs relation + * @method CcPrefQuery innerJoinCcSubjs($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSubjs relation * - * @method CcPref findOneById(int $id) Return the first CcPref filtered by the id column - * @method CcPref findOneBySubjid(int $subjid) Return the first CcPref filtered by the subjid column - * @method CcPref findOneByKeystr(string $keystr) Return the first CcPref filtered by the keystr column - * @method CcPref findOneByValstr(string $valstr) Return the first CcPref filtered by the valstr column + * @method CcPref findOne(PropelPDO $con = null) Return the first CcPref matching the query + * @method CcPref findOneOrCreate(PropelPDO $con = null) Return the first CcPref matching the query, or a new CcPref object populated from the query conditions when no match is found * - * @method array findById(int $id) Return CcPref objects filtered by the id column - * @method array findBySubjid(int $subjid) Return CcPref objects filtered by the subjid column - * @method array findByKeystr(string $keystr) Return CcPref objects filtered by the keystr column - * @method array findByValstr(string $valstr) Return CcPref objects filtered by the valstr column + * @method CcPref findOneBySubjid(int $subjid) Return the first CcPref filtered by the subjid column + * @method CcPref findOneByKeystr(string $keystr) Return the first CcPref filtered by the keystr column + * @method CcPref findOneByValstr(string $valstr) Return the first CcPref filtered by the valstr column + * + * @method array findById(int $id) Return CcPref objects filtered by the id column + * @method array findBySubjid(int $subjid) Return CcPref objects filtered by the subjid column + * @method array findByKeystr(string $keystr) Return CcPref objects filtered by the keystr column + * @method array findByValstr(string $valstr) Return CcPref objects filtered by the valstr column * * @package propel.generator.airtime.om */ abstract class BaseCcPrefQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcPrefQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcPref'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcPrefQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcPrefQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcPrefQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcPrefQuery) { + return $criteria; + } + $query = new CcPrefQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcPref|CcPref[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcPrefPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPref A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneById($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPref A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "subjid", "keystr", "valstr" FROM "cc_pref" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcPref(); + $obj->hydrate($row); + CcPrefPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcPref|CcPref[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcPref[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcPrefQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcPrefPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcPrefQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcPrefPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id >= 12 + * $query->filterById(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPrefQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(CcPrefPeer::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(CcPrefPeer::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPrefPeer::ID, $id, $comparison); + } + + /** + * Filter the query on the subjid column + * + * Example usage: + * + * $query->filterBySubjid(1234); // WHERE subjid = 1234 + * $query->filterBySubjid(array(12, 34)); // WHERE subjid IN (12, 34) + * $query->filterBySubjid(array('min' => 12)); // WHERE subjid >= 12 + * $query->filterBySubjid(array('max' => 12)); // WHERE subjid <= 12 + * + * + * @see filterByCcSubjs() + * + * @param mixed $subjid The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPrefQuery The current query, for fluid interface + */ + public function filterBySubjid($subjid = null, $comparison = null) + { + if (is_array($subjid)) { + $useMinMax = false; + if (isset($subjid['min'])) { + $this->addUsingAlias(CcPrefPeer::SUBJID, $subjid['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($subjid['max'])) { + $this->addUsingAlias(CcPrefPeer::SUBJID, $subjid['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcPrefPeer::SUBJID, $subjid, $comparison); + } + + /** + * Filter the query on the keystr column + * + * Example usage: + * + * $query->filterByKeystr('fooValue'); // WHERE keystr = 'fooValue' + * $query->filterByKeystr('%fooValue%'); // WHERE keystr LIKE '%fooValue%' + * + * + * @param string $keystr The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPrefQuery The current query, for fluid interface + */ + public function filterByKeystr($keystr = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($keystr)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $keystr)) { + $keystr = str_replace('*', '%', $keystr); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPrefPeer::KEYSTR, $keystr, $comparison); + } + + /** + * Filter the query on the valstr column + * + * Example usage: + * + * $query->filterByValstr('fooValue'); // WHERE valstr = 'fooValue' + * $query->filterByValstr('%fooValue%'); // WHERE valstr LIKE '%fooValue%' + * + * + * @param string $valstr The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPrefQuery The current query, for fluid interface + */ + public function filterByValstr($valstr = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($valstr)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $valstr)) { + $valstr = str_replace('*', '%', $valstr); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcPrefPeer::VALSTR, $valstr, $comparison); + } + + /** + * Filter the query by a related CcSubjs object + * + * @param CcSubjs|PropelObjectCollection $ccSubjs The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcPrefQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSubjs($ccSubjs, $comparison = null) + { + if ($ccSubjs instanceof CcSubjs) { + return $this + ->addUsingAlias(CcPrefPeer::SUBJID, $ccSubjs->getDbId(), $comparison); + } elseif ($ccSubjs instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcPrefPeer::SUBJID, $ccSubjs->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcSubjs() only accepts arguments of type CcSubjs or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSubjs relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPrefQuery The current query, for fluid interface + */ + public function joinCcSubjs($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSubjs'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSubjs'); + } + + return $this; + } + + /** + * Use the CcSubjs relation CcSubjs object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery A secondary query class using the current class as primary query + */ + public function useCcSubjsQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcSubjs($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); + } + + /** + * Exclude object from result + * + * @param CcPref $ccPref Object to remove from the list of results + * + * @return CcPrefQuery The current query, for fluid interface + */ + public function prune($ccPref = null) + { + if ($ccPref) { + $this->addUsingAlias(CcPrefPeer::ID, $ccPref->getId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcPrefQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcPref', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcPrefQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcPrefQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcPrefQuery) { - return $criteria; - } - $query = new CcPrefQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcPref|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcPrefPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcPrefQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcPrefPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcPrefQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcPrefPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $id The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPrefQuery The current query, for fluid interface - */ - public function filterById($id = null, $comparison = null) - { - if (is_array($id) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcPrefPeer::ID, $id, $comparison); - } - - /** - * Filter the query on the subjid column - * - * @param int|array $subjid The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPrefQuery The current query, for fluid interface - */ - public function filterBySubjid($subjid = null, $comparison = null) - { - if (is_array($subjid)) { - $useMinMax = false; - if (isset($subjid['min'])) { - $this->addUsingAlias(CcPrefPeer::SUBJID, $subjid['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($subjid['max'])) { - $this->addUsingAlias(CcPrefPeer::SUBJID, $subjid['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcPrefPeer::SUBJID, $subjid, $comparison); - } - - /** - * Filter the query on the keystr column - * - * @param string $keystr The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPrefQuery The current query, for fluid interface - */ - public function filterByKeystr($keystr = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($keystr)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $keystr)) { - $keystr = str_replace('*', '%', $keystr); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPrefPeer::KEYSTR, $keystr, $comparison); - } - - /** - * Filter the query on the valstr column - * - * @param string $valstr The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPrefQuery The current query, for fluid interface - */ - public function filterByValstr($valstr = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($valstr)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $valstr)) { - $valstr = str_replace('*', '%', $valstr); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcPrefPeer::VALSTR, $valstr, $comparison); - } - - /** - * Filter the query by a related CcSubjs object - * - * @param CcSubjs $ccSubjs the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcPrefQuery The current query, for fluid interface - */ - public function filterByCcSubjs($ccSubjs, $comparison = null) - { - return $this - ->addUsingAlias(CcPrefPeer::SUBJID, $ccSubjs->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSubjs relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPrefQuery The current query, for fluid interface - */ - public function joinCcSubjs($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSubjs'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSubjs'); - } - - return $this; - } - - /** - * Use the CcSubjs relation CcSubjs object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery A secondary query class using the current class as primary query - */ - public function useCcSubjsQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcSubjs($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); - } - - /** - * Exclude object from result - * - * @param CcPref $ccPref Object to remove from the list of results - * - * @return CcPrefQuery The current query, for fluid interface - */ - public function prune($ccPref = null) - { - if ($ccPref) { - $this->addUsingAlias(CcPrefPeer::ID, $ccPref->getId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcPrefQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSchedule.php b/airtime_mvc/application/models/airtime/om/BaseCcSchedule.php index ceb5008d8b..1bc842b137 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSchedule.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSchedule.php @@ -4,2013 +4,2311 @@ /** * Base class that represents a row from the 'cc_schedule' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcSchedule extends BaseObject implements Persistent +abstract class BaseCcSchedule extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcSchedulePeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcSchedulePeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the starts field. - * @var string - */ - protected $starts; - - /** - * The value for the ends field. - * @var string - */ - protected $ends; - - /** - * The value for the file_id field. - * @var int - */ - protected $file_id; - - /** - * The value for the stream_id field. - * @var int - */ - protected $stream_id; - - /** - * The value for the clip_length field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $clip_length; - - /** - * The value for the fade_in field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $fade_in; - - /** - * The value for the fade_out field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $fade_out; - - /** - * The value for the cue_in field. - * @var string - */ - protected $cue_in; - - /** - * The value for the cue_out field. - * @var string - */ - protected $cue_out; - - /** - * The value for the media_item_played field. - * Note: this column has a database default value of: false - * @var boolean - */ - protected $media_item_played; - - /** - * The value for the instance_id field. - * @var int - */ - protected $instance_id; - - /** - * The value for the playout_status field. - * Note: this column has a database default value of: 1 - * @var int - */ - protected $playout_status; - - /** - * The value for the broadcasted field. - * Note: this column has a database default value of: 0 - * @var int - */ - protected $broadcasted; - - /** - * The value for the position field. - * Note: this column has a database default value of: 0 - * @var int - */ - protected $position; - - /** - * @var CcShowInstances - */ - protected $aCcShowInstances; - - /** - * @var CcFiles - */ - protected $aCcFiles; - - /** - * @var CcWebstream - */ - protected $aCcWebstream; - - /** - * @var array CcWebstreamMetadata[] Collection to store aggregation of CcWebstreamMetadata objects. - */ - protected $collCcWebstreamMetadatas; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->clip_length = '00:00:00'; - $this->fade_in = '00:00:00'; - $this->fade_out = '00:00:00'; - $this->media_item_played = false; - $this->playout_status = 1; - $this->broadcasted = 0; - $this->position = 0; - } - - /** - * Initializes internal state of BaseCcSchedule object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [optionally formatted] temporal [starts] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbStarts($format = 'Y-m-d H:i:s') - { - if ($this->starts === null) { - return null; - } - - - - try { - $dt = new DateTime($this->starts); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->starts, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [ends] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbEnds($format = 'Y-m-d H:i:s') - { - if ($this->ends === null) { - return null; - } - - - - try { - $dt = new DateTime($this->ends); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->ends, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [file_id] column value. - * - * @return int - */ - public function getDbFileId() - { - return $this->file_id; - } - - /** - * Get the [stream_id] column value. - * - * @return int - */ - public function getDbStreamId() - { - return $this->stream_id; - } - - /** - * Get the [clip_length] column value. - * - * @return string - */ - public function getDbClipLength() - { - return $this->clip_length; - } - - /** - * Get the [optionally formatted] temporal [fade_in] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbFadeIn($format = '%X') - { - if ($this->fade_in === null) { - return null; - } - - - - try { - $dt = new DateTime($this->fade_in); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->fade_in, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [fade_out] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbFadeOut($format = '%X') - { - if ($this->fade_out === null) { - return null; - } - - - - try { - $dt = new DateTime($this->fade_out); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->fade_out, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [cue_in] column value. - * - * @return string - */ - public function getDbCueIn() - { - return $this->cue_in; - } - - /** - * Get the [cue_out] column value. - * - * @return string - */ - public function getDbCueOut() - { - return $this->cue_out; - } - - /** - * Get the [media_item_played] column value. - * - * @return boolean - */ - public function getDbMediaItemPlayed() - { - return $this->media_item_played; - } - - /** - * Get the [instance_id] column value. - * - * @return int - */ - public function getDbInstanceId() - { - return $this->instance_id; - } - - /** - * Get the [playout_status] column value. - * - * @return int - */ - public function getDbPlayoutStatus() - { - return $this->playout_status; - } - - /** - * Get the [broadcasted] column value. - * - * @return int - */ - public function getDbBroadcasted() - { - return $this->broadcasted; - } - - /** - * Get the [position] column value. - * - * @return int - */ - public function getDbPosition() - { - return $this->position; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcSchedulePeer::ID; - } - - return $this; - } // setDbId() - - /** - * Sets the value of [starts] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbStarts($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->starts !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->starts !== null && $tmpDt = new DateTime($this->starts)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->starts = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcSchedulePeer::STARTS; - } - } // if either are not null - - return $this; - } // setDbStarts() - - /** - * Sets the value of [ends] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbEnds($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->ends !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->ends !== null && $tmpDt = new DateTime($this->ends)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->ends = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcSchedulePeer::ENDS; - } - } // if either are not null - - return $this; - } // setDbEnds() - - /** - * Set the value of [file_id] column. - * - * @param int $v new value - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbFileId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->file_id !== $v) { - $this->file_id = $v; - $this->modifiedColumns[] = CcSchedulePeer::FILE_ID; - } - - if ($this->aCcFiles !== null && $this->aCcFiles->getDbId() !== $v) { - $this->aCcFiles = null; - } - - return $this; - } // setDbFileId() - - /** - * Set the value of [stream_id] column. - * - * @param int $v new value - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbStreamId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->stream_id !== $v) { - $this->stream_id = $v; - $this->modifiedColumns[] = CcSchedulePeer::STREAM_ID; - } - - if ($this->aCcWebstream !== null && $this->aCcWebstream->getDbId() !== $v) { - $this->aCcWebstream = null; - } - - return $this; - } // setDbStreamId() - - /** - * Set the value of [clip_length] column. - * - * @param string $v new value - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbClipLength($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->clip_length !== $v || $this->isNew()) { - $this->clip_length = $v; - $this->modifiedColumns[] = CcSchedulePeer::CLIP_LENGTH; - } - - return $this; - } // setDbClipLength() - - /** - * Sets the value of [fade_in] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbFadeIn($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->fade_in !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->fade_in !== null && $tmpDt = new DateTime($this->fade_in)) ? $tmpDt->format('H:i:s') : null; - $newNorm = ($dt !== null) ? $dt->format('H:i:s') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - || ($dt->format('H:i:s') === '00:00:00') // or the entered value matches the default - ) - { - $this->fade_in = ($dt ? $dt->format('H:i:s') : null); - $this->modifiedColumns[] = CcSchedulePeer::FADE_IN; - } - } // if either are not null - - return $this; - } // setDbFadeIn() - - /** - * Sets the value of [fade_out] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbFadeOut($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->fade_out !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->fade_out !== null && $tmpDt = new DateTime($this->fade_out)) ? $tmpDt->format('H:i:s') : null; - $newNorm = ($dt !== null) ? $dt->format('H:i:s') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - || ($dt->format('H:i:s') === '00:00:00') // or the entered value matches the default - ) - { - $this->fade_out = ($dt ? $dt->format('H:i:s') : null); - $this->modifiedColumns[] = CcSchedulePeer::FADE_OUT; - } - } // if either are not null - - return $this; - } // setDbFadeOut() - - /** - * Set the value of [cue_in] column. - * - * @param string $v new value - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbCueIn($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->cue_in !== $v) { - $this->cue_in = $v; - $this->modifiedColumns[] = CcSchedulePeer::CUE_IN; - } - - return $this; - } // setDbCueIn() - - /** - * Set the value of [cue_out] column. - * - * @param string $v new value - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbCueOut($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->cue_out !== $v) { - $this->cue_out = $v; - $this->modifiedColumns[] = CcSchedulePeer::CUE_OUT; - } - - return $this; - } // setDbCueOut() - - /** - * Set the value of [media_item_played] column. - * - * @param boolean $v new value - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbMediaItemPlayed($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->media_item_played !== $v || $this->isNew()) { - $this->media_item_played = $v; - $this->modifiedColumns[] = CcSchedulePeer::MEDIA_ITEM_PLAYED; - } - - return $this; - } // setDbMediaItemPlayed() - - /** - * Set the value of [instance_id] column. - * - * @param int $v new value - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbInstanceId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->instance_id !== $v) { - $this->instance_id = $v; - $this->modifiedColumns[] = CcSchedulePeer::INSTANCE_ID; - } - - if ($this->aCcShowInstances !== null && $this->aCcShowInstances->getDbId() !== $v) { - $this->aCcShowInstances = null; - } - - return $this; - } // setDbInstanceId() - - /** - * Set the value of [playout_status] column. - * - * @param int $v new value - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbPlayoutStatus($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->playout_status !== $v || $this->isNew()) { - $this->playout_status = $v; - $this->modifiedColumns[] = CcSchedulePeer::PLAYOUT_STATUS; - } - - return $this; - } // setDbPlayoutStatus() - - /** - * Set the value of [broadcasted] column. - * - * @param int $v new value - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbBroadcasted($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->broadcasted !== $v || $this->isNew()) { - $this->broadcasted = $v; - $this->modifiedColumns[] = CcSchedulePeer::BROADCASTED; - } - - return $this; - } // setDbBroadcasted() - - /** - * Set the value of [position] column. - * - * @param int $v new value - * @return CcSchedule The current object (for fluent API support) - */ - public function setDbPosition($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->position !== $v || $this->isNew()) { - $this->position = $v; - $this->modifiedColumns[] = CcSchedulePeer::POSITION; - } - - return $this; - } // setDbPosition() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->clip_length !== '00:00:00') { - return false; - } - - if ($this->fade_in !== '00:00:00') { - return false; - } - - if ($this->fade_out !== '00:00:00') { - return false; - } - - if ($this->media_item_played !== false) { - return false; - } - - if ($this->playout_status !== 1) { - return false; - } - - if ($this->broadcasted !== 0) { - return false; - } - - if ($this->position !== 0) { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->starts = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->ends = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->file_id = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; - $this->stream_id = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; - $this->clip_length = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; - $this->fade_in = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; - $this->fade_out = ($row[$startcol + 7] !== null) ? (string) $row[$startcol + 7] : null; - $this->cue_in = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; - $this->cue_out = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; - $this->media_item_played = ($row[$startcol + 10] !== null) ? (boolean) $row[$startcol + 10] : null; - $this->instance_id = ($row[$startcol + 11] !== null) ? (int) $row[$startcol + 11] : null; - $this->playout_status = ($row[$startcol + 12] !== null) ? (int) $row[$startcol + 12] : null; - $this->broadcasted = ($row[$startcol + 13] !== null) ? (int) $row[$startcol + 13] : null; - $this->position = ($row[$startcol + 14] !== null) ? (int) $row[$startcol + 14] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 15; // 15 = CcSchedulePeer::NUM_COLUMNS - CcSchedulePeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcSchedule object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcFiles !== null && $this->file_id !== $this->aCcFiles->getDbId()) { - $this->aCcFiles = null; - } - if ($this->aCcWebstream !== null && $this->stream_id !== $this->aCcWebstream->getDbId()) { - $this->aCcWebstream = null; - } - if ($this->aCcShowInstances !== null && $this->instance_id !== $this->aCcShowInstances->getDbId()) { - $this->aCcShowInstances = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcSchedulePeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcShowInstances = null; - $this->aCcFiles = null; - $this->aCcWebstream = null; - $this->collCcWebstreamMetadatas = null; - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcScheduleQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcSchedulePeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcShowInstances !== null) { - if ($this->aCcShowInstances->isModified() || $this->aCcShowInstances->isNew()) { - $affectedRows += $this->aCcShowInstances->save($con); - } - $this->setCcShowInstances($this->aCcShowInstances); - } - - if ($this->aCcFiles !== null) { - if ($this->aCcFiles->isModified() || $this->aCcFiles->isNew()) { - $affectedRows += $this->aCcFiles->save($con); - } - $this->setCcFiles($this->aCcFiles); - } - - if ($this->aCcWebstream !== null) { - if ($this->aCcWebstream->isModified() || $this->aCcWebstream->isNew()) { - $affectedRows += $this->aCcWebstream->save($con); - } - $this->setCcWebstream($this->aCcWebstream); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcSchedulePeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcSchedulePeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcSchedulePeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcSchedulePeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - if ($this->collCcWebstreamMetadatas !== null) { - foreach ($this->collCcWebstreamMetadatas as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcShowInstances !== null) { - if (!$this->aCcShowInstances->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcShowInstances->getValidationFailures()); - } - } - - if ($this->aCcFiles !== null) { - if (!$this->aCcFiles->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcFiles->getValidationFailures()); - } - } - - if ($this->aCcWebstream !== null) { - if (!$this->aCcWebstream->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcWebstream->getValidationFailures()); - } - } - - - if (($retval = CcSchedulePeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - if ($this->collCcWebstreamMetadatas !== null) { - foreach ($this->collCcWebstreamMetadatas as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcSchedulePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbStarts(); - break; - case 2: - return $this->getDbEnds(); - break; - case 3: - return $this->getDbFileId(); - break; - case 4: - return $this->getDbStreamId(); - break; - case 5: - return $this->getDbClipLength(); - break; - case 6: - return $this->getDbFadeIn(); - break; - case 7: - return $this->getDbFadeOut(); - break; - case 8: - return $this->getDbCueIn(); - break; - case 9: - return $this->getDbCueOut(); - break; - case 10: - return $this->getDbMediaItemPlayed(); - break; - case 11: - return $this->getDbInstanceId(); - break; - case 12: - return $this->getDbPlayoutStatus(); - break; - case 13: - return $this->getDbBroadcasted(); - break; - case 14: - return $this->getDbPosition(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcSchedulePeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbStarts(), - $keys[2] => $this->getDbEnds(), - $keys[3] => $this->getDbFileId(), - $keys[4] => $this->getDbStreamId(), - $keys[5] => $this->getDbClipLength(), - $keys[6] => $this->getDbFadeIn(), - $keys[7] => $this->getDbFadeOut(), - $keys[8] => $this->getDbCueIn(), - $keys[9] => $this->getDbCueOut(), - $keys[10] => $this->getDbMediaItemPlayed(), - $keys[11] => $this->getDbInstanceId(), - $keys[12] => $this->getDbPlayoutStatus(), - $keys[13] => $this->getDbBroadcasted(), - $keys[14] => $this->getDbPosition(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcShowInstances) { - $result['CcShowInstances'] = $this->aCcShowInstances->toArray($keyType, $includeLazyLoadColumns, true); - } - if (null !== $this->aCcFiles) { - $result['CcFiles'] = $this->aCcFiles->toArray($keyType, $includeLazyLoadColumns, true); - } - if (null !== $this->aCcWebstream) { - $result['CcWebstream'] = $this->aCcWebstream->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcSchedulePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbStarts($value); - break; - case 2: - $this->setDbEnds($value); - break; - case 3: - $this->setDbFileId($value); - break; - case 4: - $this->setDbStreamId($value); - break; - case 5: - $this->setDbClipLength($value); - break; - case 6: - $this->setDbFadeIn($value); - break; - case 7: - $this->setDbFadeOut($value); - break; - case 8: - $this->setDbCueIn($value); - break; - case 9: - $this->setDbCueOut($value); - break; - case 10: - $this->setDbMediaItemPlayed($value); - break; - case 11: - $this->setDbInstanceId($value); - break; - case 12: - $this->setDbPlayoutStatus($value); - break; - case 13: - $this->setDbBroadcasted($value); - break; - case 14: - $this->setDbPosition($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcSchedulePeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbStarts($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbEnds($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbFileId($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbStreamId($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setDbClipLength($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setDbFadeIn($arr[$keys[6]]); - if (array_key_exists($keys[7], $arr)) $this->setDbFadeOut($arr[$keys[7]]); - if (array_key_exists($keys[8], $arr)) $this->setDbCueIn($arr[$keys[8]]); - if (array_key_exists($keys[9], $arr)) $this->setDbCueOut($arr[$keys[9]]); - if (array_key_exists($keys[10], $arr)) $this->setDbMediaItemPlayed($arr[$keys[10]]); - if (array_key_exists($keys[11], $arr)) $this->setDbInstanceId($arr[$keys[11]]); - if (array_key_exists($keys[12], $arr)) $this->setDbPlayoutStatus($arr[$keys[12]]); - if (array_key_exists($keys[13], $arr)) $this->setDbBroadcasted($arr[$keys[13]]); - if (array_key_exists($keys[14], $arr)) $this->setDbPosition($arr[$keys[14]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcSchedulePeer::DATABASE_NAME); - - if ($this->isColumnModified(CcSchedulePeer::ID)) $criteria->add(CcSchedulePeer::ID, $this->id); - if ($this->isColumnModified(CcSchedulePeer::STARTS)) $criteria->add(CcSchedulePeer::STARTS, $this->starts); - if ($this->isColumnModified(CcSchedulePeer::ENDS)) $criteria->add(CcSchedulePeer::ENDS, $this->ends); - if ($this->isColumnModified(CcSchedulePeer::FILE_ID)) $criteria->add(CcSchedulePeer::FILE_ID, $this->file_id); - if ($this->isColumnModified(CcSchedulePeer::STREAM_ID)) $criteria->add(CcSchedulePeer::STREAM_ID, $this->stream_id); - if ($this->isColumnModified(CcSchedulePeer::CLIP_LENGTH)) $criteria->add(CcSchedulePeer::CLIP_LENGTH, $this->clip_length); - if ($this->isColumnModified(CcSchedulePeer::FADE_IN)) $criteria->add(CcSchedulePeer::FADE_IN, $this->fade_in); - if ($this->isColumnModified(CcSchedulePeer::FADE_OUT)) $criteria->add(CcSchedulePeer::FADE_OUT, $this->fade_out); - if ($this->isColumnModified(CcSchedulePeer::CUE_IN)) $criteria->add(CcSchedulePeer::CUE_IN, $this->cue_in); - if ($this->isColumnModified(CcSchedulePeer::CUE_OUT)) $criteria->add(CcSchedulePeer::CUE_OUT, $this->cue_out); - if ($this->isColumnModified(CcSchedulePeer::MEDIA_ITEM_PLAYED)) $criteria->add(CcSchedulePeer::MEDIA_ITEM_PLAYED, $this->media_item_played); - if ($this->isColumnModified(CcSchedulePeer::INSTANCE_ID)) $criteria->add(CcSchedulePeer::INSTANCE_ID, $this->instance_id); - if ($this->isColumnModified(CcSchedulePeer::PLAYOUT_STATUS)) $criteria->add(CcSchedulePeer::PLAYOUT_STATUS, $this->playout_status); - if ($this->isColumnModified(CcSchedulePeer::BROADCASTED)) $criteria->add(CcSchedulePeer::BROADCASTED, $this->broadcasted); - if ($this->isColumnModified(CcSchedulePeer::POSITION)) $criteria->add(CcSchedulePeer::POSITION, $this->position); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcSchedulePeer::DATABASE_NAME); - $criteria->add(CcSchedulePeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcSchedule (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbStarts($this->starts); - $copyObj->setDbEnds($this->ends); - $copyObj->setDbFileId($this->file_id); - $copyObj->setDbStreamId($this->stream_id); - $copyObj->setDbClipLength($this->clip_length); - $copyObj->setDbFadeIn($this->fade_in); - $copyObj->setDbFadeOut($this->fade_out); - $copyObj->setDbCueIn($this->cue_in); - $copyObj->setDbCueOut($this->cue_out); - $copyObj->setDbMediaItemPlayed($this->media_item_played); - $copyObj->setDbInstanceId($this->instance_id); - $copyObj->setDbPlayoutStatus($this->playout_status); - $copyObj->setDbBroadcasted($this->broadcasted); - $copyObj->setDbPosition($this->position); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getCcWebstreamMetadatas() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcWebstreamMetadata($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcSchedule Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcSchedulePeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcSchedulePeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcShowInstances object. - * - * @param CcShowInstances $v - * @return CcSchedule The current object (for fluent API support) - * @throws PropelException - */ - public function setCcShowInstances(CcShowInstances $v = null) - { - if ($v === null) { - $this->setDbInstanceId(NULL); - } else { - $this->setDbInstanceId($v->getDbId()); - } - - $this->aCcShowInstances = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcShowInstances object, it will not be re-added. - if ($v !== null) { - $v->addCcSchedule($this); - } - - return $this; - } - - - /** - * Get the associated CcShowInstances object - * - * @param PropelPDO Optional Connection object. - * @return CcShowInstances The associated CcShowInstances object. - * @throws PropelException - */ - public function getCcShowInstances(PropelPDO $con = null) - { - if ($this->aCcShowInstances === null && ($this->instance_id !== null)) { - $this->aCcShowInstances = CcShowInstancesQuery::create()->findPk($this->instance_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcShowInstances->addCcSchedules($this); - */ - } - return $this->aCcShowInstances; - } - - /** - * Declares an association between this object and a CcFiles object. - * - * @param CcFiles $v - * @return CcSchedule The current object (for fluent API support) - * @throws PropelException - */ - public function setCcFiles(CcFiles $v = null) - { - if ($v === null) { - $this->setDbFileId(NULL); - } else { - $this->setDbFileId($v->getDbId()); - } - - $this->aCcFiles = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcFiles object, it will not be re-added. - if ($v !== null) { - $v->addCcSchedule($this); - } - - return $this; - } - - - /** - * Get the associated CcFiles object - * - * @param PropelPDO Optional Connection object. - * @return CcFiles The associated CcFiles object. - * @throws PropelException - */ - public function getCcFiles(PropelPDO $con = null) - { - if ($this->aCcFiles === null && ($this->file_id !== null)) { - $this->aCcFiles = CcFilesQuery::create()->findPk($this->file_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcFiles->addCcSchedules($this); - */ - } - return $this->aCcFiles; - } - - /** - * Declares an association between this object and a CcWebstream object. - * - * @param CcWebstream $v - * @return CcSchedule The current object (for fluent API support) - * @throws PropelException - */ - public function setCcWebstream(CcWebstream $v = null) - { - if ($v === null) { - $this->setDbStreamId(NULL); - } else { - $this->setDbStreamId($v->getDbId()); - } - - $this->aCcWebstream = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcWebstream object, it will not be re-added. - if ($v !== null) { - $v->addCcSchedule($this); - } - - return $this; - } - - - /** - * Get the associated CcWebstream object - * - * @param PropelPDO Optional Connection object. - * @return CcWebstream The associated CcWebstream object. - * @throws PropelException - */ - public function getCcWebstream(PropelPDO $con = null) - { - if ($this->aCcWebstream === null && ($this->stream_id !== null)) { - $this->aCcWebstream = CcWebstreamQuery::create()->findPk($this->stream_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcWebstream->addCcSchedules($this); - */ - } - return $this->aCcWebstream; - } - - /** - * Clears out the collCcWebstreamMetadatas collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcWebstreamMetadatas() - */ - public function clearCcWebstreamMetadatas() - { - $this->collCcWebstreamMetadatas = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcWebstreamMetadatas collection. - * - * By default this just sets the collCcWebstreamMetadatas collection to an empty array (like clearcollCcWebstreamMetadatas()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcWebstreamMetadatas() - { - $this->collCcWebstreamMetadatas = new PropelObjectCollection(); - $this->collCcWebstreamMetadatas->setModel('CcWebstreamMetadata'); - } - - /** - * Gets an array of CcWebstreamMetadata objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcSchedule is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcWebstreamMetadata[] List of CcWebstreamMetadata objects - * @throws PropelException - */ - public function getCcWebstreamMetadatas($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcWebstreamMetadatas || null !== $criteria) { - if ($this->isNew() && null === $this->collCcWebstreamMetadatas) { - // return empty collection - $this->initCcWebstreamMetadatas(); - } else { - $collCcWebstreamMetadatas = CcWebstreamMetadataQuery::create(null, $criteria) - ->filterByCcSchedule($this) - ->find($con); - if (null !== $criteria) { - return $collCcWebstreamMetadatas; - } - $this->collCcWebstreamMetadatas = $collCcWebstreamMetadatas; - } - } - return $this->collCcWebstreamMetadatas; - } - - /** - * Returns the number of related CcWebstreamMetadata objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcWebstreamMetadata objects. - * @throws PropelException - */ - public function countCcWebstreamMetadatas(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcWebstreamMetadatas || null !== $criteria) { - if ($this->isNew() && null === $this->collCcWebstreamMetadatas) { - return 0; - } else { - $query = CcWebstreamMetadataQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcSchedule($this) - ->count($con); - } - } else { - return count($this->collCcWebstreamMetadatas); - } - } - - /** - * Method called to associate a CcWebstreamMetadata object to this object - * through the CcWebstreamMetadata foreign key attribute. - * - * @param CcWebstreamMetadata $l CcWebstreamMetadata - * @return void - * @throws PropelException - */ - public function addCcWebstreamMetadata(CcWebstreamMetadata $l) - { - if ($this->collCcWebstreamMetadatas === null) { - $this->initCcWebstreamMetadatas(); - } - if (!$this->collCcWebstreamMetadatas->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcWebstreamMetadatas[]= $l; - $l->setCcSchedule($this); - } - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->starts = null; - $this->ends = null; - $this->file_id = null; - $this->stream_id = null; - $this->clip_length = null; - $this->fade_in = null; - $this->fade_out = null; - $this->cue_in = null; - $this->cue_out = null; - $this->media_item_played = null; - $this->instance_id = null; - $this->playout_status = null; - $this->broadcasted = null; - $this->position = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - if ($this->collCcWebstreamMetadatas) { - foreach ((array) $this->collCcWebstreamMetadatas as $o) { - $o->clearAllReferences($deep); - } - } - } // if ($deep) - - $this->collCcWebstreamMetadatas = null; - $this->aCcShowInstances = null; - $this->aCcFiles = null; - $this->aCcWebstream = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcSchedule + /** + * Peer class name + */ + const PEER = 'CcSchedulePeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcSchedulePeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the starts field. + * @var string + */ + protected $starts; + + /** + * The value for the ends field. + * @var string + */ + protected $ends; + + /** + * The value for the file_id field. + * @var int + */ + protected $file_id; + + /** + * The value for the stream_id field. + * @var int + */ + protected $stream_id; + + /** + * The value for the clip_length field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $clip_length; + + /** + * The value for the fade_in field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $fade_in; + + /** + * The value for the fade_out field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $fade_out; + + /** + * The value for the cue_in field. + * @var string + */ + protected $cue_in; + + /** + * The value for the cue_out field. + * @var string + */ + protected $cue_out; + + /** + * The value for the media_item_played field. + * Note: this column has a database default value of: false + * @var boolean + */ + protected $media_item_played; + + /** + * The value for the instance_id field. + * @var int + */ + protected $instance_id; + + /** + * The value for the playout_status field. + * Note: this column has a database default value of: 1 + * @var int + */ + protected $playout_status; + + /** + * The value for the broadcasted field. + * Note: this column has a database default value of: 0 + * @var int + */ + protected $broadcasted; + + /** + * The value for the position field. + * Note: this column has a database default value of: 0 + * @var int + */ + protected $position; + + /** + * @var CcShowInstances + */ + protected $aCcShowInstances; + + /** + * @var CcFiles + */ + protected $aCcFiles; + + /** + * @var CcWebstream + */ + protected $aCcWebstream; + + /** + * @var PropelObjectCollection|CcWebstreamMetadata[] Collection to store aggregation of CcWebstreamMetadata objects. + */ + protected $collCcWebstreamMetadatas; + protected $collCcWebstreamMetadatasPartial; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccWebstreamMetadatasScheduledForDeletion = null; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->clip_length = '00:00:00'; + $this->fade_in = '00:00:00'; + $this->fade_out = '00:00:00'; + $this->media_item_played = false; + $this->playout_status = 1; + $this->broadcasted = 0; + $this->position = 0; + } + + /** + * Initializes internal state of BaseCcSchedule object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [optionally formatted] temporal [starts] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbStarts($format = 'Y-m-d H:i:s') + { + if ($this->starts === null) { + return null; + } + + + try { + $dt = new DateTime($this->starts); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->starts, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [ends] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbEnds($format = 'Y-m-d H:i:s') + { + if ($this->ends === null) { + return null; + } + + + try { + $dt = new DateTime($this->ends); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->ends, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [file_id] column value. + * + * @return int + */ + public function getDbFileId() + { + + return $this->file_id; + } + + /** + * Get the [stream_id] column value. + * + * @return int + */ + public function getDbStreamId() + { + + return $this->stream_id; + } + + /** + * Get the [clip_length] column value. + * + * @return string + */ + public function getDbClipLength() + { + + return $this->clip_length; + } + + /** + * Get the [optionally formatted] temporal [fade_in] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbFadeIn($format = '%X') + { + if ($this->fade_in === null) { + return null; + } + + + try { + $dt = new DateTime($this->fade_in); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->fade_in, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [fade_out] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbFadeOut($format = '%X') + { + if ($this->fade_out === null) { + return null; + } + + + try { + $dt = new DateTime($this->fade_out); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->fade_out, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [cue_in] column value. + * + * @return string + */ + public function getDbCueIn() + { + + return $this->cue_in; + } + + /** + * Get the [cue_out] column value. + * + * @return string + */ + public function getDbCueOut() + { + + return $this->cue_out; + } + + /** + * Get the [media_item_played] column value. + * + * @return boolean + */ + public function getDbMediaItemPlayed() + { + + return $this->media_item_played; + } + + /** + * Get the [instance_id] column value. + * + * @return int + */ + public function getDbInstanceId() + { + + return $this->instance_id; + } + + /** + * Get the [playout_status] column value. + * + * @return int + */ + public function getDbPlayoutStatus() + { + + return $this->playout_status; + } + + /** + * Get the [broadcasted] column value. + * + * @return int + */ + public function getDbBroadcasted() + { + + return $this->broadcasted; + } + + /** + * Get the [position] column value. + * + * @return int + */ + public function getDbPosition() + { + + return $this->position; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcSchedulePeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Sets the value of [starts] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbStarts($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->starts !== null || $dt !== null) { + $currentDateAsString = ($this->starts !== null && $tmpDt = new DateTime($this->starts)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->starts = $newDateAsString; + $this->modifiedColumns[] = CcSchedulePeer::STARTS; + } + } // if either are not null + + + return $this; + } // setDbStarts() + + /** + * Sets the value of [ends] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbEnds($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->ends !== null || $dt !== null) { + $currentDateAsString = ($this->ends !== null && $tmpDt = new DateTime($this->ends)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->ends = $newDateAsString; + $this->modifiedColumns[] = CcSchedulePeer::ENDS; + } + } // if either are not null + + + return $this; + } // setDbEnds() + + /** + * Set the value of [file_id] column. + * + * @param int $v new value + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbFileId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->file_id !== $v) { + $this->file_id = $v; + $this->modifiedColumns[] = CcSchedulePeer::FILE_ID; + } + + if ($this->aCcFiles !== null && $this->aCcFiles->getDbId() !== $v) { + $this->aCcFiles = null; + } + + + return $this; + } // setDbFileId() + + /** + * Set the value of [stream_id] column. + * + * @param int $v new value + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbStreamId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->stream_id !== $v) { + $this->stream_id = $v; + $this->modifiedColumns[] = CcSchedulePeer::STREAM_ID; + } + + if ($this->aCcWebstream !== null && $this->aCcWebstream->getDbId() !== $v) { + $this->aCcWebstream = null; + } + + + return $this; + } // setDbStreamId() + + /** + * Set the value of [clip_length] column. + * + * @param string $v new value + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbClipLength($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->clip_length !== $v) { + $this->clip_length = $v; + $this->modifiedColumns[] = CcSchedulePeer::CLIP_LENGTH; + } + + + return $this; + } // setDbClipLength() + + /** + * Sets the value of [fade_in] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbFadeIn($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->fade_in !== null || $dt !== null) { + $currentDateAsString = ($this->fade_in !== null && $tmpDt = new DateTime($this->fade_in)) ? $tmpDt->format('H:i:s') : null; + $newDateAsString = $dt ? $dt->format('H:i:s') : null; + if ( ($currentDateAsString !== $newDateAsString) // normalized values don't match + || ($dt->format('H:i:s') === '00:00:00') // or the entered value matches the default + ) { + $this->fade_in = $newDateAsString; + $this->modifiedColumns[] = CcSchedulePeer::FADE_IN; + } + } // if either are not null + + + return $this; + } // setDbFadeIn() + + /** + * Sets the value of [fade_out] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbFadeOut($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->fade_out !== null || $dt !== null) { + $currentDateAsString = ($this->fade_out !== null && $tmpDt = new DateTime($this->fade_out)) ? $tmpDt->format('H:i:s') : null; + $newDateAsString = $dt ? $dt->format('H:i:s') : null; + if ( ($currentDateAsString !== $newDateAsString) // normalized values don't match + || ($dt->format('H:i:s') === '00:00:00') // or the entered value matches the default + ) { + $this->fade_out = $newDateAsString; + $this->modifiedColumns[] = CcSchedulePeer::FADE_OUT; + } + } // if either are not null + + + return $this; + } // setDbFadeOut() + + /** + * Set the value of [cue_in] column. + * + * @param string $v new value + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbCueIn($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->cue_in !== $v) { + $this->cue_in = $v; + $this->modifiedColumns[] = CcSchedulePeer::CUE_IN; + } + + + return $this; + } // setDbCueIn() + + /** + * Set the value of [cue_out] column. + * + * @param string $v new value + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbCueOut($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->cue_out !== $v) { + $this->cue_out = $v; + $this->modifiedColumns[] = CcSchedulePeer::CUE_OUT; + } + + + return $this; + } // setDbCueOut() + + /** + * Sets the value of the [media_item_played] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbMediaItemPlayed($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->media_item_played !== $v) { + $this->media_item_played = $v; + $this->modifiedColumns[] = CcSchedulePeer::MEDIA_ITEM_PLAYED; + } + + + return $this; + } // setDbMediaItemPlayed() + + /** + * Set the value of [instance_id] column. + * + * @param int $v new value + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbInstanceId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->instance_id !== $v) { + $this->instance_id = $v; + $this->modifiedColumns[] = CcSchedulePeer::INSTANCE_ID; + } + + if ($this->aCcShowInstances !== null && $this->aCcShowInstances->getDbId() !== $v) { + $this->aCcShowInstances = null; + } + + + return $this; + } // setDbInstanceId() + + /** + * Set the value of [playout_status] column. + * + * @param int $v new value + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbPlayoutStatus($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->playout_status !== $v) { + $this->playout_status = $v; + $this->modifiedColumns[] = CcSchedulePeer::PLAYOUT_STATUS; + } + + + return $this; + } // setDbPlayoutStatus() + + /** + * Set the value of [broadcasted] column. + * + * @param int $v new value + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbBroadcasted($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->broadcasted !== $v) { + $this->broadcasted = $v; + $this->modifiedColumns[] = CcSchedulePeer::BROADCASTED; + } + + + return $this; + } // setDbBroadcasted() + + /** + * Set the value of [position] column. + * + * @param int $v new value + * @return CcSchedule The current object (for fluent API support) + */ + public function setDbPosition($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->position !== $v) { + $this->position = $v; + $this->modifiedColumns[] = CcSchedulePeer::POSITION; + } + + + return $this; + } // setDbPosition() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->clip_length !== '00:00:00') { + return false; + } + + if ($this->fade_in !== '00:00:00') { + return false; + } + + if ($this->fade_out !== '00:00:00') { + return false; + } + + if ($this->media_item_played !== false) { + return false; + } + + if ($this->playout_status !== 1) { + return false; + } + + if ($this->broadcasted !== 0) { + return false; + } + + if ($this->position !== 0) { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->starts = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->ends = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->file_id = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; + $this->stream_id = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; + $this->clip_length = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; + $this->fade_in = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; + $this->fade_out = ($row[$startcol + 7] !== null) ? (string) $row[$startcol + 7] : null; + $this->cue_in = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; + $this->cue_out = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; + $this->media_item_played = ($row[$startcol + 10] !== null) ? (boolean) $row[$startcol + 10] : null; + $this->instance_id = ($row[$startcol + 11] !== null) ? (int) $row[$startcol + 11] : null; + $this->playout_status = ($row[$startcol + 12] !== null) ? (int) $row[$startcol + 12] : null; + $this->broadcasted = ($row[$startcol + 13] !== null) ? (int) $row[$startcol + 13] : null; + $this->position = ($row[$startcol + 14] !== null) ? (int) $row[$startcol + 14] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 15; // 15 = CcSchedulePeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcSchedule object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcFiles !== null && $this->file_id !== $this->aCcFiles->getDbId()) { + $this->aCcFiles = null; + } + if ($this->aCcWebstream !== null && $this->stream_id !== $this->aCcWebstream->getDbId()) { + $this->aCcWebstream = null; + } + if ($this->aCcShowInstances !== null && $this->instance_id !== $this->aCcShowInstances->getDbId()) { + $this->aCcShowInstances = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcSchedulePeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcShowInstances = null; + $this->aCcFiles = null; + $this->aCcWebstream = null; + $this->collCcWebstreamMetadatas = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcScheduleQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcSchedulePeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcShowInstances !== null) { + if ($this->aCcShowInstances->isModified() || $this->aCcShowInstances->isNew()) { + $affectedRows += $this->aCcShowInstances->save($con); + } + $this->setCcShowInstances($this->aCcShowInstances); + } + + if ($this->aCcFiles !== null) { + if ($this->aCcFiles->isModified() || $this->aCcFiles->isNew()) { + $affectedRows += $this->aCcFiles->save($con); + } + $this->setCcFiles($this->aCcFiles); + } + + if ($this->aCcWebstream !== null) { + if ($this->aCcWebstream->isModified() || $this->aCcWebstream->isNew()) { + $affectedRows += $this->aCcWebstream->save($con); + } + $this->setCcWebstream($this->aCcWebstream); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->ccWebstreamMetadatasScheduledForDeletion !== null) { + if (!$this->ccWebstreamMetadatasScheduledForDeletion->isEmpty()) { + CcWebstreamMetadataQuery::create() + ->filterByPrimaryKeys($this->ccWebstreamMetadatasScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccWebstreamMetadatasScheduledForDeletion = null; + } + } + + if ($this->collCcWebstreamMetadatas !== null) { + foreach ($this->collCcWebstreamMetadatas as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcSchedulePeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcSchedulePeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_schedule_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcSchedulePeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcSchedulePeer::STARTS)) { + $modifiedColumns[':p' . $index++] = '"starts"'; + } + if ($this->isColumnModified(CcSchedulePeer::ENDS)) { + $modifiedColumns[':p' . $index++] = '"ends"'; + } + if ($this->isColumnModified(CcSchedulePeer::FILE_ID)) { + $modifiedColumns[':p' . $index++] = '"file_id"'; + } + if ($this->isColumnModified(CcSchedulePeer::STREAM_ID)) { + $modifiedColumns[':p' . $index++] = '"stream_id"'; + } + if ($this->isColumnModified(CcSchedulePeer::CLIP_LENGTH)) { + $modifiedColumns[':p' . $index++] = '"clip_length"'; + } + if ($this->isColumnModified(CcSchedulePeer::FADE_IN)) { + $modifiedColumns[':p' . $index++] = '"fade_in"'; + } + if ($this->isColumnModified(CcSchedulePeer::FADE_OUT)) { + $modifiedColumns[':p' . $index++] = '"fade_out"'; + } + if ($this->isColumnModified(CcSchedulePeer::CUE_IN)) { + $modifiedColumns[':p' . $index++] = '"cue_in"'; + } + if ($this->isColumnModified(CcSchedulePeer::CUE_OUT)) { + $modifiedColumns[':p' . $index++] = '"cue_out"'; + } + if ($this->isColumnModified(CcSchedulePeer::MEDIA_ITEM_PLAYED)) { + $modifiedColumns[':p' . $index++] = '"media_item_played"'; + } + if ($this->isColumnModified(CcSchedulePeer::INSTANCE_ID)) { + $modifiedColumns[':p' . $index++] = '"instance_id"'; + } + if ($this->isColumnModified(CcSchedulePeer::PLAYOUT_STATUS)) { + $modifiedColumns[':p' . $index++] = '"playout_status"'; + } + if ($this->isColumnModified(CcSchedulePeer::BROADCASTED)) { + $modifiedColumns[':p' . $index++] = '"broadcasted"'; + } + if ($this->isColumnModified(CcSchedulePeer::POSITION)) { + $modifiedColumns[':p' . $index++] = '"position"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_schedule" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"starts"': + $stmt->bindValue($identifier, $this->starts, PDO::PARAM_STR); + break; + case '"ends"': + $stmt->bindValue($identifier, $this->ends, PDO::PARAM_STR); + break; + case '"file_id"': + $stmt->bindValue($identifier, $this->file_id, PDO::PARAM_INT); + break; + case '"stream_id"': + $stmt->bindValue($identifier, $this->stream_id, PDO::PARAM_INT); + break; + case '"clip_length"': + $stmt->bindValue($identifier, $this->clip_length, PDO::PARAM_STR); + break; + case '"fade_in"': + $stmt->bindValue($identifier, $this->fade_in, PDO::PARAM_STR); + break; + case '"fade_out"': + $stmt->bindValue($identifier, $this->fade_out, PDO::PARAM_STR); + break; + case '"cue_in"': + $stmt->bindValue($identifier, $this->cue_in, PDO::PARAM_STR); + break; + case '"cue_out"': + $stmt->bindValue($identifier, $this->cue_out, PDO::PARAM_STR); + break; + case '"media_item_played"': + $stmt->bindValue($identifier, $this->media_item_played, PDO::PARAM_BOOL); + break; + case '"instance_id"': + $stmt->bindValue($identifier, $this->instance_id, PDO::PARAM_INT); + break; + case '"playout_status"': + $stmt->bindValue($identifier, $this->playout_status, PDO::PARAM_INT); + break; + case '"broadcasted"': + $stmt->bindValue($identifier, $this->broadcasted, PDO::PARAM_INT); + break; + case '"position"': + $stmt->bindValue($identifier, $this->position, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcShowInstances !== null) { + if (!$this->aCcShowInstances->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcShowInstances->getValidationFailures()); + } + } + + if ($this->aCcFiles !== null) { + if (!$this->aCcFiles->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcFiles->getValidationFailures()); + } + } + + if ($this->aCcWebstream !== null) { + if (!$this->aCcWebstream->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcWebstream->getValidationFailures()); + } + } + + + if (($retval = CcSchedulePeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + if ($this->collCcWebstreamMetadatas !== null) { + foreach ($this->collCcWebstreamMetadatas as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcSchedulePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbStarts(); + break; + case 2: + return $this->getDbEnds(); + break; + case 3: + return $this->getDbFileId(); + break; + case 4: + return $this->getDbStreamId(); + break; + case 5: + return $this->getDbClipLength(); + break; + case 6: + return $this->getDbFadeIn(); + break; + case 7: + return $this->getDbFadeOut(); + break; + case 8: + return $this->getDbCueIn(); + break; + case 9: + return $this->getDbCueOut(); + break; + case 10: + return $this->getDbMediaItemPlayed(); + break; + case 11: + return $this->getDbInstanceId(); + break; + case 12: + return $this->getDbPlayoutStatus(); + break; + case 13: + return $this->getDbBroadcasted(); + break; + case 14: + return $this->getDbPosition(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcSchedule'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcSchedule'][$this->getPrimaryKey()] = true; + $keys = CcSchedulePeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbStarts(), + $keys[2] => $this->getDbEnds(), + $keys[3] => $this->getDbFileId(), + $keys[4] => $this->getDbStreamId(), + $keys[5] => $this->getDbClipLength(), + $keys[6] => $this->getDbFadeIn(), + $keys[7] => $this->getDbFadeOut(), + $keys[8] => $this->getDbCueIn(), + $keys[9] => $this->getDbCueOut(), + $keys[10] => $this->getDbMediaItemPlayed(), + $keys[11] => $this->getDbInstanceId(), + $keys[12] => $this->getDbPlayoutStatus(), + $keys[13] => $this->getDbBroadcasted(), + $keys[14] => $this->getDbPosition(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcShowInstances) { + $result['CcShowInstances'] = $this->aCcShowInstances->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->aCcFiles) { + $result['CcFiles'] = $this->aCcFiles->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->aCcWebstream) { + $result['CcWebstream'] = $this->aCcWebstream->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->collCcWebstreamMetadatas) { + $result['CcWebstreamMetadatas'] = $this->collCcWebstreamMetadatas->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcSchedulePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbStarts($value); + break; + case 2: + $this->setDbEnds($value); + break; + case 3: + $this->setDbFileId($value); + break; + case 4: + $this->setDbStreamId($value); + break; + case 5: + $this->setDbClipLength($value); + break; + case 6: + $this->setDbFadeIn($value); + break; + case 7: + $this->setDbFadeOut($value); + break; + case 8: + $this->setDbCueIn($value); + break; + case 9: + $this->setDbCueOut($value); + break; + case 10: + $this->setDbMediaItemPlayed($value); + break; + case 11: + $this->setDbInstanceId($value); + break; + case 12: + $this->setDbPlayoutStatus($value); + break; + case 13: + $this->setDbBroadcasted($value); + break; + case 14: + $this->setDbPosition($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcSchedulePeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbStarts($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbEnds($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbFileId($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbStreamId($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setDbClipLength($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setDbFadeIn($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setDbFadeOut($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setDbCueIn($arr[$keys[8]]); + if (array_key_exists($keys[9], $arr)) $this->setDbCueOut($arr[$keys[9]]); + if (array_key_exists($keys[10], $arr)) $this->setDbMediaItemPlayed($arr[$keys[10]]); + if (array_key_exists($keys[11], $arr)) $this->setDbInstanceId($arr[$keys[11]]); + if (array_key_exists($keys[12], $arr)) $this->setDbPlayoutStatus($arr[$keys[12]]); + if (array_key_exists($keys[13], $arr)) $this->setDbBroadcasted($arr[$keys[13]]); + if (array_key_exists($keys[14], $arr)) $this->setDbPosition($arr[$keys[14]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcSchedulePeer::DATABASE_NAME); + + if ($this->isColumnModified(CcSchedulePeer::ID)) $criteria->add(CcSchedulePeer::ID, $this->id); + if ($this->isColumnModified(CcSchedulePeer::STARTS)) $criteria->add(CcSchedulePeer::STARTS, $this->starts); + if ($this->isColumnModified(CcSchedulePeer::ENDS)) $criteria->add(CcSchedulePeer::ENDS, $this->ends); + if ($this->isColumnModified(CcSchedulePeer::FILE_ID)) $criteria->add(CcSchedulePeer::FILE_ID, $this->file_id); + if ($this->isColumnModified(CcSchedulePeer::STREAM_ID)) $criteria->add(CcSchedulePeer::STREAM_ID, $this->stream_id); + if ($this->isColumnModified(CcSchedulePeer::CLIP_LENGTH)) $criteria->add(CcSchedulePeer::CLIP_LENGTH, $this->clip_length); + if ($this->isColumnModified(CcSchedulePeer::FADE_IN)) $criteria->add(CcSchedulePeer::FADE_IN, $this->fade_in); + if ($this->isColumnModified(CcSchedulePeer::FADE_OUT)) $criteria->add(CcSchedulePeer::FADE_OUT, $this->fade_out); + if ($this->isColumnModified(CcSchedulePeer::CUE_IN)) $criteria->add(CcSchedulePeer::CUE_IN, $this->cue_in); + if ($this->isColumnModified(CcSchedulePeer::CUE_OUT)) $criteria->add(CcSchedulePeer::CUE_OUT, $this->cue_out); + if ($this->isColumnModified(CcSchedulePeer::MEDIA_ITEM_PLAYED)) $criteria->add(CcSchedulePeer::MEDIA_ITEM_PLAYED, $this->media_item_played); + if ($this->isColumnModified(CcSchedulePeer::INSTANCE_ID)) $criteria->add(CcSchedulePeer::INSTANCE_ID, $this->instance_id); + if ($this->isColumnModified(CcSchedulePeer::PLAYOUT_STATUS)) $criteria->add(CcSchedulePeer::PLAYOUT_STATUS, $this->playout_status); + if ($this->isColumnModified(CcSchedulePeer::BROADCASTED)) $criteria->add(CcSchedulePeer::BROADCASTED, $this->broadcasted); + if ($this->isColumnModified(CcSchedulePeer::POSITION)) $criteria->add(CcSchedulePeer::POSITION, $this->position); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcSchedulePeer::DATABASE_NAME); + $criteria->add(CcSchedulePeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcSchedule (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbStarts($this->getDbStarts()); + $copyObj->setDbEnds($this->getDbEnds()); + $copyObj->setDbFileId($this->getDbFileId()); + $copyObj->setDbStreamId($this->getDbStreamId()); + $copyObj->setDbClipLength($this->getDbClipLength()); + $copyObj->setDbFadeIn($this->getDbFadeIn()); + $copyObj->setDbFadeOut($this->getDbFadeOut()); + $copyObj->setDbCueIn($this->getDbCueIn()); + $copyObj->setDbCueOut($this->getDbCueOut()); + $copyObj->setDbMediaItemPlayed($this->getDbMediaItemPlayed()); + $copyObj->setDbInstanceId($this->getDbInstanceId()); + $copyObj->setDbPlayoutStatus($this->getDbPlayoutStatus()); + $copyObj->setDbBroadcasted($this->getDbBroadcasted()); + $copyObj->setDbPosition($this->getDbPosition()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + foreach ($this->getCcWebstreamMetadatas() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcWebstreamMetadata($relObj->copy($deepCopy)); + } + } + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcSchedule Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcSchedulePeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcSchedulePeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcShowInstances object. + * + * @param CcShowInstances $v + * @return CcSchedule The current object (for fluent API support) + * @throws PropelException + */ + public function setCcShowInstances(CcShowInstances $v = null) + { + if ($v === null) { + $this->setDbInstanceId(NULL); + } else { + $this->setDbInstanceId($v->getDbId()); + } + + $this->aCcShowInstances = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcShowInstances object, it will not be re-added. + if ($v !== null) { + $v->addCcSchedule($this); + } + + + return $this; + } + + + /** + * Get the associated CcShowInstances object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcShowInstances The associated CcShowInstances object. + * @throws PropelException + */ + public function getCcShowInstances(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcShowInstances === null && ($this->instance_id !== null) && $doQuery) { + $this->aCcShowInstances = CcShowInstancesQuery::create()->findPk($this->instance_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcShowInstances->addCcSchedules($this); + */ + } + + return $this->aCcShowInstances; + } + + /** + * Declares an association between this object and a CcFiles object. + * + * @param CcFiles $v + * @return CcSchedule The current object (for fluent API support) + * @throws PropelException + */ + public function setCcFiles(CcFiles $v = null) + { + if ($v === null) { + $this->setDbFileId(NULL); + } else { + $this->setDbFileId($v->getDbId()); + } + + $this->aCcFiles = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcFiles object, it will not be re-added. + if ($v !== null) { + $v->addCcSchedule($this); + } + + + return $this; + } + + + /** + * Get the associated CcFiles object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcFiles The associated CcFiles object. + * @throws PropelException + */ + public function getCcFiles(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcFiles === null && ($this->file_id !== null) && $doQuery) { + $this->aCcFiles = CcFilesQuery::create()->findPk($this->file_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcFiles->addCcSchedules($this); + */ + } + + return $this->aCcFiles; + } + + /** + * Declares an association between this object and a CcWebstream object. + * + * @param CcWebstream $v + * @return CcSchedule The current object (for fluent API support) + * @throws PropelException + */ + public function setCcWebstream(CcWebstream $v = null) + { + if ($v === null) { + $this->setDbStreamId(NULL); + } else { + $this->setDbStreamId($v->getDbId()); + } + + $this->aCcWebstream = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcWebstream object, it will not be re-added. + if ($v !== null) { + $v->addCcSchedule($this); + } + + + return $this; + } + + + /** + * Get the associated CcWebstream object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcWebstream The associated CcWebstream object. + * @throws PropelException + */ + public function getCcWebstream(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcWebstream === null && ($this->stream_id !== null) && $doQuery) { + $this->aCcWebstream = CcWebstreamQuery::create()->findPk($this->stream_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcWebstream->addCcSchedules($this); + */ + } + + return $this->aCcWebstream; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CcWebstreamMetadata' == $relationName) { + $this->initCcWebstreamMetadatas(); + } + } + + /** + * Clears out the collCcWebstreamMetadatas collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcSchedule The current object (for fluent API support) + * @see addCcWebstreamMetadatas() + */ + public function clearCcWebstreamMetadatas() + { + $this->collCcWebstreamMetadatas = null; // important to set this to null since that means it is uninitialized + $this->collCcWebstreamMetadatasPartial = null; + + return $this; + } + + /** + * reset is the collCcWebstreamMetadatas collection loaded partially + * + * @return void + */ + public function resetPartialCcWebstreamMetadatas($v = true) + { + $this->collCcWebstreamMetadatasPartial = $v; + } + + /** + * Initializes the collCcWebstreamMetadatas collection. + * + * By default this just sets the collCcWebstreamMetadatas collection to an empty array (like clearcollCcWebstreamMetadatas()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcWebstreamMetadatas($overrideExisting = true) + { + if (null !== $this->collCcWebstreamMetadatas && !$overrideExisting) { + return; + } + $this->collCcWebstreamMetadatas = new PropelObjectCollection(); + $this->collCcWebstreamMetadatas->setModel('CcWebstreamMetadata'); + } + + /** + * Gets an array of CcWebstreamMetadata objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcSchedule is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcWebstreamMetadata[] List of CcWebstreamMetadata objects + * @throws PropelException + */ + public function getCcWebstreamMetadatas($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcWebstreamMetadatasPartial && !$this->isNew(); + if (null === $this->collCcWebstreamMetadatas || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcWebstreamMetadatas) { + // return empty collection + $this->initCcWebstreamMetadatas(); + } else { + $collCcWebstreamMetadatas = CcWebstreamMetadataQuery::create(null, $criteria) + ->filterByCcSchedule($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcWebstreamMetadatasPartial && count($collCcWebstreamMetadatas)) { + $this->initCcWebstreamMetadatas(false); + + foreach ($collCcWebstreamMetadatas as $obj) { + if (false == $this->collCcWebstreamMetadatas->contains($obj)) { + $this->collCcWebstreamMetadatas->append($obj); + } + } + + $this->collCcWebstreamMetadatasPartial = true; + } + + $collCcWebstreamMetadatas->getInternalIterator()->rewind(); + + return $collCcWebstreamMetadatas; + } + + if ($partial && $this->collCcWebstreamMetadatas) { + foreach ($this->collCcWebstreamMetadatas as $obj) { + if ($obj->isNew()) { + $collCcWebstreamMetadatas[] = $obj; + } + } + } + + $this->collCcWebstreamMetadatas = $collCcWebstreamMetadatas; + $this->collCcWebstreamMetadatasPartial = false; + } + } + + return $this->collCcWebstreamMetadatas; + } + + /** + * Sets a collection of CcWebstreamMetadata objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccWebstreamMetadatas A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcSchedule The current object (for fluent API support) + */ + public function setCcWebstreamMetadatas(PropelCollection $ccWebstreamMetadatas, PropelPDO $con = null) + { + $ccWebstreamMetadatasToDelete = $this->getCcWebstreamMetadatas(new Criteria(), $con)->diff($ccWebstreamMetadatas); + + + $this->ccWebstreamMetadatasScheduledForDeletion = $ccWebstreamMetadatasToDelete; + + foreach ($ccWebstreamMetadatasToDelete as $ccWebstreamMetadataRemoved) { + $ccWebstreamMetadataRemoved->setCcSchedule(null); + } + + $this->collCcWebstreamMetadatas = null; + foreach ($ccWebstreamMetadatas as $ccWebstreamMetadata) { + $this->addCcWebstreamMetadata($ccWebstreamMetadata); + } + + $this->collCcWebstreamMetadatas = $ccWebstreamMetadatas; + $this->collCcWebstreamMetadatasPartial = false; + + return $this; + } + + /** + * Returns the number of related CcWebstreamMetadata objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcWebstreamMetadata objects. + * @throws PropelException + */ + public function countCcWebstreamMetadatas(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcWebstreamMetadatasPartial && !$this->isNew(); + if (null === $this->collCcWebstreamMetadatas || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcWebstreamMetadatas) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcWebstreamMetadatas()); + } + $query = CcWebstreamMetadataQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcSchedule($this) + ->count($con); + } + + return count($this->collCcWebstreamMetadatas); + } + + /** + * Method called to associate a CcWebstreamMetadata object to this object + * through the CcWebstreamMetadata foreign key attribute. + * + * @param CcWebstreamMetadata $l CcWebstreamMetadata + * @return CcSchedule The current object (for fluent API support) + */ + public function addCcWebstreamMetadata(CcWebstreamMetadata $l) + { + if ($this->collCcWebstreamMetadatas === null) { + $this->initCcWebstreamMetadatas(); + $this->collCcWebstreamMetadatasPartial = true; + } + + if (!in_array($l, $this->collCcWebstreamMetadatas->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcWebstreamMetadata($l); + + if ($this->ccWebstreamMetadatasScheduledForDeletion and $this->ccWebstreamMetadatasScheduledForDeletion->contains($l)) { + $this->ccWebstreamMetadatasScheduledForDeletion->remove($this->ccWebstreamMetadatasScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcWebstreamMetadata $ccWebstreamMetadata The ccWebstreamMetadata object to add. + */ + protected function doAddCcWebstreamMetadata($ccWebstreamMetadata) + { + $this->collCcWebstreamMetadatas[]= $ccWebstreamMetadata; + $ccWebstreamMetadata->setCcSchedule($this); + } + + /** + * @param CcWebstreamMetadata $ccWebstreamMetadata The ccWebstreamMetadata object to remove. + * @return CcSchedule The current object (for fluent API support) + */ + public function removeCcWebstreamMetadata($ccWebstreamMetadata) + { + if ($this->getCcWebstreamMetadatas()->contains($ccWebstreamMetadata)) { + $this->collCcWebstreamMetadatas->remove($this->collCcWebstreamMetadatas->search($ccWebstreamMetadata)); + if (null === $this->ccWebstreamMetadatasScheduledForDeletion) { + $this->ccWebstreamMetadatasScheduledForDeletion = clone $this->collCcWebstreamMetadatas; + $this->ccWebstreamMetadatasScheduledForDeletion->clear(); + } + $this->ccWebstreamMetadatasScheduledForDeletion[]= clone $ccWebstreamMetadata; + $ccWebstreamMetadata->setCcSchedule(null); + } + + return $this; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->starts = null; + $this->ends = null; + $this->file_id = null; + $this->stream_id = null; + $this->clip_length = null; + $this->fade_in = null; + $this->fade_out = null; + $this->cue_in = null; + $this->cue_out = null; + $this->media_item_played = null; + $this->instance_id = null; + $this->playout_status = null; + $this->broadcasted = null; + $this->position = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCcWebstreamMetadatas) { + foreach ($this->collCcWebstreamMetadatas as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->aCcShowInstances instanceof Persistent) { + $this->aCcShowInstances->clearAllReferences($deep); + } + if ($this->aCcFiles instanceof Persistent) { + $this->aCcFiles->clearAllReferences($deep); + } + if ($this->aCcWebstream instanceof Persistent) { + $this->aCcWebstream->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + if ($this->collCcWebstreamMetadatas instanceof PropelCollection) { + $this->collCcWebstreamMetadatas->clearIterator(); + } + $this->collCcWebstreamMetadatas = null; + $this->aCcShowInstances = null; + $this->aCcFiles = null; + $this->aCcWebstream = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcSchedulePeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSchedulePeer.php b/airtime_mvc/application/models/airtime/om/BaseCcSchedulePeer.php index 164830444b..9815888313 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSchedulePeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSchedulePeer.php @@ -4,1763 +4,1799 @@ /** * Base static class for performing query and update operations on the 'cc_schedule' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcSchedulePeer { +abstract class BaseCcSchedulePeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_schedule'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcSchedule'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcScheduleTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 15; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 15; + + /** the column name for the id field */ + const ID = 'cc_schedule.id'; + + /** the column name for the starts field */ + const STARTS = 'cc_schedule.starts'; + + /** the column name for the ends field */ + const ENDS = 'cc_schedule.ends'; + + /** the column name for the file_id field */ + const FILE_ID = 'cc_schedule.file_id'; + + /** the column name for the stream_id field */ + const STREAM_ID = 'cc_schedule.stream_id'; + + /** the column name for the clip_length field */ + const CLIP_LENGTH = 'cc_schedule.clip_length'; + + /** the column name for the fade_in field */ + const FADE_IN = 'cc_schedule.fade_in'; + + /** the column name for the fade_out field */ + const FADE_OUT = 'cc_schedule.fade_out'; + + /** the column name for the cue_in field */ + const CUE_IN = 'cc_schedule.cue_in'; + + /** the column name for the cue_out field */ + const CUE_OUT = 'cc_schedule.cue_out'; + + /** the column name for the media_item_played field */ + const MEDIA_ITEM_PLAYED = 'cc_schedule.media_item_played'; + + /** the column name for the instance_id field */ + const INSTANCE_ID = 'cc_schedule.instance_id'; + + /** the column name for the playout_status field */ + const PLAYOUT_STATUS = 'cc_schedule.playout_status'; + + /** the column name for the broadcasted field */ + const BROADCASTED = 'cc_schedule.broadcasted'; + + /** the column name for the position field */ + const POSITION = 'cc_schedule.position'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcSchedule objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcSchedule[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcSchedulePeer::$fieldNames[CcSchedulePeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbStarts', 'DbEnds', 'DbFileId', 'DbStreamId', 'DbClipLength', 'DbFadeIn', 'DbFadeOut', 'DbCueIn', 'DbCueOut', 'DbMediaItemPlayed', 'DbInstanceId', 'DbPlayoutStatus', 'DbBroadcasted', 'DbPosition', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbStarts', 'dbEnds', 'dbFileId', 'dbStreamId', 'dbClipLength', 'dbFadeIn', 'dbFadeOut', 'dbCueIn', 'dbCueOut', 'dbMediaItemPlayed', 'dbInstanceId', 'dbPlayoutStatus', 'dbBroadcasted', 'dbPosition', ), + BasePeer::TYPE_COLNAME => array (CcSchedulePeer::ID, CcSchedulePeer::STARTS, CcSchedulePeer::ENDS, CcSchedulePeer::FILE_ID, CcSchedulePeer::STREAM_ID, CcSchedulePeer::CLIP_LENGTH, CcSchedulePeer::FADE_IN, CcSchedulePeer::FADE_OUT, CcSchedulePeer::CUE_IN, CcSchedulePeer::CUE_OUT, CcSchedulePeer::MEDIA_ITEM_PLAYED, CcSchedulePeer::INSTANCE_ID, CcSchedulePeer::PLAYOUT_STATUS, CcSchedulePeer::BROADCASTED, CcSchedulePeer::POSITION, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'STARTS', 'ENDS', 'FILE_ID', 'STREAM_ID', 'CLIP_LENGTH', 'FADE_IN', 'FADE_OUT', 'CUE_IN', 'CUE_OUT', 'MEDIA_ITEM_PLAYED', 'INSTANCE_ID', 'PLAYOUT_STATUS', 'BROADCASTED', 'POSITION', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'starts', 'ends', 'file_id', 'stream_id', 'clip_length', 'fade_in', 'fade_out', 'cue_in', 'cue_out', 'media_item_played', 'instance_id', 'playout_status', 'broadcasted', 'position', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcSchedulePeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbStarts' => 1, 'DbEnds' => 2, 'DbFileId' => 3, 'DbStreamId' => 4, 'DbClipLength' => 5, 'DbFadeIn' => 6, 'DbFadeOut' => 7, 'DbCueIn' => 8, 'DbCueOut' => 9, 'DbMediaItemPlayed' => 10, 'DbInstanceId' => 11, 'DbPlayoutStatus' => 12, 'DbBroadcasted' => 13, 'DbPosition' => 14, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbStarts' => 1, 'dbEnds' => 2, 'dbFileId' => 3, 'dbStreamId' => 4, 'dbClipLength' => 5, 'dbFadeIn' => 6, 'dbFadeOut' => 7, 'dbCueIn' => 8, 'dbCueOut' => 9, 'dbMediaItemPlayed' => 10, 'dbInstanceId' => 11, 'dbPlayoutStatus' => 12, 'dbBroadcasted' => 13, 'dbPosition' => 14, ), + BasePeer::TYPE_COLNAME => array (CcSchedulePeer::ID => 0, CcSchedulePeer::STARTS => 1, CcSchedulePeer::ENDS => 2, CcSchedulePeer::FILE_ID => 3, CcSchedulePeer::STREAM_ID => 4, CcSchedulePeer::CLIP_LENGTH => 5, CcSchedulePeer::FADE_IN => 6, CcSchedulePeer::FADE_OUT => 7, CcSchedulePeer::CUE_IN => 8, CcSchedulePeer::CUE_OUT => 9, CcSchedulePeer::MEDIA_ITEM_PLAYED => 10, CcSchedulePeer::INSTANCE_ID => 11, CcSchedulePeer::PLAYOUT_STATUS => 12, CcSchedulePeer::BROADCASTED => 13, CcSchedulePeer::POSITION => 14, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'STARTS' => 1, 'ENDS' => 2, 'FILE_ID' => 3, 'STREAM_ID' => 4, 'CLIP_LENGTH' => 5, 'FADE_IN' => 6, 'FADE_OUT' => 7, 'CUE_IN' => 8, 'CUE_OUT' => 9, 'MEDIA_ITEM_PLAYED' => 10, 'INSTANCE_ID' => 11, 'PLAYOUT_STATUS' => 12, 'BROADCASTED' => 13, 'POSITION' => 14, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'starts' => 1, 'ends' => 2, 'file_id' => 3, 'stream_id' => 4, 'clip_length' => 5, 'fade_in' => 6, 'fade_out' => 7, 'cue_in' => 8, 'cue_out' => 9, 'media_item_played' => 10, 'instance_id' => 11, 'playout_status' => 12, 'broadcasted' => 13, 'position' => 14, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcSchedulePeer::getFieldNames($toType); + $key = isset(CcSchedulePeer::$fieldKeys[$fromType][$name]) ? CcSchedulePeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcSchedulePeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcSchedulePeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcSchedulePeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcSchedulePeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcSchedulePeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcSchedulePeer::ID); + $criteria->addSelectColumn(CcSchedulePeer::STARTS); + $criteria->addSelectColumn(CcSchedulePeer::ENDS); + $criteria->addSelectColumn(CcSchedulePeer::FILE_ID); + $criteria->addSelectColumn(CcSchedulePeer::STREAM_ID); + $criteria->addSelectColumn(CcSchedulePeer::CLIP_LENGTH); + $criteria->addSelectColumn(CcSchedulePeer::FADE_IN); + $criteria->addSelectColumn(CcSchedulePeer::FADE_OUT); + $criteria->addSelectColumn(CcSchedulePeer::CUE_IN); + $criteria->addSelectColumn(CcSchedulePeer::CUE_OUT); + $criteria->addSelectColumn(CcSchedulePeer::MEDIA_ITEM_PLAYED); + $criteria->addSelectColumn(CcSchedulePeer::INSTANCE_ID); + $criteria->addSelectColumn(CcSchedulePeer::PLAYOUT_STATUS); + $criteria->addSelectColumn(CcSchedulePeer::BROADCASTED); + $criteria->addSelectColumn(CcSchedulePeer::POSITION); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.starts'); + $criteria->addSelectColumn($alias . '.ends'); + $criteria->addSelectColumn($alias . '.file_id'); + $criteria->addSelectColumn($alias . '.stream_id'); + $criteria->addSelectColumn($alias . '.clip_length'); + $criteria->addSelectColumn($alias . '.fade_in'); + $criteria->addSelectColumn($alias . '.fade_out'); + $criteria->addSelectColumn($alias . '.cue_in'); + $criteria->addSelectColumn($alias . '.cue_out'); + $criteria->addSelectColumn($alias . '.media_item_played'); + $criteria->addSelectColumn($alias . '.instance_id'); + $criteria->addSelectColumn($alias . '.playout_status'); + $criteria->addSelectColumn($alias . '.broadcasted'); + $criteria->addSelectColumn($alias . '.position'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSchedulePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcSchedule + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcSchedulePeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcSchedulePeer::populateObjects(CcSchedulePeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcSchedulePeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcSchedule $obj A CcSchedule object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcSchedulePeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcSchedule object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcSchedule) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcSchedule object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcSchedulePeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcSchedule Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcSchedulePeer::$instances[$key])) { + return CcSchedulePeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcSchedulePeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcSchedulePeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_schedule + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in CcWebstreamMetadataPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcWebstreamMetadataPeer::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcSchedulePeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcSchedulePeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcSchedulePeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcSchedule object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcSchedulePeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcSchedulePeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcSchedulePeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcSchedulePeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcSchedulePeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcShowInstances table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcShowInstances(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSchedulePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcFiles table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSchedulePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcWebstream table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcWebstream(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSchedulePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcSchedule objects pre-filled with their CcShowInstances objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcSchedule objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcShowInstances(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + } + + CcSchedulePeer::addSelectColumns($criteria); + $startcol = CcSchedulePeer::NUM_HYDRATE_COLUMNS; + CcShowInstancesPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcSchedulePeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcSchedulePeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcShowInstancesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowInstancesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcShowInstancesPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcSchedule) to $obj2 (CcShowInstances) + $obj2->addCcSchedule($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcSchedule objects pre-filled with their CcFiles objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcSchedule objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + } + + CcSchedulePeer::addSelectColumns($criteria); + $startcol = CcSchedulePeer::NUM_HYDRATE_COLUMNS; + CcFilesPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcSchedulePeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcSchedulePeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcSchedule) to $obj2 (CcFiles) + $obj2->addCcSchedule($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcSchedule objects pre-filled with their CcWebstream objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcSchedule objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcWebstream(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + } + + CcSchedulePeer::addSelectColumns($criteria); + $startcol = CcSchedulePeer::NUM_HYDRATE_COLUMNS; + CcWebstreamPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcSchedulePeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcSchedulePeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcWebstreamPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcWebstreamPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcWebstreamPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcWebstreamPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcSchedule) to $obj2 (CcWebstream) + $obj2->addCcSchedule($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSchedulePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); + + $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcSchedule objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcSchedule objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + } + + CcSchedulePeer::addSelectColumns($criteria); + $startcol2 = CcSchedulePeer::NUM_HYDRATE_COLUMNS; + + CcShowInstancesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcShowInstancesPeer::NUM_HYDRATE_COLUMNS; + + CcFilesPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + + CcWebstreamPeer::addSelectColumns($criteria); + $startcol5 = $startcol4 + CcWebstreamPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); + + $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcSchedulePeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcSchedulePeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcShowInstances rows + + $key2 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcShowInstancesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowInstancesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcShowInstancesPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcSchedule) to the collection in $obj2 (CcShowInstances) + $obj2->addCcSchedule($obj1); + } // if joined row not null + + // Add objects for joined CcFiles rows + + $key3 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcFilesPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcFilesPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcFilesPeer::addInstanceToPool($obj3, $key3); + } // if obj3 loaded + + // Add the $obj1 (CcSchedule) to the collection in $obj3 (CcFiles) + $obj3->addCcSchedule($obj1); + } // if joined row not null + + // Add objects for joined CcWebstream rows + + $key4 = CcWebstreamPeer::getPrimaryKeyHashFromRow($row, $startcol4); + if ($key4 !== null) { + $obj4 = CcWebstreamPeer::getInstanceFromPool($key4); + if (!$obj4) { + + $cls = CcWebstreamPeer::getOMClass(); + + $obj4 = new $cls(); + $obj4->hydrate($row, $startcol4); + CcWebstreamPeer::addInstanceToPool($obj4, $key4); + } // if obj4 loaded + + // Add the $obj1 (CcSchedule) to the collection in $obj4 (CcWebstream) + $obj4->addCcSchedule($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcShowInstances table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcShowInstances(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSchedulePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcFiles table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSchedulePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); + + $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcWebstream table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcWebstream(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSchedulePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); + + $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcSchedule objects pre-filled with all related objects except CcShowInstances. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcSchedule objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcShowInstances(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + } + + CcSchedulePeer::addSelectColumns($criteria); + $startcol2 = CcSchedulePeer::NUM_HYDRATE_COLUMNS; + + CcFilesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + + CcWebstreamPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcWebstreamPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcSchedulePeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcSchedulePeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcFiles rows + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcSchedule) to the collection in $obj2 (CcFiles) + $obj2->addCcSchedule($obj1); + + } // if joined row is not null + + // Add objects for joined CcWebstream rows + + $key3 = CcWebstreamPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcWebstreamPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcWebstreamPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcWebstreamPeer::addInstanceToPool($obj3, $key3); + } // if $obj3 already loaded + + // Add the $obj1 (CcSchedule) to the collection in $obj3 (CcWebstream) + $obj3->addCcSchedule($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcSchedule objects pre-filled with all related objects except CcFiles. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcSchedule objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + } + + CcSchedulePeer::addSelectColumns($criteria); + $startcol2 = CcSchedulePeer::NUM_HYDRATE_COLUMNS; + + CcShowInstancesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcShowInstancesPeer::NUM_HYDRATE_COLUMNS; + + CcWebstreamPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcWebstreamPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); + + $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcSchedulePeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcSchedulePeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcShowInstances rows + + $key2 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcShowInstancesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowInstancesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcShowInstancesPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcSchedule) to the collection in $obj2 (CcShowInstances) + $obj2->addCcSchedule($obj1); + + } // if joined row is not null + + // Add objects for joined CcWebstream rows + + $key3 = CcWebstreamPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcWebstreamPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcWebstreamPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcWebstreamPeer::addInstanceToPool($obj3, $key3); + } // if $obj3 already loaded + + // Add the $obj1 (CcSchedule) to the collection in $obj3 (CcWebstream) + $obj3->addCcSchedule($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcSchedule objects pre-filled with all related objects except CcWebstream. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcSchedule objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcWebstream(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + } + + CcSchedulePeer::addSelectColumns($criteria); + $startcol2 = CcSchedulePeer::NUM_HYDRATE_COLUMNS; - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_schedule'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcSchedule'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcSchedule'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcScheduleTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 15; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_schedule.ID'; - - /** the column name for the STARTS field */ - const STARTS = 'cc_schedule.STARTS'; - - /** the column name for the ENDS field */ - const ENDS = 'cc_schedule.ENDS'; - - /** the column name for the FILE_ID field */ - const FILE_ID = 'cc_schedule.FILE_ID'; - - /** the column name for the STREAM_ID field */ - const STREAM_ID = 'cc_schedule.STREAM_ID'; - - /** the column name for the CLIP_LENGTH field */ - const CLIP_LENGTH = 'cc_schedule.CLIP_LENGTH'; - - /** the column name for the FADE_IN field */ - const FADE_IN = 'cc_schedule.FADE_IN'; - - /** the column name for the FADE_OUT field */ - const FADE_OUT = 'cc_schedule.FADE_OUT'; - - /** the column name for the CUE_IN field */ - const CUE_IN = 'cc_schedule.CUE_IN'; - - /** the column name for the CUE_OUT field */ - const CUE_OUT = 'cc_schedule.CUE_OUT'; - - /** the column name for the MEDIA_ITEM_PLAYED field */ - const MEDIA_ITEM_PLAYED = 'cc_schedule.MEDIA_ITEM_PLAYED'; - - /** the column name for the INSTANCE_ID field */ - const INSTANCE_ID = 'cc_schedule.INSTANCE_ID'; - - /** the column name for the PLAYOUT_STATUS field */ - const PLAYOUT_STATUS = 'cc_schedule.PLAYOUT_STATUS'; - - /** the column name for the BROADCASTED field */ - const BROADCASTED = 'cc_schedule.BROADCASTED'; - - /** the column name for the POSITION field */ - const POSITION = 'cc_schedule.POSITION'; - - /** - * An identiy map to hold any loaded instances of CcSchedule objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcSchedule[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbStarts', 'DbEnds', 'DbFileId', 'DbStreamId', 'DbClipLength', 'DbFadeIn', 'DbFadeOut', 'DbCueIn', 'DbCueOut', 'DbMediaItemPlayed', 'DbInstanceId', 'DbPlayoutStatus', 'DbBroadcasted', 'DbPosition', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbStarts', 'dbEnds', 'dbFileId', 'dbStreamId', 'dbClipLength', 'dbFadeIn', 'dbFadeOut', 'dbCueIn', 'dbCueOut', 'dbMediaItemPlayed', 'dbInstanceId', 'dbPlayoutStatus', 'dbBroadcasted', 'dbPosition', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::STARTS, self::ENDS, self::FILE_ID, self::STREAM_ID, self::CLIP_LENGTH, self::FADE_IN, self::FADE_OUT, self::CUE_IN, self::CUE_OUT, self::MEDIA_ITEM_PLAYED, self::INSTANCE_ID, self::PLAYOUT_STATUS, self::BROADCASTED, self::POSITION, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'STARTS', 'ENDS', 'FILE_ID', 'STREAM_ID', 'CLIP_LENGTH', 'FADE_IN', 'FADE_OUT', 'CUE_IN', 'CUE_OUT', 'MEDIA_ITEM_PLAYED', 'INSTANCE_ID', 'PLAYOUT_STATUS', 'BROADCASTED', 'POSITION', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'starts', 'ends', 'file_id', 'stream_id', 'clip_length', 'fade_in', 'fade_out', 'cue_in', 'cue_out', 'media_item_played', 'instance_id', 'playout_status', 'broadcasted', 'position', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbStarts' => 1, 'DbEnds' => 2, 'DbFileId' => 3, 'DbStreamId' => 4, 'DbClipLength' => 5, 'DbFadeIn' => 6, 'DbFadeOut' => 7, 'DbCueIn' => 8, 'DbCueOut' => 9, 'DbMediaItemPlayed' => 10, 'DbInstanceId' => 11, 'DbPlayoutStatus' => 12, 'DbBroadcasted' => 13, 'DbPosition' => 14, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbStarts' => 1, 'dbEnds' => 2, 'dbFileId' => 3, 'dbStreamId' => 4, 'dbClipLength' => 5, 'dbFadeIn' => 6, 'dbFadeOut' => 7, 'dbCueIn' => 8, 'dbCueOut' => 9, 'dbMediaItemPlayed' => 10, 'dbInstanceId' => 11, 'dbPlayoutStatus' => 12, 'dbBroadcasted' => 13, 'dbPosition' => 14, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::STARTS => 1, self::ENDS => 2, self::FILE_ID => 3, self::STREAM_ID => 4, self::CLIP_LENGTH => 5, self::FADE_IN => 6, self::FADE_OUT => 7, self::CUE_IN => 8, self::CUE_OUT => 9, self::MEDIA_ITEM_PLAYED => 10, self::INSTANCE_ID => 11, self::PLAYOUT_STATUS => 12, self::BROADCASTED => 13, self::POSITION => 14, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'STARTS' => 1, 'ENDS' => 2, 'FILE_ID' => 3, 'STREAM_ID' => 4, 'CLIP_LENGTH' => 5, 'FADE_IN' => 6, 'FADE_OUT' => 7, 'CUE_IN' => 8, 'CUE_OUT' => 9, 'MEDIA_ITEM_PLAYED' => 10, 'INSTANCE_ID' => 11, 'PLAYOUT_STATUS' => 12, 'BROADCASTED' => 13, 'POSITION' => 14, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'starts' => 1, 'ends' => 2, 'file_id' => 3, 'stream_id' => 4, 'clip_length' => 5, 'fade_in' => 6, 'fade_out' => 7, 'cue_in' => 8, 'cue_out' => 9, 'media_item_played' => 10, 'instance_id' => 11, 'playout_status' => 12, 'broadcasted' => 13, 'position' => 14, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcSchedulePeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcSchedulePeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcSchedulePeer::ID); - $criteria->addSelectColumn(CcSchedulePeer::STARTS); - $criteria->addSelectColumn(CcSchedulePeer::ENDS); - $criteria->addSelectColumn(CcSchedulePeer::FILE_ID); - $criteria->addSelectColumn(CcSchedulePeer::STREAM_ID); - $criteria->addSelectColumn(CcSchedulePeer::CLIP_LENGTH); - $criteria->addSelectColumn(CcSchedulePeer::FADE_IN); - $criteria->addSelectColumn(CcSchedulePeer::FADE_OUT); - $criteria->addSelectColumn(CcSchedulePeer::CUE_IN); - $criteria->addSelectColumn(CcSchedulePeer::CUE_OUT); - $criteria->addSelectColumn(CcSchedulePeer::MEDIA_ITEM_PLAYED); - $criteria->addSelectColumn(CcSchedulePeer::INSTANCE_ID); - $criteria->addSelectColumn(CcSchedulePeer::PLAYOUT_STATUS); - $criteria->addSelectColumn(CcSchedulePeer::BROADCASTED); - $criteria->addSelectColumn(CcSchedulePeer::POSITION); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.STARTS'); - $criteria->addSelectColumn($alias . '.ENDS'); - $criteria->addSelectColumn($alias . '.FILE_ID'); - $criteria->addSelectColumn($alias . '.STREAM_ID'); - $criteria->addSelectColumn($alias . '.CLIP_LENGTH'); - $criteria->addSelectColumn($alias . '.FADE_IN'); - $criteria->addSelectColumn($alias . '.FADE_OUT'); - $criteria->addSelectColumn($alias . '.CUE_IN'); - $criteria->addSelectColumn($alias . '.CUE_OUT'); - $criteria->addSelectColumn($alias . '.MEDIA_ITEM_PLAYED'); - $criteria->addSelectColumn($alias . '.INSTANCE_ID'); - $criteria->addSelectColumn($alias . '.PLAYOUT_STATUS'); - $criteria->addSelectColumn($alias . '.BROADCASTED'); - $criteria->addSelectColumn($alias . '.POSITION'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSchedulePeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcSchedule - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcSchedulePeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcSchedulePeer::populateObjects(CcSchedulePeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcSchedulePeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcSchedule $value A CcSchedule object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcSchedule $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcSchedule object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcSchedule) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcSchedule object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcSchedule Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_schedule - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - // Invalidate objects in CcWebstreamMetadataPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcWebstreamMetadataPeer::clearInstancePool(); - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcSchedulePeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcSchedulePeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcSchedulePeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcSchedule object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcSchedulePeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcSchedulePeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcSchedulePeer::NUM_COLUMNS; - } else { - $cls = CcSchedulePeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcSchedulePeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcShowInstances table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcShowInstances(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSchedulePeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcFiles table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSchedulePeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcWebstream table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcWebstream(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSchedulePeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcSchedule objects pre-filled with their CcShowInstances objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcSchedule objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcShowInstances(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcSchedulePeer::addSelectColumns($criteria); - $startcol = (CcSchedulePeer::NUM_COLUMNS - CcSchedulePeer::NUM_LAZY_LOAD_COLUMNS); - CcShowInstancesPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcSchedulePeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcSchedulePeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcShowInstancesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowInstancesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcShowInstancesPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcSchedule) to $obj2 (CcShowInstances) - $obj2->addCcSchedule($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcSchedule objects pre-filled with their CcFiles objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcSchedule objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcSchedulePeer::addSelectColumns($criteria); - $startcol = (CcSchedulePeer::NUM_COLUMNS - CcSchedulePeer::NUM_LAZY_LOAD_COLUMNS); - CcFilesPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcSchedulePeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcSchedulePeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcSchedule) to $obj2 (CcFiles) - $obj2->addCcSchedule($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcSchedule objects pre-filled with their CcWebstream objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcSchedule objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcWebstream(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcSchedulePeer::addSelectColumns($criteria); - $startcol = (CcSchedulePeer::NUM_COLUMNS - CcSchedulePeer::NUM_LAZY_LOAD_COLUMNS); - CcWebstreamPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcSchedulePeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcSchedulePeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcWebstreamPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcWebstreamPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcWebstreamPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcWebstreamPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcSchedule) to $obj2 (CcWebstream) - $obj2->addCcSchedule($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSchedulePeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcSchedule objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcSchedule objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcSchedulePeer::addSelectColumns($criteria); - $startcol2 = (CcSchedulePeer::NUM_COLUMNS - CcSchedulePeer::NUM_LAZY_LOAD_COLUMNS); - - CcShowInstancesPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcShowInstancesPeer::NUM_COLUMNS - CcShowInstancesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcFilesPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcWebstreamPeer::addSelectColumns($criteria); - $startcol5 = $startcol4 + (CcWebstreamPeer::NUM_COLUMNS - CcWebstreamPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcSchedulePeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcSchedulePeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcShowInstances rows - - $key2 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcShowInstancesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowInstancesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcShowInstancesPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcSchedule) to the collection in $obj2 (CcShowInstances) - $obj2->addCcSchedule($obj1); - } // if joined row not null - - // Add objects for joined CcFiles rows - - $key3 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcFilesPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcFilesPeer::addInstanceToPool($obj3, $key3); - } // if obj3 loaded - - // Add the $obj1 (CcSchedule) to the collection in $obj3 (CcFiles) - $obj3->addCcSchedule($obj1); - } // if joined row not null - - // Add objects for joined CcWebstream rows - - $key4 = CcWebstreamPeer::getPrimaryKeyHashFromRow($row, $startcol4); - if ($key4 !== null) { - $obj4 = CcWebstreamPeer::getInstanceFromPool($key4); - if (!$obj4) { - - $cls = CcWebstreamPeer::getOMClass(false); - - $obj4 = new $cls(); - $obj4->hydrate($row, $startcol4); - CcWebstreamPeer::addInstanceToPool($obj4, $key4); - } // if obj4 loaded - - // Add the $obj1 (CcSchedule) to the collection in $obj4 (CcWebstream) - $obj4->addCcSchedule($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcShowInstances table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcShowInstances(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSchedulePeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcFiles table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSchedulePeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcWebstream table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcWebstream(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSchedulePeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcSchedule objects pre-filled with all related objects except CcShowInstances. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcSchedule objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcShowInstances(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcSchedulePeer::addSelectColumns($criteria); - $startcol2 = (CcSchedulePeer::NUM_COLUMNS - CcSchedulePeer::NUM_LAZY_LOAD_COLUMNS); - - CcFilesPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcWebstreamPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcWebstreamPeer::NUM_COLUMNS - CcWebstreamPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcSchedulePeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcSchedulePeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcFiles rows - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcSchedule) to the collection in $obj2 (CcFiles) - $obj2->addCcSchedule($obj1); - - } // if joined row is not null - - // Add objects for joined CcWebstream rows - - $key3 = CcWebstreamPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcWebstreamPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcWebstreamPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcWebstreamPeer::addInstanceToPool($obj3, $key3); - } // if $obj3 already loaded - - // Add the $obj1 (CcSchedule) to the collection in $obj3 (CcWebstream) - $obj3->addCcSchedule($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcSchedule objects pre-filled with all related objects except CcFiles. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcSchedule objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcSchedulePeer::addSelectColumns($criteria); - $startcol2 = (CcSchedulePeer::NUM_COLUMNS - CcSchedulePeer::NUM_LAZY_LOAD_COLUMNS); - - CcShowInstancesPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcShowInstancesPeer::NUM_COLUMNS - CcShowInstancesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcWebstreamPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcWebstreamPeer::NUM_COLUMNS - CcWebstreamPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - $criteria->addJoin(CcSchedulePeer::STREAM_ID, CcWebstreamPeer::ID, $join_behavior); + CcShowInstancesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcShowInstancesPeer::NUM_HYDRATE_COLUMNS; + CcFilesPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcSchedulePeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcSchedulePeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcShowInstances rows - - $key2 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcShowInstancesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowInstancesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcShowInstancesPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcSchedule) to the collection in $obj2 (CcShowInstances) - $obj2->addCcSchedule($obj1); - - } // if joined row is not null - - // Add objects for joined CcWebstream rows - - $key3 = CcWebstreamPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcWebstreamPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcWebstreamPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcWebstreamPeer::addInstanceToPool($obj3, $key3); - } // if $obj3 already loaded - - // Add the $obj1 (CcSchedule) to the collection in $obj3 (CcWebstream) - $obj3->addCcSchedule($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcSchedule objects pre-filled with all related objects except CcWebstream. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcSchedule objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcWebstream(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcSchedulePeer::addSelectColumns($criteria); - $startcol2 = (CcSchedulePeer::NUM_COLUMNS - CcSchedulePeer::NUM_LAZY_LOAD_COLUMNS); - - CcShowInstancesPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcShowInstancesPeer::NUM_COLUMNS - CcShowInstancesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcFilesPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcSchedulePeer::INSTANCE_ID, CcShowInstancesPeer::ID, $join_behavior); - - $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcSchedulePeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcSchedulePeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcShowInstances rows - - $key2 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcShowInstancesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowInstancesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcShowInstancesPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcSchedule) to the collection in $obj2 (CcShowInstances) - $obj2->addCcSchedule($obj1); - - } // if joined row is not null - - // Add objects for joined CcFiles rows - - $key3 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcFilesPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcFilesPeer::addInstanceToPool($obj3, $key3); - } // if $obj3 already loaded - - // Add the $obj1 (CcSchedule) to the collection in $obj3 (CcFiles) - $obj3->addCcSchedule($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcSchedulePeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcSchedulePeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcScheduleTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcSchedulePeer::CLASS_DEFAULT : CcSchedulePeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcSchedule or Criteria object. - * - * @param mixed $values Criteria or CcSchedule object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcSchedule object - } - - if ($criteria->containsKey(CcSchedulePeer::ID) && $criteria->keyContainsValue(CcSchedulePeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcSchedulePeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcSchedule or Criteria object. - * - * @param mixed $values Criteria or CcSchedule object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcSchedulePeer::ID); - $value = $criteria->remove(CcSchedulePeer::ID); - if ($value) { - $selectCriteria->add(CcSchedulePeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); - } - - } else { // $values is CcSchedule object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_schedule table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcSchedulePeer::TABLE_NAME, $con, CcSchedulePeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcSchedulePeer::clearInstancePool(); - CcSchedulePeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcSchedule or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcSchedule object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcSchedulePeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcSchedule) { // it's a model object - // invalidate the cache for this single object - CcSchedulePeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcSchedulePeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcSchedulePeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcSchedulePeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcSchedule object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcSchedule $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcSchedule $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcSchedulePeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcSchedulePeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcSchedulePeer::DATABASE_NAME, CcSchedulePeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcSchedule - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcSchedulePeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcSchedulePeer::DATABASE_NAME); - $criteria->add(CcSchedulePeer::ID, $pk); - - $v = CcSchedulePeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcSchedulePeer::DATABASE_NAME); - $criteria->add(CcSchedulePeer::ID, $pks, Criteria::IN); - $objs = CcSchedulePeer::doSelect($criteria, $con); - } - return $objs; - } + $criteria->addJoin(CcSchedulePeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcSchedulePeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcSchedulePeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcSchedulePeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcShowInstances rows + + $key2 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcShowInstancesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowInstancesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcShowInstancesPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcSchedule) to the collection in $obj2 (CcShowInstances) + $obj2->addCcSchedule($obj1); + + } // if joined row is not null + + // Add objects for joined CcFiles rows + + $key3 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcFilesPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcFilesPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcFilesPeer::addInstanceToPool($obj3, $key3); + } // if $obj3 already loaded + + // Add the $obj1 (CcSchedule) to the collection in $obj3 (CcFiles) + $obj3->addCcSchedule($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcSchedulePeer::DATABASE_NAME)->getTable(CcSchedulePeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcSchedulePeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcSchedulePeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcScheduleTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcSchedulePeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcSchedule or Criteria object. + * + * @param mixed $values Criteria or CcSchedule object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcSchedule object + } + + if ($criteria->containsKey(CcSchedulePeer::ID) && $criteria->keyContainsValue(CcSchedulePeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcSchedulePeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcSchedule or Criteria object. + * + * @param mixed $values Criteria or CcSchedule object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcSchedulePeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcSchedulePeer::ID); + $value = $criteria->remove(CcSchedulePeer::ID); + if ($value) { + $selectCriteria->add(CcSchedulePeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcSchedulePeer::TABLE_NAME); + } + + } else { // $values is CcSchedule object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_schedule table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcSchedulePeer::TABLE_NAME, $con, CcSchedulePeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcSchedulePeer::clearInstancePool(); + CcSchedulePeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcSchedule or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcSchedule object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcSchedulePeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcSchedule) { // it's a model object + // invalidate the cache for this single object + CcSchedulePeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcSchedulePeer::DATABASE_NAME); + $criteria->add(CcSchedulePeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcSchedulePeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcSchedulePeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcSchedulePeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcSchedule object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcSchedule $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcSchedulePeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcSchedulePeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcSchedulePeer::DATABASE_NAME, CcSchedulePeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcSchedule + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcSchedulePeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcSchedulePeer::DATABASE_NAME); + $criteria->add(CcSchedulePeer::ID, $pk); + + $v = CcSchedulePeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcSchedule[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcSchedulePeer::DATABASE_NAME); + $criteria->add(CcSchedulePeer::ID, $pks, Criteria::IN); + $objs = CcSchedulePeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcSchedulePeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcScheduleQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcScheduleQuery.php index 45448d5108..a7f4ea02a7 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcScheduleQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcScheduleQuery.php @@ -4,883 +4,1191 @@ /** * Base class that represents a query for the 'cc_schedule' table. * - * * - * @method CcScheduleQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcScheduleQuery orderByDbStarts($order = Criteria::ASC) Order by the starts column - * @method CcScheduleQuery orderByDbEnds($order = Criteria::ASC) Order by the ends column - * @method CcScheduleQuery orderByDbFileId($order = Criteria::ASC) Order by the file_id column - * @method CcScheduleQuery orderByDbStreamId($order = Criteria::ASC) Order by the stream_id column - * @method CcScheduleQuery orderByDbClipLength($order = Criteria::ASC) Order by the clip_length column - * @method CcScheduleQuery orderByDbFadeIn($order = Criteria::ASC) Order by the fade_in column - * @method CcScheduleQuery orderByDbFadeOut($order = Criteria::ASC) Order by the fade_out column - * @method CcScheduleQuery orderByDbCueIn($order = Criteria::ASC) Order by the cue_in column - * @method CcScheduleQuery orderByDbCueOut($order = Criteria::ASC) Order by the cue_out column - * @method CcScheduleQuery orderByDbMediaItemPlayed($order = Criteria::ASC) Order by the media_item_played column - * @method CcScheduleQuery orderByDbInstanceId($order = Criteria::ASC) Order by the instance_id column - * @method CcScheduleQuery orderByDbPlayoutStatus($order = Criteria::ASC) Order by the playout_status column - * @method CcScheduleQuery orderByDbBroadcasted($order = Criteria::ASC) Order by the broadcasted column - * @method CcScheduleQuery orderByDbPosition($order = Criteria::ASC) Order by the position column * - * @method CcScheduleQuery groupByDbId() Group by the id column - * @method CcScheduleQuery groupByDbStarts() Group by the starts column - * @method CcScheduleQuery groupByDbEnds() Group by the ends column - * @method CcScheduleQuery groupByDbFileId() Group by the file_id column - * @method CcScheduleQuery groupByDbStreamId() Group by the stream_id column - * @method CcScheduleQuery groupByDbClipLength() Group by the clip_length column - * @method CcScheduleQuery groupByDbFadeIn() Group by the fade_in column - * @method CcScheduleQuery groupByDbFadeOut() Group by the fade_out column - * @method CcScheduleQuery groupByDbCueIn() Group by the cue_in column - * @method CcScheduleQuery groupByDbCueOut() Group by the cue_out column - * @method CcScheduleQuery groupByDbMediaItemPlayed() Group by the media_item_played column - * @method CcScheduleQuery groupByDbInstanceId() Group by the instance_id column - * @method CcScheduleQuery groupByDbPlayoutStatus() Group by the playout_status column - * @method CcScheduleQuery groupByDbBroadcasted() Group by the broadcasted column - * @method CcScheduleQuery groupByDbPosition() Group by the position column + * @method CcScheduleQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcScheduleQuery orderByDbStarts($order = Criteria::ASC) Order by the starts column + * @method CcScheduleQuery orderByDbEnds($order = Criteria::ASC) Order by the ends column + * @method CcScheduleQuery orderByDbFileId($order = Criteria::ASC) Order by the file_id column + * @method CcScheduleQuery orderByDbStreamId($order = Criteria::ASC) Order by the stream_id column + * @method CcScheduleQuery orderByDbClipLength($order = Criteria::ASC) Order by the clip_length column + * @method CcScheduleQuery orderByDbFadeIn($order = Criteria::ASC) Order by the fade_in column + * @method CcScheduleQuery orderByDbFadeOut($order = Criteria::ASC) Order by the fade_out column + * @method CcScheduleQuery orderByDbCueIn($order = Criteria::ASC) Order by the cue_in column + * @method CcScheduleQuery orderByDbCueOut($order = Criteria::ASC) Order by the cue_out column + * @method CcScheduleQuery orderByDbMediaItemPlayed($order = Criteria::ASC) Order by the media_item_played column + * @method CcScheduleQuery orderByDbInstanceId($order = Criteria::ASC) Order by the instance_id column + * @method CcScheduleQuery orderByDbPlayoutStatus($order = Criteria::ASC) Order by the playout_status column + * @method CcScheduleQuery orderByDbBroadcasted($order = Criteria::ASC) Order by the broadcasted column + * @method CcScheduleQuery orderByDbPosition($order = Criteria::ASC) Order by the position column * - * @method CcScheduleQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcScheduleQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcScheduleQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcScheduleQuery groupByDbId() Group by the id column + * @method CcScheduleQuery groupByDbStarts() Group by the starts column + * @method CcScheduleQuery groupByDbEnds() Group by the ends column + * @method CcScheduleQuery groupByDbFileId() Group by the file_id column + * @method CcScheduleQuery groupByDbStreamId() Group by the stream_id column + * @method CcScheduleQuery groupByDbClipLength() Group by the clip_length column + * @method CcScheduleQuery groupByDbFadeIn() Group by the fade_in column + * @method CcScheduleQuery groupByDbFadeOut() Group by the fade_out column + * @method CcScheduleQuery groupByDbCueIn() Group by the cue_in column + * @method CcScheduleQuery groupByDbCueOut() Group by the cue_out column + * @method CcScheduleQuery groupByDbMediaItemPlayed() Group by the media_item_played column + * @method CcScheduleQuery groupByDbInstanceId() Group by the instance_id column + * @method CcScheduleQuery groupByDbPlayoutStatus() Group by the playout_status column + * @method CcScheduleQuery groupByDbBroadcasted() Group by the broadcasted column + * @method CcScheduleQuery groupByDbPosition() Group by the position column * - * @method CcScheduleQuery leftJoinCcShowInstances($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShowInstances relation - * @method CcScheduleQuery rightJoinCcShowInstances($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShowInstances relation - * @method CcScheduleQuery innerJoinCcShowInstances($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShowInstances relation + * @method CcScheduleQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcScheduleQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcScheduleQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcScheduleQuery leftJoinCcFiles($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcFiles relation - * @method CcScheduleQuery rightJoinCcFiles($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcFiles relation - * @method CcScheduleQuery innerJoinCcFiles($relationAlias = '') Adds a INNER JOIN clause to the query using the CcFiles relation + * @method CcScheduleQuery leftJoinCcShowInstances($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShowInstances relation + * @method CcScheduleQuery rightJoinCcShowInstances($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShowInstances relation + * @method CcScheduleQuery innerJoinCcShowInstances($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShowInstances relation * - * @method CcScheduleQuery leftJoinCcWebstream($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcWebstream relation - * @method CcScheduleQuery rightJoinCcWebstream($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcWebstream relation - * @method CcScheduleQuery innerJoinCcWebstream($relationAlias = '') Adds a INNER JOIN clause to the query using the CcWebstream relation + * @method CcScheduleQuery leftJoinCcFiles($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcFiles relation + * @method CcScheduleQuery rightJoinCcFiles($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcFiles relation + * @method CcScheduleQuery innerJoinCcFiles($relationAlias = null) Adds a INNER JOIN clause to the query using the CcFiles relation * - * @method CcScheduleQuery leftJoinCcWebstreamMetadata($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcWebstreamMetadata relation - * @method CcScheduleQuery rightJoinCcWebstreamMetadata($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcWebstreamMetadata relation - * @method CcScheduleQuery innerJoinCcWebstreamMetadata($relationAlias = '') Adds a INNER JOIN clause to the query using the CcWebstreamMetadata relation + * @method CcScheduleQuery leftJoinCcWebstream($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcWebstream relation + * @method CcScheduleQuery rightJoinCcWebstream($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcWebstream relation + * @method CcScheduleQuery innerJoinCcWebstream($relationAlias = null) Adds a INNER JOIN clause to the query using the CcWebstream relation * - * @method CcSchedule findOne(PropelPDO $con = null) Return the first CcSchedule matching the query - * @method CcSchedule findOneOrCreate(PropelPDO $con = null) Return the first CcSchedule matching the query, or a new CcSchedule object populated from the query conditions when no match is found + * @method CcScheduleQuery leftJoinCcWebstreamMetadata($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcWebstreamMetadata relation + * @method CcScheduleQuery rightJoinCcWebstreamMetadata($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcWebstreamMetadata relation + * @method CcScheduleQuery innerJoinCcWebstreamMetadata($relationAlias = null) Adds a INNER JOIN clause to the query using the CcWebstreamMetadata relation * - * @method CcSchedule findOneByDbId(int $id) Return the first CcSchedule filtered by the id column - * @method CcSchedule findOneByDbStarts(string $starts) Return the first CcSchedule filtered by the starts column - * @method CcSchedule findOneByDbEnds(string $ends) Return the first CcSchedule filtered by the ends column - * @method CcSchedule findOneByDbFileId(int $file_id) Return the first CcSchedule filtered by the file_id column - * @method CcSchedule findOneByDbStreamId(int $stream_id) Return the first CcSchedule filtered by the stream_id column - * @method CcSchedule findOneByDbClipLength(string $clip_length) Return the first CcSchedule filtered by the clip_length column - * @method CcSchedule findOneByDbFadeIn(string $fade_in) Return the first CcSchedule filtered by the fade_in column - * @method CcSchedule findOneByDbFadeOut(string $fade_out) Return the first CcSchedule filtered by the fade_out column - * @method CcSchedule findOneByDbCueIn(string $cue_in) Return the first CcSchedule filtered by the cue_in column - * @method CcSchedule findOneByDbCueOut(string $cue_out) Return the first CcSchedule filtered by the cue_out column - * @method CcSchedule findOneByDbMediaItemPlayed(boolean $media_item_played) Return the first CcSchedule filtered by the media_item_played column - * @method CcSchedule findOneByDbInstanceId(int $instance_id) Return the first CcSchedule filtered by the instance_id column - * @method CcSchedule findOneByDbPlayoutStatus(int $playout_status) Return the first CcSchedule filtered by the playout_status column - * @method CcSchedule findOneByDbBroadcasted(int $broadcasted) Return the first CcSchedule filtered by the broadcasted column - * @method CcSchedule findOneByDbPosition(int $position) Return the first CcSchedule filtered by the position column + * @method CcSchedule findOne(PropelPDO $con = null) Return the first CcSchedule matching the query + * @method CcSchedule findOneOrCreate(PropelPDO $con = null) Return the first CcSchedule matching the query, or a new CcSchedule object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcSchedule objects filtered by the id column - * @method array findByDbStarts(string $starts) Return CcSchedule objects filtered by the starts column - * @method array findByDbEnds(string $ends) Return CcSchedule objects filtered by the ends column - * @method array findByDbFileId(int $file_id) Return CcSchedule objects filtered by the file_id column - * @method array findByDbStreamId(int $stream_id) Return CcSchedule objects filtered by the stream_id column - * @method array findByDbClipLength(string $clip_length) Return CcSchedule objects filtered by the clip_length column - * @method array findByDbFadeIn(string $fade_in) Return CcSchedule objects filtered by the fade_in column - * @method array findByDbFadeOut(string $fade_out) Return CcSchedule objects filtered by the fade_out column - * @method array findByDbCueIn(string $cue_in) Return CcSchedule objects filtered by the cue_in column - * @method array findByDbCueOut(string $cue_out) Return CcSchedule objects filtered by the cue_out column - * @method array findByDbMediaItemPlayed(boolean $media_item_played) Return CcSchedule objects filtered by the media_item_played column - * @method array findByDbInstanceId(int $instance_id) Return CcSchedule objects filtered by the instance_id column - * @method array findByDbPlayoutStatus(int $playout_status) Return CcSchedule objects filtered by the playout_status column - * @method array findByDbBroadcasted(int $broadcasted) Return CcSchedule objects filtered by the broadcasted column - * @method array findByDbPosition(int $position) Return CcSchedule objects filtered by the position column + * @method CcSchedule findOneByDbStarts(string $starts) Return the first CcSchedule filtered by the starts column + * @method CcSchedule findOneByDbEnds(string $ends) Return the first CcSchedule filtered by the ends column + * @method CcSchedule findOneByDbFileId(int $file_id) Return the first CcSchedule filtered by the file_id column + * @method CcSchedule findOneByDbStreamId(int $stream_id) Return the first CcSchedule filtered by the stream_id column + * @method CcSchedule findOneByDbClipLength(string $clip_length) Return the first CcSchedule filtered by the clip_length column + * @method CcSchedule findOneByDbFadeIn(string $fade_in) Return the first CcSchedule filtered by the fade_in column + * @method CcSchedule findOneByDbFadeOut(string $fade_out) Return the first CcSchedule filtered by the fade_out column + * @method CcSchedule findOneByDbCueIn(string $cue_in) Return the first CcSchedule filtered by the cue_in column + * @method CcSchedule findOneByDbCueOut(string $cue_out) Return the first CcSchedule filtered by the cue_out column + * @method CcSchedule findOneByDbMediaItemPlayed(boolean $media_item_played) Return the first CcSchedule filtered by the media_item_played column + * @method CcSchedule findOneByDbInstanceId(int $instance_id) Return the first CcSchedule filtered by the instance_id column + * @method CcSchedule findOneByDbPlayoutStatus(int $playout_status) Return the first CcSchedule filtered by the playout_status column + * @method CcSchedule findOneByDbBroadcasted(int $broadcasted) Return the first CcSchedule filtered by the broadcasted column + * @method CcSchedule findOneByDbPosition(int $position) Return the first CcSchedule filtered by the position column + * + * @method array findByDbId(int $id) Return CcSchedule objects filtered by the id column + * @method array findByDbStarts(string $starts) Return CcSchedule objects filtered by the starts column + * @method array findByDbEnds(string $ends) Return CcSchedule objects filtered by the ends column + * @method array findByDbFileId(int $file_id) Return CcSchedule objects filtered by the file_id column + * @method array findByDbStreamId(int $stream_id) Return CcSchedule objects filtered by the stream_id column + * @method array findByDbClipLength(string $clip_length) Return CcSchedule objects filtered by the clip_length column + * @method array findByDbFadeIn(string $fade_in) Return CcSchedule objects filtered by the fade_in column + * @method array findByDbFadeOut(string $fade_out) Return CcSchedule objects filtered by the fade_out column + * @method array findByDbCueIn(string $cue_in) Return CcSchedule objects filtered by the cue_in column + * @method array findByDbCueOut(string $cue_out) Return CcSchedule objects filtered by the cue_out column + * @method array findByDbMediaItemPlayed(boolean $media_item_played) Return CcSchedule objects filtered by the media_item_played column + * @method array findByDbInstanceId(int $instance_id) Return CcSchedule objects filtered by the instance_id column + * @method array findByDbPlayoutStatus(int $playout_status) Return CcSchedule objects filtered by the playout_status column + * @method array findByDbBroadcasted(int $broadcasted) Return CcSchedule objects filtered by the broadcasted column + * @method array findByDbPosition(int $position) Return CcSchedule objects filtered by the position column * * @package propel.generator.airtime.om */ abstract class BaseCcScheduleQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcScheduleQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcSchedule'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcScheduleQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcScheduleQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcScheduleQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcScheduleQuery) { + return $criteria; + } + $query = new CcScheduleQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcSchedule|CcSchedule[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcSchedulePeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSchedule A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSchedule A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "starts", "ends", "file_id", "stream_id", "clip_length", "fade_in", "fade_out", "cue_in", "cue_out", "media_item_played", "instance_id", "playout_status", "broadcasted", "position" FROM "cc_schedule" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcSchedule(); + $obj->hydrate($row); + CcSchedulePeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSchedule|CcSchedule[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcSchedule[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcSchedulePeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcSchedulePeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcSchedulePeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcSchedulePeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSchedulePeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the starts column + * + * Example usage: + * + * $query->filterByDbStarts('2011-03-14'); // WHERE starts = '2011-03-14' + * $query->filterByDbStarts('now'); // WHERE starts = '2011-03-14' + * $query->filterByDbStarts(array('max' => 'yesterday')); // WHERE starts < '2011-03-13' + * + * + * @param mixed $dbStarts The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbStarts($dbStarts = null, $comparison = null) + { + if (is_array($dbStarts)) { + $useMinMax = false; + if (isset($dbStarts['min'])) { + $this->addUsingAlias(CcSchedulePeer::STARTS, $dbStarts['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbStarts['max'])) { + $this->addUsingAlias(CcSchedulePeer::STARTS, $dbStarts['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSchedulePeer::STARTS, $dbStarts, $comparison); + } + + /** + * Filter the query on the ends column + * + * Example usage: + * + * $query->filterByDbEnds('2011-03-14'); // WHERE ends = '2011-03-14' + * $query->filterByDbEnds('now'); // WHERE ends = '2011-03-14' + * $query->filterByDbEnds(array('max' => 'yesterday')); // WHERE ends < '2011-03-13' + * + * + * @param mixed $dbEnds The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbEnds($dbEnds = null, $comparison = null) + { + if (is_array($dbEnds)) { + $useMinMax = false; + if (isset($dbEnds['min'])) { + $this->addUsingAlias(CcSchedulePeer::ENDS, $dbEnds['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbEnds['max'])) { + $this->addUsingAlias(CcSchedulePeer::ENDS, $dbEnds['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSchedulePeer::ENDS, $dbEnds, $comparison); + } + + /** + * Filter the query on the file_id column + * + * Example usage: + * + * $query->filterByDbFileId(1234); // WHERE file_id = 1234 + * $query->filterByDbFileId(array(12, 34)); // WHERE file_id IN (12, 34) + * $query->filterByDbFileId(array('min' => 12)); // WHERE file_id >= 12 + * $query->filterByDbFileId(array('max' => 12)); // WHERE file_id <= 12 + * + * + * @see filterByCcFiles() + * + * @param mixed $dbFileId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbFileId($dbFileId = null, $comparison = null) + { + if (is_array($dbFileId)) { + $useMinMax = false; + if (isset($dbFileId['min'])) { + $this->addUsingAlias(CcSchedulePeer::FILE_ID, $dbFileId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbFileId['max'])) { + $this->addUsingAlias(CcSchedulePeer::FILE_ID, $dbFileId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSchedulePeer::FILE_ID, $dbFileId, $comparison); + } + + /** + * Filter the query on the stream_id column + * + * Example usage: + * + * $query->filterByDbStreamId(1234); // WHERE stream_id = 1234 + * $query->filterByDbStreamId(array(12, 34)); // WHERE stream_id IN (12, 34) + * $query->filterByDbStreamId(array('min' => 12)); // WHERE stream_id >= 12 + * $query->filterByDbStreamId(array('max' => 12)); // WHERE stream_id <= 12 + * + * + * @see filterByCcWebstream() + * + * @param mixed $dbStreamId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbStreamId($dbStreamId = null, $comparison = null) + { + if (is_array($dbStreamId)) { + $useMinMax = false; + if (isset($dbStreamId['min'])) { + $this->addUsingAlias(CcSchedulePeer::STREAM_ID, $dbStreamId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbStreamId['max'])) { + $this->addUsingAlias(CcSchedulePeer::STREAM_ID, $dbStreamId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSchedulePeer::STREAM_ID, $dbStreamId, $comparison); + } + + /** + * Filter the query on the clip_length column + * + * Example usage: + * + * $query->filterByDbClipLength('fooValue'); // WHERE clip_length = 'fooValue' + * $query->filterByDbClipLength('%fooValue%'); // WHERE clip_length LIKE '%fooValue%' + * + * + * @param string $dbClipLength The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbClipLength($dbClipLength = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbClipLength)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbClipLength)) { + $dbClipLength = str_replace('*', '%', $dbClipLength); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSchedulePeer::CLIP_LENGTH, $dbClipLength, $comparison); + } + + /** + * Filter the query on the fade_in column + * + * Example usage: + * + * $query->filterByDbFadeIn('2011-03-14'); // WHERE fade_in = '2011-03-14' + * $query->filterByDbFadeIn('now'); // WHERE fade_in = '2011-03-14' + * $query->filterByDbFadeIn(array('max' => 'yesterday')); // WHERE fade_in < '2011-03-13' + * + * + * @param mixed $dbFadeIn The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbFadeIn($dbFadeIn = null, $comparison = null) + { + if (is_array($dbFadeIn)) { + $useMinMax = false; + if (isset($dbFadeIn['min'])) { + $this->addUsingAlias(CcSchedulePeer::FADE_IN, $dbFadeIn['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbFadeIn['max'])) { + $this->addUsingAlias(CcSchedulePeer::FADE_IN, $dbFadeIn['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSchedulePeer::FADE_IN, $dbFadeIn, $comparison); + } + + /** + * Filter the query on the fade_out column + * + * Example usage: + * + * $query->filterByDbFadeOut('2011-03-14'); // WHERE fade_out = '2011-03-14' + * $query->filterByDbFadeOut('now'); // WHERE fade_out = '2011-03-14' + * $query->filterByDbFadeOut(array('max' => 'yesterday')); // WHERE fade_out < '2011-03-13' + * + * + * @param mixed $dbFadeOut The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbFadeOut($dbFadeOut = null, $comparison = null) + { + if (is_array($dbFadeOut)) { + $useMinMax = false; + if (isset($dbFadeOut['min'])) { + $this->addUsingAlias(CcSchedulePeer::FADE_OUT, $dbFadeOut['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbFadeOut['max'])) { + $this->addUsingAlias(CcSchedulePeer::FADE_OUT, $dbFadeOut['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSchedulePeer::FADE_OUT, $dbFadeOut, $comparison); + } + + /** + * Filter the query on the cue_in column + * + * Example usage: + * + * $query->filterByDbCueIn('fooValue'); // WHERE cue_in = 'fooValue' + * $query->filterByDbCueIn('%fooValue%'); // WHERE cue_in LIKE '%fooValue%' + * + * + * @param string $dbCueIn The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbCueIn($dbCueIn = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCueIn)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCueIn)) { + $dbCueIn = str_replace('*', '%', $dbCueIn); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSchedulePeer::CUE_IN, $dbCueIn, $comparison); + } + + /** + * Filter the query on the cue_out column + * + * Example usage: + * + * $query->filterByDbCueOut('fooValue'); // WHERE cue_out = 'fooValue' + * $query->filterByDbCueOut('%fooValue%'); // WHERE cue_out LIKE '%fooValue%' + * + * + * @param string $dbCueOut The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbCueOut($dbCueOut = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCueOut)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCueOut)) { + $dbCueOut = str_replace('*', '%', $dbCueOut); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSchedulePeer::CUE_OUT, $dbCueOut, $comparison); + } + + /** + * Filter the query on the media_item_played column + * + * Example usage: + * + * $query->filterByDbMediaItemPlayed(true); // WHERE media_item_played = true + * $query->filterByDbMediaItemPlayed('yes'); // WHERE media_item_played = true + * + * + * @param boolean|string $dbMediaItemPlayed The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbMediaItemPlayed($dbMediaItemPlayed = null, $comparison = null) + { + if (is_string($dbMediaItemPlayed)) { + $dbMediaItemPlayed = in_array(strtolower($dbMediaItemPlayed), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcSchedulePeer::MEDIA_ITEM_PLAYED, $dbMediaItemPlayed, $comparison); + } + + /** + * Filter the query on the instance_id column + * + * Example usage: + * + * $query->filterByDbInstanceId(1234); // WHERE instance_id = 1234 + * $query->filterByDbInstanceId(array(12, 34)); // WHERE instance_id IN (12, 34) + * $query->filterByDbInstanceId(array('min' => 12)); // WHERE instance_id >= 12 + * $query->filterByDbInstanceId(array('max' => 12)); // WHERE instance_id <= 12 + * + * + * @see filterByCcShowInstances() + * + * @param mixed $dbInstanceId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbInstanceId($dbInstanceId = null, $comparison = null) + { + if (is_array($dbInstanceId)) { + $useMinMax = false; + if (isset($dbInstanceId['min'])) { + $this->addUsingAlias(CcSchedulePeer::INSTANCE_ID, $dbInstanceId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbInstanceId['max'])) { + $this->addUsingAlias(CcSchedulePeer::INSTANCE_ID, $dbInstanceId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSchedulePeer::INSTANCE_ID, $dbInstanceId, $comparison); + } + + /** + * Filter the query on the playout_status column + * + * Example usage: + * + * $query->filterByDbPlayoutStatus(1234); // WHERE playout_status = 1234 + * $query->filterByDbPlayoutStatus(array(12, 34)); // WHERE playout_status IN (12, 34) + * $query->filterByDbPlayoutStatus(array('min' => 12)); // WHERE playout_status >= 12 + * $query->filterByDbPlayoutStatus(array('max' => 12)); // WHERE playout_status <= 12 + * + * + * @param mixed $dbPlayoutStatus The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbPlayoutStatus($dbPlayoutStatus = null, $comparison = null) + { + if (is_array($dbPlayoutStatus)) { + $useMinMax = false; + if (isset($dbPlayoutStatus['min'])) { + $this->addUsingAlias(CcSchedulePeer::PLAYOUT_STATUS, $dbPlayoutStatus['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbPlayoutStatus['max'])) { + $this->addUsingAlias(CcSchedulePeer::PLAYOUT_STATUS, $dbPlayoutStatus['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSchedulePeer::PLAYOUT_STATUS, $dbPlayoutStatus, $comparison); + } + + /** + * Filter the query on the broadcasted column + * + * Example usage: + * + * $query->filterByDbBroadcasted(1234); // WHERE broadcasted = 1234 + * $query->filterByDbBroadcasted(array(12, 34)); // WHERE broadcasted IN (12, 34) + * $query->filterByDbBroadcasted(array('min' => 12)); // WHERE broadcasted >= 12 + * $query->filterByDbBroadcasted(array('max' => 12)); // WHERE broadcasted <= 12 + * + * + * @param mixed $dbBroadcasted The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbBroadcasted($dbBroadcasted = null, $comparison = null) + { + if (is_array($dbBroadcasted)) { + $useMinMax = false; + if (isset($dbBroadcasted['min'])) { + $this->addUsingAlias(CcSchedulePeer::BROADCASTED, $dbBroadcasted['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbBroadcasted['max'])) { + $this->addUsingAlias(CcSchedulePeer::BROADCASTED, $dbBroadcasted['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSchedulePeer::BROADCASTED, $dbBroadcasted, $comparison); + } + + /** + * Filter the query on the position column + * + * Example usage: + * + * $query->filterByDbPosition(1234); // WHERE position = 1234 + * $query->filterByDbPosition(array(12, 34)); // WHERE position IN (12, 34) + * $query->filterByDbPosition(array('min' => 12)); // WHERE position >= 12 + * $query->filterByDbPosition(array('max' => 12)); // WHERE position <= 12 + * + * + * @param mixed $dbPosition The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function filterByDbPosition($dbPosition = null, $comparison = null) + { + if (is_array($dbPosition)) { + $useMinMax = false; + if (isset($dbPosition['min'])) { + $this->addUsingAlias(CcSchedulePeer::POSITION, $dbPosition['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbPosition['max'])) { + $this->addUsingAlias(CcSchedulePeer::POSITION, $dbPosition['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSchedulePeer::POSITION, $dbPosition, $comparison); + } + + /** + * Filter the query by a related CcShowInstances object + * + * @param CcShowInstances|PropelObjectCollection $ccShowInstances The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShowInstances($ccShowInstances, $comparison = null) + { + if ($ccShowInstances instanceof CcShowInstances) { + return $this + ->addUsingAlias(CcSchedulePeer::INSTANCE_ID, $ccShowInstances->getDbId(), $comparison); + } elseif ($ccShowInstances instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcSchedulePeer::INSTANCE_ID, $ccShowInstances->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcShowInstances() only accepts arguments of type CcShowInstances or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShowInstances relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function joinCcShowInstances($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShowInstances'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShowInstances'); + } + + return $this; + } + + /** + * Use the CcShowInstances relation CcShowInstances object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowInstancesQuery A secondary query class using the current class as primary query + */ + public function useCcShowInstancesQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcShowInstances($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShowInstances', 'CcShowInstancesQuery'); + } + + /** + * Filter the query by a related CcFiles object + * + * @param CcFiles|PropelObjectCollection $ccFiles The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcFiles($ccFiles, $comparison = null) + { + if ($ccFiles instanceof CcFiles) { + return $this + ->addUsingAlias(CcSchedulePeer::FILE_ID, $ccFiles->getDbId(), $comparison); + } elseif ($ccFiles instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcSchedulePeer::FILE_ID, $ccFiles->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcFiles() only accepts arguments of type CcFiles or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcFiles relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function joinCcFiles($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcFiles'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcFiles'); + } + + return $this; + } + + /** + * Use the CcFiles relation CcFiles object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery A secondary query class using the current class as primary query + */ + public function useCcFilesQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcFiles($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery'); + } + + /** + * Filter the query by a related CcWebstream object + * + * @param CcWebstream|PropelObjectCollection $ccWebstream The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcWebstream($ccWebstream, $comparison = null) + { + if ($ccWebstream instanceof CcWebstream) { + return $this + ->addUsingAlias(CcSchedulePeer::STREAM_ID, $ccWebstream->getDbId(), $comparison); + } elseif ($ccWebstream instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcSchedulePeer::STREAM_ID, $ccWebstream->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcWebstream() only accepts arguments of type CcWebstream or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcWebstream relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function joinCcWebstream($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcWebstream'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcWebstream'); + } + + return $this; + } + + /** + * Use the CcWebstream relation CcWebstream object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcWebstreamQuery A secondary query class using the current class as primary query + */ + public function useCcWebstreamQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcWebstream($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcWebstream', 'CcWebstreamQuery'); + } + + /** + * Filter the query by a related CcWebstreamMetadata object + * + * @param CcWebstreamMetadata|PropelObjectCollection $ccWebstreamMetadata the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcScheduleQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcWebstreamMetadata($ccWebstreamMetadata, $comparison = null) + { + if ($ccWebstreamMetadata instanceof CcWebstreamMetadata) { + return $this + ->addUsingAlias(CcSchedulePeer::ID, $ccWebstreamMetadata->getDbInstanceId(), $comparison); + } elseif ($ccWebstreamMetadata instanceof PropelObjectCollection) { + return $this + ->useCcWebstreamMetadataQuery() + ->filterByPrimaryKeys($ccWebstreamMetadata->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcWebstreamMetadata() only accepts arguments of type CcWebstreamMetadata or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcWebstreamMetadata relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function joinCcWebstreamMetadata($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcWebstreamMetadata'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcWebstreamMetadata'); + } + + return $this; + } + + /** + * Use the CcWebstreamMetadata relation CcWebstreamMetadata object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcWebstreamMetadataQuery A secondary query class using the current class as primary query + */ + public function useCcWebstreamMetadataQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcWebstreamMetadata($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcWebstreamMetadata', 'CcWebstreamMetadataQuery'); + } + + /** + * Exclude object from result + * + * @param CcSchedule $ccSchedule Object to remove from the list of results + * + * @return CcScheduleQuery The current query, for fluid interface + */ + public function prune($ccSchedule = null) + { + if ($ccSchedule) { + $this->addUsingAlias(CcSchedulePeer::ID, $ccSchedule->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcScheduleQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcSchedule', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcScheduleQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcScheduleQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcScheduleQuery) { - return $criteria; - } - $query = new CcScheduleQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcSchedule|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcSchedulePeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcSchedulePeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcSchedulePeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcSchedulePeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the starts column - * - * @param string|array $dbStarts The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbStarts($dbStarts = null, $comparison = null) - { - if (is_array($dbStarts)) { - $useMinMax = false; - if (isset($dbStarts['min'])) { - $this->addUsingAlias(CcSchedulePeer::STARTS, $dbStarts['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbStarts['max'])) { - $this->addUsingAlias(CcSchedulePeer::STARTS, $dbStarts['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSchedulePeer::STARTS, $dbStarts, $comparison); - } - - /** - * Filter the query on the ends column - * - * @param string|array $dbEnds The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbEnds($dbEnds = null, $comparison = null) - { - if (is_array($dbEnds)) { - $useMinMax = false; - if (isset($dbEnds['min'])) { - $this->addUsingAlias(CcSchedulePeer::ENDS, $dbEnds['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbEnds['max'])) { - $this->addUsingAlias(CcSchedulePeer::ENDS, $dbEnds['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSchedulePeer::ENDS, $dbEnds, $comparison); - } - - /** - * Filter the query on the file_id column - * - * @param int|array $dbFileId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbFileId($dbFileId = null, $comparison = null) - { - if (is_array($dbFileId)) { - $useMinMax = false; - if (isset($dbFileId['min'])) { - $this->addUsingAlias(CcSchedulePeer::FILE_ID, $dbFileId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbFileId['max'])) { - $this->addUsingAlias(CcSchedulePeer::FILE_ID, $dbFileId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSchedulePeer::FILE_ID, $dbFileId, $comparison); - } - - /** - * Filter the query on the stream_id column - * - * @param int|array $dbStreamId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbStreamId($dbStreamId = null, $comparison = null) - { - if (is_array($dbStreamId)) { - $useMinMax = false; - if (isset($dbStreamId['min'])) { - $this->addUsingAlias(CcSchedulePeer::STREAM_ID, $dbStreamId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbStreamId['max'])) { - $this->addUsingAlias(CcSchedulePeer::STREAM_ID, $dbStreamId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSchedulePeer::STREAM_ID, $dbStreamId, $comparison); - } - - /** - * Filter the query on the clip_length column - * - * @param string $dbClipLength The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbClipLength($dbClipLength = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbClipLength)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbClipLength)) { - $dbClipLength = str_replace('*', '%', $dbClipLength); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSchedulePeer::CLIP_LENGTH, $dbClipLength, $comparison); - } - - /** - * Filter the query on the fade_in column - * - * @param string|array $dbFadeIn The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbFadeIn($dbFadeIn = null, $comparison = null) - { - if (is_array($dbFadeIn)) { - $useMinMax = false; - if (isset($dbFadeIn['min'])) { - $this->addUsingAlias(CcSchedulePeer::FADE_IN, $dbFadeIn['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbFadeIn['max'])) { - $this->addUsingAlias(CcSchedulePeer::FADE_IN, $dbFadeIn['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSchedulePeer::FADE_IN, $dbFadeIn, $comparison); - } - - /** - * Filter the query on the fade_out column - * - * @param string|array $dbFadeOut The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbFadeOut($dbFadeOut = null, $comparison = null) - { - if (is_array($dbFadeOut)) { - $useMinMax = false; - if (isset($dbFadeOut['min'])) { - $this->addUsingAlias(CcSchedulePeer::FADE_OUT, $dbFadeOut['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbFadeOut['max'])) { - $this->addUsingAlias(CcSchedulePeer::FADE_OUT, $dbFadeOut['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSchedulePeer::FADE_OUT, $dbFadeOut, $comparison); - } - - /** - * Filter the query on the cue_in column - * - * @param string $dbCueIn The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbCueIn($dbCueIn = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCueIn)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCueIn)) { - $dbCueIn = str_replace('*', '%', $dbCueIn); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSchedulePeer::CUE_IN, $dbCueIn, $comparison); - } - - /** - * Filter the query on the cue_out column - * - * @param string $dbCueOut The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbCueOut($dbCueOut = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCueOut)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCueOut)) { - $dbCueOut = str_replace('*', '%', $dbCueOut); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSchedulePeer::CUE_OUT, $dbCueOut, $comparison); - } - - /** - * Filter the query on the media_item_played column - * - * @param boolean|string $dbMediaItemPlayed The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbMediaItemPlayed($dbMediaItemPlayed = null, $comparison = null) - { - if (is_string($dbMediaItemPlayed)) { - $media_item_played = in_array(strtolower($dbMediaItemPlayed), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcSchedulePeer::MEDIA_ITEM_PLAYED, $dbMediaItemPlayed, $comparison); - } - - /** - * Filter the query on the instance_id column - * - * @param int|array $dbInstanceId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbInstanceId($dbInstanceId = null, $comparison = null) - { - if (is_array($dbInstanceId)) { - $useMinMax = false; - if (isset($dbInstanceId['min'])) { - $this->addUsingAlias(CcSchedulePeer::INSTANCE_ID, $dbInstanceId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbInstanceId['max'])) { - $this->addUsingAlias(CcSchedulePeer::INSTANCE_ID, $dbInstanceId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSchedulePeer::INSTANCE_ID, $dbInstanceId, $comparison); - } - - /** - * Filter the query on the playout_status column - * - * @param int|array $dbPlayoutStatus The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbPlayoutStatus($dbPlayoutStatus = null, $comparison = null) - { - if (is_array($dbPlayoutStatus)) { - $useMinMax = false; - if (isset($dbPlayoutStatus['min'])) { - $this->addUsingAlias(CcSchedulePeer::PLAYOUT_STATUS, $dbPlayoutStatus['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbPlayoutStatus['max'])) { - $this->addUsingAlias(CcSchedulePeer::PLAYOUT_STATUS, $dbPlayoutStatus['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSchedulePeer::PLAYOUT_STATUS, $dbPlayoutStatus, $comparison); - } - - /** - * Filter the query on the broadcasted column - * - * @param int|array $dbBroadcasted The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbBroadcasted($dbBroadcasted = null, $comparison = null) - { - if (is_array($dbBroadcasted)) { - $useMinMax = false; - if (isset($dbBroadcasted['min'])) { - $this->addUsingAlias(CcSchedulePeer::BROADCASTED, $dbBroadcasted['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbBroadcasted['max'])) { - $this->addUsingAlias(CcSchedulePeer::BROADCASTED, $dbBroadcasted['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSchedulePeer::BROADCASTED, $dbBroadcasted, $comparison); - } - - /** - * Filter the query on the position column - * - * @param int|array $dbPosition The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByDbPosition($dbPosition = null, $comparison = null) - { - if (is_array($dbPosition)) { - $useMinMax = false; - if (isset($dbPosition['min'])) { - $this->addUsingAlias(CcSchedulePeer::POSITION, $dbPosition['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbPosition['max'])) { - $this->addUsingAlias(CcSchedulePeer::POSITION, $dbPosition['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSchedulePeer::POSITION, $dbPosition, $comparison); - } - - /** - * Filter the query by a related CcShowInstances object - * - * @param CcShowInstances $ccShowInstances the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByCcShowInstances($ccShowInstances, $comparison = null) - { - return $this - ->addUsingAlias(CcSchedulePeer::INSTANCE_ID, $ccShowInstances->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShowInstances relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function joinCcShowInstances($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShowInstances'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShowInstances'); - } - - return $this; - } - - /** - * Use the CcShowInstances relation CcShowInstances object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowInstancesQuery A secondary query class using the current class as primary query - */ - public function useCcShowInstancesQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcShowInstances($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShowInstances', 'CcShowInstancesQuery'); - } - - /** - * Filter the query by a related CcFiles object - * - * @param CcFiles $ccFiles the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByCcFiles($ccFiles, $comparison = null) - { - return $this - ->addUsingAlias(CcSchedulePeer::FILE_ID, $ccFiles->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcFiles relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function joinCcFiles($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcFiles'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcFiles'); - } - - return $this; - } - - /** - * Use the CcFiles relation CcFiles object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery A secondary query class using the current class as primary query - */ - public function useCcFilesQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcFiles($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery'); - } - - /** - * Filter the query by a related CcWebstream object - * - * @param CcWebstream $ccWebstream the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByCcWebstream($ccWebstream, $comparison = null) - { - return $this - ->addUsingAlias(CcSchedulePeer::STREAM_ID, $ccWebstream->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcWebstream relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function joinCcWebstream($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcWebstream'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcWebstream'); - } - - return $this; - } - - /** - * Use the CcWebstream relation CcWebstream object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcWebstreamQuery A secondary query class using the current class as primary query - */ - public function useCcWebstreamQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcWebstream($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcWebstream', 'CcWebstreamQuery'); - } - - /** - * Filter the query by a related CcWebstreamMetadata object - * - * @param CcWebstreamMetadata $ccWebstreamMetadata the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function filterByCcWebstreamMetadata($ccWebstreamMetadata, $comparison = null) - { - return $this - ->addUsingAlias(CcSchedulePeer::ID, $ccWebstreamMetadata->getDbInstanceId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcWebstreamMetadata relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function joinCcWebstreamMetadata($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcWebstreamMetadata'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcWebstreamMetadata'); - } - - return $this; - } - - /** - * Use the CcWebstreamMetadata relation CcWebstreamMetadata object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcWebstreamMetadataQuery A secondary query class using the current class as primary query - */ - public function useCcWebstreamMetadataQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcWebstreamMetadata($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcWebstreamMetadata', 'CcWebstreamMetadataQuery'); - } - - /** - * Exclude object from result - * - * @param CcSchedule $ccSchedule Object to remove from the list of results - * - * @return CcScheduleQuery The current query, for fluid interface - */ - public function prune($ccSchedule = null) - { - if ($ccSchedule) { - $this->addUsingAlias(CcSchedulePeer::ID, $ccSchedule->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcScheduleQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcServiceRegister.php b/airtime_mvc/application/models/airtime/om/BaseCcServiceRegister.php index dbb3aa6a22..20ba3c9622 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcServiceRegister.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcServiceRegister.php @@ -4,705 +4,811 @@ /** * Base class that represents a row from the 'cc_service_register' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcServiceRegister extends BaseObject implements Persistent +abstract class BaseCcServiceRegister extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcServiceRegisterPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcServiceRegisterPeer - */ - protected static $peer; - - /** - * The value for the name field. - * @var string - */ - protected $name; - - /** - * The value for the ip field. - * @var string - */ - protected $ip; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [name] column value. - * - * @return string - */ - public function getDbName() - { - return $this->name; - } - - /** - * Get the [ip] column value. - * - * @return string - */ - public function getDbIp() - { - return $this->ip; - } - - /** - * Set the value of [name] column. - * - * @param string $v new value - * @return CcServiceRegister The current object (for fluent API support) - */ - public function setDbName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->name !== $v) { - $this->name = $v; - $this->modifiedColumns[] = CcServiceRegisterPeer::NAME; - } - - return $this; - } // setDbName() - - /** - * Set the value of [ip] column. - * - * @param string $v new value - * @return CcServiceRegister The current object (for fluent API support) - */ - public function setDbIp($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->ip !== $v) { - $this->ip = $v; - $this->modifiedColumns[] = CcServiceRegisterPeer::IP; - } - - return $this; - } // setDbIp() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->name = ($row[$startcol + 0] !== null) ? (string) $row[$startcol + 0] : null; - $this->ip = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 2; // 2 = CcServiceRegisterPeer::NUM_COLUMNS - CcServiceRegisterPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcServiceRegister object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcServiceRegisterPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcServiceRegisterQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcServiceRegisterPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setNew(false); - } else { - $affectedRows = CcServiceRegisterPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcServiceRegisterPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcServiceRegisterPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbName(); - break; - case 1: - return $this->getDbIp(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcServiceRegisterPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbName(), - $keys[1] => $this->getDbIp(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcServiceRegisterPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbName($value); - break; - case 1: - $this->setDbIp($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcServiceRegisterPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbName($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbIp($arr[$keys[1]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcServiceRegisterPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcServiceRegisterPeer::NAME)) $criteria->add(CcServiceRegisterPeer::NAME, $this->name); - if ($this->isColumnModified(CcServiceRegisterPeer::IP)) $criteria->add(CcServiceRegisterPeer::IP, $this->ip); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcServiceRegisterPeer::DATABASE_NAME); - $criteria->add(CcServiceRegisterPeer::NAME, $this->name); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return string - */ - public function getPrimaryKey() - { - return $this->getDbName(); - } - - /** - * Generic method to set the primary key (name column). - * - * @param string $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbName($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbName(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcServiceRegister (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbName($this->name); - $copyObj->setDbIp($this->ip); - - $copyObj->setNew(true); - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcServiceRegister Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcServiceRegisterPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcServiceRegisterPeer(); - } - return self::$peer; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->name = null; - $this->ip = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcServiceRegister + /** + * Peer class name + */ + const PEER = 'CcServiceRegisterPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcServiceRegisterPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the name field. + * @var string + */ + protected $name; + + /** + * The value for the ip field. + * @var string + */ + protected $ip; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [name] column value. + * + * @return string + */ + public function getDbName() + { + + return $this->name; + } + + /** + * Get the [ip] column value. + * + * @return string + */ + public function getDbIp() + { + + return $this->ip; + } + + /** + * Set the value of [name] column. + * + * @param string $v new value + * @return CcServiceRegister The current object (for fluent API support) + */ + public function setDbName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->name !== $v) { + $this->name = $v; + $this->modifiedColumns[] = CcServiceRegisterPeer::NAME; + } + + + return $this; + } // setDbName() + + /** + * Set the value of [ip] column. + * + * @param string $v new value + * @return CcServiceRegister The current object (for fluent API support) + */ + public function setDbIp($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->ip !== $v) { + $this->ip = $v; + $this->modifiedColumns[] = CcServiceRegisterPeer::IP; + } + + + return $this; + } // setDbIp() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->name = ($row[$startcol + 0] !== null) ? (string) $row[$startcol + 0] : null; + $this->ip = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 2; // 2 = CcServiceRegisterPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcServiceRegister object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcServiceRegisterPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcServiceRegisterQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcServiceRegisterPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcServiceRegisterPeer::NAME)) { + $modifiedColumns[':p' . $index++] = '"name"'; + } + if ($this->isColumnModified(CcServiceRegisterPeer::IP)) { + $modifiedColumns[':p' . $index++] = '"ip"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_service_register" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"name"': + $stmt->bindValue($identifier, $this->name, PDO::PARAM_STR); + break; + case '"ip"': + $stmt->bindValue($identifier, $this->ip, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcServiceRegisterPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcServiceRegisterPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbName(); + break; + case 1: + return $this->getDbIp(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array()) + { + if (isset($alreadyDumpedObjects['CcServiceRegister'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcServiceRegister'][$this->getPrimaryKey()] = true; + $keys = CcServiceRegisterPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbName(), + $keys[1] => $this->getDbIp(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcServiceRegisterPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbName($value); + break; + case 1: + $this->setDbIp($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcServiceRegisterPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbName($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbIp($arr[$keys[1]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcServiceRegisterPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcServiceRegisterPeer::NAME)) $criteria->add(CcServiceRegisterPeer::NAME, $this->name); + if ($this->isColumnModified(CcServiceRegisterPeer::IP)) $criteria->add(CcServiceRegisterPeer::IP, $this->ip); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcServiceRegisterPeer::DATABASE_NAME); + $criteria->add(CcServiceRegisterPeer::NAME, $this->name); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return string + */ + public function getPrimaryKey() + { + return $this->getDbName(); + } + + /** + * Generic method to set the primary key (name column). + * + * @param string $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbName($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbName(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcServiceRegister (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbIp($this->getDbIp()); + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbName(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcServiceRegister Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcServiceRegisterPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcServiceRegisterPeer(); + } + + return self::$peer; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->name = null; + $this->ip = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcServiceRegisterPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcServiceRegisterPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcServiceRegisterPeer.php index ab7d356341..7fd300190b 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcServiceRegisterPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcServiceRegisterPeer.php @@ -4,728 +4,750 @@ /** * Base static class for performing query and update operations on the 'cc_service_register' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcServiceRegisterPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_service_register'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcServiceRegister'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcServiceRegister'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcServiceRegisterTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 2; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the NAME field */ - const NAME = 'cc_service_register.NAME'; - - /** the column name for the IP field */ - const IP = 'cc_service_register.IP'; - - /** - * An identiy map to hold any loaded instances of CcServiceRegister objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcServiceRegister[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbName', 'DbIp', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbName', 'dbIp', ), - BasePeer::TYPE_COLNAME => array (self::NAME, self::IP, ), - BasePeer::TYPE_RAW_COLNAME => array ('NAME', 'IP', ), - BasePeer::TYPE_FIELDNAME => array ('name', 'ip', ), - BasePeer::TYPE_NUM => array (0, 1, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbName' => 0, 'DbIp' => 1, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbName' => 0, 'dbIp' => 1, ), - BasePeer::TYPE_COLNAME => array (self::NAME => 0, self::IP => 1, ), - BasePeer::TYPE_RAW_COLNAME => array ('NAME' => 0, 'IP' => 1, ), - BasePeer::TYPE_FIELDNAME => array ('name' => 0, 'ip' => 1, ), - BasePeer::TYPE_NUM => array (0, 1, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcServiceRegisterPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcServiceRegisterPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcServiceRegisterPeer::NAME); - $criteria->addSelectColumn(CcServiceRegisterPeer::IP); - } else { - $criteria->addSelectColumn($alias . '.NAME'); - $criteria->addSelectColumn($alias . '.IP'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcServiceRegisterPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcServiceRegisterPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcServiceRegister - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcServiceRegisterPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcServiceRegisterPeer::populateObjects(CcServiceRegisterPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcServiceRegisterPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcServiceRegister $value A CcServiceRegister object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcServiceRegister $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbName(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcServiceRegister object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcServiceRegister) { - $key = (string) $value->getDbName(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcServiceRegister object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcServiceRegister Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_service_register - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (string) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcServiceRegisterPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcServiceRegisterPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcServiceRegisterPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcServiceRegisterPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcServiceRegister object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcServiceRegisterPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcServiceRegisterPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcServiceRegisterPeer::NUM_COLUMNS; - } else { - $cls = CcServiceRegisterPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcServiceRegisterPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcServiceRegisterPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcServiceRegisterPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcServiceRegisterTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcServiceRegisterPeer::CLASS_DEFAULT : CcServiceRegisterPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcServiceRegister or Criteria object. - * - * @param mixed $values Criteria or CcServiceRegister object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcServiceRegister object - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcServiceRegister or Criteria object. - * - * @param mixed $values Criteria or CcServiceRegister object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcServiceRegisterPeer::NAME); - $value = $criteria->remove(CcServiceRegisterPeer::NAME); - if ($value) { - $selectCriteria->add(CcServiceRegisterPeer::NAME, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcServiceRegisterPeer::TABLE_NAME); - } - - } else { // $values is CcServiceRegister object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_service_register table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcServiceRegisterPeer::TABLE_NAME, $con, CcServiceRegisterPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcServiceRegisterPeer::clearInstancePool(); - CcServiceRegisterPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcServiceRegister or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcServiceRegister object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcServiceRegisterPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcServiceRegister) { // it's a model object - // invalidate the cache for this single object - CcServiceRegisterPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcServiceRegisterPeer::NAME, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcServiceRegisterPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcServiceRegisterPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcServiceRegister object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcServiceRegister $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcServiceRegister $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcServiceRegisterPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcServiceRegisterPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcServiceRegisterPeer::DATABASE_NAME, CcServiceRegisterPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param string $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcServiceRegister - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcServiceRegisterPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcServiceRegisterPeer::DATABASE_NAME); - $criteria->add(CcServiceRegisterPeer::NAME, $pk); - - $v = CcServiceRegisterPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcServiceRegisterPeer::DATABASE_NAME); - $criteria->add(CcServiceRegisterPeer::NAME, $pks, Criteria::IN); - $objs = CcServiceRegisterPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcServiceRegisterPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_service_register'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcServiceRegister'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcServiceRegisterTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 2; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 2; + + /** the column name for the name field */ + const NAME = 'cc_service_register.name'; + + /** the column name for the ip field */ + const IP = 'cc_service_register.ip'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcServiceRegister objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcServiceRegister[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcServiceRegisterPeer::$fieldNames[CcServiceRegisterPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbName', 'DbIp', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbName', 'dbIp', ), + BasePeer::TYPE_COLNAME => array (CcServiceRegisterPeer::NAME, CcServiceRegisterPeer::IP, ), + BasePeer::TYPE_RAW_COLNAME => array ('NAME', 'IP', ), + BasePeer::TYPE_FIELDNAME => array ('name', 'ip', ), + BasePeer::TYPE_NUM => array (0, 1, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcServiceRegisterPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbName' => 0, 'DbIp' => 1, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbName' => 0, 'dbIp' => 1, ), + BasePeer::TYPE_COLNAME => array (CcServiceRegisterPeer::NAME => 0, CcServiceRegisterPeer::IP => 1, ), + BasePeer::TYPE_RAW_COLNAME => array ('NAME' => 0, 'IP' => 1, ), + BasePeer::TYPE_FIELDNAME => array ('name' => 0, 'ip' => 1, ), + BasePeer::TYPE_NUM => array (0, 1, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcServiceRegisterPeer::getFieldNames($toType); + $key = isset(CcServiceRegisterPeer::$fieldKeys[$fromType][$name]) ? CcServiceRegisterPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcServiceRegisterPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcServiceRegisterPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcServiceRegisterPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcServiceRegisterPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcServiceRegisterPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcServiceRegisterPeer::NAME); + $criteria->addSelectColumn(CcServiceRegisterPeer::IP); + } else { + $criteria->addSelectColumn($alias . '.name'); + $criteria->addSelectColumn($alias . '.ip'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcServiceRegisterPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcServiceRegisterPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcServiceRegisterPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcServiceRegister + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcServiceRegisterPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcServiceRegisterPeer::populateObjects(CcServiceRegisterPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcServiceRegisterPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcServiceRegisterPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcServiceRegister $obj A CcServiceRegister object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbName(); + } // if key === null + CcServiceRegisterPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcServiceRegister object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcServiceRegister) { + $key = (string) $value->getDbName(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcServiceRegister object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcServiceRegisterPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcServiceRegister Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcServiceRegisterPeer::$instances[$key])) { + return CcServiceRegisterPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcServiceRegisterPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcServiceRegisterPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_service_register + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (string) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcServiceRegisterPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcServiceRegisterPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcServiceRegisterPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcServiceRegisterPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcServiceRegister object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcServiceRegisterPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcServiceRegisterPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcServiceRegisterPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcServiceRegisterPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcServiceRegisterPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcServiceRegisterPeer::DATABASE_NAME)->getTable(CcServiceRegisterPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcServiceRegisterPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcServiceRegisterPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcServiceRegisterTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcServiceRegisterPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcServiceRegister or Criteria object. + * + * @param mixed $values Criteria or CcServiceRegister object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcServiceRegister object + } + + + // Set the correct dbName + $criteria->setDbName(CcServiceRegisterPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcServiceRegister or Criteria object. + * + * @param mixed $values Criteria or CcServiceRegister object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcServiceRegisterPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcServiceRegisterPeer::NAME); + $value = $criteria->remove(CcServiceRegisterPeer::NAME); + if ($value) { + $selectCriteria->add(CcServiceRegisterPeer::NAME, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcServiceRegisterPeer::TABLE_NAME); + } + + } else { // $values is CcServiceRegister object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcServiceRegisterPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_service_register table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcServiceRegisterPeer::TABLE_NAME, $con, CcServiceRegisterPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcServiceRegisterPeer::clearInstancePool(); + CcServiceRegisterPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcServiceRegister or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcServiceRegister object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcServiceRegisterPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcServiceRegister) { // it's a model object + // invalidate the cache for this single object + CcServiceRegisterPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcServiceRegisterPeer::DATABASE_NAME); + $criteria->add(CcServiceRegisterPeer::NAME, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcServiceRegisterPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcServiceRegisterPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcServiceRegisterPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcServiceRegister object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcServiceRegister $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcServiceRegisterPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcServiceRegisterPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcServiceRegisterPeer::DATABASE_NAME, CcServiceRegisterPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param string $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcServiceRegister + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcServiceRegisterPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcServiceRegisterPeer::DATABASE_NAME); + $criteria->add(CcServiceRegisterPeer::NAME, $pk); + + $v = CcServiceRegisterPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcServiceRegister[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcServiceRegisterPeer::DATABASE_NAME); + $criteria->add(CcServiceRegisterPeer::NAME, $pks, Criteria::IN); + $objs = CcServiceRegisterPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcServiceRegisterPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcServiceRegisterQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcServiceRegisterQuery.php index a8df529a7c..68f1166c68 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcServiceRegisterQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcServiceRegisterQuery.php @@ -4,193 +4,293 @@ /** * Base class that represents a query for the 'cc_service_register' table. * - * * - * @method CcServiceRegisterQuery orderByDbName($order = Criteria::ASC) Order by the name column - * @method CcServiceRegisterQuery orderByDbIp($order = Criteria::ASC) Order by the ip column * - * @method CcServiceRegisterQuery groupByDbName() Group by the name column - * @method CcServiceRegisterQuery groupByDbIp() Group by the ip column + * @method CcServiceRegisterQuery orderByDbName($order = Criteria::ASC) Order by the name column + * @method CcServiceRegisterQuery orderByDbIp($order = Criteria::ASC) Order by the ip column * - * @method CcServiceRegisterQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcServiceRegisterQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcServiceRegisterQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcServiceRegisterQuery groupByDbName() Group by the name column + * @method CcServiceRegisterQuery groupByDbIp() Group by the ip column * - * @method CcServiceRegister findOne(PropelPDO $con = null) Return the first CcServiceRegister matching the query - * @method CcServiceRegister findOneOrCreate(PropelPDO $con = null) Return the first CcServiceRegister matching the query, or a new CcServiceRegister object populated from the query conditions when no match is found + * @method CcServiceRegisterQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcServiceRegisterQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcServiceRegisterQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcServiceRegister findOneByDbName(string $name) Return the first CcServiceRegister filtered by the name column - * @method CcServiceRegister findOneByDbIp(string $ip) Return the first CcServiceRegister filtered by the ip column + * @method CcServiceRegister findOne(PropelPDO $con = null) Return the first CcServiceRegister matching the query + * @method CcServiceRegister findOneOrCreate(PropelPDO $con = null) Return the first CcServiceRegister matching the query, or a new CcServiceRegister object populated from the query conditions when no match is found * - * @method array findByDbName(string $name) Return CcServiceRegister objects filtered by the name column - * @method array findByDbIp(string $ip) Return CcServiceRegister objects filtered by the ip column + * @method CcServiceRegister findOneByDbIp(string $ip) Return the first CcServiceRegister filtered by the ip column + * + * @method array findByDbName(string $name) Return CcServiceRegister objects filtered by the name column + * @method array findByDbIp(string $ip) Return CcServiceRegister objects filtered by the ip column * * @package propel.generator.airtime.om */ abstract class BaseCcServiceRegisterQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcServiceRegisterQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcServiceRegister'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcServiceRegisterQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcServiceRegisterQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcServiceRegisterQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcServiceRegisterQuery) { + return $criteria; + } + $query = new CcServiceRegisterQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcServiceRegister|CcServiceRegister[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcServiceRegisterPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcServiceRegisterPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcServiceRegister A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbName($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcServiceRegister A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "name", "ip" FROM "cc_service_register" WHERE "name" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_STR); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcServiceRegister(); + $obj->hydrate($row); + CcServiceRegisterPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcServiceRegister|CcServiceRegister[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcServiceRegister[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcServiceRegisterQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcServiceRegisterPeer::NAME, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcServiceRegisterQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcServiceRegisterPeer::NAME, $keys, Criteria::IN); + } + + /** + * Filter the query on the name column + * + * Example usage: + * + * $query->filterByDbName('fooValue'); // WHERE name = 'fooValue' + * $query->filterByDbName('%fooValue%'); // WHERE name LIKE '%fooValue%' + * + * + * @param string $dbName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcServiceRegisterQuery The current query, for fluid interface + */ + public function filterByDbName($dbName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbName)) { + $dbName = str_replace('*', '%', $dbName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcServiceRegisterPeer::NAME, $dbName, $comparison); + } + + /** + * Filter the query on the ip column + * + * Example usage: + * + * $query->filterByDbIp('fooValue'); // WHERE ip = 'fooValue' + * $query->filterByDbIp('%fooValue%'); // WHERE ip LIKE '%fooValue%' + * + * + * @param string $dbIp The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcServiceRegisterQuery The current query, for fluid interface + */ + public function filterByDbIp($dbIp = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbIp)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbIp)) { + $dbIp = str_replace('*', '%', $dbIp); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcServiceRegisterPeer::IP, $dbIp, $comparison); + } + + /** + * Exclude object from result + * + * @param CcServiceRegister $ccServiceRegister Object to remove from the list of results + * + * @return CcServiceRegisterQuery The current query, for fluid interface + */ + public function prune($ccServiceRegister = null) + { + if ($ccServiceRegister) { + $this->addUsingAlias(CcServiceRegisterPeer::NAME, $ccServiceRegister->getDbName(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcServiceRegisterQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcServiceRegister', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcServiceRegisterQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcServiceRegisterQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcServiceRegisterQuery) { - return $criteria; - } - $query = new CcServiceRegisterQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcServiceRegister|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcServiceRegisterPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcServiceRegisterQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcServiceRegisterPeer::NAME, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcServiceRegisterQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcServiceRegisterPeer::NAME, $keys, Criteria::IN); - } - - /** - * Filter the query on the name column - * - * @param string $dbName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcServiceRegisterQuery The current query, for fluid interface - */ - public function filterByDbName($dbName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbName)) { - $dbName = str_replace('*', '%', $dbName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcServiceRegisterPeer::NAME, $dbName, $comparison); - } - - /** - * Filter the query on the ip column - * - * @param string $dbIp The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcServiceRegisterQuery The current query, for fluid interface - */ - public function filterByDbIp($dbIp = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbIp)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbIp)) { - $dbIp = str_replace('*', '%', $dbIp); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcServiceRegisterPeer::IP, $dbIp, $comparison); - } - - /** - * Exclude object from result - * - * @param CcServiceRegister $ccServiceRegister Object to remove from the list of results - * - * @return CcServiceRegisterQuery The current query, for fluid interface - */ - public function prune($ccServiceRegister = null) - { - if ($ccServiceRegister) { - $this->addUsingAlias(CcServiceRegisterPeer::NAME, $ccServiceRegister->getDbName(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcServiceRegisterQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSess.php b/airtime_mvc/application/models/airtime/om/BaseCcSess.php index 8ae2463afa..692f742caa 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSess.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSess.php @@ -4,946 +4,1060 @@ /** * Base class that represents a row from the 'cc_sess' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcSess extends BaseObject implements Persistent +abstract class BaseCcSess extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcSessPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcSessPeer - */ - protected static $peer; - - /** - * The value for the sessid field. - * @var string - */ - protected $sessid; - - /** - * The value for the userid field. - * @var int - */ - protected $userid; - - /** - * The value for the login field. - * @var string - */ - protected $login; - - /** - * The value for the ts field. - * @var string - */ - protected $ts; - - /** - * @var CcSubjs - */ - protected $aCcSubjs; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [sessid] column value. - * - * @return string - */ - public function getSessid() - { - return $this->sessid; - } - - /** - * Get the [userid] column value. - * - * @return int - */ - public function getUserid() - { - return $this->userid; - } - - /** - * Get the [login] column value. - * - * @return string - */ - public function getLogin() - { - return $this->login; - } - - /** - * Get the [optionally formatted] temporal [ts] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getTs($format = 'Y-m-d H:i:s') - { - if ($this->ts === null) { - return null; - } - - - - try { - $dt = new DateTime($this->ts); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->ts, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Set the value of [sessid] column. - * - * @param string $v new value - * @return CcSess The current object (for fluent API support) - */ - public function setSessid($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->sessid !== $v) { - $this->sessid = $v; - $this->modifiedColumns[] = CcSessPeer::SESSID; - } - - return $this; - } // setSessid() - - /** - * Set the value of [userid] column. - * - * @param int $v new value - * @return CcSess The current object (for fluent API support) - */ - public function setUserid($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->userid !== $v) { - $this->userid = $v; - $this->modifiedColumns[] = CcSessPeer::USERID; - } - - if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { - $this->aCcSubjs = null; - } - - return $this; - } // setUserid() - - /** - * Set the value of [login] column. - * - * @param string $v new value - * @return CcSess The current object (for fluent API support) - */ - public function setLogin($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->login !== $v) { - $this->login = $v; - $this->modifiedColumns[] = CcSessPeer::LOGIN; - } - - return $this; - } // setLogin() - - /** - * Sets the value of [ts] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcSess The current object (for fluent API support) - */ - public function setTs($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->ts !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->ts !== null && $tmpDt = new DateTime($this->ts)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->ts = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcSessPeer::TS; - } - } // if either are not null - - return $this; - } // setTs() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->sessid = ($row[$startcol + 0] !== null) ? (string) $row[$startcol + 0] : null; - $this->userid = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->login = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->ts = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 4; // 4 = CcSessPeer::NUM_COLUMNS - CcSessPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcSess object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcSubjs !== null && $this->userid !== $this->aCcSubjs->getDbId()) { - $this->aCcSubjs = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcSessPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcSubjs = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcSessQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcSessPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSubjs !== null) { - if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { - $affectedRows += $this->aCcSubjs->save($con); - } - $this->setCcSubjs($this->aCcSubjs); - } - - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setNew(false); - } else { - $affectedRows += CcSessPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSubjs !== null) { - if (!$this->aCcSubjs->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); - } - } - - - if (($retval = CcSessPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcSessPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getSessid(); - break; - case 1: - return $this->getUserid(); - break; - case 2: - return $this->getLogin(); - break; - case 3: - return $this->getTs(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcSessPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getSessid(), - $keys[1] => $this->getUserid(), - $keys[2] => $this->getLogin(), - $keys[3] => $this->getTs(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcSubjs) { - $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcSessPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setSessid($value); - break; - case 1: - $this->setUserid($value); - break; - case 2: - $this->setLogin($value); - break; - case 3: - $this->setTs($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcSessPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setSessid($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setUserid($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setLogin($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setTs($arr[$keys[3]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcSessPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcSessPeer::SESSID)) $criteria->add(CcSessPeer::SESSID, $this->sessid); - if ($this->isColumnModified(CcSessPeer::USERID)) $criteria->add(CcSessPeer::USERID, $this->userid); - if ($this->isColumnModified(CcSessPeer::LOGIN)) $criteria->add(CcSessPeer::LOGIN, $this->login); - if ($this->isColumnModified(CcSessPeer::TS)) $criteria->add(CcSessPeer::TS, $this->ts); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcSessPeer::DATABASE_NAME); - $criteria->add(CcSessPeer::SESSID, $this->sessid); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return string - */ - public function getPrimaryKey() - { - return $this->getSessid(); - } - - /** - * Generic method to set the primary key (sessid column). - * - * @param string $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setSessid($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getSessid(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcSess (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setSessid($this->sessid); - $copyObj->setUserid($this->userid); - $copyObj->setLogin($this->login); - $copyObj->setTs($this->ts); - - $copyObj->setNew(true); - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcSess Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcSessPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcSessPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcSubjs object. - * - * @param CcSubjs $v - * @return CcSess The current object (for fluent API support) - * @throws PropelException - */ - public function setCcSubjs(CcSubjs $v = null) - { - if ($v === null) { - $this->setUserid(NULL); - } else { - $this->setUserid($v->getDbId()); - } - - $this->aCcSubjs = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcSubjs object, it will not be re-added. - if ($v !== null) { - $v->addCcSess($this); - } - - return $this; - } - - - /** - * Get the associated CcSubjs object - * - * @param PropelPDO Optional Connection object. - * @return CcSubjs The associated CcSubjs object. - * @throws PropelException - */ - public function getCcSubjs(PropelPDO $con = null) - { - if ($this->aCcSubjs === null && ($this->userid !== null)) { - $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->userid, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcSubjs->addCcSesss($this); - */ - } - return $this->aCcSubjs; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->sessid = null; - $this->userid = null; - $this->login = null; - $this->ts = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcSubjs = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcSess + /** + * Peer class name + */ + const PEER = 'CcSessPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcSessPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the sessid field. + * @var string + */ + protected $sessid; + + /** + * The value for the userid field. + * @var int + */ + protected $userid; + + /** + * The value for the login field. + * @var string + */ + protected $login; + + /** + * The value for the ts field. + * @var string + */ + protected $ts; + + /** + * @var CcSubjs + */ + protected $aCcSubjs; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [sessid] column value. + * + * @return string + */ + public function getSessid() + { + + return $this->sessid; + } + + /** + * Get the [userid] column value. + * + * @return int + */ + public function getUserid() + { + + return $this->userid; + } + + /** + * Get the [login] column value. + * + * @return string + */ + public function getLogin() + { + + return $this->login; + } + + /** + * Get the [optionally formatted] temporal [ts] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getTs($format = 'Y-m-d H:i:s') + { + if ($this->ts === null) { + return null; + } + + + try { + $dt = new DateTime($this->ts); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->ts, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Set the value of [sessid] column. + * + * @param string $v new value + * @return CcSess The current object (for fluent API support) + */ + public function setSessid($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->sessid !== $v) { + $this->sessid = $v; + $this->modifiedColumns[] = CcSessPeer::SESSID; + } + + + return $this; + } // setSessid() + + /** + * Set the value of [userid] column. + * + * @param int $v new value + * @return CcSess The current object (for fluent API support) + */ + public function setUserid($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->userid !== $v) { + $this->userid = $v; + $this->modifiedColumns[] = CcSessPeer::USERID; + } + + if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { + $this->aCcSubjs = null; + } + + + return $this; + } // setUserid() + + /** + * Set the value of [login] column. + * + * @param string $v new value + * @return CcSess The current object (for fluent API support) + */ + public function setLogin($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->login !== $v) { + $this->login = $v; + $this->modifiedColumns[] = CcSessPeer::LOGIN; + } + + + return $this; + } // setLogin() + + /** + * Sets the value of [ts] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcSess The current object (for fluent API support) + */ + public function setTs($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->ts !== null || $dt !== null) { + $currentDateAsString = ($this->ts !== null && $tmpDt = new DateTime($this->ts)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->ts = $newDateAsString; + $this->modifiedColumns[] = CcSessPeer::TS; + } + } // if either are not null + + + return $this; + } // setTs() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->sessid = ($row[$startcol + 0] !== null) ? (string) $row[$startcol + 0] : null; + $this->userid = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->login = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->ts = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 4; // 4 = CcSessPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcSess object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcSubjs !== null && $this->userid !== $this->aCcSubjs->getDbId()) { + $this->aCcSubjs = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcSessPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcSubjs = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcSessQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcSessPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSubjs !== null) { + if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { + $affectedRows += $this->aCcSubjs->save($con); + } + $this->setCcSubjs($this->aCcSubjs); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcSessPeer::SESSID)) { + $modifiedColumns[':p' . $index++] = '"sessid"'; + } + if ($this->isColumnModified(CcSessPeer::USERID)) { + $modifiedColumns[':p' . $index++] = '"userid"'; + } + if ($this->isColumnModified(CcSessPeer::LOGIN)) { + $modifiedColumns[':p' . $index++] = '"login"'; + } + if ($this->isColumnModified(CcSessPeer::TS)) { + $modifiedColumns[':p' . $index++] = '"ts"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_sess" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"sessid"': + $stmt->bindValue($identifier, $this->sessid, PDO::PARAM_STR); + break; + case '"userid"': + $stmt->bindValue($identifier, $this->userid, PDO::PARAM_INT); + break; + case '"login"': + $stmt->bindValue($identifier, $this->login, PDO::PARAM_STR); + break; + case '"ts"': + $stmt->bindValue($identifier, $this->ts, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSubjs !== null) { + if (!$this->aCcSubjs->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); + } + } + + + if (($retval = CcSessPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcSessPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getSessid(); + break; + case 1: + return $this->getUserid(); + break; + case 2: + return $this->getLogin(); + break; + case 3: + return $this->getTs(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcSess'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcSess'][$this->getPrimaryKey()] = true; + $keys = CcSessPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getSessid(), + $keys[1] => $this->getUserid(), + $keys[2] => $this->getLogin(), + $keys[3] => $this->getTs(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcSubjs) { + $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcSessPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setSessid($value); + break; + case 1: + $this->setUserid($value); + break; + case 2: + $this->setLogin($value); + break; + case 3: + $this->setTs($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcSessPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setSessid($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setUserid($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setLogin($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setTs($arr[$keys[3]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcSessPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcSessPeer::SESSID)) $criteria->add(CcSessPeer::SESSID, $this->sessid); + if ($this->isColumnModified(CcSessPeer::USERID)) $criteria->add(CcSessPeer::USERID, $this->userid); + if ($this->isColumnModified(CcSessPeer::LOGIN)) $criteria->add(CcSessPeer::LOGIN, $this->login); + if ($this->isColumnModified(CcSessPeer::TS)) $criteria->add(CcSessPeer::TS, $this->ts); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcSessPeer::DATABASE_NAME); + $criteria->add(CcSessPeer::SESSID, $this->sessid); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return string + */ + public function getPrimaryKey() + { + return $this->getSessid(); + } + + /** + * Generic method to set the primary key (sessid column). + * + * @param string $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setSessid($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getSessid(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcSess (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setUserid($this->getUserid()); + $copyObj->setLogin($this->getLogin()); + $copyObj->setTs($this->getTs()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setSessid(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcSess Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcSessPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcSessPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcSubjs object. + * + * @param CcSubjs $v + * @return CcSess The current object (for fluent API support) + * @throws PropelException + */ + public function setCcSubjs(CcSubjs $v = null) + { + if ($v === null) { + $this->setUserid(NULL); + } else { + $this->setUserid($v->getDbId()); + } + + $this->aCcSubjs = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcSubjs object, it will not be re-added. + if ($v !== null) { + $v->addCcSess($this); + } + + + return $this; + } + + + /** + * Get the associated CcSubjs object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcSubjs The associated CcSubjs object. + * @throws PropelException + */ + public function getCcSubjs(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcSubjs === null && ($this->userid !== null) && $doQuery) { + $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->userid, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcSubjs->addCcSesss($this); + */ + } + + return $this->aCcSubjs; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->sessid = null; + $this->userid = null; + $this->login = null; + $this->ts = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcSubjs instanceof Persistent) { + $this->aCcSubjs->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcSubjs = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcSessPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSessPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcSessPeer.php index 70eab561a4..219315ed9c 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSessPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSessPeer.php @@ -4,972 +4,998 @@ /** * Base static class for performing query and update operations on the 'cc_sess' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcSessPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_sess'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcSess'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcSess'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcSessTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 4; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the SESSID field */ - const SESSID = 'cc_sess.SESSID'; - - /** the column name for the USERID field */ - const USERID = 'cc_sess.USERID'; - - /** the column name for the LOGIN field */ - const LOGIN = 'cc_sess.LOGIN'; - - /** the column name for the TS field */ - const TS = 'cc_sess.TS'; - - /** - * An identiy map to hold any loaded instances of CcSess objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcSess[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('Sessid', 'Userid', 'Login', 'Ts', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('sessid', 'userid', 'login', 'ts', ), - BasePeer::TYPE_COLNAME => array (self::SESSID, self::USERID, self::LOGIN, self::TS, ), - BasePeer::TYPE_RAW_COLNAME => array ('SESSID', 'USERID', 'LOGIN', 'TS', ), - BasePeer::TYPE_FIELDNAME => array ('sessid', 'userid', 'login', 'ts', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('Sessid' => 0, 'Userid' => 1, 'Login' => 2, 'Ts' => 3, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('sessid' => 0, 'userid' => 1, 'login' => 2, 'ts' => 3, ), - BasePeer::TYPE_COLNAME => array (self::SESSID => 0, self::USERID => 1, self::LOGIN => 2, self::TS => 3, ), - BasePeer::TYPE_RAW_COLNAME => array ('SESSID' => 0, 'USERID' => 1, 'LOGIN' => 2, 'TS' => 3, ), - BasePeer::TYPE_FIELDNAME => array ('sessid' => 0, 'userid' => 1, 'login' => 2, 'ts' => 3, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcSessPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcSessPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcSessPeer::SESSID); - $criteria->addSelectColumn(CcSessPeer::USERID); - $criteria->addSelectColumn(CcSessPeer::LOGIN); - $criteria->addSelectColumn(CcSessPeer::TS); - } else { - $criteria->addSelectColumn($alias . '.SESSID'); - $criteria->addSelectColumn($alias . '.USERID'); - $criteria->addSelectColumn($alias . '.LOGIN'); - $criteria->addSelectColumn($alias . '.TS'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSessPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSessPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcSess - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcSessPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcSessPeer::populateObjects(CcSessPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcSessPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcSess $value A CcSess object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcSess $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getSessid(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcSess object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcSess) { - $key = (string) $value->getSessid(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcSess object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcSess Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_sess - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (string) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcSessPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcSessPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcSessPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcSessPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcSess object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcSessPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcSessPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcSessPeer::NUM_COLUMNS; - } else { - $cls = CcSessPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcSessPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcSubjs table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSessPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSessPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcSessPeer::USERID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcSess objects pre-filled with their CcSubjs objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcSess objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcSessPeer::addSelectColumns($criteria); - $startcol = (CcSessPeer::NUM_COLUMNS - CcSessPeer::NUM_LAZY_LOAD_COLUMNS); - CcSubjsPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcSessPeer::USERID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcSessPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcSessPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcSessPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcSessPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcSess) to $obj2 (CcSubjs) - $obj2->addCcSess($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSessPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSessPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcSessPeer::USERID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcSess objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcSess objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcSessPeer::addSelectColumns($criteria); - $startcol2 = (CcSessPeer::NUM_COLUMNS - CcSessPeer::NUM_LAZY_LOAD_COLUMNS); - - CcSubjsPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcSubjsPeer::NUM_COLUMNS - CcSubjsPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcSessPeer::USERID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcSessPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcSessPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcSessPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcSessPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcSubjs rows - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcSess) to the collection in $obj2 (CcSubjs) - $obj2->addCcSess($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcSessPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcSessPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcSessTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcSessPeer::CLASS_DEFAULT : CcSessPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcSess or Criteria object. - * - * @param mixed $values Criteria or CcSess object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcSess object - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcSess or Criteria object. - * - * @param mixed $values Criteria or CcSess object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcSessPeer::SESSID); - $value = $criteria->remove(CcSessPeer::SESSID); - if ($value) { - $selectCriteria->add(CcSessPeer::SESSID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcSessPeer::TABLE_NAME); - } - - } else { // $values is CcSess object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_sess table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcSessPeer::TABLE_NAME, $con, CcSessPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcSessPeer::clearInstancePool(); - CcSessPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcSess or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcSess object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcSessPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcSess) { // it's a model object - // invalidate the cache for this single object - CcSessPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcSessPeer::SESSID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcSessPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcSessPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcSess object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcSess $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcSess $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcSessPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcSessPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcSessPeer::DATABASE_NAME, CcSessPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param string $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcSess - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcSessPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcSessPeer::DATABASE_NAME); - $criteria->add(CcSessPeer::SESSID, $pk); - - $v = CcSessPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcSessPeer::DATABASE_NAME); - $criteria->add(CcSessPeer::SESSID, $pks, Criteria::IN); - $objs = CcSessPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcSessPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_sess'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcSess'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcSessTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 4; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 4; + + /** the column name for the sessid field */ + const SESSID = 'cc_sess.sessid'; + + /** the column name for the userid field */ + const USERID = 'cc_sess.userid'; + + /** the column name for the login field */ + const LOGIN = 'cc_sess.login'; + + /** the column name for the ts field */ + const TS = 'cc_sess.ts'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcSess objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcSess[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcSessPeer::$fieldNames[CcSessPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('Sessid', 'Userid', 'Login', 'Ts', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('sessid', 'userid', 'login', 'ts', ), + BasePeer::TYPE_COLNAME => array (CcSessPeer::SESSID, CcSessPeer::USERID, CcSessPeer::LOGIN, CcSessPeer::TS, ), + BasePeer::TYPE_RAW_COLNAME => array ('SESSID', 'USERID', 'LOGIN', 'TS', ), + BasePeer::TYPE_FIELDNAME => array ('sessid', 'userid', 'login', 'ts', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcSessPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('Sessid' => 0, 'Userid' => 1, 'Login' => 2, 'Ts' => 3, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('sessid' => 0, 'userid' => 1, 'login' => 2, 'ts' => 3, ), + BasePeer::TYPE_COLNAME => array (CcSessPeer::SESSID => 0, CcSessPeer::USERID => 1, CcSessPeer::LOGIN => 2, CcSessPeer::TS => 3, ), + BasePeer::TYPE_RAW_COLNAME => array ('SESSID' => 0, 'USERID' => 1, 'LOGIN' => 2, 'TS' => 3, ), + BasePeer::TYPE_FIELDNAME => array ('sessid' => 0, 'userid' => 1, 'login' => 2, 'ts' => 3, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcSessPeer::getFieldNames($toType); + $key = isset(CcSessPeer::$fieldKeys[$fromType][$name]) ? CcSessPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcSessPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcSessPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcSessPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcSessPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcSessPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcSessPeer::SESSID); + $criteria->addSelectColumn(CcSessPeer::USERID); + $criteria->addSelectColumn(CcSessPeer::LOGIN); + $criteria->addSelectColumn(CcSessPeer::TS); + } else { + $criteria->addSelectColumn($alias . '.sessid'); + $criteria->addSelectColumn($alias . '.userid'); + $criteria->addSelectColumn($alias . '.login'); + $criteria->addSelectColumn($alias . '.ts'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSessPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSessPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcSessPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcSess + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcSessPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcSessPeer::populateObjects(CcSessPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcSessPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcSessPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcSess $obj A CcSess object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getSessid(); + } // if key === null + CcSessPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcSess object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcSess) { + $key = (string) $value->getSessid(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcSess object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcSessPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcSess Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcSessPeer::$instances[$key])) { + return CcSessPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcSessPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcSessPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_sess + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (string) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcSessPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcSessPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcSessPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcSessPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcSess object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcSessPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcSessPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcSessPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcSessPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcSessPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcSubjs table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSessPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSessPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcSessPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcSessPeer::USERID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcSess objects pre-filled with their CcSubjs objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcSess objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcSessPeer::DATABASE_NAME); + } + + CcSessPeer::addSelectColumns($criteria); + $startcol = CcSessPeer::NUM_HYDRATE_COLUMNS; + CcSubjsPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcSessPeer::USERID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcSessPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcSessPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcSessPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcSessPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcSess) to $obj2 (CcSubjs) + $obj2->addCcSess($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSessPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSessPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcSessPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcSessPeer::USERID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcSess objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcSess objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcSessPeer::DATABASE_NAME); + } + + CcSessPeer::addSelectColumns($criteria); + $startcol2 = CcSessPeer::NUM_HYDRATE_COLUMNS; + + CcSubjsPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcSubjsPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcSessPeer::USERID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcSessPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcSessPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcSessPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcSessPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcSubjs rows + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcSess) to the collection in $obj2 (CcSubjs) + $obj2->addCcSess($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcSessPeer::DATABASE_NAME)->getTable(CcSessPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcSessPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcSessPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcSessTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcSessPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcSess or Criteria object. + * + * @param mixed $values Criteria or CcSess object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcSess object + } + + + // Set the correct dbName + $criteria->setDbName(CcSessPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcSess or Criteria object. + * + * @param mixed $values Criteria or CcSess object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcSessPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcSessPeer::SESSID); + $value = $criteria->remove(CcSessPeer::SESSID); + if ($value) { + $selectCriteria->add(CcSessPeer::SESSID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcSessPeer::TABLE_NAME); + } + + } else { // $values is CcSess object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcSessPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_sess table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcSessPeer::TABLE_NAME, $con, CcSessPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcSessPeer::clearInstancePool(); + CcSessPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcSess or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcSess object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcSessPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcSess) { // it's a model object + // invalidate the cache for this single object + CcSessPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcSessPeer::DATABASE_NAME); + $criteria->add(CcSessPeer::SESSID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcSessPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcSessPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcSessPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcSess object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcSess $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcSessPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcSessPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcSessPeer::DATABASE_NAME, CcSessPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param string $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcSess + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcSessPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcSessPeer::DATABASE_NAME); + $criteria->add(CcSessPeer::SESSID, $pk); + + $v = CcSessPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcSess[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcSessPeer::DATABASE_NAME); + $criteria->add(CcSessPeer::SESSID, $pks, Criteria::IN); + $objs = CcSessPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcSessPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSessQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcSessQuery.php index f0b500f83c..c2397f2867 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSessQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSessQuery.php @@ -4,331 +4,468 @@ /** * Base class that represents a query for the 'cc_sess' table. * - * * - * @method CcSessQuery orderBySessid($order = Criteria::ASC) Order by the sessid column - * @method CcSessQuery orderByUserid($order = Criteria::ASC) Order by the userid column - * @method CcSessQuery orderByLogin($order = Criteria::ASC) Order by the login column - * @method CcSessQuery orderByTs($order = Criteria::ASC) Order by the ts column * - * @method CcSessQuery groupBySessid() Group by the sessid column - * @method CcSessQuery groupByUserid() Group by the userid column - * @method CcSessQuery groupByLogin() Group by the login column - * @method CcSessQuery groupByTs() Group by the ts column + * @method CcSessQuery orderBySessid($order = Criteria::ASC) Order by the sessid column + * @method CcSessQuery orderByUserid($order = Criteria::ASC) Order by the userid column + * @method CcSessQuery orderByLogin($order = Criteria::ASC) Order by the login column + * @method CcSessQuery orderByTs($order = Criteria::ASC) Order by the ts column * - * @method CcSessQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcSessQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcSessQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcSessQuery groupBySessid() Group by the sessid column + * @method CcSessQuery groupByUserid() Group by the userid column + * @method CcSessQuery groupByLogin() Group by the login column + * @method CcSessQuery groupByTs() Group by the ts column * - * @method CcSessQuery leftJoinCcSubjs($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSubjs relation - * @method CcSessQuery rightJoinCcSubjs($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSubjs relation - * @method CcSessQuery innerJoinCcSubjs($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSubjs relation + * @method CcSessQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcSessQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcSessQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcSess findOne(PropelPDO $con = null) Return the first CcSess matching the query - * @method CcSess findOneOrCreate(PropelPDO $con = null) Return the first CcSess matching the query, or a new CcSess object populated from the query conditions when no match is found + * @method CcSessQuery leftJoinCcSubjs($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSubjs relation + * @method CcSessQuery rightJoinCcSubjs($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSubjs relation + * @method CcSessQuery innerJoinCcSubjs($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSubjs relation * - * @method CcSess findOneBySessid(string $sessid) Return the first CcSess filtered by the sessid column - * @method CcSess findOneByUserid(int $userid) Return the first CcSess filtered by the userid column - * @method CcSess findOneByLogin(string $login) Return the first CcSess filtered by the login column - * @method CcSess findOneByTs(string $ts) Return the first CcSess filtered by the ts column + * @method CcSess findOne(PropelPDO $con = null) Return the first CcSess matching the query + * @method CcSess findOneOrCreate(PropelPDO $con = null) Return the first CcSess matching the query, or a new CcSess object populated from the query conditions when no match is found * - * @method array findBySessid(string $sessid) Return CcSess objects filtered by the sessid column - * @method array findByUserid(int $userid) Return CcSess objects filtered by the userid column - * @method array findByLogin(string $login) Return CcSess objects filtered by the login column - * @method array findByTs(string $ts) Return CcSess objects filtered by the ts column + * @method CcSess findOneByUserid(int $userid) Return the first CcSess filtered by the userid column + * @method CcSess findOneByLogin(string $login) Return the first CcSess filtered by the login column + * @method CcSess findOneByTs(string $ts) Return the first CcSess filtered by the ts column + * + * @method array findBySessid(string $sessid) Return CcSess objects filtered by the sessid column + * @method array findByUserid(int $userid) Return CcSess objects filtered by the userid column + * @method array findByLogin(string $login) Return CcSess objects filtered by the login column + * @method array findByTs(string $ts) Return CcSess objects filtered by the ts column * * @package propel.generator.airtime.om */ abstract class BaseCcSessQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcSessQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcSess'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcSessQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcSessQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcSessQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcSessQuery) { + return $criteria; + } + $query = new CcSessQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcSess|CcSess[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcSessPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcSessPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSess A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneBySessid($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSess A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "sessid", "userid", "login", "ts" FROM "cc_sess" WHERE "sessid" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_STR); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcSess(); + $obj->hydrate($row); + CcSessPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSess|CcSess[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcSess[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcSessQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcSessPeer::SESSID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcSessQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcSessPeer::SESSID, $keys, Criteria::IN); + } + + /** + * Filter the query on the sessid column + * + * Example usage: + * + * $query->filterBySessid('fooValue'); // WHERE sessid = 'fooValue' + * $query->filterBySessid('%fooValue%'); // WHERE sessid LIKE '%fooValue%' + * + * + * @param string $sessid The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSessQuery The current query, for fluid interface + */ + public function filterBySessid($sessid = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($sessid)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $sessid)) { + $sessid = str_replace('*', '%', $sessid); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSessPeer::SESSID, $sessid, $comparison); + } + + /** + * Filter the query on the userid column + * + * Example usage: + * + * $query->filterByUserid(1234); // WHERE userid = 1234 + * $query->filterByUserid(array(12, 34)); // WHERE userid IN (12, 34) + * $query->filterByUserid(array('min' => 12)); // WHERE userid >= 12 + * $query->filterByUserid(array('max' => 12)); // WHERE userid <= 12 + * + * + * @see filterByCcSubjs() + * + * @param mixed $userid The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSessQuery The current query, for fluid interface + */ + public function filterByUserid($userid = null, $comparison = null) + { + if (is_array($userid)) { + $useMinMax = false; + if (isset($userid['min'])) { + $this->addUsingAlias(CcSessPeer::USERID, $userid['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($userid['max'])) { + $this->addUsingAlias(CcSessPeer::USERID, $userid['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSessPeer::USERID, $userid, $comparison); + } + + /** + * Filter the query on the login column + * + * Example usage: + * + * $query->filterByLogin('fooValue'); // WHERE login = 'fooValue' + * $query->filterByLogin('%fooValue%'); // WHERE login LIKE '%fooValue%' + * + * + * @param string $login The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSessQuery The current query, for fluid interface + */ + public function filterByLogin($login = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($login)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $login)) { + $login = str_replace('*', '%', $login); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSessPeer::LOGIN, $login, $comparison); + } + + /** + * Filter the query on the ts column + * + * Example usage: + * + * $query->filterByTs('2011-03-14'); // WHERE ts = '2011-03-14' + * $query->filterByTs('now'); // WHERE ts = '2011-03-14' + * $query->filterByTs(array('max' => 'yesterday')); // WHERE ts < '2011-03-13' + * + * + * @param mixed $ts The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSessQuery The current query, for fluid interface + */ + public function filterByTs($ts = null, $comparison = null) + { + if (is_array($ts)) { + $useMinMax = false; + if (isset($ts['min'])) { + $this->addUsingAlias(CcSessPeer::TS, $ts['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($ts['max'])) { + $this->addUsingAlias(CcSessPeer::TS, $ts['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSessPeer::TS, $ts, $comparison); + } + + /** + * Filter the query by a related CcSubjs object + * + * @param CcSubjs|PropelObjectCollection $ccSubjs The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSessQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSubjs($ccSubjs, $comparison = null) + { + if ($ccSubjs instanceof CcSubjs) { + return $this + ->addUsingAlias(CcSessPeer::USERID, $ccSubjs->getDbId(), $comparison); + } elseif ($ccSubjs instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcSessPeer::USERID, $ccSubjs->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcSubjs() only accepts arguments of type CcSubjs or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSubjs relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSessQuery The current query, for fluid interface + */ + public function joinCcSubjs($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSubjs'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSubjs'); + } + + return $this; + } + + /** + * Use the CcSubjs relation CcSubjs object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery A secondary query class using the current class as primary query + */ + public function useCcSubjsQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcSubjs($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); + } + + /** + * Exclude object from result + * + * @param CcSess $ccSess Object to remove from the list of results + * + * @return CcSessQuery The current query, for fluid interface + */ + public function prune($ccSess = null) + { + if ($ccSess) { + $this->addUsingAlias(CcSessPeer::SESSID, $ccSess->getSessid(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcSessQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcSess', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcSessQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcSessQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcSessQuery) { - return $criteria; - } - $query = new CcSessQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcSess|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcSessPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcSessQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcSessPeer::SESSID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcSessQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcSessPeer::SESSID, $keys, Criteria::IN); - } - - /** - * Filter the query on the sessid column - * - * @param string $sessid The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSessQuery The current query, for fluid interface - */ - public function filterBySessid($sessid = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($sessid)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $sessid)) { - $sessid = str_replace('*', '%', $sessid); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSessPeer::SESSID, $sessid, $comparison); - } - - /** - * Filter the query on the userid column - * - * @param int|array $userid The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSessQuery The current query, for fluid interface - */ - public function filterByUserid($userid = null, $comparison = null) - { - if (is_array($userid)) { - $useMinMax = false; - if (isset($userid['min'])) { - $this->addUsingAlias(CcSessPeer::USERID, $userid['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($userid['max'])) { - $this->addUsingAlias(CcSessPeer::USERID, $userid['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSessPeer::USERID, $userid, $comparison); - } - - /** - * Filter the query on the login column - * - * @param string $login The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSessQuery The current query, for fluid interface - */ - public function filterByLogin($login = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($login)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $login)) { - $login = str_replace('*', '%', $login); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSessPeer::LOGIN, $login, $comparison); - } - - /** - * Filter the query on the ts column - * - * @param string|array $ts The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSessQuery The current query, for fluid interface - */ - public function filterByTs($ts = null, $comparison = null) - { - if (is_array($ts)) { - $useMinMax = false; - if (isset($ts['min'])) { - $this->addUsingAlias(CcSessPeer::TS, $ts['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($ts['max'])) { - $this->addUsingAlias(CcSessPeer::TS, $ts['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSessPeer::TS, $ts, $comparison); - } - - /** - * Filter the query by a related CcSubjs object - * - * @param CcSubjs $ccSubjs the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSessQuery The current query, for fluid interface - */ - public function filterByCcSubjs($ccSubjs, $comparison = null) - { - return $this - ->addUsingAlias(CcSessPeer::USERID, $ccSubjs->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSubjs relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSessQuery The current query, for fluid interface - */ - public function joinCcSubjs($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSubjs'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSubjs'); - } - - return $this; - } - - /** - * Use the CcSubjs relation CcSubjs object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery A secondary query class using the current class as primary query - */ - public function useCcSubjsQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcSubjs($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); - } - - /** - * Exclude object from result - * - * @param CcSess $ccSess Object to remove from the list of results - * - * @return CcSessQuery The current query, for fluid interface - */ - public function prune($ccSess = null) - { - if ($ccSess) { - $this->addUsingAlias(CcSessPeer::SESSID, $ccSess->getSessid(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcSessQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShow.php b/airtime_mvc/application/models/airtime/om/BaseCcShow.php index 3cf4dab1f8..172ad31a9e 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShow.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShow.php @@ -4,1963 +4,2779 @@ /** * Base class that represents a row from the 'cc_show' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcShow extends BaseObject implements Persistent +abstract class BaseCcShow extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcShowPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcShowPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the name field. - * Note: this column has a database default value of: '' - * @var string - */ - protected $name; - - /** - * The value for the url field. - * Note: this column has a database default value of: '' - * @var string - */ - protected $url; - - /** - * The value for the genre field. - * Note: this column has a database default value of: '' - * @var string - */ - protected $genre; - - /** - * The value for the description field. - * @var string - */ - protected $description; - - /** - * The value for the color field. - * @var string - */ - protected $color; - - /** - * The value for the background_color field. - * @var string - */ - protected $background_color; - - /** - * The value for the live_stream_using_airtime_auth field. - * Note: this column has a database default value of: false - * @var boolean - */ - protected $live_stream_using_airtime_auth; - - /** - * The value for the live_stream_using_custom_auth field. - * Note: this column has a database default value of: false - * @var boolean - */ - protected $live_stream_using_custom_auth; - - /** - * The value for the live_stream_user field. - * @var string - */ - protected $live_stream_user; - - /** - * The value for the live_stream_pass field. - * @var string - */ - protected $live_stream_pass; - - /** - * The value for the linked field. - * Note: this column has a database default value of: false - * @var boolean - */ - protected $linked; - - /** - * The value for the is_linkable field. - * Note: this column has a database default value of: true - * @var boolean - */ - protected $is_linkable; - - /** - * @var array CcShowInstances[] Collection to store aggregation of CcShowInstances objects. - */ - protected $collCcShowInstancess; - - /** - * @var array CcShowDays[] Collection to store aggregation of CcShowDays objects. - */ - protected $collCcShowDayss; - - /** - * @var array CcShowRebroadcast[] Collection to store aggregation of CcShowRebroadcast objects. - */ - protected $collCcShowRebroadcasts; - - /** - * @var array CcShowHosts[] Collection to store aggregation of CcShowHosts objects. - */ - protected $collCcShowHostss; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->name = ''; - $this->url = ''; - $this->genre = ''; - $this->live_stream_using_airtime_auth = false; - $this->live_stream_using_custom_auth = false; - $this->linked = false; - $this->is_linkable = true; - } - - /** - * Initializes internal state of BaseCcShow object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [name] column value. - * - * @return string - */ - public function getDbName() - { - return $this->name; - } - - /** - * Get the [url] column value. - * - * @return string - */ - public function getDbUrl() - { - return $this->url; - } - - /** - * Get the [genre] column value. - * - * @return string - */ - public function getDbGenre() - { - return $this->genre; - } - - /** - * Get the [description] column value. - * - * @return string - */ - public function getDbDescription() - { - return $this->description; - } - - /** - * Get the [color] column value. - * - * @return string - */ - public function getDbColor() - { - return $this->color; - } - - /** - * Get the [background_color] column value. - * - * @return string - */ - public function getDbBackgroundColor() - { - return $this->background_color; - } - - /** - * Get the [live_stream_using_airtime_auth] column value. - * - * @return boolean - */ - public function getDbLiveStreamUsingAirtimeAuth() - { - return $this->live_stream_using_airtime_auth; - } - - /** - * Get the [live_stream_using_custom_auth] column value. - * - * @return boolean - */ - public function getDbLiveStreamUsingCustomAuth() - { - return $this->live_stream_using_custom_auth; - } - - /** - * Get the [live_stream_user] column value. - * - * @return string - */ - public function getDbLiveStreamUser() - { - return $this->live_stream_user; - } - - /** - * Get the [live_stream_pass] column value. - * - * @return string - */ - public function getDbLiveStreamPass() - { - return $this->live_stream_pass; - } - - /** - * Get the [linked] column value. - * - * @return boolean - */ - public function getDbLinked() - { - return $this->linked; - } - - /** - * Get the [is_linkable] column value. - * - * @return boolean - */ - public function getDbIsLinkable() - { - return $this->is_linkable; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcShow The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcShowPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [name] column. - * - * @param string $v new value - * @return CcShow The current object (for fluent API support) - */ - public function setDbName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->name !== $v || $this->isNew()) { - $this->name = $v; - $this->modifiedColumns[] = CcShowPeer::NAME; - } - - return $this; - } // setDbName() - - /** - * Set the value of [url] column. - * - * @param string $v new value - * @return CcShow The current object (for fluent API support) - */ - public function setDbUrl($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->url !== $v || $this->isNew()) { - $this->url = $v; - $this->modifiedColumns[] = CcShowPeer::URL; - } - - return $this; - } // setDbUrl() - - /** - * Set the value of [genre] column. - * - * @param string $v new value - * @return CcShow The current object (for fluent API support) - */ - public function setDbGenre($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->genre !== $v || $this->isNew()) { - $this->genre = $v; - $this->modifiedColumns[] = CcShowPeer::GENRE; - } - - return $this; - } // setDbGenre() - - /** - * Set the value of [description] column. - * - * @param string $v new value - * @return CcShow The current object (for fluent API support) - */ - public function setDbDescription($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->description !== $v) { - $this->description = $v; - $this->modifiedColumns[] = CcShowPeer::DESCRIPTION; - } - - return $this; - } // setDbDescription() - - /** - * Set the value of [color] column. - * - * @param string $v new value - * @return CcShow The current object (for fluent API support) - */ - public function setDbColor($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->color !== $v) { - $this->color = $v; - $this->modifiedColumns[] = CcShowPeer::COLOR; - } - - return $this; - } // setDbColor() - - /** - * Set the value of [background_color] column. - * - * @param string $v new value - * @return CcShow The current object (for fluent API support) - */ - public function setDbBackgroundColor($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->background_color !== $v) { - $this->background_color = $v; - $this->modifiedColumns[] = CcShowPeer::BACKGROUND_COLOR; - } - - return $this; - } // setDbBackgroundColor() - - /** - * Set the value of [live_stream_using_airtime_auth] column. - * - * @param boolean $v new value - * @return CcShow The current object (for fluent API support) - */ - public function setDbLiveStreamUsingAirtimeAuth($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->live_stream_using_airtime_auth !== $v || $this->isNew()) { - $this->live_stream_using_airtime_auth = $v; - $this->modifiedColumns[] = CcShowPeer::LIVE_STREAM_USING_AIRTIME_AUTH; - } - - return $this; - } // setDbLiveStreamUsingAirtimeAuth() - - /** - * Set the value of [live_stream_using_custom_auth] column. - * - * @param boolean $v new value - * @return CcShow The current object (for fluent API support) - */ - public function setDbLiveStreamUsingCustomAuth($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->live_stream_using_custom_auth !== $v || $this->isNew()) { - $this->live_stream_using_custom_auth = $v; - $this->modifiedColumns[] = CcShowPeer::LIVE_STREAM_USING_CUSTOM_AUTH; - } - - return $this; - } // setDbLiveStreamUsingCustomAuth() - - /** - * Set the value of [live_stream_user] column. - * - * @param string $v new value - * @return CcShow The current object (for fluent API support) - */ - public function setDbLiveStreamUser($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->live_stream_user !== $v) { - $this->live_stream_user = $v; - $this->modifiedColumns[] = CcShowPeer::LIVE_STREAM_USER; - } - - return $this; - } // setDbLiveStreamUser() - - /** - * Set the value of [live_stream_pass] column. - * - * @param string $v new value - * @return CcShow The current object (for fluent API support) - */ - public function setDbLiveStreamPass($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->live_stream_pass !== $v) { - $this->live_stream_pass = $v; - $this->modifiedColumns[] = CcShowPeer::LIVE_STREAM_PASS; - } - - return $this; - } // setDbLiveStreamPass() - - /** - * Set the value of [linked] column. - * - * @param boolean $v new value - * @return CcShow The current object (for fluent API support) - */ - public function setDbLinked($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->linked !== $v || $this->isNew()) { - $this->linked = $v; - $this->modifiedColumns[] = CcShowPeer::LINKED; - } - - return $this; - } // setDbLinked() - - /** - * Set the value of [is_linkable] column. - * - * @param boolean $v new value - * @return CcShow The current object (for fluent API support) - */ - public function setDbIsLinkable($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->is_linkable !== $v || $this->isNew()) { - $this->is_linkable = $v; - $this->modifiedColumns[] = CcShowPeer::IS_LINKABLE; - } - - return $this; - } // setDbIsLinkable() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->name !== '') { - return false; - } - - if ($this->url !== '') { - return false; - } - - if ($this->genre !== '') { - return false; - } - - if ($this->live_stream_using_airtime_auth !== false) { - return false; - } - - if ($this->live_stream_using_custom_auth !== false) { - return false; - } - - if ($this->linked !== false) { - return false; - } - - if ($this->is_linkable !== true) { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->url = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->genre = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->description = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; - $this->color = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; - $this->background_color = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; - $this->live_stream_using_airtime_auth = ($row[$startcol + 7] !== null) ? (boolean) $row[$startcol + 7] : null; - $this->live_stream_using_custom_auth = ($row[$startcol + 8] !== null) ? (boolean) $row[$startcol + 8] : null; - $this->live_stream_user = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; - $this->live_stream_pass = ($row[$startcol + 10] !== null) ? (string) $row[$startcol + 10] : null; - $this->linked = ($row[$startcol + 11] !== null) ? (boolean) $row[$startcol + 11] : null; - $this->is_linkable = ($row[$startcol + 12] !== null) ? (boolean) $row[$startcol + 12] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 13; // 13 = CcShowPeer::NUM_COLUMNS - CcShowPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcShow object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcShowPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->collCcShowInstancess = null; - - $this->collCcShowDayss = null; - - $this->collCcShowRebroadcasts = null; - - $this->collCcShowHostss = null; - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcShowQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcShowPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcShowPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcShowPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows = CcShowPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - if ($this->collCcShowInstancess !== null) { - foreach ($this->collCcShowInstancess as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcShowDayss !== null) { - foreach ($this->collCcShowDayss as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcShowRebroadcasts !== null) { - foreach ($this->collCcShowRebroadcasts as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcShowHostss !== null) { - foreach ($this->collCcShowHostss as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcShowPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - if ($this->collCcShowInstancess !== null) { - foreach ($this->collCcShowInstancess as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcShowDayss !== null) { - foreach ($this->collCcShowDayss as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcShowRebroadcasts !== null) { - foreach ($this->collCcShowRebroadcasts as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcShowHostss !== null) { - foreach ($this->collCcShowHostss as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcShowPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbName(); - break; - case 2: - return $this->getDbUrl(); - break; - case 3: - return $this->getDbGenre(); - break; - case 4: - return $this->getDbDescription(); - break; - case 5: - return $this->getDbColor(); - break; - case 6: - return $this->getDbBackgroundColor(); - break; - case 7: - return $this->getDbLiveStreamUsingAirtimeAuth(); - break; - case 8: - return $this->getDbLiveStreamUsingCustomAuth(); - break; - case 9: - return $this->getDbLiveStreamUser(); - break; - case 10: - return $this->getDbLiveStreamPass(); - break; - case 11: - return $this->getDbLinked(); - break; - case 12: - return $this->getDbIsLinkable(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcShowPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbName(), - $keys[2] => $this->getDbUrl(), - $keys[3] => $this->getDbGenre(), - $keys[4] => $this->getDbDescription(), - $keys[5] => $this->getDbColor(), - $keys[6] => $this->getDbBackgroundColor(), - $keys[7] => $this->getDbLiveStreamUsingAirtimeAuth(), - $keys[8] => $this->getDbLiveStreamUsingCustomAuth(), - $keys[9] => $this->getDbLiveStreamUser(), - $keys[10] => $this->getDbLiveStreamPass(), - $keys[11] => $this->getDbLinked(), - $keys[12] => $this->getDbIsLinkable(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcShowPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbName($value); - break; - case 2: - $this->setDbUrl($value); - break; - case 3: - $this->setDbGenre($value); - break; - case 4: - $this->setDbDescription($value); - break; - case 5: - $this->setDbColor($value); - break; - case 6: - $this->setDbBackgroundColor($value); - break; - case 7: - $this->setDbLiveStreamUsingAirtimeAuth($value); - break; - case 8: - $this->setDbLiveStreamUsingCustomAuth($value); - break; - case 9: - $this->setDbLiveStreamUser($value); - break; - case 10: - $this->setDbLiveStreamPass($value); - break; - case 11: - $this->setDbLinked($value); - break; - case 12: - $this->setDbIsLinkable($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcShowPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbUrl($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbGenre($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbDescription($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setDbColor($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setDbBackgroundColor($arr[$keys[6]]); - if (array_key_exists($keys[7], $arr)) $this->setDbLiveStreamUsingAirtimeAuth($arr[$keys[7]]); - if (array_key_exists($keys[8], $arr)) $this->setDbLiveStreamUsingCustomAuth($arr[$keys[8]]); - if (array_key_exists($keys[9], $arr)) $this->setDbLiveStreamUser($arr[$keys[9]]); - if (array_key_exists($keys[10], $arr)) $this->setDbLiveStreamPass($arr[$keys[10]]); - if (array_key_exists($keys[11], $arr)) $this->setDbLinked($arr[$keys[11]]); - if (array_key_exists($keys[12], $arr)) $this->setDbIsLinkable($arr[$keys[12]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcShowPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcShowPeer::ID)) $criteria->add(CcShowPeer::ID, $this->id); - if ($this->isColumnModified(CcShowPeer::NAME)) $criteria->add(CcShowPeer::NAME, $this->name); - if ($this->isColumnModified(CcShowPeer::URL)) $criteria->add(CcShowPeer::URL, $this->url); - if ($this->isColumnModified(CcShowPeer::GENRE)) $criteria->add(CcShowPeer::GENRE, $this->genre); - if ($this->isColumnModified(CcShowPeer::DESCRIPTION)) $criteria->add(CcShowPeer::DESCRIPTION, $this->description); - if ($this->isColumnModified(CcShowPeer::COLOR)) $criteria->add(CcShowPeer::COLOR, $this->color); - if ($this->isColumnModified(CcShowPeer::BACKGROUND_COLOR)) $criteria->add(CcShowPeer::BACKGROUND_COLOR, $this->background_color); - if ($this->isColumnModified(CcShowPeer::LIVE_STREAM_USING_AIRTIME_AUTH)) $criteria->add(CcShowPeer::LIVE_STREAM_USING_AIRTIME_AUTH, $this->live_stream_using_airtime_auth); - if ($this->isColumnModified(CcShowPeer::LIVE_STREAM_USING_CUSTOM_AUTH)) $criteria->add(CcShowPeer::LIVE_STREAM_USING_CUSTOM_AUTH, $this->live_stream_using_custom_auth); - if ($this->isColumnModified(CcShowPeer::LIVE_STREAM_USER)) $criteria->add(CcShowPeer::LIVE_STREAM_USER, $this->live_stream_user); - if ($this->isColumnModified(CcShowPeer::LIVE_STREAM_PASS)) $criteria->add(CcShowPeer::LIVE_STREAM_PASS, $this->live_stream_pass); - if ($this->isColumnModified(CcShowPeer::LINKED)) $criteria->add(CcShowPeer::LINKED, $this->linked); - if ($this->isColumnModified(CcShowPeer::IS_LINKABLE)) $criteria->add(CcShowPeer::IS_LINKABLE, $this->is_linkable); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcShowPeer::DATABASE_NAME); - $criteria->add(CcShowPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcShow (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbName($this->name); - $copyObj->setDbUrl($this->url); - $copyObj->setDbGenre($this->genre); - $copyObj->setDbDescription($this->description); - $copyObj->setDbColor($this->color); - $copyObj->setDbBackgroundColor($this->background_color); - $copyObj->setDbLiveStreamUsingAirtimeAuth($this->live_stream_using_airtime_auth); - $copyObj->setDbLiveStreamUsingCustomAuth($this->live_stream_using_custom_auth); - $copyObj->setDbLiveStreamUser($this->live_stream_user); - $copyObj->setDbLiveStreamPass($this->live_stream_pass); - $copyObj->setDbLinked($this->linked); - $copyObj->setDbIsLinkable($this->is_linkable); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getCcShowInstancess() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcShowInstances($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcShowDayss() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcShowDays($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcShowRebroadcasts() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcShowRebroadcast($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcShowHostss() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcShowHosts($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcShow Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcShowPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcShowPeer(); - } - return self::$peer; - } - - /** - * Clears out the collCcShowInstancess collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcShowInstancess() - */ - public function clearCcShowInstancess() - { - $this->collCcShowInstancess = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcShowInstancess collection. - * - * By default this just sets the collCcShowInstancess collection to an empty array (like clearcollCcShowInstancess()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcShowInstancess() - { - $this->collCcShowInstancess = new PropelObjectCollection(); - $this->collCcShowInstancess->setModel('CcShowInstances'); - } - - /** - * Gets an array of CcShowInstances objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcShow is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcShowInstances[] List of CcShowInstances objects - * @throws PropelException - */ - public function getCcShowInstancess($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcShowInstancess || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowInstancess) { - // return empty collection - $this->initCcShowInstancess(); - } else { - $collCcShowInstancess = CcShowInstancesQuery::create(null, $criteria) - ->filterByCcShow($this) - ->find($con); - if (null !== $criteria) { - return $collCcShowInstancess; - } - $this->collCcShowInstancess = $collCcShowInstancess; - } - } - return $this->collCcShowInstancess; - } - - /** - * Returns the number of related CcShowInstances objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcShowInstances objects. - * @throws PropelException - */ - public function countCcShowInstancess(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcShowInstancess || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowInstancess) { - return 0; - } else { - $query = CcShowInstancesQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcShow($this) - ->count($con); - } - } else { - return count($this->collCcShowInstancess); - } - } - - /** - * Method called to associate a CcShowInstances object to this object - * through the CcShowInstances foreign key attribute. - * - * @param CcShowInstances $l CcShowInstances - * @return void - * @throws PropelException - */ - public function addCcShowInstances(CcShowInstances $l) - { - if ($this->collCcShowInstancess === null) { - $this->initCcShowInstancess(); - } - if (!$this->collCcShowInstancess->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcShowInstancess[]= $l; - $l->setCcShow($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcShow is new, it will return - * an empty collection; or if this CcShow has previously - * been saved, it will retrieve related CcShowInstancess from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcShow. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcShowInstances[] List of CcShowInstances objects - */ - public function getCcShowInstancessJoinCcShowInstancesRelatedByDbOriginalShow($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcShowInstancesQuery::create(null, $criteria); - $query->joinWith('CcShowInstancesRelatedByDbOriginalShow', $join_behavior); - - return $this->getCcShowInstancess($query, $con); - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcShow is new, it will return - * an empty collection; or if this CcShow has previously - * been saved, it will retrieve related CcShowInstancess from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcShow. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcShowInstances[] List of CcShowInstances objects - */ - public function getCcShowInstancessJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcShowInstancesQuery::create(null, $criteria); - $query->joinWith('CcFiles', $join_behavior); - - return $this->getCcShowInstancess($query, $con); - } - - /** - * Clears out the collCcShowDayss collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcShowDayss() - */ - public function clearCcShowDayss() - { - $this->collCcShowDayss = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcShowDayss collection. - * - * By default this just sets the collCcShowDayss collection to an empty array (like clearcollCcShowDayss()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcShowDayss() - { - $this->collCcShowDayss = new PropelObjectCollection(); - $this->collCcShowDayss->setModel('CcShowDays'); - } - - /** - * Gets an array of CcShowDays objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcShow is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcShowDays[] List of CcShowDays objects - * @throws PropelException - */ - public function getCcShowDayss($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcShowDayss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowDayss) { - // return empty collection - $this->initCcShowDayss(); - } else { - $collCcShowDayss = CcShowDaysQuery::create(null, $criteria) - ->filterByCcShow($this) - ->find($con); - if (null !== $criteria) { - return $collCcShowDayss; - } - $this->collCcShowDayss = $collCcShowDayss; - } - } - return $this->collCcShowDayss; - } - - /** - * Returns the number of related CcShowDays objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcShowDays objects. - * @throws PropelException - */ - public function countCcShowDayss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcShowDayss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowDayss) { - return 0; - } else { - $query = CcShowDaysQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcShow($this) - ->count($con); - } - } else { - return count($this->collCcShowDayss); - } - } - - /** - * Method called to associate a CcShowDays object to this object - * through the CcShowDays foreign key attribute. - * - * @param CcShowDays $l CcShowDays - * @return void - * @throws PropelException - */ - public function addCcShowDays(CcShowDays $l) - { - if ($this->collCcShowDayss === null) { - $this->initCcShowDayss(); - } - if (!$this->collCcShowDayss->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcShowDayss[]= $l; - $l->setCcShow($this); - } - } - - /** - * Clears out the collCcShowRebroadcasts collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcShowRebroadcasts() - */ - public function clearCcShowRebroadcasts() - { - $this->collCcShowRebroadcasts = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcShowRebroadcasts collection. - * - * By default this just sets the collCcShowRebroadcasts collection to an empty array (like clearcollCcShowRebroadcasts()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcShowRebroadcasts() - { - $this->collCcShowRebroadcasts = new PropelObjectCollection(); - $this->collCcShowRebroadcasts->setModel('CcShowRebroadcast'); - } - - /** - * Gets an array of CcShowRebroadcast objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcShow is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcShowRebroadcast[] List of CcShowRebroadcast objects - * @throws PropelException - */ - public function getCcShowRebroadcasts($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcShowRebroadcasts || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowRebroadcasts) { - // return empty collection - $this->initCcShowRebroadcasts(); - } else { - $collCcShowRebroadcasts = CcShowRebroadcastQuery::create(null, $criteria) - ->filterByCcShow($this) - ->find($con); - if (null !== $criteria) { - return $collCcShowRebroadcasts; - } - $this->collCcShowRebroadcasts = $collCcShowRebroadcasts; - } - } - return $this->collCcShowRebroadcasts; - } - - /** - * Returns the number of related CcShowRebroadcast objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcShowRebroadcast objects. - * @throws PropelException - */ - public function countCcShowRebroadcasts(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcShowRebroadcasts || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowRebroadcasts) { - return 0; - } else { - $query = CcShowRebroadcastQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcShow($this) - ->count($con); - } - } else { - return count($this->collCcShowRebroadcasts); - } - } - - /** - * Method called to associate a CcShowRebroadcast object to this object - * through the CcShowRebroadcast foreign key attribute. - * - * @param CcShowRebroadcast $l CcShowRebroadcast - * @return void - * @throws PropelException - */ - public function addCcShowRebroadcast(CcShowRebroadcast $l) - { - if ($this->collCcShowRebroadcasts === null) { - $this->initCcShowRebroadcasts(); - } - if (!$this->collCcShowRebroadcasts->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcShowRebroadcasts[]= $l; - $l->setCcShow($this); - } - } - - /** - * Clears out the collCcShowHostss collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcShowHostss() - */ - public function clearCcShowHostss() - { - $this->collCcShowHostss = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcShowHostss collection. - * - * By default this just sets the collCcShowHostss collection to an empty array (like clearcollCcShowHostss()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcShowHostss() - { - $this->collCcShowHostss = new PropelObjectCollection(); - $this->collCcShowHostss->setModel('CcShowHosts'); - } - - /** - * Gets an array of CcShowHosts objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcShow is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcShowHosts[] List of CcShowHosts objects - * @throws PropelException - */ - public function getCcShowHostss($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcShowHostss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowHostss) { - // return empty collection - $this->initCcShowHostss(); - } else { - $collCcShowHostss = CcShowHostsQuery::create(null, $criteria) - ->filterByCcShow($this) - ->find($con); - if (null !== $criteria) { - return $collCcShowHostss; - } - $this->collCcShowHostss = $collCcShowHostss; - } - } - return $this->collCcShowHostss; - } - - /** - * Returns the number of related CcShowHosts objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcShowHosts objects. - * @throws PropelException - */ - public function countCcShowHostss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcShowHostss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowHostss) { - return 0; - } else { - $query = CcShowHostsQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcShow($this) - ->count($con); - } - } else { - return count($this->collCcShowHostss); - } - } - - /** - * Method called to associate a CcShowHosts object to this object - * through the CcShowHosts foreign key attribute. - * - * @param CcShowHosts $l CcShowHosts - * @return void - * @throws PropelException - */ - public function addCcShowHosts(CcShowHosts $l) - { - if ($this->collCcShowHostss === null) { - $this->initCcShowHostss(); - } - if (!$this->collCcShowHostss->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcShowHostss[]= $l; - $l->setCcShow($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcShow is new, it will return - * an empty collection; or if this CcShow has previously - * been saved, it will retrieve related CcShowHostss from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcShow. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcShowHosts[] List of CcShowHosts objects - */ - public function getCcShowHostssJoinCcSubjs($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcShowHostsQuery::create(null, $criteria); - $query->joinWith('CcSubjs', $join_behavior); - - return $this->getCcShowHostss($query, $con); - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->name = null; - $this->url = null; - $this->genre = null; - $this->description = null; - $this->color = null; - $this->background_color = null; - $this->live_stream_using_airtime_auth = null; - $this->live_stream_using_custom_auth = null; - $this->live_stream_user = null; - $this->live_stream_pass = null; - $this->linked = null; - $this->is_linkable = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - if ($this->collCcShowInstancess) { - foreach ((array) $this->collCcShowInstancess as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcShowDayss) { - foreach ((array) $this->collCcShowDayss as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcShowRebroadcasts) { - foreach ((array) $this->collCcShowRebroadcasts as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcShowHostss) { - foreach ((array) $this->collCcShowHostss as $o) { - $o->clearAllReferences($deep); - } - } - } // if ($deep) - - $this->collCcShowInstancess = null; - $this->collCcShowDayss = null; - $this->collCcShowRebroadcasts = null; - $this->collCcShowHostss = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcShow + /** + * Peer class name + */ + const PEER = 'CcShowPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcShowPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the name field. + * Note: this column has a database default value of: '' + * @var string + */ + protected $name; + + /** + * The value for the url field. + * Note: this column has a database default value of: '' + * @var string + */ + protected $url; + + /** + * The value for the genre field. + * Note: this column has a database default value of: '' + * @var string + */ + protected $genre; + + /** + * The value for the description field. + * @var string + */ + protected $description; + + /** + * The value for the color field. + * @var string + */ + protected $color; + + /** + * The value for the background_color field. + * @var string + */ + protected $background_color; + + /** + * The value for the live_stream_using_airtime_auth field. + * Note: this column has a database default value of: false + * @var boolean + */ + protected $live_stream_using_airtime_auth; + + /** + * The value for the live_stream_using_custom_auth field. + * Note: this column has a database default value of: false + * @var boolean + */ + protected $live_stream_using_custom_auth; + + /** + * The value for the live_stream_user field. + * @var string + */ + protected $live_stream_user; + + /** + * The value for the live_stream_pass field. + * @var string + */ + protected $live_stream_pass; + + /** + * The value for the linked field. + * Note: this column has a database default value of: false + * @var boolean + */ + protected $linked; + + /** + * The value for the is_linkable field. + * Note: this column has a database default value of: true + * @var boolean + */ + protected $is_linkable; + + /** + * @var PropelObjectCollection|CcShowInstances[] Collection to store aggregation of CcShowInstances objects. + */ + protected $collCcShowInstancess; + protected $collCcShowInstancessPartial; + + /** + * @var PropelObjectCollection|CcShowDays[] Collection to store aggregation of CcShowDays objects. + */ + protected $collCcShowDayss; + protected $collCcShowDayssPartial; + + /** + * @var PropelObjectCollection|CcShowRebroadcast[] Collection to store aggregation of CcShowRebroadcast objects. + */ + protected $collCcShowRebroadcasts; + protected $collCcShowRebroadcastsPartial; + + /** + * @var PropelObjectCollection|CcShowHosts[] Collection to store aggregation of CcShowHosts objects. + */ + protected $collCcShowHostss; + protected $collCcShowHostssPartial; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccShowInstancessScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccShowDayssScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccShowRebroadcastsScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccShowHostssScheduledForDeletion = null; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->name = ''; + $this->url = ''; + $this->genre = ''; + $this->live_stream_using_airtime_auth = false; + $this->live_stream_using_custom_auth = false; + $this->linked = false; + $this->is_linkable = true; + } + + /** + * Initializes internal state of BaseCcShow object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [name] column value. + * + * @return string + */ + public function getDbName() + { + + return $this->name; + } + + /** + * Get the [url] column value. + * + * @return string + */ + public function getDbUrl() + { + + return $this->url; + } + + /** + * Get the [genre] column value. + * + * @return string + */ + public function getDbGenre() + { + + return $this->genre; + } + + /** + * Get the [description] column value. + * + * @return string + */ + public function getDbDescription() + { + + return $this->description; + } + + /** + * Get the [color] column value. + * + * @return string + */ + public function getDbColor() + { + + return $this->color; + } + + /** + * Get the [background_color] column value. + * + * @return string + */ + public function getDbBackgroundColor() + { + + return $this->background_color; + } + + /** + * Get the [live_stream_using_airtime_auth] column value. + * + * @return boolean + */ + public function getDbLiveStreamUsingAirtimeAuth() + { + + return $this->live_stream_using_airtime_auth; + } + + /** + * Get the [live_stream_using_custom_auth] column value. + * + * @return boolean + */ + public function getDbLiveStreamUsingCustomAuth() + { + + return $this->live_stream_using_custom_auth; + } + + /** + * Get the [live_stream_user] column value. + * + * @return string + */ + public function getDbLiveStreamUser() + { + + return $this->live_stream_user; + } + + /** + * Get the [live_stream_pass] column value. + * + * @return string + */ + public function getDbLiveStreamPass() + { + + return $this->live_stream_pass; + } + + /** + * Get the [linked] column value. + * + * @return boolean + */ + public function getDbLinked() + { + + return $this->linked; + } + + /** + * Get the [is_linkable] column value. + * + * @return boolean + */ + public function getDbIsLinkable() + { + + return $this->is_linkable; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcShow The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcShowPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [name] column. + * + * @param string $v new value + * @return CcShow The current object (for fluent API support) + */ + public function setDbName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->name !== $v) { + $this->name = $v; + $this->modifiedColumns[] = CcShowPeer::NAME; + } + + + return $this; + } // setDbName() + + /** + * Set the value of [url] column. + * + * @param string $v new value + * @return CcShow The current object (for fluent API support) + */ + public function setDbUrl($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->url !== $v) { + $this->url = $v; + $this->modifiedColumns[] = CcShowPeer::URL; + } + + + return $this; + } // setDbUrl() + + /** + * Set the value of [genre] column. + * + * @param string $v new value + * @return CcShow The current object (for fluent API support) + */ + public function setDbGenre($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->genre !== $v) { + $this->genre = $v; + $this->modifiedColumns[] = CcShowPeer::GENRE; + } + + + return $this; + } // setDbGenre() + + /** + * Set the value of [description] column. + * + * @param string $v new value + * @return CcShow The current object (for fluent API support) + */ + public function setDbDescription($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->description !== $v) { + $this->description = $v; + $this->modifiedColumns[] = CcShowPeer::DESCRIPTION; + } + + + return $this; + } // setDbDescription() + + /** + * Set the value of [color] column. + * + * @param string $v new value + * @return CcShow The current object (for fluent API support) + */ + public function setDbColor($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->color !== $v) { + $this->color = $v; + $this->modifiedColumns[] = CcShowPeer::COLOR; + } + + + return $this; + } // setDbColor() + + /** + * Set the value of [background_color] column. + * + * @param string $v new value + * @return CcShow The current object (for fluent API support) + */ + public function setDbBackgroundColor($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->background_color !== $v) { + $this->background_color = $v; + $this->modifiedColumns[] = CcShowPeer::BACKGROUND_COLOR; + } + + + return $this; + } // setDbBackgroundColor() + + /** + * Sets the value of the [live_stream_using_airtime_auth] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcShow The current object (for fluent API support) + */ + public function setDbLiveStreamUsingAirtimeAuth($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->live_stream_using_airtime_auth !== $v) { + $this->live_stream_using_airtime_auth = $v; + $this->modifiedColumns[] = CcShowPeer::LIVE_STREAM_USING_AIRTIME_AUTH; + } + + + return $this; + } // setDbLiveStreamUsingAirtimeAuth() + + /** + * Sets the value of the [live_stream_using_custom_auth] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcShow The current object (for fluent API support) + */ + public function setDbLiveStreamUsingCustomAuth($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->live_stream_using_custom_auth !== $v) { + $this->live_stream_using_custom_auth = $v; + $this->modifiedColumns[] = CcShowPeer::LIVE_STREAM_USING_CUSTOM_AUTH; + } + + + return $this; + } // setDbLiveStreamUsingCustomAuth() + + /** + * Set the value of [live_stream_user] column. + * + * @param string $v new value + * @return CcShow The current object (for fluent API support) + */ + public function setDbLiveStreamUser($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->live_stream_user !== $v) { + $this->live_stream_user = $v; + $this->modifiedColumns[] = CcShowPeer::LIVE_STREAM_USER; + } + + + return $this; + } // setDbLiveStreamUser() + + /** + * Set the value of [live_stream_pass] column. + * + * @param string $v new value + * @return CcShow The current object (for fluent API support) + */ + public function setDbLiveStreamPass($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->live_stream_pass !== $v) { + $this->live_stream_pass = $v; + $this->modifiedColumns[] = CcShowPeer::LIVE_STREAM_PASS; + } + + + return $this; + } // setDbLiveStreamPass() + + /** + * Sets the value of the [linked] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcShow The current object (for fluent API support) + */ + public function setDbLinked($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->linked !== $v) { + $this->linked = $v; + $this->modifiedColumns[] = CcShowPeer::LINKED; + } + + + return $this; + } // setDbLinked() + + /** + * Sets the value of the [is_linkable] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcShow The current object (for fluent API support) + */ + public function setDbIsLinkable($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->is_linkable !== $v) { + $this->is_linkable = $v; + $this->modifiedColumns[] = CcShowPeer::IS_LINKABLE; + } + + + return $this; + } // setDbIsLinkable() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->name !== '') { + return false; + } + + if ($this->url !== '') { + return false; + } + + if ($this->genre !== '') { + return false; + } + + if ($this->live_stream_using_airtime_auth !== false) { + return false; + } + + if ($this->live_stream_using_custom_auth !== false) { + return false; + } + + if ($this->linked !== false) { + return false; + } + + if ($this->is_linkable !== true) { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->url = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->genre = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->description = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; + $this->color = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; + $this->background_color = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; + $this->live_stream_using_airtime_auth = ($row[$startcol + 7] !== null) ? (boolean) $row[$startcol + 7] : null; + $this->live_stream_using_custom_auth = ($row[$startcol + 8] !== null) ? (boolean) $row[$startcol + 8] : null; + $this->live_stream_user = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; + $this->live_stream_pass = ($row[$startcol + 10] !== null) ? (string) $row[$startcol + 10] : null; + $this->linked = ($row[$startcol + 11] !== null) ? (boolean) $row[$startcol + 11] : null; + $this->is_linkable = ($row[$startcol + 12] !== null) ? (boolean) $row[$startcol + 12] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 13; // 13 = CcShowPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcShow object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcShowPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->collCcShowInstancess = null; + + $this->collCcShowDayss = null; + + $this->collCcShowRebroadcasts = null; + + $this->collCcShowHostss = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcShowQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcShowPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->ccShowInstancessScheduledForDeletion !== null) { + if (!$this->ccShowInstancessScheduledForDeletion->isEmpty()) { + CcShowInstancesQuery::create() + ->filterByPrimaryKeys($this->ccShowInstancessScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccShowInstancessScheduledForDeletion = null; + } + } + + if ($this->collCcShowInstancess !== null) { + foreach ($this->collCcShowInstancess as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccShowDayssScheduledForDeletion !== null) { + if (!$this->ccShowDayssScheduledForDeletion->isEmpty()) { + CcShowDaysQuery::create() + ->filterByPrimaryKeys($this->ccShowDayssScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccShowDayssScheduledForDeletion = null; + } + } + + if ($this->collCcShowDayss !== null) { + foreach ($this->collCcShowDayss as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccShowRebroadcastsScheduledForDeletion !== null) { + if (!$this->ccShowRebroadcastsScheduledForDeletion->isEmpty()) { + CcShowRebroadcastQuery::create() + ->filterByPrimaryKeys($this->ccShowRebroadcastsScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccShowRebroadcastsScheduledForDeletion = null; + } + } + + if ($this->collCcShowRebroadcasts !== null) { + foreach ($this->collCcShowRebroadcasts as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccShowHostssScheduledForDeletion !== null) { + if (!$this->ccShowHostssScheduledForDeletion->isEmpty()) { + CcShowHostsQuery::create() + ->filterByPrimaryKeys($this->ccShowHostssScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccShowHostssScheduledForDeletion = null; + } + } + + if ($this->collCcShowHostss !== null) { + foreach ($this->collCcShowHostss as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcShowPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcShowPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_show_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcShowPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcShowPeer::NAME)) { + $modifiedColumns[':p' . $index++] = '"name"'; + } + if ($this->isColumnModified(CcShowPeer::URL)) { + $modifiedColumns[':p' . $index++] = '"url"'; + } + if ($this->isColumnModified(CcShowPeer::GENRE)) { + $modifiedColumns[':p' . $index++] = '"genre"'; + } + if ($this->isColumnModified(CcShowPeer::DESCRIPTION)) { + $modifiedColumns[':p' . $index++] = '"description"'; + } + if ($this->isColumnModified(CcShowPeer::COLOR)) { + $modifiedColumns[':p' . $index++] = '"color"'; + } + if ($this->isColumnModified(CcShowPeer::BACKGROUND_COLOR)) { + $modifiedColumns[':p' . $index++] = '"background_color"'; + } + if ($this->isColumnModified(CcShowPeer::LIVE_STREAM_USING_AIRTIME_AUTH)) { + $modifiedColumns[':p' . $index++] = '"live_stream_using_airtime_auth"'; + } + if ($this->isColumnModified(CcShowPeer::LIVE_STREAM_USING_CUSTOM_AUTH)) { + $modifiedColumns[':p' . $index++] = '"live_stream_using_custom_auth"'; + } + if ($this->isColumnModified(CcShowPeer::LIVE_STREAM_USER)) { + $modifiedColumns[':p' . $index++] = '"live_stream_user"'; + } + if ($this->isColumnModified(CcShowPeer::LIVE_STREAM_PASS)) { + $modifiedColumns[':p' . $index++] = '"live_stream_pass"'; + } + if ($this->isColumnModified(CcShowPeer::LINKED)) { + $modifiedColumns[':p' . $index++] = '"linked"'; + } + if ($this->isColumnModified(CcShowPeer::IS_LINKABLE)) { + $modifiedColumns[':p' . $index++] = '"is_linkable"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_show" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"name"': + $stmt->bindValue($identifier, $this->name, PDO::PARAM_STR); + break; + case '"url"': + $stmt->bindValue($identifier, $this->url, PDO::PARAM_STR); + break; + case '"genre"': + $stmt->bindValue($identifier, $this->genre, PDO::PARAM_STR); + break; + case '"description"': + $stmt->bindValue($identifier, $this->description, PDO::PARAM_STR); + break; + case '"color"': + $stmt->bindValue($identifier, $this->color, PDO::PARAM_STR); + break; + case '"background_color"': + $stmt->bindValue($identifier, $this->background_color, PDO::PARAM_STR); + break; + case '"live_stream_using_airtime_auth"': + $stmt->bindValue($identifier, $this->live_stream_using_airtime_auth, PDO::PARAM_BOOL); + break; + case '"live_stream_using_custom_auth"': + $stmt->bindValue($identifier, $this->live_stream_using_custom_auth, PDO::PARAM_BOOL); + break; + case '"live_stream_user"': + $stmt->bindValue($identifier, $this->live_stream_user, PDO::PARAM_STR); + break; + case '"live_stream_pass"': + $stmt->bindValue($identifier, $this->live_stream_pass, PDO::PARAM_STR); + break; + case '"linked"': + $stmt->bindValue($identifier, $this->linked, PDO::PARAM_BOOL); + break; + case '"is_linkable"': + $stmt->bindValue($identifier, $this->is_linkable, PDO::PARAM_BOOL); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcShowPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + if ($this->collCcShowInstancess !== null) { + foreach ($this->collCcShowInstancess as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcShowDayss !== null) { + foreach ($this->collCcShowDayss as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcShowRebroadcasts !== null) { + foreach ($this->collCcShowRebroadcasts as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcShowHostss !== null) { + foreach ($this->collCcShowHostss as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcShowPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbName(); + break; + case 2: + return $this->getDbUrl(); + break; + case 3: + return $this->getDbGenre(); + break; + case 4: + return $this->getDbDescription(); + break; + case 5: + return $this->getDbColor(); + break; + case 6: + return $this->getDbBackgroundColor(); + break; + case 7: + return $this->getDbLiveStreamUsingAirtimeAuth(); + break; + case 8: + return $this->getDbLiveStreamUsingCustomAuth(); + break; + case 9: + return $this->getDbLiveStreamUser(); + break; + case 10: + return $this->getDbLiveStreamPass(); + break; + case 11: + return $this->getDbLinked(); + break; + case 12: + return $this->getDbIsLinkable(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcShow'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcShow'][$this->getPrimaryKey()] = true; + $keys = CcShowPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbName(), + $keys[2] => $this->getDbUrl(), + $keys[3] => $this->getDbGenre(), + $keys[4] => $this->getDbDescription(), + $keys[5] => $this->getDbColor(), + $keys[6] => $this->getDbBackgroundColor(), + $keys[7] => $this->getDbLiveStreamUsingAirtimeAuth(), + $keys[8] => $this->getDbLiveStreamUsingCustomAuth(), + $keys[9] => $this->getDbLiveStreamUser(), + $keys[10] => $this->getDbLiveStreamPass(), + $keys[11] => $this->getDbLinked(), + $keys[12] => $this->getDbIsLinkable(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->collCcShowInstancess) { + $result['CcShowInstancess'] = $this->collCcShowInstancess->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcShowDayss) { + $result['CcShowDayss'] = $this->collCcShowDayss->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcShowRebroadcasts) { + $result['CcShowRebroadcasts'] = $this->collCcShowRebroadcasts->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcShowHostss) { + $result['CcShowHostss'] = $this->collCcShowHostss->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcShowPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbName($value); + break; + case 2: + $this->setDbUrl($value); + break; + case 3: + $this->setDbGenre($value); + break; + case 4: + $this->setDbDescription($value); + break; + case 5: + $this->setDbColor($value); + break; + case 6: + $this->setDbBackgroundColor($value); + break; + case 7: + $this->setDbLiveStreamUsingAirtimeAuth($value); + break; + case 8: + $this->setDbLiveStreamUsingCustomAuth($value); + break; + case 9: + $this->setDbLiveStreamUser($value); + break; + case 10: + $this->setDbLiveStreamPass($value); + break; + case 11: + $this->setDbLinked($value); + break; + case 12: + $this->setDbIsLinkable($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcShowPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbUrl($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbGenre($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbDescription($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setDbColor($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setDbBackgroundColor($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setDbLiveStreamUsingAirtimeAuth($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setDbLiveStreamUsingCustomAuth($arr[$keys[8]]); + if (array_key_exists($keys[9], $arr)) $this->setDbLiveStreamUser($arr[$keys[9]]); + if (array_key_exists($keys[10], $arr)) $this->setDbLiveStreamPass($arr[$keys[10]]); + if (array_key_exists($keys[11], $arr)) $this->setDbLinked($arr[$keys[11]]); + if (array_key_exists($keys[12], $arr)) $this->setDbIsLinkable($arr[$keys[12]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcShowPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcShowPeer::ID)) $criteria->add(CcShowPeer::ID, $this->id); + if ($this->isColumnModified(CcShowPeer::NAME)) $criteria->add(CcShowPeer::NAME, $this->name); + if ($this->isColumnModified(CcShowPeer::URL)) $criteria->add(CcShowPeer::URL, $this->url); + if ($this->isColumnModified(CcShowPeer::GENRE)) $criteria->add(CcShowPeer::GENRE, $this->genre); + if ($this->isColumnModified(CcShowPeer::DESCRIPTION)) $criteria->add(CcShowPeer::DESCRIPTION, $this->description); + if ($this->isColumnModified(CcShowPeer::COLOR)) $criteria->add(CcShowPeer::COLOR, $this->color); + if ($this->isColumnModified(CcShowPeer::BACKGROUND_COLOR)) $criteria->add(CcShowPeer::BACKGROUND_COLOR, $this->background_color); + if ($this->isColumnModified(CcShowPeer::LIVE_STREAM_USING_AIRTIME_AUTH)) $criteria->add(CcShowPeer::LIVE_STREAM_USING_AIRTIME_AUTH, $this->live_stream_using_airtime_auth); + if ($this->isColumnModified(CcShowPeer::LIVE_STREAM_USING_CUSTOM_AUTH)) $criteria->add(CcShowPeer::LIVE_STREAM_USING_CUSTOM_AUTH, $this->live_stream_using_custom_auth); + if ($this->isColumnModified(CcShowPeer::LIVE_STREAM_USER)) $criteria->add(CcShowPeer::LIVE_STREAM_USER, $this->live_stream_user); + if ($this->isColumnModified(CcShowPeer::LIVE_STREAM_PASS)) $criteria->add(CcShowPeer::LIVE_STREAM_PASS, $this->live_stream_pass); + if ($this->isColumnModified(CcShowPeer::LINKED)) $criteria->add(CcShowPeer::LINKED, $this->linked); + if ($this->isColumnModified(CcShowPeer::IS_LINKABLE)) $criteria->add(CcShowPeer::IS_LINKABLE, $this->is_linkable); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcShowPeer::DATABASE_NAME); + $criteria->add(CcShowPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcShow (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbName($this->getDbName()); + $copyObj->setDbUrl($this->getDbUrl()); + $copyObj->setDbGenre($this->getDbGenre()); + $copyObj->setDbDescription($this->getDbDescription()); + $copyObj->setDbColor($this->getDbColor()); + $copyObj->setDbBackgroundColor($this->getDbBackgroundColor()); + $copyObj->setDbLiveStreamUsingAirtimeAuth($this->getDbLiveStreamUsingAirtimeAuth()); + $copyObj->setDbLiveStreamUsingCustomAuth($this->getDbLiveStreamUsingCustomAuth()); + $copyObj->setDbLiveStreamUser($this->getDbLiveStreamUser()); + $copyObj->setDbLiveStreamPass($this->getDbLiveStreamPass()); + $copyObj->setDbLinked($this->getDbLinked()); + $copyObj->setDbIsLinkable($this->getDbIsLinkable()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + foreach ($this->getCcShowInstancess() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcShowInstances($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcShowDayss() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcShowDays($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcShowRebroadcasts() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcShowRebroadcast($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcShowHostss() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcShowHosts($relObj->copy($deepCopy)); + } + } + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcShow Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcShowPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcShowPeer(); + } + + return self::$peer; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CcShowInstances' == $relationName) { + $this->initCcShowInstancess(); + } + if ('CcShowDays' == $relationName) { + $this->initCcShowDayss(); + } + if ('CcShowRebroadcast' == $relationName) { + $this->initCcShowRebroadcasts(); + } + if ('CcShowHosts' == $relationName) { + $this->initCcShowHostss(); + } + } + + /** + * Clears out the collCcShowInstancess collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcShow The current object (for fluent API support) + * @see addCcShowInstancess() + */ + public function clearCcShowInstancess() + { + $this->collCcShowInstancess = null; // important to set this to null since that means it is uninitialized + $this->collCcShowInstancessPartial = null; + + return $this; + } + + /** + * reset is the collCcShowInstancess collection loaded partially + * + * @return void + */ + public function resetPartialCcShowInstancess($v = true) + { + $this->collCcShowInstancessPartial = $v; + } + + /** + * Initializes the collCcShowInstancess collection. + * + * By default this just sets the collCcShowInstancess collection to an empty array (like clearcollCcShowInstancess()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcShowInstancess($overrideExisting = true) + { + if (null !== $this->collCcShowInstancess && !$overrideExisting) { + return; + } + $this->collCcShowInstancess = new PropelObjectCollection(); + $this->collCcShowInstancess->setModel('CcShowInstances'); + } + + /** + * Gets an array of CcShowInstances objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcShow is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcShowInstances[] List of CcShowInstances objects + * @throws PropelException + */ + public function getCcShowInstancess($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcShowInstancessPartial && !$this->isNew(); + if (null === $this->collCcShowInstancess || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowInstancess) { + // return empty collection + $this->initCcShowInstancess(); + } else { + $collCcShowInstancess = CcShowInstancesQuery::create(null, $criteria) + ->filterByCcShow($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcShowInstancessPartial && count($collCcShowInstancess)) { + $this->initCcShowInstancess(false); + + foreach ($collCcShowInstancess as $obj) { + if (false == $this->collCcShowInstancess->contains($obj)) { + $this->collCcShowInstancess->append($obj); + } + } + + $this->collCcShowInstancessPartial = true; + } + + $collCcShowInstancess->getInternalIterator()->rewind(); + + return $collCcShowInstancess; + } + + if ($partial && $this->collCcShowInstancess) { + foreach ($this->collCcShowInstancess as $obj) { + if ($obj->isNew()) { + $collCcShowInstancess[] = $obj; + } + } + } + + $this->collCcShowInstancess = $collCcShowInstancess; + $this->collCcShowInstancessPartial = false; + } + } + + return $this->collCcShowInstancess; + } + + /** + * Sets a collection of CcShowInstances objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccShowInstancess A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcShow The current object (for fluent API support) + */ + public function setCcShowInstancess(PropelCollection $ccShowInstancess, PropelPDO $con = null) + { + $ccShowInstancessToDelete = $this->getCcShowInstancess(new Criteria(), $con)->diff($ccShowInstancess); + + + $this->ccShowInstancessScheduledForDeletion = $ccShowInstancessToDelete; + + foreach ($ccShowInstancessToDelete as $ccShowInstancesRemoved) { + $ccShowInstancesRemoved->setCcShow(null); + } + + $this->collCcShowInstancess = null; + foreach ($ccShowInstancess as $ccShowInstances) { + $this->addCcShowInstances($ccShowInstances); + } + + $this->collCcShowInstancess = $ccShowInstancess; + $this->collCcShowInstancessPartial = false; + + return $this; + } + + /** + * Returns the number of related CcShowInstances objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcShowInstances objects. + * @throws PropelException + */ + public function countCcShowInstancess(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcShowInstancessPartial && !$this->isNew(); + if (null === $this->collCcShowInstancess || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowInstancess) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcShowInstancess()); + } + $query = CcShowInstancesQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcShow($this) + ->count($con); + } + + return count($this->collCcShowInstancess); + } + + /** + * Method called to associate a CcShowInstances object to this object + * through the CcShowInstances foreign key attribute. + * + * @param CcShowInstances $l CcShowInstances + * @return CcShow The current object (for fluent API support) + */ + public function addCcShowInstances(CcShowInstances $l) + { + if ($this->collCcShowInstancess === null) { + $this->initCcShowInstancess(); + $this->collCcShowInstancessPartial = true; + } + + if (!in_array($l, $this->collCcShowInstancess->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcShowInstances($l); + + if ($this->ccShowInstancessScheduledForDeletion and $this->ccShowInstancessScheduledForDeletion->contains($l)) { + $this->ccShowInstancessScheduledForDeletion->remove($this->ccShowInstancessScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcShowInstances $ccShowInstances The ccShowInstances object to add. + */ + protected function doAddCcShowInstances($ccShowInstances) + { + $this->collCcShowInstancess[]= $ccShowInstances; + $ccShowInstances->setCcShow($this); + } + + /** + * @param CcShowInstances $ccShowInstances The ccShowInstances object to remove. + * @return CcShow The current object (for fluent API support) + */ + public function removeCcShowInstances($ccShowInstances) + { + if ($this->getCcShowInstancess()->contains($ccShowInstances)) { + $this->collCcShowInstancess->remove($this->collCcShowInstancess->search($ccShowInstances)); + if (null === $this->ccShowInstancessScheduledForDeletion) { + $this->ccShowInstancessScheduledForDeletion = clone $this->collCcShowInstancess; + $this->ccShowInstancessScheduledForDeletion->clear(); + } + $this->ccShowInstancessScheduledForDeletion[]= clone $ccShowInstances; + $ccShowInstances->setCcShow(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcShow is new, it will return + * an empty collection; or if this CcShow has previously + * been saved, it will retrieve related CcShowInstancess from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcShow. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcShowInstances[] List of CcShowInstances objects + */ + public function getCcShowInstancessJoinCcShowInstancesRelatedByDbOriginalShow($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcShowInstancesQuery::create(null, $criteria); + $query->joinWith('CcShowInstancesRelatedByDbOriginalShow', $join_behavior); + + return $this->getCcShowInstancess($query, $con); + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcShow is new, it will return + * an empty collection; or if this CcShow has previously + * been saved, it will retrieve related CcShowInstancess from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcShow. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcShowInstances[] List of CcShowInstances objects + */ + public function getCcShowInstancessJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcShowInstancesQuery::create(null, $criteria); + $query->joinWith('CcFiles', $join_behavior); + + return $this->getCcShowInstancess($query, $con); + } + + /** + * Clears out the collCcShowDayss collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcShow The current object (for fluent API support) + * @see addCcShowDayss() + */ + public function clearCcShowDayss() + { + $this->collCcShowDayss = null; // important to set this to null since that means it is uninitialized + $this->collCcShowDayssPartial = null; + + return $this; + } + + /** + * reset is the collCcShowDayss collection loaded partially + * + * @return void + */ + public function resetPartialCcShowDayss($v = true) + { + $this->collCcShowDayssPartial = $v; + } + + /** + * Initializes the collCcShowDayss collection. + * + * By default this just sets the collCcShowDayss collection to an empty array (like clearcollCcShowDayss()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcShowDayss($overrideExisting = true) + { + if (null !== $this->collCcShowDayss && !$overrideExisting) { + return; + } + $this->collCcShowDayss = new PropelObjectCollection(); + $this->collCcShowDayss->setModel('CcShowDays'); + } + + /** + * Gets an array of CcShowDays objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcShow is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcShowDays[] List of CcShowDays objects + * @throws PropelException + */ + public function getCcShowDayss($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcShowDayssPartial && !$this->isNew(); + if (null === $this->collCcShowDayss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowDayss) { + // return empty collection + $this->initCcShowDayss(); + } else { + $collCcShowDayss = CcShowDaysQuery::create(null, $criteria) + ->filterByCcShow($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcShowDayssPartial && count($collCcShowDayss)) { + $this->initCcShowDayss(false); + + foreach ($collCcShowDayss as $obj) { + if (false == $this->collCcShowDayss->contains($obj)) { + $this->collCcShowDayss->append($obj); + } + } + + $this->collCcShowDayssPartial = true; + } + + $collCcShowDayss->getInternalIterator()->rewind(); + + return $collCcShowDayss; + } + + if ($partial && $this->collCcShowDayss) { + foreach ($this->collCcShowDayss as $obj) { + if ($obj->isNew()) { + $collCcShowDayss[] = $obj; + } + } + } + + $this->collCcShowDayss = $collCcShowDayss; + $this->collCcShowDayssPartial = false; + } + } + + return $this->collCcShowDayss; + } + + /** + * Sets a collection of CcShowDays objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccShowDayss A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcShow The current object (for fluent API support) + */ + public function setCcShowDayss(PropelCollection $ccShowDayss, PropelPDO $con = null) + { + $ccShowDayssToDelete = $this->getCcShowDayss(new Criteria(), $con)->diff($ccShowDayss); + + + $this->ccShowDayssScheduledForDeletion = $ccShowDayssToDelete; + + foreach ($ccShowDayssToDelete as $ccShowDaysRemoved) { + $ccShowDaysRemoved->setCcShow(null); + } + + $this->collCcShowDayss = null; + foreach ($ccShowDayss as $ccShowDays) { + $this->addCcShowDays($ccShowDays); + } + + $this->collCcShowDayss = $ccShowDayss; + $this->collCcShowDayssPartial = false; + + return $this; + } + + /** + * Returns the number of related CcShowDays objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcShowDays objects. + * @throws PropelException + */ + public function countCcShowDayss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcShowDayssPartial && !$this->isNew(); + if (null === $this->collCcShowDayss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowDayss) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcShowDayss()); + } + $query = CcShowDaysQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcShow($this) + ->count($con); + } + + return count($this->collCcShowDayss); + } + + /** + * Method called to associate a CcShowDays object to this object + * through the CcShowDays foreign key attribute. + * + * @param CcShowDays $l CcShowDays + * @return CcShow The current object (for fluent API support) + */ + public function addCcShowDays(CcShowDays $l) + { + if ($this->collCcShowDayss === null) { + $this->initCcShowDayss(); + $this->collCcShowDayssPartial = true; + } + + if (!in_array($l, $this->collCcShowDayss->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcShowDays($l); + + if ($this->ccShowDayssScheduledForDeletion and $this->ccShowDayssScheduledForDeletion->contains($l)) { + $this->ccShowDayssScheduledForDeletion->remove($this->ccShowDayssScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcShowDays $ccShowDays The ccShowDays object to add. + */ + protected function doAddCcShowDays($ccShowDays) + { + $this->collCcShowDayss[]= $ccShowDays; + $ccShowDays->setCcShow($this); + } + + /** + * @param CcShowDays $ccShowDays The ccShowDays object to remove. + * @return CcShow The current object (for fluent API support) + */ + public function removeCcShowDays($ccShowDays) + { + if ($this->getCcShowDayss()->contains($ccShowDays)) { + $this->collCcShowDayss->remove($this->collCcShowDayss->search($ccShowDays)); + if (null === $this->ccShowDayssScheduledForDeletion) { + $this->ccShowDayssScheduledForDeletion = clone $this->collCcShowDayss; + $this->ccShowDayssScheduledForDeletion->clear(); + } + $this->ccShowDayssScheduledForDeletion[]= clone $ccShowDays; + $ccShowDays->setCcShow(null); + } + + return $this; + } + + /** + * Clears out the collCcShowRebroadcasts collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcShow The current object (for fluent API support) + * @see addCcShowRebroadcasts() + */ + public function clearCcShowRebroadcasts() + { + $this->collCcShowRebroadcasts = null; // important to set this to null since that means it is uninitialized + $this->collCcShowRebroadcastsPartial = null; + + return $this; + } + + /** + * reset is the collCcShowRebroadcasts collection loaded partially + * + * @return void + */ + public function resetPartialCcShowRebroadcasts($v = true) + { + $this->collCcShowRebroadcastsPartial = $v; + } + + /** + * Initializes the collCcShowRebroadcasts collection. + * + * By default this just sets the collCcShowRebroadcasts collection to an empty array (like clearcollCcShowRebroadcasts()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcShowRebroadcasts($overrideExisting = true) + { + if (null !== $this->collCcShowRebroadcasts && !$overrideExisting) { + return; + } + $this->collCcShowRebroadcasts = new PropelObjectCollection(); + $this->collCcShowRebroadcasts->setModel('CcShowRebroadcast'); + } + + /** + * Gets an array of CcShowRebroadcast objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcShow is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcShowRebroadcast[] List of CcShowRebroadcast objects + * @throws PropelException + */ + public function getCcShowRebroadcasts($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcShowRebroadcastsPartial && !$this->isNew(); + if (null === $this->collCcShowRebroadcasts || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowRebroadcasts) { + // return empty collection + $this->initCcShowRebroadcasts(); + } else { + $collCcShowRebroadcasts = CcShowRebroadcastQuery::create(null, $criteria) + ->filterByCcShow($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcShowRebroadcastsPartial && count($collCcShowRebroadcasts)) { + $this->initCcShowRebroadcasts(false); + + foreach ($collCcShowRebroadcasts as $obj) { + if (false == $this->collCcShowRebroadcasts->contains($obj)) { + $this->collCcShowRebroadcasts->append($obj); + } + } + + $this->collCcShowRebroadcastsPartial = true; + } + + $collCcShowRebroadcasts->getInternalIterator()->rewind(); + + return $collCcShowRebroadcasts; + } + + if ($partial && $this->collCcShowRebroadcasts) { + foreach ($this->collCcShowRebroadcasts as $obj) { + if ($obj->isNew()) { + $collCcShowRebroadcasts[] = $obj; + } + } + } + + $this->collCcShowRebroadcasts = $collCcShowRebroadcasts; + $this->collCcShowRebroadcastsPartial = false; + } + } + + return $this->collCcShowRebroadcasts; + } + + /** + * Sets a collection of CcShowRebroadcast objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccShowRebroadcasts A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcShow The current object (for fluent API support) + */ + public function setCcShowRebroadcasts(PropelCollection $ccShowRebroadcasts, PropelPDO $con = null) + { + $ccShowRebroadcastsToDelete = $this->getCcShowRebroadcasts(new Criteria(), $con)->diff($ccShowRebroadcasts); + + + $this->ccShowRebroadcastsScheduledForDeletion = $ccShowRebroadcastsToDelete; + + foreach ($ccShowRebroadcastsToDelete as $ccShowRebroadcastRemoved) { + $ccShowRebroadcastRemoved->setCcShow(null); + } + + $this->collCcShowRebroadcasts = null; + foreach ($ccShowRebroadcasts as $ccShowRebroadcast) { + $this->addCcShowRebroadcast($ccShowRebroadcast); + } + + $this->collCcShowRebroadcasts = $ccShowRebroadcasts; + $this->collCcShowRebroadcastsPartial = false; + + return $this; + } + + /** + * Returns the number of related CcShowRebroadcast objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcShowRebroadcast objects. + * @throws PropelException + */ + public function countCcShowRebroadcasts(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcShowRebroadcastsPartial && !$this->isNew(); + if (null === $this->collCcShowRebroadcasts || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowRebroadcasts) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcShowRebroadcasts()); + } + $query = CcShowRebroadcastQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcShow($this) + ->count($con); + } + + return count($this->collCcShowRebroadcasts); + } + + /** + * Method called to associate a CcShowRebroadcast object to this object + * through the CcShowRebroadcast foreign key attribute. + * + * @param CcShowRebroadcast $l CcShowRebroadcast + * @return CcShow The current object (for fluent API support) + */ + public function addCcShowRebroadcast(CcShowRebroadcast $l) + { + if ($this->collCcShowRebroadcasts === null) { + $this->initCcShowRebroadcasts(); + $this->collCcShowRebroadcastsPartial = true; + } + + if (!in_array($l, $this->collCcShowRebroadcasts->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcShowRebroadcast($l); + + if ($this->ccShowRebroadcastsScheduledForDeletion and $this->ccShowRebroadcastsScheduledForDeletion->contains($l)) { + $this->ccShowRebroadcastsScheduledForDeletion->remove($this->ccShowRebroadcastsScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcShowRebroadcast $ccShowRebroadcast The ccShowRebroadcast object to add. + */ + protected function doAddCcShowRebroadcast($ccShowRebroadcast) + { + $this->collCcShowRebroadcasts[]= $ccShowRebroadcast; + $ccShowRebroadcast->setCcShow($this); + } + + /** + * @param CcShowRebroadcast $ccShowRebroadcast The ccShowRebroadcast object to remove. + * @return CcShow The current object (for fluent API support) + */ + public function removeCcShowRebroadcast($ccShowRebroadcast) + { + if ($this->getCcShowRebroadcasts()->contains($ccShowRebroadcast)) { + $this->collCcShowRebroadcasts->remove($this->collCcShowRebroadcasts->search($ccShowRebroadcast)); + if (null === $this->ccShowRebroadcastsScheduledForDeletion) { + $this->ccShowRebroadcastsScheduledForDeletion = clone $this->collCcShowRebroadcasts; + $this->ccShowRebroadcastsScheduledForDeletion->clear(); + } + $this->ccShowRebroadcastsScheduledForDeletion[]= clone $ccShowRebroadcast; + $ccShowRebroadcast->setCcShow(null); + } + + return $this; + } + + /** + * Clears out the collCcShowHostss collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcShow The current object (for fluent API support) + * @see addCcShowHostss() + */ + public function clearCcShowHostss() + { + $this->collCcShowHostss = null; // important to set this to null since that means it is uninitialized + $this->collCcShowHostssPartial = null; + + return $this; + } + + /** + * reset is the collCcShowHostss collection loaded partially + * + * @return void + */ + public function resetPartialCcShowHostss($v = true) + { + $this->collCcShowHostssPartial = $v; + } + + /** + * Initializes the collCcShowHostss collection. + * + * By default this just sets the collCcShowHostss collection to an empty array (like clearcollCcShowHostss()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcShowHostss($overrideExisting = true) + { + if (null !== $this->collCcShowHostss && !$overrideExisting) { + return; + } + $this->collCcShowHostss = new PropelObjectCollection(); + $this->collCcShowHostss->setModel('CcShowHosts'); + } + + /** + * Gets an array of CcShowHosts objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcShow is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcShowHosts[] List of CcShowHosts objects + * @throws PropelException + */ + public function getCcShowHostss($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcShowHostssPartial && !$this->isNew(); + if (null === $this->collCcShowHostss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowHostss) { + // return empty collection + $this->initCcShowHostss(); + } else { + $collCcShowHostss = CcShowHostsQuery::create(null, $criteria) + ->filterByCcShow($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcShowHostssPartial && count($collCcShowHostss)) { + $this->initCcShowHostss(false); + + foreach ($collCcShowHostss as $obj) { + if (false == $this->collCcShowHostss->contains($obj)) { + $this->collCcShowHostss->append($obj); + } + } + + $this->collCcShowHostssPartial = true; + } + + $collCcShowHostss->getInternalIterator()->rewind(); + + return $collCcShowHostss; + } + + if ($partial && $this->collCcShowHostss) { + foreach ($this->collCcShowHostss as $obj) { + if ($obj->isNew()) { + $collCcShowHostss[] = $obj; + } + } + } + + $this->collCcShowHostss = $collCcShowHostss; + $this->collCcShowHostssPartial = false; + } + } + + return $this->collCcShowHostss; + } + + /** + * Sets a collection of CcShowHosts objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccShowHostss A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcShow The current object (for fluent API support) + */ + public function setCcShowHostss(PropelCollection $ccShowHostss, PropelPDO $con = null) + { + $ccShowHostssToDelete = $this->getCcShowHostss(new Criteria(), $con)->diff($ccShowHostss); + + + $this->ccShowHostssScheduledForDeletion = $ccShowHostssToDelete; + + foreach ($ccShowHostssToDelete as $ccShowHostsRemoved) { + $ccShowHostsRemoved->setCcShow(null); + } + + $this->collCcShowHostss = null; + foreach ($ccShowHostss as $ccShowHosts) { + $this->addCcShowHosts($ccShowHosts); + } + + $this->collCcShowHostss = $ccShowHostss; + $this->collCcShowHostssPartial = false; + + return $this; + } + + /** + * Returns the number of related CcShowHosts objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcShowHosts objects. + * @throws PropelException + */ + public function countCcShowHostss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcShowHostssPartial && !$this->isNew(); + if (null === $this->collCcShowHostss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowHostss) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcShowHostss()); + } + $query = CcShowHostsQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcShow($this) + ->count($con); + } + + return count($this->collCcShowHostss); + } + + /** + * Method called to associate a CcShowHosts object to this object + * through the CcShowHosts foreign key attribute. + * + * @param CcShowHosts $l CcShowHosts + * @return CcShow The current object (for fluent API support) + */ + public function addCcShowHosts(CcShowHosts $l) + { + if ($this->collCcShowHostss === null) { + $this->initCcShowHostss(); + $this->collCcShowHostssPartial = true; + } + + if (!in_array($l, $this->collCcShowHostss->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcShowHosts($l); + + if ($this->ccShowHostssScheduledForDeletion and $this->ccShowHostssScheduledForDeletion->contains($l)) { + $this->ccShowHostssScheduledForDeletion->remove($this->ccShowHostssScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcShowHosts $ccShowHosts The ccShowHosts object to add. + */ + protected function doAddCcShowHosts($ccShowHosts) + { + $this->collCcShowHostss[]= $ccShowHosts; + $ccShowHosts->setCcShow($this); + } + + /** + * @param CcShowHosts $ccShowHosts The ccShowHosts object to remove. + * @return CcShow The current object (for fluent API support) + */ + public function removeCcShowHosts($ccShowHosts) + { + if ($this->getCcShowHostss()->contains($ccShowHosts)) { + $this->collCcShowHostss->remove($this->collCcShowHostss->search($ccShowHosts)); + if (null === $this->ccShowHostssScheduledForDeletion) { + $this->ccShowHostssScheduledForDeletion = clone $this->collCcShowHostss; + $this->ccShowHostssScheduledForDeletion->clear(); + } + $this->ccShowHostssScheduledForDeletion[]= clone $ccShowHosts; + $ccShowHosts->setCcShow(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcShow is new, it will return + * an empty collection; or if this CcShow has previously + * been saved, it will retrieve related CcShowHostss from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcShow. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcShowHosts[] List of CcShowHosts objects + */ + public function getCcShowHostssJoinCcSubjs($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcShowHostsQuery::create(null, $criteria); + $query->joinWith('CcSubjs', $join_behavior); + + return $this->getCcShowHostss($query, $con); + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->name = null; + $this->url = null; + $this->genre = null; + $this->description = null; + $this->color = null; + $this->background_color = null; + $this->live_stream_using_airtime_auth = null; + $this->live_stream_using_custom_auth = null; + $this->live_stream_user = null; + $this->live_stream_pass = null; + $this->linked = null; + $this->is_linkable = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCcShowInstancess) { + foreach ($this->collCcShowInstancess as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcShowDayss) { + foreach ($this->collCcShowDayss as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcShowRebroadcasts) { + foreach ($this->collCcShowRebroadcasts as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcShowHostss) { + foreach ($this->collCcShowHostss as $o) { + $o->clearAllReferences($deep); + } + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + if ($this->collCcShowInstancess instanceof PropelCollection) { + $this->collCcShowInstancess->clearIterator(); + } + $this->collCcShowInstancess = null; + if ($this->collCcShowDayss instanceof PropelCollection) { + $this->collCcShowDayss->clearIterator(); + } + $this->collCcShowDayss = null; + if ($this->collCcShowRebroadcasts instanceof PropelCollection) { + $this->collCcShowRebroadcasts->clearIterator(); + } + $this->collCcShowRebroadcasts = null; + if ($this->collCcShowHostss instanceof PropelCollection) { + $this->collCcShowHostss->clearIterator(); + } + $this->collCcShowHostss = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcShowPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowDays.php b/airtime_mvc/application/models/airtime/om/BaseCcShowDays.php index be9f66086d..8a13db98be 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowDays.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowDays.php @@ -4,1473 +4,1571 @@ /** * Base class that represents a row from the 'cc_show_days' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcShowDays extends BaseObject implements Persistent +abstract class BaseCcShowDays extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcShowDaysPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcShowDaysPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the first_show field. - * @var string - */ - protected $first_show; - - /** - * The value for the last_show field. - * @var string - */ - protected $last_show; - - /** - * The value for the start_time field. - * @var string - */ - protected $start_time; - - /** - * The value for the timezone field. - * @var string - */ - protected $timezone; - - /** - * The value for the duration field. - * @var string - */ - protected $duration; - - /** - * The value for the day field. - * @var int - */ - protected $day; - - /** - * The value for the repeat_type field. - * @var int - */ - protected $repeat_type; - - /** - * The value for the next_pop_date field. - * @var string - */ - protected $next_pop_date; - - /** - * The value for the show_id field. - * @var int - */ - protected $show_id; - - /** - * The value for the record field. - * Note: this column has a database default value of: 0 - * @var int - */ - protected $record; - - /** - * @var CcShow - */ - protected $aCcShow; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->record = 0; - } - - /** - * Initializes internal state of BaseCcShowDays object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [optionally formatted] temporal [first_show] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbFirstShow($format = '%x') - { - if ($this->first_show === null) { - return null; - } - - - - try { - $dt = new DateTime($this->first_show); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->first_show, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [last_show] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbLastShow($format = '%x') - { - if ($this->last_show === null) { - return null; - } - - - - try { - $dt = new DateTime($this->last_show); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->last_show, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [start_time] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbStartTime($format = '%X') - { - if ($this->start_time === null) { - return null; - } - - - - try { - $dt = new DateTime($this->start_time); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->start_time, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [timezone] column value. - * - * @return string - */ - public function getDbTimezone() - { - return $this->timezone; - } - - /** - * Get the [duration] column value. - * - * @return string - */ - public function getDbDuration() - { - return $this->duration; - } - - /** - * Get the [day] column value. - * - * @return int - */ - public function getDbDay() - { - return $this->day; - } - - /** - * Get the [repeat_type] column value. - * - * @return int - */ - public function getDbRepeatType() - { - return $this->repeat_type; - } - - /** - * Get the [optionally formatted] temporal [next_pop_date] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbNextPopDate($format = '%x') - { - if ($this->next_pop_date === null) { - return null; - } - - - - try { - $dt = new DateTime($this->next_pop_date); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->next_pop_date, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [show_id] column value. - * - * @return int - */ - public function getDbShowId() - { - return $this->show_id; - } - - /** - * Get the [record] column value. - * - * @return int - */ - public function getDbRecord() - { - return $this->record; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcShowDays The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcShowDaysPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Sets the value of [first_show] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcShowDays The current object (for fluent API support) - */ - public function setDbFirstShow($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->first_show !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->first_show !== null && $tmpDt = new DateTime($this->first_show)) ? $tmpDt->format('Y-m-d') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->first_show = ($dt ? $dt->format('Y-m-d') : null); - $this->modifiedColumns[] = CcShowDaysPeer::FIRST_SHOW; - } - } // if either are not null - - return $this; - } // setDbFirstShow() - - /** - * Sets the value of [last_show] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcShowDays The current object (for fluent API support) - */ - public function setDbLastShow($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->last_show !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->last_show !== null && $tmpDt = new DateTime($this->last_show)) ? $tmpDt->format('Y-m-d') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->last_show = ($dt ? $dt->format('Y-m-d') : null); - $this->modifiedColumns[] = CcShowDaysPeer::LAST_SHOW; - } - } // if either are not null - - return $this; - } // setDbLastShow() - - /** - * Sets the value of [start_time] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcShowDays The current object (for fluent API support) - */ - public function setDbStartTime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->start_time !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->start_time !== null && $tmpDt = new DateTime($this->start_time)) ? $tmpDt->format('H:i:s') : null; - $newNorm = ($dt !== null) ? $dt->format('H:i:s') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->start_time = ($dt ? $dt->format('H:i:s') : null); - $this->modifiedColumns[] = CcShowDaysPeer::START_TIME; - } - } // if either are not null - - return $this; - } // setDbStartTime() - - /** - * Set the value of [timezone] column. - * - * @param string $v new value - * @return CcShowDays The current object (for fluent API support) - */ - public function setDbTimezone($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->timezone !== $v) { - $this->timezone = $v; - $this->modifiedColumns[] = CcShowDaysPeer::TIMEZONE; - } - - return $this; - } // setDbTimezone() - - /** - * Set the value of [duration] column. - * - * @param string $v new value - * @return CcShowDays The current object (for fluent API support) - */ - public function setDbDuration($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->duration !== $v) { - $this->duration = $v; - $this->modifiedColumns[] = CcShowDaysPeer::DURATION; - } - - return $this; - } // setDbDuration() - - /** - * Set the value of [day] column. - * - * @param int $v new value - * @return CcShowDays The current object (for fluent API support) - */ - public function setDbDay($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->day !== $v) { - $this->day = $v; - $this->modifiedColumns[] = CcShowDaysPeer::DAY; - } - - return $this; - } // setDbDay() - - /** - * Set the value of [repeat_type] column. - * - * @param int $v new value - * @return CcShowDays The current object (for fluent API support) - */ - public function setDbRepeatType($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->repeat_type !== $v) { - $this->repeat_type = $v; - $this->modifiedColumns[] = CcShowDaysPeer::REPEAT_TYPE; - } - - return $this; - } // setDbRepeatType() - - /** - * Sets the value of [next_pop_date] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcShowDays The current object (for fluent API support) - */ - public function setDbNextPopDate($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->next_pop_date !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->next_pop_date !== null && $tmpDt = new DateTime($this->next_pop_date)) ? $tmpDt->format('Y-m-d') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->next_pop_date = ($dt ? $dt->format('Y-m-d') : null); - $this->modifiedColumns[] = CcShowDaysPeer::NEXT_POP_DATE; - } - } // if either are not null - - return $this; - } // setDbNextPopDate() - - /** - * Set the value of [show_id] column. - * - * @param int $v new value - * @return CcShowDays The current object (for fluent API support) - */ - public function setDbShowId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->show_id !== $v) { - $this->show_id = $v; - $this->modifiedColumns[] = CcShowDaysPeer::SHOW_ID; - } - - if ($this->aCcShow !== null && $this->aCcShow->getDbId() !== $v) { - $this->aCcShow = null; - } - - return $this; - } // setDbShowId() - - /** - * Set the value of [record] column. - * - * @param int $v new value - * @return CcShowDays The current object (for fluent API support) - */ - public function setDbRecord($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->record !== $v || $this->isNew()) { - $this->record = $v; - $this->modifiedColumns[] = CcShowDaysPeer::RECORD; - } - - return $this; - } // setDbRecord() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->record !== 0) { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->first_show = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->last_show = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->start_time = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->timezone = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; - $this->duration = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; - $this->day = ($row[$startcol + 6] !== null) ? (int) $row[$startcol + 6] : null; - $this->repeat_type = ($row[$startcol + 7] !== null) ? (int) $row[$startcol + 7] : null; - $this->next_pop_date = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; - $this->show_id = ($row[$startcol + 9] !== null) ? (int) $row[$startcol + 9] : null; - $this->record = ($row[$startcol + 10] !== null) ? (int) $row[$startcol + 10] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 11; // 11 = CcShowDaysPeer::NUM_COLUMNS - CcShowDaysPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcShowDays object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcShow !== null && $this->show_id !== $this->aCcShow->getDbId()) { - $this->aCcShow = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcShowDaysPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcShow = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcShowDaysQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcShowDaysPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcShow !== null) { - if ($this->aCcShow->isModified() || $this->aCcShow->isNew()) { - $affectedRows += $this->aCcShow->save($con); - } - $this->setCcShow($this->aCcShow); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcShowDaysPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcShowDaysPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowDaysPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcShowDaysPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcShow !== null) { - if (!$this->aCcShow->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcShow->getValidationFailures()); - } - } - - - if (($retval = CcShowDaysPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcShowDaysPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbFirstShow(); - break; - case 2: - return $this->getDbLastShow(); - break; - case 3: - return $this->getDbStartTime(); - break; - case 4: - return $this->getDbTimezone(); - break; - case 5: - return $this->getDbDuration(); - break; - case 6: - return $this->getDbDay(); - break; - case 7: - return $this->getDbRepeatType(); - break; - case 8: - return $this->getDbNextPopDate(); - break; - case 9: - return $this->getDbShowId(); - break; - case 10: - return $this->getDbRecord(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcShowDaysPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbFirstShow(), - $keys[2] => $this->getDbLastShow(), - $keys[3] => $this->getDbStartTime(), - $keys[4] => $this->getDbTimezone(), - $keys[5] => $this->getDbDuration(), - $keys[6] => $this->getDbDay(), - $keys[7] => $this->getDbRepeatType(), - $keys[8] => $this->getDbNextPopDate(), - $keys[9] => $this->getDbShowId(), - $keys[10] => $this->getDbRecord(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcShow) { - $result['CcShow'] = $this->aCcShow->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcShowDaysPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbFirstShow($value); - break; - case 2: - $this->setDbLastShow($value); - break; - case 3: - $this->setDbStartTime($value); - break; - case 4: - $this->setDbTimezone($value); - break; - case 5: - $this->setDbDuration($value); - break; - case 6: - $this->setDbDay($value); - break; - case 7: - $this->setDbRepeatType($value); - break; - case 8: - $this->setDbNextPopDate($value); - break; - case 9: - $this->setDbShowId($value); - break; - case 10: - $this->setDbRecord($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcShowDaysPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbFirstShow($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbLastShow($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbStartTime($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbTimezone($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setDbDuration($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setDbDay($arr[$keys[6]]); - if (array_key_exists($keys[7], $arr)) $this->setDbRepeatType($arr[$keys[7]]); - if (array_key_exists($keys[8], $arr)) $this->setDbNextPopDate($arr[$keys[8]]); - if (array_key_exists($keys[9], $arr)) $this->setDbShowId($arr[$keys[9]]); - if (array_key_exists($keys[10], $arr)) $this->setDbRecord($arr[$keys[10]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcShowDaysPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcShowDaysPeer::ID)) $criteria->add(CcShowDaysPeer::ID, $this->id); - if ($this->isColumnModified(CcShowDaysPeer::FIRST_SHOW)) $criteria->add(CcShowDaysPeer::FIRST_SHOW, $this->first_show); - if ($this->isColumnModified(CcShowDaysPeer::LAST_SHOW)) $criteria->add(CcShowDaysPeer::LAST_SHOW, $this->last_show); - if ($this->isColumnModified(CcShowDaysPeer::START_TIME)) $criteria->add(CcShowDaysPeer::START_TIME, $this->start_time); - if ($this->isColumnModified(CcShowDaysPeer::TIMEZONE)) $criteria->add(CcShowDaysPeer::TIMEZONE, $this->timezone); - if ($this->isColumnModified(CcShowDaysPeer::DURATION)) $criteria->add(CcShowDaysPeer::DURATION, $this->duration); - if ($this->isColumnModified(CcShowDaysPeer::DAY)) $criteria->add(CcShowDaysPeer::DAY, $this->day); - if ($this->isColumnModified(CcShowDaysPeer::REPEAT_TYPE)) $criteria->add(CcShowDaysPeer::REPEAT_TYPE, $this->repeat_type); - if ($this->isColumnModified(CcShowDaysPeer::NEXT_POP_DATE)) $criteria->add(CcShowDaysPeer::NEXT_POP_DATE, $this->next_pop_date); - if ($this->isColumnModified(CcShowDaysPeer::SHOW_ID)) $criteria->add(CcShowDaysPeer::SHOW_ID, $this->show_id); - if ($this->isColumnModified(CcShowDaysPeer::RECORD)) $criteria->add(CcShowDaysPeer::RECORD, $this->record); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcShowDaysPeer::DATABASE_NAME); - $criteria->add(CcShowDaysPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcShowDays (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbFirstShow($this->first_show); - $copyObj->setDbLastShow($this->last_show); - $copyObj->setDbStartTime($this->start_time); - $copyObj->setDbTimezone($this->timezone); - $copyObj->setDbDuration($this->duration); - $copyObj->setDbDay($this->day); - $copyObj->setDbRepeatType($this->repeat_type); - $copyObj->setDbNextPopDate($this->next_pop_date); - $copyObj->setDbShowId($this->show_id); - $copyObj->setDbRecord($this->record); - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcShowDays Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcShowDaysPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcShowDaysPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcShow object. - * - * @param CcShow $v - * @return CcShowDays The current object (for fluent API support) - * @throws PropelException - */ - public function setCcShow(CcShow $v = null) - { - if ($v === null) { - $this->setDbShowId(NULL); - } else { - $this->setDbShowId($v->getDbId()); - } - - $this->aCcShow = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcShow object, it will not be re-added. - if ($v !== null) { - $v->addCcShowDays($this); - } - - return $this; - } - - - /** - * Get the associated CcShow object - * - * @param PropelPDO Optional Connection object. - * @return CcShow The associated CcShow object. - * @throws PropelException - */ - public function getCcShow(PropelPDO $con = null) - { - if ($this->aCcShow === null && ($this->show_id !== null)) { - $this->aCcShow = CcShowQuery::create()->findPk($this->show_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcShow->addCcShowDayss($this); - */ - } - return $this->aCcShow; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->first_show = null; - $this->last_show = null; - $this->start_time = null; - $this->timezone = null; - $this->duration = null; - $this->day = null; - $this->repeat_type = null; - $this->next_pop_date = null; - $this->show_id = null; - $this->record = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcShow = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcShowDays + /** + * Peer class name + */ + const PEER = 'CcShowDaysPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcShowDaysPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the first_show field. + * @var string + */ + protected $first_show; + + /** + * The value for the last_show field. + * @var string + */ + protected $last_show; + + /** + * The value for the start_time field. + * @var string + */ + protected $start_time; + + /** + * The value for the timezone field. + * @var string + */ + protected $timezone; + + /** + * The value for the duration field. + * @var string + */ + protected $duration; + + /** + * The value for the day field. + * @var int + */ + protected $day; + + /** + * The value for the repeat_type field. + * @var int + */ + protected $repeat_type; + + /** + * The value for the next_pop_date field. + * @var string + */ + protected $next_pop_date; + + /** + * The value for the show_id field. + * @var int + */ + protected $show_id; + + /** + * The value for the record field. + * Note: this column has a database default value of: 0 + * @var int + */ + protected $record; + + /** + * @var CcShow + */ + protected $aCcShow; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->record = 0; + } + + /** + * Initializes internal state of BaseCcShowDays object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [optionally formatted] temporal [first_show] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbFirstShow($format = '%x') + { + if ($this->first_show === null) { + return null; + } + + + try { + $dt = new DateTime($this->first_show); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->first_show, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [last_show] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbLastShow($format = '%x') + { + if ($this->last_show === null) { + return null; + } + + + try { + $dt = new DateTime($this->last_show); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->last_show, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [start_time] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbStartTime($format = '%X') + { + if ($this->start_time === null) { + return null; + } + + + try { + $dt = new DateTime($this->start_time); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->start_time, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [timezone] column value. + * + * @return string + */ + public function getDbTimezone() + { + + return $this->timezone; + } + + /** + * Get the [duration] column value. + * + * @return string + */ + public function getDbDuration() + { + + return $this->duration; + } + + /** + * Get the [day] column value. + * + * @return int + */ + public function getDbDay() + { + + return $this->day; + } + + /** + * Get the [repeat_type] column value. + * + * @return int + */ + public function getDbRepeatType() + { + + return $this->repeat_type; + } + + /** + * Get the [optionally formatted] temporal [next_pop_date] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbNextPopDate($format = '%x') + { + if ($this->next_pop_date === null) { + return null; + } + + + try { + $dt = new DateTime($this->next_pop_date); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->next_pop_date, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [show_id] column value. + * + * @return int + */ + public function getDbShowId() + { + + return $this->show_id; + } + + /** + * Get the [record] column value. + * + * @return int + */ + public function getDbRecord() + { + + return $this->record; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcShowDays The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcShowDaysPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Sets the value of [first_show] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcShowDays The current object (for fluent API support) + */ + public function setDbFirstShow($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->first_show !== null || $dt !== null) { + $currentDateAsString = ($this->first_show !== null && $tmpDt = new DateTime($this->first_show)) ? $tmpDt->format('Y-m-d') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->first_show = $newDateAsString; + $this->modifiedColumns[] = CcShowDaysPeer::FIRST_SHOW; + } + } // if either are not null + + + return $this; + } // setDbFirstShow() + + /** + * Sets the value of [last_show] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcShowDays The current object (for fluent API support) + */ + public function setDbLastShow($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->last_show !== null || $dt !== null) { + $currentDateAsString = ($this->last_show !== null && $tmpDt = new DateTime($this->last_show)) ? $tmpDt->format('Y-m-d') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->last_show = $newDateAsString; + $this->modifiedColumns[] = CcShowDaysPeer::LAST_SHOW; + } + } // if either are not null + + + return $this; + } // setDbLastShow() + + /** + * Sets the value of [start_time] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcShowDays The current object (for fluent API support) + */ + public function setDbStartTime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->start_time !== null || $dt !== null) { + $currentDateAsString = ($this->start_time !== null && $tmpDt = new DateTime($this->start_time)) ? $tmpDt->format('H:i:s') : null; + $newDateAsString = $dt ? $dt->format('H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->start_time = $newDateAsString; + $this->modifiedColumns[] = CcShowDaysPeer::START_TIME; + } + } // if either are not null + + + return $this; + } // setDbStartTime() + + /** + * Set the value of [timezone] column. + * + * @param string $v new value + * @return CcShowDays The current object (for fluent API support) + */ + public function setDbTimezone($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->timezone !== $v) { + $this->timezone = $v; + $this->modifiedColumns[] = CcShowDaysPeer::TIMEZONE; + } + + + return $this; + } // setDbTimezone() + + /** + * Set the value of [duration] column. + * + * @param string $v new value + * @return CcShowDays The current object (for fluent API support) + */ + public function setDbDuration($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->duration !== $v) { + $this->duration = $v; + $this->modifiedColumns[] = CcShowDaysPeer::DURATION; + } + + + return $this; + } // setDbDuration() + + /** + * Set the value of [day] column. + * + * @param int $v new value + * @return CcShowDays The current object (for fluent API support) + */ + public function setDbDay($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->day !== $v) { + $this->day = $v; + $this->modifiedColumns[] = CcShowDaysPeer::DAY; + } + + + return $this; + } // setDbDay() + + /** + * Set the value of [repeat_type] column. + * + * @param int $v new value + * @return CcShowDays The current object (for fluent API support) + */ + public function setDbRepeatType($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->repeat_type !== $v) { + $this->repeat_type = $v; + $this->modifiedColumns[] = CcShowDaysPeer::REPEAT_TYPE; + } + + + return $this; + } // setDbRepeatType() + + /** + * Sets the value of [next_pop_date] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcShowDays The current object (for fluent API support) + */ + public function setDbNextPopDate($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->next_pop_date !== null || $dt !== null) { + $currentDateAsString = ($this->next_pop_date !== null && $tmpDt = new DateTime($this->next_pop_date)) ? $tmpDt->format('Y-m-d') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->next_pop_date = $newDateAsString; + $this->modifiedColumns[] = CcShowDaysPeer::NEXT_POP_DATE; + } + } // if either are not null + + + return $this; + } // setDbNextPopDate() + + /** + * Set the value of [show_id] column. + * + * @param int $v new value + * @return CcShowDays The current object (for fluent API support) + */ + public function setDbShowId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->show_id !== $v) { + $this->show_id = $v; + $this->modifiedColumns[] = CcShowDaysPeer::SHOW_ID; + } + + if ($this->aCcShow !== null && $this->aCcShow->getDbId() !== $v) { + $this->aCcShow = null; + } + + + return $this; + } // setDbShowId() + + /** + * Set the value of [record] column. + * + * @param int $v new value + * @return CcShowDays The current object (for fluent API support) + */ + public function setDbRecord($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->record !== $v) { + $this->record = $v; + $this->modifiedColumns[] = CcShowDaysPeer::RECORD; + } + + + return $this; + } // setDbRecord() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->record !== 0) { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->first_show = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->last_show = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->start_time = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->timezone = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; + $this->duration = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; + $this->day = ($row[$startcol + 6] !== null) ? (int) $row[$startcol + 6] : null; + $this->repeat_type = ($row[$startcol + 7] !== null) ? (int) $row[$startcol + 7] : null; + $this->next_pop_date = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; + $this->show_id = ($row[$startcol + 9] !== null) ? (int) $row[$startcol + 9] : null; + $this->record = ($row[$startcol + 10] !== null) ? (int) $row[$startcol + 10] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 11; // 11 = CcShowDaysPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcShowDays object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcShow !== null && $this->show_id !== $this->aCcShow->getDbId()) { + $this->aCcShow = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcShowDaysPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcShow = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcShowDaysQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcShowDaysPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcShow !== null) { + if ($this->aCcShow->isModified() || $this->aCcShow->isNew()) { + $affectedRows += $this->aCcShow->save($con); + } + $this->setCcShow($this->aCcShow); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcShowDaysPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcShowDaysPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_show_days_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcShowDaysPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcShowDaysPeer::FIRST_SHOW)) { + $modifiedColumns[':p' . $index++] = '"first_show"'; + } + if ($this->isColumnModified(CcShowDaysPeer::LAST_SHOW)) { + $modifiedColumns[':p' . $index++] = '"last_show"'; + } + if ($this->isColumnModified(CcShowDaysPeer::START_TIME)) { + $modifiedColumns[':p' . $index++] = '"start_time"'; + } + if ($this->isColumnModified(CcShowDaysPeer::TIMEZONE)) { + $modifiedColumns[':p' . $index++] = '"timezone"'; + } + if ($this->isColumnModified(CcShowDaysPeer::DURATION)) { + $modifiedColumns[':p' . $index++] = '"duration"'; + } + if ($this->isColumnModified(CcShowDaysPeer::DAY)) { + $modifiedColumns[':p' . $index++] = '"day"'; + } + if ($this->isColumnModified(CcShowDaysPeer::REPEAT_TYPE)) { + $modifiedColumns[':p' . $index++] = '"repeat_type"'; + } + if ($this->isColumnModified(CcShowDaysPeer::NEXT_POP_DATE)) { + $modifiedColumns[':p' . $index++] = '"next_pop_date"'; + } + if ($this->isColumnModified(CcShowDaysPeer::SHOW_ID)) { + $modifiedColumns[':p' . $index++] = '"show_id"'; + } + if ($this->isColumnModified(CcShowDaysPeer::RECORD)) { + $modifiedColumns[':p' . $index++] = '"record"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_show_days" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"first_show"': + $stmt->bindValue($identifier, $this->first_show, PDO::PARAM_STR); + break; + case '"last_show"': + $stmt->bindValue($identifier, $this->last_show, PDO::PARAM_STR); + break; + case '"start_time"': + $stmt->bindValue($identifier, $this->start_time, PDO::PARAM_STR); + break; + case '"timezone"': + $stmt->bindValue($identifier, $this->timezone, PDO::PARAM_STR); + break; + case '"duration"': + $stmt->bindValue($identifier, $this->duration, PDO::PARAM_STR); + break; + case '"day"': + $stmt->bindValue($identifier, $this->day, PDO::PARAM_INT); + break; + case '"repeat_type"': + $stmt->bindValue($identifier, $this->repeat_type, PDO::PARAM_INT); + break; + case '"next_pop_date"': + $stmt->bindValue($identifier, $this->next_pop_date, PDO::PARAM_STR); + break; + case '"show_id"': + $stmt->bindValue($identifier, $this->show_id, PDO::PARAM_INT); + break; + case '"record"': + $stmt->bindValue($identifier, $this->record, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcShow !== null) { + if (!$this->aCcShow->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcShow->getValidationFailures()); + } + } + + + if (($retval = CcShowDaysPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcShowDaysPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbFirstShow(); + break; + case 2: + return $this->getDbLastShow(); + break; + case 3: + return $this->getDbStartTime(); + break; + case 4: + return $this->getDbTimezone(); + break; + case 5: + return $this->getDbDuration(); + break; + case 6: + return $this->getDbDay(); + break; + case 7: + return $this->getDbRepeatType(); + break; + case 8: + return $this->getDbNextPopDate(); + break; + case 9: + return $this->getDbShowId(); + break; + case 10: + return $this->getDbRecord(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcShowDays'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcShowDays'][$this->getPrimaryKey()] = true; + $keys = CcShowDaysPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbFirstShow(), + $keys[2] => $this->getDbLastShow(), + $keys[3] => $this->getDbStartTime(), + $keys[4] => $this->getDbTimezone(), + $keys[5] => $this->getDbDuration(), + $keys[6] => $this->getDbDay(), + $keys[7] => $this->getDbRepeatType(), + $keys[8] => $this->getDbNextPopDate(), + $keys[9] => $this->getDbShowId(), + $keys[10] => $this->getDbRecord(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcShow) { + $result['CcShow'] = $this->aCcShow->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcShowDaysPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbFirstShow($value); + break; + case 2: + $this->setDbLastShow($value); + break; + case 3: + $this->setDbStartTime($value); + break; + case 4: + $this->setDbTimezone($value); + break; + case 5: + $this->setDbDuration($value); + break; + case 6: + $this->setDbDay($value); + break; + case 7: + $this->setDbRepeatType($value); + break; + case 8: + $this->setDbNextPopDate($value); + break; + case 9: + $this->setDbShowId($value); + break; + case 10: + $this->setDbRecord($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcShowDaysPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbFirstShow($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbLastShow($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbStartTime($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbTimezone($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setDbDuration($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setDbDay($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setDbRepeatType($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setDbNextPopDate($arr[$keys[8]]); + if (array_key_exists($keys[9], $arr)) $this->setDbShowId($arr[$keys[9]]); + if (array_key_exists($keys[10], $arr)) $this->setDbRecord($arr[$keys[10]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcShowDaysPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcShowDaysPeer::ID)) $criteria->add(CcShowDaysPeer::ID, $this->id); + if ($this->isColumnModified(CcShowDaysPeer::FIRST_SHOW)) $criteria->add(CcShowDaysPeer::FIRST_SHOW, $this->first_show); + if ($this->isColumnModified(CcShowDaysPeer::LAST_SHOW)) $criteria->add(CcShowDaysPeer::LAST_SHOW, $this->last_show); + if ($this->isColumnModified(CcShowDaysPeer::START_TIME)) $criteria->add(CcShowDaysPeer::START_TIME, $this->start_time); + if ($this->isColumnModified(CcShowDaysPeer::TIMEZONE)) $criteria->add(CcShowDaysPeer::TIMEZONE, $this->timezone); + if ($this->isColumnModified(CcShowDaysPeer::DURATION)) $criteria->add(CcShowDaysPeer::DURATION, $this->duration); + if ($this->isColumnModified(CcShowDaysPeer::DAY)) $criteria->add(CcShowDaysPeer::DAY, $this->day); + if ($this->isColumnModified(CcShowDaysPeer::REPEAT_TYPE)) $criteria->add(CcShowDaysPeer::REPEAT_TYPE, $this->repeat_type); + if ($this->isColumnModified(CcShowDaysPeer::NEXT_POP_DATE)) $criteria->add(CcShowDaysPeer::NEXT_POP_DATE, $this->next_pop_date); + if ($this->isColumnModified(CcShowDaysPeer::SHOW_ID)) $criteria->add(CcShowDaysPeer::SHOW_ID, $this->show_id); + if ($this->isColumnModified(CcShowDaysPeer::RECORD)) $criteria->add(CcShowDaysPeer::RECORD, $this->record); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcShowDaysPeer::DATABASE_NAME); + $criteria->add(CcShowDaysPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcShowDays (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbFirstShow($this->getDbFirstShow()); + $copyObj->setDbLastShow($this->getDbLastShow()); + $copyObj->setDbStartTime($this->getDbStartTime()); + $copyObj->setDbTimezone($this->getDbTimezone()); + $copyObj->setDbDuration($this->getDbDuration()); + $copyObj->setDbDay($this->getDbDay()); + $copyObj->setDbRepeatType($this->getDbRepeatType()); + $copyObj->setDbNextPopDate($this->getDbNextPopDate()); + $copyObj->setDbShowId($this->getDbShowId()); + $copyObj->setDbRecord($this->getDbRecord()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcShowDays Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcShowDaysPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcShowDaysPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcShow object. + * + * @param CcShow $v + * @return CcShowDays The current object (for fluent API support) + * @throws PropelException + */ + public function setCcShow(CcShow $v = null) + { + if ($v === null) { + $this->setDbShowId(NULL); + } else { + $this->setDbShowId($v->getDbId()); + } + + $this->aCcShow = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcShow object, it will not be re-added. + if ($v !== null) { + $v->addCcShowDays($this); + } + + + return $this; + } + + + /** + * Get the associated CcShow object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcShow The associated CcShow object. + * @throws PropelException + */ + public function getCcShow(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcShow === null && ($this->show_id !== null) && $doQuery) { + $this->aCcShow = CcShowQuery::create()->findPk($this->show_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcShow->addCcShowDayss($this); + */ + } + + return $this->aCcShow; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->first_show = null; + $this->last_show = null; + $this->start_time = null; + $this->timezone = null; + $this->duration = null; + $this->day = null; + $this->repeat_type = null; + $this->next_pop_date = null; + $this->show_id = null; + $this->record = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcShow instanceof Persistent) { + $this->aCcShow->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcShow = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcShowDaysPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowDaysPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcShowDaysPeer.php index df6b9081d4..cb76ec2a30 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowDaysPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowDaysPeer.php @@ -4,1011 +4,1037 @@ /** * Base static class for performing query and update operations on the 'cc_show_days' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcShowDaysPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_show_days'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcShowDays'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcShowDays'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcShowDaysTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 11; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_show_days.ID'; - - /** the column name for the FIRST_SHOW field */ - const FIRST_SHOW = 'cc_show_days.FIRST_SHOW'; - - /** the column name for the LAST_SHOW field */ - const LAST_SHOW = 'cc_show_days.LAST_SHOW'; - - /** the column name for the START_TIME field */ - const START_TIME = 'cc_show_days.START_TIME'; - - /** the column name for the TIMEZONE field */ - const TIMEZONE = 'cc_show_days.TIMEZONE'; - - /** the column name for the DURATION field */ - const DURATION = 'cc_show_days.DURATION'; - - /** the column name for the DAY field */ - const DAY = 'cc_show_days.DAY'; - - /** the column name for the REPEAT_TYPE field */ - const REPEAT_TYPE = 'cc_show_days.REPEAT_TYPE'; - - /** the column name for the NEXT_POP_DATE field */ - const NEXT_POP_DATE = 'cc_show_days.NEXT_POP_DATE'; - - /** the column name for the SHOW_ID field */ - const SHOW_ID = 'cc_show_days.SHOW_ID'; - - /** the column name for the RECORD field */ - const RECORD = 'cc_show_days.RECORD'; - - /** - * An identiy map to hold any loaded instances of CcShowDays objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcShowDays[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbFirstShow', 'DbLastShow', 'DbStartTime', 'DbTimezone', 'DbDuration', 'DbDay', 'DbRepeatType', 'DbNextPopDate', 'DbShowId', 'DbRecord', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbFirstShow', 'dbLastShow', 'dbStartTime', 'dbTimezone', 'dbDuration', 'dbDay', 'dbRepeatType', 'dbNextPopDate', 'dbShowId', 'dbRecord', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::FIRST_SHOW, self::LAST_SHOW, self::START_TIME, self::TIMEZONE, self::DURATION, self::DAY, self::REPEAT_TYPE, self::NEXT_POP_DATE, self::SHOW_ID, self::RECORD, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'FIRST_SHOW', 'LAST_SHOW', 'START_TIME', 'TIMEZONE', 'DURATION', 'DAY', 'REPEAT_TYPE', 'NEXT_POP_DATE', 'SHOW_ID', 'RECORD', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'first_show', 'last_show', 'start_time', 'timezone', 'duration', 'day', 'repeat_type', 'next_pop_date', 'show_id', 'record', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbFirstShow' => 1, 'DbLastShow' => 2, 'DbStartTime' => 3, 'DbTimezone' => 4, 'DbDuration' => 5, 'DbDay' => 6, 'DbRepeatType' => 7, 'DbNextPopDate' => 8, 'DbShowId' => 9, 'DbRecord' => 10, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbFirstShow' => 1, 'dbLastShow' => 2, 'dbStartTime' => 3, 'dbTimezone' => 4, 'dbDuration' => 5, 'dbDay' => 6, 'dbRepeatType' => 7, 'dbNextPopDate' => 8, 'dbShowId' => 9, 'dbRecord' => 10, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::FIRST_SHOW => 1, self::LAST_SHOW => 2, self::START_TIME => 3, self::TIMEZONE => 4, self::DURATION => 5, self::DAY => 6, self::REPEAT_TYPE => 7, self::NEXT_POP_DATE => 8, self::SHOW_ID => 9, self::RECORD => 10, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'FIRST_SHOW' => 1, 'LAST_SHOW' => 2, 'START_TIME' => 3, 'TIMEZONE' => 4, 'DURATION' => 5, 'DAY' => 6, 'REPEAT_TYPE' => 7, 'NEXT_POP_DATE' => 8, 'SHOW_ID' => 9, 'RECORD' => 10, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'first_show' => 1, 'last_show' => 2, 'start_time' => 3, 'timezone' => 4, 'duration' => 5, 'day' => 6, 'repeat_type' => 7, 'next_pop_date' => 8, 'show_id' => 9, 'record' => 10, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcShowDaysPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcShowDaysPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcShowDaysPeer::ID); - $criteria->addSelectColumn(CcShowDaysPeer::FIRST_SHOW); - $criteria->addSelectColumn(CcShowDaysPeer::LAST_SHOW); - $criteria->addSelectColumn(CcShowDaysPeer::START_TIME); - $criteria->addSelectColumn(CcShowDaysPeer::TIMEZONE); - $criteria->addSelectColumn(CcShowDaysPeer::DURATION); - $criteria->addSelectColumn(CcShowDaysPeer::DAY); - $criteria->addSelectColumn(CcShowDaysPeer::REPEAT_TYPE); - $criteria->addSelectColumn(CcShowDaysPeer::NEXT_POP_DATE); - $criteria->addSelectColumn(CcShowDaysPeer::SHOW_ID); - $criteria->addSelectColumn(CcShowDaysPeer::RECORD); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.FIRST_SHOW'); - $criteria->addSelectColumn($alias . '.LAST_SHOW'); - $criteria->addSelectColumn($alias . '.START_TIME'); - $criteria->addSelectColumn($alias . '.TIMEZONE'); - $criteria->addSelectColumn($alias . '.DURATION'); - $criteria->addSelectColumn($alias . '.DAY'); - $criteria->addSelectColumn($alias . '.REPEAT_TYPE'); - $criteria->addSelectColumn($alias . '.NEXT_POP_DATE'); - $criteria->addSelectColumn($alias . '.SHOW_ID'); - $criteria->addSelectColumn($alias . '.RECORD'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowDaysPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowDaysPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcShowDays - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcShowDaysPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcShowDaysPeer::populateObjects(CcShowDaysPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcShowDaysPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcShowDays $value A CcShowDays object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcShowDays $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcShowDays object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcShowDays) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcShowDays object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcShowDays Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_show_days - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcShowDaysPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcShowDaysPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcShowDaysPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcShowDaysPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcShowDays object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcShowDaysPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcShowDaysPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcShowDaysPeer::NUM_COLUMNS; - } else { - $cls = CcShowDaysPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcShowDaysPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcShow table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowDaysPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowDaysPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowDaysPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcShowDays objects pre-filled with their CcShow objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowDays objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowDaysPeer::addSelectColumns($criteria); - $startcol = (CcShowDaysPeer::NUM_COLUMNS - CcShowDaysPeer::NUM_LAZY_LOAD_COLUMNS); - CcShowPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcShowDaysPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowDaysPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowDaysPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcShowDaysPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowDaysPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcShowPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcShowPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcShowDays) to $obj2 (CcShow) - $obj2->addCcShowDays($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowDaysPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowDaysPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowDaysPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcShowDays objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowDays objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowDaysPeer::addSelectColumns($criteria); - $startcol2 = (CcShowDaysPeer::NUM_COLUMNS - CcShowDaysPeer::NUM_LAZY_LOAD_COLUMNS); - - CcShowPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcShowPeer::NUM_COLUMNS - CcShowPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcShowDaysPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowDaysPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowDaysPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcShowDaysPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowDaysPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcShow rows - - $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcShowPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcShowPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcShowDays) to the collection in $obj2 (CcShow) - $obj2->addCcShowDays($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcShowDaysPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcShowDaysPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcShowDaysTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcShowDaysPeer::CLASS_DEFAULT : CcShowDaysPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcShowDays or Criteria object. - * - * @param mixed $values Criteria or CcShowDays object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcShowDays object - } - - if ($criteria->containsKey(CcShowDaysPeer::ID) && $criteria->keyContainsValue(CcShowDaysPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowDaysPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcShowDays or Criteria object. - * - * @param mixed $values Criteria or CcShowDays object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcShowDaysPeer::ID); - $value = $criteria->remove(CcShowDaysPeer::ID); - if ($value) { - $selectCriteria->add(CcShowDaysPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcShowDaysPeer::TABLE_NAME); - } - - } else { // $values is CcShowDays object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_show_days table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcShowDaysPeer::TABLE_NAME, $con, CcShowDaysPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcShowDaysPeer::clearInstancePool(); - CcShowDaysPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcShowDays or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcShowDays object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcShowDaysPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcShowDays) { // it's a model object - // invalidate the cache for this single object - CcShowDaysPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcShowDaysPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcShowDaysPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcShowDaysPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcShowDays object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcShowDays $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcShowDays $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcShowDaysPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcShowDaysPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcShowDaysPeer::DATABASE_NAME, CcShowDaysPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcShowDays - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcShowDaysPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcShowDaysPeer::DATABASE_NAME); - $criteria->add(CcShowDaysPeer::ID, $pk); - - $v = CcShowDaysPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcShowDaysPeer::DATABASE_NAME); - $criteria->add(CcShowDaysPeer::ID, $pks, Criteria::IN); - $objs = CcShowDaysPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcShowDaysPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_show_days'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcShowDays'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcShowDaysTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 11; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 11; + + /** the column name for the id field */ + const ID = 'cc_show_days.id'; + + /** the column name for the first_show field */ + const FIRST_SHOW = 'cc_show_days.first_show'; + + /** the column name for the last_show field */ + const LAST_SHOW = 'cc_show_days.last_show'; + + /** the column name for the start_time field */ + const START_TIME = 'cc_show_days.start_time'; + + /** the column name for the timezone field */ + const TIMEZONE = 'cc_show_days.timezone'; + + /** the column name for the duration field */ + const DURATION = 'cc_show_days.duration'; + + /** the column name for the day field */ + const DAY = 'cc_show_days.day'; + + /** the column name for the repeat_type field */ + const REPEAT_TYPE = 'cc_show_days.repeat_type'; + + /** the column name for the next_pop_date field */ + const NEXT_POP_DATE = 'cc_show_days.next_pop_date'; + + /** the column name for the show_id field */ + const SHOW_ID = 'cc_show_days.show_id'; + + /** the column name for the record field */ + const RECORD = 'cc_show_days.record'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcShowDays objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcShowDays[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcShowDaysPeer::$fieldNames[CcShowDaysPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbFirstShow', 'DbLastShow', 'DbStartTime', 'DbTimezone', 'DbDuration', 'DbDay', 'DbRepeatType', 'DbNextPopDate', 'DbShowId', 'DbRecord', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbFirstShow', 'dbLastShow', 'dbStartTime', 'dbTimezone', 'dbDuration', 'dbDay', 'dbRepeatType', 'dbNextPopDate', 'dbShowId', 'dbRecord', ), + BasePeer::TYPE_COLNAME => array (CcShowDaysPeer::ID, CcShowDaysPeer::FIRST_SHOW, CcShowDaysPeer::LAST_SHOW, CcShowDaysPeer::START_TIME, CcShowDaysPeer::TIMEZONE, CcShowDaysPeer::DURATION, CcShowDaysPeer::DAY, CcShowDaysPeer::REPEAT_TYPE, CcShowDaysPeer::NEXT_POP_DATE, CcShowDaysPeer::SHOW_ID, CcShowDaysPeer::RECORD, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'FIRST_SHOW', 'LAST_SHOW', 'START_TIME', 'TIMEZONE', 'DURATION', 'DAY', 'REPEAT_TYPE', 'NEXT_POP_DATE', 'SHOW_ID', 'RECORD', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'first_show', 'last_show', 'start_time', 'timezone', 'duration', 'day', 'repeat_type', 'next_pop_date', 'show_id', 'record', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcShowDaysPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbFirstShow' => 1, 'DbLastShow' => 2, 'DbStartTime' => 3, 'DbTimezone' => 4, 'DbDuration' => 5, 'DbDay' => 6, 'DbRepeatType' => 7, 'DbNextPopDate' => 8, 'DbShowId' => 9, 'DbRecord' => 10, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbFirstShow' => 1, 'dbLastShow' => 2, 'dbStartTime' => 3, 'dbTimezone' => 4, 'dbDuration' => 5, 'dbDay' => 6, 'dbRepeatType' => 7, 'dbNextPopDate' => 8, 'dbShowId' => 9, 'dbRecord' => 10, ), + BasePeer::TYPE_COLNAME => array (CcShowDaysPeer::ID => 0, CcShowDaysPeer::FIRST_SHOW => 1, CcShowDaysPeer::LAST_SHOW => 2, CcShowDaysPeer::START_TIME => 3, CcShowDaysPeer::TIMEZONE => 4, CcShowDaysPeer::DURATION => 5, CcShowDaysPeer::DAY => 6, CcShowDaysPeer::REPEAT_TYPE => 7, CcShowDaysPeer::NEXT_POP_DATE => 8, CcShowDaysPeer::SHOW_ID => 9, CcShowDaysPeer::RECORD => 10, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'FIRST_SHOW' => 1, 'LAST_SHOW' => 2, 'START_TIME' => 3, 'TIMEZONE' => 4, 'DURATION' => 5, 'DAY' => 6, 'REPEAT_TYPE' => 7, 'NEXT_POP_DATE' => 8, 'SHOW_ID' => 9, 'RECORD' => 10, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'first_show' => 1, 'last_show' => 2, 'start_time' => 3, 'timezone' => 4, 'duration' => 5, 'day' => 6, 'repeat_type' => 7, 'next_pop_date' => 8, 'show_id' => 9, 'record' => 10, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcShowDaysPeer::getFieldNames($toType); + $key = isset(CcShowDaysPeer::$fieldKeys[$fromType][$name]) ? CcShowDaysPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcShowDaysPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcShowDaysPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcShowDaysPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcShowDaysPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcShowDaysPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcShowDaysPeer::ID); + $criteria->addSelectColumn(CcShowDaysPeer::FIRST_SHOW); + $criteria->addSelectColumn(CcShowDaysPeer::LAST_SHOW); + $criteria->addSelectColumn(CcShowDaysPeer::START_TIME); + $criteria->addSelectColumn(CcShowDaysPeer::TIMEZONE); + $criteria->addSelectColumn(CcShowDaysPeer::DURATION); + $criteria->addSelectColumn(CcShowDaysPeer::DAY); + $criteria->addSelectColumn(CcShowDaysPeer::REPEAT_TYPE); + $criteria->addSelectColumn(CcShowDaysPeer::NEXT_POP_DATE); + $criteria->addSelectColumn(CcShowDaysPeer::SHOW_ID); + $criteria->addSelectColumn(CcShowDaysPeer::RECORD); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.first_show'); + $criteria->addSelectColumn($alias . '.last_show'); + $criteria->addSelectColumn($alias . '.start_time'); + $criteria->addSelectColumn($alias . '.timezone'); + $criteria->addSelectColumn($alias . '.duration'); + $criteria->addSelectColumn($alias . '.day'); + $criteria->addSelectColumn($alias . '.repeat_type'); + $criteria->addSelectColumn($alias . '.next_pop_date'); + $criteria->addSelectColumn($alias . '.show_id'); + $criteria->addSelectColumn($alias . '.record'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowDaysPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowDaysPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcShowDaysPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcShowDays + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcShowDaysPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcShowDaysPeer::populateObjects(CcShowDaysPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcShowDaysPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcShowDaysPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcShowDays $obj A CcShowDays object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcShowDaysPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcShowDays object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcShowDays) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcShowDays object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcShowDaysPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcShowDays Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcShowDaysPeer::$instances[$key])) { + return CcShowDaysPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcShowDaysPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcShowDaysPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_show_days + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcShowDaysPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcShowDaysPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcShowDaysPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcShowDaysPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcShowDays object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcShowDaysPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcShowDaysPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcShowDaysPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcShowDaysPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcShowDaysPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcShow table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowDaysPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowDaysPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcShowDaysPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowDaysPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcShowDays objects pre-filled with their CcShow objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowDays objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowDaysPeer::DATABASE_NAME); + } + + CcShowDaysPeer::addSelectColumns($criteria); + $startcol = CcShowDaysPeer::NUM_HYDRATE_COLUMNS; + CcShowPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcShowDaysPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowDaysPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowDaysPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcShowDaysPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowDaysPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcShowPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcShowPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcShowDays) to $obj2 (CcShow) + $obj2->addCcShowDays($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowDaysPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowDaysPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcShowDaysPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowDaysPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcShowDays objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowDays objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowDaysPeer::DATABASE_NAME); + } + + CcShowDaysPeer::addSelectColumns($criteria); + $startcol2 = CcShowDaysPeer::NUM_HYDRATE_COLUMNS; + + CcShowPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcShowPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcShowDaysPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowDaysPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowDaysPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcShowDaysPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowDaysPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcShow rows + + $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcShowPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcShowPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcShowDays) to the collection in $obj2 (CcShow) + $obj2->addCcShowDays($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcShowDaysPeer::DATABASE_NAME)->getTable(CcShowDaysPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcShowDaysPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcShowDaysPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcShowDaysTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcShowDaysPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcShowDays or Criteria object. + * + * @param mixed $values Criteria or CcShowDays object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcShowDays object + } + + if ($criteria->containsKey(CcShowDaysPeer::ID) && $criteria->keyContainsValue(CcShowDaysPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowDaysPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcShowDaysPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcShowDays or Criteria object. + * + * @param mixed $values Criteria or CcShowDays object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcShowDaysPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcShowDaysPeer::ID); + $value = $criteria->remove(CcShowDaysPeer::ID); + if ($value) { + $selectCriteria->add(CcShowDaysPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcShowDaysPeer::TABLE_NAME); + } + + } else { // $values is CcShowDays object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcShowDaysPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_show_days table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcShowDaysPeer::TABLE_NAME, $con, CcShowDaysPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcShowDaysPeer::clearInstancePool(); + CcShowDaysPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcShowDays or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcShowDays object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcShowDaysPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcShowDays) { // it's a model object + // invalidate the cache for this single object + CcShowDaysPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcShowDaysPeer::DATABASE_NAME); + $criteria->add(CcShowDaysPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcShowDaysPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcShowDaysPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcShowDaysPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcShowDays object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcShowDays $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcShowDaysPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcShowDaysPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcShowDaysPeer::DATABASE_NAME, CcShowDaysPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcShowDays + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcShowDaysPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcShowDaysPeer::DATABASE_NAME); + $criteria->add(CcShowDaysPeer::ID, $pk); + + $v = CcShowDaysPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcShowDays[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcShowDaysPeer::DATABASE_NAME); + $criteria->add(CcShowDaysPeer::ID, $pks, Criteria::IN); + $objs = CcShowDaysPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcShowDaysPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowDaysQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcShowDaysQuery.php index 18653bd701..1bac6d0189 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowDaysQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowDaysQuery.php @@ -4,562 +4,793 @@ /** * Base class that represents a query for the 'cc_show_days' table. * - * * - * @method CcShowDaysQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcShowDaysQuery orderByDbFirstShow($order = Criteria::ASC) Order by the first_show column - * @method CcShowDaysQuery orderByDbLastShow($order = Criteria::ASC) Order by the last_show column - * @method CcShowDaysQuery orderByDbStartTime($order = Criteria::ASC) Order by the start_time column - * @method CcShowDaysQuery orderByDbTimezone($order = Criteria::ASC) Order by the timezone column - * @method CcShowDaysQuery orderByDbDuration($order = Criteria::ASC) Order by the duration column - * @method CcShowDaysQuery orderByDbDay($order = Criteria::ASC) Order by the day column - * @method CcShowDaysQuery orderByDbRepeatType($order = Criteria::ASC) Order by the repeat_type column - * @method CcShowDaysQuery orderByDbNextPopDate($order = Criteria::ASC) Order by the next_pop_date column - * @method CcShowDaysQuery orderByDbShowId($order = Criteria::ASC) Order by the show_id column - * @method CcShowDaysQuery orderByDbRecord($order = Criteria::ASC) Order by the record column * - * @method CcShowDaysQuery groupByDbId() Group by the id column - * @method CcShowDaysQuery groupByDbFirstShow() Group by the first_show column - * @method CcShowDaysQuery groupByDbLastShow() Group by the last_show column - * @method CcShowDaysQuery groupByDbStartTime() Group by the start_time column - * @method CcShowDaysQuery groupByDbTimezone() Group by the timezone column - * @method CcShowDaysQuery groupByDbDuration() Group by the duration column - * @method CcShowDaysQuery groupByDbDay() Group by the day column - * @method CcShowDaysQuery groupByDbRepeatType() Group by the repeat_type column - * @method CcShowDaysQuery groupByDbNextPopDate() Group by the next_pop_date column - * @method CcShowDaysQuery groupByDbShowId() Group by the show_id column - * @method CcShowDaysQuery groupByDbRecord() Group by the record column + * @method CcShowDaysQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcShowDaysQuery orderByDbFirstShow($order = Criteria::ASC) Order by the first_show column + * @method CcShowDaysQuery orderByDbLastShow($order = Criteria::ASC) Order by the last_show column + * @method CcShowDaysQuery orderByDbStartTime($order = Criteria::ASC) Order by the start_time column + * @method CcShowDaysQuery orderByDbTimezone($order = Criteria::ASC) Order by the timezone column + * @method CcShowDaysQuery orderByDbDuration($order = Criteria::ASC) Order by the duration column + * @method CcShowDaysQuery orderByDbDay($order = Criteria::ASC) Order by the day column + * @method CcShowDaysQuery orderByDbRepeatType($order = Criteria::ASC) Order by the repeat_type column + * @method CcShowDaysQuery orderByDbNextPopDate($order = Criteria::ASC) Order by the next_pop_date column + * @method CcShowDaysQuery orderByDbShowId($order = Criteria::ASC) Order by the show_id column + * @method CcShowDaysQuery orderByDbRecord($order = Criteria::ASC) Order by the record column * - * @method CcShowDaysQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcShowDaysQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcShowDaysQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcShowDaysQuery groupByDbId() Group by the id column + * @method CcShowDaysQuery groupByDbFirstShow() Group by the first_show column + * @method CcShowDaysQuery groupByDbLastShow() Group by the last_show column + * @method CcShowDaysQuery groupByDbStartTime() Group by the start_time column + * @method CcShowDaysQuery groupByDbTimezone() Group by the timezone column + * @method CcShowDaysQuery groupByDbDuration() Group by the duration column + * @method CcShowDaysQuery groupByDbDay() Group by the day column + * @method CcShowDaysQuery groupByDbRepeatType() Group by the repeat_type column + * @method CcShowDaysQuery groupByDbNextPopDate() Group by the next_pop_date column + * @method CcShowDaysQuery groupByDbShowId() Group by the show_id column + * @method CcShowDaysQuery groupByDbRecord() Group by the record column * - * @method CcShowDaysQuery leftJoinCcShow($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShow relation - * @method CcShowDaysQuery rightJoinCcShow($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShow relation - * @method CcShowDaysQuery innerJoinCcShow($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShow relation + * @method CcShowDaysQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcShowDaysQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcShowDaysQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcShowDays findOne(PropelPDO $con = null) Return the first CcShowDays matching the query - * @method CcShowDays findOneOrCreate(PropelPDO $con = null) Return the first CcShowDays matching the query, or a new CcShowDays object populated from the query conditions when no match is found + * @method CcShowDaysQuery leftJoinCcShow($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShow relation + * @method CcShowDaysQuery rightJoinCcShow($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShow relation + * @method CcShowDaysQuery innerJoinCcShow($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShow relation * - * @method CcShowDays findOneByDbId(int $id) Return the first CcShowDays filtered by the id column - * @method CcShowDays findOneByDbFirstShow(string $first_show) Return the first CcShowDays filtered by the first_show column - * @method CcShowDays findOneByDbLastShow(string $last_show) Return the first CcShowDays filtered by the last_show column - * @method CcShowDays findOneByDbStartTime(string $start_time) Return the first CcShowDays filtered by the start_time column - * @method CcShowDays findOneByDbTimezone(string $timezone) Return the first CcShowDays filtered by the timezone column - * @method CcShowDays findOneByDbDuration(string $duration) Return the first CcShowDays filtered by the duration column - * @method CcShowDays findOneByDbDay(int $day) Return the first CcShowDays filtered by the day column - * @method CcShowDays findOneByDbRepeatType(int $repeat_type) Return the first CcShowDays filtered by the repeat_type column - * @method CcShowDays findOneByDbNextPopDate(string $next_pop_date) Return the first CcShowDays filtered by the next_pop_date column - * @method CcShowDays findOneByDbShowId(int $show_id) Return the first CcShowDays filtered by the show_id column - * @method CcShowDays findOneByDbRecord(int $record) Return the first CcShowDays filtered by the record column + * @method CcShowDays findOne(PropelPDO $con = null) Return the first CcShowDays matching the query + * @method CcShowDays findOneOrCreate(PropelPDO $con = null) Return the first CcShowDays matching the query, or a new CcShowDays object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcShowDays objects filtered by the id column - * @method array findByDbFirstShow(string $first_show) Return CcShowDays objects filtered by the first_show column - * @method array findByDbLastShow(string $last_show) Return CcShowDays objects filtered by the last_show column - * @method array findByDbStartTime(string $start_time) Return CcShowDays objects filtered by the start_time column - * @method array findByDbTimezone(string $timezone) Return CcShowDays objects filtered by the timezone column - * @method array findByDbDuration(string $duration) Return CcShowDays objects filtered by the duration column - * @method array findByDbDay(int $day) Return CcShowDays objects filtered by the day column - * @method array findByDbRepeatType(int $repeat_type) Return CcShowDays objects filtered by the repeat_type column - * @method array findByDbNextPopDate(string $next_pop_date) Return CcShowDays objects filtered by the next_pop_date column - * @method array findByDbShowId(int $show_id) Return CcShowDays objects filtered by the show_id column - * @method array findByDbRecord(int $record) Return CcShowDays objects filtered by the record column + * @method CcShowDays findOneByDbFirstShow(string $first_show) Return the first CcShowDays filtered by the first_show column + * @method CcShowDays findOneByDbLastShow(string $last_show) Return the first CcShowDays filtered by the last_show column + * @method CcShowDays findOneByDbStartTime(string $start_time) Return the first CcShowDays filtered by the start_time column + * @method CcShowDays findOneByDbTimezone(string $timezone) Return the first CcShowDays filtered by the timezone column + * @method CcShowDays findOneByDbDuration(string $duration) Return the first CcShowDays filtered by the duration column + * @method CcShowDays findOneByDbDay(int $day) Return the first CcShowDays filtered by the day column + * @method CcShowDays findOneByDbRepeatType(int $repeat_type) Return the first CcShowDays filtered by the repeat_type column + * @method CcShowDays findOneByDbNextPopDate(string $next_pop_date) Return the first CcShowDays filtered by the next_pop_date column + * @method CcShowDays findOneByDbShowId(int $show_id) Return the first CcShowDays filtered by the show_id column + * @method CcShowDays findOneByDbRecord(int $record) Return the first CcShowDays filtered by the record column + * + * @method array findByDbId(int $id) Return CcShowDays objects filtered by the id column + * @method array findByDbFirstShow(string $first_show) Return CcShowDays objects filtered by the first_show column + * @method array findByDbLastShow(string $last_show) Return CcShowDays objects filtered by the last_show column + * @method array findByDbStartTime(string $start_time) Return CcShowDays objects filtered by the start_time column + * @method array findByDbTimezone(string $timezone) Return CcShowDays objects filtered by the timezone column + * @method array findByDbDuration(string $duration) Return CcShowDays objects filtered by the duration column + * @method array findByDbDay(int $day) Return CcShowDays objects filtered by the day column + * @method array findByDbRepeatType(int $repeat_type) Return CcShowDays objects filtered by the repeat_type column + * @method array findByDbNextPopDate(string $next_pop_date) Return CcShowDays objects filtered by the next_pop_date column + * @method array findByDbShowId(int $show_id) Return CcShowDays objects filtered by the show_id column + * @method array findByDbRecord(int $record) Return CcShowDays objects filtered by the record column * * @package propel.generator.airtime.om */ abstract class BaseCcShowDaysQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcShowDaysQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcShowDays'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcShowDaysQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcShowDaysQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcShowDaysQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcShowDaysQuery) { + return $criteria; + } + $query = new CcShowDaysQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcShowDays|CcShowDays[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcShowDaysPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcShowDaysPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShowDays A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShowDays A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "first_show", "last_show", "start_time", "timezone", "duration", "day", "repeat_type", "next_pop_date", "show_id", "record" FROM "cc_show_days" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcShowDays(); + $obj->hydrate($row); + CcShowDaysPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShowDays|CcShowDays[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcShowDays[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcShowDaysPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcShowDaysPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcShowDaysPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcShowDaysPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowDaysPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the first_show column + * + * Example usage: + * + * $query->filterByDbFirstShow('2011-03-14'); // WHERE first_show = '2011-03-14' + * $query->filterByDbFirstShow('now'); // WHERE first_show = '2011-03-14' + * $query->filterByDbFirstShow(array('max' => 'yesterday')); // WHERE first_show < '2011-03-13' + * + * + * @param mixed $dbFirstShow The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function filterByDbFirstShow($dbFirstShow = null, $comparison = null) + { + if (is_array($dbFirstShow)) { + $useMinMax = false; + if (isset($dbFirstShow['min'])) { + $this->addUsingAlias(CcShowDaysPeer::FIRST_SHOW, $dbFirstShow['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbFirstShow['max'])) { + $this->addUsingAlias(CcShowDaysPeer::FIRST_SHOW, $dbFirstShow['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowDaysPeer::FIRST_SHOW, $dbFirstShow, $comparison); + } + + /** + * Filter the query on the last_show column + * + * Example usage: + * + * $query->filterByDbLastShow('2011-03-14'); // WHERE last_show = '2011-03-14' + * $query->filterByDbLastShow('now'); // WHERE last_show = '2011-03-14' + * $query->filterByDbLastShow(array('max' => 'yesterday')); // WHERE last_show < '2011-03-13' + * + * + * @param mixed $dbLastShow The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function filterByDbLastShow($dbLastShow = null, $comparison = null) + { + if (is_array($dbLastShow)) { + $useMinMax = false; + if (isset($dbLastShow['min'])) { + $this->addUsingAlias(CcShowDaysPeer::LAST_SHOW, $dbLastShow['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbLastShow['max'])) { + $this->addUsingAlias(CcShowDaysPeer::LAST_SHOW, $dbLastShow['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowDaysPeer::LAST_SHOW, $dbLastShow, $comparison); + } + + /** + * Filter the query on the start_time column + * + * Example usage: + * + * $query->filterByDbStartTime('2011-03-14'); // WHERE start_time = '2011-03-14' + * $query->filterByDbStartTime('now'); // WHERE start_time = '2011-03-14' + * $query->filterByDbStartTime(array('max' => 'yesterday')); // WHERE start_time < '2011-03-13' + * + * + * @param mixed $dbStartTime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function filterByDbStartTime($dbStartTime = null, $comparison = null) + { + if (is_array($dbStartTime)) { + $useMinMax = false; + if (isset($dbStartTime['min'])) { + $this->addUsingAlias(CcShowDaysPeer::START_TIME, $dbStartTime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbStartTime['max'])) { + $this->addUsingAlias(CcShowDaysPeer::START_TIME, $dbStartTime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowDaysPeer::START_TIME, $dbStartTime, $comparison); + } + + /** + * Filter the query on the timezone column + * + * Example usage: + * + * $query->filterByDbTimezone('fooValue'); // WHERE timezone = 'fooValue' + * $query->filterByDbTimezone('%fooValue%'); // WHERE timezone LIKE '%fooValue%' + * + * + * @param string $dbTimezone The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function filterByDbTimezone($dbTimezone = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbTimezone)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbTimezone)) { + $dbTimezone = str_replace('*', '%', $dbTimezone); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcShowDaysPeer::TIMEZONE, $dbTimezone, $comparison); + } + + /** + * Filter the query on the duration column + * + * Example usage: + * + * $query->filterByDbDuration('fooValue'); // WHERE duration = 'fooValue' + * $query->filterByDbDuration('%fooValue%'); // WHERE duration LIKE '%fooValue%' + * + * + * @param string $dbDuration The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function filterByDbDuration($dbDuration = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbDuration)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbDuration)) { + $dbDuration = str_replace('*', '%', $dbDuration); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcShowDaysPeer::DURATION, $dbDuration, $comparison); + } + + /** + * Filter the query on the day column + * + * Example usage: + * + * $query->filterByDbDay(1234); // WHERE day = 1234 + * $query->filterByDbDay(array(12, 34)); // WHERE day IN (12, 34) + * $query->filterByDbDay(array('min' => 12)); // WHERE day >= 12 + * $query->filterByDbDay(array('max' => 12)); // WHERE day <= 12 + * + * + * @param mixed $dbDay The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function filterByDbDay($dbDay = null, $comparison = null) + { + if (is_array($dbDay)) { + $useMinMax = false; + if (isset($dbDay['min'])) { + $this->addUsingAlias(CcShowDaysPeer::DAY, $dbDay['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbDay['max'])) { + $this->addUsingAlias(CcShowDaysPeer::DAY, $dbDay['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowDaysPeer::DAY, $dbDay, $comparison); + } + + /** + * Filter the query on the repeat_type column + * + * Example usage: + * + * $query->filterByDbRepeatType(1234); // WHERE repeat_type = 1234 + * $query->filterByDbRepeatType(array(12, 34)); // WHERE repeat_type IN (12, 34) + * $query->filterByDbRepeatType(array('min' => 12)); // WHERE repeat_type >= 12 + * $query->filterByDbRepeatType(array('max' => 12)); // WHERE repeat_type <= 12 + * + * + * @param mixed $dbRepeatType The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function filterByDbRepeatType($dbRepeatType = null, $comparison = null) + { + if (is_array($dbRepeatType)) { + $useMinMax = false; + if (isset($dbRepeatType['min'])) { + $this->addUsingAlias(CcShowDaysPeer::REPEAT_TYPE, $dbRepeatType['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbRepeatType['max'])) { + $this->addUsingAlias(CcShowDaysPeer::REPEAT_TYPE, $dbRepeatType['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowDaysPeer::REPEAT_TYPE, $dbRepeatType, $comparison); + } + + /** + * Filter the query on the next_pop_date column + * + * Example usage: + * + * $query->filterByDbNextPopDate('2011-03-14'); // WHERE next_pop_date = '2011-03-14' + * $query->filterByDbNextPopDate('now'); // WHERE next_pop_date = '2011-03-14' + * $query->filterByDbNextPopDate(array('max' => 'yesterday')); // WHERE next_pop_date < '2011-03-13' + * + * + * @param mixed $dbNextPopDate The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function filterByDbNextPopDate($dbNextPopDate = null, $comparison = null) + { + if (is_array($dbNextPopDate)) { + $useMinMax = false; + if (isset($dbNextPopDate['min'])) { + $this->addUsingAlias(CcShowDaysPeer::NEXT_POP_DATE, $dbNextPopDate['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbNextPopDate['max'])) { + $this->addUsingAlias(CcShowDaysPeer::NEXT_POP_DATE, $dbNextPopDate['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowDaysPeer::NEXT_POP_DATE, $dbNextPopDate, $comparison); + } + + /** + * Filter the query on the show_id column + * + * Example usage: + * + * $query->filterByDbShowId(1234); // WHERE show_id = 1234 + * $query->filterByDbShowId(array(12, 34)); // WHERE show_id IN (12, 34) + * $query->filterByDbShowId(array('min' => 12)); // WHERE show_id >= 12 + * $query->filterByDbShowId(array('max' => 12)); // WHERE show_id <= 12 + * + * + * @see filterByCcShow() + * + * @param mixed $dbShowId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function filterByDbShowId($dbShowId = null, $comparison = null) + { + if (is_array($dbShowId)) { + $useMinMax = false; + if (isset($dbShowId['min'])) { + $this->addUsingAlias(CcShowDaysPeer::SHOW_ID, $dbShowId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbShowId['max'])) { + $this->addUsingAlias(CcShowDaysPeer::SHOW_ID, $dbShowId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowDaysPeer::SHOW_ID, $dbShowId, $comparison); + } + + /** + * Filter the query on the record column + * + * Example usage: + * + * $query->filterByDbRecord(1234); // WHERE record = 1234 + * $query->filterByDbRecord(array(12, 34)); // WHERE record IN (12, 34) + * $query->filterByDbRecord(array('min' => 12)); // WHERE record >= 12 + * $query->filterByDbRecord(array('max' => 12)); // WHERE record <= 12 + * + * + * @param mixed $dbRecord The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function filterByDbRecord($dbRecord = null, $comparison = null) + { + if (is_array($dbRecord)) { + $useMinMax = false; + if (isset($dbRecord['min'])) { + $this->addUsingAlias(CcShowDaysPeer::RECORD, $dbRecord['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbRecord['max'])) { + $this->addUsingAlias(CcShowDaysPeer::RECORD, $dbRecord['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowDaysPeer::RECORD, $dbRecord, $comparison); + } + + /** + * Filter the query by a related CcShow object + * + * @param CcShow|PropelObjectCollection $ccShow The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowDaysQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShow($ccShow, $comparison = null) + { + if ($ccShow instanceof CcShow) { + return $this + ->addUsingAlias(CcShowDaysPeer::SHOW_ID, $ccShow->getDbId(), $comparison); + } elseif ($ccShow instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcShowDaysPeer::SHOW_ID, $ccShow->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcShow() only accepts arguments of type CcShow or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShow relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function joinCcShow($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShow'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShow'); + } + + return $this; + } + + /** + * Use the CcShow relation CcShow object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowQuery A secondary query class using the current class as primary query + */ + public function useCcShowQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcShow($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShow', 'CcShowQuery'); + } + + /** + * Exclude object from result + * + * @param CcShowDays $ccShowDays Object to remove from the list of results + * + * @return CcShowDaysQuery The current query, for fluid interface + */ + public function prune($ccShowDays = null) + { + if ($ccShowDays) { + $this->addUsingAlias(CcShowDaysPeer::ID, $ccShowDays->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcShowDaysQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcShowDays', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcShowDaysQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcShowDaysQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcShowDaysQuery) { - return $criteria; - } - $query = new CcShowDaysQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcShowDays|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcShowDaysPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcShowDaysPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcShowDaysPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcShowDaysPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the first_show column - * - * @param string|array $dbFirstShow The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByDbFirstShow($dbFirstShow = null, $comparison = null) - { - if (is_array($dbFirstShow)) { - $useMinMax = false; - if (isset($dbFirstShow['min'])) { - $this->addUsingAlias(CcShowDaysPeer::FIRST_SHOW, $dbFirstShow['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbFirstShow['max'])) { - $this->addUsingAlias(CcShowDaysPeer::FIRST_SHOW, $dbFirstShow['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowDaysPeer::FIRST_SHOW, $dbFirstShow, $comparison); - } - - /** - * Filter the query on the last_show column - * - * @param string|array $dbLastShow The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByDbLastShow($dbLastShow = null, $comparison = null) - { - if (is_array($dbLastShow)) { - $useMinMax = false; - if (isset($dbLastShow['min'])) { - $this->addUsingAlias(CcShowDaysPeer::LAST_SHOW, $dbLastShow['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbLastShow['max'])) { - $this->addUsingAlias(CcShowDaysPeer::LAST_SHOW, $dbLastShow['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowDaysPeer::LAST_SHOW, $dbLastShow, $comparison); - } - - /** - * Filter the query on the start_time column - * - * @param string|array $dbStartTime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByDbStartTime($dbStartTime = null, $comparison = null) - { - if (is_array($dbStartTime)) { - $useMinMax = false; - if (isset($dbStartTime['min'])) { - $this->addUsingAlias(CcShowDaysPeer::START_TIME, $dbStartTime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbStartTime['max'])) { - $this->addUsingAlias(CcShowDaysPeer::START_TIME, $dbStartTime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowDaysPeer::START_TIME, $dbStartTime, $comparison); - } - - /** - * Filter the query on the timezone column - * - * @param string $dbTimezone The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByDbTimezone($dbTimezone = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbTimezone)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbTimezone)) { - $dbTimezone = str_replace('*', '%', $dbTimezone); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcShowDaysPeer::TIMEZONE, $dbTimezone, $comparison); - } - - /** - * Filter the query on the duration column - * - * @param string $dbDuration The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByDbDuration($dbDuration = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbDuration)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbDuration)) { - $dbDuration = str_replace('*', '%', $dbDuration); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcShowDaysPeer::DURATION, $dbDuration, $comparison); - } - - /** - * Filter the query on the day column - * - * @param int|array $dbDay The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByDbDay($dbDay = null, $comparison = null) - { - if (is_array($dbDay)) { - $useMinMax = false; - if (isset($dbDay['min'])) { - $this->addUsingAlias(CcShowDaysPeer::DAY, $dbDay['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbDay['max'])) { - $this->addUsingAlias(CcShowDaysPeer::DAY, $dbDay['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowDaysPeer::DAY, $dbDay, $comparison); - } - - /** - * Filter the query on the repeat_type column - * - * @param int|array $dbRepeatType The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByDbRepeatType($dbRepeatType = null, $comparison = null) - { - if (is_array($dbRepeatType)) { - $useMinMax = false; - if (isset($dbRepeatType['min'])) { - $this->addUsingAlias(CcShowDaysPeer::REPEAT_TYPE, $dbRepeatType['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbRepeatType['max'])) { - $this->addUsingAlias(CcShowDaysPeer::REPEAT_TYPE, $dbRepeatType['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowDaysPeer::REPEAT_TYPE, $dbRepeatType, $comparison); - } - - /** - * Filter the query on the next_pop_date column - * - * @param string|array $dbNextPopDate The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByDbNextPopDate($dbNextPopDate = null, $comparison = null) - { - if (is_array($dbNextPopDate)) { - $useMinMax = false; - if (isset($dbNextPopDate['min'])) { - $this->addUsingAlias(CcShowDaysPeer::NEXT_POP_DATE, $dbNextPopDate['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbNextPopDate['max'])) { - $this->addUsingAlias(CcShowDaysPeer::NEXT_POP_DATE, $dbNextPopDate['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowDaysPeer::NEXT_POP_DATE, $dbNextPopDate, $comparison); - } - - /** - * Filter the query on the show_id column - * - * @param int|array $dbShowId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByDbShowId($dbShowId = null, $comparison = null) - { - if (is_array($dbShowId)) { - $useMinMax = false; - if (isset($dbShowId['min'])) { - $this->addUsingAlias(CcShowDaysPeer::SHOW_ID, $dbShowId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbShowId['max'])) { - $this->addUsingAlias(CcShowDaysPeer::SHOW_ID, $dbShowId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowDaysPeer::SHOW_ID, $dbShowId, $comparison); - } - - /** - * Filter the query on the record column - * - * @param int|array $dbRecord The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByDbRecord($dbRecord = null, $comparison = null) - { - if (is_array($dbRecord)) { - $useMinMax = false; - if (isset($dbRecord['min'])) { - $this->addUsingAlias(CcShowDaysPeer::RECORD, $dbRecord['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbRecord['max'])) { - $this->addUsingAlias(CcShowDaysPeer::RECORD, $dbRecord['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowDaysPeer::RECORD, $dbRecord, $comparison); - } - - /** - * Filter the query by a related CcShow object - * - * @param CcShow $ccShow the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function filterByCcShow($ccShow, $comparison = null) - { - return $this - ->addUsingAlias(CcShowDaysPeer::SHOW_ID, $ccShow->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShow relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function joinCcShow($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShow'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShow'); - } - - return $this; - } - - /** - * Use the CcShow relation CcShow object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowQuery A secondary query class using the current class as primary query - */ - public function useCcShowQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcShow($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShow', 'CcShowQuery'); - } - - /** - * Exclude object from result - * - * @param CcShowDays $ccShowDays Object to remove from the list of results - * - * @return CcShowDaysQuery The current query, for fluid interface - */ - public function prune($ccShowDays = null) - { - if ($ccShowDays) { - $this->addUsingAlias(CcShowDaysPeer::ID, $ccShowDays->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcShowDaysQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowHosts.php b/airtime_mvc/application/models/airtime/om/BaseCcShowHosts.php index ca4d11449f..6b6e5eb231 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowHosts.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowHosts.php @@ -4,933 +4,1077 @@ /** * Base class that represents a row from the 'cc_show_hosts' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcShowHosts extends BaseObject implements Persistent +abstract class BaseCcShowHosts extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcShowHostsPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcShowHostsPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the show_id field. - * @var int - */ - protected $show_id; - - /** - * The value for the subjs_id field. - * @var int - */ - protected $subjs_id; - - /** - * @var CcShow - */ - protected $aCcShow; - - /** - * @var CcSubjs - */ - protected $aCcSubjs; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [show_id] column value. - * - * @return int - */ - public function getDbShow() - { - return $this->show_id; - } - - /** - * Get the [subjs_id] column value. - * - * @return int - */ - public function getDbHost() - { - return $this->subjs_id; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcShowHosts The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcShowHostsPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [show_id] column. - * - * @param int $v new value - * @return CcShowHosts The current object (for fluent API support) - */ - public function setDbShow($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->show_id !== $v) { - $this->show_id = $v; - $this->modifiedColumns[] = CcShowHostsPeer::SHOW_ID; - } - - if ($this->aCcShow !== null && $this->aCcShow->getDbId() !== $v) { - $this->aCcShow = null; - } - - return $this; - } // setDbShow() - - /** - * Set the value of [subjs_id] column. - * - * @param int $v new value - * @return CcShowHosts The current object (for fluent API support) - */ - public function setDbHost($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->subjs_id !== $v) { - $this->subjs_id = $v; - $this->modifiedColumns[] = CcShowHostsPeer::SUBJS_ID; - } - - if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { - $this->aCcSubjs = null; - } - - return $this; - } // setDbHost() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->show_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->subjs_id = ($row[$startcol + 2] !== null) ? (int) $row[$startcol + 2] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 3; // 3 = CcShowHostsPeer::NUM_COLUMNS - CcShowHostsPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcShowHosts object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcShow !== null && $this->show_id !== $this->aCcShow->getDbId()) { - $this->aCcShow = null; - } - if ($this->aCcSubjs !== null && $this->subjs_id !== $this->aCcSubjs->getDbId()) { - $this->aCcSubjs = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcShowHostsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcShow = null; - $this->aCcSubjs = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcShowHostsQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcShowHostsPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcShow !== null) { - if ($this->aCcShow->isModified() || $this->aCcShow->isNew()) { - $affectedRows += $this->aCcShow->save($con); - } - $this->setCcShow($this->aCcShow); - } - - if ($this->aCcSubjs !== null) { - if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { - $affectedRows += $this->aCcSubjs->save($con); - } - $this->setCcSubjs($this->aCcSubjs); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcShowHostsPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcShowHostsPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowHostsPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcShowHostsPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcShow !== null) { - if (!$this->aCcShow->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcShow->getValidationFailures()); - } - } - - if ($this->aCcSubjs !== null) { - if (!$this->aCcSubjs->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); - } - } - - - if (($retval = CcShowHostsPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcShowHostsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbShow(); - break; - case 2: - return $this->getDbHost(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcShowHostsPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbShow(), - $keys[2] => $this->getDbHost(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcShow) { - $result['CcShow'] = $this->aCcShow->toArray($keyType, $includeLazyLoadColumns, true); - } - if (null !== $this->aCcSubjs) { - $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcShowHostsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbShow($value); - break; - case 2: - $this->setDbHost($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcShowHostsPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbShow($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbHost($arr[$keys[2]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcShowHostsPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcShowHostsPeer::ID)) $criteria->add(CcShowHostsPeer::ID, $this->id); - if ($this->isColumnModified(CcShowHostsPeer::SHOW_ID)) $criteria->add(CcShowHostsPeer::SHOW_ID, $this->show_id); - if ($this->isColumnModified(CcShowHostsPeer::SUBJS_ID)) $criteria->add(CcShowHostsPeer::SUBJS_ID, $this->subjs_id); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcShowHostsPeer::DATABASE_NAME); - $criteria->add(CcShowHostsPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcShowHosts (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbShow($this->show_id); - $copyObj->setDbHost($this->subjs_id); - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcShowHosts Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcShowHostsPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcShowHostsPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcShow object. - * - * @param CcShow $v - * @return CcShowHosts The current object (for fluent API support) - * @throws PropelException - */ - public function setCcShow(CcShow $v = null) - { - if ($v === null) { - $this->setDbShow(NULL); - } else { - $this->setDbShow($v->getDbId()); - } - - $this->aCcShow = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcShow object, it will not be re-added. - if ($v !== null) { - $v->addCcShowHosts($this); - } - - return $this; - } - - - /** - * Get the associated CcShow object - * - * @param PropelPDO Optional Connection object. - * @return CcShow The associated CcShow object. - * @throws PropelException - */ - public function getCcShow(PropelPDO $con = null) - { - if ($this->aCcShow === null && ($this->show_id !== null)) { - $this->aCcShow = CcShowQuery::create()->findPk($this->show_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcShow->addCcShowHostss($this); - */ - } - return $this->aCcShow; - } - - /** - * Declares an association between this object and a CcSubjs object. - * - * @param CcSubjs $v - * @return CcShowHosts The current object (for fluent API support) - * @throws PropelException - */ - public function setCcSubjs(CcSubjs $v = null) - { - if ($v === null) { - $this->setDbHost(NULL); - } else { - $this->setDbHost($v->getDbId()); - } - - $this->aCcSubjs = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcSubjs object, it will not be re-added. - if ($v !== null) { - $v->addCcShowHosts($this); - } - - return $this; - } - - - /** - * Get the associated CcSubjs object - * - * @param PropelPDO Optional Connection object. - * @return CcSubjs The associated CcSubjs object. - * @throws PropelException - */ - public function getCcSubjs(PropelPDO $con = null) - { - if ($this->aCcSubjs === null && ($this->subjs_id !== null)) { - $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->subjs_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcSubjs->addCcShowHostss($this); - */ - } - return $this->aCcSubjs; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->show_id = null; - $this->subjs_id = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcShow = null; - $this->aCcSubjs = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcShowHosts + /** + * Peer class name + */ + const PEER = 'CcShowHostsPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcShowHostsPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the show_id field. + * @var int + */ + protected $show_id; + + /** + * The value for the subjs_id field. + * @var int + */ + protected $subjs_id; + + /** + * @var CcShow + */ + protected $aCcShow; + + /** + * @var CcSubjs + */ + protected $aCcSubjs; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [show_id] column value. + * + * @return int + */ + public function getDbShow() + { + + return $this->show_id; + } + + /** + * Get the [subjs_id] column value. + * + * @return int + */ + public function getDbHost() + { + + return $this->subjs_id; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcShowHosts The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcShowHostsPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [show_id] column. + * + * @param int $v new value + * @return CcShowHosts The current object (for fluent API support) + */ + public function setDbShow($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->show_id !== $v) { + $this->show_id = $v; + $this->modifiedColumns[] = CcShowHostsPeer::SHOW_ID; + } + + if ($this->aCcShow !== null && $this->aCcShow->getDbId() !== $v) { + $this->aCcShow = null; + } + + + return $this; + } // setDbShow() + + /** + * Set the value of [subjs_id] column. + * + * @param int $v new value + * @return CcShowHosts The current object (for fluent API support) + */ + public function setDbHost($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->subjs_id !== $v) { + $this->subjs_id = $v; + $this->modifiedColumns[] = CcShowHostsPeer::SUBJS_ID; + } + + if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { + $this->aCcSubjs = null; + } + + + return $this; + } // setDbHost() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->show_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->subjs_id = ($row[$startcol + 2] !== null) ? (int) $row[$startcol + 2] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 3; // 3 = CcShowHostsPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcShowHosts object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcShow !== null && $this->show_id !== $this->aCcShow->getDbId()) { + $this->aCcShow = null; + } + if ($this->aCcSubjs !== null && $this->subjs_id !== $this->aCcSubjs->getDbId()) { + $this->aCcSubjs = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcShowHostsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcShow = null; + $this->aCcSubjs = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcShowHostsQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcShowHostsPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcShow !== null) { + if ($this->aCcShow->isModified() || $this->aCcShow->isNew()) { + $affectedRows += $this->aCcShow->save($con); + } + $this->setCcShow($this->aCcShow); + } + + if ($this->aCcSubjs !== null) { + if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { + $affectedRows += $this->aCcSubjs->save($con); + } + $this->setCcSubjs($this->aCcSubjs); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcShowHostsPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcShowHostsPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_show_hosts_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcShowHostsPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcShowHostsPeer::SHOW_ID)) { + $modifiedColumns[':p' . $index++] = '"show_id"'; + } + if ($this->isColumnModified(CcShowHostsPeer::SUBJS_ID)) { + $modifiedColumns[':p' . $index++] = '"subjs_id"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_show_hosts" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"show_id"': + $stmt->bindValue($identifier, $this->show_id, PDO::PARAM_INT); + break; + case '"subjs_id"': + $stmt->bindValue($identifier, $this->subjs_id, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcShow !== null) { + if (!$this->aCcShow->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcShow->getValidationFailures()); + } + } + + if ($this->aCcSubjs !== null) { + if (!$this->aCcSubjs->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); + } + } + + + if (($retval = CcShowHostsPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcShowHostsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbShow(); + break; + case 2: + return $this->getDbHost(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcShowHosts'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcShowHosts'][$this->getPrimaryKey()] = true; + $keys = CcShowHostsPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbShow(), + $keys[2] => $this->getDbHost(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcShow) { + $result['CcShow'] = $this->aCcShow->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->aCcSubjs) { + $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcShowHostsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbShow($value); + break; + case 2: + $this->setDbHost($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcShowHostsPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbShow($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbHost($arr[$keys[2]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcShowHostsPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcShowHostsPeer::ID)) $criteria->add(CcShowHostsPeer::ID, $this->id); + if ($this->isColumnModified(CcShowHostsPeer::SHOW_ID)) $criteria->add(CcShowHostsPeer::SHOW_ID, $this->show_id); + if ($this->isColumnModified(CcShowHostsPeer::SUBJS_ID)) $criteria->add(CcShowHostsPeer::SUBJS_ID, $this->subjs_id); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcShowHostsPeer::DATABASE_NAME); + $criteria->add(CcShowHostsPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcShowHosts (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbShow($this->getDbShow()); + $copyObj->setDbHost($this->getDbHost()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcShowHosts Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcShowHostsPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcShowHostsPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcShow object. + * + * @param CcShow $v + * @return CcShowHosts The current object (for fluent API support) + * @throws PropelException + */ + public function setCcShow(CcShow $v = null) + { + if ($v === null) { + $this->setDbShow(NULL); + } else { + $this->setDbShow($v->getDbId()); + } + + $this->aCcShow = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcShow object, it will not be re-added. + if ($v !== null) { + $v->addCcShowHosts($this); + } + + + return $this; + } + + + /** + * Get the associated CcShow object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcShow The associated CcShow object. + * @throws PropelException + */ + public function getCcShow(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcShow === null && ($this->show_id !== null) && $doQuery) { + $this->aCcShow = CcShowQuery::create()->findPk($this->show_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcShow->addCcShowHostss($this); + */ + } + + return $this->aCcShow; + } + + /** + * Declares an association between this object and a CcSubjs object. + * + * @param CcSubjs $v + * @return CcShowHosts The current object (for fluent API support) + * @throws PropelException + */ + public function setCcSubjs(CcSubjs $v = null) + { + if ($v === null) { + $this->setDbHost(NULL); + } else { + $this->setDbHost($v->getDbId()); + } + + $this->aCcSubjs = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcSubjs object, it will not be re-added. + if ($v !== null) { + $v->addCcShowHosts($this); + } + + + return $this; + } + + + /** + * Get the associated CcSubjs object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcSubjs The associated CcSubjs object. + * @throws PropelException + */ + public function getCcSubjs(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcSubjs === null && ($this->subjs_id !== null) && $doQuery) { + $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->subjs_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcSubjs->addCcShowHostss($this); + */ + } + + return $this->aCcSubjs; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->show_id = null; + $this->subjs_id = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcShow instanceof Persistent) { + $this->aCcShow->clearAllReferences($deep); + } + if ($this->aCcSubjs instanceof Persistent) { + $this->aCcSubjs->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcShow = null; + $this->aCcSubjs = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcShowHostsPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowHostsPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcShowHostsPeer.php index 33a82f0d96..c21c3e985d 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowHostsPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowHostsPeer.php @@ -4,1358 +4,1390 @@ /** * Base static class for performing query and update operations on the 'cc_show_hosts' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcShowHostsPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_show_hosts'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcShowHosts'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcShowHosts'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcShowHostsTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 3; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_show_hosts.ID'; - - /** the column name for the SHOW_ID field */ - const SHOW_ID = 'cc_show_hosts.SHOW_ID'; - - /** the column name for the SUBJS_ID field */ - const SUBJS_ID = 'cc_show_hosts.SUBJS_ID'; - - /** - * An identiy map to hold any loaded instances of CcShowHosts objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcShowHosts[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbShow', 'DbHost', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbShow', 'dbHost', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::SHOW_ID, self::SUBJS_ID, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'SHOW_ID', 'SUBJS_ID', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'show_id', 'subjs_id', ), - BasePeer::TYPE_NUM => array (0, 1, 2, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbShow' => 1, 'DbHost' => 2, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbShow' => 1, 'dbHost' => 2, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::SHOW_ID => 1, self::SUBJS_ID => 2, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'SHOW_ID' => 1, 'SUBJS_ID' => 2, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'show_id' => 1, 'subjs_id' => 2, ), - BasePeer::TYPE_NUM => array (0, 1, 2, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcShowHostsPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcShowHostsPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcShowHostsPeer::ID); - $criteria->addSelectColumn(CcShowHostsPeer::SHOW_ID); - $criteria->addSelectColumn(CcShowHostsPeer::SUBJS_ID); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.SHOW_ID'); - $criteria->addSelectColumn($alias . '.SUBJS_ID'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowHostsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcShowHosts - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcShowHostsPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcShowHostsPeer::populateObjects(CcShowHostsPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcShowHostsPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcShowHosts $value A CcShowHosts object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcShowHosts $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcShowHosts object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcShowHosts) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcShowHosts object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcShowHosts Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_show_hosts - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcShowHostsPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcShowHostsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcShowHostsPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcShowHosts object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcShowHostsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcShowHostsPeer::NUM_COLUMNS; - } else { - $cls = CcShowHostsPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcShowHostsPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcShow table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowHostsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowHostsPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcSubjs table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowHostsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowHostsPeer::SUBJS_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcShowHosts objects pre-filled with their CcShow objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowHosts objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowHostsPeer::addSelectColumns($criteria); - $startcol = (CcShowHostsPeer::NUM_COLUMNS - CcShowHostsPeer::NUM_LAZY_LOAD_COLUMNS); - CcShowPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcShowHostsPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowHostsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcShowHostsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowHostsPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcShowPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcShowPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcShowHosts) to $obj2 (CcShow) - $obj2->addCcShowHosts($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcShowHosts objects pre-filled with their CcSubjs objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowHosts objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowHostsPeer::addSelectColumns($criteria); - $startcol = (CcShowHostsPeer::NUM_COLUMNS - CcShowHostsPeer::NUM_LAZY_LOAD_COLUMNS); - CcSubjsPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcShowHostsPeer::SUBJS_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowHostsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcShowHostsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowHostsPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcShowHosts) to $obj2 (CcSubjs) - $obj2->addCcShowHosts($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowHostsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowHostsPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $criteria->addJoin(CcShowHostsPeer::SUBJS_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcShowHosts objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowHosts objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowHostsPeer::addSelectColumns($criteria); - $startcol2 = (CcShowHostsPeer::NUM_COLUMNS - CcShowHostsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcShowPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcShowPeer::NUM_COLUMNS - CcShowPeer::NUM_LAZY_LOAD_COLUMNS); - - CcSubjsPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcSubjsPeer::NUM_COLUMNS - CcSubjsPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcShowHostsPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $criteria->addJoin(CcShowHostsPeer::SUBJS_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowHostsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcShowHostsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowHostsPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcShow rows - - $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcShowPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcShowPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcShowHosts) to the collection in $obj2 (CcShow) - $obj2->addCcShowHosts($obj1); - } // if joined row not null - - // Add objects for joined CcSubjs rows - - $key3 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcSubjsPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcSubjsPeer::addInstanceToPool($obj3, $key3); - } // if obj3 loaded - - // Add the $obj1 (CcShowHosts) to the collection in $obj3 (CcSubjs) - $obj3->addCcShowHosts($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcShow table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowHostsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowHostsPeer::SUBJS_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcSubjs table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowHostsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowHostsPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcShowHosts objects pre-filled with all related objects except CcShow. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowHosts objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowHostsPeer::addSelectColumns($criteria); - $startcol2 = (CcShowHostsPeer::NUM_COLUMNS - CcShowHostsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcSubjsPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcSubjsPeer::NUM_COLUMNS - CcSubjsPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcShowHostsPeer::SUBJS_ID, CcSubjsPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowHostsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcShowHostsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowHostsPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcSubjs rows - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcShowHosts) to the collection in $obj2 (CcSubjs) - $obj2->addCcShowHosts($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcShowHosts objects pre-filled with all related objects except CcSubjs. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowHosts objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowHostsPeer::addSelectColumns($criteria); - $startcol2 = (CcShowHostsPeer::NUM_COLUMNS - CcShowHostsPeer::NUM_LAZY_LOAD_COLUMNS); - - CcShowPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcShowPeer::NUM_COLUMNS - CcShowPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcShowHostsPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowHostsPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcShowHostsPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowHostsPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcShow rows - - $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcShowPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcShowPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcShowHosts) to the collection in $obj2 (CcShow) - $obj2->addCcShowHosts($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcShowHostsPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcShowHostsPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcShowHostsTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcShowHostsPeer::CLASS_DEFAULT : CcShowHostsPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcShowHosts or Criteria object. - * - * @param mixed $values Criteria or CcShowHosts object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcShowHosts object - } - - if ($criteria->containsKey(CcShowHostsPeer::ID) && $criteria->keyContainsValue(CcShowHostsPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowHostsPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcShowHosts or Criteria object. - * - * @param mixed $values Criteria or CcShowHosts object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcShowHostsPeer::ID); - $value = $criteria->remove(CcShowHostsPeer::ID); - if ($value) { - $selectCriteria->add(CcShowHostsPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); - } - - } else { // $values is CcShowHosts object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_show_hosts table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcShowHostsPeer::TABLE_NAME, $con, CcShowHostsPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcShowHostsPeer::clearInstancePool(); - CcShowHostsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcShowHosts or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcShowHosts object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcShowHostsPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcShowHosts) { // it's a model object - // invalidate the cache for this single object - CcShowHostsPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcShowHostsPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcShowHostsPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcShowHostsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcShowHosts object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcShowHosts $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcShowHosts $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcShowHostsPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcShowHostsPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcShowHostsPeer::DATABASE_NAME, CcShowHostsPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcShowHosts - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcShowHostsPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcShowHostsPeer::DATABASE_NAME); - $criteria->add(CcShowHostsPeer::ID, $pk); - - $v = CcShowHostsPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcShowHostsPeer::DATABASE_NAME); - $criteria->add(CcShowHostsPeer::ID, $pks, Criteria::IN); - $objs = CcShowHostsPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcShowHostsPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_show_hosts'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcShowHosts'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcShowHostsTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 3; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 3; + + /** the column name for the id field */ + const ID = 'cc_show_hosts.id'; + + /** the column name for the show_id field */ + const SHOW_ID = 'cc_show_hosts.show_id'; + + /** the column name for the subjs_id field */ + const SUBJS_ID = 'cc_show_hosts.subjs_id'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcShowHosts objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcShowHosts[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcShowHostsPeer::$fieldNames[CcShowHostsPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbShow', 'DbHost', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbShow', 'dbHost', ), + BasePeer::TYPE_COLNAME => array (CcShowHostsPeer::ID, CcShowHostsPeer::SHOW_ID, CcShowHostsPeer::SUBJS_ID, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'SHOW_ID', 'SUBJS_ID', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'show_id', 'subjs_id', ), + BasePeer::TYPE_NUM => array (0, 1, 2, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcShowHostsPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbShow' => 1, 'DbHost' => 2, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbShow' => 1, 'dbHost' => 2, ), + BasePeer::TYPE_COLNAME => array (CcShowHostsPeer::ID => 0, CcShowHostsPeer::SHOW_ID => 1, CcShowHostsPeer::SUBJS_ID => 2, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'SHOW_ID' => 1, 'SUBJS_ID' => 2, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'show_id' => 1, 'subjs_id' => 2, ), + BasePeer::TYPE_NUM => array (0, 1, 2, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcShowHostsPeer::getFieldNames($toType); + $key = isset(CcShowHostsPeer::$fieldKeys[$fromType][$name]) ? CcShowHostsPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcShowHostsPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcShowHostsPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcShowHostsPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcShowHostsPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcShowHostsPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcShowHostsPeer::ID); + $criteria->addSelectColumn(CcShowHostsPeer::SHOW_ID); + $criteria->addSelectColumn(CcShowHostsPeer::SUBJS_ID); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.show_id'); + $criteria->addSelectColumn($alias . '.subjs_id'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowHostsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcShowHosts + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcShowHostsPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcShowHostsPeer::populateObjects(CcShowHostsPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcShowHostsPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcShowHosts $obj A CcShowHosts object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcShowHostsPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcShowHosts object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcShowHosts) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcShowHosts object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcShowHostsPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcShowHosts Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcShowHostsPeer::$instances[$key])) { + return CcShowHostsPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcShowHostsPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcShowHostsPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_show_hosts + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcShowHostsPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcShowHostsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcShowHostsPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcShowHosts object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcShowHostsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcShowHostsPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcShowHostsPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcShowHostsPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcShow table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowHostsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowHostsPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcSubjs table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowHostsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowHostsPeer::SUBJS_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcShowHosts objects pre-filled with their CcShow objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowHosts objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + } + + CcShowHostsPeer::addSelectColumns($criteria); + $startcol = CcShowHostsPeer::NUM_HYDRATE_COLUMNS; + CcShowPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcShowHostsPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowHostsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcShowHostsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowHostsPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcShowPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcShowPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcShowHosts) to $obj2 (CcShow) + $obj2->addCcShowHosts($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcShowHosts objects pre-filled with their CcSubjs objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowHosts objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + } + + CcShowHostsPeer::addSelectColumns($criteria); + $startcol = CcShowHostsPeer::NUM_HYDRATE_COLUMNS; + CcSubjsPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcShowHostsPeer::SUBJS_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowHostsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcShowHostsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowHostsPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcShowHosts) to $obj2 (CcSubjs) + $obj2->addCcShowHosts($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowHostsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowHostsPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $criteria->addJoin(CcShowHostsPeer::SUBJS_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcShowHosts objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowHosts objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + } + + CcShowHostsPeer::addSelectColumns($criteria); + $startcol2 = CcShowHostsPeer::NUM_HYDRATE_COLUMNS; + + CcShowPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcShowPeer::NUM_HYDRATE_COLUMNS; + + CcSubjsPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcSubjsPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcShowHostsPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $criteria->addJoin(CcShowHostsPeer::SUBJS_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowHostsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcShowHostsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowHostsPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcShow rows + + $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcShowPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcShowPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcShowHosts) to the collection in $obj2 (CcShow) + $obj2->addCcShowHosts($obj1); + } // if joined row not null + + // Add objects for joined CcSubjs rows + + $key3 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcSubjsPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcSubjsPeer::addInstanceToPool($obj3, $key3); + } // if obj3 loaded + + // Add the $obj1 (CcShowHosts) to the collection in $obj3 (CcSubjs) + $obj3->addCcShowHosts($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcShow table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowHostsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowHostsPeer::SUBJS_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcSubjs table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowHostsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowHostsPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcShowHosts objects pre-filled with all related objects except CcShow. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowHosts objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + } + + CcShowHostsPeer::addSelectColumns($criteria); + $startcol2 = CcShowHostsPeer::NUM_HYDRATE_COLUMNS; + + CcSubjsPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcSubjsPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcShowHostsPeer::SUBJS_ID, CcSubjsPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowHostsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcShowHostsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowHostsPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcSubjs rows + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcShowHosts) to the collection in $obj2 (CcSubjs) + $obj2->addCcShowHosts($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcShowHosts objects pre-filled with all related objects except CcSubjs. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowHosts objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + } + + CcShowHostsPeer::addSelectColumns($criteria); + $startcol2 = CcShowHostsPeer::NUM_HYDRATE_COLUMNS; + + CcShowPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcShowPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcShowHostsPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowHostsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowHostsPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcShowHostsPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowHostsPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcShow rows + + $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcShowPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcShowPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcShowHosts) to the collection in $obj2 (CcShow) + $obj2->addCcShowHosts($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcShowHostsPeer::DATABASE_NAME)->getTable(CcShowHostsPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcShowHostsPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcShowHostsPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcShowHostsTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcShowHostsPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcShowHosts or Criteria object. + * + * @param mixed $values Criteria or CcShowHosts object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcShowHosts object + } + + if ($criteria->containsKey(CcShowHostsPeer::ID) && $criteria->keyContainsValue(CcShowHostsPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowHostsPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcShowHosts or Criteria object. + * + * @param mixed $values Criteria or CcShowHosts object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcShowHostsPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcShowHostsPeer::ID); + $value = $criteria->remove(CcShowHostsPeer::ID); + if ($value) { + $selectCriteria->add(CcShowHostsPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcShowHostsPeer::TABLE_NAME); + } + + } else { // $values is CcShowHosts object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_show_hosts table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcShowHostsPeer::TABLE_NAME, $con, CcShowHostsPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcShowHostsPeer::clearInstancePool(); + CcShowHostsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcShowHosts or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcShowHosts object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcShowHostsPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcShowHosts) { // it's a model object + // invalidate the cache for this single object + CcShowHostsPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcShowHostsPeer::DATABASE_NAME); + $criteria->add(CcShowHostsPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcShowHostsPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcShowHostsPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcShowHostsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcShowHosts object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcShowHosts $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcShowHostsPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcShowHostsPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcShowHostsPeer::DATABASE_NAME, CcShowHostsPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcShowHosts + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcShowHostsPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcShowHostsPeer::DATABASE_NAME); + $criteria->add(CcShowHostsPeer::ID, $pk); + + $v = CcShowHostsPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcShowHosts[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcShowHostsPeer::DATABASE_NAME); + $criteria->add(CcShowHostsPeer::ID, $pks, Criteria::IN); + $objs = CcShowHostsPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcShowHostsPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowHostsQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcShowHostsQuery.php index 2b910a52bf..22410c852e 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowHostsQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowHostsQuery.php @@ -4,368 +4,529 @@ /** * Base class that represents a query for the 'cc_show_hosts' table. * - * * - * @method CcShowHostsQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcShowHostsQuery orderByDbShow($order = Criteria::ASC) Order by the show_id column - * @method CcShowHostsQuery orderByDbHost($order = Criteria::ASC) Order by the subjs_id column * - * @method CcShowHostsQuery groupByDbId() Group by the id column - * @method CcShowHostsQuery groupByDbShow() Group by the show_id column - * @method CcShowHostsQuery groupByDbHost() Group by the subjs_id column + * @method CcShowHostsQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcShowHostsQuery orderByDbShow($order = Criteria::ASC) Order by the show_id column + * @method CcShowHostsQuery orderByDbHost($order = Criteria::ASC) Order by the subjs_id column * - * @method CcShowHostsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcShowHostsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcShowHostsQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcShowHostsQuery groupByDbId() Group by the id column + * @method CcShowHostsQuery groupByDbShow() Group by the show_id column + * @method CcShowHostsQuery groupByDbHost() Group by the subjs_id column * - * @method CcShowHostsQuery leftJoinCcShow($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShow relation - * @method CcShowHostsQuery rightJoinCcShow($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShow relation - * @method CcShowHostsQuery innerJoinCcShow($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShow relation + * @method CcShowHostsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcShowHostsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcShowHostsQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcShowHostsQuery leftJoinCcSubjs($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSubjs relation - * @method CcShowHostsQuery rightJoinCcSubjs($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSubjs relation - * @method CcShowHostsQuery innerJoinCcSubjs($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSubjs relation + * @method CcShowHostsQuery leftJoinCcShow($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShow relation + * @method CcShowHostsQuery rightJoinCcShow($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShow relation + * @method CcShowHostsQuery innerJoinCcShow($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShow relation * - * @method CcShowHosts findOne(PropelPDO $con = null) Return the first CcShowHosts matching the query - * @method CcShowHosts findOneOrCreate(PropelPDO $con = null) Return the first CcShowHosts matching the query, or a new CcShowHosts object populated from the query conditions when no match is found + * @method CcShowHostsQuery leftJoinCcSubjs($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSubjs relation + * @method CcShowHostsQuery rightJoinCcSubjs($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSubjs relation + * @method CcShowHostsQuery innerJoinCcSubjs($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSubjs relation * - * @method CcShowHosts findOneByDbId(int $id) Return the first CcShowHosts filtered by the id column - * @method CcShowHosts findOneByDbShow(int $show_id) Return the first CcShowHosts filtered by the show_id column - * @method CcShowHosts findOneByDbHost(int $subjs_id) Return the first CcShowHosts filtered by the subjs_id column + * @method CcShowHosts findOne(PropelPDO $con = null) Return the first CcShowHosts matching the query + * @method CcShowHosts findOneOrCreate(PropelPDO $con = null) Return the first CcShowHosts matching the query, or a new CcShowHosts object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcShowHosts objects filtered by the id column - * @method array findByDbShow(int $show_id) Return CcShowHosts objects filtered by the show_id column - * @method array findByDbHost(int $subjs_id) Return CcShowHosts objects filtered by the subjs_id column + * @method CcShowHosts findOneByDbShow(int $show_id) Return the first CcShowHosts filtered by the show_id column + * @method CcShowHosts findOneByDbHost(int $subjs_id) Return the first CcShowHosts filtered by the subjs_id column + * + * @method array findByDbId(int $id) Return CcShowHosts objects filtered by the id column + * @method array findByDbShow(int $show_id) Return CcShowHosts objects filtered by the show_id column + * @method array findByDbHost(int $subjs_id) Return CcShowHosts objects filtered by the subjs_id column * * @package propel.generator.airtime.om */ abstract class BaseCcShowHostsQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcShowHostsQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcShowHosts'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcShowHostsQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcShowHostsQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcShowHostsQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcShowHostsQuery) { + return $criteria; + } + $query = new CcShowHostsQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcShowHosts|CcShowHosts[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcShowHostsPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcShowHostsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShowHosts A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShowHosts A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "show_id", "subjs_id" FROM "cc_show_hosts" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcShowHosts(); + $obj->hydrate($row); + CcShowHostsPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShowHosts|CcShowHosts[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcShowHosts[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcShowHostsQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcShowHostsPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcShowHostsQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcShowHostsPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowHostsQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcShowHostsPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcShowHostsPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowHostsPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the show_id column + * + * Example usage: + * + * $query->filterByDbShow(1234); // WHERE show_id = 1234 + * $query->filterByDbShow(array(12, 34)); // WHERE show_id IN (12, 34) + * $query->filterByDbShow(array('min' => 12)); // WHERE show_id >= 12 + * $query->filterByDbShow(array('max' => 12)); // WHERE show_id <= 12 + * + * + * @see filterByCcShow() + * + * @param mixed $dbShow The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowHostsQuery The current query, for fluid interface + */ + public function filterByDbShow($dbShow = null, $comparison = null) + { + if (is_array($dbShow)) { + $useMinMax = false; + if (isset($dbShow['min'])) { + $this->addUsingAlias(CcShowHostsPeer::SHOW_ID, $dbShow['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbShow['max'])) { + $this->addUsingAlias(CcShowHostsPeer::SHOW_ID, $dbShow['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowHostsPeer::SHOW_ID, $dbShow, $comparison); + } + + /** + * Filter the query on the subjs_id column + * + * Example usage: + * + * $query->filterByDbHost(1234); // WHERE subjs_id = 1234 + * $query->filterByDbHost(array(12, 34)); // WHERE subjs_id IN (12, 34) + * $query->filterByDbHost(array('min' => 12)); // WHERE subjs_id >= 12 + * $query->filterByDbHost(array('max' => 12)); // WHERE subjs_id <= 12 + * + * + * @see filterByCcSubjs() + * + * @param mixed $dbHost The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowHostsQuery The current query, for fluid interface + */ + public function filterByDbHost($dbHost = null, $comparison = null) + { + if (is_array($dbHost)) { + $useMinMax = false; + if (isset($dbHost['min'])) { + $this->addUsingAlias(CcShowHostsPeer::SUBJS_ID, $dbHost['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbHost['max'])) { + $this->addUsingAlias(CcShowHostsPeer::SUBJS_ID, $dbHost['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowHostsPeer::SUBJS_ID, $dbHost, $comparison); + } + + /** + * Filter the query by a related CcShow object + * + * @param CcShow|PropelObjectCollection $ccShow The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowHostsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShow($ccShow, $comparison = null) + { + if ($ccShow instanceof CcShow) { + return $this + ->addUsingAlias(CcShowHostsPeer::SHOW_ID, $ccShow->getDbId(), $comparison); + } elseif ($ccShow instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcShowHostsPeer::SHOW_ID, $ccShow->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcShow() only accepts arguments of type CcShow or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShow relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowHostsQuery The current query, for fluid interface + */ + public function joinCcShow($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShow'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShow'); + } + + return $this; + } + + /** + * Use the CcShow relation CcShow object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowQuery A secondary query class using the current class as primary query + */ + public function useCcShowQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcShow($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShow', 'CcShowQuery'); + } + + /** + * Filter the query by a related CcSubjs object + * + * @param CcSubjs|PropelObjectCollection $ccSubjs The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowHostsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSubjs($ccSubjs, $comparison = null) + { + if ($ccSubjs instanceof CcSubjs) { + return $this + ->addUsingAlias(CcShowHostsPeer::SUBJS_ID, $ccSubjs->getDbId(), $comparison); + } elseif ($ccSubjs instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcShowHostsPeer::SUBJS_ID, $ccSubjs->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcSubjs() only accepts arguments of type CcSubjs or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSubjs relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowHostsQuery The current query, for fluid interface + */ + public function joinCcSubjs($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSubjs'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSubjs'); + } + + return $this; + } + + /** + * Use the CcSubjs relation CcSubjs object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery A secondary query class using the current class as primary query + */ + public function useCcSubjsQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcSubjs($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); + } + + /** + * Exclude object from result + * + * @param CcShowHosts $ccShowHosts Object to remove from the list of results + * + * @return CcShowHostsQuery The current query, for fluid interface + */ + public function prune($ccShowHosts = null) + { + if ($ccShowHosts) { + $this->addUsingAlias(CcShowHostsPeer::ID, $ccShowHosts->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcShowHostsQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcShowHosts', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcShowHostsQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcShowHostsQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcShowHostsQuery) { - return $criteria; - } - $query = new CcShowHostsQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcShowHosts|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcShowHostsPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcShowHostsQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcShowHostsPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcShowHostsQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcShowHostsPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowHostsQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcShowHostsPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the show_id column - * - * @param int|array $dbShow The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowHostsQuery The current query, for fluid interface - */ - public function filterByDbShow($dbShow = null, $comparison = null) - { - if (is_array($dbShow)) { - $useMinMax = false; - if (isset($dbShow['min'])) { - $this->addUsingAlias(CcShowHostsPeer::SHOW_ID, $dbShow['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbShow['max'])) { - $this->addUsingAlias(CcShowHostsPeer::SHOW_ID, $dbShow['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowHostsPeer::SHOW_ID, $dbShow, $comparison); - } - - /** - * Filter the query on the subjs_id column - * - * @param int|array $dbHost The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowHostsQuery The current query, for fluid interface - */ - public function filterByDbHost($dbHost = null, $comparison = null) - { - if (is_array($dbHost)) { - $useMinMax = false; - if (isset($dbHost['min'])) { - $this->addUsingAlias(CcShowHostsPeer::SUBJS_ID, $dbHost['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbHost['max'])) { - $this->addUsingAlias(CcShowHostsPeer::SUBJS_ID, $dbHost['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowHostsPeer::SUBJS_ID, $dbHost, $comparison); - } - - /** - * Filter the query by a related CcShow object - * - * @param CcShow $ccShow the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowHostsQuery The current query, for fluid interface - */ - public function filterByCcShow($ccShow, $comparison = null) - { - return $this - ->addUsingAlias(CcShowHostsPeer::SHOW_ID, $ccShow->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShow relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowHostsQuery The current query, for fluid interface - */ - public function joinCcShow($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShow'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShow'); - } - - return $this; - } - - /** - * Use the CcShow relation CcShow object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowQuery A secondary query class using the current class as primary query - */ - public function useCcShowQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcShow($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShow', 'CcShowQuery'); - } - - /** - * Filter the query by a related CcSubjs object - * - * @param CcSubjs $ccSubjs the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowHostsQuery The current query, for fluid interface - */ - public function filterByCcSubjs($ccSubjs, $comparison = null) - { - return $this - ->addUsingAlias(CcShowHostsPeer::SUBJS_ID, $ccSubjs->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSubjs relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowHostsQuery The current query, for fluid interface - */ - public function joinCcSubjs($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSubjs'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSubjs'); - } - - return $this; - } - - /** - * Use the CcSubjs relation CcSubjs object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery A secondary query class using the current class as primary query - */ - public function useCcSubjsQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcSubjs($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); - } - - /** - * Exclude object from result - * - * @param CcShowHosts $ccShowHosts Object to remove from the list of results - * - * @return CcShowHostsQuery The current query, for fluid interface - */ - public function prune($ccShowHosts = null) - { - if ($ccShowHosts) { - $this->addUsingAlias(CcShowHostsPeer::ID, $ccShowHosts->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcShowHostsQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowInstances.php b/airtime_mvc/application/models/airtime/om/BaseCcShowInstances.php index a783a8e209..1b4a38c4fe 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowInstances.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowInstances.php @@ -4,2262 +4,2817 @@ /** * Base class that represents a row from the 'cc_show_instances' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcShowInstances extends BaseObject implements Persistent +abstract class BaseCcShowInstances extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcShowInstancesPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcShowInstancesPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the starts field. - * @var string - */ - protected $starts; - - /** - * The value for the ends field. - * @var string - */ - protected $ends; - - /** - * The value for the show_id field. - * @var int - */ - protected $show_id; - - /** - * The value for the record field. - * Note: this column has a database default value of: 0 - * @var int - */ - protected $record; - - /** - * The value for the rebroadcast field. - * Note: this column has a database default value of: 0 - * @var int - */ - protected $rebroadcast; - - /** - * The value for the instance_id field. - * @var int - */ - protected $instance_id; - - /** - * The value for the file_id field. - * @var int - */ - protected $file_id; - - /** - * The value for the time_filled field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $time_filled; - - /** - * The value for the created field. - * @var string - */ - protected $created; - - /** - * The value for the last_scheduled field. - * @var string - */ - protected $last_scheduled; - - /** - * The value for the modified_instance field. - * Note: this column has a database default value of: false - * @var boolean - */ - protected $modified_instance; - - /** - * @var CcShow - */ - protected $aCcShow; - - /** - * @var CcShowInstances - */ - protected $aCcShowInstancesRelatedByDbOriginalShow; - - /** - * @var CcFiles - */ - protected $aCcFiles; - - /** - * @var array CcShowInstances[] Collection to store aggregation of CcShowInstances objects. - */ - protected $collCcShowInstancessRelatedByDbId; - - /** - * @var array CcSchedule[] Collection to store aggregation of CcSchedule objects. - */ - protected $collCcSchedules; - - /** - * @var array CcPlayoutHistory[] Collection to store aggregation of CcPlayoutHistory objects. - */ - protected $collCcPlayoutHistorys; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->record = 0; - $this->rebroadcast = 0; - $this->time_filled = '00:00:00'; - $this->modified_instance = false; - } - - /** - * Initializes internal state of BaseCcShowInstances object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [optionally formatted] temporal [starts] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbStarts($format = 'Y-m-d H:i:s') - { - if ($this->starts === null) { - return null; - } - - - - try { - $dt = new DateTime($this->starts); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->starts, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [ends] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbEnds($format = 'Y-m-d H:i:s') - { - if ($this->ends === null) { - return null; - } - - - - try { - $dt = new DateTime($this->ends); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->ends, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [show_id] column value. - * - * @return int - */ - public function getDbShowId() - { - return $this->show_id; - } - - /** - * Get the [record] column value. - * - * @return int - */ - public function getDbRecord() - { - return $this->record; - } - - /** - * Get the [rebroadcast] column value. - * - * @return int - */ - public function getDbRebroadcast() - { - return $this->rebroadcast; - } - - /** - * Get the [instance_id] column value. - * - * @return int - */ - public function getDbOriginalShow() - { - return $this->instance_id; - } - - /** - * Get the [file_id] column value. - * - * @return int - */ - public function getDbRecordedFile() - { - return $this->file_id; - } - - /** - * Get the [time_filled] column value. - * - * @return string - */ - public function getDbTimeFilled() - { - return $this->time_filled; - } - - /** - * Get the [optionally formatted] temporal [created] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbCreated($format = 'Y-m-d H:i:s') - { - if ($this->created === null) { - return null; - } - - - - try { - $dt = new DateTime($this->created); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->created, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [last_scheduled] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbLastScheduled($format = 'Y-m-d H:i:s') - { - if ($this->last_scheduled === null) { - return null; - } - - - - try { - $dt = new DateTime($this->last_scheduled); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->last_scheduled, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [modified_instance] column value. - * - * @return boolean - */ - public function getDbModifiedInstance() - { - return $this->modified_instance; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcShowInstances The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcShowInstancesPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Sets the value of [starts] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcShowInstances The current object (for fluent API support) - */ - public function setDbStarts($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->starts !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->starts !== null && $tmpDt = new DateTime($this->starts)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->starts = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcShowInstancesPeer::STARTS; - } - } // if either are not null - - return $this; - } // setDbStarts() - - /** - * Sets the value of [ends] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcShowInstances The current object (for fluent API support) - */ - public function setDbEnds($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->ends !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->ends !== null && $tmpDt = new DateTime($this->ends)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->ends = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcShowInstancesPeer::ENDS; - } - } // if either are not null - - return $this; - } // setDbEnds() - - /** - * Set the value of [show_id] column. - * - * @param int $v new value - * @return CcShowInstances The current object (for fluent API support) - */ - public function setDbShowId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->show_id !== $v) { - $this->show_id = $v; - $this->modifiedColumns[] = CcShowInstancesPeer::SHOW_ID; - } - - if ($this->aCcShow !== null && $this->aCcShow->getDbId() !== $v) { - $this->aCcShow = null; - } - - return $this; - } // setDbShowId() - - /** - * Set the value of [record] column. - * - * @param int $v new value - * @return CcShowInstances The current object (for fluent API support) - */ - public function setDbRecord($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->record !== $v || $this->isNew()) { - $this->record = $v; - $this->modifiedColumns[] = CcShowInstancesPeer::RECORD; - } - - return $this; - } // setDbRecord() - - /** - * Set the value of [rebroadcast] column. - * - * @param int $v new value - * @return CcShowInstances The current object (for fluent API support) - */ - public function setDbRebroadcast($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->rebroadcast !== $v || $this->isNew()) { - $this->rebroadcast = $v; - $this->modifiedColumns[] = CcShowInstancesPeer::REBROADCAST; - } - - return $this; - } // setDbRebroadcast() - - /** - * Set the value of [instance_id] column. - * - * @param int $v new value - * @return CcShowInstances The current object (for fluent API support) - */ - public function setDbOriginalShow($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->instance_id !== $v) { - $this->instance_id = $v; - $this->modifiedColumns[] = CcShowInstancesPeer::INSTANCE_ID; - } - - if ($this->aCcShowInstancesRelatedByDbOriginalShow !== null && $this->aCcShowInstancesRelatedByDbOriginalShow->getDbId() !== $v) { - $this->aCcShowInstancesRelatedByDbOriginalShow = null; - } - - return $this; - } // setDbOriginalShow() - - /** - * Set the value of [file_id] column. - * - * @param int $v new value - * @return CcShowInstances The current object (for fluent API support) - */ - public function setDbRecordedFile($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->file_id !== $v) { - $this->file_id = $v; - $this->modifiedColumns[] = CcShowInstancesPeer::FILE_ID; - } - - if ($this->aCcFiles !== null && $this->aCcFiles->getDbId() !== $v) { - $this->aCcFiles = null; - } - - return $this; - } // setDbRecordedFile() - - /** - * Set the value of [time_filled] column. - * - * @param string $v new value - * @return CcShowInstances The current object (for fluent API support) - */ - public function setDbTimeFilled($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->time_filled !== $v || $this->isNew()) { - $this->time_filled = $v; - $this->modifiedColumns[] = CcShowInstancesPeer::TIME_FILLED; - } - - return $this; - } // setDbTimeFilled() - - /** - * Sets the value of [created] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcShowInstances The current object (for fluent API support) - */ - public function setDbCreated($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->created !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->created !== null && $tmpDt = new DateTime($this->created)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->created = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcShowInstancesPeer::CREATED; - } - } // if either are not null - - return $this; - } // setDbCreated() - - /** - * Sets the value of [last_scheduled] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcShowInstances The current object (for fluent API support) - */ - public function setDbLastScheduled($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->last_scheduled !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->last_scheduled !== null && $tmpDt = new DateTime($this->last_scheduled)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->last_scheduled = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcShowInstancesPeer::LAST_SCHEDULED; - } - } // if either are not null - - return $this; - } // setDbLastScheduled() - - /** - * Set the value of [modified_instance] column. - * - * @param boolean $v new value - * @return CcShowInstances The current object (for fluent API support) - */ - public function setDbModifiedInstance($v) - { - if ($v !== null) { - $v = (boolean) $v; - } - - if ($this->modified_instance !== $v || $this->isNew()) { - $this->modified_instance = $v; - $this->modifiedColumns[] = CcShowInstancesPeer::MODIFIED_INSTANCE; - } - - return $this; - } // setDbModifiedInstance() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->record !== 0) { - return false; - } - - if ($this->rebroadcast !== 0) { - return false; - } - - if ($this->time_filled !== '00:00:00') { - return false; - } - - if ($this->modified_instance !== false) { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->starts = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->ends = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->show_id = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; - $this->record = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; - $this->rebroadcast = ($row[$startcol + 5] !== null) ? (int) $row[$startcol + 5] : null; - $this->instance_id = ($row[$startcol + 6] !== null) ? (int) $row[$startcol + 6] : null; - $this->file_id = ($row[$startcol + 7] !== null) ? (int) $row[$startcol + 7] : null; - $this->time_filled = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; - $this->created = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; - $this->last_scheduled = ($row[$startcol + 10] !== null) ? (string) $row[$startcol + 10] : null; - $this->modified_instance = ($row[$startcol + 11] !== null) ? (boolean) $row[$startcol + 11] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 12; // 12 = CcShowInstancesPeer::NUM_COLUMNS - CcShowInstancesPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcShowInstances object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcShow !== null && $this->show_id !== $this->aCcShow->getDbId()) { - $this->aCcShow = null; - } - if ($this->aCcShowInstancesRelatedByDbOriginalShow !== null && $this->instance_id !== $this->aCcShowInstancesRelatedByDbOriginalShow->getDbId()) { - $this->aCcShowInstancesRelatedByDbOriginalShow = null; - } - if ($this->aCcFiles !== null && $this->file_id !== $this->aCcFiles->getDbId()) { - $this->aCcFiles = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcShowInstancesPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcShow = null; - $this->aCcShowInstancesRelatedByDbOriginalShow = null; - $this->aCcFiles = null; - $this->collCcShowInstancessRelatedByDbId = null; - - $this->collCcSchedules = null; - - $this->collCcPlayoutHistorys = null; - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcShowInstancesQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcShowInstancesPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcShow !== null) { - if ($this->aCcShow->isModified() || $this->aCcShow->isNew()) { - $affectedRows += $this->aCcShow->save($con); - } - $this->setCcShow($this->aCcShow); - } - - if ($this->aCcShowInstancesRelatedByDbOriginalShow !== null) { - if ($this->aCcShowInstancesRelatedByDbOriginalShow->isModified() || $this->aCcShowInstancesRelatedByDbOriginalShow->isNew()) { - $affectedRows += $this->aCcShowInstancesRelatedByDbOriginalShow->save($con); - } - $this->setCcShowInstancesRelatedByDbOriginalShow($this->aCcShowInstancesRelatedByDbOriginalShow); - } - - if ($this->aCcFiles !== null) { - if ($this->aCcFiles->isModified() || $this->aCcFiles->isNew()) { - $affectedRows += $this->aCcFiles->save($con); - } - $this->setCcFiles($this->aCcFiles); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcShowInstancesPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcShowInstancesPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowInstancesPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcShowInstancesPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - if ($this->collCcShowInstancessRelatedByDbId !== null) { - foreach ($this->collCcShowInstancessRelatedByDbId as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcSchedules !== null) { - foreach ($this->collCcSchedules as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcPlayoutHistorys !== null) { - foreach ($this->collCcPlayoutHistorys as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcShow !== null) { - if (!$this->aCcShow->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcShow->getValidationFailures()); - } - } - - if ($this->aCcShowInstancesRelatedByDbOriginalShow !== null) { - if (!$this->aCcShowInstancesRelatedByDbOriginalShow->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcShowInstancesRelatedByDbOriginalShow->getValidationFailures()); - } - } - - if ($this->aCcFiles !== null) { - if (!$this->aCcFiles->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcFiles->getValidationFailures()); - } - } - - - if (($retval = CcShowInstancesPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - if ($this->collCcShowInstancessRelatedByDbId !== null) { - foreach ($this->collCcShowInstancessRelatedByDbId as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcSchedules !== null) { - foreach ($this->collCcSchedules as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcPlayoutHistorys !== null) { - foreach ($this->collCcPlayoutHistorys as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcShowInstancesPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbStarts(); - break; - case 2: - return $this->getDbEnds(); - break; - case 3: - return $this->getDbShowId(); - break; - case 4: - return $this->getDbRecord(); - break; - case 5: - return $this->getDbRebroadcast(); - break; - case 6: - return $this->getDbOriginalShow(); - break; - case 7: - return $this->getDbRecordedFile(); - break; - case 8: - return $this->getDbTimeFilled(); - break; - case 9: - return $this->getDbCreated(); - break; - case 10: - return $this->getDbLastScheduled(); - break; - case 11: - return $this->getDbModifiedInstance(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcShowInstancesPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbStarts(), - $keys[2] => $this->getDbEnds(), - $keys[3] => $this->getDbShowId(), - $keys[4] => $this->getDbRecord(), - $keys[5] => $this->getDbRebroadcast(), - $keys[6] => $this->getDbOriginalShow(), - $keys[7] => $this->getDbRecordedFile(), - $keys[8] => $this->getDbTimeFilled(), - $keys[9] => $this->getDbCreated(), - $keys[10] => $this->getDbLastScheduled(), - $keys[11] => $this->getDbModifiedInstance(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcShow) { - $result['CcShow'] = $this->aCcShow->toArray($keyType, $includeLazyLoadColumns, true); - } - if (null !== $this->aCcShowInstancesRelatedByDbOriginalShow) { - $result['CcShowInstancesRelatedByDbOriginalShow'] = $this->aCcShowInstancesRelatedByDbOriginalShow->toArray($keyType, $includeLazyLoadColumns, true); - } - if (null !== $this->aCcFiles) { - $result['CcFiles'] = $this->aCcFiles->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcShowInstancesPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbStarts($value); - break; - case 2: - $this->setDbEnds($value); - break; - case 3: - $this->setDbShowId($value); - break; - case 4: - $this->setDbRecord($value); - break; - case 5: - $this->setDbRebroadcast($value); - break; - case 6: - $this->setDbOriginalShow($value); - break; - case 7: - $this->setDbRecordedFile($value); - break; - case 8: - $this->setDbTimeFilled($value); - break; - case 9: - $this->setDbCreated($value); - break; - case 10: - $this->setDbLastScheduled($value); - break; - case 11: - $this->setDbModifiedInstance($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcShowInstancesPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbStarts($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbEnds($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbShowId($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbRecord($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setDbRebroadcast($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setDbOriginalShow($arr[$keys[6]]); - if (array_key_exists($keys[7], $arr)) $this->setDbRecordedFile($arr[$keys[7]]); - if (array_key_exists($keys[8], $arr)) $this->setDbTimeFilled($arr[$keys[8]]); - if (array_key_exists($keys[9], $arr)) $this->setDbCreated($arr[$keys[9]]); - if (array_key_exists($keys[10], $arr)) $this->setDbLastScheduled($arr[$keys[10]]); - if (array_key_exists($keys[11], $arr)) $this->setDbModifiedInstance($arr[$keys[11]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcShowInstancesPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcShowInstancesPeer::ID)) $criteria->add(CcShowInstancesPeer::ID, $this->id); - if ($this->isColumnModified(CcShowInstancesPeer::STARTS)) $criteria->add(CcShowInstancesPeer::STARTS, $this->starts); - if ($this->isColumnModified(CcShowInstancesPeer::ENDS)) $criteria->add(CcShowInstancesPeer::ENDS, $this->ends); - if ($this->isColumnModified(CcShowInstancesPeer::SHOW_ID)) $criteria->add(CcShowInstancesPeer::SHOW_ID, $this->show_id); - if ($this->isColumnModified(CcShowInstancesPeer::RECORD)) $criteria->add(CcShowInstancesPeer::RECORD, $this->record); - if ($this->isColumnModified(CcShowInstancesPeer::REBROADCAST)) $criteria->add(CcShowInstancesPeer::REBROADCAST, $this->rebroadcast); - if ($this->isColumnModified(CcShowInstancesPeer::INSTANCE_ID)) $criteria->add(CcShowInstancesPeer::INSTANCE_ID, $this->instance_id); - if ($this->isColumnModified(CcShowInstancesPeer::FILE_ID)) $criteria->add(CcShowInstancesPeer::FILE_ID, $this->file_id); - if ($this->isColumnModified(CcShowInstancesPeer::TIME_FILLED)) $criteria->add(CcShowInstancesPeer::TIME_FILLED, $this->time_filled); - if ($this->isColumnModified(CcShowInstancesPeer::CREATED)) $criteria->add(CcShowInstancesPeer::CREATED, $this->created); - if ($this->isColumnModified(CcShowInstancesPeer::LAST_SCHEDULED)) $criteria->add(CcShowInstancesPeer::LAST_SCHEDULED, $this->last_scheduled); - if ($this->isColumnModified(CcShowInstancesPeer::MODIFIED_INSTANCE)) $criteria->add(CcShowInstancesPeer::MODIFIED_INSTANCE, $this->modified_instance); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcShowInstancesPeer::DATABASE_NAME); - $criteria->add(CcShowInstancesPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcShowInstances (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbStarts($this->starts); - $copyObj->setDbEnds($this->ends); - $copyObj->setDbShowId($this->show_id); - $copyObj->setDbRecord($this->record); - $copyObj->setDbRebroadcast($this->rebroadcast); - $copyObj->setDbOriginalShow($this->instance_id); - $copyObj->setDbRecordedFile($this->file_id); - $copyObj->setDbTimeFilled($this->time_filled); - $copyObj->setDbCreated($this->created); - $copyObj->setDbLastScheduled($this->last_scheduled); - $copyObj->setDbModifiedInstance($this->modified_instance); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getCcShowInstancessRelatedByDbId() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcShowInstancesRelatedByDbId($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcSchedules() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcSchedule($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcPlayoutHistorys() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcPlayoutHistory($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcShowInstances Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcShowInstancesPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcShowInstancesPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcShow object. - * - * @param CcShow $v - * @return CcShowInstances The current object (for fluent API support) - * @throws PropelException - */ - public function setCcShow(CcShow $v = null) - { - if ($v === null) { - $this->setDbShowId(NULL); - } else { - $this->setDbShowId($v->getDbId()); - } - - $this->aCcShow = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcShow object, it will not be re-added. - if ($v !== null) { - $v->addCcShowInstances($this); - } - - return $this; - } - - - /** - * Get the associated CcShow object - * - * @param PropelPDO Optional Connection object. - * @return CcShow The associated CcShow object. - * @throws PropelException - */ - public function getCcShow(PropelPDO $con = null) - { - if ($this->aCcShow === null && ($this->show_id !== null)) { - $this->aCcShow = CcShowQuery::create()->findPk($this->show_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcShow->addCcShowInstancess($this); - */ - } - return $this->aCcShow; - } - - /** - * Declares an association between this object and a CcShowInstances object. - * - * @param CcShowInstances $v - * @return CcShowInstances The current object (for fluent API support) - * @throws PropelException - */ - public function setCcShowInstancesRelatedByDbOriginalShow(CcShowInstances $v = null) - { - if ($v === null) { - $this->setDbOriginalShow(NULL); - } else { - $this->setDbOriginalShow($v->getDbId()); - } - - $this->aCcShowInstancesRelatedByDbOriginalShow = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcShowInstances object, it will not be re-added. - if ($v !== null) { - $v->addCcShowInstancesRelatedByDbId($this); - } - - return $this; - } - - - /** - * Get the associated CcShowInstances object - * - * @param PropelPDO Optional Connection object. - * @return CcShowInstances The associated CcShowInstances object. - * @throws PropelException - */ - public function getCcShowInstancesRelatedByDbOriginalShow(PropelPDO $con = null) - { - if ($this->aCcShowInstancesRelatedByDbOriginalShow === null && ($this->instance_id !== null)) { - $this->aCcShowInstancesRelatedByDbOriginalShow = CcShowInstancesQuery::create()->findPk($this->instance_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcShowInstancesRelatedByDbOriginalShow->addCcShowInstancessRelatedByDbId($this); - */ - } - return $this->aCcShowInstancesRelatedByDbOriginalShow; - } - - /** - * Declares an association between this object and a CcFiles object. - * - * @param CcFiles $v - * @return CcShowInstances The current object (for fluent API support) - * @throws PropelException - */ - public function setCcFiles(CcFiles $v = null) - { - if ($v === null) { - $this->setDbRecordedFile(NULL); - } else { - $this->setDbRecordedFile($v->getDbId()); - } - - $this->aCcFiles = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcFiles object, it will not be re-added. - if ($v !== null) { - $v->addCcShowInstances($this); - } - - return $this; - } - - - /** - * Get the associated CcFiles object - * - * @param PropelPDO Optional Connection object. - * @return CcFiles The associated CcFiles object. - * @throws PropelException - */ - public function getCcFiles(PropelPDO $con = null) - { - if ($this->aCcFiles === null && ($this->file_id !== null)) { - $this->aCcFiles = CcFilesQuery::create()->findPk($this->file_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcFiles->addCcShowInstancess($this); - */ - } - return $this->aCcFiles; - } - - /** - * Clears out the collCcShowInstancessRelatedByDbId collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcShowInstancessRelatedByDbId() - */ - public function clearCcShowInstancessRelatedByDbId() - { - $this->collCcShowInstancessRelatedByDbId = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcShowInstancessRelatedByDbId collection. - * - * By default this just sets the collCcShowInstancessRelatedByDbId collection to an empty array (like clearcollCcShowInstancessRelatedByDbId()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcShowInstancessRelatedByDbId() - { - $this->collCcShowInstancessRelatedByDbId = new PropelObjectCollection(); - $this->collCcShowInstancessRelatedByDbId->setModel('CcShowInstances'); - } - - /** - * Gets an array of CcShowInstances objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcShowInstances is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcShowInstances[] List of CcShowInstances objects - * @throws PropelException - */ - public function getCcShowInstancessRelatedByDbId($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcShowInstancessRelatedByDbId || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowInstancessRelatedByDbId) { - // return empty collection - $this->initCcShowInstancessRelatedByDbId(); - } else { - $collCcShowInstancessRelatedByDbId = CcShowInstancesQuery::create(null, $criteria) - ->filterByCcShowInstancesRelatedByDbOriginalShow($this) - ->find($con); - if (null !== $criteria) { - return $collCcShowInstancessRelatedByDbId; - } - $this->collCcShowInstancessRelatedByDbId = $collCcShowInstancessRelatedByDbId; - } - } - return $this->collCcShowInstancessRelatedByDbId; - } - - /** - * Returns the number of related CcShowInstances objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcShowInstances objects. - * @throws PropelException - */ - public function countCcShowInstancessRelatedByDbId(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcShowInstancessRelatedByDbId || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowInstancessRelatedByDbId) { - return 0; - } else { - $query = CcShowInstancesQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcShowInstancesRelatedByDbOriginalShow($this) - ->count($con); - } - } else { - return count($this->collCcShowInstancessRelatedByDbId); - } - } - - /** - * Method called to associate a CcShowInstances object to this object - * through the CcShowInstances foreign key attribute. - * - * @param CcShowInstances $l CcShowInstances - * @return void - * @throws PropelException - */ - public function addCcShowInstancesRelatedByDbId(CcShowInstances $l) - { - if ($this->collCcShowInstancessRelatedByDbId === null) { - $this->initCcShowInstancessRelatedByDbId(); - } - if (!$this->collCcShowInstancessRelatedByDbId->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcShowInstancessRelatedByDbId[]= $l; - $l->setCcShowInstancesRelatedByDbOriginalShow($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcShowInstances is new, it will return - * an empty collection; or if this CcShowInstances has previously - * been saved, it will retrieve related CcShowInstancessRelatedByDbId from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcShowInstances. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcShowInstances[] List of CcShowInstances objects - */ - public function getCcShowInstancessRelatedByDbIdJoinCcShow($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcShowInstancesQuery::create(null, $criteria); - $query->joinWith('CcShow', $join_behavior); - - return $this->getCcShowInstancessRelatedByDbId($query, $con); - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcShowInstances is new, it will return - * an empty collection; or if this CcShowInstances has previously - * been saved, it will retrieve related CcShowInstancessRelatedByDbId from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcShowInstances. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcShowInstances[] List of CcShowInstances objects - */ - public function getCcShowInstancessRelatedByDbIdJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcShowInstancesQuery::create(null, $criteria); - $query->joinWith('CcFiles', $join_behavior); - - return $this->getCcShowInstancessRelatedByDbId($query, $con); - } - - /** - * Clears out the collCcSchedules collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcSchedules() - */ - public function clearCcSchedules() - { - $this->collCcSchedules = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcSchedules collection. - * - * By default this just sets the collCcSchedules collection to an empty array (like clearcollCcSchedules()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcSchedules() - { - $this->collCcSchedules = new PropelObjectCollection(); - $this->collCcSchedules->setModel('CcSchedule'); - } - - /** - * Gets an array of CcSchedule objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcShowInstances is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcSchedule[] List of CcSchedule objects - * @throws PropelException - */ - public function getCcSchedules($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcSchedules || null !== $criteria) { - if ($this->isNew() && null === $this->collCcSchedules) { - // return empty collection - $this->initCcSchedules(); - } else { - $collCcSchedules = CcScheduleQuery::create(null, $criteria) - ->filterByCcShowInstances($this) - ->find($con); - if (null !== $criteria) { - return $collCcSchedules; - } - $this->collCcSchedules = $collCcSchedules; - } - } - return $this->collCcSchedules; - } - - /** - * Returns the number of related CcSchedule objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcSchedule objects. - * @throws PropelException - */ - public function countCcSchedules(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcSchedules || null !== $criteria) { - if ($this->isNew() && null === $this->collCcSchedules) { - return 0; - } else { - $query = CcScheduleQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcShowInstances($this) - ->count($con); - } - } else { - return count($this->collCcSchedules); - } - } - - /** - * Method called to associate a CcSchedule object to this object - * through the CcSchedule foreign key attribute. - * - * @param CcSchedule $l CcSchedule - * @return void - * @throws PropelException - */ - public function addCcSchedule(CcSchedule $l) - { - if ($this->collCcSchedules === null) { - $this->initCcSchedules(); - } - if (!$this->collCcSchedules->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcSchedules[]= $l; - $l->setCcShowInstances($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcShowInstances is new, it will return - * an empty collection; or if this CcShowInstances has previously - * been saved, it will retrieve related CcSchedules from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcShowInstances. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcSchedule[] List of CcSchedule objects - */ - public function getCcSchedulesJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcScheduleQuery::create(null, $criteria); - $query->joinWith('CcFiles', $join_behavior); - - return $this->getCcSchedules($query, $con); - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcShowInstances is new, it will return - * an empty collection; or if this CcShowInstances has previously - * been saved, it will retrieve related CcSchedules from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcShowInstances. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcSchedule[] List of CcSchedule objects - */ - public function getCcSchedulesJoinCcWebstream($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcScheduleQuery::create(null, $criteria); - $query->joinWith('CcWebstream', $join_behavior); - - return $this->getCcSchedules($query, $con); - } - - /** - * Clears out the collCcPlayoutHistorys collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcPlayoutHistorys() - */ - public function clearCcPlayoutHistorys() - { - $this->collCcPlayoutHistorys = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcPlayoutHistorys collection. - * - * By default this just sets the collCcPlayoutHistorys collection to an empty array (like clearcollCcPlayoutHistorys()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcPlayoutHistorys() - { - $this->collCcPlayoutHistorys = new PropelObjectCollection(); - $this->collCcPlayoutHistorys->setModel('CcPlayoutHistory'); - } - - /** - * Gets an array of CcPlayoutHistory objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcShowInstances is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcPlayoutHistory[] List of CcPlayoutHistory objects - * @throws PropelException - */ - public function getCcPlayoutHistorys($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcPlayoutHistorys || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlayoutHistorys) { - // return empty collection - $this->initCcPlayoutHistorys(); - } else { - $collCcPlayoutHistorys = CcPlayoutHistoryQuery::create(null, $criteria) - ->filterByCcShowInstances($this) - ->find($con); - if (null !== $criteria) { - return $collCcPlayoutHistorys; - } - $this->collCcPlayoutHistorys = $collCcPlayoutHistorys; - } - } - return $this->collCcPlayoutHistorys; - } - - /** - * Returns the number of related CcPlayoutHistory objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcPlayoutHistory objects. - * @throws PropelException - */ - public function countCcPlayoutHistorys(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcPlayoutHistorys || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlayoutHistorys) { - return 0; - } else { - $query = CcPlayoutHistoryQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcShowInstances($this) - ->count($con); - } - } else { - return count($this->collCcPlayoutHistorys); - } - } - - /** - * Method called to associate a CcPlayoutHistory object to this object - * through the CcPlayoutHistory foreign key attribute. - * - * @param CcPlayoutHistory $l CcPlayoutHistory - * @return void - * @throws PropelException - */ - public function addCcPlayoutHistory(CcPlayoutHistory $l) - { - if ($this->collCcPlayoutHistorys === null) { - $this->initCcPlayoutHistorys(); - } - if (!$this->collCcPlayoutHistorys->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcPlayoutHistorys[]= $l; - $l->setCcShowInstances($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcShowInstances is new, it will return - * an empty collection; or if this CcShowInstances has previously - * been saved, it will retrieve related CcPlayoutHistorys from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcShowInstances. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcPlayoutHistory[] List of CcPlayoutHistory objects - */ - public function getCcPlayoutHistorysJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcPlayoutHistoryQuery::create(null, $criteria); - $query->joinWith('CcFiles', $join_behavior); - - return $this->getCcPlayoutHistorys($query, $con); - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->starts = null; - $this->ends = null; - $this->show_id = null; - $this->record = null; - $this->rebroadcast = null; - $this->instance_id = null; - $this->file_id = null; - $this->time_filled = null; - $this->created = null; - $this->last_scheduled = null; - $this->modified_instance = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - if ($this->collCcShowInstancessRelatedByDbId) { - foreach ((array) $this->collCcShowInstancessRelatedByDbId as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcSchedules) { - foreach ((array) $this->collCcSchedules as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcPlayoutHistorys) { - foreach ((array) $this->collCcPlayoutHistorys as $o) { - $o->clearAllReferences($deep); - } - } - } // if ($deep) - - $this->collCcShowInstancessRelatedByDbId = null; - $this->collCcSchedules = null; - $this->collCcPlayoutHistorys = null; - $this->aCcShow = null; - $this->aCcShowInstancesRelatedByDbOriginalShow = null; - $this->aCcFiles = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcShowInstances + /** + * Peer class name + */ + const PEER = 'CcShowInstancesPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcShowInstancesPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the starts field. + * @var string + */ + protected $starts; + + /** + * The value for the ends field. + * @var string + */ + protected $ends; + + /** + * The value for the show_id field. + * @var int + */ + protected $show_id; + + /** + * The value for the record field. + * Note: this column has a database default value of: 0 + * @var int + */ + protected $record; + + /** + * The value for the rebroadcast field. + * Note: this column has a database default value of: 0 + * @var int + */ + protected $rebroadcast; + + /** + * The value for the instance_id field. + * @var int + */ + protected $instance_id; + + /** + * The value for the file_id field. + * @var int + */ + protected $file_id; + + /** + * The value for the time_filled field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $time_filled; + + /** + * The value for the created field. + * @var string + */ + protected $created; + + /** + * The value for the last_scheduled field. + * @var string + */ + protected $last_scheduled; + + /** + * The value for the modified_instance field. + * Note: this column has a database default value of: false + * @var boolean + */ + protected $modified_instance; + + /** + * @var CcShow + */ + protected $aCcShow; + + /** + * @var CcShowInstances + */ + protected $aCcShowInstancesRelatedByDbOriginalShow; + + /** + * @var CcFiles + */ + protected $aCcFiles; + + /** + * @var PropelObjectCollection|CcShowInstances[] Collection to store aggregation of CcShowInstances objects. + */ + protected $collCcShowInstancessRelatedByDbId; + protected $collCcShowInstancessRelatedByDbIdPartial; + + /** + * @var PropelObjectCollection|CcSchedule[] Collection to store aggregation of CcSchedule objects. + */ + protected $collCcSchedules; + protected $collCcSchedulesPartial; + + /** + * @var PropelObjectCollection|CcPlayoutHistory[] Collection to store aggregation of CcPlayoutHistory objects. + */ + protected $collCcPlayoutHistorys; + protected $collCcPlayoutHistorysPartial; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccShowInstancessRelatedByDbIdScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccSchedulesScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccPlayoutHistorysScheduledForDeletion = null; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->record = 0; + $this->rebroadcast = 0; + $this->time_filled = '00:00:00'; + $this->modified_instance = false; + } + + /** + * Initializes internal state of BaseCcShowInstances object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [optionally formatted] temporal [starts] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbStarts($format = 'Y-m-d H:i:s') + { + if ($this->starts === null) { + return null; + } + + + try { + $dt = new DateTime($this->starts); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->starts, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [ends] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbEnds($format = 'Y-m-d H:i:s') + { + if ($this->ends === null) { + return null; + } + + + try { + $dt = new DateTime($this->ends); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->ends, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [show_id] column value. + * + * @return int + */ + public function getDbShowId() + { + + return $this->show_id; + } + + /** + * Get the [record] column value. + * + * @return int + */ + public function getDbRecord() + { + + return $this->record; + } + + /** + * Get the [rebroadcast] column value. + * + * @return int + */ + public function getDbRebroadcast() + { + + return $this->rebroadcast; + } + + /** + * Get the [instance_id] column value. + * + * @return int + */ + public function getDbOriginalShow() + { + + return $this->instance_id; + } + + /** + * Get the [file_id] column value. + * + * @return int + */ + public function getDbRecordedFile() + { + + return $this->file_id; + } + + /** + * Get the [time_filled] column value. + * + * @return string + */ + public function getDbTimeFilled() + { + + return $this->time_filled; + } + + /** + * Get the [optionally formatted] temporal [created] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbCreated($format = 'Y-m-d H:i:s') + { + if ($this->created === null) { + return null; + } + + + try { + $dt = new DateTime($this->created); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->created, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [last_scheduled] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbLastScheduled($format = 'Y-m-d H:i:s') + { + if ($this->last_scheduled === null) { + return null; + } + + + try { + $dt = new DateTime($this->last_scheduled); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->last_scheduled, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [modified_instance] column value. + * + * @return boolean + */ + public function getDbModifiedInstance() + { + + return $this->modified_instance; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcShowInstances The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcShowInstancesPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Sets the value of [starts] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcShowInstances The current object (for fluent API support) + */ + public function setDbStarts($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->starts !== null || $dt !== null) { + $currentDateAsString = ($this->starts !== null && $tmpDt = new DateTime($this->starts)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->starts = $newDateAsString; + $this->modifiedColumns[] = CcShowInstancesPeer::STARTS; + } + } // if either are not null + + + return $this; + } // setDbStarts() + + /** + * Sets the value of [ends] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcShowInstances The current object (for fluent API support) + */ + public function setDbEnds($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->ends !== null || $dt !== null) { + $currentDateAsString = ($this->ends !== null && $tmpDt = new DateTime($this->ends)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->ends = $newDateAsString; + $this->modifiedColumns[] = CcShowInstancesPeer::ENDS; + } + } // if either are not null + + + return $this; + } // setDbEnds() + + /** + * Set the value of [show_id] column. + * + * @param int $v new value + * @return CcShowInstances The current object (for fluent API support) + */ + public function setDbShowId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->show_id !== $v) { + $this->show_id = $v; + $this->modifiedColumns[] = CcShowInstancesPeer::SHOW_ID; + } + + if ($this->aCcShow !== null && $this->aCcShow->getDbId() !== $v) { + $this->aCcShow = null; + } + + + return $this; + } // setDbShowId() + + /** + * Set the value of [record] column. + * + * @param int $v new value + * @return CcShowInstances The current object (for fluent API support) + */ + public function setDbRecord($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->record !== $v) { + $this->record = $v; + $this->modifiedColumns[] = CcShowInstancesPeer::RECORD; + } + + + return $this; + } // setDbRecord() + + /** + * Set the value of [rebroadcast] column. + * + * @param int $v new value + * @return CcShowInstances The current object (for fluent API support) + */ + public function setDbRebroadcast($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->rebroadcast !== $v) { + $this->rebroadcast = $v; + $this->modifiedColumns[] = CcShowInstancesPeer::REBROADCAST; + } + + + return $this; + } // setDbRebroadcast() + + /** + * Set the value of [instance_id] column. + * + * @param int $v new value + * @return CcShowInstances The current object (for fluent API support) + */ + public function setDbOriginalShow($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->instance_id !== $v) { + $this->instance_id = $v; + $this->modifiedColumns[] = CcShowInstancesPeer::INSTANCE_ID; + } + + if ($this->aCcShowInstancesRelatedByDbOriginalShow !== null && $this->aCcShowInstancesRelatedByDbOriginalShow->getDbId() !== $v) { + $this->aCcShowInstancesRelatedByDbOriginalShow = null; + } + + + return $this; + } // setDbOriginalShow() + + /** + * Set the value of [file_id] column. + * + * @param int $v new value + * @return CcShowInstances The current object (for fluent API support) + */ + public function setDbRecordedFile($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->file_id !== $v) { + $this->file_id = $v; + $this->modifiedColumns[] = CcShowInstancesPeer::FILE_ID; + } + + if ($this->aCcFiles !== null && $this->aCcFiles->getDbId() !== $v) { + $this->aCcFiles = null; + } + + + return $this; + } // setDbRecordedFile() + + /** + * Set the value of [time_filled] column. + * + * @param string $v new value + * @return CcShowInstances The current object (for fluent API support) + */ + public function setDbTimeFilled($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->time_filled !== $v) { + $this->time_filled = $v; + $this->modifiedColumns[] = CcShowInstancesPeer::TIME_FILLED; + } + + + return $this; + } // setDbTimeFilled() + + /** + * Sets the value of [created] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcShowInstances The current object (for fluent API support) + */ + public function setDbCreated($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->created !== null || $dt !== null) { + $currentDateAsString = ($this->created !== null && $tmpDt = new DateTime($this->created)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->created = $newDateAsString; + $this->modifiedColumns[] = CcShowInstancesPeer::CREATED; + } + } // if either are not null + + + return $this; + } // setDbCreated() + + /** + * Sets the value of [last_scheduled] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcShowInstances The current object (for fluent API support) + */ + public function setDbLastScheduled($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->last_scheduled !== null || $dt !== null) { + $currentDateAsString = ($this->last_scheduled !== null && $tmpDt = new DateTime($this->last_scheduled)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->last_scheduled = $newDateAsString; + $this->modifiedColumns[] = CcShowInstancesPeer::LAST_SCHEDULED; + } + } // if either are not null + + + return $this; + } // setDbLastScheduled() + + /** + * Sets the value of the [modified_instance] column. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * + * @param boolean|integer|string $v The new value + * @return CcShowInstances The current object (for fluent API support) + */ + public function setDbModifiedInstance($v) + { + if ($v !== null) { + if (is_string($v)) { + $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } else { + $v = (boolean) $v; + } + } + + if ($this->modified_instance !== $v) { + $this->modified_instance = $v; + $this->modifiedColumns[] = CcShowInstancesPeer::MODIFIED_INSTANCE; + } + + + return $this; + } // setDbModifiedInstance() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->record !== 0) { + return false; + } + + if ($this->rebroadcast !== 0) { + return false; + } + + if ($this->time_filled !== '00:00:00') { + return false; + } + + if ($this->modified_instance !== false) { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->starts = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->ends = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->show_id = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; + $this->record = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; + $this->rebroadcast = ($row[$startcol + 5] !== null) ? (int) $row[$startcol + 5] : null; + $this->instance_id = ($row[$startcol + 6] !== null) ? (int) $row[$startcol + 6] : null; + $this->file_id = ($row[$startcol + 7] !== null) ? (int) $row[$startcol + 7] : null; + $this->time_filled = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; + $this->created = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; + $this->last_scheduled = ($row[$startcol + 10] !== null) ? (string) $row[$startcol + 10] : null; + $this->modified_instance = ($row[$startcol + 11] !== null) ? (boolean) $row[$startcol + 11] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 12; // 12 = CcShowInstancesPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcShowInstances object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcShow !== null && $this->show_id !== $this->aCcShow->getDbId()) { + $this->aCcShow = null; + } + if ($this->aCcShowInstancesRelatedByDbOriginalShow !== null && $this->instance_id !== $this->aCcShowInstancesRelatedByDbOriginalShow->getDbId()) { + $this->aCcShowInstancesRelatedByDbOriginalShow = null; + } + if ($this->aCcFiles !== null && $this->file_id !== $this->aCcFiles->getDbId()) { + $this->aCcFiles = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcShowInstancesPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcShow = null; + $this->aCcShowInstancesRelatedByDbOriginalShow = null; + $this->aCcFiles = null; + $this->collCcShowInstancessRelatedByDbId = null; + + $this->collCcSchedules = null; + + $this->collCcPlayoutHistorys = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcShowInstancesQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcShowInstancesPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcShow !== null) { + if ($this->aCcShow->isModified() || $this->aCcShow->isNew()) { + $affectedRows += $this->aCcShow->save($con); + } + $this->setCcShow($this->aCcShow); + } + + if ($this->aCcShowInstancesRelatedByDbOriginalShow !== null) { + if ($this->aCcShowInstancesRelatedByDbOriginalShow->isModified() || $this->aCcShowInstancesRelatedByDbOriginalShow->isNew()) { + $affectedRows += $this->aCcShowInstancesRelatedByDbOriginalShow->save($con); + } + $this->setCcShowInstancesRelatedByDbOriginalShow($this->aCcShowInstancesRelatedByDbOriginalShow); + } + + if ($this->aCcFiles !== null) { + if ($this->aCcFiles->isModified() || $this->aCcFiles->isNew()) { + $affectedRows += $this->aCcFiles->save($con); + } + $this->setCcFiles($this->aCcFiles); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->ccShowInstancessRelatedByDbIdScheduledForDeletion !== null) { + if (!$this->ccShowInstancessRelatedByDbIdScheduledForDeletion->isEmpty()) { + CcShowInstancesQuery::create() + ->filterByPrimaryKeys($this->ccShowInstancessRelatedByDbIdScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccShowInstancessRelatedByDbIdScheduledForDeletion = null; + } + } + + if ($this->collCcShowInstancessRelatedByDbId !== null) { + foreach ($this->collCcShowInstancessRelatedByDbId as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccSchedulesScheduledForDeletion !== null) { + if (!$this->ccSchedulesScheduledForDeletion->isEmpty()) { + CcScheduleQuery::create() + ->filterByPrimaryKeys($this->ccSchedulesScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccSchedulesScheduledForDeletion = null; + } + } + + if ($this->collCcSchedules !== null) { + foreach ($this->collCcSchedules as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccPlayoutHistorysScheduledForDeletion !== null) { + if (!$this->ccPlayoutHistorysScheduledForDeletion->isEmpty()) { + foreach ($this->ccPlayoutHistorysScheduledForDeletion as $ccPlayoutHistory) { + // need to save related object because we set the relation to null + $ccPlayoutHistory->save($con); + } + $this->ccPlayoutHistorysScheduledForDeletion = null; + } + } + + if ($this->collCcPlayoutHistorys !== null) { + foreach ($this->collCcPlayoutHistorys as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcShowInstancesPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcShowInstancesPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_show_instances_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcShowInstancesPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcShowInstancesPeer::STARTS)) { + $modifiedColumns[':p' . $index++] = '"starts"'; + } + if ($this->isColumnModified(CcShowInstancesPeer::ENDS)) { + $modifiedColumns[':p' . $index++] = '"ends"'; + } + if ($this->isColumnModified(CcShowInstancesPeer::SHOW_ID)) { + $modifiedColumns[':p' . $index++] = '"show_id"'; + } + if ($this->isColumnModified(CcShowInstancesPeer::RECORD)) { + $modifiedColumns[':p' . $index++] = '"record"'; + } + if ($this->isColumnModified(CcShowInstancesPeer::REBROADCAST)) { + $modifiedColumns[':p' . $index++] = '"rebroadcast"'; + } + if ($this->isColumnModified(CcShowInstancesPeer::INSTANCE_ID)) { + $modifiedColumns[':p' . $index++] = '"instance_id"'; + } + if ($this->isColumnModified(CcShowInstancesPeer::FILE_ID)) { + $modifiedColumns[':p' . $index++] = '"file_id"'; + } + if ($this->isColumnModified(CcShowInstancesPeer::TIME_FILLED)) { + $modifiedColumns[':p' . $index++] = '"time_filled"'; + } + if ($this->isColumnModified(CcShowInstancesPeer::CREATED)) { + $modifiedColumns[':p' . $index++] = '"created"'; + } + if ($this->isColumnModified(CcShowInstancesPeer::LAST_SCHEDULED)) { + $modifiedColumns[':p' . $index++] = '"last_scheduled"'; + } + if ($this->isColumnModified(CcShowInstancesPeer::MODIFIED_INSTANCE)) { + $modifiedColumns[':p' . $index++] = '"modified_instance"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_show_instances" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"starts"': + $stmt->bindValue($identifier, $this->starts, PDO::PARAM_STR); + break; + case '"ends"': + $stmt->bindValue($identifier, $this->ends, PDO::PARAM_STR); + break; + case '"show_id"': + $stmt->bindValue($identifier, $this->show_id, PDO::PARAM_INT); + break; + case '"record"': + $stmt->bindValue($identifier, $this->record, PDO::PARAM_INT); + break; + case '"rebroadcast"': + $stmt->bindValue($identifier, $this->rebroadcast, PDO::PARAM_INT); + break; + case '"instance_id"': + $stmt->bindValue($identifier, $this->instance_id, PDO::PARAM_INT); + break; + case '"file_id"': + $stmt->bindValue($identifier, $this->file_id, PDO::PARAM_INT); + break; + case '"time_filled"': + $stmt->bindValue($identifier, $this->time_filled, PDO::PARAM_STR); + break; + case '"created"': + $stmt->bindValue($identifier, $this->created, PDO::PARAM_STR); + break; + case '"last_scheduled"': + $stmt->bindValue($identifier, $this->last_scheduled, PDO::PARAM_STR); + break; + case '"modified_instance"': + $stmt->bindValue($identifier, $this->modified_instance, PDO::PARAM_BOOL); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcShow !== null) { + if (!$this->aCcShow->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcShow->getValidationFailures()); + } + } + + if ($this->aCcShowInstancesRelatedByDbOriginalShow !== null) { + if (!$this->aCcShowInstancesRelatedByDbOriginalShow->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcShowInstancesRelatedByDbOriginalShow->getValidationFailures()); + } + } + + if ($this->aCcFiles !== null) { + if (!$this->aCcFiles->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcFiles->getValidationFailures()); + } + } + + + if (($retval = CcShowInstancesPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + if ($this->collCcShowInstancessRelatedByDbId !== null) { + foreach ($this->collCcShowInstancessRelatedByDbId as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcSchedules !== null) { + foreach ($this->collCcSchedules as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcPlayoutHistorys !== null) { + foreach ($this->collCcPlayoutHistorys as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcShowInstancesPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbStarts(); + break; + case 2: + return $this->getDbEnds(); + break; + case 3: + return $this->getDbShowId(); + break; + case 4: + return $this->getDbRecord(); + break; + case 5: + return $this->getDbRebroadcast(); + break; + case 6: + return $this->getDbOriginalShow(); + break; + case 7: + return $this->getDbRecordedFile(); + break; + case 8: + return $this->getDbTimeFilled(); + break; + case 9: + return $this->getDbCreated(); + break; + case 10: + return $this->getDbLastScheduled(); + break; + case 11: + return $this->getDbModifiedInstance(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcShowInstances'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcShowInstances'][$this->getPrimaryKey()] = true; + $keys = CcShowInstancesPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbStarts(), + $keys[2] => $this->getDbEnds(), + $keys[3] => $this->getDbShowId(), + $keys[4] => $this->getDbRecord(), + $keys[5] => $this->getDbRebroadcast(), + $keys[6] => $this->getDbOriginalShow(), + $keys[7] => $this->getDbRecordedFile(), + $keys[8] => $this->getDbTimeFilled(), + $keys[9] => $this->getDbCreated(), + $keys[10] => $this->getDbLastScheduled(), + $keys[11] => $this->getDbModifiedInstance(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcShow) { + $result['CcShow'] = $this->aCcShow->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->aCcShowInstancesRelatedByDbOriginalShow) { + $result['CcShowInstancesRelatedByDbOriginalShow'] = $this->aCcShowInstancesRelatedByDbOriginalShow->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->aCcFiles) { + $result['CcFiles'] = $this->aCcFiles->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + if (null !== $this->collCcShowInstancessRelatedByDbId) { + $result['CcShowInstancessRelatedByDbId'] = $this->collCcShowInstancessRelatedByDbId->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcSchedules) { + $result['CcSchedules'] = $this->collCcSchedules->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcPlayoutHistorys) { + $result['CcPlayoutHistorys'] = $this->collCcPlayoutHistorys->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcShowInstancesPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbStarts($value); + break; + case 2: + $this->setDbEnds($value); + break; + case 3: + $this->setDbShowId($value); + break; + case 4: + $this->setDbRecord($value); + break; + case 5: + $this->setDbRebroadcast($value); + break; + case 6: + $this->setDbOriginalShow($value); + break; + case 7: + $this->setDbRecordedFile($value); + break; + case 8: + $this->setDbTimeFilled($value); + break; + case 9: + $this->setDbCreated($value); + break; + case 10: + $this->setDbLastScheduled($value); + break; + case 11: + $this->setDbModifiedInstance($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcShowInstancesPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbStarts($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbEnds($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbShowId($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbRecord($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setDbRebroadcast($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setDbOriginalShow($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setDbRecordedFile($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setDbTimeFilled($arr[$keys[8]]); + if (array_key_exists($keys[9], $arr)) $this->setDbCreated($arr[$keys[9]]); + if (array_key_exists($keys[10], $arr)) $this->setDbLastScheduled($arr[$keys[10]]); + if (array_key_exists($keys[11], $arr)) $this->setDbModifiedInstance($arr[$keys[11]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcShowInstancesPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcShowInstancesPeer::ID)) $criteria->add(CcShowInstancesPeer::ID, $this->id); + if ($this->isColumnModified(CcShowInstancesPeer::STARTS)) $criteria->add(CcShowInstancesPeer::STARTS, $this->starts); + if ($this->isColumnModified(CcShowInstancesPeer::ENDS)) $criteria->add(CcShowInstancesPeer::ENDS, $this->ends); + if ($this->isColumnModified(CcShowInstancesPeer::SHOW_ID)) $criteria->add(CcShowInstancesPeer::SHOW_ID, $this->show_id); + if ($this->isColumnModified(CcShowInstancesPeer::RECORD)) $criteria->add(CcShowInstancesPeer::RECORD, $this->record); + if ($this->isColumnModified(CcShowInstancesPeer::REBROADCAST)) $criteria->add(CcShowInstancesPeer::REBROADCAST, $this->rebroadcast); + if ($this->isColumnModified(CcShowInstancesPeer::INSTANCE_ID)) $criteria->add(CcShowInstancesPeer::INSTANCE_ID, $this->instance_id); + if ($this->isColumnModified(CcShowInstancesPeer::FILE_ID)) $criteria->add(CcShowInstancesPeer::FILE_ID, $this->file_id); + if ($this->isColumnModified(CcShowInstancesPeer::TIME_FILLED)) $criteria->add(CcShowInstancesPeer::TIME_FILLED, $this->time_filled); + if ($this->isColumnModified(CcShowInstancesPeer::CREATED)) $criteria->add(CcShowInstancesPeer::CREATED, $this->created); + if ($this->isColumnModified(CcShowInstancesPeer::LAST_SCHEDULED)) $criteria->add(CcShowInstancesPeer::LAST_SCHEDULED, $this->last_scheduled); + if ($this->isColumnModified(CcShowInstancesPeer::MODIFIED_INSTANCE)) $criteria->add(CcShowInstancesPeer::MODIFIED_INSTANCE, $this->modified_instance); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcShowInstancesPeer::DATABASE_NAME); + $criteria->add(CcShowInstancesPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcShowInstances (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbStarts($this->getDbStarts()); + $copyObj->setDbEnds($this->getDbEnds()); + $copyObj->setDbShowId($this->getDbShowId()); + $copyObj->setDbRecord($this->getDbRecord()); + $copyObj->setDbRebroadcast($this->getDbRebroadcast()); + $copyObj->setDbOriginalShow($this->getDbOriginalShow()); + $copyObj->setDbRecordedFile($this->getDbRecordedFile()); + $copyObj->setDbTimeFilled($this->getDbTimeFilled()); + $copyObj->setDbCreated($this->getDbCreated()); + $copyObj->setDbLastScheduled($this->getDbLastScheduled()); + $copyObj->setDbModifiedInstance($this->getDbModifiedInstance()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + foreach ($this->getCcShowInstancessRelatedByDbId() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcShowInstancesRelatedByDbId($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcSchedules() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcSchedule($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcPlayoutHistorys() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcPlayoutHistory($relObj->copy($deepCopy)); + } + } + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcShowInstances Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcShowInstancesPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcShowInstancesPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcShow object. + * + * @param CcShow $v + * @return CcShowInstances The current object (for fluent API support) + * @throws PropelException + */ + public function setCcShow(CcShow $v = null) + { + if ($v === null) { + $this->setDbShowId(NULL); + } else { + $this->setDbShowId($v->getDbId()); + } + + $this->aCcShow = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcShow object, it will not be re-added. + if ($v !== null) { + $v->addCcShowInstances($this); + } + + + return $this; + } + + + /** + * Get the associated CcShow object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcShow The associated CcShow object. + * @throws PropelException + */ + public function getCcShow(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcShow === null && ($this->show_id !== null) && $doQuery) { + $this->aCcShow = CcShowQuery::create()->findPk($this->show_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcShow->addCcShowInstancess($this); + */ + } + + return $this->aCcShow; + } + + /** + * Declares an association between this object and a CcShowInstances object. + * + * @param CcShowInstances $v + * @return CcShowInstances The current object (for fluent API support) + * @throws PropelException + */ + public function setCcShowInstancesRelatedByDbOriginalShow(CcShowInstances $v = null) + { + if ($v === null) { + $this->setDbOriginalShow(NULL); + } else { + $this->setDbOriginalShow($v->getDbId()); + } + + $this->aCcShowInstancesRelatedByDbOriginalShow = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcShowInstances object, it will not be re-added. + if ($v !== null) { + $v->addCcShowInstancesRelatedByDbId($this); + } + + + return $this; + } + + + /** + * Get the associated CcShowInstances object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcShowInstances The associated CcShowInstances object. + * @throws PropelException + */ + public function getCcShowInstancesRelatedByDbOriginalShow(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcShowInstancesRelatedByDbOriginalShow === null && ($this->instance_id !== null) && $doQuery) { + $this->aCcShowInstancesRelatedByDbOriginalShow = CcShowInstancesQuery::create()->findPk($this->instance_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcShowInstancesRelatedByDbOriginalShow->addCcShowInstancessRelatedByDbId($this); + */ + } + + return $this->aCcShowInstancesRelatedByDbOriginalShow; + } + + /** + * Declares an association between this object and a CcFiles object. + * + * @param CcFiles $v + * @return CcShowInstances The current object (for fluent API support) + * @throws PropelException + */ + public function setCcFiles(CcFiles $v = null) + { + if ($v === null) { + $this->setDbRecordedFile(NULL); + } else { + $this->setDbRecordedFile($v->getDbId()); + } + + $this->aCcFiles = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcFiles object, it will not be re-added. + if ($v !== null) { + $v->addCcShowInstances($this); + } + + + return $this; + } + + + /** + * Get the associated CcFiles object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcFiles The associated CcFiles object. + * @throws PropelException + */ + public function getCcFiles(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcFiles === null && ($this->file_id !== null) && $doQuery) { + $this->aCcFiles = CcFilesQuery::create()->findPk($this->file_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcFiles->addCcShowInstancess($this); + */ + } + + return $this->aCcFiles; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CcShowInstancesRelatedByDbId' == $relationName) { + $this->initCcShowInstancessRelatedByDbId(); + } + if ('CcSchedule' == $relationName) { + $this->initCcSchedules(); + } + if ('CcPlayoutHistory' == $relationName) { + $this->initCcPlayoutHistorys(); + } + } + + /** + * Clears out the collCcShowInstancessRelatedByDbId collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcShowInstances The current object (for fluent API support) + * @see addCcShowInstancessRelatedByDbId() + */ + public function clearCcShowInstancessRelatedByDbId() + { + $this->collCcShowInstancessRelatedByDbId = null; // important to set this to null since that means it is uninitialized + $this->collCcShowInstancessRelatedByDbIdPartial = null; + + return $this; + } + + /** + * reset is the collCcShowInstancessRelatedByDbId collection loaded partially + * + * @return void + */ + public function resetPartialCcShowInstancessRelatedByDbId($v = true) + { + $this->collCcShowInstancessRelatedByDbIdPartial = $v; + } + + /** + * Initializes the collCcShowInstancessRelatedByDbId collection. + * + * By default this just sets the collCcShowInstancessRelatedByDbId collection to an empty array (like clearcollCcShowInstancessRelatedByDbId()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcShowInstancessRelatedByDbId($overrideExisting = true) + { + if (null !== $this->collCcShowInstancessRelatedByDbId && !$overrideExisting) { + return; + } + $this->collCcShowInstancessRelatedByDbId = new PropelObjectCollection(); + $this->collCcShowInstancessRelatedByDbId->setModel('CcShowInstances'); + } + + /** + * Gets an array of CcShowInstances objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcShowInstances is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcShowInstances[] List of CcShowInstances objects + * @throws PropelException + */ + public function getCcShowInstancessRelatedByDbId($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcShowInstancessRelatedByDbIdPartial && !$this->isNew(); + if (null === $this->collCcShowInstancessRelatedByDbId || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowInstancessRelatedByDbId) { + // return empty collection + $this->initCcShowInstancessRelatedByDbId(); + } else { + $collCcShowInstancessRelatedByDbId = CcShowInstancesQuery::create(null, $criteria) + ->filterByCcShowInstancesRelatedByDbOriginalShow($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcShowInstancessRelatedByDbIdPartial && count($collCcShowInstancessRelatedByDbId)) { + $this->initCcShowInstancessRelatedByDbId(false); + + foreach ($collCcShowInstancessRelatedByDbId as $obj) { + if (false == $this->collCcShowInstancessRelatedByDbId->contains($obj)) { + $this->collCcShowInstancessRelatedByDbId->append($obj); + } + } + + $this->collCcShowInstancessRelatedByDbIdPartial = true; + } + + $collCcShowInstancessRelatedByDbId->getInternalIterator()->rewind(); + + return $collCcShowInstancessRelatedByDbId; + } + + if ($partial && $this->collCcShowInstancessRelatedByDbId) { + foreach ($this->collCcShowInstancessRelatedByDbId as $obj) { + if ($obj->isNew()) { + $collCcShowInstancessRelatedByDbId[] = $obj; + } + } + } + + $this->collCcShowInstancessRelatedByDbId = $collCcShowInstancessRelatedByDbId; + $this->collCcShowInstancessRelatedByDbIdPartial = false; + } + } + + return $this->collCcShowInstancessRelatedByDbId; + } + + /** + * Sets a collection of CcShowInstancesRelatedByDbId objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccShowInstancessRelatedByDbId A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcShowInstances The current object (for fluent API support) + */ + public function setCcShowInstancessRelatedByDbId(PropelCollection $ccShowInstancessRelatedByDbId, PropelPDO $con = null) + { + $ccShowInstancessRelatedByDbIdToDelete = $this->getCcShowInstancessRelatedByDbId(new Criteria(), $con)->diff($ccShowInstancessRelatedByDbId); + + + $this->ccShowInstancessRelatedByDbIdScheduledForDeletion = $ccShowInstancessRelatedByDbIdToDelete; + + foreach ($ccShowInstancessRelatedByDbIdToDelete as $ccShowInstancesRelatedByDbIdRemoved) { + $ccShowInstancesRelatedByDbIdRemoved->setCcShowInstancesRelatedByDbOriginalShow(null); + } + + $this->collCcShowInstancessRelatedByDbId = null; + foreach ($ccShowInstancessRelatedByDbId as $ccShowInstancesRelatedByDbId) { + $this->addCcShowInstancesRelatedByDbId($ccShowInstancesRelatedByDbId); + } + + $this->collCcShowInstancessRelatedByDbId = $ccShowInstancessRelatedByDbId; + $this->collCcShowInstancessRelatedByDbIdPartial = false; + + return $this; + } + + /** + * Returns the number of related CcShowInstances objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcShowInstances objects. + * @throws PropelException + */ + public function countCcShowInstancessRelatedByDbId(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcShowInstancessRelatedByDbIdPartial && !$this->isNew(); + if (null === $this->collCcShowInstancessRelatedByDbId || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowInstancessRelatedByDbId) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcShowInstancessRelatedByDbId()); + } + $query = CcShowInstancesQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcShowInstancesRelatedByDbOriginalShow($this) + ->count($con); + } + + return count($this->collCcShowInstancessRelatedByDbId); + } + + /** + * Method called to associate a CcShowInstances object to this object + * through the CcShowInstances foreign key attribute. + * + * @param CcShowInstances $l CcShowInstances + * @return CcShowInstances The current object (for fluent API support) + */ + public function addCcShowInstancesRelatedByDbId(CcShowInstances $l) + { + if ($this->collCcShowInstancessRelatedByDbId === null) { + $this->initCcShowInstancessRelatedByDbId(); + $this->collCcShowInstancessRelatedByDbIdPartial = true; + } + + if (!in_array($l, $this->collCcShowInstancessRelatedByDbId->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcShowInstancesRelatedByDbId($l); + + if ($this->ccShowInstancessRelatedByDbIdScheduledForDeletion and $this->ccShowInstancessRelatedByDbIdScheduledForDeletion->contains($l)) { + $this->ccShowInstancessRelatedByDbIdScheduledForDeletion->remove($this->ccShowInstancessRelatedByDbIdScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcShowInstancesRelatedByDbId $ccShowInstancesRelatedByDbId The ccShowInstancesRelatedByDbId object to add. + */ + protected function doAddCcShowInstancesRelatedByDbId($ccShowInstancesRelatedByDbId) + { + $this->collCcShowInstancessRelatedByDbId[]= $ccShowInstancesRelatedByDbId; + $ccShowInstancesRelatedByDbId->setCcShowInstancesRelatedByDbOriginalShow($this); + } + + /** + * @param CcShowInstancesRelatedByDbId $ccShowInstancesRelatedByDbId The ccShowInstancesRelatedByDbId object to remove. + * @return CcShowInstances The current object (for fluent API support) + */ + public function removeCcShowInstancesRelatedByDbId($ccShowInstancesRelatedByDbId) + { + if ($this->getCcShowInstancessRelatedByDbId()->contains($ccShowInstancesRelatedByDbId)) { + $this->collCcShowInstancessRelatedByDbId->remove($this->collCcShowInstancessRelatedByDbId->search($ccShowInstancesRelatedByDbId)); + if (null === $this->ccShowInstancessRelatedByDbIdScheduledForDeletion) { + $this->ccShowInstancessRelatedByDbIdScheduledForDeletion = clone $this->collCcShowInstancessRelatedByDbId; + $this->ccShowInstancessRelatedByDbIdScheduledForDeletion->clear(); + } + $this->ccShowInstancessRelatedByDbIdScheduledForDeletion[]= $ccShowInstancesRelatedByDbId; + $ccShowInstancesRelatedByDbId->setCcShowInstancesRelatedByDbOriginalShow(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcShowInstances is new, it will return + * an empty collection; or if this CcShowInstances has previously + * been saved, it will retrieve related CcShowInstancessRelatedByDbId from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcShowInstances. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcShowInstances[] List of CcShowInstances objects + */ + public function getCcShowInstancessRelatedByDbIdJoinCcShow($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcShowInstancesQuery::create(null, $criteria); + $query->joinWith('CcShow', $join_behavior); + + return $this->getCcShowInstancessRelatedByDbId($query, $con); + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcShowInstances is new, it will return + * an empty collection; or if this CcShowInstances has previously + * been saved, it will retrieve related CcShowInstancessRelatedByDbId from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcShowInstances. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcShowInstances[] List of CcShowInstances objects + */ + public function getCcShowInstancessRelatedByDbIdJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcShowInstancesQuery::create(null, $criteria); + $query->joinWith('CcFiles', $join_behavior); + + return $this->getCcShowInstancessRelatedByDbId($query, $con); + } + + /** + * Clears out the collCcSchedules collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcShowInstances The current object (for fluent API support) + * @see addCcSchedules() + */ + public function clearCcSchedules() + { + $this->collCcSchedules = null; // important to set this to null since that means it is uninitialized + $this->collCcSchedulesPartial = null; + + return $this; + } + + /** + * reset is the collCcSchedules collection loaded partially + * + * @return void + */ + public function resetPartialCcSchedules($v = true) + { + $this->collCcSchedulesPartial = $v; + } + + /** + * Initializes the collCcSchedules collection. + * + * By default this just sets the collCcSchedules collection to an empty array (like clearcollCcSchedules()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcSchedules($overrideExisting = true) + { + if (null !== $this->collCcSchedules && !$overrideExisting) { + return; + } + $this->collCcSchedules = new PropelObjectCollection(); + $this->collCcSchedules->setModel('CcSchedule'); + } + + /** + * Gets an array of CcSchedule objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcShowInstances is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcSchedule[] List of CcSchedule objects + * @throws PropelException + */ + public function getCcSchedules($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcSchedulesPartial && !$this->isNew(); + if (null === $this->collCcSchedules || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcSchedules) { + // return empty collection + $this->initCcSchedules(); + } else { + $collCcSchedules = CcScheduleQuery::create(null, $criteria) + ->filterByCcShowInstances($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcSchedulesPartial && count($collCcSchedules)) { + $this->initCcSchedules(false); + + foreach ($collCcSchedules as $obj) { + if (false == $this->collCcSchedules->contains($obj)) { + $this->collCcSchedules->append($obj); + } + } + + $this->collCcSchedulesPartial = true; + } + + $collCcSchedules->getInternalIterator()->rewind(); + + return $collCcSchedules; + } + + if ($partial && $this->collCcSchedules) { + foreach ($this->collCcSchedules as $obj) { + if ($obj->isNew()) { + $collCcSchedules[] = $obj; + } + } + } + + $this->collCcSchedules = $collCcSchedules; + $this->collCcSchedulesPartial = false; + } + } + + return $this->collCcSchedules; + } + + /** + * Sets a collection of CcSchedule objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccSchedules A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcShowInstances The current object (for fluent API support) + */ + public function setCcSchedules(PropelCollection $ccSchedules, PropelPDO $con = null) + { + $ccSchedulesToDelete = $this->getCcSchedules(new Criteria(), $con)->diff($ccSchedules); + + + $this->ccSchedulesScheduledForDeletion = $ccSchedulesToDelete; + + foreach ($ccSchedulesToDelete as $ccScheduleRemoved) { + $ccScheduleRemoved->setCcShowInstances(null); + } + + $this->collCcSchedules = null; + foreach ($ccSchedules as $ccSchedule) { + $this->addCcSchedule($ccSchedule); + } + + $this->collCcSchedules = $ccSchedules; + $this->collCcSchedulesPartial = false; + + return $this; + } + + /** + * Returns the number of related CcSchedule objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcSchedule objects. + * @throws PropelException + */ + public function countCcSchedules(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcSchedulesPartial && !$this->isNew(); + if (null === $this->collCcSchedules || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcSchedules) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcSchedules()); + } + $query = CcScheduleQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcShowInstances($this) + ->count($con); + } + + return count($this->collCcSchedules); + } + + /** + * Method called to associate a CcSchedule object to this object + * through the CcSchedule foreign key attribute. + * + * @param CcSchedule $l CcSchedule + * @return CcShowInstances The current object (for fluent API support) + */ + public function addCcSchedule(CcSchedule $l) + { + if ($this->collCcSchedules === null) { + $this->initCcSchedules(); + $this->collCcSchedulesPartial = true; + } + + if (!in_array($l, $this->collCcSchedules->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcSchedule($l); + + if ($this->ccSchedulesScheduledForDeletion and $this->ccSchedulesScheduledForDeletion->contains($l)) { + $this->ccSchedulesScheduledForDeletion->remove($this->ccSchedulesScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcSchedule $ccSchedule The ccSchedule object to add. + */ + protected function doAddCcSchedule($ccSchedule) + { + $this->collCcSchedules[]= $ccSchedule; + $ccSchedule->setCcShowInstances($this); + } + + /** + * @param CcSchedule $ccSchedule The ccSchedule object to remove. + * @return CcShowInstances The current object (for fluent API support) + */ + public function removeCcSchedule($ccSchedule) + { + if ($this->getCcSchedules()->contains($ccSchedule)) { + $this->collCcSchedules->remove($this->collCcSchedules->search($ccSchedule)); + if (null === $this->ccSchedulesScheduledForDeletion) { + $this->ccSchedulesScheduledForDeletion = clone $this->collCcSchedules; + $this->ccSchedulesScheduledForDeletion->clear(); + } + $this->ccSchedulesScheduledForDeletion[]= clone $ccSchedule; + $ccSchedule->setCcShowInstances(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcShowInstances is new, it will return + * an empty collection; or if this CcShowInstances has previously + * been saved, it will retrieve related CcSchedules from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcShowInstances. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcSchedule[] List of CcSchedule objects + */ + public function getCcSchedulesJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcScheduleQuery::create(null, $criteria); + $query->joinWith('CcFiles', $join_behavior); + + return $this->getCcSchedules($query, $con); + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcShowInstances is new, it will return + * an empty collection; or if this CcShowInstances has previously + * been saved, it will retrieve related CcSchedules from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcShowInstances. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcSchedule[] List of CcSchedule objects + */ + public function getCcSchedulesJoinCcWebstream($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcScheduleQuery::create(null, $criteria); + $query->joinWith('CcWebstream', $join_behavior); + + return $this->getCcSchedules($query, $con); + } + + /** + * Clears out the collCcPlayoutHistorys collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcShowInstances The current object (for fluent API support) + * @see addCcPlayoutHistorys() + */ + public function clearCcPlayoutHistorys() + { + $this->collCcPlayoutHistorys = null; // important to set this to null since that means it is uninitialized + $this->collCcPlayoutHistorysPartial = null; + + return $this; + } + + /** + * reset is the collCcPlayoutHistorys collection loaded partially + * + * @return void + */ + public function resetPartialCcPlayoutHistorys($v = true) + { + $this->collCcPlayoutHistorysPartial = $v; + } + + /** + * Initializes the collCcPlayoutHistorys collection. + * + * By default this just sets the collCcPlayoutHistorys collection to an empty array (like clearcollCcPlayoutHistorys()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcPlayoutHistorys($overrideExisting = true) + { + if (null !== $this->collCcPlayoutHistorys && !$overrideExisting) { + return; + } + $this->collCcPlayoutHistorys = new PropelObjectCollection(); + $this->collCcPlayoutHistorys->setModel('CcPlayoutHistory'); + } + + /** + * Gets an array of CcPlayoutHistory objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcShowInstances is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcPlayoutHistory[] List of CcPlayoutHistory objects + * @throws PropelException + */ + public function getCcPlayoutHistorys($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcPlayoutHistorysPartial && !$this->isNew(); + if (null === $this->collCcPlayoutHistorys || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlayoutHistorys) { + // return empty collection + $this->initCcPlayoutHistorys(); + } else { + $collCcPlayoutHistorys = CcPlayoutHistoryQuery::create(null, $criteria) + ->filterByCcShowInstances($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcPlayoutHistorysPartial && count($collCcPlayoutHistorys)) { + $this->initCcPlayoutHistorys(false); + + foreach ($collCcPlayoutHistorys as $obj) { + if (false == $this->collCcPlayoutHistorys->contains($obj)) { + $this->collCcPlayoutHistorys->append($obj); + } + } + + $this->collCcPlayoutHistorysPartial = true; + } + + $collCcPlayoutHistorys->getInternalIterator()->rewind(); + + return $collCcPlayoutHistorys; + } + + if ($partial && $this->collCcPlayoutHistorys) { + foreach ($this->collCcPlayoutHistorys as $obj) { + if ($obj->isNew()) { + $collCcPlayoutHistorys[] = $obj; + } + } + } + + $this->collCcPlayoutHistorys = $collCcPlayoutHistorys; + $this->collCcPlayoutHistorysPartial = false; + } + } + + return $this->collCcPlayoutHistorys; + } + + /** + * Sets a collection of CcPlayoutHistory objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccPlayoutHistorys A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcShowInstances The current object (for fluent API support) + */ + public function setCcPlayoutHistorys(PropelCollection $ccPlayoutHistorys, PropelPDO $con = null) + { + $ccPlayoutHistorysToDelete = $this->getCcPlayoutHistorys(new Criteria(), $con)->diff($ccPlayoutHistorys); + + + $this->ccPlayoutHistorysScheduledForDeletion = $ccPlayoutHistorysToDelete; + + foreach ($ccPlayoutHistorysToDelete as $ccPlayoutHistoryRemoved) { + $ccPlayoutHistoryRemoved->setCcShowInstances(null); + } + + $this->collCcPlayoutHistorys = null; + foreach ($ccPlayoutHistorys as $ccPlayoutHistory) { + $this->addCcPlayoutHistory($ccPlayoutHistory); + } + + $this->collCcPlayoutHistorys = $ccPlayoutHistorys; + $this->collCcPlayoutHistorysPartial = false; + + return $this; + } + + /** + * Returns the number of related CcPlayoutHistory objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcPlayoutHistory objects. + * @throws PropelException + */ + public function countCcPlayoutHistorys(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcPlayoutHistorysPartial && !$this->isNew(); + if (null === $this->collCcPlayoutHistorys || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlayoutHistorys) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcPlayoutHistorys()); + } + $query = CcPlayoutHistoryQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcShowInstances($this) + ->count($con); + } + + return count($this->collCcPlayoutHistorys); + } + + /** + * Method called to associate a CcPlayoutHistory object to this object + * through the CcPlayoutHistory foreign key attribute. + * + * @param CcPlayoutHistory $l CcPlayoutHistory + * @return CcShowInstances The current object (for fluent API support) + */ + public function addCcPlayoutHistory(CcPlayoutHistory $l) + { + if ($this->collCcPlayoutHistorys === null) { + $this->initCcPlayoutHistorys(); + $this->collCcPlayoutHistorysPartial = true; + } + + if (!in_array($l, $this->collCcPlayoutHistorys->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcPlayoutHistory($l); + + if ($this->ccPlayoutHistorysScheduledForDeletion and $this->ccPlayoutHistorysScheduledForDeletion->contains($l)) { + $this->ccPlayoutHistorysScheduledForDeletion->remove($this->ccPlayoutHistorysScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcPlayoutHistory $ccPlayoutHistory The ccPlayoutHistory object to add. + */ + protected function doAddCcPlayoutHistory($ccPlayoutHistory) + { + $this->collCcPlayoutHistorys[]= $ccPlayoutHistory; + $ccPlayoutHistory->setCcShowInstances($this); + } + + /** + * @param CcPlayoutHistory $ccPlayoutHistory The ccPlayoutHistory object to remove. + * @return CcShowInstances The current object (for fluent API support) + */ + public function removeCcPlayoutHistory($ccPlayoutHistory) + { + if ($this->getCcPlayoutHistorys()->contains($ccPlayoutHistory)) { + $this->collCcPlayoutHistorys->remove($this->collCcPlayoutHistorys->search($ccPlayoutHistory)); + if (null === $this->ccPlayoutHistorysScheduledForDeletion) { + $this->ccPlayoutHistorysScheduledForDeletion = clone $this->collCcPlayoutHistorys; + $this->ccPlayoutHistorysScheduledForDeletion->clear(); + } + $this->ccPlayoutHistorysScheduledForDeletion[]= $ccPlayoutHistory; + $ccPlayoutHistory->setCcShowInstances(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcShowInstances is new, it will return + * an empty collection; or if this CcShowInstances has previously + * been saved, it will retrieve related CcPlayoutHistorys from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcShowInstances. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcPlayoutHistory[] List of CcPlayoutHistory objects + */ + public function getCcPlayoutHistorysJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcPlayoutHistoryQuery::create(null, $criteria); + $query->joinWith('CcFiles', $join_behavior); + + return $this->getCcPlayoutHistorys($query, $con); + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->starts = null; + $this->ends = null; + $this->show_id = null; + $this->record = null; + $this->rebroadcast = null; + $this->instance_id = null; + $this->file_id = null; + $this->time_filled = null; + $this->created = null; + $this->last_scheduled = null; + $this->modified_instance = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCcShowInstancessRelatedByDbId) { + foreach ($this->collCcShowInstancessRelatedByDbId as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcSchedules) { + foreach ($this->collCcSchedules as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcPlayoutHistorys) { + foreach ($this->collCcPlayoutHistorys as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->aCcShow instanceof Persistent) { + $this->aCcShow->clearAllReferences($deep); + } + if ($this->aCcShowInstancesRelatedByDbOriginalShow instanceof Persistent) { + $this->aCcShowInstancesRelatedByDbOriginalShow->clearAllReferences($deep); + } + if ($this->aCcFiles instanceof Persistent) { + $this->aCcFiles->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + if ($this->collCcShowInstancessRelatedByDbId instanceof PropelCollection) { + $this->collCcShowInstancessRelatedByDbId->clearIterator(); + } + $this->collCcShowInstancessRelatedByDbId = null; + if ($this->collCcSchedules instanceof PropelCollection) { + $this->collCcSchedules->clearIterator(); + } + $this->collCcSchedules = null; + if ($this->collCcPlayoutHistorys instanceof PropelCollection) { + $this->collCcPlayoutHistorys->clearIterator(); + } + $this->collCcPlayoutHistorys = null; + $this->aCcShow = null; + $this->aCcShowInstancesRelatedByDbOriginalShow = null; + $this->aCcFiles = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcShowInstancesPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowInstancesPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcShowInstancesPeer.php index ad91f182cc..3558b15ddc 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowInstancesPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowInstancesPeer.php @@ -4,1561 +4,1595 @@ /** * Base static class for performing query and update operations on the 'cc_show_instances' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcShowInstancesPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_show_instances'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcShowInstances'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcShowInstances'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcShowInstancesTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 12; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_show_instances.ID'; - - /** the column name for the STARTS field */ - const STARTS = 'cc_show_instances.STARTS'; - - /** the column name for the ENDS field */ - const ENDS = 'cc_show_instances.ENDS'; - - /** the column name for the SHOW_ID field */ - const SHOW_ID = 'cc_show_instances.SHOW_ID'; - - /** the column name for the RECORD field */ - const RECORD = 'cc_show_instances.RECORD'; - - /** the column name for the REBROADCAST field */ - const REBROADCAST = 'cc_show_instances.REBROADCAST'; - - /** the column name for the INSTANCE_ID field */ - const INSTANCE_ID = 'cc_show_instances.INSTANCE_ID'; - - /** the column name for the FILE_ID field */ - const FILE_ID = 'cc_show_instances.FILE_ID'; - - /** the column name for the TIME_FILLED field */ - const TIME_FILLED = 'cc_show_instances.TIME_FILLED'; - - /** the column name for the CREATED field */ - const CREATED = 'cc_show_instances.CREATED'; - - /** the column name for the LAST_SCHEDULED field */ - const LAST_SCHEDULED = 'cc_show_instances.LAST_SCHEDULED'; - - /** the column name for the MODIFIED_INSTANCE field */ - const MODIFIED_INSTANCE = 'cc_show_instances.MODIFIED_INSTANCE'; - - /** - * An identiy map to hold any loaded instances of CcShowInstances objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcShowInstances[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbStarts', 'DbEnds', 'DbShowId', 'DbRecord', 'DbRebroadcast', 'DbOriginalShow', 'DbRecordedFile', 'DbTimeFilled', 'DbCreated', 'DbLastScheduled', 'DbModifiedInstance', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbStarts', 'dbEnds', 'dbShowId', 'dbRecord', 'dbRebroadcast', 'dbOriginalShow', 'dbRecordedFile', 'dbTimeFilled', 'dbCreated', 'dbLastScheduled', 'dbModifiedInstance', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::STARTS, self::ENDS, self::SHOW_ID, self::RECORD, self::REBROADCAST, self::INSTANCE_ID, self::FILE_ID, self::TIME_FILLED, self::CREATED, self::LAST_SCHEDULED, self::MODIFIED_INSTANCE, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'STARTS', 'ENDS', 'SHOW_ID', 'RECORD', 'REBROADCAST', 'INSTANCE_ID', 'FILE_ID', 'TIME_FILLED', 'CREATED', 'LAST_SCHEDULED', 'MODIFIED_INSTANCE', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'starts', 'ends', 'show_id', 'record', 'rebroadcast', 'instance_id', 'file_id', 'time_filled', 'created', 'last_scheduled', 'modified_instance', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbStarts' => 1, 'DbEnds' => 2, 'DbShowId' => 3, 'DbRecord' => 4, 'DbRebroadcast' => 5, 'DbOriginalShow' => 6, 'DbRecordedFile' => 7, 'DbTimeFilled' => 8, 'DbCreated' => 9, 'DbLastScheduled' => 10, 'DbModifiedInstance' => 11, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbStarts' => 1, 'dbEnds' => 2, 'dbShowId' => 3, 'dbRecord' => 4, 'dbRebroadcast' => 5, 'dbOriginalShow' => 6, 'dbRecordedFile' => 7, 'dbTimeFilled' => 8, 'dbCreated' => 9, 'dbLastScheduled' => 10, 'dbModifiedInstance' => 11, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::STARTS => 1, self::ENDS => 2, self::SHOW_ID => 3, self::RECORD => 4, self::REBROADCAST => 5, self::INSTANCE_ID => 6, self::FILE_ID => 7, self::TIME_FILLED => 8, self::CREATED => 9, self::LAST_SCHEDULED => 10, self::MODIFIED_INSTANCE => 11, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'STARTS' => 1, 'ENDS' => 2, 'SHOW_ID' => 3, 'RECORD' => 4, 'REBROADCAST' => 5, 'INSTANCE_ID' => 6, 'FILE_ID' => 7, 'TIME_FILLED' => 8, 'CREATED' => 9, 'LAST_SCHEDULED' => 10, 'MODIFIED_INSTANCE' => 11, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'starts' => 1, 'ends' => 2, 'show_id' => 3, 'record' => 4, 'rebroadcast' => 5, 'instance_id' => 6, 'file_id' => 7, 'time_filled' => 8, 'created' => 9, 'last_scheduled' => 10, 'modified_instance' => 11, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcShowInstancesPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcShowInstancesPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcShowInstancesPeer::ID); - $criteria->addSelectColumn(CcShowInstancesPeer::STARTS); - $criteria->addSelectColumn(CcShowInstancesPeer::ENDS); - $criteria->addSelectColumn(CcShowInstancesPeer::SHOW_ID); - $criteria->addSelectColumn(CcShowInstancesPeer::RECORD); - $criteria->addSelectColumn(CcShowInstancesPeer::REBROADCAST); - $criteria->addSelectColumn(CcShowInstancesPeer::INSTANCE_ID); - $criteria->addSelectColumn(CcShowInstancesPeer::FILE_ID); - $criteria->addSelectColumn(CcShowInstancesPeer::TIME_FILLED); - $criteria->addSelectColumn(CcShowInstancesPeer::CREATED); - $criteria->addSelectColumn(CcShowInstancesPeer::LAST_SCHEDULED); - $criteria->addSelectColumn(CcShowInstancesPeer::MODIFIED_INSTANCE); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.STARTS'); - $criteria->addSelectColumn($alias . '.ENDS'); - $criteria->addSelectColumn($alias . '.SHOW_ID'); - $criteria->addSelectColumn($alias . '.RECORD'); - $criteria->addSelectColumn($alias . '.REBROADCAST'); - $criteria->addSelectColumn($alias . '.INSTANCE_ID'); - $criteria->addSelectColumn($alias . '.FILE_ID'); - $criteria->addSelectColumn($alias . '.TIME_FILLED'); - $criteria->addSelectColumn($alias . '.CREATED'); - $criteria->addSelectColumn($alias . '.LAST_SCHEDULED'); - $criteria->addSelectColumn($alias . '.MODIFIED_INSTANCE'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowInstancesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcShowInstances - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcShowInstancesPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcShowInstancesPeer::populateObjects(CcShowInstancesPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcShowInstancesPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcShowInstances $value A CcShowInstances object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcShowInstances $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcShowInstances object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcShowInstances) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcShowInstances object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcShowInstances Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_show_instances - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - // Invalidate objects in CcShowInstancesPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcShowInstancesPeer::clearInstancePool(); - // Invalidate objects in CcSchedulePeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcSchedulePeer::clearInstancePool(); - // Invalidate objects in CcPlayoutHistoryPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcPlayoutHistoryPeer::clearInstancePool(); - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcShowInstancesPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcShowInstancesPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcShowInstancesPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcShowInstances object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcShowInstancesPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcShowInstancesPeer::NUM_COLUMNS; - } else { - $cls = CcShowInstancesPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcShowInstancesPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcShow table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowInstancesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcFiles table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowInstancesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcShowInstances objects pre-filled with their CcShow objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowInstances objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowInstancesPeer::addSelectColumns($criteria); - $startcol = (CcShowInstancesPeer::NUM_COLUMNS - CcShowInstancesPeer::NUM_LAZY_LOAD_COLUMNS); - CcShowPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowInstancesPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcShowInstancesPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowInstancesPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcShowPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcShowPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcShowInstances) to $obj2 (CcShow) - $obj2->addCcShowInstances($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcShowInstances objects pre-filled with their CcFiles objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowInstances objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowInstancesPeer::addSelectColumns($criteria); - $startcol = (CcShowInstancesPeer::NUM_COLUMNS - CcShowInstancesPeer::NUM_LAZY_LOAD_COLUMNS); - CcFilesPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowInstancesPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcShowInstancesPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowInstancesPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcShowInstances) to $obj2 (CcFiles) - $obj2->addCcShowInstances($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowInstancesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcShowInstances objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowInstances objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowInstancesPeer::addSelectColumns($criteria); - $startcol2 = (CcShowInstancesPeer::NUM_COLUMNS - CcShowInstancesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcShowPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcShowPeer::NUM_COLUMNS - CcShowPeer::NUM_LAZY_LOAD_COLUMNS); - - CcFilesPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowInstancesPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcShowInstancesPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowInstancesPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcShow rows - - $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcShowPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcShowPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcShowInstances) to the collection in $obj2 (CcShow) - $obj2->addCcShowInstances($obj1); - } // if joined row not null - - // Add objects for joined CcFiles rows - - $key3 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcFilesPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcFilesPeer::addInstanceToPool($obj3, $key3); - } // if obj3 loaded - - // Add the $obj1 (CcShowInstances) to the collection in $obj3 (CcFiles) - $obj3->addCcShowInstances($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcShow table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowInstancesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcShowInstancesRelatedByDbOriginalShow table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcShowInstancesRelatedByDbOriginalShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowInstancesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Returns the number of rows matching criteria, joining the related CcFiles table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAllExceptCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowInstancesPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcShowInstances objects pre-filled with all related objects except CcShow. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowInstances objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowInstancesPeer::addSelectColumns($criteria); - $startcol2 = (CcShowInstancesPeer::NUM_COLUMNS - CcShowInstancesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcFilesPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowInstancesPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcShowInstancesPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowInstancesPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcFiles rows - - $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcFilesPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcFilesPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcShowInstances) to the collection in $obj2 (CcFiles) - $obj2->addCcShowInstances($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcShowInstances objects pre-filled with all related objects except CcShowInstancesRelatedByDbOriginalShow. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowInstances objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcShowInstancesRelatedByDbOriginalShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowInstancesPeer::addSelectColumns($criteria); - $startcol2 = (CcShowInstancesPeer::NUM_COLUMNS - CcShowInstancesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcShowPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcShowPeer::NUM_COLUMNS - CcShowPeer::NUM_LAZY_LOAD_COLUMNS); - - CcFilesPeer::addSelectColumns($criteria); - $startcol4 = $startcol3 + (CcFilesPeer::NUM_COLUMNS - CcFilesPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowInstancesPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcShowInstancesPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowInstancesPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcShow rows - - $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcShowPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcShowPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcShowInstances) to the collection in $obj2 (CcShow) - $obj2->addCcShowInstances($obj1); - - } // if joined row is not null - - // Add objects for joined CcFiles rows - - $key3 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol3); - if ($key3 !== null) { - $obj3 = CcFilesPeer::getInstanceFromPool($key3); - if (!$obj3) { - - $cls = CcFilesPeer::getOMClass(false); - - $obj3 = new $cls(); - $obj3->hydrate($row, $startcol3); - CcFilesPeer::addInstanceToPool($obj3, $key3); - } // if $obj3 already loaded - - // Add the $obj1 (CcShowInstances) to the collection in $obj3 (CcFiles) - $obj3->addCcShowInstances($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Selects a collection of CcShowInstances objects pre-filled with all related objects except CcFiles. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowInstances objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExceptCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - // $criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowInstancesPeer::addSelectColumns($criteria); - $startcol2 = (CcShowInstancesPeer::NUM_COLUMNS - CcShowInstancesPeer::NUM_LAZY_LOAD_COLUMNS); - - CcShowPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcShowPeer::NUM_COLUMNS - CcShowPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowInstancesPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcShowInstancesPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowInstancesPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcShow rows - - $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcShowPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcShowPeer::addInstanceToPool($obj2, $key2); - } // if $obj2 already loaded - - // Add the $obj1 (CcShowInstances) to the collection in $obj2 (CcShow) - $obj2->addCcShowInstances($obj1); - - } // if joined row is not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcShowInstancesPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcShowInstancesPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcShowInstancesTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcShowInstancesPeer::CLASS_DEFAULT : CcShowInstancesPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcShowInstances or Criteria object. - * - * @param mixed $values Criteria or CcShowInstances object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcShowInstances object - } - - if ($criteria->containsKey(CcShowInstancesPeer::ID) && $criteria->keyContainsValue(CcShowInstancesPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowInstancesPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcShowInstances or Criteria object. - * - * @param mixed $values Criteria or CcShowInstances object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcShowInstancesPeer::ID); - $value = $criteria->remove(CcShowInstancesPeer::ID); - if ($value) { - $selectCriteria->add(CcShowInstancesPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); - } - - } else { // $values is CcShowInstances object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_show_instances table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcShowInstancesPeer::TABLE_NAME, $con, CcShowInstancesPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcShowInstancesPeer::clearInstancePool(); - CcShowInstancesPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcShowInstances or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcShowInstances object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcShowInstancesPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcShowInstances) { // it's a model object - // invalidate the cache for this single object - CcShowInstancesPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcShowInstancesPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcShowInstancesPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcShowInstancesPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcShowInstances object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcShowInstances $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcShowInstances $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcShowInstancesPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcShowInstancesPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcShowInstancesPeer::DATABASE_NAME, CcShowInstancesPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcShowInstances - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcShowInstancesPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcShowInstancesPeer::DATABASE_NAME); - $criteria->add(CcShowInstancesPeer::ID, $pk); - - $v = CcShowInstancesPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcShowInstancesPeer::DATABASE_NAME); - $criteria->add(CcShowInstancesPeer::ID, $pks, Criteria::IN); - $objs = CcShowInstancesPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcShowInstancesPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_show_instances'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcShowInstances'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcShowInstancesTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 12; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 12; + + /** the column name for the id field */ + const ID = 'cc_show_instances.id'; + + /** the column name for the starts field */ + const STARTS = 'cc_show_instances.starts'; + + /** the column name for the ends field */ + const ENDS = 'cc_show_instances.ends'; + + /** the column name for the show_id field */ + const SHOW_ID = 'cc_show_instances.show_id'; + + /** the column name for the record field */ + const RECORD = 'cc_show_instances.record'; + + /** the column name for the rebroadcast field */ + const REBROADCAST = 'cc_show_instances.rebroadcast'; + + /** the column name for the instance_id field */ + const INSTANCE_ID = 'cc_show_instances.instance_id'; + + /** the column name for the file_id field */ + const FILE_ID = 'cc_show_instances.file_id'; + + /** the column name for the time_filled field */ + const TIME_FILLED = 'cc_show_instances.time_filled'; + + /** the column name for the created field */ + const CREATED = 'cc_show_instances.created'; + + /** the column name for the last_scheduled field */ + const LAST_SCHEDULED = 'cc_show_instances.last_scheduled'; + + /** the column name for the modified_instance field */ + const MODIFIED_INSTANCE = 'cc_show_instances.modified_instance'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcShowInstances objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcShowInstances[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcShowInstancesPeer::$fieldNames[CcShowInstancesPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbStarts', 'DbEnds', 'DbShowId', 'DbRecord', 'DbRebroadcast', 'DbOriginalShow', 'DbRecordedFile', 'DbTimeFilled', 'DbCreated', 'DbLastScheduled', 'DbModifiedInstance', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbStarts', 'dbEnds', 'dbShowId', 'dbRecord', 'dbRebroadcast', 'dbOriginalShow', 'dbRecordedFile', 'dbTimeFilled', 'dbCreated', 'dbLastScheduled', 'dbModifiedInstance', ), + BasePeer::TYPE_COLNAME => array (CcShowInstancesPeer::ID, CcShowInstancesPeer::STARTS, CcShowInstancesPeer::ENDS, CcShowInstancesPeer::SHOW_ID, CcShowInstancesPeer::RECORD, CcShowInstancesPeer::REBROADCAST, CcShowInstancesPeer::INSTANCE_ID, CcShowInstancesPeer::FILE_ID, CcShowInstancesPeer::TIME_FILLED, CcShowInstancesPeer::CREATED, CcShowInstancesPeer::LAST_SCHEDULED, CcShowInstancesPeer::MODIFIED_INSTANCE, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'STARTS', 'ENDS', 'SHOW_ID', 'RECORD', 'REBROADCAST', 'INSTANCE_ID', 'FILE_ID', 'TIME_FILLED', 'CREATED', 'LAST_SCHEDULED', 'MODIFIED_INSTANCE', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'starts', 'ends', 'show_id', 'record', 'rebroadcast', 'instance_id', 'file_id', 'time_filled', 'created', 'last_scheduled', 'modified_instance', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcShowInstancesPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbStarts' => 1, 'DbEnds' => 2, 'DbShowId' => 3, 'DbRecord' => 4, 'DbRebroadcast' => 5, 'DbOriginalShow' => 6, 'DbRecordedFile' => 7, 'DbTimeFilled' => 8, 'DbCreated' => 9, 'DbLastScheduled' => 10, 'DbModifiedInstance' => 11, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbStarts' => 1, 'dbEnds' => 2, 'dbShowId' => 3, 'dbRecord' => 4, 'dbRebroadcast' => 5, 'dbOriginalShow' => 6, 'dbRecordedFile' => 7, 'dbTimeFilled' => 8, 'dbCreated' => 9, 'dbLastScheduled' => 10, 'dbModifiedInstance' => 11, ), + BasePeer::TYPE_COLNAME => array (CcShowInstancesPeer::ID => 0, CcShowInstancesPeer::STARTS => 1, CcShowInstancesPeer::ENDS => 2, CcShowInstancesPeer::SHOW_ID => 3, CcShowInstancesPeer::RECORD => 4, CcShowInstancesPeer::REBROADCAST => 5, CcShowInstancesPeer::INSTANCE_ID => 6, CcShowInstancesPeer::FILE_ID => 7, CcShowInstancesPeer::TIME_FILLED => 8, CcShowInstancesPeer::CREATED => 9, CcShowInstancesPeer::LAST_SCHEDULED => 10, CcShowInstancesPeer::MODIFIED_INSTANCE => 11, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'STARTS' => 1, 'ENDS' => 2, 'SHOW_ID' => 3, 'RECORD' => 4, 'REBROADCAST' => 5, 'INSTANCE_ID' => 6, 'FILE_ID' => 7, 'TIME_FILLED' => 8, 'CREATED' => 9, 'LAST_SCHEDULED' => 10, 'MODIFIED_INSTANCE' => 11, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'starts' => 1, 'ends' => 2, 'show_id' => 3, 'record' => 4, 'rebroadcast' => 5, 'instance_id' => 6, 'file_id' => 7, 'time_filled' => 8, 'created' => 9, 'last_scheduled' => 10, 'modified_instance' => 11, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcShowInstancesPeer::getFieldNames($toType); + $key = isset(CcShowInstancesPeer::$fieldKeys[$fromType][$name]) ? CcShowInstancesPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcShowInstancesPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcShowInstancesPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcShowInstancesPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcShowInstancesPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcShowInstancesPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcShowInstancesPeer::ID); + $criteria->addSelectColumn(CcShowInstancesPeer::STARTS); + $criteria->addSelectColumn(CcShowInstancesPeer::ENDS); + $criteria->addSelectColumn(CcShowInstancesPeer::SHOW_ID); + $criteria->addSelectColumn(CcShowInstancesPeer::RECORD); + $criteria->addSelectColumn(CcShowInstancesPeer::REBROADCAST); + $criteria->addSelectColumn(CcShowInstancesPeer::INSTANCE_ID); + $criteria->addSelectColumn(CcShowInstancesPeer::FILE_ID); + $criteria->addSelectColumn(CcShowInstancesPeer::TIME_FILLED); + $criteria->addSelectColumn(CcShowInstancesPeer::CREATED); + $criteria->addSelectColumn(CcShowInstancesPeer::LAST_SCHEDULED); + $criteria->addSelectColumn(CcShowInstancesPeer::MODIFIED_INSTANCE); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.starts'); + $criteria->addSelectColumn($alias . '.ends'); + $criteria->addSelectColumn($alias . '.show_id'); + $criteria->addSelectColumn($alias . '.record'); + $criteria->addSelectColumn($alias . '.rebroadcast'); + $criteria->addSelectColumn($alias . '.instance_id'); + $criteria->addSelectColumn($alias . '.file_id'); + $criteria->addSelectColumn($alias . '.time_filled'); + $criteria->addSelectColumn($alias . '.created'); + $criteria->addSelectColumn($alias . '.last_scheduled'); + $criteria->addSelectColumn($alias . '.modified_instance'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowInstancesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcShowInstances + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcShowInstancesPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcShowInstancesPeer::populateObjects(CcShowInstancesPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcShowInstancesPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcShowInstances $obj A CcShowInstances object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcShowInstancesPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcShowInstances object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcShowInstances) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcShowInstances object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcShowInstancesPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcShowInstances Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcShowInstancesPeer::$instances[$key])) { + return CcShowInstancesPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcShowInstancesPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcShowInstancesPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_show_instances + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in CcShowInstancesPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcShowInstancesPeer::clearInstancePool(); + // Invalidate objects in CcSchedulePeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcSchedulePeer::clearInstancePool(); + // Invalidate objects in CcPlayoutHistoryPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcPlayoutHistoryPeer::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcShowInstancesPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcShowInstancesPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcShowInstancesPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcShowInstances object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcShowInstancesPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcShowInstancesPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcShowInstancesPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcShowInstancesPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcShow table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowInstancesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcFiles table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowInstancesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcShowInstances objects pre-filled with their CcShow objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowInstances objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + } + + CcShowInstancesPeer::addSelectColumns($criteria); + $startcol = CcShowInstancesPeer::NUM_HYDRATE_COLUMNS; + CcShowPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowInstancesPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcShowInstancesPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowInstancesPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcShowPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcShowPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcShowInstances) to $obj2 (CcShow) + $obj2->addCcShowInstances($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcShowInstances objects pre-filled with their CcFiles objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowInstances objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + } + + CcShowInstancesPeer::addSelectColumns($criteria); + $startcol = CcShowInstancesPeer::NUM_HYDRATE_COLUMNS; + CcFilesPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowInstancesPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcShowInstancesPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowInstancesPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcShowInstances) to $obj2 (CcFiles) + $obj2->addCcShowInstances($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowInstancesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcShowInstances objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowInstances objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + } + + CcShowInstancesPeer::addSelectColumns($criteria); + $startcol2 = CcShowInstancesPeer::NUM_HYDRATE_COLUMNS; + + CcShowPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcShowPeer::NUM_HYDRATE_COLUMNS; + + CcFilesPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowInstancesPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcShowInstancesPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowInstancesPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcShow rows + + $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcShowPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcShowPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcShowInstances) to the collection in $obj2 (CcShow) + $obj2->addCcShowInstances($obj1); + } // if joined row not null + + // Add objects for joined CcFiles rows + + $key3 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcFilesPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcFilesPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcFilesPeer::addInstanceToPool($obj3, $key3); + } // if obj3 loaded + + // Add the $obj1 (CcShowInstances) to the collection in $obj3 (CcFiles) + $obj3->addCcShowInstances($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcShow table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowInstancesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcShowInstancesRelatedByDbOriginalShow table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcShowInstancesRelatedByDbOriginalShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowInstancesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Returns the number of rows matching criteria, joining the related CcFiles table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAllExceptCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowInstancesPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY should not affect count + + // Set the correct dbName + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcShowInstances objects pre-filled with all related objects except CcShow. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowInstances objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + } + + CcShowInstancesPeer::addSelectColumns($criteria); + $startcol2 = CcShowInstancesPeer::NUM_HYDRATE_COLUMNS; + + CcFilesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowInstancesPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcShowInstancesPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowInstancesPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcFiles rows + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcShowInstances) to the collection in $obj2 (CcFiles) + $obj2->addCcShowInstances($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcShowInstances objects pre-filled with all related objects except CcShowInstancesRelatedByDbOriginalShow. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowInstances objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcShowInstancesRelatedByDbOriginalShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + } + + CcShowInstancesPeer::addSelectColumns($criteria); + $startcol2 = CcShowInstancesPeer::NUM_HYDRATE_COLUMNS; + + CcShowPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcShowPeer::NUM_HYDRATE_COLUMNS; + + CcFilesPeer::addSelectColumns($criteria); + $startcol4 = $startcol3 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $criteria->addJoin(CcShowInstancesPeer::FILE_ID, CcFilesPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowInstancesPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcShowInstancesPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowInstancesPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcShow rows + + $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcShowPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcShowPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcShowInstances) to the collection in $obj2 (CcShow) + $obj2->addCcShowInstances($obj1); + + } // if joined row is not null + + // Add objects for joined CcFiles rows + + $key3 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol3); + if ($key3 !== null) { + $obj3 = CcFilesPeer::getInstanceFromPool($key3); + if (!$obj3) { + + $cls = CcFilesPeer::getOMClass(); + + $obj3 = new $cls(); + $obj3->hydrate($row, $startcol3); + CcFilesPeer::addInstanceToPool($obj3, $key3); + } // if $obj3 already loaded + + // Add the $obj1 (CcShowInstances) to the collection in $obj3 (CcFiles) + $obj3->addCcShowInstances($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Selects a collection of CcShowInstances objects pre-filled with all related objects except CcFiles. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowInstances objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAllExceptCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + // $criteria->getDbName() will return the same object if not set to another value + // so == check is okay and faster + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + } + + CcShowInstancesPeer::addSelectColumns($criteria); + $startcol2 = CcShowInstancesPeer::NUM_HYDRATE_COLUMNS; + + CcShowPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcShowPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcShowInstancesPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowInstancesPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowInstancesPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcShowInstancesPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowInstancesPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcShow rows + + $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcShowPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcShowPeer::addInstanceToPool($obj2, $key2); + } // if $obj2 already loaded + + // Add the $obj1 (CcShowInstances) to the collection in $obj2 (CcShow) + $obj2->addCcShowInstances($obj1); + + } // if joined row is not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcShowInstancesPeer::DATABASE_NAME)->getTable(CcShowInstancesPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcShowInstancesPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcShowInstancesPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcShowInstancesTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcShowInstancesPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcShowInstances or Criteria object. + * + * @param mixed $values Criteria or CcShowInstances object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcShowInstances object + } + + if ($criteria->containsKey(CcShowInstancesPeer::ID) && $criteria->keyContainsValue(CcShowInstancesPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowInstancesPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcShowInstances or Criteria object. + * + * @param mixed $values Criteria or CcShowInstances object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcShowInstancesPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcShowInstancesPeer::ID); + $value = $criteria->remove(CcShowInstancesPeer::ID); + if ($value) { + $selectCriteria->add(CcShowInstancesPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcShowInstancesPeer::TABLE_NAME); + } + + } else { // $values is CcShowInstances object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_show_instances table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcShowInstancesPeer::TABLE_NAME, $con, CcShowInstancesPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcShowInstancesPeer::clearInstancePool(); + CcShowInstancesPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcShowInstances or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcShowInstances object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcShowInstancesPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcShowInstances) { // it's a model object + // invalidate the cache for this single object + CcShowInstancesPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcShowInstancesPeer::DATABASE_NAME); + $criteria->add(CcShowInstancesPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcShowInstancesPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcShowInstancesPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcShowInstancesPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcShowInstances object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcShowInstances $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcShowInstancesPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcShowInstancesPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcShowInstancesPeer::DATABASE_NAME, CcShowInstancesPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcShowInstances + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcShowInstancesPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcShowInstancesPeer::DATABASE_NAME); + $criteria->add(CcShowInstancesPeer::ID, $pk); + + $v = CcShowInstancesPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcShowInstances[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcShowInstancesPeer::DATABASE_NAME); + $criteria->add(CcShowInstancesPeer::ID, $pks, Criteria::IN); + $objs = CcShowInstancesPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcShowInstancesPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowInstancesQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcShowInstancesQuery.php index 871b907ae9..bcf51e462c 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowInstancesQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowInstancesQuery.php @@ -4,932 +4,1235 @@ /** * Base class that represents a query for the 'cc_show_instances' table. * - * * - * @method CcShowInstancesQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcShowInstancesQuery orderByDbStarts($order = Criteria::ASC) Order by the starts column - * @method CcShowInstancesQuery orderByDbEnds($order = Criteria::ASC) Order by the ends column - * @method CcShowInstancesQuery orderByDbShowId($order = Criteria::ASC) Order by the show_id column - * @method CcShowInstancesQuery orderByDbRecord($order = Criteria::ASC) Order by the record column - * @method CcShowInstancesQuery orderByDbRebroadcast($order = Criteria::ASC) Order by the rebroadcast column - * @method CcShowInstancesQuery orderByDbOriginalShow($order = Criteria::ASC) Order by the instance_id column - * @method CcShowInstancesQuery orderByDbRecordedFile($order = Criteria::ASC) Order by the file_id column - * @method CcShowInstancesQuery orderByDbTimeFilled($order = Criteria::ASC) Order by the time_filled column - * @method CcShowInstancesQuery orderByDbCreated($order = Criteria::ASC) Order by the created column - * @method CcShowInstancesQuery orderByDbLastScheduled($order = Criteria::ASC) Order by the last_scheduled column - * @method CcShowInstancesQuery orderByDbModifiedInstance($order = Criteria::ASC) Order by the modified_instance column * - * @method CcShowInstancesQuery groupByDbId() Group by the id column - * @method CcShowInstancesQuery groupByDbStarts() Group by the starts column - * @method CcShowInstancesQuery groupByDbEnds() Group by the ends column - * @method CcShowInstancesQuery groupByDbShowId() Group by the show_id column - * @method CcShowInstancesQuery groupByDbRecord() Group by the record column - * @method CcShowInstancesQuery groupByDbRebroadcast() Group by the rebroadcast column - * @method CcShowInstancesQuery groupByDbOriginalShow() Group by the instance_id column - * @method CcShowInstancesQuery groupByDbRecordedFile() Group by the file_id column - * @method CcShowInstancesQuery groupByDbTimeFilled() Group by the time_filled column - * @method CcShowInstancesQuery groupByDbCreated() Group by the created column - * @method CcShowInstancesQuery groupByDbLastScheduled() Group by the last_scheduled column - * @method CcShowInstancesQuery groupByDbModifiedInstance() Group by the modified_instance column + * @method CcShowInstancesQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcShowInstancesQuery orderByDbStarts($order = Criteria::ASC) Order by the starts column + * @method CcShowInstancesQuery orderByDbEnds($order = Criteria::ASC) Order by the ends column + * @method CcShowInstancesQuery orderByDbShowId($order = Criteria::ASC) Order by the show_id column + * @method CcShowInstancesQuery orderByDbRecord($order = Criteria::ASC) Order by the record column + * @method CcShowInstancesQuery orderByDbRebroadcast($order = Criteria::ASC) Order by the rebroadcast column + * @method CcShowInstancesQuery orderByDbOriginalShow($order = Criteria::ASC) Order by the instance_id column + * @method CcShowInstancesQuery orderByDbRecordedFile($order = Criteria::ASC) Order by the file_id column + * @method CcShowInstancesQuery orderByDbTimeFilled($order = Criteria::ASC) Order by the time_filled column + * @method CcShowInstancesQuery orderByDbCreated($order = Criteria::ASC) Order by the created column + * @method CcShowInstancesQuery orderByDbLastScheduled($order = Criteria::ASC) Order by the last_scheduled column + * @method CcShowInstancesQuery orderByDbModifiedInstance($order = Criteria::ASC) Order by the modified_instance column * - * @method CcShowInstancesQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcShowInstancesQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcShowInstancesQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcShowInstancesQuery groupByDbId() Group by the id column + * @method CcShowInstancesQuery groupByDbStarts() Group by the starts column + * @method CcShowInstancesQuery groupByDbEnds() Group by the ends column + * @method CcShowInstancesQuery groupByDbShowId() Group by the show_id column + * @method CcShowInstancesQuery groupByDbRecord() Group by the record column + * @method CcShowInstancesQuery groupByDbRebroadcast() Group by the rebroadcast column + * @method CcShowInstancesQuery groupByDbOriginalShow() Group by the instance_id column + * @method CcShowInstancesQuery groupByDbRecordedFile() Group by the file_id column + * @method CcShowInstancesQuery groupByDbTimeFilled() Group by the time_filled column + * @method CcShowInstancesQuery groupByDbCreated() Group by the created column + * @method CcShowInstancesQuery groupByDbLastScheduled() Group by the last_scheduled column + * @method CcShowInstancesQuery groupByDbModifiedInstance() Group by the modified_instance column * - * @method CcShowInstancesQuery leftJoinCcShow($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShow relation - * @method CcShowInstancesQuery rightJoinCcShow($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShow relation - * @method CcShowInstancesQuery innerJoinCcShow($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShow relation + * @method CcShowInstancesQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcShowInstancesQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcShowInstancesQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcShowInstancesQuery leftJoinCcShowInstancesRelatedByDbOriginalShow($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShowInstancesRelatedByDbOriginalShow relation - * @method CcShowInstancesQuery rightJoinCcShowInstancesRelatedByDbOriginalShow($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShowInstancesRelatedByDbOriginalShow relation - * @method CcShowInstancesQuery innerJoinCcShowInstancesRelatedByDbOriginalShow($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShowInstancesRelatedByDbOriginalShow relation + * @method CcShowInstancesQuery leftJoinCcShow($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShow relation + * @method CcShowInstancesQuery rightJoinCcShow($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShow relation + * @method CcShowInstancesQuery innerJoinCcShow($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShow relation * - * @method CcShowInstancesQuery leftJoinCcFiles($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcFiles relation - * @method CcShowInstancesQuery rightJoinCcFiles($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcFiles relation - * @method CcShowInstancesQuery innerJoinCcFiles($relationAlias = '') Adds a INNER JOIN clause to the query using the CcFiles relation + * @method CcShowInstancesQuery leftJoinCcShowInstancesRelatedByDbOriginalShow($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShowInstancesRelatedByDbOriginalShow relation + * @method CcShowInstancesQuery rightJoinCcShowInstancesRelatedByDbOriginalShow($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShowInstancesRelatedByDbOriginalShow relation + * @method CcShowInstancesQuery innerJoinCcShowInstancesRelatedByDbOriginalShow($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShowInstancesRelatedByDbOriginalShow relation * - * @method CcShowInstancesQuery leftJoinCcShowInstancesRelatedByDbId($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShowInstancesRelatedByDbId relation - * @method CcShowInstancesQuery rightJoinCcShowInstancesRelatedByDbId($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShowInstancesRelatedByDbId relation - * @method CcShowInstancesQuery innerJoinCcShowInstancesRelatedByDbId($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShowInstancesRelatedByDbId relation + * @method CcShowInstancesQuery leftJoinCcFiles($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcFiles relation + * @method CcShowInstancesQuery rightJoinCcFiles($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcFiles relation + * @method CcShowInstancesQuery innerJoinCcFiles($relationAlias = null) Adds a INNER JOIN clause to the query using the CcFiles relation * - * @method CcShowInstancesQuery leftJoinCcSchedule($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSchedule relation - * @method CcShowInstancesQuery rightJoinCcSchedule($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSchedule relation - * @method CcShowInstancesQuery innerJoinCcSchedule($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSchedule relation + * @method CcShowInstancesQuery leftJoinCcShowInstancesRelatedByDbId($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShowInstancesRelatedByDbId relation + * @method CcShowInstancesQuery rightJoinCcShowInstancesRelatedByDbId($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShowInstancesRelatedByDbId relation + * @method CcShowInstancesQuery innerJoinCcShowInstancesRelatedByDbId($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShowInstancesRelatedByDbId relation * - * @method CcShowInstancesQuery leftJoinCcPlayoutHistory($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcPlayoutHistory relation - * @method CcShowInstancesQuery rightJoinCcPlayoutHistory($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcPlayoutHistory relation - * @method CcShowInstancesQuery innerJoinCcPlayoutHistory($relationAlias = '') Adds a INNER JOIN clause to the query using the CcPlayoutHistory relation + * @method CcShowInstancesQuery leftJoinCcSchedule($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSchedule relation + * @method CcShowInstancesQuery rightJoinCcSchedule($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSchedule relation + * @method CcShowInstancesQuery innerJoinCcSchedule($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSchedule relation * - * @method CcShowInstances findOne(PropelPDO $con = null) Return the first CcShowInstances matching the query - * @method CcShowInstances findOneOrCreate(PropelPDO $con = null) Return the first CcShowInstances matching the query, or a new CcShowInstances object populated from the query conditions when no match is found + * @method CcShowInstancesQuery leftJoinCcPlayoutHistory($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPlayoutHistory relation + * @method CcShowInstancesQuery rightJoinCcPlayoutHistory($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlayoutHistory relation + * @method CcShowInstancesQuery innerJoinCcPlayoutHistory($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlayoutHistory relation * - * @method CcShowInstances findOneByDbId(int $id) Return the first CcShowInstances filtered by the id column - * @method CcShowInstances findOneByDbStarts(string $starts) Return the first CcShowInstances filtered by the starts column - * @method CcShowInstances findOneByDbEnds(string $ends) Return the first CcShowInstances filtered by the ends column - * @method CcShowInstances findOneByDbShowId(int $show_id) Return the first CcShowInstances filtered by the show_id column - * @method CcShowInstances findOneByDbRecord(int $record) Return the first CcShowInstances filtered by the record column - * @method CcShowInstances findOneByDbRebroadcast(int $rebroadcast) Return the first CcShowInstances filtered by the rebroadcast column - * @method CcShowInstances findOneByDbOriginalShow(int $instance_id) Return the first CcShowInstances filtered by the instance_id column - * @method CcShowInstances findOneByDbRecordedFile(int $file_id) Return the first CcShowInstances filtered by the file_id column - * @method CcShowInstances findOneByDbTimeFilled(string $time_filled) Return the first CcShowInstances filtered by the time_filled column - * @method CcShowInstances findOneByDbCreated(string $created) Return the first CcShowInstances filtered by the created column - * @method CcShowInstances findOneByDbLastScheduled(string $last_scheduled) Return the first CcShowInstances filtered by the last_scheduled column - * @method CcShowInstances findOneByDbModifiedInstance(boolean $modified_instance) Return the first CcShowInstances filtered by the modified_instance column + * @method CcShowInstances findOne(PropelPDO $con = null) Return the first CcShowInstances matching the query + * @method CcShowInstances findOneOrCreate(PropelPDO $con = null) Return the first CcShowInstances matching the query, or a new CcShowInstances object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcShowInstances objects filtered by the id column - * @method array findByDbStarts(string $starts) Return CcShowInstances objects filtered by the starts column - * @method array findByDbEnds(string $ends) Return CcShowInstances objects filtered by the ends column - * @method array findByDbShowId(int $show_id) Return CcShowInstances objects filtered by the show_id column - * @method array findByDbRecord(int $record) Return CcShowInstances objects filtered by the record column - * @method array findByDbRebroadcast(int $rebroadcast) Return CcShowInstances objects filtered by the rebroadcast column - * @method array findByDbOriginalShow(int $instance_id) Return CcShowInstances objects filtered by the instance_id column - * @method array findByDbRecordedFile(int $file_id) Return CcShowInstances objects filtered by the file_id column - * @method array findByDbTimeFilled(string $time_filled) Return CcShowInstances objects filtered by the time_filled column - * @method array findByDbCreated(string $created) Return CcShowInstances objects filtered by the created column - * @method array findByDbLastScheduled(string $last_scheduled) Return CcShowInstances objects filtered by the last_scheduled column - * @method array findByDbModifiedInstance(boolean $modified_instance) Return CcShowInstances objects filtered by the modified_instance column + * @method CcShowInstances findOneByDbStarts(string $starts) Return the first CcShowInstances filtered by the starts column + * @method CcShowInstances findOneByDbEnds(string $ends) Return the first CcShowInstances filtered by the ends column + * @method CcShowInstances findOneByDbShowId(int $show_id) Return the first CcShowInstances filtered by the show_id column + * @method CcShowInstances findOneByDbRecord(int $record) Return the first CcShowInstances filtered by the record column + * @method CcShowInstances findOneByDbRebroadcast(int $rebroadcast) Return the first CcShowInstances filtered by the rebroadcast column + * @method CcShowInstances findOneByDbOriginalShow(int $instance_id) Return the first CcShowInstances filtered by the instance_id column + * @method CcShowInstances findOneByDbRecordedFile(int $file_id) Return the first CcShowInstances filtered by the file_id column + * @method CcShowInstances findOneByDbTimeFilled(string $time_filled) Return the first CcShowInstances filtered by the time_filled column + * @method CcShowInstances findOneByDbCreated(string $created) Return the first CcShowInstances filtered by the created column + * @method CcShowInstances findOneByDbLastScheduled(string $last_scheduled) Return the first CcShowInstances filtered by the last_scheduled column + * @method CcShowInstances findOneByDbModifiedInstance(boolean $modified_instance) Return the first CcShowInstances filtered by the modified_instance column + * + * @method array findByDbId(int $id) Return CcShowInstances objects filtered by the id column + * @method array findByDbStarts(string $starts) Return CcShowInstances objects filtered by the starts column + * @method array findByDbEnds(string $ends) Return CcShowInstances objects filtered by the ends column + * @method array findByDbShowId(int $show_id) Return CcShowInstances objects filtered by the show_id column + * @method array findByDbRecord(int $record) Return CcShowInstances objects filtered by the record column + * @method array findByDbRebroadcast(int $rebroadcast) Return CcShowInstances objects filtered by the rebroadcast column + * @method array findByDbOriginalShow(int $instance_id) Return CcShowInstances objects filtered by the instance_id column + * @method array findByDbRecordedFile(int $file_id) Return CcShowInstances objects filtered by the file_id column + * @method array findByDbTimeFilled(string $time_filled) Return CcShowInstances objects filtered by the time_filled column + * @method array findByDbCreated(string $created) Return CcShowInstances objects filtered by the created column + * @method array findByDbLastScheduled(string $last_scheduled) Return CcShowInstances objects filtered by the last_scheduled column + * @method array findByDbModifiedInstance(boolean $modified_instance) Return CcShowInstances objects filtered by the modified_instance column * * @package propel.generator.airtime.om */ abstract class BaseCcShowInstancesQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcShowInstancesQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcShowInstances'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcShowInstancesQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcShowInstancesQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcShowInstancesQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcShowInstancesQuery) { + return $criteria; + } + $query = new CcShowInstancesQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcShowInstances|CcShowInstances[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcShowInstancesPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShowInstances A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShowInstances A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "starts", "ends", "show_id", "record", "rebroadcast", "instance_id", "file_id", "time_filled", "created", "last_scheduled", "modified_instance" FROM "cc_show_instances" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcShowInstances(); + $obj->hydrate($row); + CcShowInstancesPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShowInstances|CcShowInstances[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcShowInstances[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcShowInstancesPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcShowInstancesPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcShowInstancesPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcShowInstancesPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowInstancesPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the starts column + * + * Example usage: + * + * $query->filterByDbStarts('2011-03-14'); // WHERE starts = '2011-03-14' + * $query->filterByDbStarts('now'); // WHERE starts = '2011-03-14' + * $query->filterByDbStarts(array('max' => 'yesterday')); // WHERE starts < '2011-03-13' + * + * + * @param mixed $dbStarts The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByDbStarts($dbStarts = null, $comparison = null) + { + if (is_array($dbStarts)) { + $useMinMax = false; + if (isset($dbStarts['min'])) { + $this->addUsingAlias(CcShowInstancesPeer::STARTS, $dbStarts['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbStarts['max'])) { + $this->addUsingAlias(CcShowInstancesPeer::STARTS, $dbStarts['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowInstancesPeer::STARTS, $dbStarts, $comparison); + } + + /** + * Filter the query on the ends column + * + * Example usage: + * + * $query->filterByDbEnds('2011-03-14'); // WHERE ends = '2011-03-14' + * $query->filterByDbEnds('now'); // WHERE ends = '2011-03-14' + * $query->filterByDbEnds(array('max' => 'yesterday')); // WHERE ends < '2011-03-13' + * + * + * @param mixed $dbEnds The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByDbEnds($dbEnds = null, $comparison = null) + { + if (is_array($dbEnds)) { + $useMinMax = false; + if (isset($dbEnds['min'])) { + $this->addUsingAlias(CcShowInstancesPeer::ENDS, $dbEnds['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbEnds['max'])) { + $this->addUsingAlias(CcShowInstancesPeer::ENDS, $dbEnds['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowInstancesPeer::ENDS, $dbEnds, $comparison); + } + + /** + * Filter the query on the show_id column + * + * Example usage: + * + * $query->filterByDbShowId(1234); // WHERE show_id = 1234 + * $query->filterByDbShowId(array(12, 34)); // WHERE show_id IN (12, 34) + * $query->filterByDbShowId(array('min' => 12)); // WHERE show_id >= 12 + * $query->filterByDbShowId(array('max' => 12)); // WHERE show_id <= 12 + * + * + * @see filterByCcShow() + * + * @param mixed $dbShowId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByDbShowId($dbShowId = null, $comparison = null) + { + if (is_array($dbShowId)) { + $useMinMax = false; + if (isset($dbShowId['min'])) { + $this->addUsingAlias(CcShowInstancesPeer::SHOW_ID, $dbShowId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbShowId['max'])) { + $this->addUsingAlias(CcShowInstancesPeer::SHOW_ID, $dbShowId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowInstancesPeer::SHOW_ID, $dbShowId, $comparison); + } + + /** + * Filter the query on the record column + * + * Example usage: + * + * $query->filterByDbRecord(1234); // WHERE record = 1234 + * $query->filterByDbRecord(array(12, 34)); // WHERE record IN (12, 34) + * $query->filterByDbRecord(array('min' => 12)); // WHERE record >= 12 + * $query->filterByDbRecord(array('max' => 12)); // WHERE record <= 12 + * + * + * @param mixed $dbRecord The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByDbRecord($dbRecord = null, $comparison = null) + { + if (is_array($dbRecord)) { + $useMinMax = false; + if (isset($dbRecord['min'])) { + $this->addUsingAlias(CcShowInstancesPeer::RECORD, $dbRecord['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbRecord['max'])) { + $this->addUsingAlias(CcShowInstancesPeer::RECORD, $dbRecord['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowInstancesPeer::RECORD, $dbRecord, $comparison); + } + + /** + * Filter the query on the rebroadcast column + * + * Example usage: + * + * $query->filterByDbRebroadcast(1234); // WHERE rebroadcast = 1234 + * $query->filterByDbRebroadcast(array(12, 34)); // WHERE rebroadcast IN (12, 34) + * $query->filterByDbRebroadcast(array('min' => 12)); // WHERE rebroadcast >= 12 + * $query->filterByDbRebroadcast(array('max' => 12)); // WHERE rebroadcast <= 12 + * + * + * @param mixed $dbRebroadcast The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByDbRebroadcast($dbRebroadcast = null, $comparison = null) + { + if (is_array($dbRebroadcast)) { + $useMinMax = false; + if (isset($dbRebroadcast['min'])) { + $this->addUsingAlias(CcShowInstancesPeer::REBROADCAST, $dbRebroadcast['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbRebroadcast['max'])) { + $this->addUsingAlias(CcShowInstancesPeer::REBROADCAST, $dbRebroadcast['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowInstancesPeer::REBROADCAST, $dbRebroadcast, $comparison); + } + + /** + * Filter the query on the instance_id column + * + * Example usage: + * + * $query->filterByDbOriginalShow(1234); // WHERE instance_id = 1234 + * $query->filterByDbOriginalShow(array(12, 34)); // WHERE instance_id IN (12, 34) + * $query->filterByDbOriginalShow(array('min' => 12)); // WHERE instance_id >= 12 + * $query->filterByDbOriginalShow(array('max' => 12)); // WHERE instance_id <= 12 + * + * + * @see filterByCcShowInstancesRelatedByDbOriginalShow() + * + * @param mixed $dbOriginalShow The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByDbOriginalShow($dbOriginalShow = null, $comparison = null) + { + if (is_array($dbOriginalShow)) { + $useMinMax = false; + if (isset($dbOriginalShow['min'])) { + $this->addUsingAlias(CcShowInstancesPeer::INSTANCE_ID, $dbOriginalShow['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbOriginalShow['max'])) { + $this->addUsingAlias(CcShowInstancesPeer::INSTANCE_ID, $dbOriginalShow['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowInstancesPeer::INSTANCE_ID, $dbOriginalShow, $comparison); + } + + /** + * Filter the query on the file_id column + * + * Example usage: + * + * $query->filterByDbRecordedFile(1234); // WHERE file_id = 1234 + * $query->filterByDbRecordedFile(array(12, 34)); // WHERE file_id IN (12, 34) + * $query->filterByDbRecordedFile(array('min' => 12)); // WHERE file_id >= 12 + * $query->filterByDbRecordedFile(array('max' => 12)); // WHERE file_id <= 12 + * + * + * @see filterByCcFiles() + * + * @param mixed $dbRecordedFile The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByDbRecordedFile($dbRecordedFile = null, $comparison = null) + { + if (is_array($dbRecordedFile)) { + $useMinMax = false; + if (isset($dbRecordedFile['min'])) { + $this->addUsingAlias(CcShowInstancesPeer::FILE_ID, $dbRecordedFile['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbRecordedFile['max'])) { + $this->addUsingAlias(CcShowInstancesPeer::FILE_ID, $dbRecordedFile['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowInstancesPeer::FILE_ID, $dbRecordedFile, $comparison); + } + + /** + * Filter the query on the time_filled column + * + * Example usage: + * + * $query->filterByDbTimeFilled('fooValue'); // WHERE time_filled = 'fooValue' + * $query->filterByDbTimeFilled('%fooValue%'); // WHERE time_filled LIKE '%fooValue%' + * + * + * @param string $dbTimeFilled The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByDbTimeFilled($dbTimeFilled = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbTimeFilled)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbTimeFilled)) { + $dbTimeFilled = str_replace('*', '%', $dbTimeFilled); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcShowInstancesPeer::TIME_FILLED, $dbTimeFilled, $comparison); + } + + /** + * Filter the query on the created column + * + * Example usage: + * + * $query->filterByDbCreated('2011-03-14'); // WHERE created = '2011-03-14' + * $query->filterByDbCreated('now'); // WHERE created = '2011-03-14' + * $query->filterByDbCreated(array('max' => 'yesterday')); // WHERE created < '2011-03-13' + * + * + * @param mixed $dbCreated The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByDbCreated($dbCreated = null, $comparison = null) + { + if (is_array($dbCreated)) { + $useMinMax = false; + if (isset($dbCreated['min'])) { + $this->addUsingAlias(CcShowInstancesPeer::CREATED, $dbCreated['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbCreated['max'])) { + $this->addUsingAlias(CcShowInstancesPeer::CREATED, $dbCreated['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowInstancesPeer::CREATED, $dbCreated, $comparison); + } + + /** + * Filter the query on the last_scheduled column + * + * Example usage: + * + * $query->filterByDbLastScheduled('2011-03-14'); // WHERE last_scheduled = '2011-03-14' + * $query->filterByDbLastScheduled('now'); // WHERE last_scheduled = '2011-03-14' + * $query->filterByDbLastScheduled(array('max' => 'yesterday')); // WHERE last_scheduled < '2011-03-13' + * + * + * @param mixed $dbLastScheduled The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByDbLastScheduled($dbLastScheduled = null, $comparison = null) + { + if (is_array($dbLastScheduled)) { + $useMinMax = false; + if (isset($dbLastScheduled['min'])) { + $this->addUsingAlias(CcShowInstancesPeer::LAST_SCHEDULED, $dbLastScheduled['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbLastScheduled['max'])) { + $this->addUsingAlias(CcShowInstancesPeer::LAST_SCHEDULED, $dbLastScheduled['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowInstancesPeer::LAST_SCHEDULED, $dbLastScheduled, $comparison); + } + + /** + * Filter the query on the modified_instance column + * + * Example usage: + * + * $query->filterByDbModifiedInstance(true); // WHERE modified_instance = true + * $query->filterByDbModifiedInstance('yes'); // WHERE modified_instance = true + * + * + * @param boolean|string $dbModifiedInstance The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function filterByDbModifiedInstance($dbModifiedInstance = null, $comparison = null) + { + if (is_string($dbModifiedInstance)) { + $dbModifiedInstance = in_array(strtolower($dbModifiedInstance), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcShowInstancesPeer::MODIFIED_INSTANCE, $dbModifiedInstance, $comparison); + } + + /** + * Filter the query by a related CcShow object + * + * @param CcShow|PropelObjectCollection $ccShow The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShow($ccShow, $comparison = null) + { + if ($ccShow instanceof CcShow) { + return $this + ->addUsingAlias(CcShowInstancesPeer::SHOW_ID, $ccShow->getDbId(), $comparison); + } elseif ($ccShow instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcShowInstancesPeer::SHOW_ID, $ccShow->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcShow() only accepts arguments of type CcShow or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShow relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function joinCcShow($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShow'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShow'); + } + + return $this; + } + + /** + * Use the CcShow relation CcShow object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowQuery A secondary query class using the current class as primary query + */ + public function useCcShowQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcShow($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShow', 'CcShowQuery'); + } + + /** + * Filter the query by a related CcShowInstances object + * + * @param CcShowInstances|PropelObjectCollection $ccShowInstances The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShowInstancesRelatedByDbOriginalShow($ccShowInstances, $comparison = null) + { + if ($ccShowInstances instanceof CcShowInstances) { + return $this + ->addUsingAlias(CcShowInstancesPeer::INSTANCE_ID, $ccShowInstances->getDbId(), $comparison); + } elseif ($ccShowInstances instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcShowInstancesPeer::INSTANCE_ID, $ccShowInstances->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcShowInstancesRelatedByDbOriginalShow() only accepts arguments of type CcShowInstances or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShowInstancesRelatedByDbOriginalShow relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function joinCcShowInstancesRelatedByDbOriginalShow($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShowInstancesRelatedByDbOriginalShow'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShowInstancesRelatedByDbOriginalShow'); + } + + return $this; + } + + /** + * Use the CcShowInstancesRelatedByDbOriginalShow relation CcShowInstances object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowInstancesQuery A secondary query class using the current class as primary query + */ + public function useCcShowInstancesRelatedByDbOriginalShowQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcShowInstancesRelatedByDbOriginalShow($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShowInstancesRelatedByDbOriginalShow', 'CcShowInstancesQuery'); + } + + /** + * Filter the query by a related CcFiles object + * + * @param CcFiles|PropelObjectCollection $ccFiles The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcFiles($ccFiles, $comparison = null) + { + if ($ccFiles instanceof CcFiles) { + return $this + ->addUsingAlias(CcShowInstancesPeer::FILE_ID, $ccFiles->getDbId(), $comparison); + } elseif ($ccFiles instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcShowInstancesPeer::FILE_ID, $ccFiles->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcFiles() only accepts arguments of type CcFiles or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcFiles relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function joinCcFiles($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcFiles'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcFiles'); + } + + return $this; + } + + /** + * Use the CcFiles relation CcFiles object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery A secondary query class using the current class as primary query + */ + public function useCcFilesQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcFiles($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery'); + } + + /** + * Filter the query by a related CcShowInstances object + * + * @param CcShowInstances|PropelObjectCollection $ccShowInstances the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShowInstancesRelatedByDbId($ccShowInstances, $comparison = null) + { + if ($ccShowInstances instanceof CcShowInstances) { + return $this + ->addUsingAlias(CcShowInstancesPeer::ID, $ccShowInstances->getDbOriginalShow(), $comparison); + } elseif ($ccShowInstances instanceof PropelObjectCollection) { + return $this + ->useCcShowInstancesRelatedByDbIdQuery() + ->filterByPrimaryKeys($ccShowInstances->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcShowInstancesRelatedByDbId() only accepts arguments of type CcShowInstances or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShowInstancesRelatedByDbId relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function joinCcShowInstancesRelatedByDbId($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShowInstancesRelatedByDbId'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShowInstancesRelatedByDbId'); + } + + return $this; + } + + /** + * Use the CcShowInstancesRelatedByDbId relation CcShowInstances object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowInstancesQuery A secondary query class using the current class as primary query + */ + public function useCcShowInstancesRelatedByDbIdQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcShowInstancesRelatedByDbId($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShowInstancesRelatedByDbId', 'CcShowInstancesQuery'); + } + + /** + * Filter the query by a related CcSchedule object + * + * @param CcSchedule|PropelObjectCollection $ccSchedule the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSchedule($ccSchedule, $comparison = null) + { + if ($ccSchedule instanceof CcSchedule) { + return $this + ->addUsingAlias(CcShowInstancesPeer::ID, $ccSchedule->getDbInstanceId(), $comparison); + } elseif ($ccSchedule instanceof PropelObjectCollection) { + return $this + ->useCcScheduleQuery() + ->filterByPrimaryKeys($ccSchedule->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcSchedule() only accepts arguments of type CcSchedule or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSchedule relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function joinCcSchedule($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSchedule'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSchedule'); + } + + return $this; + } + + /** + * Use the CcSchedule relation CcSchedule object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcScheduleQuery A secondary query class using the current class as primary query + */ + public function useCcScheduleQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcSchedule($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSchedule', 'CcScheduleQuery'); + } + + /** + * Filter the query by a related CcPlayoutHistory object + * + * @param CcPlayoutHistory|PropelObjectCollection $ccPlayoutHistory the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowInstancesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcPlayoutHistory($ccPlayoutHistory, $comparison = null) + { + if ($ccPlayoutHistory instanceof CcPlayoutHistory) { + return $this + ->addUsingAlias(CcShowInstancesPeer::ID, $ccPlayoutHistory->getDbInstanceId(), $comparison); + } elseif ($ccPlayoutHistory instanceof PropelObjectCollection) { + return $this + ->useCcPlayoutHistoryQuery() + ->filterByPrimaryKeys($ccPlayoutHistory->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcPlayoutHistory() only accepts arguments of type CcPlayoutHistory or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcPlayoutHistory relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function joinCcPlayoutHistory($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcPlayoutHistory'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcPlayoutHistory'); + } + + return $this; + } + + /** + * Use the CcPlayoutHistory relation CcPlayoutHistory object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlayoutHistoryQuery A secondary query class using the current class as primary query + */ + public function useCcPlayoutHistoryQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcPlayoutHistory($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistory', 'CcPlayoutHistoryQuery'); + } + + /** + * Exclude object from result + * + * @param CcShowInstances $ccShowInstances Object to remove from the list of results + * + * @return CcShowInstancesQuery The current query, for fluid interface + */ + public function prune($ccShowInstances = null) + { + if ($ccShowInstances) { + $this->addUsingAlias(CcShowInstancesPeer::ID, $ccShowInstances->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcShowInstancesQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcShowInstances', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcShowInstancesQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcShowInstancesQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcShowInstancesQuery) { - return $criteria; - } - $query = new CcShowInstancesQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcShowInstances|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcShowInstancesPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcShowInstancesPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcShowInstancesPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcShowInstancesPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the starts column - * - * @param string|array $dbStarts The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByDbStarts($dbStarts = null, $comparison = null) - { - if (is_array($dbStarts)) { - $useMinMax = false; - if (isset($dbStarts['min'])) { - $this->addUsingAlias(CcShowInstancesPeer::STARTS, $dbStarts['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbStarts['max'])) { - $this->addUsingAlias(CcShowInstancesPeer::STARTS, $dbStarts['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowInstancesPeer::STARTS, $dbStarts, $comparison); - } - - /** - * Filter the query on the ends column - * - * @param string|array $dbEnds The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByDbEnds($dbEnds = null, $comparison = null) - { - if (is_array($dbEnds)) { - $useMinMax = false; - if (isset($dbEnds['min'])) { - $this->addUsingAlias(CcShowInstancesPeer::ENDS, $dbEnds['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbEnds['max'])) { - $this->addUsingAlias(CcShowInstancesPeer::ENDS, $dbEnds['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowInstancesPeer::ENDS, $dbEnds, $comparison); - } - - /** - * Filter the query on the show_id column - * - * @param int|array $dbShowId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByDbShowId($dbShowId = null, $comparison = null) - { - if (is_array($dbShowId)) { - $useMinMax = false; - if (isset($dbShowId['min'])) { - $this->addUsingAlias(CcShowInstancesPeer::SHOW_ID, $dbShowId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbShowId['max'])) { - $this->addUsingAlias(CcShowInstancesPeer::SHOW_ID, $dbShowId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowInstancesPeer::SHOW_ID, $dbShowId, $comparison); - } - - /** - * Filter the query on the record column - * - * @param int|array $dbRecord The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByDbRecord($dbRecord = null, $comparison = null) - { - if (is_array($dbRecord)) { - $useMinMax = false; - if (isset($dbRecord['min'])) { - $this->addUsingAlias(CcShowInstancesPeer::RECORD, $dbRecord['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbRecord['max'])) { - $this->addUsingAlias(CcShowInstancesPeer::RECORD, $dbRecord['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowInstancesPeer::RECORD, $dbRecord, $comparison); - } - - /** - * Filter the query on the rebroadcast column - * - * @param int|array $dbRebroadcast The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByDbRebroadcast($dbRebroadcast = null, $comparison = null) - { - if (is_array($dbRebroadcast)) { - $useMinMax = false; - if (isset($dbRebroadcast['min'])) { - $this->addUsingAlias(CcShowInstancesPeer::REBROADCAST, $dbRebroadcast['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbRebroadcast['max'])) { - $this->addUsingAlias(CcShowInstancesPeer::REBROADCAST, $dbRebroadcast['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowInstancesPeer::REBROADCAST, $dbRebroadcast, $comparison); - } - - /** - * Filter the query on the instance_id column - * - * @param int|array $dbOriginalShow The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByDbOriginalShow($dbOriginalShow = null, $comparison = null) - { - if (is_array($dbOriginalShow)) { - $useMinMax = false; - if (isset($dbOriginalShow['min'])) { - $this->addUsingAlias(CcShowInstancesPeer::INSTANCE_ID, $dbOriginalShow['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbOriginalShow['max'])) { - $this->addUsingAlias(CcShowInstancesPeer::INSTANCE_ID, $dbOriginalShow['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowInstancesPeer::INSTANCE_ID, $dbOriginalShow, $comparison); - } - - /** - * Filter the query on the file_id column - * - * @param int|array $dbRecordedFile The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByDbRecordedFile($dbRecordedFile = null, $comparison = null) - { - if (is_array($dbRecordedFile)) { - $useMinMax = false; - if (isset($dbRecordedFile['min'])) { - $this->addUsingAlias(CcShowInstancesPeer::FILE_ID, $dbRecordedFile['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbRecordedFile['max'])) { - $this->addUsingAlias(CcShowInstancesPeer::FILE_ID, $dbRecordedFile['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowInstancesPeer::FILE_ID, $dbRecordedFile, $comparison); - } - - /** - * Filter the query on the time_filled column - * - * @param string $dbTimeFilled The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByDbTimeFilled($dbTimeFilled = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbTimeFilled)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbTimeFilled)) { - $dbTimeFilled = str_replace('*', '%', $dbTimeFilled); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcShowInstancesPeer::TIME_FILLED, $dbTimeFilled, $comparison); - } - - /** - * Filter the query on the created column - * - * @param string|array $dbCreated The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByDbCreated($dbCreated = null, $comparison = null) - { - if (is_array($dbCreated)) { - $useMinMax = false; - if (isset($dbCreated['min'])) { - $this->addUsingAlias(CcShowInstancesPeer::CREATED, $dbCreated['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbCreated['max'])) { - $this->addUsingAlias(CcShowInstancesPeer::CREATED, $dbCreated['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowInstancesPeer::CREATED, $dbCreated, $comparison); - } - - /** - * Filter the query on the last_scheduled column - * - * @param string|array $dbLastScheduled The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByDbLastScheduled($dbLastScheduled = null, $comparison = null) - { - if (is_array($dbLastScheduled)) { - $useMinMax = false; - if (isset($dbLastScheduled['min'])) { - $this->addUsingAlias(CcShowInstancesPeer::LAST_SCHEDULED, $dbLastScheduled['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbLastScheduled['max'])) { - $this->addUsingAlias(CcShowInstancesPeer::LAST_SCHEDULED, $dbLastScheduled['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowInstancesPeer::LAST_SCHEDULED, $dbLastScheduled, $comparison); - } - - /** - * Filter the query on the modified_instance column - * - * @param boolean|string $dbModifiedInstance The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByDbModifiedInstance($dbModifiedInstance = null, $comparison = null) - { - if (is_string($dbModifiedInstance)) { - $modified_instance = in_array(strtolower($dbModifiedInstance), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcShowInstancesPeer::MODIFIED_INSTANCE, $dbModifiedInstance, $comparison); - } - - /** - * Filter the query by a related CcShow object - * - * @param CcShow $ccShow the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByCcShow($ccShow, $comparison = null) - { - return $this - ->addUsingAlias(CcShowInstancesPeer::SHOW_ID, $ccShow->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShow relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function joinCcShow($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShow'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShow'); - } - - return $this; - } - - /** - * Use the CcShow relation CcShow object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowQuery A secondary query class using the current class as primary query - */ - public function useCcShowQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcShow($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShow', 'CcShowQuery'); - } - - /** - * Filter the query by a related CcShowInstances object - * - * @param CcShowInstances $ccShowInstances the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByCcShowInstancesRelatedByDbOriginalShow($ccShowInstances, $comparison = null) - { - return $this - ->addUsingAlias(CcShowInstancesPeer::INSTANCE_ID, $ccShowInstances->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShowInstancesRelatedByDbOriginalShow relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function joinCcShowInstancesRelatedByDbOriginalShow($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShowInstancesRelatedByDbOriginalShow'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShowInstancesRelatedByDbOriginalShow'); - } - - return $this; - } - - /** - * Use the CcShowInstancesRelatedByDbOriginalShow relation CcShowInstances object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowInstancesQuery A secondary query class using the current class as primary query - */ - public function useCcShowInstancesRelatedByDbOriginalShowQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcShowInstancesRelatedByDbOriginalShow($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShowInstancesRelatedByDbOriginalShow', 'CcShowInstancesQuery'); - } - - /** - * Filter the query by a related CcFiles object - * - * @param CcFiles $ccFiles the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByCcFiles($ccFiles, $comparison = null) - { - return $this - ->addUsingAlias(CcShowInstancesPeer::FILE_ID, $ccFiles->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcFiles relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function joinCcFiles($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcFiles'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcFiles'); - } - - return $this; - } - - /** - * Use the CcFiles relation CcFiles object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery A secondary query class using the current class as primary query - */ - public function useCcFilesQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcFiles($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery'); - } - - /** - * Filter the query by a related CcShowInstances object - * - * @param CcShowInstances $ccShowInstances the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByCcShowInstancesRelatedByDbId($ccShowInstances, $comparison = null) - { - return $this - ->addUsingAlias(CcShowInstancesPeer::ID, $ccShowInstances->getDbOriginalShow(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShowInstancesRelatedByDbId relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function joinCcShowInstancesRelatedByDbId($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShowInstancesRelatedByDbId'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShowInstancesRelatedByDbId'); - } - - return $this; - } - - /** - * Use the CcShowInstancesRelatedByDbId relation CcShowInstances object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowInstancesQuery A secondary query class using the current class as primary query - */ - public function useCcShowInstancesRelatedByDbIdQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcShowInstancesRelatedByDbId($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShowInstancesRelatedByDbId', 'CcShowInstancesQuery'); - } - - /** - * Filter the query by a related CcSchedule object - * - * @param CcSchedule $ccSchedule the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByCcSchedule($ccSchedule, $comparison = null) - { - return $this - ->addUsingAlias(CcShowInstancesPeer::ID, $ccSchedule->getDbInstanceId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSchedule relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function joinCcSchedule($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSchedule'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSchedule'); - } - - return $this; - } - - /** - * Use the CcSchedule relation CcSchedule object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcScheduleQuery A secondary query class using the current class as primary query - */ - public function useCcScheduleQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcSchedule($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSchedule', 'CcScheduleQuery'); - } - - /** - * Filter the query by a related CcPlayoutHistory object - * - * @param CcPlayoutHistory $ccPlayoutHistory the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function filterByCcPlayoutHistory($ccPlayoutHistory, $comparison = null) - { - return $this - ->addUsingAlias(CcShowInstancesPeer::ID, $ccPlayoutHistory->getDbInstanceId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcPlayoutHistory relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function joinCcPlayoutHistory($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcPlayoutHistory'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcPlayoutHistory'); - } - - return $this; - } - - /** - * Use the CcPlayoutHistory relation CcPlayoutHistory object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlayoutHistoryQuery A secondary query class using the current class as primary query - */ - public function useCcPlayoutHistoryQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcPlayoutHistory($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistory', 'CcPlayoutHistoryQuery'); - } - - /** - * Exclude object from result - * - * @param CcShowInstances $ccShowInstances Object to remove from the list of results - * - * @return CcShowInstancesQuery The current query, for fluid interface - */ - public function prune($ccShowInstances = null) - { - if ($ccShowInstances) { - $this->addUsingAlias(CcShowInstancesPeer::ID, $ccShowInstances->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcShowInstancesQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcShowPeer.php index c49ef60fbf..45cd5dce53 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowPeer.php @@ -4,799 +4,821 @@ /** * Base static class for performing query and update operations on the 'cc_show' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcShowPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_show'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcShow'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcShow'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcShowTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 13; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_show.ID'; - - /** the column name for the NAME field */ - const NAME = 'cc_show.NAME'; - - /** the column name for the URL field */ - const URL = 'cc_show.URL'; - - /** the column name for the GENRE field */ - const GENRE = 'cc_show.GENRE'; - - /** the column name for the DESCRIPTION field */ - const DESCRIPTION = 'cc_show.DESCRIPTION'; - - /** the column name for the COLOR field */ - const COLOR = 'cc_show.COLOR'; - - /** the column name for the BACKGROUND_COLOR field */ - const BACKGROUND_COLOR = 'cc_show.BACKGROUND_COLOR'; - - /** the column name for the LIVE_STREAM_USING_AIRTIME_AUTH field */ - const LIVE_STREAM_USING_AIRTIME_AUTH = 'cc_show.LIVE_STREAM_USING_AIRTIME_AUTH'; - - /** the column name for the LIVE_STREAM_USING_CUSTOM_AUTH field */ - const LIVE_STREAM_USING_CUSTOM_AUTH = 'cc_show.LIVE_STREAM_USING_CUSTOM_AUTH'; - - /** the column name for the LIVE_STREAM_USER field */ - const LIVE_STREAM_USER = 'cc_show.LIVE_STREAM_USER'; - - /** the column name for the LIVE_STREAM_PASS field */ - const LIVE_STREAM_PASS = 'cc_show.LIVE_STREAM_PASS'; - - /** the column name for the LINKED field */ - const LINKED = 'cc_show.LINKED'; - - /** the column name for the IS_LINKABLE field */ - const IS_LINKABLE = 'cc_show.IS_LINKABLE'; - - /** - * An identiy map to hold any loaded instances of CcShow objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcShow[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbUrl', 'DbGenre', 'DbDescription', 'DbColor', 'DbBackgroundColor', 'DbLiveStreamUsingAirtimeAuth', 'DbLiveStreamUsingCustomAuth', 'DbLiveStreamUser', 'DbLiveStreamPass', 'DbLinked', 'DbIsLinkable', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbUrl', 'dbGenre', 'dbDescription', 'dbColor', 'dbBackgroundColor', 'dbLiveStreamUsingAirtimeAuth', 'dbLiveStreamUsingCustomAuth', 'dbLiveStreamUser', 'dbLiveStreamPass', 'dbLinked', 'dbIsLinkable', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::NAME, self::URL, self::GENRE, self::DESCRIPTION, self::COLOR, self::BACKGROUND_COLOR, self::LIVE_STREAM_USING_AIRTIME_AUTH, self::LIVE_STREAM_USING_CUSTOM_AUTH, self::LIVE_STREAM_USER, self::LIVE_STREAM_PASS, self::LINKED, self::IS_LINKABLE, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'URL', 'GENRE', 'DESCRIPTION', 'COLOR', 'BACKGROUND_COLOR', 'LIVE_STREAM_USING_AIRTIME_AUTH', 'LIVE_STREAM_USING_CUSTOM_AUTH', 'LIVE_STREAM_USER', 'LIVE_STREAM_PASS', 'LINKED', 'IS_LINKABLE', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'url', 'genre', 'description', 'color', 'background_color', 'live_stream_using_airtime_auth', 'live_stream_using_custom_auth', 'live_stream_user', 'live_stream_pass', 'linked', 'is_linkable', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbUrl' => 2, 'DbGenre' => 3, 'DbDescription' => 4, 'DbColor' => 5, 'DbBackgroundColor' => 6, 'DbLiveStreamUsingAirtimeAuth' => 7, 'DbLiveStreamUsingCustomAuth' => 8, 'DbLiveStreamUser' => 9, 'DbLiveStreamPass' => 10, 'DbLinked' => 11, 'DbIsLinkable' => 12, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbUrl' => 2, 'dbGenre' => 3, 'dbDescription' => 4, 'dbColor' => 5, 'dbBackgroundColor' => 6, 'dbLiveStreamUsingAirtimeAuth' => 7, 'dbLiveStreamUsingCustomAuth' => 8, 'dbLiveStreamUser' => 9, 'dbLiveStreamPass' => 10, 'dbLinked' => 11, 'dbIsLinkable' => 12, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::NAME => 1, self::URL => 2, self::GENRE => 3, self::DESCRIPTION => 4, self::COLOR => 5, self::BACKGROUND_COLOR => 6, self::LIVE_STREAM_USING_AIRTIME_AUTH => 7, self::LIVE_STREAM_USING_CUSTOM_AUTH => 8, self::LIVE_STREAM_USER => 9, self::LIVE_STREAM_PASS => 10, self::LINKED => 11, self::IS_LINKABLE => 12, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'URL' => 2, 'GENRE' => 3, 'DESCRIPTION' => 4, 'COLOR' => 5, 'BACKGROUND_COLOR' => 6, 'LIVE_STREAM_USING_AIRTIME_AUTH' => 7, 'LIVE_STREAM_USING_CUSTOM_AUTH' => 8, 'LIVE_STREAM_USER' => 9, 'LIVE_STREAM_PASS' => 10, 'LINKED' => 11, 'IS_LINKABLE' => 12, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'url' => 2, 'genre' => 3, 'description' => 4, 'color' => 5, 'background_color' => 6, 'live_stream_using_airtime_auth' => 7, 'live_stream_using_custom_auth' => 8, 'live_stream_user' => 9, 'live_stream_pass' => 10, 'linked' => 11, 'is_linkable' => 12, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcShowPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcShowPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcShowPeer::ID); - $criteria->addSelectColumn(CcShowPeer::NAME); - $criteria->addSelectColumn(CcShowPeer::URL); - $criteria->addSelectColumn(CcShowPeer::GENRE); - $criteria->addSelectColumn(CcShowPeer::DESCRIPTION); - $criteria->addSelectColumn(CcShowPeer::COLOR); - $criteria->addSelectColumn(CcShowPeer::BACKGROUND_COLOR); - $criteria->addSelectColumn(CcShowPeer::LIVE_STREAM_USING_AIRTIME_AUTH); - $criteria->addSelectColumn(CcShowPeer::LIVE_STREAM_USING_CUSTOM_AUTH); - $criteria->addSelectColumn(CcShowPeer::LIVE_STREAM_USER); - $criteria->addSelectColumn(CcShowPeer::LIVE_STREAM_PASS); - $criteria->addSelectColumn(CcShowPeer::LINKED); - $criteria->addSelectColumn(CcShowPeer::IS_LINKABLE); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.NAME'); - $criteria->addSelectColumn($alias . '.URL'); - $criteria->addSelectColumn($alias . '.GENRE'); - $criteria->addSelectColumn($alias . '.DESCRIPTION'); - $criteria->addSelectColumn($alias . '.COLOR'); - $criteria->addSelectColumn($alias . '.BACKGROUND_COLOR'); - $criteria->addSelectColumn($alias . '.LIVE_STREAM_USING_AIRTIME_AUTH'); - $criteria->addSelectColumn($alias . '.LIVE_STREAM_USING_CUSTOM_AUTH'); - $criteria->addSelectColumn($alias . '.LIVE_STREAM_USER'); - $criteria->addSelectColumn($alias . '.LIVE_STREAM_PASS'); - $criteria->addSelectColumn($alias . '.LINKED'); - $criteria->addSelectColumn($alias . '.IS_LINKABLE'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcShow - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcShowPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcShowPeer::populateObjects(CcShowPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcShowPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcShow $value A CcShow object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcShow $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcShow object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcShow) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcShow object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcShow Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_show - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - // Invalidate objects in CcShowInstancesPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcShowInstancesPeer::clearInstancePool(); - // Invalidate objects in CcShowDaysPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcShowDaysPeer::clearInstancePool(); - // Invalidate objects in CcShowRebroadcastPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcShowRebroadcastPeer::clearInstancePool(); - // Invalidate objects in CcShowHostsPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcShowHostsPeer::clearInstancePool(); - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcShowPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcShowPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcShowPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcShowPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcShow object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcShowPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcShowPeer::NUM_COLUMNS; - } else { - $cls = CcShowPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcShowPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcShowPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcShowPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcShowTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcShowPeer::CLASS_DEFAULT : CcShowPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcShow or Criteria object. - * - * @param mixed $values Criteria or CcShow object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcShow object - } - - if ($criteria->containsKey(CcShowPeer::ID) && $criteria->keyContainsValue(CcShowPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcShow or Criteria object. - * - * @param mixed $values Criteria or CcShow object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcShowPeer::ID); - $value = $criteria->remove(CcShowPeer::ID); - if ($value) { - $selectCriteria->add(CcShowPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcShowPeer::TABLE_NAME); - } - - } else { // $values is CcShow object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_show table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcShowPeer::TABLE_NAME, $con, CcShowPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcShowPeer::clearInstancePool(); - CcShowPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcShow or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcShow object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcShowPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcShow) { // it's a model object - // invalidate the cache for this single object - CcShowPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcShowPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcShowPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcShowPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcShow object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcShow $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcShow $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcShowPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcShowPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcShowPeer::DATABASE_NAME, CcShowPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcShow - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcShowPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcShowPeer::DATABASE_NAME); - $criteria->add(CcShowPeer::ID, $pk); - - $v = CcShowPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcShowPeer::DATABASE_NAME); - $criteria->add(CcShowPeer::ID, $pks, Criteria::IN); - $objs = CcShowPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcShowPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_show'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcShow'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcShowTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 13; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 13; + + /** the column name for the id field */ + const ID = 'cc_show.id'; + + /** the column name for the name field */ + const NAME = 'cc_show.name'; + + /** the column name for the url field */ + const URL = 'cc_show.url'; + + /** the column name for the genre field */ + const GENRE = 'cc_show.genre'; + + /** the column name for the description field */ + const DESCRIPTION = 'cc_show.description'; + + /** the column name for the color field */ + const COLOR = 'cc_show.color'; + + /** the column name for the background_color field */ + const BACKGROUND_COLOR = 'cc_show.background_color'; + + /** the column name for the live_stream_using_airtime_auth field */ + const LIVE_STREAM_USING_AIRTIME_AUTH = 'cc_show.live_stream_using_airtime_auth'; + + /** the column name for the live_stream_using_custom_auth field */ + const LIVE_STREAM_USING_CUSTOM_AUTH = 'cc_show.live_stream_using_custom_auth'; + + /** the column name for the live_stream_user field */ + const LIVE_STREAM_USER = 'cc_show.live_stream_user'; + + /** the column name for the live_stream_pass field */ + const LIVE_STREAM_PASS = 'cc_show.live_stream_pass'; + + /** the column name for the linked field */ + const LINKED = 'cc_show.linked'; + + /** the column name for the is_linkable field */ + const IS_LINKABLE = 'cc_show.is_linkable'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcShow objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcShow[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcShowPeer::$fieldNames[CcShowPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbUrl', 'DbGenre', 'DbDescription', 'DbColor', 'DbBackgroundColor', 'DbLiveStreamUsingAirtimeAuth', 'DbLiveStreamUsingCustomAuth', 'DbLiveStreamUser', 'DbLiveStreamPass', 'DbLinked', 'DbIsLinkable', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbUrl', 'dbGenre', 'dbDescription', 'dbColor', 'dbBackgroundColor', 'dbLiveStreamUsingAirtimeAuth', 'dbLiveStreamUsingCustomAuth', 'dbLiveStreamUser', 'dbLiveStreamPass', 'dbLinked', 'dbIsLinkable', ), + BasePeer::TYPE_COLNAME => array (CcShowPeer::ID, CcShowPeer::NAME, CcShowPeer::URL, CcShowPeer::GENRE, CcShowPeer::DESCRIPTION, CcShowPeer::COLOR, CcShowPeer::BACKGROUND_COLOR, CcShowPeer::LIVE_STREAM_USING_AIRTIME_AUTH, CcShowPeer::LIVE_STREAM_USING_CUSTOM_AUTH, CcShowPeer::LIVE_STREAM_USER, CcShowPeer::LIVE_STREAM_PASS, CcShowPeer::LINKED, CcShowPeer::IS_LINKABLE, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'URL', 'GENRE', 'DESCRIPTION', 'COLOR', 'BACKGROUND_COLOR', 'LIVE_STREAM_USING_AIRTIME_AUTH', 'LIVE_STREAM_USING_CUSTOM_AUTH', 'LIVE_STREAM_USER', 'LIVE_STREAM_PASS', 'LINKED', 'IS_LINKABLE', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'url', 'genre', 'description', 'color', 'background_color', 'live_stream_using_airtime_auth', 'live_stream_using_custom_auth', 'live_stream_user', 'live_stream_pass', 'linked', 'is_linkable', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcShowPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbUrl' => 2, 'DbGenre' => 3, 'DbDescription' => 4, 'DbColor' => 5, 'DbBackgroundColor' => 6, 'DbLiveStreamUsingAirtimeAuth' => 7, 'DbLiveStreamUsingCustomAuth' => 8, 'DbLiveStreamUser' => 9, 'DbLiveStreamPass' => 10, 'DbLinked' => 11, 'DbIsLinkable' => 12, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbUrl' => 2, 'dbGenre' => 3, 'dbDescription' => 4, 'dbColor' => 5, 'dbBackgroundColor' => 6, 'dbLiveStreamUsingAirtimeAuth' => 7, 'dbLiveStreamUsingCustomAuth' => 8, 'dbLiveStreamUser' => 9, 'dbLiveStreamPass' => 10, 'dbLinked' => 11, 'dbIsLinkable' => 12, ), + BasePeer::TYPE_COLNAME => array (CcShowPeer::ID => 0, CcShowPeer::NAME => 1, CcShowPeer::URL => 2, CcShowPeer::GENRE => 3, CcShowPeer::DESCRIPTION => 4, CcShowPeer::COLOR => 5, CcShowPeer::BACKGROUND_COLOR => 6, CcShowPeer::LIVE_STREAM_USING_AIRTIME_AUTH => 7, CcShowPeer::LIVE_STREAM_USING_CUSTOM_AUTH => 8, CcShowPeer::LIVE_STREAM_USER => 9, CcShowPeer::LIVE_STREAM_PASS => 10, CcShowPeer::LINKED => 11, CcShowPeer::IS_LINKABLE => 12, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'URL' => 2, 'GENRE' => 3, 'DESCRIPTION' => 4, 'COLOR' => 5, 'BACKGROUND_COLOR' => 6, 'LIVE_STREAM_USING_AIRTIME_AUTH' => 7, 'LIVE_STREAM_USING_CUSTOM_AUTH' => 8, 'LIVE_STREAM_USER' => 9, 'LIVE_STREAM_PASS' => 10, 'LINKED' => 11, 'IS_LINKABLE' => 12, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'url' => 2, 'genre' => 3, 'description' => 4, 'color' => 5, 'background_color' => 6, 'live_stream_using_airtime_auth' => 7, 'live_stream_using_custom_auth' => 8, 'live_stream_user' => 9, 'live_stream_pass' => 10, 'linked' => 11, 'is_linkable' => 12, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcShowPeer::getFieldNames($toType); + $key = isset(CcShowPeer::$fieldKeys[$fromType][$name]) ? CcShowPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcShowPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcShowPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcShowPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcShowPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcShowPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcShowPeer::ID); + $criteria->addSelectColumn(CcShowPeer::NAME); + $criteria->addSelectColumn(CcShowPeer::URL); + $criteria->addSelectColumn(CcShowPeer::GENRE); + $criteria->addSelectColumn(CcShowPeer::DESCRIPTION); + $criteria->addSelectColumn(CcShowPeer::COLOR); + $criteria->addSelectColumn(CcShowPeer::BACKGROUND_COLOR); + $criteria->addSelectColumn(CcShowPeer::LIVE_STREAM_USING_AIRTIME_AUTH); + $criteria->addSelectColumn(CcShowPeer::LIVE_STREAM_USING_CUSTOM_AUTH); + $criteria->addSelectColumn(CcShowPeer::LIVE_STREAM_USER); + $criteria->addSelectColumn(CcShowPeer::LIVE_STREAM_PASS); + $criteria->addSelectColumn(CcShowPeer::LINKED); + $criteria->addSelectColumn(CcShowPeer::IS_LINKABLE); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.name'); + $criteria->addSelectColumn($alias . '.url'); + $criteria->addSelectColumn($alias . '.genre'); + $criteria->addSelectColumn($alias . '.description'); + $criteria->addSelectColumn($alias . '.color'); + $criteria->addSelectColumn($alias . '.background_color'); + $criteria->addSelectColumn($alias . '.live_stream_using_airtime_auth'); + $criteria->addSelectColumn($alias . '.live_stream_using_custom_auth'); + $criteria->addSelectColumn($alias . '.live_stream_user'); + $criteria->addSelectColumn($alias . '.live_stream_pass'); + $criteria->addSelectColumn($alias . '.linked'); + $criteria->addSelectColumn($alias . '.is_linkable'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcShowPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcShow + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcShowPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcShowPeer::populateObjects(CcShowPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcShowPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcShowPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcShow $obj A CcShow object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcShowPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcShow object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcShow) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcShow object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcShowPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcShow Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcShowPeer::$instances[$key])) { + return CcShowPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcShowPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcShowPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_show + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in CcShowInstancesPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcShowInstancesPeer::clearInstancePool(); + // Invalidate objects in CcShowDaysPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcShowDaysPeer::clearInstancePool(); + // Invalidate objects in CcShowRebroadcastPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcShowRebroadcastPeer::clearInstancePool(); + // Invalidate objects in CcShowHostsPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcShowHostsPeer::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcShowPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcShowPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcShowPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcShowPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcShow object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcShowPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcShowPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcShowPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcShowPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcShowPeer::DATABASE_NAME)->getTable(CcShowPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcShowPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcShowPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcShowTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcShowPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcShow or Criteria object. + * + * @param mixed $values Criteria or CcShow object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcShow object + } + + if ($criteria->containsKey(CcShowPeer::ID) && $criteria->keyContainsValue(CcShowPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcShowPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcShow or Criteria object. + * + * @param mixed $values Criteria or CcShow object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcShowPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcShowPeer::ID); + $value = $criteria->remove(CcShowPeer::ID); + if ($value) { + $selectCriteria->add(CcShowPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcShowPeer::TABLE_NAME); + } + + } else { // $values is CcShow object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcShowPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_show table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcShowPeer::TABLE_NAME, $con, CcShowPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcShowPeer::clearInstancePool(); + CcShowPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcShow or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcShow object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcShowPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcShow) { // it's a model object + // invalidate the cache for this single object + CcShowPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcShowPeer::DATABASE_NAME); + $criteria->add(CcShowPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcShowPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcShowPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcShowPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcShow object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcShow $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcShowPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcShowPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcShowPeer::DATABASE_NAME, CcShowPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcShow + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcShowPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcShowPeer::DATABASE_NAME); + $criteria->add(CcShowPeer::ID, $pk); + + $v = CcShowPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcShow[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcShowPeer::DATABASE_NAME); + $criteria->add(CcShowPeer::ID, $pks, Criteria::IN); + $objs = CcShowPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcShowPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcShowQuery.php index 687335e038..e9e7b1fc14 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowQuery.php @@ -4,726 +4,973 @@ /** * Base class that represents a query for the 'cc_show' table. * - * * - * @method CcShowQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcShowQuery orderByDbName($order = Criteria::ASC) Order by the name column - * @method CcShowQuery orderByDbUrl($order = Criteria::ASC) Order by the url column - * @method CcShowQuery orderByDbGenre($order = Criteria::ASC) Order by the genre column - * @method CcShowQuery orderByDbDescription($order = Criteria::ASC) Order by the description column - * @method CcShowQuery orderByDbColor($order = Criteria::ASC) Order by the color column - * @method CcShowQuery orderByDbBackgroundColor($order = Criteria::ASC) Order by the background_color column - * @method CcShowQuery orderByDbLiveStreamUsingAirtimeAuth($order = Criteria::ASC) Order by the live_stream_using_airtime_auth column - * @method CcShowQuery orderByDbLiveStreamUsingCustomAuth($order = Criteria::ASC) Order by the live_stream_using_custom_auth column - * @method CcShowQuery orderByDbLiveStreamUser($order = Criteria::ASC) Order by the live_stream_user column - * @method CcShowQuery orderByDbLiveStreamPass($order = Criteria::ASC) Order by the live_stream_pass column - * @method CcShowQuery orderByDbLinked($order = Criteria::ASC) Order by the linked column - * @method CcShowQuery orderByDbIsLinkable($order = Criteria::ASC) Order by the is_linkable column * - * @method CcShowQuery groupByDbId() Group by the id column - * @method CcShowQuery groupByDbName() Group by the name column - * @method CcShowQuery groupByDbUrl() Group by the url column - * @method CcShowQuery groupByDbGenre() Group by the genre column - * @method CcShowQuery groupByDbDescription() Group by the description column - * @method CcShowQuery groupByDbColor() Group by the color column - * @method CcShowQuery groupByDbBackgroundColor() Group by the background_color column - * @method CcShowQuery groupByDbLiveStreamUsingAirtimeAuth() Group by the live_stream_using_airtime_auth column - * @method CcShowQuery groupByDbLiveStreamUsingCustomAuth() Group by the live_stream_using_custom_auth column - * @method CcShowQuery groupByDbLiveStreamUser() Group by the live_stream_user column - * @method CcShowQuery groupByDbLiveStreamPass() Group by the live_stream_pass column - * @method CcShowQuery groupByDbLinked() Group by the linked column - * @method CcShowQuery groupByDbIsLinkable() Group by the is_linkable column + * @method CcShowQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcShowQuery orderByDbName($order = Criteria::ASC) Order by the name column + * @method CcShowQuery orderByDbUrl($order = Criteria::ASC) Order by the url column + * @method CcShowQuery orderByDbGenre($order = Criteria::ASC) Order by the genre column + * @method CcShowQuery orderByDbDescription($order = Criteria::ASC) Order by the description column + * @method CcShowQuery orderByDbColor($order = Criteria::ASC) Order by the color column + * @method CcShowQuery orderByDbBackgroundColor($order = Criteria::ASC) Order by the background_color column + * @method CcShowQuery orderByDbLiveStreamUsingAirtimeAuth($order = Criteria::ASC) Order by the live_stream_using_airtime_auth column + * @method CcShowQuery orderByDbLiveStreamUsingCustomAuth($order = Criteria::ASC) Order by the live_stream_using_custom_auth column + * @method CcShowQuery orderByDbLiveStreamUser($order = Criteria::ASC) Order by the live_stream_user column + * @method CcShowQuery orderByDbLiveStreamPass($order = Criteria::ASC) Order by the live_stream_pass column + * @method CcShowQuery orderByDbLinked($order = Criteria::ASC) Order by the linked column + * @method CcShowQuery orderByDbIsLinkable($order = Criteria::ASC) Order by the is_linkable column * - * @method CcShowQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcShowQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcShowQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcShowQuery groupByDbId() Group by the id column + * @method CcShowQuery groupByDbName() Group by the name column + * @method CcShowQuery groupByDbUrl() Group by the url column + * @method CcShowQuery groupByDbGenre() Group by the genre column + * @method CcShowQuery groupByDbDescription() Group by the description column + * @method CcShowQuery groupByDbColor() Group by the color column + * @method CcShowQuery groupByDbBackgroundColor() Group by the background_color column + * @method CcShowQuery groupByDbLiveStreamUsingAirtimeAuth() Group by the live_stream_using_airtime_auth column + * @method CcShowQuery groupByDbLiveStreamUsingCustomAuth() Group by the live_stream_using_custom_auth column + * @method CcShowQuery groupByDbLiveStreamUser() Group by the live_stream_user column + * @method CcShowQuery groupByDbLiveStreamPass() Group by the live_stream_pass column + * @method CcShowQuery groupByDbLinked() Group by the linked column + * @method CcShowQuery groupByDbIsLinkable() Group by the is_linkable column * - * @method CcShowQuery leftJoinCcShowInstances($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShowInstances relation - * @method CcShowQuery rightJoinCcShowInstances($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShowInstances relation - * @method CcShowQuery innerJoinCcShowInstances($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShowInstances relation + * @method CcShowQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcShowQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcShowQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcShowQuery leftJoinCcShowDays($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShowDays relation - * @method CcShowQuery rightJoinCcShowDays($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShowDays relation - * @method CcShowQuery innerJoinCcShowDays($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShowDays relation + * @method CcShowQuery leftJoinCcShowInstances($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShowInstances relation + * @method CcShowQuery rightJoinCcShowInstances($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShowInstances relation + * @method CcShowQuery innerJoinCcShowInstances($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShowInstances relation * - * @method CcShowQuery leftJoinCcShowRebroadcast($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShowRebroadcast relation - * @method CcShowQuery rightJoinCcShowRebroadcast($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShowRebroadcast relation - * @method CcShowQuery innerJoinCcShowRebroadcast($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShowRebroadcast relation + * @method CcShowQuery leftJoinCcShowDays($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShowDays relation + * @method CcShowQuery rightJoinCcShowDays($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShowDays relation + * @method CcShowQuery innerJoinCcShowDays($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShowDays relation * - * @method CcShowQuery leftJoinCcShowHosts($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShowHosts relation - * @method CcShowQuery rightJoinCcShowHosts($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShowHosts relation - * @method CcShowQuery innerJoinCcShowHosts($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShowHosts relation + * @method CcShowQuery leftJoinCcShowRebroadcast($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShowRebroadcast relation + * @method CcShowQuery rightJoinCcShowRebroadcast($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShowRebroadcast relation + * @method CcShowQuery innerJoinCcShowRebroadcast($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShowRebroadcast relation * - * @method CcShow findOne(PropelPDO $con = null) Return the first CcShow matching the query - * @method CcShow findOneOrCreate(PropelPDO $con = null) Return the first CcShow matching the query, or a new CcShow object populated from the query conditions when no match is found + * @method CcShowQuery leftJoinCcShowHosts($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShowHosts relation + * @method CcShowQuery rightJoinCcShowHosts($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShowHosts relation + * @method CcShowQuery innerJoinCcShowHosts($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShowHosts relation * - * @method CcShow findOneByDbId(int $id) Return the first CcShow filtered by the id column - * @method CcShow findOneByDbName(string $name) Return the first CcShow filtered by the name column - * @method CcShow findOneByDbUrl(string $url) Return the first CcShow filtered by the url column - * @method CcShow findOneByDbGenre(string $genre) Return the first CcShow filtered by the genre column - * @method CcShow findOneByDbDescription(string $description) Return the first CcShow filtered by the description column - * @method CcShow findOneByDbColor(string $color) Return the first CcShow filtered by the color column - * @method CcShow findOneByDbBackgroundColor(string $background_color) Return the first CcShow filtered by the background_color column - * @method CcShow findOneByDbLiveStreamUsingAirtimeAuth(boolean $live_stream_using_airtime_auth) Return the first CcShow filtered by the live_stream_using_airtime_auth column - * @method CcShow findOneByDbLiveStreamUsingCustomAuth(boolean $live_stream_using_custom_auth) Return the first CcShow filtered by the live_stream_using_custom_auth column - * @method CcShow findOneByDbLiveStreamUser(string $live_stream_user) Return the first CcShow filtered by the live_stream_user column - * @method CcShow findOneByDbLiveStreamPass(string $live_stream_pass) Return the first CcShow filtered by the live_stream_pass column - * @method CcShow findOneByDbLinked(boolean $linked) Return the first CcShow filtered by the linked column - * @method CcShow findOneByDbIsLinkable(boolean $is_linkable) Return the first CcShow filtered by the is_linkable column + * @method CcShow findOne(PropelPDO $con = null) Return the first CcShow matching the query + * @method CcShow findOneOrCreate(PropelPDO $con = null) Return the first CcShow matching the query, or a new CcShow object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcShow objects filtered by the id column - * @method array findByDbName(string $name) Return CcShow objects filtered by the name column - * @method array findByDbUrl(string $url) Return CcShow objects filtered by the url column - * @method array findByDbGenre(string $genre) Return CcShow objects filtered by the genre column - * @method array findByDbDescription(string $description) Return CcShow objects filtered by the description column - * @method array findByDbColor(string $color) Return CcShow objects filtered by the color column - * @method array findByDbBackgroundColor(string $background_color) Return CcShow objects filtered by the background_color column - * @method array findByDbLiveStreamUsingAirtimeAuth(boolean $live_stream_using_airtime_auth) Return CcShow objects filtered by the live_stream_using_airtime_auth column - * @method array findByDbLiveStreamUsingCustomAuth(boolean $live_stream_using_custom_auth) Return CcShow objects filtered by the live_stream_using_custom_auth column - * @method array findByDbLiveStreamUser(string $live_stream_user) Return CcShow objects filtered by the live_stream_user column - * @method array findByDbLiveStreamPass(string $live_stream_pass) Return CcShow objects filtered by the live_stream_pass column - * @method array findByDbLinked(boolean $linked) Return CcShow objects filtered by the linked column - * @method array findByDbIsLinkable(boolean $is_linkable) Return CcShow objects filtered by the is_linkable column + * @method CcShow findOneByDbName(string $name) Return the first CcShow filtered by the name column + * @method CcShow findOneByDbUrl(string $url) Return the first CcShow filtered by the url column + * @method CcShow findOneByDbGenre(string $genre) Return the first CcShow filtered by the genre column + * @method CcShow findOneByDbDescription(string $description) Return the first CcShow filtered by the description column + * @method CcShow findOneByDbColor(string $color) Return the first CcShow filtered by the color column + * @method CcShow findOneByDbBackgroundColor(string $background_color) Return the first CcShow filtered by the background_color column + * @method CcShow findOneByDbLiveStreamUsingAirtimeAuth(boolean $live_stream_using_airtime_auth) Return the first CcShow filtered by the live_stream_using_airtime_auth column + * @method CcShow findOneByDbLiveStreamUsingCustomAuth(boolean $live_stream_using_custom_auth) Return the first CcShow filtered by the live_stream_using_custom_auth column + * @method CcShow findOneByDbLiveStreamUser(string $live_stream_user) Return the first CcShow filtered by the live_stream_user column + * @method CcShow findOneByDbLiveStreamPass(string $live_stream_pass) Return the first CcShow filtered by the live_stream_pass column + * @method CcShow findOneByDbLinked(boolean $linked) Return the first CcShow filtered by the linked column + * @method CcShow findOneByDbIsLinkable(boolean $is_linkable) Return the first CcShow filtered by the is_linkable column + * + * @method array findByDbId(int $id) Return CcShow objects filtered by the id column + * @method array findByDbName(string $name) Return CcShow objects filtered by the name column + * @method array findByDbUrl(string $url) Return CcShow objects filtered by the url column + * @method array findByDbGenre(string $genre) Return CcShow objects filtered by the genre column + * @method array findByDbDescription(string $description) Return CcShow objects filtered by the description column + * @method array findByDbColor(string $color) Return CcShow objects filtered by the color column + * @method array findByDbBackgroundColor(string $background_color) Return CcShow objects filtered by the background_color column + * @method array findByDbLiveStreamUsingAirtimeAuth(boolean $live_stream_using_airtime_auth) Return CcShow objects filtered by the live_stream_using_airtime_auth column + * @method array findByDbLiveStreamUsingCustomAuth(boolean $live_stream_using_custom_auth) Return CcShow objects filtered by the live_stream_using_custom_auth column + * @method array findByDbLiveStreamUser(string $live_stream_user) Return CcShow objects filtered by the live_stream_user column + * @method array findByDbLiveStreamPass(string $live_stream_pass) Return CcShow objects filtered by the live_stream_pass column + * @method array findByDbLinked(boolean $linked) Return CcShow objects filtered by the linked column + * @method array findByDbIsLinkable(boolean $is_linkable) Return CcShow objects filtered by the is_linkable column * * @package propel.generator.airtime.om */ abstract class BaseCcShowQuery extends ModelCriteria { - - /** - * Initializes internal state of BaseCcShowQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcShow', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcShowQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcShowQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcShowQuery) { - return $criteria; - } - $query = new CcShowQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcShow|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcShowPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcShowPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcShowPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcShowPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the name column - * - * @param string $dbName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByDbName($dbName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbName)) { - $dbName = str_replace('*', '%', $dbName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcShowPeer::NAME, $dbName, $comparison); - } - - /** - * Filter the query on the url column - * - * @param string $dbUrl The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByDbUrl($dbUrl = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbUrl)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbUrl)) { - $dbUrl = str_replace('*', '%', $dbUrl); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcShowPeer::URL, $dbUrl, $comparison); - } - - /** - * Filter the query on the genre column - * - * @param string $dbGenre The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByDbGenre($dbGenre = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbGenre)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbGenre)) { - $dbGenre = str_replace('*', '%', $dbGenre); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcShowPeer::GENRE, $dbGenre, $comparison); - } - - /** - * Filter the query on the description column - * - * @param string $dbDescription The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByDbDescription($dbDescription = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbDescription)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbDescription)) { - $dbDescription = str_replace('*', '%', $dbDescription); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcShowPeer::DESCRIPTION, $dbDescription, $comparison); - } - - /** - * Filter the query on the color column - * - * @param string $dbColor The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByDbColor($dbColor = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbColor)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbColor)) { - $dbColor = str_replace('*', '%', $dbColor); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcShowPeer::COLOR, $dbColor, $comparison); - } - - /** - * Filter the query on the background_color column - * - * @param string $dbBackgroundColor The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByDbBackgroundColor($dbBackgroundColor = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbBackgroundColor)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbBackgroundColor)) { - $dbBackgroundColor = str_replace('*', '%', $dbBackgroundColor); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcShowPeer::BACKGROUND_COLOR, $dbBackgroundColor, $comparison); - } - - /** - * Filter the query on the live_stream_using_airtime_auth column - * - * @param boolean|string $dbLiveStreamUsingAirtimeAuth The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByDbLiveStreamUsingAirtimeAuth($dbLiveStreamUsingAirtimeAuth = null, $comparison = null) - { - if (is_string($dbLiveStreamUsingAirtimeAuth)) { - $live_stream_using_airtime_auth = in_array(strtolower($dbLiveStreamUsingAirtimeAuth), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcShowPeer::LIVE_STREAM_USING_AIRTIME_AUTH, $dbLiveStreamUsingAirtimeAuth, $comparison); - } - - /** - * Filter the query on the live_stream_using_custom_auth column - * - * @param boolean|string $dbLiveStreamUsingCustomAuth The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByDbLiveStreamUsingCustomAuth($dbLiveStreamUsingCustomAuth = null, $comparison = null) - { - if (is_string($dbLiveStreamUsingCustomAuth)) { - $live_stream_using_custom_auth = in_array(strtolower($dbLiveStreamUsingCustomAuth), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcShowPeer::LIVE_STREAM_USING_CUSTOM_AUTH, $dbLiveStreamUsingCustomAuth, $comparison); - } - - /** - * Filter the query on the live_stream_user column - * - * @param string $dbLiveStreamUser The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByDbLiveStreamUser($dbLiveStreamUser = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLiveStreamUser)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLiveStreamUser)) { - $dbLiveStreamUser = str_replace('*', '%', $dbLiveStreamUser); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcShowPeer::LIVE_STREAM_USER, $dbLiveStreamUser, $comparison); - } - - /** - * Filter the query on the live_stream_pass column - * - * @param string $dbLiveStreamPass The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByDbLiveStreamPass($dbLiveStreamPass = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLiveStreamPass)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLiveStreamPass)) { - $dbLiveStreamPass = str_replace('*', '%', $dbLiveStreamPass); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcShowPeer::LIVE_STREAM_PASS, $dbLiveStreamPass, $comparison); - } - - /** - * Filter the query on the linked column - * - * @param boolean|string $dbLinked The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByDbLinked($dbLinked = null, $comparison = null) - { - if (is_string($dbLinked)) { - $linked = in_array(strtolower($dbLinked), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcShowPeer::LINKED, $dbLinked, $comparison); - } - - /** - * Filter the query on the is_linkable column - * - * @param boolean|string $dbIsLinkable The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByDbIsLinkable($dbIsLinkable = null, $comparison = null) - { - if (is_string($dbIsLinkable)) { - $is_linkable = in_array(strtolower($dbIsLinkable), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - } - return $this->addUsingAlias(CcShowPeer::IS_LINKABLE, $dbIsLinkable, $comparison); - } - - /** - * Filter the query by a related CcShowInstances object - * - * @param CcShowInstances $ccShowInstances the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByCcShowInstances($ccShowInstances, $comparison = null) - { - return $this - ->addUsingAlias(CcShowPeer::ID, $ccShowInstances->getDbShowId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShowInstances relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowQuery The current query, for fluid interface - */ - public function joinCcShowInstances($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShowInstances'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShowInstances'); - } - - return $this; - } - - /** - * Use the CcShowInstances relation CcShowInstances object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowInstancesQuery A secondary query class using the current class as primary query - */ - public function useCcShowInstancesQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcShowInstances($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShowInstances', 'CcShowInstancesQuery'); - } - - /** - * Filter the query by a related CcShowDays object - * - * @param CcShowDays $ccShowDays the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByCcShowDays($ccShowDays, $comparison = null) - { - return $this - ->addUsingAlias(CcShowPeer::ID, $ccShowDays->getDbShowId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShowDays relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowQuery The current query, for fluid interface - */ - public function joinCcShowDays($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShowDays'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShowDays'); - } - - return $this; - } - - /** - * Use the CcShowDays relation CcShowDays object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowDaysQuery A secondary query class using the current class as primary query - */ - public function useCcShowDaysQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcShowDays($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShowDays', 'CcShowDaysQuery'); - } - - /** - * Filter the query by a related CcShowRebroadcast object - * - * @param CcShowRebroadcast $ccShowRebroadcast the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByCcShowRebroadcast($ccShowRebroadcast, $comparison = null) - { - return $this - ->addUsingAlias(CcShowPeer::ID, $ccShowRebroadcast->getDbShowId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShowRebroadcast relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowQuery The current query, for fluid interface - */ - public function joinCcShowRebroadcast($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShowRebroadcast'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShowRebroadcast'); - } - - return $this; - } - - /** - * Use the CcShowRebroadcast relation CcShowRebroadcast object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowRebroadcastQuery A secondary query class using the current class as primary query - */ - public function useCcShowRebroadcastQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcShowRebroadcast($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShowRebroadcast', 'CcShowRebroadcastQuery'); - } - - /** - * Filter the query by a related CcShowHosts object - * - * @param CcShowHosts $ccShowHosts the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowQuery The current query, for fluid interface - */ - public function filterByCcShowHosts($ccShowHosts, $comparison = null) - { - return $this - ->addUsingAlias(CcShowPeer::ID, $ccShowHosts->getDbShow(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShowHosts relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowQuery The current query, for fluid interface - */ - public function joinCcShowHosts($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShowHosts'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShowHosts'); - } - - return $this; - } - - /** - * Use the CcShowHosts relation CcShowHosts object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowHostsQuery A secondary query class using the current class as primary query - */ - public function useCcShowHostsQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcShowHosts($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShowHosts', 'CcShowHostsQuery'); - } - - /** - * Exclude object from result - * - * @param CcShow $ccShow Object to remove from the list of results - * - * @return CcShowQuery The current query, for fluid interface - */ - public function prune($ccShow = null) - { - if ($ccShow) { - $this->addUsingAlias(CcShowPeer::ID, $ccShow->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcShowQuery + /** + * Initializes internal state of BaseCcShowQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcShow'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcShowQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcShowQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcShowQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcShowQuery) { + return $criteria; + } + $query = new CcShowQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcShow|CcShow[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcShowPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcShowPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShow A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShow A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "name", "url", "genre", "description", "color", "background_color", "live_stream_using_airtime_auth", "live_stream_using_custom_auth", "live_stream_user", "live_stream_pass", "linked", "is_linkable" FROM "cc_show" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcShow(); + $obj->hydrate($row); + CcShowPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShow|CcShow[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcShow[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcShowPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcShowPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcShowPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcShowPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the name column + * + * Example usage: + * + * $query->filterByDbName('fooValue'); // WHERE name = 'fooValue' + * $query->filterByDbName('%fooValue%'); // WHERE name LIKE '%fooValue%' + * + * + * @param string $dbName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByDbName($dbName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbName)) { + $dbName = str_replace('*', '%', $dbName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcShowPeer::NAME, $dbName, $comparison); + } + + /** + * Filter the query on the url column + * + * Example usage: + * + * $query->filterByDbUrl('fooValue'); // WHERE url = 'fooValue' + * $query->filterByDbUrl('%fooValue%'); // WHERE url LIKE '%fooValue%' + * + * + * @param string $dbUrl The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByDbUrl($dbUrl = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbUrl)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbUrl)) { + $dbUrl = str_replace('*', '%', $dbUrl); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcShowPeer::URL, $dbUrl, $comparison); + } + + /** + * Filter the query on the genre column + * + * Example usage: + * + * $query->filterByDbGenre('fooValue'); // WHERE genre = 'fooValue' + * $query->filterByDbGenre('%fooValue%'); // WHERE genre LIKE '%fooValue%' + * + * + * @param string $dbGenre The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByDbGenre($dbGenre = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbGenre)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbGenre)) { + $dbGenre = str_replace('*', '%', $dbGenre); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcShowPeer::GENRE, $dbGenre, $comparison); + } + + /** + * Filter the query on the description column + * + * Example usage: + * + * $query->filterByDbDescription('fooValue'); // WHERE description = 'fooValue' + * $query->filterByDbDescription('%fooValue%'); // WHERE description LIKE '%fooValue%' + * + * + * @param string $dbDescription The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByDbDescription($dbDescription = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbDescription)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbDescription)) { + $dbDescription = str_replace('*', '%', $dbDescription); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcShowPeer::DESCRIPTION, $dbDescription, $comparison); + } + + /** + * Filter the query on the color column + * + * Example usage: + * + * $query->filterByDbColor('fooValue'); // WHERE color = 'fooValue' + * $query->filterByDbColor('%fooValue%'); // WHERE color LIKE '%fooValue%' + * + * + * @param string $dbColor The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByDbColor($dbColor = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbColor)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbColor)) { + $dbColor = str_replace('*', '%', $dbColor); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcShowPeer::COLOR, $dbColor, $comparison); + } + + /** + * Filter the query on the background_color column + * + * Example usage: + * + * $query->filterByDbBackgroundColor('fooValue'); // WHERE background_color = 'fooValue' + * $query->filterByDbBackgroundColor('%fooValue%'); // WHERE background_color LIKE '%fooValue%' + * + * + * @param string $dbBackgroundColor The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByDbBackgroundColor($dbBackgroundColor = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbBackgroundColor)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbBackgroundColor)) { + $dbBackgroundColor = str_replace('*', '%', $dbBackgroundColor); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcShowPeer::BACKGROUND_COLOR, $dbBackgroundColor, $comparison); + } + + /** + * Filter the query on the live_stream_using_airtime_auth column + * + * Example usage: + * + * $query->filterByDbLiveStreamUsingAirtimeAuth(true); // WHERE live_stream_using_airtime_auth = true + * $query->filterByDbLiveStreamUsingAirtimeAuth('yes'); // WHERE live_stream_using_airtime_auth = true + * + * + * @param boolean|string $dbLiveStreamUsingAirtimeAuth The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByDbLiveStreamUsingAirtimeAuth($dbLiveStreamUsingAirtimeAuth = null, $comparison = null) + { + if (is_string($dbLiveStreamUsingAirtimeAuth)) { + $dbLiveStreamUsingAirtimeAuth = in_array(strtolower($dbLiveStreamUsingAirtimeAuth), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcShowPeer::LIVE_STREAM_USING_AIRTIME_AUTH, $dbLiveStreamUsingAirtimeAuth, $comparison); + } + + /** + * Filter the query on the live_stream_using_custom_auth column + * + * Example usage: + * + * $query->filterByDbLiveStreamUsingCustomAuth(true); // WHERE live_stream_using_custom_auth = true + * $query->filterByDbLiveStreamUsingCustomAuth('yes'); // WHERE live_stream_using_custom_auth = true + * + * + * @param boolean|string $dbLiveStreamUsingCustomAuth The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByDbLiveStreamUsingCustomAuth($dbLiveStreamUsingCustomAuth = null, $comparison = null) + { + if (is_string($dbLiveStreamUsingCustomAuth)) { + $dbLiveStreamUsingCustomAuth = in_array(strtolower($dbLiveStreamUsingCustomAuth), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcShowPeer::LIVE_STREAM_USING_CUSTOM_AUTH, $dbLiveStreamUsingCustomAuth, $comparison); + } + + /** + * Filter the query on the live_stream_user column + * + * Example usage: + * + * $query->filterByDbLiveStreamUser('fooValue'); // WHERE live_stream_user = 'fooValue' + * $query->filterByDbLiveStreamUser('%fooValue%'); // WHERE live_stream_user LIKE '%fooValue%' + * + * + * @param string $dbLiveStreamUser The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByDbLiveStreamUser($dbLiveStreamUser = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLiveStreamUser)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLiveStreamUser)) { + $dbLiveStreamUser = str_replace('*', '%', $dbLiveStreamUser); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcShowPeer::LIVE_STREAM_USER, $dbLiveStreamUser, $comparison); + } + + /** + * Filter the query on the live_stream_pass column + * + * Example usage: + * + * $query->filterByDbLiveStreamPass('fooValue'); // WHERE live_stream_pass = 'fooValue' + * $query->filterByDbLiveStreamPass('%fooValue%'); // WHERE live_stream_pass LIKE '%fooValue%' + * + * + * @param string $dbLiveStreamPass The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByDbLiveStreamPass($dbLiveStreamPass = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLiveStreamPass)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLiveStreamPass)) { + $dbLiveStreamPass = str_replace('*', '%', $dbLiveStreamPass); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcShowPeer::LIVE_STREAM_PASS, $dbLiveStreamPass, $comparison); + } + + /** + * Filter the query on the linked column + * + * Example usage: + * + * $query->filterByDbLinked(true); // WHERE linked = true + * $query->filterByDbLinked('yes'); // WHERE linked = true + * + * + * @param boolean|string $dbLinked The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByDbLinked($dbLinked = null, $comparison = null) + { + if (is_string($dbLinked)) { + $dbLinked = in_array(strtolower($dbLinked), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcShowPeer::LINKED, $dbLinked, $comparison); + } + + /** + * Filter the query on the is_linkable column + * + * Example usage: + * + * $query->filterByDbIsLinkable(true); // WHERE is_linkable = true + * $query->filterByDbIsLinkable('yes'); // WHERE is_linkable = true + * + * + * @param boolean|string $dbIsLinkable The value to use as filter. + * Non-boolean arguments are converted using the following rules: + * * 1, '1', 'true', 'on', and 'yes' are converted to boolean true + * * 0, '0', 'false', 'off', and 'no' are converted to boolean false + * Check on string values is case insensitive (so 'FaLsE' is seen as 'false'). + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + */ + public function filterByDbIsLinkable($dbIsLinkable = null, $comparison = null) + { + if (is_string($dbIsLinkable)) { + $dbIsLinkable = in_array(strtolower($dbIsLinkable), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true; + } + + return $this->addUsingAlias(CcShowPeer::IS_LINKABLE, $dbIsLinkable, $comparison); + } + + /** + * Filter the query by a related CcShowInstances object + * + * @param CcShowInstances|PropelObjectCollection $ccShowInstances the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShowInstances($ccShowInstances, $comparison = null) + { + if ($ccShowInstances instanceof CcShowInstances) { + return $this + ->addUsingAlias(CcShowPeer::ID, $ccShowInstances->getDbShowId(), $comparison); + } elseif ($ccShowInstances instanceof PropelObjectCollection) { + return $this + ->useCcShowInstancesQuery() + ->filterByPrimaryKeys($ccShowInstances->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcShowInstances() only accepts arguments of type CcShowInstances or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShowInstances relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowQuery The current query, for fluid interface + */ + public function joinCcShowInstances($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShowInstances'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShowInstances'); + } + + return $this; + } + + /** + * Use the CcShowInstances relation CcShowInstances object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowInstancesQuery A secondary query class using the current class as primary query + */ + public function useCcShowInstancesQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcShowInstances($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShowInstances', 'CcShowInstancesQuery'); + } + + /** + * Filter the query by a related CcShowDays object + * + * @param CcShowDays|PropelObjectCollection $ccShowDays the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShowDays($ccShowDays, $comparison = null) + { + if ($ccShowDays instanceof CcShowDays) { + return $this + ->addUsingAlias(CcShowPeer::ID, $ccShowDays->getDbShowId(), $comparison); + } elseif ($ccShowDays instanceof PropelObjectCollection) { + return $this + ->useCcShowDaysQuery() + ->filterByPrimaryKeys($ccShowDays->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcShowDays() only accepts arguments of type CcShowDays or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShowDays relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowQuery The current query, for fluid interface + */ + public function joinCcShowDays($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShowDays'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShowDays'); + } + + return $this; + } + + /** + * Use the CcShowDays relation CcShowDays object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowDaysQuery A secondary query class using the current class as primary query + */ + public function useCcShowDaysQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcShowDays($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShowDays', 'CcShowDaysQuery'); + } + + /** + * Filter the query by a related CcShowRebroadcast object + * + * @param CcShowRebroadcast|PropelObjectCollection $ccShowRebroadcast the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShowRebroadcast($ccShowRebroadcast, $comparison = null) + { + if ($ccShowRebroadcast instanceof CcShowRebroadcast) { + return $this + ->addUsingAlias(CcShowPeer::ID, $ccShowRebroadcast->getDbShowId(), $comparison); + } elseif ($ccShowRebroadcast instanceof PropelObjectCollection) { + return $this + ->useCcShowRebroadcastQuery() + ->filterByPrimaryKeys($ccShowRebroadcast->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcShowRebroadcast() only accepts arguments of type CcShowRebroadcast or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShowRebroadcast relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowQuery The current query, for fluid interface + */ + public function joinCcShowRebroadcast($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShowRebroadcast'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShowRebroadcast'); + } + + return $this; + } + + /** + * Use the CcShowRebroadcast relation CcShowRebroadcast object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowRebroadcastQuery A secondary query class using the current class as primary query + */ + public function useCcShowRebroadcastQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcShowRebroadcast($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShowRebroadcast', 'CcShowRebroadcastQuery'); + } + + /** + * Filter the query by a related CcShowHosts object + * + * @param CcShowHosts|PropelObjectCollection $ccShowHosts the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShowHosts($ccShowHosts, $comparison = null) + { + if ($ccShowHosts instanceof CcShowHosts) { + return $this + ->addUsingAlias(CcShowPeer::ID, $ccShowHosts->getDbShow(), $comparison); + } elseif ($ccShowHosts instanceof PropelObjectCollection) { + return $this + ->useCcShowHostsQuery() + ->filterByPrimaryKeys($ccShowHosts->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcShowHosts() only accepts arguments of type CcShowHosts or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShowHosts relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowQuery The current query, for fluid interface + */ + public function joinCcShowHosts($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShowHosts'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShowHosts'); + } + + return $this; + } + + /** + * Use the CcShowHosts relation CcShowHosts object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowHostsQuery A secondary query class using the current class as primary query + */ + public function useCcShowHostsQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcShowHosts($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShowHosts', 'CcShowHostsQuery'); + } + + /** + * Exclude object from result + * + * @param CcShow $ccShow Object to remove from the list of results + * + * @return CcShowQuery The current query, for fluid interface + */ + public function prune($ccShow = null) + { + if ($ccShow) { + $this->addUsingAlias(CcShowPeer::ID, $ccShow->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowRebroadcast.php b/airtime_mvc/application/models/airtime/om/BaseCcShowRebroadcast.php index aabd37d794..efbeba873d 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowRebroadcast.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowRebroadcast.php @@ -4,954 +4,1074 @@ /** * Base class that represents a row from the 'cc_show_rebroadcast' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcShowRebroadcast extends BaseObject implements Persistent +abstract class BaseCcShowRebroadcast extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcShowRebroadcastPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcShowRebroadcastPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the day_offset field. - * @var string - */ - protected $day_offset; - - /** - * The value for the start_time field. - * @var string - */ - protected $start_time; - - /** - * The value for the show_id field. - * @var int - */ - protected $show_id; - - /** - * @var CcShow - */ - protected $aCcShow; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [day_offset] column value. - * - * @return string - */ - public function getDbDayOffset() - { - return $this->day_offset; - } - - /** - * Get the [optionally formatted] temporal [start_time] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbStartTime($format = '%X') - { - if ($this->start_time === null) { - return null; - } - - - - try { - $dt = new DateTime($this->start_time); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->start_time, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [show_id] column value. - * - * @return int - */ - public function getDbShowId() - { - return $this->show_id; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcShowRebroadcast The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcShowRebroadcastPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [day_offset] column. - * - * @param string $v new value - * @return CcShowRebroadcast The current object (for fluent API support) - */ - public function setDbDayOffset($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->day_offset !== $v) { - $this->day_offset = $v; - $this->modifiedColumns[] = CcShowRebroadcastPeer::DAY_OFFSET; - } - - return $this; - } // setDbDayOffset() - - /** - * Sets the value of [start_time] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcShowRebroadcast The current object (for fluent API support) - */ - public function setDbStartTime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->start_time !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->start_time !== null && $tmpDt = new DateTime($this->start_time)) ? $tmpDt->format('H:i:s') : null; - $newNorm = ($dt !== null) ? $dt->format('H:i:s') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->start_time = ($dt ? $dt->format('H:i:s') : null); - $this->modifiedColumns[] = CcShowRebroadcastPeer::START_TIME; - } - } // if either are not null - - return $this; - } // setDbStartTime() - - /** - * Set the value of [show_id] column. - * - * @param int $v new value - * @return CcShowRebroadcast The current object (for fluent API support) - */ - public function setDbShowId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->show_id !== $v) { - $this->show_id = $v; - $this->modifiedColumns[] = CcShowRebroadcastPeer::SHOW_ID; - } - - if ($this->aCcShow !== null && $this->aCcShow->getDbId() !== $v) { - $this->aCcShow = null; - } - - return $this; - } // setDbShowId() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->day_offset = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->start_time = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->show_id = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 4; // 4 = CcShowRebroadcastPeer::NUM_COLUMNS - CcShowRebroadcastPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcShowRebroadcast object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcShow !== null && $this->show_id !== $this->aCcShow->getDbId()) { - $this->aCcShow = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcShowRebroadcastPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcShow = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcShowRebroadcastQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcShowRebroadcastPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcShow !== null) { - if ($this->aCcShow->isModified() || $this->aCcShow->isNew()) { - $affectedRows += $this->aCcShow->save($con); - } - $this->setCcShow($this->aCcShow); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcShowRebroadcastPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcShowRebroadcastPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowRebroadcastPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcShowRebroadcastPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcShow !== null) { - if (!$this->aCcShow->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcShow->getValidationFailures()); - } - } - - - if (($retval = CcShowRebroadcastPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcShowRebroadcastPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbDayOffset(); - break; - case 2: - return $this->getDbStartTime(); - break; - case 3: - return $this->getDbShowId(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcShowRebroadcastPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbDayOffset(), - $keys[2] => $this->getDbStartTime(), - $keys[3] => $this->getDbShowId(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcShow) { - $result['CcShow'] = $this->aCcShow->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcShowRebroadcastPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbDayOffset($value); - break; - case 2: - $this->setDbStartTime($value); - break; - case 3: - $this->setDbShowId($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcShowRebroadcastPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbDayOffset($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbStartTime($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbShowId($arr[$keys[3]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcShowRebroadcastPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcShowRebroadcastPeer::ID)) $criteria->add(CcShowRebroadcastPeer::ID, $this->id); - if ($this->isColumnModified(CcShowRebroadcastPeer::DAY_OFFSET)) $criteria->add(CcShowRebroadcastPeer::DAY_OFFSET, $this->day_offset); - if ($this->isColumnModified(CcShowRebroadcastPeer::START_TIME)) $criteria->add(CcShowRebroadcastPeer::START_TIME, $this->start_time); - if ($this->isColumnModified(CcShowRebroadcastPeer::SHOW_ID)) $criteria->add(CcShowRebroadcastPeer::SHOW_ID, $this->show_id); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcShowRebroadcastPeer::DATABASE_NAME); - $criteria->add(CcShowRebroadcastPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcShowRebroadcast (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbDayOffset($this->day_offset); - $copyObj->setDbStartTime($this->start_time); - $copyObj->setDbShowId($this->show_id); - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcShowRebroadcast Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcShowRebroadcastPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcShowRebroadcastPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcShow object. - * - * @param CcShow $v - * @return CcShowRebroadcast The current object (for fluent API support) - * @throws PropelException - */ - public function setCcShow(CcShow $v = null) - { - if ($v === null) { - $this->setDbShowId(NULL); - } else { - $this->setDbShowId($v->getDbId()); - } - - $this->aCcShow = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcShow object, it will not be re-added. - if ($v !== null) { - $v->addCcShowRebroadcast($this); - } - - return $this; - } - - - /** - * Get the associated CcShow object - * - * @param PropelPDO Optional Connection object. - * @return CcShow The associated CcShow object. - * @throws PropelException - */ - public function getCcShow(PropelPDO $con = null) - { - if ($this->aCcShow === null && ($this->show_id !== null)) { - $this->aCcShow = CcShowQuery::create()->findPk($this->show_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcShow->addCcShowRebroadcasts($this); - */ - } - return $this->aCcShow; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->day_offset = null; - $this->start_time = null; - $this->show_id = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcShow = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcShowRebroadcast + /** + * Peer class name + */ + const PEER = 'CcShowRebroadcastPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcShowRebroadcastPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the day_offset field. + * @var string + */ + protected $day_offset; + + /** + * The value for the start_time field. + * @var string + */ + protected $start_time; + + /** + * The value for the show_id field. + * @var int + */ + protected $show_id; + + /** + * @var CcShow + */ + protected $aCcShow; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [day_offset] column value. + * + * @return string + */ + public function getDbDayOffset() + { + + return $this->day_offset; + } + + /** + * Get the [optionally formatted] temporal [start_time] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbStartTime($format = '%X') + { + if ($this->start_time === null) { + return null; + } + + + try { + $dt = new DateTime($this->start_time); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->start_time, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [show_id] column value. + * + * @return int + */ + public function getDbShowId() + { + + return $this->show_id; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcShowRebroadcast The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcShowRebroadcastPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [day_offset] column. + * + * @param string $v new value + * @return CcShowRebroadcast The current object (for fluent API support) + */ + public function setDbDayOffset($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->day_offset !== $v) { + $this->day_offset = $v; + $this->modifiedColumns[] = CcShowRebroadcastPeer::DAY_OFFSET; + } + + + return $this; + } // setDbDayOffset() + + /** + * Sets the value of [start_time] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcShowRebroadcast The current object (for fluent API support) + */ + public function setDbStartTime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->start_time !== null || $dt !== null) { + $currentDateAsString = ($this->start_time !== null && $tmpDt = new DateTime($this->start_time)) ? $tmpDt->format('H:i:s') : null; + $newDateAsString = $dt ? $dt->format('H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->start_time = $newDateAsString; + $this->modifiedColumns[] = CcShowRebroadcastPeer::START_TIME; + } + } // if either are not null + + + return $this; + } // setDbStartTime() + + /** + * Set the value of [show_id] column. + * + * @param int $v new value + * @return CcShowRebroadcast The current object (for fluent API support) + */ + public function setDbShowId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->show_id !== $v) { + $this->show_id = $v; + $this->modifiedColumns[] = CcShowRebroadcastPeer::SHOW_ID; + } + + if ($this->aCcShow !== null && $this->aCcShow->getDbId() !== $v) { + $this->aCcShow = null; + } + + + return $this; + } // setDbShowId() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->day_offset = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->start_time = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->show_id = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 4; // 4 = CcShowRebroadcastPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcShowRebroadcast object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcShow !== null && $this->show_id !== $this->aCcShow->getDbId()) { + $this->aCcShow = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcShowRebroadcastPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcShow = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcShowRebroadcastQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcShowRebroadcastPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcShow !== null) { + if ($this->aCcShow->isModified() || $this->aCcShow->isNew()) { + $affectedRows += $this->aCcShow->save($con); + } + $this->setCcShow($this->aCcShow); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcShowRebroadcastPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcShowRebroadcastPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_show_rebroadcast_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcShowRebroadcastPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcShowRebroadcastPeer::DAY_OFFSET)) { + $modifiedColumns[':p' . $index++] = '"day_offset"'; + } + if ($this->isColumnModified(CcShowRebroadcastPeer::START_TIME)) { + $modifiedColumns[':p' . $index++] = '"start_time"'; + } + if ($this->isColumnModified(CcShowRebroadcastPeer::SHOW_ID)) { + $modifiedColumns[':p' . $index++] = '"show_id"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_show_rebroadcast" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"day_offset"': + $stmt->bindValue($identifier, $this->day_offset, PDO::PARAM_STR); + break; + case '"start_time"': + $stmt->bindValue($identifier, $this->start_time, PDO::PARAM_STR); + break; + case '"show_id"': + $stmt->bindValue($identifier, $this->show_id, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcShow !== null) { + if (!$this->aCcShow->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcShow->getValidationFailures()); + } + } + + + if (($retval = CcShowRebroadcastPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcShowRebroadcastPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbDayOffset(); + break; + case 2: + return $this->getDbStartTime(); + break; + case 3: + return $this->getDbShowId(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcShowRebroadcast'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcShowRebroadcast'][$this->getPrimaryKey()] = true; + $keys = CcShowRebroadcastPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbDayOffset(), + $keys[2] => $this->getDbStartTime(), + $keys[3] => $this->getDbShowId(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcShow) { + $result['CcShow'] = $this->aCcShow->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcShowRebroadcastPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbDayOffset($value); + break; + case 2: + $this->setDbStartTime($value); + break; + case 3: + $this->setDbShowId($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcShowRebroadcastPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbDayOffset($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbStartTime($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbShowId($arr[$keys[3]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcShowRebroadcastPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcShowRebroadcastPeer::ID)) $criteria->add(CcShowRebroadcastPeer::ID, $this->id); + if ($this->isColumnModified(CcShowRebroadcastPeer::DAY_OFFSET)) $criteria->add(CcShowRebroadcastPeer::DAY_OFFSET, $this->day_offset); + if ($this->isColumnModified(CcShowRebroadcastPeer::START_TIME)) $criteria->add(CcShowRebroadcastPeer::START_TIME, $this->start_time); + if ($this->isColumnModified(CcShowRebroadcastPeer::SHOW_ID)) $criteria->add(CcShowRebroadcastPeer::SHOW_ID, $this->show_id); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcShowRebroadcastPeer::DATABASE_NAME); + $criteria->add(CcShowRebroadcastPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcShowRebroadcast (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbDayOffset($this->getDbDayOffset()); + $copyObj->setDbStartTime($this->getDbStartTime()); + $copyObj->setDbShowId($this->getDbShowId()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcShowRebroadcast Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcShowRebroadcastPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcShowRebroadcastPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcShow object. + * + * @param CcShow $v + * @return CcShowRebroadcast The current object (for fluent API support) + * @throws PropelException + */ + public function setCcShow(CcShow $v = null) + { + if ($v === null) { + $this->setDbShowId(NULL); + } else { + $this->setDbShowId($v->getDbId()); + } + + $this->aCcShow = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcShow object, it will not be re-added. + if ($v !== null) { + $v->addCcShowRebroadcast($this); + } + + + return $this; + } + + + /** + * Get the associated CcShow object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcShow The associated CcShow object. + * @throws PropelException + */ + public function getCcShow(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcShow === null && ($this->show_id !== null) && $doQuery) { + $this->aCcShow = CcShowQuery::create()->findPk($this->show_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcShow->addCcShowRebroadcasts($this); + */ + } + + return $this->aCcShow; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->day_offset = null; + $this->start_time = null; + $this->show_id = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcShow instanceof Persistent) { + $this->aCcShow->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcShow = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcShowRebroadcastPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowRebroadcastPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcShowRebroadcastPeer.php index ef0434c70e..8f5c1e8836 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowRebroadcastPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowRebroadcastPeer.php @@ -4,976 +4,1002 @@ /** * Base static class for performing query and update operations on the 'cc_show_rebroadcast' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcShowRebroadcastPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_show_rebroadcast'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcShowRebroadcast'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcShowRebroadcast'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcShowRebroadcastTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 4; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_show_rebroadcast.ID'; - - /** the column name for the DAY_OFFSET field */ - const DAY_OFFSET = 'cc_show_rebroadcast.DAY_OFFSET'; - - /** the column name for the START_TIME field */ - const START_TIME = 'cc_show_rebroadcast.START_TIME'; - - /** the column name for the SHOW_ID field */ - const SHOW_ID = 'cc_show_rebroadcast.SHOW_ID'; - - /** - * An identiy map to hold any loaded instances of CcShowRebroadcast objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcShowRebroadcast[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbDayOffset', 'DbStartTime', 'DbShowId', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbDayOffset', 'dbStartTime', 'dbShowId', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::DAY_OFFSET, self::START_TIME, self::SHOW_ID, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'DAY_OFFSET', 'START_TIME', 'SHOW_ID', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'day_offset', 'start_time', 'show_id', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbDayOffset' => 1, 'DbStartTime' => 2, 'DbShowId' => 3, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbDayOffset' => 1, 'dbStartTime' => 2, 'dbShowId' => 3, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::DAY_OFFSET => 1, self::START_TIME => 2, self::SHOW_ID => 3, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'DAY_OFFSET' => 1, 'START_TIME' => 2, 'SHOW_ID' => 3, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'day_offset' => 1, 'start_time' => 2, 'show_id' => 3, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcShowRebroadcastPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcShowRebroadcastPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcShowRebroadcastPeer::ID); - $criteria->addSelectColumn(CcShowRebroadcastPeer::DAY_OFFSET); - $criteria->addSelectColumn(CcShowRebroadcastPeer::START_TIME); - $criteria->addSelectColumn(CcShowRebroadcastPeer::SHOW_ID); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.DAY_OFFSET'); - $criteria->addSelectColumn($alias . '.START_TIME'); - $criteria->addSelectColumn($alias . '.SHOW_ID'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowRebroadcastPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowRebroadcastPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcShowRebroadcast - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcShowRebroadcastPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcShowRebroadcastPeer::populateObjects(CcShowRebroadcastPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcShowRebroadcastPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcShowRebroadcast $value A CcShowRebroadcast object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcShowRebroadcast $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcShowRebroadcast object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcShowRebroadcast) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcShowRebroadcast object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcShowRebroadcast Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_show_rebroadcast - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcShowRebroadcastPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcShowRebroadcastPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcShowRebroadcastPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcShowRebroadcastPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcShowRebroadcast object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcShowRebroadcastPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcShowRebroadcastPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcShowRebroadcastPeer::NUM_COLUMNS; - } else { - $cls = CcShowRebroadcastPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcShowRebroadcastPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcShow table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowRebroadcastPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowRebroadcastPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowRebroadcastPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcShowRebroadcast objects pre-filled with their CcShow objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowRebroadcast objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowRebroadcastPeer::addSelectColumns($criteria); - $startcol = (CcShowRebroadcastPeer::NUM_COLUMNS - CcShowRebroadcastPeer::NUM_LAZY_LOAD_COLUMNS); - CcShowPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcShowRebroadcastPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowRebroadcastPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowRebroadcastPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcShowRebroadcastPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowRebroadcastPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcShowPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcShowPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcShowRebroadcast) to $obj2 (CcShow) - $obj2->addCcShowRebroadcast($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcShowRebroadcastPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcShowRebroadcastPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcShowRebroadcastPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcShowRebroadcast objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcShowRebroadcast objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcShowRebroadcastPeer::addSelectColumns($criteria); - $startcol2 = (CcShowRebroadcastPeer::NUM_COLUMNS - CcShowRebroadcastPeer::NUM_LAZY_LOAD_COLUMNS); - - CcShowPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcShowPeer::NUM_COLUMNS - CcShowPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcShowRebroadcastPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcShowRebroadcastPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcShowRebroadcastPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcShowRebroadcastPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcShowRebroadcastPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcShow rows - - $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcShowPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcShowPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcShowPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcShowRebroadcast) to the collection in $obj2 (CcShow) - $obj2->addCcShowRebroadcast($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcShowRebroadcastPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcShowRebroadcastPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcShowRebroadcastTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcShowRebroadcastPeer::CLASS_DEFAULT : CcShowRebroadcastPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcShowRebroadcast or Criteria object. - * - * @param mixed $values Criteria or CcShowRebroadcast object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcShowRebroadcast object - } - - if ($criteria->containsKey(CcShowRebroadcastPeer::ID) && $criteria->keyContainsValue(CcShowRebroadcastPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowRebroadcastPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcShowRebroadcast or Criteria object. - * - * @param mixed $values Criteria or CcShowRebroadcast object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcShowRebroadcastPeer::ID); - $value = $criteria->remove(CcShowRebroadcastPeer::ID); - if ($value) { - $selectCriteria->add(CcShowRebroadcastPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcShowRebroadcastPeer::TABLE_NAME); - } - - } else { // $values is CcShowRebroadcast object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_show_rebroadcast table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcShowRebroadcastPeer::TABLE_NAME, $con, CcShowRebroadcastPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcShowRebroadcastPeer::clearInstancePool(); - CcShowRebroadcastPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcShowRebroadcast or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcShowRebroadcast object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcShowRebroadcastPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcShowRebroadcast) { // it's a model object - // invalidate the cache for this single object - CcShowRebroadcastPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcShowRebroadcastPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcShowRebroadcastPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcShowRebroadcastPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcShowRebroadcast object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcShowRebroadcast $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcShowRebroadcast $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcShowRebroadcastPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcShowRebroadcastPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcShowRebroadcastPeer::DATABASE_NAME, CcShowRebroadcastPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcShowRebroadcast - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcShowRebroadcastPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcShowRebroadcastPeer::DATABASE_NAME); - $criteria->add(CcShowRebroadcastPeer::ID, $pk); - - $v = CcShowRebroadcastPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcShowRebroadcastPeer::DATABASE_NAME); - $criteria->add(CcShowRebroadcastPeer::ID, $pks, Criteria::IN); - $objs = CcShowRebroadcastPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcShowRebroadcastPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_show_rebroadcast'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcShowRebroadcast'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcShowRebroadcastTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 4; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 4; + + /** the column name for the id field */ + const ID = 'cc_show_rebroadcast.id'; + + /** the column name for the day_offset field */ + const DAY_OFFSET = 'cc_show_rebroadcast.day_offset'; + + /** the column name for the start_time field */ + const START_TIME = 'cc_show_rebroadcast.start_time'; + + /** the column name for the show_id field */ + const SHOW_ID = 'cc_show_rebroadcast.show_id'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcShowRebroadcast objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcShowRebroadcast[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcShowRebroadcastPeer::$fieldNames[CcShowRebroadcastPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbDayOffset', 'DbStartTime', 'DbShowId', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbDayOffset', 'dbStartTime', 'dbShowId', ), + BasePeer::TYPE_COLNAME => array (CcShowRebroadcastPeer::ID, CcShowRebroadcastPeer::DAY_OFFSET, CcShowRebroadcastPeer::START_TIME, CcShowRebroadcastPeer::SHOW_ID, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'DAY_OFFSET', 'START_TIME', 'SHOW_ID', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'day_offset', 'start_time', 'show_id', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcShowRebroadcastPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbDayOffset' => 1, 'DbStartTime' => 2, 'DbShowId' => 3, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbDayOffset' => 1, 'dbStartTime' => 2, 'dbShowId' => 3, ), + BasePeer::TYPE_COLNAME => array (CcShowRebroadcastPeer::ID => 0, CcShowRebroadcastPeer::DAY_OFFSET => 1, CcShowRebroadcastPeer::START_TIME => 2, CcShowRebroadcastPeer::SHOW_ID => 3, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'DAY_OFFSET' => 1, 'START_TIME' => 2, 'SHOW_ID' => 3, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'day_offset' => 1, 'start_time' => 2, 'show_id' => 3, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcShowRebroadcastPeer::getFieldNames($toType); + $key = isset(CcShowRebroadcastPeer::$fieldKeys[$fromType][$name]) ? CcShowRebroadcastPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcShowRebroadcastPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcShowRebroadcastPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcShowRebroadcastPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcShowRebroadcastPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcShowRebroadcastPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcShowRebroadcastPeer::ID); + $criteria->addSelectColumn(CcShowRebroadcastPeer::DAY_OFFSET); + $criteria->addSelectColumn(CcShowRebroadcastPeer::START_TIME); + $criteria->addSelectColumn(CcShowRebroadcastPeer::SHOW_ID); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.day_offset'); + $criteria->addSelectColumn($alias . '.start_time'); + $criteria->addSelectColumn($alias . '.show_id'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowRebroadcastPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowRebroadcastPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcShowRebroadcastPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcShowRebroadcast + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcShowRebroadcastPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcShowRebroadcastPeer::populateObjects(CcShowRebroadcastPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcShowRebroadcastPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcShowRebroadcastPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcShowRebroadcast $obj A CcShowRebroadcast object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcShowRebroadcastPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcShowRebroadcast object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcShowRebroadcast) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcShowRebroadcast object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcShowRebroadcastPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcShowRebroadcast Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcShowRebroadcastPeer::$instances[$key])) { + return CcShowRebroadcastPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcShowRebroadcastPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcShowRebroadcastPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_show_rebroadcast + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcShowRebroadcastPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcShowRebroadcastPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcShowRebroadcastPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcShowRebroadcastPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcShowRebroadcast object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcShowRebroadcastPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcShowRebroadcastPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcShowRebroadcastPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcShowRebroadcastPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcShowRebroadcastPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcShow table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcShow(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowRebroadcastPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowRebroadcastPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcShowRebroadcastPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowRebroadcastPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcShowRebroadcast objects pre-filled with their CcShow objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowRebroadcast objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcShow(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowRebroadcastPeer::DATABASE_NAME); + } + + CcShowRebroadcastPeer::addSelectColumns($criteria); + $startcol = CcShowRebroadcastPeer::NUM_HYDRATE_COLUMNS; + CcShowPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcShowRebroadcastPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowRebroadcastPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowRebroadcastPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcShowRebroadcastPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowRebroadcastPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcShowPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcShowPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcShowRebroadcast) to $obj2 (CcShow) + $obj2->addCcShowRebroadcast($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcShowRebroadcastPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcShowRebroadcastPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcShowRebroadcastPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcShowRebroadcastPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcShowRebroadcast objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcShowRebroadcast objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcShowRebroadcastPeer::DATABASE_NAME); + } + + CcShowRebroadcastPeer::addSelectColumns($criteria); + $startcol2 = CcShowRebroadcastPeer::NUM_HYDRATE_COLUMNS; + + CcShowPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcShowPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcShowRebroadcastPeer::SHOW_ID, CcShowPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcShowRebroadcastPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcShowRebroadcastPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcShowRebroadcastPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcShowRebroadcastPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcShow rows + + $key2 = CcShowPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcShowPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcShowPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcShowPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcShowRebroadcast) to the collection in $obj2 (CcShow) + $obj2->addCcShowRebroadcast($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcShowRebroadcastPeer::DATABASE_NAME)->getTable(CcShowRebroadcastPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcShowRebroadcastPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcShowRebroadcastPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcShowRebroadcastTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcShowRebroadcastPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcShowRebroadcast or Criteria object. + * + * @param mixed $values Criteria or CcShowRebroadcast object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcShowRebroadcast object + } + + if ($criteria->containsKey(CcShowRebroadcastPeer::ID) && $criteria->keyContainsValue(CcShowRebroadcastPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcShowRebroadcastPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcShowRebroadcastPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcShowRebroadcast or Criteria object. + * + * @param mixed $values Criteria or CcShowRebroadcast object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcShowRebroadcastPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcShowRebroadcastPeer::ID); + $value = $criteria->remove(CcShowRebroadcastPeer::ID); + if ($value) { + $selectCriteria->add(CcShowRebroadcastPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcShowRebroadcastPeer::TABLE_NAME); + } + + } else { // $values is CcShowRebroadcast object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcShowRebroadcastPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_show_rebroadcast table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcShowRebroadcastPeer::TABLE_NAME, $con, CcShowRebroadcastPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcShowRebroadcastPeer::clearInstancePool(); + CcShowRebroadcastPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcShowRebroadcast or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcShowRebroadcast object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcShowRebroadcastPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcShowRebroadcast) { // it's a model object + // invalidate the cache for this single object + CcShowRebroadcastPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcShowRebroadcastPeer::DATABASE_NAME); + $criteria->add(CcShowRebroadcastPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcShowRebroadcastPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcShowRebroadcastPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcShowRebroadcastPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcShowRebroadcast object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcShowRebroadcast $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcShowRebroadcastPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcShowRebroadcastPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcShowRebroadcastPeer::DATABASE_NAME, CcShowRebroadcastPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcShowRebroadcast + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcShowRebroadcastPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcShowRebroadcastPeer::DATABASE_NAME); + $criteria->add(CcShowRebroadcastPeer::ID, $pk); + + $v = CcShowRebroadcastPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcShowRebroadcast[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcShowRebroadcastPeer::DATABASE_NAME); + $criteria->add(CcShowRebroadcastPeer::ID, $pks, Criteria::IN); + $objs = CcShowRebroadcastPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcShowRebroadcastPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcShowRebroadcastQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcShowRebroadcastQuery.php index d7fedf8e94..44ff29fedb 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcShowRebroadcastQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcShowRebroadcastQuery.php @@ -4,326 +4,481 @@ /** * Base class that represents a query for the 'cc_show_rebroadcast' table. * - * * - * @method CcShowRebroadcastQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcShowRebroadcastQuery orderByDbDayOffset($order = Criteria::ASC) Order by the day_offset column - * @method CcShowRebroadcastQuery orderByDbStartTime($order = Criteria::ASC) Order by the start_time column - * @method CcShowRebroadcastQuery orderByDbShowId($order = Criteria::ASC) Order by the show_id column * - * @method CcShowRebroadcastQuery groupByDbId() Group by the id column - * @method CcShowRebroadcastQuery groupByDbDayOffset() Group by the day_offset column - * @method CcShowRebroadcastQuery groupByDbStartTime() Group by the start_time column - * @method CcShowRebroadcastQuery groupByDbShowId() Group by the show_id column + * @method CcShowRebroadcastQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcShowRebroadcastQuery orderByDbDayOffset($order = Criteria::ASC) Order by the day_offset column + * @method CcShowRebroadcastQuery orderByDbStartTime($order = Criteria::ASC) Order by the start_time column + * @method CcShowRebroadcastQuery orderByDbShowId($order = Criteria::ASC) Order by the show_id column * - * @method CcShowRebroadcastQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcShowRebroadcastQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcShowRebroadcastQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcShowRebroadcastQuery groupByDbId() Group by the id column + * @method CcShowRebroadcastQuery groupByDbDayOffset() Group by the day_offset column + * @method CcShowRebroadcastQuery groupByDbStartTime() Group by the start_time column + * @method CcShowRebroadcastQuery groupByDbShowId() Group by the show_id column * - * @method CcShowRebroadcastQuery leftJoinCcShow($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShow relation - * @method CcShowRebroadcastQuery rightJoinCcShow($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShow relation - * @method CcShowRebroadcastQuery innerJoinCcShow($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShow relation + * @method CcShowRebroadcastQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcShowRebroadcastQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcShowRebroadcastQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcShowRebroadcast findOne(PropelPDO $con = null) Return the first CcShowRebroadcast matching the query - * @method CcShowRebroadcast findOneOrCreate(PropelPDO $con = null) Return the first CcShowRebroadcast matching the query, or a new CcShowRebroadcast object populated from the query conditions when no match is found + * @method CcShowRebroadcastQuery leftJoinCcShow($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShow relation + * @method CcShowRebroadcastQuery rightJoinCcShow($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShow relation + * @method CcShowRebroadcastQuery innerJoinCcShow($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShow relation * - * @method CcShowRebroadcast findOneByDbId(int $id) Return the first CcShowRebroadcast filtered by the id column - * @method CcShowRebroadcast findOneByDbDayOffset(string $day_offset) Return the first CcShowRebroadcast filtered by the day_offset column - * @method CcShowRebroadcast findOneByDbStartTime(string $start_time) Return the first CcShowRebroadcast filtered by the start_time column - * @method CcShowRebroadcast findOneByDbShowId(int $show_id) Return the first CcShowRebroadcast filtered by the show_id column + * @method CcShowRebroadcast findOne(PropelPDO $con = null) Return the first CcShowRebroadcast matching the query + * @method CcShowRebroadcast findOneOrCreate(PropelPDO $con = null) Return the first CcShowRebroadcast matching the query, or a new CcShowRebroadcast object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcShowRebroadcast objects filtered by the id column - * @method array findByDbDayOffset(string $day_offset) Return CcShowRebroadcast objects filtered by the day_offset column - * @method array findByDbStartTime(string $start_time) Return CcShowRebroadcast objects filtered by the start_time column - * @method array findByDbShowId(int $show_id) Return CcShowRebroadcast objects filtered by the show_id column + * @method CcShowRebroadcast findOneByDbDayOffset(string $day_offset) Return the first CcShowRebroadcast filtered by the day_offset column + * @method CcShowRebroadcast findOneByDbStartTime(string $start_time) Return the first CcShowRebroadcast filtered by the start_time column + * @method CcShowRebroadcast findOneByDbShowId(int $show_id) Return the first CcShowRebroadcast filtered by the show_id column + * + * @method array findByDbId(int $id) Return CcShowRebroadcast objects filtered by the id column + * @method array findByDbDayOffset(string $day_offset) Return CcShowRebroadcast objects filtered by the day_offset column + * @method array findByDbStartTime(string $start_time) Return CcShowRebroadcast objects filtered by the start_time column + * @method array findByDbShowId(int $show_id) Return CcShowRebroadcast objects filtered by the show_id column * * @package propel.generator.airtime.om */ abstract class BaseCcShowRebroadcastQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcShowRebroadcastQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcShowRebroadcast'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcShowRebroadcastQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcShowRebroadcastQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcShowRebroadcastQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcShowRebroadcastQuery) { + return $criteria; + } + $query = new CcShowRebroadcastQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcShowRebroadcast|CcShowRebroadcast[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcShowRebroadcastPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcShowRebroadcastPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShowRebroadcast A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShowRebroadcast A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "day_offset", "start_time", "show_id" FROM "cc_show_rebroadcast" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcShowRebroadcast(); + $obj->hydrate($row); + CcShowRebroadcastPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcShowRebroadcast|CcShowRebroadcast[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcShowRebroadcast[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcShowRebroadcastQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcShowRebroadcastPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcShowRebroadcastQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcShowRebroadcastPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowRebroadcastQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcShowRebroadcastPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcShowRebroadcastPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowRebroadcastPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the day_offset column + * + * Example usage: + * + * $query->filterByDbDayOffset('fooValue'); // WHERE day_offset = 'fooValue' + * $query->filterByDbDayOffset('%fooValue%'); // WHERE day_offset LIKE '%fooValue%' + * + * + * @param string $dbDayOffset The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowRebroadcastQuery The current query, for fluid interface + */ + public function filterByDbDayOffset($dbDayOffset = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbDayOffset)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbDayOffset)) { + $dbDayOffset = str_replace('*', '%', $dbDayOffset); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcShowRebroadcastPeer::DAY_OFFSET, $dbDayOffset, $comparison); + } + + /** + * Filter the query on the start_time column + * + * Example usage: + * + * $query->filterByDbStartTime('2011-03-14'); // WHERE start_time = '2011-03-14' + * $query->filterByDbStartTime('now'); // WHERE start_time = '2011-03-14' + * $query->filterByDbStartTime(array('max' => 'yesterday')); // WHERE start_time < '2011-03-13' + * + * + * @param mixed $dbStartTime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowRebroadcastQuery The current query, for fluid interface + */ + public function filterByDbStartTime($dbStartTime = null, $comparison = null) + { + if (is_array($dbStartTime)) { + $useMinMax = false; + if (isset($dbStartTime['min'])) { + $this->addUsingAlias(CcShowRebroadcastPeer::START_TIME, $dbStartTime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbStartTime['max'])) { + $this->addUsingAlias(CcShowRebroadcastPeer::START_TIME, $dbStartTime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowRebroadcastPeer::START_TIME, $dbStartTime, $comparison); + } + + /** + * Filter the query on the show_id column + * + * Example usage: + * + * $query->filterByDbShowId(1234); // WHERE show_id = 1234 + * $query->filterByDbShowId(array(12, 34)); // WHERE show_id IN (12, 34) + * $query->filterByDbShowId(array('min' => 12)); // WHERE show_id >= 12 + * $query->filterByDbShowId(array('max' => 12)); // WHERE show_id <= 12 + * + * + * @see filterByCcShow() + * + * @param mixed $dbShowId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowRebroadcastQuery The current query, for fluid interface + */ + public function filterByDbShowId($dbShowId = null, $comparison = null) + { + if (is_array($dbShowId)) { + $useMinMax = false; + if (isset($dbShowId['min'])) { + $this->addUsingAlias(CcShowRebroadcastPeer::SHOW_ID, $dbShowId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbShowId['max'])) { + $this->addUsingAlias(CcShowRebroadcastPeer::SHOW_ID, $dbShowId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcShowRebroadcastPeer::SHOW_ID, $dbShowId, $comparison); + } + + /** + * Filter the query by a related CcShow object + * + * @param CcShow|PropelObjectCollection $ccShow The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcShowRebroadcastQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShow($ccShow, $comparison = null) + { + if ($ccShow instanceof CcShow) { + return $this + ->addUsingAlias(CcShowRebroadcastPeer::SHOW_ID, $ccShow->getDbId(), $comparison); + } elseif ($ccShow instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcShowRebroadcastPeer::SHOW_ID, $ccShow->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcShow() only accepts arguments of type CcShow or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShow relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowRebroadcastQuery The current query, for fluid interface + */ + public function joinCcShow($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShow'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShow'); + } + + return $this; + } + + /** + * Use the CcShow relation CcShow object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowQuery A secondary query class using the current class as primary query + */ + public function useCcShowQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcShow($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShow', 'CcShowQuery'); + } + + /** + * Exclude object from result + * + * @param CcShowRebroadcast $ccShowRebroadcast Object to remove from the list of results + * + * @return CcShowRebroadcastQuery The current query, for fluid interface + */ + public function prune($ccShowRebroadcast = null) + { + if ($ccShowRebroadcast) { + $this->addUsingAlias(CcShowRebroadcastPeer::ID, $ccShowRebroadcast->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcShowRebroadcastQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcShowRebroadcast', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcShowRebroadcastQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcShowRebroadcastQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcShowRebroadcastQuery) { - return $criteria; - } - $query = new CcShowRebroadcastQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcShowRebroadcast|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcShowRebroadcastPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcShowRebroadcastQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcShowRebroadcastPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcShowRebroadcastQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcShowRebroadcastPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowRebroadcastQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcShowRebroadcastPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the day_offset column - * - * @param string $dbDayOffset The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowRebroadcastQuery The current query, for fluid interface - */ - public function filterByDbDayOffset($dbDayOffset = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbDayOffset)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbDayOffset)) { - $dbDayOffset = str_replace('*', '%', $dbDayOffset); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcShowRebroadcastPeer::DAY_OFFSET, $dbDayOffset, $comparison); - } - - /** - * Filter the query on the start_time column - * - * @param string|array $dbStartTime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowRebroadcastQuery The current query, for fluid interface - */ - public function filterByDbStartTime($dbStartTime = null, $comparison = null) - { - if (is_array($dbStartTime)) { - $useMinMax = false; - if (isset($dbStartTime['min'])) { - $this->addUsingAlias(CcShowRebroadcastPeer::START_TIME, $dbStartTime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbStartTime['max'])) { - $this->addUsingAlias(CcShowRebroadcastPeer::START_TIME, $dbStartTime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowRebroadcastPeer::START_TIME, $dbStartTime, $comparison); - } - - /** - * Filter the query on the show_id column - * - * @param int|array $dbShowId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowRebroadcastQuery The current query, for fluid interface - */ - public function filterByDbShowId($dbShowId = null, $comparison = null) - { - if (is_array($dbShowId)) { - $useMinMax = false; - if (isset($dbShowId['min'])) { - $this->addUsingAlias(CcShowRebroadcastPeer::SHOW_ID, $dbShowId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbShowId['max'])) { - $this->addUsingAlias(CcShowRebroadcastPeer::SHOW_ID, $dbShowId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcShowRebroadcastPeer::SHOW_ID, $dbShowId, $comparison); - } - - /** - * Filter the query by a related CcShow object - * - * @param CcShow $ccShow the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcShowRebroadcastQuery The current query, for fluid interface - */ - public function filterByCcShow($ccShow, $comparison = null) - { - return $this - ->addUsingAlias(CcShowRebroadcastPeer::SHOW_ID, $ccShow->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShow relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowRebroadcastQuery The current query, for fluid interface - */ - public function joinCcShow($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShow'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShow'); - } - - return $this; - } - - /** - * Use the CcShow relation CcShow object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowQuery A secondary query class using the current class as primary query - */ - public function useCcShowQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcShow($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShow', 'CcShowQuery'); - } - - /** - * Exclude object from result - * - * @param CcShowRebroadcast $ccShowRebroadcast Object to remove from the list of results - * - * @return CcShowRebroadcastQuery The current query, for fluid interface - */ - public function prune($ccShowRebroadcast = null) - { - if ($ccShowRebroadcast) { - $this->addUsingAlias(CcShowRebroadcastPeer::ID, $ccShowRebroadcast->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcShowRebroadcastQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSmemb.php b/airtime_mvc/application/models/airtime/om/BaseCcSmemb.php index 7fc4dbc9b0..9d1270fa8d 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSmemb.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSmemb.php @@ -4,888 +4,1018 @@ /** * Base class that represents a row from the 'cc_smemb' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcSmemb extends BaseObject implements Persistent +abstract class BaseCcSmemb extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcSmembPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcSmembPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the uid field. - * Note: this column has a database default value of: 0 - * @var int - */ - protected $uid; - - /** - * The value for the gid field. - * Note: this column has a database default value of: 0 - * @var int - */ - protected $gid; - - /** - * The value for the level field. - * Note: this column has a database default value of: 0 - * @var int - */ - protected $level; - - /** - * The value for the mid field. - * @var int - */ - protected $mid; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->uid = 0; - $this->gid = 0; - $this->level = 0; - } - - /** - * Initializes internal state of BaseCcSmemb object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getId() - { - return $this->id; - } - - /** - * Get the [uid] column value. - * - * @return int - */ - public function getUid() - { - return $this->uid; - } - - /** - * Get the [gid] column value. - * - * @return int - */ - public function getGid() - { - return $this->gid; - } - - /** - * Get the [level] column value. - * - * @return int - */ - public function getLevel() - { - return $this->level; - } - - /** - * Get the [mid] column value. - * - * @return int - */ - public function getMid() - { - return $this->mid; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcSmemb The current object (for fluent API support) - */ - public function setId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcSmembPeer::ID; - } - - return $this; - } // setId() - - /** - * Set the value of [uid] column. - * - * @param int $v new value - * @return CcSmemb The current object (for fluent API support) - */ - public function setUid($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->uid !== $v || $this->isNew()) { - $this->uid = $v; - $this->modifiedColumns[] = CcSmembPeer::UID; - } - - return $this; - } // setUid() - - /** - * Set the value of [gid] column. - * - * @param int $v new value - * @return CcSmemb The current object (for fluent API support) - */ - public function setGid($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->gid !== $v || $this->isNew()) { - $this->gid = $v; - $this->modifiedColumns[] = CcSmembPeer::GID; - } - - return $this; - } // setGid() - - /** - * Set the value of [level] column. - * - * @param int $v new value - * @return CcSmemb The current object (for fluent API support) - */ - public function setLevel($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->level !== $v || $this->isNew()) { - $this->level = $v; - $this->modifiedColumns[] = CcSmembPeer::LEVEL; - } - - return $this; - } // setLevel() - - /** - * Set the value of [mid] column. - * - * @param int $v new value - * @return CcSmemb The current object (for fluent API support) - */ - public function setMid($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->mid !== $v) { - $this->mid = $v; - $this->modifiedColumns[] = CcSmembPeer::MID; - } - - return $this; - } // setMid() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->uid !== 0) { - return false; - } - - if ($this->gid !== 0) { - return false; - } - - if ($this->level !== 0) { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->uid = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->gid = ($row[$startcol + 2] !== null) ? (int) $row[$startcol + 2] : null; - $this->level = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; - $this->mid = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 5; // 5 = CcSmembPeer::NUM_COLUMNS - CcSmembPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcSmemb object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcSmembPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcSmembQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcSmembPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setNew(false); - } else { - $affectedRows = CcSmembPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcSmembPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcSmembPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getId(); - break; - case 1: - return $this->getUid(); - break; - case 2: - return $this->getGid(); - break; - case 3: - return $this->getLevel(); - break; - case 4: - return $this->getMid(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcSmembPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getId(), - $keys[1] => $this->getUid(), - $keys[2] => $this->getGid(), - $keys[3] => $this->getLevel(), - $keys[4] => $this->getMid(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcSmembPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setId($value); - break; - case 1: - $this->setUid($value); - break; - case 2: - $this->setGid($value); - break; - case 3: - $this->setLevel($value); - break; - case 4: - $this->setMid($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcSmembPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setUid($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setGid($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setLevel($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setMid($arr[$keys[4]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcSmembPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcSmembPeer::ID)) $criteria->add(CcSmembPeer::ID, $this->id); - if ($this->isColumnModified(CcSmembPeer::UID)) $criteria->add(CcSmembPeer::UID, $this->uid); - if ($this->isColumnModified(CcSmembPeer::GID)) $criteria->add(CcSmembPeer::GID, $this->gid); - if ($this->isColumnModified(CcSmembPeer::LEVEL)) $criteria->add(CcSmembPeer::LEVEL, $this->level); - if ($this->isColumnModified(CcSmembPeer::MID)) $criteria->add(CcSmembPeer::MID, $this->mid); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcSmembPeer::DATABASE_NAME); - $criteria->add(CcSmembPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcSmemb (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setId($this->id); - $copyObj->setUid($this->uid); - $copyObj->setGid($this->gid); - $copyObj->setLevel($this->level); - $copyObj->setMid($this->mid); - - $copyObj->setNew(true); - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcSmemb Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcSmembPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcSmembPeer(); - } - return self::$peer; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->uid = null; - $this->gid = null; - $this->level = null; - $this->mid = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcSmemb + /** + * Peer class name + */ + const PEER = 'CcSmembPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcSmembPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the uid field. + * Note: this column has a database default value of: 0 + * @var int + */ + protected $uid; + + /** + * The value for the gid field. + * Note: this column has a database default value of: 0 + * @var int + */ + protected $gid; + + /** + * The value for the level field. + * Note: this column has a database default value of: 0 + * @var int + */ + protected $level; + + /** + * The value for the mid field. + * @var int + */ + protected $mid; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->uid = 0; + $this->gid = 0; + $this->level = 0; + } + + /** + * Initializes internal state of BaseCcSmemb object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getId() + { + + return $this->id; + } + + /** + * Get the [uid] column value. + * + * @return int + */ + public function getUid() + { + + return $this->uid; + } + + /** + * Get the [gid] column value. + * + * @return int + */ + public function getGid() + { + + return $this->gid; + } + + /** + * Get the [level] column value. + * + * @return int + */ + public function getLevel() + { + + return $this->level; + } + + /** + * Get the [mid] column value. + * + * @return int + */ + public function getMid() + { + + return $this->mid; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcSmemb The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcSmembPeer::ID; + } + + + return $this; + } // setId() + + /** + * Set the value of [uid] column. + * + * @param int $v new value + * @return CcSmemb The current object (for fluent API support) + */ + public function setUid($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->uid !== $v) { + $this->uid = $v; + $this->modifiedColumns[] = CcSmembPeer::UID; + } + + + return $this; + } // setUid() + + /** + * Set the value of [gid] column. + * + * @param int $v new value + * @return CcSmemb The current object (for fluent API support) + */ + public function setGid($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->gid !== $v) { + $this->gid = $v; + $this->modifiedColumns[] = CcSmembPeer::GID; + } + + + return $this; + } // setGid() + + /** + * Set the value of [level] column. + * + * @param int $v new value + * @return CcSmemb The current object (for fluent API support) + */ + public function setLevel($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->level !== $v) { + $this->level = $v; + $this->modifiedColumns[] = CcSmembPeer::LEVEL; + } + + + return $this; + } // setLevel() + + /** + * Set the value of [mid] column. + * + * @param int $v new value + * @return CcSmemb The current object (for fluent API support) + */ + public function setMid($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->mid !== $v) { + $this->mid = $v; + $this->modifiedColumns[] = CcSmembPeer::MID; + } + + + return $this; + } // setMid() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->uid !== 0) { + return false; + } + + if ($this->gid !== 0) { + return false; + } + + if ($this->level !== 0) { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->uid = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->gid = ($row[$startcol + 2] !== null) ? (int) $row[$startcol + 2] : null; + $this->level = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; + $this->mid = ($row[$startcol + 4] !== null) ? (int) $row[$startcol + 4] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 5; // 5 = CcSmembPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcSmemb object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcSmembPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcSmembQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcSmembPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcSmembPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcSmembPeer::UID)) { + $modifiedColumns[':p' . $index++] = '"uid"'; + } + if ($this->isColumnModified(CcSmembPeer::GID)) { + $modifiedColumns[':p' . $index++] = '"gid"'; + } + if ($this->isColumnModified(CcSmembPeer::LEVEL)) { + $modifiedColumns[':p' . $index++] = '"level"'; + } + if ($this->isColumnModified(CcSmembPeer::MID)) { + $modifiedColumns[':p' . $index++] = '"mid"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_smemb" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"uid"': + $stmt->bindValue($identifier, $this->uid, PDO::PARAM_INT); + break; + case '"gid"': + $stmt->bindValue($identifier, $this->gid, PDO::PARAM_INT); + break; + case '"level"': + $stmt->bindValue($identifier, $this->level, PDO::PARAM_INT); + break; + case '"mid"': + $stmt->bindValue($identifier, $this->mid, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcSmembPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcSmembPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getUid(); + break; + case 2: + return $this->getGid(); + break; + case 3: + return $this->getLevel(); + break; + case 4: + return $this->getMid(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array()) + { + if (isset($alreadyDumpedObjects['CcSmemb'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcSmemb'][$this->getPrimaryKey()] = true; + $keys = CcSmembPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getUid(), + $keys[2] => $this->getGid(), + $keys[3] => $this->getLevel(), + $keys[4] => $this->getMid(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcSmembPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setUid($value); + break; + case 2: + $this->setGid($value); + break; + case 3: + $this->setLevel($value); + break; + case 4: + $this->setMid($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcSmembPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setUid($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setGid($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setLevel($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setMid($arr[$keys[4]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcSmembPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcSmembPeer::ID)) $criteria->add(CcSmembPeer::ID, $this->id); + if ($this->isColumnModified(CcSmembPeer::UID)) $criteria->add(CcSmembPeer::UID, $this->uid); + if ($this->isColumnModified(CcSmembPeer::GID)) $criteria->add(CcSmembPeer::GID, $this->gid); + if ($this->isColumnModified(CcSmembPeer::LEVEL)) $criteria->add(CcSmembPeer::LEVEL, $this->level); + if ($this->isColumnModified(CcSmembPeer::MID)) $criteria->add(CcSmembPeer::MID, $this->mid); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcSmembPeer::DATABASE_NAME); + $criteria->add(CcSmembPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcSmemb (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setUid($this->getUid()); + $copyObj->setGid($this->getGid()); + $copyObj->setLevel($this->getLevel()); + $copyObj->setMid($this->getMid()); + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcSmemb Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcSmembPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcSmembPeer(); + } + + return self::$peer; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->uid = null; + $this->gid = null; + $this->level = null; + $this->mid = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcSmembPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSmembPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcSmembPeer.php index 849c134233..4d9bb8f547 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSmembPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSmembPeer.php @@ -4,743 +4,765 @@ /** * Base static class for performing query and update operations on the 'cc_smemb' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcSmembPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_smemb'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcSmemb'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcSmemb'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcSmembTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 5; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_smemb.ID'; - - /** the column name for the UID field */ - const UID = 'cc_smemb.UID'; - - /** the column name for the GID field */ - const GID = 'cc_smemb.GID'; - - /** the column name for the LEVEL field */ - const LEVEL = 'cc_smemb.LEVEL'; - - /** the column name for the MID field */ - const MID = 'cc_smemb.MID'; - - /** - * An identiy map to hold any loaded instances of CcSmemb objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcSmemb[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('Id', 'Uid', 'Gid', 'Level', 'Mid', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('id', 'uid', 'gid', 'level', 'mid', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::UID, self::GID, self::LEVEL, self::MID, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'UID', 'GID', 'LEVEL', 'MID', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'uid', 'gid', 'level', 'mid', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('Id' => 0, 'Uid' => 1, 'Gid' => 2, 'Level' => 3, 'Mid' => 4, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('id' => 0, 'uid' => 1, 'gid' => 2, 'level' => 3, 'mid' => 4, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::UID => 1, self::GID => 2, self::LEVEL => 3, self::MID => 4, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'UID' => 1, 'GID' => 2, 'LEVEL' => 3, 'MID' => 4, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'uid' => 1, 'gid' => 2, 'level' => 3, 'mid' => 4, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcSmembPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcSmembPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcSmembPeer::ID); - $criteria->addSelectColumn(CcSmembPeer::UID); - $criteria->addSelectColumn(CcSmembPeer::GID); - $criteria->addSelectColumn(CcSmembPeer::LEVEL); - $criteria->addSelectColumn(CcSmembPeer::MID); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.UID'); - $criteria->addSelectColumn($alias . '.GID'); - $criteria->addSelectColumn($alias . '.LEVEL'); - $criteria->addSelectColumn($alias . '.MID'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSmembPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSmembPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcSmemb - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcSmembPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcSmembPeer::populateObjects(CcSmembPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcSmembPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcSmemb $value A CcSmemb object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcSmemb $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcSmemb object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcSmemb) { - $key = (string) $value->getId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcSmemb object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcSmemb Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_smemb - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcSmembPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcSmembPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcSmembPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcSmembPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcSmemb object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcSmembPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcSmembPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcSmembPeer::NUM_COLUMNS; - } else { - $cls = CcSmembPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcSmembPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcSmembPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcSmembPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcSmembTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcSmembPeer::CLASS_DEFAULT : CcSmembPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcSmemb or Criteria object. - * - * @param mixed $values Criteria or CcSmemb object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcSmemb object - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcSmemb or Criteria object. - * - * @param mixed $values Criteria or CcSmemb object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcSmembPeer::ID); - $value = $criteria->remove(CcSmembPeer::ID); - if ($value) { - $selectCriteria->add(CcSmembPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcSmembPeer::TABLE_NAME); - } - - } else { // $values is CcSmemb object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_smemb table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcSmembPeer::TABLE_NAME, $con, CcSmembPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcSmembPeer::clearInstancePool(); - CcSmembPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcSmemb or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcSmemb object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcSmembPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcSmemb) { // it's a model object - // invalidate the cache for this single object - CcSmembPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcSmembPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcSmembPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcSmembPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcSmemb object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcSmemb $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcSmemb $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcSmembPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcSmembPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcSmembPeer::DATABASE_NAME, CcSmembPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcSmemb - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcSmembPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcSmembPeer::DATABASE_NAME); - $criteria->add(CcSmembPeer::ID, $pk); - - $v = CcSmembPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcSmembPeer::DATABASE_NAME); - $criteria->add(CcSmembPeer::ID, $pks, Criteria::IN); - $objs = CcSmembPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcSmembPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_smemb'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcSmemb'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcSmembTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 5; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 5; + + /** the column name for the id field */ + const ID = 'cc_smemb.id'; + + /** the column name for the uid field */ + const UID = 'cc_smemb.uid'; + + /** the column name for the gid field */ + const GID = 'cc_smemb.gid'; + + /** the column name for the level field */ + const LEVEL = 'cc_smemb.level'; + + /** the column name for the mid field */ + const MID = 'cc_smemb.mid'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcSmemb objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcSmemb[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcSmembPeer::$fieldNames[CcSmembPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('Id', 'Uid', 'Gid', 'Level', 'Mid', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('id', 'uid', 'gid', 'level', 'mid', ), + BasePeer::TYPE_COLNAME => array (CcSmembPeer::ID, CcSmembPeer::UID, CcSmembPeer::GID, CcSmembPeer::LEVEL, CcSmembPeer::MID, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'UID', 'GID', 'LEVEL', 'MID', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'uid', 'gid', 'level', 'mid', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcSmembPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('Id' => 0, 'Uid' => 1, 'Gid' => 2, 'Level' => 3, 'Mid' => 4, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('id' => 0, 'uid' => 1, 'gid' => 2, 'level' => 3, 'mid' => 4, ), + BasePeer::TYPE_COLNAME => array (CcSmembPeer::ID => 0, CcSmembPeer::UID => 1, CcSmembPeer::GID => 2, CcSmembPeer::LEVEL => 3, CcSmembPeer::MID => 4, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'UID' => 1, 'GID' => 2, 'LEVEL' => 3, 'MID' => 4, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'uid' => 1, 'gid' => 2, 'level' => 3, 'mid' => 4, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcSmembPeer::getFieldNames($toType); + $key = isset(CcSmembPeer::$fieldKeys[$fromType][$name]) ? CcSmembPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcSmembPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcSmembPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcSmembPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcSmembPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcSmembPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcSmembPeer::ID); + $criteria->addSelectColumn(CcSmembPeer::UID); + $criteria->addSelectColumn(CcSmembPeer::GID); + $criteria->addSelectColumn(CcSmembPeer::LEVEL); + $criteria->addSelectColumn(CcSmembPeer::MID); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.uid'); + $criteria->addSelectColumn($alias . '.gid'); + $criteria->addSelectColumn($alias . '.level'); + $criteria->addSelectColumn($alias . '.mid'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSmembPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSmembPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcSmembPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcSmemb + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcSmembPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcSmembPeer::populateObjects(CcSmembPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcSmembPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcSmembPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcSmemb $obj A CcSmemb object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getId(); + } // if key === null + CcSmembPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcSmemb object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcSmemb) { + $key = (string) $value->getId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcSmemb object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcSmembPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcSmemb Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcSmembPeer::$instances[$key])) { + return CcSmembPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcSmembPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcSmembPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_smemb + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcSmembPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcSmembPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcSmembPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcSmembPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcSmemb object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcSmembPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcSmembPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcSmembPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcSmembPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcSmembPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcSmembPeer::DATABASE_NAME)->getTable(CcSmembPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcSmembPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcSmembPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcSmembTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcSmembPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcSmemb or Criteria object. + * + * @param mixed $values Criteria or CcSmemb object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcSmemb object + } + + + // Set the correct dbName + $criteria->setDbName(CcSmembPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcSmemb or Criteria object. + * + * @param mixed $values Criteria or CcSmemb object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcSmembPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcSmembPeer::ID); + $value = $criteria->remove(CcSmembPeer::ID); + if ($value) { + $selectCriteria->add(CcSmembPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcSmembPeer::TABLE_NAME); + } + + } else { // $values is CcSmemb object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcSmembPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_smemb table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcSmembPeer::TABLE_NAME, $con, CcSmembPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcSmembPeer::clearInstancePool(); + CcSmembPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcSmemb or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcSmemb object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcSmembPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcSmemb) { // it's a model object + // invalidate the cache for this single object + CcSmembPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcSmembPeer::DATABASE_NAME); + $criteria->add(CcSmembPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcSmembPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcSmembPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcSmembPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcSmemb object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcSmemb $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcSmembPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcSmembPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcSmembPeer::DATABASE_NAME, CcSmembPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcSmemb + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcSmembPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcSmembPeer::DATABASE_NAME); + $criteria->add(CcSmembPeer::ID, $pk); + + $v = CcSmembPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcSmemb[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcSmembPeer::DATABASE_NAME); + $criteria->add(CcSmembPeer::ID, $pks, Criteria::IN); + $objs = CcSmembPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcSmembPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSmembQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcSmembQuery.php index 06b24502c6..be7c914d05 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSmembQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSmembQuery.php @@ -4,302 +4,457 @@ /** * Base class that represents a query for the 'cc_smemb' table. * - * * - * @method CcSmembQuery orderById($order = Criteria::ASC) Order by the id column - * @method CcSmembQuery orderByUid($order = Criteria::ASC) Order by the uid column - * @method CcSmembQuery orderByGid($order = Criteria::ASC) Order by the gid column - * @method CcSmembQuery orderByLevel($order = Criteria::ASC) Order by the level column - * @method CcSmembQuery orderByMid($order = Criteria::ASC) Order by the mid column * - * @method CcSmembQuery groupById() Group by the id column - * @method CcSmembQuery groupByUid() Group by the uid column - * @method CcSmembQuery groupByGid() Group by the gid column - * @method CcSmembQuery groupByLevel() Group by the level column - * @method CcSmembQuery groupByMid() Group by the mid column + * @method CcSmembQuery orderById($order = Criteria::ASC) Order by the id column + * @method CcSmembQuery orderByUid($order = Criteria::ASC) Order by the uid column + * @method CcSmembQuery orderByGid($order = Criteria::ASC) Order by the gid column + * @method CcSmembQuery orderByLevel($order = Criteria::ASC) Order by the level column + * @method CcSmembQuery orderByMid($order = Criteria::ASC) Order by the mid column * - * @method CcSmembQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcSmembQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcSmembQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcSmembQuery groupById() Group by the id column + * @method CcSmembQuery groupByUid() Group by the uid column + * @method CcSmembQuery groupByGid() Group by the gid column + * @method CcSmembQuery groupByLevel() Group by the level column + * @method CcSmembQuery groupByMid() Group by the mid column * - * @method CcSmemb findOne(PropelPDO $con = null) Return the first CcSmemb matching the query - * @method CcSmemb findOneOrCreate(PropelPDO $con = null) Return the first CcSmemb matching the query, or a new CcSmemb object populated from the query conditions when no match is found + * @method CcSmembQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcSmembQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcSmembQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcSmemb findOneById(int $id) Return the first CcSmemb filtered by the id column - * @method CcSmemb findOneByUid(int $uid) Return the first CcSmemb filtered by the uid column - * @method CcSmemb findOneByGid(int $gid) Return the first CcSmemb filtered by the gid column - * @method CcSmemb findOneByLevel(int $level) Return the first CcSmemb filtered by the level column - * @method CcSmemb findOneByMid(int $mid) Return the first CcSmemb filtered by the mid column + * @method CcSmemb findOne(PropelPDO $con = null) Return the first CcSmemb matching the query + * @method CcSmemb findOneOrCreate(PropelPDO $con = null) Return the first CcSmemb matching the query, or a new CcSmemb object populated from the query conditions when no match is found * - * @method array findById(int $id) Return CcSmemb objects filtered by the id column - * @method array findByUid(int $uid) Return CcSmemb objects filtered by the uid column - * @method array findByGid(int $gid) Return CcSmemb objects filtered by the gid column - * @method array findByLevel(int $level) Return CcSmemb objects filtered by the level column - * @method array findByMid(int $mid) Return CcSmemb objects filtered by the mid column + * @method CcSmemb findOneByUid(int $uid) Return the first CcSmemb filtered by the uid column + * @method CcSmemb findOneByGid(int $gid) Return the first CcSmemb filtered by the gid column + * @method CcSmemb findOneByLevel(int $level) Return the first CcSmemb filtered by the level column + * @method CcSmemb findOneByMid(int $mid) Return the first CcSmemb filtered by the mid column + * + * @method array findById(int $id) Return CcSmemb objects filtered by the id column + * @method array findByUid(int $uid) Return CcSmemb objects filtered by the uid column + * @method array findByGid(int $gid) Return CcSmemb objects filtered by the gid column + * @method array findByLevel(int $level) Return CcSmemb objects filtered by the level column + * @method array findByMid(int $mid) Return CcSmemb objects filtered by the mid column * * @package propel.generator.airtime.om */ abstract class BaseCcSmembQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcSmembQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcSmemb'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcSmembQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcSmembQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcSmembQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcSmembQuery) { + return $criteria; + } + $query = new CcSmembQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcSmemb|CcSmemb[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcSmembPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcSmembPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSmemb A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneById($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSmemb A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "uid", "gid", "level", "mid" FROM "cc_smemb" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcSmemb(); + $obj->hydrate($row); + CcSmembPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSmemb|CcSmemb[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcSmemb[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcSmembQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcSmembPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcSmembQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcSmembPeer::ID, $keys, Criteria::IN); + } - /** - * Initializes internal state of BaseCcSmembQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcSmemb', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id >= 12 + * $query->filterById(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSmembQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(CcSmembPeer::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(CcSmembPeer::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } - /** - * Returns a new CcSmembQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcSmembQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcSmembQuery) { - return $criteria; - } - $query = new CcSmembQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } + return $this->addUsingAlias(CcSmembPeer::ID, $id, $comparison); + } - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcSmemb|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcSmembPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } + /** + * Filter the query on the uid column + * + * Example usage: + * + * $query->filterByUid(1234); // WHERE uid = 1234 + * $query->filterByUid(array(12, 34)); // WHERE uid IN (12, 34) + * $query->filterByUid(array('min' => 12)); // WHERE uid >= 12 + * $query->filterByUid(array('max' => 12)); // WHERE uid <= 12 + * + * + * @param mixed $uid The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSmembQuery The current query, for fluid interface + */ + public function filterByUid($uid = null, $comparison = null) + { + if (is_array($uid)) { + $useMinMax = false; + if (isset($uid['min'])) { + $this->addUsingAlias(CcSmembPeer::UID, $uid['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($uid['max'])) { + $this->addUsingAlias(CcSmembPeer::UID, $uid['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } + return $this->addUsingAlias(CcSmembPeer::UID, $uid, $comparison); + } - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcSmembQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcSmembPeer::ID, $key, Criteria::EQUAL); - } + /** + * Filter the query on the gid column + * + * Example usage: + * + * $query->filterByGid(1234); // WHERE gid = 1234 + * $query->filterByGid(array(12, 34)); // WHERE gid IN (12, 34) + * $query->filterByGid(array('min' => 12)); // WHERE gid >= 12 + * $query->filterByGid(array('max' => 12)); // WHERE gid <= 12 + * + * + * @param mixed $gid The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSmembQuery The current query, for fluid interface + */ + public function filterByGid($gid = null, $comparison = null) + { + if (is_array($gid)) { + $useMinMax = false; + if (isset($gid['min'])) { + $this->addUsingAlias(CcSmembPeer::GID, $gid['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($gid['max'])) { + $this->addUsingAlias(CcSmembPeer::GID, $gid['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcSmembQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcSmembPeer::ID, $keys, Criteria::IN); - } + return $this->addUsingAlias(CcSmembPeer::GID, $gid, $comparison); + } - /** - * Filter the query on the id column - * - * @param int|array $id The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSmembQuery The current query, for fluid interface - */ - public function filterById($id = null, $comparison = null) - { - if (is_array($id) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcSmembPeer::ID, $id, $comparison); - } + /** + * Filter the query on the level column + * + * Example usage: + * + * $query->filterByLevel(1234); // WHERE level = 1234 + * $query->filterByLevel(array(12, 34)); // WHERE level IN (12, 34) + * $query->filterByLevel(array('min' => 12)); // WHERE level >= 12 + * $query->filterByLevel(array('max' => 12)); // WHERE level <= 12 + * + * + * @param mixed $level The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSmembQuery The current query, for fluid interface + */ + public function filterByLevel($level = null, $comparison = null) + { + if (is_array($level)) { + $useMinMax = false; + if (isset($level['min'])) { + $this->addUsingAlias(CcSmembPeer::LEVEL, $level['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($level['max'])) { + $this->addUsingAlias(CcSmembPeer::LEVEL, $level['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } - /** - * Filter the query on the uid column - * - * @param int|array $uid The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSmembQuery The current query, for fluid interface - */ - public function filterByUid($uid = null, $comparison = null) - { - if (is_array($uid)) { - $useMinMax = false; - if (isset($uid['min'])) { - $this->addUsingAlias(CcSmembPeer::UID, $uid['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($uid['max'])) { - $this->addUsingAlias(CcSmembPeer::UID, $uid['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSmembPeer::UID, $uid, $comparison); - } + return $this->addUsingAlias(CcSmembPeer::LEVEL, $level, $comparison); + } - /** - * Filter the query on the gid column - * - * @param int|array $gid The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSmembQuery The current query, for fluid interface - */ - public function filterByGid($gid = null, $comparison = null) - { - if (is_array($gid)) { - $useMinMax = false; - if (isset($gid['min'])) { - $this->addUsingAlias(CcSmembPeer::GID, $gid['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($gid['max'])) { - $this->addUsingAlias(CcSmembPeer::GID, $gid['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSmembPeer::GID, $gid, $comparison); - } + /** + * Filter the query on the mid column + * + * Example usage: + * + * $query->filterByMid(1234); // WHERE mid = 1234 + * $query->filterByMid(array(12, 34)); // WHERE mid IN (12, 34) + * $query->filterByMid(array('min' => 12)); // WHERE mid >= 12 + * $query->filterByMid(array('max' => 12)); // WHERE mid <= 12 + * + * + * @param mixed $mid The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSmembQuery The current query, for fluid interface + */ + public function filterByMid($mid = null, $comparison = null) + { + if (is_array($mid)) { + $useMinMax = false; + if (isset($mid['min'])) { + $this->addUsingAlias(CcSmembPeer::MID, $mid['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($mid['max'])) { + $this->addUsingAlias(CcSmembPeer::MID, $mid['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } - /** - * Filter the query on the level column - * - * @param int|array $level The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSmembQuery The current query, for fluid interface - */ - public function filterByLevel($level = null, $comparison = null) - { - if (is_array($level)) { - $useMinMax = false; - if (isset($level['min'])) { - $this->addUsingAlias(CcSmembPeer::LEVEL, $level['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($level['max'])) { - $this->addUsingAlias(CcSmembPeer::LEVEL, $level['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSmembPeer::LEVEL, $level, $comparison); - } + return $this->addUsingAlias(CcSmembPeer::MID, $mid, $comparison); + } - /** - * Filter the query on the mid column - * - * @param int|array $mid The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSmembQuery The current query, for fluid interface - */ - public function filterByMid($mid = null, $comparison = null) - { - if (is_array($mid)) { - $useMinMax = false; - if (isset($mid['min'])) { - $this->addUsingAlias(CcSmembPeer::MID, $mid['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($mid['max'])) { - $this->addUsingAlias(CcSmembPeer::MID, $mid['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSmembPeer::MID, $mid, $comparison); - } + /** + * Exclude object from result + * + * @param CcSmemb $ccSmemb Object to remove from the list of results + * + * @return CcSmembQuery The current query, for fluid interface + */ + public function prune($ccSmemb = null) + { + if ($ccSmemb) { + $this->addUsingAlias(CcSmembPeer::ID, $ccSmemb->getId(), Criteria::NOT_EQUAL); + } - /** - * Exclude object from result - * - * @param CcSmemb $ccSmemb Object to remove from the list of results - * - * @return CcSmembQuery The current query, for fluid interface - */ - public function prune($ccSmemb = null) - { - if ($ccSmemb) { - $this->addUsingAlias(CcSmembPeer::ID, $ccSmemb->getId(), Criteria::NOT_EQUAL); - } - - return $this; - } + return $this; + } -} // BaseCcSmembQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcStreamSetting.php b/airtime_mvc/application/models/airtime/om/BaseCcStreamSetting.php index 6dadc9b674..f579be6a18 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcStreamSetting.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcStreamSetting.php @@ -4,753 +4,867 @@ /** * Base class that represents a row from the 'cc_stream_setting' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcStreamSetting extends BaseObject implements Persistent +abstract class BaseCcStreamSetting extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcStreamSettingPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcStreamSettingPeer - */ - protected static $peer; - - /** - * The value for the keyname field. - * @var string - */ - protected $keyname; - - /** - * The value for the value field. - * @var string - */ - protected $value; - - /** - * The value for the type field. - * @var string - */ - protected $type; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [keyname] column value. - * - * @return string - */ - public function getDbKeyName() - { - return $this->keyname; - } - - /** - * Get the [value] column value. - * - * @return string - */ - public function getDbValue() - { - return $this->value; - } - - /** - * Get the [type] column value. - * - * @return string - */ - public function getDbType() - { - return $this->type; - } - - /** - * Set the value of [keyname] column. - * - * @param string $v new value - * @return CcStreamSetting The current object (for fluent API support) - */ - public function setDbKeyName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->keyname !== $v) { - $this->keyname = $v; - $this->modifiedColumns[] = CcStreamSettingPeer::KEYNAME; - } - - return $this; - } // setDbKeyName() - - /** - * Set the value of [value] column. - * - * @param string $v new value - * @return CcStreamSetting The current object (for fluent API support) - */ - public function setDbValue($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->value !== $v) { - $this->value = $v; - $this->modifiedColumns[] = CcStreamSettingPeer::VALUE; - } - - return $this; - } // setDbValue() - - /** - * Set the value of [type] column. - * - * @param string $v new value - * @return CcStreamSetting The current object (for fluent API support) - */ - public function setDbType($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->type !== $v) { - $this->type = $v; - $this->modifiedColumns[] = CcStreamSettingPeer::TYPE; - } - - return $this; - } // setDbType() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->keyname = ($row[$startcol + 0] !== null) ? (string) $row[$startcol + 0] : null; - $this->value = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->type = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 3; // 3 = CcStreamSettingPeer::NUM_COLUMNS - CcStreamSettingPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcStreamSetting object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcStreamSettingPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcStreamSettingQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcStreamSettingPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setNew(false); - } else { - $affectedRows = CcStreamSettingPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcStreamSettingPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcStreamSettingPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbKeyName(); - break; - case 1: - return $this->getDbValue(); - break; - case 2: - return $this->getDbType(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcStreamSettingPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbKeyName(), - $keys[1] => $this->getDbValue(), - $keys[2] => $this->getDbType(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcStreamSettingPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbKeyName($value); - break; - case 1: - $this->setDbValue($value); - break; - case 2: - $this->setDbType($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcStreamSettingPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbKeyName($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbValue($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbType($arr[$keys[2]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcStreamSettingPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcStreamSettingPeer::KEYNAME)) $criteria->add(CcStreamSettingPeer::KEYNAME, $this->keyname); - if ($this->isColumnModified(CcStreamSettingPeer::VALUE)) $criteria->add(CcStreamSettingPeer::VALUE, $this->value); - if ($this->isColumnModified(CcStreamSettingPeer::TYPE)) $criteria->add(CcStreamSettingPeer::TYPE, $this->type); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcStreamSettingPeer::DATABASE_NAME); - $criteria->add(CcStreamSettingPeer::KEYNAME, $this->keyname); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return string - */ - public function getPrimaryKey() - { - return $this->getDbKeyName(); - } - - /** - * Generic method to set the primary key (keyname column). - * - * @param string $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbKeyName($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbKeyName(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcStreamSetting (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbKeyName($this->keyname); - $copyObj->setDbValue($this->value); - $copyObj->setDbType($this->type); - - $copyObj->setNew(true); - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcStreamSetting Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcStreamSettingPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcStreamSettingPeer(); - } - return self::$peer; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->keyname = null; - $this->value = null; - $this->type = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcStreamSetting + /** + * Peer class name + */ + const PEER = 'CcStreamSettingPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcStreamSettingPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the keyname field. + * @var string + */ + protected $keyname; + + /** + * The value for the value field. + * @var string + */ + protected $value; + + /** + * The value for the type field. + * @var string + */ + protected $type; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [keyname] column value. + * + * @return string + */ + public function getDbKeyName() + { + + return $this->keyname; + } + + /** + * Get the [value] column value. + * + * @return string + */ + public function getDbValue() + { + + return $this->value; + } + + /** + * Get the [type] column value. + * + * @return string + */ + public function getDbType() + { + + return $this->type; + } + + /** + * Set the value of [keyname] column. + * + * @param string $v new value + * @return CcStreamSetting The current object (for fluent API support) + */ + public function setDbKeyName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->keyname !== $v) { + $this->keyname = $v; + $this->modifiedColumns[] = CcStreamSettingPeer::KEYNAME; + } + + + return $this; + } // setDbKeyName() + + /** + * Set the value of [value] column. + * + * @param string $v new value + * @return CcStreamSetting The current object (for fluent API support) + */ + public function setDbValue($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->value !== $v) { + $this->value = $v; + $this->modifiedColumns[] = CcStreamSettingPeer::VALUE; + } + + + return $this; + } // setDbValue() + + /** + * Set the value of [type] column. + * + * @param string $v new value + * @return CcStreamSetting The current object (for fluent API support) + */ + public function setDbType($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->type !== $v) { + $this->type = $v; + $this->modifiedColumns[] = CcStreamSettingPeer::TYPE; + } + + + return $this; + } // setDbType() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->keyname = ($row[$startcol + 0] !== null) ? (string) $row[$startcol + 0] : null; + $this->value = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->type = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 3; // 3 = CcStreamSettingPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcStreamSetting object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcStreamSettingPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcStreamSettingQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcStreamSettingPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcStreamSettingPeer::KEYNAME)) { + $modifiedColumns[':p' . $index++] = '"keyname"'; + } + if ($this->isColumnModified(CcStreamSettingPeer::VALUE)) { + $modifiedColumns[':p' . $index++] = '"value"'; + } + if ($this->isColumnModified(CcStreamSettingPeer::TYPE)) { + $modifiedColumns[':p' . $index++] = '"type"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_stream_setting" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"keyname"': + $stmt->bindValue($identifier, $this->keyname, PDO::PARAM_STR); + break; + case '"value"': + $stmt->bindValue($identifier, $this->value, PDO::PARAM_STR); + break; + case '"type"': + $stmt->bindValue($identifier, $this->type, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcStreamSettingPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcStreamSettingPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbKeyName(); + break; + case 1: + return $this->getDbValue(); + break; + case 2: + return $this->getDbType(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array()) + { + if (isset($alreadyDumpedObjects['CcStreamSetting'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcStreamSetting'][$this->getPrimaryKey()] = true; + $keys = CcStreamSettingPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbKeyName(), + $keys[1] => $this->getDbValue(), + $keys[2] => $this->getDbType(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcStreamSettingPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbKeyName($value); + break; + case 1: + $this->setDbValue($value); + break; + case 2: + $this->setDbType($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcStreamSettingPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbKeyName($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbValue($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbType($arr[$keys[2]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcStreamSettingPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcStreamSettingPeer::KEYNAME)) $criteria->add(CcStreamSettingPeer::KEYNAME, $this->keyname); + if ($this->isColumnModified(CcStreamSettingPeer::VALUE)) $criteria->add(CcStreamSettingPeer::VALUE, $this->value); + if ($this->isColumnModified(CcStreamSettingPeer::TYPE)) $criteria->add(CcStreamSettingPeer::TYPE, $this->type); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcStreamSettingPeer::DATABASE_NAME); + $criteria->add(CcStreamSettingPeer::KEYNAME, $this->keyname); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return string + */ + public function getPrimaryKey() + { + return $this->getDbKeyName(); + } + + /** + * Generic method to set the primary key (keyname column). + * + * @param string $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbKeyName($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbKeyName(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcStreamSetting (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbValue($this->getDbValue()); + $copyObj->setDbType($this->getDbType()); + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbKeyName(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcStreamSetting Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcStreamSettingPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcStreamSettingPeer(); + } + + return self::$peer; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->keyname = null; + $this->value = null; + $this->type = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcStreamSettingPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcStreamSettingPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcStreamSettingPeer.php index f5e680b203..5fa81eaf33 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcStreamSettingPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcStreamSettingPeer.php @@ -4,733 +4,755 @@ /** * Base static class for performing query and update operations on the 'cc_stream_setting' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcStreamSettingPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_stream_setting'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcStreamSetting'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcStreamSetting'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcStreamSettingTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 3; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the KEYNAME field */ - const KEYNAME = 'cc_stream_setting.KEYNAME'; - - /** the column name for the VALUE field */ - const VALUE = 'cc_stream_setting.VALUE'; - - /** the column name for the TYPE field */ - const TYPE = 'cc_stream_setting.TYPE'; - - /** - * An identiy map to hold any loaded instances of CcStreamSetting objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcStreamSetting[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbKeyName', 'DbValue', 'DbType', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbKeyName', 'dbValue', 'dbType', ), - BasePeer::TYPE_COLNAME => array (self::KEYNAME, self::VALUE, self::TYPE, ), - BasePeer::TYPE_RAW_COLNAME => array ('KEYNAME', 'VALUE', 'TYPE', ), - BasePeer::TYPE_FIELDNAME => array ('keyname', 'value', 'type', ), - BasePeer::TYPE_NUM => array (0, 1, 2, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbKeyName' => 0, 'DbValue' => 1, 'DbType' => 2, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbKeyName' => 0, 'dbValue' => 1, 'dbType' => 2, ), - BasePeer::TYPE_COLNAME => array (self::KEYNAME => 0, self::VALUE => 1, self::TYPE => 2, ), - BasePeer::TYPE_RAW_COLNAME => array ('KEYNAME' => 0, 'VALUE' => 1, 'TYPE' => 2, ), - BasePeer::TYPE_FIELDNAME => array ('keyname' => 0, 'value' => 1, 'type' => 2, ), - BasePeer::TYPE_NUM => array (0, 1, 2, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcStreamSettingPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcStreamSettingPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcStreamSettingPeer::KEYNAME); - $criteria->addSelectColumn(CcStreamSettingPeer::VALUE); - $criteria->addSelectColumn(CcStreamSettingPeer::TYPE); - } else { - $criteria->addSelectColumn($alias . '.KEYNAME'); - $criteria->addSelectColumn($alias . '.VALUE'); - $criteria->addSelectColumn($alias . '.TYPE'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcStreamSettingPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcStreamSettingPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcStreamSetting - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcStreamSettingPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcStreamSettingPeer::populateObjects(CcStreamSettingPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcStreamSettingPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcStreamSetting $value A CcStreamSetting object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcStreamSetting $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbKeyName(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcStreamSetting object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcStreamSetting) { - $key = (string) $value->getDbKeyName(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcStreamSetting object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcStreamSetting Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_stream_setting - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (string) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcStreamSettingPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcStreamSettingPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcStreamSettingPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcStreamSettingPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcStreamSetting object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcStreamSettingPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcStreamSettingPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcStreamSettingPeer::NUM_COLUMNS; - } else { - $cls = CcStreamSettingPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcStreamSettingPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcStreamSettingPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcStreamSettingPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcStreamSettingTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcStreamSettingPeer::CLASS_DEFAULT : CcStreamSettingPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcStreamSetting or Criteria object. - * - * @param mixed $values Criteria or CcStreamSetting object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcStreamSetting object - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcStreamSetting or Criteria object. - * - * @param mixed $values Criteria or CcStreamSetting object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcStreamSettingPeer::KEYNAME); - $value = $criteria->remove(CcStreamSettingPeer::KEYNAME); - if ($value) { - $selectCriteria->add(CcStreamSettingPeer::KEYNAME, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcStreamSettingPeer::TABLE_NAME); - } - - } else { // $values is CcStreamSetting object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_stream_setting table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcStreamSettingPeer::TABLE_NAME, $con, CcStreamSettingPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcStreamSettingPeer::clearInstancePool(); - CcStreamSettingPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcStreamSetting or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcStreamSetting object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcStreamSettingPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcStreamSetting) { // it's a model object - // invalidate the cache for this single object - CcStreamSettingPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcStreamSettingPeer::KEYNAME, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcStreamSettingPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcStreamSettingPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcStreamSetting object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcStreamSetting $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcStreamSetting $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcStreamSettingPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcStreamSettingPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcStreamSettingPeer::DATABASE_NAME, CcStreamSettingPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param string $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcStreamSetting - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcStreamSettingPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcStreamSettingPeer::DATABASE_NAME); - $criteria->add(CcStreamSettingPeer::KEYNAME, $pk); - - $v = CcStreamSettingPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcStreamSettingPeer::DATABASE_NAME); - $criteria->add(CcStreamSettingPeer::KEYNAME, $pks, Criteria::IN); - $objs = CcStreamSettingPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcStreamSettingPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_stream_setting'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcStreamSetting'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcStreamSettingTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 3; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 3; + + /** the column name for the keyname field */ + const KEYNAME = 'cc_stream_setting.keyname'; + + /** the column name for the value field */ + const VALUE = 'cc_stream_setting.value'; + + /** the column name for the type field */ + const TYPE = 'cc_stream_setting.type'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcStreamSetting objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcStreamSetting[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcStreamSettingPeer::$fieldNames[CcStreamSettingPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbKeyName', 'DbValue', 'DbType', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbKeyName', 'dbValue', 'dbType', ), + BasePeer::TYPE_COLNAME => array (CcStreamSettingPeer::KEYNAME, CcStreamSettingPeer::VALUE, CcStreamSettingPeer::TYPE, ), + BasePeer::TYPE_RAW_COLNAME => array ('KEYNAME', 'VALUE', 'TYPE', ), + BasePeer::TYPE_FIELDNAME => array ('keyname', 'value', 'type', ), + BasePeer::TYPE_NUM => array (0, 1, 2, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcStreamSettingPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbKeyName' => 0, 'DbValue' => 1, 'DbType' => 2, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbKeyName' => 0, 'dbValue' => 1, 'dbType' => 2, ), + BasePeer::TYPE_COLNAME => array (CcStreamSettingPeer::KEYNAME => 0, CcStreamSettingPeer::VALUE => 1, CcStreamSettingPeer::TYPE => 2, ), + BasePeer::TYPE_RAW_COLNAME => array ('KEYNAME' => 0, 'VALUE' => 1, 'TYPE' => 2, ), + BasePeer::TYPE_FIELDNAME => array ('keyname' => 0, 'value' => 1, 'type' => 2, ), + BasePeer::TYPE_NUM => array (0, 1, 2, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcStreamSettingPeer::getFieldNames($toType); + $key = isset(CcStreamSettingPeer::$fieldKeys[$fromType][$name]) ? CcStreamSettingPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcStreamSettingPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcStreamSettingPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcStreamSettingPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcStreamSettingPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcStreamSettingPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcStreamSettingPeer::KEYNAME); + $criteria->addSelectColumn(CcStreamSettingPeer::VALUE); + $criteria->addSelectColumn(CcStreamSettingPeer::TYPE); + } else { + $criteria->addSelectColumn($alias . '.keyname'); + $criteria->addSelectColumn($alias . '.value'); + $criteria->addSelectColumn($alias . '.type'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcStreamSettingPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcStreamSettingPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcStreamSettingPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcStreamSetting + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcStreamSettingPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcStreamSettingPeer::populateObjects(CcStreamSettingPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcStreamSettingPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcStreamSettingPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcStreamSetting $obj A CcStreamSetting object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbKeyName(); + } // if key === null + CcStreamSettingPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcStreamSetting object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcStreamSetting) { + $key = (string) $value->getDbKeyName(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcStreamSetting object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcStreamSettingPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcStreamSetting Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcStreamSettingPeer::$instances[$key])) { + return CcStreamSettingPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcStreamSettingPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcStreamSettingPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_stream_setting + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (string) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcStreamSettingPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcStreamSettingPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcStreamSettingPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcStreamSettingPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcStreamSetting object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcStreamSettingPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcStreamSettingPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcStreamSettingPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcStreamSettingPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcStreamSettingPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcStreamSettingPeer::DATABASE_NAME)->getTable(CcStreamSettingPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcStreamSettingPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcStreamSettingPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcStreamSettingTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcStreamSettingPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcStreamSetting or Criteria object. + * + * @param mixed $values Criteria or CcStreamSetting object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcStreamSetting object + } + + + // Set the correct dbName + $criteria->setDbName(CcStreamSettingPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcStreamSetting or Criteria object. + * + * @param mixed $values Criteria or CcStreamSetting object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcStreamSettingPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcStreamSettingPeer::KEYNAME); + $value = $criteria->remove(CcStreamSettingPeer::KEYNAME); + if ($value) { + $selectCriteria->add(CcStreamSettingPeer::KEYNAME, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcStreamSettingPeer::TABLE_NAME); + } + + } else { // $values is CcStreamSetting object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcStreamSettingPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_stream_setting table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcStreamSettingPeer::TABLE_NAME, $con, CcStreamSettingPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcStreamSettingPeer::clearInstancePool(); + CcStreamSettingPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcStreamSetting or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcStreamSetting object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcStreamSettingPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcStreamSetting) { // it's a model object + // invalidate the cache for this single object + CcStreamSettingPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcStreamSettingPeer::DATABASE_NAME); + $criteria->add(CcStreamSettingPeer::KEYNAME, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcStreamSettingPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcStreamSettingPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcStreamSettingPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcStreamSetting object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcStreamSetting $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcStreamSettingPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcStreamSettingPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcStreamSettingPeer::DATABASE_NAME, CcStreamSettingPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param string $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcStreamSetting + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcStreamSettingPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcStreamSettingPeer::DATABASE_NAME); + $criteria->add(CcStreamSettingPeer::KEYNAME, $pk); + + $v = CcStreamSettingPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcStreamSetting[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcStreamSettingPeer::DATABASE_NAME); + $criteria->add(CcStreamSettingPeer::KEYNAME, $pks, Criteria::IN); + $objs = CcStreamSettingPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcStreamSettingPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcStreamSettingQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcStreamSettingQuery.php index 666106d6fc..ee5b92f336 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcStreamSettingQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcStreamSettingQuery.php @@ -4,219 +4,326 @@ /** * Base class that represents a query for the 'cc_stream_setting' table. * - * * - * @method CcStreamSettingQuery orderByDbKeyName($order = Criteria::ASC) Order by the keyname column - * @method CcStreamSettingQuery orderByDbValue($order = Criteria::ASC) Order by the value column - * @method CcStreamSettingQuery orderByDbType($order = Criteria::ASC) Order by the type column * - * @method CcStreamSettingQuery groupByDbKeyName() Group by the keyname column - * @method CcStreamSettingQuery groupByDbValue() Group by the value column - * @method CcStreamSettingQuery groupByDbType() Group by the type column + * @method CcStreamSettingQuery orderByDbKeyName($order = Criteria::ASC) Order by the keyname column + * @method CcStreamSettingQuery orderByDbValue($order = Criteria::ASC) Order by the value column + * @method CcStreamSettingQuery orderByDbType($order = Criteria::ASC) Order by the type column * - * @method CcStreamSettingQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcStreamSettingQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcStreamSettingQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcStreamSettingQuery groupByDbKeyName() Group by the keyname column + * @method CcStreamSettingQuery groupByDbValue() Group by the value column + * @method CcStreamSettingQuery groupByDbType() Group by the type column * - * @method CcStreamSetting findOne(PropelPDO $con = null) Return the first CcStreamSetting matching the query - * @method CcStreamSetting findOneOrCreate(PropelPDO $con = null) Return the first CcStreamSetting matching the query, or a new CcStreamSetting object populated from the query conditions when no match is found + * @method CcStreamSettingQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcStreamSettingQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcStreamSettingQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcStreamSetting findOneByDbKeyName(string $keyname) Return the first CcStreamSetting filtered by the keyname column - * @method CcStreamSetting findOneByDbValue(string $value) Return the first CcStreamSetting filtered by the value column - * @method CcStreamSetting findOneByDbType(string $type) Return the first CcStreamSetting filtered by the type column + * @method CcStreamSetting findOne(PropelPDO $con = null) Return the first CcStreamSetting matching the query + * @method CcStreamSetting findOneOrCreate(PropelPDO $con = null) Return the first CcStreamSetting matching the query, or a new CcStreamSetting object populated from the query conditions when no match is found * - * @method array findByDbKeyName(string $keyname) Return CcStreamSetting objects filtered by the keyname column - * @method array findByDbValue(string $value) Return CcStreamSetting objects filtered by the value column - * @method array findByDbType(string $type) Return CcStreamSetting objects filtered by the type column + * @method CcStreamSetting findOneByDbValue(string $value) Return the first CcStreamSetting filtered by the value column + * @method CcStreamSetting findOneByDbType(string $type) Return the first CcStreamSetting filtered by the type column + * + * @method array findByDbKeyName(string $keyname) Return CcStreamSetting objects filtered by the keyname column + * @method array findByDbValue(string $value) Return CcStreamSetting objects filtered by the value column + * @method array findByDbType(string $type) Return CcStreamSetting objects filtered by the type column * * @package propel.generator.airtime.om */ abstract class BaseCcStreamSettingQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcStreamSettingQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcStreamSetting'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcStreamSettingQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcStreamSettingQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcStreamSettingQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcStreamSettingQuery) { + return $criteria; + } + $query = new CcStreamSettingQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcStreamSetting|CcStreamSetting[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcStreamSettingPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcStreamSettingPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcStreamSetting A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbKeyName($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcStreamSetting A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "keyname", "value", "type" FROM "cc_stream_setting" WHERE "keyname" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_STR); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcStreamSetting(); + $obj->hydrate($row); + CcStreamSettingPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcStreamSetting|CcStreamSetting[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcStreamSetting[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcStreamSettingQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcStreamSettingPeer::KEYNAME, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcStreamSettingQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcStreamSettingPeer::KEYNAME, $keys, Criteria::IN); + } + + /** + * Filter the query on the keyname column + * + * Example usage: + * + * $query->filterByDbKeyName('fooValue'); // WHERE keyname = 'fooValue' + * $query->filterByDbKeyName('%fooValue%'); // WHERE keyname LIKE '%fooValue%' + * + * + * @param string $dbKeyName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcStreamSettingQuery The current query, for fluid interface + */ + public function filterByDbKeyName($dbKeyName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbKeyName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbKeyName)) { + $dbKeyName = str_replace('*', '%', $dbKeyName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcStreamSettingPeer::KEYNAME, $dbKeyName, $comparison); + } + + /** + * Filter the query on the value column + * + * Example usage: + * + * $query->filterByDbValue('fooValue'); // WHERE value = 'fooValue' + * $query->filterByDbValue('%fooValue%'); // WHERE value LIKE '%fooValue%' + * + * + * @param string $dbValue The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcStreamSettingQuery The current query, for fluid interface + */ + public function filterByDbValue($dbValue = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbValue)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbValue)) { + $dbValue = str_replace('*', '%', $dbValue); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcStreamSettingPeer::VALUE, $dbValue, $comparison); + } + + /** + * Filter the query on the type column + * + * Example usage: + * + * $query->filterByDbType('fooValue'); // WHERE type = 'fooValue' + * $query->filterByDbType('%fooValue%'); // WHERE type LIKE '%fooValue%' + * + * + * @param string $dbType The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcStreamSettingQuery The current query, for fluid interface + */ + public function filterByDbType($dbType = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbType)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbType)) { + $dbType = str_replace('*', '%', $dbType); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcStreamSettingPeer::TYPE, $dbType, $comparison); + } + + /** + * Exclude object from result + * + * @param CcStreamSetting $ccStreamSetting Object to remove from the list of results + * + * @return CcStreamSettingQuery The current query, for fluid interface + */ + public function prune($ccStreamSetting = null) + { + if ($ccStreamSetting) { + $this->addUsingAlias(CcStreamSettingPeer::KEYNAME, $ccStreamSetting->getDbKeyName(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcStreamSettingQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcStreamSetting', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcStreamSettingQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcStreamSettingQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcStreamSettingQuery) { - return $criteria; - } - $query = new CcStreamSettingQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcStreamSetting|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcStreamSettingPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcStreamSettingQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcStreamSettingPeer::KEYNAME, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcStreamSettingQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcStreamSettingPeer::KEYNAME, $keys, Criteria::IN); - } - - /** - * Filter the query on the keyname column - * - * @param string $dbKeyName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcStreamSettingQuery The current query, for fluid interface - */ - public function filterByDbKeyName($dbKeyName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbKeyName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbKeyName)) { - $dbKeyName = str_replace('*', '%', $dbKeyName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcStreamSettingPeer::KEYNAME, $dbKeyName, $comparison); - } - - /** - * Filter the query on the value column - * - * @param string $dbValue The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcStreamSettingQuery The current query, for fluid interface - */ - public function filterByDbValue($dbValue = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbValue)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbValue)) { - $dbValue = str_replace('*', '%', $dbValue); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcStreamSettingPeer::VALUE, $dbValue, $comparison); - } - - /** - * Filter the query on the type column - * - * @param string $dbType The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcStreamSettingQuery The current query, for fluid interface - */ - public function filterByDbType($dbType = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbType)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbType)) { - $dbType = str_replace('*', '%', $dbType); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcStreamSettingPeer::TYPE, $dbType, $comparison); - } - - /** - * Exclude object from result - * - * @param CcStreamSetting $ccStreamSetting Object to remove from the list of results - * - * @return CcStreamSettingQuery The current query, for fluid interface - */ - public function prune($ccStreamSetting = null) - { - if ($ccStreamSetting) { - $this->addUsingAlias(CcStreamSettingPeer::KEYNAME, $ccStreamSetting->getDbKeyName(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcStreamSettingQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSubjs.php b/airtime_mvc/application/models/airtime/om/BaseCcSubjs.php index c335d71588..6aa0df213a 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSubjs.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSubjs.php @@ -4,2781 +4,4220 @@ /** * Base class that represents a row from the 'cc_subjs' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcSubjs extends BaseObject implements Persistent +abstract class BaseCcSubjs extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcSubjsPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcSubjsPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the login field. - * Note: this column has a database default value of: '' - * @var string - */ - protected $login; - - /** - * The value for the pass field. - * Note: this column has a database default value of: '' - * @var string - */ - protected $pass; - - /** - * The value for the type field. - * Note: this column has a database default value of: 'U' - * @var string - */ - protected $type; - - /** - * The value for the first_name field. - * Note: this column has a database default value of: '' - * @var string - */ - protected $first_name; - - /** - * The value for the last_name field. - * Note: this column has a database default value of: '' - * @var string - */ - protected $last_name; - - /** - * The value for the lastlogin field. - * @var string - */ - protected $lastlogin; - - /** - * The value for the lastfail field. - * @var string - */ - protected $lastfail; - - /** - * The value for the skype_contact field. - * @var string - */ - protected $skype_contact; - - /** - * The value for the jabber_contact field. - * @var string - */ - protected $jabber_contact; - - /** - * The value for the email field. - * @var string - */ - protected $email; - - /** - * The value for the cell_phone field. - * @var string - */ - protected $cell_phone; - - /** - * The value for the login_attempts field. - * Note: this column has a database default value of: 0 - * @var int - */ - protected $login_attempts; - - /** - * @var array CcFiles[] Collection to store aggregation of CcFiles objects. - */ - protected $collCcFilessRelatedByDbOwnerId; - - /** - * @var array CcFiles[] Collection to store aggregation of CcFiles objects. - */ - protected $collCcFilessRelatedByDbEditedby; - - /** - * @var array CcPerms[] Collection to store aggregation of CcPerms objects. - */ - protected $collCcPermss; - - /** - * @var array CcShowHosts[] Collection to store aggregation of CcShowHosts objects. - */ - protected $collCcShowHostss; - - /** - * @var array CcPlaylist[] Collection to store aggregation of CcPlaylist objects. - */ - protected $collCcPlaylists; - - /** - * @var array CcBlock[] Collection to store aggregation of CcBlock objects. - */ - protected $collCcBlocks; - - /** - * @var array CcPref[] Collection to store aggregation of CcPref objects. - */ - protected $collCcPrefs; - - /** - * @var array CcSess[] Collection to store aggregation of CcSess objects. - */ - protected $collCcSesss; - - /** - * @var array CcSubjsToken[] Collection to store aggregation of CcSubjsToken objects. - */ - protected $collCcSubjsTokens; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->login = ''; - $this->pass = ''; - $this->type = 'U'; - $this->first_name = ''; - $this->last_name = ''; - $this->login_attempts = 0; - } - - /** - * Initializes internal state of BaseCcSubjs object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [login] column value. - * - * @return string - */ - public function getDbLogin() - { - return $this->login; - } - - /** - * Get the [pass] column value. - * - * @return string - */ - public function getDbPass() - { - return $this->pass; - } - - /** - * Get the [type] column value. - * - * @return string - */ - public function getDbType() - { - return $this->type; - } - - /** - * Get the [first_name] column value. - * - * @return string - */ - public function getDbFirstName() - { - return $this->first_name; - } - - /** - * Get the [last_name] column value. - * - * @return string - */ - public function getDbLastName() - { - return $this->last_name; - } - - /** - * Get the [optionally formatted] temporal [lastlogin] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbLastlogin($format = 'Y-m-d H:i:s') - { - if ($this->lastlogin === null) { - return null; - } - - - - try { - $dt = new DateTime($this->lastlogin); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->lastlogin, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [lastfail] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbLastfail($format = 'Y-m-d H:i:s') - { - if ($this->lastfail === null) { - return null; - } - - - - try { - $dt = new DateTime($this->lastfail); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->lastfail, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [skype_contact] column value. - * - * @return string - */ - public function getDbSkypeContact() - { - return $this->skype_contact; - } - - /** - * Get the [jabber_contact] column value. - * - * @return string - */ - public function getDbJabberContact() - { - return $this->jabber_contact; - } - - /** - * Get the [email] column value. - * - * @return string - */ - public function getDbEmail() - { - return $this->email; - } - - /** - * Get the [cell_phone] column value. - * - * @return string - */ - public function getDbCellPhone() - { - return $this->cell_phone; - } - - /** - * Get the [login_attempts] column value. - * - * @return int - */ - public function getDbLoginAttempts() - { - return $this->login_attempts; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcSubjs The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcSubjsPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [login] column. - * - * @param string $v new value - * @return CcSubjs The current object (for fluent API support) - */ - public function setDbLogin($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->login !== $v || $this->isNew()) { - $this->login = $v; - $this->modifiedColumns[] = CcSubjsPeer::LOGIN; - } - - return $this; - } // setDbLogin() - - /** - * Set the value of [pass] column. - * - * @param string $v new value - * @return CcSubjs The current object (for fluent API support) - */ - public function setDbPass($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->pass !== $v || $this->isNew()) { - $this->pass = $v; - $this->modifiedColumns[] = CcSubjsPeer::PASS; - } - - return $this; - } // setDbPass() - - /** - * Set the value of [type] column. - * - * @param string $v new value - * @return CcSubjs The current object (for fluent API support) - */ - public function setDbType($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->type !== $v || $this->isNew()) { - $this->type = $v; - $this->modifiedColumns[] = CcSubjsPeer::TYPE; - } - - return $this; - } // setDbType() - - /** - * Set the value of [first_name] column. - * - * @param string $v new value - * @return CcSubjs The current object (for fluent API support) - */ - public function setDbFirstName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->first_name !== $v || $this->isNew()) { - $this->first_name = $v; - $this->modifiedColumns[] = CcSubjsPeer::FIRST_NAME; - } - - return $this; - } // setDbFirstName() - - /** - * Set the value of [last_name] column. - * - * @param string $v new value - * @return CcSubjs The current object (for fluent API support) - */ - public function setDbLastName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->last_name !== $v || $this->isNew()) { - $this->last_name = $v; - $this->modifiedColumns[] = CcSubjsPeer::LAST_NAME; - } - - return $this; - } // setDbLastName() - - /** - * Sets the value of [lastlogin] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcSubjs The current object (for fluent API support) - */ - public function setDbLastlogin($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->lastlogin !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->lastlogin !== null && $tmpDt = new DateTime($this->lastlogin)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->lastlogin = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcSubjsPeer::LASTLOGIN; - } - } // if either are not null - - return $this; - } // setDbLastlogin() - - /** - * Sets the value of [lastfail] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcSubjs The current object (for fluent API support) - */ - public function setDbLastfail($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->lastfail !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->lastfail !== null && $tmpDt = new DateTime($this->lastfail)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->lastfail = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcSubjsPeer::LASTFAIL; - } - } // if either are not null - - return $this; - } // setDbLastfail() - - /** - * Set the value of [skype_contact] column. - * - * @param string $v new value - * @return CcSubjs The current object (for fluent API support) - */ - public function setDbSkypeContact($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->skype_contact !== $v) { - $this->skype_contact = $v; - $this->modifiedColumns[] = CcSubjsPeer::SKYPE_CONTACT; - } - - return $this; - } // setDbSkypeContact() - - /** - * Set the value of [jabber_contact] column. - * - * @param string $v new value - * @return CcSubjs The current object (for fluent API support) - */ - public function setDbJabberContact($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->jabber_contact !== $v) { - $this->jabber_contact = $v; - $this->modifiedColumns[] = CcSubjsPeer::JABBER_CONTACT; - } - - return $this; - } // setDbJabberContact() - - /** - * Set the value of [email] column. - * - * @param string $v new value - * @return CcSubjs The current object (for fluent API support) - */ - public function setDbEmail($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->email !== $v) { - $this->email = $v; - $this->modifiedColumns[] = CcSubjsPeer::EMAIL; - } - - return $this; - } // setDbEmail() - - /** - * Set the value of [cell_phone] column. - * - * @param string $v new value - * @return CcSubjs The current object (for fluent API support) - */ - public function setDbCellPhone($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->cell_phone !== $v) { - $this->cell_phone = $v; - $this->modifiedColumns[] = CcSubjsPeer::CELL_PHONE; - } - - return $this; - } // setDbCellPhone() - - /** - * Set the value of [login_attempts] column. - * - * @param int $v new value - * @return CcSubjs The current object (for fluent API support) - */ - public function setDbLoginAttempts($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->login_attempts !== $v || $this->isNew()) { - $this->login_attempts = $v; - $this->modifiedColumns[] = CcSubjsPeer::LOGIN_ATTEMPTS; - } - - return $this; - } // setDbLoginAttempts() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->login !== '') { - return false; - } - - if ($this->pass !== '') { - return false; - } - - if ($this->type !== 'U') { - return false; - } - - if ($this->first_name !== '') { - return false; - } - - if ($this->last_name !== '') { - return false; - } - - if ($this->login_attempts !== 0) { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->login = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->pass = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->type = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->first_name = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; - $this->last_name = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; - $this->lastlogin = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; - $this->lastfail = ($row[$startcol + 7] !== null) ? (string) $row[$startcol + 7] : null; - $this->skype_contact = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; - $this->jabber_contact = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; - $this->email = ($row[$startcol + 10] !== null) ? (string) $row[$startcol + 10] : null; - $this->cell_phone = ($row[$startcol + 11] !== null) ? (string) $row[$startcol + 11] : null; - $this->login_attempts = ($row[$startcol + 12] !== null) ? (int) $row[$startcol + 12] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 13; // 13 = CcSubjsPeer::NUM_COLUMNS - CcSubjsPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcSubjs object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcSubjsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->collCcFilessRelatedByDbOwnerId = null; - - $this->collCcFilessRelatedByDbEditedby = null; - - $this->collCcPermss = null; - - $this->collCcShowHostss = null; - - $this->collCcPlaylists = null; - - $this->collCcBlocks = null; - - $this->collCcPrefs = null; - - $this->collCcSesss = null; - - $this->collCcSubjsTokens = null; - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcSubjsQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcSubjsPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcSubjsPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcSubjsPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcSubjsPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows = CcSubjsPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - if ($this->collCcFilessRelatedByDbOwnerId !== null) { - foreach ($this->collCcFilessRelatedByDbOwnerId as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcFilessRelatedByDbEditedby !== null) { - foreach ($this->collCcFilessRelatedByDbEditedby as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcPermss !== null) { - foreach ($this->collCcPermss as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcShowHostss !== null) { - foreach ($this->collCcShowHostss as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcPlaylists !== null) { - foreach ($this->collCcPlaylists as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcBlocks !== null) { - foreach ($this->collCcBlocks as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcPrefs !== null) { - foreach ($this->collCcPrefs as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcSesss !== null) { - foreach ($this->collCcSesss as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - if ($this->collCcSubjsTokens !== null) { - foreach ($this->collCcSubjsTokens as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcSubjsPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - if ($this->collCcFilessRelatedByDbOwnerId !== null) { - foreach ($this->collCcFilessRelatedByDbOwnerId as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcFilessRelatedByDbEditedby !== null) { - foreach ($this->collCcFilessRelatedByDbEditedby as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcPermss !== null) { - foreach ($this->collCcPermss as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcShowHostss !== null) { - foreach ($this->collCcShowHostss as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcPlaylists !== null) { - foreach ($this->collCcPlaylists as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcBlocks !== null) { - foreach ($this->collCcBlocks as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcPrefs !== null) { - foreach ($this->collCcPrefs as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcSesss !== null) { - foreach ($this->collCcSesss as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - if ($this->collCcSubjsTokens !== null) { - foreach ($this->collCcSubjsTokens as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcSubjsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbLogin(); - break; - case 2: - return $this->getDbPass(); - break; - case 3: - return $this->getDbType(); - break; - case 4: - return $this->getDbFirstName(); - break; - case 5: - return $this->getDbLastName(); - break; - case 6: - return $this->getDbLastlogin(); - break; - case 7: - return $this->getDbLastfail(); - break; - case 8: - return $this->getDbSkypeContact(); - break; - case 9: - return $this->getDbJabberContact(); - break; - case 10: - return $this->getDbEmail(); - break; - case 11: - return $this->getDbCellPhone(); - break; - case 12: - return $this->getDbLoginAttempts(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcSubjsPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbLogin(), - $keys[2] => $this->getDbPass(), - $keys[3] => $this->getDbType(), - $keys[4] => $this->getDbFirstName(), - $keys[5] => $this->getDbLastName(), - $keys[6] => $this->getDbLastlogin(), - $keys[7] => $this->getDbLastfail(), - $keys[8] => $this->getDbSkypeContact(), - $keys[9] => $this->getDbJabberContact(), - $keys[10] => $this->getDbEmail(), - $keys[11] => $this->getDbCellPhone(), - $keys[12] => $this->getDbLoginAttempts(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcSubjsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbLogin($value); - break; - case 2: - $this->setDbPass($value); - break; - case 3: - $this->setDbType($value); - break; - case 4: - $this->setDbFirstName($value); - break; - case 5: - $this->setDbLastName($value); - break; - case 6: - $this->setDbLastlogin($value); - break; - case 7: - $this->setDbLastfail($value); - break; - case 8: - $this->setDbSkypeContact($value); - break; - case 9: - $this->setDbJabberContact($value); - break; - case 10: - $this->setDbEmail($value); - break; - case 11: - $this->setDbCellPhone($value); - break; - case 12: - $this->setDbLoginAttempts($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcSubjsPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbLogin($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbPass($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbType($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbFirstName($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setDbLastName($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setDbLastlogin($arr[$keys[6]]); - if (array_key_exists($keys[7], $arr)) $this->setDbLastfail($arr[$keys[7]]); - if (array_key_exists($keys[8], $arr)) $this->setDbSkypeContact($arr[$keys[8]]); - if (array_key_exists($keys[9], $arr)) $this->setDbJabberContact($arr[$keys[9]]); - if (array_key_exists($keys[10], $arr)) $this->setDbEmail($arr[$keys[10]]); - if (array_key_exists($keys[11], $arr)) $this->setDbCellPhone($arr[$keys[11]]); - if (array_key_exists($keys[12], $arr)) $this->setDbLoginAttempts($arr[$keys[12]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcSubjsPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcSubjsPeer::ID)) $criteria->add(CcSubjsPeer::ID, $this->id); - if ($this->isColumnModified(CcSubjsPeer::LOGIN)) $criteria->add(CcSubjsPeer::LOGIN, $this->login); - if ($this->isColumnModified(CcSubjsPeer::PASS)) $criteria->add(CcSubjsPeer::PASS, $this->pass); - if ($this->isColumnModified(CcSubjsPeer::TYPE)) $criteria->add(CcSubjsPeer::TYPE, $this->type); - if ($this->isColumnModified(CcSubjsPeer::FIRST_NAME)) $criteria->add(CcSubjsPeer::FIRST_NAME, $this->first_name); - if ($this->isColumnModified(CcSubjsPeer::LAST_NAME)) $criteria->add(CcSubjsPeer::LAST_NAME, $this->last_name); - if ($this->isColumnModified(CcSubjsPeer::LASTLOGIN)) $criteria->add(CcSubjsPeer::LASTLOGIN, $this->lastlogin); - if ($this->isColumnModified(CcSubjsPeer::LASTFAIL)) $criteria->add(CcSubjsPeer::LASTFAIL, $this->lastfail); - if ($this->isColumnModified(CcSubjsPeer::SKYPE_CONTACT)) $criteria->add(CcSubjsPeer::SKYPE_CONTACT, $this->skype_contact); - if ($this->isColumnModified(CcSubjsPeer::JABBER_CONTACT)) $criteria->add(CcSubjsPeer::JABBER_CONTACT, $this->jabber_contact); - if ($this->isColumnModified(CcSubjsPeer::EMAIL)) $criteria->add(CcSubjsPeer::EMAIL, $this->email); - if ($this->isColumnModified(CcSubjsPeer::CELL_PHONE)) $criteria->add(CcSubjsPeer::CELL_PHONE, $this->cell_phone); - if ($this->isColumnModified(CcSubjsPeer::LOGIN_ATTEMPTS)) $criteria->add(CcSubjsPeer::LOGIN_ATTEMPTS, $this->login_attempts); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcSubjsPeer::DATABASE_NAME); - $criteria->add(CcSubjsPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcSubjs (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbLogin($this->login); - $copyObj->setDbPass($this->pass); - $copyObj->setDbType($this->type); - $copyObj->setDbFirstName($this->first_name); - $copyObj->setDbLastName($this->last_name); - $copyObj->setDbLastlogin($this->lastlogin); - $copyObj->setDbLastfail($this->lastfail); - $copyObj->setDbSkypeContact($this->skype_contact); - $copyObj->setDbJabberContact($this->jabber_contact); - $copyObj->setDbEmail($this->email); - $copyObj->setDbCellPhone($this->cell_phone); - $copyObj->setDbLoginAttempts($this->login_attempts); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getCcFilessRelatedByDbOwnerId() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcFilesRelatedByDbOwnerId($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcFilessRelatedByDbEditedby() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcFilesRelatedByDbEditedby($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcPermss() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcPerms($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcShowHostss() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcShowHosts($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcPlaylists() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcPlaylist($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcBlocks() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcBlock($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcPrefs() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcPref($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcSesss() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcSess($relObj->copy($deepCopy)); - } - } - - foreach ($this->getCcSubjsTokens() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcSubjsToken($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcSubjs Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcSubjsPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcSubjsPeer(); - } - return self::$peer; - } - - /** - * Clears out the collCcFilessRelatedByDbOwnerId collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcFilessRelatedByDbOwnerId() - */ - public function clearCcFilessRelatedByDbOwnerId() - { - $this->collCcFilessRelatedByDbOwnerId = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcFilessRelatedByDbOwnerId collection. - * - * By default this just sets the collCcFilessRelatedByDbOwnerId collection to an empty array (like clearcollCcFilessRelatedByDbOwnerId()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcFilessRelatedByDbOwnerId() - { - $this->collCcFilessRelatedByDbOwnerId = new PropelObjectCollection(); - $this->collCcFilessRelatedByDbOwnerId->setModel('CcFiles'); - } - - /** - * Gets an array of CcFiles objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcSubjs is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcFiles[] List of CcFiles objects - * @throws PropelException - */ - public function getCcFilessRelatedByDbOwnerId($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcFilessRelatedByDbOwnerId || null !== $criteria) { - if ($this->isNew() && null === $this->collCcFilessRelatedByDbOwnerId) { - // return empty collection - $this->initCcFilessRelatedByDbOwnerId(); - } else { - $collCcFilessRelatedByDbOwnerId = CcFilesQuery::create(null, $criteria) - ->filterByFkOwner($this) - ->find($con); - if (null !== $criteria) { - return $collCcFilessRelatedByDbOwnerId; - } - $this->collCcFilessRelatedByDbOwnerId = $collCcFilessRelatedByDbOwnerId; - } - } - return $this->collCcFilessRelatedByDbOwnerId; - } - - /** - * Returns the number of related CcFiles objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcFiles objects. - * @throws PropelException - */ - public function countCcFilessRelatedByDbOwnerId(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcFilessRelatedByDbOwnerId || null !== $criteria) { - if ($this->isNew() && null === $this->collCcFilessRelatedByDbOwnerId) { - return 0; - } else { - $query = CcFilesQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByFkOwner($this) - ->count($con); - } - } else { - return count($this->collCcFilessRelatedByDbOwnerId); - } - } - - /** - * Method called to associate a CcFiles object to this object - * through the CcFiles foreign key attribute. - * - * @param CcFiles $l CcFiles - * @return void - * @throws PropelException - */ - public function addCcFilesRelatedByDbOwnerId(CcFiles $l) - { - if ($this->collCcFilessRelatedByDbOwnerId === null) { - $this->initCcFilessRelatedByDbOwnerId(); - } - if (!$this->collCcFilessRelatedByDbOwnerId->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcFilessRelatedByDbOwnerId[]= $l; - $l->setFkOwner($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcSubjs is new, it will return - * an empty collection; or if this CcSubjs has previously - * been saved, it will retrieve related CcFilessRelatedByDbOwnerId from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcSubjs. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcFiles[] List of CcFiles objects - */ - public function getCcFilessRelatedByDbOwnerIdJoinCcMusicDirs($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcFilesQuery::create(null, $criteria); - $query->joinWith('CcMusicDirs', $join_behavior); - - return $this->getCcFilessRelatedByDbOwnerId($query, $con); - } - - /** - * Clears out the collCcFilessRelatedByDbEditedby collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcFilessRelatedByDbEditedby() - */ - public function clearCcFilessRelatedByDbEditedby() - { - $this->collCcFilessRelatedByDbEditedby = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcFilessRelatedByDbEditedby collection. - * - * By default this just sets the collCcFilessRelatedByDbEditedby collection to an empty array (like clearcollCcFilessRelatedByDbEditedby()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcFilessRelatedByDbEditedby() - { - $this->collCcFilessRelatedByDbEditedby = new PropelObjectCollection(); - $this->collCcFilessRelatedByDbEditedby->setModel('CcFiles'); - } - - /** - * Gets an array of CcFiles objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcSubjs is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcFiles[] List of CcFiles objects - * @throws PropelException - */ - public function getCcFilessRelatedByDbEditedby($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcFilessRelatedByDbEditedby || null !== $criteria) { - if ($this->isNew() && null === $this->collCcFilessRelatedByDbEditedby) { - // return empty collection - $this->initCcFilessRelatedByDbEditedby(); - } else { - $collCcFilessRelatedByDbEditedby = CcFilesQuery::create(null, $criteria) - ->filterByCcSubjsRelatedByDbEditedby($this) - ->find($con); - if (null !== $criteria) { - return $collCcFilessRelatedByDbEditedby; - } - $this->collCcFilessRelatedByDbEditedby = $collCcFilessRelatedByDbEditedby; - } - } - return $this->collCcFilessRelatedByDbEditedby; - } - - /** - * Returns the number of related CcFiles objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcFiles objects. - * @throws PropelException - */ - public function countCcFilessRelatedByDbEditedby(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcFilessRelatedByDbEditedby || null !== $criteria) { - if ($this->isNew() && null === $this->collCcFilessRelatedByDbEditedby) { - return 0; - } else { - $query = CcFilesQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcSubjsRelatedByDbEditedby($this) - ->count($con); - } - } else { - return count($this->collCcFilessRelatedByDbEditedby); - } - } - - /** - * Method called to associate a CcFiles object to this object - * through the CcFiles foreign key attribute. - * - * @param CcFiles $l CcFiles - * @return void - * @throws PropelException - */ - public function addCcFilesRelatedByDbEditedby(CcFiles $l) - { - if ($this->collCcFilessRelatedByDbEditedby === null) { - $this->initCcFilessRelatedByDbEditedby(); - } - if (!$this->collCcFilessRelatedByDbEditedby->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcFilessRelatedByDbEditedby[]= $l; - $l->setCcSubjsRelatedByDbEditedby($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcSubjs is new, it will return - * an empty collection; or if this CcSubjs has previously - * been saved, it will retrieve related CcFilessRelatedByDbEditedby from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcSubjs. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcFiles[] List of CcFiles objects - */ - public function getCcFilessRelatedByDbEditedbyJoinCcMusicDirs($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcFilesQuery::create(null, $criteria); - $query->joinWith('CcMusicDirs', $join_behavior); - - return $this->getCcFilessRelatedByDbEditedby($query, $con); - } - - /** - * Clears out the collCcPermss collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcPermss() - */ - public function clearCcPermss() - { - $this->collCcPermss = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcPermss collection. - * - * By default this just sets the collCcPermss collection to an empty array (like clearcollCcPermss()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcPermss() - { - $this->collCcPermss = new PropelObjectCollection(); - $this->collCcPermss->setModel('CcPerms'); - } - - /** - * Gets an array of CcPerms objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcSubjs is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcPerms[] List of CcPerms objects - * @throws PropelException - */ - public function getCcPermss($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcPermss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPermss) { - // return empty collection - $this->initCcPermss(); - } else { - $collCcPermss = CcPermsQuery::create(null, $criteria) - ->filterByCcSubjs($this) - ->find($con); - if (null !== $criteria) { - return $collCcPermss; - } - $this->collCcPermss = $collCcPermss; - } - } - return $this->collCcPermss; - } - - /** - * Returns the number of related CcPerms objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcPerms objects. - * @throws PropelException - */ - public function countCcPermss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcPermss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPermss) { - return 0; - } else { - $query = CcPermsQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcSubjs($this) - ->count($con); - } - } else { - return count($this->collCcPermss); - } - } - - /** - * Method called to associate a CcPerms object to this object - * through the CcPerms foreign key attribute. - * - * @param CcPerms $l CcPerms - * @return void - * @throws PropelException - */ - public function addCcPerms(CcPerms $l) - { - if ($this->collCcPermss === null) { - $this->initCcPermss(); - } - if (!$this->collCcPermss->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcPermss[]= $l; - $l->setCcSubjs($this); - } - } - - /** - * Clears out the collCcShowHostss collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcShowHostss() - */ - public function clearCcShowHostss() - { - $this->collCcShowHostss = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcShowHostss collection. - * - * By default this just sets the collCcShowHostss collection to an empty array (like clearcollCcShowHostss()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcShowHostss() - { - $this->collCcShowHostss = new PropelObjectCollection(); - $this->collCcShowHostss->setModel('CcShowHosts'); - } - - /** - * Gets an array of CcShowHosts objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcSubjs is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcShowHosts[] List of CcShowHosts objects - * @throws PropelException - */ - public function getCcShowHostss($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcShowHostss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowHostss) { - // return empty collection - $this->initCcShowHostss(); - } else { - $collCcShowHostss = CcShowHostsQuery::create(null, $criteria) - ->filterByCcSubjs($this) - ->find($con); - if (null !== $criteria) { - return $collCcShowHostss; - } - $this->collCcShowHostss = $collCcShowHostss; - } - } - return $this->collCcShowHostss; - } - - /** - * Returns the number of related CcShowHosts objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcShowHosts objects. - * @throws PropelException - */ - public function countCcShowHostss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcShowHostss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcShowHostss) { - return 0; - } else { - $query = CcShowHostsQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcSubjs($this) - ->count($con); - } - } else { - return count($this->collCcShowHostss); - } - } - - /** - * Method called to associate a CcShowHosts object to this object - * through the CcShowHosts foreign key attribute. - * - * @param CcShowHosts $l CcShowHosts - * @return void - * @throws PropelException - */ - public function addCcShowHosts(CcShowHosts $l) - { - if ($this->collCcShowHostss === null) { - $this->initCcShowHostss(); - } - if (!$this->collCcShowHostss->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcShowHostss[]= $l; - $l->setCcSubjs($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcSubjs is new, it will return - * an empty collection; or if this CcSubjs has previously - * been saved, it will retrieve related CcShowHostss from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcSubjs. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcShowHosts[] List of CcShowHosts objects - */ - public function getCcShowHostssJoinCcShow($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcShowHostsQuery::create(null, $criteria); - $query->joinWith('CcShow', $join_behavior); - - return $this->getCcShowHostss($query, $con); - } - - /** - * Clears out the collCcPlaylists collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcPlaylists() - */ - public function clearCcPlaylists() - { - $this->collCcPlaylists = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcPlaylists collection. - * - * By default this just sets the collCcPlaylists collection to an empty array (like clearcollCcPlaylists()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcPlaylists() - { - $this->collCcPlaylists = new PropelObjectCollection(); - $this->collCcPlaylists->setModel('CcPlaylist'); - } - - /** - * Gets an array of CcPlaylist objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcSubjs is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcPlaylist[] List of CcPlaylist objects - * @throws PropelException - */ - public function getCcPlaylists($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcPlaylists || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlaylists) { - // return empty collection - $this->initCcPlaylists(); - } else { - $collCcPlaylists = CcPlaylistQuery::create(null, $criteria) - ->filterByCcSubjs($this) - ->find($con); - if (null !== $criteria) { - return $collCcPlaylists; - } - $this->collCcPlaylists = $collCcPlaylists; - } - } - return $this->collCcPlaylists; - } - - /** - * Returns the number of related CcPlaylist objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcPlaylist objects. - * @throws PropelException - */ - public function countCcPlaylists(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcPlaylists || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPlaylists) { - return 0; - } else { - $query = CcPlaylistQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcSubjs($this) - ->count($con); - } - } else { - return count($this->collCcPlaylists); - } - } - - /** - * Method called to associate a CcPlaylist object to this object - * through the CcPlaylist foreign key attribute. - * - * @param CcPlaylist $l CcPlaylist - * @return void - * @throws PropelException - */ - public function addCcPlaylist(CcPlaylist $l) - { - if ($this->collCcPlaylists === null) { - $this->initCcPlaylists(); - } - if (!$this->collCcPlaylists->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcPlaylists[]= $l; - $l->setCcSubjs($this); - } - } - - /** - * Clears out the collCcBlocks collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcBlocks() - */ - public function clearCcBlocks() - { - $this->collCcBlocks = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcBlocks collection. - * - * By default this just sets the collCcBlocks collection to an empty array (like clearcollCcBlocks()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcBlocks() - { - $this->collCcBlocks = new PropelObjectCollection(); - $this->collCcBlocks->setModel('CcBlock'); - } - - /** - * Gets an array of CcBlock objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcSubjs is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcBlock[] List of CcBlock objects - * @throws PropelException - */ - public function getCcBlocks($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcBlocks || null !== $criteria) { - if ($this->isNew() && null === $this->collCcBlocks) { - // return empty collection - $this->initCcBlocks(); - } else { - $collCcBlocks = CcBlockQuery::create(null, $criteria) - ->filterByCcSubjs($this) - ->find($con); - if (null !== $criteria) { - return $collCcBlocks; - } - $this->collCcBlocks = $collCcBlocks; - } - } - return $this->collCcBlocks; - } - - /** - * Returns the number of related CcBlock objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcBlock objects. - * @throws PropelException - */ - public function countCcBlocks(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcBlocks || null !== $criteria) { - if ($this->isNew() && null === $this->collCcBlocks) { - return 0; - } else { - $query = CcBlockQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcSubjs($this) - ->count($con); - } - } else { - return count($this->collCcBlocks); - } - } - - /** - * Method called to associate a CcBlock object to this object - * through the CcBlock foreign key attribute. - * - * @param CcBlock $l CcBlock - * @return void - * @throws PropelException - */ - public function addCcBlock(CcBlock $l) - { - if ($this->collCcBlocks === null) { - $this->initCcBlocks(); - } - if (!$this->collCcBlocks->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcBlocks[]= $l; - $l->setCcSubjs($this); - } - } - - /** - * Clears out the collCcPrefs collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcPrefs() - */ - public function clearCcPrefs() - { - $this->collCcPrefs = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcPrefs collection. - * - * By default this just sets the collCcPrefs collection to an empty array (like clearcollCcPrefs()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcPrefs() - { - $this->collCcPrefs = new PropelObjectCollection(); - $this->collCcPrefs->setModel('CcPref'); - } - - /** - * Gets an array of CcPref objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcSubjs is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcPref[] List of CcPref objects - * @throws PropelException - */ - public function getCcPrefs($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcPrefs || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPrefs) { - // return empty collection - $this->initCcPrefs(); - } else { - $collCcPrefs = CcPrefQuery::create(null, $criteria) - ->filterByCcSubjs($this) - ->find($con); - if (null !== $criteria) { - return $collCcPrefs; - } - $this->collCcPrefs = $collCcPrefs; - } - } - return $this->collCcPrefs; - } - - /** - * Returns the number of related CcPref objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcPref objects. - * @throws PropelException - */ - public function countCcPrefs(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcPrefs || null !== $criteria) { - if ($this->isNew() && null === $this->collCcPrefs) { - return 0; - } else { - $query = CcPrefQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcSubjs($this) - ->count($con); - } - } else { - return count($this->collCcPrefs); - } - } - - /** - * Method called to associate a CcPref object to this object - * through the CcPref foreign key attribute. - * - * @param CcPref $l CcPref - * @return void - * @throws PropelException - */ - public function addCcPref(CcPref $l) - { - if ($this->collCcPrefs === null) { - $this->initCcPrefs(); - } - if (!$this->collCcPrefs->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcPrefs[]= $l; - $l->setCcSubjs($this); - } - } - - /** - * Clears out the collCcSesss collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcSesss() - */ - public function clearCcSesss() - { - $this->collCcSesss = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcSesss collection. - * - * By default this just sets the collCcSesss collection to an empty array (like clearcollCcSesss()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcSesss() - { - $this->collCcSesss = new PropelObjectCollection(); - $this->collCcSesss->setModel('CcSess'); - } - - /** - * Gets an array of CcSess objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcSubjs is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcSess[] List of CcSess objects - * @throws PropelException - */ - public function getCcSesss($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcSesss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcSesss) { - // return empty collection - $this->initCcSesss(); - } else { - $collCcSesss = CcSessQuery::create(null, $criteria) - ->filterByCcSubjs($this) - ->find($con); - if (null !== $criteria) { - return $collCcSesss; - } - $this->collCcSesss = $collCcSesss; - } - } - return $this->collCcSesss; - } - - /** - * Returns the number of related CcSess objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcSess objects. - * @throws PropelException - */ - public function countCcSesss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcSesss || null !== $criteria) { - if ($this->isNew() && null === $this->collCcSesss) { - return 0; - } else { - $query = CcSessQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcSubjs($this) - ->count($con); - } - } else { - return count($this->collCcSesss); - } - } - - /** - * Method called to associate a CcSess object to this object - * through the CcSess foreign key attribute. - * - * @param CcSess $l CcSess - * @return void - * @throws PropelException - */ - public function addCcSess(CcSess $l) - { - if ($this->collCcSesss === null) { - $this->initCcSesss(); - } - if (!$this->collCcSesss->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcSesss[]= $l; - $l->setCcSubjs($this); - } - } - - /** - * Clears out the collCcSubjsTokens collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcSubjsTokens() - */ - public function clearCcSubjsTokens() - { - $this->collCcSubjsTokens = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcSubjsTokens collection. - * - * By default this just sets the collCcSubjsTokens collection to an empty array (like clearcollCcSubjsTokens()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcSubjsTokens() - { - $this->collCcSubjsTokens = new PropelObjectCollection(); - $this->collCcSubjsTokens->setModel('CcSubjsToken'); - } - - /** - * Gets an array of CcSubjsToken objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcSubjs is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcSubjsToken[] List of CcSubjsToken objects - * @throws PropelException - */ - public function getCcSubjsTokens($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcSubjsTokens || null !== $criteria) { - if ($this->isNew() && null === $this->collCcSubjsTokens) { - // return empty collection - $this->initCcSubjsTokens(); - } else { - $collCcSubjsTokens = CcSubjsTokenQuery::create(null, $criteria) - ->filterByCcSubjs($this) - ->find($con); - if (null !== $criteria) { - return $collCcSubjsTokens; - } - $this->collCcSubjsTokens = $collCcSubjsTokens; - } - } - return $this->collCcSubjsTokens; - } - - /** - * Returns the number of related CcSubjsToken objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcSubjsToken objects. - * @throws PropelException - */ - public function countCcSubjsTokens(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcSubjsTokens || null !== $criteria) { - if ($this->isNew() && null === $this->collCcSubjsTokens) { - return 0; - } else { - $query = CcSubjsTokenQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcSubjs($this) - ->count($con); - } - } else { - return count($this->collCcSubjsTokens); - } - } - - /** - * Method called to associate a CcSubjsToken object to this object - * through the CcSubjsToken foreign key attribute. - * - * @param CcSubjsToken $l CcSubjsToken - * @return void - * @throws PropelException - */ - public function addCcSubjsToken(CcSubjsToken $l) - { - if ($this->collCcSubjsTokens === null) { - $this->initCcSubjsTokens(); - } - if (!$this->collCcSubjsTokens->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcSubjsTokens[]= $l; - $l->setCcSubjs($this); - } - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->login = null; - $this->pass = null; - $this->type = null; - $this->first_name = null; - $this->last_name = null; - $this->lastlogin = null; - $this->lastfail = null; - $this->skype_contact = null; - $this->jabber_contact = null; - $this->email = null; - $this->cell_phone = null; - $this->login_attempts = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - if ($this->collCcFilessRelatedByDbOwnerId) { - foreach ((array) $this->collCcFilessRelatedByDbOwnerId as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcFilessRelatedByDbEditedby) { - foreach ((array) $this->collCcFilessRelatedByDbEditedby as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcPermss) { - foreach ((array) $this->collCcPermss as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcShowHostss) { - foreach ((array) $this->collCcShowHostss as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcPlaylists) { - foreach ((array) $this->collCcPlaylists as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcBlocks) { - foreach ((array) $this->collCcBlocks as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcPrefs) { - foreach ((array) $this->collCcPrefs as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcSesss) { - foreach ((array) $this->collCcSesss as $o) { - $o->clearAllReferences($deep); - } - } - if ($this->collCcSubjsTokens) { - foreach ((array) $this->collCcSubjsTokens as $o) { - $o->clearAllReferences($deep); - } - } - } // if ($deep) - - $this->collCcFilessRelatedByDbOwnerId = null; - $this->collCcFilessRelatedByDbEditedby = null; - $this->collCcPermss = null; - $this->collCcShowHostss = null; - $this->collCcPlaylists = null; - $this->collCcBlocks = null; - $this->collCcPrefs = null; - $this->collCcSesss = null; - $this->collCcSubjsTokens = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcSubjs + /** + * Peer class name + */ + const PEER = 'CcSubjsPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcSubjsPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the login field. + * Note: this column has a database default value of: '' + * @var string + */ + protected $login; + + /** + * The value for the pass field. + * Note: this column has a database default value of: '' + * @var string + */ + protected $pass; + + /** + * The value for the type field. + * Note: this column has a database default value of: 'U' + * @var string + */ + protected $type; + + /** + * The value for the first_name field. + * Note: this column has a database default value of: '' + * @var string + */ + protected $first_name; + + /** + * The value for the last_name field. + * Note: this column has a database default value of: '' + * @var string + */ + protected $last_name; + + /** + * The value for the lastlogin field. + * @var string + */ + protected $lastlogin; + + /** + * The value for the lastfail field. + * @var string + */ + protected $lastfail; + + /** + * The value for the skype_contact field. + * @var string + */ + protected $skype_contact; + + /** + * The value for the jabber_contact field. + * @var string + */ + protected $jabber_contact; + + /** + * The value for the email field. + * @var string + */ + protected $email; + + /** + * The value for the cell_phone field. + * @var string + */ + protected $cell_phone; + + /** + * The value for the login_attempts field. + * Note: this column has a database default value of: 0 + * @var int + */ + protected $login_attempts; + + /** + * @var PropelObjectCollection|CcFiles[] Collection to store aggregation of CcFiles objects. + */ + protected $collCcFilessRelatedByDbOwnerId; + protected $collCcFilessRelatedByDbOwnerIdPartial; + + /** + * @var PropelObjectCollection|CcFiles[] Collection to store aggregation of CcFiles objects. + */ + protected $collCcFilessRelatedByDbEditedby; + protected $collCcFilessRelatedByDbEditedbyPartial; + + /** + * @var PropelObjectCollection|CcPerms[] Collection to store aggregation of CcPerms objects. + */ + protected $collCcPermss; + protected $collCcPermssPartial; + + /** + * @var PropelObjectCollection|CcShowHosts[] Collection to store aggregation of CcShowHosts objects. + */ + protected $collCcShowHostss; + protected $collCcShowHostssPartial; + + /** + * @var PropelObjectCollection|CcPlaylist[] Collection to store aggregation of CcPlaylist objects. + */ + protected $collCcPlaylists; + protected $collCcPlaylistsPartial; + + /** + * @var PropelObjectCollection|CcBlock[] Collection to store aggregation of CcBlock objects. + */ + protected $collCcBlocks; + protected $collCcBlocksPartial; + + /** + * @var PropelObjectCollection|CcPref[] Collection to store aggregation of CcPref objects. + */ + protected $collCcPrefs; + protected $collCcPrefsPartial; + + /** + * @var PropelObjectCollection|CcSess[] Collection to store aggregation of CcSess objects. + */ + protected $collCcSesss; + protected $collCcSesssPartial; + + /** + * @var PropelObjectCollection|CcSubjsToken[] Collection to store aggregation of CcSubjsToken objects. + */ + protected $collCcSubjsTokens; + protected $collCcSubjsTokensPartial; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccFilessRelatedByDbOwnerIdScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccFilessRelatedByDbEditedbyScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccPermssScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccShowHostssScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccPlaylistsScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccBlocksScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccPrefsScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccSesssScheduledForDeletion = null; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccSubjsTokensScheduledForDeletion = null; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->login = ''; + $this->pass = ''; + $this->type = 'U'; + $this->first_name = ''; + $this->last_name = ''; + $this->login_attempts = 0; + } + + /** + * Initializes internal state of BaseCcSubjs object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [login] column value. + * + * @return string + */ + public function getDbLogin() + { + + return $this->login; + } + + /** + * Get the [pass] column value. + * + * @return string + */ + public function getDbPass() + { + + return $this->pass; + } + + /** + * Get the [type] column value. + * + * @return string + */ + public function getDbType() + { + + return $this->type; + } + + /** + * Get the [first_name] column value. + * + * @return string + */ + public function getDbFirstName() + { + + return $this->first_name; + } + + /** + * Get the [last_name] column value. + * + * @return string + */ + public function getDbLastName() + { + + return $this->last_name; + } + + /** + * Get the [optionally formatted] temporal [lastlogin] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbLastlogin($format = 'Y-m-d H:i:s') + { + if ($this->lastlogin === null) { + return null; + } + + + try { + $dt = new DateTime($this->lastlogin); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->lastlogin, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [lastfail] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbLastfail($format = 'Y-m-d H:i:s') + { + if ($this->lastfail === null) { + return null; + } + + + try { + $dt = new DateTime($this->lastfail); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->lastfail, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [skype_contact] column value. + * + * @return string + */ + public function getDbSkypeContact() + { + + return $this->skype_contact; + } + + /** + * Get the [jabber_contact] column value. + * + * @return string + */ + public function getDbJabberContact() + { + + return $this->jabber_contact; + } + + /** + * Get the [email] column value. + * + * @return string + */ + public function getDbEmail() + { + + return $this->email; + } + + /** + * Get the [cell_phone] column value. + * + * @return string + */ + public function getDbCellPhone() + { + + return $this->cell_phone; + } + + /** + * Get the [login_attempts] column value. + * + * @return int + */ + public function getDbLoginAttempts() + { + + return $this->login_attempts; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcSubjs The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcSubjsPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [login] column. + * + * @param string $v new value + * @return CcSubjs The current object (for fluent API support) + */ + public function setDbLogin($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->login !== $v) { + $this->login = $v; + $this->modifiedColumns[] = CcSubjsPeer::LOGIN; + } + + + return $this; + } // setDbLogin() + + /** + * Set the value of [pass] column. + * + * @param string $v new value + * @return CcSubjs The current object (for fluent API support) + */ + public function setDbPass($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->pass !== $v) { + $this->pass = $v; + $this->modifiedColumns[] = CcSubjsPeer::PASS; + } + + + return $this; + } // setDbPass() + + /** + * Set the value of [type] column. + * + * @param string $v new value + * @return CcSubjs The current object (for fluent API support) + */ + public function setDbType($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->type !== $v) { + $this->type = $v; + $this->modifiedColumns[] = CcSubjsPeer::TYPE; + } + + + return $this; + } // setDbType() + + /** + * Set the value of [first_name] column. + * + * @param string $v new value + * @return CcSubjs The current object (for fluent API support) + */ + public function setDbFirstName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->first_name !== $v) { + $this->first_name = $v; + $this->modifiedColumns[] = CcSubjsPeer::FIRST_NAME; + } + + + return $this; + } // setDbFirstName() + + /** + * Set the value of [last_name] column. + * + * @param string $v new value + * @return CcSubjs The current object (for fluent API support) + */ + public function setDbLastName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->last_name !== $v) { + $this->last_name = $v; + $this->modifiedColumns[] = CcSubjsPeer::LAST_NAME; + } + + + return $this; + } // setDbLastName() + + /** + * Sets the value of [lastlogin] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcSubjs The current object (for fluent API support) + */ + public function setDbLastlogin($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->lastlogin !== null || $dt !== null) { + $currentDateAsString = ($this->lastlogin !== null && $tmpDt = new DateTime($this->lastlogin)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->lastlogin = $newDateAsString; + $this->modifiedColumns[] = CcSubjsPeer::LASTLOGIN; + } + } // if either are not null + + + return $this; + } // setDbLastlogin() + + /** + * Sets the value of [lastfail] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcSubjs The current object (for fluent API support) + */ + public function setDbLastfail($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->lastfail !== null || $dt !== null) { + $currentDateAsString = ($this->lastfail !== null && $tmpDt = new DateTime($this->lastfail)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->lastfail = $newDateAsString; + $this->modifiedColumns[] = CcSubjsPeer::LASTFAIL; + } + } // if either are not null + + + return $this; + } // setDbLastfail() + + /** + * Set the value of [skype_contact] column. + * + * @param string $v new value + * @return CcSubjs The current object (for fluent API support) + */ + public function setDbSkypeContact($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->skype_contact !== $v) { + $this->skype_contact = $v; + $this->modifiedColumns[] = CcSubjsPeer::SKYPE_CONTACT; + } + + + return $this; + } // setDbSkypeContact() + + /** + * Set the value of [jabber_contact] column. + * + * @param string $v new value + * @return CcSubjs The current object (for fluent API support) + */ + public function setDbJabberContact($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->jabber_contact !== $v) { + $this->jabber_contact = $v; + $this->modifiedColumns[] = CcSubjsPeer::JABBER_CONTACT; + } + + + return $this; + } // setDbJabberContact() + + /** + * Set the value of [email] column. + * + * @param string $v new value + * @return CcSubjs The current object (for fluent API support) + */ + public function setDbEmail($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->email !== $v) { + $this->email = $v; + $this->modifiedColumns[] = CcSubjsPeer::EMAIL; + } + + + return $this; + } // setDbEmail() + + /** + * Set the value of [cell_phone] column. + * + * @param string $v new value + * @return CcSubjs The current object (for fluent API support) + */ + public function setDbCellPhone($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->cell_phone !== $v) { + $this->cell_phone = $v; + $this->modifiedColumns[] = CcSubjsPeer::CELL_PHONE; + } + + + return $this; + } // setDbCellPhone() + + /** + * Set the value of [login_attempts] column. + * + * @param int $v new value + * @return CcSubjs The current object (for fluent API support) + */ + public function setDbLoginAttempts($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->login_attempts !== $v) { + $this->login_attempts = $v; + $this->modifiedColumns[] = CcSubjsPeer::LOGIN_ATTEMPTS; + } + + + return $this; + } // setDbLoginAttempts() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->login !== '') { + return false; + } + + if ($this->pass !== '') { + return false; + } + + if ($this->type !== 'U') { + return false; + } + + if ($this->first_name !== '') { + return false; + } + + if ($this->last_name !== '') { + return false; + } + + if ($this->login_attempts !== 0) { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->login = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->pass = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->type = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->first_name = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; + $this->last_name = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; + $this->lastlogin = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; + $this->lastfail = ($row[$startcol + 7] !== null) ? (string) $row[$startcol + 7] : null; + $this->skype_contact = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; + $this->jabber_contact = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; + $this->email = ($row[$startcol + 10] !== null) ? (string) $row[$startcol + 10] : null; + $this->cell_phone = ($row[$startcol + 11] !== null) ? (string) $row[$startcol + 11] : null; + $this->login_attempts = ($row[$startcol + 12] !== null) ? (int) $row[$startcol + 12] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 13; // 13 = CcSubjsPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcSubjs object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcSubjsPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->collCcFilessRelatedByDbOwnerId = null; + + $this->collCcFilessRelatedByDbEditedby = null; + + $this->collCcPermss = null; + + $this->collCcShowHostss = null; + + $this->collCcPlaylists = null; + + $this->collCcBlocks = null; + + $this->collCcPrefs = null; + + $this->collCcSesss = null; + + $this->collCcSubjsTokens = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcSubjsQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcSubjsPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->ccFilessRelatedByDbOwnerIdScheduledForDeletion !== null) { + if (!$this->ccFilessRelatedByDbOwnerIdScheduledForDeletion->isEmpty()) { + foreach ($this->ccFilessRelatedByDbOwnerIdScheduledForDeletion as $ccFilesRelatedByDbOwnerId) { + // need to save related object because we set the relation to null + $ccFilesRelatedByDbOwnerId->save($con); + } + $this->ccFilessRelatedByDbOwnerIdScheduledForDeletion = null; + } + } + + if ($this->collCcFilessRelatedByDbOwnerId !== null) { + foreach ($this->collCcFilessRelatedByDbOwnerId as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccFilessRelatedByDbEditedbyScheduledForDeletion !== null) { + if (!$this->ccFilessRelatedByDbEditedbyScheduledForDeletion->isEmpty()) { + foreach ($this->ccFilessRelatedByDbEditedbyScheduledForDeletion as $ccFilesRelatedByDbEditedby) { + // need to save related object because we set the relation to null + $ccFilesRelatedByDbEditedby->save($con); + } + $this->ccFilessRelatedByDbEditedbyScheduledForDeletion = null; + } + } + + if ($this->collCcFilessRelatedByDbEditedby !== null) { + foreach ($this->collCcFilessRelatedByDbEditedby as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccPermssScheduledForDeletion !== null) { + if (!$this->ccPermssScheduledForDeletion->isEmpty()) { + CcPermsQuery::create() + ->filterByPrimaryKeys($this->ccPermssScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccPermssScheduledForDeletion = null; + } + } + + if ($this->collCcPermss !== null) { + foreach ($this->collCcPermss as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccShowHostssScheduledForDeletion !== null) { + if (!$this->ccShowHostssScheduledForDeletion->isEmpty()) { + CcShowHostsQuery::create() + ->filterByPrimaryKeys($this->ccShowHostssScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccShowHostssScheduledForDeletion = null; + } + } + + if ($this->collCcShowHostss !== null) { + foreach ($this->collCcShowHostss as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccPlaylistsScheduledForDeletion !== null) { + if (!$this->ccPlaylistsScheduledForDeletion->isEmpty()) { + CcPlaylistQuery::create() + ->filterByPrimaryKeys($this->ccPlaylistsScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccPlaylistsScheduledForDeletion = null; + } + } + + if ($this->collCcPlaylists !== null) { + foreach ($this->collCcPlaylists as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccBlocksScheduledForDeletion !== null) { + if (!$this->ccBlocksScheduledForDeletion->isEmpty()) { + CcBlockQuery::create() + ->filterByPrimaryKeys($this->ccBlocksScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccBlocksScheduledForDeletion = null; + } + } + + if ($this->collCcBlocks !== null) { + foreach ($this->collCcBlocks as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccPrefsScheduledForDeletion !== null) { + if (!$this->ccPrefsScheduledForDeletion->isEmpty()) { + CcPrefQuery::create() + ->filterByPrimaryKeys($this->ccPrefsScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccPrefsScheduledForDeletion = null; + } + } + + if ($this->collCcPrefs !== null) { + foreach ($this->collCcPrefs as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccSesssScheduledForDeletion !== null) { + if (!$this->ccSesssScheduledForDeletion->isEmpty()) { + CcSessQuery::create() + ->filterByPrimaryKeys($this->ccSesssScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccSesssScheduledForDeletion = null; + } + } + + if ($this->collCcSesss !== null) { + foreach ($this->collCcSesss as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + if ($this->ccSubjsTokensScheduledForDeletion !== null) { + if (!$this->ccSubjsTokensScheduledForDeletion->isEmpty()) { + CcSubjsTokenQuery::create() + ->filterByPrimaryKeys($this->ccSubjsTokensScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccSubjsTokensScheduledForDeletion = null; + } + } + + if ($this->collCcSubjsTokens !== null) { + foreach ($this->collCcSubjsTokens as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcSubjsPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcSubjsPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_subjs_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcSubjsPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcSubjsPeer::LOGIN)) { + $modifiedColumns[':p' . $index++] = '"login"'; + } + if ($this->isColumnModified(CcSubjsPeer::PASS)) { + $modifiedColumns[':p' . $index++] = '"pass"'; + } + if ($this->isColumnModified(CcSubjsPeer::TYPE)) { + $modifiedColumns[':p' . $index++] = '"type"'; + } + if ($this->isColumnModified(CcSubjsPeer::FIRST_NAME)) { + $modifiedColumns[':p' . $index++] = '"first_name"'; + } + if ($this->isColumnModified(CcSubjsPeer::LAST_NAME)) { + $modifiedColumns[':p' . $index++] = '"last_name"'; + } + if ($this->isColumnModified(CcSubjsPeer::LASTLOGIN)) { + $modifiedColumns[':p' . $index++] = '"lastlogin"'; + } + if ($this->isColumnModified(CcSubjsPeer::LASTFAIL)) { + $modifiedColumns[':p' . $index++] = '"lastfail"'; + } + if ($this->isColumnModified(CcSubjsPeer::SKYPE_CONTACT)) { + $modifiedColumns[':p' . $index++] = '"skype_contact"'; + } + if ($this->isColumnModified(CcSubjsPeer::JABBER_CONTACT)) { + $modifiedColumns[':p' . $index++] = '"jabber_contact"'; + } + if ($this->isColumnModified(CcSubjsPeer::EMAIL)) { + $modifiedColumns[':p' . $index++] = '"email"'; + } + if ($this->isColumnModified(CcSubjsPeer::CELL_PHONE)) { + $modifiedColumns[':p' . $index++] = '"cell_phone"'; + } + if ($this->isColumnModified(CcSubjsPeer::LOGIN_ATTEMPTS)) { + $modifiedColumns[':p' . $index++] = '"login_attempts"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_subjs" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"login"': + $stmt->bindValue($identifier, $this->login, PDO::PARAM_STR); + break; + case '"pass"': + $stmt->bindValue($identifier, $this->pass, PDO::PARAM_STR); + break; + case '"type"': + $stmt->bindValue($identifier, $this->type, PDO::PARAM_STR); + break; + case '"first_name"': + $stmt->bindValue($identifier, $this->first_name, PDO::PARAM_STR); + break; + case '"last_name"': + $stmt->bindValue($identifier, $this->last_name, PDO::PARAM_STR); + break; + case '"lastlogin"': + $stmt->bindValue($identifier, $this->lastlogin, PDO::PARAM_STR); + break; + case '"lastfail"': + $stmt->bindValue($identifier, $this->lastfail, PDO::PARAM_STR); + break; + case '"skype_contact"': + $stmt->bindValue($identifier, $this->skype_contact, PDO::PARAM_STR); + break; + case '"jabber_contact"': + $stmt->bindValue($identifier, $this->jabber_contact, PDO::PARAM_STR); + break; + case '"email"': + $stmt->bindValue($identifier, $this->email, PDO::PARAM_STR); + break; + case '"cell_phone"': + $stmt->bindValue($identifier, $this->cell_phone, PDO::PARAM_STR); + break; + case '"login_attempts"': + $stmt->bindValue($identifier, $this->login_attempts, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcSubjsPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + if ($this->collCcFilessRelatedByDbOwnerId !== null) { + foreach ($this->collCcFilessRelatedByDbOwnerId as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcFilessRelatedByDbEditedby !== null) { + foreach ($this->collCcFilessRelatedByDbEditedby as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcPermss !== null) { + foreach ($this->collCcPermss as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcShowHostss !== null) { + foreach ($this->collCcShowHostss as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcPlaylists !== null) { + foreach ($this->collCcPlaylists as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcBlocks !== null) { + foreach ($this->collCcBlocks as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcPrefs !== null) { + foreach ($this->collCcPrefs as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcSesss !== null) { + foreach ($this->collCcSesss as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + if ($this->collCcSubjsTokens !== null) { + foreach ($this->collCcSubjsTokens as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcSubjsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbLogin(); + break; + case 2: + return $this->getDbPass(); + break; + case 3: + return $this->getDbType(); + break; + case 4: + return $this->getDbFirstName(); + break; + case 5: + return $this->getDbLastName(); + break; + case 6: + return $this->getDbLastlogin(); + break; + case 7: + return $this->getDbLastfail(); + break; + case 8: + return $this->getDbSkypeContact(); + break; + case 9: + return $this->getDbJabberContact(); + break; + case 10: + return $this->getDbEmail(); + break; + case 11: + return $this->getDbCellPhone(); + break; + case 12: + return $this->getDbLoginAttempts(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcSubjs'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcSubjs'][$this->getPrimaryKey()] = true; + $keys = CcSubjsPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbLogin(), + $keys[2] => $this->getDbPass(), + $keys[3] => $this->getDbType(), + $keys[4] => $this->getDbFirstName(), + $keys[5] => $this->getDbLastName(), + $keys[6] => $this->getDbLastlogin(), + $keys[7] => $this->getDbLastfail(), + $keys[8] => $this->getDbSkypeContact(), + $keys[9] => $this->getDbJabberContact(), + $keys[10] => $this->getDbEmail(), + $keys[11] => $this->getDbCellPhone(), + $keys[12] => $this->getDbLoginAttempts(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->collCcFilessRelatedByDbOwnerId) { + $result['CcFilessRelatedByDbOwnerId'] = $this->collCcFilessRelatedByDbOwnerId->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcFilessRelatedByDbEditedby) { + $result['CcFilessRelatedByDbEditedby'] = $this->collCcFilessRelatedByDbEditedby->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcPermss) { + $result['CcPermss'] = $this->collCcPermss->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcShowHostss) { + $result['CcShowHostss'] = $this->collCcShowHostss->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcPlaylists) { + $result['CcPlaylists'] = $this->collCcPlaylists->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcBlocks) { + $result['CcBlocks'] = $this->collCcBlocks->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcPrefs) { + $result['CcPrefs'] = $this->collCcPrefs->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcSesss) { + $result['CcSesss'] = $this->collCcSesss->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + if (null !== $this->collCcSubjsTokens) { + $result['CcSubjsTokens'] = $this->collCcSubjsTokens->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcSubjsPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbLogin($value); + break; + case 2: + $this->setDbPass($value); + break; + case 3: + $this->setDbType($value); + break; + case 4: + $this->setDbFirstName($value); + break; + case 5: + $this->setDbLastName($value); + break; + case 6: + $this->setDbLastlogin($value); + break; + case 7: + $this->setDbLastfail($value); + break; + case 8: + $this->setDbSkypeContact($value); + break; + case 9: + $this->setDbJabberContact($value); + break; + case 10: + $this->setDbEmail($value); + break; + case 11: + $this->setDbCellPhone($value); + break; + case 12: + $this->setDbLoginAttempts($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcSubjsPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbLogin($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbPass($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbType($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbFirstName($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setDbLastName($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setDbLastlogin($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setDbLastfail($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setDbSkypeContact($arr[$keys[8]]); + if (array_key_exists($keys[9], $arr)) $this->setDbJabberContact($arr[$keys[9]]); + if (array_key_exists($keys[10], $arr)) $this->setDbEmail($arr[$keys[10]]); + if (array_key_exists($keys[11], $arr)) $this->setDbCellPhone($arr[$keys[11]]); + if (array_key_exists($keys[12], $arr)) $this->setDbLoginAttempts($arr[$keys[12]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcSubjsPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcSubjsPeer::ID)) $criteria->add(CcSubjsPeer::ID, $this->id); + if ($this->isColumnModified(CcSubjsPeer::LOGIN)) $criteria->add(CcSubjsPeer::LOGIN, $this->login); + if ($this->isColumnModified(CcSubjsPeer::PASS)) $criteria->add(CcSubjsPeer::PASS, $this->pass); + if ($this->isColumnModified(CcSubjsPeer::TYPE)) $criteria->add(CcSubjsPeer::TYPE, $this->type); + if ($this->isColumnModified(CcSubjsPeer::FIRST_NAME)) $criteria->add(CcSubjsPeer::FIRST_NAME, $this->first_name); + if ($this->isColumnModified(CcSubjsPeer::LAST_NAME)) $criteria->add(CcSubjsPeer::LAST_NAME, $this->last_name); + if ($this->isColumnModified(CcSubjsPeer::LASTLOGIN)) $criteria->add(CcSubjsPeer::LASTLOGIN, $this->lastlogin); + if ($this->isColumnModified(CcSubjsPeer::LASTFAIL)) $criteria->add(CcSubjsPeer::LASTFAIL, $this->lastfail); + if ($this->isColumnModified(CcSubjsPeer::SKYPE_CONTACT)) $criteria->add(CcSubjsPeer::SKYPE_CONTACT, $this->skype_contact); + if ($this->isColumnModified(CcSubjsPeer::JABBER_CONTACT)) $criteria->add(CcSubjsPeer::JABBER_CONTACT, $this->jabber_contact); + if ($this->isColumnModified(CcSubjsPeer::EMAIL)) $criteria->add(CcSubjsPeer::EMAIL, $this->email); + if ($this->isColumnModified(CcSubjsPeer::CELL_PHONE)) $criteria->add(CcSubjsPeer::CELL_PHONE, $this->cell_phone); + if ($this->isColumnModified(CcSubjsPeer::LOGIN_ATTEMPTS)) $criteria->add(CcSubjsPeer::LOGIN_ATTEMPTS, $this->login_attempts); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcSubjsPeer::DATABASE_NAME); + $criteria->add(CcSubjsPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcSubjs (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbLogin($this->getDbLogin()); + $copyObj->setDbPass($this->getDbPass()); + $copyObj->setDbType($this->getDbType()); + $copyObj->setDbFirstName($this->getDbFirstName()); + $copyObj->setDbLastName($this->getDbLastName()); + $copyObj->setDbLastlogin($this->getDbLastlogin()); + $copyObj->setDbLastfail($this->getDbLastfail()); + $copyObj->setDbSkypeContact($this->getDbSkypeContact()); + $copyObj->setDbJabberContact($this->getDbJabberContact()); + $copyObj->setDbEmail($this->getDbEmail()); + $copyObj->setDbCellPhone($this->getDbCellPhone()); + $copyObj->setDbLoginAttempts($this->getDbLoginAttempts()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + foreach ($this->getCcFilessRelatedByDbOwnerId() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcFilesRelatedByDbOwnerId($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcFilessRelatedByDbEditedby() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcFilesRelatedByDbEditedby($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcPermss() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcPerms($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcShowHostss() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcShowHosts($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcPlaylists() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcPlaylist($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcBlocks() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcBlock($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcPrefs() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcPref($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcSesss() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcSess($relObj->copy($deepCopy)); + } + } + + foreach ($this->getCcSubjsTokens() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcSubjsToken($relObj->copy($deepCopy)); + } + } + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcSubjs Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcSubjsPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcSubjsPeer(); + } + + return self::$peer; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CcFilesRelatedByDbOwnerId' == $relationName) { + $this->initCcFilessRelatedByDbOwnerId(); + } + if ('CcFilesRelatedByDbEditedby' == $relationName) { + $this->initCcFilessRelatedByDbEditedby(); + } + if ('CcPerms' == $relationName) { + $this->initCcPermss(); + } + if ('CcShowHosts' == $relationName) { + $this->initCcShowHostss(); + } + if ('CcPlaylist' == $relationName) { + $this->initCcPlaylists(); + } + if ('CcBlock' == $relationName) { + $this->initCcBlocks(); + } + if ('CcPref' == $relationName) { + $this->initCcPrefs(); + } + if ('CcSess' == $relationName) { + $this->initCcSesss(); + } + if ('CcSubjsToken' == $relationName) { + $this->initCcSubjsTokens(); + } + } + + /** + * Clears out the collCcFilessRelatedByDbOwnerId collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcSubjs The current object (for fluent API support) + * @see addCcFilessRelatedByDbOwnerId() + */ + public function clearCcFilessRelatedByDbOwnerId() + { + $this->collCcFilessRelatedByDbOwnerId = null; // important to set this to null since that means it is uninitialized + $this->collCcFilessRelatedByDbOwnerIdPartial = null; + + return $this; + } + + /** + * reset is the collCcFilessRelatedByDbOwnerId collection loaded partially + * + * @return void + */ + public function resetPartialCcFilessRelatedByDbOwnerId($v = true) + { + $this->collCcFilessRelatedByDbOwnerIdPartial = $v; + } + + /** + * Initializes the collCcFilessRelatedByDbOwnerId collection. + * + * By default this just sets the collCcFilessRelatedByDbOwnerId collection to an empty array (like clearcollCcFilessRelatedByDbOwnerId()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcFilessRelatedByDbOwnerId($overrideExisting = true) + { + if (null !== $this->collCcFilessRelatedByDbOwnerId && !$overrideExisting) { + return; + } + $this->collCcFilessRelatedByDbOwnerId = new PropelObjectCollection(); + $this->collCcFilessRelatedByDbOwnerId->setModel('CcFiles'); + } + + /** + * Gets an array of CcFiles objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcSubjs is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcFiles[] List of CcFiles objects + * @throws PropelException + */ + public function getCcFilessRelatedByDbOwnerId($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcFilessRelatedByDbOwnerIdPartial && !$this->isNew(); + if (null === $this->collCcFilessRelatedByDbOwnerId || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcFilessRelatedByDbOwnerId) { + // return empty collection + $this->initCcFilessRelatedByDbOwnerId(); + } else { + $collCcFilessRelatedByDbOwnerId = CcFilesQuery::create(null, $criteria) + ->filterByFkOwner($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcFilessRelatedByDbOwnerIdPartial && count($collCcFilessRelatedByDbOwnerId)) { + $this->initCcFilessRelatedByDbOwnerId(false); + + foreach ($collCcFilessRelatedByDbOwnerId as $obj) { + if (false == $this->collCcFilessRelatedByDbOwnerId->contains($obj)) { + $this->collCcFilessRelatedByDbOwnerId->append($obj); + } + } + + $this->collCcFilessRelatedByDbOwnerIdPartial = true; + } + + $collCcFilessRelatedByDbOwnerId->getInternalIterator()->rewind(); + + return $collCcFilessRelatedByDbOwnerId; + } + + if ($partial && $this->collCcFilessRelatedByDbOwnerId) { + foreach ($this->collCcFilessRelatedByDbOwnerId as $obj) { + if ($obj->isNew()) { + $collCcFilessRelatedByDbOwnerId[] = $obj; + } + } + } + + $this->collCcFilessRelatedByDbOwnerId = $collCcFilessRelatedByDbOwnerId; + $this->collCcFilessRelatedByDbOwnerIdPartial = false; + } + } + + return $this->collCcFilessRelatedByDbOwnerId; + } + + /** + * Sets a collection of CcFilesRelatedByDbOwnerId objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccFilessRelatedByDbOwnerId A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcSubjs The current object (for fluent API support) + */ + public function setCcFilessRelatedByDbOwnerId(PropelCollection $ccFilessRelatedByDbOwnerId, PropelPDO $con = null) + { + $ccFilessRelatedByDbOwnerIdToDelete = $this->getCcFilessRelatedByDbOwnerId(new Criteria(), $con)->diff($ccFilessRelatedByDbOwnerId); + + + $this->ccFilessRelatedByDbOwnerIdScheduledForDeletion = $ccFilessRelatedByDbOwnerIdToDelete; + + foreach ($ccFilessRelatedByDbOwnerIdToDelete as $ccFilesRelatedByDbOwnerIdRemoved) { + $ccFilesRelatedByDbOwnerIdRemoved->setFkOwner(null); + } + + $this->collCcFilessRelatedByDbOwnerId = null; + foreach ($ccFilessRelatedByDbOwnerId as $ccFilesRelatedByDbOwnerId) { + $this->addCcFilesRelatedByDbOwnerId($ccFilesRelatedByDbOwnerId); + } + + $this->collCcFilessRelatedByDbOwnerId = $ccFilessRelatedByDbOwnerId; + $this->collCcFilessRelatedByDbOwnerIdPartial = false; + + return $this; + } + + /** + * Returns the number of related CcFiles objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcFiles objects. + * @throws PropelException + */ + public function countCcFilessRelatedByDbOwnerId(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcFilessRelatedByDbOwnerIdPartial && !$this->isNew(); + if (null === $this->collCcFilessRelatedByDbOwnerId || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcFilessRelatedByDbOwnerId) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcFilessRelatedByDbOwnerId()); + } + $query = CcFilesQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByFkOwner($this) + ->count($con); + } + + return count($this->collCcFilessRelatedByDbOwnerId); + } + + /** + * Method called to associate a CcFiles object to this object + * through the CcFiles foreign key attribute. + * + * @param CcFiles $l CcFiles + * @return CcSubjs The current object (for fluent API support) + */ + public function addCcFilesRelatedByDbOwnerId(CcFiles $l) + { + if ($this->collCcFilessRelatedByDbOwnerId === null) { + $this->initCcFilessRelatedByDbOwnerId(); + $this->collCcFilessRelatedByDbOwnerIdPartial = true; + } + + if (!in_array($l, $this->collCcFilessRelatedByDbOwnerId->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcFilesRelatedByDbOwnerId($l); + + if ($this->ccFilessRelatedByDbOwnerIdScheduledForDeletion and $this->ccFilessRelatedByDbOwnerIdScheduledForDeletion->contains($l)) { + $this->ccFilessRelatedByDbOwnerIdScheduledForDeletion->remove($this->ccFilessRelatedByDbOwnerIdScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcFilesRelatedByDbOwnerId $ccFilesRelatedByDbOwnerId The ccFilesRelatedByDbOwnerId object to add. + */ + protected function doAddCcFilesRelatedByDbOwnerId($ccFilesRelatedByDbOwnerId) + { + $this->collCcFilessRelatedByDbOwnerId[]= $ccFilesRelatedByDbOwnerId; + $ccFilesRelatedByDbOwnerId->setFkOwner($this); + } + + /** + * @param CcFilesRelatedByDbOwnerId $ccFilesRelatedByDbOwnerId The ccFilesRelatedByDbOwnerId object to remove. + * @return CcSubjs The current object (for fluent API support) + */ + public function removeCcFilesRelatedByDbOwnerId($ccFilesRelatedByDbOwnerId) + { + if ($this->getCcFilessRelatedByDbOwnerId()->contains($ccFilesRelatedByDbOwnerId)) { + $this->collCcFilessRelatedByDbOwnerId->remove($this->collCcFilessRelatedByDbOwnerId->search($ccFilesRelatedByDbOwnerId)); + if (null === $this->ccFilessRelatedByDbOwnerIdScheduledForDeletion) { + $this->ccFilessRelatedByDbOwnerIdScheduledForDeletion = clone $this->collCcFilessRelatedByDbOwnerId; + $this->ccFilessRelatedByDbOwnerIdScheduledForDeletion->clear(); + } + $this->ccFilessRelatedByDbOwnerIdScheduledForDeletion[]= $ccFilesRelatedByDbOwnerId; + $ccFilesRelatedByDbOwnerId->setFkOwner(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcSubjs is new, it will return + * an empty collection; or if this CcSubjs has previously + * been saved, it will retrieve related CcFilessRelatedByDbOwnerId from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcSubjs. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcFiles[] List of CcFiles objects + */ + public function getCcFilessRelatedByDbOwnerIdJoinCcMusicDirs($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcFilesQuery::create(null, $criteria); + $query->joinWith('CcMusicDirs', $join_behavior); + + return $this->getCcFilessRelatedByDbOwnerId($query, $con); + } + + /** + * Clears out the collCcFilessRelatedByDbEditedby collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcSubjs The current object (for fluent API support) + * @see addCcFilessRelatedByDbEditedby() + */ + public function clearCcFilessRelatedByDbEditedby() + { + $this->collCcFilessRelatedByDbEditedby = null; // important to set this to null since that means it is uninitialized + $this->collCcFilessRelatedByDbEditedbyPartial = null; + + return $this; + } + + /** + * reset is the collCcFilessRelatedByDbEditedby collection loaded partially + * + * @return void + */ + public function resetPartialCcFilessRelatedByDbEditedby($v = true) + { + $this->collCcFilessRelatedByDbEditedbyPartial = $v; + } + + /** + * Initializes the collCcFilessRelatedByDbEditedby collection. + * + * By default this just sets the collCcFilessRelatedByDbEditedby collection to an empty array (like clearcollCcFilessRelatedByDbEditedby()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcFilessRelatedByDbEditedby($overrideExisting = true) + { + if (null !== $this->collCcFilessRelatedByDbEditedby && !$overrideExisting) { + return; + } + $this->collCcFilessRelatedByDbEditedby = new PropelObjectCollection(); + $this->collCcFilessRelatedByDbEditedby->setModel('CcFiles'); + } + + /** + * Gets an array of CcFiles objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcSubjs is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcFiles[] List of CcFiles objects + * @throws PropelException + */ + public function getCcFilessRelatedByDbEditedby($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcFilessRelatedByDbEditedbyPartial && !$this->isNew(); + if (null === $this->collCcFilessRelatedByDbEditedby || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcFilessRelatedByDbEditedby) { + // return empty collection + $this->initCcFilessRelatedByDbEditedby(); + } else { + $collCcFilessRelatedByDbEditedby = CcFilesQuery::create(null, $criteria) + ->filterByCcSubjsRelatedByDbEditedby($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcFilessRelatedByDbEditedbyPartial && count($collCcFilessRelatedByDbEditedby)) { + $this->initCcFilessRelatedByDbEditedby(false); + + foreach ($collCcFilessRelatedByDbEditedby as $obj) { + if (false == $this->collCcFilessRelatedByDbEditedby->contains($obj)) { + $this->collCcFilessRelatedByDbEditedby->append($obj); + } + } + + $this->collCcFilessRelatedByDbEditedbyPartial = true; + } + + $collCcFilessRelatedByDbEditedby->getInternalIterator()->rewind(); + + return $collCcFilessRelatedByDbEditedby; + } + + if ($partial && $this->collCcFilessRelatedByDbEditedby) { + foreach ($this->collCcFilessRelatedByDbEditedby as $obj) { + if ($obj->isNew()) { + $collCcFilessRelatedByDbEditedby[] = $obj; + } + } + } + + $this->collCcFilessRelatedByDbEditedby = $collCcFilessRelatedByDbEditedby; + $this->collCcFilessRelatedByDbEditedbyPartial = false; + } + } + + return $this->collCcFilessRelatedByDbEditedby; + } + + /** + * Sets a collection of CcFilesRelatedByDbEditedby objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccFilessRelatedByDbEditedby A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcSubjs The current object (for fluent API support) + */ + public function setCcFilessRelatedByDbEditedby(PropelCollection $ccFilessRelatedByDbEditedby, PropelPDO $con = null) + { + $ccFilessRelatedByDbEditedbyToDelete = $this->getCcFilessRelatedByDbEditedby(new Criteria(), $con)->diff($ccFilessRelatedByDbEditedby); + + + $this->ccFilessRelatedByDbEditedbyScheduledForDeletion = $ccFilessRelatedByDbEditedbyToDelete; + + foreach ($ccFilessRelatedByDbEditedbyToDelete as $ccFilesRelatedByDbEditedbyRemoved) { + $ccFilesRelatedByDbEditedbyRemoved->setCcSubjsRelatedByDbEditedby(null); + } + + $this->collCcFilessRelatedByDbEditedby = null; + foreach ($ccFilessRelatedByDbEditedby as $ccFilesRelatedByDbEditedby) { + $this->addCcFilesRelatedByDbEditedby($ccFilesRelatedByDbEditedby); + } + + $this->collCcFilessRelatedByDbEditedby = $ccFilessRelatedByDbEditedby; + $this->collCcFilessRelatedByDbEditedbyPartial = false; + + return $this; + } + + /** + * Returns the number of related CcFiles objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcFiles objects. + * @throws PropelException + */ + public function countCcFilessRelatedByDbEditedby(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcFilessRelatedByDbEditedbyPartial && !$this->isNew(); + if (null === $this->collCcFilessRelatedByDbEditedby || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcFilessRelatedByDbEditedby) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcFilessRelatedByDbEditedby()); + } + $query = CcFilesQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcSubjsRelatedByDbEditedby($this) + ->count($con); + } + + return count($this->collCcFilessRelatedByDbEditedby); + } + + /** + * Method called to associate a CcFiles object to this object + * through the CcFiles foreign key attribute. + * + * @param CcFiles $l CcFiles + * @return CcSubjs The current object (for fluent API support) + */ + public function addCcFilesRelatedByDbEditedby(CcFiles $l) + { + if ($this->collCcFilessRelatedByDbEditedby === null) { + $this->initCcFilessRelatedByDbEditedby(); + $this->collCcFilessRelatedByDbEditedbyPartial = true; + } + + if (!in_array($l, $this->collCcFilessRelatedByDbEditedby->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcFilesRelatedByDbEditedby($l); + + if ($this->ccFilessRelatedByDbEditedbyScheduledForDeletion and $this->ccFilessRelatedByDbEditedbyScheduledForDeletion->contains($l)) { + $this->ccFilessRelatedByDbEditedbyScheduledForDeletion->remove($this->ccFilessRelatedByDbEditedbyScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcFilesRelatedByDbEditedby $ccFilesRelatedByDbEditedby The ccFilesRelatedByDbEditedby object to add. + */ + protected function doAddCcFilesRelatedByDbEditedby($ccFilesRelatedByDbEditedby) + { + $this->collCcFilessRelatedByDbEditedby[]= $ccFilesRelatedByDbEditedby; + $ccFilesRelatedByDbEditedby->setCcSubjsRelatedByDbEditedby($this); + } + + /** + * @param CcFilesRelatedByDbEditedby $ccFilesRelatedByDbEditedby The ccFilesRelatedByDbEditedby object to remove. + * @return CcSubjs The current object (for fluent API support) + */ + public function removeCcFilesRelatedByDbEditedby($ccFilesRelatedByDbEditedby) + { + if ($this->getCcFilessRelatedByDbEditedby()->contains($ccFilesRelatedByDbEditedby)) { + $this->collCcFilessRelatedByDbEditedby->remove($this->collCcFilessRelatedByDbEditedby->search($ccFilesRelatedByDbEditedby)); + if (null === $this->ccFilessRelatedByDbEditedbyScheduledForDeletion) { + $this->ccFilessRelatedByDbEditedbyScheduledForDeletion = clone $this->collCcFilessRelatedByDbEditedby; + $this->ccFilessRelatedByDbEditedbyScheduledForDeletion->clear(); + } + $this->ccFilessRelatedByDbEditedbyScheduledForDeletion[]= $ccFilesRelatedByDbEditedby; + $ccFilesRelatedByDbEditedby->setCcSubjsRelatedByDbEditedby(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcSubjs is new, it will return + * an empty collection; or if this CcSubjs has previously + * been saved, it will retrieve related CcFilessRelatedByDbEditedby from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcSubjs. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcFiles[] List of CcFiles objects + */ + public function getCcFilessRelatedByDbEditedbyJoinCcMusicDirs($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcFilesQuery::create(null, $criteria); + $query->joinWith('CcMusicDirs', $join_behavior); + + return $this->getCcFilessRelatedByDbEditedby($query, $con); + } + + /** + * Clears out the collCcPermss collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcSubjs The current object (for fluent API support) + * @see addCcPermss() + */ + public function clearCcPermss() + { + $this->collCcPermss = null; // important to set this to null since that means it is uninitialized + $this->collCcPermssPartial = null; + + return $this; + } + + /** + * reset is the collCcPermss collection loaded partially + * + * @return void + */ + public function resetPartialCcPermss($v = true) + { + $this->collCcPermssPartial = $v; + } + + /** + * Initializes the collCcPermss collection. + * + * By default this just sets the collCcPermss collection to an empty array (like clearcollCcPermss()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcPermss($overrideExisting = true) + { + if (null !== $this->collCcPermss && !$overrideExisting) { + return; + } + $this->collCcPermss = new PropelObjectCollection(); + $this->collCcPermss->setModel('CcPerms'); + } + + /** + * Gets an array of CcPerms objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcSubjs is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcPerms[] List of CcPerms objects + * @throws PropelException + */ + public function getCcPermss($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcPermssPartial && !$this->isNew(); + if (null === $this->collCcPermss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPermss) { + // return empty collection + $this->initCcPermss(); + } else { + $collCcPermss = CcPermsQuery::create(null, $criteria) + ->filterByCcSubjs($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcPermssPartial && count($collCcPermss)) { + $this->initCcPermss(false); + + foreach ($collCcPermss as $obj) { + if (false == $this->collCcPermss->contains($obj)) { + $this->collCcPermss->append($obj); + } + } + + $this->collCcPermssPartial = true; + } + + $collCcPermss->getInternalIterator()->rewind(); + + return $collCcPermss; + } + + if ($partial && $this->collCcPermss) { + foreach ($this->collCcPermss as $obj) { + if ($obj->isNew()) { + $collCcPermss[] = $obj; + } + } + } + + $this->collCcPermss = $collCcPermss; + $this->collCcPermssPartial = false; + } + } + + return $this->collCcPermss; + } + + /** + * Sets a collection of CcPerms objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccPermss A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcSubjs The current object (for fluent API support) + */ + public function setCcPermss(PropelCollection $ccPermss, PropelPDO $con = null) + { + $ccPermssToDelete = $this->getCcPermss(new Criteria(), $con)->diff($ccPermss); + + + $this->ccPermssScheduledForDeletion = $ccPermssToDelete; + + foreach ($ccPermssToDelete as $ccPermsRemoved) { + $ccPermsRemoved->setCcSubjs(null); + } + + $this->collCcPermss = null; + foreach ($ccPermss as $ccPerms) { + $this->addCcPerms($ccPerms); + } + + $this->collCcPermss = $ccPermss; + $this->collCcPermssPartial = false; + + return $this; + } + + /** + * Returns the number of related CcPerms objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcPerms objects. + * @throws PropelException + */ + public function countCcPermss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcPermssPartial && !$this->isNew(); + if (null === $this->collCcPermss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPermss) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcPermss()); + } + $query = CcPermsQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcSubjs($this) + ->count($con); + } + + return count($this->collCcPermss); + } + + /** + * Method called to associate a CcPerms object to this object + * through the CcPerms foreign key attribute. + * + * @param CcPerms $l CcPerms + * @return CcSubjs The current object (for fluent API support) + */ + public function addCcPerms(CcPerms $l) + { + if ($this->collCcPermss === null) { + $this->initCcPermss(); + $this->collCcPermssPartial = true; + } + + if (!in_array($l, $this->collCcPermss->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcPerms($l); + + if ($this->ccPermssScheduledForDeletion and $this->ccPermssScheduledForDeletion->contains($l)) { + $this->ccPermssScheduledForDeletion->remove($this->ccPermssScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcPerms $ccPerms The ccPerms object to add. + */ + protected function doAddCcPerms($ccPerms) + { + $this->collCcPermss[]= $ccPerms; + $ccPerms->setCcSubjs($this); + } + + /** + * @param CcPerms $ccPerms The ccPerms object to remove. + * @return CcSubjs The current object (for fluent API support) + */ + public function removeCcPerms($ccPerms) + { + if ($this->getCcPermss()->contains($ccPerms)) { + $this->collCcPermss->remove($this->collCcPermss->search($ccPerms)); + if (null === $this->ccPermssScheduledForDeletion) { + $this->ccPermssScheduledForDeletion = clone $this->collCcPermss; + $this->ccPermssScheduledForDeletion->clear(); + } + $this->ccPermssScheduledForDeletion[]= $ccPerms; + $ccPerms->setCcSubjs(null); + } + + return $this; + } + + /** + * Clears out the collCcShowHostss collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcSubjs The current object (for fluent API support) + * @see addCcShowHostss() + */ + public function clearCcShowHostss() + { + $this->collCcShowHostss = null; // important to set this to null since that means it is uninitialized + $this->collCcShowHostssPartial = null; + + return $this; + } + + /** + * reset is the collCcShowHostss collection loaded partially + * + * @return void + */ + public function resetPartialCcShowHostss($v = true) + { + $this->collCcShowHostssPartial = $v; + } + + /** + * Initializes the collCcShowHostss collection. + * + * By default this just sets the collCcShowHostss collection to an empty array (like clearcollCcShowHostss()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcShowHostss($overrideExisting = true) + { + if (null !== $this->collCcShowHostss && !$overrideExisting) { + return; + } + $this->collCcShowHostss = new PropelObjectCollection(); + $this->collCcShowHostss->setModel('CcShowHosts'); + } + + /** + * Gets an array of CcShowHosts objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcSubjs is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcShowHosts[] List of CcShowHosts objects + * @throws PropelException + */ + public function getCcShowHostss($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcShowHostssPartial && !$this->isNew(); + if (null === $this->collCcShowHostss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowHostss) { + // return empty collection + $this->initCcShowHostss(); + } else { + $collCcShowHostss = CcShowHostsQuery::create(null, $criteria) + ->filterByCcSubjs($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcShowHostssPartial && count($collCcShowHostss)) { + $this->initCcShowHostss(false); + + foreach ($collCcShowHostss as $obj) { + if (false == $this->collCcShowHostss->contains($obj)) { + $this->collCcShowHostss->append($obj); + } + } + + $this->collCcShowHostssPartial = true; + } + + $collCcShowHostss->getInternalIterator()->rewind(); + + return $collCcShowHostss; + } + + if ($partial && $this->collCcShowHostss) { + foreach ($this->collCcShowHostss as $obj) { + if ($obj->isNew()) { + $collCcShowHostss[] = $obj; + } + } + } + + $this->collCcShowHostss = $collCcShowHostss; + $this->collCcShowHostssPartial = false; + } + } + + return $this->collCcShowHostss; + } + + /** + * Sets a collection of CcShowHosts objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccShowHostss A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcSubjs The current object (for fluent API support) + */ + public function setCcShowHostss(PropelCollection $ccShowHostss, PropelPDO $con = null) + { + $ccShowHostssToDelete = $this->getCcShowHostss(new Criteria(), $con)->diff($ccShowHostss); + + + $this->ccShowHostssScheduledForDeletion = $ccShowHostssToDelete; + + foreach ($ccShowHostssToDelete as $ccShowHostsRemoved) { + $ccShowHostsRemoved->setCcSubjs(null); + } + + $this->collCcShowHostss = null; + foreach ($ccShowHostss as $ccShowHosts) { + $this->addCcShowHosts($ccShowHosts); + } + + $this->collCcShowHostss = $ccShowHostss; + $this->collCcShowHostssPartial = false; + + return $this; + } + + /** + * Returns the number of related CcShowHosts objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcShowHosts objects. + * @throws PropelException + */ + public function countCcShowHostss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcShowHostssPartial && !$this->isNew(); + if (null === $this->collCcShowHostss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcShowHostss) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcShowHostss()); + } + $query = CcShowHostsQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcSubjs($this) + ->count($con); + } + + return count($this->collCcShowHostss); + } + + /** + * Method called to associate a CcShowHosts object to this object + * through the CcShowHosts foreign key attribute. + * + * @param CcShowHosts $l CcShowHosts + * @return CcSubjs The current object (for fluent API support) + */ + public function addCcShowHosts(CcShowHosts $l) + { + if ($this->collCcShowHostss === null) { + $this->initCcShowHostss(); + $this->collCcShowHostssPartial = true; + } + + if (!in_array($l, $this->collCcShowHostss->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcShowHosts($l); + + if ($this->ccShowHostssScheduledForDeletion and $this->ccShowHostssScheduledForDeletion->contains($l)) { + $this->ccShowHostssScheduledForDeletion->remove($this->ccShowHostssScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcShowHosts $ccShowHosts The ccShowHosts object to add. + */ + protected function doAddCcShowHosts($ccShowHosts) + { + $this->collCcShowHostss[]= $ccShowHosts; + $ccShowHosts->setCcSubjs($this); + } + + /** + * @param CcShowHosts $ccShowHosts The ccShowHosts object to remove. + * @return CcSubjs The current object (for fluent API support) + */ + public function removeCcShowHosts($ccShowHosts) + { + if ($this->getCcShowHostss()->contains($ccShowHosts)) { + $this->collCcShowHostss->remove($this->collCcShowHostss->search($ccShowHosts)); + if (null === $this->ccShowHostssScheduledForDeletion) { + $this->ccShowHostssScheduledForDeletion = clone $this->collCcShowHostss; + $this->ccShowHostssScheduledForDeletion->clear(); + } + $this->ccShowHostssScheduledForDeletion[]= clone $ccShowHosts; + $ccShowHosts->setCcSubjs(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcSubjs is new, it will return + * an empty collection; or if this CcSubjs has previously + * been saved, it will retrieve related CcShowHostss from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcSubjs. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcShowHosts[] List of CcShowHosts objects + */ + public function getCcShowHostssJoinCcShow($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcShowHostsQuery::create(null, $criteria); + $query->joinWith('CcShow', $join_behavior); + + return $this->getCcShowHostss($query, $con); + } + + /** + * Clears out the collCcPlaylists collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcSubjs The current object (for fluent API support) + * @see addCcPlaylists() + */ + public function clearCcPlaylists() + { + $this->collCcPlaylists = null; // important to set this to null since that means it is uninitialized + $this->collCcPlaylistsPartial = null; + + return $this; + } + + /** + * reset is the collCcPlaylists collection loaded partially + * + * @return void + */ + public function resetPartialCcPlaylists($v = true) + { + $this->collCcPlaylistsPartial = $v; + } + + /** + * Initializes the collCcPlaylists collection. + * + * By default this just sets the collCcPlaylists collection to an empty array (like clearcollCcPlaylists()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcPlaylists($overrideExisting = true) + { + if (null !== $this->collCcPlaylists && !$overrideExisting) { + return; + } + $this->collCcPlaylists = new PropelObjectCollection(); + $this->collCcPlaylists->setModel('CcPlaylist'); + } + + /** + * Gets an array of CcPlaylist objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcSubjs is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcPlaylist[] List of CcPlaylist objects + * @throws PropelException + */ + public function getCcPlaylists($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcPlaylistsPartial && !$this->isNew(); + if (null === $this->collCcPlaylists || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlaylists) { + // return empty collection + $this->initCcPlaylists(); + } else { + $collCcPlaylists = CcPlaylistQuery::create(null, $criteria) + ->filterByCcSubjs($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcPlaylistsPartial && count($collCcPlaylists)) { + $this->initCcPlaylists(false); + + foreach ($collCcPlaylists as $obj) { + if (false == $this->collCcPlaylists->contains($obj)) { + $this->collCcPlaylists->append($obj); + } + } + + $this->collCcPlaylistsPartial = true; + } + + $collCcPlaylists->getInternalIterator()->rewind(); + + return $collCcPlaylists; + } + + if ($partial && $this->collCcPlaylists) { + foreach ($this->collCcPlaylists as $obj) { + if ($obj->isNew()) { + $collCcPlaylists[] = $obj; + } + } + } + + $this->collCcPlaylists = $collCcPlaylists; + $this->collCcPlaylistsPartial = false; + } + } + + return $this->collCcPlaylists; + } + + /** + * Sets a collection of CcPlaylist objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccPlaylists A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcSubjs The current object (for fluent API support) + */ + public function setCcPlaylists(PropelCollection $ccPlaylists, PropelPDO $con = null) + { + $ccPlaylistsToDelete = $this->getCcPlaylists(new Criteria(), $con)->diff($ccPlaylists); + + + $this->ccPlaylistsScheduledForDeletion = $ccPlaylistsToDelete; + + foreach ($ccPlaylistsToDelete as $ccPlaylistRemoved) { + $ccPlaylistRemoved->setCcSubjs(null); + } + + $this->collCcPlaylists = null; + foreach ($ccPlaylists as $ccPlaylist) { + $this->addCcPlaylist($ccPlaylist); + } + + $this->collCcPlaylists = $ccPlaylists; + $this->collCcPlaylistsPartial = false; + + return $this; + } + + /** + * Returns the number of related CcPlaylist objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcPlaylist objects. + * @throws PropelException + */ + public function countCcPlaylists(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcPlaylistsPartial && !$this->isNew(); + if (null === $this->collCcPlaylists || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPlaylists) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcPlaylists()); + } + $query = CcPlaylistQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcSubjs($this) + ->count($con); + } + + return count($this->collCcPlaylists); + } + + /** + * Method called to associate a CcPlaylist object to this object + * through the CcPlaylist foreign key attribute. + * + * @param CcPlaylist $l CcPlaylist + * @return CcSubjs The current object (for fluent API support) + */ + public function addCcPlaylist(CcPlaylist $l) + { + if ($this->collCcPlaylists === null) { + $this->initCcPlaylists(); + $this->collCcPlaylistsPartial = true; + } + + if (!in_array($l, $this->collCcPlaylists->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcPlaylist($l); + + if ($this->ccPlaylistsScheduledForDeletion and $this->ccPlaylistsScheduledForDeletion->contains($l)) { + $this->ccPlaylistsScheduledForDeletion->remove($this->ccPlaylistsScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcPlaylist $ccPlaylist The ccPlaylist object to add. + */ + protected function doAddCcPlaylist($ccPlaylist) + { + $this->collCcPlaylists[]= $ccPlaylist; + $ccPlaylist->setCcSubjs($this); + } + + /** + * @param CcPlaylist $ccPlaylist The ccPlaylist object to remove. + * @return CcSubjs The current object (for fluent API support) + */ + public function removeCcPlaylist($ccPlaylist) + { + if ($this->getCcPlaylists()->contains($ccPlaylist)) { + $this->collCcPlaylists->remove($this->collCcPlaylists->search($ccPlaylist)); + if (null === $this->ccPlaylistsScheduledForDeletion) { + $this->ccPlaylistsScheduledForDeletion = clone $this->collCcPlaylists; + $this->ccPlaylistsScheduledForDeletion->clear(); + } + $this->ccPlaylistsScheduledForDeletion[]= $ccPlaylist; + $ccPlaylist->setCcSubjs(null); + } + + return $this; + } + + /** + * Clears out the collCcBlocks collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcSubjs The current object (for fluent API support) + * @see addCcBlocks() + */ + public function clearCcBlocks() + { + $this->collCcBlocks = null; // important to set this to null since that means it is uninitialized + $this->collCcBlocksPartial = null; + + return $this; + } + + /** + * reset is the collCcBlocks collection loaded partially + * + * @return void + */ + public function resetPartialCcBlocks($v = true) + { + $this->collCcBlocksPartial = $v; + } + + /** + * Initializes the collCcBlocks collection. + * + * By default this just sets the collCcBlocks collection to an empty array (like clearcollCcBlocks()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcBlocks($overrideExisting = true) + { + if (null !== $this->collCcBlocks && !$overrideExisting) { + return; + } + $this->collCcBlocks = new PropelObjectCollection(); + $this->collCcBlocks->setModel('CcBlock'); + } + + /** + * Gets an array of CcBlock objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcSubjs is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcBlock[] List of CcBlock objects + * @throws PropelException + */ + public function getCcBlocks($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcBlocksPartial && !$this->isNew(); + if (null === $this->collCcBlocks || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcBlocks) { + // return empty collection + $this->initCcBlocks(); + } else { + $collCcBlocks = CcBlockQuery::create(null, $criteria) + ->filterByCcSubjs($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcBlocksPartial && count($collCcBlocks)) { + $this->initCcBlocks(false); + + foreach ($collCcBlocks as $obj) { + if (false == $this->collCcBlocks->contains($obj)) { + $this->collCcBlocks->append($obj); + } + } + + $this->collCcBlocksPartial = true; + } + + $collCcBlocks->getInternalIterator()->rewind(); + + return $collCcBlocks; + } + + if ($partial && $this->collCcBlocks) { + foreach ($this->collCcBlocks as $obj) { + if ($obj->isNew()) { + $collCcBlocks[] = $obj; + } + } + } + + $this->collCcBlocks = $collCcBlocks; + $this->collCcBlocksPartial = false; + } + } + + return $this->collCcBlocks; + } + + /** + * Sets a collection of CcBlock objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccBlocks A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcSubjs The current object (for fluent API support) + */ + public function setCcBlocks(PropelCollection $ccBlocks, PropelPDO $con = null) + { + $ccBlocksToDelete = $this->getCcBlocks(new Criteria(), $con)->diff($ccBlocks); + + + $this->ccBlocksScheduledForDeletion = $ccBlocksToDelete; + + foreach ($ccBlocksToDelete as $ccBlockRemoved) { + $ccBlockRemoved->setCcSubjs(null); + } + + $this->collCcBlocks = null; + foreach ($ccBlocks as $ccBlock) { + $this->addCcBlock($ccBlock); + } + + $this->collCcBlocks = $ccBlocks; + $this->collCcBlocksPartial = false; + + return $this; + } + + /** + * Returns the number of related CcBlock objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcBlock objects. + * @throws PropelException + */ + public function countCcBlocks(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcBlocksPartial && !$this->isNew(); + if (null === $this->collCcBlocks || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcBlocks) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcBlocks()); + } + $query = CcBlockQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcSubjs($this) + ->count($con); + } + + return count($this->collCcBlocks); + } + + /** + * Method called to associate a CcBlock object to this object + * through the CcBlock foreign key attribute. + * + * @param CcBlock $l CcBlock + * @return CcSubjs The current object (for fluent API support) + */ + public function addCcBlock(CcBlock $l) + { + if ($this->collCcBlocks === null) { + $this->initCcBlocks(); + $this->collCcBlocksPartial = true; + } + + if (!in_array($l, $this->collCcBlocks->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcBlock($l); + + if ($this->ccBlocksScheduledForDeletion and $this->ccBlocksScheduledForDeletion->contains($l)) { + $this->ccBlocksScheduledForDeletion->remove($this->ccBlocksScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcBlock $ccBlock The ccBlock object to add. + */ + protected function doAddCcBlock($ccBlock) + { + $this->collCcBlocks[]= $ccBlock; + $ccBlock->setCcSubjs($this); + } + + /** + * @param CcBlock $ccBlock The ccBlock object to remove. + * @return CcSubjs The current object (for fluent API support) + */ + public function removeCcBlock($ccBlock) + { + if ($this->getCcBlocks()->contains($ccBlock)) { + $this->collCcBlocks->remove($this->collCcBlocks->search($ccBlock)); + if (null === $this->ccBlocksScheduledForDeletion) { + $this->ccBlocksScheduledForDeletion = clone $this->collCcBlocks; + $this->ccBlocksScheduledForDeletion->clear(); + } + $this->ccBlocksScheduledForDeletion[]= $ccBlock; + $ccBlock->setCcSubjs(null); + } + + return $this; + } + + /** + * Clears out the collCcPrefs collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcSubjs The current object (for fluent API support) + * @see addCcPrefs() + */ + public function clearCcPrefs() + { + $this->collCcPrefs = null; // important to set this to null since that means it is uninitialized + $this->collCcPrefsPartial = null; + + return $this; + } + + /** + * reset is the collCcPrefs collection loaded partially + * + * @return void + */ + public function resetPartialCcPrefs($v = true) + { + $this->collCcPrefsPartial = $v; + } + + /** + * Initializes the collCcPrefs collection. + * + * By default this just sets the collCcPrefs collection to an empty array (like clearcollCcPrefs()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcPrefs($overrideExisting = true) + { + if (null !== $this->collCcPrefs && !$overrideExisting) { + return; + } + $this->collCcPrefs = new PropelObjectCollection(); + $this->collCcPrefs->setModel('CcPref'); + } + + /** + * Gets an array of CcPref objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcSubjs is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcPref[] List of CcPref objects + * @throws PropelException + */ + public function getCcPrefs($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcPrefsPartial && !$this->isNew(); + if (null === $this->collCcPrefs || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPrefs) { + // return empty collection + $this->initCcPrefs(); + } else { + $collCcPrefs = CcPrefQuery::create(null, $criteria) + ->filterByCcSubjs($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcPrefsPartial && count($collCcPrefs)) { + $this->initCcPrefs(false); + + foreach ($collCcPrefs as $obj) { + if (false == $this->collCcPrefs->contains($obj)) { + $this->collCcPrefs->append($obj); + } + } + + $this->collCcPrefsPartial = true; + } + + $collCcPrefs->getInternalIterator()->rewind(); + + return $collCcPrefs; + } + + if ($partial && $this->collCcPrefs) { + foreach ($this->collCcPrefs as $obj) { + if ($obj->isNew()) { + $collCcPrefs[] = $obj; + } + } + } + + $this->collCcPrefs = $collCcPrefs; + $this->collCcPrefsPartial = false; + } + } + + return $this->collCcPrefs; + } + + /** + * Sets a collection of CcPref objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccPrefs A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcSubjs The current object (for fluent API support) + */ + public function setCcPrefs(PropelCollection $ccPrefs, PropelPDO $con = null) + { + $ccPrefsToDelete = $this->getCcPrefs(new Criteria(), $con)->diff($ccPrefs); + + + $this->ccPrefsScheduledForDeletion = $ccPrefsToDelete; + + foreach ($ccPrefsToDelete as $ccPrefRemoved) { + $ccPrefRemoved->setCcSubjs(null); + } + + $this->collCcPrefs = null; + foreach ($ccPrefs as $ccPref) { + $this->addCcPref($ccPref); + } + + $this->collCcPrefs = $ccPrefs; + $this->collCcPrefsPartial = false; + + return $this; + } + + /** + * Returns the number of related CcPref objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcPref objects. + * @throws PropelException + */ + public function countCcPrefs(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcPrefsPartial && !$this->isNew(); + if (null === $this->collCcPrefs || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcPrefs) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcPrefs()); + } + $query = CcPrefQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcSubjs($this) + ->count($con); + } + + return count($this->collCcPrefs); + } + + /** + * Method called to associate a CcPref object to this object + * through the CcPref foreign key attribute. + * + * @param CcPref $l CcPref + * @return CcSubjs The current object (for fluent API support) + */ + public function addCcPref(CcPref $l) + { + if ($this->collCcPrefs === null) { + $this->initCcPrefs(); + $this->collCcPrefsPartial = true; + } + + if (!in_array($l, $this->collCcPrefs->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcPref($l); + + if ($this->ccPrefsScheduledForDeletion and $this->ccPrefsScheduledForDeletion->contains($l)) { + $this->ccPrefsScheduledForDeletion->remove($this->ccPrefsScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcPref $ccPref The ccPref object to add. + */ + protected function doAddCcPref($ccPref) + { + $this->collCcPrefs[]= $ccPref; + $ccPref->setCcSubjs($this); + } + + /** + * @param CcPref $ccPref The ccPref object to remove. + * @return CcSubjs The current object (for fluent API support) + */ + public function removeCcPref($ccPref) + { + if ($this->getCcPrefs()->contains($ccPref)) { + $this->collCcPrefs->remove($this->collCcPrefs->search($ccPref)); + if (null === $this->ccPrefsScheduledForDeletion) { + $this->ccPrefsScheduledForDeletion = clone $this->collCcPrefs; + $this->ccPrefsScheduledForDeletion->clear(); + } + $this->ccPrefsScheduledForDeletion[]= $ccPref; + $ccPref->setCcSubjs(null); + } + + return $this; + } + + /** + * Clears out the collCcSesss collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcSubjs The current object (for fluent API support) + * @see addCcSesss() + */ + public function clearCcSesss() + { + $this->collCcSesss = null; // important to set this to null since that means it is uninitialized + $this->collCcSesssPartial = null; + + return $this; + } + + /** + * reset is the collCcSesss collection loaded partially + * + * @return void + */ + public function resetPartialCcSesss($v = true) + { + $this->collCcSesssPartial = $v; + } + + /** + * Initializes the collCcSesss collection. + * + * By default this just sets the collCcSesss collection to an empty array (like clearcollCcSesss()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcSesss($overrideExisting = true) + { + if (null !== $this->collCcSesss && !$overrideExisting) { + return; + } + $this->collCcSesss = new PropelObjectCollection(); + $this->collCcSesss->setModel('CcSess'); + } + + /** + * Gets an array of CcSess objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcSubjs is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcSess[] List of CcSess objects + * @throws PropelException + */ + public function getCcSesss($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcSesssPartial && !$this->isNew(); + if (null === $this->collCcSesss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcSesss) { + // return empty collection + $this->initCcSesss(); + } else { + $collCcSesss = CcSessQuery::create(null, $criteria) + ->filterByCcSubjs($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcSesssPartial && count($collCcSesss)) { + $this->initCcSesss(false); + + foreach ($collCcSesss as $obj) { + if (false == $this->collCcSesss->contains($obj)) { + $this->collCcSesss->append($obj); + } + } + + $this->collCcSesssPartial = true; + } + + $collCcSesss->getInternalIterator()->rewind(); + + return $collCcSesss; + } + + if ($partial && $this->collCcSesss) { + foreach ($this->collCcSesss as $obj) { + if ($obj->isNew()) { + $collCcSesss[] = $obj; + } + } + } + + $this->collCcSesss = $collCcSesss; + $this->collCcSesssPartial = false; + } + } + + return $this->collCcSesss; + } + + /** + * Sets a collection of CcSess objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccSesss A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcSubjs The current object (for fluent API support) + */ + public function setCcSesss(PropelCollection $ccSesss, PropelPDO $con = null) + { + $ccSesssToDelete = $this->getCcSesss(new Criteria(), $con)->diff($ccSesss); + + + $this->ccSesssScheduledForDeletion = $ccSesssToDelete; + + foreach ($ccSesssToDelete as $ccSessRemoved) { + $ccSessRemoved->setCcSubjs(null); + } + + $this->collCcSesss = null; + foreach ($ccSesss as $ccSess) { + $this->addCcSess($ccSess); + } + + $this->collCcSesss = $ccSesss; + $this->collCcSesssPartial = false; + + return $this; + } + + /** + * Returns the number of related CcSess objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcSess objects. + * @throws PropelException + */ + public function countCcSesss(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcSesssPartial && !$this->isNew(); + if (null === $this->collCcSesss || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcSesss) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcSesss()); + } + $query = CcSessQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcSubjs($this) + ->count($con); + } + + return count($this->collCcSesss); + } + + /** + * Method called to associate a CcSess object to this object + * through the CcSess foreign key attribute. + * + * @param CcSess $l CcSess + * @return CcSubjs The current object (for fluent API support) + */ + public function addCcSess(CcSess $l) + { + if ($this->collCcSesss === null) { + $this->initCcSesss(); + $this->collCcSesssPartial = true; + } + + if (!in_array($l, $this->collCcSesss->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcSess($l); + + if ($this->ccSesssScheduledForDeletion and $this->ccSesssScheduledForDeletion->contains($l)) { + $this->ccSesssScheduledForDeletion->remove($this->ccSesssScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcSess $ccSess The ccSess object to add. + */ + protected function doAddCcSess($ccSess) + { + $this->collCcSesss[]= $ccSess; + $ccSess->setCcSubjs($this); + } + + /** + * @param CcSess $ccSess The ccSess object to remove. + * @return CcSubjs The current object (for fluent API support) + */ + public function removeCcSess($ccSess) + { + if ($this->getCcSesss()->contains($ccSess)) { + $this->collCcSesss->remove($this->collCcSesss->search($ccSess)); + if (null === $this->ccSesssScheduledForDeletion) { + $this->ccSesssScheduledForDeletion = clone $this->collCcSesss; + $this->ccSesssScheduledForDeletion->clear(); + } + $this->ccSesssScheduledForDeletion[]= $ccSess; + $ccSess->setCcSubjs(null); + } + + return $this; + } + + /** + * Clears out the collCcSubjsTokens collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcSubjs The current object (for fluent API support) + * @see addCcSubjsTokens() + */ + public function clearCcSubjsTokens() + { + $this->collCcSubjsTokens = null; // important to set this to null since that means it is uninitialized + $this->collCcSubjsTokensPartial = null; + + return $this; + } + + /** + * reset is the collCcSubjsTokens collection loaded partially + * + * @return void + */ + public function resetPartialCcSubjsTokens($v = true) + { + $this->collCcSubjsTokensPartial = $v; + } + + /** + * Initializes the collCcSubjsTokens collection. + * + * By default this just sets the collCcSubjsTokens collection to an empty array (like clearcollCcSubjsTokens()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcSubjsTokens($overrideExisting = true) + { + if (null !== $this->collCcSubjsTokens && !$overrideExisting) { + return; + } + $this->collCcSubjsTokens = new PropelObjectCollection(); + $this->collCcSubjsTokens->setModel('CcSubjsToken'); + } + + /** + * Gets an array of CcSubjsToken objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcSubjs is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcSubjsToken[] List of CcSubjsToken objects + * @throws PropelException + */ + public function getCcSubjsTokens($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcSubjsTokensPartial && !$this->isNew(); + if (null === $this->collCcSubjsTokens || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcSubjsTokens) { + // return empty collection + $this->initCcSubjsTokens(); + } else { + $collCcSubjsTokens = CcSubjsTokenQuery::create(null, $criteria) + ->filterByCcSubjs($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcSubjsTokensPartial && count($collCcSubjsTokens)) { + $this->initCcSubjsTokens(false); + + foreach ($collCcSubjsTokens as $obj) { + if (false == $this->collCcSubjsTokens->contains($obj)) { + $this->collCcSubjsTokens->append($obj); + } + } + + $this->collCcSubjsTokensPartial = true; + } + + $collCcSubjsTokens->getInternalIterator()->rewind(); + + return $collCcSubjsTokens; + } + + if ($partial && $this->collCcSubjsTokens) { + foreach ($this->collCcSubjsTokens as $obj) { + if ($obj->isNew()) { + $collCcSubjsTokens[] = $obj; + } + } + } + + $this->collCcSubjsTokens = $collCcSubjsTokens; + $this->collCcSubjsTokensPartial = false; + } + } + + return $this->collCcSubjsTokens; + } + + /** + * Sets a collection of CcSubjsToken objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccSubjsTokens A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcSubjs The current object (for fluent API support) + */ + public function setCcSubjsTokens(PropelCollection $ccSubjsTokens, PropelPDO $con = null) + { + $ccSubjsTokensToDelete = $this->getCcSubjsTokens(new Criteria(), $con)->diff($ccSubjsTokens); + + + $this->ccSubjsTokensScheduledForDeletion = $ccSubjsTokensToDelete; + + foreach ($ccSubjsTokensToDelete as $ccSubjsTokenRemoved) { + $ccSubjsTokenRemoved->setCcSubjs(null); + } + + $this->collCcSubjsTokens = null; + foreach ($ccSubjsTokens as $ccSubjsToken) { + $this->addCcSubjsToken($ccSubjsToken); + } + + $this->collCcSubjsTokens = $ccSubjsTokens; + $this->collCcSubjsTokensPartial = false; + + return $this; + } + + /** + * Returns the number of related CcSubjsToken objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcSubjsToken objects. + * @throws PropelException + */ + public function countCcSubjsTokens(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcSubjsTokensPartial && !$this->isNew(); + if (null === $this->collCcSubjsTokens || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcSubjsTokens) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcSubjsTokens()); + } + $query = CcSubjsTokenQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcSubjs($this) + ->count($con); + } + + return count($this->collCcSubjsTokens); + } + + /** + * Method called to associate a CcSubjsToken object to this object + * through the CcSubjsToken foreign key attribute. + * + * @param CcSubjsToken $l CcSubjsToken + * @return CcSubjs The current object (for fluent API support) + */ + public function addCcSubjsToken(CcSubjsToken $l) + { + if ($this->collCcSubjsTokens === null) { + $this->initCcSubjsTokens(); + $this->collCcSubjsTokensPartial = true; + } + + if (!in_array($l, $this->collCcSubjsTokens->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcSubjsToken($l); + + if ($this->ccSubjsTokensScheduledForDeletion and $this->ccSubjsTokensScheduledForDeletion->contains($l)) { + $this->ccSubjsTokensScheduledForDeletion->remove($this->ccSubjsTokensScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcSubjsToken $ccSubjsToken The ccSubjsToken object to add. + */ + protected function doAddCcSubjsToken($ccSubjsToken) + { + $this->collCcSubjsTokens[]= $ccSubjsToken; + $ccSubjsToken->setCcSubjs($this); + } + + /** + * @param CcSubjsToken $ccSubjsToken The ccSubjsToken object to remove. + * @return CcSubjs The current object (for fluent API support) + */ + public function removeCcSubjsToken($ccSubjsToken) + { + if ($this->getCcSubjsTokens()->contains($ccSubjsToken)) { + $this->collCcSubjsTokens->remove($this->collCcSubjsTokens->search($ccSubjsToken)); + if (null === $this->ccSubjsTokensScheduledForDeletion) { + $this->ccSubjsTokensScheduledForDeletion = clone $this->collCcSubjsTokens; + $this->ccSubjsTokensScheduledForDeletion->clear(); + } + $this->ccSubjsTokensScheduledForDeletion[]= clone $ccSubjsToken; + $ccSubjsToken->setCcSubjs(null); + } + + return $this; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->login = null; + $this->pass = null; + $this->type = null; + $this->first_name = null; + $this->last_name = null; + $this->lastlogin = null; + $this->lastfail = null; + $this->skype_contact = null; + $this->jabber_contact = null; + $this->email = null; + $this->cell_phone = null; + $this->login_attempts = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCcFilessRelatedByDbOwnerId) { + foreach ($this->collCcFilessRelatedByDbOwnerId as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcFilessRelatedByDbEditedby) { + foreach ($this->collCcFilessRelatedByDbEditedby as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcPermss) { + foreach ($this->collCcPermss as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcShowHostss) { + foreach ($this->collCcShowHostss as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcPlaylists) { + foreach ($this->collCcPlaylists as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcBlocks) { + foreach ($this->collCcBlocks as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcPrefs) { + foreach ($this->collCcPrefs as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcSesss) { + foreach ($this->collCcSesss as $o) { + $o->clearAllReferences($deep); + } + } + if ($this->collCcSubjsTokens) { + foreach ($this->collCcSubjsTokens as $o) { + $o->clearAllReferences($deep); + } + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + if ($this->collCcFilessRelatedByDbOwnerId instanceof PropelCollection) { + $this->collCcFilessRelatedByDbOwnerId->clearIterator(); + } + $this->collCcFilessRelatedByDbOwnerId = null; + if ($this->collCcFilessRelatedByDbEditedby instanceof PropelCollection) { + $this->collCcFilessRelatedByDbEditedby->clearIterator(); + } + $this->collCcFilessRelatedByDbEditedby = null; + if ($this->collCcPermss instanceof PropelCollection) { + $this->collCcPermss->clearIterator(); + } + $this->collCcPermss = null; + if ($this->collCcShowHostss instanceof PropelCollection) { + $this->collCcShowHostss->clearIterator(); + } + $this->collCcShowHostss = null; + if ($this->collCcPlaylists instanceof PropelCollection) { + $this->collCcPlaylists->clearIterator(); + } + $this->collCcPlaylists = null; + if ($this->collCcBlocks instanceof PropelCollection) { + $this->collCcBlocks->clearIterator(); + } + $this->collCcBlocks = null; + if ($this->collCcPrefs instanceof PropelCollection) { + $this->collCcPrefs->clearIterator(); + } + $this->collCcPrefs = null; + if ($this->collCcSesss instanceof PropelCollection) { + $this->collCcSesss->clearIterator(); + } + $this->collCcSesss = null; + if ($this->collCcSubjsTokens instanceof PropelCollection) { + $this->collCcSubjsTokens->clearIterator(); + } + $this->collCcSubjsTokens = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcSubjsPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSubjsPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcSubjsPeer.php index ad60edbb48..f886a27b3d 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSubjsPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSubjsPeer.php @@ -4,808 +4,830 @@ /** * Base static class for performing query and update operations on the 'cc_subjs' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcSubjsPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_subjs'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcSubjs'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcSubjs'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcSubjsTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 13; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_subjs.ID'; - - /** the column name for the LOGIN field */ - const LOGIN = 'cc_subjs.LOGIN'; - - /** the column name for the PASS field */ - const PASS = 'cc_subjs.PASS'; - - /** the column name for the TYPE field */ - const TYPE = 'cc_subjs.TYPE'; - - /** the column name for the FIRST_NAME field */ - const FIRST_NAME = 'cc_subjs.FIRST_NAME'; - - /** the column name for the LAST_NAME field */ - const LAST_NAME = 'cc_subjs.LAST_NAME'; - - /** the column name for the LASTLOGIN field */ - const LASTLOGIN = 'cc_subjs.LASTLOGIN'; - - /** the column name for the LASTFAIL field */ - const LASTFAIL = 'cc_subjs.LASTFAIL'; - - /** the column name for the SKYPE_CONTACT field */ - const SKYPE_CONTACT = 'cc_subjs.SKYPE_CONTACT'; - - /** the column name for the JABBER_CONTACT field */ - const JABBER_CONTACT = 'cc_subjs.JABBER_CONTACT'; - - /** the column name for the EMAIL field */ - const EMAIL = 'cc_subjs.EMAIL'; - - /** the column name for the CELL_PHONE field */ - const CELL_PHONE = 'cc_subjs.CELL_PHONE'; - - /** the column name for the LOGIN_ATTEMPTS field */ - const LOGIN_ATTEMPTS = 'cc_subjs.LOGIN_ATTEMPTS'; - - /** - * An identiy map to hold any loaded instances of CcSubjs objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcSubjs[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbLogin', 'DbPass', 'DbType', 'DbFirstName', 'DbLastName', 'DbLastlogin', 'DbLastfail', 'DbSkypeContact', 'DbJabberContact', 'DbEmail', 'DbCellPhone', 'DbLoginAttempts', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbLogin', 'dbPass', 'dbType', 'dbFirstName', 'dbLastName', 'dbLastlogin', 'dbLastfail', 'dbSkypeContact', 'dbJabberContact', 'dbEmail', 'dbCellPhone', 'dbLoginAttempts', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::LOGIN, self::PASS, self::TYPE, self::FIRST_NAME, self::LAST_NAME, self::LASTLOGIN, self::LASTFAIL, self::SKYPE_CONTACT, self::JABBER_CONTACT, self::EMAIL, self::CELL_PHONE, self::LOGIN_ATTEMPTS, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'LOGIN', 'PASS', 'TYPE', 'FIRST_NAME', 'LAST_NAME', 'LASTLOGIN', 'LASTFAIL', 'SKYPE_CONTACT', 'JABBER_CONTACT', 'EMAIL', 'CELL_PHONE', 'LOGIN_ATTEMPTS', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'login', 'pass', 'type', 'first_name', 'last_name', 'lastlogin', 'lastfail', 'skype_contact', 'jabber_contact', 'email', 'cell_phone', 'login_attempts', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbLogin' => 1, 'DbPass' => 2, 'DbType' => 3, 'DbFirstName' => 4, 'DbLastName' => 5, 'DbLastlogin' => 6, 'DbLastfail' => 7, 'DbSkypeContact' => 8, 'DbJabberContact' => 9, 'DbEmail' => 10, 'DbCellPhone' => 11, 'DbLoginAttempts' => 12, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbLogin' => 1, 'dbPass' => 2, 'dbType' => 3, 'dbFirstName' => 4, 'dbLastName' => 5, 'dbLastlogin' => 6, 'dbLastfail' => 7, 'dbSkypeContact' => 8, 'dbJabberContact' => 9, 'dbEmail' => 10, 'dbCellPhone' => 11, 'dbLoginAttempts' => 12, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::LOGIN => 1, self::PASS => 2, self::TYPE => 3, self::FIRST_NAME => 4, self::LAST_NAME => 5, self::LASTLOGIN => 6, self::LASTFAIL => 7, self::SKYPE_CONTACT => 8, self::JABBER_CONTACT => 9, self::EMAIL => 10, self::CELL_PHONE => 11, self::LOGIN_ATTEMPTS => 12, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'LOGIN' => 1, 'PASS' => 2, 'TYPE' => 3, 'FIRST_NAME' => 4, 'LAST_NAME' => 5, 'LASTLOGIN' => 6, 'LASTFAIL' => 7, 'SKYPE_CONTACT' => 8, 'JABBER_CONTACT' => 9, 'EMAIL' => 10, 'CELL_PHONE' => 11, 'LOGIN_ATTEMPTS' => 12, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'login' => 1, 'pass' => 2, 'type' => 3, 'first_name' => 4, 'last_name' => 5, 'lastlogin' => 6, 'lastfail' => 7, 'skype_contact' => 8, 'jabber_contact' => 9, 'email' => 10, 'cell_phone' => 11, 'login_attempts' => 12, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcSubjsPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcSubjsPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcSubjsPeer::ID); - $criteria->addSelectColumn(CcSubjsPeer::LOGIN); - $criteria->addSelectColumn(CcSubjsPeer::PASS); - $criteria->addSelectColumn(CcSubjsPeer::TYPE); - $criteria->addSelectColumn(CcSubjsPeer::FIRST_NAME); - $criteria->addSelectColumn(CcSubjsPeer::LAST_NAME); - $criteria->addSelectColumn(CcSubjsPeer::LASTLOGIN); - $criteria->addSelectColumn(CcSubjsPeer::LASTFAIL); - $criteria->addSelectColumn(CcSubjsPeer::SKYPE_CONTACT); - $criteria->addSelectColumn(CcSubjsPeer::JABBER_CONTACT); - $criteria->addSelectColumn(CcSubjsPeer::EMAIL); - $criteria->addSelectColumn(CcSubjsPeer::CELL_PHONE); - $criteria->addSelectColumn(CcSubjsPeer::LOGIN_ATTEMPTS); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.LOGIN'); - $criteria->addSelectColumn($alias . '.PASS'); - $criteria->addSelectColumn($alias . '.TYPE'); - $criteria->addSelectColumn($alias . '.FIRST_NAME'); - $criteria->addSelectColumn($alias . '.LAST_NAME'); - $criteria->addSelectColumn($alias . '.LASTLOGIN'); - $criteria->addSelectColumn($alias . '.LASTFAIL'); - $criteria->addSelectColumn($alias . '.SKYPE_CONTACT'); - $criteria->addSelectColumn($alias . '.JABBER_CONTACT'); - $criteria->addSelectColumn($alias . '.EMAIL'); - $criteria->addSelectColumn($alias . '.CELL_PHONE'); - $criteria->addSelectColumn($alias . '.LOGIN_ATTEMPTS'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSubjsPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSubjsPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcSubjs - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcSubjsPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcSubjsPeer::populateObjects(CcSubjsPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcSubjsPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcSubjs $value A CcSubjs object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcSubjs $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcSubjs object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcSubjs) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcSubjs object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcSubjs Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_subjs - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - // Invalidate objects in CcPermsPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcPermsPeer::clearInstancePool(); - // Invalidate objects in CcShowHostsPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcShowHostsPeer::clearInstancePool(); - // Invalidate objects in CcPlaylistPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcPlaylistPeer::clearInstancePool(); - // Invalidate objects in CcBlockPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcBlockPeer::clearInstancePool(); - // Invalidate objects in CcPrefPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcPrefPeer::clearInstancePool(); - // Invalidate objects in CcSessPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcSessPeer::clearInstancePool(); - // Invalidate objects in CcSubjsTokenPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcSubjsTokenPeer::clearInstancePool(); - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcSubjsPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcSubjsPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcSubjsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcSubjsPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcSubjs object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcSubjsPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcSubjsPeer::NUM_COLUMNS; - } else { - $cls = CcSubjsPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcSubjsPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcSubjsPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcSubjsPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcSubjsTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcSubjsPeer::CLASS_DEFAULT : CcSubjsPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcSubjs or Criteria object. - * - * @param mixed $values Criteria or CcSubjs object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcSubjs object - } - - if ($criteria->containsKey(CcSubjsPeer::ID) && $criteria->keyContainsValue(CcSubjsPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcSubjsPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcSubjs or Criteria object. - * - * @param mixed $values Criteria or CcSubjs object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcSubjsPeer::ID); - $value = $criteria->remove(CcSubjsPeer::ID); - if ($value) { - $selectCriteria->add(CcSubjsPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcSubjsPeer::TABLE_NAME); - } - - } else { // $values is CcSubjs object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_subjs table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcSubjsPeer::TABLE_NAME, $con, CcSubjsPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcSubjsPeer::clearInstancePool(); - CcSubjsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcSubjs or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcSubjs object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcSubjsPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcSubjs) { // it's a model object - // invalidate the cache for this single object - CcSubjsPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcSubjsPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcSubjsPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcSubjsPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcSubjs object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcSubjs $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcSubjs $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcSubjsPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcSubjsPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcSubjsPeer::DATABASE_NAME, CcSubjsPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcSubjs - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcSubjsPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcSubjsPeer::DATABASE_NAME); - $criteria->add(CcSubjsPeer::ID, $pk); - - $v = CcSubjsPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcSubjsPeer::DATABASE_NAME); - $criteria->add(CcSubjsPeer::ID, $pks, Criteria::IN); - $objs = CcSubjsPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcSubjsPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_subjs'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcSubjs'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcSubjsTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 13; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 13; + + /** the column name for the id field */ + const ID = 'cc_subjs.id'; + + /** the column name for the login field */ + const LOGIN = 'cc_subjs.login'; + + /** the column name for the pass field */ + const PASS = 'cc_subjs.pass'; + + /** the column name for the type field */ + const TYPE = 'cc_subjs.type'; + + /** the column name for the first_name field */ + const FIRST_NAME = 'cc_subjs.first_name'; + + /** the column name for the last_name field */ + const LAST_NAME = 'cc_subjs.last_name'; + + /** the column name for the lastlogin field */ + const LASTLOGIN = 'cc_subjs.lastlogin'; + + /** the column name for the lastfail field */ + const LASTFAIL = 'cc_subjs.lastfail'; + + /** the column name for the skype_contact field */ + const SKYPE_CONTACT = 'cc_subjs.skype_contact'; + + /** the column name for the jabber_contact field */ + const JABBER_CONTACT = 'cc_subjs.jabber_contact'; + + /** the column name for the email field */ + const EMAIL = 'cc_subjs.email'; + + /** the column name for the cell_phone field */ + const CELL_PHONE = 'cc_subjs.cell_phone'; + + /** the column name for the login_attempts field */ + const LOGIN_ATTEMPTS = 'cc_subjs.login_attempts'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcSubjs objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcSubjs[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcSubjsPeer::$fieldNames[CcSubjsPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbLogin', 'DbPass', 'DbType', 'DbFirstName', 'DbLastName', 'DbLastlogin', 'DbLastfail', 'DbSkypeContact', 'DbJabberContact', 'DbEmail', 'DbCellPhone', 'DbLoginAttempts', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbLogin', 'dbPass', 'dbType', 'dbFirstName', 'dbLastName', 'dbLastlogin', 'dbLastfail', 'dbSkypeContact', 'dbJabberContact', 'dbEmail', 'dbCellPhone', 'dbLoginAttempts', ), + BasePeer::TYPE_COLNAME => array (CcSubjsPeer::ID, CcSubjsPeer::LOGIN, CcSubjsPeer::PASS, CcSubjsPeer::TYPE, CcSubjsPeer::FIRST_NAME, CcSubjsPeer::LAST_NAME, CcSubjsPeer::LASTLOGIN, CcSubjsPeer::LASTFAIL, CcSubjsPeer::SKYPE_CONTACT, CcSubjsPeer::JABBER_CONTACT, CcSubjsPeer::EMAIL, CcSubjsPeer::CELL_PHONE, CcSubjsPeer::LOGIN_ATTEMPTS, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'LOGIN', 'PASS', 'TYPE', 'FIRST_NAME', 'LAST_NAME', 'LASTLOGIN', 'LASTFAIL', 'SKYPE_CONTACT', 'JABBER_CONTACT', 'EMAIL', 'CELL_PHONE', 'LOGIN_ATTEMPTS', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'login', 'pass', 'type', 'first_name', 'last_name', 'lastlogin', 'lastfail', 'skype_contact', 'jabber_contact', 'email', 'cell_phone', 'login_attempts', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcSubjsPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbLogin' => 1, 'DbPass' => 2, 'DbType' => 3, 'DbFirstName' => 4, 'DbLastName' => 5, 'DbLastlogin' => 6, 'DbLastfail' => 7, 'DbSkypeContact' => 8, 'DbJabberContact' => 9, 'DbEmail' => 10, 'DbCellPhone' => 11, 'DbLoginAttempts' => 12, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbLogin' => 1, 'dbPass' => 2, 'dbType' => 3, 'dbFirstName' => 4, 'dbLastName' => 5, 'dbLastlogin' => 6, 'dbLastfail' => 7, 'dbSkypeContact' => 8, 'dbJabberContact' => 9, 'dbEmail' => 10, 'dbCellPhone' => 11, 'dbLoginAttempts' => 12, ), + BasePeer::TYPE_COLNAME => array (CcSubjsPeer::ID => 0, CcSubjsPeer::LOGIN => 1, CcSubjsPeer::PASS => 2, CcSubjsPeer::TYPE => 3, CcSubjsPeer::FIRST_NAME => 4, CcSubjsPeer::LAST_NAME => 5, CcSubjsPeer::LASTLOGIN => 6, CcSubjsPeer::LASTFAIL => 7, CcSubjsPeer::SKYPE_CONTACT => 8, CcSubjsPeer::JABBER_CONTACT => 9, CcSubjsPeer::EMAIL => 10, CcSubjsPeer::CELL_PHONE => 11, CcSubjsPeer::LOGIN_ATTEMPTS => 12, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'LOGIN' => 1, 'PASS' => 2, 'TYPE' => 3, 'FIRST_NAME' => 4, 'LAST_NAME' => 5, 'LASTLOGIN' => 6, 'LASTFAIL' => 7, 'SKYPE_CONTACT' => 8, 'JABBER_CONTACT' => 9, 'EMAIL' => 10, 'CELL_PHONE' => 11, 'LOGIN_ATTEMPTS' => 12, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'login' => 1, 'pass' => 2, 'type' => 3, 'first_name' => 4, 'last_name' => 5, 'lastlogin' => 6, 'lastfail' => 7, 'skype_contact' => 8, 'jabber_contact' => 9, 'email' => 10, 'cell_phone' => 11, 'login_attempts' => 12, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcSubjsPeer::getFieldNames($toType); + $key = isset(CcSubjsPeer::$fieldKeys[$fromType][$name]) ? CcSubjsPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcSubjsPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcSubjsPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcSubjsPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcSubjsPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcSubjsPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcSubjsPeer::ID); + $criteria->addSelectColumn(CcSubjsPeer::LOGIN); + $criteria->addSelectColumn(CcSubjsPeer::PASS); + $criteria->addSelectColumn(CcSubjsPeer::TYPE); + $criteria->addSelectColumn(CcSubjsPeer::FIRST_NAME); + $criteria->addSelectColumn(CcSubjsPeer::LAST_NAME); + $criteria->addSelectColumn(CcSubjsPeer::LASTLOGIN); + $criteria->addSelectColumn(CcSubjsPeer::LASTFAIL); + $criteria->addSelectColumn(CcSubjsPeer::SKYPE_CONTACT); + $criteria->addSelectColumn(CcSubjsPeer::JABBER_CONTACT); + $criteria->addSelectColumn(CcSubjsPeer::EMAIL); + $criteria->addSelectColumn(CcSubjsPeer::CELL_PHONE); + $criteria->addSelectColumn(CcSubjsPeer::LOGIN_ATTEMPTS); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.login'); + $criteria->addSelectColumn($alias . '.pass'); + $criteria->addSelectColumn($alias . '.type'); + $criteria->addSelectColumn($alias . '.first_name'); + $criteria->addSelectColumn($alias . '.last_name'); + $criteria->addSelectColumn($alias . '.lastlogin'); + $criteria->addSelectColumn($alias . '.lastfail'); + $criteria->addSelectColumn($alias . '.skype_contact'); + $criteria->addSelectColumn($alias . '.jabber_contact'); + $criteria->addSelectColumn($alias . '.email'); + $criteria->addSelectColumn($alias . '.cell_phone'); + $criteria->addSelectColumn($alias . '.login_attempts'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSubjsPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSubjsPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcSubjsPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcSubjs + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcSubjsPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcSubjsPeer::populateObjects(CcSubjsPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcSubjsPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcSubjsPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcSubjs $obj A CcSubjs object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcSubjsPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcSubjs object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcSubjs) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcSubjs object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcSubjsPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcSubjs Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcSubjsPeer::$instances[$key])) { + return CcSubjsPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcSubjsPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcSubjsPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_subjs + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in CcPermsPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcPermsPeer::clearInstancePool(); + // Invalidate objects in CcShowHostsPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcShowHostsPeer::clearInstancePool(); + // Invalidate objects in CcPlaylistPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcPlaylistPeer::clearInstancePool(); + // Invalidate objects in CcBlockPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcBlockPeer::clearInstancePool(); + // Invalidate objects in CcPrefPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcPrefPeer::clearInstancePool(); + // Invalidate objects in CcSessPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcSessPeer::clearInstancePool(); + // Invalidate objects in CcSubjsTokenPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcSubjsTokenPeer::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcSubjsPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcSubjsPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcSubjsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcSubjsPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcSubjs object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcSubjsPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcSubjsPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcSubjsPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcSubjsPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcSubjsPeer::DATABASE_NAME)->getTable(CcSubjsPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcSubjsPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcSubjsPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcSubjsTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcSubjsPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcSubjs or Criteria object. + * + * @param mixed $values Criteria or CcSubjs object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcSubjs object + } + + if ($criteria->containsKey(CcSubjsPeer::ID) && $criteria->keyContainsValue(CcSubjsPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcSubjsPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcSubjsPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcSubjs or Criteria object. + * + * @param mixed $values Criteria or CcSubjs object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcSubjsPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcSubjsPeer::ID); + $value = $criteria->remove(CcSubjsPeer::ID); + if ($value) { + $selectCriteria->add(CcSubjsPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcSubjsPeer::TABLE_NAME); + } + + } else { // $values is CcSubjs object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcSubjsPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_subjs table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcSubjsPeer::TABLE_NAME, $con, CcSubjsPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcSubjsPeer::clearInstancePool(); + CcSubjsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcSubjs or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcSubjs object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcSubjsPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcSubjs) { // it's a model object + // invalidate the cache for this single object + CcSubjsPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcSubjsPeer::DATABASE_NAME); + $criteria->add(CcSubjsPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcSubjsPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcSubjsPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcSubjsPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcSubjs object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcSubjs $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcSubjsPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcSubjsPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcSubjsPeer::DATABASE_NAME, CcSubjsPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcSubjs + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcSubjsPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcSubjsPeer::DATABASE_NAME); + $criteria->add(CcSubjsPeer::ID, $pk); + + $v = CcSubjsPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcSubjs[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcSubjsPeer::DATABASE_NAME); + $criteria->add(CcSubjsPeer::ID, $pks, Criteria::IN); + $objs = CcSubjsPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcSubjsPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSubjsQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcSubjsQuery.php index 38703d2083..1416ec184c 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSubjsQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSubjsQuery.php @@ -4,1113 +4,1412 @@ /** * Base class that represents a query for the 'cc_subjs' table. * - * * - * @method CcSubjsQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcSubjsQuery orderByDbLogin($order = Criteria::ASC) Order by the login column - * @method CcSubjsQuery orderByDbPass($order = Criteria::ASC) Order by the pass column - * @method CcSubjsQuery orderByDbType($order = Criteria::ASC) Order by the type column - * @method CcSubjsQuery orderByDbFirstName($order = Criteria::ASC) Order by the first_name column - * @method CcSubjsQuery orderByDbLastName($order = Criteria::ASC) Order by the last_name column - * @method CcSubjsQuery orderByDbLastlogin($order = Criteria::ASC) Order by the lastlogin column - * @method CcSubjsQuery orderByDbLastfail($order = Criteria::ASC) Order by the lastfail column - * @method CcSubjsQuery orderByDbSkypeContact($order = Criteria::ASC) Order by the skype_contact column - * @method CcSubjsQuery orderByDbJabberContact($order = Criteria::ASC) Order by the jabber_contact column - * @method CcSubjsQuery orderByDbEmail($order = Criteria::ASC) Order by the email column - * @method CcSubjsQuery orderByDbCellPhone($order = Criteria::ASC) Order by the cell_phone column - * @method CcSubjsQuery orderByDbLoginAttempts($order = Criteria::ASC) Order by the login_attempts column * - * @method CcSubjsQuery groupByDbId() Group by the id column - * @method CcSubjsQuery groupByDbLogin() Group by the login column - * @method CcSubjsQuery groupByDbPass() Group by the pass column - * @method CcSubjsQuery groupByDbType() Group by the type column - * @method CcSubjsQuery groupByDbFirstName() Group by the first_name column - * @method CcSubjsQuery groupByDbLastName() Group by the last_name column - * @method CcSubjsQuery groupByDbLastlogin() Group by the lastlogin column - * @method CcSubjsQuery groupByDbLastfail() Group by the lastfail column - * @method CcSubjsQuery groupByDbSkypeContact() Group by the skype_contact column - * @method CcSubjsQuery groupByDbJabberContact() Group by the jabber_contact column - * @method CcSubjsQuery groupByDbEmail() Group by the email column - * @method CcSubjsQuery groupByDbCellPhone() Group by the cell_phone column - * @method CcSubjsQuery groupByDbLoginAttempts() Group by the login_attempts column + * @method CcSubjsQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcSubjsQuery orderByDbLogin($order = Criteria::ASC) Order by the login column + * @method CcSubjsQuery orderByDbPass($order = Criteria::ASC) Order by the pass column + * @method CcSubjsQuery orderByDbType($order = Criteria::ASC) Order by the type column + * @method CcSubjsQuery orderByDbFirstName($order = Criteria::ASC) Order by the first_name column + * @method CcSubjsQuery orderByDbLastName($order = Criteria::ASC) Order by the last_name column + * @method CcSubjsQuery orderByDbLastlogin($order = Criteria::ASC) Order by the lastlogin column + * @method CcSubjsQuery orderByDbLastfail($order = Criteria::ASC) Order by the lastfail column + * @method CcSubjsQuery orderByDbSkypeContact($order = Criteria::ASC) Order by the skype_contact column + * @method CcSubjsQuery orderByDbJabberContact($order = Criteria::ASC) Order by the jabber_contact column + * @method CcSubjsQuery orderByDbEmail($order = Criteria::ASC) Order by the email column + * @method CcSubjsQuery orderByDbCellPhone($order = Criteria::ASC) Order by the cell_phone column + * @method CcSubjsQuery orderByDbLoginAttempts($order = Criteria::ASC) Order by the login_attempts column * - * @method CcSubjsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcSubjsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcSubjsQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcSubjsQuery groupByDbId() Group by the id column + * @method CcSubjsQuery groupByDbLogin() Group by the login column + * @method CcSubjsQuery groupByDbPass() Group by the pass column + * @method CcSubjsQuery groupByDbType() Group by the type column + * @method CcSubjsQuery groupByDbFirstName() Group by the first_name column + * @method CcSubjsQuery groupByDbLastName() Group by the last_name column + * @method CcSubjsQuery groupByDbLastlogin() Group by the lastlogin column + * @method CcSubjsQuery groupByDbLastfail() Group by the lastfail column + * @method CcSubjsQuery groupByDbSkypeContact() Group by the skype_contact column + * @method CcSubjsQuery groupByDbJabberContact() Group by the jabber_contact column + * @method CcSubjsQuery groupByDbEmail() Group by the email column + * @method CcSubjsQuery groupByDbCellPhone() Group by the cell_phone column + * @method CcSubjsQuery groupByDbLoginAttempts() Group by the login_attempts column * - * @method CcSubjsQuery leftJoinCcFilesRelatedByDbOwnerId($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcFilesRelatedByDbOwnerId relation - * @method CcSubjsQuery rightJoinCcFilesRelatedByDbOwnerId($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcFilesRelatedByDbOwnerId relation - * @method CcSubjsQuery innerJoinCcFilesRelatedByDbOwnerId($relationAlias = '') Adds a INNER JOIN clause to the query using the CcFilesRelatedByDbOwnerId relation + * @method CcSubjsQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcSubjsQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcSubjsQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcSubjsQuery leftJoinCcFilesRelatedByDbEditedby($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcFilesRelatedByDbEditedby relation - * @method CcSubjsQuery rightJoinCcFilesRelatedByDbEditedby($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcFilesRelatedByDbEditedby relation - * @method CcSubjsQuery innerJoinCcFilesRelatedByDbEditedby($relationAlias = '') Adds a INNER JOIN clause to the query using the CcFilesRelatedByDbEditedby relation + * @method CcSubjsQuery leftJoinCcFilesRelatedByDbOwnerId($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcFilesRelatedByDbOwnerId relation + * @method CcSubjsQuery rightJoinCcFilesRelatedByDbOwnerId($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcFilesRelatedByDbOwnerId relation + * @method CcSubjsQuery innerJoinCcFilesRelatedByDbOwnerId($relationAlias = null) Adds a INNER JOIN clause to the query using the CcFilesRelatedByDbOwnerId relation * - * @method CcSubjsQuery leftJoinCcPerms($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcPerms relation - * @method CcSubjsQuery rightJoinCcPerms($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcPerms relation - * @method CcSubjsQuery innerJoinCcPerms($relationAlias = '') Adds a INNER JOIN clause to the query using the CcPerms relation + * @method CcSubjsQuery leftJoinCcFilesRelatedByDbEditedby($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcFilesRelatedByDbEditedby relation + * @method CcSubjsQuery rightJoinCcFilesRelatedByDbEditedby($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcFilesRelatedByDbEditedby relation + * @method CcSubjsQuery innerJoinCcFilesRelatedByDbEditedby($relationAlias = null) Adds a INNER JOIN clause to the query using the CcFilesRelatedByDbEditedby relation * - * @method CcSubjsQuery leftJoinCcShowHosts($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcShowHosts relation - * @method CcSubjsQuery rightJoinCcShowHosts($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcShowHosts relation - * @method CcSubjsQuery innerJoinCcShowHosts($relationAlias = '') Adds a INNER JOIN clause to the query using the CcShowHosts relation + * @method CcSubjsQuery leftJoinCcPerms($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPerms relation + * @method CcSubjsQuery rightJoinCcPerms($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPerms relation + * @method CcSubjsQuery innerJoinCcPerms($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPerms relation * - * @method CcSubjsQuery leftJoinCcPlaylist($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcPlaylist relation - * @method CcSubjsQuery rightJoinCcPlaylist($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcPlaylist relation - * @method CcSubjsQuery innerJoinCcPlaylist($relationAlias = '') Adds a INNER JOIN clause to the query using the CcPlaylist relation + * @method CcSubjsQuery leftJoinCcShowHosts($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShowHosts relation + * @method CcSubjsQuery rightJoinCcShowHosts($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShowHosts relation + * @method CcSubjsQuery innerJoinCcShowHosts($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShowHosts relation * - * @method CcSubjsQuery leftJoinCcBlock($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcBlock relation - * @method CcSubjsQuery rightJoinCcBlock($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcBlock relation - * @method CcSubjsQuery innerJoinCcBlock($relationAlias = '') Adds a INNER JOIN clause to the query using the CcBlock relation + * @method CcSubjsQuery leftJoinCcPlaylist($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPlaylist relation + * @method CcSubjsQuery rightJoinCcPlaylist($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlaylist relation + * @method CcSubjsQuery innerJoinCcPlaylist($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlaylist relation * - * @method CcSubjsQuery leftJoinCcPref($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcPref relation - * @method CcSubjsQuery rightJoinCcPref($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcPref relation - * @method CcSubjsQuery innerJoinCcPref($relationAlias = '') Adds a INNER JOIN clause to the query using the CcPref relation + * @method CcSubjsQuery leftJoinCcBlock($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcBlock relation + * @method CcSubjsQuery rightJoinCcBlock($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcBlock relation + * @method CcSubjsQuery innerJoinCcBlock($relationAlias = null) Adds a INNER JOIN clause to the query using the CcBlock relation * - * @method CcSubjsQuery leftJoinCcSess($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSess relation - * @method CcSubjsQuery rightJoinCcSess($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSess relation - * @method CcSubjsQuery innerJoinCcSess($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSess relation + * @method CcSubjsQuery leftJoinCcPref($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPref relation + * @method CcSubjsQuery rightJoinCcPref($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPref relation + * @method CcSubjsQuery innerJoinCcPref($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPref relation * - * @method CcSubjsQuery leftJoinCcSubjsToken($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSubjsToken relation - * @method CcSubjsQuery rightJoinCcSubjsToken($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSubjsToken relation - * @method CcSubjsQuery innerJoinCcSubjsToken($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSubjsToken relation + * @method CcSubjsQuery leftJoinCcSess($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSess relation + * @method CcSubjsQuery rightJoinCcSess($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSess relation + * @method CcSubjsQuery innerJoinCcSess($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSess relation * - * @method CcSubjs findOne(PropelPDO $con = null) Return the first CcSubjs matching the query - * @method CcSubjs findOneOrCreate(PropelPDO $con = null) Return the first CcSubjs matching the query, or a new CcSubjs object populated from the query conditions when no match is found + * @method CcSubjsQuery leftJoinCcSubjsToken($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSubjsToken relation + * @method CcSubjsQuery rightJoinCcSubjsToken($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSubjsToken relation + * @method CcSubjsQuery innerJoinCcSubjsToken($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSubjsToken relation * - * @method CcSubjs findOneByDbId(int $id) Return the first CcSubjs filtered by the id column - * @method CcSubjs findOneByDbLogin(string $login) Return the first CcSubjs filtered by the login column - * @method CcSubjs findOneByDbPass(string $pass) Return the first CcSubjs filtered by the pass column - * @method CcSubjs findOneByDbType(string $type) Return the first CcSubjs filtered by the type column - * @method CcSubjs findOneByDbFirstName(string $first_name) Return the first CcSubjs filtered by the first_name column - * @method CcSubjs findOneByDbLastName(string $last_name) Return the first CcSubjs filtered by the last_name column - * @method CcSubjs findOneByDbLastlogin(string $lastlogin) Return the first CcSubjs filtered by the lastlogin column - * @method CcSubjs findOneByDbLastfail(string $lastfail) Return the first CcSubjs filtered by the lastfail column - * @method CcSubjs findOneByDbSkypeContact(string $skype_contact) Return the first CcSubjs filtered by the skype_contact column - * @method CcSubjs findOneByDbJabberContact(string $jabber_contact) Return the first CcSubjs filtered by the jabber_contact column - * @method CcSubjs findOneByDbEmail(string $email) Return the first CcSubjs filtered by the email column - * @method CcSubjs findOneByDbCellPhone(string $cell_phone) Return the first CcSubjs filtered by the cell_phone column - * @method CcSubjs findOneByDbLoginAttempts(int $login_attempts) Return the first CcSubjs filtered by the login_attempts column + * @method CcSubjs findOne(PropelPDO $con = null) Return the first CcSubjs matching the query + * @method CcSubjs findOneOrCreate(PropelPDO $con = null) Return the first CcSubjs matching the query, or a new CcSubjs object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcSubjs objects filtered by the id column - * @method array findByDbLogin(string $login) Return CcSubjs objects filtered by the login column - * @method array findByDbPass(string $pass) Return CcSubjs objects filtered by the pass column - * @method array findByDbType(string $type) Return CcSubjs objects filtered by the type column - * @method array findByDbFirstName(string $first_name) Return CcSubjs objects filtered by the first_name column - * @method array findByDbLastName(string $last_name) Return CcSubjs objects filtered by the last_name column - * @method array findByDbLastlogin(string $lastlogin) Return CcSubjs objects filtered by the lastlogin column - * @method array findByDbLastfail(string $lastfail) Return CcSubjs objects filtered by the lastfail column - * @method array findByDbSkypeContact(string $skype_contact) Return CcSubjs objects filtered by the skype_contact column - * @method array findByDbJabberContact(string $jabber_contact) Return CcSubjs objects filtered by the jabber_contact column - * @method array findByDbEmail(string $email) Return CcSubjs objects filtered by the email column - * @method array findByDbCellPhone(string $cell_phone) Return CcSubjs objects filtered by the cell_phone column - * @method array findByDbLoginAttempts(int $login_attempts) Return CcSubjs objects filtered by the login_attempts column + * @method CcSubjs findOneByDbLogin(string $login) Return the first CcSubjs filtered by the login column + * @method CcSubjs findOneByDbPass(string $pass) Return the first CcSubjs filtered by the pass column + * @method CcSubjs findOneByDbType(string $type) Return the first CcSubjs filtered by the type column + * @method CcSubjs findOneByDbFirstName(string $first_name) Return the first CcSubjs filtered by the first_name column + * @method CcSubjs findOneByDbLastName(string $last_name) Return the first CcSubjs filtered by the last_name column + * @method CcSubjs findOneByDbLastlogin(string $lastlogin) Return the first CcSubjs filtered by the lastlogin column + * @method CcSubjs findOneByDbLastfail(string $lastfail) Return the first CcSubjs filtered by the lastfail column + * @method CcSubjs findOneByDbSkypeContact(string $skype_contact) Return the first CcSubjs filtered by the skype_contact column + * @method CcSubjs findOneByDbJabberContact(string $jabber_contact) Return the first CcSubjs filtered by the jabber_contact column + * @method CcSubjs findOneByDbEmail(string $email) Return the first CcSubjs filtered by the email column + * @method CcSubjs findOneByDbCellPhone(string $cell_phone) Return the first CcSubjs filtered by the cell_phone column + * @method CcSubjs findOneByDbLoginAttempts(int $login_attempts) Return the first CcSubjs filtered by the login_attempts column + * + * @method array findByDbId(int $id) Return CcSubjs objects filtered by the id column + * @method array findByDbLogin(string $login) Return CcSubjs objects filtered by the login column + * @method array findByDbPass(string $pass) Return CcSubjs objects filtered by the pass column + * @method array findByDbType(string $type) Return CcSubjs objects filtered by the type column + * @method array findByDbFirstName(string $first_name) Return CcSubjs objects filtered by the first_name column + * @method array findByDbLastName(string $last_name) Return CcSubjs objects filtered by the last_name column + * @method array findByDbLastlogin(string $lastlogin) Return CcSubjs objects filtered by the lastlogin column + * @method array findByDbLastfail(string $lastfail) Return CcSubjs objects filtered by the lastfail column + * @method array findByDbSkypeContact(string $skype_contact) Return CcSubjs objects filtered by the skype_contact column + * @method array findByDbJabberContact(string $jabber_contact) Return CcSubjs objects filtered by the jabber_contact column + * @method array findByDbEmail(string $email) Return CcSubjs objects filtered by the email column + * @method array findByDbCellPhone(string $cell_phone) Return CcSubjs objects filtered by the cell_phone column + * @method array findByDbLoginAttempts(int $login_attempts) Return CcSubjs objects filtered by the login_attempts column * * @package propel.generator.airtime.om */ abstract class BaseCcSubjsQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcSubjsQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcSubjs'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcSubjsQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcSubjsQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcSubjsQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcSubjsQuery) { + return $criteria; + } + $query = new CcSubjsQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcSubjs|CcSubjs[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcSubjsPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcSubjsPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSubjs A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSubjs A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "login", "pass", "type", "first_name", "last_name", "lastlogin", "lastfail", "skype_contact", "jabber_contact", "email", "cell_phone", "login_attempts" FROM "cc_subjs" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcSubjs(); + $obj->hydrate($row); + CcSubjsPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSubjs|CcSubjs[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcSubjs[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcSubjsPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcSubjsPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcSubjsPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcSubjsPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSubjsPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the login column + * + * Example usage: + * + * $query->filterByDbLogin('fooValue'); // WHERE login = 'fooValue' + * $query->filterByDbLogin('%fooValue%'); // WHERE login LIKE '%fooValue%' + * + * + * @param string $dbLogin The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByDbLogin($dbLogin = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLogin)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLogin)) { + $dbLogin = str_replace('*', '%', $dbLogin); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSubjsPeer::LOGIN, $dbLogin, $comparison); + } + + /** + * Filter the query on the pass column + * + * Example usage: + * + * $query->filterByDbPass('fooValue'); // WHERE pass = 'fooValue' + * $query->filterByDbPass('%fooValue%'); // WHERE pass LIKE '%fooValue%' + * + * + * @param string $dbPass The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByDbPass($dbPass = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbPass)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbPass)) { + $dbPass = str_replace('*', '%', $dbPass); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSubjsPeer::PASS, $dbPass, $comparison); + } + + /** + * Filter the query on the type column + * + * Example usage: + * + * $query->filterByDbType('fooValue'); // WHERE type = 'fooValue' + * $query->filterByDbType('%fooValue%'); // WHERE type LIKE '%fooValue%' + * + * + * @param string $dbType The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByDbType($dbType = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbType)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbType)) { + $dbType = str_replace('*', '%', $dbType); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSubjsPeer::TYPE, $dbType, $comparison); + } + + /** + * Filter the query on the first_name column + * + * Example usage: + * + * $query->filterByDbFirstName('fooValue'); // WHERE first_name = 'fooValue' + * $query->filterByDbFirstName('%fooValue%'); // WHERE first_name LIKE '%fooValue%' + * + * + * @param string $dbFirstName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByDbFirstName($dbFirstName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbFirstName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbFirstName)) { + $dbFirstName = str_replace('*', '%', $dbFirstName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSubjsPeer::FIRST_NAME, $dbFirstName, $comparison); + } + + /** + * Filter the query on the last_name column + * + * Example usage: + * + * $query->filterByDbLastName('fooValue'); // WHERE last_name = 'fooValue' + * $query->filterByDbLastName('%fooValue%'); // WHERE last_name LIKE '%fooValue%' + * + * + * @param string $dbLastName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByDbLastName($dbLastName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLastName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLastName)) { + $dbLastName = str_replace('*', '%', $dbLastName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSubjsPeer::LAST_NAME, $dbLastName, $comparison); + } + + /** + * Filter the query on the lastlogin column + * + * Example usage: + * + * $query->filterByDbLastlogin('2011-03-14'); // WHERE lastlogin = '2011-03-14' + * $query->filterByDbLastlogin('now'); // WHERE lastlogin = '2011-03-14' + * $query->filterByDbLastlogin(array('max' => 'yesterday')); // WHERE lastlogin < '2011-03-13' + * + * + * @param mixed $dbLastlogin The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByDbLastlogin($dbLastlogin = null, $comparison = null) + { + if (is_array($dbLastlogin)) { + $useMinMax = false; + if (isset($dbLastlogin['min'])) { + $this->addUsingAlias(CcSubjsPeer::LASTLOGIN, $dbLastlogin['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbLastlogin['max'])) { + $this->addUsingAlias(CcSubjsPeer::LASTLOGIN, $dbLastlogin['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSubjsPeer::LASTLOGIN, $dbLastlogin, $comparison); + } + + /** + * Filter the query on the lastfail column + * + * Example usage: + * + * $query->filterByDbLastfail('2011-03-14'); // WHERE lastfail = '2011-03-14' + * $query->filterByDbLastfail('now'); // WHERE lastfail = '2011-03-14' + * $query->filterByDbLastfail(array('max' => 'yesterday')); // WHERE lastfail < '2011-03-13' + * + * + * @param mixed $dbLastfail The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByDbLastfail($dbLastfail = null, $comparison = null) + { + if (is_array($dbLastfail)) { + $useMinMax = false; + if (isset($dbLastfail['min'])) { + $this->addUsingAlias(CcSubjsPeer::LASTFAIL, $dbLastfail['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbLastfail['max'])) { + $this->addUsingAlias(CcSubjsPeer::LASTFAIL, $dbLastfail['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSubjsPeer::LASTFAIL, $dbLastfail, $comparison); + } + + /** + * Filter the query on the skype_contact column + * + * Example usage: + * + * $query->filterByDbSkypeContact('fooValue'); // WHERE skype_contact = 'fooValue' + * $query->filterByDbSkypeContact('%fooValue%'); // WHERE skype_contact LIKE '%fooValue%' + * + * + * @param string $dbSkypeContact The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByDbSkypeContact($dbSkypeContact = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbSkypeContact)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbSkypeContact)) { + $dbSkypeContact = str_replace('*', '%', $dbSkypeContact); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSubjsPeer::SKYPE_CONTACT, $dbSkypeContact, $comparison); + } + + /** + * Filter the query on the jabber_contact column + * + * Example usage: + * + * $query->filterByDbJabberContact('fooValue'); // WHERE jabber_contact = 'fooValue' + * $query->filterByDbJabberContact('%fooValue%'); // WHERE jabber_contact LIKE '%fooValue%' + * + * + * @param string $dbJabberContact The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByDbJabberContact($dbJabberContact = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbJabberContact)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbJabberContact)) { + $dbJabberContact = str_replace('*', '%', $dbJabberContact); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSubjsPeer::JABBER_CONTACT, $dbJabberContact, $comparison); + } + + /** + * Filter the query on the email column + * + * Example usage: + * + * $query->filterByDbEmail('fooValue'); // WHERE email = 'fooValue' + * $query->filterByDbEmail('%fooValue%'); // WHERE email LIKE '%fooValue%' + * + * + * @param string $dbEmail The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByDbEmail($dbEmail = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbEmail)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbEmail)) { + $dbEmail = str_replace('*', '%', $dbEmail); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSubjsPeer::EMAIL, $dbEmail, $comparison); + } + + /** + * Filter the query on the cell_phone column + * + * Example usage: + * + * $query->filterByDbCellPhone('fooValue'); // WHERE cell_phone = 'fooValue' + * $query->filterByDbCellPhone('%fooValue%'); // WHERE cell_phone LIKE '%fooValue%' + * + * + * @param string $dbCellPhone The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByDbCellPhone($dbCellPhone = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbCellPhone)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbCellPhone)) { + $dbCellPhone = str_replace('*', '%', $dbCellPhone); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSubjsPeer::CELL_PHONE, $dbCellPhone, $comparison); + } + + /** + * Filter the query on the login_attempts column + * + * Example usage: + * + * $query->filterByDbLoginAttempts(1234); // WHERE login_attempts = 1234 + * $query->filterByDbLoginAttempts(array(12, 34)); // WHERE login_attempts IN (12, 34) + * $query->filterByDbLoginAttempts(array('min' => 12)); // WHERE login_attempts >= 12 + * $query->filterByDbLoginAttempts(array('max' => 12)); // WHERE login_attempts <= 12 + * + * + * @param mixed $dbLoginAttempts The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function filterByDbLoginAttempts($dbLoginAttempts = null, $comparison = null) + { + if (is_array($dbLoginAttempts)) { + $useMinMax = false; + if (isset($dbLoginAttempts['min'])) { + $this->addUsingAlias(CcSubjsPeer::LOGIN_ATTEMPTS, $dbLoginAttempts['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbLoginAttempts['max'])) { + $this->addUsingAlias(CcSubjsPeer::LOGIN_ATTEMPTS, $dbLoginAttempts['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSubjsPeer::LOGIN_ATTEMPTS, $dbLoginAttempts, $comparison); + } + + /** + * Filter the query by a related CcFiles object + * + * @param CcFiles|PropelObjectCollection $ccFiles the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcFilesRelatedByDbOwnerId($ccFiles, $comparison = null) + { + if ($ccFiles instanceof CcFiles) { + return $this + ->addUsingAlias(CcSubjsPeer::ID, $ccFiles->getDbOwnerId(), $comparison); + } elseif ($ccFiles instanceof PropelObjectCollection) { + return $this + ->useCcFilesRelatedByDbOwnerIdQuery() + ->filterByPrimaryKeys($ccFiles->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcFilesRelatedByDbOwnerId() only accepts arguments of type CcFiles or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcFilesRelatedByDbOwnerId relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function joinCcFilesRelatedByDbOwnerId($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcFilesRelatedByDbOwnerId'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcFilesRelatedByDbOwnerId'); + } + + return $this; + } + + /** + * Use the CcFilesRelatedByDbOwnerId relation CcFiles object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery A secondary query class using the current class as primary query + */ + public function useCcFilesRelatedByDbOwnerIdQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcFilesRelatedByDbOwnerId($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcFilesRelatedByDbOwnerId', 'CcFilesQuery'); + } + + /** + * Filter the query by a related CcFiles object + * + * @param CcFiles|PropelObjectCollection $ccFiles the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcFilesRelatedByDbEditedby($ccFiles, $comparison = null) + { + if ($ccFiles instanceof CcFiles) { + return $this + ->addUsingAlias(CcSubjsPeer::ID, $ccFiles->getDbEditedby(), $comparison); + } elseif ($ccFiles instanceof PropelObjectCollection) { + return $this + ->useCcFilesRelatedByDbEditedbyQuery() + ->filterByPrimaryKeys($ccFiles->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcFilesRelatedByDbEditedby() only accepts arguments of type CcFiles or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcFilesRelatedByDbEditedby relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function joinCcFilesRelatedByDbEditedby($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcFilesRelatedByDbEditedby'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcFilesRelatedByDbEditedby'); + } + + return $this; + } + + /** + * Use the CcFilesRelatedByDbEditedby relation CcFiles object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery A secondary query class using the current class as primary query + */ + public function useCcFilesRelatedByDbEditedbyQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcFilesRelatedByDbEditedby($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcFilesRelatedByDbEditedby', 'CcFilesQuery'); + } + + /** + * Filter the query by a related CcPerms object + * + * @param CcPerms|PropelObjectCollection $ccPerms the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcPerms($ccPerms, $comparison = null) + { + if ($ccPerms instanceof CcPerms) { + return $this + ->addUsingAlias(CcSubjsPeer::ID, $ccPerms->getSubj(), $comparison); + } elseif ($ccPerms instanceof PropelObjectCollection) { + return $this + ->useCcPermsQuery() + ->filterByPrimaryKeys($ccPerms->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcPerms() only accepts arguments of type CcPerms or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcPerms relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function joinCcPerms($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcPerms'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcPerms'); + } + + return $this; + } + + /** + * Use the CcPerms relation CcPerms object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPermsQuery A secondary query class using the current class as primary query + */ + public function useCcPermsQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcPerms($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcPerms', 'CcPermsQuery'); + } + + /** + * Filter the query by a related CcShowHosts object + * + * @param CcShowHosts|PropelObjectCollection $ccShowHosts the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcShowHosts($ccShowHosts, $comparison = null) + { + if ($ccShowHosts instanceof CcShowHosts) { + return $this + ->addUsingAlias(CcSubjsPeer::ID, $ccShowHosts->getDbHost(), $comparison); + } elseif ($ccShowHosts instanceof PropelObjectCollection) { + return $this + ->useCcShowHostsQuery() + ->filterByPrimaryKeys($ccShowHosts->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcShowHosts() only accepts arguments of type CcShowHosts or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcShowHosts relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function joinCcShowHosts($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcShowHosts'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcShowHosts'); + } + + return $this; + } + + /** + * Use the CcShowHosts relation CcShowHosts object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcShowHostsQuery A secondary query class using the current class as primary query + */ + public function useCcShowHostsQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcShowHosts($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcShowHosts', 'CcShowHostsQuery'); + } + + /** + * Filter the query by a related CcPlaylist object + * + * @param CcPlaylist|PropelObjectCollection $ccPlaylist the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcPlaylist($ccPlaylist, $comparison = null) + { + if ($ccPlaylist instanceof CcPlaylist) { + return $this + ->addUsingAlias(CcSubjsPeer::ID, $ccPlaylist->getDbCreatorId(), $comparison); + } elseif ($ccPlaylist instanceof PropelObjectCollection) { + return $this + ->useCcPlaylistQuery() + ->filterByPrimaryKeys($ccPlaylist->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcPlaylist() only accepts arguments of type CcPlaylist or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcPlaylist relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function joinCcPlaylist($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcPlaylist'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcPlaylist'); + } + + return $this; + } + + /** + * Use the CcPlaylist relation CcPlaylist object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPlaylistQuery A secondary query class using the current class as primary query + */ + public function useCcPlaylistQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcPlaylist($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcPlaylist', 'CcPlaylistQuery'); + } + + /** + * Filter the query by a related CcBlock object + * + * @param CcBlock|PropelObjectCollection $ccBlock the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcBlock($ccBlock, $comparison = null) + { + if ($ccBlock instanceof CcBlock) { + return $this + ->addUsingAlias(CcSubjsPeer::ID, $ccBlock->getDbCreatorId(), $comparison); + } elseif ($ccBlock instanceof PropelObjectCollection) { + return $this + ->useCcBlockQuery() + ->filterByPrimaryKeys($ccBlock->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcBlock() only accepts arguments of type CcBlock or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcBlock relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function joinCcBlock($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcBlock'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcBlock'); + } + + return $this; + } + + /** + * Use the CcBlock relation CcBlock object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcBlockQuery A secondary query class using the current class as primary query + */ + public function useCcBlockQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcBlock($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcBlock', 'CcBlockQuery'); + } + + /** + * Filter the query by a related CcPref object + * + * @param CcPref|PropelObjectCollection $ccPref the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcPref($ccPref, $comparison = null) + { + if ($ccPref instanceof CcPref) { + return $this + ->addUsingAlias(CcSubjsPeer::ID, $ccPref->getSubjid(), $comparison); + } elseif ($ccPref instanceof PropelObjectCollection) { + return $this + ->useCcPrefQuery() + ->filterByPrimaryKeys($ccPref->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcPref() only accepts arguments of type CcPref or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcPref relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function joinCcPref($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcPref'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcPref'); + } + + return $this; + } + + /** + * Use the CcPref relation CcPref object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcPrefQuery A secondary query class using the current class as primary query + */ + public function useCcPrefQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcPref($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcPref', 'CcPrefQuery'); + } + + /** + * Filter the query by a related CcSess object + * + * @param CcSess|PropelObjectCollection $ccSess the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSess($ccSess, $comparison = null) + { + if ($ccSess instanceof CcSess) { + return $this + ->addUsingAlias(CcSubjsPeer::ID, $ccSess->getUserid(), $comparison); + } elseif ($ccSess instanceof PropelObjectCollection) { + return $this + ->useCcSessQuery() + ->filterByPrimaryKeys($ccSess->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcSess() only accepts arguments of type CcSess or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSess relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function joinCcSess($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSess'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSess'); + } + + return $this; + } + + /** + * Use the CcSess relation CcSess object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSessQuery A secondary query class using the current class as primary query + */ + public function useCcSessQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcSess($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSess', 'CcSessQuery'); + } + + /** + * Filter the query by a related CcSubjsToken object + * + * @param CcSubjsToken|PropelObjectCollection $ccSubjsToken the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSubjsToken($ccSubjsToken, $comparison = null) + { + if ($ccSubjsToken instanceof CcSubjsToken) { + return $this + ->addUsingAlias(CcSubjsPeer::ID, $ccSubjsToken->getDbUserId(), $comparison); + } elseif ($ccSubjsToken instanceof PropelObjectCollection) { + return $this + ->useCcSubjsTokenQuery() + ->filterByPrimaryKeys($ccSubjsToken->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcSubjsToken() only accepts arguments of type CcSubjsToken or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSubjsToken relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function joinCcSubjsToken($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSubjsToken'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSubjsToken'); + } + + return $this; + } + + /** + * Use the CcSubjsToken relation CcSubjsToken object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsTokenQuery A secondary query class using the current class as primary query + */ + public function useCcSubjsTokenQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcSubjsToken($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSubjsToken', 'CcSubjsTokenQuery'); + } + + /** + * Exclude object from result + * + * @param CcSubjs $ccSubjs Object to remove from the list of results + * + * @return CcSubjsQuery The current query, for fluid interface + */ + public function prune($ccSubjs = null) + { + if ($ccSubjs) { + $this->addUsingAlias(CcSubjsPeer::ID, $ccSubjs->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcSubjsQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcSubjs', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcSubjsQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcSubjsQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcSubjsQuery) { - return $criteria; - } - $query = new CcSubjsQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcSubjs|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcSubjsPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcSubjsPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcSubjsPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcSubjsPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the login column - * - * @param string $dbLogin The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByDbLogin($dbLogin = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLogin)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLogin)) { - $dbLogin = str_replace('*', '%', $dbLogin); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSubjsPeer::LOGIN, $dbLogin, $comparison); - } - - /** - * Filter the query on the pass column - * - * @param string $dbPass The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByDbPass($dbPass = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbPass)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbPass)) { - $dbPass = str_replace('*', '%', $dbPass); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSubjsPeer::PASS, $dbPass, $comparison); - } - - /** - * Filter the query on the type column - * - * @param string $dbType The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByDbType($dbType = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbType)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbType)) { - $dbType = str_replace('*', '%', $dbType); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSubjsPeer::TYPE, $dbType, $comparison); - } - - /** - * Filter the query on the first_name column - * - * @param string $dbFirstName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByDbFirstName($dbFirstName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbFirstName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbFirstName)) { - $dbFirstName = str_replace('*', '%', $dbFirstName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSubjsPeer::FIRST_NAME, $dbFirstName, $comparison); - } - - /** - * Filter the query on the last_name column - * - * @param string $dbLastName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByDbLastName($dbLastName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLastName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLastName)) { - $dbLastName = str_replace('*', '%', $dbLastName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSubjsPeer::LAST_NAME, $dbLastName, $comparison); - } - - /** - * Filter the query on the lastlogin column - * - * @param string|array $dbLastlogin The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByDbLastlogin($dbLastlogin = null, $comparison = null) - { - if (is_array($dbLastlogin)) { - $useMinMax = false; - if (isset($dbLastlogin['min'])) { - $this->addUsingAlias(CcSubjsPeer::LASTLOGIN, $dbLastlogin['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbLastlogin['max'])) { - $this->addUsingAlias(CcSubjsPeer::LASTLOGIN, $dbLastlogin['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSubjsPeer::LASTLOGIN, $dbLastlogin, $comparison); - } - - /** - * Filter the query on the lastfail column - * - * @param string|array $dbLastfail The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByDbLastfail($dbLastfail = null, $comparison = null) - { - if (is_array($dbLastfail)) { - $useMinMax = false; - if (isset($dbLastfail['min'])) { - $this->addUsingAlias(CcSubjsPeer::LASTFAIL, $dbLastfail['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbLastfail['max'])) { - $this->addUsingAlias(CcSubjsPeer::LASTFAIL, $dbLastfail['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSubjsPeer::LASTFAIL, $dbLastfail, $comparison); - } - - /** - * Filter the query on the skype_contact column - * - * @param string $dbSkypeContact The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByDbSkypeContact($dbSkypeContact = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbSkypeContact)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbSkypeContact)) { - $dbSkypeContact = str_replace('*', '%', $dbSkypeContact); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSubjsPeer::SKYPE_CONTACT, $dbSkypeContact, $comparison); - } - - /** - * Filter the query on the jabber_contact column - * - * @param string $dbJabberContact The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByDbJabberContact($dbJabberContact = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbJabberContact)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbJabberContact)) { - $dbJabberContact = str_replace('*', '%', $dbJabberContact); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSubjsPeer::JABBER_CONTACT, $dbJabberContact, $comparison); - } - - /** - * Filter the query on the email column - * - * @param string $dbEmail The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByDbEmail($dbEmail = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbEmail)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbEmail)) { - $dbEmail = str_replace('*', '%', $dbEmail); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSubjsPeer::EMAIL, $dbEmail, $comparison); - } - - /** - * Filter the query on the cell_phone column - * - * @param string $dbCellPhone The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByDbCellPhone($dbCellPhone = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbCellPhone)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbCellPhone)) { - $dbCellPhone = str_replace('*', '%', $dbCellPhone); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSubjsPeer::CELL_PHONE, $dbCellPhone, $comparison); - } - - /** - * Filter the query on the login_attempts column - * - * @param int|array $dbLoginAttempts The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByDbLoginAttempts($dbLoginAttempts = null, $comparison = null) - { - if (is_array($dbLoginAttempts)) { - $useMinMax = false; - if (isset($dbLoginAttempts['min'])) { - $this->addUsingAlias(CcSubjsPeer::LOGIN_ATTEMPTS, $dbLoginAttempts['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbLoginAttempts['max'])) { - $this->addUsingAlias(CcSubjsPeer::LOGIN_ATTEMPTS, $dbLoginAttempts['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSubjsPeer::LOGIN_ATTEMPTS, $dbLoginAttempts, $comparison); - } - - /** - * Filter the query by a related CcFiles object - * - * @param CcFiles $ccFiles the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByCcFilesRelatedByDbOwnerId($ccFiles, $comparison = null) - { - return $this - ->addUsingAlias(CcSubjsPeer::ID, $ccFiles->getDbOwnerId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcFilesRelatedByDbOwnerId relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function joinCcFilesRelatedByDbOwnerId($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcFilesRelatedByDbOwnerId'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcFilesRelatedByDbOwnerId'); - } - - return $this; - } - - /** - * Use the CcFilesRelatedByDbOwnerId relation CcFiles object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery A secondary query class using the current class as primary query - */ - public function useCcFilesRelatedByDbOwnerIdQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcFilesRelatedByDbOwnerId($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcFilesRelatedByDbOwnerId', 'CcFilesQuery'); - } - - /** - * Filter the query by a related CcFiles object - * - * @param CcFiles $ccFiles the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByCcFilesRelatedByDbEditedby($ccFiles, $comparison = null) - { - return $this - ->addUsingAlias(CcSubjsPeer::ID, $ccFiles->getDbEditedby(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcFilesRelatedByDbEditedby relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function joinCcFilesRelatedByDbEditedby($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcFilesRelatedByDbEditedby'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcFilesRelatedByDbEditedby'); - } - - return $this; - } - - /** - * Use the CcFilesRelatedByDbEditedby relation CcFiles object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcFilesQuery A secondary query class using the current class as primary query - */ - public function useCcFilesRelatedByDbEditedbyQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcFilesRelatedByDbEditedby($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcFilesRelatedByDbEditedby', 'CcFilesQuery'); - } - - /** - * Filter the query by a related CcPerms object - * - * @param CcPerms $ccPerms the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByCcPerms($ccPerms, $comparison = null) - { - return $this - ->addUsingAlias(CcSubjsPeer::ID, $ccPerms->getSubj(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcPerms relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function joinCcPerms($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcPerms'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcPerms'); - } - - return $this; - } - - /** - * Use the CcPerms relation CcPerms object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPermsQuery A secondary query class using the current class as primary query - */ - public function useCcPermsQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcPerms($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcPerms', 'CcPermsQuery'); - } - - /** - * Filter the query by a related CcShowHosts object - * - * @param CcShowHosts $ccShowHosts the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByCcShowHosts($ccShowHosts, $comparison = null) - { - return $this - ->addUsingAlias(CcSubjsPeer::ID, $ccShowHosts->getDbHost(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcShowHosts relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function joinCcShowHosts($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcShowHosts'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcShowHosts'); - } - - return $this; - } - - /** - * Use the CcShowHosts relation CcShowHosts object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcShowHostsQuery A secondary query class using the current class as primary query - */ - public function useCcShowHostsQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcShowHosts($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcShowHosts', 'CcShowHostsQuery'); - } - - /** - * Filter the query by a related CcPlaylist object - * - * @param CcPlaylist $ccPlaylist the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByCcPlaylist($ccPlaylist, $comparison = null) - { - return $this - ->addUsingAlias(CcSubjsPeer::ID, $ccPlaylist->getDbCreatorId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcPlaylist relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function joinCcPlaylist($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcPlaylist'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcPlaylist'); - } - - return $this; - } - - /** - * Use the CcPlaylist relation CcPlaylist object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPlaylistQuery A secondary query class using the current class as primary query - */ - public function useCcPlaylistQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcPlaylist($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcPlaylist', 'CcPlaylistQuery'); - } - - /** - * Filter the query by a related CcBlock object - * - * @param CcBlock $ccBlock the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByCcBlock($ccBlock, $comparison = null) - { - return $this - ->addUsingAlias(CcSubjsPeer::ID, $ccBlock->getDbCreatorId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcBlock relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function joinCcBlock($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcBlock'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcBlock'); - } - - return $this; - } - - /** - * Use the CcBlock relation CcBlock object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcBlockQuery A secondary query class using the current class as primary query - */ - public function useCcBlockQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcBlock($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcBlock', 'CcBlockQuery'); - } - - /** - * Filter the query by a related CcPref object - * - * @param CcPref $ccPref the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByCcPref($ccPref, $comparison = null) - { - return $this - ->addUsingAlias(CcSubjsPeer::ID, $ccPref->getSubjid(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcPref relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function joinCcPref($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcPref'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcPref'); - } - - return $this; - } - - /** - * Use the CcPref relation CcPref object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcPrefQuery A secondary query class using the current class as primary query - */ - public function useCcPrefQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcPref($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcPref', 'CcPrefQuery'); - } - - /** - * Filter the query by a related CcSess object - * - * @param CcSess $ccSess the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByCcSess($ccSess, $comparison = null) - { - return $this - ->addUsingAlias(CcSubjsPeer::ID, $ccSess->getUserid(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSess relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function joinCcSess($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSess'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSess'); - } - - return $this; - } - - /** - * Use the CcSess relation CcSess object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSessQuery A secondary query class using the current class as primary query - */ - public function useCcSessQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcSess($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSess', 'CcSessQuery'); - } - - /** - * Filter the query by a related CcSubjsToken object - * - * @param CcSubjsToken $ccSubjsToken the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function filterByCcSubjsToken($ccSubjsToken, $comparison = null) - { - return $this - ->addUsingAlias(CcSubjsPeer::ID, $ccSubjsToken->getDbUserId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSubjsToken relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function joinCcSubjsToken($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSubjsToken'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSubjsToken'); - } - - return $this; - } - - /** - * Use the CcSubjsToken relation CcSubjsToken object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsTokenQuery A secondary query class using the current class as primary query - */ - public function useCcSubjsTokenQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcSubjsToken($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSubjsToken', 'CcSubjsTokenQuery'); - } - - /** - * Exclude object from result - * - * @param CcSubjs $ccSubjs Object to remove from the list of results - * - * @return CcSubjsQuery The current query, for fluid interface - */ - public function prune($ccSubjs = null) - { - if ($ccSubjs) { - $this->addUsingAlias(CcSubjsPeer::ID, $ccSubjs->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcSubjsQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSubjsToken.php b/airtime_mvc/application/models/airtime/om/BaseCcSubjsToken.php index e0a4ba9bbc..f1c3b4befc 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSubjsToken.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSubjsToken.php @@ -4,1002 +4,1130 @@ /** * Base class that represents a row from the 'cc_subjs_token' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcSubjsToken extends BaseObject implements Persistent +abstract class BaseCcSubjsToken extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcSubjsTokenPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcSubjsTokenPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the user_id field. - * @var int - */ - protected $user_id; - - /** - * The value for the action field. - * @var string - */ - protected $action; - - /** - * The value for the token field. - * @var string - */ - protected $token; - - /** - * The value for the created field. - * @var string - */ - protected $created; - - /** - * @var CcSubjs - */ - protected $aCcSubjs; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [user_id] column value. - * - * @return int - */ - public function getDbUserId() - { - return $this->user_id; - } - - /** - * Get the [action] column value. - * - * @return string - */ - public function getDbAction() - { - return $this->action; - } - - /** - * Get the [token] column value. - * - * @return string - */ - public function getDbToken() - { - return $this->token; - } - - /** - * Get the [optionally formatted] temporal [created] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbCreated($format = 'Y-m-d H:i:s') - { - if ($this->created === null) { - return null; - } - - - - try { - $dt = new DateTime($this->created); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->created, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcSubjsToken The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcSubjsTokenPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [user_id] column. - * - * @param int $v new value - * @return CcSubjsToken The current object (for fluent API support) - */ - public function setDbUserId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->user_id !== $v) { - $this->user_id = $v; - $this->modifiedColumns[] = CcSubjsTokenPeer::USER_ID; - } - - if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { - $this->aCcSubjs = null; - } - - return $this; - } // setDbUserId() - - /** - * Set the value of [action] column. - * - * @param string $v new value - * @return CcSubjsToken The current object (for fluent API support) - */ - public function setDbAction($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->action !== $v) { - $this->action = $v; - $this->modifiedColumns[] = CcSubjsTokenPeer::ACTION; - } - - return $this; - } // setDbAction() - - /** - * Set the value of [token] column. - * - * @param string $v new value - * @return CcSubjsToken The current object (for fluent API support) - */ - public function setDbToken($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->token !== $v) { - $this->token = $v; - $this->modifiedColumns[] = CcSubjsTokenPeer::TOKEN; - } - - return $this; - } // setDbToken() - - /** - * Sets the value of [created] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcSubjsToken The current object (for fluent API support) - */ - public function setDbCreated($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->created !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->created !== null && $tmpDt = new DateTime($this->created)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->created = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcSubjsTokenPeer::CREATED; - } - } // if either are not null - - return $this; - } // setDbCreated() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->user_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->action = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->token = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->created = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 5; // 5 = CcSubjsTokenPeer::NUM_COLUMNS - CcSubjsTokenPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcSubjsToken object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcSubjs !== null && $this->user_id !== $this->aCcSubjs->getDbId()) { - $this->aCcSubjs = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcSubjsTokenPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcSubjs = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcSubjsTokenQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcSubjsTokenPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSubjs !== null) { - if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { - $affectedRows += $this->aCcSubjs->save($con); - } - $this->setCcSubjs($this->aCcSubjs); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcSubjsTokenPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcSubjsTokenPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcSubjsTokenPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcSubjsTokenPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSubjs !== null) { - if (!$this->aCcSubjs->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); - } - } - - - if (($retval = CcSubjsTokenPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcSubjsTokenPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbUserId(); - break; - case 2: - return $this->getDbAction(); - break; - case 3: - return $this->getDbToken(); - break; - case 4: - return $this->getDbCreated(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcSubjsTokenPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbUserId(), - $keys[2] => $this->getDbAction(), - $keys[3] => $this->getDbToken(), - $keys[4] => $this->getDbCreated(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcSubjs) { - $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcSubjsTokenPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbUserId($value); - break; - case 2: - $this->setDbAction($value); - break; - case 3: - $this->setDbToken($value); - break; - case 4: - $this->setDbCreated($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcSubjsTokenPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbUserId($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbAction($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbToken($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbCreated($arr[$keys[4]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcSubjsTokenPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcSubjsTokenPeer::ID)) $criteria->add(CcSubjsTokenPeer::ID, $this->id); - if ($this->isColumnModified(CcSubjsTokenPeer::USER_ID)) $criteria->add(CcSubjsTokenPeer::USER_ID, $this->user_id); - if ($this->isColumnModified(CcSubjsTokenPeer::ACTION)) $criteria->add(CcSubjsTokenPeer::ACTION, $this->action); - if ($this->isColumnModified(CcSubjsTokenPeer::TOKEN)) $criteria->add(CcSubjsTokenPeer::TOKEN, $this->token); - if ($this->isColumnModified(CcSubjsTokenPeer::CREATED)) $criteria->add(CcSubjsTokenPeer::CREATED, $this->created); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcSubjsTokenPeer::DATABASE_NAME); - $criteria->add(CcSubjsTokenPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcSubjsToken (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbUserId($this->user_id); - $copyObj->setDbAction($this->action); - $copyObj->setDbToken($this->token); - $copyObj->setDbCreated($this->created); - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcSubjsToken Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcSubjsTokenPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcSubjsTokenPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcSubjs object. - * - * @param CcSubjs $v - * @return CcSubjsToken The current object (for fluent API support) - * @throws PropelException - */ - public function setCcSubjs(CcSubjs $v = null) - { - if ($v === null) { - $this->setDbUserId(NULL); - } else { - $this->setDbUserId($v->getDbId()); - } - - $this->aCcSubjs = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcSubjs object, it will not be re-added. - if ($v !== null) { - $v->addCcSubjsToken($this); - } - - return $this; - } - - - /** - * Get the associated CcSubjs object - * - * @param PropelPDO Optional Connection object. - * @return CcSubjs The associated CcSubjs object. - * @throws PropelException - */ - public function getCcSubjs(PropelPDO $con = null) - { - if ($this->aCcSubjs === null && ($this->user_id !== null)) { - $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->user_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcSubjs->addCcSubjsTokens($this); - */ - } - return $this->aCcSubjs; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->user_id = null; - $this->action = null; - $this->token = null; - $this->created = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcSubjs = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcSubjsToken + /** + * Peer class name + */ + const PEER = 'CcSubjsTokenPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcSubjsTokenPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the user_id field. + * @var int + */ + protected $user_id; + + /** + * The value for the action field. + * @var string + */ + protected $action; + + /** + * The value for the token field. + * @var string + */ + protected $token; + + /** + * The value for the created field. + * @var string + */ + protected $created; + + /** + * @var CcSubjs + */ + protected $aCcSubjs; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [user_id] column value. + * + * @return int + */ + public function getDbUserId() + { + + return $this->user_id; + } + + /** + * Get the [action] column value. + * + * @return string + */ + public function getDbAction() + { + + return $this->action; + } + + /** + * Get the [token] column value. + * + * @return string + */ + public function getDbToken() + { + + return $this->token; + } + + /** + * Get the [optionally formatted] temporal [created] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbCreated($format = 'Y-m-d H:i:s') + { + if ($this->created === null) { + return null; + } + + + try { + $dt = new DateTime($this->created); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->created, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcSubjsToken The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcSubjsTokenPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [user_id] column. + * + * @param int $v new value + * @return CcSubjsToken The current object (for fluent API support) + */ + public function setDbUserId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->user_id !== $v) { + $this->user_id = $v; + $this->modifiedColumns[] = CcSubjsTokenPeer::USER_ID; + } + + if ($this->aCcSubjs !== null && $this->aCcSubjs->getDbId() !== $v) { + $this->aCcSubjs = null; + } + + + return $this; + } // setDbUserId() + + /** + * Set the value of [action] column. + * + * @param string $v new value + * @return CcSubjsToken The current object (for fluent API support) + */ + public function setDbAction($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->action !== $v) { + $this->action = $v; + $this->modifiedColumns[] = CcSubjsTokenPeer::ACTION; + } + + + return $this; + } // setDbAction() + + /** + * Set the value of [token] column. + * + * @param string $v new value + * @return CcSubjsToken The current object (for fluent API support) + */ + public function setDbToken($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->token !== $v) { + $this->token = $v; + $this->modifiedColumns[] = CcSubjsTokenPeer::TOKEN; + } + + + return $this; + } // setDbToken() + + /** + * Sets the value of [created] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcSubjsToken The current object (for fluent API support) + */ + public function setDbCreated($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->created !== null || $dt !== null) { + $currentDateAsString = ($this->created !== null && $tmpDt = new DateTime($this->created)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->created = $newDateAsString; + $this->modifiedColumns[] = CcSubjsTokenPeer::CREATED; + } + } // if either are not null + + + return $this; + } // setDbCreated() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->user_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->action = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->token = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->created = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 5; // 5 = CcSubjsTokenPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcSubjsToken object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcSubjs !== null && $this->user_id !== $this->aCcSubjs->getDbId()) { + $this->aCcSubjs = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcSubjsTokenPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcSubjs = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcSubjsTokenQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcSubjsTokenPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSubjs !== null) { + if ($this->aCcSubjs->isModified() || $this->aCcSubjs->isNew()) { + $affectedRows += $this->aCcSubjs->save($con); + } + $this->setCcSubjs($this->aCcSubjs); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcSubjsTokenPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcSubjsTokenPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_subjs_token_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcSubjsTokenPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcSubjsTokenPeer::USER_ID)) { + $modifiedColumns[':p' . $index++] = '"user_id"'; + } + if ($this->isColumnModified(CcSubjsTokenPeer::ACTION)) { + $modifiedColumns[':p' . $index++] = '"action"'; + } + if ($this->isColumnModified(CcSubjsTokenPeer::TOKEN)) { + $modifiedColumns[':p' . $index++] = '"token"'; + } + if ($this->isColumnModified(CcSubjsTokenPeer::CREATED)) { + $modifiedColumns[':p' . $index++] = '"created"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_subjs_token" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"user_id"': + $stmt->bindValue($identifier, $this->user_id, PDO::PARAM_INT); + break; + case '"action"': + $stmt->bindValue($identifier, $this->action, PDO::PARAM_STR); + break; + case '"token"': + $stmt->bindValue($identifier, $this->token, PDO::PARAM_STR); + break; + case '"created"': + $stmt->bindValue($identifier, $this->created, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSubjs !== null) { + if (!$this->aCcSubjs->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcSubjs->getValidationFailures()); + } + } + + + if (($retval = CcSubjsTokenPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcSubjsTokenPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbUserId(); + break; + case 2: + return $this->getDbAction(); + break; + case 3: + return $this->getDbToken(); + break; + case 4: + return $this->getDbCreated(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcSubjsToken'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcSubjsToken'][$this->getPrimaryKey()] = true; + $keys = CcSubjsTokenPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbUserId(), + $keys[2] => $this->getDbAction(), + $keys[3] => $this->getDbToken(), + $keys[4] => $this->getDbCreated(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcSubjs) { + $result['CcSubjs'] = $this->aCcSubjs->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcSubjsTokenPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbUserId($value); + break; + case 2: + $this->setDbAction($value); + break; + case 3: + $this->setDbToken($value); + break; + case 4: + $this->setDbCreated($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcSubjsTokenPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbUserId($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbAction($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbToken($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbCreated($arr[$keys[4]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcSubjsTokenPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcSubjsTokenPeer::ID)) $criteria->add(CcSubjsTokenPeer::ID, $this->id); + if ($this->isColumnModified(CcSubjsTokenPeer::USER_ID)) $criteria->add(CcSubjsTokenPeer::USER_ID, $this->user_id); + if ($this->isColumnModified(CcSubjsTokenPeer::ACTION)) $criteria->add(CcSubjsTokenPeer::ACTION, $this->action); + if ($this->isColumnModified(CcSubjsTokenPeer::TOKEN)) $criteria->add(CcSubjsTokenPeer::TOKEN, $this->token); + if ($this->isColumnModified(CcSubjsTokenPeer::CREATED)) $criteria->add(CcSubjsTokenPeer::CREATED, $this->created); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcSubjsTokenPeer::DATABASE_NAME); + $criteria->add(CcSubjsTokenPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcSubjsToken (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbUserId($this->getDbUserId()); + $copyObj->setDbAction($this->getDbAction()); + $copyObj->setDbToken($this->getDbToken()); + $copyObj->setDbCreated($this->getDbCreated()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcSubjsToken Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcSubjsTokenPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcSubjsTokenPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcSubjs object. + * + * @param CcSubjs $v + * @return CcSubjsToken The current object (for fluent API support) + * @throws PropelException + */ + public function setCcSubjs(CcSubjs $v = null) + { + if ($v === null) { + $this->setDbUserId(NULL); + } else { + $this->setDbUserId($v->getDbId()); + } + + $this->aCcSubjs = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcSubjs object, it will not be re-added. + if ($v !== null) { + $v->addCcSubjsToken($this); + } + + + return $this; + } + + + /** + * Get the associated CcSubjs object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcSubjs The associated CcSubjs object. + * @throws PropelException + */ + public function getCcSubjs(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcSubjs === null && ($this->user_id !== null) && $doQuery) { + $this->aCcSubjs = CcSubjsQuery::create()->findPk($this->user_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcSubjs->addCcSubjsTokens($this); + */ + } + + return $this->aCcSubjs; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->user_id = null; + $this->action = null; + $this->token = null; + $this->created = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcSubjs instanceof Persistent) { + $this->aCcSubjs->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcSubjs = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcSubjsTokenPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSubjsTokenPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcSubjsTokenPeer.php index 7f08ba6a71..f8c54b2c0c 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSubjsTokenPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSubjsTokenPeer.php @@ -4,981 +4,1007 @@ /** * Base static class for performing query and update operations on the 'cc_subjs_token' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcSubjsTokenPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_subjs_token'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcSubjsToken'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcSubjsToken'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcSubjsTokenTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 5; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_subjs_token.ID'; - - /** the column name for the USER_ID field */ - const USER_ID = 'cc_subjs_token.USER_ID'; - - /** the column name for the ACTION field */ - const ACTION = 'cc_subjs_token.ACTION'; - - /** the column name for the TOKEN field */ - const TOKEN = 'cc_subjs_token.TOKEN'; - - /** the column name for the CREATED field */ - const CREATED = 'cc_subjs_token.CREATED'; - - /** - * An identiy map to hold any loaded instances of CcSubjsToken objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcSubjsToken[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbUserId', 'DbAction', 'DbToken', 'DbCreated', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbUserId', 'dbAction', 'dbToken', 'dbCreated', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::USER_ID, self::ACTION, self::TOKEN, self::CREATED, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'USER_ID', 'ACTION', 'TOKEN', 'CREATED', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'user_id', 'action', 'token', 'created', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbUserId' => 1, 'DbAction' => 2, 'DbToken' => 3, 'DbCreated' => 4, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbUserId' => 1, 'dbAction' => 2, 'dbToken' => 3, 'dbCreated' => 4, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::USER_ID => 1, self::ACTION => 2, self::TOKEN => 3, self::CREATED => 4, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'USER_ID' => 1, 'ACTION' => 2, 'TOKEN' => 3, 'CREATED' => 4, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'user_id' => 1, 'action' => 2, 'token' => 3, 'created' => 4, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcSubjsTokenPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcSubjsTokenPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcSubjsTokenPeer::ID); - $criteria->addSelectColumn(CcSubjsTokenPeer::USER_ID); - $criteria->addSelectColumn(CcSubjsTokenPeer::ACTION); - $criteria->addSelectColumn(CcSubjsTokenPeer::TOKEN); - $criteria->addSelectColumn(CcSubjsTokenPeer::CREATED); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.USER_ID'); - $criteria->addSelectColumn($alias . '.ACTION'); - $criteria->addSelectColumn($alias . '.TOKEN'); - $criteria->addSelectColumn($alias . '.CREATED'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSubjsTokenPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSubjsTokenPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcSubjsToken - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcSubjsTokenPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcSubjsTokenPeer::populateObjects(CcSubjsTokenPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcSubjsTokenPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcSubjsToken $value A CcSubjsToken object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcSubjsToken $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcSubjsToken object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcSubjsToken) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcSubjsToken object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcSubjsToken Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_subjs_token - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcSubjsTokenPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcSubjsTokenPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcSubjsTokenPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcSubjsTokenPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcSubjsToken object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcSubjsTokenPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcSubjsTokenPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcSubjsTokenPeer::NUM_COLUMNS; - } else { - $cls = CcSubjsTokenPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcSubjsTokenPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcSubjs table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSubjsTokenPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSubjsTokenPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcSubjsTokenPeer::USER_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcSubjsToken objects pre-filled with their CcSubjs objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcSubjsToken objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcSubjsTokenPeer::addSelectColumns($criteria); - $startcol = (CcSubjsTokenPeer::NUM_COLUMNS - CcSubjsTokenPeer::NUM_LAZY_LOAD_COLUMNS); - CcSubjsPeer::addSelectColumns($criteria); - - $criteria->addJoin(CcSubjsTokenPeer::USER_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcSubjsTokenPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcSubjsTokenPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcSubjsTokenPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcSubjsTokenPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcSubjsToken) to $obj2 (CcSubjs) - $obj2->addCcSubjsToken($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcSubjsTokenPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcSubjsTokenPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcSubjsTokenPeer::USER_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcSubjsToken objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcSubjsToken objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcSubjsTokenPeer::addSelectColumns($criteria); - $startcol2 = (CcSubjsTokenPeer::NUM_COLUMNS - CcSubjsTokenPeer::NUM_LAZY_LOAD_COLUMNS); - - CcSubjsPeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcSubjsPeer::NUM_COLUMNS - CcSubjsPeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcSubjsTokenPeer::USER_ID, CcSubjsPeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcSubjsTokenPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcSubjsTokenPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcSubjsTokenPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcSubjsTokenPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcSubjs rows - - $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcSubjsPeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSubjsPeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcSubjsPeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcSubjsToken) to the collection in $obj2 (CcSubjs) - $obj2->addCcSubjsToken($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcSubjsTokenPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcSubjsTokenPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcSubjsTokenTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcSubjsTokenPeer::CLASS_DEFAULT : CcSubjsTokenPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcSubjsToken or Criteria object. - * - * @param mixed $values Criteria or CcSubjsToken object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcSubjsToken object - } - - if ($criteria->containsKey(CcSubjsTokenPeer::ID) && $criteria->keyContainsValue(CcSubjsTokenPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcSubjsTokenPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcSubjsToken or Criteria object. - * - * @param mixed $values Criteria or CcSubjsToken object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcSubjsTokenPeer::ID); - $value = $criteria->remove(CcSubjsTokenPeer::ID); - if ($value) { - $selectCriteria->add(CcSubjsTokenPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcSubjsTokenPeer::TABLE_NAME); - } - - } else { // $values is CcSubjsToken object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_subjs_token table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcSubjsTokenPeer::TABLE_NAME, $con, CcSubjsTokenPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcSubjsTokenPeer::clearInstancePool(); - CcSubjsTokenPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcSubjsToken or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcSubjsToken object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcSubjsTokenPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcSubjsToken) { // it's a model object - // invalidate the cache for this single object - CcSubjsTokenPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcSubjsTokenPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcSubjsTokenPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcSubjsTokenPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcSubjsToken object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcSubjsToken $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcSubjsToken $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcSubjsTokenPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcSubjsTokenPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcSubjsTokenPeer::DATABASE_NAME, CcSubjsTokenPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcSubjsToken - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcSubjsTokenPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcSubjsTokenPeer::DATABASE_NAME); - $criteria->add(CcSubjsTokenPeer::ID, $pk); - - $v = CcSubjsTokenPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcSubjsTokenPeer::DATABASE_NAME); - $criteria->add(CcSubjsTokenPeer::ID, $pks, Criteria::IN); - $objs = CcSubjsTokenPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcSubjsTokenPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_subjs_token'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcSubjsToken'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcSubjsTokenTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 5; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 5; + + /** the column name for the id field */ + const ID = 'cc_subjs_token.id'; + + /** the column name for the user_id field */ + const USER_ID = 'cc_subjs_token.user_id'; + + /** the column name for the action field */ + const ACTION = 'cc_subjs_token.action'; + + /** the column name for the token field */ + const TOKEN = 'cc_subjs_token.token'; + + /** the column name for the created field */ + const CREATED = 'cc_subjs_token.created'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcSubjsToken objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcSubjsToken[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcSubjsTokenPeer::$fieldNames[CcSubjsTokenPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbUserId', 'DbAction', 'DbToken', 'DbCreated', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbUserId', 'dbAction', 'dbToken', 'dbCreated', ), + BasePeer::TYPE_COLNAME => array (CcSubjsTokenPeer::ID, CcSubjsTokenPeer::USER_ID, CcSubjsTokenPeer::ACTION, CcSubjsTokenPeer::TOKEN, CcSubjsTokenPeer::CREATED, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'USER_ID', 'ACTION', 'TOKEN', 'CREATED', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'user_id', 'action', 'token', 'created', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcSubjsTokenPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbUserId' => 1, 'DbAction' => 2, 'DbToken' => 3, 'DbCreated' => 4, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbUserId' => 1, 'dbAction' => 2, 'dbToken' => 3, 'dbCreated' => 4, ), + BasePeer::TYPE_COLNAME => array (CcSubjsTokenPeer::ID => 0, CcSubjsTokenPeer::USER_ID => 1, CcSubjsTokenPeer::ACTION => 2, CcSubjsTokenPeer::TOKEN => 3, CcSubjsTokenPeer::CREATED => 4, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'USER_ID' => 1, 'ACTION' => 2, 'TOKEN' => 3, 'CREATED' => 4, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'user_id' => 1, 'action' => 2, 'token' => 3, 'created' => 4, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcSubjsTokenPeer::getFieldNames($toType); + $key = isset(CcSubjsTokenPeer::$fieldKeys[$fromType][$name]) ? CcSubjsTokenPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcSubjsTokenPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcSubjsTokenPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcSubjsTokenPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcSubjsTokenPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcSubjsTokenPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcSubjsTokenPeer::ID); + $criteria->addSelectColumn(CcSubjsTokenPeer::USER_ID); + $criteria->addSelectColumn(CcSubjsTokenPeer::ACTION); + $criteria->addSelectColumn(CcSubjsTokenPeer::TOKEN); + $criteria->addSelectColumn(CcSubjsTokenPeer::CREATED); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.user_id'); + $criteria->addSelectColumn($alias . '.action'); + $criteria->addSelectColumn($alias . '.token'); + $criteria->addSelectColumn($alias . '.created'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSubjsTokenPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSubjsTokenPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcSubjsTokenPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcSubjsToken + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcSubjsTokenPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcSubjsTokenPeer::populateObjects(CcSubjsTokenPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcSubjsTokenPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcSubjsTokenPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcSubjsToken $obj A CcSubjsToken object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcSubjsTokenPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcSubjsToken object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcSubjsToken) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcSubjsToken object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcSubjsTokenPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcSubjsToken Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcSubjsTokenPeer::$instances[$key])) { + return CcSubjsTokenPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcSubjsTokenPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcSubjsTokenPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_subjs_token + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcSubjsTokenPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcSubjsTokenPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcSubjsTokenPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcSubjsTokenPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcSubjsToken object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcSubjsTokenPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcSubjsTokenPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcSubjsTokenPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcSubjsTokenPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcSubjsTokenPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcSubjs table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcSubjs(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSubjsTokenPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSubjsTokenPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcSubjsTokenPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcSubjsTokenPeer::USER_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcSubjsToken objects pre-filled with their CcSubjs objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcSubjsToken objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcSubjs(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcSubjsTokenPeer::DATABASE_NAME); + } + + CcSubjsTokenPeer::addSelectColumns($criteria); + $startcol = CcSubjsTokenPeer::NUM_HYDRATE_COLUMNS; + CcSubjsPeer::addSelectColumns($criteria); + + $criteria->addJoin(CcSubjsTokenPeer::USER_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcSubjsTokenPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcSubjsTokenPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcSubjsTokenPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcSubjsTokenPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcSubjsToken) to $obj2 (CcSubjs) + $obj2->addCcSubjsToken($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcSubjsTokenPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcSubjsTokenPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcSubjsTokenPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcSubjsTokenPeer::USER_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcSubjsToken objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcSubjsToken objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcSubjsTokenPeer::DATABASE_NAME); + } + + CcSubjsTokenPeer::addSelectColumns($criteria); + $startcol2 = CcSubjsTokenPeer::NUM_HYDRATE_COLUMNS; + + CcSubjsPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcSubjsPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcSubjsTokenPeer::USER_ID, CcSubjsPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcSubjsTokenPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcSubjsTokenPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcSubjsTokenPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcSubjsTokenPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcSubjs rows + + $key2 = CcSubjsPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcSubjsPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSubjsPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcSubjsPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcSubjsToken) to the collection in $obj2 (CcSubjs) + $obj2->addCcSubjsToken($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcSubjsTokenPeer::DATABASE_NAME)->getTable(CcSubjsTokenPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcSubjsTokenPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcSubjsTokenPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcSubjsTokenTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcSubjsTokenPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcSubjsToken or Criteria object. + * + * @param mixed $values Criteria or CcSubjsToken object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcSubjsToken object + } + + if ($criteria->containsKey(CcSubjsTokenPeer::ID) && $criteria->keyContainsValue(CcSubjsTokenPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcSubjsTokenPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcSubjsTokenPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcSubjsToken or Criteria object. + * + * @param mixed $values Criteria or CcSubjsToken object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcSubjsTokenPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcSubjsTokenPeer::ID); + $value = $criteria->remove(CcSubjsTokenPeer::ID); + if ($value) { + $selectCriteria->add(CcSubjsTokenPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcSubjsTokenPeer::TABLE_NAME); + } + + } else { // $values is CcSubjsToken object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcSubjsTokenPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_subjs_token table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcSubjsTokenPeer::TABLE_NAME, $con, CcSubjsTokenPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcSubjsTokenPeer::clearInstancePool(); + CcSubjsTokenPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcSubjsToken or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcSubjsToken object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcSubjsTokenPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcSubjsToken) { // it's a model object + // invalidate the cache for this single object + CcSubjsTokenPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcSubjsTokenPeer::DATABASE_NAME); + $criteria->add(CcSubjsTokenPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcSubjsTokenPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcSubjsTokenPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcSubjsTokenPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcSubjsToken object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcSubjsToken $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcSubjsTokenPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcSubjsTokenPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcSubjsTokenPeer::DATABASE_NAME, CcSubjsTokenPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcSubjsToken + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcSubjsTokenPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcSubjsTokenPeer::DATABASE_NAME); + $criteria->add(CcSubjsTokenPeer::ID, $pk); + + $v = CcSubjsTokenPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcSubjsToken[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcSubjsTokenPeer::DATABASE_NAME); + $criteria->add(CcSubjsTokenPeer::ID, $pks, Criteria::IN); + $objs = CcSubjsTokenPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcSubjsTokenPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcSubjsTokenQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcSubjsTokenQuery.php index c2ee6f7bf5..7906cec5a2 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcSubjsTokenQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcSubjsTokenQuery.php @@ -4,352 +4,514 @@ /** * Base class that represents a query for the 'cc_subjs_token' table. * - * * - * @method CcSubjsTokenQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcSubjsTokenQuery orderByDbUserId($order = Criteria::ASC) Order by the user_id column - * @method CcSubjsTokenQuery orderByDbAction($order = Criteria::ASC) Order by the action column - * @method CcSubjsTokenQuery orderByDbToken($order = Criteria::ASC) Order by the token column - * @method CcSubjsTokenQuery orderByDbCreated($order = Criteria::ASC) Order by the created column * - * @method CcSubjsTokenQuery groupByDbId() Group by the id column - * @method CcSubjsTokenQuery groupByDbUserId() Group by the user_id column - * @method CcSubjsTokenQuery groupByDbAction() Group by the action column - * @method CcSubjsTokenQuery groupByDbToken() Group by the token column - * @method CcSubjsTokenQuery groupByDbCreated() Group by the created column + * @method CcSubjsTokenQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcSubjsTokenQuery orderByDbUserId($order = Criteria::ASC) Order by the user_id column + * @method CcSubjsTokenQuery orderByDbAction($order = Criteria::ASC) Order by the action column + * @method CcSubjsTokenQuery orderByDbToken($order = Criteria::ASC) Order by the token column + * @method CcSubjsTokenQuery orderByDbCreated($order = Criteria::ASC) Order by the created column * - * @method CcSubjsTokenQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcSubjsTokenQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcSubjsTokenQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcSubjsTokenQuery groupByDbId() Group by the id column + * @method CcSubjsTokenQuery groupByDbUserId() Group by the user_id column + * @method CcSubjsTokenQuery groupByDbAction() Group by the action column + * @method CcSubjsTokenQuery groupByDbToken() Group by the token column + * @method CcSubjsTokenQuery groupByDbCreated() Group by the created column * - * @method CcSubjsTokenQuery leftJoinCcSubjs($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSubjs relation - * @method CcSubjsTokenQuery rightJoinCcSubjs($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSubjs relation - * @method CcSubjsTokenQuery innerJoinCcSubjs($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSubjs relation + * @method CcSubjsTokenQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcSubjsTokenQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcSubjsTokenQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcSubjsToken findOne(PropelPDO $con = null) Return the first CcSubjsToken matching the query - * @method CcSubjsToken findOneOrCreate(PropelPDO $con = null) Return the first CcSubjsToken matching the query, or a new CcSubjsToken object populated from the query conditions when no match is found + * @method CcSubjsTokenQuery leftJoinCcSubjs($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSubjs relation + * @method CcSubjsTokenQuery rightJoinCcSubjs($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSubjs relation + * @method CcSubjsTokenQuery innerJoinCcSubjs($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSubjs relation * - * @method CcSubjsToken findOneByDbId(int $id) Return the first CcSubjsToken filtered by the id column - * @method CcSubjsToken findOneByDbUserId(int $user_id) Return the first CcSubjsToken filtered by the user_id column - * @method CcSubjsToken findOneByDbAction(string $action) Return the first CcSubjsToken filtered by the action column - * @method CcSubjsToken findOneByDbToken(string $token) Return the first CcSubjsToken filtered by the token column - * @method CcSubjsToken findOneByDbCreated(string $created) Return the first CcSubjsToken filtered by the created column + * @method CcSubjsToken findOne(PropelPDO $con = null) Return the first CcSubjsToken matching the query + * @method CcSubjsToken findOneOrCreate(PropelPDO $con = null) Return the first CcSubjsToken matching the query, or a new CcSubjsToken object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcSubjsToken objects filtered by the id column - * @method array findByDbUserId(int $user_id) Return CcSubjsToken objects filtered by the user_id column - * @method array findByDbAction(string $action) Return CcSubjsToken objects filtered by the action column - * @method array findByDbToken(string $token) Return CcSubjsToken objects filtered by the token column - * @method array findByDbCreated(string $created) Return CcSubjsToken objects filtered by the created column + * @method CcSubjsToken findOneByDbUserId(int $user_id) Return the first CcSubjsToken filtered by the user_id column + * @method CcSubjsToken findOneByDbAction(string $action) Return the first CcSubjsToken filtered by the action column + * @method CcSubjsToken findOneByDbToken(string $token) Return the first CcSubjsToken filtered by the token column + * @method CcSubjsToken findOneByDbCreated(string $created) Return the first CcSubjsToken filtered by the created column + * + * @method array findByDbId(int $id) Return CcSubjsToken objects filtered by the id column + * @method array findByDbUserId(int $user_id) Return CcSubjsToken objects filtered by the user_id column + * @method array findByDbAction(string $action) Return CcSubjsToken objects filtered by the action column + * @method array findByDbToken(string $token) Return CcSubjsToken objects filtered by the token column + * @method array findByDbCreated(string $created) Return CcSubjsToken objects filtered by the created column * * @package propel.generator.airtime.om */ abstract class BaseCcSubjsTokenQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcSubjsTokenQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcSubjsToken'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcSubjsTokenQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcSubjsTokenQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcSubjsTokenQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcSubjsTokenQuery) { + return $criteria; + } + $query = new CcSubjsTokenQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcSubjsToken|CcSubjsToken[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcSubjsTokenPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcSubjsTokenPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSubjsToken A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSubjsToken A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "user_id", "action", "token", "created" FROM "cc_subjs_token" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcSubjsToken(); + $obj->hydrate($row); + CcSubjsTokenPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcSubjsToken|CcSubjsToken[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcSubjsToken[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcSubjsTokenQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcSubjsTokenPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcSubjsTokenQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcSubjsTokenPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsTokenQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcSubjsTokenPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcSubjsTokenPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSubjsTokenPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the user_id column + * + * Example usage: + * + * $query->filterByDbUserId(1234); // WHERE user_id = 1234 + * $query->filterByDbUserId(array(12, 34)); // WHERE user_id IN (12, 34) + * $query->filterByDbUserId(array('min' => 12)); // WHERE user_id >= 12 + * $query->filterByDbUserId(array('max' => 12)); // WHERE user_id <= 12 + * + * + * @see filterByCcSubjs() + * + * @param mixed $dbUserId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsTokenQuery The current query, for fluid interface + */ + public function filterByDbUserId($dbUserId = null, $comparison = null) + { + if (is_array($dbUserId)) { + $useMinMax = false; + if (isset($dbUserId['min'])) { + $this->addUsingAlias(CcSubjsTokenPeer::USER_ID, $dbUserId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbUserId['max'])) { + $this->addUsingAlias(CcSubjsTokenPeer::USER_ID, $dbUserId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSubjsTokenPeer::USER_ID, $dbUserId, $comparison); + } + + /** + * Filter the query on the action column + * + * Example usage: + * + * $query->filterByDbAction('fooValue'); // WHERE action = 'fooValue' + * $query->filterByDbAction('%fooValue%'); // WHERE action LIKE '%fooValue%' + * + * + * @param string $dbAction The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsTokenQuery The current query, for fluid interface + */ + public function filterByDbAction($dbAction = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbAction)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbAction)) { + $dbAction = str_replace('*', '%', $dbAction); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSubjsTokenPeer::ACTION, $dbAction, $comparison); + } + + /** + * Filter the query on the token column + * + * Example usage: + * + * $query->filterByDbToken('fooValue'); // WHERE token = 'fooValue' + * $query->filterByDbToken('%fooValue%'); // WHERE token LIKE '%fooValue%' + * + * + * @param string $dbToken The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsTokenQuery The current query, for fluid interface + */ + public function filterByDbToken($dbToken = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbToken)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbToken)) { + $dbToken = str_replace('*', '%', $dbToken); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcSubjsTokenPeer::TOKEN, $dbToken, $comparison); + } + + /** + * Filter the query on the created column + * + * Example usage: + * + * $query->filterByDbCreated('2011-03-14'); // WHERE created = '2011-03-14' + * $query->filterByDbCreated('now'); // WHERE created = '2011-03-14' + * $query->filterByDbCreated(array('max' => 'yesterday')); // WHERE created < '2011-03-13' + * + * + * @param mixed $dbCreated The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsTokenQuery The current query, for fluid interface + */ + public function filterByDbCreated($dbCreated = null, $comparison = null) + { + if (is_array($dbCreated)) { + $useMinMax = false; + if (isset($dbCreated['min'])) { + $this->addUsingAlias(CcSubjsTokenPeer::CREATED, $dbCreated['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbCreated['max'])) { + $this->addUsingAlias(CcSubjsTokenPeer::CREATED, $dbCreated['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcSubjsTokenPeer::CREATED, $dbCreated, $comparison); + } + + /** + * Filter the query by a related CcSubjs object + * + * @param CcSubjs|PropelObjectCollection $ccSubjs The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcSubjsTokenQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSubjs($ccSubjs, $comparison = null) + { + if ($ccSubjs instanceof CcSubjs) { + return $this + ->addUsingAlias(CcSubjsTokenPeer::USER_ID, $ccSubjs->getDbId(), $comparison); + } elseif ($ccSubjs instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcSubjsTokenPeer::USER_ID, $ccSubjs->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcSubjs() only accepts arguments of type CcSubjs or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSubjs relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsTokenQuery The current query, for fluid interface + */ + public function joinCcSubjs($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSubjs'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSubjs'); + } + + return $this; + } + + /** + * Use the CcSubjs relation CcSubjs object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcSubjsQuery A secondary query class using the current class as primary query + */ + public function useCcSubjsQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcSubjs($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); + } + + /** + * Exclude object from result + * + * @param CcSubjsToken $ccSubjsToken Object to remove from the list of results + * + * @return CcSubjsTokenQuery The current query, for fluid interface + */ + public function prune($ccSubjsToken = null) + { + if ($ccSubjsToken) { + $this->addUsingAlias(CcSubjsTokenPeer::ID, $ccSubjsToken->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcSubjsTokenQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcSubjsToken', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcSubjsTokenQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcSubjsTokenQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcSubjsTokenQuery) { - return $criteria; - } - $query = new CcSubjsTokenQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcSubjsToken|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcSubjsTokenPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcSubjsTokenQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcSubjsTokenPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcSubjsTokenQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcSubjsTokenPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsTokenQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcSubjsTokenPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the user_id column - * - * @param int|array $dbUserId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsTokenQuery The current query, for fluid interface - */ - public function filterByDbUserId($dbUserId = null, $comparison = null) - { - if (is_array($dbUserId)) { - $useMinMax = false; - if (isset($dbUserId['min'])) { - $this->addUsingAlias(CcSubjsTokenPeer::USER_ID, $dbUserId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbUserId['max'])) { - $this->addUsingAlias(CcSubjsTokenPeer::USER_ID, $dbUserId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSubjsTokenPeer::USER_ID, $dbUserId, $comparison); - } - - /** - * Filter the query on the action column - * - * @param string $dbAction The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsTokenQuery The current query, for fluid interface - */ - public function filterByDbAction($dbAction = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbAction)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbAction)) { - $dbAction = str_replace('*', '%', $dbAction); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSubjsTokenPeer::ACTION, $dbAction, $comparison); - } - - /** - * Filter the query on the token column - * - * @param string $dbToken The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsTokenQuery The current query, for fluid interface - */ - public function filterByDbToken($dbToken = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbToken)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbToken)) { - $dbToken = str_replace('*', '%', $dbToken); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcSubjsTokenPeer::TOKEN, $dbToken, $comparison); - } - - /** - * Filter the query on the created column - * - * @param string|array $dbCreated The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsTokenQuery The current query, for fluid interface - */ - public function filterByDbCreated($dbCreated = null, $comparison = null) - { - if (is_array($dbCreated)) { - $useMinMax = false; - if (isset($dbCreated['min'])) { - $this->addUsingAlias(CcSubjsTokenPeer::CREATED, $dbCreated['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbCreated['max'])) { - $this->addUsingAlias(CcSubjsTokenPeer::CREATED, $dbCreated['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcSubjsTokenPeer::CREATED, $dbCreated, $comparison); - } - - /** - * Filter the query by a related CcSubjs object - * - * @param CcSubjs $ccSubjs the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcSubjsTokenQuery The current query, for fluid interface - */ - public function filterByCcSubjs($ccSubjs, $comparison = null) - { - return $this - ->addUsingAlias(CcSubjsTokenPeer::USER_ID, $ccSubjs->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSubjs relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsTokenQuery The current query, for fluid interface - */ - public function joinCcSubjs($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSubjs'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSubjs'); - } - - return $this; - } - - /** - * Use the CcSubjs relation CcSubjs object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcSubjsQuery A secondary query class using the current class as primary query - */ - public function useCcSubjsQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcSubjs($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSubjs', 'CcSubjsQuery'); - } - - /** - * Exclude object from result - * - * @param CcSubjsToken $ccSubjsToken Object to remove from the list of results - * - * @return CcSubjsTokenQuery The current query, for fluid interface - */ - public function prune($ccSubjsToken = null) - { - if ($ccSubjsToken) { - $this->addUsingAlias(CcSubjsTokenPeer::ID, $ccSubjsToken->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcSubjsTokenQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcTimestamp.php b/airtime_mvc/application/models/airtime/om/BaseCcTimestamp.php index d61b8e5135..dd0afc5885 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcTimestamp.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcTimestamp.php @@ -4,942 +4,1189 @@ /** * Base class that represents a row from the 'cc_timestamp' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcTimestamp extends BaseObject implements Persistent +abstract class BaseCcTimestamp extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcTimestampPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcTimestampPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the timestamp field. - * @var string - */ - protected $timestamp; - - /** - * @var array CcListenerCount[] Collection to store aggregation of CcListenerCount objects. - */ - protected $collCcListenerCounts; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [optionally formatted] temporal [timestamp] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbTimestamp($format = 'Y-m-d H:i:s') - { - if ($this->timestamp === null) { - return null; - } - - - - try { - $dt = new DateTime($this->timestamp); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->timestamp, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcTimestamp The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcTimestampPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Sets the value of [timestamp] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcTimestamp The current object (for fluent API support) - */ - public function setDbTimestamp($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->timestamp !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->timestamp !== null && $tmpDt = new DateTime($this->timestamp)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->timestamp = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcTimestampPeer::TIMESTAMP; - } - } // if either are not null - - return $this; - } // setDbTimestamp() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->timestamp = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 2; // 2 = CcTimestampPeer::NUM_COLUMNS - CcTimestampPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcTimestamp object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcTimestampPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->collCcListenerCounts = null; - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcTimestampQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcTimestampPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcTimestampPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcTimestampPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcTimestampPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows = CcTimestampPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - if ($this->collCcListenerCounts !== null) { - foreach ($this->collCcListenerCounts as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcTimestampPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - if ($this->collCcListenerCounts !== null) { - foreach ($this->collCcListenerCounts as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcTimestampPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbTimestamp(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcTimestampPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbTimestamp(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcTimestampPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbTimestamp($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcTimestampPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbTimestamp($arr[$keys[1]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcTimestampPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcTimestampPeer::ID)) $criteria->add(CcTimestampPeer::ID, $this->id); - if ($this->isColumnModified(CcTimestampPeer::TIMESTAMP)) $criteria->add(CcTimestampPeer::TIMESTAMP, $this->timestamp); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcTimestampPeer::DATABASE_NAME); - $criteria->add(CcTimestampPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcTimestamp (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbTimestamp($this->timestamp); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getCcListenerCounts() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcListenerCount($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcTimestamp Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcTimestampPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcTimestampPeer(); - } - return self::$peer; - } - - /** - * Clears out the collCcListenerCounts collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcListenerCounts() - */ - public function clearCcListenerCounts() - { - $this->collCcListenerCounts = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcListenerCounts collection. - * - * By default this just sets the collCcListenerCounts collection to an empty array (like clearcollCcListenerCounts()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcListenerCounts() - { - $this->collCcListenerCounts = new PropelObjectCollection(); - $this->collCcListenerCounts->setModel('CcListenerCount'); - } - - /** - * Gets an array of CcListenerCount objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcTimestamp is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcListenerCount[] List of CcListenerCount objects - * @throws PropelException - */ - public function getCcListenerCounts($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcListenerCounts || null !== $criteria) { - if ($this->isNew() && null === $this->collCcListenerCounts) { - // return empty collection - $this->initCcListenerCounts(); - } else { - $collCcListenerCounts = CcListenerCountQuery::create(null, $criteria) - ->filterByCcTimestamp($this) - ->find($con); - if (null !== $criteria) { - return $collCcListenerCounts; - } - $this->collCcListenerCounts = $collCcListenerCounts; - } - } - return $this->collCcListenerCounts; - } - - /** - * Returns the number of related CcListenerCount objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcListenerCount objects. - * @throws PropelException - */ - public function countCcListenerCounts(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcListenerCounts || null !== $criteria) { - if ($this->isNew() && null === $this->collCcListenerCounts) { - return 0; - } else { - $query = CcListenerCountQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcTimestamp($this) - ->count($con); - } - } else { - return count($this->collCcListenerCounts); - } - } - - /** - * Method called to associate a CcListenerCount object to this object - * through the CcListenerCount foreign key attribute. - * - * @param CcListenerCount $l CcListenerCount - * @return void - * @throws PropelException - */ - public function addCcListenerCount(CcListenerCount $l) - { - if ($this->collCcListenerCounts === null) { - $this->initCcListenerCounts(); - } - if (!$this->collCcListenerCounts->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcListenerCounts[]= $l; - $l->setCcTimestamp($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcTimestamp is new, it will return - * an empty collection; or if this CcTimestamp has previously - * been saved, it will retrieve related CcListenerCounts from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcTimestamp. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcListenerCount[] List of CcListenerCount objects - */ - public function getCcListenerCountsJoinCcMountName($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcListenerCountQuery::create(null, $criteria); - $query->joinWith('CcMountName', $join_behavior); - - return $this->getCcListenerCounts($query, $con); - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->timestamp = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - if ($this->collCcListenerCounts) { - foreach ((array) $this->collCcListenerCounts as $o) { - $o->clearAllReferences($deep); - } - } - } // if ($deep) - - $this->collCcListenerCounts = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcTimestamp + /** + * Peer class name + */ + const PEER = 'CcTimestampPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcTimestampPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the timestamp field. + * @var string + */ + protected $timestamp; + + /** + * @var PropelObjectCollection|CcListenerCount[] Collection to store aggregation of CcListenerCount objects. + */ + protected $collCcListenerCounts; + protected $collCcListenerCountsPartial; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccListenerCountsScheduledForDeletion = null; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [optionally formatted] temporal [timestamp] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbTimestamp($format = 'Y-m-d H:i:s') + { + if ($this->timestamp === null) { + return null; + } + + + try { + $dt = new DateTime($this->timestamp); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->timestamp, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcTimestamp The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcTimestampPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Sets the value of [timestamp] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcTimestamp The current object (for fluent API support) + */ + public function setDbTimestamp($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->timestamp !== null || $dt !== null) { + $currentDateAsString = ($this->timestamp !== null && $tmpDt = new DateTime($this->timestamp)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->timestamp = $newDateAsString; + $this->modifiedColumns[] = CcTimestampPeer::TIMESTAMP; + } + } // if either are not null + + + return $this; + } // setDbTimestamp() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->timestamp = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 2; // 2 = CcTimestampPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcTimestamp object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcTimestampPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->collCcListenerCounts = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcTimestampQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcTimestampPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->ccListenerCountsScheduledForDeletion !== null) { + if (!$this->ccListenerCountsScheduledForDeletion->isEmpty()) { + CcListenerCountQuery::create() + ->filterByPrimaryKeys($this->ccListenerCountsScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccListenerCountsScheduledForDeletion = null; + } + } + + if ($this->collCcListenerCounts !== null) { + foreach ($this->collCcListenerCounts as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcTimestampPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcTimestampPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_timestamp_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcTimestampPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcTimestampPeer::TIMESTAMP)) { + $modifiedColumns[':p' . $index++] = '"timestamp"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_timestamp" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"timestamp"': + $stmt->bindValue($identifier, $this->timestamp, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcTimestampPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + if ($this->collCcListenerCounts !== null) { + foreach ($this->collCcListenerCounts as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcTimestampPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbTimestamp(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcTimestamp'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcTimestamp'][$this->getPrimaryKey()] = true; + $keys = CcTimestampPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbTimestamp(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->collCcListenerCounts) { + $result['CcListenerCounts'] = $this->collCcListenerCounts->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcTimestampPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbTimestamp($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcTimestampPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbTimestamp($arr[$keys[1]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcTimestampPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcTimestampPeer::ID)) $criteria->add(CcTimestampPeer::ID, $this->id); + if ($this->isColumnModified(CcTimestampPeer::TIMESTAMP)) $criteria->add(CcTimestampPeer::TIMESTAMP, $this->timestamp); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcTimestampPeer::DATABASE_NAME); + $criteria->add(CcTimestampPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcTimestamp (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbTimestamp($this->getDbTimestamp()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + foreach ($this->getCcListenerCounts() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcListenerCount($relObj->copy($deepCopy)); + } + } + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcTimestamp Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcTimestampPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcTimestampPeer(); + } + + return self::$peer; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CcListenerCount' == $relationName) { + $this->initCcListenerCounts(); + } + } + + /** + * Clears out the collCcListenerCounts collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcTimestamp The current object (for fluent API support) + * @see addCcListenerCounts() + */ + public function clearCcListenerCounts() + { + $this->collCcListenerCounts = null; // important to set this to null since that means it is uninitialized + $this->collCcListenerCountsPartial = null; + + return $this; + } + + /** + * reset is the collCcListenerCounts collection loaded partially + * + * @return void + */ + public function resetPartialCcListenerCounts($v = true) + { + $this->collCcListenerCountsPartial = $v; + } + + /** + * Initializes the collCcListenerCounts collection. + * + * By default this just sets the collCcListenerCounts collection to an empty array (like clearcollCcListenerCounts()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcListenerCounts($overrideExisting = true) + { + if (null !== $this->collCcListenerCounts && !$overrideExisting) { + return; + } + $this->collCcListenerCounts = new PropelObjectCollection(); + $this->collCcListenerCounts->setModel('CcListenerCount'); + } + + /** + * Gets an array of CcListenerCount objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcTimestamp is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcListenerCount[] List of CcListenerCount objects + * @throws PropelException + */ + public function getCcListenerCounts($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcListenerCountsPartial && !$this->isNew(); + if (null === $this->collCcListenerCounts || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcListenerCounts) { + // return empty collection + $this->initCcListenerCounts(); + } else { + $collCcListenerCounts = CcListenerCountQuery::create(null, $criteria) + ->filterByCcTimestamp($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcListenerCountsPartial && count($collCcListenerCounts)) { + $this->initCcListenerCounts(false); + + foreach ($collCcListenerCounts as $obj) { + if (false == $this->collCcListenerCounts->contains($obj)) { + $this->collCcListenerCounts->append($obj); + } + } + + $this->collCcListenerCountsPartial = true; + } + + $collCcListenerCounts->getInternalIterator()->rewind(); + + return $collCcListenerCounts; + } + + if ($partial && $this->collCcListenerCounts) { + foreach ($this->collCcListenerCounts as $obj) { + if ($obj->isNew()) { + $collCcListenerCounts[] = $obj; + } + } + } + + $this->collCcListenerCounts = $collCcListenerCounts; + $this->collCcListenerCountsPartial = false; + } + } + + return $this->collCcListenerCounts; + } + + /** + * Sets a collection of CcListenerCount objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccListenerCounts A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcTimestamp The current object (for fluent API support) + */ + public function setCcListenerCounts(PropelCollection $ccListenerCounts, PropelPDO $con = null) + { + $ccListenerCountsToDelete = $this->getCcListenerCounts(new Criteria(), $con)->diff($ccListenerCounts); + + + $this->ccListenerCountsScheduledForDeletion = $ccListenerCountsToDelete; + + foreach ($ccListenerCountsToDelete as $ccListenerCountRemoved) { + $ccListenerCountRemoved->setCcTimestamp(null); + } + + $this->collCcListenerCounts = null; + foreach ($ccListenerCounts as $ccListenerCount) { + $this->addCcListenerCount($ccListenerCount); + } + + $this->collCcListenerCounts = $ccListenerCounts; + $this->collCcListenerCountsPartial = false; + + return $this; + } + + /** + * Returns the number of related CcListenerCount objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcListenerCount objects. + * @throws PropelException + */ + public function countCcListenerCounts(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcListenerCountsPartial && !$this->isNew(); + if (null === $this->collCcListenerCounts || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcListenerCounts) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcListenerCounts()); + } + $query = CcListenerCountQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcTimestamp($this) + ->count($con); + } + + return count($this->collCcListenerCounts); + } + + /** + * Method called to associate a CcListenerCount object to this object + * through the CcListenerCount foreign key attribute. + * + * @param CcListenerCount $l CcListenerCount + * @return CcTimestamp The current object (for fluent API support) + */ + public function addCcListenerCount(CcListenerCount $l) + { + if ($this->collCcListenerCounts === null) { + $this->initCcListenerCounts(); + $this->collCcListenerCountsPartial = true; + } + + if (!in_array($l, $this->collCcListenerCounts->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcListenerCount($l); + + if ($this->ccListenerCountsScheduledForDeletion and $this->ccListenerCountsScheduledForDeletion->contains($l)) { + $this->ccListenerCountsScheduledForDeletion->remove($this->ccListenerCountsScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcListenerCount $ccListenerCount The ccListenerCount object to add. + */ + protected function doAddCcListenerCount($ccListenerCount) + { + $this->collCcListenerCounts[]= $ccListenerCount; + $ccListenerCount->setCcTimestamp($this); + } + + /** + * @param CcListenerCount $ccListenerCount The ccListenerCount object to remove. + * @return CcTimestamp The current object (for fluent API support) + */ + public function removeCcListenerCount($ccListenerCount) + { + if ($this->getCcListenerCounts()->contains($ccListenerCount)) { + $this->collCcListenerCounts->remove($this->collCcListenerCounts->search($ccListenerCount)); + if (null === $this->ccListenerCountsScheduledForDeletion) { + $this->ccListenerCountsScheduledForDeletion = clone $this->collCcListenerCounts; + $this->ccListenerCountsScheduledForDeletion->clear(); + } + $this->ccListenerCountsScheduledForDeletion[]= clone $ccListenerCount; + $ccListenerCount->setCcTimestamp(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcTimestamp is new, it will return + * an empty collection; or if this CcTimestamp has previously + * been saved, it will retrieve related CcListenerCounts from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcTimestamp. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcListenerCount[] List of CcListenerCount objects + */ + public function getCcListenerCountsJoinCcMountName($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcListenerCountQuery::create(null, $criteria); + $query->joinWith('CcMountName', $join_behavior); + + return $this->getCcListenerCounts($query, $con); + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->timestamp = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCcListenerCounts) { + foreach ($this->collCcListenerCounts as $o) { + $o->clearAllReferences($deep); + } + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + if ($this->collCcListenerCounts instanceof PropelCollection) { + $this->collCcListenerCounts->clearIterator(); + } + $this->collCcListenerCounts = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcTimestampPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcTimestampPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcTimestampPeer.php index 3d3b7d6ae4..961ad255cc 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcTimestampPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcTimestampPeer.php @@ -4,735 +4,757 @@ /** * Base static class for performing query and update operations on the 'cc_timestamp' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcTimestampPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_timestamp'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcTimestamp'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcTimestamp'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcTimestampTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 2; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_timestamp.ID'; - - /** the column name for the TIMESTAMP field */ - const TIMESTAMP = 'cc_timestamp.TIMESTAMP'; - - /** - * An identiy map to hold any loaded instances of CcTimestamp objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcTimestamp[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbTimestamp', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbTimestamp', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::TIMESTAMP, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'TIMESTAMP', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'timestamp', ), - BasePeer::TYPE_NUM => array (0, 1, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbTimestamp' => 1, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbTimestamp' => 1, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::TIMESTAMP => 1, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'TIMESTAMP' => 1, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'timestamp' => 1, ), - BasePeer::TYPE_NUM => array (0, 1, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcTimestampPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcTimestampPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcTimestampPeer::ID); - $criteria->addSelectColumn(CcTimestampPeer::TIMESTAMP); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.TIMESTAMP'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcTimestampPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcTimestampPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcTimestamp - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcTimestampPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcTimestampPeer::populateObjects(CcTimestampPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcTimestampPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcTimestamp $value A CcTimestamp object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcTimestamp $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcTimestamp object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcTimestamp) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcTimestamp object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcTimestamp Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_timestamp - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - // Invalidate objects in CcListenerCountPeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcListenerCountPeer::clearInstancePool(); - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcTimestampPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcTimestampPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcTimestampPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcTimestampPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcTimestamp object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcTimestampPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcTimestampPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcTimestampPeer::NUM_COLUMNS; - } else { - $cls = CcTimestampPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcTimestampPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcTimestampPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcTimestampPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcTimestampTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcTimestampPeer::CLASS_DEFAULT : CcTimestampPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcTimestamp or Criteria object. - * - * @param mixed $values Criteria or CcTimestamp object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcTimestamp object - } - - if ($criteria->containsKey(CcTimestampPeer::ID) && $criteria->keyContainsValue(CcTimestampPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcTimestampPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcTimestamp or Criteria object. - * - * @param mixed $values Criteria or CcTimestamp object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcTimestampPeer::ID); - $value = $criteria->remove(CcTimestampPeer::ID); - if ($value) { - $selectCriteria->add(CcTimestampPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcTimestampPeer::TABLE_NAME); - } - - } else { // $values is CcTimestamp object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_timestamp table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcTimestampPeer::TABLE_NAME, $con, CcTimestampPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcTimestampPeer::clearInstancePool(); - CcTimestampPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcTimestamp or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcTimestamp object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcTimestampPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcTimestamp) { // it's a model object - // invalidate the cache for this single object - CcTimestampPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcTimestampPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcTimestampPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcTimestampPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcTimestamp object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcTimestamp $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcTimestamp $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcTimestampPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcTimestampPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcTimestampPeer::DATABASE_NAME, CcTimestampPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcTimestamp - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcTimestampPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcTimestampPeer::DATABASE_NAME); - $criteria->add(CcTimestampPeer::ID, $pk); - - $v = CcTimestampPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcTimestampPeer::DATABASE_NAME); - $criteria->add(CcTimestampPeer::ID, $pks, Criteria::IN); - $objs = CcTimestampPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcTimestampPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_timestamp'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcTimestamp'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcTimestampTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 2; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 2; + + /** the column name for the id field */ + const ID = 'cc_timestamp.id'; + + /** the column name for the timestamp field */ + const TIMESTAMP = 'cc_timestamp.timestamp'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcTimestamp objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcTimestamp[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcTimestampPeer::$fieldNames[CcTimestampPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbTimestamp', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbTimestamp', ), + BasePeer::TYPE_COLNAME => array (CcTimestampPeer::ID, CcTimestampPeer::TIMESTAMP, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'TIMESTAMP', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'timestamp', ), + BasePeer::TYPE_NUM => array (0, 1, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcTimestampPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbTimestamp' => 1, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbTimestamp' => 1, ), + BasePeer::TYPE_COLNAME => array (CcTimestampPeer::ID => 0, CcTimestampPeer::TIMESTAMP => 1, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'TIMESTAMP' => 1, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'timestamp' => 1, ), + BasePeer::TYPE_NUM => array (0, 1, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcTimestampPeer::getFieldNames($toType); + $key = isset(CcTimestampPeer::$fieldKeys[$fromType][$name]) ? CcTimestampPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcTimestampPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcTimestampPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcTimestampPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcTimestampPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcTimestampPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcTimestampPeer::ID); + $criteria->addSelectColumn(CcTimestampPeer::TIMESTAMP); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.timestamp'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcTimestampPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcTimestampPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcTimestampPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcTimestamp + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcTimestampPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcTimestampPeer::populateObjects(CcTimestampPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcTimestampPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcTimestampPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcTimestamp $obj A CcTimestamp object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcTimestampPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcTimestamp object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcTimestamp) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcTimestamp object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcTimestampPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcTimestamp Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcTimestampPeer::$instances[$key])) { + return CcTimestampPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcTimestampPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcTimestampPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_timestamp + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in CcListenerCountPeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcListenerCountPeer::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcTimestampPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcTimestampPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcTimestampPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcTimestampPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcTimestamp object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcTimestampPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcTimestampPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcTimestampPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcTimestampPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcTimestampPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcTimestampPeer::DATABASE_NAME)->getTable(CcTimestampPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcTimestampPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcTimestampPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcTimestampTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcTimestampPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcTimestamp or Criteria object. + * + * @param mixed $values Criteria or CcTimestamp object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcTimestamp object + } + + if ($criteria->containsKey(CcTimestampPeer::ID) && $criteria->keyContainsValue(CcTimestampPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcTimestampPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcTimestampPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcTimestamp or Criteria object. + * + * @param mixed $values Criteria or CcTimestamp object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcTimestampPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcTimestampPeer::ID); + $value = $criteria->remove(CcTimestampPeer::ID); + if ($value) { + $selectCriteria->add(CcTimestampPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcTimestampPeer::TABLE_NAME); + } + + } else { // $values is CcTimestamp object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcTimestampPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_timestamp table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcTimestampPeer::TABLE_NAME, $con, CcTimestampPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcTimestampPeer::clearInstancePool(); + CcTimestampPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcTimestamp or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcTimestamp object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcTimestampPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcTimestamp) { // it's a model object + // invalidate the cache for this single object + CcTimestampPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcTimestampPeer::DATABASE_NAME); + $criteria->add(CcTimestampPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcTimestampPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcTimestampPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcTimestampPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcTimestamp object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcTimestamp $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcTimestampPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcTimestampPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcTimestampPeer::DATABASE_NAME, CcTimestampPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcTimestamp + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcTimestampPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcTimestampPeer::DATABASE_NAME); + $criteria->add(CcTimestampPeer::ID, $pk); + + $v = CcTimestampPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcTimestamp[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcTimestampPeer::DATABASE_NAME); + $criteria->add(CcTimestampPeer::ID, $pks, Criteria::IN); + $objs = CcTimestampPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcTimestampPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcTimestampQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcTimestampQuery.php index a3f3831129..6c4f80e58d 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcTimestampQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcTimestampQuery.php @@ -4,265 +4,398 @@ /** * Base class that represents a query for the 'cc_timestamp' table. * - * * - * @method CcTimestampQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcTimestampQuery orderByDbTimestamp($order = Criteria::ASC) Order by the timestamp column * - * @method CcTimestampQuery groupByDbId() Group by the id column - * @method CcTimestampQuery groupByDbTimestamp() Group by the timestamp column + * @method CcTimestampQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcTimestampQuery orderByDbTimestamp($order = Criteria::ASC) Order by the timestamp column * - * @method CcTimestampQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcTimestampQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcTimestampQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcTimestampQuery groupByDbId() Group by the id column + * @method CcTimestampQuery groupByDbTimestamp() Group by the timestamp column * - * @method CcTimestampQuery leftJoinCcListenerCount($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcListenerCount relation - * @method CcTimestampQuery rightJoinCcListenerCount($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcListenerCount relation - * @method CcTimestampQuery innerJoinCcListenerCount($relationAlias = '') Adds a INNER JOIN clause to the query using the CcListenerCount relation + * @method CcTimestampQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcTimestampQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcTimestampQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcTimestamp findOne(PropelPDO $con = null) Return the first CcTimestamp matching the query - * @method CcTimestamp findOneOrCreate(PropelPDO $con = null) Return the first CcTimestamp matching the query, or a new CcTimestamp object populated from the query conditions when no match is found + * @method CcTimestampQuery leftJoinCcListenerCount($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcListenerCount relation + * @method CcTimestampQuery rightJoinCcListenerCount($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcListenerCount relation + * @method CcTimestampQuery innerJoinCcListenerCount($relationAlias = null) Adds a INNER JOIN clause to the query using the CcListenerCount relation * - * @method CcTimestamp findOneByDbId(int $id) Return the first CcTimestamp filtered by the id column - * @method CcTimestamp findOneByDbTimestamp(string $timestamp) Return the first CcTimestamp filtered by the timestamp column + * @method CcTimestamp findOne(PropelPDO $con = null) Return the first CcTimestamp matching the query + * @method CcTimestamp findOneOrCreate(PropelPDO $con = null) Return the first CcTimestamp matching the query, or a new CcTimestamp object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcTimestamp objects filtered by the id column - * @method array findByDbTimestamp(string $timestamp) Return CcTimestamp objects filtered by the timestamp column + * @method CcTimestamp findOneByDbTimestamp(string $timestamp) Return the first CcTimestamp filtered by the timestamp column + * + * @method array findByDbId(int $id) Return CcTimestamp objects filtered by the id column + * @method array findByDbTimestamp(string $timestamp) Return CcTimestamp objects filtered by the timestamp column * * @package propel.generator.airtime.om */ abstract class BaseCcTimestampQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcTimestampQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcTimestamp'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcTimestampQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcTimestampQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcTimestampQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcTimestampQuery) { + return $criteria; + } + $query = new CcTimestampQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcTimestamp|CcTimestamp[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcTimestampPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcTimestampPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcTimestamp A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcTimestamp A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "timestamp" FROM "cc_timestamp" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcTimestamp(); + $obj->hydrate($row); + CcTimestampPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcTimestamp|CcTimestamp[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcTimestamp[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcTimestampQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcTimestampPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcTimestampQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcTimestampPeer::ID, $keys, Criteria::IN); + } - /** - * Initializes internal state of BaseCcTimestampQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcTimestamp', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcTimestampQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcTimestampPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcTimestampPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } - /** - * Returns a new CcTimestampQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcTimestampQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcTimestampQuery) { - return $criteria; - } - $query = new CcTimestampQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } + return $this->addUsingAlias(CcTimestampPeer::ID, $dbId, $comparison); + } - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcTimestamp|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcTimestampPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } + /** + * Filter the query on the timestamp column + * + * Example usage: + * + * $query->filterByDbTimestamp('2011-03-14'); // WHERE timestamp = '2011-03-14' + * $query->filterByDbTimestamp('now'); // WHERE timestamp = '2011-03-14' + * $query->filterByDbTimestamp(array('max' => 'yesterday')); // WHERE timestamp < '2011-03-13' + * + * + * @param mixed $dbTimestamp The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcTimestampQuery The current query, for fluid interface + */ + public function filterByDbTimestamp($dbTimestamp = null, $comparison = null) + { + if (is_array($dbTimestamp)) { + $useMinMax = false; + if (isset($dbTimestamp['min'])) { + $this->addUsingAlias(CcTimestampPeer::TIMESTAMP, $dbTimestamp['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbTimestamp['max'])) { + $this->addUsingAlias(CcTimestampPeer::TIMESTAMP, $dbTimestamp['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } + return $this->addUsingAlias(CcTimestampPeer::TIMESTAMP, $dbTimestamp, $comparison); + } - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcTimestampQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcTimestampPeer::ID, $key, Criteria::EQUAL); - } + /** + * Filter the query by a related CcListenerCount object + * + * @param CcListenerCount|PropelObjectCollection $ccListenerCount the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcTimestampQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcListenerCount($ccListenerCount, $comparison = null) + { + if ($ccListenerCount instanceof CcListenerCount) { + return $this + ->addUsingAlias(CcTimestampPeer::ID, $ccListenerCount->getDbTimestampId(), $comparison); + } elseif ($ccListenerCount instanceof PropelObjectCollection) { + return $this + ->useCcListenerCountQuery() + ->filterByPrimaryKeys($ccListenerCount->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcListenerCount() only accepts arguments of type CcListenerCount or PropelCollection'); + } + } - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcTimestampQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcTimestampPeer::ID, $keys, Criteria::IN); - } + /** + * Adds a JOIN clause to the query using the CcListenerCount relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcTimestampQuery The current query, for fluid interface + */ + public function joinCcListenerCount($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcListenerCount'); - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcTimestampQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcTimestampPeer::ID, $dbId, $comparison); - } + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } - /** - * Filter the query on the timestamp column - * - * @param string|array $dbTimestamp The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcTimestampQuery The current query, for fluid interface - */ - public function filterByDbTimestamp($dbTimestamp = null, $comparison = null) - { - if (is_array($dbTimestamp)) { - $useMinMax = false; - if (isset($dbTimestamp['min'])) { - $this->addUsingAlias(CcTimestampPeer::TIMESTAMP, $dbTimestamp['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbTimestamp['max'])) { - $this->addUsingAlias(CcTimestampPeer::TIMESTAMP, $dbTimestamp['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcTimestampPeer::TIMESTAMP, $dbTimestamp, $comparison); - } + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcListenerCount'); + } - /** - * Filter the query by a related CcListenerCount object - * - * @param CcListenerCount $ccListenerCount the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcTimestampQuery The current query, for fluid interface - */ - public function filterByCcListenerCount($ccListenerCount, $comparison = null) - { - return $this - ->addUsingAlias(CcTimestampPeer::ID, $ccListenerCount->getDbTimestampId(), $comparison); - } + return $this; + } - /** - * Adds a JOIN clause to the query using the CcListenerCount relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcTimestampQuery The current query, for fluid interface - */ - public function joinCcListenerCount($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcListenerCount'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcListenerCount'); - } - - return $this; - } + /** + * Use the CcListenerCount relation CcListenerCount object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcListenerCountQuery A secondary query class using the current class as primary query + */ + public function useCcListenerCountQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcListenerCount($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcListenerCount', 'CcListenerCountQuery'); + } - /** - * Use the CcListenerCount relation CcListenerCount object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcListenerCountQuery A secondary query class using the current class as primary query - */ - public function useCcListenerCountQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcListenerCount($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcListenerCount', 'CcListenerCountQuery'); - } + /** + * Exclude object from result + * + * @param CcTimestamp $ccTimestamp Object to remove from the list of results + * + * @return CcTimestampQuery The current query, for fluid interface + */ + public function prune($ccTimestamp = null) + { + if ($ccTimestamp) { + $this->addUsingAlias(CcTimestampPeer::ID, $ccTimestamp->getDbId(), Criteria::NOT_EQUAL); + } - /** - * Exclude object from result - * - * @param CcTimestamp $ccTimestamp Object to remove from the list of results - * - * @return CcTimestampQuery The current query, for fluid interface - */ - public function prune($ccTimestamp = null) - { - if ($ccTimestamp) { - $this->addUsingAlias(CcTimestampPeer::ID, $ccTimestamp->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } + return $this; + } -} // BaseCcTimestampQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcWebstream.php b/airtime_mvc/application/models/airtime/om/BaseCcWebstream.php index 6f6e16e2b5..fedddbcbd0 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcWebstream.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcWebstream.php @@ -4,1482 +4,1741 @@ /** * Base class that represents a row from the 'cc_webstream' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcWebstream extends BaseObject implements Persistent +abstract class BaseCcWebstream extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcWebstreamPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcWebstreamPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the name field. - * @var string - */ - protected $name; - - /** - * The value for the description field. - * @var string - */ - protected $description; - - /** - * The value for the url field. - * @var string - */ - protected $url; - - /** - * The value for the length field. - * Note: this column has a database default value of: '00:00:00' - * @var string - */ - protected $length; - - /** - * The value for the creator_id field. - * @var int - */ - protected $creator_id; - - /** - * The value for the mtime field. - * @var string - */ - protected $mtime; - - /** - * The value for the utime field. - * @var string - */ - protected $utime; - - /** - * The value for the lptime field. - * @var string - */ - protected $lptime; - - /** - * The value for the mime field. - * @var string - */ - protected $mime; - - /** - * @var array CcSchedule[] Collection to store aggregation of CcSchedule objects. - */ - protected $collCcSchedules; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */ - public function applyDefaultValues() - { - $this->length = '00:00:00'; - } - - /** - * Initializes internal state of BaseCcWebstream object. - * @see applyDefaults() - */ - public function __construct() - { - parent::__construct(); - $this->applyDefaultValues(); - } - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [name] column value. - * - * @return string - */ - public function getDbName() - { - return $this->name; - } - - /** - * Get the [description] column value. - * - * @return string - */ - public function getDbDescription() - { - return $this->description; - } - - /** - * Get the [url] column value. - * - * @return string - */ - public function getDbUrl() - { - return $this->url; - } - - /** - * Get the [length] column value. - * - * @return string - */ - public function getDbLength() - { - return $this->length; - } - - /** - * Get the [creator_id] column value. - * - * @return int - */ - public function getDbCreatorId() - { - return $this->creator_id; - } - - /** - * Get the [optionally formatted] temporal [mtime] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbMtime($format = 'Y-m-d H:i:s') - { - if ($this->mtime === null) { - return null; - } - - - - try { - $dt = new DateTime($this->mtime); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->mtime, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [utime] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbUtime($format = 'Y-m-d H:i:s') - { - if ($this->utime === null) { - return null; - } - - - - try { - $dt = new DateTime($this->utime); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->utime, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [optionally formatted] temporal [lptime] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbLPtime($format = 'Y-m-d H:i:s') - { - if ($this->lptime === null) { - return null; - } - - - - try { - $dt = new DateTime($this->lptime); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->lptime, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [mime] column value. - * - * @return string - */ - public function getDbMime() - { - return $this->mime; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcWebstream The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcWebstreamPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [name] column. - * - * @param string $v new value - * @return CcWebstream The current object (for fluent API support) - */ - public function setDbName($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->name !== $v) { - $this->name = $v; - $this->modifiedColumns[] = CcWebstreamPeer::NAME; - } - - return $this; - } // setDbName() - - /** - * Set the value of [description] column. - * - * @param string $v new value - * @return CcWebstream The current object (for fluent API support) - */ - public function setDbDescription($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->description !== $v) { - $this->description = $v; - $this->modifiedColumns[] = CcWebstreamPeer::DESCRIPTION; - } - - return $this; - } // setDbDescription() - - /** - * Set the value of [url] column. - * - * @param string $v new value - * @return CcWebstream The current object (for fluent API support) - */ - public function setDbUrl($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->url !== $v) { - $this->url = $v; - $this->modifiedColumns[] = CcWebstreamPeer::URL; - } - - return $this; - } // setDbUrl() - - /** - * Set the value of [length] column. - * - * @param string $v new value - * @return CcWebstream The current object (for fluent API support) - */ - public function setDbLength($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->length !== $v || $this->isNew()) { - $this->length = $v; - $this->modifiedColumns[] = CcWebstreamPeer::LENGTH; - } - - return $this; - } // setDbLength() - - /** - * Set the value of [creator_id] column. - * - * @param int $v new value - * @return CcWebstream The current object (for fluent API support) - */ - public function setDbCreatorId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->creator_id !== $v) { - $this->creator_id = $v; - $this->modifiedColumns[] = CcWebstreamPeer::CREATOR_ID; - } - - return $this; - } // setDbCreatorId() - - /** - * Sets the value of [mtime] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcWebstream The current object (for fluent API support) - */ - public function setDbMtime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->mtime !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->mtime !== null && $tmpDt = new DateTime($this->mtime)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->mtime = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcWebstreamPeer::MTIME; - } - } // if either are not null - - return $this; - } // setDbMtime() - - /** - * Sets the value of [utime] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcWebstream The current object (for fluent API support) - */ - public function setDbUtime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->utime !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->utime !== null && $tmpDt = new DateTime($this->utime)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->utime = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcWebstreamPeer::UTIME; - } - } // if either are not null - - return $this; - } // setDbUtime() - - /** - * Sets the value of [lptime] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcWebstream The current object (for fluent API support) - */ - public function setDbLPtime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->lptime !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->lptime !== null && $tmpDt = new DateTime($this->lptime)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->lptime = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcWebstreamPeer::LPTIME; - } - } // if either are not null - - return $this; - } // setDbLPtime() - - /** - * Set the value of [mime] column. - * - * @param string $v new value - * @return CcWebstream The current object (for fluent API support) - */ - public function setDbMime($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->mime !== $v) { - $this->mime = $v; - $this->modifiedColumns[] = CcWebstreamPeer::MIME; - } - - return $this; - } // setDbMime() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - if ($this->length !== '00:00:00') { - return false; - } - - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->description = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->url = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->length = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; - $this->creator_id = ($row[$startcol + 5] !== null) ? (int) $row[$startcol + 5] : null; - $this->mtime = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; - $this->utime = ($row[$startcol + 7] !== null) ? (string) $row[$startcol + 7] : null; - $this->lptime = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; - $this->mime = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 10; // 10 = CcWebstreamPeer::NUM_COLUMNS - CcWebstreamPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcWebstream object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcWebstreamPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->collCcSchedules = null; - - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcWebstreamQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcWebstreamPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcWebstreamPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcWebstreamPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcWebstreamPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows = 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows = CcWebstreamPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - if ($this->collCcSchedules !== null) { - foreach ($this->collCcSchedules as $referrerFK) { - if (!$referrerFK->isDeleted()) { - $affectedRows += $referrerFK->save($con); - } - } - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - if (($retval = CcWebstreamPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - if ($this->collCcSchedules !== null) { - foreach ($this->collCcSchedules as $referrerFK) { - if (!$referrerFK->validate($columns)) { - $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcWebstreamPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbName(); - break; - case 2: - return $this->getDbDescription(); - break; - case 3: - return $this->getDbUrl(); - break; - case 4: - return $this->getDbLength(); - break; - case 5: - return $this->getDbCreatorId(); - break; - case 6: - return $this->getDbMtime(); - break; - case 7: - return $this->getDbUtime(); - break; - case 8: - return $this->getDbLPtime(); - break; - case 9: - return $this->getDbMime(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true) - { - $keys = CcWebstreamPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbName(), - $keys[2] => $this->getDbDescription(), - $keys[3] => $this->getDbUrl(), - $keys[4] => $this->getDbLength(), - $keys[5] => $this->getDbCreatorId(), - $keys[6] => $this->getDbMtime(), - $keys[7] => $this->getDbUtime(), - $keys[8] => $this->getDbLPtime(), - $keys[9] => $this->getDbMime(), - ); - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcWebstreamPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbName($value); - break; - case 2: - $this->setDbDescription($value); - break; - case 3: - $this->setDbUrl($value); - break; - case 4: - $this->setDbLength($value); - break; - case 5: - $this->setDbCreatorId($value); - break; - case 6: - $this->setDbMtime($value); - break; - case 7: - $this->setDbUtime($value); - break; - case 8: - $this->setDbLPtime($value); - break; - case 9: - $this->setDbMime($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcWebstreamPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbDescription($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbUrl($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDbLength($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setDbCreatorId($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setDbMtime($arr[$keys[6]]); - if (array_key_exists($keys[7], $arr)) $this->setDbUtime($arr[$keys[7]]); - if (array_key_exists($keys[8], $arr)) $this->setDbLPtime($arr[$keys[8]]); - if (array_key_exists($keys[9], $arr)) $this->setDbMime($arr[$keys[9]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcWebstreamPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcWebstreamPeer::ID)) $criteria->add(CcWebstreamPeer::ID, $this->id); - if ($this->isColumnModified(CcWebstreamPeer::NAME)) $criteria->add(CcWebstreamPeer::NAME, $this->name); - if ($this->isColumnModified(CcWebstreamPeer::DESCRIPTION)) $criteria->add(CcWebstreamPeer::DESCRIPTION, $this->description); - if ($this->isColumnModified(CcWebstreamPeer::URL)) $criteria->add(CcWebstreamPeer::URL, $this->url); - if ($this->isColumnModified(CcWebstreamPeer::LENGTH)) $criteria->add(CcWebstreamPeer::LENGTH, $this->length); - if ($this->isColumnModified(CcWebstreamPeer::CREATOR_ID)) $criteria->add(CcWebstreamPeer::CREATOR_ID, $this->creator_id); - if ($this->isColumnModified(CcWebstreamPeer::MTIME)) $criteria->add(CcWebstreamPeer::MTIME, $this->mtime); - if ($this->isColumnModified(CcWebstreamPeer::UTIME)) $criteria->add(CcWebstreamPeer::UTIME, $this->utime); - if ($this->isColumnModified(CcWebstreamPeer::LPTIME)) $criteria->add(CcWebstreamPeer::LPTIME, $this->lptime); - if ($this->isColumnModified(CcWebstreamPeer::MIME)) $criteria->add(CcWebstreamPeer::MIME, $this->mime); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcWebstreamPeer::DATABASE_NAME); - $criteria->add(CcWebstreamPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcWebstream (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbName($this->name); - $copyObj->setDbDescription($this->description); - $copyObj->setDbUrl($this->url); - $copyObj->setDbLength($this->length); - $copyObj->setDbCreatorId($this->creator_id); - $copyObj->setDbMtime($this->mtime); - $copyObj->setDbUtime($this->utime); - $copyObj->setDbLPtime($this->lptime); - $copyObj->setDbMime($this->mime); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getCcSchedules() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addCcSchedule($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcWebstream Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcWebstreamPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcWebstreamPeer(); - } - return self::$peer; - } - - /** - * Clears out the collCcSchedules collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addCcSchedules() - */ - public function clearCcSchedules() - { - $this->collCcSchedules = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Initializes the collCcSchedules collection. - * - * By default this just sets the collCcSchedules collection to an empty array (like clearcollCcSchedules()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function initCcSchedules() - { - $this->collCcSchedules = new PropelObjectCollection(); - $this->collCcSchedules->setModel('CcSchedule'); - } - - /** - * Gets an array of CcSchedule objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this CcWebstream is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @return PropelCollection|array CcSchedule[] List of CcSchedule objects - * @throws PropelException - */ - public function getCcSchedules($criteria = null, PropelPDO $con = null) - { - if(null === $this->collCcSchedules || null !== $criteria) { - if ($this->isNew() && null === $this->collCcSchedules) { - // return empty collection - $this->initCcSchedules(); - } else { - $collCcSchedules = CcScheduleQuery::create(null, $criteria) - ->filterByCcWebstream($this) - ->find($con); - if (null !== $criteria) { - return $collCcSchedules; - } - $this->collCcSchedules = $collCcSchedules; - } - } - return $this->collCcSchedules; - } - - /** - * Returns the number of related CcSchedule objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param PropelPDO $con - * @return int Count of related CcSchedule objects. - * @throws PropelException - */ - public function countCcSchedules(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) - { - if(null === $this->collCcSchedules || null !== $criteria) { - if ($this->isNew() && null === $this->collCcSchedules) { - return 0; - } else { - $query = CcScheduleQuery::create(null, $criteria); - if($distinct) { - $query->distinct(); - } - return $query - ->filterByCcWebstream($this) - ->count($con); - } - } else { - return count($this->collCcSchedules); - } - } - - /** - * Method called to associate a CcSchedule object to this object - * through the CcSchedule foreign key attribute. - * - * @param CcSchedule $l CcSchedule - * @return void - * @throws PropelException - */ - public function addCcSchedule(CcSchedule $l) - { - if ($this->collCcSchedules === null) { - $this->initCcSchedules(); - } - if (!$this->collCcSchedules->contains($l)) { // only add it if the **same** object is not already associated - $this->collCcSchedules[]= $l; - $l->setCcWebstream($this); - } - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcWebstream is new, it will return - * an empty collection; or if this CcWebstream has previously - * been saved, it will retrieve related CcSchedules from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcWebstream. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcSchedule[] List of CcSchedule objects - */ - public function getCcSchedulesJoinCcShowInstances($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcScheduleQuery::create(null, $criteria); - $query->joinWith('CcShowInstances', $join_behavior); - - return $this->getCcSchedules($query, $con); - } - - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this CcWebstream is new, it will return - * an empty collection; or if this CcWebstream has previously - * been saved, it will retrieve related CcSchedules from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in CcWebstream. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param PropelPDO $con optional connection object - * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) - * @return PropelCollection|array CcSchedule[] List of CcSchedule objects - */ - public function getCcSchedulesJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $query = CcScheduleQuery::create(null, $criteria); - $query->joinWith('CcFiles', $join_behavior); - - return $this->getCcSchedules($query, $con); - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->name = null; - $this->description = null; - $this->url = null; - $this->length = null; - $this->creator_id = null; - $this->mtime = null; - $this->utime = null; - $this->lptime = null; - $this->mime = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->applyDefaultValues(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - if ($this->collCcSchedules) { - foreach ((array) $this->collCcSchedules as $o) { - $o->clearAllReferences($deep); - } - } - } // if ($deep) - - $this->collCcSchedules = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcWebstream + /** + * Peer class name + */ + const PEER = 'CcWebstreamPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcWebstreamPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the name field. + * @var string + */ + protected $name; + + /** + * The value for the description field. + * @var string + */ + protected $description; + + /** + * The value for the url field. + * @var string + */ + protected $url; + + /** + * The value for the length field. + * Note: this column has a database default value of: '00:00:00' + * @var string + */ + protected $length; + + /** + * The value for the creator_id field. + * @var int + */ + protected $creator_id; + + /** + * The value for the mtime field. + * @var string + */ + protected $mtime; + + /** + * The value for the utime field. + * @var string + */ + protected $utime; + + /** + * The value for the lptime field. + * @var string + */ + protected $lptime; + + /** + * The value for the mime field. + * @var string + */ + protected $mime; + + /** + * @var PropelObjectCollection|CcSchedule[] Collection to store aggregation of CcSchedule objects. + */ + protected $collCcSchedules; + protected $collCcSchedulesPartial; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $ccSchedulesScheduledForDeletion = null; + + /** + * Applies default values to this object. + * This method should be called from the object's constructor (or + * equivalent initialization method). + * @see __construct() + */ + public function applyDefaultValues() + { + $this->length = '00:00:00'; + } + + /** + * Initializes internal state of BaseCcWebstream object. + * @see applyDefaults() + */ + public function __construct() + { + parent::__construct(); + $this->applyDefaultValues(); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [name] column value. + * + * @return string + */ + public function getDbName() + { + + return $this->name; + } + + /** + * Get the [description] column value. + * + * @return string + */ + public function getDbDescription() + { + + return $this->description; + } + + /** + * Get the [url] column value. + * + * @return string + */ + public function getDbUrl() + { + + return $this->url; + } + + /** + * Get the [length] column value. + * + * @return string + */ + public function getDbLength() + { + + return $this->length; + } + + /** + * Get the [creator_id] column value. + * + * @return int + */ + public function getDbCreatorId() + { + + return $this->creator_id; + } + + /** + * Get the [optionally formatted] temporal [mtime] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbMtime($format = 'Y-m-d H:i:s') + { + if ($this->mtime === null) { + return null; + } + + + try { + $dt = new DateTime($this->mtime); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->mtime, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [utime] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbUtime($format = 'Y-m-d H:i:s') + { + if ($this->utime === null) { + return null; + } + + + try { + $dt = new DateTime($this->utime); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->utime, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [optionally formatted] temporal [lptime] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbLPtime($format = 'Y-m-d H:i:s') + { + if ($this->lptime === null) { + return null; + } + + + try { + $dt = new DateTime($this->lptime); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->lptime, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [mime] column value. + * + * @return string + */ + public function getDbMime() + { + + return $this->mime; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcWebstream The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcWebstreamPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [name] column. + * + * @param string $v new value + * @return CcWebstream The current object (for fluent API support) + */ + public function setDbName($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->name !== $v) { + $this->name = $v; + $this->modifiedColumns[] = CcWebstreamPeer::NAME; + } + + + return $this; + } // setDbName() + + /** + * Set the value of [description] column. + * + * @param string $v new value + * @return CcWebstream The current object (for fluent API support) + */ + public function setDbDescription($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->description !== $v) { + $this->description = $v; + $this->modifiedColumns[] = CcWebstreamPeer::DESCRIPTION; + } + + + return $this; + } // setDbDescription() + + /** + * Set the value of [url] column. + * + * @param string $v new value + * @return CcWebstream The current object (for fluent API support) + */ + public function setDbUrl($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->url !== $v) { + $this->url = $v; + $this->modifiedColumns[] = CcWebstreamPeer::URL; + } + + + return $this; + } // setDbUrl() + + /** + * Set the value of [length] column. + * + * @param string $v new value + * @return CcWebstream The current object (for fluent API support) + */ + public function setDbLength($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->length !== $v) { + $this->length = $v; + $this->modifiedColumns[] = CcWebstreamPeer::LENGTH; + } + + + return $this; + } // setDbLength() + + /** + * Set the value of [creator_id] column. + * + * @param int $v new value + * @return CcWebstream The current object (for fluent API support) + */ + public function setDbCreatorId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->creator_id !== $v) { + $this->creator_id = $v; + $this->modifiedColumns[] = CcWebstreamPeer::CREATOR_ID; + } + + + return $this; + } // setDbCreatorId() + + /** + * Sets the value of [mtime] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcWebstream The current object (for fluent API support) + */ + public function setDbMtime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->mtime !== null || $dt !== null) { + $currentDateAsString = ($this->mtime !== null && $tmpDt = new DateTime($this->mtime)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->mtime = $newDateAsString; + $this->modifiedColumns[] = CcWebstreamPeer::MTIME; + } + } // if either are not null + + + return $this; + } // setDbMtime() + + /** + * Sets the value of [utime] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcWebstream The current object (for fluent API support) + */ + public function setDbUtime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->utime !== null || $dt !== null) { + $currentDateAsString = ($this->utime !== null && $tmpDt = new DateTime($this->utime)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->utime = $newDateAsString; + $this->modifiedColumns[] = CcWebstreamPeer::UTIME; + } + } // if either are not null + + + return $this; + } // setDbUtime() + + /** + * Sets the value of [lptime] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcWebstream The current object (for fluent API support) + */ + public function setDbLPtime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->lptime !== null || $dt !== null) { + $currentDateAsString = ($this->lptime !== null && $tmpDt = new DateTime($this->lptime)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->lptime = $newDateAsString; + $this->modifiedColumns[] = CcWebstreamPeer::LPTIME; + } + } // if either are not null + + + return $this; + } // setDbLPtime() + + /** + * Set the value of [mime] column. + * + * @param string $v new value + * @return CcWebstream The current object (for fluent API support) + */ + public function setDbMime($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->mime !== $v) { + $this->mime = $v; + $this->modifiedColumns[] = CcWebstreamPeer::MIME; + } + + + return $this; + } // setDbMime() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->length !== '00:00:00') { + return false; + } + + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->name = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->description = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->url = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->length = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; + $this->creator_id = ($row[$startcol + 5] !== null) ? (int) $row[$startcol + 5] : null; + $this->mtime = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; + $this->utime = ($row[$startcol + 7] !== null) ? (string) $row[$startcol + 7] : null; + $this->lptime = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null; + $this->mime = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 10; // 10 = CcWebstreamPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcWebstream object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcWebstreamPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->collCcSchedules = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcWebstreamQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcWebstreamPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->ccSchedulesScheduledForDeletion !== null) { + if (!$this->ccSchedulesScheduledForDeletion->isEmpty()) { + CcScheduleQuery::create() + ->filterByPrimaryKeys($this->ccSchedulesScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->ccSchedulesScheduledForDeletion = null; + } + } + + if ($this->collCcSchedules !== null) { + foreach ($this->collCcSchedules as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcWebstreamPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcWebstreamPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_webstream_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcWebstreamPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcWebstreamPeer::NAME)) { + $modifiedColumns[':p' . $index++] = '"name"'; + } + if ($this->isColumnModified(CcWebstreamPeer::DESCRIPTION)) { + $modifiedColumns[':p' . $index++] = '"description"'; + } + if ($this->isColumnModified(CcWebstreamPeer::URL)) { + $modifiedColumns[':p' . $index++] = '"url"'; + } + if ($this->isColumnModified(CcWebstreamPeer::LENGTH)) { + $modifiedColumns[':p' . $index++] = '"length"'; + } + if ($this->isColumnModified(CcWebstreamPeer::CREATOR_ID)) { + $modifiedColumns[':p' . $index++] = '"creator_id"'; + } + if ($this->isColumnModified(CcWebstreamPeer::MTIME)) { + $modifiedColumns[':p' . $index++] = '"mtime"'; + } + if ($this->isColumnModified(CcWebstreamPeer::UTIME)) { + $modifiedColumns[':p' . $index++] = '"utime"'; + } + if ($this->isColumnModified(CcWebstreamPeer::LPTIME)) { + $modifiedColumns[':p' . $index++] = '"lptime"'; + } + if ($this->isColumnModified(CcWebstreamPeer::MIME)) { + $modifiedColumns[':p' . $index++] = '"mime"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_webstream" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"name"': + $stmt->bindValue($identifier, $this->name, PDO::PARAM_STR); + break; + case '"description"': + $stmt->bindValue($identifier, $this->description, PDO::PARAM_STR); + break; + case '"url"': + $stmt->bindValue($identifier, $this->url, PDO::PARAM_STR); + break; + case '"length"': + $stmt->bindValue($identifier, $this->length, PDO::PARAM_STR); + break; + case '"creator_id"': + $stmt->bindValue($identifier, $this->creator_id, PDO::PARAM_INT); + break; + case '"mtime"': + $stmt->bindValue($identifier, $this->mtime, PDO::PARAM_STR); + break; + case '"utime"': + $stmt->bindValue($identifier, $this->utime, PDO::PARAM_STR); + break; + case '"lptime"': + $stmt->bindValue($identifier, $this->lptime, PDO::PARAM_STR); + break; + case '"mime"': + $stmt->bindValue($identifier, $this->mime, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = CcWebstreamPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + if ($this->collCcSchedules !== null) { + foreach ($this->collCcSchedules as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcWebstreamPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbName(); + break; + case 2: + return $this->getDbDescription(); + break; + case 3: + return $this->getDbUrl(); + break; + case 4: + return $this->getDbLength(); + break; + case 5: + return $this->getDbCreatorId(); + break; + case 6: + return $this->getDbMtime(); + break; + case 7: + return $this->getDbUtime(); + break; + case 8: + return $this->getDbLPtime(); + break; + case 9: + return $this->getDbMime(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcWebstream'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcWebstream'][$this->getPrimaryKey()] = true; + $keys = CcWebstreamPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbName(), + $keys[2] => $this->getDbDescription(), + $keys[3] => $this->getDbUrl(), + $keys[4] => $this->getDbLength(), + $keys[5] => $this->getDbCreatorId(), + $keys[6] => $this->getDbMtime(), + $keys[7] => $this->getDbUtime(), + $keys[8] => $this->getDbLPtime(), + $keys[9] => $this->getDbMime(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->collCcSchedules) { + $result['CcSchedules'] = $this->collCcSchedules->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcWebstreamPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbName($value); + break; + case 2: + $this->setDbDescription($value); + break; + case 3: + $this->setDbUrl($value); + break; + case 4: + $this->setDbLength($value); + break; + case 5: + $this->setDbCreatorId($value); + break; + case 6: + $this->setDbMtime($value); + break; + case 7: + $this->setDbUtime($value); + break; + case 8: + $this->setDbLPtime($value); + break; + case 9: + $this->setDbMime($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcWebstreamPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbName($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbDescription($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbUrl($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDbLength($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setDbCreatorId($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setDbMtime($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setDbUtime($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setDbLPtime($arr[$keys[8]]); + if (array_key_exists($keys[9], $arr)) $this->setDbMime($arr[$keys[9]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcWebstreamPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcWebstreamPeer::ID)) $criteria->add(CcWebstreamPeer::ID, $this->id); + if ($this->isColumnModified(CcWebstreamPeer::NAME)) $criteria->add(CcWebstreamPeer::NAME, $this->name); + if ($this->isColumnModified(CcWebstreamPeer::DESCRIPTION)) $criteria->add(CcWebstreamPeer::DESCRIPTION, $this->description); + if ($this->isColumnModified(CcWebstreamPeer::URL)) $criteria->add(CcWebstreamPeer::URL, $this->url); + if ($this->isColumnModified(CcWebstreamPeer::LENGTH)) $criteria->add(CcWebstreamPeer::LENGTH, $this->length); + if ($this->isColumnModified(CcWebstreamPeer::CREATOR_ID)) $criteria->add(CcWebstreamPeer::CREATOR_ID, $this->creator_id); + if ($this->isColumnModified(CcWebstreamPeer::MTIME)) $criteria->add(CcWebstreamPeer::MTIME, $this->mtime); + if ($this->isColumnModified(CcWebstreamPeer::UTIME)) $criteria->add(CcWebstreamPeer::UTIME, $this->utime); + if ($this->isColumnModified(CcWebstreamPeer::LPTIME)) $criteria->add(CcWebstreamPeer::LPTIME, $this->lptime); + if ($this->isColumnModified(CcWebstreamPeer::MIME)) $criteria->add(CcWebstreamPeer::MIME, $this->mime); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcWebstreamPeer::DATABASE_NAME); + $criteria->add(CcWebstreamPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcWebstream (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbName($this->getDbName()); + $copyObj->setDbDescription($this->getDbDescription()); + $copyObj->setDbUrl($this->getDbUrl()); + $copyObj->setDbLength($this->getDbLength()); + $copyObj->setDbCreatorId($this->getDbCreatorId()); + $copyObj->setDbMtime($this->getDbMtime()); + $copyObj->setDbUtime($this->getDbUtime()); + $copyObj->setDbLPtime($this->getDbLPtime()); + $copyObj->setDbMime($this->getDbMime()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + foreach ($this->getCcSchedules() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCcSchedule($relObj->copy($deepCopy)); + } + } + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcWebstream Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcWebstreamPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcWebstreamPeer(); + } + + return self::$peer; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CcSchedule' == $relationName) { + $this->initCcSchedules(); + } + } + + /** + * Clears out the collCcSchedules collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcWebstream The current object (for fluent API support) + * @see addCcSchedules() + */ + public function clearCcSchedules() + { + $this->collCcSchedules = null; // important to set this to null since that means it is uninitialized + $this->collCcSchedulesPartial = null; + + return $this; + } + + /** + * reset is the collCcSchedules collection loaded partially + * + * @return void + */ + public function resetPartialCcSchedules($v = true) + { + $this->collCcSchedulesPartial = $v; + } + + /** + * Initializes the collCcSchedules collection. + * + * By default this just sets the collCcSchedules collection to an empty array (like clearcollCcSchedules()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCcSchedules($overrideExisting = true) + { + if (null !== $this->collCcSchedules && !$overrideExisting) { + return; + } + $this->collCcSchedules = new PropelObjectCollection(); + $this->collCcSchedules->setModel('CcSchedule'); + } + + /** + * Gets an array of CcSchedule objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcWebstream is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CcSchedule[] List of CcSchedule objects + * @throws PropelException + */ + public function getCcSchedules($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCcSchedulesPartial && !$this->isNew(); + if (null === $this->collCcSchedules || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcSchedules) { + // return empty collection + $this->initCcSchedules(); + } else { + $collCcSchedules = CcScheduleQuery::create(null, $criteria) + ->filterByCcWebstream($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCcSchedulesPartial && count($collCcSchedules)) { + $this->initCcSchedules(false); + + foreach ($collCcSchedules as $obj) { + if (false == $this->collCcSchedules->contains($obj)) { + $this->collCcSchedules->append($obj); + } + } + + $this->collCcSchedulesPartial = true; + } + + $collCcSchedules->getInternalIterator()->rewind(); + + return $collCcSchedules; + } + + if ($partial && $this->collCcSchedules) { + foreach ($this->collCcSchedules as $obj) { + if ($obj->isNew()) { + $collCcSchedules[] = $obj; + } + } + } + + $this->collCcSchedules = $collCcSchedules; + $this->collCcSchedulesPartial = false; + } + } + + return $this->collCcSchedules; + } + + /** + * Sets a collection of CcSchedule objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $ccSchedules A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcWebstream The current object (for fluent API support) + */ + public function setCcSchedules(PropelCollection $ccSchedules, PropelPDO $con = null) + { + $ccSchedulesToDelete = $this->getCcSchedules(new Criteria(), $con)->diff($ccSchedules); + + + $this->ccSchedulesScheduledForDeletion = $ccSchedulesToDelete; + + foreach ($ccSchedulesToDelete as $ccScheduleRemoved) { + $ccScheduleRemoved->setCcWebstream(null); + } + + $this->collCcSchedules = null; + foreach ($ccSchedules as $ccSchedule) { + $this->addCcSchedule($ccSchedule); + } + + $this->collCcSchedules = $ccSchedules; + $this->collCcSchedulesPartial = false; + + return $this; + } + + /** + * Returns the number of related CcSchedule objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CcSchedule objects. + * @throws PropelException + */ + public function countCcSchedules(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCcSchedulesPartial && !$this->isNew(); + if (null === $this->collCcSchedules || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCcSchedules) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCcSchedules()); + } + $query = CcScheduleQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcWebstream($this) + ->count($con); + } + + return count($this->collCcSchedules); + } + + /** + * Method called to associate a CcSchedule object to this object + * through the CcSchedule foreign key attribute. + * + * @param CcSchedule $l CcSchedule + * @return CcWebstream The current object (for fluent API support) + */ + public function addCcSchedule(CcSchedule $l) + { + if ($this->collCcSchedules === null) { + $this->initCcSchedules(); + $this->collCcSchedulesPartial = true; + } + + if (!in_array($l, $this->collCcSchedules->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCcSchedule($l); + + if ($this->ccSchedulesScheduledForDeletion and $this->ccSchedulesScheduledForDeletion->contains($l)) { + $this->ccSchedulesScheduledForDeletion->remove($this->ccSchedulesScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CcSchedule $ccSchedule The ccSchedule object to add. + */ + protected function doAddCcSchedule($ccSchedule) + { + $this->collCcSchedules[]= $ccSchedule; + $ccSchedule->setCcWebstream($this); + } + + /** + * @param CcSchedule $ccSchedule The ccSchedule object to remove. + * @return CcWebstream The current object (for fluent API support) + */ + public function removeCcSchedule($ccSchedule) + { + if ($this->getCcSchedules()->contains($ccSchedule)) { + $this->collCcSchedules->remove($this->collCcSchedules->search($ccSchedule)); + if (null === $this->ccSchedulesScheduledForDeletion) { + $this->ccSchedulesScheduledForDeletion = clone $this->collCcSchedules; + $this->ccSchedulesScheduledForDeletion->clear(); + } + $this->ccSchedulesScheduledForDeletion[]= $ccSchedule; + $ccSchedule->setCcWebstream(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcWebstream is new, it will return + * an empty collection; or if this CcWebstream has previously + * been saved, it will retrieve related CcSchedules from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcWebstream. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcSchedule[] List of CcSchedule objects + */ + public function getCcSchedulesJoinCcShowInstances($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcScheduleQuery::create(null, $criteria); + $query->joinWith('CcShowInstances', $join_behavior); + + return $this->getCcSchedules($query, $con); + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this CcWebstream is new, it will return + * an empty collection; or if this CcWebstream has previously + * been saved, it will retrieve related CcSchedules from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in CcWebstream. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @param string $join_behavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return PropelObjectCollection|CcSchedule[] List of CcSchedule objects + */ + public function getCcSchedulesJoinCcFiles($criteria = null, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $query = CcScheduleQuery::create(null, $criteria); + $query->joinWith('CcFiles', $join_behavior); + + return $this->getCcSchedules($query, $con); + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->name = null; + $this->description = null; + $this->url = null; + $this->length = null; + $this->creator_id = null; + $this->mtime = null; + $this->utime = null; + $this->lptime = null; + $this->mime = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCcSchedules) { + foreach ($this->collCcSchedules as $o) { + $o->clearAllReferences($deep); + } + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + if ($this->collCcSchedules instanceof PropelCollection) { + $this->collCcSchedules->clearIterator(); + } + $this->collCcSchedules = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcWebstreamPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcWebstreamMetadata.php b/airtime_mvc/application/models/airtime/om/BaseCcWebstreamMetadata.php index f5730573cd..2976c85c4e 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcWebstreamMetadata.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcWebstreamMetadata.php @@ -4,954 +4,1074 @@ /** * Base class that represents a row from the 'cc_webstream_metadata' table. * - * + * * * @package propel.generator.airtime.om */ -abstract class BaseCcWebstreamMetadata extends BaseObject implements Persistent +abstract class BaseCcWebstreamMetadata extends BaseObject implements Persistent { - - /** - * Peer class name - */ - const PEER = 'CcWebstreamMetadataPeer'; - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var CcWebstreamMetadataPeer - */ - protected static $peer; - - /** - * The value for the id field. - * @var int - */ - protected $id; - - /** - * The value for the instance_id field. - * @var int - */ - protected $instance_id; - - /** - * The value for the start_time field. - * @var string - */ - protected $start_time; - - /** - * The value for the liquidsoap_data field. - * @var string - */ - protected $liquidsoap_data; - - /** - * @var CcSchedule - */ - protected $aCcSchedule; - - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInSave = false; - - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * Get the [id] column value. - * - * @return int - */ - public function getDbId() - { - return $this->id; - } - - /** - * Get the [instance_id] column value. - * - * @return int - */ - public function getDbInstanceId() - { - return $this->instance_id; - } - - /** - * Get the [optionally formatted] temporal [start_time] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw DateTime object will be returned. - * @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getDbStartTime($format = 'Y-m-d H:i:s') - { - if ($this->start_time === null) { - return null; - } - - - - try { - $dt = new DateTime($this->start_time); - } catch (Exception $x) { - throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->start_time, true), $x); - } - - if ($format === null) { - // Because propel.useDateTimeClass is TRUE, we return a DateTime object. - return $dt; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $dt->format('U')); - } else { - return $dt->format($format); - } - } - - /** - * Get the [liquidsoap_data] column value. - * - * @return string - */ - public function getDbLiquidsoapData() - { - return $this->liquidsoap_data; - } - - /** - * Set the value of [id] column. - * - * @param int $v new value - * @return CcWebstreamMetadata The current object (for fluent API support) - */ - public function setDbId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->id !== $v) { - $this->id = $v; - $this->modifiedColumns[] = CcWebstreamMetadataPeer::ID; - } - - return $this; - } // setDbId() - - /** - * Set the value of [instance_id] column. - * - * @param int $v new value - * @return CcWebstreamMetadata The current object (for fluent API support) - */ - public function setDbInstanceId($v) - { - if ($v !== null) { - $v = (int) $v; - } - - if ($this->instance_id !== $v) { - $this->instance_id = $v; - $this->modifiedColumns[] = CcWebstreamMetadataPeer::INSTANCE_ID; - } - - if ($this->aCcSchedule !== null && $this->aCcSchedule->getDbId() !== $v) { - $this->aCcSchedule = null; - } - - return $this; - } // setDbInstanceId() - - /** - * Sets the value of [start_time] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return CcWebstreamMetadata The current object (for fluent API support) - */ - public function setDbStartTime($v) - { - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if ($v === null || $v === '') { - $dt = null; - } elseif ($v instanceof DateTime) { - $dt = $v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric($v)) { // if it's a unix timestamp - $dt = new DateTime('@'.$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - $dt = new DateTime($v); - } - } catch (Exception $x) { - throw new PropelException('Error parsing date/time value: ' . var_export($v, true), $x); - } - } - - if ( $this->start_time !== null || $dt !== null ) { - // (nested ifs are a little easier to read in this case) - - $currNorm = ($this->start_time !== null && $tmpDt = new DateTime($this->start_time)) ? $tmpDt->format('Y-m-d\\TH:i:sO') : null; - $newNorm = ($dt !== null) ? $dt->format('Y-m-d\\TH:i:sO') : null; - - if ( ($currNorm !== $newNorm) // normalized values don't match - ) - { - $this->start_time = ($dt ? $dt->format('Y-m-d\\TH:i:sO') : null); - $this->modifiedColumns[] = CcWebstreamMetadataPeer::START_TIME; - } - } // if either are not null - - return $this; - } // setDbStartTime() - - /** - * Set the value of [liquidsoap_data] column. - * - * @param string $v new value - * @return CcWebstreamMetadata The current object (for fluent API support) - */ - public function setDbLiquidsoapData($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->liquidsoap_data !== $v) { - $this->liquidsoap_data = $v; - $this->modifiedColumns[] = CcWebstreamMetadataPeer::LIQUIDSOAP_DATA; - } - - return $this; - } // setDbLiquidsoapData() - - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */ - public function hasOnlyDefaultValues() - { - // otherwise, everything was equal, so return TRUE - return true; - } // hasOnlyDefaultValues() - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int $startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean $rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate($row, $startcol = 0, $rehydrate = false) - { - try { - - $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->instance_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; - $this->start_time = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; - $this->liquidsoap_data = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; - $this->resetModified(); - - $this->setNew(false); - - if ($rehydrate) { - $this->ensureConsistency(); - } - - return $startcol + 4; // 4 = CcWebstreamMetadataPeer::NUM_COLUMNS - CcWebstreamMetadataPeer::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception $e) { - throw new PropelException("Error populating CcWebstreamMetadata object", $e); - } - } - - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { - - if ($this->aCcSchedule !== null && $this->instance_id !== $this->aCcSchedule->getDbId()) { - $this->aCcSchedule = null; - } - } // ensureConsistency - - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean $deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO $con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload($deep = false, PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("Cannot reload a deleted object."); - } - - if ($this->isNew()) { - throw new PropelException("Cannot reload an unsaved object."); - } - - if ($con === null) { - $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - $stmt = CcWebstreamMetadataPeer::doSelectStmt($this->buildPkeyCriteria(), $con); - $row = $stmt->fetch(PDO::FETCH_NUM); - $stmt->closeCursor(); - if (!$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - $this->hydrate($row, 0, true); // rehydrate - - if ($deep) { // also de-associate any related objects? - - $this->aCcSchedule = null; - } // if (deep) - } - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - try { - $ret = $this->preDelete($con); - if ($ret) { - CcWebstreamMetadataQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $this->postDelete($con); - $con->commit(); - $this->setDeleted(true); - } else { - $con->commit(); - } - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */ - public function save(PropelPDO $con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $con->beginTransaction(); - $isInsert = $this->isNew(); - try { - $ret = $this->preSave($con); - if ($isInsert) { - $ret = $ret && $this->preInsert($con); - } else { - $ret = $ret && $this->preUpdate($con); - } - if ($ret) { - $affectedRows = $this->doSave($con); - if ($isInsert) { - $this->postInsert($con); - } else { - $this->postUpdate($con); - } - $this->postSave($con); - CcWebstreamMetadataPeer::addInstanceToPool($this); - } else { - $affectedRows = 0; - } - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO $con - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO $con) - { - $affectedRows = 0; // initialize var to track total num of affected rows - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSchedule !== null) { - if ($this->aCcSchedule->isModified() || $this->aCcSchedule->isNew()) { - $affectedRows += $this->aCcSchedule->save($con); - } - $this->setCcSchedule($this->aCcSchedule); - } - - if ($this->isNew() ) { - $this->modifiedColumns[] = CcWebstreamMetadataPeer::ID; - } - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $criteria = $this->buildCriteria(); - if ($criteria->keyContainsValue(CcWebstreamMetadataPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcWebstreamMetadataPeer::ID.')'); - } - - $pk = BasePeer::doInsert($criteria, $con); - $affectedRows += 1; - $this->setDbId($pk); //[IMV] update autoincrement primary key - $this->setNew(false); - } else { - $affectedRows += CcWebstreamMetadataPeer::doUpdate($this, $con); - } - - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - - $this->alreadyInSave = false; - - } - return $affectedRows; - } // doSave() - - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected $validationFailures = array(); - - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return $this->validationFailures; - } - - /** - * Validates the objects modified field values and all objects related to this table. - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate($columns = null) - { - $res = $this->doValidate($columns); - if ($res === true) { - $this->validationFailures = array(); - return true; - } else { - $this->validationFailures = $res; - return false; - } - } - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array $columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate($columns = null) - { - if (!$this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this->aCcSchedule !== null) { - if (!$this->aCcSchedule->validate($columns)) { - $failureMap = array_merge($failureMap, $this->aCcSchedule->getValidationFailures()); - } - } - - - if (($retval = CcWebstreamMetadataPeer::doValidate($this, $columns)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcWebstreamMetadataPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - $field = $this->getByPosition($pos); - return $field; - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { - case 0: - return $this->getDbId(); - break; - case 1: - return $this->getDbInstanceId(); - break; - case 2: - return $this->getDbStartTime(); - break; - case 3: - return $this->getDbLiquidsoapData(); - break; - default: - return null; - break; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. - * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $includeForeignObjects = false) - { - $keys = CcWebstreamMetadataPeer::getFieldNames($keyType); - $result = array( - $keys[0] => $this->getDbId(), - $keys[1] => $this->getDbInstanceId(), - $keys[2] => $this->getDbStartTime(), - $keys[3] => $this->getDbLiquidsoapData(), - ); - if ($includeForeignObjects) { - if (null !== $this->aCcSchedule) { - $result['CcSchedule'] = $this->aCcSchedule->toArray($keyType, $includeLazyLoadColumns, true); - } - } - return $result; - } - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) - { - $pos = CcWebstreamMetadataPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { - case 0: - $this->setDbId($value); - break; - case 1: - $this->setDbInstanceId($value); - break; - case 2: - $this->setDbStartTime($value); - break; - case 3: - $this->setDbLiquidsoapData($value); - break; - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) - { - $keys = CcWebstreamMetadataPeer::getFieldNames($keyType); - - if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setDbInstanceId($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setDbStartTime($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setDbLiquidsoapData($arr[$keys[3]]); - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(CcWebstreamMetadataPeer::DATABASE_NAME); - - if ($this->isColumnModified(CcWebstreamMetadataPeer::ID)) $criteria->add(CcWebstreamMetadataPeer::ID, $this->id); - if ($this->isColumnModified(CcWebstreamMetadataPeer::INSTANCE_ID)) $criteria->add(CcWebstreamMetadataPeer::INSTANCE_ID, $this->instance_id); - if ($this->isColumnModified(CcWebstreamMetadataPeer::START_TIME)) $criteria->add(CcWebstreamMetadataPeer::START_TIME, $this->start_time); - if ($this->isColumnModified(CcWebstreamMetadataPeer::LIQUIDSOAP_DATA)) $criteria->add(CcWebstreamMetadataPeer::LIQUIDSOAP_DATA, $this->liquidsoap_data); - - return $criteria; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(CcWebstreamMetadataPeer::DATABASE_NAME); - $criteria->add(CcWebstreamMetadataPeer::ID, $this->id); - - return $criteria; - } - - /** - * Returns the primary key for this object (row). - * @return int - */ - public function getPrimaryKey() - { - return $this->getDbId(); - } - - /** - * Generic method to set the primary key (id column). - * - * @param int $key Primary key. - * @return void - */ - public function setPrimaryKey($key) - { - $this->setDbId($key); - } - - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - { - return null === $this->getDbId(); - } - - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object $copyObj An object of CcWebstreamMetadata (or compatible) type. - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto($copyObj, $deepCopy = false) - { - $copyObj->setDbInstanceId($this->instance_id); - $copyObj->setDbStartTime($this->start_time); - $copyObj->setDbLiquidsoapData($this->liquidsoap_data); - - $copyObj->setNew(true); - $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value - } - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return CcWebstreamMetadata Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - // we use get_class(), because this might be a subclass - $clazz = get_class($this); - $copyObj = new $clazz(); - $this->copyInto($copyObj, $deepCopy); - return $copyObj; - } - - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return CcWebstreamMetadataPeer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new CcWebstreamMetadataPeer(); - } - return self::$peer; - } - - /** - * Declares an association between this object and a CcSchedule object. - * - * @param CcSchedule $v - * @return CcWebstreamMetadata The current object (for fluent API support) - * @throws PropelException - */ - public function setCcSchedule(CcSchedule $v = null) - { - if ($v === null) { - $this->setDbInstanceId(NULL); - } else { - $this->setDbInstanceId($v->getDbId()); - } - - $this->aCcSchedule = $v; - - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the CcSchedule object, it will not be re-added. - if ($v !== null) { - $v->addCcWebstreamMetadata($this); - } - - return $this; - } - - - /** - * Get the associated CcSchedule object - * - * @param PropelPDO Optional Connection object. - * @return CcSchedule The associated CcSchedule object. - * @throws PropelException - */ - public function getCcSchedule(PropelPDO $con = null) - { - if ($this->aCcSchedule === null && ($this->instance_id !== null)) { - $this->aCcSchedule = CcScheduleQuery::create()->findPk($this->instance_id, $con); - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - $this->aCcSchedule->addCcWebstreamMetadatas($this); - */ - } - return $this->aCcSchedule; - } - - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - { - $this->id = null; - $this->instance_id = null; - $this->start_time = null; - $this->liquidsoap_data = null; - $this->alreadyInSave = false; - $this->alreadyInValidation = false; - $this->clearAllReferences(); - $this->resetModified(); - $this->setNew(true); - $this->setDeleted(false); - } - - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean $deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences($deep = false) - { - if ($deep) { - } // if ($deep) - - $this->aCcSchedule = null; - } - - /** - * Catches calls to virtual methods - */ - public function __call($name, $params) - { - if (preg_match('/get(\w+)/', $name, $matches)) { - $virtualColumn = $matches[1]; - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - // no lcfirst in php<5.3... - $virtualColumn[0] = strtolower($virtualColumn[0]); - if ($this->hasVirtualColumn($virtualColumn)) { - return $this->getVirtualColumn($virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . $name); - } - -} // BaseCcWebstreamMetadata + /** + * Peer class name + */ + const PEER = 'CcWebstreamMetadataPeer'; + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var CcWebstreamMetadataPeer + */ + protected static $peer; + + /** + * The flag var to prevent infinite loop in deep copy + * @var boolean + */ + protected $startCopy = false; + + /** + * The value for the id field. + * @var int + */ + protected $id; + + /** + * The value for the instance_id field. + * @var int + */ + protected $instance_id; + + /** + * The value for the start_time field. + * @var string + */ + protected $start_time; + + /** + * The value for the liquidsoap_data field. + * @var string + */ + protected $liquidsoap_data; + + /** + * @var CcSchedule + */ + protected $aCcSchedule; + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * Flag to prevent endless clearAllReferences($deep=true) loop, if this object is referenced + * @var boolean + */ + protected $alreadyInClearAllReferencesDeep = false; + + /** + * Get the [id] column value. + * + * @return int + */ + public function getDbId() + { + + return $this->id; + } + + /** + * Get the [instance_id] column value. + * + * @return int + */ + public function getDbInstanceId() + { + + return $this->instance_id; + } + + /** + * Get the [optionally formatted] temporal [start_time] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is null, then the raw DateTime object will be returned. + * @return mixed Formatted date/time value as string or DateTime object (if format is null), null if column is null + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getDbStartTime($format = 'Y-m-d H:i:s') + { + if ($this->start_time === null) { + return null; + } + + + try { + $dt = new DateTime($this->start_time); + } catch (Exception $x) { + throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->start_time, true), $x); + } + + if ($format === null) { + // Because propel.useDateTimeClass is true, we return a DateTime object. + return $dt; + } + + if (strpos($format, '%') !== false) { + return strftime($format, $dt->format('U')); + } + + return $dt->format($format); + + } + + /** + * Get the [liquidsoap_data] column value. + * + * @return string + */ + public function getDbLiquidsoapData() + { + + return $this->liquidsoap_data; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CcWebstreamMetadata The current object (for fluent API support) + */ + public function setDbId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CcWebstreamMetadataPeer::ID; + } + + + return $this; + } // setDbId() + + /** + * Set the value of [instance_id] column. + * + * @param int $v new value + * @return CcWebstreamMetadata The current object (for fluent API support) + */ + public function setDbInstanceId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->instance_id !== $v) { + $this->instance_id = $v; + $this->modifiedColumns[] = CcWebstreamMetadataPeer::INSTANCE_ID; + } + + if ($this->aCcSchedule !== null && $this->aCcSchedule->getDbId() !== $v) { + $this->aCcSchedule = null; + } + + + return $this; + } // setDbInstanceId() + + /** + * Sets the value of [start_time] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or DateTime value. + * Empty strings are treated as null. + * @return CcWebstreamMetadata The current object (for fluent API support) + */ + public function setDbStartTime($v) + { + $dt = PropelDateTime::newInstance($v, null, 'DateTime'); + if ($this->start_time !== null || $dt !== null) { + $currentDateAsString = ($this->start_time !== null && $tmpDt = new DateTime($this->start_time)) ? $tmpDt->format('Y-m-d H:i:s') : null; + $newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null; + if ($currentDateAsString !== $newDateAsString) { + $this->start_time = $newDateAsString; + $this->modifiedColumns[] = CcWebstreamMetadataPeer::START_TIME; + } + } // if either are not null + + + return $this; + } // setDbStartTime() + + /** + * Set the value of [liquidsoap_data] column. + * + * @param string $v new value + * @return CcWebstreamMetadata The current object (for fluent API support) + */ + public function setDbLiquidsoapData($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->liquidsoap_data !== $v) { + $this->liquidsoap_data = $v; + $this->modifiedColumns[] = CcWebstreamMetadataPeer::LIQUIDSOAP_DATA; + } + + + return $this; + } // setDbLiquidsoapData() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->instance_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null; + $this->start_time = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->liquidsoap_data = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 4; // 4 = CcWebstreamMetadataPeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CcWebstreamMetadata object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcSchedule !== null && $this->instance_id !== $this->aCcSchedule->getDbId()) { + $this->aCcSchedule = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CcWebstreamMetadataPeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcSchedule = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CcWebstreamMetadataQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CcWebstreamMetadataPeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSchedule !== null) { + if ($this->aCcSchedule->isModified() || $this->aCcSchedule->isNew()) { + $affectedRows += $this->aCcSchedule->save($con); + } + $this->setCcSchedule($this->aCcSchedule); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CcWebstreamMetadataPeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CcWebstreamMetadataPeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cc_webstream_metadata_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CcWebstreamMetadataPeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CcWebstreamMetadataPeer::INSTANCE_ID)) { + $modifiedColumns[':p' . $index++] = '"instance_id"'; + } + if ($this->isColumnModified(CcWebstreamMetadataPeer::START_TIME)) { + $modifiedColumns[':p' . $index++] = '"start_time"'; + } + if ($this->isColumnModified(CcWebstreamMetadataPeer::LIQUIDSOAP_DATA)) { + $modifiedColumns[':p' . $index++] = '"liquidsoap_data"'; + } + + $sql = sprintf( + 'INSERT INTO "cc_webstream_metadata" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"instance_id"': + $stmt->bindValue($identifier, $this->instance_id, PDO::PARAM_INT); + break; + case '"start_time"': + $stmt->bindValue($identifier, $this->start_time, PDO::PARAM_STR); + break; + case '"liquidsoap_data"': + $stmt->bindValue($identifier, $this->liquidsoap_data, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcSchedule !== null) { + if (!$this->aCcSchedule->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcSchedule->getValidationFailures()); + } + } + + + if (($retval = CcWebstreamMetadataPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcWebstreamMetadataPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getDbId(); + break; + case 1: + return $this->getDbInstanceId(); + break; + case 2: + return $this->getDbStartTime(); + break; + case 3: + return $this->getDbLiquidsoapData(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CcWebstreamMetadata'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CcWebstreamMetadata'][$this->getPrimaryKey()] = true; + $keys = CcWebstreamMetadataPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getDbId(), + $keys[1] => $this->getDbInstanceId(), + $keys[2] => $this->getDbStartTime(), + $keys[3] => $this->getDbLiquidsoapData(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcSchedule) { + $result['CcSchedule'] = $this->aCcSchedule->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CcWebstreamMetadataPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setDbId($value); + break; + case 1: + $this->setDbInstanceId($value); + break; + case 2: + $this->setDbStartTime($value); + break; + case 3: + $this->setDbLiquidsoapData($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CcWebstreamMetadataPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setDbInstanceId($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDbStartTime($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setDbLiquidsoapData($arr[$keys[3]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CcWebstreamMetadataPeer::DATABASE_NAME); + + if ($this->isColumnModified(CcWebstreamMetadataPeer::ID)) $criteria->add(CcWebstreamMetadataPeer::ID, $this->id); + if ($this->isColumnModified(CcWebstreamMetadataPeer::INSTANCE_ID)) $criteria->add(CcWebstreamMetadataPeer::INSTANCE_ID, $this->instance_id); + if ($this->isColumnModified(CcWebstreamMetadataPeer::START_TIME)) $criteria->add(CcWebstreamMetadataPeer::START_TIME, $this->start_time); + if ($this->isColumnModified(CcWebstreamMetadataPeer::LIQUIDSOAP_DATA)) $criteria->add(CcWebstreamMetadataPeer::LIQUIDSOAP_DATA, $this->liquidsoap_data); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CcWebstreamMetadataPeer::DATABASE_NAME); + $criteria->add(CcWebstreamMetadataPeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getDbId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setDbId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getDbId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CcWebstreamMetadata (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setDbInstanceId($this->getDbInstanceId()); + $copyObj->setDbStartTime($this->getDbStartTime()); + $copyObj->setDbLiquidsoapData($this->getDbLiquidsoapData()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CcWebstreamMetadata Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CcWebstreamMetadataPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CcWebstreamMetadataPeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcSchedule object. + * + * @param CcSchedule $v + * @return CcWebstreamMetadata The current object (for fluent API support) + * @throws PropelException + */ + public function setCcSchedule(CcSchedule $v = null) + { + if ($v === null) { + $this->setDbInstanceId(NULL); + } else { + $this->setDbInstanceId($v->getDbId()); + } + + $this->aCcSchedule = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcSchedule object, it will not be re-added. + if ($v !== null) { + $v->addCcWebstreamMetadata($this); + } + + + return $this; + } + + + /** + * Get the associated CcSchedule object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcSchedule The associated CcSchedule object. + * @throws PropelException + */ + public function getCcSchedule(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcSchedule === null && ($this->instance_id !== null) && $doQuery) { + $this->aCcSchedule = CcScheduleQuery::create()->findPk($this->instance_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcSchedule->addCcWebstreamMetadatas($this); + */ + } + + return $this->aCcSchedule; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->instance_id = null; + $this->start_time = null; + $this->liquidsoap_data = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcSchedule instanceof Persistent) { + $this->aCcSchedule->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcSchedule = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CcWebstreamMetadataPeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcWebstreamMetadataPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcWebstreamMetadataPeer.php index 445e9793cb..b34c28fc6c 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcWebstreamMetadataPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcWebstreamMetadataPeer.php @@ -4,976 +4,1002 @@ /** * Base static class for performing query and update operations on the 'cc_webstream_metadata' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcWebstreamMetadataPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_webstream_metadata'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcWebstreamMetadata'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcWebstreamMetadata'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcWebstreamMetadataTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 4; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_webstream_metadata.ID'; - - /** the column name for the INSTANCE_ID field */ - const INSTANCE_ID = 'cc_webstream_metadata.INSTANCE_ID'; - - /** the column name for the START_TIME field */ - const START_TIME = 'cc_webstream_metadata.START_TIME'; - - /** the column name for the LIQUIDSOAP_DATA field */ - const LIQUIDSOAP_DATA = 'cc_webstream_metadata.LIQUIDSOAP_DATA'; - - /** - * An identiy map to hold any loaded instances of CcWebstreamMetadata objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcWebstreamMetadata[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbInstanceId', 'DbStartTime', 'DbLiquidsoapData', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbInstanceId', 'dbStartTime', 'dbLiquidsoapData', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::INSTANCE_ID, self::START_TIME, self::LIQUIDSOAP_DATA, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'INSTANCE_ID', 'START_TIME', 'LIQUIDSOAP_DATA', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'instance_id', 'start_time', 'liquidsoap_data', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbInstanceId' => 1, 'DbStartTime' => 2, 'DbLiquidsoapData' => 3, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbInstanceId' => 1, 'dbStartTime' => 2, 'dbLiquidsoapData' => 3, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::INSTANCE_ID => 1, self::START_TIME => 2, self::LIQUIDSOAP_DATA => 3, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'INSTANCE_ID' => 1, 'START_TIME' => 2, 'LIQUIDSOAP_DATA' => 3, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'instance_id' => 1, 'start_time' => 2, 'liquidsoap_data' => 3, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcWebstreamMetadataPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcWebstreamMetadataPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcWebstreamMetadataPeer::ID); - $criteria->addSelectColumn(CcWebstreamMetadataPeer::INSTANCE_ID); - $criteria->addSelectColumn(CcWebstreamMetadataPeer::START_TIME); - $criteria->addSelectColumn(CcWebstreamMetadataPeer::LIQUIDSOAP_DATA); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.INSTANCE_ID'); - $criteria->addSelectColumn($alias . '.START_TIME'); - $criteria->addSelectColumn($alias . '.LIQUIDSOAP_DATA'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcWebstreamMetadataPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcWebstreamMetadataPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcWebstreamMetadata - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcWebstreamMetadataPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcWebstreamMetadataPeer::populateObjects(CcWebstreamMetadataPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcWebstreamMetadataPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcWebstreamMetadata $value A CcWebstreamMetadata object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcWebstreamMetadata $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcWebstreamMetadata object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcWebstreamMetadata) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcWebstreamMetadata object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcWebstreamMetadata Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_webstream_metadata - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcWebstreamMetadataPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcWebstreamMetadataPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcWebstreamMetadataPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcWebstreamMetadataPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcWebstreamMetadata object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcWebstreamMetadataPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcWebstreamMetadataPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcWebstreamMetadataPeer::NUM_COLUMNS; - } else { - $cls = CcWebstreamMetadataPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcWebstreamMetadataPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - - /** - * Returns the number of rows matching criteria, joining the related CcSchedule table - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinCcSchedule(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcWebstreamMetadataPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcWebstreamMetadataPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcWebstreamMetadataPeer::INSTANCE_ID, CcSchedulePeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - - /** - * Selects a collection of CcWebstreamMetadata objects pre-filled with their CcSchedule objects. - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcWebstreamMetadata objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinCcSchedule(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcWebstreamMetadataPeer::addSelectColumns($criteria); - $startcol = (CcWebstreamMetadataPeer::NUM_COLUMNS - CcWebstreamMetadataPeer::NUM_LAZY_LOAD_COLUMNS); - CcSchedulePeer::addSelectColumns($criteria); - - $criteria->addJoin(CcWebstreamMetadataPeer::INSTANCE_ID, CcSchedulePeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcWebstreamMetadataPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcWebstreamMetadataPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - - $cls = CcWebstreamMetadataPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcWebstreamMetadataPeer::addInstanceToPool($obj1, $key1); - } // if $obj1 already loaded - - $key2 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, $startcol); - if ($key2 !== null) { - $obj2 = CcSchedulePeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSchedulePeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol); - CcSchedulePeer::addInstanceToPool($obj2, $key2); - } // if obj2 already loaded - - // Add the $obj1 (CcWebstreamMetadata) to $obj2 (CcSchedule) - $obj2->addCcWebstreamMetadata($obj1); - - } // if joined row was not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - // we're going to modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcWebstreamMetadataPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcWebstreamMetadataPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - if ($con === null) { - $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria->addJoin(CcWebstreamMetadataPeer::INSTANCE_ID, CcSchedulePeer::ID, $join_behavior); - - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - - /** - * Selects a collection of CcWebstreamMetadata objects pre-filled with all related objects. - * - * @param Criteria $criteria - * @param PropelPDO $con - * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN - * @return array Array of CcWebstreamMetadata objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) - { - $criteria = clone $criteria; - - // Set the correct dbName if it has not been overridden - if ($criteria->getDbName() == Propel::getDefaultDB()) { - $criteria->setDbName(self::DATABASE_NAME); - } - - CcWebstreamMetadataPeer::addSelectColumns($criteria); - $startcol2 = (CcWebstreamMetadataPeer::NUM_COLUMNS - CcWebstreamMetadataPeer::NUM_LAZY_LOAD_COLUMNS); - - CcSchedulePeer::addSelectColumns($criteria); - $startcol3 = $startcol2 + (CcSchedulePeer::NUM_COLUMNS - CcSchedulePeer::NUM_LAZY_LOAD_COLUMNS); - - $criteria->addJoin(CcWebstreamMetadataPeer::INSTANCE_ID, CcSchedulePeer::ID, $join_behavior); - - $stmt = BasePeer::doSelect($criteria, $con); - $results = array(); - - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key1 = CcWebstreamMetadataPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj1 = CcWebstreamMetadataPeer::getInstanceFromPool($key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj1->hydrate($row, 0, true); // rehydrate - } else { - $cls = CcWebstreamMetadataPeer::getOMClass(false); - - $obj1 = new $cls(); - $obj1->hydrate($row); - CcWebstreamMetadataPeer::addInstanceToPool($obj1, $key1); - } // if obj1 already loaded - - // Add objects for joined CcSchedule rows - - $key2 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, $startcol2); - if ($key2 !== null) { - $obj2 = CcSchedulePeer::getInstanceFromPool($key2); - if (!$obj2) { - - $cls = CcSchedulePeer::getOMClass(false); - - $obj2 = new $cls(); - $obj2->hydrate($row, $startcol2); - CcSchedulePeer::addInstanceToPool($obj2, $key2); - } // if obj2 loaded - - // Add the $obj1 (CcWebstreamMetadata) to the collection in $obj2 (CcSchedule) - $obj2->addCcWebstreamMetadata($obj1); - } // if joined row not null - - $results[] = $obj1; - } - $stmt->closeCursor(); - return $results; - } - - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcWebstreamMetadataPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcWebstreamMetadataPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcWebstreamMetadataTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcWebstreamMetadataPeer::CLASS_DEFAULT : CcWebstreamMetadataPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcWebstreamMetadata or Criteria object. - * - * @param mixed $values Criteria or CcWebstreamMetadata object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcWebstreamMetadata object - } - - if ($criteria->containsKey(CcWebstreamMetadataPeer::ID) && $criteria->keyContainsValue(CcWebstreamMetadataPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcWebstreamMetadataPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcWebstreamMetadata or Criteria object. - * - * @param mixed $values Criteria or CcWebstreamMetadata object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcWebstreamMetadataPeer::ID); - $value = $criteria->remove(CcWebstreamMetadataPeer::ID); - if ($value) { - $selectCriteria->add(CcWebstreamMetadataPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcWebstreamMetadataPeer::TABLE_NAME); - } - - } else { // $values is CcWebstreamMetadata object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_webstream_metadata table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcWebstreamMetadataPeer::TABLE_NAME, $con, CcWebstreamMetadataPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcWebstreamMetadataPeer::clearInstancePool(); - CcWebstreamMetadataPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcWebstreamMetadata or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcWebstreamMetadata object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcWebstreamMetadataPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcWebstreamMetadata) { // it's a model object - // invalidate the cache for this single object - CcWebstreamMetadataPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcWebstreamMetadataPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcWebstreamMetadataPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcWebstreamMetadataPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcWebstreamMetadata object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcWebstreamMetadata $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcWebstreamMetadata $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcWebstreamMetadataPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcWebstreamMetadataPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcWebstreamMetadataPeer::DATABASE_NAME, CcWebstreamMetadataPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcWebstreamMetadata - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcWebstreamMetadataPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcWebstreamMetadataPeer::DATABASE_NAME); - $criteria->add(CcWebstreamMetadataPeer::ID, $pk); - - $v = CcWebstreamMetadataPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcWebstreamMetadataPeer::DATABASE_NAME); - $criteria->add(CcWebstreamMetadataPeer::ID, $pks, Criteria::IN); - $objs = CcWebstreamMetadataPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcWebstreamMetadataPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_webstream_metadata'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcWebstreamMetadata'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcWebstreamMetadataTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 4; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 4; + + /** the column name for the id field */ + const ID = 'cc_webstream_metadata.id'; + + /** the column name for the instance_id field */ + const INSTANCE_ID = 'cc_webstream_metadata.instance_id'; + + /** the column name for the start_time field */ + const START_TIME = 'cc_webstream_metadata.start_time'; + + /** the column name for the liquidsoap_data field */ + const LIQUIDSOAP_DATA = 'cc_webstream_metadata.liquidsoap_data'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcWebstreamMetadata objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcWebstreamMetadata[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcWebstreamMetadataPeer::$fieldNames[CcWebstreamMetadataPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbInstanceId', 'DbStartTime', 'DbLiquidsoapData', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbInstanceId', 'dbStartTime', 'dbLiquidsoapData', ), + BasePeer::TYPE_COLNAME => array (CcWebstreamMetadataPeer::ID, CcWebstreamMetadataPeer::INSTANCE_ID, CcWebstreamMetadataPeer::START_TIME, CcWebstreamMetadataPeer::LIQUIDSOAP_DATA, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'INSTANCE_ID', 'START_TIME', 'LIQUIDSOAP_DATA', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'instance_id', 'start_time', 'liquidsoap_data', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcWebstreamMetadataPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbInstanceId' => 1, 'DbStartTime' => 2, 'DbLiquidsoapData' => 3, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbInstanceId' => 1, 'dbStartTime' => 2, 'dbLiquidsoapData' => 3, ), + BasePeer::TYPE_COLNAME => array (CcWebstreamMetadataPeer::ID => 0, CcWebstreamMetadataPeer::INSTANCE_ID => 1, CcWebstreamMetadataPeer::START_TIME => 2, CcWebstreamMetadataPeer::LIQUIDSOAP_DATA => 3, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'INSTANCE_ID' => 1, 'START_TIME' => 2, 'LIQUIDSOAP_DATA' => 3, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'instance_id' => 1, 'start_time' => 2, 'liquidsoap_data' => 3, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcWebstreamMetadataPeer::getFieldNames($toType); + $key = isset(CcWebstreamMetadataPeer::$fieldKeys[$fromType][$name]) ? CcWebstreamMetadataPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcWebstreamMetadataPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcWebstreamMetadataPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcWebstreamMetadataPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcWebstreamMetadataPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcWebstreamMetadataPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcWebstreamMetadataPeer::ID); + $criteria->addSelectColumn(CcWebstreamMetadataPeer::INSTANCE_ID); + $criteria->addSelectColumn(CcWebstreamMetadataPeer::START_TIME); + $criteria->addSelectColumn(CcWebstreamMetadataPeer::LIQUIDSOAP_DATA); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.instance_id'); + $criteria->addSelectColumn($alias . '.start_time'); + $criteria->addSelectColumn($alias . '.liquidsoap_data'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcWebstreamMetadataPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcWebstreamMetadataPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcWebstreamMetadataPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcWebstreamMetadata + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcWebstreamMetadataPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcWebstreamMetadataPeer::populateObjects(CcWebstreamMetadataPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcWebstreamMetadataPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcWebstreamMetadataPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcWebstreamMetadata $obj A CcWebstreamMetadata object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcWebstreamMetadataPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcWebstreamMetadata object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcWebstreamMetadata) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcWebstreamMetadata object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcWebstreamMetadataPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcWebstreamMetadata Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcWebstreamMetadataPeer::$instances[$key])) { + return CcWebstreamMetadataPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcWebstreamMetadataPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcWebstreamMetadataPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_webstream_metadata + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcWebstreamMetadataPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcWebstreamMetadataPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcWebstreamMetadataPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcWebstreamMetadataPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcWebstreamMetadata object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcWebstreamMetadataPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcWebstreamMetadataPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcWebstreamMetadataPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcWebstreamMetadataPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcWebstreamMetadataPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcSchedule table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcSchedule(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcWebstreamMetadataPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcWebstreamMetadataPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcWebstreamMetadataPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcWebstreamMetadataPeer::INSTANCE_ID, CcSchedulePeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CcWebstreamMetadata objects pre-filled with their CcSchedule objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcWebstreamMetadata objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcSchedule(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcWebstreamMetadataPeer::DATABASE_NAME); + } + + CcWebstreamMetadataPeer::addSelectColumns($criteria); + $startcol = CcWebstreamMetadataPeer::NUM_HYDRATE_COLUMNS; + CcSchedulePeer::addSelectColumns($criteria); + + $criteria->addJoin(CcWebstreamMetadataPeer::INSTANCE_ID, CcSchedulePeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcWebstreamMetadataPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcWebstreamMetadataPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CcWebstreamMetadataPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcWebstreamMetadataPeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcSchedulePeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSchedulePeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcSchedulePeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CcWebstreamMetadata) to $obj2 (CcSchedule) + $obj2->addCcWebstreamMetadata($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcWebstreamMetadataPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcWebstreamMetadataPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CcWebstreamMetadataPeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CcWebstreamMetadataPeer::INSTANCE_ID, CcSchedulePeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CcWebstreamMetadata objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CcWebstreamMetadata objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CcWebstreamMetadataPeer::DATABASE_NAME); + } + + CcWebstreamMetadataPeer::addSelectColumns($criteria); + $startcol2 = CcWebstreamMetadataPeer::NUM_HYDRATE_COLUMNS; + + CcSchedulePeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcSchedulePeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CcWebstreamMetadataPeer::INSTANCE_ID, CcSchedulePeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CcWebstreamMetadataPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CcWebstreamMetadataPeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CcWebstreamMetadataPeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CcWebstreamMetadataPeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcSchedule rows + + $key2 = CcSchedulePeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcSchedulePeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcSchedulePeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcSchedulePeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CcWebstreamMetadata) to the collection in $obj2 (CcSchedule) + $obj2->addCcWebstreamMetadata($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcWebstreamMetadataPeer::DATABASE_NAME)->getTable(CcWebstreamMetadataPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcWebstreamMetadataPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcWebstreamMetadataPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcWebstreamMetadataTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcWebstreamMetadataPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcWebstreamMetadata or Criteria object. + * + * @param mixed $values Criteria or CcWebstreamMetadata object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcWebstreamMetadata object + } + + if ($criteria->containsKey(CcWebstreamMetadataPeer::ID) && $criteria->keyContainsValue(CcWebstreamMetadataPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcWebstreamMetadataPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcWebstreamMetadataPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcWebstreamMetadata or Criteria object. + * + * @param mixed $values Criteria or CcWebstreamMetadata object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcWebstreamMetadataPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcWebstreamMetadataPeer::ID); + $value = $criteria->remove(CcWebstreamMetadataPeer::ID); + if ($value) { + $selectCriteria->add(CcWebstreamMetadataPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcWebstreamMetadataPeer::TABLE_NAME); + } + + } else { // $values is CcWebstreamMetadata object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcWebstreamMetadataPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_webstream_metadata table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcWebstreamMetadataPeer::TABLE_NAME, $con, CcWebstreamMetadataPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcWebstreamMetadataPeer::clearInstancePool(); + CcWebstreamMetadataPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcWebstreamMetadata or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcWebstreamMetadata object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcWebstreamMetadataPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcWebstreamMetadata) { // it's a model object + // invalidate the cache for this single object + CcWebstreamMetadataPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcWebstreamMetadataPeer::DATABASE_NAME); + $criteria->add(CcWebstreamMetadataPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcWebstreamMetadataPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcWebstreamMetadataPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcWebstreamMetadataPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcWebstreamMetadata object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcWebstreamMetadata $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcWebstreamMetadataPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcWebstreamMetadataPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcWebstreamMetadataPeer::DATABASE_NAME, CcWebstreamMetadataPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcWebstreamMetadata + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcWebstreamMetadataPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcWebstreamMetadataPeer::DATABASE_NAME); + $criteria->add(CcWebstreamMetadataPeer::ID, $pk); + + $v = CcWebstreamMetadataPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcWebstreamMetadata[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcWebstreamMetadataPeer::DATABASE_NAME); + $criteria->add(CcWebstreamMetadataPeer::ID, $pks, Criteria::IN); + $objs = CcWebstreamMetadataPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcWebstreamMetadataPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcWebstreamMetadataQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcWebstreamMetadataQuery.php index ba5bfcb125..ee9ef2b0d8 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcWebstreamMetadataQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcWebstreamMetadataQuery.php @@ -4,326 +4,481 @@ /** * Base class that represents a query for the 'cc_webstream_metadata' table. * - * * - * @method CcWebstreamMetadataQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcWebstreamMetadataQuery orderByDbInstanceId($order = Criteria::ASC) Order by the instance_id column - * @method CcWebstreamMetadataQuery orderByDbStartTime($order = Criteria::ASC) Order by the start_time column - * @method CcWebstreamMetadataQuery orderByDbLiquidsoapData($order = Criteria::ASC) Order by the liquidsoap_data column * - * @method CcWebstreamMetadataQuery groupByDbId() Group by the id column - * @method CcWebstreamMetadataQuery groupByDbInstanceId() Group by the instance_id column - * @method CcWebstreamMetadataQuery groupByDbStartTime() Group by the start_time column - * @method CcWebstreamMetadataQuery groupByDbLiquidsoapData() Group by the liquidsoap_data column + * @method CcWebstreamMetadataQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcWebstreamMetadataQuery orderByDbInstanceId($order = Criteria::ASC) Order by the instance_id column + * @method CcWebstreamMetadataQuery orderByDbStartTime($order = Criteria::ASC) Order by the start_time column + * @method CcWebstreamMetadataQuery orderByDbLiquidsoapData($order = Criteria::ASC) Order by the liquidsoap_data column * - * @method CcWebstreamMetadataQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcWebstreamMetadataQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcWebstreamMetadataQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcWebstreamMetadataQuery groupByDbId() Group by the id column + * @method CcWebstreamMetadataQuery groupByDbInstanceId() Group by the instance_id column + * @method CcWebstreamMetadataQuery groupByDbStartTime() Group by the start_time column + * @method CcWebstreamMetadataQuery groupByDbLiquidsoapData() Group by the liquidsoap_data column * - * @method CcWebstreamMetadataQuery leftJoinCcSchedule($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSchedule relation - * @method CcWebstreamMetadataQuery rightJoinCcSchedule($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSchedule relation - * @method CcWebstreamMetadataQuery innerJoinCcSchedule($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSchedule relation + * @method CcWebstreamMetadataQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcWebstreamMetadataQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcWebstreamMetadataQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcWebstreamMetadata findOne(PropelPDO $con = null) Return the first CcWebstreamMetadata matching the query - * @method CcWebstreamMetadata findOneOrCreate(PropelPDO $con = null) Return the first CcWebstreamMetadata matching the query, or a new CcWebstreamMetadata object populated from the query conditions when no match is found + * @method CcWebstreamMetadataQuery leftJoinCcSchedule($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSchedule relation + * @method CcWebstreamMetadataQuery rightJoinCcSchedule($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSchedule relation + * @method CcWebstreamMetadataQuery innerJoinCcSchedule($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSchedule relation * - * @method CcWebstreamMetadata findOneByDbId(int $id) Return the first CcWebstreamMetadata filtered by the id column - * @method CcWebstreamMetadata findOneByDbInstanceId(int $instance_id) Return the first CcWebstreamMetadata filtered by the instance_id column - * @method CcWebstreamMetadata findOneByDbStartTime(string $start_time) Return the first CcWebstreamMetadata filtered by the start_time column - * @method CcWebstreamMetadata findOneByDbLiquidsoapData(string $liquidsoap_data) Return the first CcWebstreamMetadata filtered by the liquidsoap_data column + * @method CcWebstreamMetadata findOne(PropelPDO $con = null) Return the first CcWebstreamMetadata matching the query + * @method CcWebstreamMetadata findOneOrCreate(PropelPDO $con = null) Return the first CcWebstreamMetadata matching the query, or a new CcWebstreamMetadata object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcWebstreamMetadata objects filtered by the id column - * @method array findByDbInstanceId(int $instance_id) Return CcWebstreamMetadata objects filtered by the instance_id column - * @method array findByDbStartTime(string $start_time) Return CcWebstreamMetadata objects filtered by the start_time column - * @method array findByDbLiquidsoapData(string $liquidsoap_data) Return CcWebstreamMetadata objects filtered by the liquidsoap_data column + * @method CcWebstreamMetadata findOneByDbInstanceId(int $instance_id) Return the first CcWebstreamMetadata filtered by the instance_id column + * @method CcWebstreamMetadata findOneByDbStartTime(string $start_time) Return the first CcWebstreamMetadata filtered by the start_time column + * @method CcWebstreamMetadata findOneByDbLiquidsoapData(string $liquidsoap_data) Return the first CcWebstreamMetadata filtered by the liquidsoap_data column + * + * @method array findByDbId(int $id) Return CcWebstreamMetadata objects filtered by the id column + * @method array findByDbInstanceId(int $instance_id) Return CcWebstreamMetadata objects filtered by the instance_id column + * @method array findByDbStartTime(string $start_time) Return CcWebstreamMetadata objects filtered by the start_time column + * @method array findByDbLiquidsoapData(string $liquidsoap_data) Return CcWebstreamMetadata objects filtered by the liquidsoap_data column * * @package propel.generator.airtime.om */ abstract class BaseCcWebstreamMetadataQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcWebstreamMetadataQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcWebstreamMetadata'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcWebstreamMetadataQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcWebstreamMetadataQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcWebstreamMetadataQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcWebstreamMetadataQuery) { + return $criteria; + } + $query = new CcWebstreamMetadataQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcWebstreamMetadata|CcWebstreamMetadata[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcWebstreamMetadataPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcWebstreamMetadataPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcWebstreamMetadata A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcWebstreamMetadata A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "instance_id", "start_time", "liquidsoap_data" FROM "cc_webstream_metadata" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcWebstreamMetadata(); + $obj->hydrate($row); + CcWebstreamMetadataPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcWebstreamMetadata|CcWebstreamMetadata[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcWebstreamMetadata[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcWebstreamMetadataQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcWebstreamMetadataPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcWebstreamMetadataQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcWebstreamMetadataPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamMetadataQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcWebstreamMetadataPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcWebstreamMetadataPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcWebstreamMetadataPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the instance_id column + * + * Example usage: + * + * $query->filterByDbInstanceId(1234); // WHERE instance_id = 1234 + * $query->filterByDbInstanceId(array(12, 34)); // WHERE instance_id IN (12, 34) + * $query->filterByDbInstanceId(array('min' => 12)); // WHERE instance_id >= 12 + * $query->filterByDbInstanceId(array('max' => 12)); // WHERE instance_id <= 12 + * + * + * @see filterByCcSchedule() + * + * @param mixed $dbInstanceId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamMetadataQuery The current query, for fluid interface + */ + public function filterByDbInstanceId($dbInstanceId = null, $comparison = null) + { + if (is_array($dbInstanceId)) { + $useMinMax = false; + if (isset($dbInstanceId['min'])) { + $this->addUsingAlias(CcWebstreamMetadataPeer::INSTANCE_ID, $dbInstanceId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbInstanceId['max'])) { + $this->addUsingAlias(CcWebstreamMetadataPeer::INSTANCE_ID, $dbInstanceId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcWebstreamMetadataPeer::INSTANCE_ID, $dbInstanceId, $comparison); + } + + /** + * Filter the query on the start_time column + * + * Example usage: + * + * $query->filterByDbStartTime('2011-03-14'); // WHERE start_time = '2011-03-14' + * $query->filterByDbStartTime('now'); // WHERE start_time = '2011-03-14' + * $query->filterByDbStartTime(array('max' => 'yesterday')); // WHERE start_time < '2011-03-13' + * + * + * @param mixed $dbStartTime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamMetadataQuery The current query, for fluid interface + */ + public function filterByDbStartTime($dbStartTime = null, $comparison = null) + { + if (is_array($dbStartTime)) { + $useMinMax = false; + if (isset($dbStartTime['min'])) { + $this->addUsingAlias(CcWebstreamMetadataPeer::START_TIME, $dbStartTime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbStartTime['max'])) { + $this->addUsingAlias(CcWebstreamMetadataPeer::START_TIME, $dbStartTime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcWebstreamMetadataPeer::START_TIME, $dbStartTime, $comparison); + } + + /** + * Filter the query on the liquidsoap_data column + * + * Example usage: + * + * $query->filterByDbLiquidsoapData('fooValue'); // WHERE liquidsoap_data = 'fooValue' + * $query->filterByDbLiquidsoapData('%fooValue%'); // WHERE liquidsoap_data LIKE '%fooValue%' + * + * + * @param string $dbLiquidsoapData The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamMetadataQuery The current query, for fluid interface + */ + public function filterByDbLiquidsoapData($dbLiquidsoapData = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLiquidsoapData)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLiquidsoapData)) { + $dbLiquidsoapData = str_replace('*', '%', $dbLiquidsoapData); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcWebstreamMetadataPeer::LIQUIDSOAP_DATA, $dbLiquidsoapData, $comparison); + } + + /** + * Filter the query by a related CcSchedule object + * + * @param CcSchedule|PropelObjectCollection $ccSchedule The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamMetadataQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSchedule($ccSchedule, $comparison = null) + { + if ($ccSchedule instanceof CcSchedule) { + return $this + ->addUsingAlias(CcWebstreamMetadataPeer::INSTANCE_ID, $ccSchedule->getDbId(), $comparison); + } elseif ($ccSchedule instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CcWebstreamMetadataPeer::INSTANCE_ID, $ccSchedule->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcSchedule() only accepts arguments of type CcSchedule or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSchedule relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcWebstreamMetadataQuery The current query, for fluid interface + */ + public function joinCcSchedule($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSchedule'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSchedule'); + } + + return $this; + } + + /** + * Use the CcSchedule relation CcSchedule object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcScheduleQuery A secondary query class using the current class as primary query + */ + public function useCcScheduleQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinCcSchedule($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSchedule', 'CcScheduleQuery'); + } + + /** + * Exclude object from result + * + * @param CcWebstreamMetadata $ccWebstreamMetadata Object to remove from the list of results + * + * @return CcWebstreamMetadataQuery The current query, for fluid interface + */ + public function prune($ccWebstreamMetadata = null) + { + if ($ccWebstreamMetadata) { + $this->addUsingAlias(CcWebstreamMetadataPeer::ID, $ccWebstreamMetadata->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcWebstreamMetadataQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcWebstreamMetadata', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcWebstreamMetadataQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcWebstreamMetadataQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcWebstreamMetadataQuery) { - return $criteria; - } - $query = new CcWebstreamMetadataQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcWebstreamMetadata|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcWebstreamMetadataPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcWebstreamMetadataQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcWebstreamMetadataPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcWebstreamMetadataQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcWebstreamMetadataPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamMetadataQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcWebstreamMetadataPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the instance_id column - * - * @param int|array $dbInstanceId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamMetadataQuery The current query, for fluid interface - */ - public function filterByDbInstanceId($dbInstanceId = null, $comparison = null) - { - if (is_array($dbInstanceId)) { - $useMinMax = false; - if (isset($dbInstanceId['min'])) { - $this->addUsingAlias(CcWebstreamMetadataPeer::INSTANCE_ID, $dbInstanceId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbInstanceId['max'])) { - $this->addUsingAlias(CcWebstreamMetadataPeer::INSTANCE_ID, $dbInstanceId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcWebstreamMetadataPeer::INSTANCE_ID, $dbInstanceId, $comparison); - } - - /** - * Filter the query on the start_time column - * - * @param string|array $dbStartTime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamMetadataQuery The current query, for fluid interface - */ - public function filterByDbStartTime($dbStartTime = null, $comparison = null) - { - if (is_array($dbStartTime)) { - $useMinMax = false; - if (isset($dbStartTime['min'])) { - $this->addUsingAlias(CcWebstreamMetadataPeer::START_TIME, $dbStartTime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbStartTime['max'])) { - $this->addUsingAlias(CcWebstreamMetadataPeer::START_TIME, $dbStartTime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcWebstreamMetadataPeer::START_TIME, $dbStartTime, $comparison); - } - - /** - * Filter the query on the liquidsoap_data column - * - * @param string $dbLiquidsoapData The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamMetadataQuery The current query, for fluid interface - */ - public function filterByDbLiquidsoapData($dbLiquidsoapData = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLiquidsoapData)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLiquidsoapData)) { - $dbLiquidsoapData = str_replace('*', '%', $dbLiquidsoapData); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcWebstreamMetadataPeer::LIQUIDSOAP_DATA, $dbLiquidsoapData, $comparison); - } - - /** - * Filter the query by a related CcSchedule object - * - * @param CcSchedule $ccSchedule the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamMetadataQuery The current query, for fluid interface - */ - public function filterByCcSchedule($ccSchedule, $comparison = null) - { - return $this - ->addUsingAlias(CcWebstreamMetadataPeer::INSTANCE_ID, $ccSchedule->getDbId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSchedule relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcWebstreamMetadataQuery The current query, for fluid interface - */ - public function joinCcSchedule($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSchedule'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSchedule'); - } - - return $this; - } - - /** - * Use the CcSchedule relation CcSchedule object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcScheduleQuery A secondary query class using the current class as primary query - */ - public function useCcScheduleQuery($relationAlias = '', $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinCcSchedule($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSchedule', 'CcScheduleQuery'); - } - - /** - * Exclude object from result - * - * @param CcWebstreamMetadata $ccWebstreamMetadata Object to remove from the list of results - * - * @return CcWebstreamMetadataQuery The current query, for fluid interface - */ - public function prune($ccWebstreamMetadata = null) - { - if ($ccWebstreamMetadata) { - $this->addUsingAlias(CcWebstreamMetadataPeer::ID, $ccWebstreamMetadata->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcWebstreamMetadataQuery +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCcWebstreamPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcWebstreamPeer.php index c1b2f7221e..6c4dedf93e 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcWebstreamPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcWebstreamPeer.php @@ -4,775 +4,797 @@ /** * Base static class for performing query and update operations on the 'cc_webstream' table. * - * * - * @package propel.generator.airtime.om + * + * @package propel.generator.airtime.om */ -abstract class BaseCcWebstreamPeer { - - /** the default database name for this class */ - const DATABASE_NAME = 'airtime'; - - /** the table name for this class */ - const TABLE_NAME = 'cc_webstream'; - - /** the related Propel class for this table */ - const OM_CLASS = 'CcWebstream'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = 'airtime.CcWebstream'; - - /** the related TableMap class for this table */ - const TM_CLASS = 'CcWebstreamTableMap'; - - /** The total number of columns. */ - const NUM_COLUMNS = 10; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = 0; - - /** the column name for the ID field */ - const ID = 'cc_webstream.ID'; - - /** the column name for the NAME field */ - const NAME = 'cc_webstream.NAME'; - - /** the column name for the DESCRIPTION field */ - const DESCRIPTION = 'cc_webstream.DESCRIPTION'; - - /** the column name for the URL field */ - const URL = 'cc_webstream.URL'; - - /** the column name for the LENGTH field */ - const LENGTH = 'cc_webstream.LENGTH'; - - /** the column name for the CREATOR_ID field */ - const CREATOR_ID = 'cc_webstream.CREATOR_ID'; - - /** the column name for the MTIME field */ - const MTIME = 'cc_webstream.MTIME'; - - /** the column name for the UTIME field */ - const UTIME = 'cc_webstream.UTIME'; - - /** the column name for the LPTIME field */ - const LPTIME = 'cc_webstream.LPTIME'; - - /** the column name for the MIME field */ - const MIME = 'cc_webstream.MIME'; - - /** - * An identiy map to hold any loaded instances of CcWebstream objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array CcWebstream[] - */ - public static $instances = array(); - - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbDescription', 'DbUrl', 'DbLength', 'DbCreatorId', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMime', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbDescription', 'dbUrl', 'dbLength', 'dbCreatorId', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMime', ), - BasePeer::TYPE_COLNAME => array (self::ID, self::NAME, self::DESCRIPTION, self::URL, self::LENGTH, self::CREATOR_ID, self::MTIME, self::UTIME, self::LPTIME, self::MIME, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'DESCRIPTION', 'URL', 'LENGTH', 'CREATOR_ID', 'MTIME', 'UTIME', 'LPTIME', 'MIME', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'description', 'url', 'length', 'creator_id', 'mtime', 'utime', 'lptime', 'mime', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbDescription' => 2, 'DbUrl' => 3, 'DbLength' => 4, 'DbCreatorId' => 5, 'DbMtime' => 6, 'DbUtime' => 7, 'DbLPtime' => 8, 'DbMime' => 9, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbDescription' => 2, 'dbUrl' => 3, 'dbLength' => 4, 'dbCreatorId' => 5, 'dbMtime' => 6, 'dbUtime' => 7, 'dbLPtime' => 8, 'dbMime' => 9, ), - BasePeer::TYPE_COLNAME => array (self::ID => 0, self::NAME => 1, self::DESCRIPTION => 2, self::URL => 3, self::LENGTH => 4, self::CREATOR_ID => 5, self::MTIME => 6, self::UTIME => 7, self::LPTIME => 8, self::MIME => 9, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'DESCRIPTION' => 2, 'URL' => 3, 'LENGTH' => 4, 'CREATOR_ID' => 5, 'MTIME' => 6, 'UTIME' => 7, 'LPTIME' => 8, 'MIME' => 9, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'description' => 2, 'url' => 3, 'length' => 4, 'creator_id' => 5, 'mtime' => 6, 'utime' => 7, 'lptime' => 8, 'mime' => 9, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ) - ); - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; - if ($key === null) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); - } - return $toNames[$key]; - } - - /** - * Returns an array of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists($type, self::$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * $c->addAlias("alias1", TablePeer::TABLE_NAME); - * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string $alias The alias for the current table. - * @param string $column The column name for current table. (i.e. CcWebstreamPeer::COLUMN_NAME). - * @return string - */ - public static function alias($alias, $column) - { - return str_replace(CcWebstreamPeer::TABLE_NAME.'.', $alias.'.', $column); - } - - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad="true" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria $criteria object containing the columns to add. - * @param string $alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria $criteria, $alias = null) - { - if (null === $alias) { - $criteria->addSelectColumn(CcWebstreamPeer::ID); - $criteria->addSelectColumn(CcWebstreamPeer::NAME); - $criteria->addSelectColumn(CcWebstreamPeer::DESCRIPTION); - $criteria->addSelectColumn(CcWebstreamPeer::URL); - $criteria->addSelectColumn(CcWebstreamPeer::LENGTH); - $criteria->addSelectColumn(CcWebstreamPeer::CREATOR_ID); - $criteria->addSelectColumn(CcWebstreamPeer::MTIME); - $criteria->addSelectColumn(CcWebstreamPeer::UTIME); - $criteria->addSelectColumn(CcWebstreamPeer::LPTIME); - $criteria->addSelectColumn(CcWebstreamPeer::MIME); - } else { - $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.NAME'); - $criteria->addSelectColumn($alias . '.DESCRIPTION'); - $criteria->addSelectColumn($alias . '.URL'); - $criteria->addSelectColumn($alias . '.LENGTH'); - $criteria->addSelectColumn($alias . '.CREATOR_ID'); - $criteria->addSelectColumn($alias . '.MTIME'); - $criteria->addSelectColumn($alias . '.UTIME'); - $criteria->addSelectColumn($alias . '.LPTIME'); - $criteria->addSelectColumn($alias . '.MIME'); - } - } - - /** - * Returns the number of rows matching criteria. - * - * @param Criteria $criteria - * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO $con - * @return int Number of matching rows. - */ - public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) - { - // we may modify criteria, so copy it first - $criteria = clone $criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(CcWebstreamPeer::TABLE_NAME); - - if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { - $criteria->setDistinct(); - } - - if (!$criteria->hasSelectClause()) { - CcWebstreamPeer::addSelectColumns($criteria); - } - - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - $criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if ($con === null) { - $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - // BasePeer returns a PDOStatement - $stmt = BasePeer::doCount($criteria, $con); - - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - return $count; - } - /** - * Method to select one object from the DB. - * - * @param Criteria $criteria object used to create the SELECT statement. - * @param PropelPDO $con - * @return CcWebstream - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) - { - $critcopy = clone $criteria; - $critcopy->setLimit(1); - $objects = CcWebstreamPeer::doSelect($critcopy, $con); - if ($objects) { - return $objects[0]; - } - return null; - } - /** - * Method to do selects. - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - return CcWebstreamPeer::populateObjects(CcWebstreamPeer::doSelectStmt($criteria, $con)); - } - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria $criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO $con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see BasePeer::doSelect() - */ - public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!$criteria->hasSelectClause()) { - $criteria = clone $criteria; - CcWebstreamPeer::addSelectColumns($criteria); - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - // BasePeer returns a PDOStatement - return BasePeer::doSelect($criteria, $con); - } - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param CcWebstream $value A CcWebstream object. - * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(CcWebstream $obj, $key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if ($key === null) { - $key = (string) $obj->getDbId(); - } // if key === null - self::$instances[$key] = $obj; - } - } - - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed $value A CcWebstream object or a primary key value. - */ - public static function removeInstanceFromPool($value) - { - if (Propel::isInstancePoolingEnabled() && $value !== null) { - if (is_object($value) && $value instanceof CcWebstream) { - $key = (string) $value->getDbId(); - } elseif (is_scalar($value)) { - // assume we've been passed a primary key - $key = (string) $value; - } else { - $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcWebstream object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); - throw $e; - } - - unset(self::$instances[$key]); - } - } // removeInstanceFromPool() - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string $key The key (@see getPrimaryKeyHash()) for this instance. - * @return CcWebstream Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool($key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::$instances[$key])) { - return self::$instances[$key]; - } - } - return null; // just to be explicit - } - - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::$instances = array(); - } - - /** - * Method to invalidate the instance pool of all tables related to cc_webstream - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - // Invalidate objects in CcSchedulePeer instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - CcSchedulePeer::clearInstancePool(); - } - - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow($row, $startcol = 0) - { - // If the PK cannot be derived from the row, return NULL. - if ($row[$startcol] === null) { - return null; - } - return (string) $row[$startcol]; - } - - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow($row, $startcol = 0) - { - return (int) $row[$startcol]; - } - - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement $stmt) - { - $results = array(); - - // set the class once to avoid overhead in the loop - $cls = CcWebstreamPeer::getOMClass(false); - // populate the object(s) - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $key = CcWebstreamPeer::getPrimaryKeyHashFromRow($row, 0); - if (null !== ($obj = CcWebstreamPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, 0, true); // rehydrate - $results[] = $obj; - } else { - $obj = new $cls(); - $obj->hydrate($row); - $results[] = $obj; - CcWebstreamPeer::addInstanceToPool($obj, $key); - } // if key exists - } - $stmt->closeCursor(); - return $results; - } - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array $row PropelPDO resultset row. - * @param int $startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (CcWebstream object, last column rank) - */ - public static function populateObject($row, $startcol = 0) - { - $key = CcWebstreamPeer::getPrimaryKeyHashFromRow($row, $startcol); - if (null !== ($obj = CcWebstreamPeer::getInstanceFromPool($key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // $obj->hydrate($row, $startcol, true); // rehydrate - $col = $startcol + CcWebstreamPeer::NUM_COLUMNS; - } else { - $cls = CcWebstreamPeer::OM_CLASS; - $obj = new $cls(); - $col = $obj->hydrate($row, $startcol); - CcWebstreamPeer::addInstanceToPool($obj, $key); - } - return array($obj, $col); - } - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } - - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - $dbMap = Propel::getDatabaseMap(BaseCcWebstreamPeer::DATABASE_NAME); - if (!$dbMap->hasTable(BaseCcWebstreamPeer::TABLE_NAME)) - { - $dbMap->addTableObject(new CcWebstreamTableMap()); - } - } - - /** - * The class that the Peer will make instances of. - * - * If $withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean $withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass($withPrefix = true) - { - return $withPrefix ? CcWebstreamPeer::CLASS_DEFAULT : CcWebstreamPeer::OM_CLASS; - } - - /** - * Method perform an INSERT on the database, given a CcWebstream or Criteria object. - * - * @param mixed $values Criteria or CcWebstream object containing data that is used to create the INSERT statement. - * @param PropelPDO $con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - } else { - $criteria = $values->buildCriteria(); // build Criteria from CcWebstream object - } - - if ($criteria->containsKey(CcWebstreamPeer::ID) && $criteria->keyContainsValue(CcWebstreamPeer::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcWebstreamPeer::ID.')'); - } - - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because $criteria could contain info - // for more than one table (I guess, conceivably) - $con->beginTransaction(); - $pk = BasePeer::doInsert($criteria, $con); - $con->commit(); - } catch(PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $pk; - } - - /** - * Method perform an UPDATE on the database, given a CcWebstream or Criteria object. - * - * @param mixed $values Criteria or CcWebstream object containing data that is used to create the UPDATE statement. - * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - $selectCriteria = new Criteria(self::DATABASE_NAME); - - if ($values instanceof Criteria) { - $criteria = clone $values; // rename for clarity - - $comparison = $criteria->getComparison(CcWebstreamPeer::ID); - $value = $criteria->remove(CcWebstreamPeer::ID); - if ($value) { - $selectCriteria->add(CcWebstreamPeer::ID, $value, $comparison); - } else { - $selectCriteria->setPrimaryTableName(CcWebstreamPeer::TABLE_NAME); - } - - } else { // $values is CcWebstream object - $criteria = $values->buildCriteria(); // gets full criteria - $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - return BasePeer::doUpdate($selectCriteria, $criteria, $con); - } - - /** - * Method to DELETE all rows from the cc_webstream table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += BasePeer::doDeleteAll(CcWebstreamPeer::TABLE_NAME, $con, CcWebstreamPeer::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - CcWebstreamPeer::clearInstancePool(); - CcWebstreamPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Method perform a DELETE on the database, given a CcWebstream or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or CcWebstream object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete($values, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if ($values instanceof Criteria) { - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - CcWebstreamPeer::clearInstancePool(); - // rename for clarity - $criteria = clone $values; - } elseif ($values instanceof CcWebstream) { // it's a model object - // invalidate the cache for this single object - CcWebstreamPeer::removeInstanceFromPool($values); - // create criteria based on pk values - $criteria = $values->buildPkeyCriteria(); - } else { // it's a primary key, or an array of pks - $criteria = new Criteria(self::DATABASE_NAME); - $criteria->add(CcWebstreamPeer::ID, (array) $values, Criteria::IN); - // invalidate the cache for this object(s) - foreach ((array) $values as $singleval) { - CcWebstreamPeer::removeInstanceFromPool($singleval); - } - } - - // Set the correct dbName - $criteria->setDbName(self::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - $affectedRows += BasePeer::doDelete($criteria, $con); - CcWebstreamPeer::clearRelatedInstancePool(); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - /** - * Validates all modified columns of given CcWebstream object. - * If parameter $columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param CcWebstream $obj The object to validate. - * @param mixed $cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(CcWebstream $obj, $cols = null) - { - $columns = array(); - - if ($cols) { - $dbMap = Propel::getDatabaseMap(CcWebstreamPeer::DATABASE_NAME); - $tableMap = $dbMap->getTable(CcWebstreamPeer::TABLE_NAME); - - if (! is_array($cols)) { - $cols = array($cols); - } - - foreach ($cols as $colName) { - if ($tableMap->containsColumn($colName)) { - $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); - $columns[$colName] = $obj->$get(); - } - } - } else { - - } - - return BasePeer::doValidate(CcWebstreamPeer::DATABASE_NAME, CcWebstreamPeer::TABLE_NAME, $columns); - } - - /** - * Retrieve a single object by pkey. - * - * @param int $pk the primary key. - * @param PropelPDO $con the connection to use - * @return CcWebstream - */ - public static function retrieveByPK($pk, PropelPDO $con = null) - { - - if (null !== ($obj = CcWebstreamPeer::getInstanceFromPool((string) $pk))) { - return $obj; - } - - if ($con === null) { - $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $criteria = new Criteria(CcWebstreamPeer::DATABASE_NAME); - $criteria->add(CcWebstreamPeer::ID, $pk); - - $v = CcWebstreamPeer::doSelect($criteria, $con); - - return !empty($v) > 0 ? $v[0] : null; - } - - /** - * Retrieve multiple objects by pkey. - * - * @param array $pks List of primary keys - * @param PropelPDO $con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function retrieveByPKs($pks, PropelPDO $con = null) - { - if ($con === null) { - $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_READ); - } - - $objs = null; - if (empty($pks)) { - $objs = array(); - } else { - $criteria = new Criteria(CcWebstreamPeer::DATABASE_NAME); - $criteria->add(CcWebstreamPeer::ID, $pks, Criteria::IN); - $objs = CcWebstreamPeer::doSelect($criteria, $con); - } - return $objs; - } +abstract class BaseCcWebstreamPeer +{ + + /** the default database name for this class */ + const DATABASE_NAME = 'airtime'; + + /** the table name for this class */ + const TABLE_NAME = 'cc_webstream'; + + /** the related Propel class for this table */ + const OM_CLASS = 'CcWebstream'; + + /** the related TableMap class for this table */ + const TM_CLASS = 'CcWebstreamTableMap'; + + /** The total number of columns. */ + const NUM_COLUMNS = 10; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + + /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ + const NUM_HYDRATE_COLUMNS = 10; + + /** the column name for the id field */ + const ID = 'cc_webstream.id'; + + /** the column name for the name field */ + const NAME = 'cc_webstream.name'; + + /** the column name for the description field */ + const DESCRIPTION = 'cc_webstream.description'; + + /** the column name for the url field */ + const URL = 'cc_webstream.url'; + + /** the column name for the length field */ + const LENGTH = 'cc_webstream.length'; + + /** the column name for the creator_id field */ + const CREATOR_ID = 'cc_webstream.creator_id'; + + /** the column name for the mtime field */ + const MTIME = 'cc_webstream.mtime'; + + /** the column name for the utime field */ + const UTIME = 'cc_webstream.utime'; + + /** the column name for the lptime field */ + const LPTIME = 'cc_webstream.lptime'; + + /** the column name for the mime field */ + const MIME = 'cc_webstream.mime'; + + /** The default string format for model objects of the related table **/ + const DEFAULT_STRING_FORMAT = 'YAML'; + + /** + * An identity map to hold any loaded instances of CcWebstream objects. + * This must be public so that other peer classes can access this when hydrating from JOIN + * queries. + * @var array CcWebstream[] + */ + public static $instances = array(); + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. CcWebstreamPeer::$fieldNames[CcWebstreamPeer::TYPE_PHPNAME][0] = 'Id' + */ + protected static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbDescription', 'DbUrl', 'DbLength', 'DbCreatorId', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMime', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbDescription', 'dbUrl', 'dbLength', 'dbCreatorId', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMime', ), + BasePeer::TYPE_COLNAME => array (CcWebstreamPeer::ID, CcWebstreamPeer::NAME, CcWebstreamPeer::DESCRIPTION, CcWebstreamPeer::URL, CcWebstreamPeer::LENGTH, CcWebstreamPeer::CREATOR_ID, CcWebstreamPeer::MTIME, CcWebstreamPeer::UTIME, CcWebstreamPeer::LPTIME, CcWebstreamPeer::MIME, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'DESCRIPTION', 'URL', 'LENGTH', 'CREATOR_ID', 'MTIME', 'UTIME', 'LPTIME', 'MIME', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'description', 'url', 'length', 'creator_id', 'mtime', 'utime', 'lptime', 'mime', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CcWebstreamPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbDescription' => 2, 'DbUrl' => 3, 'DbLength' => 4, 'DbCreatorId' => 5, 'DbMtime' => 6, 'DbUtime' => 7, 'DbLPtime' => 8, 'DbMime' => 9, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbDescription' => 2, 'dbUrl' => 3, 'dbLength' => 4, 'dbCreatorId' => 5, 'dbMtime' => 6, 'dbUtime' => 7, 'dbLPtime' => 8, 'dbMime' => 9, ), + BasePeer::TYPE_COLNAME => array (CcWebstreamPeer::ID => 0, CcWebstreamPeer::NAME => 1, CcWebstreamPeer::DESCRIPTION => 2, CcWebstreamPeer::URL => 3, CcWebstreamPeer::LENGTH => 4, CcWebstreamPeer::CREATOR_ID => 5, CcWebstreamPeer::MTIME => 6, CcWebstreamPeer::UTIME => 7, CcWebstreamPeer::LPTIME => 8, CcWebstreamPeer::MIME => 9, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'DESCRIPTION' => 2, 'URL' => 3, 'LENGTH' => 4, 'CREATOR_ID' => 5, 'MTIME' => 6, 'UTIME' => 7, 'LPTIME' => 8, 'MIME' => 9, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'description' => 2, 'url' => 3, 'length' => 4, 'creator_id' => 5, 'mtime' => 6, 'utime' => 7, 'lptime' => 8, 'mime' => 9, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CcWebstreamPeer::getFieldNames($toType); + $key = isset(CcWebstreamPeer::$fieldKeys[$fromType][$name]) ? CcWebstreamPeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CcWebstreamPeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CcWebstreamPeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CcWebstreamPeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CcWebstreamPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CcWebstreamPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CcWebstreamPeer::ID); + $criteria->addSelectColumn(CcWebstreamPeer::NAME); + $criteria->addSelectColumn(CcWebstreamPeer::DESCRIPTION); + $criteria->addSelectColumn(CcWebstreamPeer::URL); + $criteria->addSelectColumn(CcWebstreamPeer::LENGTH); + $criteria->addSelectColumn(CcWebstreamPeer::CREATOR_ID); + $criteria->addSelectColumn(CcWebstreamPeer::MTIME); + $criteria->addSelectColumn(CcWebstreamPeer::UTIME); + $criteria->addSelectColumn(CcWebstreamPeer::LPTIME); + $criteria->addSelectColumn(CcWebstreamPeer::MIME); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.name'); + $criteria->addSelectColumn($alias . '.description'); + $criteria->addSelectColumn($alias . '.url'); + $criteria->addSelectColumn($alias . '.length'); + $criteria->addSelectColumn($alias . '.creator_id'); + $criteria->addSelectColumn($alias . '.mtime'); + $criteria->addSelectColumn($alias . '.utime'); + $criteria->addSelectColumn($alias . '.lptime'); + $criteria->addSelectColumn($alias . '.mime'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CcWebstreamPeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CcWebstreamPeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CcWebstreamPeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CcWebstream + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CcWebstreamPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CcWebstreamPeer::populateObjects(CcWebstreamPeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CcWebstreamPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CcWebstreamPeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CcWebstream $obj A CcWebstream object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getDbId(); + } // if key === null + CcWebstreamPeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CcWebstream object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CcWebstream) { + $key = (string) $value->getDbId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CcWebstream object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CcWebstreamPeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CcWebstream Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CcWebstreamPeer::$instances[$key])) { + return CcWebstreamPeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CcWebstreamPeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CcWebstreamPeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cc_webstream + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in CcSchedulePeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CcSchedulePeer::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CcWebstreamPeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CcWebstreamPeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CcWebstreamPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CcWebstreamPeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CcWebstream object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CcWebstreamPeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CcWebstreamPeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CcWebstreamPeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CcWebstreamPeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CcWebstreamPeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CcWebstreamPeer::DATABASE_NAME)->getTable(CcWebstreamPeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCcWebstreamPeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCcWebstreamPeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CcWebstreamTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CcWebstreamPeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CcWebstream or Criteria object. + * + * @param mixed $values Criteria or CcWebstream object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CcWebstream object + } + + if ($criteria->containsKey(CcWebstreamPeer::ID) && $criteria->keyContainsValue(CcWebstreamPeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CcWebstreamPeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CcWebstreamPeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CcWebstream or Criteria object. + * + * @param mixed $values Criteria or CcWebstream object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CcWebstreamPeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CcWebstreamPeer::ID); + $value = $criteria->remove(CcWebstreamPeer::ID); + if ($value) { + $selectCriteria->add(CcWebstreamPeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CcWebstreamPeer::TABLE_NAME); + } + + } else { // $values is CcWebstream object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CcWebstreamPeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cc_webstream table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CcWebstreamPeer::TABLE_NAME, $con, CcWebstreamPeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CcWebstreamPeer::clearInstancePool(); + CcWebstreamPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CcWebstream or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CcWebstream object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CcWebstreamPeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CcWebstream) { // it's a model object + // invalidate the cache for this single object + CcWebstreamPeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CcWebstreamPeer::DATABASE_NAME); + $criteria->add(CcWebstreamPeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CcWebstreamPeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CcWebstreamPeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CcWebstreamPeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CcWebstream object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CcWebstream $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CcWebstreamPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CcWebstreamPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CcWebstreamPeer::DATABASE_NAME, CcWebstreamPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CcWebstream + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CcWebstreamPeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CcWebstreamPeer::DATABASE_NAME); + $criteria->add(CcWebstreamPeer::ID, $pk); + + $v = CcWebstreamPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CcWebstream[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CcWebstreamPeer::DATABASE_NAME); + $criteria->add(CcWebstreamPeer::ID, $pks, Criteria::IN); + $objs = CcWebstreamPeer::doSelect($criteria, $con); + } + + return $objs; + } } // BaseCcWebstreamPeer diff --git a/airtime_mvc/application/models/airtime/om/BaseCcWebstreamQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcWebstreamQuery.php index 6f5becfb62..e9d2f2d02e 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcWebstreamQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcWebstreamQuery.php @@ -4,500 +4,703 @@ /** * Base class that represents a query for the 'cc_webstream' table. * - * * - * @method CcWebstreamQuery orderByDbId($order = Criteria::ASC) Order by the id column - * @method CcWebstreamQuery orderByDbName($order = Criteria::ASC) Order by the name column - * @method CcWebstreamQuery orderByDbDescription($order = Criteria::ASC) Order by the description column - * @method CcWebstreamQuery orderByDbUrl($order = Criteria::ASC) Order by the url column - * @method CcWebstreamQuery orderByDbLength($order = Criteria::ASC) Order by the length column - * @method CcWebstreamQuery orderByDbCreatorId($order = Criteria::ASC) Order by the creator_id column - * @method CcWebstreamQuery orderByDbMtime($order = Criteria::ASC) Order by the mtime column - * @method CcWebstreamQuery orderByDbUtime($order = Criteria::ASC) Order by the utime column - * @method CcWebstreamQuery orderByDbLPtime($order = Criteria::ASC) Order by the lptime column - * @method CcWebstreamQuery orderByDbMime($order = Criteria::ASC) Order by the mime column * - * @method CcWebstreamQuery groupByDbId() Group by the id column - * @method CcWebstreamQuery groupByDbName() Group by the name column - * @method CcWebstreamQuery groupByDbDescription() Group by the description column - * @method CcWebstreamQuery groupByDbUrl() Group by the url column - * @method CcWebstreamQuery groupByDbLength() Group by the length column - * @method CcWebstreamQuery groupByDbCreatorId() Group by the creator_id column - * @method CcWebstreamQuery groupByDbMtime() Group by the mtime column - * @method CcWebstreamQuery groupByDbUtime() Group by the utime column - * @method CcWebstreamQuery groupByDbLPtime() Group by the lptime column - * @method CcWebstreamQuery groupByDbMime() Group by the mime column + * @method CcWebstreamQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CcWebstreamQuery orderByDbName($order = Criteria::ASC) Order by the name column + * @method CcWebstreamQuery orderByDbDescription($order = Criteria::ASC) Order by the description column + * @method CcWebstreamQuery orderByDbUrl($order = Criteria::ASC) Order by the url column + * @method CcWebstreamQuery orderByDbLength($order = Criteria::ASC) Order by the length column + * @method CcWebstreamQuery orderByDbCreatorId($order = Criteria::ASC) Order by the creator_id column + * @method CcWebstreamQuery orderByDbMtime($order = Criteria::ASC) Order by the mtime column + * @method CcWebstreamQuery orderByDbUtime($order = Criteria::ASC) Order by the utime column + * @method CcWebstreamQuery orderByDbLPtime($order = Criteria::ASC) Order by the lptime column + * @method CcWebstreamQuery orderByDbMime($order = Criteria::ASC) Order by the mime column * - * @method CcWebstreamQuery leftJoin($relation) Adds a LEFT JOIN clause to the query - * @method CcWebstreamQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query - * @method CcWebstreamQuery innerJoin($relation) Adds a INNER JOIN clause to the query + * @method CcWebstreamQuery groupByDbId() Group by the id column + * @method CcWebstreamQuery groupByDbName() Group by the name column + * @method CcWebstreamQuery groupByDbDescription() Group by the description column + * @method CcWebstreamQuery groupByDbUrl() Group by the url column + * @method CcWebstreamQuery groupByDbLength() Group by the length column + * @method CcWebstreamQuery groupByDbCreatorId() Group by the creator_id column + * @method CcWebstreamQuery groupByDbMtime() Group by the mtime column + * @method CcWebstreamQuery groupByDbUtime() Group by the utime column + * @method CcWebstreamQuery groupByDbLPtime() Group by the lptime column + * @method CcWebstreamQuery groupByDbMime() Group by the mime column * - * @method CcWebstreamQuery leftJoinCcSchedule($relationAlias = '') Adds a LEFT JOIN clause to the query using the CcSchedule relation - * @method CcWebstreamQuery rightJoinCcSchedule($relationAlias = '') Adds a RIGHT JOIN clause to the query using the CcSchedule relation - * @method CcWebstreamQuery innerJoinCcSchedule($relationAlias = '') Adds a INNER JOIN clause to the query using the CcSchedule relation + * @method CcWebstreamQuery leftJoin($relation) Adds a LEFT JOIN clause to the query + * @method CcWebstreamQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query + * @method CcWebstreamQuery innerJoin($relation) Adds a INNER JOIN clause to the query * - * @method CcWebstream findOne(PropelPDO $con = null) Return the first CcWebstream matching the query - * @method CcWebstream findOneOrCreate(PropelPDO $con = null) Return the first CcWebstream matching the query, or a new CcWebstream object populated from the query conditions when no match is found + * @method CcWebstreamQuery leftJoinCcSchedule($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcSchedule relation + * @method CcWebstreamQuery rightJoinCcSchedule($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcSchedule relation + * @method CcWebstreamQuery innerJoinCcSchedule($relationAlias = null) Adds a INNER JOIN clause to the query using the CcSchedule relation * - * @method CcWebstream findOneByDbId(int $id) Return the first CcWebstream filtered by the id column - * @method CcWebstream findOneByDbName(string $name) Return the first CcWebstream filtered by the name column - * @method CcWebstream findOneByDbDescription(string $description) Return the first CcWebstream filtered by the description column - * @method CcWebstream findOneByDbUrl(string $url) Return the first CcWebstream filtered by the url column - * @method CcWebstream findOneByDbLength(string $length) Return the first CcWebstream filtered by the length column - * @method CcWebstream findOneByDbCreatorId(int $creator_id) Return the first CcWebstream filtered by the creator_id column - * @method CcWebstream findOneByDbMtime(string $mtime) Return the first CcWebstream filtered by the mtime column - * @method CcWebstream findOneByDbUtime(string $utime) Return the first CcWebstream filtered by the utime column - * @method CcWebstream findOneByDbLPtime(string $lptime) Return the first CcWebstream filtered by the lptime column - * @method CcWebstream findOneByDbMime(string $mime) Return the first CcWebstream filtered by the mime column + * @method CcWebstream findOne(PropelPDO $con = null) Return the first CcWebstream matching the query + * @method CcWebstream findOneOrCreate(PropelPDO $con = null) Return the first CcWebstream matching the query, or a new CcWebstream object populated from the query conditions when no match is found * - * @method array findByDbId(int $id) Return CcWebstream objects filtered by the id column - * @method array findByDbName(string $name) Return CcWebstream objects filtered by the name column - * @method array findByDbDescription(string $description) Return CcWebstream objects filtered by the description column - * @method array findByDbUrl(string $url) Return CcWebstream objects filtered by the url column - * @method array findByDbLength(string $length) Return CcWebstream objects filtered by the length column - * @method array findByDbCreatorId(int $creator_id) Return CcWebstream objects filtered by the creator_id column - * @method array findByDbMtime(string $mtime) Return CcWebstream objects filtered by the mtime column - * @method array findByDbUtime(string $utime) Return CcWebstream objects filtered by the utime column - * @method array findByDbLPtime(string $lptime) Return CcWebstream objects filtered by the lptime column - * @method array findByDbMime(string $mime) Return CcWebstream objects filtered by the mime column + * @method CcWebstream findOneByDbName(string $name) Return the first CcWebstream filtered by the name column + * @method CcWebstream findOneByDbDescription(string $description) Return the first CcWebstream filtered by the description column + * @method CcWebstream findOneByDbUrl(string $url) Return the first CcWebstream filtered by the url column + * @method CcWebstream findOneByDbLength(string $length) Return the first CcWebstream filtered by the length column + * @method CcWebstream findOneByDbCreatorId(int $creator_id) Return the first CcWebstream filtered by the creator_id column + * @method CcWebstream findOneByDbMtime(string $mtime) Return the first CcWebstream filtered by the mtime column + * @method CcWebstream findOneByDbUtime(string $utime) Return the first CcWebstream filtered by the utime column + * @method CcWebstream findOneByDbLPtime(string $lptime) Return the first CcWebstream filtered by the lptime column + * @method CcWebstream findOneByDbMime(string $mime) Return the first CcWebstream filtered by the mime column + * + * @method array findByDbId(int $id) Return CcWebstream objects filtered by the id column + * @method array findByDbName(string $name) Return CcWebstream objects filtered by the name column + * @method array findByDbDescription(string $description) Return CcWebstream objects filtered by the description column + * @method array findByDbUrl(string $url) Return CcWebstream objects filtered by the url column + * @method array findByDbLength(string $length) Return CcWebstream objects filtered by the length column + * @method array findByDbCreatorId(int $creator_id) Return CcWebstream objects filtered by the creator_id column + * @method array findByDbMtime(string $mtime) Return CcWebstream objects filtered by the mtime column + * @method array findByDbUtime(string $utime) Return CcWebstream objects filtered by the utime column + * @method array findByDbLPtime(string $lptime) Return CcWebstream objects filtered by the lptime column + * @method array findByDbMime(string $mime) Return CcWebstream objects filtered by the mime column * * @package propel.generator.airtime.om */ abstract class BaseCcWebstreamQuery extends ModelCriteria { + /** + * Initializes internal state of BaseCcWebstreamQuery object. + * + * @param string $dbName The dabase name + * @param string $modelName The phpName of a model, e.g. 'Book' + * @param string $modelAlias The alias for the model in this query, e.g. 'b' + */ + public function __construct($dbName = null, $modelName = null, $modelAlias = null) + { + if (null === $dbName) { + $dbName = 'airtime'; + } + if (null === $modelName) { + $modelName = 'CcWebstream'; + } + parent::__construct($dbName, $modelName, $modelAlias); + } + + /** + * Returns a new CcWebstreamQuery object. + * + * @param string $modelAlias The alias of a model in the query + * @param CcWebstreamQuery|Criteria $criteria Optional Criteria to build the query from + * + * @return CcWebstreamQuery + */ + public static function create($modelAlias = null, $criteria = null) + { + if ($criteria instanceof CcWebstreamQuery) { + return $criteria; + } + $query = new CcWebstreamQuery(null, null, $modelAlias); + + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CcWebstream|CcWebstream[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CcWebstreamPeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CcWebstreamPeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcWebstream A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneByDbId($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcWebstream A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "name", "description", "url", "length", "creator_id", "mtime", "utime", "lptime", "mime" FROM "cc_webstream" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CcWebstream(); + $obj->hydrate($row); + CcWebstreamPeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CcWebstream|CcWebstream[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CcWebstream[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CcWebstreamPeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CcWebstreamPeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $dbId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function filterByDbId($dbId = null, $comparison = null) + { + if (is_array($dbId)) { + $useMinMax = false; + if (isset($dbId['min'])) { + $this->addUsingAlias(CcWebstreamPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbId['max'])) { + $this->addUsingAlias(CcWebstreamPeer::ID, $dbId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcWebstreamPeer::ID, $dbId, $comparison); + } + + /** + * Filter the query on the name column + * + * Example usage: + * + * $query->filterByDbName('fooValue'); // WHERE name = 'fooValue' + * $query->filterByDbName('%fooValue%'); // WHERE name LIKE '%fooValue%' + * + * + * @param string $dbName The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function filterByDbName($dbName = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbName)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbName)) { + $dbName = str_replace('*', '%', $dbName); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcWebstreamPeer::NAME, $dbName, $comparison); + } + + /** + * Filter the query on the description column + * + * Example usage: + * + * $query->filterByDbDescription('fooValue'); // WHERE description = 'fooValue' + * $query->filterByDbDescription('%fooValue%'); // WHERE description LIKE '%fooValue%' + * + * + * @param string $dbDescription The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function filterByDbDescription($dbDescription = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbDescription)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbDescription)) { + $dbDescription = str_replace('*', '%', $dbDescription); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcWebstreamPeer::DESCRIPTION, $dbDescription, $comparison); + } + + /** + * Filter the query on the url column + * + * Example usage: + * + * $query->filterByDbUrl('fooValue'); // WHERE url = 'fooValue' + * $query->filterByDbUrl('%fooValue%'); // WHERE url LIKE '%fooValue%' + * + * + * @param string $dbUrl The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function filterByDbUrl($dbUrl = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbUrl)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbUrl)) { + $dbUrl = str_replace('*', '%', $dbUrl); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcWebstreamPeer::URL, $dbUrl, $comparison); + } + + /** + * Filter the query on the length column + * + * Example usage: + * + * $query->filterByDbLength('fooValue'); // WHERE length = 'fooValue' + * $query->filterByDbLength('%fooValue%'); // WHERE length LIKE '%fooValue%' + * + * + * @param string $dbLength The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function filterByDbLength($dbLength = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbLength)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbLength)) { + $dbLength = str_replace('*', '%', $dbLength); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcWebstreamPeer::LENGTH, $dbLength, $comparison); + } + + /** + * Filter the query on the creator_id column + * + * Example usage: + * + * $query->filterByDbCreatorId(1234); // WHERE creator_id = 1234 + * $query->filterByDbCreatorId(array(12, 34)); // WHERE creator_id IN (12, 34) + * $query->filterByDbCreatorId(array('min' => 12)); // WHERE creator_id >= 12 + * $query->filterByDbCreatorId(array('max' => 12)); // WHERE creator_id <= 12 + * + * + * @param mixed $dbCreatorId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function filterByDbCreatorId($dbCreatorId = null, $comparison = null) + { + if (is_array($dbCreatorId)) { + $useMinMax = false; + if (isset($dbCreatorId['min'])) { + $this->addUsingAlias(CcWebstreamPeer::CREATOR_ID, $dbCreatorId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbCreatorId['max'])) { + $this->addUsingAlias(CcWebstreamPeer::CREATOR_ID, $dbCreatorId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcWebstreamPeer::CREATOR_ID, $dbCreatorId, $comparison); + } + + /** + * Filter the query on the mtime column + * + * Example usage: + * + * $query->filterByDbMtime('2011-03-14'); // WHERE mtime = '2011-03-14' + * $query->filterByDbMtime('now'); // WHERE mtime = '2011-03-14' + * $query->filterByDbMtime(array('max' => 'yesterday')); // WHERE mtime < '2011-03-13' + * + * + * @param mixed $dbMtime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function filterByDbMtime($dbMtime = null, $comparison = null) + { + if (is_array($dbMtime)) { + $useMinMax = false; + if (isset($dbMtime['min'])) { + $this->addUsingAlias(CcWebstreamPeer::MTIME, $dbMtime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbMtime['max'])) { + $this->addUsingAlias(CcWebstreamPeer::MTIME, $dbMtime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcWebstreamPeer::MTIME, $dbMtime, $comparison); + } + + /** + * Filter the query on the utime column + * + * Example usage: + * + * $query->filterByDbUtime('2011-03-14'); // WHERE utime = '2011-03-14' + * $query->filterByDbUtime('now'); // WHERE utime = '2011-03-14' + * $query->filterByDbUtime(array('max' => 'yesterday')); // WHERE utime < '2011-03-13' + * + * + * @param mixed $dbUtime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function filterByDbUtime($dbUtime = null, $comparison = null) + { + if (is_array($dbUtime)) { + $useMinMax = false; + if (isset($dbUtime['min'])) { + $this->addUsingAlias(CcWebstreamPeer::UTIME, $dbUtime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbUtime['max'])) { + $this->addUsingAlias(CcWebstreamPeer::UTIME, $dbUtime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcWebstreamPeer::UTIME, $dbUtime, $comparison); + } + + /** + * Filter the query on the lptime column + * + * Example usage: + * + * $query->filterByDbLPtime('2011-03-14'); // WHERE lptime = '2011-03-14' + * $query->filterByDbLPtime('now'); // WHERE lptime = '2011-03-14' + * $query->filterByDbLPtime(array('max' => 'yesterday')); // WHERE lptime < '2011-03-13' + * + * + * @param mixed $dbLPtime The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function filterByDbLPtime($dbLPtime = null, $comparison = null) + { + if (is_array($dbLPtime)) { + $useMinMax = false; + if (isset($dbLPtime['min'])) { + $this->addUsingAlias(CcWebstreamPeer::LPTIME, $dbLPtime['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($dbLPtime['max'])) { + $this->addUsingAlias(CcWebstreamPeer::LPTIME, $dbLPtime['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CcWebstreamPeer::LPTIME, $dbLPtime, $comparison); + } + + /** + * Filter the query on the mime column + * + * Example usage: + * + * $query->filterByDbMime('fooValue'); // WHERE mime = 'fooValue' + * $query->filterByDbMime('%fooValue%'); // WHERE mime LIKE '%fooValue%' + * + * + * @param string $dbMime The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function filterByDbMime($dbMime = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbMime)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbMime)) { + $dbMime = str_replace('*', '%', $dbMime); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcWebstreamPeer::MIME, $dbMime, $comparison); + } + + /** + * Filter the query by a related CcSchedule object + * + * @param CcSchedule|PropelObjectCollection $ccSchedule the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcWebstreamQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcSchedule($ccSchedule, $comparison = null) + { + if ($ccSchedule instanceof CcSchedule) { + return $this + ->addUsingAlias(CcWebstreamPeer::ID, $ccSchedule->getDbStreamId(), $comparison); + } elseif ($ccSchedule instanceof PropelObjectCollection) { + return $this + ->useCcScheduleQuery() + ->filterByPrimaryKeys($ccSchedule->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCcSchedule() only accepts arguments of type CcSchedule or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcSchedule relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function joinCcSchedule($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcSchedule'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcSchedule'); + } + + return $this; + } + + /** + * Use the CcSchedule relation CcSchedule object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcScheduleQuery A secondary query class using the current class as primary query + */ + public function useCcScheduleQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcSchedule($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcSchedule', 'CcScheduleQuery'); + } + + /** + * Exclude object from result + * + * @param CcWebstream $ccWebstream Object to remove from the list of results + * + * @return CcWebstreamQuery The current query, for fluid interface + */ + public function prune($ccWebstream = null) + { + if ($ccWebstream) { + $this->addUsingAlias(CcWebstreamPeer::ID, $ccWebstream->getDbId(), Criteria::NOT_EQUAL); + } + + return $this; + } - /** - * Initializes internal state of BaseCcWebstreamQuery object. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = 'airtime', $modelName = 'CcWebstream', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - /** - * Returns a new CcWebstreamQuery object. - * - * @param string $modelAlias The alias of a model in the query - * @param Criteria $criteria Optional Criteria to build the query from - * - * @return CcWebstreamQuery - */ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof CcWebstreamQuery) { - return $criteria; - } - $query = new CcWebstreamQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - - /** - * Find object by primary key - * Use instance pooling to avoid a database query if the object exists - * - * $obj = $c->findPk(12, $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return CcWebstream|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ((null !== ($obj = CcWebstreamPeer::getInstanceFromPool((string) $key))) && $this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return $obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria - ->filterByPrimaryKey($key) - ->getSelectStatement($con); - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - return $this - ->filterByPrimaryKeys($keys) - ->find($con); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - return $this->addUsingAlias(CcWebstreamPeer::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - return $this->addUsingAlias(CcWebstreamPeer::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * @param int|array $dbId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function filterByDbId($dbId = null, $comparison = null) - { - if (is_array($dbId) && null === $comparison) { - $comparison = Criteria::IN; - } - return $this->addUsingAlias(CcWebstreamPeer::ID, $dbId, $comparison); - } - - /** - * Filter the query on the name column - * - * @param string $dbName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function filterByDbName($dbName = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbName)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbName)) { - $dbName = str_replace('*', '%', $dbName); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcWebstreamPeer::NAME, $dbName, $comparison); - } - - /** - * Filter the query on the description column - * - * @param string $dbDescription The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function filterByDbDescription($dbDescription = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbDescription)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbDescription)) { - $dbDescription = str_replace('*', '%', $dbDescription); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcWebstreamPeer::DESCRIPTION, $dbDescription, $comparison); - } - - /** - * Filter the query on the url column - * - * @param string $dbUrl The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function filterByDbUrl($dbUrl = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbUrl)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbUrl)) { - $dbUrl = str_replace('*', '%', $dbUrl); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcWebstreamPeer::URL, $dbUrl, $comparison); - } - - /** - * Filter the query on the length column - * - * @param string $dbLength The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function filterByDbLength($dbLength = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbLength)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbLength)) { - $dbLength = str_replace('*', '%', $dbLength); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcWebstreamPeer::LENGTH, $dbLength, $comparison); - } - - /** - * Filter the query on the creator_id column - * - * @param int|array $dbCreatorId The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function filterByDbCreatorId($dbCreatorId = null, $comparison = null) - { - if (is_array($dbCreatorId)) { - $useMinMax = false; - if (isset($dbCreatorId['min'])) { - $this->addUsingAlias(CcWebstreamPeer::CREATOR_ID, $dbCreatorId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbCreatorId['max'])) { - $this->addUsingAlias(CcWebstreamPeer::CREATOR_ID, $dbCreatorId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcWebstreamPeer::CREATOR_ID, $dbCreatorId, $comparison); - } - - /** - * Filter the query on the mtime column - * - * @param string|array $dbMtime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function filterByDbMtime($dbMtime = null, $comparison = null) - { - if (is_array($dbMtime)) { - $useMinMax = false; - if (isset($dbMtime['min'])) { - $this->addUsingAlias(CcWebstreamPeer::MTIME, $dbMtime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbMtime['max'])) { - $this->addUsingAlias(CcWebstreamPeer::MTIME, $dbMtime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcWebstreamPeer::MTIME, $dbMtime, $comparison); - } - - /** - * Filter the query on the utime column - * - * @param string|array $dbUtime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function filterByDbUtime($dbUtime = null, $comparison = null) - { - if (is_array($dbUtime)) { - $useMinMax = false; - if (isset($dbUtime['min'])) { - $this->addUsingAlias(CcWebstreamPeer::UTIME, $dbUtime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbUtime['max'])) { - $this->addUsingAlias(CcWebstreamPeer::UTIME, $dbUtime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcWebstreamPeer::UTIME, $dbUtime, $comparison); - } - - /** - * Filter the query on the lptime column - * - * @param string|array $dbLPtime The value to use as filter. - * Accepts an associative array('min' => $minValue, 'max' => $maxValue) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function filterByDbLPtime($dbLPtime = null, $comparison = null) - { - if (is_array($dbLPtime)) { - $useMinMax = false; - if (isset($dbLPtime['min'])) { - $this->addUsingAlias(CcWebstreamPeer::LPTIME, $dbLPtime['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($dbLPtime['max'])) { - $this->addUsingAlias(CcWebstreamPeer::LPTIME, $dbLPtime['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - return $this->addUsingAlias(CcWebstreamPeer::LPTIME, $dbLPtime, $comparison); - } - - /** - * Filter the query on the mime column - * - * @param string $dbMime The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function filterByDbMime($dbMime = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbMime)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbMime)) { - $dbMime = str_replace('*', '%', $dbMime); - $comparison = Criteria::LIKE; - } - } - return $this->addUsingAlias(CcWebstreamPeer::MIME, $dbMime, $comparison); - } - - /** - * Filter the query by a related CcSchedule object - * - * @param CcSchedule $ccSchedule the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function filterByCcSchedule($ccSchedule, $comparison = null) - { - return $this - ->addUsingAlias(CcWebstreamPeer::ID, $ccSchedule->getDbStreamId(), $comparison); - } - - /** - * Adds a JOIN clause to the query using the CcSchedule relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function joinCcSchedule($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('CcSchedule'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'CcSchedule'); - } - - return $this; - } - - /** - * Use the CcSchedule relation CcSchedule object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return CcScheduleQuery A secondary query class using the current class as primary query - */ - public function useCcScheduleQuery($relationAlias = '', $joinType = Criteria::LEFT_JOIN) - { - return $this - ->joinCcSchedule($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'CcSchedule', 'CcScheduleQuery'); - } - - /** - * Exclude object from result - * - * @param CcWebstream $ccWebstream Object to remove from the list of results - * - * @return CcWebstreamQuery The current query, for fluid interface - */ - public function prune($ccWebstream = null) - { - if ($ccWebstream) { - $this->addUsingAlias(CcWebstreamPeer::ID, $ccWebstream->getDbId(), Criteria::NOT_EQUAL); - } - - return $this; - } - -} // BaseCcWebstreamQuery +} diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index 3ae4497a18..0ef5003d1d 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -1,902 +1,825 @@ ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_music_dirs ------------------------------------------------------------------------------ - -DROP TABLE "cc_music_dirs" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_music_dirs" CASCADE; CREATE TABLE "cc_music_dirs" ( - "id" serial NOT NULL, - "directory" TEXT, - "type" VARCHAR(255), - "exists" BOOLEAN default 't', - "watched" BOOLEAN default 't', - PRIMARY KEY ("id"), - CONSTRAINT "cc_music_dir_unique" UNIQUE ("directory") + "id" serial NOT NULL, + "directory" TEXT, + "type" VARCHAR(255), + "exists" BOOLEAN DEFAULT 't', + "watched" BOOLEAN DEFAULT 't', + PRIMARY KEY ("id"), + CONSTRAINT "cc_music_dir_unique" UNIQUE ("directory") ); -COMMENT ON TABLE "cc_music_dirs" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_files ------------------------------------------------------------------------------ - -DROP TABLE "cc_files" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_files" CASCADE; CREATE TABLE "cc_files" ( - "id" serial NOT NULL, - "name" VARCHAR(255) default '' NOT NULL, - "mime" VARCHAR(255) default '' NOT NULL, - "ftype" VARCHAR(128) default '' NOT NULL, - "directory" INTEGER, - "filepath" TEXT default '', - "import_status" INTEGER default 1 NOT NULL, - "currentlyaccessing" INTEGER default 0 NOT NULL, - "editedby" INTEGER, - "mtime" TIMESTAMP(6), - "utime" TIMESTAMP(6), - "lptime" TIMESTAMP(6), - "md5" CHAR(32), - "track_title" VARCHAR(512), - "artist_name" VARCHAR(512), - "bit_rate" INTEGER, - "sample_rate" INTEGER, - "format" VARCHAR(128), - "length" interval default '00:00:00', - "album_title" VARCHAR(512), - "genre" VARCHAR(64), - "comments" TEXT, - "year" VARCHAR(16), - "track_number" INTEGER, - "channels" INTEGER, - "url" VARCHAR(1024), - "bpm" INTEGER, - "rating" VARCHAR(8), - "encoded_by" VARCHAR(255), - "disc_number" VARCHAR(8), - "mood" VARCHAR(64), - "label" VARCHAR(512), - "composer" VARCHAR(512), - "encoder" VARCHAR(64), - "checksum" VARCHAR(256), - "lyrics" TEXT, - "orchestra" VARCHAR(512), - "conductor" VARCHAR(512), - "lyricist" VARCHAR(512), - "original_lyricist" VARCHAR(512), - "radio_station_name" VARCHAR(512), - "info_url" VARCHAR(512), - "artist_url" VARCHAR(512), - "audio_source_url" VARCHAR(512), - "radio_station_url" VARCHAR(512), - "buy_this_url" VARCHAR(512), - "isrc_number" VARCHAR(512), - "catalog_number" VARCHAR(512), - "original_artist" VARCHAR(512), - "copyright" VARCHAR(512), - "report_datetime" VARCHAR(32), - "report_location" VARCHAR(512), - "report_organization" VARCHAR(512), - "subject" VARCHAR(512), - "contributor" VARCHAR(512), - "language" VARCHAR(512), - "file_exists" BOOLEAN default 't', - "soundcloud_id" INTEGER, - "soundcloud_error_code" INTEGER, - "soundcloud_error_msg" VARCHAR(512), - "soundcloud_link_to_file" VARCHAR(4096), - "soundcloud_upload_time" TIMESTAMP(6), - "replay_gain" NUMERIC, - "owner_id" INTEGER, - "cuein" interval default '00:00:00', - "cueout" interval default '00:00:00', - "silan_check" BOOLEAN default 'f', - "hidden" BOOLEAN default 'f', - "is_scheduled" BOOLEAN default 'f', - "is_playlist" BOOLEAN default 'f', - "resource_id" TEXT, - PRIMARY KEY ("id") -); - -COMMENT ON TABLE "cc_files" IS ''; - - -SET search_path TO public; + "id" serial NOT NULL, + "name" VARCHAR(255) DEFAULT '' NOT NULL, + "mime" VARCHAR(255) DEFAULT '' NOT NULL, + "ftype" VARCHAR(128) DEFAULT '' NOT NULL, + "directory" INTEGER, + "filepath" TEXT DEFAULT '', + "import_status" INTEGER DEFAULT 1 NOT NULL, + "currentlyaccessing" INTEGER DEFAULT 0 NOT NULL, + "editedby" INTEGER, + "mtime" TIMESTAMP(6), + "utime" TIMESTAMP(6), + "lptime" TIMESTAMP(6), + "md5" CHAR(32), + "track_title" VARCHAR(512), + "artist_name" VARCHAR(512), + "bit_rate" INTEGER, + "sample_rate" INTEGER, + "format" VARCHAR(128), + "length" interval DEFAULT '00:00:00', + "album_title" VARCHAR(512), + "genre" VARCHAR(64), + "comments" TEXT, + "year" VARCHAR(16), + "track_number" INTEGER, + "channels" INTEGER, + "url" VARCHAR(1024), + "bpm" INTEGER, + "rating" VARCHAR(8), + "encoded_by" VARCHAR(255), + "disc_number" VARCHAR(8), + "mood" VARCHAR(64), + "label" VARCHAR(512), + "composer" VARCHAR(512), + "encoder" VARCHAR(64), + "checksum" VARCHAR(256), + "lyrics" TEXT, + "orchestra" VARCHAR(512), + "conductor" VARCHAR(512), + "lyricist" VARCHAR(512), + "original_lyricist" VARCHAR(512), + "radio_station_name" VARCHAR(512), + "info_url" VARCHAR(512), + "artist_url" VARCHAR(512), + "audio_source_url" VARCHAR(512), + "radio_station_url" VARCHAR(512), + "buy_this_url" VARCHAR(512), + "isrc_number" VARCHAR(512), + "catalog_number" VARCHAR(512), + "original_artist" VARCHAR(512), + "copyright" VARCHAR(512), + "report_datetime" VARCHAR(32), + "report_location" VARCHAR(512), + "report_organization" VARCHAR(512), + "subject" VARCHAR(512), + "contributor" VARCHAR(512), + "language" VARCHAR(512), + "file_exists" BOOLEAN DEFAULT 't', + "soundcloud_id" INTEGER, + "soundcloud_error_code" INTEGER, + "soundcloud_error_msg" VARCHAR(512), + "soundcloud_link_to_file" VARCHAR(4096), + "soundcloud_upload_time" TIMESTAMP(6), + "replay_gain" NUMERIC, + "owner_id" INTEGER, + "cuein" interval DEFAULT '00:00:00', + "cueout" interval DEFAULT '00:00:00', + "silan_check" BOOLEAN DEFAULT 'f', + "hidden" BOOLEAN DEFAULT 'f', + "is_scheduled" BOOLEAN DEFAULT 'f', + "is_playlist" BOOLEAN DEFAULT 'f', + "resource_id" TEXT, + PRIMARY KEY ("id") +); + CREATE INDEX "cc_files_md5_idx" ON "cc_files" ("md5"); CREATE INDEX "cc_files_name_idx" ON "cc_files" ("name"); ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_perms ------------------------------------------------------------------------------ - -DROP TABLE "cc_perms" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_perms" CASCADE; CREATE TABLE "cc_perms" ( - "permid" INTEGER NOT NULL, - "subj" INTEGER, - "action" VARCHAR(20), - "obj" INTEGER, - "type" CHAR(1), - PRIMARY KEY ("permid"), - CONSTRAINT "cc_perms_all_idx" UNIQUE ("subj","action","obj"), - CONSTRAINT "cc_perms_permid_idx" UNIQUE ("permid") + "permid" INTEGER NOT NULL, + "subj" INTEGER, + "action" VARCHAR(20), + "obj" INTEGER, + "type" CHAR(1), + PRIMARY KEY ("permid"), + CONSTRAINT "cc_perms_all_idx" UNIQUE ("subj","action","obj"), + CONSTRAINT "cc_perms_permid_idx" UNIQUE ("permid") ); -COMMENT ON TABLE "cc_perms" IS ''; - - -SET search_path TO public; CREATE INDEX "cc_perms_subj_obj_idx" ON "cc_perms" ("subj","obj"); ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_show ------------------------------------------------------------------------------ - -DROP TABLE "cc_show" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_show" CASCADE; CREATE TABLE "cc_show" ( - "id" serial NOT NULL, - "name" VARCHAR(255) default '' NOT NULL, - "url" VARCHAR(255) default '', - "genre" VARCHAR(255) default '', - "description" VARCHAR(512), - "color" VARCHAR(6), - "background_color" VARCHAR(6), - "live_stream_using_airtime_auth" BOOLEAN default 'f', - "live_stream_using_custom_auth" BOOLEAN default 'f', - "live_stream_user" VARCHAR(255), - "live_stream_pass" VARCHAR(255), - "linked" BOOLEAN default 'f' NOT NULL, - "is_linkable" BOOLEAN default 't' NOT NULL, - PRIMARY KEY ("id") -); - -COMMENT ON TABLE "cc_show" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ + "id" serial NOT NULL, + "name" VARCHAR(255) DEFAULT '' NOT NULL, + "url" VARCHAR(255) DEFAULT '', + "genre" VARCHAR(255) DEFAULT '', + "description" VARCHAR(512), + "color" VARCHAR(6), + "background_color" VARCHAR(6), + "live_stream_using_airtime_auth" BOOLEAN DEFAULT 'f', + "live_stream_using_custom_auth" BOOLEAN DEFAULT 'f', + "live_stream_user" VARCHAR(255), + "live_stream_pass" VARCHAR(255), + "linked" BOOLEAN DEFAULT 'f' NOT NULL, + "is_linkable" BOOLEAN DEFAULT 't' NOT NULL, + PRIMARY KEY ("id") +); + +----------------------------------------------------------------------- -- cc_show_instances ------------------------------------------------------------------------------ - -DROP TABLE "cc_show_instances" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_show_instances" CASCADE; CREATE TABLE "cc_show_instances" ( - "id" serial NOT NULL, - "starts" TIMESTAMP NOT NULL, - "ends" TIMESTAMP NOT NULL, - "show_id" INTEGER NOT NULL, - "record" INT2 default 0, - "rebroadcast" INT2 default 0, - "instance_id" INTEGER, - "file_id" INTEGER, - "time_filled" interval default '00:00:00', - "created" TIMESTAMP NOT NULL, - "last_scheduled" TIMESTAMP, - "modified_instance" BOOLEAN default 'f' NOT NULL, - PRIMARY KEY ("id") -); - -COMMENT ON TABLE "cc_show_instances" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ + "id" serial NOT NULL, + "starts" TIMESTAMP NOT NULL, + "ends" TIMESTAMP NOT NULL, + "show_id" INTEGER NOT NULL, + "record" INT2 DEFAULT 0, + "rebroadcast" INT2 DEFAULT 0, + "instance_id" INTEGER, + "file_id" INTEGER, + "time_filled" interval DEFAULT '00:00:00', + "created" TIMESTAMP NOT NULL, + "last_scheduled" TIMESTAMP, + "modified_instance" BOOLEAN DEFAULT 'f' NOT NULL, + PRIMARY KEY ("id") +); + +----------------------------------------------------------------------- -- cc_show_days ------------------------------------------------------------------------------ - -DROP TABLE "cc_show_days" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_show_days" CASCADE; CREATE TABLE "cc_show_days" ( - "id" serial NOT NULL, - "first_show" DATE NOT NULL, - "last_show" DATE, - "start_time" TIME NOT NULL, - "timezone" VARCHAR(255) NOT NULL, - "duration" VARCHAR(255) NOT NULL, - "day" INT2, - "repeat_type" INT2 NOT NULL, - "next_pop_date" DATE, - "show_id" INTEGER NOT NULL, - "record" INT2 default 0, - PRIMARY KEY ("id") -); - -COMMENT ON TABLE "cc_show_days" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ + "id" serial NOT NULL, + "first_show" DATE NOT NULL, + "last_show" DATE, + "start_time" TIME NOT NULL, + "timezone" VARCHAR NOT NULL, + "duration" VARCHAR NOT NULL, + "day" INT2, + "repeat_type" INT2 NOT NULL, + "next_pop_date" DATE, + "show_id" INTEGER NOT NULL, + "record" INT2 DEFAULT 0, + PRIMARY KEY ("id") +); + +----------------------------------------------------------------------- -- cc_show_rebroadcast ------------------------------------------------------------------------------ - -DROP TABLE "cc_show_rebroadcast" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_show_rebroadcast" CASCADE; CREATE TABLE "cc_show_rebroadcast" ( - "id" serial NOT NULL, - "day_offset" VARCHAR(255) NOT NULL, - "start_time" TIME NOT NULL, - "show_id" INTEGER NOT NULL, - PRIMARY KEY ("id") + "id" serial NOT NULL, + "day_offset" VARCHAR NOT NULL, + "start_time" TIME NOT NULL, + "show_id" INTEGER NOT NULL, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_show_rebroadcast" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_show_hosts ------------------------------------------------------------------------------ - -DROP TABLE "cc_show_hosts" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_show_hosts" CASCADE; CREATE TABLE "cc_show_hosts" ( - "id" serial NOT NULL, - "show_id" INTEGER NOT NULL, - "subjs_id" INTEGER NOT NULL, - PRIMARY KEY ("id") + "id" serial NOT NULL, + "show_id" INTEGER NOT NULL, + "subjs_id" INTEGER NOT NULL, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_show_hosts" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_playlist ------------------------------------------------------------------------------ - -DROP TABLE "cc_playlist" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_playlist" CASCADE; CREATE TABLE "cc_playlist" ( - "id" serial NOT NULL, - "name" VARCHAR(255) default '' NOT NULL, - "mtime" TIMESTAMP(6), - "utime" TIMESTAMP(6), - "creator_id" INTEGER, - "description" VARCHAR(512), - "length" interval default '00:00:00', - PRIMARY KEY ("id") + "id" serial NOT NULL, + "name" VARCHAR(255) DEFAULT '' NOT NULL, + "mtime" TIMESTAMP(6), + "utime" TIMESTAMP(6), + "creator_id" INTEGER, + "description" VARCHAR(512), + "length" interval DEFAULT '00:00:00', + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_playlist" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_playlistcontents ------------------------------------------------------------------------------ - -DROP TABLE "cc_playlistcontents" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_playlistcontents" CASCADE; CREATE TABLE "cc_playlistcontents" ( - "id" serial NOT NULL, - "playlist_id" INTEGER, - "file_id" INTEGER, - "block_id" INTEGER, - "stream_id" INTEGER, - "type" INT2 default 0 NOT NULL, - "position" INTEGER, - "trackoffset" FLOAT default 0 NOT NULL, - "cliplength" interval default '00:00:00', - "cuein" interval default '00:00:00', - "cueout" interval default '00:00:00', - "fadein" TIME default '00:00:00', - "fadeout" TIME default '00:00:00', - PRIMARY KEY ("id") -); - -COMMENT ON TABLE "cc_playlistcontents" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ + "id" serial NOT NULL, + "playlist_id" INTEGER, + "file_id" INTEGER, + "block_id" INTEGER, + "stream_id" INTEGER, + "type" INT2 DEFAULT 0 NOT NULL, + "position" INTEGER, + "trackoffset" FLOAT DEFAULT 0 NOT NULL, + "cliplength" interval DEFAULT '00:00:00', + "cuein" interval DEFAULT '00:00:00', + "cueout" interval DEFAULT '00:00:00', + "fadein" TIME DEFAULT '00:00:00', + "fadeout" TIME DEFAULT '00:00:00', + PRIMARY KEY ("id") +); + +----------------------------------------------------------------------- -- cc_block ------------------------------------------------------------------------------ - -DROP TABLE "cc_block" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_block" CASCADE; CREATE TABLE "cc_block" ( - "id" serial NOT NULL, - "name" VARCHAR(255) default '' NOT NULL, - "mtime" TIMESTAMP(6), - "utime" TIMESTAMP(6), - "creator_id" INTEGER, - "description" VARCHAR(512), - "length" interval default '00:00:00', - "type" VARCHAR(7) default 'static', - PRIMARY KEY ("id") + "id" serial NOT NULL, + "name" VARCHAR(255) DEFAULT '' NOT NULL, + "mtime" TIMESTAMP(6), + "utime" TIMESTAMP(6), + "creator_id" INTEGER, + "description" VARCHAR(512), + "length" interval DEFAULT '00:00:00', + "type" VARCHAR(7) DEFAULT 'static', + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_block" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_blockcontents ------------------------------------------------------------------------------ - -DROP TABLE "cc_blockcontents" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_blockcontents" CASCADE; CREATE TABLE "cc_blockcontents" ( - "id" serial NOT NULL, - "block_id" INTEGER, - "file_id" INTEGER, - "position" INTEGER, - "trackoffset" FLOAT default 0 NOT NULL, - "cliplength" interval default '00:00:00', - "cuein" interval default '00:00:00', - "cueout" interval default '00:00:00', - "fadein" TIME default '00:00:00', - "fadeout" TIME default '00:00:00', - PRIMARY KEY ("id") + "id" serial NOT NULL, + "block_id" INTEGER, + "file_id" INTEGER, + "position" INTEGER, + "trackoffset" FLOAT DEFAULT 0 NOT NULL, + "cliplength" interval DEFAULT '00:00:00', + "cuein" interval DEFAULT '00:00:00', + "cueout" interval DEFAULT '00:00:00', + "fadein" TIME DEFAULT '00:00:00', + "fadeout" TIME DEFAULT '00:00:00', + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_blockcontents" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_blockcriteria ------------------------------------------------------------------------------ - -DROP TABLE "cc_blockcriteria" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_blockcriteria" CASCADE; CREATE TABLE "cc_blockcriteria" ( - "id" serial NOT NULL, - "criteria" VARCHAR(32) NOT NULL, - "modifier" VARCHAR(16) NOT NULL, - "value" VARCHAR(512) NOT NULL, - "extra" VARCHAR(512), - "block_id" INTEGER NOT NULL, - PRIMARY KEY ("id") + "id" serial NOT NULL, + "criteria" VARCHAR(32) NOT NULL, + "modifier" VARCHAR(16) NOT NULL, + "value" VARCHAR(512) NOT NULL, + "extra" VARCHAR(512), + "block_id" INTEGER NOT NULL, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_blockcriteria" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_pref ------------------------------------------------------------------------------ - -DROP TABLE "cc_pref" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_pref" CASCADE; CREATE TABLE "cc_pref" ( - "id" serial NOT NULL, - "subjid" INTEGER, - "keystr" VARCHAR(255), - "valstr" TEXT, - PRIMARY KEY ("id"), - CONSTRAINT "cc_pref_id_idx" UNIQUE ("id"), - CONSTRAINT "cc_pref_subj_key_idx" UNIQUE ("subjid","keystr") + "id" serial NOT NULL, + "subjid" INTEGER, + "keystr" VARCHAR(255), + "valstr" TEXT, + PRIMARY KEY ("id"), + CONSTRAINT "cc_pref_id_idx" UNIQUE ("id"), + CONSTRAINT "cc_pref_subj_key_idx" UNIQUE ("subjid","keystr") ); -COMMENT ON TABLE "cc_pref" IS ''; - - -SET search_path TO public; CREATE INDEX "cc_pref_subjid_idx" ON "cc_pref" ("subjid"); ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_schedule ------------------------------------------------------------------------------ - -DROP TABLE "cc_schedule" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_schedule" CASCADE; CREATE TABLE "cc_schedule" ( - "id" serial NOT NULL, - "starts" TIMESTAMP NOT NULL, - "ends" TIMESTAMP NOT NULL, - "file_id" INTEGER, - "stream_id" INTEGER, - "clip_length" interval default '00:00:00', - "fade_in" TIME default '00:00:00', - "fade_out" TIME default '00:00:00', - "cue_in" interval NOT NULL, - "cue_out" interval NOT NULL, - "media_item_played" BOOLEAN default 'f', - "instance_id" INTEGER NOT NULL, - "playout_status" INT2 default 1 NOT NULL, - "broadcasted" INT2 default 0 NOT NULL, - "position" INTEGER default 0 NOT NULL, - PRIMARY KEY ("id") + "id" serial NOT NULL, + "starts" TIMESTAMP NOT NULL, + "ends" TIMESTAMP NOT NULL, + "file_id" INTEGER, + "stream_id" INTEGER, + "clip_length" interval DEFAULT '00:00:00', + "fade_in" TIME DEFAULT '00:00:00', + "fade_out" TIME DEFAULT '00:00:00', + "cue_in" interval NOT NULL, + "cue_out" interval NOT NULL, + "media_item_played" BOOLEAN DEFAULT 'f', + "instance_id" INTEGER NOT NULL, + "playout_status" INT2 DEFAULT 1 NOT NULL, + "broadcasted" INT2 DEFAULT 0 NOT NULL, + "position" INTEGER DEFAULT 0 NOT NULL, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_schedule" IS ''; - - -SET search_path TO public; CREATE INDEX "cc_schedule_instance_id_idx" ON "cc_schedule" ("instance_id"); ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_sess ------------------------------------------------------------------------------ - -DROP TABLE "cc_sess" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_sess" CASCADE; CREATE TABLE "cc_sess" ( - "sessid" CHAR(32) NOT NULL, - "userid" INTEGER, - "login" VARCHAR(255), - "ts" TIMESTAMP, - PRIMARY KEY ("sessid") + "sessid" CHAR(32) NOT NULL, + "userid" INTEGER, + "login" VARCHAR(255), + "ts" TIMESTAMP, + PRIMARY KEY ("sessid") ); -COMMENT ON TABLE "cc_sess" IS ''; - - -SET search_path TO public; CREATE INDEX "cc_sess_login_idx" ON "cc_sess" ("login"); CREATE INDEX "cc_sess_userid_idx" ON "cc_sess" ("userid"); ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_smemb ------------------------------------------------------------------------------ - -DROP TABLE "cc_smemb" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_smemb" CASCADE; CREATE TABLE "cc_smemb" ( - "id" INTEGER NOT NULL, - "uid" INTEGER default 0 NOT NULL, - "gid" INTEGER default 0 NOT NULL, - "level" INTEGER default 0 NOT NULL, - "mid" INTEGER, - PRIMARY KEY ("id"), - CONSTRAINT "cc_smemb_id_idx" UNIQUE ("id") + "id" INTEGER NOT NULL, + "uid" INTEGER DEFAULT 0 NOT NULL, + "gid" INTEGER DEFAULT 0 NOT NULL, + "level" INTEGER DEFAULT 0 NOT NULL, + "mid" INTEGER, + PRIMARY KEY ("id"), + CONSTRAINT "cc_smemb_id_idx" UNIQUE ("id") ); -COMMENT ON TABLE "cc_smemb" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_subjs ------------------------------------------------------------------------------ - -DROP TABLE "cc_subjs" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_subjs" CASCADE; CREATE TABLE "cc_subjs" ( - "id" serial NOT NULL, - "login" VARCHAR(255) default '' NOT NULL, - "pass" VARCHAR(255) default '' NOT NULL, - "type" CHAR(1) default 'U' NOT NULL, - "first_name" VARCHAR(255) default '' NOT NULL, - "last_name" VARCHAR(255) default '' NOT NULL, - "lastlogin" TIMESTAMP, - "lastfail" TIMESTAMP, - "skype_contact" VARCHAR(255), - "jabber_contact" VARCHAR(255), - "email" VARCHAR(255), - "cell_phone" VARCHAR(255), - "login_attempts" INTEGER default 0, - PRIMARY KEY ("id"), - CONSTRAINT "cc_subjs_id_idx" UNIQUE ("id"), - CONSTRAINT "cc_subjs_login_idx" UNIQUE ("login") -); - -COMMENT ON TABLE "cc_subjs" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ + "id" serial NOT NULL, + "login" VARCHAR(255) DEFAULT '' NOT NULL, + "pass" VARCHAR(255) DEFAULT '' NOT NULL, + "type" CHAR(1) DEFAULT 'U' NOT NULL, + "first_name" VARCHAR(255) DEFAULT '' NOT NULL, + "last_name" VARCHAR(255) DEFAULT '' NOT NULL, + "lastlogin" TIMESTAMP, + "lastfail" TIMESTAMP, + "skype_contact" VARCHAR, + "jabber_contact" VARCHAR, + "email" VARCHAR, + "cell_phone" VARCHAR, + "login_attempts" INTEGER DEFAULT 0, + PRIMARY KEY ("id"), + CONSTRAINT "cc_subjs_id_idx" UNIQUE ("id"), + CONSTRAINT "cc_subjs_login_idx" UNIQUE ("login") +); + +----------------------------------------------------------------------- -- cc_subjs_token ------------------------------------------------------------------------------ - -DROP TABLE "cc_subjs_token" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_subjs_token" CASCADE; CREATE TABLE "cc_subjs_token" ( - "id" serial NOT NULL, - "user_id" INTEGER NOT NULL, - "action" VARCHAR(255) NOT NULL, - "token" VARCHAR(40) NOT NULL, - "created" TIMESTAMP NOT NULL, - PRIMARY KEY ("id"), - CONSTRAINT "cc_subjs_token_idx" UNIQUE ("token") + "id" serial NOT NULL, + "user_id" INTEGER NOT NULL, + "action" VARCHAR(255) NOT NULL, + "token" VARCHAR(40) NOT NULL, + "created" TIMESTAMP NOT NULL, + PRIMARY KEY ("id"), + CONSTRAINT "cc_subjs_token_idx" UNIQUE ("token") ); -COMMENT ON TABLE "cc_subjs_token" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_country ------------------------------------------------------------------------------ - -DROP TABLE "cc_country" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_country" CASCADE; CREATE TABLE "cc_country" ( - "isocode" CHAR(3) NOT NULL, - "name" VARCHAR(255) NOT NULL, - PRIMARY KEY ("isocode") + "isocode" CHAR(3) NOT NULL, + "name" VARCHAR(255) NOT NULL, + PRIMARY KEY ("isocode") ); -COMMENT ON TABLE "cc_country" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_stream_setting ------------------------------------------------------------------------------ - -DROP TABLE "cc_stream_setting" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_stream_setting" CASCADE; CREATE TABLE "cc_stream_setting" ( - "keyname" VARCHAR(64) NOT NULL, - "value" VARCHAR(255), - "type" VARCHAR(16) NOT NULL, - PRIMARY KEY ("keyname") + "keyname" VARCHAR(64) NOT NULL, + "value" VARCHAR(255), + "type" VARCHAR(16) NOT NULL, + PRIMARY KEY ("keyname") ); -COMMENT ON TABLE "cc_stream_setting" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_login_attempts ------------------------------------------------------------------------------ - -DROP TABLE "cc_login_attempts" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_login_attempts" CASCADE; CREATE TABLE "cc_login_attempts" ( - "ip" VARCHAR(32) NOT NULL, - "attempts" INTEGER default 0, - PRIMARY KEY ("ip") + "ip" VARCHAR(32) NOT NULL, + "attempts" INTEGER DEFAULT 0, + PRIMARY KEY ("ip") ); -COMMENT ON TABLE "cc_login_attempts" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_service_register ------------------------------------------------------------------------------ - -DROP TABLE "cc_service_register" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_service_register" CASCADE; CREATE TABLE "cc_service_register" ( - "name" VARCHAR(32) NOT NULL, - "ip" VARCHAR(18) NOT NULL, - PRIMARY KEY ("name") + "name" VARCHAR(32) NOT NULL, + "ip" VARCHAR(18) NOT NULL, + PRIMARY KEY ("name") ); -COMMENT ON TABLE "cc_service_register" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_live_log ------------------------------------------------------------------------------ - -DROP TABLE "cc_live_log" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_live_log" CASCADE; CREATE TABLE "cc_live_log" ( - "id" serial NOT NULL, - "state" VARCHAR(32) NOT NULL, - "start_time" TIMESTAMP NOT NULL, - "end_time" TIMESTAMP, - PRIMARY KEY ("id") + "id" serial NOT NULL, + "state" VARCHAR(32) NOT NULL, + "start_time" TIMESTAMP NOT NULL, + "end_time" TIMESTAMP, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_live_log" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_webstream ------------------------------------------------------------------------------ - -DROP TABLE "cc_webstream" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_webstream" CASCADE; CREATE TABLE "cc_webstream" ( - "id" serial NOT NULL, - "name" VARCHAR(255) NOT NULL, - "description" VARCHAR(255) NOT NULL, - "url" VARCHAR(512) NOT NULL, - "length" interval default '00:00:00' NOT NULL, - "creator_id" INTEGER NOT NULL, - "mtime" TIMESTAMP(6) NOT NULL, - "utime" TIMESTAMP(6) NOT NULL, - "lptime" TIMESTAMP(6), - "mime" VARCHAR(255), - PRIMARY KEY ("id") + "id" serial NOT NULL, + "name" VARCHAR(255) NOT NULL, + "description" VARCHAR(255) NOT NULL, + "url" VARCHAR(512) NOT NULL, + "length" interval DEFAULT '00:00:00' NOT NULL, + "creator_id" INTEGER NOT NULL, + "mtime" TIMESTAMP(6) NOT NULL, + "utime" TIMESTAMP(6) NOT NULL, + "lptime" TIMESTAMP(6), + "mime" VARCHAR, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_webstream" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_webstream_metadata ------------------------------------------------------------------------------ - -DROP TABLE "cc_webstream_metadata" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_webstream_metadata" CASCADE; CREATE TABLE "cc_webstream_metadata" ( - "id" serial NOT NULL, - "instance_id" INTEGER NOT NULL, - "start_time" TIMESTAMP NOT NULL, - "liquidsoap_data" VARCHAR(1024) NOT NULL, - PRIMARY KEY ("id") + "id" serial NOT NULL, + "instance_id" INTEGER NOT NULL, + "start_time" TIMESTAMP NOT NULL, + "liquidsoap_data" VARCHAR(1024) NOT NULL, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_webstream_metadata" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_mount_name ------------------------------------------------------------------------------ - -DROP TABLE "cc_mount_name" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_mount_name" CASCADE; CREATE TABLE "cc_mount_name" ( - "id" serial NOT NULL, - "mount_name" VARCHAR(255) NOT NULL, - PRIMARY KEY ("id") + "id" serial NOT NULL, + "mount_name" VARCHAR NOT NULL, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_mount_name" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_timestamp ------------------------------------------------------------------------------ - -DROP TABLE "cc_timestamp" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_timestamp" CASCADE; CREATE TABLE "cc_timestamp" ( - "id" serial NOT NULL, - "timestamp" TIMESTAMP NOT NULL, - PRIMARY KEY ("id") + "id" serial NOT NULL, + "timestamp" TIMESTAMP NOT NULL, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_timestamp" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_listener_count ------------------------------------------------------------------------------ - -DROP TABLE "cc_listener_count" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_listener_count" CASCADE; CREATE TABLE "cc_listener_count" ( - "id" serial NOT NULL, - "timestamp_id" INTEGER NOT NULL, - "mount_name_id" INTEGER NOT NULL, - "listener_count" INTEGER NOT NULL, - PRIMARY KEY ("id") + "id" serial NOT NULL, + "timestamp_id" INTEGER NOT NULL, + "mount_name_id" INTEGER NOT NULL, + "listener_count" INTEGER NOT NULL, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_listener_count" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_locale ------------------------------------------------------------------------------ - -DROP TABLE "cc_locale" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_locale" CASCADE; CREATE TABLE "cc_locale" ( - "id" serial NOT NULL, - "locale_code" VARCHAR(16) NOT NULL, - "locale_lang" VARCHAR(128) NOT NULL, - PRIMARY KEY ("id") + "id" serial NOT NULL, + "locale_code" VARCHAR(16) NOT NULL, + "locale_lang" VARCHAR(128) NOT NULL, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_locale" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_playout_history ------------------------------------------------------------------------------ - -DROP TABLE "cc_playout_history" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_playout_history" CASCADE; CREATE TABLE "cc_playout_history" ( - "id" serial NOT NULL, - "file_id" INTEGER, - "starts" TIMESTAMP NOT NULL, - "ends" TIMESTAMP, - "instance_id" INTEGER, - PRIMARY KEY ("id") + "id" serial NOT NULL, + "file_id" INTEGER, + "starts" TIMESTAMP NOT NULL, + "ends" TIMESTAMP, + "instance_id" INTEGER, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_playout_history" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_playout_history_metadata ------------------------------------------------------------------------------ - -DROP TABLE "cc_playout_history_metadata" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_playout_history_metadata" CASCADE; CREATE TABLE "cc_playout_history_metadata" ( - "id" serial NOT NULL, - "history_id" INTEGER NOT NULL, - "key" VARCHAR(128) NOT NULL, - "value" VARCHAR(128) NOT NULL, - PRIMARY KEY ("id") + "id" serial NOT NULL, + "history_id" INTEGER NOT NULL, + "key" VARCHAR(128) NOT NULL, + "value" VARCHAR(128) NOT NULL, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_playout_history_metadata" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_playout_history_template ------------------------------------------------------------------------------ - -DROP TABLE "cc_playout_history_template" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_playout_history_template" CASCADE; CREATE TABLE "cc_playout_history_template" ( - "id" serial NOT NULL, - "name" VARCHAR(128) NOT NULL, - "type" VARCHAR(35) NOT NULL, - PRIMARY KEY ("id") + "id" serial NOT NULL, + "name" VARCHAR(128) NOT NULL, + "type" VARCHAR(35) NOT NULL, + PRIMARY KEY ("id") ); -COMMENT ON TABLE "cc_playout_history_template" IS ''; - - -SET search_path TO public; ------------------------------------------------------------------------------ +----------------------------------------------------------------------- -- cc_playout_history_template_field ------------------------------------------------------------------------------ - -DROP TABLE "cc_playout_history_template_field" CASCADE; +----------------------------------------------------------------------- +DROP TABLE IF EXISTS "cc_playout_history_template_field" CASCADE; CREATE TABLE "cc_playout_history_template_field" ( - "id" serial NOT NULL, - "template_id" INTEGER NOT NULL, - "name" VARCHAR(128) NOT NULL, - "label" VARCHAR(128) NOT NULL, - "type" VARCHAR(128) NOT NULL, - "is_file_md" BOOLEAN default 'f' NOT NULL, - "position" INTEGER NOT NULL, - PRIMARY KEY ("id") -); - -COMMENT ON TABLE "cc_playout_history_template_field" IS ''; - - -SET search_path TO public; -ALTER TABLE "cc_files" ADD CONSTRAINT "cc_files_owner_fkey" FOREIGN KEY ("owner_id") REFERENCES "cc_subjs" ("id"); - -ALTER TABLE "cc_files" ADD CONSTRAINT "cc_files_editedby_fkey" FOREIGN KEY ("editedby") REFERENCES "cc_subjs" ("id"); - -ALTER TABLE "cc_files" ADD CONSTRAINT "cc_music_dirs_folder_fkey" FOREIGN KEY ("directory") REFERENCES "cc_music_dirs" ("id"); - -ALTER TABLE "cc_perms" ADD CONSTRAINT "cc_perms_subj_fkey" FOREIGN KEY ("subj") REFERENCES "cc_subjs" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_show_instances" ADD CONSTRAINT "cc_show_fkey" FOREIGN KEY ("show_id") REFERENCES "cc_show" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_show_instances" ADD CONSTRAINT "cc_original_show_instance_fkey" FOREIGN KEY ("instance_id") REFERENCES "cc_show_instances" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_show_instances" ADD CONSTRAINT "cc_recorded_file_fkey" FOREIGN KEY ("file_id") REFERENCES "cc_files" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_show_days" ADD CONSTRAINT "cc_show_fkey" FOREIGN KEY ("show_id") REFERENCES "cc_show" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_show_rebroadcast" ADD CONSTRAINT "cc_show_fkey" FOREIGN KEY ("show_id") REFERENCES "cc_show" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_show_hosts" ADD CONSTRAINT "cc_perm_show_fkey" FOREIGN KEY ("show_id") REFERENCES "cc_show" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_show_hosts" ADD CONSTRAINT "cc_perm_host_fkey" FOREIGN KEY ("subjs_id") REFERENCES "cc_subjs" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_playlist" ADD CONSTRAINT "cc_playlist_createdby_fkey" FOREIGN KEY ("creator_id") REFERENCES "cc_subjs" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_playlistcontents" ADD CONSTRAINT "cc_playlistcontents_file_id_fkey" FOREIGN KEY ("file_id") REFERENCES "cc_files" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_playlistcontents" ADD CONSTRAINT "cc_playlistcontents_block_id_fkey" FOREIGN KEY ("block_id") REFERENCES "cc_block" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_playlistcontents" ADD CONSTRAINT "cc_playlistcontents_playlist_id_fkey" FOREIGN KEY ("playlist_id") REFERENCES "cc_playlist" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_block" ADD CONSTRAINT "cc_block_createdby_fkey" FOREIGN KEY ("creator_id") REFERENCES "cc_subjs" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_blockcontents" ADD CONSTRAINT "cc_blockcontents_file_id_fkey" FOREIGN KEY ("file_id") REFERENCES "cc_files" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_blockcontents" ADD CONSTRAINT "cc_blockcontents_block_id_fkey" FOREIGN KEY ("block_id") REFERENCES "cc_block" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_blockcriteria" ADD CONSTRAINT "cc_blockcontents_block_id_fkey" FOREIGN KEY ("block_id") REFERENCES "cc_block" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_pref" ADD CONSTRAINT "cc_pref_subjid_fkey" FOREIGN KEY ("subjid") REFERENCES "cc_subjs" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_schedule" ADD CONSTRAINT "cc_show_inst_fkey" FOREIGN KEY ("instance_id") REFERENCES "cc_show_instances" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_schedule" ADD CONSTRAINT "cc_show_file_fkey" FOREIGN KEY ("file_id") REFERENCES "cc_files" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_schedule" ADD CONSTRAINT "cc_show_stream_fkey" FOREIGN KEY ("stream_id") REFERENCES "cc_webstream" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_sess" ADD CONSTRAINT "cc_sess_userid_fkey" FOREIGN KEY ("userid") REFERENCES "cc_subjs" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_subjs_token" ADD CONSTRAINT "cc_subjs_token_userid_fkey" FOREIGN KEY ("user_id") REFERENCES "cc_subjs" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_webstream_metadata" ADD CONSTRAINT "cc_schedule_inst_fkey" FOREIGN KEY ("instance_id") REFERENCES "cc_schedule" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_listener_count" ADD CONSTRAINT "cc_timestamp_inst_fkey" FOREIGN KEY ("timestamp_id") REFERENCES "cc_timestamp" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_listener_count" ADD CONSTRAINT "cc_mount_name_inst_fkey" FOREIGN KEY ("mount_name_id") REFERENCES "cc_mount_name" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_playout_history" ADD CONSTRAINT "cc_playout_history_file_tag_fkey" FOREIGN KEY ("file_id") REFERENCES "cc_files" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_playout_history" ADD CONSTRAINT "cc_his_item_inst_fkey" FOREIGN KEY ("instance_id") REFERENCES "cc_show_instances" ("id") ON DELETE SET NULL; - -ALTER TABLE "cc_playout_history_metadata" ADD CONSTRAINT "cc_playout_history_metadata_entry_fkey" FOREIGN KEY ("history_id") REFERENCES "cc_playout_history" ("id") ON DELETE CASCADE; - -ALTER TABLE "cc_playout_history_template_field" ADD CONSTRAINT "cc_playout_history_template_template_fkey" FOREIGN KEY ("template_id") REFERENCES "cc_playout_history_template" ("id") ON DELETE CASCADE; + "id" serial NOT NULL, + "template_id" INTEGER NOT NULL, + "name" VARCHAR(128) NOT NULL, + "label" VARCHAR(128) NOT NULL, + "type" VARCHAR(128) NOT NULL, + "is_file_md" BOOLEAN DEFAULT 'f' NOT NULL, + "position" INTEGER NOT NULL, + PRIMARY KEY ("id") +); + +ALTER TABLE "cc_files" ADD CONSTRAINT "cc_files_owner_fkey" + FOREIGN KEY ("owner_id") + REFERENCES "cc_subjs" ("id"); + +ALTER TABLE "cc_files" ADD CONSTRAINT "cc_files_editedby_fkey" + FOREIGN KEY ("editedby") + REFERENCES "cc_subjs" ("id"); + +ALTER TABLE "cc_files" ADD CONSTRAINT "cc_music_dirs_folder_fkey" + FOREIGN KEY ("directory") + REFERENCES "cc_music_dirs" ("id"); + +ALTER TABLE "cc_perms" ADD CONSTRAINT "cc_perms_subj_fkey" + FOREIGN KEY ("subj") + REFERENCES "cc_subjs" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_show_instances" ADD CONSTRAINT "cc_show_fkey" + FOREIGN KEY ("show_id") + REFERENCES "cc_show" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_show_instances" ADD CONSTRAINT "cc_original_show_instance_fkey" + FOREIGN KEY ("instance_id") + REFERENCES "cc_show_instances" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_show_instances" ADD CONSTRAINT "cc_recorded_file_fkey" + FOREIGN KEY ("file_id") + REFERENCES "cc_files" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_show_days" ADD CONSTRAINT "cc_show_fkey" + FOREIGN KEY ("show_id") + REFERENCES "cc_show" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_show_rebroadcast" ADD CONSTRAINT "cc_show_fkey" + FOREIGN KEY ("show_id") + REFERENCES "cc_show" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_show_hosts" ADD CONSTRAINT "cc_perm_show_fkey" + FOREIGN KEY ("show_id") + REFERENCES "cc_show" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_show_hosts" ADD CONSTRAINT "cc_perm_host_fkey" + FOREIGN KEY ("subjs_id") + REFERENCES "cc_subjs" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_playlist" ADD CONSTRAINT "cc_playlist_createdby_fkey" + FOREIGN KEY ("creator_id") + REFERENCES "cc_subjs" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_playlistcontents" ADD CONSTRAINT "cc_playlistcontents_file_id_fkey" + FOREIGN KEY ("file_id") + REFERENCES "cc_files" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_playlistcontents" ADD CONSTRAINT "cc_playlistcontents_block_id_fkey" + FOREIGN KEY ("block_id") + REFERENCES "cc_block" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_playlistcontents" ADD CONSTRAINT "cc_playlistcontents_playlist_id_fkey" + FOREIGN KEY ("playlist_id") + REFERENCES "cc_playlist" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_block" ADD CONSTRAINT "cc_block_createdby_fkey" + FOREIGN KEY ("creator_id") + REFERENCES "cc_subjs" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_blockcontents" ADD CONSTRAINT "cc_blockcontents_file_id_fkey" + FOREIGN KEY ("file_id") + REFERENCES "cc_files" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_blockcontents" ADD CONSTRAINT "cc_blockcontents_block_id_fkey" + FOREIGN KEY ("block_id") + REFERENCES "cc_block" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_blockcriteria" ADD CONSTRAINT "cc_blockcontents_block_id_fkey" + FOREIGN KEY ("block_id") + REFERENCES "cc_block" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_pref" ADD CONSTRAINT "cc_pref_subjid_fkey" + FOREIGN KEY ("subjid") + REFERENCES "cc_subjs" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_schedule" ADD CONSTRAINT "cc_show_inst_fkey" + FOREIGN KEY ("instance_id") + REFERENCES "cc_show_instances" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_schedule" ADD CONSTRAINT "cc_show_file_fkey" + FOREIGN KEY ("file_id") + REFERENCES "cc_files" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_schedule" ADD CONSTRAINT "cc_show_stream_fkey" + FOREIGN KEY ("stream_id") + REFERENCES "cc_webstream" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_sess" ADD CONSTRAINT "cc_sess_userid_fkey" + FOREIGN KEY ("userid") + REFERENCES "cc_subjs" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_subjs_token" ADD CONSTRAINT "cc_subjs_token_userid_fkey" + FOREIGN KEY ("user_id") + REFERENCES "cc_subjs" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_webstream_metadata" ADD CONSTRAINT "cc_schedule_inst_fkey" + FOREIGN KEY ("instance_id") + REFERENCES "cc_schedule" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_listener_count" ADD CONSTRAINT "cc_timestamp_inst_fkey" + FOREIGN KEY ("timestamp_id") + REFERENCES "cc_timestamp" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_listener_count" ADD CONSTRAINT "cc_mount_name_inst_fkey" + FOREIGN KEY ("mount_name_id") + REFERENCES "cc_mount_name" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_playout_history" ADD CONSTRAINT "cc_playout_history_file_tag_fkey" + FOREIGN KEY ("file_id") + REFERENCES "cc_files" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_playout_history" ADD CONSTRAINT "cc_his_item_inst_fkey" + FOREIGN KEY ("instance_id") + REFERENCES "cc_show_instances" ("id") + ON DELETE SET NULL; + +ALTER TABLE "cc_playout_history_metadata" ADD CONSTRAINT "cc_playout_history_metadata_entry_fkey" + FOREIGN KEY ("history_id") + REFERENCES "cc_playout_history" ("id") + ON DELETE CASCADE; + +ALTER TABLE "cc_playout_history_template_field" ADD CONSTRAINT "cc_playout_history_template_template_fkey" + FOREIGN KEY ("template_id") + REFERENCES "cc_playout_history_template" ("id") + ON DELETE CASCADE; diff --git a/airtime_mvc/library/propel/composer.json b/airtime_mvc/library/propel/composer.json new file mode 100644 index 0000000000..7a2989d961 --- /dev/null +++ b/airtime_mvc/library/propel/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "propel/propel1": "1.7.0-stable" + } +} diff --git a/dev_tools/propel_regenerate.sh b/dev_tools/propel_regenerate.sh index 06b4f1ffd7..e13ae4cbb9 100755 --- a/dev_tools/propel_regenerate.sh +++ b/dev_tools/propel_regenerate.sh @@ -8,4 +8,4 @@ cd $SCRIPTPATH/../airtime_mvc/ path=`pwd` cd build sed -i s#"project\.home =.*$"#"project.home = $path"#g build.properties -../library/propel/generator/bin/propel-gen +../library/propel/vendor/propel/propel1/generator/bin/propel-gen From 9c2a0864876214af4331e2145111590bd3ae6b41 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 23 Jul 2014 15:18:46 -0400 Subject: [PATCH 182/310] CC-5895: Upgrade Propel to 1.7 Update install scripts with new propel library path --- install_minimal/include/airtime-db-install.php | 2 +- install_minimal/include/airtime-install.php | 2 +- install_minimal/include/airtime-installed-check.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/install_minimal/include/airtime-db-install.php b/install_minimal/include/airtime-db-install.php index cc1905758d..084aad9a6d 100644 --- a/install_minimal/include/airtime-db-install.php +++ b/install_minimal/include/airtime-db-install.php @@ -16,7 +16,7 @@ set_include_path(AirtimeInstall::GetAirtimeSrcDir().'/application/models' . PATH_SEPARATOR . get_include_path()); $CC_CONFIG = Config::getConfig(); -require_once 'propel/runtime/lib/Propel.php'; +require_once 'propel/vendor/propel/propel1/runtime/lib/Propel.php'; Propel::init(AirtimeInstall::GetAirtimeSrcDir()."/application/configs/airtime-conf-production.php"); //use this class to set new values in the cache as well. diff --git a/install_minimal/include/airtime-install.php b/install_minimal/include/airtime-install.php index a59baacd97..f231968b62 100644 --- a/install_minimal/include/airtime-install.php +++ b/install_minimal/include/airtime-install.php @@ -23,7 +23,7 @@ //reinstall, Will ask if we should rewrite config files. require_once(AirtimeInstall::GetAirtimeSrcDir().'/application/configs/conf.php'); $CC_CONFIG = Config::getConfig(); - require_once 'propel/runtime/lib/Propel.php'; + require_once 'propel/vendor/propel/propel1/runtime/lib/Propel.php'; Propel::init(AirtimeInstall::GetAirtimeSrcDir()."/application/configs/airtime-conf-production.php"); $version = AirtimeInstall::GetVersionInstalled(); $newInstall = is_null($version); diff --git a/install_minimal/include/airtime-installed-check.php b/install_minimal/include/airtime-installed-check.php index 76020853bc..5609675edc 100644 --- a/install_minimal/include/airtime-installed-check.php +++ b/install_minimal/include/airtime-installed-check.php @@ -22,7 +22,7 @@ require_once(AirtimeInstall::GetAirtimeSrcDir()."/application/configs/db-conf.php"); $CC_CONFIG = Config::getConfig(); -require_once('propel/runtime/lib/Propel.php'); +require_once('propel/vendor/propel/propel1/runtime/lib/Propel.php'); Propel::init(AirtimeInstall::GetAirtimeSrcDir()."/application/configs/airtime-conf-production.php"); $version = AirtimeInstall::GetVersionInstalled(); From 41ff0cce674dbfa96372aadaaf81f3324bf63e38 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 23 Jul 2014 15:22:42 -0400 Subject: [PATCH 183/310] CC-5896: Store cloud files in separate table, inherited from cc_files Using Class Table Inheritance - delegate behaviour, created a cloud_file table to store cloud files --- .../configs/classmap-airtime-conf.php | 7 + .../application/models/airtime/CloudFile.php | 18 + .../models/airtime/CloudFilePeer.php | 18 + .../models/airtime/CloudFileQuery.php | 18 + .../models/airtime/map/CcFilesTableMap.php | 2 +- .../models/airtime/map/CloudFileTableMap.php | 71 ++ .../models/airtime/om/BaseCcFiles.php | 344 +++++- .../models/airtime/om/BaseCcFilesPeer.php | 33 +- .../models/airtime/om/BaseCcFilesQuery.php | 113 +- .../models/airtime/om/BaseCloudFile.php | 1015 +++++++++++++++++ .../models/airtime/om/BaseCloudFilePeer.php | 1004 ++++++++++++++++ .../models/airtime/om/BaseCloudFileQuery.php | 437 +++++++ airtime_mvc/build/schema.xml | 13 +- airtime_mvc/build/sql/schema.sql | 19 +- 14 files changed, 2999 insertions(+), 113 deletions(-) create mode 100644 airtime_mvc/application/models/airtime/CloudFile.php create mode 100644 airtime_mvc/application/models/airtime/CloudFilePeer.php create mode 100644 airtime_mvc/application/models/airtime/CloudFileQuery.php create mode 100644 airtime_mvc/application/models/airtime/map/CloudFileTableMap.php create mode 100644 airtime_mvc/application/models/airtime/om/BaseCloudFile.php create mode 100644 airtime_mvc/application/models/airtime/om/BaseCloudFilePeer.php create mode 100644 airtime_mvc/application/models/airtime/om/BaseCloudFileQuery.php diff --git a/airtime_mvc/application/configs/classmap-airtime-conf.php b/airtime_mvc/application/configs/classmap-airtime-conf.php index 3bd595d17c..0c279aad1a 100644 --- a/airtime_mvc/application/configs/classmap-airtime-conf.php +++ b/airtime_mvc/application/configs/classmap-airtime-conf.php @@ -103,6 +103,9 @@ 'BaseCcWebstreamMetadataQuery' => 'airtime/om/BaseCcWebstreamMetadataQuery.php', 'BaseCcWebstreamPeer' => 'airtime/om/BaseCcWebstreamPeer.php', 'BaseCcWebstreamQuery' => 'airtime/om/BaseCcWebstreamQuery.php', + 'BaseCloudFile' => 'airtime/om/BaseCloudFile.php', + 'BaseCloudFilePeer' => 'airtime/om/BaseCloudFilePeer.php', + 'BaseCloudFileQuery' => 'airtime/om/BaseCloudFileQuery.php', 'CcBlock' => 'airtime/CcBlock.php', 'CcBlockPeer' => 'airtime/CcBlockPeer.php', 'CcBlockQuery' => 'airtime/CcBlockQuery.php', @@ -239,4 +242,8 @@ 'CcWebstreamPeer' => 'airtime/CcWebstreamPeer.php', 'CcWebstreamQuery' => 'airtime/CcWebstreamQuery.php', 'CcWebstreamTableMap' => 'airtime/map/CcWebstreamTableMap.php', + 'CloudFile' => 'airtime/CloudFile.php', + 'CloudFilePeer' => 'airtime/CloudFilePeer.php', + 'CloudFileQuery' => 'airtime/CloudFileQuery.php', + 'CloudFileTableMap' => 'airtime/map/CloudFileTableMap.php', ); \ No newline at end of file diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php new file mode 100644 index 0000000000..7c5cfc456a --- /dev/null +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -0,0 +1,18 @@ +addColumn('hidden', 'DbHidden', 'BOOLEAN', false, null, false); $this->addColumn('is_scheduled', 'DbIsScheduled', 'BOOLEAN', false, null, false); $this->addColumn('is_playlist', 'DbIsPlaylist', 'BOOLEAN', false, null, false); - $this->addColumn('resource_id', 'DbResourceId', 'LONGVARCHAR', false, null, null); // validators } // initialize() @@ -121,6 +120,7 @@ public function buildRelations() $this->addRelation('FkOwner', 'CcSubjs', RelationMap::MANY_TO_ONE, array('owner_id' => 'id', ), null, null); $this->addRelation('CcSubjsRelatedByDbEditedby', 'CcSubjs', RelationMap::MANY_TO_ONE, array('editedby' => 'id', ), null, null); $this->addRelation('CcMusicDirs', 'CcMusicDirs', RelationMap::MANY_TO_ONE, array('directory' => 'id', ), null, null); + $this->addRelation('CloudFile', 'CloudFile', RelationMap::ONE_TO_MANY, array('id' => 'cc_file_id', ), null, null, 'CloudFiles'); $this->addRelation('CcShowInstances', 'CcShowInstances', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcShowInstancess'); $this->addRelation('CcPlaylistcontents', 'CcPlaylistcontents', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcPlaylistcontentss'); $this->addRelation('CcBlockcontents', 'CcBlockcontents', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcBlockcontentss'); diff --git a/airtime_mvc/application/models/airtime/map/CloudFileTableMap.php b/airtime_mvc/application/models/airtime/map/CloudFileTableMap.php new file mode 100644 index 0000000000..0c25ddfb32 --- /dev/null +++ b/airtime_mvc/application/models/airtime/map/CloudFileTableMap.php @@ -0,0 +1,71 @@ +setName('cloud_file'); + $this->setPhpName('CloudFile'); + $this->setClassname('CloudFile'); + $this->setPackage('airtime'); + $this->setUseIdGenerator(true); + $this->setPrimaryKeyMethodInfo('cloud_file_id_seq'); + // columns + $this->addPrimaryKey('id', 'Id', 'INTEGER', true, null, null); + $this->addColumn('resource_id', 'ResourceId', 'LONGVARCHAR', true, null, null); + $this->addForeignKey('cc_file_id', 'CcFileId', 'INTEGER', 'cc_files', 'id', false, null, null); + // validators + } // initialize() + + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('cc_file_id' => 'id', ), null, null); + } // buildRelations() + + /** + * + * Gets the list of behaviors registered for this table + * + * @return array Associative array (name => parameters) of behaviors + */ + public function getBehaviors() + { + return array( + 'delegate' => array ( + 'to' => 'cc_files', +), + ); + } // getBehaviors() + +} // CloudFileTableMap diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php index d23bd7a690..591bfa07e0 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php @@ -463,12 +463,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent */ protected $is_playlist; - /** - * The value for the resource_id field. - * @var string - */ - protected $resource_id; - /** * @var CcSubjs */ @@ -484,6 +478,12 @@ abstract class BaseCcFiles extends BaseObject implements Persistent */ protected $aCcMusicDirs; + /** + * @var PropelObjectCollection|CloudFile[] Collection to store aggregation of CloudFile objects. + */ + protected $collCloudFiles; + protected $collCloudFilesPartial; + /** * @var PropelObjectCollection|CcShowInstances[] Collection to store aggregation of CcShowInstances objects. */ @@ -534,6 +534,12 @@ abstract class BaseCcFiles extends BaseObject implements Persistent */ protected $alreadyInClearAllReferencesDeep = false; + /** + * An array of objects scheduled for deletion. + * @var PropelObjectCollection + */ + protected $cloudFilesScheduledForDeletion = null; + /** * An array of objects scheduled for deletion. * @var PropelObjectCollection @@ -1464,17 +1470,6 @@ public function getDbIsPlaylist() return $this->is_playlist; } - /** - * Get the [resource_id] column value. - * - * @return string - */ - public function getDbResourceId() - { - - return $this->resource_id; - } - /** * Set the value of [id] column. * @@ -3005,27 +3000,6 @@ public function setDbIsPlaylist($v) return $this; } // setDbIsPlaylist() - /** - * Set the value of [resource_id] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbResourceId($v) - { - if ($v !== null && is_numeric($v)) { - $v = (string) $v; - } - - if ($this->resource_id !== $v) { - $this->resource_id = $v; - $this->modifiedColumns[] = CcFilesPeer::RESOURCE_ID; - } - - - return $this; - } // setDbResourceId() - /** * Indicates whether the columns in this object are only set to default values. * @@ -3184,7 +3158,6 @@ public function hydrate($row, $startcol = 0, $rehydrate = false) $this->hidden = ($row[$startcol + 67] !== null) ? (boolean) $row[$startcol + 67] : null; $this->is_scheduled = ($row[$startcol + 68] !== null) ? (boolean) $row[$startcol + 68] : null; $this->is_playlist = ($row[$startcol + 69] !== null) ? (boolean) $row[$startcol + 69] : null; - $this->resource_id = ($row[$startcol + 70] !== null) ? (string) $row[$startcol + 70] : null; $this->resetModified(); $this->setNew(false); @@ -3194,7 +3167,7 @@ public function hydrate($row, $startcol = 0, $rehydrate = false) } $this->postHydrate($row, $startcol, $rehydrate); - return $startcol + 71; // 71 = CcFilesPeer::NUM_HYDRATE_COLUMNS. + return $startcol + 70; // 70 = CcFilesPeer::NUM_HYDRATE_COLUMNS. } catch (Exception $e) { throw new PropelException("Error populating CcFiles object", $e); @@ -3268,6 +3241,8 @@ public function reload($deep = false, PropelPDO $con = null) $this->aFkOwner = null; $this->aCcSubjsRelatedByDbEditedby = null; $this->aCcMusicDirs = null; + $this->collCloudFiles = null; + $this->collCcShowInstancess = null; $this->collCcPlaylistcontentss = null; @@ -3428,6 +3403,24 @@ protected function doSave(PropelPDO $con) $this->resetModified(); } + if ($this->cloudFilesScheduledForDeletion !== null) { + if (!$this->cloudFilesScheduledForDeletion->isEmpty()) { + foreach ($this->cloudFilesScheduledForDeletion as $cloudFile) { + // need to save related object because we set the relation to null + $cloudFile->save($con); + } + $this->cloudFilesScheduledForDeletion = null; + } + } + + if ($this->collCloudFiles !== null) { + foreach ($this->collCloudFiles as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + if ($this->ccShowInstancessScheduledForDeletion !== null) { if (!$this->ccShowInstancessScheduledForDeletion->isEmpty()) { CcShowInstancesQuery::create() @@ -3759,9 +3752,6 @@ protected function doInsert(PropelPDO $con) if ($this->isColumnModified(CcFilesPeer::IS_PLAYLIST)) { $modifiedColumns[':p' . $index++] = '"is_playlist"'; } - if ($this->isColumnModified(CcFilesPeer::RESOURCE_ID)) { - $modifiedColumns[':p' . $index++] = '"resource_id"'; - } $sql = sprintf( 'INSERT INTO "cc_files" (%s) VALUES (%s)', @@ -3983,9 +3973,6 @@ protected function doInsert(PropelPDO $con) case '"is_playlist"': $stmt->bindValue($identifier, $this->is_playlist, PDO::PARAM_BOOL); break; - case '"resource_id"': - $stmt->bindValue($identifier, $this->resource_id, PDO::PARAM_STR); - break; } } $stmt->execute(); @@ -4102,6 +4089,14 @@ protected function doValidate($columns = null) } + if ($this->collCloudFiles !== null) { + foreach ($this->collCloudFiles as $referrerFK) { + if (!$referrerFK->validate($columns)) { + $failureMap = array_merge($failureMap, $referrerFK->getValidationFailures()); + } + } + } + if ($this->collCcShowInstancess !== null) { foreach ($this->collCcShowInstancess as $referrerFK) { if (!$referrerFK->validate($columns)) { @@ -4387,9 +4382,6 @@ public function getByPosition($pos) case 69: return $this->getDbIsPlaylist(); break; - case 70: - return $this->getDbResourceId(); - break; default: return null; break; @@ -4489,7 +4481,6 @@ public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColum $keys[67] => $this->getDbHidden(), $keys[68] => $this->getDbIsScheduled(), $keys[69] => $this->getDbIsPlaylist(), - $keys[70] => $this->getDbResourceId(), ); $virtualColumns = $this->virtualColumns; foreach ($virtualColumns as $key => $virtualColumn) { @@ -4506,6 +4497,9 @@ public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColum if (null !== $this->aCcMusicDirs) { $result['CcMusicDirs'] = $this->aCcMusicDirs->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); } + if (null !== $this->collCloudFiles) { + $result['CloudFiles'] = $this->collCloudFiles->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } if (null !== $this->collCcShowInstancess) { $result['CcShowInstancess'] = $this->collCcShowInstancess->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); } @@ -4765,9 +4759,6 @@ public function setByPosition($pos, $value) case 69: $this->setDbIsPlaylist($value); break; - case 70: - $this->setDbResourceId($value); - break; } // switch() } @@ -4862,7 +4853,6 @@ public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) if (array_key_exists($keys[67], $arr)) $this->setDbHidden($arr[$keys[67]]); if (array_key_exists($keys[68], $arr)) $this->setDbIsScheduled($arr[$keys[68]]); if (array_key_exists($keys[69], $arr)) $this->setDbIsPlaylist($arr[$keys[69]]); - if (array_key_exists($keys[70], $arr)) $this->setDbResourceId($arr[$keys[70]]); } /** @@ -4944,7 +4934,6 @@ public function buildCriteria() if ($this->isColumnModified(CcFilesPeer::HIDDEN)) $criteria->add(CcFilesPeer::HIDDEN, $this->hidden); if ($this->isColumnModified(CcFilesPeer::IS_SCHEDULED)) $criteria->add(CcFilesPeer::IS_SCHEDULED, $this->is_scheduled); if ($this->isColumnModified(CcFilesPeer::IS_PLAYLIST)) $criteria->add(CcFilesPeer::IS_PLAYLIST, $this->is_playlist); - if ($this->isColumnModified(CcFilesPeer::RESOURCE_ID)) $criteria->add(CcFilesPeer::RESOURCE_ID, $this->resource_id); return $criteria; } @@ -5077,7 +5066,6 @@ public function copyInto($copyObj, $deepCopy = false, $makeNew = true) $copyObj->setDbHidden($this->getDbHidden()); $copyObj->setDbIsScheduled($this->getDbIsScheduled()); $copyObj->setDbIsPlaylist($this->getDbIsPlaylist()); - $copyObj->setDbResourceId($this->getDbResourceId()); if ($deepCopy && !$this->startCopy) { // important: temporarily setNew(false) because this affects the behavior of @@ -5086,6 +5074,12 @@ public function copyInto($copyObj, $deepCopy = false, $makeNew = true) // store object hash to prevent cycle $this->startCopy = true; + foreach ($this->getCloudFiles() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCloudFile($relObj->copy($deepCopy)); + } + } + foreach ($this->getCcShowInstancess() as $relObj) { if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves $copyObj->addCcShowInstances($relObj->copy($deepCopy)); @@ -5333,6 +5327,9 @@ public function getCcMusicDirs(PropelPDO $con = null, $doQuery = true) */ public function initRelation($relationName) { + if ('CloudFile' == $relationName) { + $this->initCloudFiles(); + } if ('CcShowInstances' == $relationName) { $this->initCcShowInstancess(); } @@ -5350,6 +5347,231 @@ public function initRelation($relationName) } } + /** + * Clears out the collCloudFiles collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return CcFiles The current object (for fluent API support) + * @see addCloudFiles() + */ + public function clearCloudFiles() + { + $this->collCloudFiles = null; // important to set this to null since that means it is uninitialized + $this->collCloudFilesPartial = null; + + return $this; + } + + /** + * reset is the collCloudFiles collection loaded partially + * + * @return void + */ + public function resetPartialCloudFiles($v = true) + { + $this->collCloudFilesPartial = $v; + } + + /** + * Initializes the collCloudFiles collection. + * + * By default this just sets the collCloudFiles collection to an empty array (like clearcollCloudFiles()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCloudFiles($overrideExisting = true) + { + if (null !== $this->collCloudFiles && !$overrideExisting) { + return; + } + $this->collCloudFiles = new PropelObjectCollection(); + $this->collCloudFiles->setModel('CloudFile'); + } + + /** + * Gets an array of CloudFile objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this CcFiles is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param PropelPDO $con optional connection object + * @return PropelObjectCollection|CloudFile[] List of CloudFile objects + * @throws PropelException + */ + public function getCloudFiles($criteria = null, PropelPDO $con = null) + { + $partial = $this->collCloudFilesPartial && !$this->isNew(); + if (null === $this->collCloudFiles || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCloudFiles) { + // return empty collection + $this->initCloudFiles(); + } else { + $collCloudFiles = CloudFileQuery::create(null, $criteria) + ->filterByCcFiles($this) + ->find($con); + if (null !== $criteria) { + if (false !== $this->collCloudFilesPartial && count($collCloudFiles)) { + $this->initCloudFiles(false); + + foreach ($collCloudFiles as $obj) { + if (false == $this->collCloudFiles->contains($obj)) { + $this->collCloudFiles->append($obj); + } + } + + $this->collCloudFilesPartial = true; + } + + $collCloudFiles->getInternalIterator()->rewind(); + + return $collCloudFiles; + } + + if ($partial && $this->collCloudFiles) { + foreach ($this->collCloudFiles as $obj) { + if ($obj->isNew()) { + $collCloudFiles[] = $obj; + } + } + } + + $this->collCloudFiles = $collCloudFiles; + $this->collCloudFilesPartial = false; + } + } + + return $this->collCloudFiles; + } + + /** + * Sets a collection of CloudFile objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param PropelCollection $cloudFiles A Propel collection. + * @param PropelPDO $con Optional connection object + * @return CcFiles The current object (for fluent API support) + */ + public function setCloudFiles(PropelCollection $cloudFiles, PropelPDO $con = null) + { + $cloudFilesToDelete = $this->getCloudFiles(new Criteria(), $con)->diff($cloudFiles); + + + $this->cloudFilesScheduledForDeletion = $cloudFilesToDelete; + + foreach ($cloudFilesToDelete as $cloudFileRemoved) { + $cloudFileRemoved->setCcFiles(null); + } + + $this->collCloudFiles = null; + foreach ($cloudFiles as $cloudFile) { + $this->addCloudFile($cloudFile); + } + + $this->collCloudFiles = $cloudFiles; + $this->collCloudFilesPartial = false; + + return $this; + } + + /** + * Returns the number of related CloudFile objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param PropelPDO $con + * @return int Count of related CloudFile objects. + * @throws PropelException + */ + public function countCloudFiles(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) + { + $partial = $this->collCloudFilesPartial && !$this->isNew(); + if (null === $this->collCloudFiles || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCloudFiles) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCloudFiles()); + } + $query = CloudFileQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCcFiles($this) + ->count($con); + } + + return count($this->collCloudFiles); + } + + /** + * Method called to associate a CloudFile object to this object + * through the CloudFile foreign key attribute. + * + * @param CloudFile $l CloudFile + * @return CcFiles The current object (for fluent API support) + */ + public function addCloudFile(CloudFile $l) + { + if ($this->collCloudFiles === null) { + $this->initCloudFiles(); + $this->collCloudFilesPartial = true; + } + + if (!in_array($l, $this->collCloudFiles->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCloudFile($l); + + if ($this->cloudFilesScheduledForDeletion and $this->cloudFilesScheduledForDeletion->contains($l)) { + $this->cloudFilesScheduledForDeletion->remove($this->cloudFilesScheduledForDeletion->search($l)); + } + } + + return $this; + } + + /** + * @param CloudFile $cloudFile The cloudFile object to add. + */ + protected function doAddCloudFile($cloudFile) + { + $this->collCloudFiles[]= $cloudFile; + $cloudFile->setCcFiles($this); + } + + /** + * @param CloudFile $cloudFile The cloudFile object to remove. + * @return CcFiles The current object (for fluent API support) + */ + public function removeCloudFile($cloudFile) + { + if ($this->getCloudFiles()->contains($cloudFile)) { + $this->collCloudFiles->remove($this->collCloudFiles->search($cloudFile)); + if (null === $this->cloudFilesScheduledForDeletion) { + $this->cloudFilesScheduledForDeletion = clone $this->collCloudFiles; + $this->cloudFilesScheduledForDeletion->clear(); + } + $this->cloudFilesScheduledForDeletion[]= $cloudFile; + $cloudFile->setCcFiles(null); + } + + return $this; + } + /** * Clears out the collCcShowInstancess collection * @@ -6750,7 +6972,6 @@ public function clear() $this->hidden = null; $this->is_scheduled = null; $this->is_playlist = null; - $this->resource_id = null; $this->alreadyInSave = false; $this->alreadyInValidation = false; $this->alreadyInClearAllReferencesDeep = false; @@ -6774,6 +6995,11 @@ public function clearAllReferences($deep = false) { if ($deep && !$this->alreadyInClearAllReferencesDeep) { $this->alreadyInClearAllReferencesDeep = true; + if ($this->collCloudFiles) { + foreach ($this->collCloudFiles as $o) { + $o->clearAllReferences($deep); + } + } if ($this->collCcShowInstancess) { foreach ($this->collCcShowInstancess as $o) { $o->clearAllReferences($deep); @@ -6812,6 +7038,10 @@ public function clearAllReferences($deep = false) $this->alreadyInClearAllReferencesDeep = false; } // if ($deep) + if ($this->collCloudFiles instanceof PropelCollection) { + $this->collCloudFiles->clearIterator(); + } + $this->collCloudFiles = null; if ($this->collCcShowInstancess instanceof PropelCollection) { $this->collCcShowInstancess->clearIterator(); } diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php index f13be0d7fe..5466f9541a 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php @@ -24,13 +24,13 @@ abstract class BaseCcFilesPeer const TM_CLASS = 'CcFilesTableMap'; /** The total number of columns. */ - const NUM_COLUMNS = 71; + const NUM_COLUMNS = 70; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ - const NUM_HYDRATE_COLUMNS = 71; + const NUM_HYDRATE_COLUMNS = 70; /** the column name for the id field */ const ID = 'cc_files.id'; @@ -242,9 +242,6 @@ abstract class BaseCcFilesPeer /** the column name for the is_playlist field */ const IS_PLAYLIST = 'cc_files.is_playlist'; - /** the column name for the resource_id field */ - const RESOURCE_ID = 'cc_files.resource_id'; - /** The default string format for model objects of the related table **/ const DEFAULT_STRING_FORMAT = 'YAML'; @@ -264,12 +261,12 @@ abstract class BaseCcFilesPeer * e.g. CcFilesPeer::$fieldNames[CcFilesPeer::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbImportStatus', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', 'DbResourceId', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbImportStatus', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', 'dbResourceId', ), - BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID, CcFilesPeer::NAME, CcFilesPeer::MIME, CcFilesPeer::FTYPE, CcFilesPeer::DIRECTORY, CcFilesPeer::FILEPATH, CcFilesPeer::IMPORT_STATUS, CcFilesPeer::CURRENTLYACCESSING, CcFilesPeer::EDITEDBY, CcFilesPeer::MTIME, CcFilesPeer::UTIME, CcFilesPeer::LPTIME, CcFilesPeer::MD5, CcFilesPeer::TRACK_TITLE, CcFilesPeer::ARTIST_NAME, CcFilesPeer::BIT_RATE, CcFilesPeer::SAMPLE_RATE, CcFilesPeer::FORMAT, CcFilesPeer::LENGTH, CcFilesPeer::ALBUM_TITLE, CcFilesPeer::GENRE, CcFilesPeer::COMMENTS, CcFilesPeer::YEAR, CcFilesPeer::TRACK_NUMBER, CcFilesPeer::CHANNELS, CcFilesPeer::URL, CcFilesPeer::BPM, CcFilesPeer::RATING, CcFilesPeer::ENCODED_BY, CcFilesPeer::DISC_NUMBER, CcFilesPeer::MOOD, CcFilesPeer::LABEL, CcFilesPeer::COMPOSER, CcFilesPeer::ENCODER, CcFilesPeer::CHECKSUM, CcFilesPeer::LYRICS, CcFilesPeer::ORCHESTRA, CcFilesPeer::CONDUCTOR, CcFilesPeer::LYRICIST, CcFilesPeer::ORIGINAL_LYRICIST, CcFilesPeer::RADIO_STATION_NAME, CcFilesPeer::INFO_URL, CcFilesPeer::ARTIST_URL, CcFilesPeer::AUDIO_SOURCE_URL, CcFilesPeer::RADIO_STATION_URL, CcFilesPeer::BUY_THIS_URL, CcFilesPeer::ISRC_NUMBER, CcFilesPeer::CATALOG_NUMBER, CcFilesPeer::ORIGINAL_ARTIST, CcFilesPeer::COPYRIGHT, CcFilesPeer::REPORT_DATETIME, CcFilesPeer::REPORT_LOCATION, CcFilesPeer::REPORT_ORGANIZATION, CcFilesPeer::SUBJECT, CcFilesPeer::CONTRIBUTOR, CcFilesPeer::LANGUAGE, CcFilesPeer::FILE_EXISTS, CcFilesPeer::SOUNDCLOUD_ID, CcFilesPeer::SOUNDCLOUD_ERROR_CODE, CcFilesPeer::SOUNDCLOUD_ERROR_MSG, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, CcFilesPeer::REPLAY_GAIN, CcFilesPeer::OWNER_ID, CcFilesPeer::CUEIN, CcFilesPeer::CUEOUT, CcFilesPeer::SILAN_CHECK, CcFilesPeer::HIDDEN, CcFilesPeer::IS_SCHEDULED, CcFilesPeer::IS_PLAYLIST, CcFilesPeer::RESOURCE_ID, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'IMPORT_STATUS', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', 'RESOURCE_ID', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'import_status', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', 'resource_id', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, ) + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbImportStatus', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbImportStatus', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', ), + BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID, CcFilesPeer::NAME, CcFilesPeer::MIME, CcFilesPeer::FTYPE, CcFilesPeer::DIRECTORY, CcFilesPeer::FILEPATH, CcFilesPeer::IMPORT_STATUS, CcFilesPeer::CURRENTLYACCESSING, CcFilesPeer::EDITEDBY, CcFilesPeer::MTIME, CcFilesPeer::UTIME, CcFilesPeer::LPTIME, CcFilesPeer::MD5, CcFilesPeer::TRACK_TITLE, CcFilesPeer::ARTIST_NAME, CcFilesPeer::BIT_RATE, CcFilesPeer::SAMPLE_RATE, CcFilesPeer::FORMAT, CcFilesPeer::LENGTH, CcFilesPeer::ALBUM_TITLE, CcFilesPeer::GENRE, CcFilesPeer::COMMENTS, CcFilesPeer::YEAR, CcFilesPeer::TRACK_NUMBER, CcFilesPeer::CHANNELS, CcFilesPeer::URL, CcFilesPeer::BPM, CcFilesPeer::RATING, CcFilesPeer::ENCODED_BY, CcFilesPeer::DISC_NUMBER, CcFilesPeer::MOOD, CcFilesPeer::LABEL, CcFilesPeer::COMPOSER, CcFilesPeer::ENCODER, CcFilesPeer::CHECKSUM, CcFilesPeer::LYRICS, CcFilesPeer::ORCHESTRA, CcFilesPeer::CONDUCTOR, CcFilesPeer::LYRICIST, CcFilesPeer::ORIGINAL_LYRICIST, CcFilesPeer::RADIO_STATION_NAME, CcFilesPeer::INFO_URL, CcFilesPeer::ARTIST_URL, CcFilesPeer::AUDIO_SOURCE_URL, CcFilesPeer::RADIO_STATION_URL, CcFilesPeer::BUY_THIS_URL, CcFilesPeer::ISRC_NUMBER, CcFilesPeer::CATALOG_NUMBER, CcFilesPeer::ORIGINAL_ARTIST, CcFilesPeer::COPYRIGHT, CcFilesPeer::REPORT_DATETIME, CcFilesPeer::REPORT_LOCATION, CcFilesPeer::REPORT_ORGANIZATION, CcFilesPeer::SUBJECT, CcFilesPeer::CONTRIBUTOR, CcFilesPeer::LANGUAGE, CcFilesPeer::FILE_EXISTS, CcFilesPeer::SOUNDCLOUD_ID, CcFilesPeer::SOUNDCLOUD_ERROR_CODE, CcFilesPeer::SOUNDCLOUD_ERROR_MSG, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, CcFilesPeer::REPLAY_GAIN, CcFilesPeer::OWNER_ID, CcFilesPeer::CUEIN, CcFilesPeer::CUEOUT, CcFilesPeer::SILAN_CHECK, CcFilesPeer::HIDDEN, CcFilesPeer::IS_SCHEDULED, CcFilesPeer::IS_PLAYLIST, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'IMPORT_STATUS', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'import_status', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, ) ); /** @@ -279,12 +276,12 @@ abstract class BaseCcFilesPeer * e.g. CcFilesPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbImportStatus' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, 'DbResourceId' => 70, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbImportStatus' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, 'dbResourceId' => 70, ), - BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID => 0, CcFilesPeer::NAME => 1, CcFilesPeer::MIME => 2, CcFilesPeer::FTYPE => 3, CcFilesPeer::DIRECTORY => 4, CcFilesPeer::FILEPATH => 5, CcFilesPeer::IMPORT_STATUS => 6, CcFilesPeer::CURRENTLYACCESSING => 7, CcFilesPeer::EDITEDBY => 8, CcFilesPeer::MTIME => 9, CcFilesPeer::UTIME => 10, CcFilesPeer::LPTIME => 11, CcFilesPeer::MD5 => 12, CcFilesPeer::TRACK_TITLE => 13, CcFilesPeer::ARTIST_NAME => 14, CcFilesPeer::BIT_RATE => 15, CcFilesPeer::SAMPLE_RATE => 16, CcFilesPeer::FORMAT => 17, CcFilesPeer::LENGTH => 18, CcFilesPeer::ALBUM_TITLE => 19, CcFilesPeer::GENRE => 20, CcFilesPeer::COMMENTS => 21, CcFilesPeer::YEAR => 22, CcFilesPeer::TRACK_NUMBER => 23, CcFilesPeer::CHANNELS => 24, CcFilesPeer::URL => 25, CcFilesPeer::BPM => 26, CcFilesPeer::RATING => 27, CcFilesPeer::ENCODED_BY => 28, CcFilesPeer::DISC_NUMBER => 29, CcFilesPeer::MOOD => 30, CcFilesPeer::LABEL => 31, CcFilesPeer::COMPOSER => 32, CcFilesPeer::ENCODER => 33, CcFilesPeer::CHECKSUM => 34, CcFilesPeer::LYRICS => 35, CcFilesPeer::ORCHESTRA => 36, CcFilesPeer::CONDUCTOR => 37, CcFilesPeer::LYRICIST => 38, CcFilesPeer::ORIGINAL_LYRICIST => 39, CcFilesPeer::RADIO_STATION_NAME => 40, CcFilesPeer::INFO_URL => 41, CcFilesPeer::ARTIST_URL => 42, CcFilesPeer::AUDIO_SOURCE_URL => 43, CcFilesPeer::RADIO_STATION_URL => 44, CcFilesPeer::BUY_THIS_URL => 45, CcFilesPeer::ISRC_NUMBER => 46, CcFilesPeer::CATALOG_NUMBER => 47, CcFilesPeer::ORIGINAL_ARTIST => 48, CcFilesPeer::COPYRIGHT => 49, CcFilesPeer::REPORT_DATETIME => 50, CcFilesPeer::REPORT_LOCATION => 51, CcFilesPeer::REPORT_ORGANIZATION => 52, CcFilesPeer::SUBJECT => 53, CcFilesPeer::CONTRIBUTOR => 54, CcFilesPeer::LANGUAGE => 55, CcFilesPeer::FILE_EXISTS => 56, CcFilesPeer::SOUNDCLOUD_ID => 57, CcFilesPeer::SOUNDCLOUD_ERROR_CODE => 58, CcFilesPeer::SOUNDCLOUD_ERROR_MSG => 59, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE => 60, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME => 61, CcFilesPeer::REPLAY_GAIN => 62, CcFilesPeer::OWNER_ID => 63, CcFilesPeer::CUEIN => 64, CcFilesPeer::CUEOUT => 65, CcFilesPeer::SILAN_CHECK => 66, CcFilesPeer::HIDDEN => 67, CcFilesPeer::IS_SCHEDULED => 68, CcFilesPeer::IS_PLAYLIST => 69, CcFilesPeer::RESOURCE_ID => 70, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'IMPORT_STATUS' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, 'RESOURCE_ID' => 70, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'import_status' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, 'resource_id' => 70, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, ) + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbImportStatus' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbImportStatus' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, ), + BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID => 0, CcFilesPeer::NAME => 1, CcFilesPeer::MIME => 2, CcFilesPeer::FTYPE => 3, CcFilesPeer::DIRECTORY => 4, CcFilesPeer::FILEPATH => 5, CcFilesPeer::IMPORT_STATUS => 6, CcFilesPeer::CURRENTLYACCESSING => 7, CcFilesPeer::EDITEDBY => 8, CcFilesPeer::MTIME => 9, CcFilesPeer::UTIME => 10, CcFilesPeer::LPTIME => 11, CcFilesPeer::MD5 => 12, CcFilesPeer::TRACK_TITLE => 13, CcFilesPeer::ARTIST_NAME => 14, CcFilesPeer::BIT_RATE => 15, CcFilesPeer::SAMPLE_RATE => 16, CcFilesPeer::FORMAT => 17, CcFilesPeer::LENGTH => 18, CcFilesPeer::ALBUM_TITLE => 19, CcFilesPeer::GENRE => 20, CcFilesPeer::COMMENTS => 21, CcFilesPeer::YEAR => 22, CcFilesPeer::TRACK_NUMBER => 23, CcFilesPeer::CHANNELS => 24, CcFilesPeer::URL => 25, CcFilesPeer::BPM => 26, CcFilesPeer::RATING => 27, CcFilesPeer::ENCODED_BY => 28, CcFilesPeer::DISC_NUMBER => 29, CcFilesPeer::MOOD => 30, CcFilesPeer::LABEL => 31, CcFilesPeer::COMPOSER => 32, CcFilesPeer::ENCODER => 33, CcFilesPeer::CHECKSUM => 34, CcFilesPeer::LYRICS => 35, CcFilesPeer::ORCHESTRA => 36, CcFilesPeer::CONDUCTOR => 37, CcFilesPeer::LYRICIST => 38, CcFilesPeer::ORIGINAL_LYRICIST => 39, CcFilesPeer::RADIO_STATION_NAME => 40, CcFilesPeer::INFO_URL => 41, CcFilesPeer::ARTIST_URL => 42, CcFilesPeer::AUDIO_SOURCE_URL => 43, CcFilesPeer::RADIO_STATION_URL => 44, CcFilesPeer::BUY_THIS_URL => 45, CcFilesPeer::ISRC_NUMBER => 46, CcFilesPeer::CATALOG_NUMBER => 47, CcFilesPeer::ORIGINAL_ARTIST => 48, CcFilesPeer::COPYRIGHT => 49, CcFilesPeer::REPORT_DATETIME => 50, CcFilesPeer::REPORT_LOCATION => 51, CcFilesPeer::REPORT_ORGANIZATION => 52, CcFilesPeer::SUBJECT => 53, CcFilesPeer::CONTRIBUTOR => 54, CcFilesPeer::LANGUAGE => 55, CcFilesPeer::FILE_EXISTS => 56, CcFilesPeer::SOUNDCLOUD_ID => 57, CcFilesPeer::SOUNDCLOUD_ERROR_CODE => 58, CcFilesPeer::SOUNDCLOUD_ERROR_MSG => 59, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE => 60, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME => 61, CcFilesPeer::REPLAY_GAIN => 62, CcFilesPeer::OWNER_ID => 63, CcFilesPeer::CUEIN => 64, CcFilesPeer::CUEOUT => 65, CcFilesPeer::SILAN_CHECK => 66, CcFilesPeer::HIDDEN => 67, CcFilesPeer::IS_SCHEDULED => 68, CcFilesPeer::IS_PLAYLIST => 69, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'IMPORT_STATUS' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'import_status' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, ) ); /** @@ -428,7 +425,6 @@ public static function addSelectColumns(Criteria $criteria, $alias = null) $criteria->addSelectColumn(CcFilesPeer::HIDDEN); $criteria->addSelectColumn(CcFilesPeer::IS_SCHEDULED); $criteria->addSelectColumn(CcFilesPeer::IS_PLAYLIST); - $criteria->addSelectColumn(CcFilesPeer::RESOURCE_ID); } else { $criteria->addSelectColumn($alias . '.id'); $criteria->addSelectColumn($alias . '.name'); @@ -500,7 +496,6 @@ public static function addSelectColumns(Criteria $criteria, $alias = null) $criteria->addSelectColumn($alias . '.hidden'); $criteria->addSelectColumn($alias . '.is_scheduled'); $criteria->addSelectColumn($alias . '.is_playlist'); - $criteria->addSelectColumn($alias . '.resource_id'); } } diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php index 648dd4b1de..e0f83b6808 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php @@ -76,7 +76,6 @@ * @method CcFilesQuery orderByDbHidden($order = Criteria::ASC) Order by the hidden column * @method CcFilesQuery orderByDbIsScheduled($order = Criteria::ASC) Order by the is_scheduled column * @method CcFilesQuery orderByDbIsPlaylist($order = Criteria::ASC) Order by the is_playlist column - * @method CcFilesQuery orderByDbResourceId($order = Criteria::ASC) Order by the resource_id column * * @method CcFilesQuery groupByDbId() Group by the id column * @method CcFilesQuery groupByDbName() Group by the name column @@ -148,7 +147,6 @@ * @method CcFilesQuery groupByDbHidden() Group by the hidden column * @method CcFilesQuery groupByDbIsScheduled() Group by the is_scheduled column * @method CcFilesQuery groupByDbIsPlaylist() Group by the is_playlist column - * @method CcFilesQuery groupByDbResourceId() Group by the resource_id column * * @method CcFilesQuery leftJoin($relation) Adds a LEFT JOIN clause to the query * @method CcFilesQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query @@ -166,6 +164,10 @@ * @method CcFilesQuery rightJoinCcMusicDirs($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcMusicDirs relation * @method CcFilesQuery innerJoinCcMusicDirs($relationAlias = null) Adds a INNER JOIN clause to the query using the CcMusicDirs relation * + * @method CcFilesQuery leftJoinCloudFile($relationAlias = null) Adds a LEFT JOIN clause to the query using the CloudFile relation + * @method CcFilesQuery rightJoinCloudFile($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CloudFile relation + * @method CcFilesQuery innerJoinCloudFile($relationAlias = null) Adds a INNER JOIN clause to the query using the CloudFile relation + * * @method CcFilesQuery leftJoinCcShowInstances($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcShowInstances relation * @method CcFilesQuery rightJoinCcShowInstances($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcShowInstances relation * @method CcFilesQuery innerJoinCcShowInstances($relationAlias = null) Adds a INNER JOIN clause to the query using the CcShowInstances relation @@ -258,7 +260,6 @@ * @method CcFiles findOneByDbHidden(boolean $hidden) Return the first CcFiles filtered by the hidden column * @method CcFiles findOneByDbIsScheduled(boolean $is_scheduled) Return the first CcFiles filtered by the is_scheduled column * @method CcFiles findOneByDbIsPlaylist(boolean $is_playlist) Return the first CcFiles filtered by the is_playlist column - * @method CcFiles findOneByDbResourceId(string $resource_id) Return the first CcFiles filtered by the resource_id column * * @method array findByDbId(int $id) Return CcFiles objects filtered by the id column * @method array findByDbName(string $name) Return CcFiles objects filtered by the name column @@ -330,7 +331,6 @@ * @method array findByDbHidden(boolean $hidden) Return CcFiles objects filtered by the hidden column * @method array findByDbIsScheduled(boolean $is_scheduled) Return CcFiles objects filtered by the is_scheduled column * @method array findByDbIsPlaylist(boolean $is_playlist) Return CcFiles objects filtered by the is_playlist column - * @method array findByDbResourceId(string $resource_id) Return CcFiles objects filtered by the resource_id column * * @package propel.generator.airtime.om */ @@ -438,7 +438,7 @@ public function findOneByDbId($key, $con = null) */ protected function findPkSimple($key, $con) { - $sql = 'SELECT "id", "name", "mime", "ftype", "directory", "filepath", "import_status", "currentlyaccessing", "editedby", "mtime", "utime", "lptime", "md5", "track_title", "artist_name", "bit_rate", "sample_rate", "format", "length", "album_title", "genre", "comments", "year", "track_number", "channels", "url", "bpm", "rating", "encoded_by", "disc_number", "mood", "label", "composer", "encoder", "checksum", "lyrics", "orchestra", "conductor", "lyricist", "original_lyricist", "radio_station_name", "info_url", "artist_url", "audio_source_url", "radio_station_url", "buy_this_url", "isrc_number", "catalog_number", "original_artist", "copyright", "report_datetime", "report_location", "report_organization", "subject", "contributor", "language", "file_exists", "soundcloud_id", "soundcloud_error_code", "soundcloud_error_msg", "soundcloud_link_to_file", "soundcloud_upload_time", "replay_gain", "owner_id", "cuein", "cueout", "silan_check", "hidden", "is_scheduled", "is_playlist", "resource_id" FROM "cc_files" WHERE "id" = :p0'; + $sql = 'SELECT "id", "name", "mime", "ftype", "directory", "filepath", "import_status", "currentlyaccessing", "editedby", "mtime", "utime", "lptime", "md5", "track_title", "artist_name", "bit_rate", "sample_rate", "format", "length", "album_title", "genre", "comments", "year", "track_number", "channels", "url", "bpm", "rating", "encoded_by", "disc_number", "mood", "label", "composer", "encoder", "checksum", "lyrics", "orchestra", "conductor", "lyricist", "original_lyricist", "radio_station_name", "info_url", "artist_url", "audio_source_url", "radio_station_url", "buy_this_url", "isrc_number", "catalog_number", "original_artist", "copyright", "report_datetime", "report_location", "report_organization", "subject", "contributor", "language", "file_exists", "soundcloud_id", "soundcloud_error_code", "soundcloud_error_msg", "soundcloud_link_to_file", "soundcloud_upload_time", "replay_gain", "owner_id", "cuein", "cueout", "silan_check", "hidden", "is_scheduled", "is_playlist" FROM "cc_files" WHERE "id" = :p0'; try { $stmt = $con->prepare($sql); $stmt->bindValue(':p0', $key, PDO::PARAM_INT); @@ -2791,35 +2791,6 @@ public function filterByDbIsPlaylist($dbIsPlaylist = null, $comparison = null) return $this->addUsingAlias(CcFilesPeer::IS_PLAYLIST, $dbIsPlaylist, $comparison); } - /** - * Filter the query on the resource_id column - * - * Example usage: - * - * $query->filterByDbResourceId('fooValue'); // WHERE resource_id = 'fooValue' - * $query->filterByDbResourceId('%fooValue%'); // WHERE resource_id LIKE '%fooValue%' - * - * - * @param string $dbResourceId The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return CcFilesQuery The current query, for fluid interface - */ - public function filterByDbResourceId($dbResourceId = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbResourceId)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbResourceId)) { - $dbResourceId = str_replace('*', '%', $dbResourceId); - $comparison = Criteria::LIKE; - } - } - - return $this->addUsingAlias(CcFilesPeer::RESOURCE_ID, $dbResourceId, $comparison); - } - /** * Filter the query by a related CcSubjs object * @@ -3048,6 +3019,80 @@ public function useCcMusicDirsQuery($relationAlias = null, $joinType = Criteria: ->useQuery($relationAlias ? $relationAlias : 'CcMusicDirs', 'CcMusicDirsQuery'); } + /** + * Filter the query by a related CloudFile object + * + * @param CloudFile|PropelObjectCollection $cloudFile the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CcFilesQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCloudFile($cloudFile, $comparison = null) + { + if ($cloudFile instanceof CloudFile) { + return $this + ->addUsingAlias(CcFilesPeer::ID, $cloudFile->getCcFileId(), $comparison); + } elseif ($cloudFile instanceof PropelObjectCollection) { + return $this + ->useCloudFileQuery() + ->filterByPrimaryKeys($cloudFile->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCloudFile() only accepts arguments of type CloudFile or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CloudFile relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery The current query, for fluid interface + */ + public function joinCloudFile($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CloudFile'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CloudFile'); + } + + return $this; + } + + /** + * Use the CloudFile relation CloudFile object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CloudFileQuery A secondary query class using the current class as primary query + */ + public function useCloudFileQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCloudFile($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CloudFile', 'CloudFileQuery'); + } + /** * Filter the query by a related CcShowInstances object * diff --git a/airtime_mvc/application/models/airtime/om/BaseCloudFile.php b/airtime_mvc/application/models/airtime/om/BaseCloudFile.php new file mode 100644 index 0000000000..59e5b871d0 --- /dev/null +++ b/airtime_mvc/application/models/airtime/om/BaseCloudFile.php @@ -0,0 +1,1015 @@ +id; + } + + /** + * Get the [resource_id] column value. + * + * @return string + */ + public function getResourceId() + { + + return $this->resource_id; + } + + /** + * Get the [cc_file_id] column value. + * + * @return int + */ + public function getCcFileId() + { + + return $this->cc_file_id; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return CloudFile The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = CloudFilePeer::ID; + } + + + return $this; + } // setId() + + /** + * Set the value of [resource_id] column. + * + * @param string $v new value + * @return CloudFile The current object (for fluent API support) + */ + public function setResourceId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->resource_id !== $v) { + $this->resource_id = $v; + $this->modifiedColumns[] = CloudFilePeer::RESOURCE_ID; + } + + + return $this; + } // setResourceId() + + /** + * Set the value of [cc_file_id] column. + * + * @param int $v new value + * @return CloudFile The current object (for fluent API support) + */ + public function setCcFileId($v) + { + if ($v !== null && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->cc_file_id !== $v) { + $this->cc_file_id = $v; + $this->modifiedColumns[] = CloudFilePeer::CC_FILE_ID; + } + + if ($this->aCcFiles !== null && $this->aCcFiles->getDbId() !== $v) { + $this->aCcFiles = null; + } + + + return $this; + } // setCcFileId() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return true + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) + * @param int $startcol 0-based offset column which indicates which resultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false) + { + try { + + $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; + $this->resource_id = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->cc_file_id = ($row[$startcol + 2] !== null) ? (int) $row[$startcol + 2] : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + $this->postHydrate($row, $startcol, $rehydrate); + + return $startcol + 3; // 3 = CloudFilePeer::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating CloudFile object", $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + + if ($this->aCcFiles !== null && $this->cc_file_id !== $this->aCcFiles->getDbId()) { + $this->aCcFiles = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param PropelPDO $con (optional) The PropelPDO connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $stmt = CloudFilePeer::doSelectStmt($this->buildPkeyCriteria(), $con); + $row = $stmt->fetch(PDO::FETCH_NUM); + $stmt->closeCursor(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCcFiles = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param PropelPDO $con + * @return void + * @throws PropelException + * @throws Exception + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + try { + $deleteQuery = CloudFileQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @throws Exception + * @see doSave() + */ + public function save(PropelPDO $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CloudFilePeer::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param PropelPDO $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(PropelPDO $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcFiles !== null) { + if ($this->aCcFiles->isModified() || $this->aCcFiles->isNew()) { + $affectedRows += $this->aCcFiles->save($con); + } + $this->setCcFiles($this->aCcFiles); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param PropelPDO $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(PropelPDO $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = CloudFilePeer::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CloudFilePeer::ID . ')'); + } + if (null === $this->id) { + try { + $stmt = $con->query("SELECT nextval('cloud_file_id_seq')"); + $row = $stmt->fetch(PDO::FETCH_NUM); + $this->id = $row[0]; + } catch (Exception $e) { + throw new PropelException('Unable to get sequence id.', $e); + } + } + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CloudFilePeer::ID)) { + $modifiedColumns[':p' . $index++] = '"id"'; + } + if ($this->isColumnModified(CloudFilePeer::RESOURCE_ID)) { + $modifiedColumns[':p' . $index++] = '"resource_id"'; + } + if ($this->isColumnModified(CloudFilePeer::CC_FILE_ID)) { + $modifiedColumns[':p' . $index++] = '"cc_file_id"'; + } + + $sql = sprintf( + 'INSERT INTO "cloud_file" (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case '"id"': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case '"resource_id"': + $stmt->bindValue($identifier, $this->resource_id, PDO::PARAM_STR); + break; + case '"cc_file_id"': + $stmt->bindValue($identifier, $this->cc_file_id, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param PropelPDO $con + * + * @see doSave() + */ + protected function doUpdate(PropelPDO $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + BasePeer::doUpdate($selectCriteria, $valuesCriteria, $con); + } + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + + return true; + } + + $this->validationFailures = $res; + + return false; + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggregated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCcFiles !== null) { + if (!$this->aCcFiles->validate($columns)) { + $failureMap = array_merge($failureMap, $this->aCcFiles->getValidationFailures()); + } + } + + + if (($retval = CloudFilePeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CloudFilePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getResourceId(); + break; + case 2: + return $this->getCcFileId(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to true. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CloudFile'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CloudFile'][$this->getPrimaryKey()] = true; + $keys = CloudFilePeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getResourceId(), + $keys[2] => $this->getCcFileId(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCcFiles) { + $result['CcFiles'] = $this->aCcFiles->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * Defaults to BasePeer::TYPE_PHPNAME + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = CloudFilePeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + + $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setResourceId($value); + break; + case 2: + $this->setCcFileId($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. + * The default key type is the column's BasePeer::TYPE_PHPNAME + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = CloudFilePeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setResourceId($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setCcFileId($arr[$keys[2]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CloudFilePeer::DATABASE_NAME); + + if ($this->isColumnModified(CloudFilePeer::ID)) $criteria->add(CloudFilePeer::ID, $this->id); + if ($this->isColumnModified(CloudFilePeer::RESOURCE_ID)) $criteria->add(CloudFilePeer::RESOURCE_ID, $this->resource_id); + if ($this->isColumnModified(CloudFilePeer::CC_FILE_ID)) $criteria->add(CloudFilePeer::CC_FILE_ID, $this->cc_file_id); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CloudFilePeer::DATABASE_NAME); + $criteria->add(CloudFilePeer::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of CloudFile (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setResourceId($this->getResourceId()); + $copyObj->setCcFileId($this->getCcFileId()); + + if ($deepCopy && !$this->startCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + // store object hash to prevent cycle + $this->startCopy = true; + + //unflag object copy + $this->startCopy = false; + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return CloudFile Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return CloudFilePeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new CloudFilePeer(); + } + + return self::$peer; + } + + /** + * Declares an association between this object and a CcFiles object. + * + * @param CcFiles $v + * @return CloudFile The current object (for fluent API support) + * @throws PropelException + */ + public function setCcFiles(CcFiles $v = null) + { + if ($v === null) { + $this->setCcFileId(NULL); + } else { + $this->setCcFileId($v->getDbId()); + } + + $this->aCcFiles = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the CcFiles object, it will not be re-added. + if ($v !== null) { + $v->addCloudFile($this); + } + + + return $this; + } + + + /** + * Get the associated CcFiles object + * + * @param PropelPDO $con Optional Connection object. + * @param $doQuery Executes a query to get the object if required + * @return CcFiles The associated CcFiles object. + * @throws PropelException + */ + public function getCcFiles(PropelPDO $con = null, $doQuery = true) + { + if ($this->aCcFiles === null && ($this->cc_file_id !== null) && $doQuery) { + $this->aCcFiles = CcFilesQuery::create()->findPk($this->cc_file_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCcFiles->addCloudFiles($this); + */ + } + + return $this->aCcFiles; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->resource_id = null; + $this->cc_file_id = null; + $this->alreadyInSave = false; + $this->alreadyInValidation = false; + $this->alreadyInClearAllReferencesDeep = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep && !$this->alreadyInClearAllReferencesDeep) { + $this->alreadyInClearAllReferencesDeep = true; + if ($this->aCcFiles instanceof Persistent) { + $this->aCcFiles->clearAllReferences($deep); + } + + $this->alreadyInClearAllReferencesDeep = false; + } // if ($deep) + + $this->aCcFiles = null; + } + + /** + * return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CloudFilePeer::DEFAULT_STRING_FORMAT); + } + + /** + * return true is the object is in saving state + * + * @return boolean + */ + public function isAlreadyInSave() + { + return $this->alreadyInSave; + } + + /** + * Catches calls to virtual methods + */ + public function __call($name, $params) + { + + // delegate behavior + + if (is_callable(array('CcFiles', $name))) { + if (!$delegate = $this->getCcFiles()) { + $delegate = new CcFiles(); + $this->setCcFiles($delegate); + } + + return call_user_func_array(array($delegate, $name), $params); + } + + return parent::__call($name, $params); + } + +} diff --git a/airtime_mvc/application/models/airtime/om/BaseCloudFilePeer.php b/airtime_mvc/application/models/airtime/om/BaseCloudFilePeer.php new file mode 100644 index 0000000000..464a6bd7e9 --- /dev/null +++ b/airtime_mvc/application/models/airtime/om/BaseCloudFilePeer.php @@ -0,0 +1,1004 @@ + array ('Id', 'ResourceId', 'CcFileId', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('id', 'resourceId', 'ccFileId', ), + BasePeer::TYPE_COLNAME => array (CloudFilePeer::ID, CloudFilePeer::RESOURCE_ID, CloudFilePeer::CC_FILE_ID, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'RESOURCE_ID', 'CC_FILE_ID', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'resource_id', 'cc_file_id', ), + BasePeer::TYPE_NUM => array (0, 1, 2, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. CloudFilePeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('Id' => 0, 'ResourceId' => 1, 'CcFileId' => 2, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('id' => 0, 'resourceId' => 1, 'ccFileId' => 2, ), + BasePeer::TYPE_COLNAME => array (CloudFilePeer::ID => 0, CloudFilePeer::RESOURCE_ID => 1, CloudFilePeer::CC_FILE_ID => 2, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'RESOURCE_ID' => 1, 'CC_FILE_ID' => 2, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'resource_id' => 1, 'cc_file_id' => 2, ), + BasePeer::TYPE_NUM => array (0, 1, 2, ) + ); + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + * @throws PropelException - if the specified name could not be found in the fieldname mappings. + */ + public static function translateFieldName($name, $fromType, $toType) + { + $toNames = CloudFilePeer::getFieldNames($toType); + $key = isset(CloudFilePeer::$fieldKeys[$fromType][$name]) ? CloudFilePeer::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(CloudFilePeer::$fieldKeys[$fromType], true)); + } + + return $toNames[$key]; + } + + /** + * Returns an array of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME + * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM + * @return array A list of field names + * @throws PropelException - if the type is not valid. + */ + public static function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, CloudFilePeer::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.'); + } + + return CloudFilePeer::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. CloudFilePeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(CloudFilePeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CloudFilePeer::ID); + $criteria->addSelectColumn(CloudFilePeer::RESOURCE_ID); + $criteria->addSelectColumn(CloudFilePeer::CC_FILE_ID); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.resource_id'); + $criteria->addSelectColumn($alias . '.cc_file_id'); + } + } + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null) + { + // we may modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CloudFilePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CloudFilePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + $criteria->setDbName(CloudFilePeer::DATABASE_NAME); // Set the correct dbName + + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + // BasePeer returns a PDOStatement + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + /** + * Selects one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param PropelPDO $con + * @return CloudFile + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, PropelPDO $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = CloudFilePeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + + return null; + } + /** + * Selects several row from the DB. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, PropelPDO $con = null) + { + return CloudFilePeer::populateObjects(CloudFilePeer::doSelectStmt($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. + * + * Use this method directly if you want to work with an executed statement directly (for example + * to perform your own object hydration). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param PropelPDO $con The connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return PDOStatement The executed PDOStatement object. + * @see BasePeer::doSelect() + */ + public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + if (!$criteria->hasSelectClause()) { + $criteria = clone $criteria; + CloudFilePeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(CloudFilePeer::DATABASE_NAME); + + // BasePeer returns a PDOStatement + return BasePeer::doSelect($criteria, $con); + } + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doSelect*() + * methods in your stub classes -- you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by doSelect*() + * and retrieveByPK*() calls. + * + * @param CloudFile $obj A CloudFile object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if ($key === null) { + $key = (string) $obj->getId(); + } // if key === null + CloudFilePeer::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A CloudFile object or a primary key value. + * + * @return void + * @throws PropelException - if the value is invalid. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && $value !== null) { + if (is_object($value) && $value instanceof CloudFile) { + $key = (string) $value->getId(); + } elseif (is_scalar($value)) { + // assume we've been passed a primary key + $key = (string) $value; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or CloudFile object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true))); + throw $e; + } + + unset(CloudFilePeer::$instances[$key]); + } + } // removeInstanceFromPool() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param string $key The key (@see getPrimaryKeyHash()) for this instance. + * @return CloudFile Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled. + * @see getPrimaryKeyHash() + */ + public static function getInstanceFromPool($key) + { + if (Propel::isInstancePoolingEnabled()) { + if (isset(CloudFilePeer::$instances[$key])) { + return CloudFilePeer::$instances[$key]; + } + } + + return null; // just to be explicit + } + + /** + * Clear the instance pool. + * + * @return void + */ + public static function clearInstancePool($and_clear_all_references = false) + { + if ($and_clear_all_references) { + foreach (CloudFilePeer::$instances as $instance) { + $instance->clearAllReferences(true); + } + } + CloudFilePeer::$instances = array(); + } + + /** + * Method to invalidate the instance pool of all tables related to cloud_file + * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return string A string version of PK or null if the components of primary key in result array are all null. + */ + public static function getPrimaryKeyHashFromRow($row, $startcol = 0) + { + // If the PK cannot be derived from the row, return null. + if ($row[$startcol] === null) { + return null; + } + + return (string) $row[$startcol]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $startcol = 0) + { + + return (int) $row[$startcol]; + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(PDOStatement $stmt) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = CloudFilePeer::getOMClass(); + // populate the object(s) + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key = CloudFilePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj = CloudFilePeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CloudFilePeer::addInstanceToPool($obj, $key); + } // if key exists + } + $stmt->closeCursor(); + + return $results; + } + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row PropelPDO resultset row. + * @param int $startcol The 0-based offset for reading from the resultset row. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CloudFile object, last column rank) + */ + public static function populateObject($row, $startcol = 0) + { + $key = CloudFilePeer::getPrimaryKeyHashFromRow($row, $startcol); + if (null !== ($obj = CloudFilePeer::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $startcol, true); // rehydrate + $col = $startcol + CloudFilePeer::NUM_HYDRATE_COLUMNS; + } else { + $cls = CloudFilePeer::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $startcol); + CloudFilePeer::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + + /** + * Returns the number of rows matching criteria, joining the related CcFiles table + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinCcFiles(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CloudFilePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CloudFilePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CloudFilePeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CloudFilePeer::CC_FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + + /** + * Selects a collection of CloudFile objects pre-filled with their CcFiles objects. + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CloudFile objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinCcFiles(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CloudFilePeer::DATABASE_NAME); + } + + CloudFilePeer::addSelectColumns($criteria); + $startcol = CloudFilePeer::NUM_HYDRATE_COLUMNS; + CcFilesPeer::addSelectColumns($criteria); + + $criteria->addJoin(CloudFilePeer::CC_FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CloudFilePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CloudFilePeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + + $cls = CloudFilePeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CloudFilePeer::addInstanceToPool($obj1, $key1); + } // if $obj1 already loaded + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if obj2 already loaded + + // Add the $obj1 (CloudFile) to $obj2 (CcFiles) + $obj2->addCloudFile($obj1); + + } // if joined row was not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + + /** + * Returns the number of rows matching criteria, joining all related tables + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return int Number of matching rows. + */ + public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // We need to set the primary table name, since in the case that there are no WHERE columns + // it will be impossible for the BasePeer::createSelectSql() method to determine which + // tables go into the FROM clause. + $criteria->setPrimaryTableName(CloudFilePeer::TABLE_NAME); + + if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->setDistinct(); + } + + if (!$criteria->hasSelectClause()) { + CloudFilePeer::addSelectColumns($criteria); + } + + $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count + + // Set the correct dbName + $criteria->setDbName(CloudFilePeer::DATABASE_NAME); + + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria->addJoin(CloudFilePeer::CC_FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doCount($criteria, $con); + + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $count = (int) $row[0]; + } else { + $count = 0; // no rows returned; we infer that means 0 matches. + } + $stmt->closeCursor(); + + return $count; + } + + /** + * Selects a collection of CloudFile objects pre-filled with all related objects. + * + * @param Criteria $criteria + * @param PropelPDO $con + * @param String $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN + * @return array Array of CloudFile objects. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN) + { + $criteria = clone $criteria; + + // Set the correct dbName if it has not been overridden + if ($criteria->getDbName() == Propel::getDefaultDB()) { + $criteria->setDbName(CloudFilePeer::DATABASE_NAME); + } + + CloudFilePeer::addSelectColumns($criteria); + $startcol2 = CloudFilePeer::NUM_HYDRATE_COLUMNS; + + CcFilesPeer::addSelectColumns($criteria); + $startcol3 = $startcol2 + CcFilesPeer::NUM_HYDRATE_COLUMNS; + + $criteria->addJoin(CloudFilePeer::CC_FILE_ID, CcFilesPeer::ID, $join_behavior); + + $stmt = BasePeer::doSelect($criteria, $con); + $results = array(); + + while ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $key1 = CloudFilePeer::getPrimaryKeyHashFromRow($row, 0); + if (null !== ($obj1 = CloudFilePeer::getInstanceFromPool($key1))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj1->hydrate($row, 0, true); // rehydrate + } else { + $cls = CloudFilePeer::getOMClass(); + + $obj1 = new $cls(); + $obj1->hydrate($row); + CloudFilePeer::addInstanceToPool($obj1, $key1); + } // if obj1 already loaded + + // Add objects for joined CcFiles rows + + $key2 = CcFilesPeer::getPrimaryKeyHashFromRow($row, $startcol2); + if ($key2 !== null) { + $obj2 = CcFilesPeer::getInstanceFromPool($key2); + if (!$obj2) { + + $cls = CcFilesPeer::getOMClass(); + + $obj2 = new $cls(); + $obj2->hydrate($row, $startcol2); + CcFilesPeer::addInstanceToPool($obj2, $key2); + } // if obj2 loaded + + // Add the $obj1 (CloudFile) to the collection in $obj2 (CcFiles) + $obj2->addCloudFile($obj1); + } // if joined row not null + + $results[] = $obj1; + } + $stmt->closeCursor(); + + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(CloudFilePeer::DATABASE_NAME)->getTable(CloudFilePeer::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this peer class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getDatabaseMap(BaseCloudFilePeer::DATABASE_NAME); + if (!$dbMap->hasTable(BaseCloudFilePeer::TABLE_NAME)) { + $dbMap->addTableObject(new \CloudFileTableMap()); + } + } + + /** + * The class that the Peer will make instances of. + * + * + * @return string ClassName + */ + public static function getOMClass($row = 0, $colnum = 0) + { + return CloudFilePeer::OM_CLASS; + } + + /** + * Performs an INSERT on the database, given a CloudFile or Criteria object. + * + * @param mixed $values Criteria or CloudFile object containing data that is used to create the INSERT statement. + * @param PropelPDO $con the PropelPDO connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from CloudFile object + } + + if ($criteria->containsKey(CloudFilePeer::ID) && $criteria->keyContainsValue(CloudFilePeer::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CloudFilePeer::ID.')'); + } + + + // Set the correct dbName + $criteria->setDbName(CloudFilePeer::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + + /** + * Performs an UPDATE on the database, given a CloudFile or Criteria object. + * + * @param mixed $values Criteria or CloudFile object containing data that is used to create the UPDATE statement. + * @param PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + $selectCriteria = new Criteria(CloudFilePeer::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(CloudFilePeer::ID); + $value = $criteria->remove(CloudFilePeer::ID); + if ($value) { + $selectCriteria->add(CloudFilePeer::ID, $value, $comparison); + } else { + $selectCriteria->setPrimaryTableName(CloudFilePeer::TABLE_NAME); + } + + } else { // $values is CloudFile object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(CloudFilePeer::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Deletes all rows from the cloud_file table. + * + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException + */ + public static function doDeleteAll(PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += BasePeer::doDeleteAll(CloudFilePeer::TABLE_NAME, $con, CloudFilePeer::DATABASE_NAME); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CloudFilePeer::clearInstancePool(); + CloudFilePeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs a DELETE on the database, given a CloudFile or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CloudFile object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param PropelPDO $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); + } + + if ($values instanceof Criteria) { + // invalidate the cache for all objects of this type, since we have no + // way of knowing (without running a query) what objects should be invalidated + // from the cache based on this Criteria. + CloudFilePeer::clearInstancePool(); + // rename for clarity + $criteria = clone $values; + } elseif ($values instanceof CloudFile) { // it's a model object + // invalidate the cache for this single object + CloudFilePeer::removeInstanceFromPool($values); + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CloudFilePeer::DATABASE_NAME); + $criteria->add(CloudFilePeer::ID, (array) $values, Criteria::IN); + // invalidate the cache for this object(s) + foreach ((array) $values as $singleval) { + CloudFilePeer::removeInstanceFromPool($singleval); + } + } + + // Set the correct dbName + $criteria->setDbName(CloudFilePeer::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + CloudFilePeer::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Validates all modified columns of given CloudFile object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param CloudFile $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate($obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(CloudFilePeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(CloudFilePeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->hasColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(CloudFilePeer::DATABASE_NAME, CloudFilePeer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param int $pk the primary key. + * @param PropelPDO $con the connection to use + * @return CloudFile + */ + public static function retrieveByPK($pk, PropelPDO $con = null) + { + + if (null !== ($obj = CloudFilePeer::getInstanceFromPool((string) $pk))) { + return $obj; + } + + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $criteria = new Criteria(CloudFilePeer::DATABASE_NAME); + $criteria->add(CloudFilePeer::ID, $pk); + + $v = CloudFilePeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param PropelPDO $con the connection to use + * @return CloudFile[] + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, PropelPDO $con = null) + { + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(CloudFilePeer::DATABASE_NAME); + $criteria->add(CloudFilePeer::ID, $pks, Criteria::IN); + $objs = CloudFilePeer::doSelect($criteria, $con); + } + + return $objs; + } + +} // BaseCloudFilePeer + +// This is the static code needed to register the TableMap for this table with the main Propel class. +// +BaseCloudFilePeer::buildTableMap(); + diff --git a/airtime_mvc/application/models/airtime/om/BaseCloudFileQuery.php b/airtime_mvc/application/models/airtime/om/BaseCloudFileQuery.php new file mode 100644 index 0000000000..ca320f13ff --- /dev/null +++ b/airtime_mvc/application/models/airtime/om/BaseCloudFileQuery.php @@ -0,0 +1,437 @@ +mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con an optional connection object + * + * @return CloudFile|CloudFile[]|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CloudFilePeer::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getConnection(CloudFilePeer::DATABASE_NAME, Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Alias of findPk to use instance pooling + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CloudFile A model object, or null if the key is not found + * @throws PropelException + */ + public function findOneById($key, $con = null) + { + return $this->findPk($key, $con); + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CloudFile A model object, or null if the key is not found + * @throws PropelException + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT "id", "resource_id", "cc_file_id" FROM "cloud_file" WHERE "id" = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); + } + $obj = null; + if ($row = $stmt->fetch(PDO::FETCH_NUM)) { + $obj = new CloudFile(); + $obj->hydrate($row); + CloudFilePeer::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param PropelPDO $con A connection object + * + * @return CloudFile|CloudFile[]|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($stmt); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param PropelPDO $con an optional connection object + * + * @return PropelObjectCollection|CloudFile[]|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if ($con === null) { + $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $stmt = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($stmt); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return CloudFileQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CloudFilePeer::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return CloudFileQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CloudFilePeer::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id >= 12 + * $query->filterById(array('max' => 12)); // WHERE id <= 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CloudFileQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(CloudFilePeer::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(CloudFilePeer::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CloudFilePeer::ID, $id, $comparison); + } + + /** + * Filter the query on the resource_id column + * + * Example usage: + * + * $query->filterByResourceId('fooValue'); // WHERE resource_id = 'fooValue' + * $query->filterByResourceId('%fooValue%'); // WHERE resource_id LIKE '%fooValue%' + * + * + * @param string $resourceId The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CloudFileQuery The current query, for fluid interface + */ + public function filterByResourceId($resourceId = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($resourceId)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $resourceId)) { + $resourceId = str_replace('*', '%', $resourceId); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CloudFilePeer::RESOURCE_ID, $resourceId, $comparison); + } + + /** + * Filter the query on the cc_file_id column + * + * Example usage: + * + * $query->filterByCcFileId(1234); // WHERE cc_file_id = 1234 + * $query->filterByCcFileId(array(12, 34)); // WHERE cc_file_id IN (12, 34) + * $query->filterByCcFileId(array('min' => 12)); // WHERE cc_file_id >= 12 + * $query->filterByCcFileId(array('max' => 12)); // WHERE cc_file_id <= 12 + * + * + * @see filterByCcFiles() + * + * @param mixed $ccFileId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CloudFileQuery The current query, for fluid interface + */ + public function filterByCcFileId($ccFileId = null, $comparison = null) + { + if (is_array($ccFileId)) { + $useMinMax = false; + if (isset($ccFileId['min'])) { + $this->addUsingAlias(CloudFilePeer::CC_FILE_ID, $ccFileId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($ccFileId['max'])) { + $this->addUsingAlias(CloudFilePeer::CC_FILE_ID, $ccFileId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CloudFilePeer::CC_FILE_ID, $ccFileId, $comparison); + } + + /** + * Filter the query by a related CcFiles object + * + * @param CcFiles|PropelObjectCollection $ccFiles The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CloudFileQuery The current query, for fluid interface + * @throws PropelException - if the provided filter is invalid. + */ + public function filterByCcFiles($ccFiles, $comparison = null) + { + if ($ccFiles instanceof CcFiles) { + return $this + ->addUsingAlias(CloudFilePeer::CC_FILE_ID, $ccFiles->getDbId(), $comparison); + } elseif ($ccFiles instanceof PropelObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CloudFilePeer::CC_FILE_ID, $ccFiles->toKeyValue('PrimaryKey', 'DbId'), $comparison); + } else { + throw new PropelException('filterByCcFiles() only accepts arguments of type CcFiles or PropelCollection'); + } + } + + /** + * Adds a JOIN clause to the query using the CcFiles relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CloudFileQuery The current query, for fluid interface + */ + public function joinCcFiles($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CcFiles'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CcFiles'); + } + + return $this; + } + + /** + * Use the CcFiles relation CcFiles object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return CcFilesQuery A secondary query class using the current class as primary query + */ + public function useCcFilesQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCcFiles($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery'); + } + + /** + * Exclude object from result + * + * @param CloudFile $cloudFile Object to remove from the list of results + * + * @return CloudFileQuery The current query, for fluid interface + */ + public function prune($cloudFile = null) + { + if ($cloudFile) { + $this->addUsingAlias(CloudFilePeer::ID, $cloudFile->getId(), Criteria::NOT_EQUAL); + } + + return $this; + } + +} diff --git a/airtime_mvc/build/schema.xml b/airtime_mvc/build/schema.xml index 1c4a232b93..4b2c29d548 100644 --- a/airtime_mvc/build/schema.xml +++ b/airtime_mvc/build/schema.xml @@ -82,7 +82,6 @@ - @@ -99,6 +98,18 @@ + + + + + + + + + + + +
diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index 0ef5003d1d..6925c928a9 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -94,7 +94,6 @@ CREATE TABLE "cc_files" "hidden" BOOLEAN DEFAULT 'f', "is_scheduled" BOOLEAN DEFAULT 'f', "is_playlist" BOOLEAN DEFAULT 'f', - "resource_id" TEXT, PRIMARY KEY ("id") ); @@ -102,6 +101,20 @@ CREATE INDEX "cc_files_md5_idx" ON "cc_files" ("md5"); CREATE INDEX "cc_files_name_idx" ON "cc_files" ("name"); +----------------------------------------------------------------------- +-- cloud_file +----------------------------------------------------------------------- + +DROP TABLE IF EXISTS "cloud_file" CASCADE; + +CREATE TABLE "cloud_file" +( + "id" serial NOT NULL, + "resource_id" TEXT NOT NULL, + "cc_file_id" INTEGER, + PRIMARY KEY ("id") +); + ----------------------------------------------------------------------- -- cc_perms ----------------------------------------------------------------------- @@ -679,6 +692,10 @@ ALTER TABLE "cc_files" ADD CONSTRAINT "cc_music_dirs_folder_fkey" FOREIGN KEY ("directory") REFERENCES "cc_music_dirs" ("id"); +ALTER TABLE "cloud_file" ADD CONSTRAINT "cloud_file_FK_1" + FOREIGN KEY ("cc_file_id") + REFERENCES "cc_files" ("id"); + ALTER TABLE "cc_perms" ADD CONSTRAINT "cc_perms_subj_fkey" FOREIGN KEY ("subj") REFERENCES "cc_subjs" ("id") From efb2a5ea7db5ac4c7d52bc7bcb126aba3bd91563 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 23 Jul 2014 15:34:00 -0400 Subject: [PATCH 184/310] CC-5895: Upgrade Propel to 1.7 Remove propel library from repo --- airtime_mvc/library/propel/CHANGELOG | 107 - airtime_mvc/library/propel/INSTALL | 4 - airtime_mvc/library/propel/LICENSE | 19 - airtime_mvc/library/propel/WHATS_NEW | 807 ---- .../propel/contrib/dbd2propel/dbd2propel.xsl | 381 -- .../propel/contrib/dbd2propel/transform.php | 21 - .../library/propel/contrib/pat/patForms.php | 2784 ----------- .../pat/patForms/Creator/Definition.php | 42 - .../contrib/pat/patForms/Creator/Propel.php | 132 - .../patForms/Creator/_propel_creator_test.php | 201 - .../pat/patForms/Datasource/Propel.php | 70 - .../contrib/pat/patForms/Definition.php | 122 - .../pat/patForms/Definition/Propel.php | 165 - .../propel/contrib/pat/patForms/Element.php | 1954 -------- .../propel/contrib/pat/patForms/Rule.php | 340 -- .../contrib/pat/patForms/Rule/Match.php | 163 - .../contrib/pat/patForms/Rule/MaxLength.php | 161 - .../contrib/pat/patForms/Rule/MaxValue.php | 163 - .../contrib/pat/patForms/Rule/MinLength.php | 161 - .../contrib/pat/patForms/Rule/MinValue.php | 165 - .../contrib/pat/patForms/Rule/NotMatch.php | 163 - .../contrib/pat/patForms/Rule/ValidValues.php | 182 - .../contrib/pat/patForms/Storage/Propel.php | 146 - .../contrib/pat/patForms/res/form.dynamic.tpl | 94 - .../pat/patForms/res/mysql-dump.bookstore.sql | 10 - .../pat/patForms_Storage_Propel_test.php | 97 - .../propel/contrib/pat/patTemplate.php | 2378 --------- .../pear/HTML_QuickForm_Propel/Propel.php | 909 ---- .../Structures_DataGrid_Propel/Propel.php | 352 -- .../propel/docs/behavior/aggregate_column.txt | 130 - .../behavior/alternative_coding_standards.txt | 89 - .../propel/docs/behavior/auto_add_pk.txt | 73 - .../propel/docs/behavior/nested_set.txt | 370 -- .../propel/docs/behavior/query_cache.txt | 103 - .../propel/docs/behavior/sluggable.txt | 135 - .../propel/docs/behavior/soft_delete.txt | 116 - .../library/propel/docs/behavior/sortable.txt | 285 -- .../propel/docs/behavior/timestampable.txt | 92 - airtime_mvc/library/propel/docs/build.xml | 34 - .../propel/docs/cookbook/Add-Custom-SQL.txt | 34 - .../propel/docs/cookbook/Copying-Objects.txt | 47 - .../docs/cookbook/Customizing-Build.txt | 153 - .../docs/cookbook/Existing-Database.txt | 95 - .../propel/docs/cookbook/LOB-Columns.txt | 73 - .../propel/docs/cookbook/Master-Slave.txt | 94 - .../propel/docs/cookbook/Multi-Component.txt | 297 -- .../propel/docs/cookbook/Namespaces.txt | 133 - .../propel/docs/cookbook/Nested-Set.txt | 183 - .../docs/cookbook/Runtime-Introspection.txt | 164 - .../propel/docs/cookbook/Writing-Behavior.txt | 424 -- .../propel/docs/guide/01-Installation.txt | 164 - .../propel/docs/guide/02-BuildTime.txt | 350 -- .../propel/docs/guide/03-Basic-CRUD.txt | 319 -- .../propel/docs/guide/04-Relationships.txt | 386 -- .../propel/docs/guide/05-Validators.txt | 253 - .../propel/docs/guide/06-Transactions.txt | 291 -- .../propel/docs/guide/07-Behaviors.txt | 280 -- .../library/propel/docs/guide/08-Logging.txt | 448 -- .../propel/docs/guide/09-Inheritance.txt | 329 -- .../reference/Buildtime-Configuration.txt | 312 -- .../propel/docs/reference/ModelCriteria.txt | 1025 ---- .../docs/reference/Runtime-Configuration.txt | 318 -- .../library/propel/docs/reference/Schema.txt | 398 -- .../library/propel/generator/bin/propel-gen | 70 - .../library/propel/generator/build-propel.xml | 513 -- .../propel/generator/build.properties-sample | 192 - .../library/propel/generator/build.xml | 184 - .../library/propel/generator/build.xml-local | 124 - .../propel/generator/default.properties | 267 -- .../AlternativeCodingStandardsBehavior.php | 133 - .../lib/behavior/AutoAddPkBehavior.php | 54 - .../lib/behavior/SoftDeleteBehavior.php | 467 -- .../lib/behavior/TimestampableBehavior.php | 171 - .../AggregateColumnBehavior.php | 122 - .../AggregateColumnRelationBehavior.php | 164 - .../templates/objectCompute.php | 17 - .../templates/objectUpdate.php | 11 - .../templates/objectUpdateRelated.php | 16 - .../templates/queryFindRelated.php | 20 - .../templates/queryUpdateRelated.php | 8 - .../ConcreteInheritanceBehavior.php | 235 - .../ConcreteInheritanceParentBehavior.php | 89 - .../behavior/nestedset/NestedSetBehavior.php | 99 - ...NestedSetBehaviorObjectBuilderModifier.php | 1540 ------ .../NestedSetBehaviorPeerBuilderModifier.php | 555 --- .../NestedSetBehaviorQueryBuilderModifier.php | 357 -- .../query_cache/QueryCacheBehavior.php | 262 - .../behavior/sluggable/SluggableBehavior.php | 332 -- .../behavior/sortable/SortableBehavior.php | 83 - .../SortableBehaviorObjectBuilderModifier.php | 636 --- .../SortableBehaviorPeerBuilderModifier.php | 367 -- .../SortableBehaviorQueryBuilderModifier.php | 283 -- .../lib/builder/DataModelBuilder.php | 607 --- .../generator/lib/builder/om/ClassTools.php | 120 - .../lib/builder/om/ExtensionQueryBuilder.php | 139 - .../om/ExtensionQueryInheritanceBuilder.php | 138 - .../generator/lib/builder/om/OMBuilder.php | 526 -- .../lib/builder/om/ObjectBuilder.php | 186 - .../builder/om/PHP5ExtensionNodeBuilder.php | 111 - .../om/PHP5ExtensionNodePeerBuilder.php | 112 - .../builder/om/PHP5ExtensionObjectBuilder.php | 133 - .../builder/om/PHP5ExtensionPeerBuilder.php | 136 - .../lib/builder/om/PHP5InterfaceBuilder.php | 108 - .../om/PHP5MultiExtendObjectBuilder.php | 196 - .../lib/builder/om/PHP5NestedSetBuilder.php | 1136 ----- .../builder/om/PHP5NestedSetPeerBuilder.php | 1727 ------- .../lib/builder/om/PHP5NodeBuilder.php | 1104 ----- .../lib/builder/om/PHP5NodePeerBuilder.php | 754 --- .../lib/builder/om/PHP5ObjectBuilder.php | 4250 ----------------- .../om/PHP5ObjectNoCollectionBuilder.php | 962 ---- .../lib/builder/om/PHP5PeerBuilder.php | 2761 ----------- .../lib/builder/om/PHP5TableMapBuilder.php | 354 -- .../generator/lib/builder/om/PeerBuilder.php | 305 -- .../generator/lib/builder/om/QueryBuilder.php | 1065 ----- .../builder/om/QueryInheritanceBuilder.php | 276 -- .../generator/lib/builder/sql/DDLBuilder.php | 166 - .../lib/builder/sql/DataSQLBuilder.php | 253 - .../lib/builder/sql/mssql/MssqlDDLBuilder.php | 173 - .../builder/sql/mssql/MssqlDataSQLBuilder.php | 37 - .../lib/builder/sql/mysql/MysqlDDLBuilder.php | 413 -- .../builder/sql/mysql/MysqlDataSQLBuilder.php | 22 - .../builder/sql/oracle/OracleDDLBuilder.php | 185 - .../sql/oracle/OracleDataSQLBuilder.php | 22 - .../lib/builder/sql/pgsql/PgsqlDDLBuilder.php | 304 -- .../builder/sql/pgsql/PgsqlDataSQLBuilder.php | 102 - .../builder/sql/sqlite/SqliteDDLBuilder.php | 119 - .../sql/sqlite/SqliteDataSQLBuilder.php | 36 - .../builder/util/DefaultEnglishPluralizer.php | 33 - .../generator/lib/builder/util/Pluralizer.php | 28 - .../lib/builder/util/PropelStringReader.php | 91 - .../lib/builder/util/PropelTemplate.php | 92 - .../lib/builder/util/XmlToAppData.php | 417 -- .../lib/builder/util/XmlToDataSQL.php | 265 - .../generator/lib/config/GeneratorConfig.php | 217 - .../lib/exception/EngineException.php | 22 - .../propel/generator/lib/model/AppData.php | 222 - .../propel/generator/lib/model/Behavior.php | 247 - .../propel/generator/lib/model/Column.php | 1188 ----- .../lib/model/ColumnDefaultValue.php | 91 - .../lib/model/ConstraintNameGenerator.php | 72 - .../propel/generator/lib/model/Database.php | 676 --- .../propel/generator/lib/model/Domain.php | 386 -- .../propel/generator/lib/model/ForeignKey.php | 509 -- .../propel/generator/lib/model/IDMethod.php | 35 - .../generator/lib/model/IdMethodParameter.php | 108 - .../propel/generator/lib/model/Index.php | 285 -- .../generator/lib/model/Inheritance.php | 147 - .../generator/lib/model/NameFactory.php | 77 - .../generator/lib/model/NameGenerator.php | 73 - .../generator/lib/model/PhpNameGenerator.php | 167 - .../generator/lib/model/PropelTypes.php | 343 -- .../propel/generator/lib/model/Rule.php | 194 - .../propel/generator/lib/model/Table.php | 1579 ------ .../propel/generator/lib/model/Unique.php | 58 - .../propel/generator/lib/model/Validator.php | 184 - .../propel/generator/lib/model/VendorInfo.php | 172 - .../propel/generator/lib/model/XMLElement.php | 182 - .../lib/platform/DefaultPlatform.php | 299 -- .../generator/lib/platform/MssqlPlatform.php | 107 - .../generator/lib/platform/MysqlPlatform.php | 110 - .../generator/lib/platform/OraclePlatform.php | 113 - .../generator/lib/platform/PgsqlPlatform.php | 118 - .../generator/lib/platform/Platform.php | 182 - .../generator/lib/platform/SqlitePlatform.php | 87 - .../lib/reverse/BaseSchemaParser.php | 188 - .../generator/lib/reverse/SchemaParser.php | 63 - .../lib/reverse/mssql/MssqlSchemaParser.php | 240 - .../lib/reverse/mysql/MysqlSchemaParser.php | 340 -- .../lib/reverse/oracle/OracleSchemaParser.php | 249 - .../lib/reverse/pgsql/PgsqlSchemaParser.php | 548 --- .../lib/reverse/sqlite/SqliteSchemaParser.php | 195 - .../lib/task/AbstractPropelDataModelTask.php | 593 --- .../lib/task/PropelConvertConfTask.php | 344 -- .../generator/lib/task/PropelDataDTDTask.php | 68 - .../generator/lib/task/PropelDataDumpTask.php | 354 -- .../lib/task/PropelDataModelTemplateTask.php | 217 - .../generator/lib/task/PropelDataSQLTask.php | 193 - .../generator/lib/task/PropelGraphvizTask.php | 170 - .../generator/lib/task/PropelOMTask.php | 231 - .../generator/lib/task/PropelSQLExec.php | 701 --- .../generator/lib/task/PropelSQLTask.php | 250 - .../lib/task/PropelSchemaReverseTask.php | 548 --- .../pear/BuildPropelGenPEARPackageTask.php | 258 - .../generator/pear/build-pear-package.xml | 160 - .../propel/generator/pear/build.properties | 5 - .../propel/generator/pear/pear-build.xml | 121 - .../propel/generator/pear/pear-propel-gen | 24 - .../propel/generator/pear/pear-propel-gen.bat | 30 - .../generator/resources/dtd/database.dtd | 180 - .../resources/xsd/custom_datatypes.xsd | 8 - .../generator/resources/xsd/database.xsd | 862 ---- .../generator/resources/xsl/database.xsl | 292 -- .../library/propel/runtime/lib/Propel.php | 916 ---- .../propel/runtime/lib/adapter/DBAdapter.php | 297 -- .../propel/runtime/lib/adapter/DBMSSQL.php | 215 - .../propel/runtime/lib/adapter/DBMySQL.php | 145 - .../propel/runtime/lib/adapter/DBNone.php | 104 - .../propel/runtime/lib/adapter/DBOracle.php | 150 - .../propel/runtime/lib/adapter/DBPostgres.php | 141 - .../propel/runtime/lib/adapter/DBSQLite.php | 116 - .../lib/adapter/MSSQL/MssqlDateTime.class.php | 35 - .../lib/adapter/MSSQL/MssqlDebugPDO.php | 19 - .../lib/adapter/MSSQL/MssqlPropelPDO.php | 132 - .../lib/collection/PropelArrayCollection.php | 188 - .../lib/collection/PropelCollection.php | 409 -- .../lib/collection/PropelObjectCollection.php | 249 - .../collection/PropelOnDemandCollection.php | 151 - .../lib/collection/PropelOnDemandIterator.php | 118 - .../lib/config/PropelConfiguration.php | 159 - .../config/PropelConfigurationIterator.php | 103 - .../runtime/lib/connection/DebugPDO.php | 111 - .../lib/connection/DebugPDOStatement.php | 122 - .../runtime/lib/connection/PropelPDO.php | 716 --- .../runtime/lib/exception/PropelException.php | 50 - .../runtime/lib/formatter/ModelWith.php | 144 - .../lib/formatter/PropelArrayFormatter.php | 170 - .../runtime/lib/formatter/PropelFormatter.php | 202 - .../lib/formatter/PropelObjectFormatter.php | 112 - .../lib/formatter/PropelOnDemandFormatter.php | 96 - .../formatter/PropelStatementFormatter.php | 45 - .../propel/runtime/lib/logger/BasicLogger.php | 91 - .../runtime/lib/logger/MojaviLogAdapter.php | 160 - .../propel/runtime/lib/map/ColumnMap.php | 464 -- .../propel/runtime/lib/map/DatabaseMap.php | 191 - .../propel/runtime/lib/map/RelationMap.php | 299 -- .../propel/runtime/lib/map/TableMap.php | 712 --- .../propel/runtime/lib/map/ValidatorMap.php | 92 - .../propel/runtime/lib/om/BaseObject.php | 319 -- .../lib/om/NestedSetRecursiveIterator.php | 86 - .../propel/runtime/lib/om/NodeObject.php | 324 -- .../propel/runtime/lib/om/Persistent.php | 108 - .../runtime/lib/om/PreOrderNodeIterator.php | 78 - .../propel/runtime/lib/query/Criteria.php | 1561 ------ .../propel/runtime/lib/query/Criterion.php | 543 --- .../runtime/lib/query/CriterionIterator.php | 54 - .../library/propel/runtime/lib/query/Join.php | 250 - .../runtime/lib/query/ModelCriteria.php | 1841 ------- .../runtime/lib/query/ModelCriterion.php | 283 -- .../propel/runtime/lib/query/ModelJoin.php | 166 - .../propel/runtime/lib/query/PropelQuery.php | 33 - .../propel/runtime/lib/util/BasePeer.php | 1099 ----- .../propel/runtime/lib/util/NodePeer.php | 369 -- .../runtime/lib/util/PropelAutoloader.php | 113 - .../runtime/lib/util/PropelColumnTypes.php | 88 - .../lib/util/PropelConditionalProxy.php | 71 - .../runtime/lib/util/PropelDateTime.php | 76 - .../runtime/lib/util/PropelModelPager.php | 349 -- .../propel/runtime/lib/util/PropelPager.php | 597 --- .../runtime/lib/validator/BasicValidator.php | 35 - .../runtime/lib/validator/MatchValidator.php | 68 - .../lib/validator/MaxLengthValidator.php | 39 - .../lib/validator/MaxValueValidator.php | 43 - .../lib/validator/MinLengthValidator.php | 36 - .../lib/validator/MinValueValidator.php | 43 - .../lib/validator/NotMatchValidator.php | 66 - .../lib/validator/RequiredValidator.php | 38 - .../runtime/lib/validator/TypeValidator.php | 68 - .../runtime/lib/validator/UniqueValidator.php | 48 - .../lib/validator/ValidValuesValidator.php | 33 - .../lib/validator/ValidationFailed.php | 115 - .../pear/BuildPropelPEARPackageTask.php | 205 - .../runtime/pear/build-pear-package.xml | 121 - airtime_mvc/library/propel/test/README | 139 - .../propel/test/bookstore-packaged-test.php | 811 ---- .../library/propel/test/etc/lob/propel.gif | Bin 2671 -> 0 bytes .../library/propel/test/etc/lob/tin_drum.gif | Bin 8202 -> 0 bytes .../library/propel/test/etc/lob/tin_drum.txt | 76 - .../test/etc/schema/tabletest-schema.xml | 25 - .../propel/test/etc/xsl/coverage-frames.xsl | 636 --- .../library/propel/test/etc/xsl/log.xsl | 216 - .../propel/test/etc/xsl/phpunit2-noframes.xsl | 445 -- .../test/etc/xsl/str.replace.function.xsl | 105 - .../bookstore-packaged/book.schema.xml | 62 - .../book_club_list.schema.xml | 42 - .../bookstore-packaged/build.properties | 19 - .../external/author.schema.xml | 53 - .../bookstore-packaged/log.schema.xml | 31 - .../bookstore-packaged/media.schema.xml | 31 - .../bookstore-packaged/publisher.schema.xml | 17 - .../bookstore-packaged/review.schema.xml | 53 - .../bookstore-packaged/runtime-conf.xml | 66 - .../bookstore/behavior-aggregate-schema.xml | 39 - .../bookstore/behavior-auto-add-pk-schema.xml | 28 - .../behavior-concrete-inheritance-schema.xml | 69 - .../bookstore/behavior-nested-set-schema.xml | 27 - .../fixtures/bookstore/behavior-schema.xml | 15 - .../bookstore/behavior-sluggable-schema.xml | 23 - .../bookstore/behavior-soft-delete-schema.xml | 19 - .../bookstore/behavior-sortable-schema.xml | 21 - .../behavior-timestampable-schema.xml | 21 - .../test/fixtures/bookstore/build.properties | 35 - .../test/fixtures/bookstore/cms-schema.xml | 19 - .../test/fixtures/bookstore/runtime-conf.xml | 125 - .../propel/test/fixtures/bookstore/schema.xml | 320 -- .../test/fixtures/namespaced/build.properties | 31 - .../test/fixtures/namespaced/runtime-conf.xml | 81 - .../test/fixtures/namespaced/schema.xml | 87 - .../test/fixtures/nestedset/build.properties | 35 - .../fixtures/nestedset/nestedset-schema.xml | 39 - .../test/fixtures/nestedset/runtime-conf.xml | 53 - .../test/fixtures/treetest/build.properties | 26 - .../test/fixtures/treetest/runtime-conf.xml | 53 - .../fixtures/treetest/treetest-schema.xml | 28 - .../fixtures/unique-column/column-schema.xml | 9 - .../fixtures/unique-column/table-schema.xml | 13 - airtime_mvc/library/propel/test/speed.php | 401 -- airtime_mvc/library/propel/test/test.xml | 86 - .../behavior/AutoAddPkBehaviorTest.php | 70 - .../generator/behavior/ObjectBehaviorTest.php | 152 - .../generator/behavior/PeerBehaviorTest.php | 61 - .../behavior/SoftDeleteBehaviorTest.php | 360 -- .../generator/behavior/TableBehaviorTest.php | 34 - .../behavior/TimestampableBehaviorTest.php | 215 - .../AggregateColumnBehaviorTest.php | 254 - .../ConcreteInheritanceBehaviorTest.php | 202 - .../ConcreteInheritanceParentBehaviorTest.php | 53 - ...edSetBehaviorObjectBuilderModifierTest.php | 1351 ------ ...viorObjectBuilderModifierWithScopeTest.php | 551 --- ...stedSetBehaviorPeerBuilderModifierTest.php | 350 -- ...haviorPeerBuilderModifierWithScopeTest.php | 253 - ...tedSetBehaviorQueryBuilderModifierTest.php | 283 -- ...aviorQueryBuilderModifierWithScopeTest.php | 285 -- .../nestedset/NestedSetBehaviorTest.php | 48 - .../sluggable/SluggableBehaviorTest.php | 299 -- ...tableBehaviorObjectBuilderModifierTest.php | 279 -- ...viorObjectBuilderModifierWithScopeTest.php | 335 -- ...ortableBehaviorPeerBuilderModifierTest.php | 83 - ...haviorPeerBuilderModifierWithScopeTest.php | 114 - ...rtableBehaviorQueryBuilderModifierTest.php | 115 - ...aviorQueryBuilderModifierWithScopeTest.php | 142 - .../sortable/SortableBehaviorTest.php | 33 - .../generator/builder/NamespaceTest.php | 225 - .../om/GeneratedNestedSetObjectTest.php | 187 - .../builder/om/GeneratedNestedSetPeerTest.php | 188 - .../builder/om/GeneratedNestedSetTest.php | 120 - .../builder/om/GeneratedObjectLobTest.php | 289 -- .../builder/om/GeneratedObjectRelTest.php | 352 -- .../builder/om/GeneratedObjectTest.php | 1355 ------ .../builder/om/GeneratedPeerDoDeleteTest.php | 545 --- .../builder/om/GeneratedPeerDoSelectTest.php | 439 -- .../builder/om/GeneratedPeerTest.php | 90 - .../builder/om/OMBuilderNamespaceTest.php | 149 - .../generator/builder/om/OMBuilderTest.php | 89 - .../builder/om/PHP5TableMapBuilderTest.php | 149 - .../om/QueryBuilderInheritanceTest.php | 95 - .../generator/builder/om/QueryBuilderTest.php | 912 ---- .../builder/util/PropelTemplateTest.php | 54 - .../generator/builder/util/template.php | 1 - .../generator/model/BehaviorTest.php | 113 - .../testsuite/generator/model/ColumnTest.php | 81 - .../generator/model/NameFactoryTest.php | 151 - .../generator/model/PhpNameGeneratorTest.php | 55 - .../testsuite/generator/model/TableTest.php | 109 - .../platform/DefaultPlatformTest.php | 45 - .../generator/platform/PlatformTestBase.php | 55 - .../generator/platform/SqlitePlatformTest.php | 48 - .../test/testsuite/misc/BookstoreTest.php | 870 ---- .../testsuite/misc/CharacterEncodingTest.php | 112 - .../testsuite/misc/FieldnameRelatedTest.php | 396 -- .../test/testsuite/misc/Ticket520Test.php | 250 - .../runtime/adapter/DBOracleTest.php | 47 - .../collection/PropelArrayCollectionTest.php | 152 - .../collection/PropelCollectionTest.php | 353 -- .../collection/PropelObjectCollectionTest.php | 236 - .../PropelOnDemandCollectionTest.php | 76 - .../collection/PropelOnDemandIteratorTest.php | 59 - .../runtime/connection/PropelPDOTest.php | 425 -- .../formatter/PropelArrayFormatterTest.php | 129 - .../PropelArrayFormatterWithTest.php | 383 -- .../PropelObjectFormatterInheritanceTest.php | 55 - .../formatter/PropelObjectFormatterTest.php | 125 - .../PropelObjectFormatterWithTest.php | 406 -- .../formatter/PropelOnDemandFormatterTest.php | 151 - .../PropelOnDemandFormatterWithTest.php | 277 -- .../PropelStatementFormatterTest.php | 124 - .../testsuite/runtime/map/ColumnMapTest.php | 141 - .../testsuite/runtime/map/DatabaseMapTest.php | 171 - .../runtime/map/GeneratedRelationMapTest.php | 75 - .../runtime/map/RelatedMapSymmetricalTest.php | 70 - .../testsuite/runtime/map/RelationMapTest.php | 89 - .../testsuite/runtime/map/TableMapTest.php | 286 -- .../runtime/om/BaseObjectSerializeTest.php | 95 - .../testsuite/runtime/om/BaseObjectTest.php | 69 - .../runtime/query/CriteriaCombineTest.php | 385 -- .../query/CriteriaFluidConditionTest.php | 181 - .../runtime/query/CriteriaMergeTest.php | 399 -- .../testsuite/runtime/query/CriteriaTest.php | 974 ---- .../test/testsuite/runtime/query/JoinTest.php | 135 - .../runtime/query/ModelCriteriaHooksTest.php | 196 - .../runtime/query/ModelCriteriaTest.php | 2068 -------- .../testsuite/runtime/query/ModelJoinTest.php | 85 - .../testsuite/runtime/query/ModelWithTest.php | 183 - .../runtime/query/PropelQueryTest.php | 63 - .../runtime/util/BasePeerExceptionsTest.php | 94 - .../testsuite/runtime/util/BasePeerTest.php | 413 -- .../runtime/util/PropelConfigurationTest.php | 69 - .../runtime/util/PropelDateTimeTest.php | 139 - .../runtime/util/PropelModelPagerTest.php | 149 - .../runtime/util/PropelPagerTest.php | 162 - .../runtime/validator/ValidatorTest.php | 228 - .../test/tools/helpers/BaseTestCase.php | 30 - .../bookstore/BookstoreDataPopulator.php | 247 - .../bookstore/BookstoreEmptyTestBase.php | 38 - .../helpers/bookstore/BookstoreTestBase.php | 47 - .../behavior/BookstoreNestedSetTestBase.php | 146 - .../behavior/BookstoreSortableTestBase.php | 104 - .../bookstore/behavior/DonothingBehavior.php | 13 - .../helpers/bookstore/behavior/TestAuthor.php | 83 - .../behavior/Testallhooksbehavior.php | 183 - .../bookstore/validator/ISBNValidator.php | 29 - .../tools/helpers/cms/CmsDataPopulator.php | 143 - .../test/tools/helpers/cms/CmsTestBase.php | 45 - .../propel/test/tools/phing/DefineTask.php | 58 - airtime_mvc/library/propel/test/tree-test.php | 426 -- 414 files changed, 109582 deletions(-) delete mode 100644 airtime_mvc/library/propel/CHANGELOG delete mode 100644 airtime_mvc/library/propel/INSTALL delete mode 100644 airtime_mvc/library/propel/LICENSE delete mode 100644 airtime_mvc/library/propel/WHATS_NEW delete mode 100644 airtime_mvc/library/propel/contrib/dbd2propel/dbd2propel.xsl delete mode 100644 airtime_mvc/library/propel/contrib/dbd2propel/transform.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Creator/Definition.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Creator/Propel.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Creator/_propel_creator_test.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Datasource/Propel.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Definition.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Definition/Propel.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Element.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Rule.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Rule/Match.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Rule/MaxLength.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Rule/MaxValue.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Rule/MinLength.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Rule/MinValue.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Rule/NotMatch.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Rule/ValidValues.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/Storage/Propel.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/res/form.dynamic.tpl delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms/res/mysql-dump.bookstore.sql delete mode 100644 airtime_mvc/library/propel/contrib/pat/patForms_Storage_Propel_test.php delete mode 100644 airtime_mvc/library/propel/contrib/pat/patTemplate.php delete mode 100644 airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php delete mode 100644 airtime_mvc/library/propel/contrib/pear/Structures_DataGrid_Propel/Propel.php delete mode 100644 airtime_mvc/library/propel/docs/behavior/aggregate_column.txt delete mode 100644 airtime_mvc/library/propel/docs/behavior/alternative_coding_standards.txt delete mode 100644 airtime_mvc/library/propel/docs/behavior/auto_add_pk.txt delete mode 100644 airtime_mvc/library/propel/docs/behavior/nested_set.txt delete mode 100644 airtime_mvc/library/propel/docs/behavior/query_cache.txt delete mode 100644 airtime_mvc/library/propel/docs/behavior/sluggable.txt delete mode 100644 airtime_mvc/library/propel/docs/behavior/soft_delete.txt delete mode 100644 airtime_mvc/library/propel/docs/behavior/sortable.txt delete mode 100644 airtime_mvc/library/propel/docs/behavior/timestampable.txt delete mode 100644 airtime_mvc/library/propel/docs/build.xml delete mode 100644 airtime_mvc/library/propel/docs/cookbook/Add-Custom-SQL.txt delete mode 100644 airtime_mvc/library/propel/docs/cookbook/Copying-Objects.txt delete mode 100644 airtime_mvc/library/propel/docs/cookbook/Customizing-Build.txt delete mode 100644 airtime_mvc/library/propel/docs/cookbook/Existing-Database.txt delete mode 100644 airtime_mvc/library/propel/docs/cookbook/LOB-Columns.txt delete mode 100644 airtime_mvc/library/propel/docs/cookbook/Master-Slave.txt delete mode 100644 airtime_mvc/library/propel/docs/cookbook/Multi-Component.txt delete mode 100644 airtime_mvc/library/propel/docs/cookbook/Namespaces.txt delete mode 100644 airtime_mvc/library/propel/docs/cookbook/Nested-Set.txt delete mode 100644 airtime_mvc/library/propel/docs/cookbook/Runtime-Introspection.txt delete mode 100644 airtime_mvc/library/propel/docs/cookbook/Writing-Behavior.txt delete mode 100644 airtime_mvc/library/propel/docs/guide/01-Installation.txt delete mode 100644 airtime_mvc/library/propel/docs/guide/02-BuildTime.txt delete mode 100644 airtime_mvc/library/propel/docs/guide/03-Basic-CRUD.txt delete mode 100644 airtime_mvc/library/propel/docs/guide/04-Relationships.txt delete mode 100644 airtime_mvc/library/propel/docs/guide/05-Validators.txt delete mode 100644 airtime_mvc/library/propel/docs/guide/06-Transactions.txt delete mode 100644 airtime_mvc/library/propel/docs/guide/07-Behaviors.txt delete mode 100644 airtime_mvc/library/propel/docs/guide/08-Logging.txt delete mode 100644 airtime_mvc/library/propel/docs/guide/09-Inheritance.txt delete mode 100644 airtime_mvc/library/propel/docs/reference/Buildtime-Configuration.txt delete mode 100644 airtime_mvc/library/propel/docs/reference/ModelCriteria.txt delete mode 100644 airtime_mvc/library/propel/docs/reference/Runtime-Configuration.txt delete mode 100644 airtime_mvc/library/propel/docs/reference/Schema.txt delete mode 100755 airtime_mvc/library/propel/generator/bin/propel-gen delete mode 100644 airtime_mvc/library/propel/generator/build-propel.xml delete mode 100644 airtime_mvc/library/propel/generator/build.properties-sample delete mode 100644 airtime_mvc/library/propel/generator/build.xml delete mode 100644 airtime_mvc/library/propel/generator/build.xml-local delete mode 100644 airtime_mvc/library/propel/generator/default.properties delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/AlternativeCodingStandardsBehavior.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/AutoAddPkBehavior.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/SoftDeleteBehavior.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/TimestampableBehavior.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/AggregateColumnBehavior.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/AggregateColumnRelationBehavior.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/objectCompute.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/objectUpdate.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/objectUpdateRelated.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/queryFindRelated.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/queryUpdateRelated.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/concrete_inheritance/ConcreteInheritanceBehavior.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/concrete_inheritance/ConcreteInheritanceParentBehavior.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehavior.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehaviorObjectBuilderModifier.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehaviorPeerBuilderModifier.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehaviorQueryBuilderModifier.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/query_cache/QueryCacheBehavior.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/sluggable/SluggableBehavior.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehavior.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehaviorObjectBuilderModifier.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehaviorPeerBuilderModifier.php delete mode 100644 airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehaviorQueryBuilderModifier.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/DataModelBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/ClassTools.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/ExtensionQueryBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/ExtensionQueryInheritanceBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/OMBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/ObjectBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionNodeBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionNodePeerBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionObjectBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionPeerBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5InterfaceBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5MultiExtendObjectBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5NestedSetBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5NestedSetPeerBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5NodeBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5NodePeerBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5ObjectBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5ObjectNoCollectionBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5PeerBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PHP5TableMapBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/PeerBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/QueryBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/om/QueryInheritanceBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/sql/DDLBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/sql/DataSQLBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/sql/mssql/MssqlDDLBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/sql/mssql/MssqlDataSQLBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/sql/mysql/MysqlDDLBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/sql/mysql/MysqlDataSQLBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/sql/oracle/OracleDDLBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/sql/oracle/OracleDataSQLBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/sql/pgsql/PgsqlDDLBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/sql/pgsql/PgsqlDataSQLBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/sql/sqlite/SqliteDDLBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/sql/sqlite/SqliteDataSQLBuilder.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/util/DefaultEnglishPluralizer.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/util/Pluralizer.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/util/PropelStringReader.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/util/PropelTemplate.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/util/XmlToAppData.php delete mode 100644 airtime_mvc/library/propel/generator/lib/builder/util/XmlToDataSQL.php delete mode 100644 airtime_mvc/library/propel/generator/lib/config/GeneratorConfig.php delete mode 100644 airtime_mvc/library/propel/generator/lib/exception/EngineException.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/AppData.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/Behavior.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/Column.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/ColumnDefaultValue.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/ConstraintNameGenerator.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/Database.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/Domain.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/ForeignKey.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/IDMethod.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/IdMethodParameter.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/Index.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/Inheritance.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/NameFactory.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/NameGenerator.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/PhpNameGenerator.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/PropelTypes.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/Rule.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/Table.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/Unique.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/Validator.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/VendorInfo.php delete mode 100644 airtime_mvc/library/propel/generator/lib/model/XMLElement.php delete mode 100644 airtime_mvc/library/propel/generator/lib/platform/DefaultPlatform.php delete mode 100644 airtime_mvc/library/propel/generator/lib/platform/MssqlPlatform.php delete mode 100644 airtime_mvc/library/propel/generator/lib/platform/MysqlPlatform.php delete mode 100644 airtime_mvc/library/propel/generator/lib/platform/OraclePlatform.php delete mode 100644 airtime_mvc/library/propel/generator/lib/platform/PgsqlPlatform.php delete mode 100644 airtime_mvc/library/propel/generator/lib/platform/Platform.php delete mode 100644 airtime_mvc/library/propel/generator/lib/platform/SqlitePlatform.php delete mode 100644 airtime_mvc/library/propel/generator/lib/reverse/BaseSchemaParser.php delete mode 100644 airtime_mvc/library/propel/generator/lib/reverse/SchemaParser.php delete mode 100644 airtime_mvc/library/propel/generator/lib/reverse/mssql/MssqlSchemaParser.php delete mode 100644 airtime_mvc/library/propel/generator/lib/reverse/mysql/MysqlSchemaParser.php delete mode 100644 airtime_mvc/library/propel/generator/lib/reverse/oracle/OracleSchemaParser.php delete mode 100644 airtime_mvc/library/propel/generator/lib/reverse/pgsql/PgsqlSchemaParser.php delete mode 100644 airtime_mvc/library/propel/generator/lib/reverse/sqlite/SqliteSchemaParser.php delete mode 100644 airtime_mvc/library/propel/generator/lib/task/AbstractPropelDataModelTask.php delete mode 100644 airtime_mvc/library/propel/generator/lib/task/PropelConvertConfTask.php delete mode 100644 airtime_mvc/library/propel/generator/lib/task/PropelDataDTDTask.php delete mode 100644 airtime_mvc/library/propel/generator/lib/task/PropelDataDumpTask.php delete mode 100644 airtime_mvc/library/propel/generator/lib/task/PropelDataModelTemplateTask.php delete mode 100644 airtime_mvc/library/propel/generator/lib/task/PropelDataSQLTask.php delete mode 100644 airtime_mvc/library/propel/generator/lib/task/PropelGraphvizTask.php delete mode 100644 airtime_mvc/library/propel/generator/lib/task/PropelOMTask.php delete mode 100644 airtime_mvc/library/propel/generator/lib/task/PropelSQLExec.php delete mode 100644 airtime_mvc/library/propel/generator/lib/task/PropelSQLTask.php delete mode 100644 airtime_mvc/library/propel/generator/lib/task/PropelSchemaReverseTask.php delete mode 100644 airtime_mvc/library/propel/generator/pear/BuildPropelGenPEARPackageTask.php delete mode 100644 airtime_mvc/library/propel/generator/pear/build-pear-package.xml delete mode 100644 airtime_mvc/library/propel/generator/pear/build.properties delete mode 100644 airtime_mvc/library/propel/generator/pear/pear-build.xml delete mode 100755 airtime_mvc/library/propel/generator/pear/pear-propel-gen delete mode 100644 airtime_mvc/library/propel/generator/pear/pear-propel-gen.bat delete mode 100644 airtime_mvc/library/propel/generator/resources/dtd/database.dtd delete mode 100644 airtime_mvc/library/propel/generator/resources/xsd/custom_datatypes.xsd delete mode 100644 airtime_mvc/library/propel/generator/resources/xsd/database.xsd delete mode 100644 airtime_mvc/library/propel/generator/resources/xsl/database.xsl delete mode 100644 airtime_mvc/library/propel/runtime/lib/Propel.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/adapter/DBAdapter.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/adapter/DBMSSQL.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/adapter/DBMySQL.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/adapter/DBNone.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/adapter/DBOracle.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/adapter/DBPostgres.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/adapter/DBSQLite.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/adapter/MSSQL/MssqlDateTime.class.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/adapter/MSSQL/MssqlDebugPDO.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/adapter/MSSQL/MssqlPropelPDO.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/collection/PropelArrayCollection.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/collection/PropelCollection.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/collection/PropelObjectCollection.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/collection/PropelOnDemandCollection.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/collection/PropelOnDemandIterator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/config/PropelConfiguration.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/config/PropelConfigurationIterator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/connection/DebugPDO.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/connection/DebugPDOStatement.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/connection/PropelPDO.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/exception/PropelException.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/formatter/ModelWith.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/formatter/PropelArrayFormatter.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/formatter/PropelFormatter.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/formatter/PropelObjectFormatter.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/formatter/PropelOnDemandFormatter.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/formatter/PropelStatementFormatter.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/logger/BasicLogger.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/logger/MojaviLogAdapter.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/map/ColumnMap.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/map/DatabaseMap.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/map/RelationMap.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/map/TableMap.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/map/ValidatorMap.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/om/BaseObject.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/om/NestedSetRecursiveIterator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/om/NodeObject.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/om/Persistent.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/om/PreOrderNodeIterator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/query/Criteria.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/query/Criterion.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/query/CriterionIterator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/query/Join.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/query/ModelCriteria.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/query/ModelCriterion.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/query/ModelJoin.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/query/PropelQuery.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/util/BasePeer.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/util/NodePeer.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/util/PropelAutoloader.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/util/PropelColumnTypes.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/util/PropelConditionalProxy.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/util/PropelDateTime.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/util/PropelModelPager.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/util/PropelPager.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/validator/BasicValidator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/validator/MatchValidator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/validator/MaxLengthValidator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/validator/MaxValueValidator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/validator/MinLengthValidator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/validator/MinValueValidator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/validator/NotMatchValidator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/validator/RequiredValidator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/validator/TypeValidator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/validator/UniqueValidator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/validator/ValidValuesValidator.php delete mode 100644 airtime_mvc/library/propel/runtime/lib/validator/ValidationFailed.php delete mode 100644 airtime_mvc/library/propel/runtime/pear/BuildPropelPEARPackageTask.php delete mode 100644 airtime_mvc/library/propel/runtime/pear/build-pear-package.xml delete mode 100644 airtime_mvc/library/propel/test/README delete mode 100644 airtime_mvc/library/propel/test/bookstore-packaged-test.php delete mode 100644 airtime_mvc/library/propel/test/etc/lob/propel.gif delete mode 100644 airtime_mvc/library/propel/test/etc/lob/tin_drum.gif delete mode 100644 airtime_mvc/library/propel/test/etc/lob/tin_drum.txt delete mode 100644 airtime_mvc/library/propel/test/etc/schema/tabletest-schema.xml delete mode 100644 airtime_mvc/library/propel/test/etc/xsl/coverage-frames.xsl delete mode 100644 airtime_mvc/library/propel/test/etc/xsl/log.xsl delete mode 100644 airtime_mvc/library/propel/test/etc/xsl/phpunit2-noframes.xsl delete mode 100644 airtime_mvc/library/propel/test/etc/xsl/str.replace.function.xsl delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore-packaged/book.schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore-packaged/book_club_list.schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore-packaged/build.properties delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore-packaged/external/author.schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore-packaged/log.schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore-packaged/media.schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore-packaged/publisher.schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore-packaged/review.schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore-packaged/runtime-conf.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore/behavior-aggregate-schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore/behavior-auto-add-pk-schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore/behavior-concrete-inheritance-schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore/behavior-nested-set-schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore/behavior-schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore/behavior-sluggable-schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore/behavior-soft-delete-schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore/behavior-sortable-schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore/behavior-timestampable-schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore/build.properties delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore/cms-schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore/runtime-conf.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/bookstore/schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/namespaced/build.properties delete mode 100644 airtime_mvc/library/propel/test/fixtures/namespaced/runtime-conf.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/namespaced/schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/nestedset/build.properties delete mode 100644 airtime_mvc/library/propel/test/fixtures/nestedset/nestedset-schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/nestedset/runtime-conf.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/treetest/build.properties delete mode 100644 airtime_mvc/library/propel/test/fixtures/treetest/runtime-conf.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/treetest/treetest-schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/unique-column/column-schema.xml delete mode 100644 airtime_mvc/library/propel/test/fixtures/unique-column/table-schema.xml delete mode 100644 airtime_mvc/library/propel/test/speed.php delete mode 100644 airtime_mvc/library/propel/test/test.xml delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/AutoAddPkBehaviorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/ObjectBehaviorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/PeerBehaviorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/SoftDeleteBehaviorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/TableBehaviorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/TimestampableBehaviorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/aggregate_column/AggregateColumnBehaviorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/concrete_inheritance/ConcreteInheritanceBehaviorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/concrete_inheritance/ConcreteInheritanceParentBehaviorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorObjectBuilderModifierTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorObjectBuilderModifierWithScopeTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorPeerBuilderModifierTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorPeerBuilderModifierWithScopeTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorQueryBuilderModifierTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorQueryBuilderModifierWithScopeTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/sluggable/SluggableBehaviorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorObjectBuilderModifierTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorObjectBuilderModifierWithScopeTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorPeerBuilderModifierTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorPeerBuilderModifierWithScopeTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorQueryBuilderModifierTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorQueryBuilderModifierWithScopeTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/NamespaceTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedNestedSetObjectTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedNestedSetPeerTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedNestedSetTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedObjectLobTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedObjectRelTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedObjectTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedPeerDoDeleteTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedPeerDoSelectTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedPeerTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/OMBuilderNamespaceTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/OMBuilderTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/PHP5TableMapBuilderTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/QueryBuilderInheritanceTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/om/QueryBuilderTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/util/PropelTemplateTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/builder/util/template.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/model/BehaviorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/model/ColumnTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/model/NameFactoryTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/model/PhpNameGeneratorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/model/TableTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/platform/DefaultPlatformTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/platform/PlatformTestBase.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/generator/platform/SqlitePlatformTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/misc/BookstoreTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/misc/CharacterEncodingTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/misc/FieldnameRelatedTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/misc/Ticket520Test.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/adapter/DBOracleTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelArrayCollectionTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelCollectionTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelObjectCollectionTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelOnDemandCollectionTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelOnDemandIteratorTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/connection/PropelPDOTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelArrayFormatterTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelArrayFormatterWithTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelObjectFormatterInheritanceTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelObjectFormatterTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelObjectFormatterWithTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelOnDemandFormatterTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelOnDemandFormatterWithTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelStatementFormatterTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/map/ColumnMapTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/map/DatabaseMapTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/map/GeneratedRelationMapTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/map/RelatedMapSymmetricalTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/map/RelationMapTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/map/TableMapTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/om/BaseObjectSerializeTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/om/BaseObjectTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaCombineTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaFluidConditionTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaMergeTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/query/JoinTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/query/ModelCriteriaHooksTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/query/ModelCriteriaTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/query/ModelJoinTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/query/ModelWithTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/query/PropelQueryTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/util/BasePeerExceptionsTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/util/BasePeerTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/util/PropelConfigurationTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/util/PropelDateTimeTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/util/PropelModelPagerTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/util/PropelPagerTest.php delete mode 100644 airtime_mvc/library/propel/test/testsuite/runtime/validator/ValidatorTest.php delete mode 100644 airtime_mvc/library/propel/test/tools/helpers/BaseTestCase.php delete mode 100644 airtime_mvc/library/propel/test/tools/helpers/bookstore/BookstoreDataPopulator.php delete mode 100644 airtime_mvc/library/propel/test/tools/helpers/bookstore/BookstoreEmptyTestBase.php delete mode 100644 airtime_mvc/library/propel/test/tools/helpers/bookstore/BookstoreTestBase.php delete mode 100644 airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/BookstoreNestedSetTestBase.php delete mode 100644 airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/BookstoreSortableTestBase.php delete mode 100644 airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/DonothingBehavior.php delete mode 100644 airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/TestAuthor.php delete mode 100644 airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/Testallhooksbehavior.php delete mode 100644 airtime_mvc/library/propel/test/tools/helpers/bookstore/validator/ISBNValidator.php delete mode 100644 airtime_mvc/library/propel/test/tools/helpers/cms/CmsDataPopulator.php delete mode 100644 airtime_mvc/library/propel/test/tools/helpers/cms/CmsTestBase.php delete mode 100644 airtime_mvc/library/propel/test/tools/phing/DefineTask.php delete mode 100644 airtime_mvc/library/propel/test/tree-test.php diff --git a/airtime_mvc/library/propel/CHANGELOG b/airtime_mvc/library/propel/CHANGELOG deleted file mode 100644 index fe4ff5fde1..0000000000 --- a/airtime_mvc/library/propel/CHANGELOG +++ /dev/null @@ -1,107 +0,0 @@ -= Changelog Of The Propel 1.5 Branch = - -== 2010-06-17: Version 1.5.2 == - - * [1810] Changed default table type keyword to ENGINE for MySQL (closes #969) - * [1809] Added a way to read virtual columns starting with a lowercase character (closes #993) - * [1808] Added connection object to the FK getter (closes #1018) - * [1807] Fixed namespace issue with `soft_delete` behavior (closes #1015) - * [1806] Fixed issue with instance pooling and soft_delete behavior (closes #1016) - * [1805] Added namespace declaration to model class interface (closes #1014) - * [1804] Improved generated class code when using namespaces (refs #683) - * [1803] Documented namespace.autoPackage build property (refs #1005) - * [1802] Added support for package autosetting based on namespace attribute (refs #1005) - * [1801] Fixed related instance pooling clear in case of an emulated on delete cascade / set null (refs #1012) - * [1800] Fixed onDelete cascade and setnull for self-referencing foreign keys (closes #1012) - * [1799] Fixed `ModelCriteria::find()` throws `Exception` instead of `PropelException` - * [1798] Fixed hard-to-debug unit test exception message - * [1797] Fixed cascade deletion emulation when `Criteria` is modified by `doSelect()` (closes #1008) - * [1796] Added `ModelCriteria::findOneOrCreate()` (closes #1009) - * [1795] Fixed `delete()` called in iterator breaks on demand formatter (closes #1006) - * [1794] Fixed double iteration on Propel collection (closes #1004) (patch from jeremyp) - * [1793] Documented namespaces (refs #683) - * [1792] Added support for namespaces in many-to-many relationships (refs #683) - * [1791] Added support for namespaces in single table inheritance (refs #683) - * [1790] Added mention of a common error code in runtime settings documentation - * [1789] Documented the simple templating system (refs #1002) - * [1788] Allowed namespace tests to run alongside normal tests (refs #683) - * [1787] Fixed `PropelObjectCollection::toArray()` when the collection is empty (closes #1001) - * [1786] Fixed runtime doc typo - * [1785] Refactored the `aggregate_column` behavior to take advantage of the buildtime simple templating engine (refs #1002, #995) - * [1784] Added simple templating engine for behaviors (refs #1002) - * [1783] Added a !HowTo on writing behaviors (should have been published in the blog, but Posterous is having troubles with code samples) - * [1782] Improved namespace support in generated `TableMap` classes (refs #683) - * [1781] Introducing Model Namespaces (PHP 5.3 only) (WIP) (refs #683) - * [1780] Fixed generated `filterByXXX()` for string columns when using custom comparison - * [1779] Added `aggregate_column` behavior (refs #995) - * [1778] Refactored `ForeignKey` class in generator - * [1777] [doc] Fixed typo in CRUD chapter - * [1776] Fixed generated relation names for tables with symmetrical foreign keys (closes #968) - * [1775] Fixed generated relation names for tables with more than one self-referencing foreign key (closes #972) - * [1774] Fixed copy of foreign keys with hardcoded refPhpName in concrete inheritance behavior (closes #988) - * [1773] Changing runtime autoload strategy (closes #974): - * Using absolute path in core autoloading - * introducing `PropelAutoloader` for models - * removing the need for include path change in installation docs - * [1772] Added failed SQL query to `BasePeer` exception messages (closes #979) - * [1771] Documented the schema autosuggest feature in supported IDEs - * [1770] Expanded the schema XSD annotations for easier schema autocompletion - * [1769] showcasing link to XSD file in schema to allow autocompletion on NetBeans - * [1768] Fixed typos in `ModelCriteria` doc (closes #978) (patch from Frosty) - * [1767] Fixed typo in install doc (closes #576) - * [1766] Fixed schema DTD does not validate schemas without behaviors (closes #973) - * [1765] Added the ability to comment the generated SQL query from a Criteria (closes #970) - * [1764] Fixed limitation in schema size when transformation or external schema is included (closes #971) - * [1763] Fixed limitation in schema size when no transformation nor external schema is included (closes #971) - -== 2010-05-10: Version 1.5.1 == - - * [1759] Moved ModelWith runtime class to formatter directory - * [1758] Fixed warning with new StringReader - * [1757] Reduced console logging when building an up-to-date schema - * [1756] Parsing schemas as strings instead of files (closes #967) - * [1755] Reverting r1548 to allow inclusion of external schemas (refs #967) - * [1754] Documented custom defaultJoin type (refs #870) (closes #936) - * [1749] fix Criteria::addCond() example and php-doc (closes #964) - * [1748] fix Join::addCondition() php-doc (closes #963) - * [1747] Add getJoin() method to ModelCriteria (closes #961) - * [1745] Fixed auto_add_pk behavior when using separate schemas (closes #956) - * [1743] Refactored ModelCriteria::count() to allow query cache on counts - * [1742] Fixed propel-gen executable on windows (closes #942) - * [1741] disabled query cloning by default, you can enable it on a per query basis using keepQuery() (refs #953) - * [1740] Fixed shallow Criteria cloning (refs #953) - * [1739] Fixed overriding primary key in a new object (closes #960) - * [1738] Fixed generated joinXXX() methods used in secondary Criteria (closes #958) - * [1737] Fixed array hydration (refs #954, #959) - * [1736] Added unit test to demonstrate Array Hydration regression (refs #959) - * [1735] Fixed typo in MySQL DDL builder (closes #957) - * [1734] fixed doc typos (patch from Frosty) (closes #955) - * [1733] Refactored hydration schema - * removed circular dependency between Criteria and Formatter (refs #891) - * formatters now copy the necessary hydration data from the ModelCriteria - * Should improve memory handling in large resultsets - * removed PropelFormatter::setCriteria() and checkCriteria (refs #892) - * [1732] refactored on demand hydration (refs #954), removed ModelJoin storage in ModelWith - * [1731] Refactored Joined Array hydration (refs #954) - * [1730] Changed Propel::enableInstancePooling() return value - * [1729] Added a exception to explicit the limits of one-to-many joined hydration - * [1728] Refactored joined object hydration - * Now deals correctly with any join chain (refs #954) - * Faster for large resultsets and long join chains - * [1727] refactored BasePeer::doDelete() to handle table aliases and perform better (closes #949) - * [1726] Small Criteria optimization - * [1725] Fixed ModelCriteria::delete() fails when using true table alias (closes #949) - * [1724] Allowed Merging of Criteria objects to combien conditions with an OR (closes #951) - * [1723] Added the ability to reindex a collection (closes #851) - * [1722] Gave a public way to remove an alias (useful when merging Criterias) - * [1721] Added ModelCriteria::postUpdate() and ModelCriteria::postDelete() hooks (closes #945) - * [1720] Fixed issue with instance pooling and composite fkeys in peer classes (closes #924) - * [1719] Fixed E_STRICT warning in concrete table inheritance (closes #910) - * [1718] Added unit tests for PropelObjectCollection::toKeyValue(), and made it just a little smarter (closes #943) - * [1717] Fixed typo in Relationships doc closes #941) - * [1716] Fixed reverse task and validators (closes #928) - * [1715] Fixed phpDoc for Criteria::getCriterion() (closes #929) - * [1714] Fixed regression in orderBy() used in conjunction with ignoreCase (closes #946) - * [1712] Fixed concrete table inheritance with more than one level (closes #922) - * [1711] Fixed filterByXXX() when passed an explicit Criteria::EQUAL (closes #944) - * [1710] Fixed references to 1.4 pages in documentaton (closes #937) \ No newline at end of file diff --git a/airtime_mvc/library/propel/INSTALL b/airtime_mvc/library/propel/INSTALL deleted file mode 100644 index cb7effd160..0000000000 --- a/airtime_mvc/library/propel/INSTALL +++ /dev/null @@ -1,4 +0,0 @@ -I N S T A L L I N G P R O P E L -================================== - -See docs/guide/01-Installation.txt for detailed installation instructions. \ No newline at end of file diff --git a/airtime_mvc/library/propel/LICENSE b/airtime_mvc/library/propel/LICENSE deleted file mode 100644 index 1b4925a274..0000000000 --- a/airtime_mvc/library/propel/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2005-2010 Hans Lellelid, David Zuelke, Francois Zaninotto - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/airtime_mvc/library/propel/WHATS_NEW b/airtime_mvc/library/propel/WHATS_NEW deleted file mode 100644 index 9120f63ae7..0000000000 --- a/airtime_mvc/library/propel/WHATS_NEW +++ /dev/null @@ -1,807 +0,0 @@ -= What's new in Propel 1.5? = - -[[PageOutline]] - -First and foremost, don't be frightened by the long list of new features that follows. Propel 1.5 is completely backwards compatible with Propel 1.4 and 1.3, so there is no hidden cost to benefit from these features. If you didn't do it already, upgrade the propel libraries, rebuild your model, and you're done - your application can now use the Propel 1.5 features. - -== New Query API == - -This is the killer feature of Propel 1.5. It will transform the painful task of writing Criteria queries into a fun moment. - -=== Model Queries === - -Along Model and Peer classes, Propel 1.5 now generates one Query class for each table. These Query classes inherit from Criteria, but have additional abilities since the Propel generator has a deep knowledge of your schema. That means that Propel 1.5 advises that you use ModelQueries instead of raw Criteria. - -Model queries have smart filter methods for each column, and termination methods on their own. That means that instead of writing: - -{{{ -#!php -add(BookPeer::TITLE, 'War And Peace'); -$book = BookPeer::doSelectOne($c); -}}} - -You can write: - -{{{ -#!php -filterByTitle('War And Peace'); -$book = $q->findOne(); -}}} - -In addition, each Model Query class benefits from a factory method called `create()`, which returns a new instance of the query class. And the filter methods return the current query object. So it's even easier to write the previous query as follows: - -{{{ -#!php -filterByTitle('War And Peace'); - ->findOne(); -}}} - -The termination methods are `find()`, `findOne()`, `count()`, `paginate()`, `update()`, and `delete()`. They all accept a connection object as last parameter. - -Remember that a Model Query IS a Criteria. So your Propel 1.4 code snippets still work: - -{{{ -#!php -addJoin(BookPeer::AUTHOR_ID, AuthorPeer::ID); - ->add(AuthorPeer::LAST_NAME, 'Tolstoi') - ->addAscendingOrderByColumn(BookPeer::TITLE) - ->findOne(); -}}} - -But you will soon see that it's faster to use the generated methods of the Model Query classes: - -{{{ -#!php -useAuthorQuery(); - ->filterByLastName('Tolstoi') - ->endUse() - ->orderByTitle() - ->findOne(); -}}} - -That's right, you can embed a query into another; Propel guesses the join to apply from the foreign key declared in your schema. - -That makes it very easy to package your own custom model logic into reusable query methods. After a while, your code can easily look like the following: - -{{{ -#!php -filterByPublisher($publisher) - ->cheap() - ->recent() - ->useAuthorQuery(); - ->stillAlive() - ->famous() - ->endUse() - ->orderByTitle() - ->find(); -}}} - -The Model Queries can understand `findByXXX()` method calls, where `'XXX'` is the phpName of a column of the model. That answers one of the most common customization need: - -{{{ -#!php -findOneByTitle('War And Peace'); -}}} - -Eventually, these Query classes will replace the Peer classes; you should place all the code necessary to request or alter Model object in these classes. The Criteria/Peer way of doing queries still work exactly the same as in previous Propel versions, so your existing applications won't suffer from this update. - -'''Tip''': Incidentally, if you use an IDE with code completion, you will see that writing a query has never been so easy. - -=== Collections And On-Demand Hydration === - -The `find()` method of generated Model Query objects returns a `PropelCollection` object. You can use this object just like an array of model objects, iterate over it using `foreach`, access the objects by key, etc. - -{{{ -#!php -limit(5) - ->find(); // $books is a PropelCollection object -foreach ($books as $book) { - echo $book->getTitle(); -} -}}} - -Propel also returns a `PropelCollection` object instead of an array when you use a getter for a one-to-many relationship: - -{{{ -#!php -getBooks(); // $books is a PropelCollection object -}}} - -If your code relies on list of objects being arrays, you will need to update it a little. The `PropelCollection` object provides a method for most common array operations: - -{{{ -Array | Collection object ------------------------- | ----------------------------------------- -foreach($books as $book) | foreach($books as $book) -count($books) | count($books) or $books->count() -$books[]= $book | $books[]= $book or $books->append($book) -$books[0] | $books[0] or $books->getFirst() -$books[123] | $books[123] or $books->offsetGet(123) -unset($books[1]) | unset($books[1]) or $books->remove(1) -empty($books) | $books->isEmpty() -in_array($book, $books) | $books->contains($book) -array_pop($books) | $books->pop() -etc. -}}} - -'''Warning''': `empty($books)` always returns false when using a collection, even on a non-empty one. This is a PHP limitation. Prefer `$books->isEmpty()`, or `count($books)>0`. - -'''Tip''': If you can't afford updating your code to support collections instead of arrays, you can still ask Propel to generate 1.4-compatible model objects by overriding the `propel.builder.object.class` setting in your `build.properties`, as follows: - -{{{ -#!ini -propel.builder.object.class = builder.om.PHP5ObjectNoCollectionBuilder -}}} - -The `PropelCollection` class offers even more methods that you will soon use a lot: - -{{{ -#!php -getArrayCopy() // get the array inside the collection -$books->toArray() // turn all objects to associative arrays -$books->getPrimaryKeys() // get an array of the primary keys of all the objects in the collection -$books->getModel() // return the model of the collection, e.g. 'Book' -}}} - -Another advantage of using a collection instead of an array is that Propel can hydrate model objects on demand. Using this feature, you'll never fall short of memory again. Available through the `setFormatter()` method of Model Queries, on-demand hydration is very easy to trigger: - -{{{ -#!php -limit(50000) - ->setFormatter(ModelCriteria::FORMAT_ON_DEMAND) // just add this line - ->find(); -foreach ($books as $book) { - echo $book->getTitle(); -} -}}} - -In this example, Propel will hydrate the `Book` objects row by row, after the `foreach` call, and reuse the memory between each iteration. The consequence is that the above code won't use more memory when the query returns 50,000 results than when it returns 5. - -`ModelCriteria::FORMAT_ON_DEMAND` is one of the many formatters provided by the new Query objects. You can also get a collection of associative arrays instead of objects, if you don't need any of the logic stored in your model object, by using `ModelCriteria::FORMAT_ARRAY`. - -The [wiki:Users/Documentation/1.5/ModelCriteria documentation] describes each formatter, and how to use it. - -=== Model Criteria === - -Generated Model Queries inherit from `ModelCriteria`, which extends your good old `Criteria`, and adds a few useful features. Basically, a `ModelCriteria` is a `Criteria` linked to a Model; by using the information stored in the generated TableMaps at runtime, `ModelCriteria` offers powerful methods to simplify the process of writing a query. - -For instance, `ModelCriteria::where()` provides similar functionality to `Criteria::add()`, except that its [http://www.php.net/manual/en/pdostatement.bindparam.php PDO-like syntax] removes the burden of Criteria constants for comparators. - -{{{ -#!php -where('Book.Title LIKE ?', 'War And P%') - ->findOne(); -}}} - -Propel analyzes the clause passed as first argument of `where()` to determine which escaping to use for the value passed as second argument. In the above example, the `Book::TITLE` column is declared as `VARCHAR` in the schema, so Propel will bind the title as a string. - -The `where()` method can also accept more complex clauses. You just need to explicit every column name as `'ModelClassName.ColumnPhpName'`, as follows: - -{{{ -#!php -where('UPPER(Book.Title) LIKE ?', 'WAR AND P%') - ->where('(Book.Price * 100) <= ?', 1500) - ->findOne(); -}}} - -Another great addition of `ModelCriteria` is the `join()` method, which just needs the name of a related model to build a JOIN clause: - -{{{ -#!php -join('Book.Author') - ->where('CONCAT(Author.FirstName, " ", Author.LastName) = ?', 'Leo Tolstoi') - ->find(); -}}} - -`ModelCriteria` has a built-in support for table aliases, which allows to setup a query using two joins on the same table, which was not possible with the `Criteria` object: - -{{{ -#!php -join('b.Author a') // use 'a' as an alias for 'Author' in the query - ->where('CONCAT(a.FirstName, " ", a.LastName) = ?', 'Leo Tolstoi') - ->find(); -}}} - -This syntax probably looks familiar, because it is very close to SQL. So you probably won't need long to figure out how to write a complex query with it. The documentation offers [wiki:Users/Documentation/1.5/ModelCriteria an entire chapter] dedicated to the new `ModelCriteria` class. Make sure you read it to see the power of this new query API. - -=== Criteria Enhancements === - -Generated queries and ModelQueries are not the only ones to have received a lot of attention in Propel 1.5. The Criteria object itself sees a few improvements, that will ease the writing of queries with complex logic. - -`Criteria::addOr()` operates the way you always expected it to. For instance, in Propel 1.4, `addOr()` resulted in a SQL `AND` if called on a column with no other condition: - -{{{ -#!php -add(BookPeer::TITLE, '%Leo%', Criteria::LIKE); -$c->addOr(BookPeer::TITLE, '%Tolstoi%', Criteria::LIKE); -// translates in SQL as -// WHERE (book.TITLE LIKE '%Leo%' OR book.TITLE LIKE '%Tolstoi%') - -// addOr() used to fail on a column with no existing condition -$c = new Criteria(); -$c->add(BookPeer::TITLE, '%Leo%', Criteria::LIKE); -$c->addOr(BookPeer::ISBN, '1234', Criteria::EQUAL); -// translates in SQL as -// WHERE book.TITLE LIKE '%Leo%' AND book.ISBN = '1234' -}}} - -This is fixed in Propel 1.5. This means that you don't need to call upon the `Criterion` object for a simple OR clause: - -{{{ -#!php -add(BookPeer::TITLE, '%Leo%', Criteria::LIKE); -$c->addOr(BookPeer::ISBN, '1234', Criteria::EQUAL); -// translates in SQL as -// WHERE (book.TITLE LIKE '%Leo%' OR book.ISBN = '1234') - -// and it's much faster to write than -$c = new Criteria(); -$c1 = $c->getNewCriterion(BookPeer::TITLE, '%Leo%', Criteria::LIKE); -$c2 = $c->getNewCriterion(BookPeer::ISBN, '1234', Criteria::EQUAL); -$c1->addOr($c2); -$c->add($c1); -}}} - -`add()` and `addOr()` only allow simple logical operations on a single condition. For more complex logic, Propel 1.4 forced you to use Criterions again. This is no longer the case in Propel 1.5, which provides a new `Criteria::combine()` method. It expects an array of named conditions to be combined, and an operator. Use `Criteria::addCond()` to create a condition, instead of the usual `add()`: - -{{{ -#!php -addCond('cond1', BookPeer::TITLE, 'Foo', Criteria::EQUAL); // creates a condition named 'cond1' -$c->addCond('cond2', BookPeer::TITLE, 'Bar', Criteria::EQUAL); // creates a condition named 'cond2' -$c->combine(array('cond1', 'cond2'), Criteria::LOGICAL_OR); // combine 'cond1' and 'cond2' with a logical OR -// translates in SQL as -// WHERE (book.TITLE = 'Foo' OR book.TITLE = 'Bar'); -}}} - -`combine()` accepts more than two conditions at a time: -{{{ -#!php -addCond('cond1', BookPeer::TITLE, 'Foo', Criteria::EQUAL); -$c->addCond('cond2', BookPeer::TITLE, 'Bar', Criteria::EQUAL); -$c->addCond('cond3', BookPeer::TITLE, 'FooBar', Criteria::EQUAL); -$c->combine(array('cond1', 'cond2', 'cond3'), Criteria::LOGICAL_OR); -// translates in SQL as -// WHERE ((book.TITLE = 'Foo' OR book.TITLE = 'Bar') OR book.TITLE = 'FooBar'); -}}} - -`combine()` itself can return a named condition to be combined later. So it allows for any level of logical complexity: - -{{{ -#!php -addCond('cond1', BookPeer::TITLE, 'Foo', Criteria::EQUAL); -$c->addCond('cond2', BookPeer::TITLE, 'Bar', Criteria::EQUAL); -$c->combine(array('cond1', 'cond2'), Criteria::LOGICAL_OR, 'cond12'); - -$c->addCond('cond3', BookPeer::ISBN, '1234', Criteria::EQUAL); -$c->addCond('cond4', BookPeer::ISBN, '4567', Criteria::EQUAL); -$c->combine(array('cond3', 'cond4'), Criteria::LOGICAL_OR, 'cond34'); - -$c->combine(array('cond12', 'cond34'), Criteria::LOGICAL_AND); - -// WHERE (book.TITLE = 'Foo' OR book.TITLE = 'Bar') -// AND (book.ISBN = '1234' OR book.ISBN = '4567'); -}}} - -The new `combine()` method makes it much easier to handle logically complex criterions. The good news is that if your application code already uses the old Criterion way, it will continue to work with Propel 1.5 as all these changes are backwards compatible. - -Of course, since Model Queries extend Criteria, this new feature is available for all your queries, with a slightly different syntax, in order to support column phpNames: - -{{{ -#!php -condition('cond1', 'Book.Title = ?', 'Foo') - ->condition('cond2', 'Book.Title = ?', 'Bar') - ->combine(array('cond1', 'cond2'), Criteria::LOGICAL_OR, 'cond12') - ->condition('cond3', 'Book.ISBN = ?', '1234') - ->condition('cond4', 'Book.ISBN = ?', '4567') - ->combine(array('cond3', 'cond4'), Criteria::LOGICAL_OR, 'cond34') - ->combine(array('cond12', 'cond34'), Criteria::LOGICAL_AND) - ->find(); -// WHERE (book.TITLE = 'Foo' OR book.TITLE = 'Bar') -// AND (book.ISBN = '1234' OR book.ISBN = '4567'); -}}} - -== Many-to-Many Relationships == - -At last, Propel generates the necessary methods to retrieve related objects in a many-to-many relationship. Since this feature is often needed, many developers already wrote these methods themselves. To avoid method collision, the generation of many-to-many getters is therefore optional. - -All you have to do is to add the `isCrossRef` attribute to the cross reference table, and rebuild your model. For instance, if a `User` has many `Groups`, and the `Group` has many `Users`, the many-to-many relationship is materialized by a `user_group` cross reference table: - -{{{ -#!xml -
- - -
- - - - -
- - - - - - - - - - -
-}}} - -Then, both end of the relationship see the other end through a one-to-many relationship. That means that you can deal with related objects just like you normally do, without ever creating instances of the cross reference object: - -{{{ -#!php -setName('John Doe'); -$group = new Group(); -$group->setName('Anonymous'); -// relate $user and $group -$user->addGroup($group); -// save the $user object, the $group object, and a new instance of the UserGroup class -$user->save(); - -// retrieve objects as if they shared a one-to-many relationship -$groups = $user->getGroups(); - -// the model query also features a smart filter method for the relation -$groups = GroupPeer::create() - ->filterByUser($user) - ->find(); -}}} - -The syntax should be no surprise, since it's the same as the one for one-to-many relationships. Find more details about many-to-many relationships in the [wiki:Users/Documentation/1.5/Relationships relationships documentation]. - -== New Behaviors == - -The new behavior system, introduced in Propel 1.4, starts to unleash its true power with this release. Three new behaviors implement the most common customizations of object models: `nested_sets`, `sluggable`, and `sortable`. - -=== Nested Set Behavior === - -Using the `treeMode` attribute in a schema, you could turn a Propel model into a hierarchical data store starting with Propel 1.3. This method is now deprecated in favor of a new `nested_set` behavior, that does eactly the same thing, but in a more extensible and effective way. - -The main difference between the two implementations is performance. On the first levels of a large tree, the Propel 1.3 implementation of Nested sets used to consume a very large amount of memory and CPU to retrieve the siblings or the children of a given node. This is no longer true with the new behavior. - -This performance boost comes at a small price: you must add a new "level" column to your nested set models, and let the behavior update this column for the whole tree. - -For instance, if you used nested sets to keep a list of categories, the schema used to look like: - -{{{ -#!xml - - - - - -
-}}} - -The upgrade path is then pretty straightforward: - -1 - Update the schema, by removing the `treeMode` and `nestedSet` attributes and adding the `nested_set` behavior and the `tree_level` column: - -{{{ -#!xml - - - - - - - - - - - -
-}}} - -2 - Rebuild the model - -3 - Change the parent class of your model classes (object and peer) that used the nested set `treeMode`: - -{{{ -#!php - - - - - - - - -}}} - -Now, every time you save a new `Post` object, Propel will compose its slug according to the pattern defined in the behavior parameter and save it in an additional `slug` column: - -{{{ -#!php -setTitle('How Is Life On Earth?'); -$post1->setContent('Lorem Ipsum...'); -$post1->save(); -echo $post1->getSlug(); // '/posts/how-is-life-on-earth' -}}} - -Propel replaces every name enclosed between brackets in the slug pattern by the related column value. It also cleans up the string to make it URL-compatible, and ensures that it is unique. - -If you use this slug in URLs, you will need to retrieve a `Post` object based on it. This is just a one-liner: - -{{{ -#!php -findOneBySlug('/posts/how-is-life-on-earth'); -}}} - -There are many ways to customize the `sluggable` behavior to match the needs of your applications. Check the new [wiki:Users/Documentation/1.5/Behaviors/sluggable sluggable behavior documentation] for more details. - -=== Concrete Table Inheritance Behavior === - -Propel has offered [wiki:Users/Documentation/1.5/Inheritance#SingleTableInheritance Single Table Inheritance] for a long time. But for complex table inheritance needs, it is necessary to provide [http://martinfowler.com/eaaCatalog/concreteTableInheritance.html Concrete Table Inheritance]. Starting with Propel 1.5, this inheritance implementation is supported through the new `concrete_inheritance` behavior. - -In the following example, the `article` and `video` tables use this behavior to inherit the columns and foreign keys of their parent table, `content`: - -{{{ -#!xml - - - - - - - -
- - - -
- - - - - -
- - - - - -
-}}} - -The behavior copies the columns of the parent table to the child tables. That means that the generated `Article` and `Video` models have a `Title` property and a `Category` relationship: - -{{{ -#!php -setName('Movie'); -$cat->save(); -// create a new Article -$art = new Article(); -$art->setTitle('Avatar Makes Best Opening Weekend in the History'); -$art->setCategory($cat); -$art->setContent('With $232.2 million worldwide total, Avatar had one of the best-opening weekends in the history of cinema.'); -$art->save(); -// create a new Video -$vid = new Video(); -$vid->setTitle('Avatar Trailer'); -$vid->setCategory($cat); -$vid->setResourceLink('http://www.avatarmovie.com/index.html') -$vid->save(); -}}} - -If Propel stopped there, the `concrete_inheritance` behavior would only provide a shorcut to avoid repeating tags in the schema. But wait, there is more: the `Article` and `Video` classes actually extend the `Content` class: - -{{{ -#!php -getCategory()->getName(); - } -} -echo $art->getCategoryName(); // 'Movie' -echo $vid->getCategoryName(); // 'Movie' -}}} - -And the true power of Propel's Concrete Table Inheritance is that every time you save an `Article` or a `Video` object, Propel saves a copy of the `title` and `category_id` columns in a `Content` object. Consequently, retrieving objects regardless of their child type becomes very easy: - -{{{ -#!php -find(); -foreach ($conts as $content) { - echo $content->getTitle() . "(". $content->getCategoryName() ")/n"; -} -// Avatar Makes Best Opening Weekend in the History (Movie) -// Avatar Trailer (Movie) -}}} - -The resulting relational model is denormalized - in other terms, data is copied across tables - but the behavior takes care of everything for you. That allows for very effective read queries on complex inheritance structures. - -Check out the brand new [wiki:Users/Documentation/1.5/Inheritance#ConcreteTableInheritance Inheritance Documentation] for more details on using and customizing this behavior. - -=== Sortable Behavior === - -Have you ever enhanced a Propel Model to give it the ability to move up or down in an ordered list? The `sortable` behavior, new in Propel 1.5, offers exactly that... and even more. - -As usual for behaviors, activate `sortable` in your `schema.yml`: - -{{{ -#!xml - - - - - - - - - - - -
-}}} - -Then rebuild your model, and you're done. You have just created an ordered task list for users: - -{{{ -#!php -setTitle('Wash the dishes'); -$t1->setUser($paul); -$t1->save(); -echo $t1->getRank(); // 1 -$t2 = new Task(); -$t2->setTitle('Do the laundry'); -$t2->setUser($paul); -$t2->save(); -echo $t2->getRank(); // 2 -$t3 = new Task(); -$t3->setTitle('Rest a little'); -$t3->setUser($john); -$t3->save() -echo $t3->getRank(); // 1, because John has his own task list - -// retrieve the tasks -$allPaulsTasks = TaskPeer::retrieveList($scope = $paul->getId()); -$allJohnsTasks = TaskPeer::retrieveList($scope = $john->getId()); -$t1 = TaskPeer::retrieveByRank($rank = 1, $scope = $paul->getId()); -$t2 = $t1->getNext(); -$t2->moveUp(); -echo $t2->getRank(); // 1 -echo $t1->getRank(); // 2 -}}} - -This new behavior is fully unit tested and very customizable. Check out all you can do with `sortable` in the [wiki:Users/Documentation/1.5/Behaviors/sortable sortable behavior documentation]. - -=== Timestampable Behavior === - -This behavior is not new, since it was introduced in Propel 1.4. However, with the introduction of model queries, it gains specific query methods that will ease your work when retrieving objects based on their update date: - -{{{ -#!php -recentlyUpdated() // adds a minimum value for the update date - ->lastUpdatedFirst() // orders the results by descending update date - ->find(); -}}} - -== Better `toArray()` == - -When you call `toArray()` on a model object, you can now ask for the related objects: - -{{{ -#!php -toArray($keyType = BasePeer::TYPE_COLNAME, $includeLazyLoadColumns = true, $includeForeignObjects = true); -print_r($bookArray); - => array( - 'Id' => 123, - 'Title' => 'War And Peace', - 'ISBN' => '3245234535', - 'AuthorId' => 456, - 'PublisherId' => 567 - 'Author' => array( - 'Id' => 456, - 'FirstName' => 'Leo', - 'LastName' => 'Tolstoi' - ), - 'Publisher' => array( - 'Id' => 567, - 'Name' => 'Penguin' - ) - ) -}}} - -Only the related objects that were already hydrated appear in the result, so `toArray()` never issues additional queries. Together with the ability to return arrays instead of objects when using `PropelQuery`, this addition will help to debug and optimize model code. - -== Better Oracle Support == - -The Oracle adapter for the generator, the reverse engineering, and the runtime components have been greatly improved. This should provide an easier integration of Propel with an Oracle database. - -== Code Cleanup == - -=== Directory Structure Changes === - -The organization of the Propel runtime and generator code has been reworked, in order to make navigation across Propel classes easier for developers. End users should see no difference, apart if your `build.properties` references alternate builder classes in the Propel code. In that case, you will need to update your `build.properties` with the new paths. For instance, a reference to: - -{{{ -#!ini -propel.builder.peer.class = propel.engine.builder.om.php5.PHP5PeerBuilder -}}} - -Must be changed to: - -{{{ -#!ini -propel.builder.peer.class = builder.om.PHP5PeerBuilder -}}} - -Browse the Propel generator directory structure to find the classes you need. - -=== DebugPDO Refactoring === - -To allow custom connection handlers, the debug code that was written in the `DebugPDO` class has been moved to `PropelPDO`. The change is completely backwards compatible, but makes it easier to connect to a database without using PDO. - -During the change, the [wiki:Users/Documentation/1.5/07-Logging documentation about Propel logging and debugging features] was rewritten and should now be clearer. - -== propel-gen Script Modifications == - -The `propel-gen` script no longer requires a path to the project directory if you call it from a project directory. That means that calling `propel-gen` with a single argument defaults to expecting a task name: - -{{{ -> cd /path/to/my/project -> propel-gen reverse -}}} - -By default, the `propel-gen` command called without a task name defaults to the `main` task (and builds the model, the SQL, and the generation). - -Note: The behavior of the `propel-gen` script when called with one parameter differs from what it used to be in Propel 1.4, where the script expected a path in every situation. So the following syntax won't work anymore: - -{{{ -> propel-gen /path/to/my/project -}}} - -Instead, use either: - -{{{ -> cd /path/to/my/project -> propel-gen -}}} - -or: - -{{{ -> propel-gen /path/to/my/project main -}}} - -== License Change == - -Propel is more open-source than ever. To allow for an easier distribution, the open-source license of the Propel library changes from LGPL3 to MIT. This [http://en.wikipedia.org/wiki/MIT_License MIT License] is also known as the X11 License. - -This change removes a usage restriction enforced by the LGPL3: you no longer need to release any modifications to the core Propel source code under a LGPL compatible license. - -Of course, you still have the right to use, copy, modify, merge, publish, distribute, sublicense, and/or sell Propel. In other terms, you can do whatever you want with the Propel code, without worrying about the license, as long as you leave the LICENSE file within. - -== Miscellaneous == - - * Generated model classes now offer a `fromArray()` and a `toArray()` method by default. This feature existed before, but was disabled by default in the `build.properties`. The `addGenericAccessors` and `addGenericMutators` settings are therefore enabled by default in Propel 1.5. - * You can now prefix all the table names of a database schema by setting the `tablePrefix` attribute of the `` tag. - * The `addIncludes` build property introduced in Propel 1.4 is now set to `false` by default. That means that the runtime autoloading takes care of loading all classes at runtime, including generated Base classes. - * A bugfix in the name generator for related object getter in tables with two foreign keys related to the same table may have introduced problems in applications relying on old (wrong) names. Check your generated base model classes for the `getXXXrelatedByYYY()` and modify the application code relying on it if it exists. A good rule of thumb to avoid problems in such case is to name your relations by using the `phpName` and `refPhpName` attributes in the `` element in the schema. - * XSL transformation of your schemas is no longer enabled by default. Turn the `propel.schema.transform` setting to `true` in your `build.properties` to enable it again. This change removes the requirement on the libxslt extention for Propel. - * `ModelObject::addSelectColumns()` now accepts an additional parameter to allow the use of table aliases - * Added `ModelObject::clear()` to reinitialize a model object - * Added `ModelObject::isPrimaryKeyNull()` method to check of an object was hydrated with no values (in case of a left join) - * Added `Criteria::addSelectModifier($modifier)` to add more than one select modifier (e.g. 'SQL_CALC_FOUND_ROWS', 'HIGH_PRIORITY', etc.) - * Added `PeerClass::addGetPrimaryKeyFromRow()` to retrieve the Primary key from a result row - * Added a new set of constants in the generated Peer class to list column names without the table name (this is `BasePeer::TYPE_RAW_COLNAME`) - * Removed references to Creole in the code (Propel uses PDO instead of Creole since version 1.3) \ No newline at end of file diff --git a/airtime_mvc/library/propel/contrib/dbd2propel/dbd2propel.xsl b/airtime_mvc/library/propel/contrib/dbd2propel/dbd2propel.xsl deleted file mode 100644 index 852af4acec..0000000000 --- a/airtime_mvc/library/propel/contrib/dbd2propel/dbd2propel.xsl +++ /dev/null @@ -1,381 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - true - - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TIMESTAMP - LONGVARCHAR - BOOLEAN - BLOB - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - restrict - cascade - setnull - restrict - - - -
diff --git a/airtime_mvc/library/propel/contrib/dbd2propel/transform.php b/airtime_mvc/library/propel/contrib/dbd2propel/transform.php deleted file mode 100644 index 129f19f852..0000000000 --- a/airtime_mvc/library/propel/contrib/dbd2propel/transform.php +++ /dev/null @@ -1,21 +0,0 @@ -load('model.xml'); - -// load the transformation stylesheet -$xsl = new DOMDocument; -$xsl->load('dbd2propel.xsl'); - -$proc = new XSLTProcessor(); -// attach the xsl rules -$proc->importStyleSheet($xsl); - -$schema_xml = $proc->transformToXML($xml); - -file_put_contents('schema.xml', $schema_xml); diff --git a/airtime_mvc/library/propel/contrib/pat/patForms.php b/airtime_mvc/library/propel/contrib/pat/patForms.php deleted file mode 100644 index a1c66a135d..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms.php +++ /dev/null @@ -1,2784 +0,0 @@ - - * @author gERD Schaufelberger - * @author Stephan Schmidt - * @copyright 2003-2004 PHP Application Tools - * @license LGPL - * @link http://www.php-tools.net - */ - -/** - * set the include path - */ -if ( !defined( 'PATFORMS_INCLUDE_PATH' ) ) { - define( 'PATFORMS_INCLUDE_PATH', dirname( __FILE__ ). '/patForms' ); -} - -/** - * needs helper methods of patForms_Element - */ -include_once PATFORMS_INCLUDE_PATH . "/Element.php"; - -/** - * error definition: renderer base class file (renderers/_base.php) could not - * be found. - * - * @see patForms::_createModule() - */ -define( "PATFORMS_ERROR_NO_MODULE_BASE_FILE", 1001 ); - -/** - * error definition: the specified renderer could not be found. - * - * @see patForms::_createModule() - */ -define( "PATFORMS_ERROR_MODULE_NOT_FOUND", 1002 ); - -/** - * error definition: the element added via the {@link patForms::addElement()} - * is not an object. Use the {@link patForms::createElement()} method to - * create an element object. - * - * @see patForms::addElement() - * @see patForms::createElement() - */ -define( "PATFORMS_ERROR_ELEMENT_IS_NO_OBJECT", 1003 ); - -/** - * error definition: generic unexpected error. - */ -define( "PATFORMS_ERROR_UNEXPECTED_ERROR", 1004 ); - -/** - * element does not exist - */ -define( "PATFORMS_ERROR_ELEMENT_NOT_FOUND", 1012 ); - -/** - * renderer object has not been set - if you want to render the form, you have to - * set a renderer object via the {@link patForms::setRenderer()} method. To create - * a renderer, use the {@link patForms::createRenderer()} method. - * - * @see patForms::setRenderer() - * @see patForms::createRenderer() - */ -define( "PATFORMS_ERROR_NO_RENDERER_SET", 1013 ); - -/** - * invalid renderer - * - * @see createRenderer() - */ -define( "PATFORMS_ERROR_INVALID_RENDERER", 1014 ); - -/** - * invalid method - * - * @see setMethod() - */ -define( "PATFORMS_ERROR_INVALID_METHOD", 1015 ); - -/** - * Given parameter is not a boolean value - */ -define( "PATFORMS_ERROR_PARAMETER_NO_BOOL", 1016 ); - -/** - * Given Static property does not exist - */ -define( "PATFORMS_ERROR_NO_STATIC_PROPERTY", 1017 ); - -/** - * Unknown event - */ -define( "PATFORMS_ERROR_UNKNOWN_EVENT", 1018 ); - -/** - * Invalid event handler - */ -define( "PATFORMS_ERROR_INVALID_HANDLER", 1019 ); - -/** - * Event exists - */ -define( 'PATFORMS_NOTICE_EVENT_ALREADY_REGISTERED', 1020 ); - -/** - * Invalid storage container - */ -define( 'PATFORMS_ERROR_INVALID_STORAGE', 1021 ); - -define( 'PATFORMS_NOTICE_ARRAY_EXPECTED', 1022 ); - -define( 'PATFORMS_NOTICE_ATTRIBUTE_NOT_SUPPORTED', 1023 ); - -define( 'PATFORMS_NOTICE_INVALID_OPTION', 1024 ); - -define( 'PATFORMS_ERROR_ATTRIBUTE_REQUIRED', 1025 ); - -define( 'PATFORMS_ERROR_CAN_NOT_VERIFY_FORMAT', 1026 ); - -define( 'PATFORMS_ERROR_METHOD_FOR_MODE_NOT_AVAILABLE', 1027 ); - - -/** - * errors apply on translating errors matching current locale settings - */ -define( 'PATFORMS_NOTICE_VALIDATOR_ERROR_LOCALE_UNDEFINED', 1028 ); -define( 'PATFORMS_WARNING_VALIDATOR_ERROR_UNDEFINED', 1029 ); - -/** - * apply the rule before the built-in validation - */ -define( 'PATFORMS_RULE_BEFORE_VALIDATION', 1 ); - -/** - * apply the rule after the built-in validation - */ -define( 'PATFORMS_RULE_AFTER_VALIDATION', 2 ); - -/** - * apply the rule before AND after the built-in validation - */ -define( 'PATFORMS_RULE_BOTH', 3 ); - -/** - * attach the observer to the elements - */ -define( 'PATFORMS_OBSERVER_ATTACH_TO_ELEMENTS', 1 ); - -/** - * attach the observer to the form - */ -define( 'PATFORMS_OBSERVER_ATTACH_TO_FORM', 2 ); - -/** - * attach the observer to the form and the elements - */ -define( 'PATFORMS_OBSERVER_ATTACH_TO_BOTH', 3 ); - -/** - * group values should stay nested - */ -define('PATFORMS_VALUES_NESTED', 0); - -/** - * group values should be flattened - */ -define('PATFORMS_VALUES_FLATTENED', 1); - -/** - * group values should be prefixed - */ -define('PATFORMS_VALUES_PREFIXED', 2); - -/** - * Static patForms properties - used to emulate pre-PHP5 static properties. - * - * @see setStaticProperty() - * @see getStaticProperty() - */ -$GLOBALS['_patForms'] = array( - 'format' => 'html', - 'locale' => 'C', - 'customLocales' => array(), - 'autoFinalize' => true, - 'defaultAttributes' => array(), -); - -/** - * patForms form manager class - serialize form elements into any given output format - * using element classes, and build the output via renderer classes. - * - * @package patForms - * @author Sebastian Mordziol - * @author gERD Schaufelberger - * @author Stephan Schmidt - * @copyright 2003-2004 PHP Application Tools - * @license LGPL - * @link http://www.php-tools.net - * @version 0.9.0alpha - * @todo check the clientside functionality, as that can lead to broken pages - */ -class patForms -{ - /** - * javascript that will displayed only once - * - * @access private - * @var array - */ - var $globalJavascript = array(); - - /** - * javascript that will be displayed once per instance - * - * @access private - * @var array - */ - var $instanceJavascript = array(); - - /** - * stores the mode for the form. It defaults to 'default', and is only overwritten if - * set specifically. It is passed on to any elements you create. - * - * @access private - * @see setMode() - */ - var $mode = 'default'; - - /** - * XML entities - * - * @access private - * @see toXML() - * @todo This is redundant to the Element's xmlEntities property - find a way to keep this in one place - */ - var $xmlEntities = array( - "<" => "<", - ">" => ">", - "&" => "&", - "'" => "'", - '"' => """ - ); - - /** - * stores the format for the element. It defaults to 'html', and is only overwritten if - * set specifically. It is passed on to any elements you create. - * - * @access private - * @see setFormat() - */ - var $format = 'html'; - - /** - * stores the flag telling the form whether it has been submitted - this is passed on to any - * elements you create. - * - * @access private - * @see setSubmitted() - */ - var $submitted = false; - - /** - * stores the element objects of this form. - * @access private - * @see addElement() - */ - var $elements = array(); - - /** - * stores the current element count for this form, used to generate the ids for each element - * @access private - * @see getElementId() - */ - var $elementCounter = 0; - - /** - * stores a renderer - * @access private - * @see setRenderer(), renderForm() - */ - var $renderer = null; - - /** - * stores the locale to use when adding validation errors for the whole form. - * - * @access private - * @var string $locale - * @see setLocale() - */ - var $locale = 'C'; - - /** - * stores custom locale - * - * @access private - * @var array - * @see setLocale() - */ - var $customLocales = array(); - - /** - * stores the element name - * @access private - * @see getElementName() - */ - var $elementName = 'Form'; - - /** - * flag to indicate, whether form should be validated automatically - * by renderForm() - * - * @access private - * @var string - * @see setAutoValidate(), renderForm() - */ - var $autoValidate = false; - - /** - * name of the variable that indicates, whether the form has - * been submitted. - * - * @access private - * @var string - * @see setAutoValidate() - */ - var $submitVar = null; - - /** - * event handlers - * - * @access private - * @var array - * @see registerEventHandler() - * @see registerEvent() - */ - var $_eventHandler = array(); - - /** - * events that can be triggered - * - * @access private - * @var array - * @see registerEventHandler() - * @see triggerEvent() - * @see registerEvent() - */ - var $_validEvents = array( 'onInit', 'onValidate', 'onSubmit', 'onError', 'onSuccess' ); - - /** - * Stores whether the current form has been validated - * - * @access private - */ - var $validated = false; - - /** - * Stores whether the current form is valid or not (after the - * validation process) - * - * @access private - */ - var $valid = null; - - /** - * Stores the names of all static properties that patForms will use as defaults - * for the properties with the same name on startup. - * - * @access private - */ - var $staticProperties = array( - 'format' => 'setFormat', - 'autoFinalize' => 'setAutoFinalize', - 'locale' => 'setLocale', - ); - - /** - * Stores the flag for the autoFinalize feature - * - * @access private - */ - var $autoFinalize = true; - - /** - * custom validation rules - * - * @access private - * @var array - */ - var $_rules = array(); - - /** - * define error codes an messages for the form - * - * Will be set by validation rules that have been - * added to the form. - * - * @access private - * @var array $validatorErrorCodes - */ - var $validatorErrorCodes = array(); - - /** - * stores any validation errors that can occurr during the - * form's validation process. - * - * @access private - * @var array $validationErrors - */ - var $validationErrors = array(); - - /** - * next error offset for rules - * @access private - * @var integer - */ - var $nextErrorOffset = 1000; - - /** - * Attributes of the form - needed to generate the form tag - * - * @access private - * @var array $attributes - * @see setAttribute() - */ - var $attributes = array(); - - /** - * Attribute definition for the form - defines which attribute the form - * itself supports. - * - * @access public - */ - var $attributeDefinition = array( - - 'id' => array( - 'required' => false, - 'format' => 'string', - 'outputFormats' => array( 'html' ), - ), - - 'name' => array( - 'required' => true, - 'format' => 'string', - 'outputFormats' => array( 'html' ), - ), - - 'method' => array( - 'required' => true, - 'format' => 'string', - 'default' => 'post', - 'outputFormats' => array( 'html' ), - ), - - 'action' => array( - 'required' => true, - 'format' => 'string', - 'outputFormats' => array( 'html' ), - ), - - 'accept' => array( - 'required' => false, - 'format' => 'string', - 'outputFormats' => array( 'html' ), - ), - - 'accept-charset' => array( - 'required' => false, - 'format' => 'string', - 'outputFormats' => array( 'html' ), - ), - - 'enctype' => array( - 'required' => false, - 'format' => 'string', - 'outputFormats' => array( 'html' ), - ), - - 'onreset' => array( - 'required' => false, - 'format' => 'string', - 'outputFormats' => array( 'html' ), - ), - - 'onsubmit' => array( - 'required' => false, - 'format' => 'string', - 'outputFormats' => array( 'html' ), - ), - - 'target' => array( - 'required' => false, - 'format' => 'string', - 'outputFormats' => array( 'html' ), - ), - ); - - /** - * Stores all available patForms options - these are inherited by all elements - * and their dependencies, like rules. - * - * Short option overview: - * - * - scripts: enable client script integration - * - * @access public - */ - var $options = array( - - 'scripts' => array( - 'enabled' => true, - 'params' => array(), - ), - - ); - - /** - * observers of the form - * - * @access private - * @var array - */ - var $observers = array(); - - /** - * Sets the default attributes that will be inherited by any elements you add to the form. - * - * Note: You have to call this method statically before creating a new form if you use - * patForm's automatic element creation feature via the {@link createForm()} method, as the - * default attributes cannot be set after an element has been created. - * - * @static - * @access public - * @param array $attributes The list of attributes to set with key => value pairs. - */ - function setDefaultAttributes( $attributes ) - { - patForms::setStaticProperty( 'defaultAttributes', $attributes ); - } - - /** - * sets the locale (language) to use for the validation error messages of all elements - * in the form. - * - * @access public - * @param string language code - * @param string optional language file - * @return bool True on success - */ - function setLocale( $locale, $languageFile = null ) - { - if (!is_null($languageFile)) { - $languageData = patForms::parseLocaleFile($languageFile); - - $customLocales = patForms::getStaticProperty('customLocales'); - $customLocales[$locale] = $languageData; - patForms::setStaticProperty('customLocales', $customLocales); - } - - if ( isset( $this ) && is_a( $this, 'patForms' ) ) { - $this->locale = $locale; - - if ( !empty( $this->elements ) ) { - $cnt = count( $this->elements ); - for ( $i=0; $i < $cnt; $i++ ) { - $this->elements[$i]->setLocale( $locale ); - } - } - } else { - patForms::setStaticProperty('locale', $locale); - } - - return true; - } - - /** - * checks, whether a locale is a custom locale - * - * @static - * @access public - * @param string locale name - * @return boolean - */ - function isCustomLocale($locale) - { - $customLocales = patForms::getStaticProperty('customLocales'); - if (isset($customLocales[$locale])) { - return true; - } - return false; - } - - /** - * get the custom locale for an element or a rule - * - * @static - * @access public - * @param string locale - * @param string key - * @return array - */ - function getCustomLocale($locale, $key) - { - $customLocales = patForms::getStaticProperty('customLocales'); - if (!isset($customLocales[$locale])) { - return false; - } - if (!isset($customLocales[$locale][$key])) { - return false; - } - return $customLocales[$locale][$key]; - } - - /** - * parses a locale file - * - * @access private - * @param string filename - * @return array locale information - * @todo add some file checks - */ - function parseLocaleFile($filename) - { - return parse_ini_file($filename, true); - } - - /** - * sets the format of the element - this will be passed on to any elements you create. If you - * have already added some elements when you call this method, it will be passed on to them too. - * - * @access public - * @param string $format The name of the format you have implemented in your element(s). - * @return bool $result True on success - * @see setMode() - * @see format - * @see serialize() - */ - function setFormat( $format ) - { - if ( isset( $this ) && is_a( $this, 'patForms' ) ) - { - $this->format = strtolower( $format ); - - if ( !empty( $this->elements ) ) - { - $cnt = count( $this->elements ); - for ( $i=0; $i < $cnt; $i++ ) - { - $this->elements[$i]->setFormat( $format ); - } - } - } - else - { - patForms::setStaticProperty( 'format', $format ); - } - - return true; - } - - /** - * sets the mode of the form - If you have already added some elements when you call this - * method, it will be passed on to them too. - * - * @access public - * @param string $mode The mode to set the form to: default|readonly or any other mode you have implemented in your element class(es). Default is 'default'. - * @see setMode() - * @see mode - * @see serialize() - */ - function setMode( $mode ) - { - $this->mode = strtolower( $mode ); - - if ( !empty( $this->elements ) ) - { - $cnt = count( $this->elements ); - for ( $i=0; $i < $cnt; $i++ ) - { - $this->elements[$i]->setMode( $mode ); - } - } - } - - /** - * sets the current submitted state of the form. Set this to true if you want the form - * to pick up its submitted data. It will pass on this information to all elements that - * have been added so far, and new ones inherit it too. - * - * @access public - * @param bool $state True if it has been submitted, false otherwise (default). - * @see isSubmitted() - * @see submitted - */ - function setSubmitted( $state ) - { - if ( $state == true ) - { - $eventState = $this->triggerEvent( 'Submit' ); - if ( $eventState === false ) - return false; - } - - $this->submitted = $state; - - if ( !empty( $this->elements ) ) - { - $cnt = count( $this->elements ); - for ( $i=0; $i < $cnt; $i++ ) - { - $this->elements[$i]->setSubmitted( $state ); - } - } - - return $state; - } - - /** - * sets the method for the request - * - * @access public - * @param string $method GET or POST - * @see method - * @uses setAttribute() - */ - function setMethod( $method ) - { - $method = strtolower( $method ); - - if ( $method != 'get' && $method != 'post' ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_INVALID_METHOD, - 'Unknown method "'.$method.'". Currently only GET and POST are supported as patForms methods.' - ); - } - $this->setAttribute( 'method', $method ); - return true; - } - - /** - * sets the action for the form - * - * This is a only a wrapper for setAttribute() - * - * @access public - * @param string $action - * @see setAttribute() - */ - function setAction( $action ) - { - return $this->setAttribute( 'action', $action ); - } - - /** - * Sets the AutoFinalize mode for the form. The AutoFinalize mode will tell patForms to - * finalize all elements after the form has been validated successfully. - * - * @access public - * @param boolean $mode Whether to activate the AutoFinalize mode (true) or not (false). - * @return boolean $success True if okay, a patError object otherwise. - * @see finalizeForm() - */ - function setAutoFinalize( $mode ) - { - if ( !is_bool( $mode ) ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_PARAMETER_NO_BOOL, - 'The setAutoFinalize() method requires a boolean value ( true or false ) as parameter.' - ); - } - - if ( isset( $this ) && is_a( $this, 'patForms' ) ) - { - $this->autoFinalize = $mode; - } - else - { - patForms::setStaticProperty( 'autoFinalize', $mode ); - } - - return true; - } - - /** - * Wrapper method that adds a filter to all elements - * of the form at once instead of having to do it for - * each element. - * - * @access public - * @param object &$filter The filter object to apply - * @see patForms_Element::applyFilter() - * @todo add error management and docs once the element's applyFilter method has too - */ - function applyFilter( &$filter ) - { - if ( empty( $this->elements ) ) - return true; - - $cnt = count( $this->elements ); - - for ( $i = 0; $i < $cnt; $i++ ) - { - $this->elements[$i]->applyFilter( $filter ); - } - } - - /** - * creates a new patForms object and returns it; this method is made to be called statically - * to be able to create a new patForms object from anywhere. - * - * @access public - * @param array $formDefinition Optional form definition for elements that will be added to the form - * @param array $attributes The attributes to set for the form itself - * @return object patForms $form The new patForms object. - * @todo it should be possible to pass Rule definitions, so they can be loaded and added automatically. - */ - function &createForm( $formDefinition = null, $attributes = null ) - { - $form = &new patForms(); - - if ( $attributes != null ) - { - $form->setAttributes( $attributes ); - } - - if ( $formDefinition === null ) - return $form; - - foreach ( $formDefinition as $name => $element ) - { - if ( !isset( $element["filters"] ) ) - { - $element["filters"] = null; - } - if ( !isset( $element["children"] ) ) - { - $element["children"] = null; - } - - $el = &$form->createElement( $name, $element["type"], $element["attributes"], $element["filters"], $element["children"] ); - - if ( isset( $element["renderer"] ) ) { - $el->setRenderer( $element["renderer"] ); - } - - $result = $form->addElement( $el ); - if (patErrorManager::isError( $result )) { - return $result; - } - } - return $form; - } - - /** - * add a custom validation rule - * - * @access public - * @param object patForms_Rule validation rule - * @param integer time to apply rule (before or after built-in validation) - * @param boolean apply the rule, even if the form is invalid - * @param boolean should form get revalidated (not implemented yet) - * @return boolean currently always true - */ - function addRule( &$rule, $time = PATFORMS_RULE_AFTER_VALIDATION, $invalid = false, $revalidate = false ) - { - $rule->prepareRule( $this ); - - $this->_rules[] = array( - 'rule' => &$rule, - 'time' => $time, - 'invalid' => $invalid, - 'revalidate' => $revalidate - ); - } - - /** - * patForms PHP5 constructor - processes some intitialization tasks like merging the currently - * set static properties with the internal properties. - * - * @access public - */ - function __construct() - { - foreach ( $this->staticProperties as $staticProperty => $setMethod ) - { - $propValue = patForms::getStaticProperty( $staticProperty ); - if ( patErrorManager::isError( $propValue ) ) - continue; - - $this->$setMethod( $propValue ); - } - - // initialize patForms internal attribute collection - $this->loadAttributeDefaults(); - } - - /** - * patForms pre-PHP5 constructor - does nothing for the moment except being a wrapper - * for the PHP5 contructor for older PHP versions support. - * - * @access public - */ - function patForms() - { - patForms::__construct(); - } - - /** - * sets a renderer object that will be used to render - * the form. - * - * @access public - * @param object &$renderer The renderer object - * @return mixed $success True on success, patError object otherwise. - * @see createRenderer() - * @see renderForm() - */ - function setRenderer( &$renderer, $args = array() ) - { - if ( !is_object( $renderer ) ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_INVALID_RENDERER, - 'You can only set a patForms_Renderer object with the setRenderer() method, "'.gettype( $renderer ).'" given.' - ); - } - - $this->renderer = &$renderer; - - if ( isset( $args['includeElements'] ) && $args['includeElements'] === true ) - { - // check all elements - there may be some that need - // renderers too, so we give them the same renderer if - // they don't already have one. - $cnt = count( $this->elements ); - for ( $i = 0; $i < $cnt; $i++ ) - { - if ( $this->elements[$i]->usesRenderer && !is_object( $this->elements[$i]->renderer ) ) - { - $this->elements[$i]->setRenderer( $renderer ); - } - } - } - - return true; - } - - /** - * sets a storage container object that will be used to store data - * - * @access public - * @param object patForms_Storage - * @see createStorage() - */ - function setStorage( &$storage ) - { - if ( !is_object( $storage ) ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_INVALID_STORAGE, - 'You can only set a patForms_Storage object with the setStorage() method, "'.gettype( $storage ).'" given.' - ); - } - - $this->registerEventHandlerObject( $storage, - array( - 'onInit' => 'loadEntry', - 'onValidate' => 'validateEntry', - 'onSuccess' => 'storeEntry' - ) - ); - } - - /** - * renders the form with the renderer that was set via the {@link setRenderer()} - * method. - * - * WARNING: This is still in alpha state! - * - * Should this method return a reference?? - * The return value could contain large blocks of HTML or large arrays! - * Do we want to copy these? - * - * @access public - * @param mixed $args arguments that will be passed to the renderer - * @return mixed $form The rendered form, or false if failed. - */ - function renderForm( $args = null ) - { - if ( $this->renderer === null ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_NO_RENDERER_SET, - 'Form cannot be rendered, you have to set a renderer first via the setRenderer() method.' - ); - } - - // form is not submitted, or auto-validation is disabled => render it - if ( !$this->isSubmitted() || $this->autoValidate !== true ) - { - $this->triggerEvent( 'Init' ); - return $this->renderer->render( $this, $args ); - } - - $this->validateForm(); - - return $this->renderer->render( $this, $args ); - } - - /** - * Validates all elements of the form. - * - * @access public - * @param boolean Flag to indicate, whether form should be validated again, if it already has been validated. - * @return boolean True if all elements could be validated, false otherwise. - * @see finishForm() - */ - function validateForm( $revalidate = false ) - { - if ( $this->validated && !$revalidate ) - return $this->valid; - - $valid = true; - - /** - * validate custom rules - */ - if ( !$this->_applyRules( PATFORMS_RULE_BEFORE_VALIDATION ) ) - { - $valid = false; - } - - /** - * validate elements - */ - if ( $valid === true ) - { - $cnt = count( $this->elements ); - for ( $i = 0; $i < $cnt; ++$i ) - { - if ( !$this->elements[$i]->validate() ) - { - $valid = false; - } - } - } - - if ($valid === true) { - $result = $this->triggerEvent('Validate'); - if ($result === false) { - $valid = false; - } - } - - /** - * validate custom rules - */ - if ( !$this->_applyRules( PATFORMS_RULE_AFTER_VALIDATION, $valid ) ) - { - $valid = false; - } - - if ( $valid === true && $this->autoFinalize === true ) - $this->finalizeForm(); - - $this->valid = $valid; - - $this->validated = true; - - if ( $valid === true ) - { - $this->_announce( 'status', 'validated' ); - $event = 'Success'; - } - else - { - $this->_announce( 'status', 'error' ); - $event = 'Error'; - } - - $this->triggerEvent( $event ); - - return $this->valid; - } - - /** - * apply rules - * - * @access private - * @param integer time of validation - * @param boolean form is valid - * @return boolean rules are valid or not - * @todo add documentation - */ - function _applyRules( $time, $isValid = true ) - { - $valid = true; - - $cnt = count( $this->_rules ); - for ($i = 0; $i < $cnt; $i++) { - - // wrong time - if (( $this->_rules[$i]['time'] & $time ) != $time) { - continue; - } - if (!$isValid && !$this->_rules[$i]['invalid']) { - continue; - } - - $result = $this->_rules[$i]['rule']->applyRule( $this, PATFORMS_RULE_AFTER_VALIDATION ); - if ( $result === false ) { - $valid = false; - } - } - return $valid; - } - - /** - * Finalizes the form by telling each fom element to finalize - finalizing means to - * process any tasks that need to be done after the form has been validated, like - * deleting any temporary files or whatever an element needs to do at that point. - * - * @access public - * @return bool $success Wether all elements could be finalized - * @see validateForm() - */ - function finalizeForm() - { - $success = true; - - $cnt = count( $this->elements ); - for ( $i = 0; $i < $cnt; ++$i ) - { - if ( !$this->elements[$i]->finalize() ) - { - patErrorManager::raiseWarning( - PATFORMS_ERROR_ELEMENT_NOT_FINALIZED, - 'Element "'.$this->elements[$i]->elementName.'" could not be finalized. See the element error messages for more details.' - ); - - $success = false; - } - } - - return $success; - } - - /** - * creates a new renderer from the patForms renderer collection and returns it. - * - * @access public - * @param string The name of the renderer to create - have a look at the Renderer/ subfolder for a list of available renderers. - * @return object patForms_Renderer The renderer object, or error object - */ - function &createRenderer( $name ) - { - return patForms::_createModule( 'Renderer', $name ); - } - - /** - * creates a new storage container and returns it. - * - * @access public - * @param string The name of the storage to create - have a look at the Storage/ subfolder for a list of available storage containers. - * @return object patForms_Storage The storage container, or error object - */ - function &createStorage( $name ) - { - return patForms::_createModule( 'Storage', $name ); - } - - /** - * Creates a new filter and returns it. - * - * You may pass an array as second parameter that contains - * parameters for the filter. patForms will check for setter methods - * for all keys and set the corresponding values. - * - * This eases the creating of simple filter objects. - * - * @access public - * @param string The name of the filter to create - have a look at the Filter/ subfolder for a list of available filters. - * @param array Optional parameters for the filter, if you provide a parameter, make sure the filter implements a set[Paramname]() method. - * This will be automated with interceptors in the PHP5 version of patForms - * @return object patForms_Filter The filter, or error object - */ - function &createFilter( $name, $params = null ) - { - $filter = &patForms::_createModule( 'Filter', $name ); - - if ( !is_array( $params ) ) - { - return $filter; - } - - foreach ( $params as $param => $value ) - { - $setter = 'set' . ucfirst( $param ); - if ( method_exists( $filter, $setter ) ) - { - $filter->$setter( $value ); - } - } - return $filter; - } - - /** - * creates a new rule from the patForms rule collection and returns it. - * - * If your rules are not located in patForms/Rule you have to load and - * instantiate them on your own. - * - * @access public - * @param string The name of the rule to create - have a look at the Rule/ subfolder for a list of available rules. - * @param string The id of the rule, needed if the rule uses client side actions. - * @return object patForms_Rule The rule object, or error object - */ - function &createRule( $name, $id = null ) - { - $rule = &patForms::_createModule( 'Rule', $name ); - if ( $id != null ) - { - $rule->setId( $id ); - } - return $rule; - } - - /** - * creates a new observer from the patForms observer collection and returns it. - * - * If your observers are not located in patForms/Observer you have to load and - * instantiate them on your own. - * - * @access public - * @param string The name of the observer to create - have a look at the Observer/ subfolder for a list of available observers. - * @return object patForms_Observer The observer object, or error object - */ - function &createObserver( $name ) - { - $observer = &patForms::_createModule( 'Observer', $name ); - - return $observer; - } - - /** - * creates a new module for patForms - * - * @access private - * @param string $type type of the module. Possible values are 'Renderer', 'Rule' - * @param string $name The name of the renderer to create - have a look at the renderers/ subfolder for a list of available renderers. - * @return object $module The module object, or an error object - */ - function &_createModule( $type, $name ) - { - $baseFile = PATFORMS_INCLUDE_PATH . '/'.$type.'.php'; - $baseClass = 'patForms_'.$type; - - // if there is an underscore in the module name, we want - // to load the module from a subfolder, so we transform - // all underscores to slashes. - $pathName = $name; - if ( strstr( $pathName, '_' ) ) - { - $pathName = str_replace( '_', '/', $name ); - } - - $moduleFile = PATFORMS_INCLUDE_PATH . '/'.$type.'/'.$pathName.'.php'; - $moduleClass = 'patForms_'.$type.'_'.$name; - - if ( !class_exists( $baseClass ) ) - { - if ( !file_exists( $baseFile ) ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_NO_MODULE_BASE_FILE, - $type .' base file could not be found', - 'Tried to load base file in path "'.$baseFile.'"' - ); - } - - include_once $baseFile; - } - - if ( !class_exists( $moduleClass ) ) - { - if ( !file_exists( $moduleFile ) ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_MODULE_NOT_FOUND, - $type.' "'.$name.'" file "'.$moduleFile. '" could not be found.' - ); - } - - include_once $moduleFile; - } - - $module = &new $moduleClass(); - - return $module; - } - - /** - * adds an element to the form - has to be a patForms_Element object. Use the {@link createElement()} - * method to create a new element object. Also takes care of passing on the form's configuration - * including the mode, format and submitted flags to the element. - * - * @access public - * @param object &$element The patForms_Element object to add to this form. - * @return bool $success True if everything went well, false otherwise. - * @see patForms_Element - * @see createElement() - */ - function addElement( &$element ) - { - if ( !is_object( $element ) ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_ELEMENT_IS_NO_OBJECT, - 'The addElement() method expects an element object, "'.gettype( $element ).'" given.' - ); - } - - if ( patErrorManager::isError( $element ) ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_UNEXPECTED_ERROR, - 'The element you are trying to add is a patError object, and not a patForms element object.' - ); - } - - if ( !$element->getId() ) { - $element->setId( $this->getElementId() ); - } - $element->setMode( $this->getMode() ); - $element->setFormat( $this->getFormat() ); - $element->setSubmitted( $this->isSubmitted() ); - $element->setLocale( $this->getLocale() ); - - $this->elements[] =& $element; - - return true; - } - - /** - * replaces an element in the form - * - * @access public - * @param object $element The patForms_Element object to be replaced - * @param object &$replace The element that will replace the old element - * @return bool $success True if everything went well, false otherwise. - * @see patForms_Element - * @see addElement() - */ - function replaceElement( $element, &$replace ) - { - if ( !is_object( $replace ) ) { - return patErrorManager::raiseError( - PATFORMS_ERROR_ELEMENT_IS_NO_OBJECT, - 'The addElement() method expects an element object, "'.gettype( $replace ).'" given.' - ); - } - - if ( patErrorManager::isError( $replace ) ) { - return patErrorManager::raiseError( - PATFORMS_ERROR_UNEXPECTED_ERROR, - 'The element you are trying to add is a patError object, and not a patForms element object.' - ); - } - - if (is_object($element)) { - $element = $element->getId(); - } - - $cnt = count($this->elements); - for ($i = 0; $i < $cnt; $i++) { - if ($this->elements[$i]->getId() === $element) { - - if ( !$replace->getId() ) { - $replace->setId( $this->getElementId() ); - } - $replace->setMode( $this->getMode() ); - $replace->setFormat( $this->getFormat() ); - $replace->setSubmitted( $this->isSubmitted() ); - $replace->setLocale( $this->getLocale() ); - - $this->elements[$i] = &$replace; - return true; - } - - // the current element is a container - if (method_exists($this->elements[$i], 'replaceElement')) { - $result = $this->elements[$i]->replaceElement($element, $replace); - if ($result === true) { - return $result; - } - } - } - - return false; - } - - /** - * Get an element by its name. - * - * @access public - * @param string $name name of the element - * @return object patForms element - * @deprecated please use patForms::getElementByName() instead - */ - function &getElement( $name ) - { - return $this->getElementByName( $name ); - } - - /** - * Get an element by its name. - * - * @access public - * @param string $name name of the element - * @return mixed either a patForms element or an array containing patForms elements - * @see getElementById() - */ - function &getElementByName( $name ) - { - if ( $name == '__form' ) { - return $this; - } - - $elements = array(); - $cnt = count( $this->elements ); - for ($i = 0; $i < $cnt; $i++) { - if ($this->elements[$i]->getName() == $name) { - $elements[] = &$this->elements[$i]; - continue; - } - if (method_exists($this->elements[$i], 'getElementById')) { - patErrorManager::pushExpect(PATFORMS_ERROR_ELEMENT_NOT_FOUND); - $result = &$this->elements[$i]->getElementByName($name); - patErrorManager::popExpect(); - if (!patErrorManager::isError($result)) { - if (is_array($result)) { - $cnt2 = count( $result ); - for ($j = 0; $j < $cnt2; $j++) { - $elements[] = &$result[$j]; - } - } else { - $elements[] = &$result; - } - } - } - } - - switch( count( $elements ) ) - { - case 0: - return patErrorManager::raiseError( - PATFORMS_ERROR_ELEMENT_NOT_FOUND, - 'Element '.$name.' could not be found.' - ); - break; - case 1: - return $elements[0]; - break; - default: - return $elements; - break; - } - } - - /** - * Get an element by its id. - * - * @access public - * @param string $id id of the element - * @return object patForms element - */ - function &getElementById( $id ) - { - $cnt = count( $this->elements ); - for ( $i = 0; $i < $cnt; $i++ ) - { - if ( $this->elements[$i]->getId() == $id ) { - return $this->elements[$i]; - } - if (method_exists($this->elements[$i], 'getElementById')) { - patErrorManager::pushExpect(PATFORMS_ERROR_ELEMENT_NOT_FOUND); - $result = &$this->elements[$i]->getElementById($id); - patErrorManager::popExpect(); - if (!patErrorManager::isError($result)) { - return $result; - } - } - } - return patErrorManager::raiseError( - PATFORMS_ERROR_ELEMENT_NOT_FOUND, - 'Element '.$name.' could not be found.' - ); - } - - /** - * Get all elements of the form - * - * @access public - * @return array all elements of the form - */ - function &getElements() - { - return $this->elements; - } - - /** - * Creates a new form element and returns a reference to it. - * - * The optional $filters array has to be in the following format: - * - *

-	* array(
-	*       array(
-	*              'filter' => 'Multiplier',
-	*              'params' => array( 'multiplier' => 6 )
-	*            )
-	*	   )
-	* 
- * - * @access public - * @param string $name The name of the element - * @param string $type The type of the element; for a list of possible elements, have a look at the elements/ subfolder of the patForms package. - * @param array $attributes Attributes for the element - * @param array $filters Optional filters that will be applied - * @return object patForms_Element $element The element object, or patError if failed. - */ - function &createElement( $name, $type, $attributes, $filters = null, $children = null ) - { - $element =& patForms::_createModule( 'Element', $type ); - if ( patErrorManager::isError( $element ) ) - { - return $element; - } - - $attributes['name'] = $name; - if ( !isset( $attributes['id'] ) ) { - $attributes['id'] = $this->getElementId(); - } - - // add default attributes - do this the 'silent' way be checking whether - // the element supports the given attribute, as the element throws a notice - // if it does not support it - this is not expected from default attributes. - foreach ( patForms::getStaticProperty( 'defaultAttributes' ) as $attributeName => $attributeValue ) - { - if ( !$element->hasAttribute( $attributeName ) ) - { - continue; - } - - $element->setAttribute( $attributeName, $attributeValue ); - } - - // set the given attributes normally - $success = $element->setAttributes( $attributes ); - if ( patErrorManager::isError( $success ) ) - { - return $success; - } - - if (is_array($children)) { - foreach ($children as $child) { - $childName = $child['attributes']['name']; - - $childEl = &patForms::createElement($childName, $child['type'], $child['attributes']); - if ( isset( $child["renderer"] ) ) { - $childEl->setRenderer( $child["renderer"] ); - } - - $element->addElement($childEl); - } - } - - $success = $element->_init(); - if ( patErrorManager::isError( $success ) ) { - return $success; - } - - // if we don't have any filters to add, we're done - if ( !is_array( $filters ) ) - { - return $element; - } - - $cnt = count( $filters ); - for ( $i = 0; $i < $cnt; $i++ ) - { - $params = isset( $filters[$i]['params'] ) ? $filters[$i]['params'] : null; - $filter = &patForms::createFilter( $filters[$i]['filter'], $params ); - if ( patErrorManager::isError( $filter ) ) - { - continue; - } - $element->applyFilter( $filter ); - } - - return $element; - } - - /** - * retrieves the validation errors from all elements in the form. Use this if the validateForm() - * method returned false. - * - * @access public - * q - * @return array $errors Array containing an array with validation errors for each element in the form. - * @todo replace __form with the name of the form, once attributes are implemented - */ - function getValidationErrors($withElements = true) - { - $found = false; - $errors = array(); - - if ( !empty( $this->validationErrors ) ) - { - $errors['__form'] = $this->validationErrors; - $found = true; - } - - if ($withElements === false) { - return $errors; - } - - $cnt = count( $this->elements ); - for ( $i = 0; $i < $cnt; ++$i ) - { - $name = $this->elements[$i]->getAttribute( 'name' ); - if ( $name === false ) - { - continue; - } - - $elementErrors = $this->elements[$i]->getValidationErrors(); - - if ( empty( $elementErrors ) ) - continue; - - $errors[$name] = $elementErrors; - $found = true; - } - - if ( $found ) - return $errors; - - return false; - } - - /** - * retrieves the values for all elements in the form. - * - * @access public - * @param array desired fields - * @param integer Mode that should be used to return values in groups - * @return array The values for all elements, as elementname => elementvalue. - * - * @todo remove the ugly Group check and replace with something better - * @todo implement something similar for getValidation errors - */ - function getValues( $fields = null, $type = PATFORMS_VALUES_NESTED ) - { - $values = array(); - - $cnt = count( $this->elements ); - for ( $i = 0; $i < $cnt; ++$i ) - { - $name = $this->elements[$i]->getAttribute( 'name' ); - if ( $name === false ) { - continue; - } - - if ( is_array( $fields ) && !in_array( $name, $fields ) ) { - continue; - } - - $tmpVal = $this->elements[$i]->getValue(); - if (!is_array($tmpVal) || $this->elements[$i]->elementName != 'Group') { - $values[$name] = $tmpVal; - continue; - } - - switch ($type) { - case PATFORMS_VALUES_FLATTENED: - $values = array_merge($values, $tmpVal); - break; - case PATFORMS_VALUES_PREFIXED: - foreach ($tmpVal as $key => $val) { - $values[$name.'_'.$key] = $val; - } - break; - case PATFORMS_VALUES_NESTED: - default: - $values[$name] = $tmpVal; - break; - - } - } - return $values; - } - - /** - * sets the values for all elements in the form. Use this to fill your form with external - * data, like a db query. Caution: if you do this and set the form to submitted, the values - * will be overwritten by any values present in the $_GET or $_POST variables. - * - * @access public - * @param array $values The values for all elements, as elementname => elementvalue. - */ - function setValues( $values, $overrideUserInput = false ) - { - patErrorManager::pushExpect(PATFORMS_ERROR_ELEMENT_NOT_FOUND); - foreach ($values as $elName => $value) { - $el = &$this->getElementByName($elName); - if (patErrorManager::isError($el)) { - continue; - } - if ($overrideUserInput === true) { - $el->setValue($value); - } else { - $el->setDefaultValue($value); - } - } - patErrorManager::popExpect(); - return true; - } - - /** - * retrieves the current mode of the form - * - * @access public - * @return string $mode The current form mode - * @see setMode() - * @see $mode - */ - function getMode() - { - return $this->mode; - } - - /** - * returns the locale that is currently set for the form. - * - * @access public - * @return string $locale The locale. - * @see setLocale() - * @see $locale - */ - function getLocale() - { - return $this->locale; - } - - /** - * retrieves the current format of the form - * - * @access public - * @return string $format The current form format - * @see setFormat() - * @see format - */ - function getFormat() - { - return $this->format; - } - - /** - * retrieves the current method of the form - * - * @access public - * @return string $method The request method - * @see setMethod() - */ - function getMethod() - { - return $this->getAttribute( 'method' ); - } - - /** - * retrieves the current action of the form - * - * @access public - * @return string $action Action of the form - * @see setAction() - */ - function getAction() - { - $action = $this->getAttribute( 'action' ); - if ( !empty( $action ) ) - return $action; - return $_SERVER['PHP_SELF']; - } - - /** - * adds an atribute to the form's attribute collection. If the attribute - * already exists, it is overwritten. - * - * @access public - * @param string $attributeName The name of the attribute to add - * @param string $atributeValue The value of the attribute - */ - function setAttribute( $attributeName, $attributeValue ) - { - if ( !isset( $this->attributeDefinition[$attributeName] ) ) - { - patErrorManager::raiseNotice( - PATFORMS_NOTICE_ATTRIBUTE_NOT_SUPPORTED, - "The attribute '".$attributeName."' is not supported by the form, skipped it. [".get_class( $this )."]" - ); - return true; - } - - $this->attributes[$attributeName] = $attributeValue; - - return true; - } - - /** - * adds several attributes at once to the form's attribute collection. - * Any existing attributes will be overwritten. - * - * @access public - * @param array $attributes The attributes to add - * @see setAttribute() - */ - function setAttributes( $attributes ) - { - if ( !is_array( $attributes ) ) - { - return patErrorManager::raiseError( - PATFORMS_NOTICE_ARRAY_EXPECTED, - "setAttributes: array expected" - ); - } - - foreach ( $attributes as $attributeName => $attributeValue ) - { - $this->setAttribute( $attributeName, $attributeValue ); - } - - return true; - } - - /** - * retrieves the value of a form attribute. - * - * @access public - * @param string $attribute The name of the attribute to retrieve - * @return mixed $attributeValue The value of the attribute, or false if it does not exist in the attributes collection. - * @see setAttribute() - */ - function getAttribute( $attribute ) - { - if ( !isset( $this->attributes[$attribute] ) ) - { - return false; - } - - return $this->attributes[$attribute]; - } - - /** - * retrieves all attributes of the form, or only the specified attributes. - * - * @access public - * @param array $attributes Optional: The names of the attributes to retrieve. Only the attributes that exist will be returned. - * @return array $result The attributes - * @see getAttribute() - */ - function getAttributes( $attributes = array() ) - { - if ( empty( $attributes ) ) - { - return $this->attributes; - } - - $result = array(); - foreach ( $attributes as $attribute ) - { - if ( $attributeValue = $this->getAttribute( $attribute ) ) - { - $result[$attribute] = $attributeValue; - } - } - - return $result; - } - - /** - * Loads the default attribute values into the attributes collection. Done directly - * on startup (in the consructor). - * - * The action defaults to the path of the current script, with session - * ID appended automatically, if SID has been defined. - * - * @access public - * @return bool $success Always returns true. - * @see $attributeDefaults - */ - function loadAttributeDefaults() - { - foreach ( $this->attributeDefinition as $attributeName => $attributeDef ) - { - if ( isset( $attributeDef['default'] ) ) - { - $this->attributes[$attributeName] = $attributeDef['default']; - } - - if ( $attributeName == 'action' ) - { - $this->attributes[$attributeName] = $_SERVER['PHP_SELF']; - /** - * session has been started, append session ID - */ - if ( defined( 'SID' ) ) - $this->attributes[$attributeName] .= '?' . SID; - } - } - - return true; - } - - /** - * retrieves the form's current submitted state. - * - * If autoValidate is used, it will check for the submitVar and - * set the submitted flag accordingly - * - * @access public - * @return bool $state True if it has been submitted, false otherwise. - * @see setSubmitted(), setAutoValidate() - * @see submitted - */ - function isSubmitted() - { - if ( $this->submitted === true ) - { - return true; - } - - if ( !isset( $this->submitVar ) ) - { - return false; - } - - if ( !$this->autoValidate ) - { - return false; - } - - if ( isset( $_GET[$this->submitVar] ) || isset( $_POST[$this->submitVar] ) ) - { - $this->setSubmitted( true ); - } - - return $this->submitted; - } - - /** - * Creates a new patForms_Creator object - * - * @static - * @access public - * @return object $creator The creator object, or a patError object on failure - */ - function createCreator( $type ) - { - return patForms::_createModule( 'Creator', $type ); - } - - /** - * get the element name of the form - * - * @access public - * @return string name of the form - */ - function getElementName() - { - return $this->elementName; - } - - /** - * get next error offset - * - * @access public - * @return integer - */ - function getErrorOffset( $requiredCodes = 100 ) - { - $offset = $this->nextErrorOffset; - $this->nextErrorOffset = $this->nextErrorOffset + $requiredCodes; - return $offset; - } - - /** - * add error codes and messages for validator method - * - * @access public - * @param array defintions - * @param integer offset for the error codes - */ - function addValidatorErrorCodes( $defs, $offset = 1000 ) - { - foreach ( $defs as $lang => $codes ) - { - if ( !isset( $this->validatorErrorCodes[$lang] ) ) - { - $this->validatorErrorCodes[$lang] = array(); - } - - foreach ( $codes as $code => $message ) - { - $this->validatorErrorCodes[$lang][($offset+$code)] = $message; - } - } - } - - /** - * add a validation error to the whole form - * - * This can be achieved by adding a validation rule to the form. - * - * @access public - * @param integer $code - * @param array $vars fill named placeholder with values - * @return boolean $result true on success - * @see addRule() - */ - function addValidationError( $code, $vars = array() ) - { - $error = false; - $lang = $this->locale; - $element = $this->getElementName(); - - // find error message for selected language - while ( true ) - { - // error message matches language code - if ( isset( $this->validatorErrorCodes[$lang][$code] ) ) - { - $error = array( "element" => $element, "code" => $code, "message" => $this->validatorErrorCodes[$lang][$code] ); - break; - } - // no message found and no fallback-langauage available - else if ( $lang == "C" ) - { - break; - } - - $lang_old = $lang; - - // look for other languages - if ( strlen( $lang ) > 5 ) - { - list( $lang, $trash ) = explode( ".", $lang ); - } - else if ( strlen( $lang ) > 2 ) - { - list( $lang, $trash ) = explode( "_", $lang ); - } - else - { - $lang = "C"; - } - - // inform developer about missing language - patErrorManager::raiseNotice( - PATFORMS_NOTICE_VALIDATOR_ERROR_LOCALE_UNDEFINED, - "Required Validation Error-Code for language: $lang_old not available. Now trying language: $lang", - "Add language definition in used element or choose other language" - ); - - } - - // get default Error! - if ( !$error ) - { - patErrorManager::raiseWarning( - PATFORMS_WARNING_VALIDATOR_ERROR_UNDEFINED, - "No Error Message for this validation Error was defined", - "Review the error-definition for validation-errors in your element '$element'." - ); - $error = array( "element" => $element, "code" => 0, "message" => "Unknown validation Error" ); - } - - // insert values to placeholders - if ( !empty( $vars ) ) - { - foreach ( $vars as $key => $value ) - { - $error["message"] = str_replace( "[". strtoupper( $key ) ."]", $value, $error["message"] ); - } - } - - array_push( $this->validationErrors, $error ); - $this->valid = false; - return true; - } - - /** - * retreives a new element id, used to give each added element a unique id for this - * form (id can be overwritten by setting the id attribute specifically). - * - * @access private - * @return int $elementId The new element id. - */ - function getElementId() - { - $this->elementCounter++; - return 'pfo'.$this->elementCounter; - } - - /** - * attach an observer - * - * @access public - * @param object patForms_Observer - * @see createObserver() - * @uses patForms_Element::createObserver() - */ - function attachObserver( &$observer, $where = PATFORMS_OBSERVER_ATTACH_TO_ELEMENTS ) - { - /** - * attach the observer to all elements - */ - if ( ( $where & PATFORMS_OBSERVER_ATTACH_TO_ELEMENTS ) == PATFORMS_OBSERVER_ATTACH_TO_ELEMENTS ) - { - $cnt = count( $this->elements ); - for ( $i = 0; $i < $cnt; ++$i ) - { - $this->elements[$i]->attachObserver( $observer ); - } - } - - /** - * attach the observer to the form - */ - if ( ( $where & PATFORMS_OBSERVER_ATTACH_TO_FORM ) == PATFORMS_OBSERVER_ATTACH_TO_FORM ) - { - $this->observers[] = &$observer; - } - return true; - } - - /** - * Retrieve the content for the start of the form, including any - * additional content, e.g. global scripts if the scripts option - * is enabled. - * - * @access public - * @return string $formStart The form start content - * @todo use format to build a dynamic method - */ - function serializeStart() - { - $methodName = "serializeStart".ucfirst( $this->getFormat() ).ucfirst( $this->getMode() ); - - if ( !method_exists( $this, $methodName ) ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_METHOD_FOR_MODE_NOT_AVAILABLE, - "Method for patForms mode '".$this->getMode()."' (".$methodName.") is not available." - ); - } - - return $this->$methodName(); - } - - /** - * Serializes the form's start element for html format, in default mode. - * - * @access private - * @return mixed $formStart The serialized start content, or a patError object. - */ - function serializeStartHtmlDefault() - { - $attributes = $this->getAttributesFor( $this->format ); - if ( patErrorManager::isError( $attributes ) ) - { - return $attributes; - } - - $content = patForms_Element::createTag( 'form', 'opening', $attributes ); - - if ( $this->optionEnabled( 'scripts' ) ) - { - $content .= $this->getScripts(); - } - - return $content; - } - - /** - * Serializes the form's start element for html format, in readonly mode. - * - * @access private - * @return mixed $formStart The serialized start content, or a patError object. - */ - function serializeStartHtmlReadonly() - { - $attributes = $this->getAttributesFor( $this->format ); - if ( patErrorManager::isError( $attributes ) ) - { - return $attributes; - } - - return patForms_Element::createTag( 'form', 'opening', $attributes ); - } - - /** - * Retrieve the content for the end of the form. - * - * @access public - * @return string $formEnd The form end content - */ - function serializeEnd() - { - $methodName = "serializeEnd".ucfirst( $this->getFormat() ).ucfirst( $this->getMode() ); - - if ( !method_exists( $this, $methodName ) ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_METHOD_FOR_MODE_NOT_AVAILABLE, - "Method for patForms mode '".$this->getMode()."' (".$methodName.") is not available." - ); - } - - return $this->$methodName(); - } - - /** - * Retrieves the content for the end of the form for html format, - * in default mode. - * - * @access private - * @return string $formEnd The form end content - */ - function serializeEndHtmlDefault() - { - return patForms_Element::createTag( 'form', 'closing' ); - } - - /** - * Retrieves the content for the end of the form for html format, - * in readonly mode. - * - * @access private - * @return string $formEnd The form end content - */ - function serializeEndHtmlReadonly() - { - return $this->serializeEndHtmlDefault(); - } - - /** - * validates the current attribute collection according to the attributes definition - * and the given output format, and returns the list of valid attributes. - * - * @access private - * @param string $format The output format to retrieve the attributes for. - * @return mixed $attributes The list of attributes, or false if failed. - */ - function getAttributesFor( $format ) - { - $attributes = array(); - - foreach ( $this->attributeDefinition as $attributeName => $attributeDef ) - { - if ( !isset( $this->attributes[$attributeName] ) ) - { - if ( $attributeDef["required"] ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_ATTRIBUTE_REQUIRED, - 'patForms needs the attribute "'.$attributeName.'" to be set.', - 'See the patForms attribute definition of patForms for a complete attribute reference.' - ); - } - - continue; - } - - $attributeValue = $this->attributes[$attributeName]; - - if ( !in_array( $format, $attributeDef["outputFormats"] ) ) - { - continue; - } - - if ( isset( $attributeDef["format"] ) ) - { - if ( !$this->_checkAttributeFormat( $attributeValue, $attributeDef["format"] ) ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_CAN_NOT_VERIFY_FORMAT, - "Format '".$attributeDef["format"]."' could not be verified for patForms attribute '".$attributeName."' => '".$attributeValue."'" - ); - } - } - - $attributes[$attributeName] = $attributeValue; - } - - return $attributes; - } - - /** - * checks the format of an attribute value according to the given format. - * - * @access private - * @param mixed $attributeValue The attribute value to check - * @param string $format The format to check the attribute value against - * @return bool $result True if format check succeeded, false otherwise. - * @see createAttributes() - * @todo Implement this method sometime - */ - function _checkAttributeFormat( $attributeValue, $format ) - { - return true; - } - - /** - * Enables a patForms option. - * - * See the {@link $options} property for an exhaustive list of available options. - * - * @access public - * @param string $option The option to enable - * @param array $params Optional parameters for the option - * @return mixed $result True on success, patError object otherwise. - * @see disableOption() - * @see optionEnabled() - * @see $options - */ - function enableOption( $option, $params = array() ) - { - if ( !in_array( $option, array_keys( $this->options ) ) ) - { - return patErrorManager::raiseNotice( - PATFORMS_NOTICE_INVALID_OPTION, - 'The option "'.$option.'" is not a valid patForms option.' - ); - } - - $this->options[$option]['enabled'] = true; - $this->options[$option]['params'] = $params; - - // now update all available elements too - $cnt = count( $this->elements ); - for ( $i=0; $i < $cnt; $i++ ) - { - $this->elements[$i]->enableOption( $option, $params ); - } - - return true; - } - - /** - * Disables a patForms option - * - * See the {@link $options} property for an exhaustive list of available options. - * - * @access public - * @param string $option The option to disable - * @return mixed $result True on success, patError object otherwise. - * @see enableOption() - * @see optionEnabled() - * @see $options - */ - function disableOption( $option ) - { - if ( !in_array( $option, array_keys( $this->options ) ) ) - { - return patErrorManager::raiseNotice( - PATFORMS_NOTICE_INVALID_OPTION, - 'The option "'.$option.'" is not a valid patForms option.' - ); - } - - $this->options[$option]['enabled'] = false; - - // now update all available elements too - $cnt = count( $this->elements ); - for ( $i=0; $i < $cnt; $i++ ) - { - $this->elements[$i]->disableOption( $option ); - } - - return true; - } - - /** - * Checks whether the given option is enabled. - * - * @access public - * @param string $option The option to check - * @return bool $enabled True if enabled, false otherwise. - * @see enableOption() - * @see disableOption() - * @see $options - */ - function optionEnabled( $option ) - { - if ( !isset( $this->options[$option] ) ) - return false; - - return $this->options[$option]['enabled']; - } - - /** - * Set the form to auto validate - * - * If you use this method, patForms will check the _GET and _POST variables - * for the variable you specified. If it is set, patForms assumes, that - * the form has been submitted. - * - * When creating a start tag for the form, the value will be inserted automatically. - * - * @access public - * @param string $submitVar - */ - function setAutoValidate( $submitVar ) - { - $this->autoValidate = true; - $this->submitVar = $submitVar; - } - - /** - * register a new event - * - * After registering an event, you may register one or more - * event handlers for this event an then trigger the event. - * - * This lets you extend the functionality of patForms. - * - * @access public - * @param string event name - * @return boolean true, if event could be registered - * @see registerEventHandler() - * @see triggerEvent() - */ - function registerEvent( $name ) - { - $event = 'on' . $name; - if ( in_array( $event, $this->_validEvents ) ) - { - return patErrorManager::raiseNotice( - PATFORMS_NOTICE_EVENT_ALREADY_REGISTERED, - 'Event "'.$event.'" already has been registered or is built-in event' - ); - } - array_push( $this->_validEvents, $event ); - return true; - } - - /** - * Register an event handler - * - * An event handler can be any valid PHP callback. You may pass - * one of the following values: - * - string functionname to call a globally declared function - * - array( string classname, string methodname) to call a static method - * - array( object obj, string methodname) to call a method of an object - * - * When the handler is called, two parameters will be passed: - * - object form : a patForms object - * - string event : the name of the event has should be handled. - * - * An event handler should always return true. If false is returned, - * the event will be cancelled. - * - * Currently handlers for the following events can be registered: - * - onSubmit - * - onSuccess - * - onError - * - * @access public - * @param string event name - * @param mixed event handler - * @return boolean true, if the handler could be registered - * @see triggerEvent() - * @see $_validEvents - */ - function registerEventHandler( $event, $handler ) - { - if ( !in_array( $event, $this->_validEvents ) ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_UNKNOWN_EVENT, - 'Cannot register event handler for unknown event "' . $event .'".' - ); - } - - if ( !is_callable( $handler ) ) - { - return patErrorManager::raiseError( - PATFORMS_ERROR_INVALID_HANDLER, - 'Event handler is not callable.' - ); - } - - if ( !isset( $this->_eventHandler[$event] ) ) - { - $this->_eventHandler[$event] = array(); - } - - $this->_eventHandler[$event][] = &$handler; - return true; - } - - /** - * set event handler object. - * - * An event handler object is used to handle all - * registered events. The object has to provide methods - * for all events it should handle, the names of the methods - * have to be the same as the names of the events. - * - * @access public - * @param object event handler object - * @param array method names, used to change the names of the methods - * @return boolean - */ - function registerEventHandlerObject( &$obj, $methods = array() ) - { - if ( empty( $methods ) ) - { - foreach ( $this->_validEvents as $event ) - { - if ( !method_exists( $obj, $event ) ) - continue; - - $methods[$event] = $event; - } - } - - foreach ( $methods as $event => $method ) - { - if ( !isset( $this->_eventHandler[$event] ) ) - { - $this->_eventHandler[$event] = array(); - } - - $this->_eventHandler[$event][] = array( &$obj, $method ); - } - - return true; - } - - /** - * Trigger an event - * - * In most cases there's no need to call this event - * from outside the class. The method is declared public - * to allow you to trigger custom events. - * - * @access public - * @param string Event name. The event name must not contain 'on', as this will be - * prefixed automatically. - */ - function triggerEvent( $event ) - { - $handlerName = 'on' . $event; - - if ( !isset( $this->_eventHandler[$handlerName] ) || empty( $this->_eventHandler[$handlerName] ) ) - { - return true; - } - - $cnt = count( $this->_eventHandler[$handlerName] ); - for ( $i = 0; $i < $cnt; $i++ ) - { - $result = call_user_func( $this->_eventHandler[$handlerName][$i], $this, $event ); - if ( $result == false ) - { - return $result; - } - } - return true; - } - - /** - * Serializes the entire form to XML, all elements included - * - * @access public - * @param string $namespace Optional namespace to use for the tags - * @return string $xml The XML representation of the form - * @see patForms_Element::toXML() - * @todo needs patForms_Element, maybe switch to PEAR::XML_Util - */ - function toXML( $namespace = null ) - { - $tagName = 'Form'; - - // prepend Namespace - if ( $namespace != null ) - { - $tagName = $namespace.':'.$tagName; - } - - // get all attributes - $attributes = $this->getAttributes(); - - // create valid XML attributes - foreach ( $attributes as $key => $value ) - { - $attributes[$key] = strtr( $value, $this->xmlEntities ); - } - - $elements = ''; - for ( $i = 0; $i < $this->elementCounter; $i++ ) - { - $elements .= $this->elements[$i]->toXML( $namespace ); - } - - return patForms_Element::createTag( $tagName, "full", $attributes, $elements ); - } - - /** - * Set a static property. - * - * Static properties are stored in an array in a global variable, - * until PHP5 is ready to use. - * - * @static - * @param string property name - * @param mixed property value - * @see getStaticProperty() - */ - function setStaticProperty( $property, &$value ) - { - $GLOBALS["_patForms"][$property] = &$value; - } - - /** - * Get a static property. - * - * Static properties are stored in an array in a global variable, - * until PHP5 is ready to use. - * - * @static - * @param string property name - * @return mixed property value - * @see setStaticProperty() - */ - function &getStaticProperty( $property ) - { - if ( isset( $GLOBALS["_patForms"][$property] ) ) - { - return $GLOBALS["_patForms"][$property]; - } - return patErrorManager::raiseWarning( - PATFORMS_ERROR_NO_STATIC_PROPERTY, - 'Static property "'.$property.'" could not be retreived, it does not exist.' - ); - } - - /** - * Retrieves the form's name - * - * If no name is set, it will use 'patForms' as name. - * - * @access public - * @return string $name The name of the form. - */ - function getName() - { - if ( isset( $this->attributes['name'] ) ) - return $this->attributes['name']; - return 'patForms'; - } - - /** - * get the javascript for the form - * - * This is still in alpha state. It will later - * allow client side validation if the element - * provides this feature. - * - * @access public - * @return string javascript needed by the form - * @todo make this dependent on the format - * @todo add changeable linebreaks - */ - function getScripts() - { - foreach ($this->elements as $element) { - $element->registerJavascripts($this); - } - - $globalJavascript = implode ("", $this->javascripts['global']); - $instances = implode ("", $this->javascripts['instance']); - - $script = ''; - - return $script; - - /* - $globalJavascript = ''; - $instances = ''; - - $displayedTypes = array(); - - $cnt = count( $this->elements ); - for ( $i = 0; $i < $cnt; ++$i ) - { - $instances .= $this->elements[$i]->getInstanceJavascript(); - - $type = $this->elements[$i]->getElementName(); - if ( in_array( $type, $displayedTypes ) ) - continue; - - array_push( $displayedTypes, $type ); - $globalJavascript .= $this->elements[$i]->getGlobalJavascript(); - } - - $cnt = count( $this->_rules ); - for ( $i = 0; $i < $cnt; ++$i ) - { - $instances .= $this->_rules[$i]['rule']->getInstanceJavascript(); - - - $type = $this->_rules[$i]['rule']->getRuleName(); - if ( in_array( $type, $displayedTypes ) ) - continue; - - array_push( $displayedTypes, $type ); - - $globalJavascript .= $this->_rules[$i]['rule']->getGlobalJavascript(); - } - - $script = ''; - - return $script; - */ - } - - private $javascripts = array( - 'global' => array(), - 'instance' => array() - ); - - function registerGlobalJavascript($type, $script) { - - $this->javascripts['global'][$type] = $script; - } - - function registerInstanceJavascript($script) { - - $this->javascripts['instance'][] = $script; - } - - /** - * anounce a change in the element to all observers - * - * @access private - * @param string property that changed - * @param mixed new value of the property - */ - function _announce( $property, $value ) - { - $cnt = count( $this->observers ); - for ( $i = 0; $i < $cnt; $i++ ) - { - $this->observers[$i]->notify( $this, $property, $value ); - } - return true; - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Creator/Definition.php b/airtime_mvc/library/propel/contrib/pat/patForms/Creator/Definition.php deleted file mode 100644 index c2ecb4a967..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Creator/Definition.php +++ /dev/null @@ -1,42 +0,0 @@ - $definition->name - )); - - foreach ($definition->elements as $el) { - $element = &$form->createElement($el['name'], $el['type'], null); - if (!empty($el['attributes']['datasource'])) { - $ds = $el['attributes']['datasource']; - unset($el['attributes']['datasource']); - $element->setDatasource(new $ds['name']($ds)); - } - // patForms will choke when we try to set attributes that - // don't exist for an element type. So we'll have to ask. - foreach ($el['attributes'] as $name => $value) { - if ($element->hasAttribute($name)) { - $element->setAttribute($name, $value); - } - } - if (isset($el['rules'])) { - foreach ($el['rules'] as $rule) { - $element->addRule(new $rule['type']($rule)); - } - } - $form->addElement($element); - } - if (!is_null($object)) { - $form->setValues($object->toArray()); - } - if ($definition->autoValidate) { - $form->setAutoValidate($definition->autoValidate); - } - - return $form; - } - -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Creator/Propel.php b/airtime_mvc/library/propel/contrib/pat/patForms/Creator/Propel.php deleted file mode 100644 index 61876da98d..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Creator/Propel.php +++ /dev/null @@ -1,132 +0,0 @@ - - * @license LGPL, see license.txt for details - * @link http://www.php-tools.net - */ -class patForms_Creator_Propel extends patForms_Creator -{ - private static $creoleTypeMapping = array( - CreoleTypes::BOOLEAN =>'Radio', // BOOLEAN = 1; - CreoleTypes::BIGINT =>'String', // BIGINT = 2; - CreoleTypes::SMALLINT =>'String', // SMALLINT = 3; - CreoleTypes::TINYINT =>'String', // TINYINT = 4; - CreoleTypes::INTEGER =>'String', // INTEGER = 5; - CreoleTypes::CHAR =>'String', // CHAR = 6; - CreoleTypes::VARCHAR =>'String', // VARCHAR = 7; - CreoleTypes::FLOAT =>'String', // FLOAT = 8; - CreoleTypes::DOUBLE =>'String', // DOUBLE = 9; - CreoleTypes::DATE =>'Date', // DATE = 10; - CreoleTypes::TIME =>'String', // TIME = 11; - CreoleTypes::TIMESTAMP =>'Date', // TIMESTAMP = 12; - CreoleTypes::VARBINARY =>'String', // VARBINARY = 13; - CreoleTypes::NUMERIC =>'String', // NUMERIC = 14; - CreoleTypes::BLOB =>'String', // BLOB = 15; - CreoleTypes::CLOB =>'String', // CLOB = 16; - CreoleTypes::TEXT =>'Text', // TEXT = 17; - CreoleTypes::LONGVARCHAR =>'Text', // LONGVARCHAR = 17; - CreoleTypes::DECIMAL =>'String', // DECIMAL = 18; - CreoleTypes::REAL =>'String', // REAL = 19; - CreoleTypes::BINARY =>'String', // BINARY = 20; - CreoleTypes::LONGVARBINARY =>'String', // LONGVARBINARY = 21; - CreoleTypes::YEAR =>'String', // YEAR = 22; - CreoleTypes::ARR =>'String', - CreoleTypes::OTHER =>'String' - ); - - /** - * Create a form from a propel instance - * - * @access public - * @param mixed $object An instance of a Propel object - * @param array $options Any options the creator may need - * @return object $form The patForms object, or a patError object on failure. - */ - function &create( $object, $options = array() ) - { - // Propel stuff - $propel_peer = $object->getPeer(); - $propel_mapBuilder = $propel_peer->getMapBuilder(); // Not sure if we're gonna need this one - $propel_tablename = constant(get_class($propel_peer) . '::TABLE_NAME'); - $propel_tableMap = $propel_mapBuilder->getDatabaseMap()->getTable($propel_tablename); - - // The form - $form =& patForms::createForm( null, array( 'name' => 'patForms_Creator_Form' ) ); - - $propel_cols = $propel_tableMap->getColumns(); - foreach ($propel_cols as $propel_colname => $propel_col) { - - // phpName can be altered by editing the schema.xml, - // thus I think, we should lowercase()/ucfirst() this - $propel_colname = strtolower($propel_colname); - $el_displayname = ucFirst($propel_colname); - // this could be omitted of course, but I think, it's a - // convenient way to get more safe request properties - $el_name = $propel_tablename . '[' . $propel_colname . ']'; - - $el_attr = array( - 'edit' => 'yes', - 'title' => $el_displayname, - 'label' => $el_displayname, - 'name' => $el_name, - 'description' => $el_displayname - ); - - //// Obsolete ? - // Parse column info to element type info - //$type_info = $this->parseTypeInfoFromColumn($propel_col); - // Merge extra element attributes - //$el_attr = array_merge( $el_attr, $type_info['attributes'] ); - - // Is the element required ? Can we retrieve this info from the Column object ? - $el_attr['required'] = 'yes'; - // Value: for now we use default to set the value. Is there a better (more correct) way to do this ? - $el_attr['default'] = $object->{'get'.$propel_col->getPhpName()}(); - - if ($propel_col->isPrimaryKey()) { - $el_type = 'hidden'; - } else { - $el_type = self::$creoleTypeMapping[$propel_col->getCreoleType()]; - } - - $el = &$form->createElement($el_name, $el_type, null); - // patForms will choke when we try to set attributes - // that don't match the element type. So we'll ask. - foreach ($el_attr as $name => $value) { - if ($el->hasAttribute($name)) { - $el->setAttribute($name, $value); - } - } - $form->addElement($el); - } - - return $form; - } - - // Seems this function will become obsolete if we use the static $creoleTypeMapping - function parseTypeInfoFromColumn ( $column ) { - - return array( - 'type' => 'String', - 'attributes' => array() - ); - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Creator/_propel_creator_test.php b/airtime_mvc/library/propel/contrib/pat/patForms/Creator/_propel_creator_test.php deleted file mode 100644 index 33f108ed7f..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Creator/_propel_creator_test.php +++ /dev/null @@ -1,201 +0,0 @@ - - * @license LGPL, see license.txt for details - * @link http://www.php-tools.net - */ - - /** - * Main examples prepend file, needed *only* for the examples framework! - */ - //include_once 'patExampleGen/prepend.php'; - //$exampleGen->displayHead( 'Example' ); - - include('include/common.php'); - - // EXAMPLE START ------------------------------------------------------ - - /** - * main patForms class - */ - require_once ('patForms.php'); - - /** - * patErrorManager class - */ - require_once ('patErrorManager.php'); - - - // create the creator :) - $creator = &patForms::createCreator( 'Propel' ); - - // create the form object from the given propel Object class instance - - require_once('model/general/UserProfile.php'); - $userProfile = UserProfilePeer::retrieveByPK(1); - $form =& $creator->create( $userProfile ); - - //$wikipage = WikipagePeer::retrieveByPK('wiki'); - //$form =& $creator->create($wikipage); - - // create the needed renderer - $renderer =& patForms::createRenderer( "Array" ); - - // set the renderer - $form->setRenderer( $renderer ); - - // use auto-validation - $form->setAutoValidate( 'save' ); - - // serialize the elements - $elements = $form->renderForm(); - - - // ERROR DISPLAY ------------------------------------------------------ - if ( $form->isSubmitted() ) - { - displayErrors( $form ); // see patExampleGen/customFunctions.php - } - - // DISPLAY FORM ------------------------------------------------------ - displayForm( $form, $elements ); // see patExampleGen/customFunctions.php - - /** - * Takes a patForms object, asks it if there are any validation - * errors and displays them if need be. - * - * NOTE: this is just a helper method for our examples collection, - * so that you may concentrate on the relevant parts of the examples. - * It does in no way represent the way it should be done :) - * - * @access public - * @param object &$form The patForms object to use - */ - function displayErrors( &$form ) - { - // get the errors from the form object - if there are none, - // this returns false so it is easy to check if there are any. - $errors = $form->getValidationErrors(); - - // if there are any errors, display them. - if ( $errors ) - { - echo '
'; - echo '
Validation failed
'; - echo '
'; - - // the errors collection is an associative array with the - // field names as keys, so we go through that. - foreach ( $errors as $elementName => $elementErrors ) - { - $element =& $form->getElementByName( $elementName ); - - // each element can have more than one error - this - // is rare, but can happen so this is an indexed array - // with one error in each row. - foreach ( $elementErrors as $row => $error ) - { - echo '
'; - echo ' '.$element->getAttribute( 'label' ).': '.$error['message'].'('.$error['element'].' element error #'.$error['code'].')
'; - echo '
'; - } - } - - echo '
'; - echo '
'; - } - // no errors, tell the world everything is fine - else - { - - echo '
Validation successful.
'; - } - } - - - /** - * Displays a standard form from the examples collection when the - * form is rendered via the array renderer. Does not work for any - * other examples. - * - * NOTE: this is just a helper method for our examples collection, - * so that you may concentrate on the relevant parts of the examples. - * It does in no way represent the way it should be done :) - * - * @access public - * @param object &$form The current form object - * @param array $elements The rendered elements from the - * @return - * @see - */ - function displayForm( &$form, $elements ) - { - // output the opening form tag - echo $form->serializeStart(); - - echo "\n"; - foreach ( $elements as $element ) { - } - echo "
\n"; - - // display all elements - foreach ( $elements as $element ) - { - if (!isset($element['description'])) { - // would choke a warning on hidden fields - // strange enough, we've no $element['type'] for hidden inputs - echo $element['element'] . "\n"; - continue; - } - - echo '
'; - echo $element['label']."
"; - echo "
".$element["element"]."
"; - echo "".$element["description"]."
"; - - echo '
'; - - //} else { - //echo "".$element['description']."".$element['element']."\n"; - //} - } - - // submit button, closing form tag - echo '

'; - echo $form->serializeEnd(); - - - // form submitted? display all form values - if ( $form->isSubmitted() ) { - $els =& $form->getElements(); - $cnt = count( $els ); - - echo '
'; - echo '
Submitted form values
'; - echo '
'; - echo ' '; - - for ( $i = 0; $i < $cnt; $i++ ) { - echo ''; - echo ' '; - echo ''; - } - - echo '
'.$els[$i]->getAttribute('label').' : '.$els[$i]->getValue().'
'; - echo '
'; - echo '
'; - } - } diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Datasource/Propel.php b/airtime_mvc/library/propel/contrib/pat/patForms/Datasource/Propel.php deleted file mode 100644 index 08c0595351..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Datasource/Propel.php +++ /dev/null @@ -1,70 +0,0 @@ -peername = $conf['peername']; - $this->label = $conf['label']; - $this->value = $conf['value']; - } - - public function getValues() { - - $map = call_user_func(array($this->peername, 'getPhpNameMap')); - - $c = new Criteria(); - $c->clearSelectColumns(); - - foreach (array($this->label, $this->value) as $arr) { - foreach ($arr['members'] as $member) { - if (is_array($member)) { - foreach ($member as $member) { - $c->addSelectColumn(constant($this->peername . '::' . $map[$member])); - } - } else { - $c->addSelectColumn(constant($this->peername . '::' . $map[$member])); - } - } - } - - if (isset($this->label['initial']) OR isset($this->value['initial'])) { - $label = isset($this->label['initial']) ? $this->label['initial'] : ''; - $value = isset($this->value['initial']) ? $this->value['initial'] : ''; - $result[] = array( - 'value' => $value, - 'label' => $label - ); - } - - $rs = AuthorPeer::doSelectStmt($c); - $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); - while ($rs->next()) { - $row = $rs->getRow(); - foreach (array('label', 'value') as $key) { - $arr = $this->$key; - $params = array($arr['mask']); - foreach ($arr['members'] as $member) { - if (is_array($member)) { - foreach ($member as $member) { - $field_name = strtolower($map[$member]); // TODO is this always true? - $params[] = $row[$field_name]; - } - } else { - $field_name = strtolower($map[$member]); // TODO is this always true? - $params[] = $row[$field_name]; - } - } - $$key = call_user_func_array('sprintf', $params); - $tmp[$key] = $$key; - } - $result[] = $tmp; - } - - return $result; - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Definition.php b/airtime_mvc/library/propel/contrib/pat/patForms/Definition.php deleted file mode 100644 index d02ab5b789..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Definition.php +++ /dev/null @@ -1,122 +0,0 @@ -data['name'] = $name; - $this->data['mtime'] = time(); - if ($autoValidate) { - $this->data['autoValidate'] = $autoValidate; - } - } - - static public function create($conf) { - // TODO - } - - public function __get($name) { - - if (isset($this->data[$name])) { - return $this->data[$name]; - } - } - - // TODO change protocol to addElement(array $element) - public function addElement($name, $type, $attributes = array(), $rules = array()) { - - if (is_array($type)) { - extract($type); - } - - $this->data['elements'][$name]['name'] = $name; - $this->data['elements'][$name]['type'] = $type; - - foreach ($attributes as $key => $value) { - $value = $this->cast($value); - $this->data['elements'][$name]['attributes'][$key] = $value; - } - foreach ($rules as $key => $rule) { - $this->data['elements'][$name]['rules'][$key] = $rule; - } - } - - public function load($filename) { - - $data = $this->read($filename); - - foreach ($data as $key => $value) { - if ($key == 'elements') { - foreach ($value as $name => $element) { - $this->addElement($name, $element); - } - } else { - $this->data[$key] = $this->cast($value); - } - } - } - - public function save($filename) { - - $this->write($filename, $this->data); - } - - protected function read($filename) { - - $xml = file_get_contents($filename); - $unserializer = new XML_Unserializer(); - $unserializer->unserialize($xml); - return $unserializer->getUnserializedData(); - } - - protected function write($filename, $data) { - - $serializer = new XML_Serializer(array ( - 'addDecl' => true, - 'encoding' => 'ISO-8859-1', - 'indent' => ' ', - 'rootName' => 'form', - 'defaultTagName' => 'tag' - )); - $serializer->serialize($data); - $xml = $serializer->getSerializedData(); - - $fp = fopen($filename, 'w+'); - fputs($fp, $xml); - fclose($fp); - } - - protected function cast($value) { - - return $value; - - // seems as if patForms_Element(s) are broken here - // e.g. in patForms_Element_Text::serializeHtmlDefault() - // at line 245 if ( $this->attributes['display'] == 'no' ) - // will result to true if the display attribute is set - // to (php boolean) true - // so casting the 'true'/'false' and 'yes'/'no' values - // would break intended behaviour here - - if (is_array($value) OR is_bool($value)) { - return $value; - } - if ($value === 'true') { - return true; - } - if ($value === 'false') { - return false; - } - if (preg_match('/^[+-]?[0-9]+$/', $value)) { - settype($value, 'int'); - return $value; - } - if (preg_match('/^[+-]?[0-9]*\.[0-9]+$/', $value)) { - settype($value, 'double'); - return $value; - } - return $value; - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Definition/Propel.php b/airtime_mvc/library/propel/contrib/pat/patForms/Definition/Propel.php deleted file mode 100644 index d2ecbe0a07..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Definition/Propel.php +++ /dev/null @@ -1,165 +0,0 @@ - 'Switch', // BOOLEAN = 1; - CreoleTypes::BIGINT => 'String', // BIGINT = 2; - CreoleTypes::SMALLINT => 'String', // SMALLINT = 3; - CreoleTypes::TINYINT => 'String', // TINYINT = 4; - CreoleTypes::INTEGER => 'String', // INTEGER = 5; - CreoleTypes::CHAR => 'String', // CHAR = 6; - CreoleTypes::VARCHAR => 'String', // VARCHAR = 7; - CreoleTypes::FLOAT => 'String', // FLOAT = 8; - CreoleTypes::DOUBLE => 'String', // DOUBLE = 9; - CreoleTypes::DATE => 'String', // DATE = 10; - CreoleTypes::TIME => 'String', // TIME = 11; - CreoleTypes::TIMESTAMP => 'Date', // TIMESTAMP = 12; - CreoleTypes::VARBINARY => 'String', // VARBINARY = 13; - CreoleTypes::NUMERIC => 'String', // NUMERIC = 14; - CreoleTypes::BLOB => 'Text', // BLOB = 15; - CreoleTypes::CLOB => 'Text', // CLOB = 16; - CreoleTypes::TEXT => 'Text', // TEXT = 17; - CreoleTypes::LONGVARCHAR => 'Text', // LONGVARCHAR = 17; - CreoleTypes::DECIMAL => 'String', // DECIMAL = 18; - CreoleTypes::REAL => 'String', // REAL = 19; - CreoleTypes::BINARY => 'String', // BINARY = 20; - CreoleTypes::LONGVARBINARY => 'Text', // LONGVARBINARY = 21; - CreoleTypes::YEAR => 'String', // YEAR = 22; - CreoleTypes::ARR => 'String', - CreoleTypes::OTHER => 'String' - ); - - private static $validatorTypeMap = array( - 'unique' => null, - 'minLength' => 'patForms_Rule_MinLength', - 'maxLength' => 'patForms_Rule_MaxLength', - 'minValue' => 'patForms_Rule_MinValue', - 'maxValue' => 'patForms_Rule_MaxValue', - 'match' => 'patForms_Rule_Match', - 'notMatch' => 'patForms_Rule_NotMatch', - 'required' => null, // will be done by the elements "required" attribute - 'validValues' => 'patForms_Rule_ValidValues', - ); - - /** - * @param array $conf an assoc array of parameters. these are: - * - string name => $name of the propel object class - * - string filename => $filename of the form definition xml file - */ - - static public function create($conf) { - - extract($conf); - - $autoValidate = isset($autoValidate) ? $autoValidate : 'save'; - - $definition = new patForms_Definition_Propel($name, $autoValidate); - - if (0 AND file_exists($filename)) { - // load definition from xml file - $definition->load($filename); - } else { - // populate definition from table map and save it to xml file - $definition = self::populateFromTableMap($definition, $conf); - $definition->save($filename); - } - - return $definition; - } - - private function populateFromTableMap($definition, $conf) { - - extract($conf); - - $mapBuilder = call_user_func(array($name . 'Peer', 'getMapBuilder')); - $tablename = constant($name . 'Peer::TABLE_NAME'); - $tableMap = $mapBuilder->getDatabaseMap()->getTable($tablename); - $cols = $tableMap->getColumns(); - - foreach ($cols as $col) { - - $phpname = $col->getPhpName(); - // this would need a patched version of patForms in order - // to retrieve request vars after having submitted the form - // TODO - ask patForms developers to enable this - // $elementName = $tablename . '[' . $phpname . ']'; - $elementName = $phpname; - - $elementType = self::$creoleTypeMap[$col->getCreoleType()]; - - // TODO somehow retrieve element type specific default values? - $elementAttributes = array( - 'name' => $elementName, - 'title' => $phpname, - 'label' => $phpname, - 'description' => $phpname, - 'edit' => 'yes', - 'display' => $col->isPrimaryKey() ? 'no' : 'yes', - // Is the element required? - // TODO Can we retrieve this info from the Column object? - 'required' => true, - ); - - switch ($col->getCreoleType()) { - case CreoleTypes::BOOLEAN: { - $elementAttributes['value'] = 1; - break; - } - case CreoleTypes::DATE: { - // TODO doesn't seem to work for some reason - // $elementAttributes['format'] = 'date'; - // $elementAttributes['dateformat'] = 'Ymd'; - break; - } - } - - if ($col->isForeignKey()) { - - $relColname = $col->getRelatedColumnName(); - $relTablename = $col->getRelatedTableName(); - $relColPhpname = - Propel::getDatabaseMap(constant($relTablename . 'Peer::DATABASE_NAME'))-> - getTable($relTablename)->getColumn($relColname)->getPhpname(); - - $elementAttributes['datasource'] = array ( - 'name' => 'patForms_Datasource_Propel', - 'peername' => $relTablename . 'Peer', - 'label' => array( - 'initial' => 'Please select one ...', - 'members' => array($relColPhpname), - 'mask' => '%s', - ), - 'value' => array( - 'members' => array($relColPhpname), - 'mask' => '%s', - ), - ); - $elementType = 'Enum'; - } - - $rules = array(); - if ($col->hasValidators()) { - foreach ($col->getValidators() as $validator) { - $name = $validator->getName(); - $type = self::$validatorTypeMap[$name]; - if (!is_null($type)) { - $rules[$name] = array ( - 'table' => $col->getTablename(), - 'col' => $col->getColumnName(), - 'name' => $name, - 'type' => self::$validatorTypeMap[$name], - 'value' => $validator->getValue(), - 'class' => $validator->getClass(), - 'message' => $validator->getMessage(), - ); - } - } - } - - $definition->addElement($phpname, $elementType, $elementAttributes, $rules); - } - - return $definition; - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Element.php b/airtime_mvc/library/propel/contrib/pat/patForms/Element.php deleted file mode 100644 index de1a6c9ef9..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Element.php +++ /dev/null @@ -1,1954 +0,0 @@ - - * @author gERD Schaufelberger - * @author Stephan Schmidt - */ - -/** - * error definition: the attribute that was set is not supported by this element (it is - * not listed in the attributeDefinition property set in the element class). - * @see patForms_Element::attributeDefinition - */ -define( "PATFORMS_ELEMENT_NOTICE_ATTRIBUTE_NOT_SUPPORTED", 1101 ); - -/** - * error definition: the setAttributes() method expects an array, - * but given value was not. - * @see patForms_Element::setAttributes() - */ -define( "PATFORMS_ELEMENT_ERROR_ARRAY_EXPECTED", 1102 ); - -/** - * error definition: the given attribute could not be set - */ -define( "PATFORMS_ELEMENT_ERROR_ADDING_ATTRIBUTE_FAILED", 1103 ); - -/** - * error definition: the element method to serialize the element in the given mode is - * not implemented. - * @see patForms_Element::serialize() - */ -define( "PATFORMS_ELEMENT_ERROR_METHOD_FOR_MODE_NOT_AVAILABLE", 1104 ); - -/** - * error definition: the element returned an error - */ -define( "PATFORMS_ELEMENT_ERROR_ERROR_RETURNED", 1105 ); - -/** - * error definition: the utility class {@link patForms_FormatChecker} could not be found, this is - * needed for the format validation of certain variable types. - * @see patForms_FormatChecker - * @see patForms_Element::validateFormat() - */ -define( "PATFORMS_ELEMENT_ERROR_FORMAT_CHECKER_NOT_FOUND", 1106 ); - -/** - * error definition: the modifier that was set for the element is not an array. - * @see patForms_Element::_applyModifiers() - */ -define( "PATFORMS_ELEMENT_ERROR_MODIFIER_NOT_AN_ARRAY", 1107 ); - -/** - * error definition: the method for the given modifier does not exist - * @see patForms_Element::_applyModifiers() - */ -define( "PATFORMS_ELEMENT_ERROR_METHOD_FOR_MODIFIER_NOT_FOUND", 1108 ); - -/** - * error definition: the modifier returned an error, modifications could not be made. - * @see patForms_Element::_applyModifiers() - */ -define( "PATFORMS_ELEMENT_ERROR_MODIFIER_RETURNED_ERROR", 1109 ); - -/** - * error definition: the given attribute is required for the specified output format. - * @see patForms_Element::getAttributesFor() - */ -define( "PATFORMS_ELEMENT_ERROR_ATTRIBUTE_REQUIRED", 1110 ); - -/** - * error definition: given modifier could not be applied to specified attribute - * @see patForms_Element::getAttributesFor() - */ -define( "PATFORMS_ELEMENT_ERROR_UNABLE_TO_APPLY_MODIFIER_TO_ATTRIBUTE", 1111 ); - -/** - * error definition: the given attribute is not available for output in the specified - * output format. - * @see patForms_Element::getAttributesFor() - */ -define( "PATFORMS_ELEMENT_ERROR_ATTRIBUTE_NOT_AVAILABLE_FOR_OUTPUT", 1112 ); - -/** - * error definition: format of the attribute could not be verified - * @see patForms_Element::getAttributesFor() - */ -define( "PATFORMS_ELEMENT_ERROR_CAN_NOT_VERIFY_FORMAT", 1113 ); - -/** - * error definition: the attribute collection of the element could not be validated. - * @see patForms_Element::toHtml() - */ -define( "PATFORMS_ELEMENT_ERROR_CAN_NOT_VALIDATE_ATTRIBUTE_COLLECTION", 1114 ); - -/** - * error definition: validator undefined - */ -define( "PATFORMS_ELEMENT_ERROR_VALIDATOR_ERROR_UNDEFINED", 1115 ); - -/** - * error definition: undefined locale for errors output - */ -define( "PATFORMS_ELEMENT_ERROR_VALIDATOR_ERROR_LOCALE_UNDEFINED", 1116 ); - -/** - * error definition: the html source for the element could not be generated. - */ -define( "PATFORMS_ELEMENT_ERROR_NO_HTML_CONTENT", 1221 ); - -/** - * error definition: not a valid renderer - */ -define( 'PATFORMS_ELEMENT_ERROR_INVALID_RENDERER', 1222 ); - -/** - * error definition: this element does not support the use of a renderer - */ -define( 'PATFORMS_ELEMENT_RENDERER_NOT_SUPPORTED', 1223 ); - -/** - * filter is located between patForms and browser - */ -define( 'PATFORMS_FILTER_TYPE_HTTP', 1 ); - -/** - * filter is located between patForms and the PHP script - */ -define( 'PATFORMS_FILTER_TYPE_PHP', 2 ); - -/** - * base patForms element class with all needed base functionality that each element - * should have. Extend this class to create your own elements. - * - * $Id: Element.php 1347 2009-12-03 21:06:36Z francois $ - * - * @abstract - * @package patForms - * @subpackage patForms_Element - * @access protected - * @version 0.1 - * @author Sebastian Mordziol - * @author gERD Schaufelberger - * @author Stephan Schmidt - * @license LGPL, see license.txt for details - * @link http://www.php-tools.net - */ -class patForms_Element -{ - /** - * the type of the element, set this in your element class! - * @access protected - */ - var $elementType = false; - - /** - * javascript that will be displayed only once - * - * @access private - * @var array - */ - var $globalJavascript = array(); - - /** - * javascript that will be displayed once per instance - * - * @access private - * @var array - */ - var $instanceJavascript = array(); - - /** - * the value of the element - * @access protected - */ - var $value = false; - - /** - * filters that have been applied - * @access private - */ - var $filters = array(); - - /** - * observers that have been attached - * - * @access private - * @var array - */ - var $observers = array(); - - /** - * The elementName for the serialized version of the element - * - * This is needed for the toXML() method and also by the patForms - * error management. If it is not set, the element name will be - * created by extracting everything after the last underscore in - * the classname. - * - * @access protected - * @see toXML() - */ - var $elementName = null; - - /** - * the attribute collection of the element - * @access private - * @see setAttribute() - * @see setAttributes() - * @see getAttribute() - * @see getAttributes() - */ - var $attributes = array(); - - /** - * the configuration for the attributes supported by the element. Overwrite this - * in your element class. - * - * @abstract - */ - var $attributeDefinition = array(); - - /** - * Stores the attribute defaults for the element, that will be used - * if the given attributes have not been set by the user. - * - * @abstract - * @access private - * @see getAttributeDefaults() - */ - var $attributeDefaults = array(); - - /** - * stores the mode for the element. It defaults to 'default', and is only overwritten if - * set specifically. - * - * @access protected - * @see setMode() - */ - var $mode = "default"; - - /** - * stores the format for the element. It defaults to 'html', and is only overwritten if - * set specifically. - * - * @access protected - * @see setFormat() - */ - var $format = "html"; - - /** - * stores the locale to use when adding validation errors. The specified locale has - * to be set in the validationErrorCodes element class property, otherwise the default - * 'C' (as in the programming language C => english) will be used. - * - * @access private - * @var string $locale - * @see setLocale() - */ - var $locale = "C"; - - /** - * stores the flag telling the element whether it has been submitted - this is used by the - * getValue() method to determine where to get the element's value from. - * @access protected - * @see getValue() - */ - var $submitted = false; - - /** - * stores the flag whether the element is valid - * @access protected - */ - var $valid = true; - - /** - * stores any validation errors that can occurr during the element's validation process. - * - * @access private - * @var array $validationErrors - */ - var $validationErrors = array(); - - /** - * define error codes an messages for each form element - * - * @access protected - * @var array $validatorErrorCodes - */ - var $validatorErrorCodes = array(); - - /** - * defines the starting character for the modifier placeholders that can be inserted - * in the attributes listed as having modifier support. - * - * @access private - * @var string $modifierStart - */ - var $modifierStart = "["; - - /** - * defines the starting character for the modifier placeholders that can be inserted - * in the attributes listed as having modifier support. - * - * @access private - * @var string $modifierStart - */ - var $modifierEnd = "]"; - - /** - * XML entities - * - * @access protected - * @see toXML() - */ - var $xmlEntities = array( - "<" => "<", - ">" => ">", - "&" => "&", - "'" => "'", - '"' => """ - ); - /** - * shortcur to the session variables - * If "false", no session will be used, otherwise it stores the session variables for this element - * - * @access private - * @var mixed $sessionVar - */ - var $sessionVar = false; - - /** - * custom validation rules - * - * @access private - * @var array - */ - var $_rules = array(); - - /** - * next error offset for rules - * @access private - * @var integer - */ - var $nextErrorOffset = 1000; - - /** - * stores whether the element uses a renderer to serialize its content - * @access private - * @var bool - */ - var $usesRenderer = false; - - /** - * Stores the renderer object that can be set via the setRenderer method - * @access private - * @var object - */ - var $renderer = false; - - /** - * Stores all element options - * @access private - */ - var $options = array(); - - /** - * constructor - extend this in your class if you need to do specific operations - * on startup. In that case, however, don't forget to call this constructor anyway - * so that the thing happening here don't get lost. - * - * That's easy to do... just add the following line in your constructor: - * parent::patForms_Element(); - * - * @access public - * @param mixed $mode Optional: the output format, e.g. 'html' - */ - function __construct( $format = false ) - { - if ( $format !== false ) - { - $this->format = $format; - } - - $this->loadAttributeDefaults(); - } - - /** - * patForms_Element constructor for php4 - * - * @access private - * @param integer $id - * @return boolean $result true on success - * @see __construct - */ - function patForms_Element( $format = false ) - { - $this->__construct( $format ); - } - - /** - * Add any initialization routines for your element in your element class, - * for everythig your element needs to do after it has been instantiated and - * the attribute collection has been created. - * - * @abstract - * @access private - * @return mixed $success True on success, a patError object otherwise - */ - function _init() - { - // your code here - return true; - } - - /** - * sets the format of the element - this defines which method will be called in your - * element class, along with the {@link mode} property. - * - * @access public - * @param string $format The name of the format you have implemented in your element(s). Default is 'html' - * @see setFormat() - * @see format - * @see serialize() - */ - function setFormat( $format ) - { - $this->format = strtolower( $format ); - } - - /** - * sets the mode of the element that defines which methods will be called in your - * element class, along with the {@link format} property. - * - * @access public - * @param string $mode The mode to set the element to: default|readonly or any other mode you have implemented in your element class(es). Default is 'default'. - * @see setFormat() - * @see mode - * @see serialize() - */ - function setMode( $mode ) - { - $this->mode = strtolower( $mode ); - } - - /** - * sets the locale (language) to use for the validation error messages of the form. - * - * @access public - * @param string $lang - * @return bool $result True on success - * @see $locale - */ - function setLocale( $lang ) - { - $this->locale = $lang; - - // check, whether this is a custom locale - if (patForms::isCustomLocale($lang)) { - $errorMessages = patForms::getCustomLocale($lang, 'Element::' . $this->elementName); - if (is_array($errorMessages)) { - $this->validatorErrorCodes[$lang] = $errorMessages; - } - } - - return true; - } - - /** - * sets the value of the element, which will be used to fill the element with. If none is - * set and the element needs a value, it will load it using the {@link resolveValue()} method. - * - * This will override user input. - * - * @access public - * @param mixed $value The value to set - * @see $value - * @see resolveValue() - * @see getValue() - */ - function setValue( $value ) - { - $value = $this->_applyFilters( $value, 'in', PATFORMS_FILTER_TYPE_PHP ); - $this->value = $value; - } - - /** - * sets the default value of the element, which will be used to fill the element with. - * - * @access public - * @param mixed $value The value to set - * @see $value - * @see resolveValue() - * @see setValue() - * @see getValue() - */ - function setDefaultValue( $value ) - { - $this->setAttribute('default', $value); - } - - /** - * sets the current submitted state of the element. Set this to true if you want the element - * to pick up its submitted data. - * - * @access public - * @param bool $state True if it has been submitted, false otherwise (default). - * @see getSubmitted() - * @see $submitted - */ - function setSubmitted( $state ) - { - $this->submitted = $state; - } - - /** - * sets the internal ID of the element - this is only used by the {@link patForms} class to - * give each element a unique ID that will be added as ID attribute to each element if the - * id attribute has not been defined. - * - * @access public - * @param string $id The id to set for the element - * @see getId() - */ - function setId( $id ) - { - $this->attributes['id'] = $id; - } - - /** - * gets the internal ID of the element - * - * @access public - * @return string $id The id to set for the element - * @see setId() - */ - function getId() - { - return $this->getAttribute( 'id' ); - } - - /** - * checks whether a given attribute is supported by this element. - * - * @access public - * @param string $attributeName The name of the attribute to check - * @return bool $hasAttribute True if it supports the attribute, false otherwise. - */ - function hasAttribute( $attributeName ) - { - if ( isset( $this->attributeDefinition[$attributeName] ) ) - { - return true; - } - - return false; - } - - /** - * adds an attribute to the element's attribut3 collection. If the attribute - * already exists, it is overwritten. - * - * @access public - * @param string $attributeName The name of the attribute to add - * @param string $attributeValue The value of the attribute - * @return mixed $success True on success, a patError object otherwise - */ - function setAttribute( $attributeName, $attributeValue ) - { - if ( !isset( $this->attributeDefinition[$attributeName] ) ) - { - return patErrorManager::raiseNotice( - PATFORMS_ELEMENT_NOTICE_ATTRIBUTE_NOT_SUPPORTED, - 'Unknown attribute ['.$attributeName.']', - 'Ignored the attribute as the ['.$this->elementName.'] element does not support it.' - ); - } - - $this->attributes[$attributeName] = $attributeValue; - - return true; - } - - /** - * adds several attribute at once to the element's attributes collection. - * Any existing attributes will be overwritten. - * - * @access public - * @param array $attributes The attributes to add - * @return mixed $success True on success, false otherwise - */ - function setAttributes( $attributes ) - { - if ( !is_array( $attributes ) ) - { - return patErrorManager::raiseError( - PATFORMS_ELEMENT_ERROR_ARRAY_EXPECTED, - "Not an array given (setAttributes)" - ); - } - - foreach ( $attributes as $attributeName => $attributeValue ) - { - $this->setAttribute( $attributeName, $attributeValue ); - } - - return true; - } - - /** - * sets a renderer object that will be used to render - * the element. Use the serialize() method to retrieve - * the rendered content of the element. - * - * Only enabled in elements that support renderers, like - * the radio element. - * - * @access public - * @param object &$renderer The renderer object - */ - function setRenderer( &$renderer ) - { - if ( !$this->usesRenderer ) - { - return patErrorManager::raiseWarning( - PATFORMS_ELEMENT_RENDERER_NOT_SUPPORTED, - 'The element \''.$this->elementName.'\' does not support the use of renderers - you do not have to set a renderer for this element.' - ); - } - - if ( !is_object( $renderer ) ) - { - return patErrorManager::raiseError( - PATFORMS_ELEMENT_ERROR_INVALID_RENDERER, - 'You can only set a patForms_Renderer object with the setRenderer() method, "'.gettype( $renderer ).'" given.' - ); - } - - $this->renderer = &$renderer; - } - - /** - * retrieves the value of an attribute. - * - * @access public - * @param string $attribute The name of the attribute to retrieve - * @return mixed $attributeValue The value of the attribute, or false if it does not exist in the attributes collection. - * @see setAttribute() - */ - function getAttribute( $attribute ) - { - if ( !isset( $this->attributes[$attribute] ) ) - { - return false; - } - - return $this->attributes[$attribute]; - } - - /** - * retrieves all attributes, or only the specified attributes. - * - * @access public - * @param array $attributes Optional: The names of the attributes to retrieve. Only the attributes that exist will be returned. - * @return array $result The attributes - * @see getAttribute() - */ - function getAttributes( $attributes = array() ) - { - if ( empty( $attributes ) ) - { - return $this->attributes; - } - - $result = array(); - foreach ( $attributes as $attribute ) - { - if ( $attributeValue = $this->getAttribute( $attribute ) ) - { - $result[$attribute] = $attributeValue; - } - } - - return $result; - } - - /** - * Loads the default attribute values into the attributes collection. Done directly - * on startup (in the consructor), so make sure you call this if your element needs - * this feature and you have implemented a custom constructor in your element. - * - * @access public - * @return bool $success Always returns true. - * @see $attributeDefaults - */ - function loadAttributeDefaults() - { - foreach ( $this->attributeDefinition as $attributeName => $attributeDef ) - { - if ( isset( $attributeDef['default'] ) ) - { - $this->attributes[$attributeName] = $attributeDef['default']; - } - } - - return true; - } - - /** - * retrieves the current value of the element. If none is set, will try to retrieve the - * value from submitted form data. - * - * @access public - * @param boolean Determines whether the method is used from an external script - * @return mixed The value, or an empty string if none found. - * @see setValue() - * @see value - * @see resolveValue() - */ - function getValue( $external = true ) - { - if ( $this->value === false ) - { - $this->resolveValue(); - - // could not be resolved - if ( $this->value === false ) - { - $value = ''; - } - else - { - $value = $this->value; - } - } - else - { - $value = $this->value; - } - - if ( $external === false ) - { - return $value; - } - - $value = $this->_applyFilters( $value, 'out', PATFORMS_FILTER_TYPE_PHP ); - - return $value; - } - - /** - * resolves the scope the value of the element may be stored in, and returns it. - * - * @access protected - * @see getValue() - * @see value - * @todo parse element name, if it uses the array syntax - */ - function resolveValue() - { - $varName = $this->attributes['name']; - - if ( $this->submitted && isset( $_POST[$varName] ) ) - { - $this->value = $_POST[$varName]; - if ( ini_get( 'magic_quotes_gpc' ) ) - $this->value = $this->rStripSlashes( $this->value ); - $this->value = $this->_applyFilters( $this->value, 'in', PATFORMS_FILTER_TYPE_HTTP ); - return true; - } - - if ( $this->submitted && isset( $_GET[$varName] ) ) - { - $this->value = $_GET[$varName]; - if ( ini_get( 'magic_quotes_gpc' ) ) - $this->value = $this->rStripSlashes( $this->value ); - $this->value = $this->_applyFilters( $this->value, 'in', PATFORMS_FILTER_TYPE_HTTP ); - return true; - } - - if ( isset( $this->attributes['default'] ) ) - { - $this->value = $this->attributes['default']; - $this->value = $this->_applyFilters( $this->value, 'in', PATFORMS_FILTER_TYPE_PHP ); - - return true; - } - - return true; - } - - /** - * recursively strip slashes - * - * This method is used to 'fix' magic_quotes_gpc. - * - * @access public - * @param mixed user input (get or post) - * @return mixed data with slashes stripped - */ - function rStripSlashes( $value ) - { - if ( is_scalar( $value ) ) - return stripslashes( $value ); - if ( is_array( $value ) ) - { - foreach ( $value as $key => $val ) - { - $value[$key] = $this->rStripSlashes( $val ); - } - } - return $value; - } - - /** - * apply filters to a value - * - * @access private - * @param mixed value - * @param string direction of the filter ('in' or 'out') - * @param integer type of filters to apply - * @return mixed filtered value - */ - function _applyFilters( $value, $dir = 'in', $type = PATFORMS_FILTER_TYPE_PHP ) - { - if ( empty( $this->filters ) ) - return $value; - - /** - * apply filters! - */ - $cnt = count( $this->filters ); - for ( $i = 0; $i < $cnt; $i++ ) - { - /** - * check, whether filter is located between php script and form - */ - if ( $this->filters[$i]->getType() != $type ) - { - continue; - } - - $value = $this->filters[$i]->$dir( $value ); - } - return $value; - } - - /** - * retrieves the current mode of the element - * - * @access public - * @return string $mode The current element mode - * @see setMode() - * @see mode - */ - function getMode() - { - return $this->mode; - } - - /** - * retrieves the current format of the element - * - * @access public - * @return string $format The current element format - * @see setFormat() - * @see format - */ - function getFormat() - { - return $this->format; - } - - /** - * retrieves the element's current submitted state. - * - * @access public - * @return bool $state True if it has been submitted, false otherwise. - * @see setSubmitted() - * @see submitted - */ - function getSubmitted() - { - return $this->submitted; - } - - /** - * retrieves the name of the element - * - * @access public - * @return string $name name of the element - * @uses getAttribute() - */ - function getName() - { - return $this->getAttribute( 'name' ); - } - - /** - * add a custom validation rule - * - * @access public - * @param object patForms_Rule validation rule - * @param integer time, when rule has to be applied, can be before or after validation. - * If set to null, it will use the default value as specified in the rule - * @return boolean currently always true - */ - function addRule( &$rule, $time = null ) - { - if ( is_null( $time ) ) - { - $time = $rule->getTime(); - } - - $rule->prepareRule( $this ); - - $this->_rules[] = array( - 'rule' => &$rule, - 'time' => $time, - ); - return true; - } - - /** - * adds an observer to the element - * - * @access public - * @param object patForms_Observer observer - * @return boolean currently always true - */ - function attachObserver( &$observer ) - { - $this->observers[] = &$observer; - return true; - } - - /** - * dispatches the serialization of the element in the format that was set to the - * corresponding method in the element class. These methods must be named in the - * folowing scheme: - * - * serialize[format][mode](), e.g. serializeHtmlDefault() - * - * @access public - * @return string $element The created element according to the specified mode. - * @see setFormat() - * @see setMode() - * @todo serialize*() methods should return a patError object instead of false!!!! - * Has to be changed asap! - */ - function serialize() - { - $methodName = "serialize".ucfirst( $this->getFormat() ).ucfirst( $this->getMode() ); - - if ( !method_exists( $this, $methodName ) ) - { - return patErrorManager::raiseError( - PATFORMS_ELEMENT_ERROR_METHOD_FOR_MODE_NOT_AVAILABLE, - "Element method for form mode '".$this->getMode()."' (".$methodName.") is not available." - ); - } - - /** - * get the value for internal use - * The PHP-filters will not be applied - */ - $value = $this->getValue( false ); - - $element = $this->$methodName( $value ); - if ( patErrorManager::isError( $element ) ) - { - return $element; - } - - return $element; - } - - /** - * Template method that applies rules and calls the elements - * validation method - * - * @final - * @access public - * @return bool $success True on success, false otherwise - */ - function validate() - { - // apply locale, if the current locale is a custom locale - if (patForms::isCustomLocale($this->locale)) { - $cnt = count( $this->_rules ); - for ( $i = 0; $i < $cnt; $i++ ) { - $this->_rules[$i]['rule']->setLocale($this->locale); - } - } - - /** - * validate custom rules - */ - if ( !$this->_applyRules( PATFORMS_RULE_BEFORE_VALIDATION ) ) - { - $this->_announce( 'status', 'error' ); - return false; - } - - /** - * the the unfiltered value - */ - $value = $this->getValue( false ); - - $valid = $this->validateElement( $value ); - if ( $valid === false ) - { - $this->_announce( 'status', 'error' ); - return false; - } - - /** - * validate custom rules - */ - if ( !$this->_applyRules( PATFORMS_RULE_AFTER_VALIDATION ) ) - { - $this->_announce( 'status', 'error' ); - return false; - } - - $this->_announce( 'status', 'validated' ); - return true; - } - - /** - * validates the given data with the element's validation routines - * and returns the data with any needed modifications. - * - * @abstract - * @access private - * @return bool $success True on success, false otherwise - */ - function validateElement() - { - // your code here - return true; - } - - /** - * apply rules - * - * @access private - * @param integer time of validation - * @return boolean rules are valid or not - * @todo add documentation - */ - function _applyRules( $time ) - { - $valid = true; - - $cnt = count( $this->_rules ); - for ( $i = 0; $i < $cnt; $i++ ) - { - if ( ( $this->_rules[$i]['time'] & $time ) != $time ) - continue; - - $result = $this->_rules[$i]['rule']->applyRule( $this, $time ); - if ( $result === false ) - { - $valid = false; - } - } - return $valid; - } - - /** - * finalize the element. - * - * Used as a template method. - * - * @final - * @access protected - * @return bool $success True on success, false otherwise - * @uses finalizeElement() to call the user code - */ - function finalize() - { - $value = $this->getValue( false ); - return $this->finalizeElement( $value ); - } - - /** - * finalize the element - * - * Offers the possibility to process any needed operations after the element - * has been validated. Implement any tasks that you need to do then here - a - * good example is the File element, where this method enables the moving of - * the uploaded file to the correct location. - * - * @abstract - * @access private - * @param mixed value of the element - * @return bool $success True on success, false otherwise - */ - function finalizeElement( $value ) - { - return true; - } - - /** - * Enables an element option. - * - * See the {@link patForms::$options} property for an exhaustive list of available options. - * - * @access public - * @param string $option The option to enable - * @param array $params Optional parameters for the option - * @see disableOption() - * @see $options - */ - function enableOption( $option, $params = array() ) - { - if ( !isset( $this->options[$option] ) ) - $this->options[$option] = array(); - - $this->options[$option]['enabled'] = true; - $this->options[$option]['params'] = $params; - } - - /** - * Disables an element option - * - * See the {@link patForms::$options} property for an exhaustive list of available options. - * - * @access public - * @param string $option The option to disable - * @see enableOption() - * @see $options - */ - function disableOption( $option ) - { - if ( !isset( $this->options[$option] ) ) - $this->options[$option] = array(); - - $this->options[$option]['enabled'] = false; - } - - /** - * [helper method] validates the given value according to the specified method. It first - * checks if there is a method to check the format in the {@link patForms_FormatChecker} - * class, then checks in the element class itself. - * - * @access public - * @param mixed $value The value to validate the format of - * @param string $format The format to validate the value with - * @return bool $isValid True if valid, false if invalid or no method exists to validate the format. - * @see patForms_FormatChecker - */ - function validateFormat( $value, $format ) - { - if ( !class_exists( "patForms_FormatChecker" ) ) - { - $checkerFile = dirname( __FILE__ )."/FormatChecker.php"; - if ( !file_exists( $checkerFile ) ) - { - $this->valid = false; - return patErrorManager::raiseError( - PATFORMS_ELEMENT_ERROR_FORMAT_CHECKER_NOT_FOUND, - "Type checker could not be found, aborting validation." - ); - } - - include_once( $checkerFile ); - } - - $format = strtolower( $format ); - - $methodName = "is_".$format; - $option = false; - - if ( method_exists( $this, $methodName ) ) - { - return $this->$methodName( $value ); - } - - if ( in_array( $methodName, get_class_methods( "patForms_FormatChecker" ) ) ) - { - return call_user_func( array( 'patForms_FormatChecker', $methodName ), $value ); - } - - return false; - } - - /** - * get next error offset - * - * @access public - * @return integer - */ - function getErrorOffset( $requiredCodes = 100 ) - { - $offset = $this->nextErrorOffset; - $this->nextErrorOffset = $this->nextErrorOffset + $requiredCodes; - return $offset; - } - - /** - * add error codes and messages for validator method - * - * @access public - * @param array defintions - * @param integer offset for the error codes - */ - function addValidatorErrorCodes( $defs, $offset = 1000 ) - { - foreach ( $defs as $lang => $codes ) - { - if ( !isset( $this->validatorErrorCodes[$lang] ) ) { - $this->validatorErrorCodes[$lang] = array(); - } - - foreach ( $codes as $code => $message ) { - $this->validatorErrorCodes[$lang][($offset+$code)] = $message; - } - } - } - - /** - * getValidationErrors - * - * @access public - * @return array errors that occured during the validation - */ - function getValidationErrors() - { - return $this->validationErrors; - } - - /** - * addValidationError - * - * - * @access public - * @param integer $code - * @param array $vars fill named placeholder with values - * @return boolean $result true on success - */ - function addValidationError( $code, $vars = array() ) - { - $error = false; - $lang = $this->locale; - $element = $this->getElementName(); - - // find error message for selected language - while ( true ) - { - // error message matches language code - if ( isset( $this->validatorErrorCodes[$lang][$code] ) ) - { - $error = array( "element" => $element, "code" => $code, "message" => $this->validatorErrorCodes[$lang][$code] ); - break; - } - // no message found and no fallback-langauage available - else if ( $lang == "C" ) - { - break; - } - - $lang_old = $lang; - - // look for other languages - if ( strlen( $lang ) > 5 ) - { - list( $lang, $trash ) = explode( ".", $lang ); - } - else if ( strlen( $lang ) > 2 ) - { - list( $lang, $trash ) = explode( "_", $lang ); - } - else - { - $lang = "C"; - } - - // inform developer about missing language - patErrorManager::raiseNotice( - PATFORMS_ELEMENT_ERROR_VALIDATOR_ERROR_LOCALE_UNDEFINED, - "Required Validation Error-Code for language: $lang_old not available. Now trying language: $lang", - "Add language definition in used element or choose other language" - ); - - } - - // get default Error! - if ( !$error ) - { - patErrorManager::raiseWarning( - PATFORMS_ELEMENT_ERROR_VALIDATOR_ERROR_UNDEFINED, - "No Error Message for this validation Error was defined", - "Review the error-definition for validation-errors in your element '$element'." - ); - $error = array( "element" => $element, "code" => 0, "message" => "Unknown validation Error" ); - } - - // insert values to placeholders - if ( !empty( $vars ) ) - { - foreach ( $vars as $key => $value ) - { - $error["message"] = str_replace( "[". strtoupper( $key ) ."]", $value, $error["message"] ); - } - } - - array_push( $this->validationErrors, $error ); - $this->valid = false; - return true; - } - - /** - * applies the specified modifiers to an attribute value, as set in the attribute definition. - * - * @access private - * @param mixed $attributeValue The value of the attribute to modify - * @param array $modifiers Array containing the list of modifiers and their options to apply. - * @return mixed $attributeValue The modified attribute value. - * @see createAttributes() - */ - function _applyModifiers( $attributeValue, $modifiers ) - { - if ( !is_array( $modifiers ) ) - { - return patErrorManager::raiseError( - PATFORMS_ELEMENT_ERROR_MODIFIER_NOT_AN_ARRAY, - "Modifiers are not an array" - ); - } - - foreach ( $modifiers as $modifier => $modifierOptions ) - { - // compute method name for this definition and check if it exists - $modifierMethod = "_modifier".ucfirst( $modifier ); - - if ( !method_exists( $this, $modifierMethod ) ) - { - return patErrorManager::raiseError( - PATFORMS_ELEMENT_ERROR_METHOD_FOR_MODIFIER_NOT_FOUND, - "Method not found for modifier '" . $modifier . "' (".$modifierMethod.") in class '" . get_class( $this ) . "'" - ); - } - - $modifiedValue = $this->$modifierMethod( $attributeValue ); - - if ( $modifiedValue === false ) - { - return patErrorManager::raiseError( - PATFORMS_ELEMENT_ERROR_MODIFIER_RETURNED_ERROR, - "Modifier '".$modifier."' returned an error." - ); - } - - $attributeValue = $modifiedValue; - } - - return $attributeValue; - } - - /** - * insertSpecials attribute value modifier - * - * you can use special placeholders to insert dynamic values into the attribute values. - * This method inserts the correct information for each placeholder in the given string. - * - * @access private - * @param string $string The string to insert the specials in - * @return string $string The string with all needed replacements - * @see _applyModifiers() - * @todo Maybe make this configurable - * @todo Add any other relevant information - */ - function _modifierInsertSpecials( $modifyValue, $options = array() ) - { - if ( is_array( $modifyValue ) || is_object( $modifyValue ) || is_array( $this->value ) ) - return $modifyValue; - - // go through each attribute in the attribute definition and replace the strings - // with the corresponding attribute values. - foreach ( $this->attributeDefinition as $attributeName => $attributeDef ) - { - // if attribute was not set, strip the variable by setting it to empty. - $attributeValue = ""; - - // retrieve real attribute value if it was set - if ( isset( $this->attributes[$attributeName] ) && is_string( $this->attributes[$attributeName] ) ) - { - $attributeValue = $this->attributes[$attributeName]; - } - - $search = $this->modifierStart."ELEMENT_".strtoupper( $attributeName ).$this->modifierEnd; - - // make the replacement - $modifyValue = str_replace( $search, $attributeValue, $modifyValue ); - } - - // the element's value is special... - $modifyValue = str_replace( $this->modifierStart."ELEMENT_VALUE".$this->modifierEnd, $this->value, $modifyValue ); - - return $modifyValue; - } - - /** - * checks the format of an attribute value according to the given format. - * - * @access private - * @param mixed $attributeValue The attribute value to check - * @param string $format The format to check the attribute value against - * @return bool $result True if format check succeeded, false otherwise. - * @see createAttributes() - * @todo Implement this method sometime - */ - function _checkAttributeFormat( $attributeValue, $format ) - { - return true; - } - - /** - * validates the current attribute collection according to the attributes definition - * and the given output format, and returns the list of valid attributes. - * - * @access private - * @param string $format The output format to retrieve the attributes for. - * @return mixed $attributes The list of attributes, or false if failed. - */ - function getAttributesFor( $format ) - { - $attributes = array(); - - foreach ( $this->attributeDefinition as $attributeName => $attributeDef ) - { - if ( !isset( $this->attributes[$attributeName] ) ) - { - if ( $attributeDef["required"] ) - { - return patErrorManager::raiseError( - PATFORMS_ELEMENT_ERROR_ATTRIBUTE_REQUIRED, - 'The element "'.$this->getElementName().'" needs the attribute "'.$attributeName.'" to be set.', - 'See the attribute definition of the element class "'.get_class( $this ).'"' - ); - } - - continue; - } - - $attributeValue = $this->attributes[$attributeName]; - - // special case disabled attribute: skip this if it is not set to yes - // to avoid generating a disabled field anyway (empty HTML attribute) - if ( $attributeName == 'disabled' && $attributeValue != 'yes' ) - { - continue; - } - - if ( isset( $attributeDef["modifiers"] ) && !empty( $attributeDef["modifiers"] ) ) - { - $modifiedValue = $this->_applyModifiers( $attributeValue, $attributeDef["modifiers"] ); - if ( $modifiedValue === false ) - { - return patErrorManager::raiseError( - PATFORMS_ELEMENT_ERROR_UNABLE_TO_APPLY_MODIFIER_TO_ATTRIBUTE, - "Could not apply modifier to attribute '".$attributeName."' (value:'".$attributeValue."')" - ); - } - - $attributeValue = $modifiedValue; - - // store this for later use too - $this->attributes[$attributeName] = $attributeValue; - } - - if ( !in_array( $format, $attributeDef["outputFormats"] ) ) - { - continue; - } - - if ( isset( $attributeDef["format"] ) ) - { - if ( !$this->_checkAttributeFormat( $attributeValue, $attributeDef["format"] ) ) - { - return patErrorManager::raiseError( - PATFORMS_ELEMENT_ERROR_CAN_NOT_VERIFY_FORMAT, - "Format '".$attributeDef["format"]."' could not be verified for attribute '".$attributeName."' => '".$attributeValue."'" - ); - } - } - - $attributes[$attributeName] = $attributeValue; - } - - return $attributes; - } - - /** - * [helper method] wrapper for the {@link createTag()} method which automates the tag - * creation by creating the tag from the current attribute collection and element type. - * - * @access protected - * @return mixed $result The created tag, or false if failed. - * @see elementType - * @see attributes - * @see createTag() - */ - function toHtml() - { - $attributes = $this->getAttributesFor( $this->getFormat() ); - if ( patErrorManager::isError( $attributes ) ) - { - return $attributes; - } - - return $this->createTag( $this->elementType[$this->getFormat()], "full", $attributes ); - } - - /** - * [helper method] create a hidden field with the given value. Retrieves all other needed - * attributes from the attributes collection. - * @access public - */ - function createHiddenTag( $value ) - { - $attribs = array( 'type' => 'hidden', - 'name' => $this->attributes['name'], - 'value' => $value, - 'id' => $this->attributes['id'], - ); - - return $this->createTag( "input", "full", $attribs ); - } - - /** - * [helper method] creates a hidden field with the given value. Used for the - * display=no attribute, and is the same as the createHiddenTag() method, only - * that the attributes collection is initialized to ensure that any variables - * in the element's attributes get replaced. - * - * @access private - * @param mixed $value The value of the element - * @return string $element The serialized hidden tag - * @see createHiddenTag() - */ - function createDisplaylessTag( $value ) - { - // call this to initialize all attributes. This is needed - // here to make sure that if there are - $this->getAttributesFor( $this->getFormat() ); - - return $this->createHiddenTag( $value ); - } - - /** - * [helper method] create an element HTML source from its attribute collection and - * returns it. - * - * @static - * @access protected - * @param string $tagname The name of the element / tag - * @param string $type Optional: the type of element to generate. Valid parameters are full|opening|closing|empty. Defaults to "full". - * @param mixed $value The value of the element - * @return string $element The HTML source of the element - */ - function createTag( $tagname, $type = "full", $attributes = array(), $value = false ) - { - switch( $type ) - { - case "closing": - return ""; - break; - - case "empty": - case "opening": - $tag = "<".$tagname; - - // create attribute collection - foreach ( $attributes as $attributeName => $attributeValue ) - { - $tag = $tag . " ".$attributeName."=\"".htmlentities( (string)$attributeValue )."\""; - } - - // empty tag? - if ( $type == "empty" ) - { - $tag = $tag . " />"; - return $tag; - } - - $tag = $tag . ">"; - return $tag; - - break; - - case "full": - if ( $value === false ) - { - return patForms_Element::createTag( $tagname, "empty", $attributes ); - } - - return patForms_Element::createTag( $tagname, "opening", $attributes ).htmlentities( $value ).patForms_Element::createTag( $tagname, "closing" ); - break; - } - } - - /** - * create XML representation of the element - * - * This can be used when you need to store the structure - * of your form in flat files or create form templates that can - * be read by patForms_Parser at a later point. - * - * @access public - * @param string namespace - * @uses getElementName() - * @see patForms_Parser - */ - function toXML( $namespace = null ) - { - $tagName = $this->getElementName(); - - // prepend Namespace - if ( $namespace != null ) - { - $tagName = $namespace.':'.$tagName; - } - - // get all attributes - $attributes = $this->getAttributes(); - - // create valid XML attributes - foreach ( $attributes as $key => $value ) - { - $attributes[$key] = strtr( $value, $this->xmlEntities ); - } - - $value = strtr( $this->getValue(), $this->xmlEntities ); - - if ( $value != false ) - { - return $this->createTag( $tagName, "full", $attributes, $value ); - } - return $this->createTag( $tagName, "empty", $attributes ); - } - - /** - * apply a filter - * - * This is still in alpha state! - * - * @access public - * @param object patForms_Filter - * @todo add error management and docs - * @todo allow filter to be an array containg two callbacks - * array( 'in' => 'myInFunc', 'out' => 'myOutFunc' ) ) - */ - function applyFilter( &$filter ) - { - $this->filters[] = &$filter; - return true; - } - - /** - * Get the name of the element, as stored in the elementName property. - * - * This is used when serializing an element to XML to - * create a now form template. - * - * This method checks for the $elementName property and if it - * is set to null, it will extract the element name from the class name - * - * @access public - * @return string tag name - */ - function getElementName() - { - if ( $this->elementName != null ) - { - return $this->elementName; - } - - $class = get_class( $this ); - $name = substr( strrchr( $class, "_" ), 1 ); - return ucfirst( $name ); - } - - /** - * checks wheter sessions are used or switch session usage on or of - * - * If switch argument is missing, this function just reports if sessions - * will be used or not - * - * @access protected - * @param string $switch switch sessions on ("yes") or off ("yes") - * @return boolean $result true if sessions will be used, false otherwise - * @see setSessionValue() - * @see getSessionValue() - * @see unsetSessionValue() - * @todo destroy session variables if sessions won't be usead any further - */ - function useSession( $switch = null ) - { - // switch sessions on or off - if ( $switch == "yes" ) - { - $this->attributes["usesession"] = "yes"; - } - else if ( $switch == "no" ) - { - $this->attributes["usesession"] = "no"; - return false; - } - - if ( isset( $this->attributes["usesession"] ) && $this->attributes["usesession"] == "yes" ) - { - if ( !$this->sessionVar ) - { - if ( !defined( "SID" ) ) - { - session_start(); - } - - $name = $this->attributes["name"]; - if ( !isset( $_SESSION["_patforms_element"][$name] ) ) - { - $_SESSION["_patforms_element"][$name] = array(); - } - - $this->sessionVar =& $_SESSION["_patforms_element"][$name]; - } - - return true; - } - return false; - } - - /** - * save a variable to the session - * - * @access protected - * @param string $name name to identify the variable - * @param mixed $value - * @return boolean $result true on success - * @see getSessionValue() - * @see unsetSessionValue() - */ - function setSessionValue( $name, $value ) - { - if ( !$this->useSession() ) - { - return false; - } - - $this->sessionVar[$name] = $value; - return true; - } - - /** - * get a variable from session - * - * @access protected - * @param string $name name to identify the variable - * @return mixed $result false if no sessions are used, null if variable is not set or the value of the variable - * @see getSessionValue() - * @see unsetSessionValue() - */ - function getSessionValue( $name ) - { - if ( !$this->useSession() ) - { - return false; - } - - if ( isset( $this->sessionVar[$name] ) ) - { - return $this->sessionVar[$name]; - } - return null; - } - - /** - * remove a variable from session - * - * @access protected - * @param string $name name to identify the variable - * @return mixed $result false if no sessions are used, null if variable is not set or the value of the variable - * @see getSessionValue() - * @see setSessionValue) - */ - function unsetSessionValue( $name ) - { - if ( !$this->useSession() ) - { - return false; - } - - $value = null; - if ( isset( $this->sessionVar[$name] ) ) - { - $value = $this->sessionVar[$name]; - unset( $this->sessionVar[$name] ); - } - return $value; - } - - /** - * get the global javascript of the element - * - * @access public - * @return string - */ - /* - function getGlobalJavascript() - { - if ( !isset( $this->globalJavascript[$this->format] ) ) - { - $script = ''; - } - else - { - $script = $this->globalJavascript[$this->format]; - } - - $cnt = count( $this->_rules ); - for ( $i = 0; $i < $cnt; $i++ ) - { - $tmp = $this->_rules[$i]['rule']->getGlobalJavascript(); - if ( $tmp === false ) - continue; - $script .= $tmp; - } - - return $script; - } - */ - - /** - * get the instance javascript of the element - * - * @access public - * @return string javascript for this instance - */ - /* - function getInstanceJavascript() - { - if ( !isset( $this->instanceJavascript[$this->format] ) ) - { - $script = ''; - } - else - { - $script = $this->instanceJavascript[$this->format]; - - $script = str_replace( '[ELEMENT::NAME]', $this->getName(), $script ); - $script = str_replace( '[ELEMENT::ID]', $this->getId(), $script ); - } - - $cnt = count( $this->_rules ); - for ( $i = 0; $i < $cnt; $i++ ) - { - $tmp = $this->_rules[$i]['rule']->getInstanceJavascript(); - if ( $tmp === false ) - continue; - $script .= $tmp; - } - - return $script; - } - */ - - function registerJavascripts(&$form) { - - if ($script = $this->getGlobalJavascript()) { - $form->registerGlobalJavascript($this->elementName, $script); - } - - if ($script = $this->getInstanceJavascript()) { - $form->registerInstanceJavascript($script); - } - - foreach ($this->_rules as $rule) { - $rule['rule']->registerJavascripts($form); - } - } - - function getGlobalJavascript() { - - if (isset($this->globalJavascript[$this->format])) { - return $this->globalJavascript[$this->format]; - } - } - - function getInstanceJavascript() { - - if (isset($this->instanceJavascript[$this->format])) { - $script = $this->instanceJavascript[$this->format]; - $script = str_replace('[ELEMENT::NAME]', $this->getName(), $script); - $script = str_replace('[ELEMENT::ID]', $this->getId(), $script); - return $script; - } - } - - /** - * retrieves the element's current submitted state. - * - * @access public - * @return bool $state True if it has been submitted, false otherwise. - * @see submitted - */ - function isSubmitted() - { - if ( $this->submitted === true ) { - return true; - } - return false; - } - - /** - * returns the locale that is currently set for the form. - * - * @access public - * @return string $locale The locale. - * @see setLocale() - * @see $locale - */ - function getLocale() - { - return $this->locale; - } - - /** - * anounce a change in the element to all observers - * - * @access private - * @param string property that changed - * @param mixed new value of the property - */ - function _announce( $property, $value ) - { - $cnt = count( $this->observers ); - for ( $i = 0; $i < $cnt; $i++ ) - { - $this->observers[$i]->notify( $this, $property, $value ); - } - return true; - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Rule.php b/airtime_mvc/library/propel/contrib/pat/patForms/Rule.php deleted file mode 100644 index 911c0965ea..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Rule.php +++ /dev/null @@ -1,340 +0,0 @@ - - * @license LGPL, see license.txt for details - * @link http://www.php-tools.net - * @todo implement javascript helper methods (set a javascript property plus an - * array of keys that will be replaced by the properties of the rule) - */ -class patForms_Rule -{ - /** - * time when the rule should be applied - * - * Possible values are: - * -PATFORMS_RULE_BEFORE_VALIDATION - * -PATFORMS_RULE_AFTER_VALIDATION - * -PATFORMS_RULE_BOTH - * - * @access private - * @var integer - */ - var $_time = PATFORMS_RULE_AFTER_VALIDATION; - - /** - * script that will be displayed only once - * - * @access private - * @var array - */ - var $globalScript = array(); - - /** - * script that will be displayed once per instance - * - * @access private - * @var array - */ - var $instanceScript = array(); - - /** - * properties that have to be replaced in the instance script. - * - * @access private - * @var array - */ - var $scriptPlaceholders = array(); - - /** - * store the container of the rule - * - * @access private - * @var object - */ - var $container; - - /** - * define error codes an messages for each form element - * - * @abstract - * @access private - * @var array - */ - var $validatorErrorCodes = array(); - - /** - * error code offset for the rule - * - * @abstract - * @access private - */ - var $errorOffset; - - /** - * format of the rule - * - * @abstract - * @access private - */ - var $format = 'html'; - - /** - * name of the rule - * - * @abstract - * @access private - */ - var $ruleName = ''; - - /** - * Get the time when the rule should be applied. - * - * This has to be defined in the _time property of the rule. - * - * @access public - * @return integer - */ - function getTime() - { - return $this->_time; - } - - /** - * create a new rule object - * - * @access public - * @param string id - */ - function patForms_Rule( $id = null ) - { - if ( $id === null ) - { - $id = uniqid( '' ); - } - - $this->_id = $id; - } - - /** - * set the id for the rule - * - * @access public - * @param string id - */ - function setId( $id ) - { - $this->_id = $id; - } - - /** - * set the locale, this is needed to update the rule - * translations, that have been passed to the container - * element - * - * @access public - * @param string new locale - * @return boolean - */ - function setLocale( $locale ) - { - // rules do not store locale information - if (!patForms::isCustomLocale($locale)) { - return true; - } - - $errorMessages = patForms::getCustomLocale($locale, 'Rule::' . $this->getRuleName()); - - if (is_array($errorMessages)) { - $this->validatorErrorCodes[$locale] = $errorMessages; - } - - $this->container->addValidatorErrorCodes( $this->validatorErrorCodes, $this->errorOffset ); - - return true; - } - - /** - * prepare the rule - * - * This method is used to initialize the rule. - * By default it adds it validatorErrorCodes - * to the container and stores a reference to the - * container. - * - * You may extend it in your custom rules, but should always be calling - * this method using: - * - * - * patForms_Rule::prepareRule( $container ); - * - * - * @access public - * @param object Either a patForms or patForms_Element object - */ - function prepareRule( &$container ) - { - $this->format = $container->getFormat(); - - $this->container = &$container; - $this->errorOffset = $container->getErrorOffset(); - - $container->addValidatorErrorCodes( $this->validatorErrorCodes, $this->errorOffset ); - - return true; - } - - /** - * method called by patForms or any patForms_Element to validate the - * element or the form. - * - * @abstract - * @access public - * @param object Either a patForms or patForms_Element object - * @return boolean true, if rule has been applied succesfully, false otherwise - */ - function applyRule( &$container, $type = PATFORMS_RULE_BEFORE_VALIDATION ) - { - // your code - } - - /** - * addValidationError - * - * @access private - * @param integer $code - * @param array $vars fill named placeholder with values - * @return boolean $result true on success - */ - function addValidationError( $code, $vars = array() ) - { - $code= $this->errorOffset + $code; - return $this->container->addValidationError( $code, $vars ); - } - - /** - * get the name of the rule - * - * By default just return the classname, this is sufficient. - * - * @access public - * @return string - */ - function getRuleName() - { - if (!empty($this->ruleName)) { - return $this->ruleName; - } - return get_class( $this ); - } - - /** - * get the global javascript of the rule - * - * @access public - * @return string - * @todo Rules need to know the output format - */ - /* - function getGlobalJavascript() - { - if ( isset( $this->globalScript['html'] ) ) - { - return $this->globalScript['html']; - } - return ''; - } - */ - - /** - * get the instance javascript of the rule - * - * @access public - * @return string - */ - /* - function getInstanceJavascript() - { - if ( !isset( $this->instanceScript[$this->format] ) ) - { - return false; - } - // get the script for the current format - $script = $this->instanceScript[$this->format]; - - // always replace the id - $script = str_replace( '[RULE::ID]', $this->_id, $script ); - if ( method_exists( $this->container, 'getId' ) ) - { - $script = str_replace( '[CONTAINER::ID]', $this->container->getId(), $script ); - } - if ( method_exists( $this->container, 'getName' ) ) - { - $script = str_replace( '[CONTAINER::NAME]', $this->container->getName(), $script ); - } - - foreach ( $this->scriptPlaceholders as $placeholder => $property ) - { - if ( isset( $this->$property ) ) - $script = str_replace( '['.$placeholder.']', $this->$property, $script ); - else - $script = str_replace( '['.$placeholder.']', '', $script ); - } - return $script; - } - */ - - function registerJavascripts(&$form) { - - if ($script = $this->getGlobalJavascript()) { - $form->registerGlobalJavascript($this->getRuleName(), $script); - } - - if ($script = $this->getInstanceJavascript()) { - $form->registerInstanceJavascript($script); - } - } - - function getGlobalJavascript() { - - if (isset($this->globalScript[$this->format])) { - return $this->globalScript[$this->format]; - } - } - - function getInstanceJavascript(){ - - if (isset($this->instanceScript[$this->format])) { - $script = $this->instanceScript[$this->format]; - $script = str_replace('[RULE::ID]', $this->_id, $script); - if (method_exists($this->container, 'getId')) { - $script = str_replace('[CONTAINER::ID]', $this->container->getId(), $script); - } - if (method_exists($this->container, 'getName')) { - $script = str_replace('[CONTAINER::NAME]', $this->container->getName(), $script); - } - foreach ($this->scriptPlaceholders as $placeholder => $property) { - if (isset($this->$property)) { - $script = str_replace('['.$placeholder.']', $this->$property, $script); - } else { - $script = str_replace('['.$placeholder.']', '', $script); - } - } - return $script; - } - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/Match.php b/airtime_mvc/library/propel/contrib/pat/patForms/Rule/Match.php deleted file mode 100644 index 3d47185f25..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/Match.php +++ /dev/null @@ -1,163 +0,0 @@ - - * @license LGPL, see license.txt for details - * @link http://www.php-tools.net - */ -class patForms_Rule_Match extends patForms_Rule -{ - /** - * script that will be displayed only once - * - * @access private - * @var array - */ - - var $globalScript = array( - 'html' => "/* patForms::Rule::Match */ - -function pFRC_Match(field) { - this.field = eval('pfe_' + field); -} - -pFRC_Match.prototype.validate = function() { - value = this.field.getValue(); - if (!value.match(this.pattern)) { - alert('This is an invalid value.'); - } -} - -pFRC_Match.prototype.setValue = function(pattern) { - this.pattern = pattern; -} - -/* END: patForms::Rule::Match */ -" - ); - - /** - * javascript that will be displayed once per instance - * - * @access private - * @var array - */ - var $instanceScript = array( - 'html' => "var pfr_[RULE::ID] = new pFRC_Match('[CONTAINER::NAME]');\n" - ); - - /** - * properties that have to be replaced in the instance script. - * - * @access private - * @var array - */ - var $scriptPlaceholders = array( - 'RULE::SOURCE' => '_source', - ); - - /** - * name of the rule - * - * @abstract - * @access private - */ - var $ruleName = 'Match'; - - /** - * define error codes and messages for the rule - * - * @access private - * @var array $validatorErrorCodes - * @todo translate error messages - */ - var $validatorErrorCodes = array( - "C" => array( - 1 => "This is an invalid value.", - ), - "de" => array( - 1 => "Dies ist ein ungültiger Wert.", - ), - "fr" => array( - 1 => "This is an invalid value.", - ) - ); - - /** - * the regEx pattern - * @access private - * @var string - */ - var $_pattern; - - /** - * field id that is used - * @access private - * @var string - */ - var $_field; - - private $value = 10; - - public function __construct($params) { - - parent::__construct(); - - extract($params); - $this->_pattern = $value; - } - - /** - * prepare the rule - * - * @access public - * @param object patForms - */ - function prepareRule(&$container) { - - patForms_Rule::prepareRule($container); - - $onChange = $container->getAttribute('onchange'); - $newHandler = sprintf('pfr_%s.validate();', $this->_id); - $container->setAttribute('onchange', $newHandler . $onChange); - - return true; - } - - /** - * method called by patForms or any patForms_Element to validate the - * element or the form. - * - * @access public - * @param object patForms form object - */ - function applyRule(&$element, $type = PATFORMS_RULE_AFTER_VALIDATION) { - - if (preg_match($this->_pattern, $element->getValue()) != 0){ - return true; - } - - $this->addValidationError(1); - return false; - } - - /** - * - * - * @access public - */ - function registerJavascripts(&$form) { - - parent::registerJavascripts($form); - - $script = sprintf("pfr_%s.setValue(%s);\n", $this->_id, $this->_pattern); - $form->registerInstanceJavascript($script); - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/MaxLength.php b/airtime_mvc/library/propel/contrib/pat/patForms/Rule/MaxLength.php deleted file mode 100644 index d28c2f7589..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/MaxLength.php +++ /dev/null @@ -1,161 +0,0 @@ - - * @license LGPL, see license.txt for details - * @link http://www.php-tools.net - */ -class patForms_Rule_MaxLength extends patForms_Rule -{ - /** - * script that will be displayed only once - * - * @access private - * @var array - */ - var $globalScript = array( - 'html' => "/* patForms::Rule::MaxLength */ - -function pFRC_MaxLength(field) { - this.field = eval('pfe_' + field); -} - -pFRC_MaxLength.prototype.validate = function() { - value = this.field.getValue(); - if (value.length > this.value) { - alert('Please enter a value that is max. ' + this.value + ' characters long.'); - } -} - -pFRC_MaxLength.prototype.setValue = function(value) { - this.value = value; -} - -/* END: patForms::Rule::MaxLength */ -" - ); - - /** - * javascript that will be displayed once per instance - * - * @access private - * @var array - */ - var $instanceScript = array( - 'html' => "var pfr_[RULE::ID] = new pFRC_MaxLength('[CONTAINER::NAME]');\n" - ); - - /** - * properties that have to be replaced in the instance script. - * - * @access private - * @var array - */ - var $scriptPlaceholders = array( - 'RULE::SOURCE' => '_source', - ); - - /** - * name of the rule - * - * @abstract - * @access private - */ - var $ruleName = 'MaxLength'; - - /** - * define error codes and messages for the rule - * - * @access private - * @var array $validatorErrorCodes - * @todo translate error messages - */ - var $validatorErrorCodes = array( - "C" => array( - 1 => "Please enter a value that is max. [VALUE] characters long.", - ), - "de" => array( - 1 => "Bitte geben Sie einen max. [VALUE] Zeichen langen Wert ein.", - ), - "fr" => array( - 1 => "Please enter a value that is max. [VALUE] characters long.", - ) - ); - - /** - * possible values - * @access private - * @var array - */ - var $_values; - - /** - * field id that is used - * @access private - * @var string - */ - var $_field; - - private $value = 10; - - public function __construct($params) { - - parent::__construct(); - - extract($params); - $this->value = $value; - } - - /** - * prepare the rule - * - * @access public - * @param object patForms - */ - function prepareRule(&$container) { - - patForms_Rule::prepareRule($container); - - $onChange = $container->getAttribute('onchange'); - $newHandler = sprintf('pfr_%s.validate();', $this->_id); - $container->setAttribute('onchange', $newHandler . $onChange); - - return true; - } - - /** - * method called by patForms or any patForms_Element to validate the - * element or the form. - * - * @access public - * @param object patForms form object - */ - function applyRule(&$element, $type = PATFORMS_RULE_AFTER_VALIDATION) { - - if (strlen($element->getValue()) <= $this->value) { - return true; - } - - $this->addValidationError(1, array('value' => $this->value)); - return false; - } - - /** - * - * - * @access public - */ - function registerJavascripts(&$form) { - - parent::registerJavascripts($form); - - $script = sprintf("pfr_%s.setValue(%s);\n", $this->_id, $this->value); - $form->registerInstanceJavascript($script); - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/MaxValue.php b/airtime_mvc/library/propel/contrib/pat/patForms/Rule/MaxValue.php deleted file mode 100644 index 6b25b8c840..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/MaxValue.php +++ /dev/null @@ -1,163 +0,0 @@ - - * @license LGPL, see license.txt for details - * @link http://www.php-tools.net - */ -class patForms_Rule_MaxValue extends patForms_Rule -{ - /** - * script that will be displayed only once - * - * @access private - * @var array - */ - - var $globalScript = array( - 'html' => "/* patForms::Rule::MaxValue */ - -function pFRC_MaxValue(field) { - this.field = eval('pfe_' + field); -} - -pFRC_MaxValue.prototype.validate = function() { - value = this.field.getValue(); - if (parseInt(value) != value) { - alert('Please enter a number that is less or equal to ' + this.value); - } - if (parseInt(value) > this.value) { - alert('Please enter a number that is less or equal to ' + this.value); - } -} - -pFRC_MaxValue.prototype.setMaxValue = function(value) { - this.value = value; -} - -/* END: patForms::Rule::MaxValue */ -" - ); - - /** - * javascript that will be displayed once per instance - * - * @access private - * @var array - */ - var $instanceScript = array( - 'html' => "var pfr_[RULE::ID] = new pFRC_MaxValue('[CONTAINER::NAME]');\n" - ); - - /** - * properties that have to be replaced in the instance script. - * - * @access private - * @var array - */ - var $scriptPlaceholders = array( - 'RULE::SOURCE' => '_source', - ); - - /** - * name of the rule - * - * @abstract - * @access private - */ - var $ruleName = 'MaxValue'; - - /** - * define error codes and messages for the rule - * - * @access private - * @var array $validatorErrorCodes - * @todo translate error messages - */ - var $validatorErrorCodes = array( - "C" => array( - 1 => "Please enter a number that is less or equal to [VALUE].", - ), - "de" => array( - 1 => "Bitte geben Sie eine Zahl kleiner oder gleich [VALUE] ein.", - ), - "fr" => array( - 1 => "Please enter a number that is less or equal to [VALUE].", - ) - ); - - /** - * the regEx pattern - * @access private - * @var string - */ - var $_value; - - /** - * field id that is used - * @access private - * @var string - */ - var $_field; - - public function __construct($params) { - - parent::__construct(); - - extract($params); - $this->_value = $value; - } - - /** - * prepare the rule - * - * @access public - * @param object patForms - */ - function prepareRule(&$container) { - - patForms_Rule::prepareRule($container); - - $onChange = $container->getAttribute('onchange'); - $newHandler = sprintf('pfr_%s.validate();', $this->_id); - $container->setAttribute('onchange', $newHandler . $onChange); - - return true; - } - - /** - * method called by patForms or any patForms_Element to validate the - * element or the form. - * - * @access public - * @param object patForms form object - */ - function applyRule(&$element, $type = PATFORMS_RULE_AFTER_VALIDATION) { - - if (intval($element->getValue()) <= intval($this->_value)){ - return true; - } - - $this->addValidationError(1, array('value' => $this->_value)); - return false; - } - - /** - * - * - * @access public - */ - function registerJavascripts(&$form) { - - parent::registerJavascripts($form); - - $script = sprintf("pfr_%s.setMaxValue(%s);\n", $this->_id, $this->_value); - $form->registerInstanceJavascript($script); - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/MinLength.php b/airtime_mvc/library/propel/contrib/pat/patForms/Rule/MinLength.php deleted file mode 100644 index 427600e497..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/MinLength.php +++ /dev/null @@ -1,161 +0,0 @@ - - * @license LGPL, see license.txt for details - * @link http://www.php-tools.net - */ -class patForms_Rule_MinLength extends patForms_Rule -{ - /** - * script that will be displayed only once - * - * @access private - * @var array - */ - var $globalScript = array( - 'html' => "/* patForms::Rule::MinLength */ - -function pFRC_MinLength(field) { - this.field = eval('pfe_' + field); -} - -pFRC_MinLength.prototype.validate = function() { - value = this.field.getValue(); - if (value.length < this.value) { - alert('Please enter a value that is at least ' + this.value + ' characters long.'); - } -} - -pFRC_MinLength.prototype.setValue = function(value) { - this.value = value; -} - -/* END: patForms::Rule::MinLength */ -" - ); - - /** - * javascript that will be displayed once per instance - * - * @access private - * @var array - */ - var $instanceScript = array( - 'html' => "var pfr_[RULE::ID] = new pFRC_MinLength('[CONTAINER::NAME]');\n" - ); - - /** - * properties that have to be replaced in the instance script. - * - * @access private - * @var array - */ - var $scriptPlaceholders = array( - 'RULE::SOURCE' => '_source', - ); - - /** - * name of the rule - * - * @abstract - * @access private - */ - var $ruleName = 'MinLength'; - - /** - * define error codes and messages for the rule - * - * @access private - * @var array $validatorErrorCodes - * @todo translate error messages - */ - var $validatorErrorCodes = array( - "C" => array( - 1 => "Please enter a value that is at least [VALUE] characters long.", - ), - "de" => array( - 1 => "Bitte geben Sie einen mindestens [VALUE] Zeichen langen Wert ein.", - ), - "fr" => array( - 1 => "Please enter a value that is at least [VALUE] characters long.", - ) - ); - - /** - * possible values - * @access private - * @var array - */ - var $_values; - - /** - * field id that is used - * @access private - * @var string - */ - var $_field; - - private $value = 10; - - public function __construct($params) { - - parent::__construct(); - - extract($params); - $this->value = $value; - } - - /** - * prepare the rule - * - * @access public - * @param object patForms - */ - function prepareRule(&$container) { - - patForms_Rule::prepareRule($container); - - $onChange = $container->getAttribute('onchange'); - $newHandler = sprintf('pfr_%s.validate();', $this->_id); - $container->setAttribute('onchange', $newHandler . $onChange); - - return true; - } - - /** - * method called by patForms or any patForms_Element to validate the - * element or the form. - * - * @access public - * @param object patForms form object - */ - function applyRule(&$element, $type = PATFORMS_RULE_AFTER_VALIDATION) { - - if (strlen($element->getValue()) >= $this->value) { - return true; - } - - $this->addValidationError(1, array('value' => $this->value)); - return false; - } - - /** - * - * - * @access public - */ - function registerJavascripts(&$form) { - - parent::registerJavascripts($form); - - $script = sprintf("pfr_%s.setValue(%s);\n", $this->_id, $this->value); - $form->registerInstanceJavascript($script); - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/MinValue.php b/airtime_mvc/library/propel/contrib/pat/patForms/Rule/MinValue.php deleted file mode 100644 index f31b107a4f..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/MinValue.php +++ /dev/null @@ -1,165 +0,0 @@ - - * @license LGPL, see license.txt for details - * @link http://www.php-tools.net - */ -class patForms_Rule_MinValue extends patForms_Rule -{ - /** - * script that will be displayed only once - * - * @access private - * @var array - */ - - var $globalScript = array( - 'html' => "/* patForms::Rule::MinValue */ - -function pFRC_MinValue(field) { - this.field = eval('pfe_' + field); -} - -pFRC_MinValue.prototype.validate = function() { - value = this.field.getValue(); - if (parseInt(value) != value) { - alert('Please enter a number that is greater or equal to ' + this.value); - } - if (parseInt(value) < this.value) { - alert('Please enter a number that is greater or equal to ' + this.value); - } -} - -pFRC_MinValue.prototype.setMinValue = function(value) { - this.value = value; -} - -/* END: patForms::Rule::MinValue */ -" - ); - - /** - * javascript that will be displayed once per instance - * - * @access private - * @var array - */ - var $instanceScript = array( - 'html' => "var pfr_[RULE::ID] = new pFRC_MinValue('[CONTAINER::NAME]');\n" - ); - - /** - * properties that have to be replaced in the instance script. - * - * @access private - * @var array - */ - var $scriptPlaceholders = array( - 'RULE::SOURCE' => '_source', - ); - - /** - * name of the rule - * - * @abstract - * @access private - */ - var $ruleName = 'MinValue'; - - /** - * define error codes and messages for the rule - * - * @access private - * @var array $validatorErrorCodes - * @todo translate error messages - */ - var $validatorErrorCodes = array( - "C" => array( - 1 => "Please enter a number that is greater or equal to [VALUE].", - ), - "de" => array( - 1 => "Bitte geben Sie eine Zahl größer oder gleich [VALUE] ein.", - ), - "fr" => array( - 1 => "Please enter a number that is greater or equal to [VALUE].", - ) - ); - - /** - * the regEx pattern - * @access private - * @var string - */ - var $_value; - - /** - * field id that is used - * @access private - * @var string - */ - var $_field; - - private $value = 10; - - public function __construct($params) { - - parent::__construct(); - - extract($params); - $this->_value = $value; - } - - /** - * prepare the rule - * - * @access public - * @param object patForms - */ - function prepareRule(&$container) { - - patForms_Rule::prepareRule($container); - - $onChange = $container->getAttribute('onchange'); - $newHandler = sprintf('pfr_%s.validate();', $this->_id); - $container->setAttribute('onchange', $newHandler . $onChange); - - return true; - } - - /** - * method called by patForms or any patForms_Element to validate the - * element or the form. - * - * @access public - * @param object patForms form object - */ - function applyRule(&$element, $type = PATFORMS_RULE_AFTER_VALIDATION) { - - if (intval($element->getValue()) >= intval($this->_value)){ - return true; - } - - $this->addValidationError(1, array('value' => $this->_value)); - return false; - } - - /** - * - * - * @access public - */ - function registerJavascripts(&$form) { - - parent::registerJavascripts($form); - - $script = sprintf("pfr_%s.setMinValue(%s);\n", $this->_id, $this->_value); - $form->registerInstanceJavascript($script); - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/NotMatch.php b/airtime_mvc/library/propel/contrib/pat/patForms/Rule/NotMatch.php deleted file mode 100644 index c0ff7f3655..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/NotMatch.php +++ /dev/null @@ -1,163 +0,0 @@ - - * @license LGPL, see license.txt for details - * @link http://www.php-tools.net - */ -class patForms_Rule_NotMatch extends patForms_Rule -{ - /** - * script that will be displayed only once - * - * @access private - * @var array - */ - - var $globalScript = array( - 'html' => "/* patForms::Rule::NotMatch */ - -function pFRC_NotMatch(field) { - this.field = eval('pfe_' + field); -} - -pFRC_NotMatch.prototype.validate = function() { - value = this.field.getValue(); - if (value.match(this.pattern)) { - alert('This is an invalid value.'); - } -} - -pFRC_NotMatch.prototype.setValue = function(pattern) { - this.pattern = pattern; -} - -/* END: patForms::Rule::NotMatch */ -" - ); - - /** - * javascript that will be displayed once per instance - * - * @access private - * @var array - */ - var $instanceScript = array( - 'html' => "var pfr_[RULE::ID] = new pFRC_NotMatch('[CONTAINER::NAME]');\n" - ); - - /** - * properties that have to be replaced in the instance script. - * - * @access private - * @var array - */ - var $scriptPlaceholders = array( - 'RULE::SOURCE' => '_source', - ); - - /** - * name of the rule - * - * @abstract - * @access private - */ - var $ruleName = 'NotMatch'; - - /** - * define error codes and messages for the rule - * - * @access private - * @var array $validatorErrorCodes - * @todo translate error messages - */ - var $validatorErrorCodes = array( - "C" => array( - 1 => "This is an invalid value.", - ), - "de" => array( - 1 => "Dies ist ein ungültiger Wert.", - ), - "fr" => array( - 1 => "This is an invalid value.", - ) - ); - - /** - * the regEx pattern - * @access private - * @var string - */ - var $_pattern; - - /** - * field id that is used - * @access private - * @var string - */ - var $_field; - - private $value = 10; - - public function __construct($params) { - - parent::__construct(); - - extract($params); - $this->_pattern = $value; - } - - /** - * prepare the rule - * - * @access public - * @param object patForms - */ - function prepareRule(&$container) { - - patForms_Rule::prepareRule($container); - - $onChange = $container->getAttribute('onchange'); - $newHandler = sprintf('pfr_%s.validate();', $this->_id); - $container->setAttribute('onchange', $newHandler . $onChange); - - return true; - } - - /** - * method called by patForms or any patForms_Element to validate the - * element or the form. - * - * @access public - * @param object patForms form object - */ - function applyRule(&$element, $type = PATFORMS_RULE_AFTER_VALIDATION) { - - if (preg_match($this->_pattern, $element->getValue()) == 0){ - return true; - } - - $this->addValidationError(1); - return false; - } - - /** - * - * - * @access public - */ - function registerJavascripts(&$form) { - - parent::registerJavascripts($form); - - $script = sprintf("pfr_%s.setValue(%s);\n", $this->_id, $this->_pattern); - $form->registerInstanceJavascript($script); - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/ValidValues.php b/airtime_mvc/library/propel/contrib/pat/patForms/Rule/ValidValues.php deleted file mode 100644 index 290ace0edc..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Rule/ValidValues.php +++ /dev/null @@ -1,182 +0,0 @@ - - * @license LGPL, see license.txt for details - * @link http://www.php-tools.net - */ -class patForms_Rule_ValidValues extends patForms_Rule -{ - /** - * script that will be displayed only once - * - * @access private - * @var array - */ - var $globalScript = array( - 'html' => "/* patForms::Rule::ValidValues */ - -Array.prototype.inArray = function(value) { - var i; - for (i=0; i < this.length; i++) { - if (this[i] === value) { - return true; - } - } - return false; -}; - -function pFRC_ValidValue(field) { - this.field = eval('pfe_' + field); -} - -pFRC_ValidValue.prototype.validate = function() { - value = this.field.getValue(); - for (var i = 0; i < this.values.length; i++) { - if (this.values[i] === value) { - return true; - } - } - var msg = 'Please enter one of the following values: '; - for (var i = 0; i < this.values.length; i++) { - msg = msg + this.values[i]; - if (i < this.values.length - 1) { - msg = msg + ', '; - } - } - alert(msg); -} - -pFRC_ValidValue.prototype.setValues = function(values) { - this.values = values; -} - -/* END: patForms::Rule::ValidValue */ -" - ); - - /** - * javascript that will be displayed once per instance - * - * @access private - * @var array - */ - var $instanceScript = array( - 'html' => "var pfr_[RULE::ID] = new pFRC_ValidValue('[CONTAINER::NAME]');\n" - ); - - /** - * properties that have to be replaced in the instance script. - * - * @access private - * @var array - */ - var $scriptPlaceholders = array( - 'RULE::SOURCE' => '_source', - ); - - /** - * name of the rule - * - * @abstract - * @access private - */ - var $ruleName = 'ValidValue'; - - /** - * define error codes and messages for the rule - * - * @access private - * @var array $validatorErrorCodes - * @todo translate error messages - */ - var $validatorErrorCodes = array( - "C" => array( - 1 => "Please enter one of the following values: [VALUES].", - ), - "de" => array( - 1 => "Bitte geben Sie einen der folgenden Werte ein: [VALUES].", - ), - "fr" => array( - 1 => "Please enter one of the following values: [VALUES].", - ) - ); - - /** - * possible values - * @access private - * @var array - */ - var $_values; - - /** - * field id that is used - * @access private - * @var string - */ - var $_field; - - public function __construct($params) { - - parent::__construct(); - - extract($params); - $this->_values = explode('|', $value); - } - - /** - * prepare the rule - * - * @access public - * @param object patForms - */ - function prepareRule(&$container) { - - patForms_Rule::prepareRule($container); - - $onChange = $container->getAttribute('onchange'); - $newHandler = sprintf('pfr_%s.validate();', $this->_id); - $container->setAttribute('onchange', $newHandler . $onChange); - - return true; - } - - /** - * method called by patForms or any patForms_Element to validate the - * element or the form. - * - * @access public - * @param object patForms form object - */ - function applyRule(&$element, $type = PATFORMS_RULE_AFTER_VALIDATION) { - - if (in_array($element->getValue(), $this->_values)) { - return true; - } - - $this->addValidationError(1, array('values' => implode(', ', $this->_values))); - return false; - } - - /** - * - * - * @access public - */ - function registerJavascripts(&$form) { - - parent::registerJavascripts($form); - - foreach ($this->_values as $value) { - $values[] = "'$value'"; - } - $script = sprintf("pfr_%s.setValues(new Array(%s));\n", $this->_id, implode(', ', $values)); - $form->registerInstanceJavascript($script); - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/Storage/Propel.php b/airtime_mvc/library/propel/contrib/pat/patForms/Storage/Propel.php deleted file mode 100644 index f90c81dbba..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/Storage/Propel.php +++ /dev/null @@ -1,146 +0,0 @@ -peer = new $peername(); - $this->peername = $peername; - - $parts = explode('.', explode('.', $this->peer->getOMClass())); - $this->classname = array_pop($parts); - - $this->setPrimaryField('Id'); - } - - private function getCriteria($values) { - - $object = new $this->classname(); - //$object->populateFromArray($values); //TODO use a workaround until we'll get phpNamed keys in populateFromArray() - $object = $this->populateObjectFromArray($object, $values); - return $object->buildPkeyCriteria(); - } - - /** - * get an entry - * - * This tries to find an entry in the storage container - * that matches the current data that has been set in the - * form and populates the form with the data of this - * entry - * - * @access public - * @param object patForms patForms object that should be stored - * @return boolean true on success - */ - public function loadEntry(&$form) { - - if (!$object = $this->_entryExists($form->getValues())) { - // entry does not exists (why return an array here??) - return array(); - } - - $form->setValues($object->toArray()); - return true; - } - - public function validateEntry(&$form) { - - if (!$object = $this->_entryExists($form->getValues())) { - $object = new $this->classname(); - } - //$object->populateFromArray($form->getValues()); //TODO use a workaround until we'll get phpNamed keys in populateFromArray() - $object = $this->populateObjectFromArray($object, $form->getValues()); - $result = $object->validate(); - - if ($result !== true) { - $mapBuilder = $this->peer->getMapBuilder(); - $dbMap = $mapBuilder->getDatabaseMap(); - foreach ($result as $colname => $error) { - list($tablename, $colname) = explode('.', $colname); - $column = $dbMap->getTable($tablename)->getColumn($colname); - $element = $form->getElement($column->getPhpName()); - $element->addValidatorErrorCodes(array( - 'C' => array( - 1 => $error->getMessage() . ' (occured in Storage)', - ), - ), 1000); - $element->addValidationError(1001); - } - return false; - } - } - - /** - * adds an entry to the storage - * - * @param object patForms patForms object that should be stored - * @return boolean true on success - */ - public function _addEntry(&$form) { - - $object = new $this->classname(); - //$object->populateFromArray($form->getValues()); //TODO use a workaround until we'll get phpNamed keys in populateFromArray() - $object = $this->populateObjectFromArray($object, $form->getValues()); - $object->save(); - return true; - } - - /** - * updates an entry in the storage - * - * @param object patForms patForms object that should be stored - * @return boolean true on success - */ - public function _updateEntry(&$form, $primary) { - - $object = $this->_entryExists($form->getValues()); - //$object->populateFromArray($form->getValues()); //TODO use a workaround until we'll get phpNamed keys in populateFromArray() - $object = $this->populateObjectFromArray($object, $form->getValues()); - $object->save(); - return true; - } - - /** - * check, whether an entry exists - * - * @access private - * @param array - */ - public function _entryExists($values) { - - // This method gets called multiple times, e.g. when an existing - // object gets updated. We'll therefor cache results locally using - // a criteria string representation as hash. - - static $objects; - $criteria = $this->getCriteria($values); - $hash = $criteria->toString(); - - if (isset($objects[$hash])) { - return $objects[$hash]; - } - - $objects[$hash] = $this->peer->doSelectOne($criteria); - - if (empty($objects[$hash])) { - return false; - } - return $objects[$hash]; - } - - // this method is just a workaround - - private function populateObjectFromArray($object, $values) { - - foreach (array_keys($object->toArray()) as $key) { - if (array_key_exists($key, $values)) { - $object->{'set' . $key}($values[$key]); - } - } - return $object; - } -} diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/res/form.dynamic.tpl b/airtime_mvc/library/propel/contrib/pat/patForms/res/form.dynamic.tpl deleted file mode 100644 index 3935ea6c19..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/res/form.dynamic.tpl +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - {TITLE} - - - - - - - {START} - -
-

Validation failed

-

Sorry, your input could not be saved for the following reasons:

-
    - -
  • {FIELD}: {MESSAGE}
  • -
    -
-
-
- - - {ELEMENT} - - -
- -
{ELEMENT}
-
{DESCRIPTION}
-
-
-
-
- -
- {END} -
- - - -
\ No newline at end of file diff --git a/airtime_mvc/library/propel/contrib/pat/patForms/res/mysql-dump.bookstore.sql b/airtime_mvc/library/propel/contrib/pat/patForms/res/mysql-dump.bookstore.sql deleted file mode 100644 index 48c0ceeb1f..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms/res/mysql-dump.bookstore.sql +++ /dev/null @@ -1,10 +0,0 @@ - -# This first example is tested with a Bookstore project on MySql -# (default setting Sqlite has not been tested) -# -# Additionally, you'll need some data in your tables. In case you -# don't have - here's a mini-dump to get the example running. - -INSERT INTO `author` VALUES (1, 'Martin', 'Heidegger'); -INSERT INTO `book` VALUES (1, 'Sein und Zeit', '3484701226', NULL, NULL); -INSERT INTO `publisher` VALUES (1, 'Max Niemeyer Verlag'); \ No newline at end of file diff --git a/airtime_mvc/library/propel/contrib/pat/patForms_Storage_Propel_test.php b/airtime_mvc/library/propel/contrib/pat/patForms_Storage_Propel_test.php deleted file mode 100644 index 04d3bdff17..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patForms_Storage_Propel_test.php +++ /dev/null @@ -1,97 +0,0 @@ - 2); - - -/** - * the rest should work out of the box if you don't have any unusal - * types in your database schema.xml (strings, int etc. should work) - */ - -require_once 'bookstore/' . $classname . '.php'; -Propel::init($propelConfFilename); - -// create a form definition - -$definition = patForms_Definition_Propel::create(array( - 'name' => $classname, - 'filename' => $path . '/form.' . $classname . '.xml', -)); - -// create a storage - -$storage = patForms::createStorage('Propel'); -$storage->setStorageLocation($classname . 'peer'); - -// create a form - -$form = &patForms::createCreator('Definition')->create($definition); -$form->setRenderer(patForms::createRenderer('Array')); -$form->setStorage($storage); -if (isset($pk)) { - $form->setValues($pk); -} - -// render it to a patTemplate (could be done by other template engines) - -$tpl = new patTemplate(); -$tpl->setRoot($path); -$tpl->readTemplatesFromInput('form.dynamic.tpl'); - -$tpl->addVar('page', 'title', 'Bookstore party'); -$tpl->addVar('form', 'start', $form->serializeStart()); -$tpl->addVar('form', 'end', $form->serializeEnd()); -$tpl->addRows('elements', $form->renderForm()); - -// this should be possible to be done in a more elegant way -if ($errors = $form->getValidationErrors()) { - foreach ($errors as $field => $error) { - $tpl->addVar('error', 'field', $field); - foreach ($error as $line) { - $tpl->addVar('error', 'message', $line['message']); - $tpl->addVar('error', 'code', $line['code']); - $tpl->parseTemplate('error', 'a'); - } - } - $tpl->setAttribute('errors', 'visibility', 'visible'); -} - -$tpl->displayParsedTemplate(); diff --git a/airtime_mvc/library/propel/contrib/pat/patTemplate.php b/airtime_mvc/library/propel/contrib/pat/patTemplate.php deleted file mode 100644 index 01347f63ab..0000000000 --- a/airtime_mvc/library/propel/contrib/pat/patTemplate.php +++ /dev/null @@ -1,2378 +0,0 @@ - - * @license LGPL - * @link http://www.php-tools.net - */ - -/** - * template already exists - */ -define( 'PATTEMPLATE_ERROR_TEMPLATE_EXISTS', 5010 ); - -/** - * template does not exist - */ -define ( 'PATTEMPLATE_WARNING_NO_TEMPLATE', 5011 ); - -/** - * unknown type - */ -define ( 'PATTEMPLATE_WARNING_UNKNOWN_TYPE', 5012 ); - -/** - * base class for module could not be found - */ -define( 'PATTEMPLATE_ERROR_BASECLASS_NOT_FOUND', 5050 ); - -/** - * module could not be found - */ -define( 'PATTEMPLATE_ERROR_MODULE_NOT_FOUND', 5051 ); - -/** - * array expected - */ -define( 'PATTEMPLATE_ERROR_EXPECTED_ARRAY', 5052 ); - -/** - * No input - */ -define( 'PATTEMPLATE_ERROR_NO_INPUT', 6000 ); - -/** - * patTemplate - * - * powerful templating engine - * - * @version 3.0.0 - * @package patTemplate - * @author Stephan Schmidt - * @license LGPL - * @link http://www.php-tools.net - */ -class patTemplate -{ - /** - * standard system vars that identify pat tools - * @var array - */ - var $_systemVars = array( - 'appName' => 'patTemplate', - 'appVersion' => '3.0.0', - 'author' => array( - 'Stephan Schmidt ' - ) - ); - - /** - * default attributes for new templates - * @access private - * @var array - */ - var $_defaultAttributes = array( - 'type' => 'standard', - 'visibility' => 'visible', - 'loop' => 1, - 'unusedvars' => 'strip', - 'whitespace' => 'keep', - 'autoclear' => 'off', - 'autoload' => 'on' - ); - - /** - * options for patTemplate - * - * Currently the following options are implemented: - * - maintainBc defines, whether patTemplate should be backwards compatible. - * This means, that you may use 'default' and 'empty' for subtemplates. - * - * @access private - * @var array - */ - var $_options = array( - 'startTag' => '{', - 'endTag' => '}', - 'root' => '.', - 'namespace' => 'patTemplate', - 'maintainBc' => true - ); - - /** - * start tag - * - * @access private - * @var string - */ - var $_startTag = '{'; - - /** - * end tag - * - * @access private - * @var string - */ - var $_endTag = '}'; - - /** - * loaded modules - * - * Modules are: - * - Readers - * - Caches - * - Variable modifiers - * - Filters - * - * @access private - * @var array - */ - var $_modules = array(); - - /** - * directories, where modules can be stored - * @access private - * @var array - */ - var $_moduleDirs = array(); - - /** - * stores all template names - * @access private - * @var array - */ - var $_templateList = array(); - - /** - * stores all template data - * @access private - * @var array - */ - var $_templates = array(); - - /** - * stores all global variables - * @access private - * @var array - */ - var $_globals = array(); - - /** - * stores all local variables - * @access private - * @var array - */ - var $_vars = array(); - - /** - * stores the name of the first template that has been - * found - * - * @access private - * @var string - */ - var $_root; - - /** - * output filters that should be used - * - * @access private - * @var array - */ - var $_outputFilters = array(); - - /** - * input filters that should be used - * - * @access private - * @var array - */ - var $_inputFilters = array(); - - /** - * template cache, that should be used - * - * @access private - * @var array - */ - var $_tmplCache = null; - - /** - * Create a new patTemplate instance. - * - * The constructor accepts the type of the templates as sole parameter. - * You may choose one of: - * - html (default) - * - tex - * - * The type influences the tags you are using in your templates. - * - * @access public - * @param string type (either html or tex) - */ - function patTemplate( $type = 'html' ) - { - if ( !defined( 'PATTEMPLATE_INCLUDE_PATH' ) ) - define( 'PATTEMPLATE_INCLUDE_PATH', dirname( __FILE__ ) . '/patTemplate' ); - - $this->setType( $type ); - } - - /** - * sets an option - * - * Currently, the following options are supported - * - maintainBc (true|false) - * - namespace (string) - * - * @access public - * @param string option to set - * @param string value of the option - */ - function setOption( $option, $value ) - { - $this->_options[$option] = $value; - } - - /** - * gets an option - * - * @access public - * @param string option to get - * @return mixed value of the option - */ - function getOption( $option ) - { - if ( !isset( $this->_options[$option] ) ) - return null; - return $this->_options[$option]; - } - - /** - * sets name of directory where templates are stored - * - * @access public - * @param string dir where templates are stored - * @deprecated please use patTemplate::setRoot() instead - */ - function setBasedir( $basedir ) - { - $this->_options['root'] = $basedir; - } - - /** - * sets root base for the template - * - * The parameter depends on the reader you are using. - * - * @access public - * @param string root base of the templates - */ - function setRoot( $root ) - { - $this->_options['root'] = $root; - } - - /** - * gets name of root base for the templates - * - * @access public - * @return mixed root base - */ - function getRoot() - { - return $this->_options['root']; - } - - /** - * sets namespace of patTemplate tags - * - * @access public - * @param string namespace - */ - function setNamespace( $ns ) - { - $this->_options['namespace'] = $ns; - } - - /** - * gets namespace of patTemplate tags - * - * @access public - * @return string namespace - */ - function getNamespace() - { - return $this->_options['namespace']; - } - - /** - * set default attribute - * - * @access public - * @param string attribute name - * @param mixed attribute value - */ - function setDefaultAttribute( $name, $value ) - { - $this->_defaultAttributes[$name] = $value; - } - - /** - * set default attributes - * - * @access public - * @param array attributes - */ - function setDefaultAttributes( $attributes ) - { - $this->_defaultAttributes = array_merge( $this->_defaultAttributes, $attributes ); - } - - /** - * get default attributes - * - * @access public - * @return return default attributes - */ - function getDefaultAttributes() - { - return $this->_defaultAttributes; - } - - /** - * set the type for the templates - * - * @access public - * @param string type (html or tex) - * @return boolean true on success - */ - function setType( $type ) - { - switch( strtolower( $type ) ) - { - case "tex": - $this->setTags( '<{', '}>' ); - break; - case "html": - $this->setTags( '{', '}' ); - break; - default: - return patErrorManager::raiseWarning( - PATTEMPLATE_WARNING_UNKNOWN_TYPE, - "Unknown type '$type'. Please use 'html' or 'tex'." - ); - } - return true; - } - - /** - * set the start and end tag for variables - * - * @access public - * @param string start tag - * @param string end tag - * @return boolean true on success - */ - function setTags( $startTag, $endTag ) - { - $this->_options['startTag'] = $startTag; - $this->_options['endTag'] = $endTag; - - $this->_startTag = $startTag; - $this->_endTag = $endTag; - return true; - } - - /** - * get start tag for variables - * - * @access public - * @return string start tag - */ - function getStartTag() - { - return $this->_options['startTag']; - } - - /** - * get end tag for variables - * - * @access public - * @return string end tag - */ - function getEndTag() - { - return $this->_options['endTag']; - } - - /** - * add a directory where patTemplate should search for - * modules. - * - * You may either pass a string or an array of directories. - * - * patTemplate will be searching for a module in the same - * order you added them. If the module cannot be found in - * the custom folders, it will look in - * patTemplate/$moduleType. - * - * @access public - * @param string module type - * @param string|array directory or directories to search. - */ - function addModuleDir( $moduleType, $dir ) - { - if ( !isset( $this->_moduleDirs[$moduleType] ) ) - $this->_moduleDirs[$moduleType] = array(); - if ( is_array( $dir ) ) - $this->_moduleDirs[$moduleType] = array_merge( $this->_moduleDirs[$moduleType], $dir ); - else - array_push( $this->_moduleDirs[$moduleType], $dir ); - } - - /** - * Sets an attribute of a template - * - * supported attributes: visibilty, loop, parse, unusedvars - * - * @param string $template name of the template - * @param string $attribute name of the attribute - * @param mixed $value value of the attribute - * @access public - * @see setAttributes(),getAttribute(), clearAttribute() - */ - function setAttribute( $template, $attribute, $value ) - { - $template = strtolower( $template ); - if ( !isset( $this->_templates[$template] ) ) - { - return patErrorManager::raiseWarning( - PATTEMPLATE_WARNING_NO_TEMPLATE, - "Template '$template' does not exist." - ); - } - - $attribute = strtolower( $attribute ); - $this->_templates[$template]['attributes'][$attribute] = $value; - return true; - } - - /** - * Sets several attribute of a template - * - * $attributes has to be a assotiative arrays containing attribute/value pairs - * supported attributes: visibilty, loop, parse, unusedvars - * - * @param string $template name of the template - * @param array $attributes attribute/value pairs - * @access public - * @see setAttribute(), getAttribute(), clearAttribute() - */ - function setAttributes( $template, $attributes ) - { - if ( !is_array( $attributes ) ) - { - return patErrorManager::raiseError( PATTEMPLATE_ERROR_EXPECTED_ARRAY, 'patTemplate::setAttributes: Expected array as second parameter, '.gettype( $attributes ).' given' ); - } - - $template = strtolower( $template ); - $attributes = array_change_key_case( $attributes ); - if ( !isset( $this->_templates[$template] ) ) - { - return patErrorManager::raiseWarning( - PATTEMPLATE_WARNING_NO_TEMPLATE, - "Template '$template' does not exist." - ); - } - - $this->_templates[$template]['attributes'] = array_merge( $this->_templates[$template]['attributes'], $attributes ); - return true; - } - - /** - * Get all attributes of a template - * - * @param string name of the template - * @return array attributes - * @access public - */ - function getAttributes( $template ) - { - $template = strtolower( $template ); - if ( !isset( $this->_templates[$template] ) ) - { - return patErrorManager::raiseWarning( - PATTEMPLATE_WARNING_NO_TEMPLATE, - "Template '$template' does not exist." - ); - } - return $this->_templates[$template]['attributes']; - } - - /** - * Gets an attribute of a template - * - * supported attributes: visibilty, loop, parse, unusedvars - * - * @param string $template name of the template - * @param string $attribute name of the attribute - * @return mixed value of the attribute - * @access public - * @see setAttribute(), setAttributes(), clearAttribute() - */ - function getAttribute( $template, $attribute ) - { - $template = strtolower( $template ); - $attribute = strtolower( $attribute ); - if ( !isset( $this->_templates[$template] ) ) - { - return patErrorManager::raiseWarning( - PATTEMPLATE_WARNING_NO_TEMPLATE, - "Template '$template' does not exist." - ); - } - return $this->_templates[$template]['attributes'][$attribute]; - } - - /** - * Clears an attribute of a template - * - * supported attributes: visibilty, loop, parse, unusedvars - * - * @param string $template name of the template - * @param string $attribute name of the attribute - * @access public - * @see setAttribute(), setAttributes(), getAttribute() - */ - function clearAttribute( $template, $attribute ) - { - $template = strtolower( $template ); - $attribute = strtolower( $attribute ); - - if ( !isset( $this->_templates[$template] ) ) - { - return patErrorManager::raiseWarning( - PATTEMPLATE_WARNING_NO_TEMPLATE, - "Template '$template' does not exist." - ); - } - $this->_templates[$template]['attributes'][$attribute] = '';; - return true; - } - - /** - * Prepare a template - * - * This can be used if you want to add variables to - * a template, that has not been loaded yet. - * - * @access public - * @param string template name - */ - function prepareTemplate( $name ) - { - $name = strtolower( $name ); - if ( !isset( $this->_vars[$name] ) ) - { - $this->_vars[$name] = array( - 'scalar' => array(), - 'rows' => array() - ); - } - } - - /** - * add a variable to a template - * - * A variable may also be an indexed array, but _not_ - * an associative array! - * - * @access public - * @param string $template name of the template - * @param string $varname name of the variable - * @param mixed $value value of the variable - */ - function addVar( $template, $varname, $value ) - { - $template = strtolower( $template ); - $varname = strtoupper( $varname ); - - if ( !is_array( $value ) ) - { - $this->_vars[$template]['scalar'][$varname] = $value; - return true; - } - - $cnt = count( $value ); - for ( $i = 0; $i < $cnt; $i++ ) - { - if ( !isset( $this->_vars[$template]['rows'][$i] ) ) - $this->_vars[$template]['rows'][$i] = array(); - - $this->_vars[$template]['rows'][$i][$varname] = $value[$i]; - } - - return true; - } - - /** - * get the value of a variable - * - * @access public - * @param string name of the template - * @param string name of the variable - * @return string value of the variable, null if the variable is not set - */ - function getVar( $template, $varname ) - { - $template = strtolower( $template ); - $varname = strtoupper( $varname ); - - if ( isset( $this->_vars[$template]['scalar'][$varname] ) ) - return $this->_vars[$template]['scalar'][$varname]; - - $value = array(); - - $cnt = count( $this->_vars[$template]['rows'] ); - for ( $i = 0; $i < $cnt; $i++ ) - { - if ( !isset( $this->_vars[$template]['rows'][$i][$varname] ) ) - continue; - array_push( $value, $this->_vars[$template]['rows'][$i][$varname] ); - } - if ( !empty( $value ) ) - return $value; - return null; - } - - /** - * Adds several variables to a template - * - * Each Template can have an unlimited amount of its own variables - * $variables has to be an assotiative array containing variable/value pairs - * - * @param string $template name of the template - * @param array $variables assotiative array of the variables - * @param string $prefix prefix for all variable names - * @access public - * @see addVar(), addRows(), addGlobalVar(), addGlobalVars() - */ - function addVars( $template, $variables, $prefix = '' ) - { - $template = strtolower( $template ); - $prefix = strtoupper( $prefix ); - $variables = array_change_key_case( $variables, CASE_UPPER ); - - foreach ( $variables as $varname => $value ) - { - $varname = $prefix.$varname; - - if ( !is_array( $value ) ) { - if (!is_scalar($value)) { - continue; - } - $this->_vars[$template]['scalar'][$varname] = $value; - continue; - } - - $cnt = count( $value ); - for ( $i = 0; $i < $cnt; $i++ ) - { - if ( !isset( $this->_vars[$template]['rows'][$i] ) ) - $this->_vars[$template]['rows'][$i] = array(); - - $this->_vars[$template]['rows'][$i][$varname] = $value[$i]; - } - } - } - - /** - * Adds several rows of variables to a template - * - * Each Template can have an unlimited amount of its own variables - * Can be used to add a database result as variables to a template - * - * @param string $template name of the template - * @param array $rows array containing assotiative arrays with variable/value pairs - * @param string $prefix prefix for all variable names - * @access public - * @see addVar(), addVars(), addGlobalVar(), addGlobalVars() - */ - function addRows( $template, $rows, $prefix = '' ) - { - $template = strtolower( $template ); - $prefix = strtoupper( $prefix ); - - $cnt = count( $rows ); - for ( $i = 0; $i < $cnt; $i++ ) - { - if ( !isset( $this->_vars[$template]['rows'][$i] ) ) - $this->_vars[$template]['rows'][$i] = array(); - - $rows[$i] = array_change_key_case( $rows[$i], CASE_UPPER ); - - foreach ( $rows[$i] as $varname => $value ) - { - $this->_vars[$template]['rows'][$i][$prefix.$varname] = $value; - } - } - } - - /** - * Adds an object to a template - * - * All properties of the object will be available as template variables. - * - * @param string name of the template - * @param object|array object or array of objects - * @param string prefix for all variable names - * @access public - * @see addVar(), addRows(), addGlobalVar(), addGlobalVars() - */ - function addObject( $template, $object, $prefix = '' ) - { - if ( is_array( $object ) ) - { - $rows = array(); - foreach ( $object as $o ) - array_push( $rows, get_object_vars( $o ) ); - - $this->addRows( $template, $rows, $prefix ); - return true; - } - elseif ( is_object( $object ) ) - { - $this->addVars( $template, get_object_vars( $object ), $prefix ); - return true; - } - return false; - } - - /** - * Adds a global variable - * - * Global variables are valid in all templates of this object. - * A global variable has to be scalar, it will be converted to a string. - * - * @access public - * @param string $varname name of the global variable - * @param string $value value of the variable - * @return boolean true on success - * @see addGlobalVars(), addVar(), addVars(), addRows() - */ - function addGlobalVar( $varname, $value ) - { - $this->_globals[strtoupper( $varname )] = ( string )$value; - return true; - } - - /** - * Adds several global variables - * - * Global variables are valid in all templates of this object. - * - * $variables is an associative array, containing name/value pairs of the variables. - * - * @access public - * @param array $variables array containing the variables - * @param string $prefix prefix for variable names - * @return boolean true on success - * @see addGlobalVar(), addVar(), addVars(), addRows() - */ - function addGlobalVars( $variables, $prefix = '' ) - { - $variables = array_change_key_case( $variables, CASE_UPPER ); - $prefix = strtoupper( $prefix ); - foreach ( $variables as $varname => $value ) - { - $this->_globals[$prefix.$varname] = ( string )$value; - } - return true; - } - - /** - * get all global variables - * - * @access public - * @return array global variables - */ - function getGlobalVars() - { - return $this->_globals; - } - - /** - * checks wether a template exists - * - * @access public - * @param string name of the template - * @return boolean true, if the template exists, false otherwise - */ - function exists( $name ) - { - return in_array( strtolower( $name ), $this->_templateList ); - } - - /** - * enable a template cache - * - * A template cache will improve performace, as the templates - * do not have to be read on each request. - * - * @access public - * @param string name of the template cache - * @param array parameters for the template cache - * @return boolean true on success, patError otherwise - */ - function useTemplateCache( $cache, $params = array() ) - { - if ( !is_object( $cache ) ) - { - $cache = &$this->loadModule( 'TemplateCache', $cache, $params ); - } - if ( patErrorManager::isError( $cache ) ) - return $cache; - - $this->_tmplCache = &$cache; - return true; - } - - /** - * enable an output filter - * - * Output filters are used to modify the template - * result before it is sent to the browser. - * - * They are applied, when displayParsedTemplate() is called. - * - * @access public - * @param string name of the output filter - * @param array parameters for the output filter - * @return boolean true on success, patError otherwise - */ - function applyOutputFilter( $filter, $params = array() ) - { - if ( !is_object( $filter ) ) - { - $filter = &$this->loadModule( 'OutputFilter', $filter, $params ); - } - if ( patErrorManager::isError( $filter ) ) - return $filter; - - $this->_outputFilters[] = &$filter; - return true; - } - - /** - * enable an input filter - * - * input filters are used to modify the template - * stream before it is split into smaller templates- - * - * @access public - * @param string name of the input filter - * @param array parameters for the input filter - * @return boolean true on success, patError otherwise - */ - function applyInputFilter( $filter, $params = array() ) - { - if ( !is_object( $filter ) ) - { - $filter = &$this->loadModule( 'InputFilter', $filter, $params ); - } - if ( patErrorManager::isError( $filter ) ) - return $filter; - - $this->_inputFilters[] = &$filter; - return true; - } - - /** - * open a file and parse for patTemplate tags - * - * @access public - * @param name of the file - * @return true, if the template could be parsed - * @deprecated Use patTemplate::readTemplatesFromInput() instead, as the method name is misleading - * @see readTemplatesFromInput() - */ - function readTemplatesFromFile( $filename ) - { - return $this->readTemplatesFromInput( $filename, 'File' ); - } - - /** - * open any input and parse for patTemplate tags - * - * @access public - * @param string name of the input (filename, shm segment, etc.) - * @param string driver that is used as reader, you may also pass a Reader object - * @param array additional options that will only be used for this template - * @param string name of the template that should be used as a container, should not be used by public - * calls. - * @return boolean true, if the template could be parsed, false otherwise - */ - function readTemplatesFromInput( $input, $reader = 'File', $options = null, $parseInto = null ) - { - if ($input === '') { - return patErrorManager::raiseError(PATTEMPLATE_ERROR_NO_INPUT, 'No input to read has been passed.'); - } - - if ( is_array( $options ) ) - $options = array_merge( $this->_options, $options ); - else - $options = $this->_options; - - if ( !is_null( $parseInto ) ) - $parseInto = strtolower( $parseInto ); - - $templates = false; - if ( $this->_tmplCache !== null ) - { - /** - * get the unique cache key - */ - $key = $this->_tmplCache->getKey( $input, $options ); - - $templates = $this->_loadTemplatesFromCache( $input, $reader, $options, $key ); - - /** - * check for error returned from cache - */ - if ( patErrorManager::isError( $templates ) ) - return $templates; - } - - /** - * templates have not been loaded from cache - */ - if ( $templates === false ) - { - if ( !is_object( $reader ) ) - { - $reader = &$this->loadModule( 'Reader', $reader ); - if ( patErrorManager::isError( $reader ) ) - return $reader; - } - $reader->setOptions( $options ); - - /** - * set the root attributes - */ - if ( !is_null( $parseInto ) ) - { - $attributes = $this->getAttributes( $parseInto ); - if ( !patErrorManager::isError( $attributes ) ) - { - $reader->setRootAttributes( $attributes ); - } - } - - $templates = $reader->readTemplates( $input ); - - /** - * check for error returned from reader - */ - if ( patErrorManager::isError( $templates ) ) - return $templates; - - /** - * store the - */ - if ( $this->_tmplCache !== null ) - { - $this->_tmplCache->write( $key, $templates ); - } - } - - /** - * traverse all templates - */ - foreach ( $templates as $name => $spec ) - { - /** - * root template - */ - if ( $name == '__ptroot' ) - { - if ( $parseInto === false ) - { - continue; - } - if ( !in_array( $parseInto, $this->_templateList ) ) - continue; - - $spec['loaded'] = true; - $spec['attributes'] = $this->_templates[$parseInto]['attributes']; - $name = $parseInto; - } - else - { - /** - * store the name - */ - array_push( $this->_templateList, $name ); - } - - /** - * if this is the first template that has been loaded - * set it as the root template - */ - if ( $this->_root === null && is_null( $parseInto ) && isset( $spec['isRoot'] ) && $spec['isRoot'] == true ) - { - $this->_root = $name; - } - - /** - * set some default values - */ - $spec['iteration'] = 0; - $spec['lastMode'] = 'w'; - $spec['result'] = ''; - $spec['modifyVars'] = array(); - $spec['copyVars'] = array(); - $spec['defaultVars'] = array(); - - /** - * store the template - */ - $this->_templates[$name] = $spec; - - $this->prepareTemplate( $name ); - - /** - * store the default values of the variables - */ - foreach ( $spec['varspecs'] as $varname => $varspec ) - { - if ( isset( $varspec['modifier'] ) ) - { - $this->_templates[$name]['modifyVars'][$varname] = $varspec['modifier']; - } - - if ( isset( $varspec['copyfrom'] ) ) - { - $this->_templates[$name]['copyVars'][$varname] = $varspec['copyfrom']; - } - - if ( !isset( $varspec['default'] ) ) - continue; - - $this->_templates[$name]['defaultVars'][$varname] = $varspec['default']; - - if ( !is_null( $this->getVar( $name, $varname ) ) ) - continue; - - $this->addVar( $name, $varname, $varspec['default'] ); - } - - unset($this->_templates[$name]['varspecs']); - - /** - * autoload the template - * - * Some error management is needed here... - */ - if ( isset( $this->_templates[$name]['attributes']['src'] ) && $this->_templates[$name]['attributes']['autoload'] == 'on' ) - { - if ( $this->_templates[$name]['loaded'] !== true ) - { - if ( $this->_templates[$name]['attributes']['parse'] == 'on' ) - { - $this->readTemplatesFromInput( $this->_templates[$name]['attributes']['src'], $this->_templates[$name]['attributes']['reader'], $options, $name ); - } - else - { - $this->loadTemplateFromInput( $this->_templates[$name]['attributes']['src'], $this->_templates[$name]['attributes']['reader'], null, $name ); - } - $this->_templates[$name]['loaded'] = true; - } - } - } - - return true; - } - - /** - * load from template cache - * - * @access private - * @param string name of the input (filename, shm segment, etc.) - * @param string driver that is used as reader, you may also pass a Reader object - * @param array options for the reader - * @param string cache key - * @return array|boolean either an array containing the templates, or false - */ - function _loadTemplatesFromCache( $input, &$reader, $options, $key ) - { - if ( is_object( $reader ) ) - $statName = $reader->getName(); - else - $statName = $reader; - - $stat = &$this->loadModule( 'Stat', $statName ); - $stat->setOptions( $options ); - - /** - * get modification time - */ - $modTime = $stat->getModificationTime( $input ); - $templates = $this->_tmplCache->load( $key, $modTime ); - - return $templates; - } - - /** - * open any input and load content into template - * - * @access public - * @param string name of the input (filename, shm segment, etc.) - * @param string driver that is used as reader - * @param string name of the template that should be used as a container, - * @return boolean true, if the template could be parsed, false otherwise - */ - function loadTemplateFromInput( $input, $reader = 'File', $options = null, $parseInto = false ) - { - if ( is_array( $options ) ) - $options = array_merge( $this->_options, $options ); - else - $options = $this->_options; - - if ( !is_null( $parseInto ) ) - $parseInto = strtolower( $parseInto ); - - $reader = &$this->loadModule( 'Reader', $reader ); - if ( patErrorManager::isError( $reader ) ) - { - return $reader; - } - $reader->setOptions($options); - - $result = $reader->loadTemplate( $input ); - - if ( patErrorManager::isError( $result ) ) - { - return $result; - } - - $this->_templates[$parseInto]['content'] .= $result; - $this->_templates[$parseInto]['loaded'] = true; - return true; - } - - /** - * load a template that had autoload="off" - * - * This is needed, if you change the source of a template and want to - * load it, after changing the attribute. - * - * @access public - * @param string template name - * @return boolean true, if template could be loaded - */ - function loadTemplate( $template ) - { - $template = strtolower( $template ); - if ( !isset( $this->_templates[$template] ) ) - { - return patErrorManager::raiseWarning( - PATTEMPLATE_WARNING_NO_TEMPLATE, - "Template '$template' does not exist." - ); - } - - if ( $this->_templates[$template]['loaded'] === true ) - return true; - - if ( $this->_templates[$template]['attributes']['parse'] == 'on' ) - { - return $this->readTemplatesFromInput( $this->_templates[$template]['attributes']['src'], $this->_templates[$template]['attributes']['reader'], null, $template ); - } - else - { - return $this->loadTemplateFromInput( $this->_templates[$template]['attributes']['src'], $this->_templates[$template]['attributes']['reader'], null, $template ); - } - } - - /** - * loads a patTemplate module - * - * Modules are located in the patTemplate folder and include: - * - Readers - * - Caches - * - Variable Modifiers - * - Filters - * - Functions - * - Stats - * - * @access public - * @param string moduleType (Reader|TemplateCache|Modifier|OutputFilter|InputFilter) - * @param string moduleName - * @param array parameters for the module - * @return object - */ - function &loadModule( $moduleType, $moduleName, $params = array() ) - { - if ( !isset( $this->_modules[$moduleType] ) ) - $this->_modules[$moduleType] = array(); - - $sig = md5( $moduleName . serialize( $params ) ); - - if ( isset( $this->_modules[$moduleType][$sig] ) ) - return $this->_modules[$moduleType][$sig]; - - if ( !class_exists( 'patTemplate_Module' ) ) - { - $file = sprintf( "%s/Module.php", $this->getIncludePath() ); - if ( !@include_once $file ) - return patErrorManager::raiseError( PATTEMPLATE_ERROR_BASECLASS_NOT_FOUND, 'Could not load module base class.' ); - } - - $baseClass = 'patTemplate_' . $moduleType; - if ( !class_exists( $baseClass ) ) - { - $baseFile = sprintf( "%s/%s.php", $this->getIncludePath(), $moduleType ); - if ( !@include_once $baseFile ) - return patErrorManager::raiseError( PATTEMPLATE_ERROR_BASECLASS_NOT_FOUND, "Could not load base class for $moduleType ($baseFile)." ); - } - - $moduleClass = 'patTemplate_' . $moduleType . '_' .$moduleName; - if ( !class_exists( $moduleClass ) ) - { - if ( isset( $this->_moduleDirs[$moduleType] ) ) - $dirs = $this->_moduleDirs[$moduleType]; - else - $dirs = array(); - array_push( $dirs, $this->getIncludePath() .'/'. $moduleType ); - - foreach ( $dirs as $dir ) - { - $moduleFile = sprintf( "%s/%s.php", $dir, str_replace( '_', '/', $moduleName ) ); - if ( @include_once $moduleFile ) - break; - return patErrorManager::raiseError( PATTEMPLATE_ERROR_MODULE_NOT_FOUND, "Could not load module $moduleClass ($moduleFile)." ); - } - } - - if ( !class_exists( $moduleClass ) ) - { - return patErrorManager::raiseError( PATTEMPLATE_ERROR_MODULE_NOT_FOUND, "Module file $moduleFile does not contain class $moduleClass." ); - } - - $this->_modules[$moduleType][$sig] = &new $moduleClass; - if ( method_exists( $this->_modules[$moduleType][$sig], 'setTemplateReference' ) ) - { - $this->_modules[$moduleType][$sig]->setTemplateReference( $this ); - } - - $this->_modules[$moduleType][$sig]->setParams( $params ); - - return $this->_modules[$moduleType][$sig]; - } - - /** - * checks whether a module exists. - * - * Modules are located in the patTemplate folder and include: - * - Readers - * - Caches - * - Variable Modifiers - * - Filters - * - Functions - * - Stats - * - * @access public - * @param string moduleType (Reader|TemplateCache|Modifier|OutputFilter|InputFilter) - * @param string moduleName - * @return boolean - */ - function moduleExists( $moduleType, $moduleName ) - { - if ( isset( $this->_moduleDirs[$moduleType] ) ) - $dirs = $this->_moduleDirs[$moduleType]; - else - $dirs = array(); - array_push( $dirs, $this->getIncludePath() .'/'. $moduleType ); - - foreach ( $dirs as $dir ) - { - $moduleFile = sprintf( "%s/%s.php", $dir, str_replace( '_', '/', $moduleName ) ); - if ( !file_exists( $moduleFile ) ) - continue; - if ( !is_readable( $moduleFile ) ) - continue; - return true; - } - return false; - } - - /** - * parses a template - * - * Parses a template and stores the parsed content. - * mode can be "w" for write (delete already parsed content) or "a" for append (appends the - * new parsed content to the already parsed content) - * - * @access public - * @param string name of the template - * @param string mode for the parsing - */ - function parseTemplate( $template, $mode = 'w' ) - { - $template = strtolower( $template ); - - if ( !isset( $this->_templates[$template] ) ) - { - return patErrorManager::raiseWarning( - PATTEMPLATE_WARNING_NO_TEMPLATE, - "Template '$template' does not exist." - ); - } - - /** - * template is not visible - */ - if ( $this->_templates[$template]['attributes']['visibility'] == 'hidden' ) - { - $this->_templates[$template]['result'] = ''; - $this->_templates[$template]['parsed'] = true; - return true; - } - - /** - * check, if the template has been loaded - * and load it if necessary. - */ - if ( $this->_templates[$template]['loaded'] !== true ) - { - if ( $this->_templates[$template]['attributes']['parse'] == 'on' ) - { - $result = $this->readTemplatesFromInput( $this->_templates[$template]['attributes']['src'], $this->_templates[$template]['attributes']['reader'], null, $template ); - } - else - { - $result = $this->loadTemplateFromInput( $this->_templates[$template]['attributes']['src'], $this->_templates[$template]['attributes']['reader'], null, $template ); - } - if ( patErrorManager::isError( $result ) ) - { - return $result; - } - } - - /** - * check for autoclear - */ - if ( - isset( $this->_templates[$template]['attributes']['autoclear'] ) && - $this->_templates[$template]['attributes']['autoclear'] == 'yes' && - $mode === 'w' && - $this->_templates[$template]['lastMode'] != 'a' - ) - { - $this->_templates[$template]['parsed'] = false; - } - - /** - * template has been parsed and mode is not 'append' - */ - if ( $this->_templates[$template]['parsed'] === true && $mode === 'w' ) - { - return true; - } - - $this->_templates[$template]['lastMode'] = $mode; - - $this->_initTemplate( $template ); - - if ( !isset( $this->_vars[$template]['rows'] ) ) - $this->_vars[$template]['rows'] = array(); - $loop = count( $this->_vars[$template]['rows'] ); - - /** - * loop at least one times - */ - if ( $loop < 1 ) - $loop = 1; - - if ( isset( $this->_templates[$template]['attributes']['maxloop'] ) ) - { - $loop = ceil( $loop / $this->_templates[$template]['attributes']['maxloop'] ) * $this->_templates[$template]['attributes']['maxloop']; - } - - $this->_templates[$template]['loop'] = max( $this->_templates[$template]['attributes']['loop'], $loop ); - - $start = 0; - if ( isset( $this->_templates[$template]['attributes']['limit'] ) ) - { - $p = strpos( $this->_templates[$template]['attributes']['limit'], ',' ); - if ( $p === false ) - { - $this->_templates[$template]['loop'] = min( $this->_templates[$template]['loop'], $this->_templates[$template]['attributes']['limit'] ); - $start = 0; - } - else - { - $start = substr( $this->_templates[$template]['attributes']['limit'], 0, $p ); - $end = substr( $this->_templates[$template]['attributes']['limit'], $p+1 )+$start; - - $this->_templates[$template]['loop'] = min( $this->_templates[$template]['loop'], $end ); - } - } - - /** - * template should be cleared before parsing - */ - if ( $mode == 'w' ) - { - $this->_templates[$template]['result'] = ''; - $this->_templates[$template]['iteration'] = $start; - } - - $loopCount = 0; - for ( $i = $start; $i < $this->_templates[$template]['loop']; $i++ ) - { - $finished = false; - - unset( $this->_templates[$template]['vars'] ); - - /** - * fetch the variables - */ - $this->_fetchVariables( $template ); - - /** - * fetch the template - */ - $result = $this->_fetchTemplate( $template ); - - if ( $result === false ) - { - $this->_templates[$template]['iteration']++; - continue; - } - - /** - * parse - */ - $this->_parseVariables( $template ); - $this->_parseDependencies( $template ); - - /** - * store result - */ - $this->_templates[$template]['result'] .= $this->_templates[$template]['work']; - - $this->_templates[$template]['iteration']++; - - ++$loopCount; - - /** - * check for maximum loops - */ - if ( isset( $this->_templates[$template]['attributes']['maxloop'] ) ) - { - if ( $loopCount == $this->_templates[$template]['attributes']['maxloop'] && $i < ( $loop-1 ) ) - { - $loopCount = 0; - $finished = true; - $this->_templates[$template]['parsed'] = true; - $this->parseTemplate( $this->_templates[$template]['attributes']['parent'], 'a' ); - $this->_templates[$template]['parsed'] = false; - $this->_templates[$template]['result'] = ''; - } - } - } - - if ( !$finished && isset( $this->_templates[$template]['attributes']['maxloop'] ) ) - { - $this->_templates[$template]['parsed'] = true; - $this->parseTemplate( $this->_templates[$template]['attributes']['parent'], 'a', false ); - $this->_templates[$template]['parsed'] = false; - $this->_templates[$template]['result'] = ''; - $this->_templates[$this->_templates[$template]['attributes']['parent']]['work'] = ''; - } - - $this->_parseGlobals($template); - - $this->_handleUnusedVars( $template ); - - $this->_templates[$template]['parsed'] = true; - - if ( isset( $this->_templates[$template]['attributes']['autoclear'] ) && $this->_templates[$template]['attributes']['autoclear'] == 'yes' ) - { - $this->_vars[$template] = array( - 'scalar' => array(), - 'rows' => array() - ); - } - - return true; - } - - /** - * Initialize a template - * - * This method checks the variable specifications and - * copys variables from other templates. - * - * @access private - * @param string name of the template - * @return boolean true on success - */ - function _initTemplate( $template ) - { - foreach ( $this->_templates[$template]['copyVars'] as $dest => $src ) - { - /** - * copy from the same template - */ - if ( !is_array( $src ) ) - { - $srcTemplate = $template; - $srcVar = $src; - } - else - { - $srcTemplate = $src[0]; - $srcVar = $src[1]; - } - - $copied = false; - - /** - * copy from another template - */ - if ( isset( $this->_vars[$srcTemplate] ) ) - { - if ( isset( $this->_vars[$srcTemplate]['scalar'][$srcVar] ) ) - { - $this->_vars[$template]['scalar'][$dest] = $this->_vars[$srcTemplate]['scalar'][$srcVar]; - continue; - } - - $rows = count( $this->_vars[$srcTemplate]['rows'] ); - - for ( $i = 0; $i < $rows; $i++ ) - { - if ( !isset( $this->_vars[$srcTemplate]['rows'][$i][$srcVar] ) ) - continue; - if ( !isset( $this->_vars[$template]['rows'][$i] ) ) - $this->_vars[$template]['rows'][$i] = array(); - $this->_vars[$template]['rows'][$i][$dest] = $this->_vars[$srcTemplate]['rows'][$i][$srcVar]; - $copied = true; - } - } - if ( !$copied && isset( $this->_globals[$srcVar] )) - { - $this->_vars[$template]['scalar'][$dest] = $this->_globals[$srcVar]; - } - - } - return true; - } - - /** - * parse all variables in a template - * - * @access private - * @param string - */ - function _parseVariables( $template ) - { - /** - * modify variables before parsing - */ - $this->_applyModifers($template, $this->_templates[$template]['vars']); - - foreach ( $this->_templates[$template]['vars'] as $key => $value ) - { - if ( is_array( $value ) ) - { - if ( count( $this->_templates[$template]['currentDependencies'] ) == 1 ) - { - $child = $this->_templates[$template]['currentDependencies'][0]; - } - else - { - if ( isset( $this->_templates[$template]['attributes']['child'] ) ) - $child = $this->_templates[$template]['attributes']['child']; - else - continue; - } - - $this->setAttribute( $child, 'autoclear', 'yes' ); - $this->addVar( $child, $key, $value ); - continue; - } - - $var = $this->_startTag.$key.$this->_endTag; - $this->_templates[$template]['work'] = @str_replace( $var, $value, $this->_templates[$template]['work'] ); - } - return true; - } - - /** - * parse global variables in the template - * - * @access private - * @param string name of the template - * @return boolean - */ - function _parseGlobals($template) - { - $globalVars = $this->_globals; - $this->_applyModifers($template, $globalVars); - - foreach ( $globalVars as $key => $value ) - { - if ( is_array( $value ) ) - { - continue; - } - - $var = $this->_startTag.$key.$this->_endTag; - $this->_templates[$template]['result'] = str_replace( $var, $value, $this->_templates[$template]['result'] ); - } - return true; - } - - /** - * apply variable modifiers - * - * The variables will be passed by reference. - * - * @access private - * @param string name of the template (use modifiers from this template) - * @param array variables to which the modifiers should be applied - * @return boolean - */ - function _applyModifers($template, &$vars) - { - foreach ( $this->_templates[$template]['modifyVars'] as $varname => $modifier ) - { - if ( !isset( $vars[$varname] ) ) - continue; - - if ( ( $modifier['type'] === 'php' || $modifier['type'] === 'auto' ) && is_callable( $modifier['mod'] ) ) - { - $vars[$varname] = call_user_func( $modifier['mod'], $vars[$varname] ); - continue; - } - - if ( $modifier['type'] === 'php' ) - continue; - - $mod = &$this->loadModule( 'Modifier', ucfirst( $modifier['mod'] ) ); - $vars[$varname] = $mod->modify( $vars[$varname], $modifier['params'] ); - } - return true; - } - - /** - * parse all dependencies in a template - * - * @access private - * @param string - */ - function _parseDependencies( $template ) - { - $countDep = count( $this->_templates[$template]['currentDependencies'] ); - for ( $i = 0; $i < $countDep; $i++ ) - { - $depTemplate = $this->_templates[$template]['currentDependencies'][$i]; - $this->parseTemplate( $depTemplate ); - $var = $this->_startTag.'TMPL:'.strtoupper( $depTemplate) .$this->_endTag; - $this->_templates[$template]['work'] = str_replace( $var, $this->_templates[$depTemplate]['result'], $this->_templates[$template]['work'] ); - } - return true; - } - - /** - * fetch plain template - * - * The template content will be stored in the template - * configuration so it can be used by other - * methods. - * - * @access private - * @param string template name - * @return boolean - */ - function _fetchTemplate( $template ) - { - switch( $this->_templates[$template]['attributes']['type'] ) - { - /** - * condition template - */ - case 'condition': - $value = $this->_getConditionValue( $template, $this->_templates[$template]['attributes']['conditionvar'] ); - if ( $value === false ) - { - $this->_templates[$template]['work'] = ''; - $this->_templates[$template]['currentDependencies'] = array(); - } - else - { - $this->_templates[$template]['work'] = $this->_templates[$template]['subtemplates'][$value]['data']; - $this->_templates[$template]['currentDependencies'] = $this->_templates[$template]['subtemplates'][$value]['dependencies']; - } - break; - - /** - * condition template - */ - case 'simplecondition': - foreach ( $this->_templates[$template]['attributes']['requiredvars'] as $var ) - { - if ( $var[0] !== $template ) - $this->_fetchVariables($var[0]); - - if ( isset( $this->_templates[$var[0]]['vars'][$var[1]] ) && strlen( $this->_templates[$var[0]]['vars'][$var[1]] ) > 0 ) - continue; - if (isset($this->_templates[$template]['attributes']['useglobals'])) - { - if (isset($this->_globals[$var[1]]) && strlen($this->_globals[$var[1]]) > 1) - continue; - } - - $this->_templates[$template]['work'] = ''; - $this->_templates[$template]['currentDependencies'] = array(); - break 2; - } - $this->_templates[$template]['work'] = $this->_templates[$template]['content']; - $this->_templates[$template]['currentDependencies'] = $this->_templates[$template]['dependencies']; - break; - - /** - * modulo template - */ - case 'modulo': - // check for empty template - if ($this->_hasVariables($template)) { - $value = ( $this->_templates[$template]['iteration'] + 1 ) % $this->_templates[$template]['attributes']['modulo']; - } else { - $value = '__empty'; - } - - $value = $this->_getConditionValue( $template, $value, false ); - if ( $value === false ) - { - $this->_templates[$template]['work'] = ''; - $this->_templates[$template]['currentDependencies'] = array(); - } - else - { - $this->_templates[$template]['work'] = $this->_templates[$template]['subtemplates'][$value]['data']; - $this->_templates[$template]['currentDependencies'] = $this->_templates[$template]['subtemplates'][$value]['dependencies']; - } - break; - - /** - * standard template - */ - default: - $this->_templates[$template]['work'] = $this->_templates[$template]['content']; - $this->_templates[$template]['currentDependencies'] = $this->_templates[$template]['dependencies']; - break; - } - return true; - } - - /** - * check, whether a template contains variables - * - * @access private - * @param string template name - * @return boolean - */ - function _hasVariables($template) - { - if (!empty($this->_vars[$template]['scalar'])) { - return true; - } - if (isset($this->_vars[$template]['rows'][$this->_templates[$template]['iteration']])) { - return true; - } - return false; - } - - /** - * fetch the value of a condition variable - * - * _fetchVariables() has to be called before this - * method is being called. - * - * @access private - * @param string template name - * @param string condition value - * @param boolean flag that indicates whether value is the name of the variable that should be resolved - * - * @todo split this method into smaller check methods that will be called according to - * a priority list - */ - function _getConditionValue( $template, $value, $isVar = true ) - { - if ( $isVar === true ) - { - if ( isset( $this->_templates[$template]['attributes']['conditiontmpl'] ) ) - { - $_template = $this->_templates[$template]['attributes']['conditiontmpl']; - $this->_fetchVariables( $_template ); - } - else - { - $_template = $template; - } - - /** - * get the value from the template variables - */ - if ( !isset( $this->_templates[$_template]['vars'][$value] ) || strlen( $this->_templates[$_template]['vars'][$value] ) === 0 ) - { - if ( $this->_templates[$template]['attributes']['useglobals'] == 'yes' || $this->_templates[$template]['attributes']['useglobals'] == 'useglobals' ) - { - if ( isset( $this->_globals[$value] ) && strlen( $this->_globals[$value] ) > 0 ) - { - $value = $this->_globals[$value]; - } - else - { - $value = '__empty'; - } - } - else - { - $value = '__empty'; - } - } - else - { - $value = $this->_templates[$_template]['vars'][$value]; - } - } - else - { - $_template = $template; - } - - /** - * is __first? - */ - if ( $this->_templates[$_template]['iteration'] == 0 ) - { - if ( isset( $this->_templates[$template]['subtemplates']['__first'] ) ) - { - return '__first'; - } - } - - /** - * is __last? - */ - $max = $this->_templates[$_template]['loop'] - 1; - if ( $this->_templates[$_template]['iteration'] == $max ) - { - if ( isset( $this->_templates[$template]['subtemplates']['__last'] ) ) - { - return '__last'; - } - } - - /** - * found an exact match - */ - if ( isset( $this->_templates[$template]['subtemplates'][$value] ) ) - { - return $value; - } - - /** - * is __default? - */ - if ( isset( $this->_templates[$template]['subtemplates']['__default'] ) ) - { - return '__default'; - } - - return false; - } - - /** - * fetch variables for a template - * - * The variables will be stored in the template - * configuration so they can be used by other - * methods. - * - * @access private - * @param string template name - * @return boolean - */ - function _fetchVariables( $template ) - { - /** - * variables already have been fetched - */ - if ( isset( $this->_templates[$template]['vars'] ) ) - { - return true; - } - - $iteration = $this->_templates[$template]['iteration']; - - if ( isset( $this->_templates[$template]['attributes']['varscope'] ) ) - { - $scopeTemplate = $this->_templates[$template]['attributes']['varscope']; - if ($this->exists($scopeTemplate)) { - $this->_fetchVariables( $scopeTemplate ); - $vars = $this->_templates[$scopeTemplate]['vars']; - } else { - patErrorManager::raiseWarning(PATTEMPLATE_WARNING_NO_TEMPLATE, 'Template \''.$scopeTemplate.'\' does not exist, referenced in varscope attribute of template \''.$template.'\''); - $vars = array(); - } - } - else - { - $vars = array(); - } - - /** - * get the scalar variables - */ - if ( isset( $this->_vars[$template] ) && isset( $this->_vars[$template]['scalar'] ) ) - { - $vars = array_merge( $vars, $this->_vars[$template]['scalar'] ); - } - - /** - * get the row variables - */ - if ( isset( $this->_vars[$template]['rows'][$iteration] ) ) - { - $vars = array_merge( $vars, $this->_vars[$template]['rows'][$iteration] ); - } - - /** - * add some system variables - */ - $currentRow = $iteration + 1; - $vars['PAT_ROW_VAR'] = $currentRow; - - if ( $this->_templates[$template]['attributes']['type'] == 'modulo' ) - { - $vars['PAT_MODULO_REP'] = ceil( $currentRow / $this->_templates[$template]['attributes']['modulo'] ); - $vars['PAT_MODULO'] = ( $this->_templates[$template]['iteration'] + 1 ) % $this->_templates[$template]['attributes']['modulo']; - } - - if ( $this->_templates[$template]['attributes']['addsystemvars'] !== false ) - { - $vars['PATTEMPLATE_VERSION'] = $this->_systemVars['appVersion']; - $vars['PAT_LOOPS'] = $this->_templates[$template]['loop']; - - switch ($this->_templates[$template]['attributes']['addsystemvars']) - { - case 'boolean': - $trueValue = 'true'; - $falseValue = 'false'; - break; - case 'integer': - $trueValue = '1'; - $falseValue = '0'; - break; - default: - $trueValue = $this->_templates[$template]['attributes']['addsystemvars']; - $falseValue = ''; - break; - } - - $vars['PAT_IS_ODD'] = ( $currentRow % 2 == 1 ) ? $trueValue : $falseValue; - $vars['PAT_IS_EVEN'] = ( $currentRow % 2 == 0 ) ? $trueValue : $falseValue; - $vars['PAT_IS_FIRST'] = ( $currentRow == 1 ) ? $trueValue : $falseValue; - $vars['PAT_IS_LAST'] = ( $currentRow == $this->_templates[$template]['loop'] ) ? $trueValue : $falseValue; - } - - $this->_templates[$template]['vars'] = $vars; - return true; - } - - /** - * handle all unused variables in a template - * - * This is influenced by the 'unusedvars' attribute of the - * template - * - * @access private - * @param string - */ - function _handleUnusedVars( $template ) - { - $regexp = '/('.$this->_startTag.'[^a-z]+'.$this->_endTag.')/U'; - - switch( $this->_templates[$template]['attributes']['unusedvars'] ) - { - case 'comment': - $this->_templates[$template]['result'] = preg_replace( $regexp, '', $this->_templates[$template]['result'] ); - break; - case 'strip': - $this->_templates[$template]['result'] = preg_replace( $regexp, '', $this->_templates[$template]['result'] ); - break; - case 'nbsp': - $this->_templates[$template]['result'] = preg_replace( $regexp, ' ', $this->_templates[$template]['result'] ); - break; - case 'ignore': - break; - default: - $this->_templates[$template]['result'] = preg_replace( $regexp, $this->_templates[$template]['attributes']['unusedvars'], $this->_templates[$template]['result'] ); - break; - } - return true; - } - - /** - * returns a parsed Template - * - * If the template already has been parsed, it just returns the parsed template. - * If the template has not been loaded, it will be loaded. - * - * @access public - * @param string name of the template - * @return string Content of the parsed template - * @see displayParsedTemplate() - */ - function getParsedTemplate( $name = null ) - { - if ( is_null( $name ) ) - $name = $this->_root; - - $name = strtolower( $name ); - - $result = $this->parseTemplate( $name ); - - if ( patErrorManager::isError( $result ) ) - return $result; - - return $this->_templates[$name]['result']; - } - - /** - * displays a parsed Template - * - * If the template has not been loaded, it will be loaded. - * - * @see getParsedTemplate() - * @param string name of the template - * @return boolean true on success - * @access public - */ - function displayParsedTemplate( $name = null ) - { - $result = $this->getParsedTemplate( $name ); - - /** - * error happened - */ - if ( patErrorManager::isError( $result ) ) - return $result; - - $cnt = count( $this->_outputFilters ); - for ( $i = 0; $i < $cnt; $i++ ) - { - $result = $this->_outputFilters[$i]->apply( $result ); - } - - echo $result; - return true; - } - - /** - * parse a template and push the result into a variable of any other - * template - * - * If the template already has been parsed, it will just be pushed into the variable. - * If the template has not been loaded, it will be loaded. - * - * @access public - * @param string name of the template - * @return string Content of the parsed template - * @param boolean if set to true, the value will be appended to the value already stored. - * @see getParsedTemplate() - * @see addVar() - */ - function parseIntoVar( $srcTmpl, $destTmpl, $var, $append = false ) - { - $srcTmpl = strtolower( $srcTmpl ); - $destTmpl = strtolower( $destTmpl ); - $var = strtoupper($var); - - $result = $this->parseTemplate( $srcTmpl ); - - if ( patErrorManager::isError( $result ) ) - return $result; - - if ( $append !== true || !isset( $this->_vars[$destTmpl]['scalar'][$var] ) ) - $this->_vars[$destTmpl]['scalar'][$var] = ''; - - $this->_vars[$destTmpl]['scalar'][$var] .= $this->_templates[$srcTmpl]['result']; - - return true; - } - - /** - * clears a parsed Template - * - * Parsed Content, variables and the loop attribute are cleared - * - * If you will not be using this template anymore, then you should - * call freeTemplate() - * - * @access public - * @param string name of the template - * @param boolean set this to true to clear all child templates, too - * @see clearAllTemplates() - * @see freeTemplate() - */ - function clearTemplate( $name, $recursive = false ) - { - $name = strtolower( $name ); - $this->_templates[$name]['parsed'] = false; - $this->_templates[$name]['work'] = ''; - $this->_templates[$name]['iteration'] = 0; - $this->_templates[$name]['result'] = ''; - $this->_vars[$name] = array( - 'scalar' => array(), - 'rows' => array() - ); - if (!empty($this->_templates[$name]['defaultVars'])) { - foreach ($this->_templates[$name]['defaultVars'] as $varname => $value) { - $this->addVar($name, $varname, $value); - } - } - - /** - * clear child templates as well - */ - if ( $recursive === true ) - { - $deps = $this->_getDependencies( $name ); - foreach ( $deps as $dep ) - { - $this->clearTemplate( $dep, true ); - } - } - return true; - } - - /** - * clears all templates - * - * @access public - * @uses clearTemplate() - */ - function clearAllTemplates() - { - $templates = array_keys( $this->_templates ); - $cnt = count( $templates ); - for ( $i = 0; $i < $cnt; $i++ ) - { - $this->clearTemplate( $templates[$i] ); - } - return true; - } - - /** - * frees a template - * - * All memory consumed by the template - * will be freed. - * - * @access public - * @param string name of the template - * @param boolean clear dependencies of the template - * @see freeAllTemplates() - */ - function freeTemplate( $name, $recursive = false ) - { - $name = strtolower( $name ); - $key = array_search( $name, $this->_templateList ); - if ( $key === false ) - { - return patErrorManager::raiseWarning( - PATTEMPLATE_WARNING_NO_TEMPLATE, - "Template '$name' does not exist." - ); - } - - unset( $this->_templateList[$key] ); - $this->_templateList = array_values( $this->_templateList ); - - /** - * free child templates as well - */ - if ( $recursive === true ) - { - $deps = $this->_getDependencies( $name ); - foreach ( $deps as $dep ) - { - $this->freeTemplate( $dep, true ); - } - } - - unset( $this->_templates[$name] ); - unset( $this->_vars[$name] ); - - return true; - } - - /** - * frees all templates - * - * All memory consumed by the templates - * will be freed. - * - * @access public - * @see freeTemplate() - */ - function freeAllTemplates() - { - $this->_templates = array(); - $this->_vars = array(); - } - - /** - * get _all_ dependencies of a template, - * regardless of the subtemplates - * - * @access private - * @param string template name - * @return array list of all subtemplates - */ - function _getDependencies( $template ) - { - $deps = array(); - if ( isset( $this->_templates[$template]['dependencies'] ) ) - $deps = $this->_templates[$template]['dependencies']; - - if ( isset( $this->_templates[$template]['subtemplates'] ) ) - { - foreach ( $this->_templates[$template]['subtemplates'] as $sub ) - { - if ( isset( $sub['dependencies'] ) ) - $deps = array_merge( $deps, $sub['dependencies'] ); - } - } - $deps = array_unique( $deps ); - return $deps; - } - - /** - * Displays useful information about all or named templates - * - * This method breaks BC, as it now awaits an array instead of - * unlimited parameters. - * - * @param mixed array of templates that should be dumped, or null if you - * want all templates to be dumped - * @param string dumper - * @access public - */ - function dump( $restrict = null, $dumper = 'Html' ) - { - if ( is_string( $restrict ) ) - $restrict = array( $restrict ); - - $dumper = &$this->loadModule( 'Dump', $dumper ); - - if ( patErrorManager::isError( $dumper ) ) - { - return $dumper; - } - - if ( is_null( $restrict ) ) - { - $templates = $this->_templates; - $vars = $this->_vars; - } - else - { - $restrict = array_map( 'strtolower', $restrict ); - - $templates = array(); - $vars = array(); - - foreach ( $this->_templates as $name => $spec ) - { - if ( !in_array( $name, $restrict ) ) - continue; - $templates[$name] = $spec; - $vars[$name] = $this->_vars[$name]; - } - } - - $dumper->displayHeader(); - $dumper->dumpGlobals( $this->_globals ); - $dumper->dumpTemplates( $templates, $vars ); - $dumper->displayFooter(); - - return true; - } - - /** - * get the include path - * - * @access public - */ - function getIncludePath() - { - return PATTEMPLATE_INCLUDE_PATH; - } - - /** - * apply input filters that have been set - * - * This is being called by the readers. - * - * @access public - * @param string template - * @return string filtered templeta - */ - function applyInputFilters( $template ) - { - $cnt = count( $this->_inputFilters ); - for ( $i = 0; $i < $cnt; $i++ ) - { - $template = $this->_inputFilters[$i]->apply( $template ); - } - return $template; - } - - /** - * Convert the template to its string representation. - * - * This method allows you to just echo the patTemplate - * object in order to display the template. - * - * Requires PHP5 - * - * - * $tmpl = new patTemplate(); - * $tmpl->readTemplatesFromFile( 'myfile.tmpl' ); - * echo $tmpl; - * - * - * @access private - * @return string - */ - function __toString() - { - return $this->getParsedTemplate(); - } -} diff --git a/airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php b/airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php deleted file mode 100644 index 6a51e84fa3..0000000000 --- a/airtime_mvc/library/propel/contrib/pear/HTML_QuickForm_Propel/Propel.php +++ /dev/null @@ -1,909 +0,0 @@ -. - */ - -require_once 'HTML/QuickForm.php'; - -define('HTML_QUICKFORM_PROPEL_NO_COLUMNS', 2); -define('HTML_QUICKFORM_PROPEL_ALL_COLUMNS', 3); -define('HTML_QUICKFORM_PROPEL_COLUMN_MADE_VISIBLE', 4); -define('HTML_QUICKFORM_PROPEL_COLUMN_MADE_HIDDEN', 5); - -/* On large foreign table resultsets propel choked */ -# ini_set('memory_limit', '50M'); - -/** - * - * NOTE: HTML_QuickForm_Propel extends HTML_QuickForm, so all QuickForm functionality is available. - * - * A fictive example: - * - * $className = 'book'; - * $id = '7'; // existing item - * $id = null; // when no id is passed, it's assumed we are creating a new item - * - * $quickForm = new HTML_QuickForm_Propel($className, $id); // optionally pass it to the constructor - * $quickForm->setAction('/Bookstore/Form'); - * $quickForm->addElement('header', '', 'HTML_QuickForm_Propel'); - * $quickForm->setId($id); - * $quickForm->setClassName($className); - * $quickForm->setTarget('_self'); - * $quickForm->setMethod('post'); - * - * // use this to override the default behaviour for - * // foreign table select boxes, UserPeer::UNAME will be shown in the select list. - * // It defaults to the first string column in the foreign table. - * - * $quickForm->joinColumn(bookPeer::PUBLISHER_ID,UserPeer::UNAME); - * - * // default to all columns shown - * $quickForm->setColumnMode(HTML_QUICKFORM_PROPEL_ALL_COLUMNS); - * $quickForm->hideColumn('PASS'); - * - * // or default to no columns shown - * $quickForm->setColumnMode(HTML_QUICKFORM_PROPEL_NO_COLUMNS); - * $quickForm->showColumn('NAME'); // column name without table prefix. - * $quickForm->showColumn('UNAME'); - * $quickForm->showColumn('USER_INFO'); - * $quickForm->showColumn('EMAIL'); - * $quickForm->showColumn('FEMAIL'); - * $quickForm->showColumn('URL'); - * $quickForm->showColumn('PASS'); - * - * // generate the form - * $quickForm->build(); - * - * // after the form is build, it's possible to modify the generated elements - * $quickForm->getElement('NAME')->setSize(10); // manually tune this element - * - * if ($quickForm->validate()) { - * $quickForm->freeze(); - * - * // save the object we have editted - * $quickForm->save(); - * } else { - * $quickForm->toHtml(); // or any other QuickForm render option - * } - * - * TODO: map all creoleTypes to usefull formelements - * - * @author Rob Halff - * some improvements by Zoltan Nagy (sunshine@freemail.hu) - * @version $Rev: 1347 $ - * @copyright Copyright (c) 2005 Rob Halff: LGPL - See LICENCE - * @package propel.contrib - */ - -class HTML_QuickForm_Propel extends HTML_QuickForm { - - /** - * ID of the Propel Object. - * @var integer - * @access private - */ - private $id; - - /** - * Contains column visibility information. - * @var array - * @access private - */ - private $columnVisibility = array(); - - /** - * Contains titles of columns. - * @var array - * @access private - */ - private $columnTitle = array(); - - /** - * The Column visibility mode either. - * Possible values: - * - * HTML_QUICKFORM_PROPEL_ALL_COLUMNS - * HTML_QUICKFORM_PROPEL_NO_COLUMNS - * - * @var integer - * @access private - */ - private $columnMode; - - /** - * String containing the peerName. - * @var string - * @access private - */ - private $peerName; - - /** - * String containing the className of the propel Object. - * @var string - * @access private - */ - private $className; - - /** - * The Column objects. - * - * @var array - * @access private - */ - private $cols; - - /** - * The Object being operated on. - * @var object - * @access private - */ - private $obj; - - /** - * Seperator value. - * - * In case the option list will be build by multiple values - * This is the value these fields will be seperated with - * - * @var string - * @access private - */ - private $seperator = ' '; - - /** - * - * Not used yet. - * - * @var array - * @access private - */ - private $joinMap = array(); - - /** - * The default QuickForm rule type to use. - * Either server or client - * - * @var string - * @access private - */ - private $defaultRuleType = 'server'; - - - /** - * This is used in the QuickForm DateElement - * @var string - * @access private - */ - private $lang = 'en'; - - /** - * Rulemapping should cover all available propel rules - * - * @var array - * @access private - */ - private $ruleMapping = array( - 'mask'=>'regex', - 'maxLength'=>'maxlength', - 'minLength'=>'minlength', - 'maxValue'=>'maxvalue', - 'minValue'=>'minvalue', - 'required'=>'required', - 'validValues'=>'validvalues', - 'unique'=>'unique' - ); - - /** - * - * CreoleType to QuickForm element mapping - * - * @var array - * @access private - */ - private $typeMapping = array( - CreoleTypes::BOOLEAN =>'radio', - CreoleTypes::BIGINT =>'text', - CreoleTypes::SMALLINT =>'text', - CreoleTypes::TINYINT =>'text', - CreoleTypes::INTEGER =>'text', - CreoleTypes::NUMERIC =>'text', - CreoleTypes::DECIMAL =>'text', - CreoleTypes::REAL =>'text', - CreoleTypes::FLOAT =>'text', - CreoleTypes::DOUBLE =>'text', - CreoleTypes::CHAR =>'text', - CreoleTypes::VARCHAR =>'text', - CreoleTypes::LONGVARCHAR=>'textarea', - CreoleTypes::TEXT =>'textarea', - CreoleTypes::TIME =>'text', - CreoleTypes::TIMESTAMP =>'date', - CreoleTypes::DATE =>'date', - CreoleTypes::YEAR =>'text', - CreoleTypes::VARBINARY =>'text', - CreoleTypes::BLOB =>'text', - CreoleTypes::CLOB =>'text', - CreoleTypes::BINARY =>'text', - CreoleTypes::LONGVARBINARY=>'text', - CreoleTypes::ARR =>'text', - CreoleTypes::OTHER =>'text' - ); - - /** - * - * The Constructor - * - * Classname and id are specific to HTML_QuickForm_Propel - * - * The other parameters are needed to construct the parent QuickForm Class. - * - * @param string className - * @param string id - * @param string formName - * @param string method - * @param string action - * @param string target - * @param array attributes - * @param boolean trackSubmit - * - */ - public function __construct($className = null, $id = null, $formName='HTML_QuickForm_Propel', $method='post', $action='', $target='_self', $attributes=null, $trackSubmit = false) - { - $this->setClassName($className); - $this->setPeerName($className.'Peer'); // Is this always true ? - $this->setId($id); - parent::HTML_QuickForm($formName, $method, $action, $target, $attributes, $trackSubmit); - - // set the default column policy - $this->setColumnMode(HTML_QUICKFORM_PROPEL_ALL_COLUMNS); - } - - /** - * - * NOT IMPLEMENTED - * - * Allows for creating complex forms. - * Note that limit 1 will always be added to the criteria. - * Because we can only edit one record/row at a time. - * - * However we will be able to join tables in complex ways. - * - * @param Criteria - * - */ - public function setCriteria(Criteria $c) - { - $c->setLimit(1); - $this->criteria = $c; - } - - /** - * - * Set the action of this form - * - * @param string action - * - */ - public function setAction($action) - { - $attributes = array('action'=>$action); - $this->updateAttributes($attributes); - } - - /** - * - * Set method of this form, e.g. post or get - * - * @param string method - * - */ - public function setMethod($method) - { - $attributes = array('method'=>$method); - $this->updateAttributes($attributes); - } - - /** - * - * Set the target of this form - * - * @param string target - * - */ - public function setTarget($target) - { - $attributes = array('target'=>$target); - $this->updateAttributes($attributes); - } - - /** - * - * Set the id of the object we need to get - * - * @param string id - * - */ - public function setId($id) - { - $this->id = $id; - } - - /** - * - * Set the class - * - * @param string className - * - */ - public function setClassName($className) - { - $this->className = $className; - } - - /** - * - * Get the class name - * - * @return string className - * - */ - public function getClassName() - { - return $this->className; - } - - private function setPeerName($peerName) - { - $this->peerName = $peerName; - } - - /** - * - * Get the peer name - * - * @return string peerName - * - */ - public function getPeerName() - { - return $this->peerName; - } - - /** - * Build the form - * - * @return void - * - */ - public function build() - { - - if (!class_exists($this->peerName)) { - // some autoloading, dunno if it should belong here. - // or in the users autoload function - //$dbMap = call_user_func(array($this->peerName, 'getMapBuilder')); - // TODO: implement this. - } - - if (empty($this->id)) { - // create empty instance of this class - $this->obj = new $this->className(); - } else { - // find the object. - if (!$this->obj = call_user_func(array($this->peerName, 'retrieveByPK'), $this->id)) { - // for help me god.. what to do ? - throw new PropelException("HTML_QuickForm_Propel::build(): $this->peerName::retrieveByPK($this->id) failed."); - } - - } - - // note: getTableMap is protected by default. - // so do this handstand to get the tableMap - $mapBuilder = call_user_func(array($this->peerName, 'getMapBuilder')); - - // Note: $dbMap is re-used below to determine foreign table - $dbMap = $mapBuilder->getDatabaseMap(); - - // Get the column names for this table. - $this->cols = $dbMap->getTable(constant("$this->peerName::TABLE_NAME"))->getColumns(); - - // Do it the HTML_QuickForm way and use defaultValues - // instead of setValue() on every element. - // we have to first loop through the columns - foreach ($this->cols as $colName=>$col) { - - - $elementType = $this->typeMapping[$col->getCreoleType()]; - - if ($elementType == 'date') { - // null returns timestamp - $value = $this->obj->{'get'.$col->getPhpName()}(null); - } else { - - $value = $this->obj->{'get'.$col->getPhpName()}(); - - } - - $defaultValues[$colName] = $value; - } - - $this->setDefaults($defaultValues); - - foreach ($this->cols as $colName=>$col) { - - if ($this->isColumnHidden($colName)) { - continue; - } - - if ($col->isPrimaryKey()) { - // create a hidden field with primary key - if (!$this->checkColumn($colName, HTML_QUICKFORM_PROPEL_COLUMN_MADE_VISIBLE)) { - $this->addElement('hidden', $col->getColumnName(), $col->getColumnName()); - continue; - } - } - - // element's title - $colTitle = $this->getColumnTitle($colName); - - if ($col->isForeignKey()) { - - // TODO: check if user created an optional method for populating the select form - // this populating of the select box is just some way to show joined items in a form. - // it could also be checkboxes, radio buttons or whatever kind of widget. - - $relatedTable = $dbMap->getTable($col->getRelatedTableName()); - $relatedCols = $relatedTable->getColumns(); - $relatedPeer = $relatedTable->getPhpName().'Peer'; - - if (is_callable($relatedPeer, 'doSelect')) { - - - // TODO: allow set this criteria. - $c = new Criteria; - - $relatedList = call_user_func(array($relatedPeer,'doSelect'), $c); - - $colConstant = constant($this->peerName.'::'.$colName); - //$relatedColConstant = constant($relatedPeer.'::'.$relatedCol->getColumnName()); - $relatedGetter = 'getPrimaryKey'; - - - // TODO: this needs to be array based, to support multiple foreign columns - if (isset($this->joinMap[$colConstant])) { - // translate to getter - $relatedColConstant = $this->joinMap[$colConstant]; - if (!$relatedTable->containsColumn($relatedColConstant)) { - // throw exception, there is no such column - throw new PropelException('HTML_QuickForm_Propel::build(): there is no column named '.$relatedTable->normalizeColName($relatedConstant).'in '.$relatedTable->getTableName().' while trying to build the select list'); - } - $nameColumn = $relatedTable->getColumn($relatedColConstant); - $relatedGetter = 'get'.$nameColumn->getPhpName(); - } else { - //auto detection - // determine the first string column - foreach ($relatedCols as $relatedCol) { - if ($relatedCol->getType() == 'string') { - $relatedGetter = 'get'.$relatedCol->getPhpName(); - break; - } - } - } - - - $selectList = array(); - - // TODO: not hardcoded here. - $selectList[null] = _('Please selection an option'); - - foreach ($relatedList as $relObj) { - $key = $relObj->getPrimaryKey(); - - if (false OR $yesWannaUseEntireObjectsToUseItInTemplate) { - // TODO: IMPLEMENT THIS. - $selectList[$key] = $relObj; - } elseif (false OR $forceSomeKindOfColumnToBeDisplayed) { - // TODO: IMPLEMENT THIS. - } else { - $selectList[$key] = $relObj->{$relatedGetter}(); - } - } - - if (count($selectList) > 1) { // value of 1 depends on select message being set. - $select =& $this->addElement('select', $colName, $colTitle, $selectList); - } else { - // what to do if no records exists in the foreign table ? - $this->addElement('static', $colName, $colTitle, _('No Records')); - } - - } - - // do some recursion ? - - } else { - - //TODO: the mapping is not so generic anymore (to many exceptions) - $elementType = $this->typeMapping[$col->getCreoleType()]; - - if ($col->getCreoleType() == CreoleTypes::BOOLEAN) { - // TODO: describe how to override these options. - $radio = array(); - $radio[] = HTML_QuickForm::createElement('radio', null, null, 'Yes', true); - $radio[] = HTML_QuickForm::createElement('radio', null, null, 'No', false); - $el = $this->addGroup($radio, $colName, $colName); - - - } else { - - $el = $this->addElement( - $elementType, - $colName, - $colTitle); - - if ($elementType == 'text') { - $el->setMaxLength($col->getSize()); - } - - if ($col->getCreoleType() == CreoleTypes::TIMESTAMP) { - - /* Option Info: - var $_options = array( - 'language' => 'en', - 'format' => 'dMY', - 'minYear' => 2001, - 'maxYear' => 2010, - 'addEmptyOption' => false, - 'emptyOptionValue' => '', - 'emptyOptionText' => ' ', - 'optionIncrement' => array('i' => 1, 's' => 1) - ); - */ - - // hmm, don't like it but there seems to be no public method - // to set an option afterwards - $el->_options['language'] = $this->lang; - // TODO: is the format always the same in propel ? - $el->_options['format'] = 'Y-F-d H:i:s'; - - } - - } - // add an html id to the element - $this->addElementId($el, $colName); - - //$el->setValue($value); - - // required rule for NOT NULL columns - if ($col->isNotNull()) { - // TODO: What error message should we use? - $this->addRule($colName, - $this->getColumnTitle($colName) . ' is required', - 'required'); - } - - if ($col->hasValidators()) { - - foreach ($col->getValidators() as $validatorMap) { - - $this->addRule($colName, - $validatorMap->getMessage(), - $this->ruleMapping[$validatorMap->getName()], - $validatorMap->getValue(), - $this->defaultRuleType - ); - - } - } - - } - } - - // should HTML_QuickForm_Propel add this ? - $this->addElement('submit', 'submit', 'Submit'); - - // do this for the developer, can't think of any case where this is unwanted. - $this->applyFilter('__ALL__', 'trim'); - - } - - /** - * - * Use it to change the locale used for the Date element - * - * @param string locale - * @return void - * - */ - public function setLang($lang) - { - $this->lang = $lang; - } - - /** - * - * Save the form. - * - * @return void - * - */ - public function save() - { - $this->copyToObj(); - $this->obj->save(); - } - - /** - * - * Copy form values to Obj. - * - * @return void - * - */ - public function copyToObj() - { - // TODO: check what process does, if we leave out anything important. - - if (!isset($this->cols)) { - // throw some error, form cannot be saved before it is build. - throw new PropelException('HTML_QuickForm_Propel::save(): form cannot be saved before it is build.'); - } - - foreach ($this->cols as $colName=>$col) { - - // Has the form got this element? - if ($this->isColumnHidden($colName)) - { - continue; - } - - $value = $this->getElementValue($colName); - if ($value instanceof HTML_QuickForm_Error) - { - // TODO: What should we do if an error has occured? - continue; - } - $elementType = $this->typeMapping[$col->getCreoleType()]; - - // quickform doesn't seem to give back a timestamp, so calculate the date manually. - if ($elementType == 'date') { - - $date = array( - 'D' => null, - 'l' => null, - 'd' => null, - 'M' => null, - 'm' => null, - 'F' => null, - 'Y' => null, - 'y' => null, - 'h' => null, - 'H' => null, - 'i' => null, - 's' => null, - 'a' => null, - 'A' => null - ); - - foreach ($value as $key=>$val) { - $date[$key] = $val[0]; - - } - - $value = mktime($date['h'], $date['m'], $date['s'], $date['M'], $date['d'], $date['Y']); - } - - $this->obj->{'set'.$col->getPhpName()}($value); - } - } - - /** - * - * Get the object we are operating on. - * - * @return object a propel object - * - */ - public function getObj() - { - return $this->obj; - } - - /** - * What to do if a delete button is added - * and the user clicks on it, after the object has been delete in save() - */ - public function onDelete() - { - - - } - - public function createDeleteButton() - { - return $this->addElement('submit', 'delete', 'Delete'); - } - - public function isColumnHidden($column) - { - if ($this->checkColumn($column, HTML_QUICKFORM_PROPEL_COLUMN_MADE_HIDDEN) && $this->columnMode == HTML_QUICKFORM_PROPEL_ALL_COLUMNS) { - return true; - } - - if (!$this->checkColumn($column, HTML_QUICKFORM_PROPEL_COLUMN_MADE_VISIBLE) && $this->columnMode == HTML_QUICKFORM_PROPEL_NO_COLUMNS) { - return true; - } - - return false; - } - - private function checkColumn($column, $state) - { - if (isset($this->columnVisibility[$column])) { - return ($this->columnVisibility[$column] == $state); - } else { - return false; - } - } - - /** - * - * Sets the default visibility mode - * - * This must be either: - * HTML_QUICKFORM_PROPEL_NO_COLUMNS or - * HTML_QUICKFORM_PROPEL_ALL_COLUMNS - * - * @param string $column column name - * @return void - * - */ - public function setColumnMode($mode) - { - - if ($mode != HTML_QUICKFORM_PROPEL_NO_COLUMNS && $mode != HTML_QUICKFORM_PROPEL_ALL_COLUMNS) { - - throw new PropelException('HTML_QuickForm_Propel::setColumnMode(): invalid mode passed.'); - - } - - $this->columnMode = $mode; - } - - /** - * - * Tell HTML_QuickForm_Propel it should hide this column - * It is now passed like ID instead of somePeer::ID - * The latter is better, but the array_keys of the columns are in ID format and not somePeer::ID - * - * @param string $column column name - * @return void - * - */ - - public function hideColumn($column) - { - $this->columnVisibility[$column] = HTML_QUICKFORM_PROPEL_COLUMN_MADE_HIDDEN; - } - - /** - * - * Tell HTML_QuickForm_Propel it should show this column - * - * It is now passed like ID instead of somePeer::ID - * The latter is better, but the array_keys of the columns are in ID format and not somePeer::ID - * - * @param string $column column name - * @param string $title Title for the column, not required - * @return void - */ - public function showColumn($column, $title = NULL) - { - $this->columnVisibility[$column] = HTML_QUICKFORM_PROPEL_COLUMN_MADE_VISIBLE; - if ($title !== NULL) - { - $this->setColumnTitle($column, $title); - } - } - - /** - * - * assign a title to the column - * - * @param string $column - * @param string $title - * @return void - */ - public function setColumnTitle($column, $title) - { - $this->columnTitles[$column] = $title; - } - - /** - * - * returns column's title - * - * @param string $column - * @return void - */ - public function getColumnTitle($column) - { - // TODO: check if $column exists - return (array_key_exists($column, $this->columnTitles)) - ? $this->columnTitles[$column] - : $column; - } - - /** - * - * Try to automatically join all relatedTables. - * NOT IMPLEMENTED - * - * @param boolean $bool - * @return void - */ - public function autoJoin($bool) - { - $this->autoJoin = $bool; - } - - /** - * Override this if you don't like the (strtolower) default - * - * @param HTML_QuickForm_Element $el - * @param string $colName - * @return void - */ - protected function addElementId($el, $colName) - { - $el->updateAttributes(array('id'=>strtolower($colName))); - } - - /** - * - * Set the default rule typef - * @param string $type - * @return void - * - */ - public function setDefaultRuleType($type) - { - $this->defaultRuleType = $type; - } - - /** - * - * UNFINISHED - * - * Probably it would be nice to be able to add this to the schema xml - * - * TODO: further implement multiple columns for the select list - * - * @var colName constant - * @var foreignColName mixed (constant/array of columnName constants) - * @var $seperator string Only used if foreignColName is an array - */ - - public function joinColumn($colName, $foreignColName, $seperator = null) - { - if (isset($seperator)) { - $this->seperator = $seperator; - } - $this->joinMap[$colName] = $foreignColName; - } - -} diff --git a/airtime_mvc/library/propel/contrib/pear/Structures_DataGrid_Propel/Propel.php b/airtime_mvc/library/propel/contrib/pear/Structures_DataGrid_Propel/Propel.php deleted file mode 100644 index fcbf8afee9..0000000000 --- a/airtime_mvc/library/propel/contrib/pear/Structures_DataGrid_Propel/Propel.php +++ /dev/null @@ -1,352 +0,0 @@ -. - */ - -require_once 'Structures/DataGrid.php'; - -define('STRUCTURES_DATAGRID_PROPEL_NO_COLUMNS', 2); -define('STRUCTURES_DATAGRID_PROPEL_ALL_COLUMNS', 3); -define('STRUCTURES_DATAGRID_PROPEL_COLUMN_MADE_VISIBLE', 4); -define('STRUCTURES_DATAGRID_PROPEL_COLUMN_MADE_HIDDEN', 5); - -/** - * - * NOTE: Structures_DataGrid_Propel extends Structures_DataGrid, so all Datagrid functionality is available. - * - * A fictive example: - * // Propel and Propel project classes must be in the include_path - * - * // Propel Class name : Report - * $dg =& new Structures_DataGrid_Propel('Report'); - * - * // limit to 10 rows - * $c = new Criteria(); - * $c->setLimit(10); - * $dg->setCriteria($c); - * - * // choose what columns must be displayed - * $dg->setColumnMode(STRUCTURES_DATAGRID_PROPEL_NO_COLUMNS); - * $dg->showColumn('ACTIVE'); - * $dg->showColumn('TITLE'); - * $dg->showColumn('ID'); - * - * // generate the datagrid - * $dg->build(); - * - * // add two columns to edit the row and checkbox for further operations - * $dg->addColumn(new Structures_DataGrid_Column('', null, null, array('width' => '4%'), null, 'printEditLink()')); - * $dg->addColumn(new Structures_DataGrid_Column('', null, null, array('width' => '1%'), null, 'printCheckbox()')); - * - * // Display the datagrid - * $dg->render(); - * - * @author Marc - * @version $Rev: 1347 $ - * @copyright Copyright (c) 2005 Marc: LGPL - See LICENCE - * @package propel.contrib - */ - -class Structures_DataGrid_Propel extends Structures_DataGrid { - - /** - * Contains column visibility information. - * @var array - * @access private - */ - private $columnVisibility = array(); - - /** - * The Column visibility mode. - * Possible values: - * - * STRUCTURES_DATAGRID_PROPEL_ALL_COLUMNS - * STRUCTURES_DATAGRID_PROPEL_NO_COLUMNS - * - * @var integer - * @access private - */ - private $columnMode; - - /** - * String containing the peerName. - * @var string - * @access private - */ - private $peerName; - - /** - * String containing the className of the propel Object. - * @var string - * @access private - */ - private $className; - - /** - * Criteria of the Select query. - * @var criteria - * @access private - */ - private $criteria; - - /** - * List of primary keys - * @var array - * @access public - */ - public $primaryKeys; - - /** - * - * The Constructor - * - * Classname is specific to Structures_Datagrid_Propel - * - * The other parameters are needed to construct the parent Structures_DataGrid Class. - * - * @param string className - * @param string limit - * @param string render - * - */ - public function __construct($className = null, $limit = null, $render = DATAGRID_RENDER_HTML_TABLE) - { - - include_once $className.'.php'; - include_once $className.'Peer'.'.php'; - - $this->setClassName($className); - $this->setPeerName($className.'Peer'); // Is this always true ? - parent::Structures_DataGrid($limit,null,$render); - - // set the default column policy - $this->setColumnMode(STRUCTURES_DATAGRID_PROPEL_ALL_COLUMNS); - $this->criteria = new Criteria(); - } - - /** - * - * Set the criteria for select query - * - * @param Criteria c - * - */ - public function setCriteria(Criteria $c) - { - $this->criteria = $c; - } - - /** - * - * Set the class - * - * @param string className - * - */ - public function setClassName($className) - { - $this->className = $className; - } - - /** - * - * Get the class name - * - * @return string className - * - */ - public function getClassName() - { - return $this->className; - } - - private function setPeerName($peerName) - { - $this->peerName = $peerName; - } - - /** - * - * Get the peer name - * - * @return string peerName - * - */ - public function getPeerName() - { - return $this->peerName; - } - - /** - * - * Get the visibility of a column - * - * @return boolean true if column is set to hidden - * - */ - public function isColumnHidden($column) - { - if ($this->checkColumn($column, STRUCTURES_DATAGRID_PROPEL_COLUMN_MADE_HIDDEN) && $this->columnMode == STRUCTURES_DATAGRID_PROPEL_ALL_COLUMNS) { - return true; - } - - if (!$this->checkColumn($column, STRUCTURES_DATAGRID_PROPEL_COLUMN_MADE_VISIBLE) && $this->columnMode == STRUCTURES_DATAGRID_PROPEL_NO_COLUMNS) { - return true; - } - - return false; - } - - /** - * - * Check the state of a column - * - * @return boolean true if column is set to state - * - */ - private function checkColumn($column, $state) - { - if (isset($this->columnVisibility[$column])) { - return ($this->columnVisibility[$column] == $state); - } else { - return false; - } - } - - /** - * - * Sets the default visibility mode - * - * This must be either: - * STRUCTURES_DATAGRID_PROPEL_NO_COLUMNS or - * STRUCTURES_DATAGRID_PROPEL_ALL_COLUMNS - * - * @param string $column column name - * @return void - * - */ - public function setColumnMode($mode) - { - - if ($mode != STRUCTURES_DATAGRID_PROPEL_NO_COLUMNS && $mode != STRUCTURES_DATAGRID_PROPEL_ALL_COLUMNS) { - throw new PropelException('STRUCTURES_DATAGRID_PROPEL::setColumnMode(): invalid mode passed.'); - } - - $this->columnMode = $mode; - } - - /** - * - * Tell Structures_Datagrid_Propel it should hide this column - * It is now passed like ID instead of somePeer::ID - * The latter is better, but the array_keys of the columns are - * in ID format and not somePeer::ID - * - * @param string $column column name - * @return void - * - */ - public function hideColumn($column) - { - $this->columnVisibility[$column] = STRUCTURES_DATAGRID_PROPEL_COLUMN_MADE_HIDDEN; - } - - /** - * - * Tell Structures_Datagrid_Propel it should show this column - * - * It is now passed like ID instead of somePeer::ID - * The latter is better, but the array_keys of the columns are in ID format and not somePeer::ID - * - * @param string $column column name - * @return void - */ - public function showColumn($column) - { - $this->columnVisibility[$column] = STRUCTURES_DATAGRID_PROPEL_COLUMN_MADE_VISIBLE; - } - - /** - * - * Build the datagrid - * - * @return void - */ - public function build() - { - $mapBuilder = call_user_func(array($this->getPeerName(), 'getMapBuilder')); - $dbMap = $mapBuilder->getDatabaseMap(); - $cols = $dbMap->getTable(constant($this->getPeerName()."::TABLE_NAME"))->getColumns(); - $stmt = call_user_func(array( $this->getPeerName(), 'doSelectStmt'), $this->criteria); - - $dataset = array(); - $columns = array(); - $this->primaryKeys = array(); - $class = $this->getClassName(); - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { // use Creole ResultSet methods to iterate over resultset - $obj = new $class(); - $obj->hydrate($row); - - $row = array(); - foreach ($cols as $tmp_id => $col) - { - // save the PK in an array - if ($col->isPrimaryKey()) { - $this->primaryKeys[$col->getColumnName()] = $col->getColumnName(); - } - - $value = $obj->{'get'.$col->getPhpName()}(null); - // save the row value - - $row[$col->getColumnName()] = $value; - // save the list of propel header column name - $columns[$col->getColumnName()] = $col->getColumnName(); - - } - // add the row to dataset - $dataset[] = $row; - } - - $this->bind($dataset); - - if ($this->columnMode == STRUCTURES_DATAGRID_PROPEL_ALL_COLUMNS) { - foreach ($columns as $tmp_id => $column) { - - if (!$this->isColumnHidden($column)) { - - $this->addColumn(new Structures_DataGrid_Column($column, $column, $column, null)); - } - } - } else { - - foreach ($this->columnVisibility as $column => $visibility) { - - if (!$this->isColumnHidden($column)) { - $this->addColumn(new Structures_DataGrid_Column($column, $column, $column, null)); - } - } - } - - $this->renderer->setTableHeaderAttributes(array('class' => 'title')); - $this->renderer->setTableAttribute('class', 'list'); - $this->renderer->sortIconASC = '?'; - $this->renderer->sortIconDESC = '?'; - } - -} diff --git a/airtime_mvc/library/propel/docs/behavior/aggregate_column.txt b/airtime_mvc/library/propel/docs/behavior/aggregate_column.txt deleted file mode 100644 index e071425a72..0000000000 --- a/airtime_mvc/library/propel/docs/behavior/aggregate_column.txt +++ /dev/null @@ -1,130 +0,0 @@ -= Aggregate Column Behavior = - -The `aggregate_column` behavior keeps a column updated using an aggregate function executed on a related table. - -== Basic Usage == - -In the `schema.xml`, use the `` tag to add the `aggregate_column` behavior to a table. You must provide parameters for the aggregate column `name`, the foreign table name, and the aggegate `expression`. For instance, to add an aggregate column keeping the comment count in a `post` table: - -{{{ -#!xml - - - - - - - - -
- - - - - - -
-}}} - -Rebuild your model, and insert the table creation sql again. The model now has an additional `nb_comments` column, of type `integer` by default. And each time an record from the foreign table is added, modified, or removed, the aggregate column is updated: - -{{{ -#!php -setTitle('How Is Life On Earth?'); -$post->save(); -echo $post->getNbComments(); // 0 -$comment1 = new Comment(); -$comment1->setPost($post); -$comment1->save(); -echo $post->getNbComments(); // 1 -$comment2 = new Comment(); -$comment2->setPost($post); -$comment2->save(); -echo $post->getNbComments(); // 2 -$comment2->delete(); -echo $post->getNbComments(); // 1 -}}} - -The aggregate column is also kept up to date when related records get modified through a Query object: - -{{{ -#!php -filterByPost($post) - ->delete(): -echo $post->getNbComments(); // 0 -}}} - -== Customizing The Aggregate Calculation == - -Any aggregate function can be used on any of the foreign columns. For instance, you can use the `aggregate_column` behavior to keep the latest update date of the related comments, or the total votes on the comments. You can even keep several aggregate columns in a single table: - -{{{ -#!xml - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
-}}} - -The behavior adds a `computeXXX()` method to the `Post` class to compute the value of the aggregate function. This method, called each time records are modified in the related `comment` table, is the translation of the behavior settings into a SQL query: - -{{{ -#!php -prepare('SELECT COUNT(id) FROM `comment` WHERE comment.POST_ID = :p1'); - $stmt->bindValue(':p1', $this->getId()); - $stmt->execute(); - return $stmt->fetchColumn(); -} -}}} - -You can override this method in the model class to customize the aggregate column calculation. - -== Customizing The Aggregate Column == - -By default, the behavior adds one columns to the model. If this column is already described in the schema, the behavior detects it and doesn't add it a second time. This can be useful if you need to use a custom `type` or `phpName` for the aggregate column: - -{{{ -#!xml - - - - - - - - - -
-}}} diff --git a/airtime_mvc/library/propel/docs/behavior/alternative_coding_standards.txt b/airtime_mvc/library/propel/docs/behavior/alternative_coding_standards.txt deleted file mode 100644 index bc7462357e..0000000000 --- a/airtime_mvc/library/propel/docs/behavior/alternative_coding_standards.txt +++ /dev/null @@ -1,89 +0,0 @@ -= Alternative Coding Standards Behavior = - -The `alternative_coding_standards` behavior changes the coding standards of the model classes generated by Propel to match your own coding style. - -== Basic Usage == - -In the `schema.xml`, use the `` tag to add the `alternative_coding_standards` behavior to a table: -{{{ -#!xml - - - - -
-}}} - -Rebuild your model, and you're ready to go. The code of the model classes now uses an alternative set of coding standards: - -{{{ -#!php -title !== $v) - { - $this->title = $v; - $this->modifiedColumns[] = BookPeer::TITLE; - } - - return $this; - } - -// instead of - - /** - * Set the value of [title] column. - * - * @param string $v new value - * @return Table4 The current object (for fluent API support) - */ - public function setTitle($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->title !== $v) { - $this->title = $v; - $this->modifiedColumns[] = BookPeer::TITLE; - } - - return $this; - } // setTitle() -}}} - -The behavior replaces tabulations by whitespace (2 spaces by default), places opening brackets on newlines, removes closing brackets comments, and can even strip every comments in the generated classes if you wish. - -== Parameters == - -Each of the new coding style rules has corresponding parameter in the behavior description. Here is the default configuration: - -{{{ -#!xml - - - - - - - - - - -
-}}} - -You can change these settings to better match your own coding styles. diff --git a/airtime_mvc/library/propel/docs/behavior/auto_add_pk.txt b/airtime_mvc/library/propel/docs/behavior/auto_add_pk.txt deleted file mode 100644 index 214ddf0207..0000000000 --- a/airtime_mvc/library/propel/docs/behavior/auto_add_pk.txt +++ /dev/null @@ -1,73 +0,0 @@ -= AutoAddPk Behavior = - -The `auto_add_pk` behavior adds a primary key columns to the tables that don't have one. Using this behavior allows you to omit the declaration of primary keys in your tables. - -== Basic Usage == - -In the `schema.xml`, use the `` tag to add the `auto_add_pk` behavior to a table: -{{{ -#!xml - - - -
-}}} - -Rebuild your model, and insert the table creation sql. You will notice that the `book` table has two columns and not just one. The behavior added an `id` column, of type integer and autoincremented. This column can be used as any other column: - -{{{ -#!php -setTitle('War And Peace'); -$b->save(); -echo $b->getId(); // 1 -}}} - -This behavior is more powerful if you add it to the database instead of a table. That way, it will alter all tables not defining a primary key column - and leave the others unchanged. - -{{{ -#!xml - - - - -
-
-}}} - -You can even enable it for all your database by adding it to the default behaviors in your `build.properties` file: - -{{{ -#!ini -propel.behavior.default = auto_add_pk -}}} - -== Parameters == - -By default, the behavior adds a column named `id` to the table if the table has no primary key. You can customize all the attributes of the added column by setting corresponding parameters in the behavior definition: - -{{{ -#!xml - - - - - - - -
-
-}}} - -Once you regenerate your model, the column is now named differently: - -{{{ -#!php -setTitle('War And Peace'); -$b->setIdentifier(1); -$b->save(); -echo $b->getIdentifier(); // 1 -}}} diff --git a/airtime_mvc/library/propel/docs/behavior/nested_set.txt b/airtime_mvc/library/propel/docs/behavior/nested_set.txt deleted file mode 100644 index ad0f45077a..0000000000 --- a/airtime_mvc/library/propel/docs/behavior/nested_set.txt +++ /dev/null @@ -1,370 +0,0 @@ -= NestedSet Behavior = - -The `nested_set` behavior allows a model to become a tree structure, and provides numerous methods to traverse the tree in an efficient way. - -Many applications need to store hierarchical data in the model. For instance, a forum stores a tree of messages for each discussion. A CMS sees sections and subsections as a navigation tree. In a business organization chart, each person is a leaf of the organization tree. [http://en.wikipedia.org/wiki/Nested_set_model Nested sets] are the best way to store such hierachical data in a relational database and manipulate it. The name "nested sets" describes the algorithm used to store the position of a model in the tree ; it is also known as "modified preorder tree traversal". - -== Basic Usage == - -In the `schema.xml`, use the `` tag to add the `nested_set` behavior to a table: -{{{ -#!xml - - - - -
-}}} - -Rebuild your model, insert the table creation sql again, and you're ready to go. The model now has the ability to be inserted into a tree structure, as follows: - -{{{ -#!php -setTitle('Home'); -$s1->makeRoot(); // make this node the root of the tree -$s1->save(); -$s2 = new Section(); -$s2->setTitle('World'); -$s2->insertAsFirstChildOf($s1); // insert the node in the tree -$s2->save(); -$s3 = new Section(); -$s3->setTitle('Europe'); -$s3->insertAsFirstChildOf($s2); // insert the node in the tree -$s3->save() -$s4 = new Section(); -$s4->setTitle('Business'); -$s4->insertAsNextSiblingOf($s2); // insert the node in the tree -$s4->save(); -/* The sections are now stored in the database as a tree: - $s1:Home - | \ -$s2:World $s4:Business - | -$s3:Europe -*/ -}}} - -You can continue to insert new nodes as children or siblings of existing nodes, using any of the `insertAsFirstChildOf()`, `insertAsLastChildOf()`, `insertAsPrevSiblingOf()`, and `insertAsNextSiblingOf()` methods. - -Once you have built a tree, you can traverse it using any of the numerous methods the `nested_set` behavior adds to the query and model objects. For instance: - -{{{ -#!php -findRoot(); // $s1 -$worldNode = $rootNode->getFirstChild(); // $s2 -$businessNode = $worldNode->getNextSibling(); // $s4 -$firstLevelSections = $rootNode->getChildren(); // array($s2, $s4) -$allSections = $rootNode->getDescendants(); // array($s2, $s3, $s4) -// you can also chain the methods -$europeNode = $rootNode->getLastChild()->getPrevSibling()->getFirstChild(); // $s3 -$path = $europeNode->getAncestors(); // array($s1, $s2) -}}} - -The nodes returned by these methods are regular Propel model objects, with access to the properties and related models. The `nested_set` behavior also adds inspection methods to nodes: - -{{{ -#!php -isRoot(); // false -echo $s2->isLeaf(); // false -echo $s2->getLevel(); // 1 -echo $s2->hasChildren(); // true -echo $s2->countChildren(); // 1 -echo $s2->hasSiblings(); // true -}}} - -Each of the traversal and inspection methods result in a single database query, whatever the position of the node in the tree. This is because the information about the node position in the tree is stored in three columns of the model, named `tree_left`, `tree_left`, and `tree_level`. The value given to these columns is determined by the nested set algorithm, and it makes read queries much more effective than trees using a simple `parent_id` foreign key. - -== Manipulating Nodes == - -You can move a node - and its subtree - across the tree using any of the `moveToFirstChildOf()`, `moveToLastChildOf()`, `moveToPrevSiblingOf()`, and `moveToLastSiblingOf()` methods. These operations are immediate and don't require that you save the model afterwards: - -{{{ -#!php -moveToFirstChildOf($s4); -/* The tree is modified as follows: -$s1:Home - | -$s4:Business - | -$s2:World - | -$s3:Europe -*/ -// now move the "Europe" section directly under root, after "Business" -$s2->moveToFirstChildOf($s4); -/* The tree is modified as follows: - $s1:Home - | \ -$s4:Business $s3:Europe - | -$s2:World -*/ -}}} - -You can delete the descendants of a node using `deleteDescendants()`: - -{{{ -#!php -deleteDescendants($s4); -/* The tree is modified as follows: - $s1:Home - | \ -$s4:Business $s3:Europe -*/ -}}} - -If you `delete()` a node, all its descendants are deleted in cascade. To avoid accidental deletion of an entire tree, calling `delete()` on a root node throws an exception. Use the `delete()` Query method instead to delete an entire tree. - -== Filtering Results == - -The `nested_set` behavior adds numerous methods to the generated Query object. You can use these methods to build more complex queries. For instance, to get all the children of the root node ordered by title, build a Query as follows: - -{{{ -#!php -childrenOf($rootNode) - ->orderByTitle() - ->find(); -}}} - -Alternatively, if you already have an existing query method, you can pass it to the model object's methods to filter the results: - -{{{ -#!php -orderByTitle(); -$children = $rootNode->getChildren($orderQuery); -}}} - -== Multiple Trees == - -When you need to store several trees for a single model - for instance, several threads of posts in a forum - use a ''scope'' for each tree. This requires that you enable scope tree support in the behavior definition by setting the `use_scope` parameter to `true`: - -{{{ -#!xml - - - - - - - - - - -
-}}} - -Now, after rebuilding your model, you can have as many trees as required: - -{{{ -#!php -findPk(123); -$firstPost = PostQuery::create()->findRoot($thread->getId()); // first message of the discussion -$discussion = PostQuery::create()->findTree(thread->getId()); // all messages of the discussion -PostQuery::create()->inTree($thread->getId())->delete(); // delete an entire discussion -$firstPostOfEveryDiscussion = PostQuery::create()->findRoots(); -}}} - -== Using a RecursiveIterator == - -An alternative way to browse a tree structure extensively is to use a [http://php.net/RecursiveIterator RecursiveIterator]. The `nested_set` behavior provides an easy way to retrieve such an iterator from a node, and to parse the entire branch in a single iteration. - -For instance, to display an entire tree structure, you can use the following code: - -{{{ -#!php -findRoot(); -foreach ($root->getIterator() as $node) { - echo str_repeat(' ', $node->getLevel()) . $node->getTitle() . "\n"; -} -}}} - -The iterator parses the tree in a recursive way by retrieving the children of every node. This can be quite effective on very large trees, since the iterator hydrates only a few objects at a time. - -Beware, though, that the iterator executes many queries to parse a tree. On smaller trees, prefer the `getBranch()` method to execute only one query, and hydrate all records at once: - -{{{ -#!php -findRoot(); -foreach ($root->getBranch() as $node) { - echo str_repeat(' ', $node->getLevel()) . $node->getTitle() . "\n"; -} -}}} - -== Parameters == - -By default, the behavior adds three columns to the model - four if you use the scope feature. You can use custom names for the nested sets columns. The following schema illustrates a complete customization of the behavior: - -{{{ -#!xml - - - - - - - - - - - - - - - - - -
-}}} - -Whatever name you give to your columns, the `nested_sets` behavior always adds the following proxy methods, which are mapped to the correct column: - -{{{ -#!php -getLeftValue(); // returns $post->lft -$post->setLeftValue($left); -$post->getRightValue(); // returns $post->rgt -$post->setRightValue($right); -$post->getLevel(); // returns $post->lvl -$post->setLevel($level); -$post->getScopeValue(); // returns $post->thread_id -$post->setScopeValue($scope); -}}} - -If your application used the old nested sets builder from Propel 1.4, you can enable the `method_proxies` parameter so that the behavior generates method proxies for the methods that used a different name (e.g. `createRoot()` for `makeRoot()`, `retrieveFirstChild()` for `getFirstChild()`, etc. - -{{{ -#!xml - - - - - - -
-}}} - -== Complete API == - -Here is a list of the methods added by the behavior to the model objects: - -{{{ -#!php -` tag to add the `query_cache` behavior to a table: -{{{ -#!xml - - - - -
-}}} - -After you rebuild your model, all the queries on this object can now be cached. To trigger the query cache on a particular query, just give it a query key using the `setQueryKey()` method. The key is a unique identifier that you can choose, later used for cache lookups: - -{{{ -#!php -setQueryKey('search book by title') - ->filterByTitle($title) - ->findOne(); -}}} - -The first time Propel executes the termination method, it computes the SQL translation of the Query object and stores it into a cache backend (APC by default). Next time you run the same query, it executes faster, even with different parameters: - -{{{ -#!php -setQueryKey('search book by title') - ->filterByTitle($title) - ->findOne(); -}}} - -'''Tip''': The more complex the query, the greater the boost you get from the query cache behavior. - -== Parameters == - -You can change the cache backend and the cache lifetime (in seconds) by setting the `backend` and `lifetime` parameters: - -{{{ -#!xml - - - - - - - -
-}}} - -To implement a custom cache backend, just override the generated `cacheContains()`, `cacheFetch()` and `cacheStore()` methods in the Query object. For instance, to implement query cache using Zend_Cache and memcached, try the following: - -{{{ -#!php -getCacheBackend()->test($key); - } - - public function cacheFetch($key) - { - return $this->getCacheBackend()->load($key); - } - - public function cacheStore($key, $value) - { - return $this->getCacheBackend()->save($key, $value); - } - - protected function getCacheBackend() - { - if (self::$cacheBackend === null) { - $frontendOptions = array( - 'lifetime' => 7200, - 'automatic_serialization' => true - ); - $backendOptions = array( - 'servers' => array( - array( - 'host' => 'localhost', - 'port' => 11211, - 'persistent' => true - ) - ) - ); - self::$cacheBackend = Zend_Cache::factory('Core', 'Memcached', $frontendOptions, $backendOptions); - } - - return self::$cacheBackend; - } -} -}}} \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/behavior/sluggable.txt b/airtime_mvc/library/propel/docs/behavior/sluggable.txt deleted file mode 100644 index beb454a161..0000000000 --- a/airtime_mvc/library/propel/docs/behavior/sluggable.txt +++ /dev/null @@ -1,135 +0,0 @@ -= Sluggable Behavior = - -The `sluggable` behavior allows a model to offer a human readable identifier that can be used for search engine friendly URLs. - -== Basic Usage == - -In the `schema.xml`, use the `` tag to add the `sluggable` behavior to a table: -{{{ -#!xml - - - - -
-}}} - -Rebuild your model, insert the table creation sql again, and you're ready to go. The model now has an additional getter for its slug, which is automatically set before the object is saved: - -{{{ -#!php -setTitle('Hello, World!'); -$p1->save(); -echo $p1->getSlug(); // 'hello-world' -}}} - -By default, the behavior uses the string representation of the object to build the slug. In the example above, the `title` column is defined as `primaryString`, so the slug uses this column as a base string. The string is then cleaned up in order to allow it to appear in a URL. In the process, blanks and special characters are replaced by a dash, and the string is lowercased. - -'''Tip''': The slug is unique by design. That means that if you create a new object and that the behavior calculates a slug that already exists, the string is modified to be unique: - -{{{ -#!php -setTitle('Hello, World!'); -$p2->save(); -echo $p2->getSlug(); // 'hello-world-1' -}}} - -The generated model query offers a `findOneBySlug()` method to easily retrieve a model object based on its slug: - -{{{ -#!php -findOneBySlug('hello-world'); -}}} - -== Parameters == - -By default, the behavior adds one columns to the model. If this column is already described in the schema, the behavior detects it and doesn't add it a second time. The behavior parameters allow you to use custom patterns for the slug composition. The following schema illustrates a complete customization of the behavior: - -{{{ -#!xml - - - - - - - - - - - - -
-}}} - -Whatever `slug_column` name you choose, the `sluggable` behavior always adds the following proxy methods, which are mapped to the correct column: - -{{{ -#!php -getSlug(); // returns $post->url -$post->setSlug($slug); // $post->url = $slug -}}} - -The `slug_pattern` parameter is the rule used to build the raw slug based on the object properties. Any substring enclosed between brackets '{}' is turned into a getter, so the `Post` class generates slugs as follows: - -{{{ -#!php -getTitle(); -} -}}} - -Incidentally, that means that you can use names that don't match a real column phpName, as long as your model provides a getter for it. - -The `replace_pattern` parameter is a regular expression that shows all the characters that will end up replaced by the `replacement` parameter. In the above example, special characters like '!' or ':' are replaced by '-', but not letters, digits, nor '/'. - -The `separator` parameter is the character that separates the slug from the incremental index added in case of non-unicity. Set as '/', it makes `Post` objects sharing the same title have the following slugs: - -{{{ -'posts/hello-world' -'posts/hello-world/1' -'posts/hello-world/2' -... -}}} - -A `permanent` slug is not automatically updated when the fields that constitute it change. This is useful when the slug serves as a permalink, that should work even when the model object properties change. Note that you can still manually change the slug in a model using the `permanent` setting by calling `setSlug()`; - -== Further Customization == - -The slug is generated by the object when it is saved, via the `createSlug()` method. This method does several operations on a simple string: - -{{{ -#!php -createRawSlug(); - // truncate the slug to accomodate the size of the slug column - $slug = $this->limitSlugSize($slug); - // add an incremental index to make sure the slug is unique - $slug = $this->makeSlugUnique($slug); - - return $slug; -} - -protected function createRawSlug() -{ - // here comes the string composition code, generated according to `slug_pattern` - $slug = 'posts/' . $this->cleanupSlugPart($this->getTitle()); - // cleanupSlugPart() cleans up the slug part - // based on the `replace_pattern` and `replacement` parameters - - return $slug; -} -}}} - -You can override any of these methods in your model class, in order to implement a custom slug logic. diff --git a/airtime_mvc/library/propel/docs/behavior/soft_delete.txt b/airtime_mvc/library/propel/docs/behavior/soft_delete.txt deleted file mode 100644 index 0105edbf1f..0000000000 --- a/airtime_mvc/library/propel/docs/behavior/soft_delete.txt +++ /dev/null @@ -1,116 +0,0 @@ -= SoftDelete Behavior = - -The `soft_delete` behavior overrides the deletion methods of a model object to make them 'hide' the deleted rows but keep them in the database. Deleted objects still don't show up on select queries, but they can be retrieved or undeleted when necessary. - -== Basic Usage == - -In the `schema.xml`, use the `` tag to add the `soft_delete` behavior to a table: -{{{ -#!xml - - - - -
-}}} - -Rebuild your model, insert the table creation sql again, and you're ready to go. The model now has one new column, `deleted_at`, that stores the deletion date. Select queries don't return the deleted objects: - -{{{ -#!php -setTitle('War And Peace'); -$b->save(); -$b->delete(); -echo $b->isDeleted(); // false -echo $b->getDeletedAt(); // 2009-10-02 18:14:23 -$books = BookQuery::create()->find(); // empty collection -}}} - -Behind the curtain, the behavior adds a condition to every SELECT query to return only records where the `deleted_at` column is null. That's why the deleted objects don't appear anymore upon selection. - -You can turn off the query alteration globally by calling the static method `disableSoftDelete()` on the related Query object: - -{{{ -#!php -find(); -$book = $books[0]; -echo $book->getTitle(); // 'War And Peace' -}}} - -Note that `find()` and other selection methods automatically re-enable the `soft_delete` filter. You can also enable it manually by calling the `enableSoftDelete()` method on Peer objects. - -If you want to recover a deleted object, use the `unDelete()` method: - -{{{ -#!php -unDelete(); -$books = BookQuery::create()->find(); -$book = $books[0]; -echo $book->getTitle(); // 'War And Peace' -}}} - -If you want to force the real deletion of an object, call the `forceDelete()` method: - -{{{ -#!php -forceDelete(); -echo $book->isDeleted(); // true -$books = BookQuery::create()->find(); // empty collection -}}} - -The query methods `delete()` and `deleteAll()` also perform a soft deletion, unless you disable the behavior on the peer class: - -{{{ -#!php -setTitle('War And Peace'); -$b->save(); - -BookQuery::create()->delete($b); -$books = BookQuery::create()->find(); // empty collection -// the rows look deleted, but they are still there -BookQuery::disableSoftDelete(); -$books = BookQuery::create()->find(); -$book = $books[0]; -echo $book->getTitle(); // 'War And Peace' - -// To perform a true deletion, disable the softDelete feature -BookQuery::disableSoftDelete(); -BookQuery::create()->delete(); -// Alternatively, use forceDelete() -BookQuery::create()->forceDelete(); -}}} - -== Parameters == - -You can change the name of the column added by the behavior by setting the `deleted_column` parameter: - -{{{ -#!xml - - - - - - - -
-}}} - -{{{ -#!php -setTitle('War And Peace'); -$b->save(); -$b->delete(); -echo $b->getMyDeletionDate(); // 2009-10-02 18:14:23 -$books = BookQuery::create()->find(); // empty collection -}}} diff --git a/airtime_mvc/library/propel/docs/behavior/sortable.txt b/airtime_mvc/library/propel/docs/behavior/sortable.txt deleted file mode 100644 index b45c128431..0000000000 --- a/airtime_mvc/library/propel/docs/behavior/sortable.txt +++ /dev/null @@ -1,285 +0,0 @@ -= Sortable Behavior = - -The `sortable` behavior allows a model to become an ordered list, and provides numerous methods to traverse this list in an efficient way. - -== Basic Usage == - -In the `schema.xml`, use the `` tag to add the `sortable` behavior to a table: -{{{ -#!xml - - - - -
-}}} - -Rebuild your model, insert the table creation sql again, and you're ready to go. The model now has the ability to be inserted into an ordered list, as follows: - -{{{ -#!php -setTitle('Wash the dishes'); -$t1->save(); -echo $t1->getRank(); // 1, the first rank to be given (not 0) -$t2 = new Task(); -$t2->setTitle('Do the laundry'); -$t2->save(); -echo $t2->getRank(); // 2 -$t3 = new Task(); -$t3->setTitle('Rest a little'); -$t3->save() -echo $t3->getRank(); // 3 -}}} - -As long as you save new objects, Propel gives them the first available rank in the list. - -Once you have built an ordered list, you can traverse it using any of the methods added by the `sortable` behavior. For instance: - -{{{ -#!php -findOneByRank(1); // $t1 -$secondTask = $firstTask->getNext(); // $t2 -$lastTask = $secondTask->getNext(); // $t3 -$secondTask = $lastTask->getPrevious(); // $t2 - -$allTasks = TaskQuery::create()->findList(); -// => collection($t1, $t2, $t3) -$allTasksInReverseOrder = TaskQuery::create()->orderByRank('desc')->find(); -// => collection($t3, $t2, $t2) -}}} - -The results returned by these methods are regular Propel model objects, with access to the properties and related models. The `sortable` behavior also adds inspection methods to objects: - -{{{ -#!php -isFirst(); // false -echo $t2->isLast(); // false -echo $t2->getRank(); // 2 -}}} - -== Manipulating Objects In A List == - -You can move an object in the list using any of the `moveUp()`, `moveDown()`, `moveToTop()`, `moveToBottom()`, `moveToRank()`, and `swapWith()` methods. These operations are immediate and don't require that you save the model afterwards: - -{{{ -#!php -moveToTop(); -// The list is now 1 - Do the laundry, 2 - Wash the dishes, 3 - Rest a little -$t2->moveToBottom(); -// The list is now 1 - Wash the dishes, 2 - Rest a little, 3 - Do the laundry -$t2->moveUp(); -// The list is 1 - Wash the dishes, 2 - Do the laundry, 3 - Rest a little -$t2->swapWith($t1); -// The list is now 1 - Do the laundry, 2 - Wash the dishes, 3 - Rest a little -$t2->moveToRank(3); -// The list is now 1 - Wash the dishes, 2 - Rest a little, 3 - Do the laundry -$t2->moveToRank(2); -}}} - -By default, new objects are added at the bottom of the list. But you can also insert them at a specific position, using any of the `insertAtTop(), `insertAtBottom()`, and `insertAtRank()` methods. Note that the `insertAtXXX` methods don't save the object: - -{{{ -#!php -setTitle('Clean windows'); -$t4->insertAtRank(2); -$t4->save(); -// The list is now 1 - Wash the dishes, 2 - Clean Windows, 3 - Do the laundry, 4 - Rest a little -}}} - -Whenever you `delete()` an object, the ranks are rearranged to fill the gap: - -{{{ -#!php -delete(); -// The list is now 1 - Wash the dishes, 2 - Do the laundry, 3 - Rest a little -}}} - -'''Tip''': You can remove an object from the list without necessarily deleting it by calling `removeFromList()`. Don't forget to `save()` it afterwards so that the other objects in the lists are rearranged to fill the gap. - -== Multiple Lists == - -When you need to store several lists for a single model - for instance, one task list for each user - use a ''scope'' for each list. This requires that you enable scope support in the behavior definition by setting the `use_scope` parameter to `true`: - -{{{ -#!xml - - - - - - - - - - - -
-}}} - -Now, after rebuilding your model, you can have as many lists as required: - -{{{ -#!php -setTitle('Wash the dishes'); -$t1->setUser($paul); -$t1->save(); -echo $t1->getRank(); // 1 -$t2 = new Task(); -$t2->setTitle('Do the laundry'); -$t2->setUser($paul); -$t2->save(); -echo $t2->getRank(); // 2 -$t3 = new Task(); -$t3->setTitle('Rest a little'); -$t3->setUser($john); -$t3->save() -echo $t3->getRank(); // 1, because John has his own task list -}}} - -The generated methods now accept a `$scope` parameter to restrict the query to a given scope: - -{{{ -#!php -findOneByRank($rank = 1, $scope = $paul->getId()); // $t1 -$lastPaulTask = $firstTask->getNext(); // $t2 -$firstJohnTask = TaskPeer::create()->findOneByRank($rank = 1, $scope = $john->getId()); // $t1 -}}} - -Models using the sortable behavior with scope benefit from one additional Query methods named `inList()`: - -{{{ -#!php -inList($scope = $paul->getId())->find(); -}}} - -== Parameters == - -By default, the behavior adds one columns to the model - two if you use the scope feature. If these columns are already described in the schema, the behavior detects it and doesn't add them a second time. The behavior parameters allow you to use custom names for the sortable columns. The following schema illustrates a complete customization of the behavior: - -{{{ -#!xml - - - - - - - - - - - - - -
-}}} - -Whatever name you give to your columns, the `sortable` behavior always adds the following proxy methods, which are mapped to the correct column: - -{{{ -#!php -getRank(); // returns $task->my_rank_column -$task->setRank($rank); -$task->getScopeValue(); // returns $task->user_id -$task->setScopeValue($scope); -}}} - -The same happens for the generated Query object: - -{{{ -#!php -filterByRank(); // proxies to filterByMyRankColumn() -$query = TaskQuery::create()->orderByRank(); // proxies to orderByMyRankColumn() -$tasks = TaskQuery::create()->findOneByRank(); // proxies to findOneByMyRankColumn() -}}} - -'''Tip''': The behavior adds columns but no index. Depending on your table structure, you might want to add a column index by hand to speed up queries on sorted lists. - -== Complete API == - -Here is a list of the methods added by the behavior to the model objects: - -{{{ -#!php - $rank associative array -// only for behavior with use_scope -array inList($scope) -}}} - -The behavior also adds a few methods to the Peer classes: - -{{{ -#!php - $rank associative array -// only for behavior with use_scope -array retrieveList($scope) -int countList($scope) -int deleteList($scope) -}}} \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/behavior/timestampable.txt b/airtime_mvc/library/propel/docs/behavior/timestampable.txt deleted file mode 100644 index 146b694e99..0000000000 --- a/airtime_mvc/library/propel/docs/behavior/timestampable.txt +++ /dev/null @@ -1,92 +0,0 @@ -= Timestampable Behavior = - -The `timestampable` behavior allows you to keep track of the date of creation and last update of your model objects. - -== Basic Usage == - -In the `schema.xml`, use the `` tag to add the `timestampable` behavior to a table: -{{{ -#!xml - - - - -
-}}} - -Rebuild your model, insert the table creation sql again, and you're ready to go. The model now has two new columns, `created_at` and `updated_at`, that store a timestamp automatically updated on save: - -{{{ -#!php -setTitle('War And Peace'); -$b->save(); -echo $b->getCreatedAt(); // 2009-10-02 18:14:23 -echo $b->getUpdatedAt(); // 2009-10-02 18:14:23 -$b->setTitle('Anna Karenina'); -$b->save(); -echo $b->getCreatedAt(); // 2009-10-02 18:14:23 -echo $b->getUpdatedAt(); // 2009-10-02 18:14:25 -}}} - -The object query also has specific methods to retrieve recent objects and order them according to their update date: - -{{{ -#!php -recentlyUpdated() // adds a minimum value for the update date - ->lastUpdatedFirst() // orders the results by descending update date - ->find(); -}}} - -You can use any of the following methods in the object query: - -{{{ -#!php - - - - - - - - - - -}}} - -{{{ -#!php -setTitle('War And Peace'); -$b->save(); -echo $b->getMyCreateDate(); // 2009-10-02 18:14:23 -echo $b->getMyUpdateDate(); // 2009-10-02 18:14:23 -$b->setTitle('Anna Karenina'); -$b->save(); -echo $b->getMyCreateDate(); // 2009-10-02 18:14:23 -echo $b->getMyUpdateDate(); // 2009-10-02 18:14:25 -}}} diff --git a/airtime_mvc/library/propel/docs/build.xml b/airtime_mvc/library/propel/docs/build.xml deleted file mode 100644 index cc876c4b4e..0000000000 --- a/airtime_mvc/library/propel/docs/build.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/airtime_mvc/library/propel/docs/cookbook/Add-Custom-SQL.txt b/airtime_mvc/library/propel/docs/cookbook/Add-Custom-SQL.txt deleted file mode 100644 index fd672f7ea4..0000000000 --- a/airtime_mvc/library/propel/docs/cookbook/Add-Custom-SQL.txt +++ /dev/null @@ -1,34 +0,0 @@ -= Adding Additional SQL Files = - -In many cases you may wish to have the ''insert-sql'' task perform additional SQL operations (e.g. add views, stored procedures, triggers, sample data, etc.). Rather than have to run additional SQL statements yourself every time you re-build your object model, you can have the Propel generator do this for you. - -== 1. Create the SQL DDL files == - -Create any additional SQL files that you want executed against the database (after the base ''schema.sql'' file is applied). - -For example, if we wanted to add a default value to a column that was unsupported in the schema (e.g. where value is a SQL function): - -{{{ -#!sql --- (for postgres) -ALTER TABLE my_table ALTER COLUMN my_column SET DEFAULT CURRENT_TIMESTAMP; -}}} - -Now we save that as '''my_column-default.sql''' in the same directory as the generated '''schema.sql''' file (usually in projectdir/build/sql/). - -== 2. Tell Propel Generator about the new file == - -In that same directory (where your '''schema.sql''' is located), there is a '''sqldb.map''' file which contains a mapping of SQL DDL files to the database that they should be executed against. After running the propel generator, you will probably have a single entry in that file that looks like: - -{{{ -schema.sql=your-db-name -}}} - -We want to simply add the new file we created to this file (future builds will preserve anything you add to this file). When we're done, the file will look like this: - -{{{ -schema.sql=your-db-name -my_column-default.sql=your-db-name -}}} - -Now when you execute the ''insert-sql'' Propel generator target, the '''my_column-default.sql''' file will be executed against the ''your-db-name'' database. \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/cookbook/Copying-Objects.txt b/airtime_mvc/library/propel/docs/cookbook/Copying-Objects.txt deleted file mode 100644 index 5a67eaa4f5..0000000000 --- a/airtime_mvc/library/propel/docs/cookbook/Copying-Objects.txt +++ /dev/null @@ -1,47 +0,0 @@ -= Copying Persisted Objects = - -Propel provides the {{{copy()}}} method to perform copies of mapped row in the database. Note that Propel does '''not''' override the {{{__clone()}}} method; this allows you to create local duplicates of objects that map to the same persisted database row (should you need to do this). - -The {{{copy()}}} method by default performs shallow copies, meaning that any foreign key references will remain the same. - -{{{ -#!php -setFirstName("Aldous"); -$a->setLastName("Huxley"); - -$p = new Publisher(); -$p->setName("Harper"); - -$b = new Book(); -$b->setTitle("Brave New World"); -$b->setPublisher($p); -$b->setAuthor($a); - -$b->save(); // so that auto-increment IDs are created - -$bcopy = $b->copy(); -var_export($bcopy->getId() == $b->getId()); // FALSE -var_export($bcopy->getAuthorId() == $b->getAuthorId()); // TRUE -var_export($bcopy->getAuthor() === $b->getAuthor()); // TRUE -?> -}}} - -== Deep Copies == - -By calling {{{copy()}}} with a {{{TRUE}}} parameter, Propel will create a deep copy of the object; this means that any related objects will also be copied. - -To continue with example from above: - -{{{ -#!php -copy(true); -var_export($bcopy->getId() == $b->getId()); // FALSE -var_export($bcopy->getAuthorId() == $b->getAuthorId()); // FALSE -var_export($bcopy->getAuthor() === $b->getAuthor()); // FALSE -?> -}}} \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/cookbook/Customizing-Build.txt b/airtime_mvc/library/propel/docs/cookbook/Customizing-Build.txt deleted file mode 100644 index acfe99406d..0000000000 --- a/airtime_mvc/library/propel/docs/cookbook/Customizing-Build.txt +++ /dev/null @@ -1,153 +0,0 @@ -= Customizing Build = -It is possible to customize the Propel build process by overriding values in your propel __build.properties__ file. For maximum flexibility, you can even create your own Phing __build.xml__ file. - -== Customizing the build.properties == -The easiest way to customize your Propel build is to simply specify build properties in your project's __build.properties__ file. - -=== Understanding Phing build properties === -''Properties'' are essentially variables. These variables can be specified on the commandline or in ''properties files''. - -For example, here's how a property might be specified on the commandline: -{{{ -$> phing -Dpropertyname=value -}}} - -More typically, properties are stored in files and loaded by Phing. For those not familiar with Java properties files, these files look like PHP INI files; the main difference is that values in properties files can be references to other properties (a feature that will probably exist in in INI files in PHP 5.1). - -'''Importantly:''' properties, once loaded, are not overridden by properties with the same name unless explicitly told to do so. In the Propel build process, the order of precedence for property values is as follows: - 1. Commandline properties - 1. Project __build.properties__ - 1. Top-level __build.properties__ - 1. Top-level __default.properties__ - -This means, for example, that values specified in the project's __build.properties__ files will override those in the top-level __build.properties__ and __default.properties__ files. - -=== Changing values === -To get an idea of what you can modify in Propel, simply look through the __build.properties__ and __default.properties__ files. - -''Note, however, that some of the current values exist for legacy reasons and will be cleaned up in Propel 1.1.'' - -==== New build output directories ==== -This can easily be customized on a project-by-project basis. For example, here is a __build.properties__ file for the ''bookstore ''project that puts the generated classes in __/var/www/bookstore/classes__ and puts the generated SQL in __/var/www/bookstore/db/sql__: -{{{ -propel.project = bookstore -propel.database = sqlite -propel.database.url = sqlite://localhost/./test/bookstore.db -propel.targetPackage = bookstore - -# directories -prope.output.dir = /var/www/bookstore -propel.php.dir = ${propel.output.dir}/classes -propel.phpconf.dir = ${propel.output.dir}/conf -propel.sql.dir = ${propel.output.dir}/db/sql -}}} - -The ''targetPackage'' property is also used in determining the path of the generated classes. In the example above, the __Book.php__ class will be located at __/var/www/bookstore/classes/bookstore/Book.php__. You can change this __bookstore__ subdir by altering the ''targetPackage'' property: -{{{ -propel.targetPackage = propelom -}}} - -Now the class will be located at __/var/www/bookstore/classes/propelom/Book.php__ - -''Note that you can override the targetPackage property by specifying a package="" attribute in the tag or even the tag of the schema.xml.'' - -== Creating a custom build.xml file == - -If you want to make more major changes to the way the build script works, you can setup your own Phing build script. This actually is not a very scary task, and once you've managed to create a Phing build script, you'll probably want to create build targets for other aspects of your project (e.g. running batch unit tests is now supported in Phing 2.1-CVS). - -To start with, I suggest taking a look at the __build-propel.xml__ script (the build.xml script is just a wrapper script). Note, however, that the __build-propel.xml__ script does a lot & has a lot of complexity that is designed to make it easy to configure using properties (so, don't be scared). - -Without going into too much detail about how Phing works, the important thing is that Phing build scripts XML and they are grouped into ''targets'' which are kinda like functions. The actual work of the scripts is performed by ''tasks'', which are PHP5 classes that extend the base Phing ''Task'' class and implement its abstract methods. Propel provides some Phing tasks that work with templates to create the object model. - -=== Step 1: register the needed tasks === - -The Propel tasks must be registered so that Phing can find them. This is done using the '''' tag. You can see this near the top of the __build-propel.xml__ file. - -For example, here is how we register the ''propel-om'' task, which is the task that creates the PHP classes for your object model: -{{{ - -}}} - -Simple enough. Phing will now associate the '''' tag with the ''PropelOMTask'' class, which it expects to find at __propel/phing/PropelOMTask.php__ (on your ''include_path''). If Propel generator classes are not on your ''include_path'', you can specify that path in your '''' tag: -{{{ - -}}} - -Or, for maximum re-usability, you can create a '''' object, and then reference it (this is the way __build-propel.xml__ does it): -{{{ - - - - - -}}} - -=== Step 2: invoking the new task === - -Now that the '''' task has been registered with Phing, it can be invoked in your build file. -{{{ - - - -}}} - -In the example above, it's worth pointing out that the '''' task can actually transform multiple __schema.xml__ files, which is why there is a '''' sub-element. Phing ''filesets'' are beyond the scope of this HOWTO, but hopefully the above example is obvious enough. - -=== Step 3: putting it together into a build.xml file === - -Now that we've seen the essential elements of our custom build file, it's time to look at how to assemble them into a working whole: -{{{ - - - - - - - - - - - - - - - - - - - - - - - -}}} - -If that build script was named __build.xml__ then it could be executed by simply running ''phing'' in the directory where it is located: -{{{ -$> phing om -}}} - -Actually, specifying the ''om'' target is not necessary since it is the default. - -Refer to the __build-propel.xml__ file for examples of how to use the other Propel Phing tasks -- e.g. '''' for generating the DDL SQL, '''' for inserting the SQL, etc. \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/cookbook/Existing-Database.txt b/airtime_mvc/library/propel/docs/cookbook/Existing-Database.txt deleted file mode 100644 index 3505c0f425..0000000000 --- a/airtime_mvc/library/propel/docs/cookbook/Existing-Database.txt +++ /dev/null @@ -1,95 +0,0 @@ -= Working With Existing Databases = - -The following topics are targeted for developers who already have a working database solution in place, but would like to use Propel to work with the data. For this case, Propel provides a number of command-line utilities helping with migrations of data and data structures. - -== Working with Database Structures == - -Propel uses an abstract XML schema file to represent databases (the [wiki:Documentation/1.5/Schema schema]). Propel builds the SQL specific to a database based on this schema. Propel also provides a way to reverse-engineer the generic schema file based on database metadata. - -=== Creating an XML Schema from a DB Structure === - -To generate a schema file, create a new directory for your project & specify the connection information in your `build.properties` file for that project. For example, to create a new project, `legacyapp`, follow these steps: - - 1. Create the `legacyapp` project directory anywhere on your filesystem: -{{{ -> mkdir legacyapp -> cd legacyapp -}}} - 1. Create a `build.properties` file in `legacyapp/` directory with the DB connection parameters for your existing database, e.g.: -{{{ -propel.project = legacyapp - -# The Propel driver to use for generating SQL, etc. -propel.database = mysql - -# This must be a PDO DSN -propel.database.url = mysql:dbname=legacyapp -propel.database.user = root -# propel.database.password = -}}} - 1. Run the `reverse` task to generate the `schema.xml`: -{{{ -> propel-gen reverse -}}} - 1. Pay attention to any errors/warnings issued by Phing during the task execution and then examine the generated `schema.xml` file to make any corrections needed. - 1. '''You're done! ''' Now you have a `schema.xml` file in the `legacyapp/` project directory. You can now run the default Propel build to generate all the classes. - -The generated `schema.xml` file should be used as a guide, not a final answer. There are some datatypes that Propel may not be familiar with; also some datatypes are simply not supported by Propel (e.g. arrays in PostgreSQL). Unfamiliar datatypes will be reported as warnings and substituted with a default VARCHAR datatype. - -Tip: The reverse engineering classes may not be able to provide the same level of detail for all databases. In particular, metadata information for SQLite is often very basic since SQLite is a typeless database. - -=== Migrating Structure to a New RDBMS === - -Because Propel has both the ability to create XML schema files based on existing database structures and to create RDBMS-specific DDL SQL from the XML schema file, you can use Propel to convert one database into another. - -To do this you would simply: - 1. Follow the steps above to create the `schema.xml` file from existing db. - 1. Then you would change the target database type and specify connection URL for new database in the project's `build.properties` file: -{{{ -propel.database = pgsql -propel.database.url = pgsql://unix+localhost/newlegacyapp -}}} - 1. And then run the `sql` task to generate the new DDL: -{{{ -> propel-gen sql -}}} - 1. And (optionally) the `insert-sql` task to create the new database: -{{{ -> propel-gen insert-sql -}}} - -== Working with Database Data == - -Propel also provides several tasks to facilitate data import/export. The most important of these are `datadump` and `datasql`. The first dumps data to XML and the second converts the XML data dump to a ready-to-insert SQL file. - -Tip: Both of these tasks require that you already have generated the `schema.xml` for your database. - -=== Dumping Data to XML === - -Once you have created (or reverse-engineered) your `schema.xml` file, you can run the `datadump` task to dump data from the database into a `data.xml` file. - -{{{ -> propel-gen datadump -}}} - -The task transfers database records to XML using a simple format, where each row is an element, and each column is an attribute. So for instance, the XML representation of a row in a `publisher` table: - -||'''publisher_id'''||'''name'''|| -||1||William Morrow|| - -... is rendered in the `data.xml` as follows: -{{{ - - ... - - ... - -}}} - -=== Creating SQL from XML === - -To create the SQL files from the XML, run the `datasql` task: -{{{ -> propel-gen datasql -}}} -The generated SQL is placed in the `build/sql/` directory and will be inserted when you run the `insert-sql` task. \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/cookbook/LOB-Columns.txt b/airtime_mvc/library/propel/docs/cookbook/LOB-Columns.txt deleted file mode 100644 index d4b776d0b3..0000000000 --- a/airtime_mvc/library/propel/docs/cookbook/LOB-Columns.txt +++ /dev/null @@ -1,73 +0,0 @@ -= Working with LOB Columns = - -Propel uses PHP streams internally for storing ''Binary'' Locator Objects (BLOBs). This choice was made because PDO itself uses streams as a convention when returning LOB columns in a resultset and when binding values to prepared statements. Unfortunately, not all PDO drivers support this (see, for example, http://bugs.php.net/bug.php?id=40913); in those cases, Propel creates a {{{php://temp}}} stream to hold the LOB contents and thus provide a consistent API. - -Note that CLOB (''Character'' Locator Objects) are treated as strings in Propel, as there is no convention for them to be treated as streams by PDO. - -== Getting BLOB Values == - -BLOB values will be returned as PHP stream resources from the accessor methods. Alternatively, if the value is NULL in the database, then the accessors will return the PHP value NULL. - -{{{ -#!php -getCoverImage(); -if ($fp !== null) { - echo stream_get_contents($fp); -} -}}} - -== Setting BLOB Values == - -When setting a BLOB column, you can either pass in a stream or the blob contents. - -=== Setting using a stream === -{{{ -#!php -setCoverImage($fp); -}}} - -=== Setting using file contents === -{{{ -#!php -setCoverImage(file_get_contents("/path/to/file.ext")); -}}} - -Regardless of which setting method you choose, the BLOB will always be represented internally as a stream resource -- ''and subsequent calls to the accessor methods will return a stream.'' - -For example: -{{{ -#!php -setCoverImage(file_get_contents("/path/to/file.ext")); - -$fp = $media->getCoverImage(); -print gettype($fp); // "resource" -}}} - -=== Setting BLOB columns and isModified() === - -Note that because a stream contents may be externally modified, ''mutator methods for BLOB columns will always set the '''isModified()''' to report true'' -- even if the stream has the same identity as the stream that was returned. - -For example: -{{{ -#!php -getCoverImage(); -$media->setCoverImage($fp); - -var_export($media->isModified()); // TRUE -}}} \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/cookbook/Master-Slave.txt b/airtime_mvc/library/propel/docs/cookbook/Master-Slave.txt deleted file mode 100644 index 2e28f49034..0000000000 --- a/airtime_mvc/library/propel/docs/cookbook/Master-Slave.txt +++ /dev/null @@ -1,94 +0,0 @@ -= Replication = - -Propel can be used in a master-slave replication environment. These environments are set up to improve the performance of web applications by dispatching the database-load to multiple database-servers. While a single master database is responsible for all write-queries, multiple slave-databases handle the read-queries. The slaves are synchronised with the master by a fast binary log (depending on the database). - -== Configuring Propel for Replication == - - * Set up a replication environment (see the Databases section below) - * Use the latest Propel-Version from SVN - * add a slaves-section to your {{{runtime-conf.xml}}} file - * verify the correct setup by checking the masters log file (should not contain "select ..." statements) - -You can configure Propel to support replication by adding a element with nested element(s) to your {{{runtime-conf.xml}}}. - -The section is at the same level as the master and contains multiple nested elements with the same information as the top-level (master) . It is recommended that they are numbered. The follwing example shows a slaves section with a several slave connections configured where "localhost" is the master and "slave-server1" and "slave-server2" are the slave-database connections. - -{{{ -#!xml - - - - propel-bookstore - console - 7 - - - - - sqlite - - mysql:host=localhost;dbname=bookstore - testuser - password - - - - mysql:host=slave-server1; dbname=bookstore - testuser - password - - - mysql:host=slave-server2; dbname=bookstore - testuser - password - - - - - - -}}} - -== Implementation == - -The replication functionality is implemented in the Propel connection configuration and initialization code and in the generated Peer and Object classes. - -=== Propel::getConnection() === - -When requesting a connection from Propel ('''Propel::getConnection()'''), you can either specify that you want a READ connection (slave) or WRITE connection (master). Methods that are designed to perform READ operations, like the '''doSelect*()''' methods of your generated Peer classes, will always request a READ connection like so: -{{{ -#!php -query('SELECT * FROM my'); -/* ... */ -}}} - -=== Propel::setForceMasterConnection() === - -You can force Propel to always return a WRITE (master) connection from '''Propel::getConnection()''' by calling '''Propel::setForceMasterConnection(true);'''. This can be useful if you must be sure that you are getting the most up-to-date data (i.e. if there is some latency possible between master and slaves). - -== Databases == - -=== MySql === - -http://dev.mysql.com/doc/refman/5.0/en/replication-howto.html - -== References == - - * Henderson Carl (2006): Building Scalable Web Sites. The Flickr Way. O'Reilly. ISBN-596-10235-6. - diff --git a/airtime_mvc/library/propel/docs/cookbook/Multi-Component.txt b/airtime_mvc/library/propel/docs/cookbook/Multi-Component.txt deleted file mode 100644 index f033ce70ce..0000000000 --- a/airtime_mvc/library/propel/docs/cookbook/Multi-Component.txt +++ /dev/null @@ -1,297 +0,0 @@ -= Multi-Component Data Model = - -Propel comes along with packaging capabilities that allow you to more easily integrate Propel into a packaged or modularized application. - -== Muliple Schemas == - -You can use as many `schema.xml` files as you want. Schema files have to be named `(*.)schema.xml`, so names like `schema.xml`, `package1.schema.xml`, `core.package1.schema.xml` are all acceptable. These files ''have'' to be located in your project directory. - -Each schema file has to contain a `` element with a `name` attribute. This name references the connection settings to be used for this database (and configured in the `runtime-conf.xml`), so separated schemas can share a common database name. - -Whenever you call a propel build taks, Propel will consider all these schema files and build the classes (or the SQL) for all the tables. - -== Understanding Packages == - -In Propel, a ''package'' represents a group of models. This is a convenient way to organize your code in a modularized way, since classes and SQL files of a given package are be grouped together and separated from the other packages. By carefully choosing the package of each model, applications end up in smaller, independent modules that are easier to manage. - -=== Package Cascade === - -The package is defined in a configuration cascade. You can set it up for the whole project, for all the tables of a schema, or for a single table. - -For the whole project, the main package is set in the `build.properties`: - -{{{ -#!ini -propel.targetPackage = my_project -}}} - -By default, all the tables of all the schemas in the project use this package. However, you can override the package for a given `` by setting its `package` attribute: - -{{{ -#!xml - - -
- -
-
- - - - - -
- - -
-
-}}} - -In this example, thanks to the `package` attribute, the tables are grouped into the following packages: - - * `my_project.author` package: `author` table - * `my_project.book` package: `book` and `review` tables - -'''Warning''': If you separate tables related by a foreign key into separate packages (like `book` and `author` in this example), you must enable the `packageObjectModel` build property to let Propel consider other packages for relations. - -You can also override the `package` attribute at the `` element level. - -{{{ -#!xml - - -
- -
- - - - - - -
- - -
-
-}}} - -This ends up in the following package: - - * `my_project.author` package: `author` table - * `my_project.book` package: `book` table - * `my_project.review` package: `review` table - -Notice that tables can end up in separated packages even though they belong to the same schema file. - -'''Tip''': You can use dots in a package name to add more package levels. - -=== Packages and Generated Model Files === - -The `package` attribute of a table translates to the directory in which Propel generates the Model classes for this table. - -For instance, if no `package` attribute is defined at the database of table level, Propel places all classes according to the `propel.targetPackage` from the `build.properties`: - -{{{ -build/ - classes/ - my_project/ - om/ - map/ - Author.php - AuthorPeer.php - AuthorQuery.php - Book.php - BookPeer.php - BookQuery.php - Review.php - ReviewPeer.php - ReviewQuery.php -}}} - -You can further tweak the location where Propel puts the created files by changing the `propel.output.dir` build property. By default this property is set to: - -{{{ -#!ini -propel.output.dir = ${propel.project.dir}/build -}}} - -You can change it to use any other directory as your build directory. - -If you set up packages for `` elements, Propel splits up the generated model classes into subdirectories named after the package attribute: - -{{{ -build/ - classes/ - my_project/ - author/ - om/ - map/ - Author.php - AuthorPeer.php - AuthorQuery.php - book/ - om/ - map/ - Book.php - BookPeer.php - BookQuery.php - Review.php - ReviewPeer.php - ReviewQuery.php -}}} - -And of course, if you specialize the `package` attribute per table, you can have one table use its own package: - -{{{ -build/ - classes/ - my_project/ - author/ - om/ - map/ - Author.php - AuthorPeer.php - AuthorQuery.php - book/ - om/ - map/ - Book.php - BookPeer.php - BookQuery.php - review/ - om/ - map/ - Review.php - ReviewPeer.php - ReviewQuery.php -}}} - -=== Packages And SQL Files === - -Propel also considers packages for SQL generation. In practice, Propel generates one SQL file per package. Each file contains the CREATE TABLE SQL statements necessary to create all the tables of a given package. - -So by default, all the tables end up in a single SQL file: - -{{{ -build/ - sql/ - schema.sql -}}} - -If you specialize the `package` for each `` element, Propel uses it for SQL files: - -{{{ -build/ - sql/ - author.schema.sql // contains CREATE TABLE author - book.schema.sql // contains CREATE TABLE book and CREATE TABLE review -}}} - -And, as you probably expect it, a package overridden at the table level also accounts for an independent SQL file: - -{{{ -build/ - sql/ - author.schema.sql // contains CREATE TABLE author - book.schema.sql // contains CREATE TABLE book - review.schema.sql // contains CREATE TABLE review -}}} - -== Understanding The packageObjectModel Build Property == - -The `propel.packageObjectModel` build property enables the "packaged" build process. This modifies the build tasks behavior by joining `` elements of the same name - but keeping their packages separate. That allows to split a large schema into several files, regardless of foreign key dependencies, since Propel will join all schemas using the same database name. - -To switch this on, simply add the following line to the `build.properties` file in your project directory: -{{{ -propel.packageObjectModel = true -}}} - -== The Bookstore Packaged Example == - -In the bookstore-packaged example you'll find the following schema files: - - * author.schema.xml - * book.schema.xml - * club.schema.xml - * media.schema.xml - * publisher.schema.xml - * review.schema.xml - * log.schema.xml - -Each schema file has to contain a `` tag that has its `package` attribute set to the package name where ''all'' of the tables in this schema file/database belong to. - -For example, in the bookstore-packaged example the `author.schema.xml` contains the following `` tag: - -{{{ - -}}} - -That means, that the Author OM classes will be created in a subdirectory `core/author/` of the build output directory. - -You can have more than one schema file that belong to one package. For example, in the the bookstore-packaged example both the `book.schema.xml` and `media.schema.xml` belong to the same package "core.book". The generated OM classes for these schemas will therefore end up in the same `core/book/` subdirectory. - -=== The OM build === - -To run the packaged bookstore example build simply go to the `propel/test/fixtures/bookstore-packages/` directory and type: - -{{{ -../../../generator/bin/propel-gen om -}}} - -This should run without any complaints. When you have a look at the projects/bookstore-packaged/build/classes directory, the following directory tree should have been created: -{{{ -addon/ - club/ - BookClubList.php - BookClubListPeer.php - BookListRel.php - BookListRelPeer.php -core/ - author/ - Author.php - AuthorPeer.php - book/ - Book.php - BookPeer.php - - Media.php - MediaPeer.php - publisher/ - Publisher.php - PublisherPeer.php - review/ - Review.php - ReviewPeer.php -util/ - log/ - BookstoreLog.php - BookstoreLogPeer.php -}}} - -(The additional subdirectories map/ and om/ in each of these directories have been omitted for clarity.) - -== The SQL build == - -From the same schema files, run the SQL generation by calling: - -{{{ -../../../generator/bin/propel-gen sql -}}} - -Then, have a look at the `build/sql/` directory: you will see that for each package (that is specified as a package attribute in the schema file database tags), one sql file has been created: - - * addon.club.schema.sql - * core.author.schema.sql - * core.book.schema.sql - * core.publisher.schema.sql - * core.review.schema.sql - * util.log.schema.sql - -These files contain the CREATE TABLE SQL statements necessary for each package. - -When you now run the insert-sql task by typing: -{{{ -../../../generator/bin/propel-gen insert-sql -}}} -these SQL statements will be executed on a SQLite database located in the Propel/generator/test/ directory. \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/cookbook/Namespaces.txt b/airtime_mvc/library/propel/docs/cookbook/Namespaces.txt deleted file mode 100644 index 705d5ed685..0000000000 --- a/airtime_mvc/library/propel/docs/cookbook/Namespaces.txt +++ /dev/null @@ -1,133 +0,0 @@ -= How to Use PHP 5.3 Namespaces = - -The generated model classes can use a namespace. It eases the management of large database models, and makes the Propel model classes integrate with PHP 5.3 applications in a clean way. - -== Namespace Declaration And Inheritance == - -To define a namespace for a model class, you just need to specify it in a `namespace` attribute of the `` element for a single table, or in the `` element to set the same namespace to all the tables. - -Here is an example schema using namespaces: - -{{{ -#!xml - - - -
- - - - - - - - - - - - -
- - - - - - -
- - - - -
- - - - - -
- -
-}}} - -The `` element defines a `namespace` attribute. The `book` and `author` tables inherit their namespace from the database, therefore the generated classes for these tables will be `\Bookstore\Book` and `\Bookstore\Author`. - -The `publisher` table defines a `namespace` attribute on ots own, which ''extends'' the database namespace. That means that the generated class will be `\Bookstore\Book\Publisher`. - -As for the `user` table, it defines an absolute namespace (starting with a backslash), which ''overrides'' the database namespace. The generated class for the `user` table will be `Admin\User`. - -'''Tip''': You can use subnamespaces (i.e. namespaces containing backslashes) in the `namespace` attribute. - -== Using Namespaced Models == - -Namespaced models benefit from the Propel runtime autoloading just like the other model classes. You just need to alias them, or to use their fully qualified name. - -{{{ -#!php -setAuthor($author); -$book->save(); -}}} - -The namespace is used for the ActiveRecord class, but also for the Query and Peer classes. Just remember that when you use relation names ina query, the namespace should not appear: - -{{{ -#!php -useBookQuery() - ->filterByPrice(array('max' => 10)) - ->endUse() - ->findOne(); -}}} - -Related tables can have different namespaces, it doesn't interfere with the functionality provided by the object model: - -{{{ -#!php -findOne(); -echo get_class($book->getPublisher()); -// \Bookstore\Book\Publisher -}}} - -'''Tip''': Using namespaces make generated model code incompatible with versions of PHP less than 5.3. Beware that you will not be able to use your model classes in an older PHP application. - -== Using Namespaces As A Directory Structure == - -In a schema, you can define a `package` attribute on a `` or a `` tag to generate model classes in a subdirectory (see [wiki:Documentation/1.5/Multi-Component]). If you use namespaces to autoload your classes based on a SplClassAutoloader (see http://groups.google.com/group/php-standards), then you may find yourself repeating the `namespace` data in the `package` attribute: - -{{{ -#!xml - -}}} - -To avoid such repetitions, just set the `propel.namespace.autoPackage` setting to `true` in your `build.properties`: - -{{{ -#!ini -propel.namespace.autoPackage = true -}}} - -Now Propel will automatically create a `package` attribute, and therefore distribute model classes in subdirectories, based on the `namespace` attribute, and you can omit the manual `package` attribute in the schema: - -{{{ -#!xml - -}}} \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/cookbook/Nested-Set.txt b/airtime_mvc/library/propel/docs/cookbook/Nested-Set.txt deleted file mode 100644 index 8cf7fed7ec..0000000000 --- a/airtime_mvc/library/propel/docs/cookbook/Nested-Set.txt +++ /dev/null @@ -1,183 +0,0 @@ -= !NestedSet support in Propel = - -'''Warning''': Since Propel 1.5, the support for nested sets was moved to the `nested_set` behavior. The method described here is deprecated.''' - -== Description == - -With !NestedSet implementation, trees are stored using different approach in databases: [http://www.sitepoint.com/article/hierarchical-data-database] - -Nested Set implementation requires three dedicated fields in table structure - - * left - * right - -Plus an optional fields for multi nested set support - * scope - -''NB: fields name are free and must be defined in schema.xml'' - -To enable !NestedSet support in table, schema.xml must define some specific attributes: -'''treeMode''' which must take the value '''!NestedSet''' - -{{{ -#!xml -
-}}} - -Then, left and right field must be defined that way '''nestedSetLeftKey''' as a boolean value as '''nestedSetRightKey''' - -{{{ -#!xml - - -}}} - -For multi nestedset support, an other column must be defined with boolean attribute '''treeScopeKey''' set to true -{{{ -#!xml - -}}} - -And then, let's the propel generator automagically create all the needed model and stub classes. - -== !NestedSet usage in Propel == - -''ex:'' -'''schema.xml''' extract -{{{ -#!xml -
- - - - - - - - - - - - - - - -
-}}} - -=== !NestedSet insertion === -{{{ -#!php -setText('Google'); -$root->setLink('http://www.google.com'); - -$root->makeRoot(); -$root->save(); - -$menu = new Menu(); -$menu->setText('Google Mail'); -$menu->setLink('http://mail.google.com'); -$menu->insertAsLastChildOf($root); -$menu->save(); - -$child = new Menu(); -$child->setText('Google Maps'); -$child->setLink('http://maps.google.com'); -$child->insertAsLastChildOf($root); -$child->save(); - -$sibling = new Menu(); -$sibling->setText('Yahoo!'); -$sibling->setLink('http://www.yahoo.com'); -$sibling->insertAsNextSiblingOf($root); -$sibling->save(); - -$child = new Menu(); -$child->setText('Yahoo! Mail'); -$child->setLink('http://mail.yahoo.com'); -$child->insertAsLastChildOf($sibling); -$child->save(); -}}} - -=== Multi !NestedSet insertion === -{{{ -#!php -setText('Google'); -$root->setLink('http://www.google.com'); - -$root->makeRoot(); -$root->setScopeIdValue(1); // Tree 1 -$root->save(); - -$menu = new Menu(); -$menu->setText('Google Mail'); -$menu->setLink('http://mail.google.com'); -$menu->insertAsLastChildOf($root); -$menu->save(); - -// Create secund root node -$root2 = new Menu(); -$root2->setText('Yahoo!'); -$root2->setLink('http://www.yahoo.com'); - -$root2->makeRoot(); -$root2->setScopeIdValue(2); // Tree 2 -$root2->save(); - -$menu = new Menu(); -$menu->setText('Yahoo! Mail'); -$menu->setLink('http://mail.yahoo.com'); -$menu->insertAsLastChildOf($root2); -$menu->save(); -}}} - -=== Tree retrieval === -{{{ -#!php -getDepth()); - } - - function endChildren() { - echo str_repeat("\t", $this->getDepth() - 1); - } -} - -$menu = MenuPeer::retrieveTree($scopeId); -$it = new myMenuOutput($menu); -foreach($it as $m) { - echo $m->getText(), '[', $m->getLeftValue(), '-', $m->getRightValue(), "]\n"; -} -}}} -=== Tree traversal === - -!NestetSet implementation use the [http://somabo.de/talks/200504_php_quebec_spl_for_the_masses.pdf SPL RecursiveIterator] as suggested by soenke - -== !NestedSet known broken behaviour == - -=== Issue description === -For every changes applied on the tree, several entries in the database can be involved. So all already loaded nodes have to be refreshed with their new left/right values. - -=== InstancePool enabled === -In order to refresh all loaded nodes, an automatic internal call is made after each tree change to retrieve all instance in InstancePool and update them. -And it works fine. - -=== InstancePool disabled === -When InstancePool is disabled, their is no way to retrieve references to all already loaded node and get them updated. -So in most case, all loaded nodes are not updated and it leads to an inconsistency state. -So, workaround is to do an explicit reload for any node you use after tree change. - - diff --git a/airtime_mvc/library/propel/docs/cookbook/Runtime-Introspection.txt b/airtime_mvc/library/propel/docs/cookbook/Runtime-Introspection.txt deleted file mode 100644 index dce769231d..0000000000 --- a/airtime_mvc/library/propel/docs/cookbook/Runtime-Introspection.txt +++ /dev/null @@ -1,164 +0,0 @@ -= Model Introspection At Runtime = - -In addition to the object and peer classes used to do C.R.U.D. operations, Propel generates an object mapping for your tables to allow runtime introspection. - -The intospection objects are instances of the map classes. Propel maps databases, tables, columns, validators, and relations into objects that you can easily use. - -== Retrieving a TableMap == - -The starting point for runtime introspection is usually a table map. This objects stores every possible property of a table, as defined in the `schema.xml`, but accessible at runtime. - -To retrieve a table map for a table, use the `getTableMap()` static method of the related peer class. For instance, to retrieve the table map for the `book` table, just call: - -{{{ -#!php -getName(); // 'table' -echo $bookTable->getPhpName(); // 'Table' -echo $bookTable->getPackage(); // 'bookstore' -echo $bookTable->isUseIdGenerator(); // true -}}} - -Tip: A TableMap object also references the `DatabaseMap` that contains it. From the database map, you can also retrieve other table maps using the table name or the table phpName: -{{{ -#!php -getDatabaseMap(); -$authorTable = $dbMap->getTable('author'); -$authorTable = $dbMap->getTablebyPhpName('Author'); -}}} - -To introspect the columns of a table, use any of the `getColumns()`, `getPrimaryKeys()`, and `getForeignKeys()` `TableMap` methods. They all return an array of `ColumnMap` objects. - -{{{ -#!php -getColumns(); -foreach ($bookColumns as $column) { - echo $column->getName(); -} -}}} - -Alternatively, if you know a column name, you can retrieve the corresponding ColumnMap directly using the of `getColumn($name)` method. - -{{{ -#!php -getColumn('title'); -}}} - -The `DatabaseMap` object offers a shortcut to every `ColumnMap` object if you know the fully qualified column name: -{{{ -#!php -getColumn('book.TITLE'); -}}} - -== ColumnMaps == - -A `ColumnMap` instance offers a lot of information about a table column. Check the following examples: - -{{{ -#!php -getTableName(); // 'book' -$bookTitleColumn->getTablePhpName(); // 'Book' -$bookTitleColumn->getType(); // 'VARCHAR' -$bookTitleColumn->getSize(); // 255 -$bookTitleColumn->getDefaultValue(); // null -$bookTitleColumn->isLob(); // false -$bookTitleColumn->isTemporal(); // false -$bookTitleColumn->isEpochTemporal(); // false -$bookTitleColumn->isNumeric(); // false -$bookTitleColumn->isText(); // true -$bookTitleColumn->isPrimaryKey(); // false -$bookTitleColumn->isForeignKey(); // false -$bookTitleColumn->hasValidators(); // false -}}} - -`ColumnMap` objects also keep a reference to their parent `TableMap` object: - -{{{ -#!php -getTable(); -}}} - -Foreign key columns give access to more information, including the related table and column: - -{{{ -#!php -getColumn('publisher_id'); -echo $bookPublisherIdColumn->isForeignKey(); // true -echo $bookPublisherIdColumn->getRelatedName(); // 'publisher.ID' -echo $bookPublisherIdColumn->getRelatedTableName(); // 'publisher' -echo $bookPublisherIdColumn->getRelatedColumnName(); // 'ID' -$publisherTable = $bookPublisherIdColumn->getRelatedTable(); -$publisherRelation = $bookPublisherIdColumn->getRelation(); -}}} - -== RelationMaps == - -To get an insight on all the relationships of a table, including the ones relying on a foreign key located in another table, you must use the `RelationMap` objects related to a table. - -If you know its name, you can retrieve a `RelationMap` object using `TableMap::getRelation($relationName)`. Note that the relation name is the phpName of the related table, unless the foreign key defines a phpName in the schema. For instance, the name of the `RelationMap` object related to the `book.PUBLISHER_ID` column is 'Publisher'. - -{{{ -#!php -getRelation('Publisher'); -}}} - -alternatively, you can access a `RelationMap` from a foreign key column using `ColumnMap::getRelation()`, as follows: - -{{{ -#!php -getColumn('publisher_id')->getRelation(); -}}} - -Once you have a `RelationMap` instance, inspect its properties using any of the following methods: - -{{{ -#!php -getType(); // RelationMap::MANY_TO_ONE -echo $publisherRelation->getOnDelete(); // 'SET NULL' -$bookTable = $publisherRelation->getLocalTable(); -$publisherTable = $publisherRelation->getForeignTable(); -print_r($publisherRelation->getColumnMappings()); - // array('book.PUBLISHER_ID' => 'publisher.ID') -print_r(publisherRelation->getLocalColumns()); - // array($bookPublisherIdColumn) -print_r(publisherRelation->getForeignColumns()); - // array($publisherBookIdColumn) -}}} - -This also works for relationships referencing the current table: - -{{{ -#!php -getRelation('Review'); -echo $reviewRelation->getType(); // RelationMap::ONE_TO_MANY -echo $reviewRelation->getOnDelete(); // 'CASCADE' -$reviewTable = $reviewRelation->getLocalTable(); -$bookTable = $reviewRelation->getForeignTable(); -print_r($reviewRelation->getColumnMappings()); - // array('review.BOOK_ID' => 'book.ID') -}}} - -To retrieve all the relations of a table, call `TableMap::getRelations()`. You can then iterate over an array of `RelationMap` objects. - -Tip: RelationMap objects are lazy-loaded, which means that the `TableMap` will not instanciate any relation object until you call `getRelations()`. This allows the `TableMap` to remain lightweight for when you don't use relationship introspection. diff --git a/airtime_mvc/library/propel/docs/cookbook/Writing-Behavior.txt b/airtime_mvc/library/propel/docs/cookbook/Writing-Behavior.txt deleted file mode 100644 index 33ceebc634..0000000000 --- a/airtime_mvc/library/propel/docs/cookbook/Writing-Behavior.txt +++ /dev/null @@ -1,424 +0,0 @@ -= How to Write A Behavior = - -Behaviors are a good way to reuse code across models without requiring inheritance (a.k.a. horizontal reuse). This step-by-step tutorial explains how to port model code to a behavior, focusing on a simple example. - -In the tutorial "[http://propel.posterous.com/getting-to-know-propel-15-keeping-an-aggregat Keeping an Aggregate Column up-to-date]", posted in the [http://propel.posterous.com/ Propel blog], the `TotalNbVotes` property of a `PollQuestion` object was updated each time a related `PollAnswer` object was saved, edited, or deleted. This "aggregate column" behavior was implemented by hand using hooks in the model classes. To make it truly reusable, the custom model code needs to be refactored and moved to a Behavior class. - -== Boostrapping A Behavior == - -A behavior is a class that can alter the generated classes for a table of your model. It must only extend the [browser:branches/1.5/generator/lib/model/Behavior.php `Behavior`] class and implement special "hook" methods. Here is the class skeleton to start with for the `aggregate_column` behavior: - -{{{ -#!php - null, - ); -} -}}} - -Save this class in a file called `AggregateColumnBehavior.php`, and set the path for the class file in the project `build.properties` (just replace directory separators with dots). Remember that the `build.properties` paths are relative to the include path: - -{{{ -#!ini -propel.behavior.aggregate_column.class = path.to.AggregateColumnBehavior -}}} - -Test the behavior by adding it to a table of your model, for instance to a `poll_question` table: - -{{{ -#!xml - - - - - - - -
-
-}}} - -Rebuild your model, and check the generated `PollQuestionTableMap` class under the `map` subdirectory of your build class directory. This class carries the structure metadata for the `PollQuestion` ActiveRecord class at runtime. The class should feature a `getBehaviors()` method as follows, proving that the behavior was correctly applied: - -{{{ -#!php - array('name' => 'total_nb_votes', ), - ); - } // getBehaviors() -} -}}} - -== Adding A Column == - -The behavior works, but it still does nothing at all. Let's make it useful by allowing it to add a column. In the `AggregateColumnBehavior` class, just implement the `modifyTable()` method with the following code: - -{{{ -#!php -getTable(); - if (!$columnName = $this->getParameter('name')) { - throw new InvalidArgumentException(sprintf( - 'You must define a \'name\' parameter for the \'aggregate_column\' behavior in the \'%s\' table', - $table->getName() - )); - } - // add the aggregate column if not present - if(!$table->containsColumn($columnName)) { - $table->addColumn(array( - 'name' => $columnName, - 'type' => 'INTEGER', - )); - } - } -} -}}} - -This method shows that a behavior class has access to the `` defined for it in the `schema.xml` through the `getParameter()` command. Behaviors can also always access the `Table` object attached to them, by calling `getTable()`. A `Table` can check if a column exists and add a new one easily. The `Table` class is one of the numerous generator classes that serve to describe the object model at buildtime, together with `Column`, `ForeignKey`, `Index`, and a lot more classes. You can find all the buildtime model classes under the [browser:branches/1.5/generator/lib/model generator/lib/model] directory. - -'''Tip''': Don't mix up the ''runtime'' database model (`DatabaseMap`, `TableMap`, `ColumnMap`, `ValidatorMap`, `RelationMap`) with the ''buildtime'' database model (`Database`, `Table`, `Column`, `Validator`, etc.). The buildtime model is very detailed, in order to ease the work of the builders that write the ActiveRecord and Query classes. On the other hand, the runtime model is optimized for speed, and carries minimal information to allow correct hydration and binding at runtime. Behaviors use the buildtime object model, because they are run at buildtime, so they have access to the most powerful model. - -Now rebuild the model and the SQL, and sure enough, the new column is there. `BasePollQuestion` offers a `getTotalNbVotes()` and a `setTotalNbVotes()` method, and the table creation SQL now includes the additional `total_nb_votes` column: - -{{{ -#!sql -DROP TABLE IF EXISTS poll_question; -CREATE TABLE poll_question -( - id INTEGER NOT NULL AUTO_INCREMENT, - title VARCHAR(100), - total_nb_votes INTEGER, - PRIMARY KEY (id) -)Type=InnoDB; -}}} - -'''Tip''': The behavior only adds the column if it's not present (`!$table->containsColumn($columnName)`). So if a user needs to customize the column type, or any other attribute, he can include a `` tag in the table with the same name as defined in the behavior, and the `modifyTable()` will then skip the column addition. - -== Adding A Method To The ActiveRecord Class == - -In the previous post, a method of the ActiveRecord class was in charge of updating the `total_nb_votes` column. A behavior can easily add such methods by implementing the `objectMethods()` method: - -{{{ -#!php -addUpdateAggregateColumn(); - return $script; - } - - protected function addUpdateAggregateColumn() - { - $sql = sprintf('SELECT %s FROM %s WHERE %s = ?', - $this->getParameter('expression'), - $this->getParameter('foreign_table'), - $this->getParameter('foreign_column') - ); - $table = $this->getTable(); - $aggregateColumn = $table->getColumn($this->getParameter('name')); - $columnPhpName = $aggregateColumn->getPhpName(); - $localColumn = $table->getColumn($this->getParameter('local_column')); - return " -/** - * Updates the aggregate column {$aggregateColumn->getName()} - * - * @param PropelPDO \$con A connection object - */ -public function update{$columnPhpName}(PropelPDO \$con) -{ - \$sql = '{$sql}'; - \$stmt = \$con->prepare(\$sql); - \$stmt->execute(array(\$this->get{$localColumn->getPhpName()}())); - \$this->set{$columnPhpName}(\$stmt->fetchColumn()); - \$this->save(\$con); -} -"; - } -} -}}} - -The ActiveRecord class builder expects a string in return to the call to `Behavior::objectMethods()`, and appends this string to the generated code of the ActiveRecord class. Don't bother about indentation: builder classes know how to properly indent a string returned by a behavior. A good rule of thumb is to create one behavior method for each added method, to provide better readability. - -Of course, the schema must be modified to supply the necessary parameters to the behavior: - -{{{ -#!xml - - - - - - - - - - - -
- - - - - - - - -
-
-}}} - -Now if you rebuild the model, you will see the new `updateTotalNbVotes()` method in the generated `BasePollQuestion` class: - -{{{ -#!php -prepare($sql); - $stmt->execute(array($this->getId())); - $this->setTotalNbVotes($stmt->fetchColumn()); - $this->save($con); - } -} -}}} - -Behaviors offer similar hook methods to allow the addition of methods to the query classes (`queryMethods()`) and to the peer classes (`peerMethods()`). And if you need to add attributes, just implement one of the `objectAttributes()`, `queryAttributes()`, or `peerAttributes()` methods. - -== Using a Template For Generated Code == - -The behavior's `addUpdateAggregateColumn()` method is somehow hard to read, because of the large string containing the PHP code canvas for the added method. Propel behaviors can take advantage of Propel's simple templating system to use an external file as template for the code to insert. - -Let's refactor the `addUpdateAggregateColumn()` method to take advantage of this feature: - -{{{ -#!php -getParameter('expression'), - $this->getParameter('foreign_table'), - $this->getParameter('foreign_column') - ); - $table = $this->getTable(); - $aggregateColumn = $table->getColumn($this->getParameter('name')); - return $this->renderTemplate('objectUpdateAggregate', array( - 'aggregateColumn' => $aggregateColumn, - 'columnPhpName' => $aggregateColumn->getPhpName(), - 'localColumn' => $table->getColumn($this->getParameter('local_column')), - 'sql' => $sql, - )); - } -} -}}} - -The method no longer returns a string created by hand, but a ''rendered template''. Propel templates are simple PHP files executed in a sandbox - they have only access to the variables declared as second argument of the `renderTemplate()` call. - -Now create a `templates/` directory in the same directory as the `AggregateColumnBehavior` class file, and add in a `objectUpdateAggregate.php` file with the following code: - -{{{ -#!php -/** - * Updates the aggregate column getName() ?> - * - * @param PropelPDO $con A connection object - */ -public function update(PropelPDO $con) -{ - $sql = ''; - $stmt = $con->prepare($sql); - $stmt->execute(array($this->getgetPhpName() ?>())); - $this->set($stmt->fetchColumn()); - $this->save($con); -} -}}} - -No need to escape dollar signs anymore: this syntax allows for a cleaner separation, and is very convenient for large behaviors. - -== Adding Another Behavior From A Behavior == - -This is where it's getting tricky. In the [http://propel.posterous.com/getting-to-know-propel-15-keeping-an-aggregat blog post] describing the column aggregation technique, the calls to the `updateTotalNbVotes()` method come from the `postSave()` and `postDelete()` hooks of the `PollAnswer` class. But the current behavior is applied to the `poll_question` table, how can it modify the code of a class based on another table? - -The short answer is: it can't. To modify the classes built for the `poll_answer` table, a behavior must be registered on the `poll_answer` table. But a behavior is just like a column or a foreign key: it has an object counterpart in the buildtime database model. So the trick here is to modify the `AggregateColumnBehavior::modifyTable()` method to ''add a new behavior'' to the foreign table. This second behavior will be in charge of implementing the `postSave()` and `postDelete()` hooks of the `PollAnswer` class. - -{{{ -#!php -getDatabase()->getTable($this->getParameter('foreign_table')); - if (!$foreignTable->hasBehavior('concrete_inheritance_parent')) { - require_once 'AggregateColumnRelationBehavior.php'; - $relationBehavior = new AggregateColumnRelationBehavior(); - $relationBehavior->setName('aggregate_column_relation'); - $relationBehavior->addParameter(array( - 'name' => 'foreign_table', - 'value' => $table->getName() - )); - $relationBehavior->addParameter(array( - 'name' => 'foreign_column', - 'value' => $this->getParameter('name') - )); - $foreignTable->addBehavior($relationBehavior); - } - } -} -}}} - -In practice, everything now happens as if the `poll_answer` had its own behavior: - -{{{ -#!xml - - - - - - - - -
-
-}}} - -Adding a behavior to a `Table` instance, as well as adding a `Parameter` to a `Behavior` instance, is quite straightforward. And since the second behavior class file is required in the `modifyTable()` method, there is no need to add a path for it in the `build.properties`. - -== Adding Code For Model Hooks == - -The new `AggregateColumnRelationBehavior` is yet to write. It must implement a call to `PollQuestion::updateTotalNbVotes()` in the `postSave()` and `postDelete()` hooks. - -Adding code to hooks from a behavior is just like adding methods: add a method with the right hook name returning a code string, and the code will get appended at the right place. Unsurprisingly, the behavior hook methods for `postSave()` and `postDelete()` are called `postSave()` and `postDelete()`: - -{{{ -#!php - null, - 'foreignColumn' => null, - ); - - public function postSave() - { - $table = $this->getTable(); - $foreignTable = $table->getDatabase()->getTable($this->getParameter('foreign_table')); - $foreignColumn = $foreignTable->getColumn($this->getParameter('foreign_column')); - $foreignColumnPhpName = $foreignColumn->getPhpName(); - return "\$this->updateRelated{$foreignColumnPhpName}(\$con)"; - } - - public function postDelete() - { - return $this->postSave(); - } - - public function objectMethods() - { - $script = ''; - $script .= $this->addUpdateRelatedAggregateColumn(); - return $script; - } - - protected function addUpdateRelatedAggregateColumn() - { - $table = $this->getTable(); - $foreignTable = $table->getDatabase()->getTable($this->getParameter('foreign_table')); - $foreignTablePhpName = foreignTable->getPhpName(); - $foreignColumn = $foreignTable->getColumn($this->getParameter('foreign_column')); - $foreignColumnPhpName = $foreignColumn->getPhpName(); - return " -/** - * Updates an aggregate column in the foreign {$foreignTable->getName()} table - * - * @param PropelPDO \$con A connection object - */ -protected function updateRelated{$foreignColumnPhpName}(PropelPDO \$con) -{ - if (\$parent{$foreignTablePhpName} = \$this->get{$foreignTablePhpName}()) { - \$parent{$foreignTablePhpName}->update{$foreignColumnPhpName}(\$con); - } -} -"; - } -} -}}} - -The `postSave()` and `postDelete()` behavior hooks will not add code to the ActiveRecord `postSave()` and `postDelete()` methods - to allow users to further implement these methods - but instead it adds code directly to the `save()` and `delete()` methods, inside a transaction. Check the generated `BasePollAnswer` class for the added code in these methods: - -{{{ -#!php -updateRelatedTotalNbVotes($con); -}}} - -You will also see the new `updateRelatedTotalNbVotes()` method added by `AggregateColumnBehavior::objectMethods()`: - -{{{ -#!php -getPollQuestion()) { - $parentPollQuestion->updateTotalNbVotes($con); - } -} -}}} - -== What's Left == - -These are the basics of behavior writing: implement one of the methods documented in the [wiki:Documentation/1.5/Behaviors#WritingaBehavior behaviors chapter] of the Propel guide, and return strings containing the code to be added to the ActiveRecord, Query, and Peer classes. In addition to the behavior code, you should always write unit tests - all the behaviors bundled with Propel have full unit test coverage. And to make your behavior usable by others, documentation is highly recommended. Once again, Propel core behaviors are fully documented, to let users understand the behavior usage without having to peek into the code. - -As for the `AggregateColumnBehavior`, the job is not finished. The [http://propel.posterous.com/getting-to-know-propel-15-keeping-an-aggregat blog post] emphasized the need for hooks in the Query class, and these are not yet implemented in the above code. Besides, the post kept quiet about one use case that left the aggregate column not up to date (when a question is detached from a poll without deleting it). Lastly, the parameters required for this behavior are currently a bit verbose, especially concerning the need to define the foreign table and the foreign key - this could be simplified thanks to the knowledge of the object model that behaviors have. - -All this is left to the reader as an exercise. Fortunately, the final behavior is part of the Propel core behaviors, so the [browser:branches/1.5/generator/lib/behavior/aggregate_column code], [browser:branches/1.5/test/testsuite/generator/behavior/aggregate_column unit tests], and [wiki:Documentation/1.5/Behaviors/aggregate_column documentation] are all ready to help you to further understand the power of Propel's behavior system. \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/guide/01-Installation.txt b/airtime_mvc/library/propel/docs/guide/01-Installation.txt deleted file mode 100644 index f5ca02442a..0000000000 --- a/airtime_mvc/library/propel/docs/guide/01-Installation.txt +++ /dev/null @@ -1,164 +0,0 @@ -= Installing Propel = - -[[PageOutline]] - -Propel is available as a [http://pear.php.net/manual/en/installation.getting.php PEAR] package, as a "traditional" tgz or zip package, and as a checkout from a Subversion repository. Whatever installation method you may choose, getting Propel to work is pretty straightforward. - -== Prerequisites == - -Propel requirements are very light, allowing it to run on most PHP platforms: - - * [http://www.php.net/ PHP 5.2.4] or newer, with the DOM (libxml2) module enabled - * A supported database (MySQL, MS SQL Server, PostgreSQL, SQLite, Oracle) - -'''Tip''': Propel uses the PDO and SPL components, which are bundled and enabled by default in PHP5. - -== Propel Components == - -The Propel library is made of two components: a '''generator''', and a '''runtime library'''. These components are not co-dependent, and can be installed independently from each other. - -The generator is needed to build the object model, but is not required for running applications that use Propel. - -The runtime classes provide the shared functionality that is used by the Propel-generated object model classes. These are necessary to run applications that use Propel to access the database. - -Usually, both the generator and the runtime components are installed on development environments, while the actual test or production servers need only the runtime components installed. For your first contact with Propel, just install both. - -== Installing Propel == - -=== Installing Propel From PEAR === - -In order to install the Propel packages, you must add the `pear.propelorm.org` channel to your PEAR environment. Once the channel is discovered, you can install the generator package, or the runtime package, or both. Use the '-a' option to let PEAR download and install dependencies. - -{{{ -#!sh -> pear channel-discover pear.propelorm.org -> pear install -a propel/propel_generator -> pear install -a propel/propel_runtime -}}} - -Propel is now installed, and you can test it by following the instructions of the '''Testing Propel Installation''' section at the end of this page. - -Tip: If you want to install non-stable versions of Propel, change your `preferred_state` PEAR environment variable before installoing the Propel packages. Valid states include 'stable', 'beta', 'alpha', and 'devel': - -{{{ -#!sh -> pear config-set preferred_state beta -}}} - -=== Dependencies for Tarball and Subversion Versions === - -The Propel generator uses [http://phing.info/ Phing 2.3.3] to manage command line tasks; both the generator and the runtime classes use [http://pear.php.net/package/Log/ PEAR Log] to log events. - -If you choose to install Propel via PEAR, these components will be automatically installed as dependencies. If you choose to install Propel from a tarball or a Subversion checkout, you'll have to install them manually: - -{{{ -#!sh -> pear channel-discover pear.phing.info -> pear install phing/phing -> pear install Log -}}} - -Refer to their respective websites for alternative installation strategies for Phing and Log. - -=== Installing Propel From Subversion === - -Installing from SVN trunk ensures that you have the most up-to-date source code. - -{{{ -#!sh -> svn checkout http://svn.propelorm.org/branches/1.5 /usr/local/propel -}}} - -This will export both the generator and runtime components to your local `propel` directory. In addition, you'll also get Propel documentation and unit tests - that's why this method is the preferred installation method for Propel contributors. - -Once this is done, you'll need to setup your PHP environment to use this library - see the '''Setting Up PHP for Propel''' section below. - -Note: `branches/1.5` is currently more uptodate code than `trunk`; trunk is what will become 2.0, however it has had very little work done to it in a long time. - -=== Installing Propel From a Tarball === - -Download a tarball of each of the Propel components from the Propel website, and uncompress them into the location that best suits your need. For instance, in Linux: - -{{{ -#!sh -> cd /usr/local -> mkdir propel -> cd propel -> wget http://pear.propelorm.org/get/propel_generator-1.5.0.tgz -> tar zxvf propel_generator-1.5.0.tgz -> wget http://pear.propelorm.org/get/propel_runtime-1.5.0.tgz -> tar zxvf propel_runtime-1.5.0.tgz -}}} - -Once this is done, you'll need to setup your PHP environment to use this library. - -== Setting Up PHP for the Propel Generator == - -The following instructions are only required if you installed Propel from a tarball, or from Subversion. - -The Propel generator component bundles a `propel-gen` sh script (and a `propel-gen.bat` script for Windows). This script simplifies the commandline invocation of the Propel generator by hiding any references to Phing. - -You can call it directly from the command line: - -{{{ -#!sh -> /usr/local/propel/generator/bin/propel-gen -}}} - -In order to allow an easier execution the script, you can also: - - * add the propel generator's `bin/` directory to your PATH, - * or copy the `propel-gen` script to a location on your PAH, - * or (on Linux systems) create a symlink. For example: - -{{{ -#!sh -> cd /usr/local/bin -> ln -s /usr/local/propel/generator/bin/propel-gen propel-gen -}}} - -== Testing Propel Installation == - -You can test that the '''Propel generator''' component is properly installed by calling the `propel-gen` script from the CLI: - -{{{ -#!sh -> propel-gen -}}} - -The script should output a few lines before displaying a 'BUILD FAILED' message, which is normal - you haven't defined a database model yet. - -You can test that the '''Propel runtime''' component is properly installed by requiring the `Propel.php` script, as follows: - -{{{ -#!php -` tag: - -{{{ -#!xml - - - - -}}} - -The `name` attribute defines the name of the connection that Propel uses for the tables in this schema. It is not necessarily the name of the actual database. In fact, Propel uses a second file to link a connection name with real connection settings (like databae name, user and password). This `runtime-conf.xml` file will be explained later in this chapter. - -The `defaultIdMethod` attribute indicates that the tables in this schema use the database's "native" auto-increment/sequence features to handle id columns that are set to auto-increment. - -'''Tip''': You can define several schemas for a single project. Just make sure that each of the schema filenames end with `schema.xml`. - -=== Tables And Columns === - -Within the `` tag, Propel expects one `` tag for each table: - -{{{ -#!xml - - -
- -
- - -
- - -
-
-}}} - -This time, the `name` attributes are the real table names. The `phpName` is the name that Propel will use for the generated PHP class. By default, Propel uses a CamelCase version of the table name as its phpName - that means that you could omit the `phpName` attribute in the example above. - -Within each set of `` tags, define the columns that belong to that table: - -{{{ -#!xml - - -
- - - - - -
- - - - -
- - - -
-
-}}} - -Each column has a `name` (the one used by the database), and an optional `phpName` attribute. Once again, the Propel default behavior is to use a CamelCase version of the `name` as `phpName` when not specified. - -Each column also requires a `type`. The XML schema is database agnostic, so the column types and attributes are probably not exactly the same as the one you use in your own database. But Propel knows how to map the schema types with SQL types for many database vendors. Existing Propel column types are boolean, tinyint, smallint, integer, bigint, double, float, real, decimal, char, varchar, longvarchar, date, time, timestamp, blob, and clob. Some column types use a `size` (like `varchar` and `int`), some have unlimited size (`longvarchar`, `clob`, `blob`). - -As for the other column attributes, `required`, `primaryKey`, and `autoIncrement`, they mean exactly what their names suppose. - -'''Tip''': Propel supports namespaces (for PHP > 5.3). If you specify a `namespace` attribute in a `` element, the generated PHP classes for this table will use this namespace. - -=== Foreign Keys === - -A table can have several `` tags, describing foreign keys to foreign tables. Each `` tag consists of one or more mappings between a local column and a foreign column. - -{{{ -#!xml - - -
- - - - - - - - - - - -
- - - - -
- - - -
-
-}}} - -A foreign key represents a relationship. Just like a table or a column, a relationship has a `phpName`. By default, Propel uses the `phpName` of the foreign table as the `phpName` of the relation. The `refPhpName` defines the name of the relation as seen from the foreign table. - -There are many more attributes and elements available to describe a datamodel. Propel's documentation provides a complete [wiki:Documentation/1.5/Schema reference of the schema syntax], together with a [source:branches/1.5/generator/resources/dtd/database.dtd DTD] and a [source:branches/1.5/generator/resources/xsd/database.xsd XSD] schema for its validation. - -== Building The Model == - -=== Setting Up Build Configuration === - -The build process is highly customizable. Whether you need the generated classes to inherit one of your classes rather than Propel's base classes, or to enable/disable some methods in the generated classes, pretty much every customization is possible. Of course, Propel provides sensible defaults, so that you actually need to define only two settings for the build process to start: the RDBMS you are going to use, and a name for your project. - -Propel expects the build configuration to be stored in a file called `build.properties`, and stored at the same level as the `schema.xml`. Here is an example for a MySQL database: - -{{{ -#!ini -# Database driver -propel.database = mysql - -# Project name -propel.project = bookstore -}}} - -Use your own database vendor driver, chosen among pgsql, mysql, sqlite, mssql, and oracle. - -You can learn more about the available build settings and their possible values in the [wiki:Documentation/1.5/BuildConfiguration build configuration reference]. - -=== Using the `propel-gen` Script To Build The Model === - -The Propel generator uses the `propel-gen` script, as seen in the previous chapter. This executable expects a command name as its argument. - -Open a terminal and browse to the `bookstore/` directory, where you saved the two previous files (`schema.xml`, and `build.properties`). Then use the `propel-gen` script to call the "Object Model generator" command using its shortcut - "om": - -{{{ -> cd /path/to/bookstore -> propel-gen om -}}} - -You should normally see a some colored lines appear in the terminal, logging all the class generation, and ending with "BUILD FINISHED". If not, look for red lines in the log and follow the directions in the error messages. - -=== Generated Object Model === - -The "om" command added a new directory in the `bookstore/` project, called `build/`. The generated model classes are located under the `classes/bookstore/` subdirectory: - -{{{ -> cd /path/to/bookstore -> cd build/classes/bookstore/ -> ls - om/ - map/ - Author.php - AuthorPeer.php - AuthorQuery.php - Book.php - BookPeer.php - BookQuery.php - Publisher.php - PublisherPeer.php - PublisherQuery.php -}}} - -For every table in the database, Propel creates 3 PHP classes: - - * a ''model'' class (e.g. `Book`), which represents a row in the database; - * a ''peer'' class (e.g. `BookPeer`), offering static constants and methods mostly for compatibility with previous Propel versions; - * a ''query'' class (e.g. `BookQuery`), used to operate on a table to retrieve and update rows - -Propel uses the `phpName` attribute of each table as the base for the PHP class names. - -All these classes are empty, but they inherit from `Base` classes that you will find under the `om/` directory: - -{{{ -#!php - cd /path/to/bookstore -> propel-gen sql -}}} - -The generated SQL definition can be found in the `build/sql/schema.sql` file. The code is optimized for the database driver defined in the `build.properties`. - -=== Using The SQL File === - -Create the database and setup the access permissions using your favorite database client. For instance, to create the `my_db_name` database with MySQL, type: - -{{{ -> mysqladmin -u root -p create my_db_name -}}} - -Now you can use the generated code directly: - -{{{ -> mysql -u root -p my_db_name < build/sql/schema.sql -}}} - -'''Tip''': The `schema.sql` file will DROP any existing table before creating them, which will effectively erase your database. - -Depending on which RDBMS you are using, it may be normal to see some errors (e.g. "unable to DROP...") when you first run this command. This is because some databases have no way of checking to see whether a database object exists before attempting to DROP it (MySQL is a notable exception). It is safe to disregard these errors, and you can always run the script a second time to make sure that the errors are no longer present. - -=== Inserting SQL With `propel-gen` === - -As an alternative to using the generated sql code directly, you can ask Propel to insert it directly into your database. Start by defining the database connection settings in the `build.properties`, as follows: - -{{{ -# Connection parameters -propel.database.url = mysql:host=localhost;dbname=my_db_name -propel.database.user = my_db_user -propel.database.password = my_db_password - -# Other examples: -# propel.database.url = sqlite:/path/to/bookstore.db -# propel.database.url = pgsql:host=localhost dbname=my_db_name user=my_db_user password=my_db_password -}}} - -The `propel.database.url` setting should be a PDO DSN (see the [http://www.php.net/pdo PDO documentation] for more information about vendor-specific DSN). The `user` and `password` are only necessary for the `mysql` and `oracle` drivers. - -Then use the `propel-gen` script with the "insert-sql" command to connect to the database and inject the generated SQL code: - -{{{ -> cd /path/to/bookstore -> propel-gen insert-sql -}}} - -== Runtime Connection Settings == - -The database and PHP classes are now ready to be used. But they don't know yet how to communicate with each other at runtime. You must add a configuration file so that the generated object model classes and the shared Propel runtime classes can connect to the database, and log the Propel activity. - -=== Writing The XML Runtime Configuration === - -Create a file called `runtime-conf.xml` at the root of the `bookstore` project, using the following content: -{{{ -#!xml - - - - - - - mysql - - mysql:host=localhost;dbname=my_db_name - my_db_user - my_db_password - - - - - -}}} - -Notice how the `id` attribute of the `` tag matches the connection name defined in the `` tag of the `schema.xml`. This is how Propel maps a database description to a connection. - -Replace the `` and the `` settings wit hthe ones of your database. - -See the [wiki:Documentation/1.5/RuntimeConfiguration runtime configuration reference] for a more detailed explanation of this file. - -'''Tip''': If you uncomment the `` section, Propel will attempt to instantiate the `Log` class (from the [http://pear.php.net/package/Log/ PEAR Log] package) with the specified parameters and use that to log queries. Propel's statement logging happens at the DEBUG level (7); errors and warnings are logged at the appropriate (non-debug) level. - -=== Building the Runtime Configuration === - -For performance reasons, Propel prefers to use a PHP version of the connection settings rather than the XML file you just defined. So you must use the `propel-gen` script one last time to build the PHP version of the `runtime-conf.xml` configuration: - -{{{ -> cd /path/to/bookstore -> propel-gen convert-conf -}}} - -The resulting file can be found under `build/conf/bookstore-conf.php`, where "bookstore" is the name of the project you defined in `build.properties`. - -'''Tip''': As you saw, a Propel project setup requires that you call three commands with the `propel-gen` script: `om`, `sql`, and `convert-conf`. This is so usual that if you call the `propel-gen` script with no parameter, it will execute these three commands in a row: - -{{{ -> cd /path/to/bookstore -> propel-gen -}}} - -== Setting Up Propel == - -This is the final step: initialize Propel in your PHP script. You may wish to do this step in an init or setup script that is included at the beginning of your PHP scripts. - -Here is a sample initialization file: - -{{{ -#!php -setFirstName('Jane'); -$author->setLastName('austen'); -$author->save(); -}}} - -The column names used in the `setXXX()` methods correspond to the `phpName` attribute of the `` tag in your schema, or to a CamelCase version of the column name if the `phpName` is not set. - -In the background, the call to `save()` results in the following SQL being executed on the database: -{{{ -#!sql -INSERT INTO author (first_name, last_name) VALUES ('Jane', 'Austen'); -}}} - -== Reading Object Properties == - -Propel maps the columns of a table into properties of the generated objects. For each property, you can use a generated getter to access it. - -{{{ -#!php -getId(); // 1 -echo $author->getFirstName(); // 'Jane' -echo $author->getLastName(); // 'austen' -}}} - -The `id` column was set automatically by the database, since the `schema.xml` defines it as an `autoIncrement` column. The value is very easy to retrieve once the object is saved: just call the getter on the column phpName. - -These calls don't issue a database query, since the `Author` object is already loaded in memory. - -== Retrieving Rows == - -Retrieving objects from the database, also referred to as ''hydrating'' objects, is essentially the process of executing a SELECT query against the database and populating a new instance of the appropriate object with the contents of each returned row. - -In Propel, you use the generated Query objects to select existing rows from the database. - -=== Retrieving by Primary Key === - -The simplest way to retrieve a row from the database, is to use the generated `findPK()` method. It simply expects the value of the primary key of the row to be retrieved. - -{{{ -#!php -findPK(1); -// now $firstBook is an Author object, or NULL if no match was found. -}}} - -This issues a simple SELECT SQL query. For instance, for MySQL: - -{{{ -#!sql -SELECT author.id, author.first_name, author.last_name -FROM `author` -WHERE author.id = 1 -LIMIT 1; -}}} - -When the primary key consists of more than one column, `findPK()` accepts multiple parameters, one for each primary key column. - -'''Tip''': Every generated Query objects offers a factory method called `create()`. This methods creates a new instance of the query, and allows you to write queries in a single line: - -{{{ -#!php -findPK(1); -}}} - -You can also select multiple objects based on their primary keys, by calling the generated `findPKs()` method. It takes an array of primary keys as a parameter: - -{{{ -#!php -findPKs(array(1,2,3,4,5,6,7)); -// $selectedAuthors is a collection of Author objects -}}} - -=== Querying the Database === - -To retrieve rows other than by the primary key, use the Query's `find()` method. - -An empty Query object carries no condition, and returns all the rows of the table -{{{ -#!php -find(); -// $authors contains a collection of Author objects -// one object for every row of the author table -foreach($authors as $author) { - echo $author->getFirstName(); -} -}}} - -To add a simple condition on a given column, use one of the generated `filterByXXX()` methods of the Query object, where `XXX` is a column phpName. Since `filterByXXX()` methods return the current query object, you can continue to add conditions or end the query with the result of the method call. For instance, to filter by first name: - -{{{ -#!php -filterByFirstName('Jane') - ->find(); -}}} - -When you pass a value to a `filterByXXX()` method, Propel uses the column type to escape this value in PDO. This protects you from SQL injection risks. - -You can also easily limit and order the results on a query. Once again, the Query methods return the current Query object, so you can easily chain them: - -{{{ -#!php -orderByLastName() - ->limit(10) - ->find(); -}}} - -`find()` always returns a collection of objects, even if there is only one result. If you know that you need a single result, use `findOne()` instead of `find()`. It will add the limit and return a single object instead of an array: - -{{{ -#!php -filterByFirstName('Jane') - ->findOne(); -}}} - -'''Tip''': Propel provides magic methods for this simple use case. So you can write the above query as: - -{{{ -#!php -findOneByFirstName('Jane'); -}}} - -The Propel Query API is very powerful. The next chapter will teach you to use it to add conditions on related objects. If you can't wait, jump to the [wiki:Documentation/1.5/ModelCriteria Query API reference]. - -=== Using Custom SQL === - -The `Query` class provides a relatively simple approach to constructing a query. Its database neutrality and logical simplicity make it a good choice for expressing many common queries. However, for a very complex query, it may prove more effective (and less painful) to simply use a custom SQL query to hydrate your Propel objects. - -As Propel uses PDO to query the underlying database, you can always write custom queries using the PDO syntax. For instance, if you have to use a sub-select: - -{{{ -#!php -prepare($sql); -$stmt->execute(array(':name' => 'Tolstoy'); -}}} - -With only a little bit more work, you can also populate `Book` objects from the resulting statement. Create a new `PropelObjectCollection` for the `Book` model, and call the `format()` method using the statement: - -{{{ -#!php -setModelName('Book'); -$books = $coll->format($stmt); -// $books contains a collection of Book objects -}}} - -There are a few important things to remember when using custom SQL to populate Propel: - * The resultset columns must be numerically indexed - * The resultset must contain all columns in the object - * The resultset must have columns ''in the same order'' as they are defined in the `schema.xml` file - -== Updating Objects == - -Updating database rows basically involves retrieving objects, modifying the contents, and then saving them. In practice, for Propel, this is a combination of what you've already seen in the previous sections: - -{{{ -#!php -findOneByFirstName('Jane'); -$author->setLastName('Austen'); -$author->save(); -}}} - -Alternatively, you can update several rows based on a Query using the query object's `update()` method: - -{{{ -#!php -filterByFirstName('Jane') - ->update(array('LastName' => 'Austen')); -}}} - -This last method is better for updating several rows at once, or if you didn't retrieve the objects before. - -== Deleting Objects == - -Deleting objects works the same as updating them. You can either delete an existing object: - -{{{ -#!php -findOneByFirstName('Jane'); -$author->delete(); -}}} - -Or use the `delete()` method in the query: - -{{{ -#!php -filterByFirstName('Jane') - ->delete(); -}}} - -'''Tip''': A deleted object still lives in the PHP code. It is marked as deleted and cannot be saved anymore, but you can still read its properties: - -{{{ -#!php -isDeleted(); // true -echo $author->getFirstName(); // 'Jane' -}}} - -== Termination Methods == - -The Query methods that don't return the current query object are called "Termination Methods". You've alread seen come of them: `find()`, `findOne()`, `update()`, `delete()`. There are two more termination methods that you should know about: - -{{{ -#!php -count(); -// You could also count the number of results from a find(), but that would be less effective, -// since it implies hydrating objects just to count them - -// paginate() returns a paginated list of results -$authorPager = AuthorQuery::create()->paginate($page = 1, $maxPerPage = 10); -// This method will compute an offset and a limit -// based on the number of the page and the max number of results per page. -// The result is a PropelModelPager object, over which you can iterate: -foreach ($authorPager as $author) { - echo $author->getFirstName(); -} -// a pager object gives more information -echo $pager->getNbResults(); // total number of results if not paginated -echo $pager->haveToPaginate(); // return true if the total number of results exceeds the maximum per page -echo $pager->getFirstIndex(); // index of the first result in the page -echo $pager->getLastIndex(); // index of the last result in the page -$links = $pager->getLinks(5); // array of page numbers around the current page; useful to display pagination controls -}}} - -== Collections And On-Demand Hydration == - -The `find()` method of generated Model Query objects returns a `PropelCollection` object. You can use this object just like an array of model objects, iterate over it using `foreach`, access the objects by key, etc. - -{{{ -#!php -limit(5) - ->find(); -foreach ($authors as $author) { - echo $authors->getFirstName(); -} -}}} - -The advantage of using a collection instead of an array is that Propel can hydrate model objects on demand. Using this feature, you'll never fall short of memory when retrieving a large number of results. Available through the `setFormatter()` method of Model Queries, on-demand hydration is very easy to trigger: - -{{{ -#!php -limit(50000) - ->setFormatter(ModelCriteria::FORMAT_ON_DEMAND) // just add this line - ->find(); -foreach ($authors as $author) { - echo $author->getFirstName(); -} -}}} - -In this example, Propel will hydrate the `Author` objects row by row, after the `foreach` call, and reuse the memory between each iteration. The consequence is that the above code won't use more memory when the query returns 50,000 results than when it returns 5. - -`ModelCriteria::FORMAT_ON_DEMAND` is one of the many formatters provided by the Query objects. You can also get a collection of associative arrays instead of objects, if you don't need any of the logic stored in your model object, by using `ModelCriteria::FORMAT_ARRAY`. - -The [wiki:Documentation/1.5/ModelCriteria Query API reference] describes each formatter, and how to use it. - -== Propel Instance Pool == - -Propel keeps a list of the objects that you already retrieved in memory to avoid calling the same request twice in a PHP script. This list is called the instance pool, and is automatically populated from your past requests: - -{{{ -#!php -findPk(1); -// Issues a SELECT query -... -// second call -$author2 = AuthorQuery::create()->findPk(1); -// Skips the SQL query and returns the existing $author1 object -}}} diff --git a/airtime_mvc/library/propel/docs/guide/04-Relationships.txt b/airtime_mvc/library/propel/docs/guide/04-Relationships.txt deleted file mode 100644 index 6e5de3c682..0000000000 --- a/airtime_mvc/library/propel/docs/guide/04-Relationships.txt +++ /dev/null @@ -1,386 +0,0 @@ -= Basic Relationships = - -[[PageOutline]] - -The definition of foreign keys in your schema allows Propel to add smart methods to the generated model and query objects. In practice, these generated methods mean that you will never actually have to deal with primary and foreign keys yourself. It makes the task of dealing with relations extremely straightforward. - -== Inserting A Related Row == - -Propel creates setters for related objects that simplify the foreign key handling. You don't actually have to define a foreign key value. Instead, just set a related object, as follows: - -{{{ -#!php -setFirstName("Leo"); -$author->setLastName("Tolstoy"); -$author->save(); - -$book = new Book(); -$book->setTitle("War & Peace"); -// associate the $author object with the current $book -$book->setAuthor($author); -$book->save(); -}}} - -Propel generates the `setAuthor()` method based on the `phpName` attribute of the `` element in the schema. When the attribute is not set, Propel uses the `phpName` of the related table instead. - -Internally, the call to `Book::setAuthor($author)` translates into `Book::setAuthorId($author->getId())`. But you don't actually have to save a Propel object before associating it to another. In fact, Propel automatically "cascades" INSERT statements when a new object has other related objects added to it. - -For one-to-many relationships - meaning, from the other side of a many-to-one relationship - the process is a little different. In the previous example, one `Book` has one `Author`, but one `Author` has many `Books`. From the `Author` point of view, a one-to-many relationships relates it to `Book`. So Propel doesn't generate an `Author::setBook()`, but rather an `Author::addBook()`: - -{{{ -#!php -setTitle("War & Peace"); -// associate the $author object with the current $book -$book->save(); - -$author = new Author(); -$author->setFirstName("Leo"); -$author->setLastName("Tolstoy"); -$author->addBook($book); -$author->save(); -}}} - -The result is the same in the database - the `author_id` column of the `book` row is correctly set to the `id` of the `author` row. - -== Save Cascade == - -As a matter of fact, you don't need to `save()` an object before relating it. Propel knows which objects are related to each other, and is capable of saving all the unsaved objects if they are related to each other. - -The following example shows how to create new `Author` and `Publisher` objects, which are then added to a new `Book` object; all 3 objects are saved when the `Book::save()` method is eventually invoked. - -{{{ -#!php -setFirstName("Leo"); -$author->setLastName("Tolstoy"); -// no need to save the author yet - -$publisher = new Publisher(); -$publisher->setName("Viking Press"); -// no need to the publisher yet - -$book = new Book(); -$book->setTitle("War & Peace"); -$book->setIsbn("0140444173"); -$book->setPublisher($publisher); -$book->setAuthor($author); -$book->save(); // saves all 3 objects! -}}} - -In practice, Propel '''cascades''' the `save()` action to the related objects. - -== Reading Related Object Properties == - -Just like the related object setters, Propel generates a getter for every relation: - -{{{ -#!php -findPk(1); -$author = $book->getAuthor(); -echo $author->getFirstName(); // 'Leo' -}}} - -Since a relationship can also be seen from the other end, Propel allows the foreign table to retrieve the related objects as well: - -{{{ -#!php -findPk(1); -$books = $author->getBooks(); -foreach ($books as $book) { - echo $book->getTitle(); -} -}}} - -Notice that Propel generated a `getBooks()` method returning an array of `Book` objects, rather than a `getBook()` method. This is because the definition of a foreign key defines a many-to-one relationship, seen from the other end as a one-to-many relationship. - -'''Tip''': Propel also generates a `countBooks()` methods to get the number of related objects without hydrating all the `Book` objects. for performance reasons, you should prefer this method to `count($author->getBooks())`. - -Getters for one-to-many relationship accept an optional query object. This allows you to hydrate related objects, or retrieve only a subset of the related objects, or to reorder the list of results: - -{{{ -#!php -orderByTitle() - ->joinWith('Book.Publisher'); -$books = $author->getBooks($query); -}}} - -== Using Relationships In A Query == - -=== Finding Records Related To Another One === - -If you need to find objects related to a model object that you already have, you can take advantage of the generated `filterByXXX()` methods in the query objects, where `XXX` is a relation name: - -{{{ -#!php -findPk(1); -$books = BookQuery::create() - ->filterByAuthor($author) - ->orderByTitle() - ->find(); -}}} - -You don't need to specify that the `author_id` column of the `Book` object should match the `id` column of the `Author` object. Since you already defined the foreign key mapping in your schema, Propel knows enough to figure it out. - -=== Embedding Queries === - -In SQL queries, relationships often translate to a JOIN statement. Propel abstracts this relational logic in the query objects, by allowing you to ''embed'' a related query into another. - -In practice, Propel generates one `useXXXQuery()` method for every relation in the Query objects. So the `BookQuery` class offers a `useAuthorQuery()` and a `usePublisherQuery()` method. These methods return a new Query instance of the related query class, that you can eventually merge into the main query by calling `endUse()`. - -To illustrate this, let's see how to write the following SQL query with the Propel Query API: - -{{{ -#!sql -SELECT book.* -FROM book INNER JOIN author ON book.AUTHOR_ID = author.ID -WHERE book.ISBN = '0140444173' AND author.FIRST_NAME = 'Leo' -ORDER BY book.TITLE ASC -LIMIT 10; -}}} - -That would simply give: - -{{{ -#!php -filterByISBN('0140444173') - ->useAuthorQuery() // returns a new AuthorQuery instance - ->filterByFirstName('Leo') // this is an AuthorQuery method - ->endUse() // merges the Authorquery in the main Bookquery and returns the BookQuery - ->orderByTitle() - ->limit(10) - ->find(); -}}} - -Propel knows the columns to use in the `ON` clause from the definition of foreign keys in the schema. The ability to use methods of a related Query object allows you to keep your model logic where it belongs. - -Of course, you can embed several queries to issue a query of any complexity level: - -{{{ -#!php -useBookQuery() - ->usePublisherQuery() - ->filterByName('Viking Press') - ->endUse() - ->endUse() - ->find(); -}}} - -You can see how the indentation of the method calls provide a clear explanation of the embedding logic. That's why it is a good practice to format your Propel queries with a single method call per line, and to add indentation every time a `useXXXQuery()` method is used. - -== Many-to-Many Relationships == - -Databases typically use a cross-reference table, or junction table, to materialize the relationship. For instance, if the `user` and `group` tables are related by a many-to-many relationship, this happens through the rows of a `user_group` table. To inform Propel about the many-to-many relationship, set the `isCrossRef` attribute of the cross reference table to true: - -{{{ -#!xml - - - -
- - - - -
- - - - - - - - - - -
-}}} - -Once you rebuild your model, the relationship is seen as a one-to-many relationship from both the `User` and the `Group` models. That means that you can deal with adding and reading relationships the same way as you usually do: - -{{{ -#!php -setName('John Doe'); -$group = new Group(); -$group->setName('Anonymous'); -// relate $user and $group -$user->addGroup($group); -// save the $user object, the $group object, and a new instance of the UserGroup class -$user->save(); -}}} - -The same happens for reading related objects ; Both ends see the relationship as a one-to-many relationship: - -{{{ -#!php -getUsers(); -$nbUsers = $group->countUsers(); -$groups = $user->getGroups(); -$nbGroups = $user->countGroups(); -}}} - -Just like regular related object getters, these generated methods accept an optional query object, to further filter the results. - -To facilitate queries, Propel also adds new methods to the `UserQuery` and `GroupQuery` classes: - -{{{ -#!php -filterByGroup($group) - ->find(); -$groups = GroupQuery::create() - ->filterByUser($user) - ->find(); -}}} - -== One-to-One Relationships == - -Propel supports the special case of one-to-one relationships. These relationships are defined when the primary key is also a foreign key. For example : - -{{{ -#!xml - - - -
- - - - - - - - -
-}}} - -Because the primary key of the `bookstore_employee_account` is also a foreign key to the `bookstore_employee` table, Propel interprets this as a one-to-one relationship and will generate singular methods for both sides of the relationship (`BookstoreEmployee::getBookstoreEmployeeAccount()`, and `BookstoreEmployeeAccount::getBookstoreEmployee()`). - -== On-Update and On-Delete Triggers = - -Propel also supports the ''ON UPDATE'' and ''ON DELETE'' aspect of foreign keys. These properties can be specified in the `` tag using the `onUpdate` and `onDelete` attributes. Propel supports values of `CASCADE`, `SETNULL`, and `RESTRICT` for these attributes. For databases that have native foreign key support, these trigger events will be specified at the datbase level when the foreign keys are created. For databases that do not support foreign keys, this functionality will be emulated by Propel. - -{{{ -#!xml - - - - - - - -
-}}} - -In the example above, the `review` rows will be automatically removed if the related `book` row is deleted. - -== Minimizing Queries == - -Even if you use a foreign query, Propel will issue new queries when you fetch related objects: - -{{{ -#!php -useAuthorQuery() - ->filterByFirstName('Leo') - ->endUse() - ->findOne(); -$author = $book->getAuthor(); // Needs another database query -}}} - -Propel allows you to retrieve the main object together with related objects in a single query. You just the `with()` method to specify which objects the main object should be hydrated with. - -{{{ -#!php -useAuthorQuery() - ->filterByFirstName('Leo') - ->endUse() - ->with('Author') - ->findOne(); -$author = $book->getAuthor(); // Same result, with no supplementary query -}}} - -Since the call to `with()` adds the columns of the related object to the SELECT part of the query, and uses these columns to populate the related object, that means that a query using `with()` is slower and consumes more memory. So use it only when you actually need the related objects afterwards. - -If you don't want to add a filter on a related object but still need to hydrate it, calling `useXXXQuery()`, `endUse()`, and then `with()` can be a little cumbersome. For this case, Propel provides a proxy method called `joinWith()`. It expects a string made of the initial query name and the foreign query name. For instance: - -{{{ -#!php -joinWith('Book.Author') - ->findOne(); -$author = $book->getAuthor(); // Same result, with no supplementary query -}}} - -`with()` and `joinWith()` are not limited to immediate relationships. As a matter of fact, just like you can nest `use()` calls, you can call `with()` several times to populate a chain of objects: - -{{{ -#!php -joinWith('Review.Book') - ->joinWith('Book.Author') - ->joinWith('Book.Publisher') - ->findOne(); -$book = $review->getBook() // No additional query needed -$author = $book->getAuthor(); // No additional query needed -$publisher = $book->getPublisher(); // No additional query needed -}}} - -So `with()` is very useful to minimize the number of database queries. As soon as you see that the number of queries necessary to perform an action is proportional to the number of results, adding a `with()` call is the trick to get down to a more reasonnable query count. - -'''Tip''': `with()` also works for left joins on one-to-many relationships, but you musn't use a `limit()` in the query in this case. This is because Propel has no way to determine the actual number of rows of the main object in such a case. - -{{{ -#!php -leftJoinWith('Author.Book') - ->find(); -// this does not work -$authors = AuthorQuery::create() - ->leftJoinWith('Author.Book') - ->limit(5) - ->find(); -}}} - -However, it is quite easy to achieve hydration of related objects with only one additional query: - -{{{ - #!php -find(); -$authors->populateRelation('Book'); -// now you can iterate over each author's book without further queries -foreach ($authors as $author) { - foreach ($authors->getBooks() as $book) { // no database query, the author already has a Books collection - // do stuff with $book and $author - } -} -}}} \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/guide/05-Validators.txt b/airtime_mvc/library/propel/docs/guide/05-Validators.txt deleted file mode 100644 index 352ea6e1d7..0000000000 --- a/airtime_mvc/library/propel/docs/guide/05-Validators.txt +++ /dev/null @@ -1,253 +0,0 @@ -= Validators = - -[[PageOutline]] - -Validators help you to validate an input before perstisting it to the database. In Propel, validators are rules describing what type of data a column accepts. Validators are referenced in the `schema.xml` file, using `` tags. - -Validators are applied at the PHP level, they are not created as constraints on the database itself. That means that if you also use another language to work with the database, the validator rules will not be enforced. -You can also apply multiple rule entries per validator entry in the schema.xml file. - -== Overview == - -In the following example, the `username` column is defined to have a minimum length of 4 characters: - -{{{ -#!xml - - - - - - -
-}}} - -Every column rule is represented by a `` tag. A `` is a set of `` tags bound to a column. - -At runtime, you can validate an instance of the model by calling the `validate()` method: - -{{{ -#!php -setUsername("foo"); // only 3 in length, which is too short... -if ($objUser->validate()) { - // no validation errors, so the data can be persisted - $user->save(); -} else { - // Something went wrong. - // Use the validationFailures to check what - $failures = $objUser->getValidationFailures(); - foreach($failures as $failure) { - echo $objValidationFailure->getMessage() . "
\n"; - } -} -}}} - -`validate()` returns a boolean. If the validation failed, you can access the array `ValidationFailed` objects by way of the `getValidationFailures()` method. Each `ValidationFailed` instance gives access to the column, the messagen and the validator that caused the failure. - -== Core Validators == - -Propel bundles a set of validatorts that should help you deal with the most common cases. - -=== !MatchValidator === - -The `MatchValidator` is used to run a regular expression of choice against the column. Note that this is a `preg`, not `ereg` (check [http://www.php.net/preg_match the preg_match documentation] for more information about regexps). - -{{{ -#!xml - - - - -}}} - -=== !NotMatchValidator === - -Opposite of `MatchValidator, this validator returns false if the regex returns true - -{{{ -#!xml - - - - - -}}} - -=== !MaxLengthValidator === - -When you want to limit the size of the string to be inserted in a column, use the `MaxLengthValidator`. Internally, it uses `strlen()` to get the length of the string. For instance, some database completely ignore the lentgh of `LONGVARCHAR` columns; you can enforce it using a validator: - -{{{ -#!xml - - - - -}}} - -'''Tip''': If you have specified the `size` attribute in the `` tag, you don't have to specify the `value` attribute in the validator rule again, as this is done automatically. - -=== !MinLengthValidator === - -{{{ -#!xml - - - - -}}} - -=== !MaxValueValidator === - -To limit the value of an integer column, use the `MaxValueValidator`. Note that this validator uses a non-strict comparison ('less than or equal'): - -{{{ -#!xml - - - - -}}} - -=== !MinValueValidator === - -{{{ -#!xml - - - - -}}} - -'''Tip''': You can run multiple validators against a single column. - -{{{ -#!xml - - - - - -}}} - -=== !RequiredValidator === - -This validtor checks the same rule as a `required=true` on the column at the database level. However it will not give you a clean error to work with. - -{{{ -#!xml - - - - -}}} - -=== !UniqueValidator === - -To check whether the value already exists in the table, use the `UniqueValidator`: - -{{{ -#!xml - - - - -}}} - -=== !ValidValuesValidator === - -This rule restricts the valid values to a list delimited by a pipe ('|'). - -{{{ -#!xml - - - - -}}} - -=== !TypeValidator === - -Restrict values to a certain PHP type using the `TypeValidator`: - -{{{ -#!xml - - - - -}}} - -== Adding A Custom Validator == - -You can easily add a custom validator. A validator is a class extending `BasicValidator` providing a public `isValid()` method. For instance: - -{{{ -#!php -` tag. So `$map->getValue()` returns the `value` attribute. - -'''Tip''': Make sure that `isValid()` returns a boolean, so really true or false. Propel is very strict about this. Returning a mixed value just won't do. - -To enable the new validator on a column, add a corresponding `` in your schema and use 'class' as the rule `name`. - -{{{ -#!xml - - - -}}} - -The `class` attribute of the `` tag should contain a path to the validator class accessible from the include_path, where the directory separator is replaced by a dot. \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/guide/06-Transactions.txt b/airtime_mvc/library/propel/docs/guide/06-Transactions.txt deleted file mode 100644 index 55a9240cc4..0000000000 --- a/airtime_mvc/library/propel/docs/guide/06-Transactions.txt +++ /dev/null @@ -1,291 +0,0 @@ -= Transactions = - -[[PageOutline]] - -Database transactions are the key to assure the data integrity and the performance of database queries. Propel uses transactions internally, and provides a simple API to use them in your own code. - -'''Tip''': If the [http://en.wikipedia.org/wiki/ACID ACID] acronym doesn't ring a bell, you should probably learn some [http://en.wikipedia.org/wiki/Database_transaction fundamentals about database transactions] before reading further. - -== Wrapping Queries Inside a Transaction == - -Propel uses PDO as database abstraction layer, and therefore uses [http://www.php.net/manual/en/pdo.transactions.php PDO's built-in support for database transactions]. The syntax is the same, as you can see in the classical "money transfer" example: - -{{{ -#!php -beginTransaction(); - - try { - // remove the amount from $fromAccount - $fromAccount->setValue($fromAccount->getValue() - $amount); - $fromAccount->save($con); - // add the amount to $toAccount - $toAccount->setValue($toAccount->getValue() + $amount); - $toAccount->save($con); - - $con->commit(); - } catch (Exception $e) { - $con->rollback(); - throw $e; - } -} -}}} - -The transaction statements are `beginTransaction()`, `commit()` and `rollback()`, which are methods of the PDO connection object. Transaction methods are typically used inside a `try/catch` block. The exception is rethrown after rolling back the transaction: That ensures that the user knows that something wrong happenned. - -In this example, if something wrong happens while saving either one of the two accounts, an `Exception` is thrown, and the whole operation is rolled back. That means that the transfer is cancelled, with an insurance that the money hasn't vanished (that's the A in ACID, which stands for "Atomicity"). If both account modifications work as expected, the whole transaction is committed, meaning that the data changes enclosed in the transaction are persisted in the database. - -Tip: In order to build a transaction, you need a connection object. The connection object for a Propel model is always available through `Propel::getConnection([ModelName]Peer::DATABASE_NAME)`. - -== Denormalization And Transactions == - -Another example of the use of transactions is for [http://en.wikipedia.org/wiki/Denormalization denormalized schemas]. - -For instance, suppose that you have an `Author` model with a one to many relationship to a `Book` model. every time you need to display the number of books written by an author, you call `countBooks()` on the author object, which issues a new query to the database: - -{{{ -#!php -
    - -
  • getName() ?> (countBooks() ?> books)
  • - -
-}}} - -If you have a large number of authors and books, this simple code snippet can be a real performance blow to your application. The usual way to optimize it is to ''denormalize'' your schema by storing the number of books by each author in a new `nb_books` column, in the `author` table. - -{{{ -#!xml - - - - -
-}}} - -You must update this new column every time you save or delete a `Book` object; this will make write queries a little slower, but read queries much faster. Fortunately, Propel model objects support pre- and post- hooks for the `save()` and `delete()` methods, so this is quite easy to implement: - -{{{ -#!php -updateNbBooks($con); - } - - public function postDelete(PropelPDO $con) - { - $this->updateNbBooks($con); - } - - public function updateNbBooks(PropelPDO $con) - { - $author = $this->getAuthor(); - $nbBooks = $author->countBooks($con); - $author->setNbBooks($nbBooks); - $author->save($con); - } -} -}}} - -The `BaseBook::save()` method wraps the actual database INSERT/UPDATE query inside a transaction, together with any other query registered in a pre- or post- save hook. That means that when you save a book, the `postSave()` code is executed in the same transaction as the actual `$book->save()` method. Everything happens as is the code was the following: - -{{{ -#!php -beginTransaction(); - - try { - // insert/update query for the current object - $this->doSave($con); - - // postSave hook - $author = $this->getAuthor(); - $nbBooks = $author->countBooks($con); - $author->setNbBooks($nbBooks); - $author->save($con); - - $con->commit(); - } catch (Exception $e) { - $con->rollback(); - throw $e; - } - } -} -}}} - -In this example, the `nb_books` column of the `author` table will always we synchronized with the number of books. If anything happens during the transaction, the saving of the book is rolled back, as well as the `nb_books` column update. The transaction serves to preserve data consistency in a denormalized schema ("Consistency" stands for the C in ACID). - -'''Tip''': Check the [wiki:Documentation/1.5/Behaviors behaviors documentation] for details about the pre- and post- hooks in Propel model objects. - -== Nested Transactions == - -Some RDBMS offer the ability to nest transactions, to allow partial rollback of a set of transactions. PDO does not provide this ability at the PHP level; nevertheless, Propel emulates nested transactions for all supported database engines: - -{{{ -#!php -beginTransaction(); - try { - $c = new Criteria(); - $c->add(BookPeer::PRICE, null, Criteria::ISNULL); - BookPeer::doDelete($c, $con); - $con->commit(); - } catch (Exception $e) { - $con->rollback(); - throw $e; - } -} - -function deleteAuthorsWithNoEmail(PropelPDO $con) -{ - $con->beginTransaction(); - try { - $c = new Criteria(); - $c->add(AuthorPeer::EMAIL, null, Criteria::ISNULL); - AuthorPeer::doDelete($c, $con); - $con->commit(); - } catch (Exception $e) { - $con->rollback(); - throw $e; - } -} - -function cleanup(PropelPDO $con) -{ - $con->beginTransaction(); - try { - deleteBooksWithNoPrice($con); - deleteAuthorsWithNoEmail($con); - $con->commit(); - } catch (Exception $e) { - $con->rollback(); - throw $e; - } -} -}}} - -All three functions alter data in a transaction, ensuring data integrity for each. In addition, the `cleanup()` function actually executes two nested transactions inside one main transaction. - -Propel deals with this case by seeing only the outermost transaction, and ignoring the `beginTransaction()`, `commit()` and `rollback()` statements of nested transactions. If nothing wrong happens, then the last `commit()` call (after both `deleteBooksWithNoPrice()` and `deleteAuthorsWithNoEmail()` end) triggers the actual database commit. However, if an exception is thrown in either one of these nested transactions, it is escalated to the main `catch` statement in `cleanup()` so that the entire transaction (starting at the main `beginTransaction()`) is rolled back. - -So you can use transactions everywhere it's necessary in your code, without worrying about nesting them. Propel will always commit or rollback everything altogether, whether the RDBMS supports nested transactions or not. - -'''Tip''': This allows you to wrap all your application code inside one big transaction for a better integrity. - -== Using Transactions To Boost Performance == - -A database transaction has a cost in terms of performance. In fact, for simple data manipulation, the cost of the transaction is more important than the cost of the query itself. Take the following example: - -{{{ -#!php -setTitle($i . ': A Space Odyssey'); - $book->save($con); -} -}}} - -As explained earlier, Propel wraps every save operation inside a transaction. In terms of execution time, this is very expensive. Here is how the above code would translate to MySQL in an InnodDB table: - -{{{ -#!sql -BEGIN; -INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'0: A Space Odyssey'); -COMMIT; -BEGIN; -INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'1: A Space Odyssey'); -COMMIT; -BEGIN; -INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'2: A Space Odyssey'); -COMMIT; -... -}}} - -You can take advantage of Propel's nested transaction capabilities to encapsulate the whole loop inside one single transaction. This will reduce the execution time drastically: - -{{{ -#!php -beginTransaction(); -for ($i=0; $i<2002; $i++) -{ - $book = new Book(); - $book->setTitle($i . ': A Space Odyssey'); - $book->save($con); -} -$con->commit(); -}}} - -The transactions inside each `save()` will become nested, and therefore not translated into actual database transactions. Only the outmost transaction will become a database transaction. So this will translate to MySQL as: - -{{{ -#!sql -BEGIN; -INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'0: A Space Odyssey'); -INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'1: A Space Odyssey'); -INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'2: A Space Odyssey'); -... -COMMIT; -}}} - -In practice, encapsulating a large amount of simple queries inside a single transaction significantly improves performance. - -Tip: Until the final `commit()` is called, most database engines lock updated rows, or even tables, to prevent any query outside the transaction from seeing the partially committed data (this is how transactions preserve Isolation, which is the I in ACID). That means that large transactions will queue every other queries for potentially a long time. Consequently, use large transactions only when concurrency is not a requirement. - -== Why Is The Connection Always Passed As Parameter? == - -All the code examples in this chapter show the connection object passed a a parameter to Propel methods that trigger a database query: - -{{{ -#!php -setValue($fromAccount->getValue() - $amount); -$fromAccount->save($con); -}}} - -The same code works without explicitely passing the connection object, because Propel knows how to get the right connection from a Model: - -{{{ -#!php -setValue($fromAccount->getValue() - $amount); -$fromAccount->save(); -}}} - -However, it's a good practice to pass the connection explicitely, and for three reasons: - - * Propel doesn't need to look for a connection object, and this results in a tiny boost in performance. - * You can use a specific connection, which is required in distributed (master/slave) environments, in order to distinguish read and write operations. - * Most importantly, transactions are tied to a single connection. You can't enclose two queries using different connections in a single transaction. So it's very useful to identify the connection you want to use for every query, as Propel will throw an exception if you use the wrong connection. - -== Limitations == - - * Currently there is no support for row locking (e.g. `SELECT blah FOR UPDATE`). - * You must rethrow the exception caught in the `catch` statement of nested transactions, otherwise there is a risk that the global rollback doesn't occur. - * True nested transactions, with partial rollback, are only possible in MSSQL, and can be emulated in other RDBMS through savepoints. This feature may be added to Propel in the future, but for the moment, only the outermost PHP transaction triggers a database transaction. - * If you rollback a partially executed transaction and ignore the exception thrown, there are good chances that some of your objects are out of sync with the database. The good practice is to always let a transaction exception escalate until it stops the script execution. - diff --git a/airtime_mvc/library/propel/docs/guide/07-Behaviors.txt b/airtime_mvc/library/propel/docs/guide/07-Behaviors.txt deleted file mode 100644 index fe0025ec12..0000000000 --- a/airtime_mvc/library/propel/docs/guide/07-Behaviors.txt +++ /dev/null @@ -1,280 +0,0 @@ -= Behaviors = - -[[PageOutline]] - -Behaviors are a great way to package model extensions for reusability. They are the powerful, versatile, fast, and help you organize your code in a better way. - -== Pre and Post Hooks For `save()` And `delete()` Methods == - -The `save()` and `delete()` methods of your generated objects are easy to override. In fact, Propel looks for one of the following methods in your objects and executes them when needed: - -{{{ -#!php - - ... - - -}}} - -Then, you can force the update of the `created_at` column before every insertion as follows: - -{{{ -#!php -setCreatedAt(time()); - return true; - } -} -}}} - -Whenever you call `save()` on a new object, Propel now executes the `preInsert()` method on this objects and therefore update the `created_at` column: - -{{{ -#!php -setTitle('War And Peace'); -$b->save(); -echo $b->getCreatedAt(); // 2009-10-02 18:14:23 -}}} - -If you implement `preInsert()`, `preUpdate()`, `preSave()` or `preDelete()`, these methods must return a boolean value. This determines whether the action (save or delete) may proceed. - -'''Tip''': Since this feature adds a small overhead to write operations, you can deactivate it completely in your build properties by setting `propel.addHooks` to `false`. - -{{{ -#!ini -# ------------------- -# TEMPLATE VARIABLES -# ------------------- -propel.addHooks = false -}}} - -== Introducing Behaviors == - -When several of your custom model classes end up with similar methods added, it is time to refactor the common code. - -For example, you may want to add the same ability you gave to `Book` to all the other objects in your model. Let's call this the "Timestampable behavior", because then all of your rows have a timestamp marking their creation. In order to achieve this behavior, you have to repeat the same operations on every table. First, add a `created_at` column to the other tables: - -{{{ -#!xml - - ... - -
- - ... - -
-}}} - -Then, add a `preInsert()` hook to the object stub classes: - -{{{ -#!php -setCreatedAt(time()); - } -} - -class Author extends BaseAuthor -{ - public function preInsert() - { - $this->setCreatedAt(time()); - } -} -}}} - -Even if the code of this example is very simple, the repetition of code is already too much. Just imagine a more complex behavior, and you will understand that using the copy-and-paste technique soon leads to a maintenance nightmare. - -Propel offers three ways to achieve the refactoring of the common behavior. The first one is to use a custom builder during the build process. This can work if all of your models share one single behavior. The second way is to use table inheritance. The inherited methods then offer limited capabilities. And the third way is to use Propel behaviors. This is the right way to refactor common model logic. - -Behaviors are special objects that use events called during the build process to enhance the generated model classes. Behaviors can add attributes and methods to both the Peer and model classes, they can modify the course of some of the generated methods, and they can even modify the structure of a database by adding columns or tables. - -For instance, Propel bundles a behavior called `timestampable`, which does exatcly the same thing as described above. But instead of adding columns and methods by hand, all you have to do is to declare it in a `` tag in your `schema.xml`, as follows: - -{{{ -#!xml - - ... - -
- - ... - -
-}}} - -Then rebuild your model, and there you go: two columns, `created_at` and `updated_at`, were automatically added to both the `book` and `author` tables. Besides, the generated `BaseBook` and `BaseAuthor` classes already contain the code necessary to auto-set the current time on creation and on insertion. - -== Bundled Behaviors == - -Propel currently bundles several behaviors. Check the behavior documentation for details on usage: - - * [wiki:Documentation/1.5/Behaviors/aggregate_column aggregate_column] - * [wiki:Documentation/1.5/Behaviors/alternative_coding_standards alternative_coding_standards] - * [wiki:Documentation/1.5/Behaviors/auto_add_pk auto_add_pk] - * [wiki:Documentation/1.5/Behaviors/timestampable timestampable] - * [wiki:Documentation/1.5/Behaviors/sluggable sluggable] - * [wiki:Documentation/1.5/Behaviors/soft_delete soft_delete] - * [wiki:Documentation/1.5/Behaviors/sortable sortable] - * [wiki:Documentation/1.5/Behaviors/nested_set nested_set] - * [wiki:Documentation/1.5/Behaviors/query_cache query_cache] - * And [wiki:Documentation/1.5/Inheritance#ConcreteTableInheritance concrete_inheritance], documented in the Inheritance Chapter even if it's a behavior - -Behaviors bundled with Propel require no further installation and work out of the box. - -== Customizing Behaviors == - -Behaviors often offer some parameters to tweak their effect. For instance, the `timestampable` behavior allows you to customize the names of the columns added to store the creation date and the update date. The behavior customization occurs in the `schema.xml`, inside `` tags nested in the `` tag. So let's set the behavior to use `created_on` instead of `created_at` for the creation date column name (and same for the update date column): - -{{{ -#!xml - - ... - - - - -
-}}} - -If the columns already exist in your schema, a behavior is smart enough not to add them one more time. - -{{{ -#!xml - - ... - - - - - - -
-}}} - -== Using Third-Party Behaviors == - -As a Propel behavior can be packaged into a single class, behaviors are quite easy to reuse and distribute across several projects. All you need to do is to copy the behavior file into your project, and declare it in `build.properties`, as follows: - -{{{ -#!ini -# ---------------------------------- -# B E H A V I O R S E T T I N G S -# ---------------------------------- - -propel.behavior.timestampable.class = propel.engine.behavior.timestampable.TimestampableBehavior -# Add your custom behavior pathes here -propel.behavior.formidable.class = path.to.FormidableBehavior -}}} - -Propel will then find the `FormidableBehavior` class whenever you use the `formidable` behavior in your schema: - -{{{ -#!xml - - ... - - -
-}}} - -'''Tip''': If you use autoloading during the build process, and if the behavior classes benefit from the autoloading, then you don't even need to declare the path to the behavior class. - -== Applying a Behavior To All Tables == - -You can add a `` tag directly under the `` tag. That way, the behavior will be applied to all the tables of the database. - -{{{ -#!xml - - - - ... -
- - ... -
-
-}}} - -In this example, both the `book` and `author` table benefit from the `timestampable` behavior, and therefore automatically update their `created_at` and `updated_at` columns upon saving. - -Going one step further, you can even apply a behavior to all the databases of your project, provided the behavior doesn't need parameters - or can use default parameters. To add a behavior to all databases, simply declare it in the project's `build.properties` under the `propel.behavior.default` key, as follows: - -{{{ -#!ini -propel.behavior.default = soft_delete, timestampable -}}} - -== Writing a Behavior == - -Behaviors can modify their table, and even add another table, by implementing the `modifyTable` method. In this method, use `$this->getTable()` to retrieve the table buildtime model and manipulate it. - -Behaviors can add code to the generated model object by implementing one of the following methods: - -{{{ -objectAttributes() // add attributes to the object -objectMethods() // add methods to the object -preInsert() // add code to be executed before insertion of a new object -postInsert() // add code to be executed after insertion of a new object -preUpdate() // add code to be executed before update of an existing object -postUpdate() // add code to be executed after update of an existing object -preSave() // add code to be executed before saving an object (new or existing) -postSave() // add code to be executed after saving an object (new or existing) -preDelete() // add code to be executed before deleting an object -postDelete() // add code to be executed after deleting an object -objectCall() // add code to be executed inside the object's __call() -objectFilter(&$script) // do whatever you want with the generated code, passed as reference -}}} - -Behaviors can also add code to the generated query objects by implementing one of the following methods: - -{{{ -queryAttributes() // add attributes to the query class -queryMethods() // add methods to the query class -preSelectQuery() // add code to be executed before selection of a existing objects -preUpdateQuery() // add code to be executed before update of a existing objects -postUpdateQuery() // add code to be executed after update of a existing objects -preDeleteQuery() // add code to be executed before deletion of a existing objects -postDeleteQuery() // add code to be executed after deletion of a existing objects -queryFilter(&$script) // do whatever you want with the generated code, passed as reference -}}} - -Behaviors can also add code to the generated peer objects by implementing one of the following methods: - -{{{ -staticAttributes() // add static attributes to the peer class -staticMethods() // add static methods to the peer class -preSelect() // adds code before every select query -peerFilter(&$script) // do whatever you want with the generated code, passed as reference -}}} - -Check the behaviors bundled with Propel to see how to implement your own behavior. diff --git a/airtime_mvc/library/propel/docs/guide/08-Logging.txt b/airtime_mvc/library/propel/docs/guide/08-Logging.txt deleted file mode 100644 index 80445f17d6..0000000000 --- a/airtime_mvc/library/propel/docs/guide/08-Logging.txt +++ /dev/null @@ -1,448 +0,0 @@ -= Logging And Debugging = - -[[PageOutline]] - -Propel provides tools to monitor and debug your model. Whether you need to check the SQL code of slow queries, or to look for error messages previously thrown, Propel is your best friend for finding and fixing problems. - -== Propel Logs == - -Propel uses the logging facility configured in `runtime-conf.xml` to record errors, warnings, and debug information. - -By default Propel will attempt to use the Log framework that is distributed with PEAR. If you are not familiar with it, check its [http://www.indelible.org/php/Log/guide.html online documentation]. It is also easy to configure Propel to use your own logging framework -- or none at all. - -=== Logger Configuration === - -The Propel log handler is configured in the `` section of your project's `runtime-conf.xml` file. Here is the accepted format for this section with the default values that Propel uses: - -{{{ -#!xml - - - - file - ./propel.log - propel - 7 - - - - ... - - -}}} - -Using these parameters, Propel creates a ''file'' Log handler in the background, and keeps it for later use: - -{{{ -#!php -` nested elements may vary, depending on which log handler you are using. Refer to the [http://www.indelible.org/php/Log/guide.html#standard-log-handlers PEAR::Log] documentation for more details on log handlers configuration and options. - -Note that the `` tag needs to correspond to the integer represented by one of the `PEAR_LOG_*` constants: - -||'''Constant'''||'''Value'''||'''Description''' -||PEAR_LOG_EMERG||0||System is unusable|| -||PEAR_LOG_ALERT||1||Immediate action required|| -||PEAR_LOG_CRIT||2||Critical conditions|| -||PEAR_LOG_ERR||3||Error conditions|| -||PEAR_LOG_WARNING||4||Warning conditions|| -||PEAR_LOG_NOTICE||5||Normal but significant|| -||PEAR_LOG_INFO||6||Informational|| -||PEAR_LOG_DEBUG||7||Debug-level messages|| - -=== Logging Messages === - -Use the static `Propel::log()` method to log a message using the configured log handler: - -{{{ -#!php -setName('foo'); -Propel::log('uh-oh, something went wrong with ' . $myObj->getName(), Propel::LOG_ERROR); -}}} - -You can log your own messages from the generated model objects by using their `log()` method, inherited from `BaseObject`: - -{{{ -#!php -log('uh-oh, something went wrong', Propel::LOG_ERROR); -}}} - -The log messages will show up in the log handler defined in `runtime-conf.xml` (`propel.log` file by default) as follows: - -{{{ -Oct 04 00:00:18 [error] uh-oh, something went wrong with foo -Oct 04 00:00:18 [error] MyObj: uh-oh, something went wrong -}}} - -Tip: All serious errors coming from the Propel core do not only issue a log message, they are also thrown as `PropelException`. - -=== Using An Alternative PEAR Log Handler === - -In many cases you may wish to integrate Propel's logging facility with the rest of your web application. In `runtime-conf.xml`, you can customize a different PEAR logger. Here are a few examples: - -'''Example 1:''' Using 'display' container (for output to HTML) -{{{ -#!xml - - display - 6 - -}}} - -'''Example 2:''' Using 'syslog' container -{{{ -#!xml - - syslog - 8 - propel - 6 - -}}} - -=== Using A Custom Logger === - -If you omit the `` section of your `runtime-conf.xml`, then Propel will not setup ''any'' logging for you. In this case, you can set a custom logging facility and pass it to Propel at runtime. - -Here's an example of how you could configure your own logger and then set Propel to use it: - -{{{ -#!php -log($m, Propel::LOG_EMERG); - } - public function alert($m) - { - $this->log($m, Propel::LOG_ALERT); - } - public function crit($m) - { - $this->log($m, Propel::LOG_CRIT); - } - public function err($m) - { - $this->log($m, Propel::LOG_ERR); - } - public function warning($m) - { - $this->log($m, Propel::LOG_WARNING); - } - public function notice($m) - { - $this->log($m, Propel::LOG_NOTICE); - } - public function info($m) - { - $this->log($m, Propel::LOG_INFO); - } - public function debug($m) - { - $this->log($m, Propel::LOG_DEBUG); - } - - public function log($message, $priority) - { - $color = $this->priorityToColor($priority); - echo '

$message

'; - } - - private function priorityToColor($priority) - { - switch($priority) { - case Propel::LOG_EMERG: - case Propel::LOG_ALERT: - case Propel::LOG_CRIT: - case Propel::LOG_ERR: - return 'red'; - break; - case Propel::LOG_WARNING: - return 'orange'; - break; - case Propel::LOG_NOTICE: - return 'green'; - break; - case Propel::LOG_INFO: - return 'blue'; - break; - case Propel::LOG_DEBUG: - return 'grey'; - break; - } - } -} -}}} - -Tip: There is also a bundled `MojaviLogAdapter` class which allows you to use a Mojavi logger with Propel. - -== Debugging Database Activity == - -By default, Propel uses `PropelPDO` for database connections. This class, which extends PHP's `PDO`, offers a debug mode to keep track of all the database activity, including all the executed queries. - -=== Enabling The Debug Mode === - -The debug mode is disabled by default, but you can enable it at runtime as follows: - -{{{ -#!php -useDebug(true); -}}} - -You can also disable the debug mode at runtime, by calling `PropelPDO::useDebug(false)`. Using this method, you can choose to enable the debug mode for only one particular query, or for all queries. - -Alternatively, you can ask Propel to always enable the debug mode for a particular connection by using the `DebugPDO` class instead of the default `PropelPDO` class. This is accomplished in the `runtime-conf.xml` file, in the `` tag of a given datasource connection (see the [wiki:Documentation/1.5/RuntimeConfiguration runtime configuration reference] for more details). - -{{{ -#!xml - - - - - - sqlite - - - DebugPDO -}}} - -'''Tip''': You can use your own connection class there, but make sure that it extends `PropelPDO` and not only `PDO`. Propel requires certain fixes to PDO API that are provided by `PropelPDO`. - -=== Counting Queries === - -In debug mode, `PropelPDO` keeps track of the number of queries that are executed. Use `PropelPDO::getQueryCount()` to retrieve this number: - -{{{ -#!php -getQueryCount(); // 1 -}}} - -Tip: You cannot use persistent connections if you want the query count to work. Actually, the debug mode in general requires that you don't use persistent connections in order for it to correctly log bound values and count executed statements. - -=== Retrieving The Latest Executed Query === - -For debugging purposes, you may need the SQL code of the latest executed query. It is available at runtime in debug mode using `PropelPDO::getLastExecutedQuery()`, as follows: - -{{{ -#!php -getLastExecutedQuery(); // 'SELECT * FROM my_obj'; -}}} - -Tip: You can also get a decent SQL representation of the criteria being used in a SELECT query by using the `Criteria->toString()` method. - -Propel also keeps track of the queries executed directly on the connection object, and displays the bound values correctly. - -{{{ -#!php -prepare('SELECT * FROM my_obj WHERE name = :p1'); -$stmt->bindValue(':p1', 'foo'); -$stmt->execute(); -echo $con->getLastExecutedQuery(); // 'SELECT * FROM my_obj where name = "foo"'; -}}} - -'''Tip''': The debug mode is intended for development use only. Do not use it in production environment, it logs too much information for a production server, and adds a small overhead to the database queries. - -== Full Query Logging == - -The combination of the debug mode and a logging facility provides a powerful debugging tool named ''full query logging''. If you have properly configured a log handler, enabling the debug mode (or using `DebugPDO`) automatically logs the executed queries into Propel's default log file: - -{{{ -Oct 04 00:00:18 propel-bookstore [debug] INSERT INTO publisher (`ID`,`NAME`) VALUES (NULL,'William Morrow') -Oct 04 00:00:18 propel-bookstore [debug] INSERT INTO author (`ID`,`FIRST_NAME`,`LAST_NAME`) VALUES (NULL,'J.K.','Rowling') -Oct 04 00:00:18 propel-bookstore [debug] INSERT INTO book (`ID`,`TITLE`,`ISBN`,`PRICE`,`PUBLISHER_ID`,`AUTHOR_ID`) VALUES (NULL,'Harry Potter and the Order of the Phoenix','043935806X',10.99,53,58) -Oct 04 00:00:18 propel-bookstore [debug] INSERT INTO review (`ID`,`REVIEWED_BY`,`REVIEW_DATE`,`RECOMMENDED`,`BOOK_ID`) VALUES (NULL,'Washington Post','2009-10-04',1,52) -... -Oct 04 00:00:18 propel-bookstore [debug] SELECT bookstore_employee_account.EMPLOYEE_ID, bookstore_employee_account.LOGIN FROM `bookstore_employee_account` WHERE bookstore_employee_account.EMPLOYEE_ID=25 -}}} - -By default, Propel logs all SQL queries, together with the date of the query and the name of the connection. - -=== Setting The Data To Log === - -The full query logging feature can be configured either in the `runtime-conf.xml` configuration file, or using the runtime configuration API. - -In `runtime-conf.xml`, tweak the feature by adding a `` tag under ``: - -{{{ -#!xml - - - - ... - - - - ... - - - -
- - true - - - - true - -
-
-
-
-
-}}} - -To accomplish the same configuration as above at runtime, change the settings in your main include file, after `Propel::init()`, as follows: - -{{{ -#!php -setParameter('debugpdo.logging.details.method.enabled', true); -$config->setParameter('debugpdo.logging.details.time.enabled', true); -$config->setParameter('debugpdo.logging.details.mem.enabled', true); -}}} - -Let's see a few of the provided parameters. - -=== Logging More Connection Messages === - -`PropelPDO` can log queries, but also connection events (open and close), and transaction events (begin, commit and rollback). Since Propel can emulate nested transactions, you may need to know when an actual `COMMIT` or `ROLLBACK` is issued. - -To extend which methods of `PropelPDO` do log messages in debug mode, customize the `'debugpdo.logging.methods'` parameter, as follows: - -{{{ -#!php -setParameter('debugpdo.logging.methods', $allMethods); -}}} - -By default, only the messages coming from `PropelPDO::exec`, `PropelPDO::query`, and `DebugPDOStatement::execute` are logged. - -=== Logging Execution Time And Memory === - -In debug mode, Propel counts the time and memory necessary for each database query. This very valuable data can be added to the log messages on demand, by adding the following configuration: - -{{{ -#!php -setParameter('debugpdo.logging.details.time.enabled', true); -$config->setParameter('debugpdo.logging.details.mem.enabled', true); -}}} - -Enabling the options shown above, you get log output along the lines of: - -{{{ -Feb 23 16:41:04 Propel [debug] time: 0.000 sec | mem: 1.4 MB | SET NAMES 'utf8' -Feb 23 16:41:04 Propel [debug] time: 0.002 sec | mem: 1.6 MB | SELECT COUNT(tags.NAME) FROM tags WHERE tags.IMAGEID = 12 -Feb 23 16:41:04 Propel [debug] time: 0.012 sec | mem: 2.4 MB | SELECT tags.NAME, image.FILENAME FROM tags LEFT JOIN image ON tags.IMAGEID = image.ID WHERE image.ID = 12 -}}} - -The order in which the logging details are enabled is significant, since it determines the order in which they will appear in the log file. - -=== Complete List Of Logging Options === - -The following settings can be customized at runtime or in the configuration file: - -||'''Parameter'''||'''Default'''||'''Meaning'''|| -||`debugpdo.logging.enabled`||`true`||Should any logging take place|| -||`debugpdo.logging.innerglue`||`": "`||String to use for combining the title of a detail and its value|| -||`debugpdo.logging.outerglue`||`" | "`||String to use for combining details together on a log line|| -||`debugpdo.logging.realmemoryusage`||`false`||Parameter to [http://www.php.net/manual/en/function.memory-get-usage.php memory_get_usage()] and [http://www.php.net/manual/en/function.memory-get-peak-usage.php memory_get_peak_usage()] calls|| -||`debugpdo.logging.methods`||[http://propel.propelorm.org/browser/branches/1.5/runtime/classes/propel/util/DebugPDO.php#L151 array(...)]||An array of method names `Class::method`) to be included in method call logging|| -||`debugpdo.logging.details.slow.enabled`||`false`||Enables flagging of slow method calls|| -||`debugpdo.logging.details.slow.threshold`||`0.1`||Method calls taking more seconds than this threshold are considered slow|| -||`debugpdo.logging.details.time.enabled`||`false`||Enables logging of method execution times|| -||`debugpdo.logging.details.time.precision`||`3`||Determines the precision of the execution time logging|| -||`debugpdo.logging.details.time.pad`||`10`||How much horizontal space to reserve for the execution time on a log line|| -||`debugpdo.logging.details.mem.enabled`||`false`||Enables logging of the instantaneous PHP memory consumption|| -||`debugpdo.logging.details.mem.precision`||`1`||Determines the precision of the memory consumption logging|| -||`debugpdo.logging.details.mem.pad`||`9`||How much horizontal space to reserve for the memory consumption on a log line|| -||`debugpdo.logging.details.memdelta.enabled`||`false`||Enables logging differences in memory consumption before and after the method call|| -||`debugpdo.logging.details.memdelta.precision`||`1`||Determines the precision of the memory difference logging|| -||`debugpdo.logging.details.memdelta.pad`||`10`||How much horizontal space to reserve for the memory difference on a log line|| -||`debugpdo.logging.details.mempeak.enabled`||`false`||Enables logging the peak memory consumption thus far by the currently executing PHP script|| -||`debugpdo.logging.details.mempeak.precision`||`1`||Determines the precision of the memory peak logging|| -||`debugpdo.logging.details.mempeak.pad`||`9`||How much horizontal space to reserve for the memory peak on a log line|| -||`debugpdo.logging.details.querycount.enabled`||`false`||Enables logging of the number of queries performed by the DebugPDO instance thus far|| -||`debugpdo.logging.details.querycount.pad`||`2`||How much horizontal space to reserve for the query count on a log line|| -||`debugpdo.logging.details.method.enabled`||`false`||Enables logging of the name of the method call|| -||`debugpdo.logging.details.method.pad`||`28`||How much horizontal space to reserve for the method name on a log line|| - -=== Changing the Log Level === - -By default the connection log messages are logged at the `Propel::LOG_DEBUG` level. This can be changed by calling the `setLogLevel()` method on the connection object: - -{{{ -#!php -setLogLevel(Propel::LOG_INFO); -}}} - -Now all queries and bind param values will be logged at the INFO level. - -=== Configuring a Different Full Query Logger === - -By default the `PropelPDO` connection logs queries and binds param values using the `Propel::log()` static method. As explained above, this method uses the log storage configured by the `` tag in the `runtime-conf.xml` file. - -If you would like the queries to be logged using a different logger (e.g. to a different file, or with different ident, etc.), you can set a logger explicitly on the connection at runtime, using `Propel::setLogger()`: - -{{{ -#!php -setLogger($logger); -} -}}} - -This will not affect the general Propel logging, but only the full query logging. That way you can log the Propel error and warnings in one file, and the SQL queries in another file. diff --git a/airtime_mvc/library/propel/docs/guide/09-Inheritance.txt b/airtime_mvc/library/propel/docs/guide/09-Inheritance.txt deleted file mode 100644 index 25e03b8e1b..0000000000 --- a/airtime_mvc/library/propel/docs/guide/09-Inheritance.txt +++ /dev/null @@ -1,329 +0,0 @@ -= Inheritance = - -[[PageOutline]] - -Developers often need one model table to extend another model table. Inheritance being an object-oriented notion, it doesn't have a true equivalent in the database world, so this is something an ORM must emulate. Propel offers two types of table inheritance: [http://www.martinfowler.com/eaaCatalog/singleTableInheritance.html Single Table Inheritance], which is the most efficient implementations from a SQL and query performance perspective, but is limited to a small number of inherited fields ; and [http://www.martinfowler.com/eaaCatalog/concreteTableInheritance.html Concrete Table Inheritance], which provides the most features but adds a small overhead on write queries. - -== Single Table Inheritance == - -In this implementation, one table is used for all subclasses. This has the implication that your table must have all columns needed by the main class and subclasses. Propel will create stub subclasses. - -Let's illustrate this idea with an example. Consider an object model with three classes, `Book`, `Essay`, and `Comic` - the first class being parent of the other two. With single table inheritance, the data of all three classes is stored in one table, named `book`. - -=== Schema Definition === - -A table using Single Table Inheritance requires a column to identify which class should be used to represent the ''table'' row. Classically, this column is named `class_key` - but you can choose whatever name fits your taste. The column needs the `inheritance="single"` attribute to make Propel understand that it's the class key column. Note that this 'key' column must be a real column in the table. - -{{{ -#!xml - - - - - - - - -
-}}} - -Once you rebuild your model, Propel generated all three model classes (`Book`, `Essay`, and `Comic`) and three query classes (`BookQuery`, `EssayQuery`, and `ComicQuery`). The `Essay` and `Comic` classes extend the `Book` class, the `EssayQuery` and `ComicQuery` classes extend `BookQuery`. - -'''Tip''': An inherited class can extend another inherited class. That mean that you can add a `Manga` kind of book that extends `Comic` instead of `Book`. - -=== Using Inherited Objects === - -Use inherited objects just like you use regular Propel model objects: - -{{{ -#!php -setTitle('War And Peace'); -$book->save(); -$essay = new Essay(); -$essay->setTitle('On the Duty of Civil Disobedience'); -$essay->save(); -$comic = new Comic(); -$comic->setTitle('Little Nemo In Slumberland'); -$comic->save(); -}}} - -Inherited objects share the same properties and methods by default, but you can add your own logic to each of the generated classes. - -Behind the curtain, Propel sets the `class_key` column based on the model class. So the previous code stores the following rows in the database: - -{{{ -id | title | class_key ----|-----------------------------------|---------- -1 | War And Peace | Book -2 | On the Duty of Civil Disobedience | Essay -3 | Little Nemo In Slumberland | Comic -}}} - -Incidentally, that means that you can add new classes manually, even if they are not defined as `` tags in the `schema.xml`: - -{{{ -#!php -setClassKey('Novel'); - } -} -$novel = new Novel(); -$novel->setTitle('Harry Potter'); -$novel->save(); -}}} - -=== Retrieving Inherited objects === - -In order to retrieve books, use the Query object of the main class, as you would usually do. Propel will hydrate children objects instead of the parent object when necessary: - -{{{ -#!php -find(); -foreach ($books as $book) { - echo get_class($book) . ': ' . $book->getTitle() . "\n"; -} -// Book: War And Peace -// Essay: On the Duty of Civil Disobedience -// Comic: Little Nemo In Slumberland -// Novel: Harry Potter -}}} - -If you want to retrieve only objects of a certain class, use the inherited query classes: - -{{{ -#!php -findOne(); -echo get_class($comic) . ': ' . $comic->getTitle() . "\n"; -// Comic: Little Nemo In Slumberland -}}} - -'''Tip''': You can override the base peer's `getOMClass()` to return the classname to use based on more complex logic (or query). - -=== Abstract Entities === - -If you wish to enforce using subclasses of an entity, you may declare a table "abstract" in your XML data model: - -{{{ -#!xml - - ... -}}} - -That way users will only be able to instanciate `Essay` or `Comic` books, but not `Book`. - -== Concrete Table Inheritance == - -Concrete Table Inheritance uses one table for each class in the hierarchy. Each table contains columns for the class and all its ancestors, so any fields in a superclass are duplicated across the tables of the subclasses. - -Propel implements Concrete Table Inheritance through a behavior. - -=== Schema Definition === - -Once again, this is easier to understand through an example. In a Content Management System, content types are often organized in a hierarchy, each subclass adding more fields to the superclass. So let's consider the following schema, where the `article` and `video` tables use the same fields as the main `content` tables, plus additional fields: - -{{{ -#!xml -
- - - - - - -
- - - -
- - - - - - - - -
- - - - - - - - -
-}}} - -Since the columns of the main table are copied to the child tables, this schema is a simple implementation of Concrete Table Inheritance. This is something that you can write by hand, but the repetition makes it tedious. Instead, you should let the `concrete_inheritance` behavior do it for you: - -{{{ -#!xml - - - - - - - -
- - - -
- - - - - -
- - - - - -
-}}} - -'''Tip''': The `concrete_inheritance` behavior copies columns, foreign keys, indices and validators. - -=== Using Inherited Model Classes === - -For each of the tables in the schema above, Propel generates a Model class: - -{{{ -#!php -setName('Movie'); -$cat->save(); -// create a new Article -$art = new Article(); -$art->setTitle('Avatar Makes Best Opening Weekend in the History'); -$art->setCategory($cat); -$art->setContent('With $232.2 million worldwide total, Avatar had one of the best-opening weekends in the history of cinema.'); -$art->save(); -// create a new Video -$vid = new Video(); -$vid->setTitle('Avatar Trailer'); -$vid->setCategory($cat); -$vid->setResourceLink('http://www.avatarmovie.com/index.html') -$vid->save(); -}}} - -And since the `concrete_inheritance` behavior tag defines a parent table, the `Article` and `Video` classes extend the `Content` class (same for the generated Query classes): - -{{{ -#!php -getCategory()->getName(); - } -} -echo $art->getCategoryName(); // 'Movie' -echo $vid->getCategoryName(); // 'Movie' - -// methods of the parent query are accessible to the child query -class ContentQuery extends BaseContentQuery -{ - public function filterByCategoryName($name) - { - return $this - ->useCategoryQuery() - ->filterByName($name) - ->endUse(); - } -} -$articles = ArticleQuery::create() - ->filterByCategoryName('Movie') - ->find(); -}}} - -That makes of Concrete Table Inheritance a powerful way to organize your model logic and to avoid repetition, both in the schema and in the model code. - -=== Data Replication === - -By default, every time you save an `Article` or a `Video` object, Propel saves a copy of the `title` and `category_id` columns in a `Content` object. Consequently, retrieving objects regardless of their child type becomes very easy: - -{{{ -#!php -find(); -foreach ($conts as $content) { - echo $content->getTitle() . "(". $content->getCategoryName() ")/n"; -} -// Avatar Makes Best Opening Weekend in the History (Movie) -// Avatar Trailer (Movie) -}}} - -Propel also creates a one-to-one relationship between a object and its parent copy. That's why the schema definition above doesn't define any primary key for the `article` and `video` tables: the `concrete_inheritance` behavior creates the `id` primary key which is also a foreign key to the parent `id` column. So once you have a parent object, getting the child object is just one method call away: - -{{{ -#!php -getContent(); - } -} -class Movie extends BaseMovie -{ - public function getPreview() - { - return $this->getResourceLink(); - } -} -$conts = ContentQuery::create()->find(); -foreach ($conts as $content) { - echo $content->getTitle() . "(". $content->getCategoryName() ")/n" - if ($content->hasChildObject()) { - echo ' ' . $content->getChildObject()->getPreview(), "\n"; -} -// Avatar Makes Best Opening Weekend in the History (Movie) -// With $232.2 million worldwide total, Avatar had one of the best-opening -// weekends in the history of cinema. -// Avatar Trailer (Movie) -// http://www.avatarmovie.com/index.html -}}} - -The `hasChildObject()` and `getChildObject()` methods are automatically added by the behavior to the parent class. Behind the curtain, the saved `content` row has an additional `descendant_column` field allowing it to use the right model for the job. - -'''Tip''' You can disable the data replication by setting the `copy_data_to_parent` parameter to "false". In that case, the `concrete_inheritance` behavior simply modifies the table at buildtime and does nothing at runtime. Also, with `copy_data_to_parent` disabled, any primary key copied from the parent table is not turned into a foreign key: - -{{{ -#!xml - - - - - - -
-// results in - - - - - - - - -
-}}} \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/reference/Buildtime-Configuration.txt b/airtime_mvc/library/propel/docs/reference/Buildtime-Configuration.txt deleted file mode 100644 index 36fbe642b9..0000000000 --- a/airtime_mvc/library/propel/docs/reference/Buildtime-Configuration.txt +++ /dev/null @@ -1,312 +0,0 @@ -= Build Properties Reference = - -[[PageOutline]] - -Here is a list of properties that can be set to affect how Propel builds database files. For a complete list, see the {{{default.properties}}} file that is bundled with your version of Propel generator (this will be in PEAR's data directory if you are using a PEAR-installed version of Propel). - -First, some conventions: - - * Text surrounded by a '''/''' is text that you would provide and is not defined in the language. (i.e. a table name is a good example of this.) - * Items where you have an alternative choice have a '''|''' character between them (i.e. true|false) - * Alternative choices may be delimited by '''{''' and '''}''' to indicate that this is the default option, if not overridden elsewhere. - -== Where to Specify Properties == - -=== In the Project build.properties File === - -The most natural place to specify properties for a file are in the project's {{{build.properties}}} file. This file is expected to be found in the project directory. - -=== In a global build.properties file === - -You can also create a {{{global build.properties}}} file in the same directory as Propel's {{{default.properties}}} file. For users who have installed Propel using PEAR, this will be in PEAR data directory structure. - -=== On the Command Line === - -You can also specify properties on the commandline when you invoke Propel: - -{{{ -$ propel-gen /path/to/project -Dpropel.someOtherProperty=value -}}} - -''Note that there is '''no space''' between the -D and the property name.'' - -== The Properties == - -=== General Build Settings === - -{{{ -propel.project = Your-Project-Name -}}} - -The name of your project. This affects names of generated files, etc. - -{{{ -propel.targetPackage = {propel.project} -}}} - -The package to use for the generated classes. This affects the value of the @package phpdoc tag, and it also affects the directory that the classes are placed in. By default this will be the same as the project. Note that the target package (and thus the target directory for generated classes) can be overridden in each `` and `` element in the XML schema. - -{{{ -propel.packageObjectModel = true|{false} -}}} - -Whether to join schemas using the same database name into a single schema. This allows splitting schemas in packages, and referencing tables in another schema (but in the same database) in a foreign key. Beware that database behaviors will also be joined when this parameter is set to true. - -{{{ -propel.schema.validate = {true}|false -}}} - -Whether to validate the schema using the XSD file. The default XSD file is located under `generator/resources/xsd/database.xsd`, and you can use a custom XSD file by changing the `propel.schema.xsd.file` property. - -{{{ -propel.schema.transform = true|{false} -}}} - -Whether to transform the schema using the XSL file. This was used in previous Propel versions to clean up the schema, but tended to hide problems in the schema. It is disabled by default since Propel 1.5. The default XSL file is located under `generator/resources/xsd/database.xsl`, and you can use a custom XSL file by changing the `propel.schema.xsl.file` property. - -=== Database Settings === - -{{{ -propel.database = pgsql|mysql|sqlite|mssql|oracle -}}} - -The Propel platform that will be used to determine how to build the SQL DDL, etc. - - -{{{ -propel.database.url = /PDO database connection string/ -propel.database.user = -propel.database.password = -}}} - -Propel will use this information as the default to connect to your database. Note that for PDO some drivers (e.g. mysql, oracle) require that you specify the username and password separately from the DSN, which is why they are available as options. - - -{{{ -propel.database.buildUrl = /PDO database connection string, defaults to use ${propel.database.url}/ -}}} - -This property is used by Propel to connect to a database to reverse engineer or data dump. The default is to use the database connection defined by the ''propel.database.url'' property. - - -{{{ -propel.database.createUrl = /PDO database connection string, defaults to use ${propel.database.url}/ -}}} - -This property is used by Propel for creating a database. Of course, Propel is unable to create many databases because they do not provide a SQL method for creation; therefore, it is usually recommended that you actually create your database by hand. - -{{{ -propel.database.schema = /schema-name/ -}}} - -Where supported by the RDBMS, you can specify a schema name for Propel to use. - -{{{ -propel.database.encoding = -}}} -The encoding to use for the database. This can affect things such as transforming charsets when exporting to XML, etc. - -{{{ -propel.tablePrefix = {empty}|string -}}} - -Add a prefix to all the table names in the database. This does not affect the tables phpName. This setting can be overridden on a per-database basis in the schema. - -=== Reverse-Engineering Settings === - -{{{ -propel.samePhpName = true|{false} -}}} -Whether to specify PHP names that are the same as the column names. - -{{{ -propel.addVendorInfo = true|{false} -}}} -Whether to add the vendor info. This is currently only used for MySQL, but does provide additional information (such as full-text indexes) which can affect the generation of the DDL from the schema. - -{{{ -propel.addValidators = {none}|maxvalue|type|required|unique|all -}}} -Which Propel validators to add to the generated schema (based on the db constraints). - -=== Customizing Generated Object Model === - -{{{ -propel.addGenericAccessors = true|{false} -propel.addGenericMutators = true|{false} -}}} -Whether to add generic getter/setter methods -- e.g. '''getByName()''', '''setByName()'''. - -{{{ -propel.addTimeStamp = true|{false} -}}} -Whether to add a timestamp to the phpdoc header of generated OM classes. - -{{{ -propel.addValidateMethod = {true}|false -}}} -Whether to add `validate()` method to your classes. Set to false if you don't use Propel validation. - -{{{ -propel.addIncludes = {true}|false -}}} -Whether to add `require` statements on the generated stub classes. Set to false if you autoload every classe at runtime. - -{{{ -propel.addHooks = {true}|false -}}} -Whether to support pre- and post- hooks on `save()` and `delete()` methods. Set to false if you never use these hooks for a small speed boost. - -{{{ -propel.basePrefix = {Base}|/YourPrefix/ -}}} -The prefix to use for the base (super) classes that are generated. - -{{{ -propel.classPrefix = {empty}|string; -}}} -Some sort of "namespacing": All Propel classes with get the Prefix "My_ORM_Prefix_" just like "My_ORM_Prefix_BookPeer". - -{{{ -propel.disableIdentifierQuoting = true|{false} -}}} -Identifier quoting is only implemented at the DDL layer at this point. Since this may result in undesired behavior (especially in Postgres), it can be disabled by setting this property to true. - -{{{ -propel.useLeftJoinsInDoJoinMethods = {true}|false -}}} -Set whether the '''doSelectJoin*()''' methods use LEFT JOIN or INNER JOIN (see ticket:491 and ticket:588 to understand more about why this might be important). - -=== MySQL-specific Settings === - -{{{ -propel.mysqlTableType = /DefaultTableEngine/ -}}} -Default table engine - defaults to MyISAM. You can override this setting if you wish to default to another engine for all tables (for instance InnoDB, or HEAP). This setting can also be overridden on a per-table basis using the `` element in the schema (see [wiki:Documentation/1.5/Schema#AddingVendorInfo]). - -{{{ -propel.mysqlTableEngineKeyword = /EngineKeyword/ -}}} -Keyword used to specify the table engine in the CREATE SQL statement. Defaults to 'ENGINE', users of MYSQL < 5 should use 'TYPE' instead. - -=== Date/Time Settings === - -{{{ -propel.useDateTimeClass = true|{false} -}}} -This is how you enable full use of the new DateTime class in Propel. Setting this to true means that getter methods for date/time/timestamp columns will return a DateTime object ''when the default format is empty''. Note that the current default of ''false'' is only for backwards compatibility; in the future ''true'' will be the only option here. - -{{{ -propel.dateTimeClass = {DateTime}|string -}}} -Specify a custom DateTime subclass that you wish to have Propel use for temporal values. - -{{{ -propel.defaultTimeStampFormat = {Y-m-d H:i:s}|string -propel.defaultTimeFormat = {%X}|string -propel.defaultDateFormat = {%x}|string -}}} -These are the default formats that will be used when fetching values from temporal columns in Propel. You can always specify these when calling the methods directly, but for methods like getByName() it is nice to change the defaults. - -To have these methods return DateTime objects instead, you should set these to empty values, for example: -{{{ -propel.defaultTimeStampFormat = -}}} - -=== Directories === - -{{{ -propel.project.dir = default-depends-on-installation-type -}}} - -''This is not necessarily a property you can change.'' The project directory is the directory where you project files (build.properties, schema.xml, runtime-conf.xml, etc.) are located. For example, if you use the {{{propel-gen}}} script, this value will get overridden to the path you pass to {{{propel-gen}}}. - -{{{ -propel.output.dir = ${propel.project.dir}/build -}}} -The default top-level directory for output of classes, sql, config, etc. - -{{{ -propel.schema.dir = ${propel.project.dir} -}}} -The directory where Propel expects to find your schema.xml file. - -{{{ -propel.conf.dir = ${propel.project.dir} -}}} -The directory where Propel expects to find your {{{runtime-conf.xml}}} file. - -{{{ -propel.php.dir = ${propel.output.dir}/classes -}}} -The directory where Propel will create generated object model classes. - -{{{ -propel.phpconf.dir = ${propel.output.dir}/conf -}}} -The directory where Propel will place the php-ified version of your {{{runtime-conf.xml}}}. - -{{{ -propel.sql.dir = ${propel.output.dir}/sql -}}} -The directory where Propel will place generated DDL (or data insert statements, etc.) - - -=== Overriding Builder Classes === - -{{{ -# Object Model builders -propel.builder.peer.class = propel.engine.builder.om.php5.PHP5ComplexPeerBuilder -propel.builder.object.class = propel.engine.builder.om.php5.PHP5ComplexObjectBuilder -propel.builder.objectstub.class = propel.engine.builder.om.php5.PHP5ExtensionObjectBuilder -propel.builder.peerstub.class = propel.engine.builder.om.php5.PHP5ExtensionPeerBuilder - -propel.builder.objectmultiextend.class = propel.engine.builder.om.php5.PHP5MultiExtendObjectBuilder - -propel.builder.tablemap.class = propel.engine.builder.om.php5.PHP5TableMapBuilder - -propel.builder.interface.class = propel.engine.builder.om.php5.PHP5InterfaceBuilder - -propel.builder.node.class = propel.engine.builder.om.php5.PHP5NodeBuilder -propel.builder.nodepeer.class = propel.engine.builder.om.php5.PHP5NodePeerBuilder -propel.builder.nodestub.class = propel.engine.builder.om.php5.PHP5ExtensionNodeBuilder -propel.builder.nodepeerstub.class = propel.engine.builder.om.php5.PHP5ExtensionNodePeerBuilder - -propel.builder.nestedset.class = propel.engine.builder.om.php5.PHP5NestedSetBuilder -propel.builder.nestedsetpeer.class = propel.engine.builder.om.php5.PHP5NestedSetPeerBuilder - -# SQL builders - -propel.builder.ddl.class = propel.engine.builder.sql.${propel.database}.${propel.database}DDLBuilder -propel.builder.datasql.class = propel.engine.builder.sql.${propel.database}.${propel.database}DataSQLBuilder - -# Platform classes - -propel.platform.class = propel.engine.platform.${propel.database}Platform - -# Pluralizer class (used to generate plural forms) - -propel.builder.pluralizer.class = propel.engine.builder.util.DefaultEnglishPluralizer -}}} - -As you can see, you can specify your own builder and platform classes if you want to extend & override behavior in the default classes - -=== Adding Behaviors === - -{{{ -propel.behavior.timestampable.class = propel.engine.behavior.TimestampableBehavior -}}} - -Define the path to the class to be used for the `timestampable` behavior. This behavior is bundled wit hPropel, but if you want to override it, you can specify a different path. - -If you want to add more behaviors, write their path following the same model: - -{{{ -propel.behavior.my_behavior.class = my.custom.path.to.MyBehaviorClass -}}} - -Behaviors are enabled on a per-table basis in the `schema.xml`. However, you can add behaviors for all your schemas, provided that you define them in the `propel.behavior.default` setting: - -{{{ -propel.behavior.default = soft_delete,my_behavior -}}} \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/reference/ModelCriteria.txt b/airtime_mvc/library/propel/docs/reference/ModelCriteria.txt deleted file mode 100644 index d5c4042d36..0000000000 --- a/airtime_mvc/library/propel/docs/reference/ModelCriteria.txt +++ /dev/null @@ -1,1025 +0,0 @@ -= Propel Query Reference = - -[[PageOutline]] - -Propel's Query classes make it easy to write queries of any level of complexity in a simple and reusable way. - -== Overview == - -Propel proposes an object-oriented API for writing database queries. That means that you don't need to write any SQL code to interact with the database. Object orientation also facilitates code reuse and readability. Here is how to query the database for records in the `book` table ordered by the `title` column and published in the last month: - -{{{ -#!php -filterByPublishedAt(array('min' => time() - 30 * 24 * 60 * 60)) - ->orderByTitle() - ->find(); -}}} - -The first thing to notice here is the fluid interface. Propel queries are made of method calls that return the current query object - `filterByPublishedAt()` and `orderByTitle()` return the current query augmented with conditions. `find()`, on the other hand, is a ''termination method'' that doesn't return the query, but its result - in this case, a collection of `Book` objects. - -Propel generates one `filterByXXX()` method for every column in the table. The column name used in the PHP method is not the actual column name in the database ('`published_at`'), but rather a CamelCase version of it ('`PublishedAt`'), called the column ''phpName''. Remember to always use the phpName in the PHP code ; the actual SQL name only appears in the SQL code. - -When a termination method like `find()` is called, Propel builds the SQL code and executes it. The previous example generates the following code when `find()` is called: - -{{{ -#!php -= :p1 -ORDER BY book.TITLE ASC'; -}}} - -Propel uses the column name in conjunction with the schema to determine the column type. In this case, `published_at` is defined in the schema as a `TIMESTAMP`. Then, Propel ''binds'' the value to the condition using the column type. This prevents SQL injection attacks that often plague web applications. Behind the curtain, Propel uses PDO to achieve this binding: - -{{{ -#!php -prepare($query); -$stmt->bind(':p1', time() - 30 * 24 * 60 * 60, PDO::PARAM_INT); -$res = $stmt->execute(); -}}} - -The final `find()` doesn't just execute the SQL query above, it also instanciates `Book` objects and populates them with the results of the query. Eventually, it returns a `PropelCollection` object with these `Book` objects inside. For the sake of clarity, you can consider this collection object as an array. In fact, you can use it as if it were a true PHP array and iterate over the result list the usual way: - -{{{ -#!php -getTitle(); -} -}}} - -So Propel queries are a very powerful tool to write your queries in an object-oriented fashion. They are also very natural - if you know how to write an SQL query, chances are that you will write Propel queries in minutes. - -== Generated Query Methods == - -For each object, Propel creates a few methods in the generated query object. - -=== Column Filter Methods === - -`filterByXXX()`, generated for each column, provides a different feature and a different functionality depending on the column type: - - * For all columns, `filterByXXX()` translates to a simple SQL `WHERE` condition by default: - -{{{ -#!php -filterByTitle('War And Peace') - ->find(); -// example Query generated for a MySQL database -$query = 'SELECT book.* from `book` -WHERE book.TITLE = :p1'; // :p1 => 'War And Peace' -}}} - - * For string columns, `filterByXXX()` translates to a SQL `WHERE ... LIKE` if the value contains wildcards: - -{{{ -#!php -filterByTitle('War%') - ->find(); -// example Query generated for a MySQL database -$query = 'SELECT book.* from `book` -WHERE book.TITLE LIKE :p1'; // :p1 => 'War%' -}}} - - * For integer columns, `filterByXXX()` translates into a SQL `WHERE ... IN` if the value is an array: - -{{{ -#!php -filterByAuthorId(array(123, 456)) - ->find(); -// example Query generated for a MySQL database -$query = 'SELECT book.* from `book` -WHERE book.AUTHOR_ID IN (:p1, :p2)'; // :p1 => 123, :p2 => 456 -}}} - - * For Boolean columns, `filterByXXX()` translates the value to a boolean using smart casting: - -{{{ -#!php -filterByIsPublished('yes') - ->filterByIsSoldOut('no') - ->find(); -// example Query generated for a MySQL database -$query = 'SELECT book.* from `book` -WHERE book.IS_PUBLISHED = :p1 - AND book.IS_SOLD_OUT = :p2'; // :p1 => true, :p2 => false -}}} - -=== Relation Filter Methods === - -Propel also generates a `filterByXXX()` method for every foreign key. The filter expects an object of the related class as parameter: - -{{{ -#!php -findPk(123); -$books = BookQuery::create() - ->filterByAuthor($author) - ->find(); -// example Query generated for a MySQL database -$query = 'SELECT book.* from `book` -WHERE book.AUTHOR_ID = :p1'; // :p1 => 123 -}}} - -Check the generated BaseQuery classes for a complete view of the generated query methods. Every generated method comes with a detailed phpDoc comment, making code completion very easy on supported IDEs. - -=== Embedding a Related Query === - -In order to add conditions on related tables, a propel query can ''embed'' the query of the related table. The generated `useXXXQuery()` serve that purpose. For instance, here is how to query the database for books written by 'Leo Tolstoi': - -{{{ -#!php -useAuthorQuery() - ->filterByName('Leo Tolstoi') - ->endUse() - ->find(); -}}} - -`useAuthorQuery()` returns a new instance of `AuthorQuery` already joined with the current `BookQuery` instance. The next method is therefore called on a different object - that's why the `filterByName()` call is further indented in the code example. Finally, `endUse()` merges the conditions applied on the `AuthorQuery` to the `BookQuery`, and returns the original `BookQuery` object. - -Propel knows how to join the `Book` model to the `Author` model, since you already defined a foreign key between the two tables in the `schema.xml`. Propel takes advantage of this knowledge of your model relationships to help you write faster queries and omit the most obvious data. - -{{{ -#!php - 'Leo Tolstoi' -}}} - -You can customize the related table alias and the join type by passing arguments to the `useXXXQuery()` method: - -{{{ -#!php -useAuthorQuery('a', 'left join') - ->filterByName('Leo Tolstoi') - ->endUse() - ->find(); -// example Query generated for a MySQL database -$query = 'SELECT book.* from book -LEFT JOIN author a ON book.AUTHOR_ID = a.ID -WHERE a.NAME = :p1'; // :p1 => 'Leo Tolstoi' -}}} - -The `useXXXQuery()` methods allow for very complex queries. You can mix them, nest them, and reopen them to add more conditions. - -== Inherited Methods == - -The generated Query classes extend a core Propel class named `ModelCriteria`, which provides even more methods for building your queries. - -=== Finding An Object From Its Primary Key === - -{{{ -#!php -findPk(123); -// Finding the books having primary keys 123 and 456 -$books = BookQuery::create()->findPks(array(123, 456)); -// Also works for objects with composite primary keys -$bookOpinion = BookOpinionQuery::create()->findPk(array($bookId, $userId)); -}}} - -=== Finding Objects === - -{{{ -#!php -find(); -// Finding 3 Books -$articles = BookQuery::create() - ->limit(3) - ->find(); -// Finding a single Book -$article = BookQuery::create() - ->findOne(); -}}} - -=== Using Magic Query Methods === - -{{{ -#!php -findOneByTitle('War And Peace'); -// same as -$book = BookQuery::create() - ->filterByTitle('War And Peace') - ->findOne(); - -$books = BookQuery::create()->findByTitle('War And Peace'); -// same as -$books = BookQuery::create() - ->filterByTitle('War And Peace') - ->find(); - -// You can even combine several column conditions in a method name, if you separate them with 'And' -$book = BookQuery::create()->findOneByTitleAndAuthorId('War And Peace', 123); -// same as -$book = BookQuery::create() - ->filterByTitle('War And Peace') - ->filterById(123) - ->findOne(); -}}} - -=== Ordering Results === - -{{{ -#!php -orderByPublishedAt() - ->find(); -// Finding all Books ordered by published_at desc -$books = BookQuery::create() - ->orderByPublishedAt('desc') - ->find(); -}}} - -=== Specifying A Connection === - -{{{ -#!php -findOne($con); -}}} - -'''Tip''': In debug mode, the connection object provides a way to check the latest executed query, by calling `$con->getLastExecutedQuery()`. See the [wiki:Documentation/1.5/07-Logging Logging documentation] for more details. - -=== Counting Objects === - -{{{ -#!php -count($con); -// This is much faster than counting the results of a find() -// since count() doesn't populate Model objects -}}} - -=== Deleting Objects === - -{{{ -#!php -deleteAll($con); -// Deleting a selection of Books -$nbDeletedBooks = BookQuery::create() - ->filterByTitle('Pride And Prejudice') - ->delete($con); -}}} - -=== Updating Objects === - -{{{ -#!php -setName('Jane Austen'); -$author1->save(); -$author2 = new Author(); -$author2->setName('Leo Tolstoy'); -$author2->save(); - -// update() issues an UPDATE ... SET query based on an associative array column => value -$nbUpdatedRows = AuthorQuery::create() - ->filterByName('Leo Tolstoy') - ->update(array('Name' => 'Leo Tolstoi'), $con); - -// update() returns the number of modified columns -echo $nbUpdatedRows; // 1 - -// Beware that update() updates all records found in a single row -// And bypasses any behavior registered on the save() hooks -// You can force a one-by-one update by setting the third parameter of update() to true -$nbUpdatedRows = AuthorQuery::create() - ->filterByName('Leo Tolstoy') - ->update(array('Name' => 'Leo Tolstoi'), $con, true); -// Beware that it may take a long time -}}} - -=== Creating An Object Based on a Query === - -You may often create a new object based on values used in conditions if a query returns no result. This happens a lot when dealing with cross-reference tables in many-to-many relationships. To avoid repeating yourself, use `findOneOrCreate()` instead of `findOne()` in such cases: - -{{{ -#!php -filterByBook($book) - ->filterByTag('crime') - ->findOne(); -if (!$bookTag) { - $bookTag = new BookTag(); - $bookTag->setBook($book); - $bookTag->setTag('crime'); -} -// The short way -$bookTag = BookTagQuery::create() - ->filterByBook($book) - ->filterByTag('crime') - ->findOneOrCreate(); -}}} - -=== Reusing A Query === - -By default, termination methods like `findOne()`, `find()`, `count()`, `paginate()`, or `delete()` alter the original query. That means that if you need to reuse a query after a termination method, you must call the `keepQuery()` method first: - -{{{ -#!php -filterByIsPublished(true); -$book = $q->findOneByTitle('War And Peace'); -// findOneByXXX() adds a limit() to the query -// so further reuses of the query may show side effects -echo $q->count(); // 1 - -// to allos query reuse, call keepQuery() before the termination method -$q = BookQuery::create()->filterByIsPublished(true)->keepQuery(); -$book = $q->findOneByTitle('War And Peace'); -echo $q->count(); // 34 -}}} - -== Relational API == - -For more complex queries, you can use an alternative set of methods, closer to the relational logic of SQL, to make sure that Propel issues exactly the SQL query you need. - -This alternative API uses methods like `where()`, `join()` and `orderBy()` that translate directly to their SQL equivalent - `WHERE`, `JOIN`, etc. Here is an example: - -{{{ -#!php -join('Book.Author') - ->where('Author.Name = ?', 'Leo Tolstoi') - ->orderBy('Book.Title', 'asc') - ->find(); - -}}} - -The names passed as parameters in these methods, like 'Book.Author', 'Author.Name', and 'Book.Title', are ''explicit column names''. These names are composed of the phpName of the model, and the phpName of the column, separated by a dot (e.g. 'Author.Name'). Manipulating object model names allows you to be detached from the actual data storage, and alter the database names without necessarily updating the PHP code. It also makes the use of table aliases much easier - more on that matter later. - -Propel knows how to map the explicit column names to database column names in order to translate the Propel query into an actual database query: - -{{{ -#!php -where('Book.Title = ?', 'War And Peace') - ->find(); -// Finding all Books where title is like 'War%' -$books = BookQuery::create() - ->where('Book.Title LIKE ?', 'War%') - ->find(); -// Finding all Books published after $date -$books = BookQuery::create() - ->where('Book.PublishedAt > ?', $date) - ->find(); -// Finding all Books with no author -$books = BookQuery::create() - ->where('Book.AuthorId IS NULL') - ->find(); -// Finding all books from a list of authors -$books = BookQuery::create() - ->where('Book.AuthorId IN ?', array(123, 542, 563)) - ->find(); -// You can even use SQL functions inside conditions -$books = BookQuery::create() - ->where('UPPER(Book.Title) = ?', 'WAR AND PEACE') - ->find(); -}}} - -=== Combining Several Conditions === - -For speed reasons, `where()` only accepts simple conditions, with a single interrogation point for the value replacement. When you need to apply more than one condition, and combine them with a logical operator, you have to call `where()` multiple times. - -{{{ -#!php -where('Book.Title = ?', 'War And Peace') - ->where('Book.PublishedAt > ?', $date) - ->find(); -// For conditions chained with OR, use orWhere() instead of where() -$books = BookQuery::create() - ->where('Book.Title = ?', 'War And Peace') - ->orWhere('Book.Title LIKE ?', 'War%') - ->find(); -}}} - -The use of `where()` and `orWhere()` doesn't allow logically complex conditions, that you would write in SQL with parenthesis. For such cases, create named conditions with `condition()`, and then combine them in an array that you can pass to `where()` instead of a single condition, as follows: - -{{{ -#!php -condition('cond1', 'Book.Title = ?', 'War And Peace') // create a condition named 'cond1' - ->condition('cond2', 'Book.Title LIKE ?', 'War%') // create a condition named 'cond2' - ->where(array('cond1', 'cond2'), 'or')-> // combine 'cond1' and 'cond2' with a logical OR - ->find(); - // SELECT book.* from book WHERE (book.TITLE = 'War And Peace' OR book.TITLE LIKE 'War%'); - -// You can create a named condition from the combination of other named conditions by using `combine()` -// That allows for any level of complexity -$books = BookQuery::create() - ->condition('cond1', 'Book.Title = ?', 'War And Peace') // create a condition named 'cond1' - ->condition('cond2', 'Book.Title LIKE ?', 'War%') // create a condition named 'cond2' - ->combine(array('cond1', 'cond2'), 'or', 'cond12') // create a condition named 'cond12' from 'cond1' and 'cond2' - ->condition('cond3', 'Book.PublishedAt <= ?', $end) // create a condition named 'cond3' - ->condition('cond4', 'Book.PublishedAt >= ?', $begin) // create a condition named 'cond4' - ->combine(array('cond3', 'cond4'), 'and', 'cond34') // create a condition named 'cond34' from 'cond3' and 'cond4' - ->where(array('cond12', 'cond34'), 'and') // combine the two conditions in a where - ->find(); - // SELECT book.* FROM book WHERE ( - // (book.TITLE = 'War And Peace' OR book.TITLE LIKE 'War%') - // AND - // (book.PUBLISHED_AT <= $end AND book.PUBLISHED_AT >= $begin) - // ); -}}} - -=== Joining Tables === - -{{{ -#!php -setName('Jane Austen'); -$author1->save(); -$book1 = new Book(); -$book1->setTitle('Pride And Prejudice'); -$book1->setAuthor($author1); -$book1->save(); - -// Add a join statement -// No need to tell the query which columns to use for the join, just the related Class -// After all, the columns of the FK are already defined in the schema. -$book = BookQuery::create() - ->join('Book.Author') - ->where('Author.Name = ?', 'Jane Austen') - ->findOne(); - // SELECT book.* FROM book - // INNER JOIN author ON book.AUTHOR_ID = author.ID - // WHERE author.NAME = 'Jane Austin' - // LIMIT 1; - -// The default join() call results in a SQL INNER JOIN clause -// For LEFT JOIN or RIGHT JOIN clauses, use leftJoin() or rightJoin() instead of join() -$book = BookQuery::create() - ->leftJoin('Book.Author') - ->where('Author.Name = ?', 'Jane Austen') - ->findOne(); - -// You can chain joins if you want to make more complex queries -$review = new Review(); -$review->setBook($book1); -$review->setRecommended(true); -$review->save(); - -$author = BookQuery::create() - ->join('Author.Book') - ->join('Book.Review') - ->where('Review.Recommended = ?', true) - ->findOne(); - -// Alternatively, you can use the generated joinXXX() methods -// Which are a bit faster than join(), but limited to the current model's relationships -$book = BookQuery::create() - ->joinAuthor() - ->where('Author.Name = ?', 'Jane Austen') - ->findOne(); -// The join type depends on the required attribute of the foreign key column -// If the column is required, then the default join type is an INNER JOIN -// Otherwise, the default join type is a LEFT JOIN -// You can override the default join type for a given relationship -// By setting the joinType attribute of the foreign key element in the schema.xml -}}} - -=== Table Aliases === - -{{{ -#!php -where('b.Title = ?', 'Pride And Prejudice') - ->find(); - -// join(), leftJoin() and rightJoin() also allow table aliases -$author = AuthorQuery::create('a') - ->join('a.Book b') - ->join('b.Review r') - ->where('r.Recommended = ?', true) - ->findOne(); - -// Table aliases can be used in all query methods (where, groupBy, orderBy, etc.) -$books = BookQuery::create('b') - ->where('b.Title = ?', 'Pride And Prejudice') - ->orderBy('b.Title') - ->find(); - -// Table aliases are mostly useful to join the current table, -// or to handle multiple foreign keys on the same column -$employee = EmployeeQuery::create('e') - ->innerJoin('e.Supervisor s') - ->where('s.Name = ?', 'John') - ->find(); -}}} - -=== Minimizing Queries === - -Even if you do a join, Propel will issue new queries when you fetch related objects: - -{{{ -#!php -join('Book.Author') - ->where('Author.Name = ?', 'Jane Austen') - ->findOne(); -$author = $book->getAuthor(); // Needs another database query -}}} - -Propel allows you to retrieve the main object together with related objects in a single query. You just have to call the `with()` method to specify which objects the main object should be hydrated with. - -{{{ -#!php -join('Book.Author') - ->with('Author') - ->where('Author.Name = ?', 'Jane Austen') - ->findOne(); -$author = $book->getAuthor(); // Same result, with no supplementary query -}}} - -`with()` expects a relation name, as declared previously by `join()`. In practice, that means that `with()` and `join()` should always come one after the other. To avoid repetition, use `joinWith()` to both add a `join()` and a `with()` on a relation. So the shorter way to write the previous query is: - -{{{ -#!php -joinWith('Book.Author') - ->where('Author.Name = ?', 'Jane Austen') - ->findOne(); -$author = $book->getAuthor(); // Same result, with no supplementary query -}}} - -Since the call to `with()` adds the columns of the related object to the SELECT part of the query, and uses these columns to populate the related object, that means that `joinWith()` is slower and consumes more memory that `join()`. So use it only when you actually need the related objects afterwards. - -`with()` and `joinWith()` are not limited to immediate relationships. As a matter of fact, just like you can chain `join()` calls, you can chain `joinWith()` calls to populate a chain of objects: - -{{{ -#!php -joinWith('Review.Book') - ->joinWith('Book.Author') - ->joinWith('Book.Publisher') - ->findOne(); -$book = $review->getBook() // No additional query needed -$author = $book->getAuthor(); // No additional query needed -$publisher = $book->getPublisher(); // No additional query needed -}}} - -So `joinWith()` is very useful to minimize the number of database queries. As soon as you see that the number of queries necessary to perform an action is proportional to the number of results, adding `With` after `join()` calls is the trick to get down to a more reasonnable query count. - -=== Adding Columns === - -Sometimes you don't need to hydrate a full object in addition to the main object. If you only need one additional column, the `withColumn()` method is a good alternative to `joinWith()`, and it speeds up the query: - -{{{ -#!php -join('Book.Author') - ->withColumn('Author.Name', 'AuthorName') - ->findOne(); -$authorName = $book->getAuthorName(); -}}} - -Propel adds the 'with' column to the SELECT clause of the query, and uses the second argument of the `withColumn()` call as a column alias. This additional column is later available as a 'virtual' column, i.e. using a getter that does not correspond to a real column. You don't actually need to write the `getAuthorName()` method ; Propel uses the magic `__call()` method of the generated `Book` class to catch the call to a virtual column. - -`withColumn()` is also of great use to add calculated columns: - -{{{ -#!php -join('Author.Book') - ->withColumn('COUNT(Book.Id)', 'NbBooks') - ->groupBy('Author.Id') - ->find(); -foreach ($authors as $author) { - echo $author->getName() . ': ' . $author->getNbBooks() . " books\n"; -} -}}} - -With a single SQL query, you can have both a list of objects and an additional column for each object. That makes of `withColumn()` a great query saver. - -'''Tip''': You can call `withColumn()` multiple times to add more than one virtual column to the resulting objects. - -=== Adding A Comment === - -{{{ -#!php -setComment('Author Deletion') - ->filterByName('Leo Tolstoy') - ->delete($con); -// The comment ends up in the generated SQL query -// DELETE /* Author Deletion */ FROM `author` WHERE author.NAME = 'Leo Tolstoy' -}}} - -=== Using Methods From Another Query Class === - -After writing custom methods to query objects, developers often meet the need to use the method from another query. For instance, in order to select the authors of the most recent books, you may want to write: - -{{{ -#!php -join('Author.Book') - ->recent() - ->find(); -}}} - -The problem is that `recent()` is a method of `BookQuery`, not of the `AuthorQuery` class that the `create()` factory returns. - -Does that mean that you must repeat the `BookQuery::recent()` code into a new `AuthorQuery::recentBooks()` method? That would imply repeating the same code in two classes, which is not a good practice. Instead, use the `useQuery()` and `endUse()` combination to use the methods of `BookQuery` inside `AuthorQuery`: - -{{{ -#!php -join('Author.Book') - ->useQuery('Book') - ->recent() - ->endUse() - ->find(); -}}} - -This is excatly whath the generated `useBookQuery()` does, except that you have more control over the join type and alias when you use the relational API. Behind the scene, `useQuery('Book')` creates a `BookQuery` instance and returns it. So the `recent()` call is actually called on `BookQuery`, not on `ArticleQuery`. Upon calling `endUse()`, the `BookQuery` merges into the original `ArticleQuery` and returns it. So the final `find()` is indeed called on the `AuthorQuery` instance. - -You can nest queries in as many levels as you like, in order to avoid the repetition of code in your model. - -'''Tip''': If you define an alias for the relation in `join()`, you must pass this alias instead of the model name in `useQuery()`. - -{{{ -#!php -join('a.Book b') - ->useQuery('b') - ->recent() - ->endUse() - ->find(); -}}} - -=== Fluid Conditions === - -Thanks to the query factories and the fluid interface, developers can query the database without creating a variable for the Query object. This helps a lot to reduce the amount of code necessary to write a query, and it also makes the code more readable. - -But when you need to call a method on a Query object only if a certain condition is satisfied, it becomes compulsory to use a variable for the Query object: - -{{{ -#!php -isEditor()) { - $query->where('Book.IsPublished = ?', true); -} -$books = $query - ->orderByTitle() - ->find(); -}}} - -The `ModelCriteria` class offers a neat way to keep your code to a minimum in such occasions. It provides `_if()` and `_endif()` methods allowing for inline conditions. Using thses methods, the previous query can be written as follows: - -{{{ -#!php -_if(!$user->isEditor()) - ->where('Book.IsPublished = ?', true) - ->_endif() - ->orderByTitle() - ->find(); -}}} - -The method calls enclosed between `_if($cond)` and `_endif()` will only be executed if the condition is true. To complete the list of tools available for fluid conditions, you can also use `_else()` and `_elseif($cond)`. - -=== More Complex Queries === - -The Propel Query objects have even more methods that allow you to write queries of any level of complexity. Check the API documentation for the `ModelCriteria` class to see all methods. - -{{{ -#!php -find(); // $books behaves like an array -?> -There are books: -
    - -
  • - getTitle() ?> -
  • - -
- -find(); // $books is an object -?> - -isEmpty()): ?> -There are no books. - -There are count() ?> books: -
    - -
  • - getTitle() ?> -
  • - isLast()): ?> -
  • Do you want more books?
  • - - -
- -}}} - -Here is the list of methods you can call on a PropelCollection: - -{{{ -#!php -setFormatter('PropelArrayFormatter') - ->findOne(); -print_r($book); - => array('Id' => 123, 'Title' => 'War And Peace', 'ISBN' => '3245234535', 'AuthorId' => 456, 'PublisherId' => 567) -}}} - -Of course, the formatters take the calls to `with()` into account, so you can end up with a precise array representation of a model object: - -{{{ -#!php -setFormatter('PropelArrayFormatter') - ->with('Book.Author') - ->with('Book.Publisher') - ->findOne(); -print_r($book); - => array( - 'Id' => 123, - 'Title' => 'War And Peace', - 'ISBN' => '3245234535', - 'AuthorId' => 456, - 'PublisherId' => 567 - 'Author' => array( - 'Id' => 456, - 'FirstName' => 'Leo', - 'LastName' => 'Tolstoi' - ), - 'Publisher' => array( - 'Id' => 567, - 'Name' => 'Penguin' - ) - ) -}}} - -Propel provides four formatters: - * `PropelObjectFormatter`: The default formatter, returning a model object for `findOne()`, and a `PropelObjectCollection` of model objects for `find()` - * `PropelOnDemandFormatter`: To save memory for large resultsets, prefer this formatter ; it hydrates rows one by one as they are iterated on, and doesn't create a new Propel Model object at each row. Note that this formatter doesn't use the Instance Pool. - * `PropelArrayFormatter`: The array formatter, returning an associative array for `findOne()`, and a `PropelArrayCollection` of arrays for `find()` - * `PropelStatementFormatter`: The 'raw' formatter, returning a `PDOStatement` in any case. - -You can easily write your own formatter to format the resultas the way you want. A formatter is basically a subclass of `PropelFormatter` providing a `format()` and a `formatOne()` method expecting a PDO statement. - -== Writing Your Own business Logic Into A Query == - -=== Custom Filters === - -You can add custom methods to the query objects to make your queries smarter, more reusable, and more readable. Don't forget to return the current object (`$this`) in the new methods. - -{{{ -#!php -filterByPublishedAt(array('min' => time() - $nbDays * 24 * 60 * 60)); - } - - public function mostRecentFirst() - { - return $this->orderByPublishedAt('desc'); - } -} - -// You can now use your custom query and its methods together with the usual ones -$books = BookQuery::create() - ->recent() - ->mostRecentFirst() - ->find(); -}}} - -=== Custom Hooks === - -The query objects also allow you to add code to be executed before each query, by implementing one of the following methods: `preSelect()`, `preUpdate()`, and `preDelete()`. It makes the implementation of a 'soft delete' behavior very straightforward: - -{{{ -#!php -filterByDeletedAt(null); - } - - public function preDelete($con) - { - // mark the records as deleted instead of deleting them - return $this->update(array('DeletedAt' => time())); - } -} -}}} - -'''Tip''': You can create several custom queries for a given model, in order to separate the methods into logical classes. - -{{{ -#!php -where($this->getModelAliasOrName() . '.PublishedAt IS NOT NULL'); - } -} -// Use 'frontendBook' instead of 'Book' in the frontend to retrieve only published articles -$q = new frontendBookQuery(); -$books = $q->find(); -}}} - -'''Tip''': Due to late static binding issues in PHP 5.2, you cannot use the `create()` factory on an inherited query - unless you override it yoursel in the descendant class. Alternatively, Propel offers a global query factory named `PropelQuery`: - -{{{ -#!php -find(); -}}} \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/reference/Runtime-Configuration.txt b/airtime_mvc/library/propel/docs/reference/Runtime-Configuration.txt deleted file mode 100644 index 256c0a45e5..0000000000 --- a/airtime_mvc/library/propel/docs/reference/Runtime-Configuration.txt +++ /dev/null @@ -1,318 +0,0 @@ -= Runtime Configuration File = - -[[PageOutline]] - -== Example {{{runtime-conf.xml}}} File == - -Here is a the sample runtime configuration file. - -{{{ -#!xml - - - - propel-bookstore - console - 7 - - - - - sqlite - - DebugPDO - mysql:host=localhost;dbname=bookstore - testuser - password - - - - - - - - utf8 - - set search_path myschema, public - INSERT INTO BAR ('hey', 'there') - - - - - - mysql:host=slave-server1; dbname=bookstore - - - mysql:host=slave-server2; dbname=bookstore - - - - - - -
- - true - - - - true - 1 - -
-
-
-
-
-}}} - -== Explanation of Configuration Sections == - -Below you will find an explanation of the primary elements in the configuration. - -=== === - -If the '''''' element is present, Propel will use the specified information to instantiate a [http://pear.php.net/Log PEAR Log] logger. - -{{{ -#!xml - - - file - /path/to/logger.log - my-app - 7 - -}}} - -The nested elements correspond to the configuration options for the logger (options that would otherwise be passed to '''Log::factory()''' method). - -||'''Element'''||'''Default'''||'''Description'''|| -||''''''||file||The logger type.|| -||''''''||./propel.log||Name of log, meaning is dependent on type specified. (For ''file'' type this is the filename).|| -||''''''||propel||The identifier tag for the log.|| -||''''''||7 (PEAR_LOG_DEBUG)||The logging level.|| - -This log configuring API is designed to provide a simple way to get log output from Propel; however, if your application already has a logging mechanism, we recommend instead that you use your existing logger (writing a simple log adapter, if you are using an unsupported logger). See the [wiki:Documentation/1.5/07-Logging Logging documentation] for more info. - -=== === - -This is the top-level tag for Propel datasources configuration. - -{{{ -#!xml - - - -}}} - -=== === - -{{{ -#!xml - - - - -}}} -A specific datasource being configured. - * The @id must match the @name attribute from your {{{schema.xml}}}. - -=== === - -The adapter to use for Propel. Currently supported adapters: sqlite, pgsql, mysql, oracle, mssql. Note that it is possible that your adapter could be different from your connection driver (e.g. if using ODBC to connect to MSSQL database, you would use an ODBC PDO driver, but MSSQL Propel adapter). - -{{{ -#!xml - - - - - sqlite -}}} - -=== === - -The PDO database connection for the specified datasource. - -Nested elements define the DSN, connection options, other PDO attributes, and finally some Propel-specific initialization settings. - -{{{ -#!xml - - - - - -}}} - -==== ==== - -A custom PDO class (must be a PropelPDO subclass) that you would like to use for the PDO connection. - -{{{ -#!xml - - - - - - DebugPDO -}}} - -This can be used to specify the alternative '''DebugPDO''' class bundled with Propel, or your own subclass. ''Your class must extend PropelPDO, because Propel requires the ability to nest transactions (without having exceptions being thrown by PDO).'' - -==== ==== - -The PDO DSN that Propel will use to connect to the database for this datasource. - -{{{ -#!xml - - - - - - mysql:host=localhost;dbname=bookstore -}}} - -See the PHP documentation for specific format: - * [http://www.php.net/manual/en/ref.pdo-mysql.connection.php MySQL DSN] - * [http://www.php.net/manual/en/ref.pdo-pgsql.connection.php PostgreSQL DSN] - * [http://www.php.net/manual/en/ref.pdo-sqlite.connection.php SQLite DSN] - * [http://www.php.net/manual/en/ref.pdo-oci.connection.php Oracle DSN] - * [http://www.php.net/manual/en/ref.pdo-dblib.connection.php MSSQL DSN] - -Note that some database (e.g. PostgreSQL) specify username and password as part of the DSN while the others specify user and password separately. - -==== and ==== - -Specifies credentials for databases that specify username and password separately (e.g. MySQL, Oracle). - -{{{ -#!xml - - - - - - mysql:host=localhost;dbname=bookstore - test - testpass -}}} - -==== ==== - -Specify any options which ''must'' be specified when the PDO connection is created. For example, the ATTR_PERSISTENT option must be specified at object creation time. - -See the [http://www.php.net/pdo PDO documentation] for more details. - -{{{ -#!xml - - - - - - - - - -}}} - -==== ==== - -`` are similar to ``; the difference is that options specified in `` are set after the PDO object has been created. These are set using the [http://us.php.net/PDO-setAttribute PDO->setAttribute()] method. - -In addition to the standard attributes that can be set on the PDO object, there are also the following Propel-specific attributes that change the behavior of the PropelPDO connection: - -|| '''Attribute constant''' || '''Valid Values (Default)''' || '''Description''' || -|| PropelPDO::PROPEL_ATTR_CACHE_PREPARES || true/false (false) || Whether to have the PropelPDO connection cache the PDOStatement prepared statements. This will improve performance if you are executing the same query multiple times by your script (within a single request / script run). || - -''Note that attributes in the XML can be specified with or without the PDO:: (or PropelPDO::) constant prefix.'' - -{{{ -#!xml - - - - - - - - - - - -}}} - -'''Tip''': If you are using MySQL and get the following error : "SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active", you can try adding the following attribute: - -{{{ - -}}} - -==== ==== - -Settings are Propel-specific options used to further configure the connection -- or perform other user-defined initialization tasks. - -Currently supported settings are: - * charset - * queries - -===== charset ===== - -Specifies the character set to use. Currently you must specify the charset in the way that is understood by your RDBMS. Also note that not all database systems support specifying charset (e.g. SQLite must be compiled with specific charset support). Specifying this option will likely result in an exception if your database doesn't support the specified charset. - -{{{ -#!xml - - - - - - - - utf8 - -}}} - -===== queries ===== - -Specifies any SQL statements to run when the database connection is initialized. This can be used for any environment setup or db initialization you would like to perform. These statements will be executed with every Propel initialization (e.g. every PHP script load). - -{{{ -#!xml - - - - - - - - - set search_path myschema, public - INSERT INTO BAR ('hey', 'there') - - -}}} - -=== === - -{{{ -#!xml - - - - - -}}} - -The `` tag groups slave `` elements which provide support for configuring slave db servers -- when using Propel in a master-slave replication environment. See the [wiki:Documentation/1.5/Master-Slave Master-Slave documentation] for more information. The nested `` elements are configured the same way as the top-level `` element is configured. - -=== === - -The optional `` element may be provided to pass additional logging configuration options to DebugPDO. Note that these settings have no effect unless DebugPDO has been selected in [1.5/RuntimeConfiguration#debugpdo `runtime-conf.xml`] as the PDO connection class. See the [wiki:Documentation/1.5/07-Logging Logging documentation] for more information on configuring DebugPDO. \ No newline at end of file diff --git a/airtime_mvc/library/propel/docs/reference/Schema.txt b/airtime_mvc/library/propel/docs/reference/Schema.txt deleted file mode 100644 index b130c03fb7..0000000000 --- a/airtime_mvc/library/propel/docs/reference/Schema.txt +++ /dev/null @@ -1,398 +0,0 @@ -= Database Schema = - -[[PageOutline]] - -The schema for `schema.xml` contains a small number of elements with required and optional attributes. The Propel generator contains a [source:branches/1.5/generator/resources/dtd/database.dtd DTD] that can be used to validate your `schema.xml` document. Also, when you build your SQL and OM, the Propel generator will automatically validate your `schema.xml` file using a highly-detailed [source:branches/1.5/generator/resources/xsd/database.xsd XSD]. - -== At-a-Glance == - -The hierarchical tree relationship for the elements is: - -{{{ -#!xml - - -
- - - - - - - - - - - - - -
-
-}}} - -**Tip**: If you use an IDE supporting autocompletion in XML documents, you can take advantage of the XSD describing the `schema.xml` syntax to suggest elements and attributes as you type. To enable it, add a `xmlns:xsi` and a `xsi:noNamespaceSchemaLocation` attribute to the leading `` tag: - -{{{ -#!xml - -}}} - -== Detailed Reference == - -This page provides an alternate rendering of the Appendix B - Schema Reference from the user's guide. -It spells out in specific detail, just where each attribute or element belongs. - -First, some conventions: - - * Text surrounded by a '''/''' is text that you would provide and is not defined in the language. (i.e. a table name is a good example of this.) - * Optional items are surrounded by '''[''' and ''']''' characters. - * Items where you have an alternative choice have a '''|''' character between them (i.e. true|false) - * Alternative choices may be delimited by '''{''' and '''}''' to indicate that this is the default option, if not overridden elsewhere. - * '''...''' means repeat the previous item. - -=== element === - -Starting with the {{{}}} element. The ''attributes'' and ''elements'' available are: - -{{{ -#!xml - - - - ... - -}}} - -The `package`, `baseClass`, `basePeer`, `defaultPhpNamingMethod`, and `heavyIndexing` attributes are generally optional. -A Database element may include an `` element, or multiple `
` elements. - - * `defaultIdMethod` sets the default id method to use for auto-increment columns. - * `package` specifies the "package" for the generated classes. Classes are created in subdirectories according to the `package` value. - * `namespace` specifies the default namespace that generated model classes will use (PHP 5.3 only). This attribute can be completed or overridden at the table level. - * `baseClass` allows you to specify a default base class that all generated Propel objects should extend (in place of `propel.om.BaseObject`). - * `basePeer` instructs Propel to use a different SQL-generating `BasePeer` class (or sub-class of `BasePeer`) for all generated objects. - * `defaultPhpNamingMethod` the default naming method to use for tables of this database. Defaults to `underscore`, which transforms table names into CamelCase phpNames. - * `heavyIndexing` adds indexes for each component of the primary key (when using composite primary keys). - * `tablePrefix` adds a prefix to all the SQL table names. - -=== element === - -The `` element is pretty simple. It just includes a schema file from somewhere on the file systems. The format is: - -{{{ -#!xml - -}}} - -===
element === - -The `
` element is the most complicated of the usable elements. Its definition looks like this: - -{{{ -#!xml -
- - - ... - - ... - - ... - - ... - - ... -
-}}} - -According to the schema, `name` is the only required attribute. Also, the `idMethod`, `package`, `namespace`, `phpNamingMethod`, `baseClass`, `basePeer`, and `heavyIndexing` attributes all default to what is specified by the `` element. - -==== Description of Attributes ==== - - * `idMethod` sets the id method to use for auto-increment columns. - * `phpName` specifies object model class name. By default, Propel uses a CamelCase version of the table name as phpName. - * `package` specifies the "package" (or subdirectory) in which model classes get generated. - * `namespace` specifies the namespace that the generated model classes will use (PHP 5.3 only). If the table namespace starts with a `\`, it overrides the namespace defined in the `` tag; otherwise, the actual table namespace is the concatenation of the database namespace and the table namespace. - * `skipSql` instructs Propel not to generate DDL SQL for the specified table. This can be used together with `readOnly` for supperting VIEWS in Propel. - * `abstract` Whether the generated ''stub'' class will be abstract (e.g. if you're using inheritance) - * `phpNamingMethod` the naming method to use. Defaults to `underscore`, which transforms the table name into a CamelCase phpName. - * `baseClass` allows you to specify a class that the generated Propel objects should extend ({{{in place of propel.om.BaseObject}}}). - * `basePeer` instructs Propel to use a different SQL-generating `BasePeer` class (or sub-class of `BasePeer`). - * `heavyIndexing` adds indexes for each component of the primary key (when using composite primary keys). - * `readOnly` suppresses the mutator/setter methods, save() and delete() methods. - * `treeMode` is used to indicate that this table is part of a node tree. Currently the only supported values are "!NestedSet" (see [wiki:Documentation/1.5/Behaviors/nested_set]) and "!MaterializedPath" (deprecated). - * `reloadOnInsert` is used to indicate that the object should be reloaded from the database when an INSERT is performed. This is useful if you have triggers (or other server-side functionality like column default expressions) that alters the database row on INSERT. - * `reloadOnUpdate` is used to indicate that the object should be reloaded from the database when an UPDATE is performed. This is useful if you have triggers (or other server-side functionality like column default expressions) that alters the database row on UPDATE. - * `allowPkInsert` can be used if you want to define the primary key of a new object being inserted. By default if idMethod is "native", Propel would throw an exception. However, in some cases this feature is useful, for example if you do some replication of data in an master-master environment. It defaults to false. - -=== element === - -{{{ -#!xml - - [] - -}}} - -==== Description of Attributes ==== - - * {{{defaultValue}}} The default value that the object will have for this column in the PHP instance after creating a "new Object". This value is always interpreted as a string. - * {{{defaultExpr}}} The default value for this column as expressed in SQL. This value is used solely for the "sql" target which builds your database from the schema.xml file. The defaultExpr is the SQL expression used as the "default" for the column. - * {{{primaryString}}} A column defined as primary string serves as default value for a `__toString()` method in the generated Propel object. - -=== element === - -To link a column to another table use the following syntax: - -{{{ -#!xml - - - -}}} - -==== Description of Attributes ==== - - * {{{defaultJoin}}} This affects the default join type used in the generated `joinXXX()` methods in the model query class. Propel uses an INNER JOIN for foreign keys attached to a required column, and a LEFT JOIN for foreign keys attached to a non-required column, but you can override this in the foreign key element. - -=== element === - -To create an index on one or more columns, use the following syntax: - -{{{ -#!xml - - - ... - -}}} - -In some cases your RDBMS may require you to specify an index size. - -=== element === - -To create a unique index on one or more columns, use the following syntax: - -{{{ -#!xml - - - ... - -}}} - -In some cases your RDBMS may require you to specify an index size for unique indexes. - -=== element === - -If you are using a database that uses sequences for auto-increment columns (e.g. PostgreSQL or Oracle), you can customize the name of the sequence using the tag: - -{{{ -#!xml - -}}} - -== Column Types == - -Here are the Propel column types with some example mappings to native database and PHP types. There are also several ways to customize the mapping between these types. - -=== Text Types === - -||'''Propel Type'''||'''Desc'''||'''Example Default DB Type (MySQL)'''||'''Default PHP Native Type'''|| -||CHAR||Fixed-lenght character data||CHAR||string|| -||VARCHAR||Variable-lenght character data||VARCHAR||string|| -||LONGVARCHAR||Long variable-length character data||TEXT||string|| -||CLOB||Character LOB (locator object)||LONGTEXT||string|| - -=== Numeric Types === - -||'''Propel Type'''||'''Desc'''||'''Example Default DB Type (MySQL)'''||'''Default PHP Native Type'''|| -||NUMERIC||Numeric data||DECIMAL||string (PHP int is limited)|| -||DECIMAL||Decimal data||DECIMAL||string (PHP int is limited)|| -||TINYINT||Tiny integer ||TINYINT||int|| -||SMALLINT||Small integer ||SMALLINT||int|| -||INTEGER||Integer||INTEGER||int|| -||BIGINT||Large integer||BIGINT||string (PHP int is limited)|| -||REAL||Real number||REAL||double|| -||FLOAT||Floating point number||FLOAT||double|| -||DOUBLE||Floating point number||DOUBLE||double|| - -=== Binary Types === - -||'''Propel Type'''||'''Desc'''||'''Example Default DB Type (MySQL)'''||'''Default PHP Native Type'''|| -||BINARY||Fixed-length binary data||BLOB||double|| -||VARBINARY||Variable-length binary data||MEDIUMBLOB||double|| -||LONGVARBINARY||Long variable-length binary data||LONGBLOB||double|| -||BLOB||Binary LOB (locator object)||LONGBLOB||string|| - -=== Temporal (Date/Time) Types === - - -||'''Propel Type'''||'''Desc'''||'''Example Default DB Type (MySQL)'''||'''Default PHP Native Type'''|| -||DATE||Date (e.g. YYYY-MM-DD)||DATE||DateTime object|| -||TIME||Time (e.g. HH:MM:SS)||TIME||DateTime object|| -||TIMESTAMP||Date + time (e.g. YYYY-MM-DD HH:MM:SS)||TIMESTAMP||DateTime object|| - -==== Legacy Temporal Types ==== - -The following Propel 1.2 types are still supported, but are no longer needed with Propel 1.3. - -||'''Propel Type'''||'''Desc'''||'''Example Default DB Type (MySQL)'''||'''Default PHP Native Type'''|| -||BU_DATE||Pre-/post-epoch date (e.g. 1201-03-02)||DATE||DateTime object|| -||BU_TIMESTAMP||Pre-/post-epoch Date + time (e.g. 1201-03-02 12:33:00)||TIMESTAMP||DateTime object|| - -== Customizing Mappings == - -=== Specify Column Attributes === - -You can change the way that Propel maps its own types to native SQL types or to PHP types by overriding the values for a specific column. - -For example: - -(Overriding PHP type) -{{{ -#!xml - -}}} - -(Overriding SQL type) -{{{ -#!xml - -}}} - -=== Adding Vendor Info === - -Propel supports database-specific elements in the schema (currently only for MySQL). This "vendor" parameters affect the generated SQL. To add vendor data, add a `` tag with a `type` attribute specifying the target database vendor. In the `` tag, add `` tags with a `name` and a `value` attribue. For instance: - -{{{ -#!xml - - - - - -
-}}} - -This will change the generated SQL table creation to look like: - -{{{ -#!sql -CREATE TABLE book - () - ENGINE = InnoDB - DEFAULT CHARACTER SET utf8; -}}} - -Propel supports the following vendor parameters for MySQL: - -{{{ -Name | Example values ------------------|--------------- -// in element -Engine | MYISAM (default), BDB, HEAP, ISAM, InnoDB, MERGE, MRG_MYISAM -Charset | utf8, latin1, etc. -Collate | utf8_unicode_ci, latin1_german1_ci, etc. -Checksum | 0, 1 -Pack_Keys | 0, 1, DEFAULT -Delay_key_write | 0, 1 -// in element -Charset | utf8, latin1, etc. -Collate | utf8_unicode_ci, latin1_german1_ci, etc. -// in element -Index_type | FULLTEXT -}}} - -=== Using Custom Platform === - -For overriding the mapping between Propel types and native SQL types, you can create your own Platform class and override the mapping. - -For example: - -{{{ -#!php -setSchemaDomainMapping(new Domain(PropelTypes::NUMERIC, "DECIMAL")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARCHAR, "TEXT")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BINARY, "BLOB")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::VARBINARY, "MEDIUMBLOB")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARBINARY, "LONGBLOB")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BLOB, "LONGBLOB")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::CLOB, "LONGTEXT")); - } -} -}}} - -You must then specify that mapping in the {{{build.properties}}} for your project: - -{{{ -propel.platform.class = propel.engine.platform.${propel.database}Platform -}}} diff --git a/airtime_mvc/library/propel/generator/bin/propel-gen b/airtime_mvc/library/propel/generator/bin/propel-gen deleted file mode 100755 index ea10819b51..0000000000 --- a/airtime_mvc/library/propel/generator/bin/propel-gen +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/sh -# Shell wrapper for Propel generator -# $Id$ -# -# This script will do the following: -# - check for PHING_COMMAND env, if found, use it. -# - if not found assume php is on the path -# - check for PROPEL_GEN_HOME env, if found use it -# - if not look for it - -if [ -z "$PROPEL_GEN_HOME" ] ; then - - # try to find Propel - if [ -d /opt/propel/generator ] ; then - PROPEL_GEN_HOME=/opt/propel/generator - fi - - if [ -d "${HOME}/opt/propel/generator" ] ; then - PROPEL_GEN_HOME="${HOME}/opt/propel/generator" - fi - - if [ -d "/usr/local/propel/generator" ] ; then - PROPEL_GEN_HOME="/usr/local/propel/generator" - fi - - if [ -d "${HOME}/usr/propel/generator" ] ; then - PROPEL_GEN_HOME="${HOME}/usr/propel/generator" - fi - - ## resolve links - the script name may be a link to phing's home - PRG="$0" - progname=`basename "$0"` - saveddir=`pwd` - - # need this for relative symlinks - dirname_prg=`dirname "$PRG"` - cd "$dirname_prg" - - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi - done - - cd "$saveddir" - - PROPEL_GEN_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - PROPEL_GEN_HOME=`cd "$PROPEL_GEN_HOME" && pwd` - - # make it available in PHP via getenv("PROPEL_GEN_HOME") - export PROPEL_GEN_HOME - -fi - -if [ -z "$PHING_COMMAND" ] ; then - # echo "WARNING: PHING_COMMAND environment not set. (Assuming phing on PATH)" - export PHING_COMMAND="phing" -fi - -if [ $# = 1 ] ; then - $PHING_COMMAND -f $PROPEL_GEN_HOME/build.xml -Dusing.propel-gen=true -Dproject.dir=$saveddir $* -else - $PHING_COMMAND -f $PROPEL_GEN_HOME/build.xml -Dusing.propel-gen=true -Dproject.dir=$* -fi diff --git a/airtime_mvc/library/propel/generator/build-propel.xml b/airtime_mvc/library/propel/generator/build-propel.xml deleted file mode 100644 index 0365442485..0000000000 --- a/airtime_mvc/library/propel/generator/build-propel.xml +++ /dev/null @@ -1,513 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ATTENTION: It appears you are using PostgreSQL and you have identifier-quoting turned on. - It is suggested that you disable identifier quoting when using PostgreSQL -- especially if you - have case-sensitive columns in your database. - - To disable identifier quoting, add the following property to your build.properties (or specify - it using -D on commandline): - - propel.disableIdentifierQuoting=true - - You can ignore this warning if you understand the issues related to case-sensitivity and Propel's - DDL-only implementation of identifier quoting. - - - - - - - - - - - - ATTENTION: It appears you are using the mysqli driver. - - This driver is no longer supported by Propel because Propel now uses PDO for database connections. - Please use mysqli driver instead. - Use 'mysql' instead of 'mysqli' for your propel.database property. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Output file: ${propel.runtime.phpconf.file} - XMLFile: ${propel.conf.dir}/${propel.runtime.conf.file} - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/build.properties-sample b/airtime_mvc/library/propel/generator/build.properties-sample deleted file mode 100644 index e94312a218..0000000000 --- a/airtime_mvc/library/propel/generator/build.properties-sample +++ /dev/null @@ -1,192 +0,0 @@ -# ------------------------------------------------------------------- -# -# P R O P E L C O N F I G U R A T I O N F I L E -# -# ------------------------------------------------------------------- -# This file contains some example properties. Ideally properties -# should be specified in the project-specific build.properties file; -# however, this file can be used to specify non-default properties -# that you would like to use accross all of your Propel projects. -# ------------------------------------------------------------------- -# - -propel.home = . - -# ------------------------------------------------------------------- -# -# P R O J E C T -# -# ------------------------------------------------------------------- -# This is the name of your Propel project. The name of your Propel -# project is used (by default) to determine where the generator will -# find needed configuration files and will place resuilting build -# files. E.g. if your project is named 'killerapp', Propel will -# look here for schema.xml and runtime-conf.xml files: -# -# projects/killerapp/ -# -# ------------------------------------------------------------------- - -# You can set this here, but it's preferrable to set this in a -# project-specific build.properties file. -# -# propel.project = bookstore - -# ------------------------------------------------------------------- -# -# T A R G E T D A T A B A S E -# -# ------------------------------------------------------------------- -# This is the target database, only considered when generating -# the SQL for your Propel project. Your possible choices are: -# -# mssql, mysql, oracle, pgsql, sqlite -# ------------------------------------------------------------------- - -# You can set this here, but it's preferrable to set this in a -# project-specific build.properties file. -# -# propel.database = mysql - -# ------------------------------------------------------------------- -# -# O B J E C T M O D E L I N F O R M A T I O N -# -# ------------------------------------------------------------------- -# These settings will allow you to customize the way your -# Peer-based object model is created. -# ------------------------------------------------------------------- -# addGenericAccessors -# If true, Propel adds methods to get database fields by name/position. -# -# addGenericMutators -# If true, Propel adds methods to set database fields by name/position. -# -# addSaveMethod -# If true, Propel adds tracking code to determine how to save objects. -# -# addTimeStamp -# If true, Propel true puts time stamps in phpdoc of generated om files. -# -# basePrefix -# A string to pre-pend to the file names of base data and peer objects. -# -# complexObjectModel -# If true, Propel generates data objects with collection support and -# methods to easily retreive foreign key relationships. -# -# targetPackage -# Sets the PHP "package" the om files will generated to, e.g. -# "com.company.project.om". -# -# targetPlatform -# Sets whether Propel is building classes for php5 (default) -# or php4 (experimental). -# -# packageObjectModel -# Sets whether Propel is packaging ObjectModel fro several -# [package].schema.xml files. The -# attribute has to be set then. (warning: this is experimental!) -# -# ------------------------------------------------------------------- - -# classes will be put in (and included from) this directory -# e.g. if package is "bookstore" then om will expect include('bookstore/Book.php'); to work. -# use dot-path notation -- e.g. my.bookstore -> my/bookstore. -# -propel.targetPackage = ${propel.project} - -propel.addGenericAccessors = false -propel.addGenericMutators = false -propel.addSaveMethod = true -propel.addTimeStamp = true -propel.basePrefix = Base -propel.complexObjectModel = true -propel.targetPlatform = php5 -propel.packageObjectModel = false - -# ------------------------------------------------------------------- -# -# D B C O N N E C T I O N S E T T I N G S -# -# ------------------------------------------------------------------- -# PDO connection settings. These connection settings are used by -# build tagets that perform database operations (e.g. 'insert-sql', -# 'reverse'). -# -# You can set them here, but it's preferrable to set these properties -# in a project-specific build.properties file. -# - -# If you want to use a custom driver, specify it below, otherwise -# leave it blank or comment it out to use Creole stock driver. -# -# propel.database.driver = creole.drivers.sqlite.SQLiteConnection - -# Note that if you do not wish to specify the database (e.g. if you -# are using multiple databses) you can use the @DB@ token which -# will be replaced with a database at runtime. -# -# propel.database.url = mysql:host=$host;dbname=$database - -# For MySQL or Oracle, you also need to specify username & password -# propel.database.user = [db username] -# propel.database.password = [db password] - -# Use the URL below to specify a DSN to used to create the database. -# Note that this URL should not contain the database name, as you will -# get an error if the database does not exist. -# (This does not apply to SQLite since the databse is automatically created -# when the connection is made -- if it does not already exist.) -# -# propel.database.createUrl = mysql:host=$host;dbname=$database - - -# ------------------------------------------------------------------- -# -# D A T A B A S E TO X M L -# -# ------------------------------------------------------------------- -# -# samePhpName -# If true, the reverse task will set the phpName attribute for the -# tables and columns to be the same as SQL name. -# -# addVendorInfo -# If true, the reverse task will add vendor specific information -# to the database schema -# -# addValidators -# Bitfield like option to turn on/off addition of Validator and -# Rule tags to the schema. Uses a boolean syntax like in php.ini. -# Allowed tokens are: -# none add no validators) -# all add all validators) -# maxlength add maxlengths for string type columns) -# maxvalue add maxvalue for numeric columns) -# type add notmatch validators for numeric columns) -# required add required validators for required columns) -# unique add unique validators for unique indexes) -# Allowed operators are: -# & bitwise AND -# | bitwise OR -# ~ bitwise NOT -# -# ------------------------------------------------------------------- - -# propel.samePhpName = false -# propel.addVendorInfo=true -# propel.addValidators=none - - -# ------------------------------------------------------------------- -# -# D A T A B A S E B U I L D C O N F I G -# -# ------------------------------------------------------------------- -# Some databases provide some configuration options that can be set -# in this script. -# -# === MySQL -# propel.mysql.tableType -# Use this property to set the table type of generated tables (e.g. InnoDB, MyISAM). diff --git a/airtime_mvc/library/propel/generator/build.xml b/airtime_mvc/library/propel/generator/build.xml deleted file mode 100644 index 5005dae112..0000000000 --- a/airtime_mvc/library/propel/generator/build.xml +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Project name - - - - - No project.dir was specified, using default path: ./projects/${project} - - - - - - - - Processing additional properties file: ${additional.properties} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/airtime_mvc/library/propel/generator/build.xml-local b/airtime_mvc/library/propel/generator/build.xml-local deleted file mode 100644 index ff57c3b2b8..0000000000 --- a/airtime_mvc/library/propel/generator/build.xml-local +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/airtime_mvc/library/propel/generator/default.properties b/airtime_mvc/library/propel/generator/default.properties deleted file mode 100644 index 3d914e514b..0000000000 --- a/airtime_mvc/library/propel/generator/default.properties +++ /dev/null @@ -1,267 +0,0 @@ -# ------------------------------------------------------------------- -# -# D E F A U L T P R O P E R T I E S -# -# ------------------------------------------------------------------- -# This file sets default properties. You can override any of these -# by specifying your new value in the build.properties file for your -# project or a top-level build.properties file. Either way, you -# should not need to edit this file. -# ------------------------------------------------------------------- - - -# ------------------------------------------------------------------- -# -# B A S I C P R O P E R T I E S -# -# ------------------------------------------------------------------- - -propel.version = 1.5.2 - -propel.home = . - -propel.project = -propel.database = -propel.targetPackage = ${propel.project} -propel.runOnlyOnSchemaChange = false - -# Default behavior settings -# -propel.targetPlatform = php5 -propel.packageObjectModel = false -propel.useDateTimeClass = true -propel.dateTimeClass = DateTime - -propel.schema.validate = true -propel.schema.transform = false - -# controls what type of joins will be used in the doSelectJoin*() peer methods, -# if set to true, LEFT JOINS will be used, INNER JOINS otherwise -# see ticket #491, #588 -propel.useLeftJoinsInDoJoinMethods = true - -# ------------------------------------------------------------------- -# -# D A T A B A S E S E T T I N G S -# -# ------------------------------------------------------------------- - -propel.database.url = -propel.database.buildUrl = ${propel.database.url} -propel.database.createUrl = ${propel.database.buildUrl} - -propel.database.driver = - -propel.database.schema = -propel.database.encoding = -propel.database.manualCreation = false - -# if these arent blank then when we try to connect with insert-sql to a database -# that doesnt require them and it isnt in the build.properties it sends -# the ${blah} for the username and password -propel.database.user = -propel.database.password = - -# ------------------------------------------------------------------- -# -# D A T A B A S E T O X M L S E T T I N G S -# -# ------------------------------------------------------------------- - -propel.samePhpName = false -propel.addVendorInfo = false -propel.addValidators = none - -# ------------------------------------------------------------------- -# -# T E M P L A T E V A R I A B L E S -# -# ------------------------------------------------------------------- - -propel.addGenericAccessors = true -propel.addGenericMutators = true -propel.addSaveMethod = true -propel.addTimeStamp = false -propel.addValidateMethod = true -propel.addIncludes = false -propel.addHooks = true -propel.basePrefix = Base -propel.saveException = PropelException -propel.emulateForeignKeyConstraints = false - -# Identifier quoting is only implemented at the DDL layer at this point. -# Since this may result in undesired behavior (especially in Postgres), -# it can be disabled by setting this property to true in your build.properties file. -propel.disableIdentifierQuoting = false - -# These are the default formats that will be used when fetching values -# from temporal columns in Propel. You can always specify these when -# calling the methods directly, but for methods like getByName() -# it is nice to change the defaults. - -propel.defaultTimeStampFormat = Y-m-d H:i:s -propel.defaultTimeFormat = %X -propel.defaultDateFormat = %x - -propel.namespace.om = om -propel.namespace.map = map -propel.namespace.autoPackage = false - -propel.omtar.src.base = false -propel.omtar.src.extension = false -propel.omtar.bin.base = false -propel.omtar.bin.extension = false -propel.omtar.deleteFiles = false - -# ------------------------------------------------------------------- -# -# D I R E C T O R I E S -# -# ------------------------------------------------------------------- - -propel.project.dir = ${propel.home}/projects/${propel.project} - -propel.output.dir = ${propel.project.dir}/build -propel.schema.dir = ${propel.project.dir} -propel.templatePath = ${propel.home}/templates -propel.conf.dir = ${propel.project.dir} - -propel.doc.dir = ${propel.output.dir}/doc -propel.php.dir = ${propel.output.dir}/classes -propel.phpconf.dir = ${propel.output.dir}/conf -propel.phpdoc.dir = ${propel.output.dir}/phpdoc -propel.sql.dir = ${propel.output.dir}/sql -propel.graph.dir = ${propel.output.dir}/graph -propel.omtar.dir = ${propel.output.dir} - -# ------------------------------------------------------------------- -# -# D E F A U L T F I L E N A M ES -# -# ------------------------------------------------------------------- - -# propel.sqlfile - -propel.runtime.conf.file = runtime-conf.xml -propel.runtime.phpconf.file = ${propel.project}-conf.php -propel.runtime.phpconf-classmap.file = ${propel.project}-classmap.php -propel.default.schema.basename = schema - -# Can't use because of inconsistencies in where the files -# are named (some from build-propel.xml, but some from within templates) -# propel.default.data.basename = ${propel.project}-data - -propel.schema.xsd.file = ${propel.home}/resources/xsd/database.xsd -propel.schema.xsl.file = ${propel.home}/resources/xsl/database.xsl - -# ------------------------------------------------------------------- -# -# I N C L U D E A N D E X C L U D E S E T T I N G S -# -# ------------------------------------------------------------------- - -propel.schema.sql.includes = *schema.xml -propel.schema.sql.excludes = -propel.schema.doc.includes = *schema.xml -propel.schema.doc.excludes = -propel.schema.create-db.includes = *schema.xml -propel.schema.create-db.excludes = -propel.schema.init-sql.includes = *schema.xml -propel.schema.init-sql.excludes = id-table-schema.xml -propel.schema.om.includes = *schema.xml -propel.schema.om.excludes = id-table-schema.xml -propel.schema.datadtd.includes = *schema.xml -propel.schema.datadtd.excludes = id-table-schema.xml - -# ------------------------------------------------------------------- -# -# M A P P E R S E T T I N G S -# -# ------------------------------------------------------------------- - -# (note: data xml files are selected based on datadbmap file) -propel.datasql.mapper.from = *.xml -propel.datasql.mapper.to = *.sql - -propel.datadump.mapper.from = *schema.xml -propel.datadump.mapper.to = *data.xml - -propel.datadtd.mapper.from = *.xml -propel.datadtd.mapper.to = *.dtd - -propel.sql.mapper.from = *.xml -propel.sql.mapper.to = *.sql - - -# ------------------------------------------------------------------- -# -# B U I L D E R S E T T I N G S -# -# ------------------------------------------------------------------- - -# Object Model builders -propel.builder.peer.class = builder.om.PHP5PeerBuilder -propel.builder.object.class = builder.om.PHP5ObjectBuilder -propel.builder.objectstub.class = builder.om.PHP5ExtensionObjectBuilder -propel.builder.peerstub.class = builder.om.PHP5ExtensionPeerBuilder - -propel.builder.objectmultiextend.class = builder.om.PHP5MultiExtendObjectBuilder - -propel.builder.tablemap.class = builder.om.PHP5TableMapBuilder -propel.builder.query.class = builder.om.QueryBuilder -propel.builder.querystub.class = builder.om.ExtensionQueryBuilder -propel.builder.queryinheritance.class = builder.om.QueryInheritanceBuilder -propel.builder.queryinheritancestub.class = builder.om.ExtensionQueryInheritanceBuilder - -propel.builder.interface.class = builder.om.PHP5InterfaceBuilder - -propel.builder.node.class = builder.om.PHP5NodeBuilder -propel.builder.nodepeer.class = builder.om.PHP5NodePeerBuilder -propel.builder.nodestub.class = builder.om.PHP5ExtensionNodeBuilder -propel.builder.nodepeerstub.class = builder.om.PHP5ExtensionNodePeerBuilder - -propel.builder.nestedset.class = builder.om.PHP5NestedSetBuilder -propel.builder.nestedsetpeer.class = builder.om.PHP5NestedSetPeerBuilder - -propel.builder.pluralizer.class = builder.util.DefaultEnglishPluralizer - -# SQL builders - -propel.builder.ddl.class = builder.sql.${propel.database}.${propel.database}DDLBuilder -propel.builder.datasql.class = builder.sql.${propel.database}.${propel.database}DataSQLBuilder - -# Platform classes - -propel.platform.class = platform.${propel.database}Platform - -# Schema Parser (reverse-engineering) classes - -propel.reverse.parser.class = reverse.${propel.database}.${propel.database}SchemaParser - -# ------------------------------------------------------------------- -# -# M Y S Q L S P E C I F I C S E T T I N G S -# -# ------------------------------------------------------------------- - -# Default table type -propel.mysqlTableType = MyISAM -# Keyword used to specify table type. MYSQL < 5 should use TYPE instead -propel.mysqlTableEngineKeyword = ENGINE - -# ------------------------------------------------------------------- -# -# B E H A V I O R S E T T I N G S -# -# ------------------------------------------------------------------- - -propel.behavior.timestampable.class = behavior.TimestampableBehavior -propel.behavior.alternative_coding_standards.class = behavior.AlternativeCodingStandardsBehavior -propel.behavior.soft_delete.class = behavior.SoftDeleteBehavior -propel.behavior.auto_add_pk.class = behavior.AutoAddPkBehavior -propel.behavior.nested_set.class = behavior.nestedset.NestedSetBehavior -propel.behavior.sortable.class = behavior.sortable.SortableBehavior -propel.behavior.sluggable.class = behavior.sluggable.SluggableBehavior -propel.behavior.concrete_inheritance.class = behavior.concrete_inheritance.ConcreteInheritanceBehavior -propel.behavior.query_cache.class = behavior.query_cache.QueryCacheBehavior -propel.behavior.aggregate_column.class = behavior.aggregate_column.AggregateColumnBehavior \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/AlternativeCodingStandardsBehavior.php b/airtime_mvc/library/propel/generator/lib/behavior/AlternativeCodingStandardsBehavior.php deleted file mode 100644 index d9a9de6e20..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/AlternativeCodingStandardsBehavior.php +++ /dev/null @@ -1,133 +0,0 @@ - 'true', - 'remove_closing_comments' => 'true', - 'use_whitespace' => 'true', - 'tab_size' => 2, - 'strip_comments' => 'false' - ); - - public function objectFilter(&$script) - { - return $this->filter($script); - } - - public function extensionObjectFilter(&$script) - { - return $this->filter($script); - } - - public function queryFilter(&$script) - { - return $this->filter($script); - } - - public function extensionQueryFilter(&$script) - { - return $this->filter($script); - } - - public function peerFilter(&$script) - { - return $this->filter($script); - } - - public function extensionPeerFilter(&$script) - { - return $this->filter($script); - } - - public function tableMapFilter(&$script) - { - return $this->filter($script); - } - - /** - * Transform the coding standards of a PHP sourcecode string - * - * @param string $script A script string to be filtered, passed as reference - */ - protected function filter(&$script) - { - $filter = array(); - if($this->getParameter('brackets_newline') == 'true') { - $filter['#^(\t*)\}\h(else|elseif|catch)(.*)\h\{$#m'] = "$1} -$1$2$3 -$1{"; - $filter['#^(\t*)(\w.*)\h\{$#m'] = "$1$2 -$1{"; - } - if ($this->getParameter('remove_closing_comments') == 'true') { - $filter['#^(\t*)} //.*$#m'] = "$1}"; - } - if ($this->getParameter('use_whitespace') == 'true') { - $filter['#\t#'] = str_repeat(' ', $this->getParameter('tab_size')); - } - - $script = preg_replace(array_keys($filter), array_values($filter), $script); - - if ($this->getParameter('strip_comments') == 'true') { - $script = self::stripComments($script); - } - } - - /** - * Remove inline and codeblock comments from a PHP code string - * @param string $code The input code - * @return string The input code, without comments - */ - public static function stripComments($code) - { - $output = ''; - $commentTokens = array(T_COMMENT, T_DOC_COMMENT); - foreach (token_get_all($code) as $token) { - if (is_array($token)) { - if (in_array($token[0], $commentTokens)) continue; - $token = $token[1]; - } - $output .= $token; - } - - return $output; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/AutoAddPkBehavior.php b/airtime_mvc/library/propel/generator/lib/behavior/AutoAddPkBehavior.php deleted file mode 100644 index 10b8f4edb9..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/AutoAddPkBehavior.php +++ /dev/null @@ -1,54 +0,0 @@ - 'id', - 'autoIncrement' => 'true', - 'type' => 'INTEGER' - ); - - /** - * Copy the behavior to the database tables - * Only for tables that have no Pk - */ - public function modifyDatabase() - { - foreach ($this->getDatabase()->getTables() as $table) { - if(!$table->hasPrimaryKey()) { - $b = clone $this; - $table->addBehavior($b); - } - } - } - - /** - * Add the primary key to the current table - */ - public function modifyTable() - { - $table = $this->getTable(); - if (!$table->hasPrimaryKey() && !$table->hasBehavior('concrete_inheritance')) { - $columnAttributes = array_merge(array('primaryKey' => 'true'), $this->getParameters()); - $this->getTable()->addColumn($columnAttributes); - } - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/SoftDeleteBehavior.php b/airtime_mvc/library/propel/generator/lib/behavior/SoftDeleteBehavior.php deleted file mode 100644 index f87bec0bb1..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/SoftDeleteBehavior.php +++ /dev/null @@ -1,467 +0,0 @@ - 'deleted_at', - ); - - /** - * Add the deleted_column to the current table - */ - public function modifyTable() - { - if(!$this->getTable()->containsColumn($this->getParameter('deleted_column'))) { - $this->getTable()->addColumn(array( - 'name' => $this->getParameter('deleted_column'), - 'type' => 'TIMESTAMP' - )); - } - } - - protected function getColumnSetter() - { - return 'set' . $this->getColumnForParameter('deleted_column')->getPhpName(); - } - - public function objectMethods($builder) - { - $script = ''; - $this->addObjectForceDelete($script); - $this->addObjectUndelete($script); - return $script; - } - - public function addObjectForceDelete(&$script) - { - $script .= " -/** - * Bypass the soft_delete behavior and force a hard delete of the current object - */ -public function forceDelete(PropelPDO \$con = null) -{ - {$this->getTable()->getPhpName()}Peer::disableSoftDelete(); - \$this->delete(\$con); -} -"; - } - - public function addObjectUndelete(&$script) - { - $script .= " -/** - * Undelete a row that was soft_deleted - * - * @return int The number of rows affected by this update and any referring fk objects' save() operations. - */ -public function unDelete(PropelPDO \$con = null) -{ - \$this->{$this->getColumnSetter()}(null); - return \$this->save(\$con); -} -"; - } - - public function preDelete($builder) - { - return <<getStubQueryBuilder()->getClassname()}::isSoftDeleteEnabled()) { - \$this->{$this->getColumnSetter()}(time()); - \$this->save(\$con); - \$con->commit(); - {$builder->getStubPeerBuilder()->getClassname()}::removeInstanceFromPool(\$this); - return; -} -EOT; - } - - public function queryAttributes() - { - return "protected static \$softDelete = true; -protected \$localSoftDelete = true; -"; - } - - public function queryMethods($builder) - { - $this->builder = $builder; - $script = ''; - $this->addQueryIncludeDeleted($script); - $this->addQuerySoftDelete($script); - $this->addQueryForceDelete($script); - $this->addQueryForceDeleteAll($script); - $this->addQueryUnDelete($script); - $this->addQueryEnableSoftDelete($script); - $this->addQueryDisableSoftDelete($script); - $this->addQueryIsSoftDeleteEnabled($script); - - return $script; - } - - public function addQueryIncludeDeleted(&$script) - { - $script .= " -/** - * Temporarily disable the filter on deleted rows - * Valid only for the current query - * - * @see {$this->builder->getStubQueryBuilder()->getClassname()}::disableSoftDelete() to disable the filter for more than one query - * - * @return {$this->builder->getStubQueryBuilder()->getClassname()} The current query, for fuid interface - */ -public function includeDeleted() -{ - \$this->localSoftDelete = false; - return \$this; -} -"; - } - - public function addQuerySoftDelete(&$script) - { - $script .= " -/** - * Soft delete the selected rows - * - * @param PropelPDO \$con an optional connection object - * - * @return int Number of updated rows - */ -public function softDelete(PropelPDO \$con = null) -{ - return \$this->update(array('{$this->getColumnForParameter('deleted_column')->getPhpName()}' => time()), \$con); -} -"; - } - - public function addQueryForceDelete(&$script) - { - $script .= " -/** - * Bypass the soft_delete behavior and force a hard delete of the selected rows - * - * @param PropelPDO \$con an optional connection object - * - * @return int Number of deleted rows - */ -public function forceDelete(PropelPDO \$con = null) -{ - return {$this->builder->getPeerClassname()}::doForceDelete(\$this, \$con); -} -"; - } - - public function addQueryForceDeleteAll(&$script) - { - $script .= " -/** - * Bypass the soft_delete behavior and force a hard delete of all the rows - * - * @param PropelPDO \$con an optional connection object - * - * @return int Number of deleted rows - */ -public function forceDeleteAll(PropelPDO \$con = null) -{ - return {$this->builder->getPeerClassname()}::doForceDeleteAll(\$con);} -"; - } - - public function addQueryUnDelete(&$script) - { - $script .= " -/** - * Undelete selected rows - * - * @param PropelPDO \$con an optional connection object - * - * @return int The number of rows affected by this update and any referring fk objects' save() operations. - */ -public function unDelete(PropelPDO \$con = null) -{ - return \$this->update(array('{$this->getColumnForParameter('deleted_column')->getPhpName()}' => null), \$con); -} -"; - } - - public function addQueryEnableSoftDelete(&$script) - { - $script .= " -/** - * Enable the soft_delete behavior for this model - */ -public static function enableSoftDelete() -{ - self::\$softDelete = true; -} -"; - } - - public function addQueryDisableSoftDelete(&$script) - { - $script .= " -/** - * Disable the soft_delete behavior for this model - */ -public static function disableSoftDelete() -{ - self::\$softDelete = false; -} -"; - } - - public function addQueryIsSoftDeleteEnabled(&$script) - { - $script .= " -/** - * Check the soft_delete behavior for this model - * - * @return boolean true if the soft_delete behavior is enabled - */ -public static function isSoftDeleteEnabled() -{ - return self::\$softDelete; -} -"; - } - - public function preSelectQuery($builder) - { - return <<getStubQueryBuilder()->getClassname()}::isSoftDeleteEnabled() && \$this->localSoftDelete) { - \$this->addUsingAlias({$this->getColumnForParameter('deleted_column')->getConstantName()}, null, Criteria::ISNULL); -} else { - {$this->getTable()->getPhpName()}Peer::enableSoftDelete(); -} -EOT; - } - - public function preDeleteQuery($builder) - { - return <<getStubQueryBuilder()->getClassname()}::isSoftDeleteEnabled() && \$this->localSoftDelete) { - return \$this->softDelete(\$con); -} else { - return \$this->hasWhereClause() ? \$this->forceDelete(\$con) : \$this->forceDeleteAll(\$con); -} -EOT; - } - - public function staticMethods($builder) - { - $builder->declareClassFromBuilder($builder->getStubQueryBuilder()); - $this->builder = $builder; - $script = ''; - $this->addPeerEnableSoftDelete($script); - $this->addPeerDisableSoftDelete($script); - $this->addPeerIsSoftDeleteEnabled($script); - $this->addPeerDoSoftDelete($script); - $this->addPeerDoDelete2($script); - $this->addPeerDoSoftDeleteAll($script); - $this->addPeerDoDeleteAll2($script); - - return $script; - } - - public function addPeerEnableSoftDelete(&$script) - { - $script .= " -/** - * Enable the soft_delete behavior for this model - */ -public static function enableSoftDelete() -{ - {$this->builder->getStubQueryBuilder()->getClassname()}::enableSoftDelete(); - // some soft_deleted objects may be in the instance pool - {$this->builder->getStubPeerBuilder()->getClassname()}::clearInstancePool(); -} -"; - } - - public function addPeerDisableSoftDelete(&$script) - { - $script .= " -/** - * Disable the soft_delete behavior for this model - */ -public static function disableSoftDelete() -{ - {$this->builder->getStubQueryBuilder()->getClassname()}::disableSoftDelete(); -} -"; - } - - public function addPeerIsSoftDeleteEnabled(&$script) - { - $script .= " -/** - * Check the soft_delete behavior for this model - * @return boolean true if the soft_delete behavior is enabled - */ -public static function isSoftDeleteEnabled() -{ - return {$this->builder->getStubQueryBuilder()->getClassname()}::isSoftDeleteEnabled(); -} -"; - } - - public function addPeerDoSoftDelete(&$script) - { - $script .= " -/** - * Soft delete records, given a {$this->getTable()->getPhpName()} or Criteria object OR a primary key value. - * - * @param mixed \$values Criteria or {$this->getTable()->getPhpName()} object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO \$con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ -public static function doSoftDelete(\$values, PropelPDO \$con = null) -{ - if (\$values instanceof Criteria) { - // rename for clarity - \$criteria = clone \$values; - } elseif (\$values instanceof {$this->getTable()->getPhpName()}) { - // create criteria based on pk values - \$criteria = \$values->buildPkeyCriteria(); - } else { - // it must be the primary key - \$criteria = new Criteria(self::DATABASE_NAME);"; - $pks = $this->getTable()->getPrimaryKey(); - if (count($pks)>1) { - $i = 0; - foreach ($pks as $col) { - $script .= " - \$criteria->add({$col->getConstantName()}, \$values[$i], Criteria::EQUAL);"; - $i++; - } - } else { - $col = $pks[0]; - $script .= " - \$criteria->add({$col->getConstantName()}, (array) \$values, Criteria::IN);"; - } - $script .= " - } - \$criteria->add({$this->getColumnForParameter('deleted_column')->getConstantName()}, time()); - return {$this->getTable()->getPhpName()}Peer::doUpdate(\$criteria, \$con); -} -"; - } - - public function addPeerDoDelete2(&$script) - { - $script .= " -/** - * Delete or soft delete records, depending on {$this->getTable()->getPhpName()}Peer::\$softDelete - * - * @param mixed \$values Criteria or {$this->getTable()->getPhpName()} object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO \$con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ -public static function doDelete2(\$values, PropelPDO \$con = null) -{ - if ({$this->getTable()->getPhpName()}Peer::isSoftDeleteEnabled()) { - return {$this->getTable()->getPhpName()}Peer::doSoftDelete(\$values, \$con); - } else { - return {$this->getTable()->getPhpName()}Peer::doForceDelete(\$values, \$con); - } -}"; - } - - public function addPeerDoSoftDeleteAll(&$script) - { - $script .= " -/** - * Method to soft delete all rows from the {$this->getTable()->getName()} table. - * - * @param PropelPDO \$con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ -public static function doSoftDeleteAll(PropelPDO \$con = null) -{ - if (\$con === null) { - \$con = Propel::getConnection({$this->getTable()->getPhpName()}Peer::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - \$selectCriteria = new Criteria(); - \$selectCriteria->add({$this->getColumnForParameter('deleted_column')->getConstantName()}, null, Criteria::ISNULL); - \$selectCriteria->setDbName({$this->getTable()->getPhpName()}Peer::DATABASE_NAME); - \$modifyCriteria = new Criteria(); - \$modifyCriteria->add({$this->getColumnForParameter('deleted_column')->getConstantName()}, time()); - return BasePeer::doUpdate(\$selectCriteria, \$modifyCriteria, \$con); -} -"; - } - - public function addPeerDoDeleteAll2(&$script) - { - $script .= " -/** - * Delete or soft delete all records, depending on {$this->getTable()->getPhpName()}Peer::\$softDelete - * - * @param PropelPDO \$con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ -public static function doDeleteAll2(PropelPDO \$con = null) -{ - if ({$this->getTable()->getPhpName()}Peer::isSoftDeleteEnabled()) { - return {$this->getTable()->getPhpName()}Peer::doSoftDeleteAll(\$con); - } else { - return {$this->getTable()->getPhpName()}Peer::doForceDeleteAll(\$con); - } -} -"; - } - - public function preSelect($builder) - { - return <<getStubQueryBuilder()->getClassname()}::isSoftDeleteEnabled()) { - \$criteria->add({$this->getColumnForParameter('deleted_column')->getConstantName()}, null, Criteria::ISNULL); -} else { - {$this->getTable()->getPhpName()}Peer::enableSoftDelete(); -} -EOT; - } - - public function peerFilter(&$script) - { - $script = str_replace(array( - 'public static function doDelete(', - 'public static function doDelete2(', - 'public static function doDeleteAll(', - 'public static function doDeleteAll2(' - ), array( - 'public static function doForceDelete(', - 'public static function doDelete(', - 'public static function doForceDeleteAll(', - 'public static function doDeleteAll(' - ), $script); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/TimestampableBehavior.php b/airtime_mvc/library/propel/generator/lib/behavior/TimestampableBehavior.php deleted file mode 100644 index bf73b76690..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/TimestampableBehavior.php +++ /dev/null @@ -1,171 +0,0 @@ - 'created_at', - 'update_column' => 'updated_at' - ); - - /** - * Add the create_column and update_columns to the current table - */ - public function modifyTable() - { - if(!$this->getTable()->containsColumn($this->getParameter('create_column'))) { - $this->getTable()->addColumn(array( - 'name' => $this->getParameter('create_column'), - 'type' => 'TIMESTAMP' - )); - } - if(!$this->getTable()->containsColumn($this->getParameter('update_column'))) { - $this->getTable()->addColumn(array( - 'name' => $this->getParameter('update_column'), - 'type' => 'TIMESTAMP' - )); - } - } - - /** - * Get the setter of one of the columns of the behavior - * - * @param string $column One of the behavior colums, 'create_column' or 'update_column' - * @return string The related setter, 'setCreatedOn' or 'setUpdatedOn' - */ - protected function getColumnSetter($column) - { - return 'set' . $this->getColumnForParameter($column)->getPhpName(); - } - - /** - * Add code in ObjectBuilder::preUpdate - * - * @return string The code to put at the hook - */ - public function preUpdate() - { - return "if (\$this->isModified() && !\$this->isColumnModified(" . $this->getColumnForParameter('update_column')->getConstantName() . ")) { - \$this->" . $this->getColumnSetter('update_column') . "(time()); -}"; - } - - /** - * Add code in ObjectBuilder::preInsert - * - * @return string The code to put at the hook - */ - public function preInsert() - { - return "if (!\$this->isColumnModified(" . $this->getColumnForParameter('create_column')->getConstantName() . ")) { - \$this->" . $this->getColumnSetter('create_column') . "(time()); -} -if (!\$this->isColumnModified(" . $this->getColumnForParameter('update_column')->getConstantName() . ")) { - \$this->" . $this->getColumnSetter('update_column') . "(time()); -}"; - } - - public function objectMethods($builder) - { - return " -/** - * Mark the current object so that the update date doesn't get updated during next save - * - * @return " . $builder->getStubObjectBuilder()->getClassname() . " The current object (for fluent API support) - */ -public function keepUpdateDateUnchanged() -{ - \$this->modifiedColumns[] = " . $this->getColumnForParameter('update_column')->getConstantName() . "; - return \$this; -} -"; - } - - public function queryMethods($builder) - { - $queryClassName = $builder->getStubQueryBuilder()->getClassname(); - $updateColumnConstant = $this->getColumnForParameter('update_column')->getConstantName(); - $createColumnConstant = $this->getColumnForParameter('create_column')->getConstantName(); - return " -/** - * Filter by the latest updated - * - * @param int \$nbDays Maximum age of the latest update in days - * - * @return $queryClassName The current query, for fuid interface - */ -public function recentlyUpdated(\$nbDays = 7) -{ - return \$this->addUsingAlias($updateColumnConstant, time() - \$nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL); -} - -/** - * Filter by the latest created - * - * @param int \$nbDays Maximum age of in days - * - * @return $queryClassName The current query, for fuid interface - */ -public function recentlyCreated(\$nbDays = 7) -{ - return \$this->addUsingAlias($createColumnConstant, time() - \$nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL); -} - -/** - * Order by update date desc - * - * @return $queryClassName The current query, for fuid interface - */ -public function lastUpdatedFirst() -{ - return \$this->addDescendingOrderByColumn($updateColumnConstant); -} - -/** - * Order by update date asc - * - * @return $queryClassName The current query, for fuid interface - */ -public function firstUpdatedFirst() -{ - return \$this->addAscendingOrderByColumn($updateColumnConstant); -} - -/** - * Order by create date desc - * - * @return $queryClassName The current query, for fuid interface - */ -public function lastCreatedFirst() -{ - return \$this->addDescendingOrderByColumn($createColumnConstant); -} - -/** - * Order by create date asc - * - * @return $queryClassName The current query, for fuid interface - */ -public function firstCreatedFirst() -{ - return \$this->addAscendingOrderByColumn($createColumnConstant); -} -"; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/AggregateColumnBehavior.php b/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/AggregateColumnBehavior.php deleted file mode 100644 index 16a9964663..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/AggregateColumnBehavior.php +++ /dev/null @@ -1,122 +0,0 @@ - null, - 'expression' => null, - 'foreign_table' => null, - ); - - /** - * Add the aggregate key to the current table - */ - public function modifyTable() - { - $table = $this->getTable(); - if (!$columnName = $this->getParameter('name')) { - throw new InvalidArgumentException(sprintf('You must define a \'name\' parameter for the \'aggregate_column\' behavior in the \'%s\' table', $table->getName())); - } - - // add the aggregate column if not present - if(!$this->getTable()->containsColumn($columnName)) { - $column = $this->getTable()->addColumn(array( - 'name' => $columnName, - 'type' => 'INTEGER', - )); - } - - // add a behavior in the foreign table to autoupdate the aggregate column - $foreignTable = $this->getForeignTable(); - if (!$foreignTable->hasBehavior('concrete_inheritance_parent')) { - $relationBehavior = new AggregateColumnRelationBehavior(); - $relationBehavior->setName('aggregate_column_relation'); - $foreignKey = $this->getForeignKey(); - $relationBehavior->addParameter(array('name' => 'foreign_table', 'value' => $table->getName())); - $relationBehavior->addParameter(array('name' => 'update_method', 'value' => 'update' . $this->getColumn()->getPhpName())); - $foreignTable->addBehavior($relationBehavior); - } - } - - public function objectMethods($builder) - { - if (!$foreignTableName = $this->getParameter('foreign_table')) { - throw new InvalidArgumentException(sprintf('You must define a \'foreign_table\' parameter for the \'aggregate_column\' behavior in the \'%s\' table', $this->getTable()->getName())); - } - $script = ''; - $script .= $this->addObjectCompute(); - $script .= $this->addObjectUpdate(); - - return $script; - } - - protected function addObjectCompute() - { - $conditions = array(); - $bindings = array(); - foreach ($this->getForeignKey()->getColumnObjectsMapping() as $index => $columnReference) { - $conditions[] = $columnReference['local']->getFullyQualifiedName() . ' = :p' . ($index + 1); - $bindings[$index + 1] = $columnReference['foreign']->getPhpName(); - } - $sql = sprintf('SELECT %s FROM %s WHERE %s', - $this->getParameter('expression'), - $this->getTable()->getDatabase()->getPlatform()->quoteIdentifier($this->getParameter('foreign_table')), - implode(' AND ', $conditions) - ); - - return $this->renderTemplate('objectCompute', array( - 'column' => $this->getColumn(), - 'sql' => $sql, - 'bindings' => $bindings, - )); - } - - protected function addObjectUpdate() - { - return $this->renderTemplate('objectUpdate', array( - 'column' => $this->getColumn(), - )); - } - - protected function getForeignTable() - { - return $this->getTable()->getDatabase()->getTable($this->getParameter('foreign_table')); - } - - protected function getForeignKey() - { - $foreignTable = $this->getForeignTable(); - // let's infer the relation from the foreign table - $fks = $foreignTable->getForeignKeysReferencingTable($this->getTable()->getName()); - if (!$fks) { - throw new InvalidArgumentException(sprintf('You must define a foreign key to the \'%s\' table in the \'%s\' table to enable the \'aggregate_column\' behavior', $this->getTable()->getName(), $foreignTable->getName())); - } - // FIXME doesn't work when more than one fk to the same table - return array_shift($fks); - } - - protected function getColumn() - { - return $this->getTable()->getColumn($this->getParameter('name')); - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/AggregateColumnRelationBehavior.php b/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/AggregateColumnRelationBehavior.php deleted file mode 100644 index 1fce170a1b..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/AggregateColumnRelationBehavior.php +++ /dev/null @@ -1,164 +0,0 @@ - '', - 'update_method' => '', - ); - - public function postSave($builder) - { - $relationName = $this->getRelationName($builder); - return "\$this->updateRelated{$relationName}(\$con);"; - } - - // no need for a postDelete() hook, since delete() uses Query::delete(), - // which already has a hook - - public function objectAttributes($builder) - { - $relationName = $this->getRelationName($builder); - return "protected \$old{$relationName}; -"; - } - - public function objectMethods($builder) - { - return $this->addObjectUpdateRelated($builder); - } - - protected function addObjectUpdateRelated($builder) - { - $relationName = $this->getRelationName($builder); - $updateMethodName = $this->getParameter('update_method'); - return $this->renderTemplate('objectUpdateRelated', array( - 'relationName' => $relationName, - 'variableName' => self::lcfirst($relationName), - 'updateMethodName' => $this->getParameter('update_method'), - )); - } - - public function objectFilter(&$script, $builder) - { - $relationName = $this->getRelationName($builder); - $relatedClass = $this->getForeignTable()->getPhpName(); - $search = " public function set{$relationName}({$relatedClass} \$v = null) - {"; - $replace = $search . " - // aggregate_column_relation behavior - if (null !== \$this->a{$relationName} && \$v !== \$this->a{$relationName}) { - \$this->old{$relationName} = \$this->a{$relationName}; - }"; - $script = str_replace($search, $replace, $script); - } - - public function preUpdateQuery($builder) - { - return $this->getFindRelated($builder); - } - - public function preDeleteQuery($builder) - { - return $this->getFindRelated($builder); - } - - protected function getFindRelated($builder) - { - $relationName = $this->getRelationName($builder); - return "\$this->findRelated{$relationName}s(\$con);"; - } - - public function postUpdateQuery($builder) - { - return $this->getUpdateRelated($builder); - } - - public function postDeleteQuery($builder) - { - return $this->getUpdateRelated($builder); - } - - protected function getUpdateRelated($builder) - { - $relationName = $this->getRelationName($builder); - return "\$this->updateRelated{$relationName}s(\$con);"; - } - - public function queryMethods($builder) - { - $script = ''; - $script .= $this->addQueryFindRelated($builder); - $script .= $this->addQueryUpdateRelated($builder); - - return $script; - } - - protected function addQueryFindRelated($builder) - { - $foreignKey = $this->getForeignKey(); - $relationName = $this->getRelationName($builder); - return $this->renderTemplate('queryFindRelated', array( - 'foreignTable' => $this->getForeignTable(), - 'relationName' => $relationName, - 'variableName' => self::lcfirst($relationName), - 'foreignQueryName' => $foreignKey->getForeignTable()->getPhpName() . 'Query', - 'refRelationName' => $builder->getRefFKPhpNameAffix($foreignKey), - )); - } - - protected function addQueryUpdateRelated($builder) - { - $relationName = $this->getRelationName($builder); - return $this->renderTemplate('queryUpdateRelated', array( - 'relationName' => $relationName, - 'variableName' => self::lcfirst($relationName), - 'updateMethodName' => $this->getParameter('update_method'), - )); - } - - protected function getForeignTable() - { - return $this->getTable()->getDatabase()->getTable($this->getParameter('foreign_table')); - } - - protected function getForeignKey() - { - $foreignTable = $this->getForeignTable(); - // let's infer the relation from the foreign table - $fks = $this->getTable()->getForeignKeysReferencingTable($foreignTable->getName()); - // FIXME doesn't work when more than one fk to the same table - return array_shift($fks); - } - - protected function getRelationName($builder) - { - return $builder->getFKPhpNameAffix($this->getForeignKey()); - } - - protected static function lcfirst($input) - { - // no lcfirst in php<5.3... - $input[0] = strtolower($input[0]); - return $input; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/objectCompute.php b/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/objectCompute.php deleted file mode 100644 index 00e1838724..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/objectCompute.php +++ /dev/null @@ -1,17 +0,0 @@ - -/** - * Computes the value of the aggregate column getName() ?> - * - * @param PropelPDO $con A connection object - * - * @return mixed The scalar result from the aggregate query - */ -public function computegetPhpName() ?>(PropelPDO $con) -{ - $stmt = $con->prepare(''); - $binding): ?> - $stmt->bindValue(':p', $this->get()); - - $stmt->execute(); - return $stmt->fetchColumn(); -} diff --git a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/objectUpdate.php b/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/objectUpdate.php deleted file mode 100644 index 9236bad3ee..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/objectUpdate.php +++ /dev/null @@ -1,11 +0,0 @@ - -/** - * Updates the aggregate column getName() ?> - * - * @param PropelPDO $con A connection object - */ -public function updategetPhpName() ?>(PropelPDO $con) -{ - $this->setgetPhpName() ?>($this->computegetPhpName() ?>($con)); - $this->save($con); -} diff --git a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/objectUpdateRelated.php b/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/objectUpdateRelated.php deleted file mode 100644 index d5892b0f23..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/objectUpdateRelated.php +++ /dev/null @@ -1,16 +0,0 @@ - -/** - * Update the aggregate column in the related object - * - * @param PropelPDO $con A connection object - */ -protected function updateRelated(PropelPDO $con) -{ - if ($ = $this->get()) { - $->($con); - } - if ($this->old) { - $this->old->($con); - $this->old = null; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/queryFindRelated.php b/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/queryFindRelated.php deleted file mode 100644 index 252adf1959..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/queryFindRelated.php +++ /dev/null @@ -1,20 +0,0 @@ - -/** - * Finds the related getPhpName() ?> objects and keep them for later - * - * @param PropelPDO $con A connection object - */ -protected function findRelateds($con) -{ - $criteria = clone $this; - if ($this->useAliasInSQL) { - $alias = $this->getModelAlias(); - $criteria->removeAlias($alias); - } else { - $alias = ''; - } - $this->s = ::create() - ->join($alias) - ->mergeWith($criteria) - ->find($con); -} diff --git a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/queryUpdateRelated.php b/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/queryUpdateRelated.php deleted file mode 100644 index 056264c557..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/aggregate_column/templates/queryUpdateRelated.php +++ /dev/null @@ -1,8 +0,0 @@ - -protected function updateRelateds($con) -{ - foreach ($this->s as $) { - $->($con); - } - $this->s = array(); -} diff --git a/airtime_mvc/library/propel/generator/lib/behavior/concrete_inheritance/ConcreteInheritanceBehavior.php b/airtime_mvc/library/propel/generator/lib/behavior/concrete_inheritance/ConcreteInheritanceBehavior.php deleted file mode 100644 index 8d5011a94c..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/concrete_inheritance/ConcreteInheritanceBehavior.php +++ /dev/null @@ -1,235 +0,0 @@ - '', - 'descendant_column' => 'descendant_class', - 'copy_data_to_parent' => 'true' - ); - - public function modifyTable() - { - $table = $this->getTable(); - $parentTable = $this->getParentTable(); - - if ($this->isCopyData()) { - // tell the parent table that it has a descendant - if (!$parentTable->hasBehavior('concrete_inheritance_parent')) { - $parentBehavior = new ConcreteInheritanceParentBehavior(); - $parentBehavior->setName('concrete_inheritance_parent'); - $parentBehavior->addParameter(array('name' => 'descendant_column', 'value' => $this->getParameter('descendant_column'))); - $parentTable->addBehavior($parentBehavior); - // The parent table's behavior modifyTable() must be executed before this one - $parentBehavior->getTableModifier()->modifyTable(); - $parentBehavior->setTableModified(true); - } - } - - // Add the columns of the parent table - foreach ($parentTable->getColumns() as $column) { - if ($column->getName() == $this->getParameter('descendant_column')) { - continue; - } - if ($table->containsColumn($column->getName())) { - continue; - } - $copiedColumn = clone $column; - if ($column->isAutoIncrement() && $this->isCopyData()) { - $copiedColumn->setAutoIncrement(false); - } - $table->addColumn($copiedColumn); - if ($column->isPrimaryKey() && $this->isCopyData()) { - $fk = new ForeignKey(); - $fk->setForeignTableName($column->getTable()->getName()); - $fk->setOnDelete('CASCADE'); - $fk->setOnUpdate(null); - $fk->addReference($copiedColumn, $column); - $fk->isParentChild = true; - $table->addForeignKey($fk); - } - } - - // add the foreign keys of the parent table - foreach ($parentTable->getForeignKeys() as $fk) { - $copiedFk = clone $fk; - $copiedFk->setName(''); - $copiedFk->setRefPhpName(''); - $this->getTable()->addForeignKey($copiedFk); - } - - // add the validators of the parent table - foreach ($parentTable->getValidators() as $validator) { - $copiedValidator = clone $validator; - $this->getTable()->addValidator($copiedValidator); - } - - // add the indices of the parent table - foreach ($parentTable->getIndices() as $index) { - $copiedIndex = clone $index; - $copiedIndex->setName(''); - $this->getTable()->addIndex($copiedIndex); - } - - // add the unique indices of the parent table - foreach ($parentTable->getUnices() as $unique) { - $copiedUnique = clone $unique; - $copiedUnique->setName(''); - $this->getTable()->addUnique($copiedUnique); - } - - // give name to newly added foreign keys and indices - // (this is already done for other elements of the current table) - $table->doNaming(); - - // add the Behaviors of the parent table - foreach ($parentTable->getBehaviors() as $behavior) { - if ($behavior->getName() == 'concrete_inheritance_parent' || $behavior->getName() == 'concrete_inheritance') { - continue; - } - $copiedBehavior = clone $behavior; - $this->getTable()->addBehavior($copiedBehavior); - } - - } - - protected function getParentTable() - { - return $this->getTable()->getDatabase()->getTable($this->getParameter('extends')); - } - - protected function isCopyData() - { - return $this->getParameter('copy_data_to_parent') == 'true'; - } - - public function parentClass($builder) - { - switch (get_class($builder)) { - case 'PHP5ObjectBuilder': - return $builder->getNewStubObjectBuilder($this->getParentTable())->getClassname(); - break; - case 'QueryBuilder': - return $builder->getNewStubQueryBuilder($this->getParentTable())->getClassname(); - break; - default: - return null; - break; - } - } - - public function preSave($script) - { - if ($this->isCopyData()) { - return "\$parent = \$this->getSyncParent(\$con); -\$parent->save(\$con); -\$this->setPrimaryKey(\$parent->getPrimaryKey()); -"; - } - } - - public function postDelete($script) - { - if ($this->isCopyData()) { - return "\$this->getParentOrCreate(\$con)->delete(\$con); -"; - } - } - - public function objectMethods($builder) - { - if (!$this->isCopyData()) { - return; - } - $this->builder = $builder; - $script .= ''; - $this->addObjectGetParentOrCreate($script); - $this->addObjectGetSyncParent($script); - - return $script; - } - - protected function addObjectGetParentOrCreate(&$script) - { - $parentTable = $this->getParentTable(); - $parentClass = $this->builder->getNewStubObjectBuilder($parentTable)->getClassname(); - $script .= " -/** - * Get or Create the parent " . $parentClass . " object of the current object - * - * @return " . $parentClass . " The parent object - */ -public function getParentOrCreate(\$con = null) -{ - if (\$this->isNew()) { - \$parent = new " . $parentClass . "(); - \$parent->set" . $this->getParentTable()->getColumn($this->getParameter('descendant_column'))->getPhpName() . "('" . $this->builder->getStubObjectBuilder()->getClassname() . "'); - return \$parent; - } else { - return " . $this->builder->getNewStubQueryBuilder($parentTable)->getClassname() . "::create()->findPk(\$this->getPrimaryKey(), \$con); - } -} -"; - } - - protected function addObjectGetSyncParent(&$script) - { - $parentTable = $this->getParentTable(); - $pkeys = $parentTable->getPrimaryKey(); - $cptype = $pkeys[0]->getPhpType(); - $script .= " -/** - * Create or Update the parent " . $parentTable->getPhpName() . " object - * And return its primary key - * - * @return " . $cptype . " The primary key of the parent object - */ -public function getSyncParent(\$con = null) -{ - \$parent = \$this->getParentOrCreate(\$con);"; - foreach ($parentTable->getColumns() as $column) { - if ($column->isPrimaryKey() || $column->getName() == $this->getParameter('descendant_column')) { - continue; - } - $phpName = $column->getPhpName(); - $script .= " - \$parent->set{$phpName}(\$this->get{$phpName}());"; - } - foreach ($parentTable->getForeignKeys() as $fk) { - if (isset($fk->isParentChild) && $fk->isParentChild) { - continue; - } - $refPhpName = $this->builder->getFKPhpNameAffix($fk, $plural = false); - $script .= " - if (\$this->get" . $refPhpName . "() && \$this->get" . $refPhpName . "()->isNew()) { - \$parent->set" . $refPhpName . "(\$this->get" . $refPhpName . "()); - }"; - } - $script .= " - - return \$parent; -} -"; - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/concrete_inheritance/ConcreteInheritanceParentBehavior.php b/airtime_mvc/library/propel/generator/lib/behavior/concrete_inheritance/ConcreteInheritanceParentBehavior.php deleted file mode 100644 index e2cdb2fc6a..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/concrete_inheritance/ConcreteInheritanceParentBehavior.php +++ /dev/null @@ -1,89 +0,0 @@ - 'descendant_class' - ); - - public function modifyTable() - { - $table = $this->getTable(); - if (!$table->containsColumn($this->getParameter('descendant_column'))) { - $table->addColumn(array( - 'name' => $this->getParameter('descendant_column'), - 'type' => 'VARCHAR', - 'size' => 100 - )); - } - } - - protected function getColumnGetter() - { - return 'get' . $this->getColumnForParameter('descendant_column')->getPhpName(); - } - - public function objectMethods($builder) - { - $this->builder = $builder; - $script .= ''; - $this->addHasChildObject($script); - $this->addGetChildObject($script); - - return $script; - } - - protected function addHasChildObject(&$script) - { - $script .= " -/** - * Whether or not this object is the parent of a child object - * - * @return bool - */ -public function hasChildObject() -{ - return \$this->" . $this->getColumnGetter() . "() !== null; -} -"; - } - - protected function addGetChildObject(&$script) - { - $script .= " -/** - * Get the child object of this object - * - * @return mixed - */ -public function getChildObject() -{ - if (!\$this->hasChildObject()) { - return null; - } - \$childObjectClass = \$this->" . $this->getColumnGetter() . "(); - \$childObject = PropelQuery::from(\$childObjectClass)->findPk(\$this->getPrimaryKey()); - return \$childObject->hasChildObject() ? \$childObject->getChildObject() : \$childObject; -} -"; - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehavior.php b/airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehavior.php deleted file mode 100644 index 5e89963526..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehavior.php +++ /dev/null @@ -1,99 +0,0 @@ - 'tree_left', - 'right_column' => 'tree_right', - 'level_column' => 'tree_level', - 'use_scope' => 'false', - 'scope_column' => 'tree_scope', - 'method_proxies' => 'false' - ); - - protected $objectBuilderModifier, $queryBuilderModifier, $peerBuilderModifier; - - /** - * Add the left, right and scope to the current table - */ - public function modifyTable() - { - if(!$this->getTable()->containsColumn($this->getParameter('left_column'))) { - $this->getTable()->addColumn(array( - 'name' => $this->getParameter('left_column'), - 'type' => 'INTEGER' - )); - } - if(!$this->getTable()->containsColumn($this->getParameter('right_column'))) { - $this->getTable()->addColumn(array( - 'name' => $this->getParameter('right_column'), - 'type' => 'INTEGER' - )); - } - if(!$this->getTable()->containsColumn($this->getParameter('level_column'))) { - $this->getTable()->addColumn(array( - 'name' => $this->getParameter('level_column'), - 'type' => 'INTEGER' - )); - } - if ($this->getParameter('use_scope') == 'true' && - !$this->getTable()->containsColumn($this->getParameter('scope_column'))) { - $this->getTable()->addColumn(array( - 'name' => $this->getParameter('scope_column'), - 'type' => 'INTEGER' - )); - } - } - - public function getObjectBuilderModifier() - { - if (is_null($this->objectBuilderModifier)) - { - $this->objectBuilderModifier = new NestedSetBehaviorObjectBuilderModifier($this); - } - return $this->objectBuilderModifier; - } - - public function getQueryBuilderModifier() - { - if (is_null($this->queryBuilderModifier)) - { - $this->queryBuilderModifier = new NestedSetBehaviorQueryBuilderModifier($this); - } - return $this->queryBuilderModifier; - } - - public function getPeerBuilderModifier() - { - if (is_null($this->peerBuilderModifier)) - { - $this->peerBuilderModifier = new NestedSetBehaviorPeerBuilderModifier($this); - } - return $this->peerBuilderModifier; - } - - public function useScope() - { - return $this->getParameter('use_scope') == 'true'; - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehaviorObjectBuilderModifier.php b/airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehaviorObjectBuilderModifier.php deleted file mode 100644 index 3b99c2c87a..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehaviorObjectBuilderModifier.php +++ /dev/null @@ -1,1540 +0,0 @@ - - * @package propel.generator.behavior.nestedset - */ -class NestedSetBehaviorObjectBuilderModifier -{ - protected $behavior, $table, $builder, $objectClassname, $peerClassname; - - public function __construct($behavior) - { - $this->behavior = $behavior; - $this->table = $behavior->getTable(); - } - - protected function getParameter($key) - { - return $this->behavior->getParameter($key); - } - - protected function getColumnAttribute($name) - { - return strtolower($this->behavior->getColumnForParameter($name)->getName()); - } - - protected function getColumnPhpName($name) - { - return $this->behavior->getColumnForParameter($name)->getPhpName(); - } - - protected function setBuilder($builder) - { - $this->builder = $builder; - $this->objectClassname = $builder->getStubObjectBuilder()->getClassname(); - $this->queryClassname = $builder->getStubQueryBuilder()->getClassname(); - $this->peerClassname = $builder->getStubPeerBuilder()->getClassname(); - } - - /* - public function objectFilter(&$script, $builder) - { - $script = str_replace('implements Persistent', 'implements Persistent, NodeObject', $script); - } - */ - - public function objectAttributes($builder) - { - $objectClassname = $builder->getStubObjectBuilder()->getClassname(); - return " -/** - * Queries to be executed in the save transaction - * @var array - */ -protected \$nestedSetQueries = array(); - -/** - * Internal cache for children nodes - * @var null|PropelObjectCollection - */ -protected \$collNestedSetChildren = null; - -/** - * Internal cache for parent node - * @var null|$objectClassname - */ -protected \$aNestedSetParent = null; - -"; - } - - public function preSave($builder) - { - return "\$this->processNestedSetQueries(\$con);"; - } - - public function preDelete($builder) - { - $peerClassname = $builder->getStubPeerBuilder()->getClassname(); - return "if (\$this->isRoot()) { - throw new PropelException('Deletion of a root node is disabled for nested sets. Use $peerClassname::deleteTree(" . ($this->behavior->useScope() ? '$scope' : '') . ") instead to delete an entire tree'); -} -\$this->deleteDescendants(\$con); -"; - } - - public function postDelete($builder) - { - $peerClassname = $builder->getStubPeerBuilder()->getClassname(); - return "// fill up the room that was used by the node -$peerClassname::shiftRLValues(-2, \$this->getRightValue() + 1, null" . ($this->behavior->useScope() ? ", \$this->getScopeValue()" : "") . ", \$con); -"; - } - - public function objectClearReferences($builder) - { - return "\$this->collNestedSetChildren = null; -\$this->aNestedSetParent = null;"; - } - - public function objectMethods($builder) - { - $this->setBuilder($builder); - $script = ''; - - $this->addProcessNestedSetQueries($script); - - $this->addGetLeft($script); - $this->addGetRight($script); - $this->addGetLevel($script); - if ($this->getParameter('use_scope') == 'true') - { - $this->addGetScope($script); - } - - $this->addSetLeft($script); - $this->addSetRight($script); - $this->addSetLevel($script); - if ($this->getParameter('use_scope') == 'true') - { - $this->addSetScope($script); - } - - $this->addMakeRoot($script); - - $this->addIsInTree($script); - $this->addIsRoot($script); - $this->addIsLeaf($script); - $this->addIsDescendantOf($script); - $this->addIsAncestorOf($script); - - $this->addHasParent($script); - $this->addSetParent($script); - $this->addGetParent($script); - - $this->addHasPrevSibling($script); - $this->addGetPrevSibling($script); - - $this->addHasNextSibling($script); - $this->addGetNextSibling($script); - - $this->addNestedSetChildrenClear($script); - $this->addNestedSetChildrenInit($script); - $this->addNestedSetChildAdd($script); - $this->addHasChildren($script); - $this->addGetChildren($script); - $this->addCountChildren($script); - - $this->addGetFirstChild($script); - $this->addGetLastChild($script); - $this->addGetSiblings($script); - $this->addGetDescendants($script); - $this->addCountDescendants($script); - $this->addGetBranch($script); - $this->addGetAncestors($script); - - $this->addAddChild($script); - $this->addInsertAsFirstChildOf($script); - $this->addInsertAsLastChildOf($script); - $this->addInsertAsPrevSiblingOf($script); - $this->addInsertAsNextSiblingOf($script); - - $this->addMoveToFirstChildOf($script); - $this->addMoveToLastChildOf($script); - $this->addMoveToPrevSiblingOf($script); - $this->addMoveToNextSiblingOf($script); - $this->addMoveSubtreeTo($script); - - $this->addDeleteDescendants($script); - - $this->addGetIterator($script); - - if ($this->getParameter('method_proxies') == 'true') - { - $this->addCompatibilityProxies($script); - } - - return $script; - } - - protected function addProcessNestedSetQueries(&$script) - { - $script .= " -/** - * Execute queries that were saved to be run inside the save transaction - */ -protected function processNestedSetQueries(\$con) -{ - foreach (\$this->nestedSetQueries as \$query) { - \$query['arguments'][]= \$con; - call_user_func_array(\$query['callable'], \$query['arguments']); - } - \$this->nestedSetQueries = array(); -} -"; - } - protected function addGetLeft(&$script) - { - $script .= " -/** - * Wraps the getter for the nested set left value - * - * @return int - */ -public function getLeftValue() -{ - return \$this->{$this->getColumnAttribute('left_column')}; -} -"; - } - - protected function addGetRight(&$script) - { - $script .= " -/** - * Wraps the getter for the nested set right value - * - * @return int - */ -public function getRightValue() -{ - return \$this->{$this->getColumnAttribute('right_column')}; -} -"; - } - - protected function addGetLevel(&$script) - { - $script .= " -/** - * Wraps the getter for the nested set level - * - * @return int - */ -public function getLevel() -{ - return \$this->{$this->getColumnAttribute('level_column')}; -} -"; - } - - protected function addGetScope(&$script) - { - $script .= " -/** - * Wraps the getter for the scope value - * - * @return int or null if scope is disabled - */ -public function getScopeValue() -{ - return \$this->{$this->getColumnAttribute('scope_column')}; -} -"; - } - - protected function addSetLeft(&$script) - { - $script .= " -/** - * Set the value left column - * - * @param int \$v new value - * @return {$this->objectClassname} The current object (for fluent API support) - */ -public function setLeftValue(\$v) -{ - return \$this->set{$this->getColumnPhpName('left_column')}(\$v); -} -"; - } - - protected function addSetRight(&$script) - { - $script .= " -/** - * Set the value of right column - * - * @param int \$v new value - * @return {$this->objectClassname} The current object (for fluent API support) - */ -public function setRightValue(\$v) -{ - return \$this->set{$this->getColumnPhpName('right_column')}(\$v); -} -"; - } - - protected function addSetLevel(&$script) - { - $script .= " -/** - * Set the value of level column - * - * @param int \$v new value - * @return {$this->objectClassname} The current object (for fluent API support) - */ -public function setLevel(\$v) -{ - return \$this->set{$this->getColumnPhpName('level_column')}(\$v); -} -"; - } - - protected function addSetScope(&$script) - { - $script .= " -/** - * Set the value of scope column - * - * @param int \$v new value - * @return {$this->objectClassname} The current object (for fluent API support) - */ -public function setScopeValue(\$v) -{ - return \$this->set{$this->getColumnPhpName('scope_column')}(\$v); -} -"; - } - - protected function addMakeRoot(&$script) - { - $script .= " -/** - * Creates the supplied node as the root node. - * - * @return {$this->objectClassname} The current object (for fluent API support) - * @throws PropelException - */ -public function makeRoot() -{ - if (\$this->getLeftValue() || \$this->getRightValue()) { - throw new PropelException('Cannot turn an existing node into a root node.'); - } - - \$this->setLeftValue(1); - \$this->setRightValue(2); - \$this->setLevel(0); - return \$this; -} -"; - } - - protected function addIsInTree(&$script) - { - $script .= " -/** - * Tests if onbject is a node, i.e. if it is inserted in the tree - * - * @return bool - */ -public function isInTree() -{ - return \$this->getLeftValue() > 0 && \$this->getRightValue() > \$this->getLeftValue(); -} -"; - } - - protected function addIsRoot(&$script) - { - $script .= " -/** - * Tests if node is a root - * - * @return bool - */ -public function isRoot() -{ - return \$this->isInTree() && \$this->getLeftValue() == 1; -} -"; - } - - protected function addIsLeaf(&$script) - { - $script .= " -/** - * Tests if node is a leaf - * - * @return bool - */ -public function isLeaf() -{ - return \$this->isInTree() && (\$this->getRightValue() - \$this->getLeftValue()) == 1; -} -"; - } - - protected function addIsDescendantOf(&$script) - { - $objectClassname = $this->objectClassname; - $script .= " -/** - * Tests if node is a descendant of another node - * - * @param $objectClassname \$node Propel node object - * @return bool - */ -public function isDescendantOf(\$parent) -{"; - if ($this->behavior->useScope()) { - $script .= " - if (\$this->getScopeValue() !== \$parent->getScopeValue()) { - throw new PropelException('Comparing two nodes of different trees'); - }"; - } - $script .= " - return \$this->isInTree() && \$this->getLeftValue() > \$parent->getLeftValue() && \$this->getRightValue() < \$parent->getRightValue(); -} -"; - } - - protected function addIsAncestorOf(&$script) - { - $objectClassname = $this->objectClassname; - $script .= " -/** - * Tests if node is a ancestor of another node - * - * @param $objectClassname \$node Propel node object - * @return bool - */ -public function isAncestorOf(\$child) -{ - return \$child->isDescendantOf(\$this); -} -"; - } - - protected function addHasParent(&$script) - { - $script .= " -/** - * Tests if object has an ancestor - * - * @param PropelPDO \$con Connection to use. - * @return bool - */ -public function hasParent(PropelPDO \$con = null) -{ - return \$this->getLevel() > 0; -} -"; - } - - protected function addSetParent(&$script) - { - $objectClassname = $this->objectClassname; - $script .= " -/** - * Sets the cache for parent node of the current object. - * Warning: this does not move the current object in the tree. - * Use moveTofirstChildOf() or moveToLastChildOf() for that purpose - * - * @param $objectClassname \$parent - * @return $objectClassname The current object, for fluid interface - */ -public function setParent(\$parent = null) -{ - \$this->aNestedSetParent = \$parent; - return \$this; -} -"; - } - - - protected function addGetParent(&$script) - { - $script .= " -/** - * Gets parent node for the current object if it exists - * The result is cached so further calls to the same method don't issue any queries - * - * @param PropelPDO \$con Connection to use. - * @return mixed Propel object if exists else false - */ -public function getParent(PropelPDO \$con = null) -{ - if (\$this->aNestedSetParent === null && \$this->hasParent()) { - \$this->aNestedSetParent = {$this->queryClassname}::create() - ->ancestorsOf(\$this) - ->orderByLevel(true) - ->findOne(\$con); - } - return \$this->aNestedSetParent; -} -"; - } - - protected function addHasPrevSibling(&$script) - { - $peerClassname = $this->peerClassname; - $queryClassname = $this->queryClassname; - $script .= " -/** - * Determines if the node has previous sibling - * - * @param PropelPDO \$con Connection to use. - * @return bool - */ -public function hasPrevSibling(PropelPDO \$con = null) -{ - if (!{$this->peerClassname}::isValid(\$this)) { - return false; - } - return $queryClassname::create() - ->filterBy" . $this->getColumnPhpName('right_column') . "(\$this->getLeftValue() - 1)"; - if ($this->behavior->useScope()) { - $script .= " - ->inTree(\$this->getScopeValue())"; - } - $script .= " - ->count(\$con) > 0; -} -"; - } - - protected function addGetPrevSibling(&$script) - { - $queryClassname = $this->queryClassname; - $script .= " -/** - * Gets previous sibling for the given node if it exists - * - * @param PropelPDO \$con Connection to use. - * @return mixed Propel object if exists else false - */ -public function getPrevSibling(PropelPDO \$con = null) -{ - return $queryClassname::create() - ->filterBy" . $this->getColumnPhpName('right_column') . "(\$this->getLeftValue() - 1)"; - if ($this->behavior->useScope()) { - $script .= " - ->inTree(\$this->getScopeValue())"; - } - $script .= " - ->findOne(\$con); -} -"; - } - - protected function addHasNextSibling(&$script) - { - $peerClassname = $this->peerClassname; - $queryClassname = $this->queryClassname; - $script .= " -/** - * Determines if the node has next sibling - * - * @param PropelPDO \$con Connection to use. - * @return bool - */ -public function hasNextSibling(PropelPDO \$con = null) -{ - if (!{$this->peerClassname}::isValid(\$this)) { - return false; - } - return $queryClassname::create() - ->filterBy" . $this->getColumnPhpName('left_column') . "(\$this->getRightValue() + 1)"; - if ($this->behavior->useScope()) { - $script .= " - ->inTree(\$this->getScopeValue())"; - } - $script .= " - ->count(\$con) > 0; -} -"; - } - - protected function addGetNextSibling(&$script) - { - $queryClassname = $this->queryClassname; - $script .= " -/** - * Gets next sibling for the given node if it exists - * - * @param PropelPDO \$con Connection to use. - * @return mixed Propel object if exists else false - */ -public function getNextSibling(PropelPDO \$con = null) -{ - return $queryClassname::create() - ->filterBy" . $this->getColumnPhpName('left_column') . "(\$this->getRightValue() + 1)"; - if ($this->behavior->useScope()) { - $script .= " - ->inTree(\$this->getScopeValue())"; - } - $script .= " - ->findOne(\$con); -} -"; - } - - protected function addNestedSetChildrenClear(&$script) - { - $script .= " -/** - * Clears out the \$collNestedSetChildren collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - */ -public function clearNestedSetChildren() -{ - \$this->collNestedSetChildren = null; -} -"; - } - - protected function addNestedSetChildrenInit(&$script) - { - $script .= " -/** - * Initializes the \$collNestedSetChildren collection. - * - * @return void - */ -public function initNestedSetChildren() -{ - \$this->collNestedSetChildren = new PropelObjectCollection(); - \$this->collNestedSetChildren->setModel('" . $this->builder->getNewStubObjectBuilder($this->table)->getClassname() . "'); -} -"; - } - - protected function addNestedSetChildAdd(&$script) - { - $objectClassname = $this->objectClassname; - $objectName = '$' . $this->table->getStudlyPhpName(); - $script .= " -/** - * Adds an element to the internal \$collNestedSetChildren collection. - * Beware that this doesn't insert a node in the tree. - * This method is only used to facilitate children hydration. - * - * @param $objectClassname $objectName - * - * @return void - */ -public function addNestedSetChild($objectName) -{ - if (\$this->collNestedSetChildren === null) { - \$this->initNestedSetChildren(); - } - if (!\$this->collNestedSetChildren->contains($objectName)) { // only add it if the **same** object is not already associated - \$this->collNestedSetChildren[]= $objectName; - {$objectName}->setParent(\$this); - } -} -"; - } - - protected function addHasChildren(&$script) - { - $script .= " -/** - * Tests if node has children - * - * @return bool - */ -public function hasChildren() -{ - return (\$this->getRightValue() - \$this->getLeftValue()) > 1; -} -"; - } - - protected function addGetChildren(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $queryClassname = $this->queryClassname; - $script .= " -/** - * Gets the children of the given node - * - * @param Criteria \$criteria Criteria to filter results. - * @param PropelPDO \$con Connection to use. - * @return array List of $objectClassname objects - */ -public function getChildren(\$criteria = null, PropelPDO \$con = null) -{ - if(null === \$this->collNestedSetChildren || null !== \$criteria) { - if (\$this->isLeaf() || (\$this->isNew() && null === \$this->collNestedSetChildren)) { - // return empty collection - \$this->initNestedSetChildren(); - } else { - \$collNestedSetChildren = $queryClassname::create(null, \$criteria) - ->childrenOf(\$this) - ->orderByBranch() - ->find(\$con); - if (null !== \$criteria) { - return \$collNestedSetChildren; - } - \$this->collNestedSetChildren = \$collNestedSetChildren; - } - } - return \$this->collNestedSetChildren; -} -"; - } - - protected function addCountChildren(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $queryClassname = $this->queryClassname; - $script .= " -/** - * Gets number of children for the given node - * - * @param Criteria \$criteria Criteria to filter results. - * @param PropelPDO \$con Connection to use. - * @return int Number of children - */ -public function countChildren(\$criteria = null, PropelPDO \$con = null) -{ - if(null === \$this->collNestedSetChildren || null !== \$criteria) { - if (\$this->isLeaf() || (\$this->isNew() && null === \$this->collNestedSetChildren)) { - return 0; - } else { - return $queryClassname::create(null, \$criteria) - ->childrenOf(\$this) - ->count(\$con); - } - } else { - return count(\$this->collNestedSetChildren); - } -} -"; - } - - protected function addGetFirstChild(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $queryClassname = $this->queryClassname; - $script .= " -/** - * Gets the first child of the given node - * - * @param Criteria \$query Criteria to filter results. - * @param PropelPDO \$con Connection to use. - * @return array List of $objectClassname objects - */ -public function getFirstChild(\$query = null, PropelPDO \$con = null) -{ - if(\$this->isLeaf()) { - return array(); - } else { - return $queryClassname::create(null, \$query) - ->childrenOf(\$this) - ->orderByBranch() - ->findOne(\$con); - } -} -"; - } - - protected function addGetLastChild(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $queryClassname = $this->queryClassname; - $script .= " -/** - * Gets the last child of the given node - * - * @param Criteria \$query Criteria to filter results. - * @param PropelPDO \$con Connection to use. - * @return array List of $objectClassname objects - */ -public function getLastChild(\$query = null, PropelPDO \$con = null) -{ - if(\$this->isLeaf()) { - return array(); - } else { - return $queryClassname::create(null, \$query) - ->childrenOf(\$this) - ->orderByBranch(true) - ->findOne(\$con); - } -} -"; - } - - protected function addGetSiblings(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $queryClassname = $this->queryClassname; - $script .= " -/** - * Gets the siblings of the given node - * - * @param bool \$includeNode Whether to include the current node or not - * @param Criteria \$query Criteria to filter results. - * @param PropelPDO \$con Connection to use. - * - * @return array List of $objectClassname objects - */ -public function getSiblings(\$includeNode = false, \$query = null, PropelPDO \$con = null) -{ - if(\$this->isRoot()) { - return array(); - } else { - \$query = $queryClassname::create(null, \$query) - ->childrenOf(\$this->getParent(\$con)) - ->orderByBranch(true); - if (!\$includeNode) { - \$query->prune(\$this); - } - return \$query->find(\$con); - } -} -"; - } - - protected function addGetDescendants(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $queryClassname = $this->queryClassname; - $script .= " -/** - * Gets descendants for the given node - * - * @param Criteria \$query Criteria to filter results. - * @param PropelPDO \$con Connection to use. - * @return array List of $objectClassname objects - */ -public function getDescendants(\$query = null, PropelPDO \$con = null) -{ - if(\$this->isLeaf()) { - return array(); - } else { - return $queryClassname::create(null, \$query) - ->descendantsOf(\$this) - ->orderByBranch() - ->find(\$con); - } -} -"; - } - - protected function addCountDescendants(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $queryClassname = $this->queryClassname; - $script .= " -/** - * Gets number of descendants for the given node - * - * @param Criteria \$query Criteria to filter results. - * @param PropelPDO \$con Connection to use. - * @return int Number of descendants - */ -public function countDescendants(\$query = null, PropelPDO \$con = null) -{ - if(\$this->isLeaf()) { - // save one query - return 0; - } else { - return $queryClassname::create(null, \$query) - ->descendantsOf(\$this) - ->count(\$con); - } -} -"; - } - - protected function addGetBranch(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $queryClassname = $this->queryClassname; - $script .= " -/** - * Gets descendants for the given node, plus the current node - * - * @param Criteria \$query Criteria to filter results. - * @param PropelPDO \$con Connection to use. - * @return array List of $objectClassname objects - */ -public function getBranch(\$query = null, PropelPDO \$con = null) -{ - return $queryClassname::create(null, \$query) - ->branchOf(\$this) - ->orderByBranch() - ->find(\$con); -} -"; - } - - protected function addGetAncestors(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $queryClassname = $this->queryClassname; - $script .= " -/** - * Gets ancestors for the given node, starting with the root node - * Use it for breadcrumb paths for instance - * - * @param Criteria \$query Criteria to filter results. - * @param PropelPDO \$con Connection to use. - * @return array List of $objectClassname objects - */ -public function getAncestors(\$query = null, PropelPDO \$con = null) -{ - if(\$this->isRoot()) { - // save one query - return array(); - } else { - return $queryClassname::create(null, \$query) - ->ancestorsOf(\$this) - ->orderByBranch() - ->find(\$con); - } -} -"; - } - - protected function addAddChild(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Inserts the given \$child node as first child of current - * The modifications in the current object and the tree - * are not persisted until the child object is saved. - * - * @param $objectClassname \$child Propel object for child node - * - * @return $objectClassname The current Propel object - */ -public function addChild($objectClassname \$child) -{ - if (\$this->isNew()) { - throw new PropelException('A $objectClassname object must not be new to accept children.'); - } - \$child->insertAsFirstChildOf(\$this); - return \$this; -} -"; - } - - protected function addInsertAsFirstChildOf(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Inserts the current node as first child of given \$parent node - * The modifications in the current object and the tree - * are not persisted until the current object is saved. - * - * @param $objectClassname \$parent Propel object for parent node - * - * @return $objectClassname The current Propel object - */ -public function insertAsFirstChildOf(\$parent) -{ - if (\$this->isInTree()) { - throw new PropelException('A $objectClassname object must not already be in the tree to be inserted. Use the moveToFirstChildOf() instead.'); - } - \$left = \$parent->getLeftValue() + 1; - // Update node properties - \$this->setLeftValue(\$left); - \$this->setRightValue(\$left + 1); - \$this->setLevel(\$parent->getLevel() + 1);"; - if ($useScope) - { - $script .= " - \$scope = \$parent->getScopeValue(); - \$this->setScopeValue(\$scope);"; - } - $script .= " - // update the children collection of the parent - \$parent->addNestedSetChild(\$this); - - // Keep the tree modification query for the save() transaction - \$this->nestedSetQueries []= array( - 'callable' => array('$peerClassname', 'makeRoomForLeaf'), - 'arguments' => array(\$left" . ($useScope ? ", \$scope" : "") . ") - ); - return \$this; -} -"; - } - - protected function addInsertAsLastChildOf(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Inserts the current node as last child of given \$parent node - * The modifications in the current object and the tree - * are not persisted until the current object is saved. - * - * @param $objectClassname \$parent Propel object for parent node - * - * @return $objectClassname The current Propel object - */ -public function insertAsLastChildOf(\$parent) -{ - if (\$this->isInTree()) { - throw new PropelException('A $objectClassname object must not already be in the tree to be inserted. Use the moveToLastChildOf() instead.'); - } - \$left = \$parent->getRightValue(); - // Update node properties - \$this->setLeftValue(\$left); - \$this->setRightValue(\$left + 1); - \$this->setLevel(\$parent->getLevel() + 1);"; - if ($useScope) - { - $script .= " - \$scope = \$parent->getScopeValue(); - \$this->setScopeValue(\$scope);"; - } - $script .= " - // update the children collection of the parent - \$parent->addNestedSetChild(\$this); - - // Keep the tree modification query for the save() transaction - \$this->nestedSetQueries []= array( - 'callable' => array('$peerClassname', 'makeRoomForLeaf'), - 'arguments' => array(\$left" . ($useScope ? ", \$scope" : "") . ") - ); - return \$this; -} -"; - } - - protected function addInsertAsPrevSiblingOf(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Inserts the current node as prev sibling given \$sibling node - * The modifications in the current object and the tree - * are not persisted until the current object is saved. - * - * @param $objectClassname \$sibling Propel object for parent node - * - * @return $objectClassname The current Propel object - */ -public function insertAsPrevSiblingOf(\$sibling) -{ - if (\$this->isInTree()) { - throw new PropelException('A $objectClassname object must not already be in the tree to be inserted. Use the moveToPrevSiblingOf() instead.'); - } - \$left = \$sibling->getLeftValue(); - // Update node properties - \$this->setLeftValue(\$left); - \$this->setRightValue(\$left + 1); - \$this->setLevel(\$sibling->getLevel());"; - if ($useScope) - { - $script .= " - \$scope = \$sibling->getScopeValue(); - \$this->setScopeValue(\$scope);"; - } - $script .= " - // Keep the tree modification query for the save() transaction - \$this->nestedSetQueries []= array( - 'callable' => array('$peerClassname', 'makeRoomForLeaf'), - 'arguments' => array(\$left" . ($useScope ? ", \$scope" : "") . ") - ); - return \$this; -} -"; - } - - protected function addInsertAsNextSiblingOf(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Inserts the current node as next sibling given \$sibling node - * The modifications in the current object and the tree - * are not persisted until the current object is saved. - * - * @param $objectClassname \$sibling Propel object for parent node - * - * @return $objectClassname The current Propel object - */ -public function insertAsNextSiblingOf(\$sibling) -{ - if (\$this->isInTree()) { - throw new PropelException('A $objectClassname object must not already be in the tree to be inserted. Use the moveToNextSiblingOf() instead.'); - } - \$left = \$sibling->getRightValue() + 1; - // Update node properties - \$this->setLeftValue(\$left); - \$this->setRightValue(\$left + 1); - \$this->setLevel(\$sibling->getLevel());"; - if ($useScope) - { - $script .= " - \$scope = \$sibling->getScopeValue(); - \$this->setScopeValue(\$scope);"; - } - $script .= " - // Keep the tree modification query for the save() transaction - \$this->nestedSetQueries []= array( - 'callable' => array('$peerClassname', 'makeRoomForLeaf'), - 'arguments' => array(\$left" . ($useScope ? ", \$scope" : "") . ") - ); - return \$this; -} -"; - } - - protected function addMoveToFirstChildOf(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $script .= " -/** - * Moves current node and its subtree to be the first child of \$parent - * The modifications in the current object and the tree are immediate - * - * @param $objectClassname \$parent Propel object for parent node - * @param PropelPDO \$con Connection to use. - * - * @return $objectClassname The current Propel object - */ -public function moveToFirstChildOf(\$parent, PropelPDO \$con = null) -{ - if (!\$this->isInTree()) { - throw new PropelException('A $objectClassname object must be already in the tree to be moved. Use the insertAsFirstChildOf() instead.'); - }"; - if ($this->behavior->useScope()) { - $script .= " - if (\$parent->getScopeValue() != \$this->getScopeValue()) { - throw new PropelException('Moving nodes across trees is not supported'); - }"; - } - $script .= " - if (\$parent->isDescendantOf(\$this)) { - throw new PropelException('Cannot move a node as child of one of its subtree nodes.'); - } - - \$this->moveSubtreeTo(\$parent->getLeftValue() + 1, \$parent->getLevel() - \$this->getLevel() + 1, \$con); - - return \$this; -} -"; - } - - protected function addMoveToLastChildOf(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $script .= " -/** - * Moves current node and its subtree to be the last child of \$parent - * The modifications in the current object and the tree are immediate - * - * @param $objectClassname \$parent Propel object for parent node - * @param PropelPDO \$con Connection to use. - * - * @return $objectClassname The current Propel object - */ -public function moveToLastChildOf(\$parent, PropelPDO \$con = null) -{ - if (!\$this->isInTree()) { - throw new PropelException('A $objectClassname object must be already in the tree to be moved. Use the insertAsLastChildOf() instead.'); - }"; - if ($this->behavior->useScope()) { - $script .= " - if (\$parent->getScopeValue() != \$this->getScopeValue()) { - throw new PropelException('Moving nodes across trees is not supported'); - }"; - } - $script .= " - if (\$parent->isDescendantOf(\$this)) { - throw new PropelException('Cannot move a node as child of one of its subtree nodes.'); - } - - \$this->moveSubtreeTo(\$parent->getRightValue(), \$parent->getLevel() - \$this->getLevel() + 1, \$con); - - return \$this; -} -"; - } - - protected function addMoveToPrevSiblingOf(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $script .= " -/** - * Moves current node and its subtree to be the previous sibling of \$sibling - * The modifications in the current object and the tree are immediate - * - * @param $objectClassname \$sibling Propel object for sibling node - * @param PropelPDO \$con Connection to use. - * - * @return $objectClassname The current Propel object - */ -public function moveToPrevSiblingOf(\$sibling, PropelPDO \$con = null) -{ - if (!\$this->isInTree()) { - throw new PropelException('A $objectClassname object must be already in the tree to be moved. Use the insertAsPrevSiblingOf() instead.'); - } - if (\$sibling->isRoot()) { - throw new PropelException('Cannot move to previous sibling of a root node.'); - }"; - if ($this->behavior->useScope()) { - $script .= " - if (\$sibling->getScopeValue() != \$this->getScopeValue()) { - throw new PropelException('Moving nodes across trees is not supported'); - }"; - } - $script .= " - if (\$sibling->isDescendantOf(\$this)) { - throw new PropelException('Cannot move a node as sibling of one of its subtree nodes.'); - } - - \$this->moveSubtreeTo(\$sibling->getLeftValue(), \$sibling->getLevel() - \$this->getLevel(), \$con); - - return \$this; -} -"; - } - - protected function addMoveToNextSiblingOf(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $script .= " -/** - * Moves current node and its subtree to be the next sibling of \$sibling - * The modifications in the current object and the tree are immediate - * - * @param $objectClassname \$sibling Propel object for sibling node - * @param PropelPDO \$con Connection to use. - * - * @return $objectClassname The current Propel object - */ -public function moveToNextSiblingOf(\$sibling, PropelPDO \$con = null) -{ - if (!\$this->isInTree()) { - throw new PropelException('A $objectClassname object must be already in the tree to be moved. Use the insertAsNextSiblingOf() instead.'); - } - if (\$sibling->isRoot()) { - throw new PropelException('Cannot move to next sibling of a root node.'); - }"; - if ($this->behavior->useScope()) { - $script .= " - if (\$sibling->getScopeValue() != \$this->getScopeValue()) { - throw new PropelException('Moving nodes across trees is not supported'); - }"; - } - $script .= " - if (\$sibling->isDescendantOf(\$this)) { - throw new PropelException('Cannot move a node as sibling of one of its subtree nodes.'); - } - - \$this->moveSubtreeTo(\$sibling->getRightValue() + 1, \$sibling->getLevel() - \$this->getLevel(), \$con); - - return \$this; -} -"; - } - - protected function addMoveSubtreeTo(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Move current node and its children to location \$destLeft and updates rest of tree - * - * @param int \$destLeft Destination left value - * @param int \$levelDelta Delta to add to the levels - * @param PropelPDO \$con Connection to use. - */ -protected function moveSubtreeTo(\$destLeft, \$levelDelta, PropelPDO \$con = null) -{ - \$left = \$this->getLeftValue(); - \$right = \$this->getRightValue();"; - if ($useScope) { - $script .= " - \$scope = \$this->getScopeValue();"; - } - $script .= " - - \$treeSize = \$right - \$left +1; - - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - \$con->beginTransaction(); - try { - // make room next to the target for the subtree - $peerClassname::shiftRLValues(\$treeSize, \$destLeft, null" . ($useScope ? ", \$scope" : "") . ", \$con); - - if (\$left >= \$destLeft) { // src was shifted too? - \$left += \$treeSize; - \$right += \$treeSize; - } - - if (\$levelDelta) { - // update the levels of the subtree - $peerClassname::shiftLevel(\$levelDelta, \$left, \$right" . ($useScope ? ", \$scope" : "") . ", \$con); - } - - // move the subtree to the target - $peerClassname::shiftRLValues(\$destLeft - \$left, \$left, \$right" . ($useScope ? ", \$scope" : "") . ", \$con); - - // remove the empty room at the previous location of the subtree - $peerClassname::shiftRLValues(-\$treeSize, \$right + 1, null" . ($useScope ? ", \$scope" : "") . ", \$con); - - // update all loaded nodes - $peerClassname::updateLoadedNodes(\$con); - - \$con->commit(); - } catch (PropelException \$e) { - \$con->rollback(); - throw \$e; - } -} -"; - } - - protected function addDeleteDescendants(&$script) - { - $objectClassname = $this->objectClassname; - $peerClassname = $this->peerClassname; - $queryClassname = $this->queryClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Deletes all descendants for the given node - * Instance pooling is wiped out by this command, - * so existing $objectClassname instances are probably invalid (except for the current one) - * - * @param PropelPDO \$con Connection to use. - * - * @return int number of deleted nodes - */ -public function deleteDescendants(PropelPDO \$con = null) -{ - if(\$this->isLeaf()) { - // save one query - return; - } - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_READ); - } - \$left = \$this->getLeftValue(); - \$right = \$this->getRightValue();"; - if ($useScope) { - $script .= " - \$scope = \$this->getScopeValue();"; - } - $script .= " - \$con->beginTransaction(); - try { - // delete descendant nodes (will empty the instance pool) - \$ret = $queryClassname::create() - ->descendantsOf(\$this) - ->delete(\$con); - - // fill up the room that was used by descendants - $peerClassname::shiftRLValues(\$left - \$right + 1, \$right, null" . ($useScope ? ", \$scope" : "") . ", \$con); - - // fix the right value for the current node, which is now a leaf - \$this->setRightValue(\$left + 1); - - \$con->commit(); - } catch (Exception \$e) { - \$con->rollback(); - throw \$e; - } - - return \$ret; -} -"; - } - - protected function addGetIterator(&$script) - { - $script .= " -/** - * Returns a pre-order iterator for this node and its children. - * - * @return RecursiveIterator - */ -public function getIterator() -{ - return new NestedSetRecursiveIterator(\$this); -} -"; - } - - protected function addCompatibilityProxies(&$script) - { - $objectClassname = $this->objectClassname; - $script .= " -/** - * Alias for makeRoot(), for BC with Propel 1.4 nested sets - * - * @deprecated since 1.5 - * @see makeRoot - */ -public function createRoot() -{ - return \$this->makeRoot(); -} - -/** - * Alias for getParent(), for BC with Propel 1.4 nested sets - * - * @deprecated since 1.5 - * @see getParent - */ -public function retrieveParent(PropelPDO \$con = null) -{ - return \$this->getParent(\$con); -} - -/** - * Alias for setParent(), for BC with Propel 1.4 nested sets - * - * @deprecated since 1.5 - * @see setParent - */ -public function setParentNode(\$parent = null) -{ - return \$this->setParent(\$parent); -} - -/** - * Alias for countDecendants(), for BC with Propel 1.4 nested sets - * - * @deprecated since 1.5 - * @see setParent - */ -public function getNumberOfDescendants(PropelPDO \$con = null) -{ - return \$this->countDescendants(null, \$con); -} - -/** - * Alias for countChildren(), for BC with Propel 1.4 nested sets - * - * @deprecated since 1.5 - * @see setParent - */ -public function getNumberOfChildren(PropelPDO \$con = null) -{ - return \$this->countChildren(null, \$con); -} - -/** - * Alias for getPrevSibling(), for BC with Propel 1.4 nested sets - * - * @deprecated since 1.5 - * @see getParent - */ -public function retrievePrevSibling(PropelPDO \$con = null) -{ - return \$this->getPrevSibling(\$con); -} - -/** - * Alias for getNextSibling(), for BC with Propel 1.4 nested sets - * - * @deprecated since 1.5 - * @see getParent - */ -public function retrieveNextSibling(PropelPDO \$con = null) -{ - return \$this->getNextSibling(\$con); -} - -/** - * Alias for getFirstChild(), for BC with Propel 1.4 nested sets - * - * @deprecated since 1.5 - * @see getParent - */ -public function retrieveFirstChild(PropelPDO \$con = null) -{ - return \$this->getFirstChild(null, \$con); -} - -/** - * Alias for getLastChild(), for BC with Propel 1.4 nested sets - * - * @deprecated since 1.5 - * @see getParent - */ -public function retrieveLastChild(PropelPDO \$con = null) -{ - return \$this->getLastChild(null, \$con); -} - -/** - * Alias for getAncestors(), for BC with Propel 1.4 nested sets - * - * @deprecated since 1.5 - * @see getAncestors - */ -public function getPath(PropelPDO \$con = null) -{ - return \$this->getAncestors(null, \$con); -} -"; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehaviorPeerBuilderModifier.php b/airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehaviorPeerBuilderModifier.php deleted file mode 100644 index 17bbb96303..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehaviorPeerBuilderModifier.php +++ /dev/null @@ -1,555 +0,0 @@ - - * @package propel.generator.behavior.nestedset - */ -class NestedSetBehaviorPeerBuilderModifier -{ - protected $behavior, $table, $builder, $objectClassname, $peerClassname; - - public function __construct($behavior) - { - $this->behavior = $behavior; - $this->table = $behavior->getTable(); - } - - protected function getParameter($key) - { - return $this->behavior->getParameter($key); - } - - protected function getColumn($name) - { - return $this->behavior->getColumnForParameter($name); - } - - protected function getColumnAttribute($name) - { - return strtolower($this->getColumn($name)->getName()); - } - - protected function getColumnConstant($name) - { - return strtoupper($this->getColumn($name)->getName()); - } - - protected function getColumnPhpName($name) - { - return $this->getColumn($name)->getPhpName(); - } - - protected function setBuilder($builder) - { - $this->builder = $builder; - $this->objectClassname = $builder->getStubObjectBuilder()->getClassname(); - $this->peerClassname = $builder->getStubPeerBuilder()->getClassname(); - } - - public function staticAttributes($builder) - { - $tableName = $this->table->getName(); - - $script = " -/** - * Left column for the set - */ -const LEFT_COL = '" . $tableName . '.' . $this->getColumnConstant('left_column') . "'; - -/** - * Right column for the set - */ -const RIGHT_COL = '" . $tableName . '.' . $this->getColumnConstant('right_column') . "'; - -/** - * Level column for the set - */ -const LEVEL_COL = '" . $tableName . '.' . $this->getColumnConstant('level_column') . "'; -"; - - if ($this->behavior->useScope()) { - $script .= " -/** - * Scope column for the set - */ -const SCOPE_COL = '" . $tableName . '.' . $this->getColumnConstant('scope_column') . "'; -"; - } - - return $script; - } - - public function staticMethods($builder) - { - $this->setBuilder($builder); - $script = ''; - - if ($this->getParameter('use_scope') == 'true') - { - $this->addRetrieveRoots($script); - } - $this->addRetrieveRoot($script); - $this->addRetrieveTree($script); - $this->addIsValid($script); - $this->addDeleteTree($script); - $this->addShiftRLValues($script); - $this->addShiftLevel($script); - $this->addUpdateLoadedNodes($script); - $this->addMakeRoomForLeaf($script); - $this->addFixLevels($script); - - return $script; - } - - protected function addRetrieveRoots(&$script) - { - $peerClassname = $this->peerClassname; - $script .= " -/** - * Returns the root nodes for the tree - * - * @param PropelPDO \$con Connection to use. - * @return {$this->objectClassname} Propel object for root node - */ -public static function retrieveRoots(Criteria \$criteria = null, PropelPDO \$con = null) -{ - if (\$criteria === null) { - \$criteria = new Criteria($peerClassname::DATABASE_NAME); - } - \$criteria->add($peerClassname::LEFT_COL, 1, Criteria::EQUAL); - - return $peerClassname::doSelect(\$criteria, \$con); -} -"; - } - - protected function addRetrieveRoot(&$script) - { - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Returns the root node for a given scope - *"; - if($useScope) { - $script .= " - * @param int \$scope Scope to determine which root node to return"; - } - $script .= " - * @param PropelPDO \$con Connection to use. - * @return {$this->objectClassname} Propel object for root node - */ -public static function retrieveRoot(" . ($useScope ? "\$scope = null, " : "") . "PropelPDO \$con = null) -{ - \$c = new Criteria($peerClassname::DATABASE_NAME); - \$c->add($peerClassname::LEFT_COL, 1, Criteria::EQUAL);"; - if($useScope) { - $script .= " - \$c->add($peerClassname::SCOPE_COL, \$scope, Criteria::EQUAL);"; - } - $script .= " - - return $peerClassname::doSelectOne(\$c, \$con); -} -"; - } - - protected function addRetrieveTree(&$script) - { - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Returns the whole tree node for a given scope - *"; - if($useScope) { - $script .= " - * @param int \$scope Scope to determine which root node to return"; - } - $script .= " - * @param Criteria \$criteria Optional Criteria to filter the query - * @param PropelPDO \$con Connection to use. - * @return {$this->objectClassname} Propel object for root node - */ -public static function retrieveTree(" . ($useScope ? "\$scope = null, " : "") . "Criteria \$criteria = null, PropelPDO \$con = null) -{ - if (\$criteria === null) { - \$criteria = new Criteria($peerClassname::DATABASE_NAME); - } - \$criteria->addAscendingOrderByColumn($peerClassname::LEFT_COL);"; - if($useScope) { - $script .= " - \$criteria->add($peerClassname::SCOPE_COL, \$scope, Criteria::EQUAL);"; - } - $script .= " - - return $peerClassname::doSelect(\$criteria, \$con); -} -"; - } - - protected function addIsValid(&$script) - { - $objectClassname = $this->objectClassname; - $script .= " -/** - * Tests if node is valid - * - * @param $objectClassname \$node Propel object for src node - * @return bool - */ -public static function isValid($objectClassname \$node = null) -{ - if (is_object(\$node) && \$node->getRightValue() > \$node->getLeftValue()) { - return true; - } else { - return false; - } -} -"; - } - - protected function addDeleteTree(&$script) - { - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Delete an entire tree - * "; - if($useScope) { - $script .= " - * @param int \$scope Scope to determine which tree to delete"; - } - $script .= " - * @param PropelPDO \$con Connection to use. - * - * @return int The number of deleted nodes - */ -public static function deleteTree(" . ($useScope ? "\$scope = null, " : "") . "PropelPDO \$con = null) -{"; - if($useScope) { - $script .= " - \$c = new Criteria($peerClassname::DATABASE_NAME); - \$c->add($peerClassname::SCOPE_COL, \$scope, Criteria::EQUAL); - return $peerClassname::doDelete(\$c, \$con);"; - } else { - $script .= " - return $peerClassname::doDeleteAll(\$con);"; - } - $script .= " -} -"; - } - - protected function addShiftRLValues(&$script) - { - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Adds \$delta to all L and R values that are >= \$first and <= \$last. - * '\$delta' can also be negative. - * - * @param int \$delta Value to be shifted by, can be negative - * @param int \$first First node to be shifted - * @param int \$last Last node to be shifted (optional)"; - if($useScope) { - $script .= " - * @param int \$scope Scope to use for the shift"; - } - $script .= " - * @param PropelPDO \$con Connection to use. - */ -public static function shiftRLValues(\$delta, \$first, \$last = null" . ($useScope ? ", \$scope = null" : ""). ", PropelPDO \$con = null) -{ - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - // Shift left column values - \$whereCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$criterion = \$whereCriteria->getNewCriterion($peerClassname::LEFT_COL, \$first, Criteria::GREATER_EQUAL); - if (null !== \$last) { - \$criterion->addAnd(\$whereCriteria->getNewCriterion($peerClassname::LEFT_COL, \$last, Criteria::LESS_EQUAL)); - } - \$whereCriteria->add(\$criterion);"; - if ($useScope) { - $script .= " - \$whereCriteria->add($peerClassname::SCOPE_COL, \$scope, Criteria::EQUAL);"; - } - $script .= " - - \$valuesCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$valuesCriteria->add($peerClassname::LEFT_COL, array('raw' => $peerClassname::LEFT_COL . ' + ?', 'value' => \$delta), Criteria::CUSTOM_EQUAL); - - {$this->builder->getBasePeerClassname()}::doUpdate(\$whereCriteria, \$valuesCriteria, \$con); - - // Shift right column values - \$whereCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$criterion = \$whereCriteria->getNewCriterion($peerClassname::RIGHT_COL, \$first, Criteria::GREATER_EQUAL); - if (null !== \$last) { - \$criterion->addAnd(\$whereCriteria->getNewCriterion($peerClassname::RIGHT_COL, \$last, Criteria::LESS_EQUAL)); - } - \$whereCriteria->add(\$criterion);"; - if ($useScope) { - $script .= " - \$whereCriteria->add($peerClassname::SCOPE_COL, \$scope, Criteria::EQUAL);"; - } - $script .= " - - \$valuesCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$valuesCriteria->add($peerClassname::RIGHT_COL, array('raw' => $peerClassname::RIGHT_COL . ' + ?', 'value' => \$delta), Criteria::CUSTOM_EQUAL); - - {$this->builder->getBasePeerClassname()}::doUpdate(\$whereCriteria, \$valuesCriteria, \$con); -} -"; - } - - protected function addShiftLevel(&$script) - { - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Adds \$delta to level for nodes having left value >= \$first and right value <= \$last. - * '\$delta' can also be negative. - * - * @param int \$delta Value to be shifted by, can be negative - * @param int \$first First node to be shifted - * @param int \$last Last node to be shifted"; - if($useScope) { - $script .= " - * @param int \$scope Scope to use for the shift"; - } - $script .= " - * @param PropelPDO \$con Connection to use. - */ -public static function shiftLevel(\$delta, \$first, \$last" . ($useScope ? ", \$scope = null" : ""). ", PropelPDO \$con = null) -{ - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - \$whereCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$whereCriteria->add($peerClassname::LEFT_COL, \$first, Criteria::GREATER_EQUAL); - \$whereCriteria->add($peerClassname::RIGHT_COL, \$last, Criteria::LESS_EQUAL);"; - if ($useScope) { - $script .= " - \$whereCriteria->add($peerClassname::SCOPE_COL, \$scope, Criteria::EQUAL);"; - } - $script .= " - - \$valuesCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$valuesCriteria->add($peerClassname::LEVEL_COL, array('raw' => $peerClassname::LEVEL_COL . ' + ?', 'value' => \$delta), Criteria::CUSTOM_EQUAL); - - {$this->builder->getBasePeerClassname()}::doUpdate(\$whereCriteria, \$valuesCriteria, \$con); -} -"; - } - - protected function addUpdateLoadedNodes(&$script) - { - $peerClassname = $this->peerClassname; - $script .= " -/** - * Reload all already loaded nodes to sync them with updated db - * - * @param PropelPDO \$con Connection to use. - */ -public static function updateLoadedNodes(PropelPDO \$con = null) -{ - if (Propel::isInstancePoolingEnabled()) { - \$keys = array(); - foreach ($peerClassname::\$instances as \$obj) { - \$keys[] = \$obj->getPrimaryKey(); - } - - if (!empty(\$keys)) { - // We don't need to alter the object instance pool; we're just modifying these ones - // already in the pool. - \$criteria = new Criteria($peerClassname::DATABASE_NAME);"; - if (count($this->table->getPrimaryKey()) === 1) { - $pkey = $this->table->getPrimaryKey(); - $col = array_shift($pkey); - $script .= " - \$criteria->add(".$this->builder->getColumnConstant($col).", \$keys, Criteria::IN); -"; - } else { - $fields = array(); - foreach ($this->table->getPrimaryKey() as $k => $col) { - $fields[] = $this->builder->getColumnConstant($col); - }; - $script .= " - - // Loop on each instances in pool - foreach (\$keys as \$values) { - // Create initial Criterion - \$cton = \$criteria->getNewCriterion(" . $fields[0] . ", \$values[0]);"; - unset($fields[0]); - foreach ($fields as $k => $col) { - $script .= " - - // Create next criterion - \$nextcton = \$criteria->getNewCriterion(" . $col . ", \$values[$k]); - // And merge it with the first - \$cton->addAnd(\$nextcton);"; - } - $script .= " - - // Add final Criterion to Criteria - \$criteria->addOr(\$cton); - }"; - } - - $script .= " - \$stmt = $peerClassname::doSelectStmt(\$criteria, \$con); - while (\$row = \$stmt->fetch(PDO::FETCH_NUM)) { - \$key = $peerClassname::getPrimaryKeyHashFromRow(\$row, 0); - if (null !== (\$object = $peerClassname::getInstanceFromPool(\$key))) {"; - $n = 0; - foreach ($this->table->getColumns() as $col) { - if ($col->getPhpName() == $this->getColumnPhpName('left_column')) { - $script .= " - \$object->setLeftValue(\$row[$n]);"; - } else if ($col->getPhpName() == $this->getColumnPhpName('right_column')) { - $script .= " - \$object->setRightValue(\$row[$n]);"; - } else if ($col->getPhpName() == $this->getColumnPhpName('level_column')) { - $script .= " - \$object->setLevel(\$row[$n]); - \$object->clearNestedSetChildren();"; - } - $n++; - } - $script .= " - } - } - \$stmt->closeCursor(); - } - } -} -"; - } - - protected function addMakeRoomForLeaf(&$script) - { - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Update the tree to allow insertion of a leaf at the specified position - * - * @param int \$left left column value"; - if ($useScope) { - $script .= " - * @param integer \$scope scope column value"; - } - $script .= " - * @param PropelPDO \$con Connection to use. - */ -public static function makeRoomForLeaf(\$left" . ($useScope ? ", \$scope" : ""). ", PropelPDO \$con = null) -{ - // Update database nodes - $peerClassname::shiftRLValues(2, \$left, null" . ($useScope ? ", \$scope" : "") . ", \$con); - - // Update all loaded nodes - $peerClassname::updateLoadedNodes(\$con); -} -"; - } - - protected function addFixLevels(&$script) - { - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Update the tree to allow insertion of a leaf at the specified position - *"; - if ($useScope) { - $script .= " - * @param integer \$scope scope column value"; - } - $script .= " - * @param PropelPDO \$con Connection to use. - */ -public static function fixLevels(" . ($useScope ? "\$scope, " : ""). "PropelPDO \$con = null) -{ - \$c = new Criteria();"; - if ($useScope) { - $script .= " - \$c->add($peerClassname::SCOPE_COL, \$scope, Criteria::EQUAL);"; - } - $script .= " - \$c->addAscendingOrderByColumn($peerClassname::LEFT_COL); - \$stmt = $peerClassname::doSelectStmt(\$c, \$con); - "; - if (!$this->table->getChildrenColumn()) { - $script .= " - // set the class once to avoid overhead in the loop - \$cls = $peerClassname::getOMClass(false);"; - } - - $script .= " - \$level = null; - // iterate over the statement - while (\$row = \$stmt->fetch(PDO::FETCH_NUM)) { - - // hydrate object - \$key = $peerClassname::getPrimaryKeyHashFromRow(\$row, 0); - if (null === (\$obj = $peerClassname::getInstanceFromPool(\$key))) {"; - if ($this->table->getChildrenColumn()) { - $script .= " - // class must be set each time from the record row - \$cls = $peerClassname::getOMClass(\$row, 0); - \$cls = substr('.'.\$cls, strrpos('.'.\$cls, '.') + 1); - " . $this->builder->buildObjectInstanceCreationCode('$obj', '$cls') . " - \$obj->hydrate(\$row); - $peerClassname::addInstanceToPool(\$obj, \$key);"; - } else { - $script .= " - " . $this->builder->buildObjectInstanceCreationCode('$obj', '$cls') . " - \$obj->hydrate(\$row); - $peerClassname::addInstanceToPool(\$obj, \$key);"; - } - $script .= " - } - - // compute level - // Algorithm shamelessly stolen from sfPropelActAsNestedSetBehaviorPlugin - // Probably authored by Tristan Rivoallan - if (\$level === null) { - \$level = 0; - \$i = 0; - \$prev = array(\$obj->getRightValue()); - } else { - while (\$obj->getRightValue() > \$prev[\$i]) { - \$i--; - } - \$level = ++\$i; - \$prev[\$i] = \$obj->getRightValue(); - } - - // update level in node if necessary - if (\$obj->getLevel() !== \$level) { - \$obj->setLevel(\$level); - \$obj->save(\$con); - } - } - \$stmt->closeCursor(); -} -"; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehaviorQueryBuilderModifier.php b/airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehaviorQueryBuilderModifier.php deleted file mode 100644 index 31cd32d58b..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/nestedset/NestedSetBehaviorQueryBuilderModifier.php +++ /dev/null @@ -1,357 +0,0 @@ -behavior = $behavior; - $this->table = $behavior->getTable(); - } - - protected function getParameter($key) - { - return $this->behavior->getParameter($key); - } - - protected function getColumn($name) - { - return $this->behavior->getColumnForParameter($name); - } - - protected function setBuilder($builder) - { - $this->builder = $builder; - $this->objectClassname = $builder->getStubObjectBuilder()->getClassname(); - $this->queryClassname = $builder->getStubQueryBuilder()->getClassname(); - $this->peerClassname = $builder->getStubPeerBuilder()->getClassname(); - } - - public function queryMethods($builder) - { - $this->setBuilder($builder); - $script = ''; - - // select filters - if ($this->behavior->useScope()) { - $this->addTreeRoots($script); - $this->addInTree($script); - } - $this->addDescendantsOf($script); - $this->addBranchOf($script); - $this->addChildrenOf($script); - $this->addSiblingsOf($script); - $this->addAncestorsOf($script); - $this->addRootsOf($script); - // select orders - $this->addOrderByBranch($script); - $this->addOrderByLevel($script); - // select termination methods - $this->addFindRoot($script); - $this->addFindTree($script); - - return $script; - } - - protected function addTreeRoots(&$script) - { - $script .= " -/** - * Filter the query to restrict the result to root objects - * - * @return {$this->queryClassname} The current query, for fuid interface - */ -public function treeRoots() -{ - return \$this->addUsingAlias({$this->peerClassname}::LEFT_COL, 1, Criteria::EQUAL); -} -"; - } - - protected function addInTree(&$script) - { - $script .= " -/** - * Returns the objects in a certain tree, from the tree scope - * - * @param int \$scope Scope to determine which objects node to return - * - * @return {$this->queryClassname} The current query, for fuid interface - */ -public function inTree(\$scope = null) -{ - return \$this->addUsingAlias({$this->peerClassname}::SCOPE_COL, \$scope, Criteria::EQUAL); -} -"; - } - - protected function addDescendantsOf(&$script) - { - $objectName = '$' . $this->table->getStudlyPhpName(); - $script .= " -/** - * Filter the query to restrict the result to descendants of an object - * - * @param {$this->objectClassname} $objectName The object to use for descendant search - * - * @return {$this->queryClassname} The current query, for fuid interface - */ -public function descendantsOf($objectName) -{ - return \$this"; - if ($this->behavior->useScope()) { - $script .= " - ->inTree({$objectName}->getScopeValue())"; - } - $script .= " - ->addUsingAlias({$this->peerClassname}::LEFT_COL, {$objectName}->getLeftValue(), Criteria::GREATER_THAN) - ->addUsingAlias({$this->peerClassname}::RIGHT_COL, {$objectName}->getRightValue(), Criteria::LESS_THAN); -} -"; - } - - protected function addBranchOf(&$script) - { - $objectName = '$' . $this->table->getStudlyPhpName(); - $script .= " -/** - * Filter the query to restrict the result to the branch of an object. - * Same as descendantsOf(), except that it includes the object passed as parameter in the result - * - * @param {$this->objectClassname} $objectName The object to use for branch search - * - * @return {$this->queryClassname} The current query, for fuid interface - */ -public function branchOf($objectName) -{ - return \$this"; - if ($this->behavior->useScope()) { - $script .= " - ->inTree({$objectName}->getScopeValue())"; - } - $script .= " - ->addUsingAlias({$this->peerClassname}::LEFT_COL, {$objectName}->getLeftValue(), Criteria::GREATER_EQUAL) - ->addUsingAlias({$this->peerClassname}::RIGHT_COL, {$objectName}->getRightValue(), Criteria::LESS_EQUAL); -} -"; - } - - protected function addChildrenOf(&$script) - { - $objectName = '$' . $this->table->getStudlyPhpName(); - $script .= " -/** - * Filter the query to restrict the result to children of an object - * - * @param {$this->objectClassname} $objectName The object to use for child search - * - * @return {$this->queryClassname} The current query, for fuid interface - */ -public function childrenOf($objectName) -{ - return \$this - ->descendantsOf($objectName) - ->addUsingAlias({$this->peerClassname}::LEVEL_COL, {$objectName}->getLevel() + 1, Criteria::EQUAL); -} -"; - } - - protected function addSiblingsOf(&$script) - { - $objectName = '$' . $this->table->getStudlyPhpName(); - $script .= " -/** - * Filter the query to restrict the result to siblings of an object. - * The result does not include the object passed as parameter. - * - * @param {$this->objectClassname} $objectName The object to use for sibling search - * @param PropelPDO \$con Connection to use. - * - * @return {$this->queryClassname} The current query, for fuid interface - */ -public function siblingsOf($objectName, PropelPDO \$con = null) -{ - if ({$objectName}->isRoot()) { - return \$this-> - add({$this->peerClassname}::LEVEL_COL, '1<>1', Criteria::CUSTOM); - } else { - return \$this - ->childrenOf({$objectName}->getParent(\$con)) - ->prune($objectName); - } -} -"; - } - - protected function addAncestorsOf(&$script) - { - $objectName = '$' . $this->table->getStudlyPhpName(); - $script .= " -/** - * Filter the query to restrict the result to ancestors of an object - * - * @param {$this->objectClassname} $objectName The object to use for ancestors search - * - * @return {$this->queryClassname} The current query, for fuid interface - */ -public function ancestorsOf($objectName) -{ - return \$this"; - if ($this->behavior->useScope()) { - $script .= " - ->inTree({$objectName}->getScopeValue())"; - } - $script .= " - ->addUsingAlias({$this->peerClassname}::LEFT_COL, {$objectName}->getLeftValue(), Criteria::LESS_THAN) - ->addUsingAlias({$this->peerClassname}::RIGHT_COL, {$objectName}->getRightValue(), Criteria::GREATER_THAN); -} -"; - } - - protected function addRootsOf(&$script) - { - $objectName = '$' . $this->table->getStudlyPhpName(); - $script .= " -/** - * Filter the query to restrict the result to roots of an object. - * Same as ancestorsOf(), except that it includes the object passed as parameter in the result - * - * @param {$this->objectClassname} $objectName The object to use for roots search - * - * @return {$this->queryClassname} The current query, for fuid interface - */ -public function rootsOf($objectName) -{ - return \$this"; - if ($this->behavior->useScope()) { - $script .= " - ->inTree({$objectName}->getScopeValue())"; - } - $script .= " - ->addUsingAlias({$this->peerClassname}::LEFT_COL, {$objectName}->getLeftValue(), Criteria::LESS_EQUAL) - ->addUsingAlias({$this->peerClassname}::RIGHT_COL, {$objectName}->getRightValue(), Criteria::GREATER_EQUAL); -} -"; - } - - protected function addOrderByBranch(&$script) - { - $script .= " -/** - * Order the result by branch, i.e. natural tree order - * - * @param bool \$reverse if true, reverses the order - * - * @return {$this->queryClassname} The current query, for fuid interface - */ -public function orderByBranch(\$reverse = false) -{ - if (\$reverse) { - return \$this - ->addDescendingOrderByColumn({$this->peerClassname}::LEFT_COL); - } else { - return \$this - ->addAscendingOrderByColumn({$this->peerClassname}::LEFT_COL); - } -} -"; - } - - protected function addOrderByLevel(&$script) - { - $script .= " -/** - * Order the result by level, the closer to the root first - * - * @param bool \$reverse if true, reverses the order - * - * @return {$this->queryClassname} The current query, for fuid interface - */ -public function orderByLevel(\$reverse = false) -{ - if (\$reverse) { - return \$this - ->addAscendingOrderByColumn({$this->peerClassname}::RIGHT_COL); - } else { - return \$this - ->addDescendingOrderByColumn({$this->peerClassname}::RIGHT_COL); - } -} -"; - } - - protected function addFindRoot(&$script) - { - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Returns " . ($useScope ? 'a' : 'the') ." root node for the tree - *"; - if($useScope) { - $script .= " - * @param int \$scope Scope to determine which root node to return"; - } - $script .= " - * @param PropelPDO \$con Connection to use. - * - * @return {$this->objectClassname} The tree root object - */ -public function findRoot(" . ($useScope ? "\$scope = null, " : "") . "\$con = null) -{ - return \$this - ->addUsingAlias({$this->peerClassname}::LEFT_COL, 1, Criteria::EQUAL)"; - if ($useScope) { - $script .= " - ->inTree(\$scope)"; - } - $script .= " - ->findOne(\$con); -} -"; - } - - protected function addFindTree(&$script) - { - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Returns " . ($useScope ? 'a' : 'the') ." tree of objects - *"; - if($useScope) { - $script .= " - * @param int \$scope Scope to determine which tree node to return"; - } - $script .= " - * @param PropelPDO \$con Connection to use. - * - * @return mixed the list of results, formatted by the current formatter - */ -public function findTree(" . ($useScope ? "\$scope = null, " : "") . "\$con = null) -{ - return \$this"; - if ($useScope) { - $script .= " - ->inTree(\$scope)"; - } - $script .= " - ->orderByBranch() - ->find(\$con); -} -"; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/query_cache/QueryCacheBehavior.php b/airtime_mvc/library/propel/generator/lib/behavior/query_cache/QueryCacheBehavior.php deleted file mode 100644 index 44db968aeb..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/query_cache/QueryCacheBehavior.php +++ /dev/null @@ -1,262 +0,0 @@ - 'apc', - 'lifetime' => 3600, - ); - - public function queryAttributes($builder) - { - $script = "protected \$queryKey = ''; -"; - switch ($this->getParameter('backend')) { - case 'backend': - $script .= "protected static \$cacheBackend = array(); - "; - break; - case 'apc': - break; - case 'custom': - default: - $script .= "protected static \$cacheBackend; - "; - break; - } - - return $script; - } - - public function queryMethods($builder) - { - $this->peerClassname = $builder->getStubPeerBuilder()->getClassname(); - $script = ''; - $this->addSetQueryKey($script); - $this->addGetQueryKey($script); - $this->addCacheContains($script); - $this->addCacheFetch($script); - $this->addCacheStore($script); - $this->addGetSelectStatement($script); - $this->addGetCountStatement($script); - - return $script; - } - - protected function addSetQueryKey(&$script) - { - $script .= " -public function setQueryKey(\$key) -{ - \$this->queryKey = \$key; - return \$this; -} -"; - } - - protected function addGetQueryKey(&$script) - { - $script .= " -public function getQueryKey() -{ - return \$this->queryKey; -} -"; - } - - protected function addCacheContains(&$script) - { - $script .= " -public function cacheContains(\$key) -{"; - switch ($this->getParameter('backend')) { - case 'apc': - $script .= " - return apc_fetch(\$key);"; - break; - case 'array': - $script .= " - return isset(self::\$cacheBackend[\$key]);"; - break; - case 'custom': - default: - $script .= " - throw new PropelException('You must override the cacheContains(), cacheStore(), and cacheFetch() methods to enable query cache');"; - break; - - } - $script .= " -} -"; - } - - protected function addCacheStore(&$script) - { - $script .= " -public function cacheStore(\$key, \$value, \$lifetime = " .$this->getParameter('lifetime') . ") -{"; - switch ($this->getParameter('backend')) { - case 'apc': - $script .= " - apc_store(\$key, \$value, \$lifetime);"; - break; - case 'array': - $script .= " - self::\$cacheBackend[\$key] = \$value;"; - break; - case 'custom': - default: - $script .= " - throw new PropelException('You must override the cacheContains(), cacheStore(), and cacheFetch() methods to enable query cache');"; - break; - } - $script .= " -} -"; - } - - protected function addCacheFetch(&$script) - { - $script .= " -public function cacheFetch(\$key) -{"; - switch ($this->getParameter('backend')) { - case 'apc': - $script .= " - return apc_fetch(\$key);"; - break; - case 'array': - $script .= " - return isset(self::\$cacheBackend[\$key]) ? self::\$cacheBackend[\$key] : null;"; - break; - case 'custom': - default: - $script .= " - throw new PropelException('You must override the cacheContains(), cacheStore(), and cacheFetch() methods to enable query cache');"; - break; - } - $script .= " -} -"; - } - - protected function addGetSelectStatement(&$script) - { - $script .= " -protected function getSelectStatement(\$con = null) -{ - \$dbMap = Propel::getDatabaseMap(" . $this->peerClassname ."::DATABASE_NAME); - \$db = Propel::getDB(" . $this->peerClassname ."::DATABASE_NAME); - if (\$con === null) { - \$con = Propel::getConnection(" . $this->peerClassname ."::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!\$this->hasSelectClause()) { - \$this->addSelfSelectColumns(); - } - - \$con->beginTransaction(); - try { - \$this->basePreSelect(\$con); - \$key = \$this->getQueryKey(); - if (\$key && \$this->cacheContains(\$key)) { - \$params = \$this->getParams(); - \$sql = \$this->cacheFetch(\$key); - } else { - \$params = array(); - \$sql = BasePeer::createSelectSql(\$this, \$params); - if (\$key) { - \$this->cacheStore(\$key, \$sql); - } - } - \$stmt = \$con->prepare(\$sql); - BasePeer::populateStmtValues(\$stmt, \$params, \$dbMap, \$db); - \$stmt->execute(); - \$con->commit(); - } catch (PropelException \$e) { - \$con->rollback(); - throw \$e; - } - - return \$stmt; -} -"; - } - - protected function addGetCountStatement(&$script) - { - $script .= " -protected function getCountStatement(\$con = null) -{ - \$dbMap = Propel::getDatabaseMap(\$this->getDbName()); - \$db = Propel::getDB(\$this->getDbName()); - if (\$con === null) { - \$con = Propel::getConnection(\$this->getDbName(), Propel::CONNECTION_READ); - } - - \$con->beginTransaction(); - try { - \$this->basePreSelect(\$con); - \$key = \$this->getQueryKey(); - if (\$key && \$this->cacheContains(\$key)) { - \$params = \$this->getParams(); - \$sql = \$this->cacheFetch(\$key); - } else { - if (!\$this->hasSelectClause() && !\$this->getPrimaryCriteria()) { - \$this->addSelfSelectColumns(); - } - \$params = array(); - \$needsComplexCount = \$this->getGroupByColumns() - || \$this->getOffset() - || \$this->getLimit() - || \$this->getHaving() - || in_array(Criteria::DISTINCT, \$this->getSelectModifiers()); - if (\$needsComplexCount) { - if (BasePeer::needsSelectAliases(\$this)) { - if (\$this->getHaving()) { - throw new PropelException('Propel cannot create a COUNT query when using HAVING and duplicate column names in the SELECT part'); - } - BasePeer::turnSelectColumnsToAliases(\$this); - } - \$selectSql = BasePeer::createSelectSql(\$this, \$params); - \$sql = 'SELECT COUNT(*) FROM (' . \$selectSql . ') propelmatch4cnt'; - } else { - // Replace SELECT columns with COUNT(*) - \$this->clearSelectColumns()->addSelectColumn('COUNT(*)'); - \$sql = BasePeer::createSelectSql(\$this, \$params); - } - if (\$key) { - \$this->cacheStore(\$key, \$sql); - } - } - \$stmt = \$con->prepare(\$sql); - BasePeer::populateStmtValues(\$stmt, \$params, \$dbMap, \$db); - \$stmt->execute(); - \$con->commit(); - } catch (PropelException \$e) { - \$con->rollback(); - throw \$e; - } - - return \$stmt; -} -"; - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/sluggable/SluggableBehavior.php b/airtime_mvc/library/propel/generator/lib/behavior/sluggable/SluggableBehavior.php deleted file mode 100644 index d9909a3356..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/sluggable/SluggableBehavior.php +++ /dev/null @@ -1,332 +0,0 @@ - 'slug', - 'slug_pattern' => '', - 'replace_pattern' => '/\W+/', // Tip: use '/[^\\pL\\d]+/u' instead if you're in PHP5.3 - 'replacement' => '-', - 'separator' => '-', - 'permanent' => 'false' - ); - - /** - * Add the slug_column to the current table - */ - public function modifyTable() - { - if(!$this->getTable()->containsColumn($this->getParameter('slug_column'))) { - $this->getTable()->addColumn(array( - 'name' => $this->getParameter('slug_column'), - 'type' => 'VARCHAR', - 'size' => 255 - )); - // add a unique to column - $unique = new Unique($this->getColumnForParameter('slug_column')); - $unique->setName($this->getTable()->getName() . '_slug'); - $unique->addColumn($this->getTable()->getColumn($this->getParameter('slug_column'))); - $this->getTable()->addUnique($unique); - } - } - - /** - * Get the getter of the column of the behavior - * - * @return string The related getter, e.g. 'getSlug' - */ - protected function getColumnGetter() - { - return 'get' . $this->getColumnForParameter('slug_column')->getPhpName(); - } - - /** - * Get the setter of the column of the behavior - * - * @return string The related setter, e.g. 'setSlug' - */ - protected function getColumnSetter() - { - return 'set' . $this->getColumnForParameter('slug_column')->getPhpName(); - } - - /** - * Add code in ObjectBuilder::preSave - * - * @return string The code to put at the hook - */ - public function preSave($builder) - { - $const = $builder->getColumnConstant($this->getColumnForParameter('slug_column'), $this->getTable()->getPhpName() . 'Peer'); - $script = " -if (\$this->isColumnModified($const) && \$this->{$this->getColumnGetter()}()) { - \$this->{$this->getColumnSetter()}(\$this->makeSlugUnique(\$this->{$this->getColumnGetter()}()));"; - if ($this->getParameter('permanent') == 'true') { - $script .= " -} elseif (!\$this->{$this->getColumnGetter()}()) { - \$this->{$this->getColumnSetter()}(\$this->createSlug()); -}"; - } else { - $script .= " -} else { - \$this->{$this->getColumnSetter()}(\$this->createSlug()); -}"; - } - - return $script; - } - - public function objectMethods($builder) - { - $this->builder = $builder; - $script = ''; - if ($this->getParameter('slug_column') != 'slug') { - $this->addSlugSetter($script); - $this->addSlugGetter($script); - } - $this->addCreateSlug($script); - $this->addCreateRawSlug($script); - $this->addCleanupSlugPart($script); - $this->addLimitSlugSize($script); - $this->addMakeSlugUnique($script); - - return $script; - } - - protected function addSlugSetter(&$script) - { - $script .= " -/** - * Wrap the setter for slug value - * - * @param string - * @return " . $this->getTable()->getPhpName() . " - */ -public function setSlug(\$v) -{ - return \$this->" . $this->getColumnSetter() . "(\$v); -} -"; - } - - protected function addSlugGetter(&$script) - { - $script .= " -/** - * Wrap the getter for slug value - * - * @return string - */ -public function getSlug() -{ - return \$this->" . $this->getColumnGetter() . "(); -} -"; - } - - protected function addCreateSlug(&$script) - { - $script .= " -/** - * Create a unique slug based on the object - * - * @return string The object slug - */ -protected function createSlug() -{ - \$slug = \$this->createRawSlug(); - \$slug = \$this->limitSlugSize(\$slug); - \$slug = \$this->makeSlugUnique(\$slug); - - return \$slug; -} -"; - } - - protected function addCreateRawSlug(&$script) - { - $pattern = $this->getParameter('slug_pattern'); - $script .= " -/** - * Create the slug from the appropriate columns - * - * @return string - */ -protected function createRawSlug() -{ - "; - if ($pattern) { - $script .= "return '" . str_replace(array('{', '}'), array('\' . $this->cleanupSlugPart($this->get', '()) . \''), $pattern). "';"; - } else { - $script .= "return \$this->cleanupSlugPart(\$this->__toString());"; - } - $script .= " -} -"; - return $script; - } - - public function addCleanupSlugPart(&$script) - { - $script .= " -/** - * Cleanup a string to make a slug of it - * Removes special characters, replaces blanks with a separator, and trim it - * - * @param string \$text the text to slugify - * @param string \$separator the separator used by slug - * @return string the slugified text - */ -protected static function cleanupSlugPart(\$slug, \$replacement = '" . $this->getParameter('replacement') . "') -{ - // transliterate - if (function_exists('iconv')) { - \$slug = iconv('utf-8', 'us-ascii//TRANSLIT', \$slug); - } - - // lowercase - if (function_exists('mb_strtolower')) { - \$slug = mb_strtolower(\$slug); - } else { - \$slug = strtolower(\$slug); - } - - // remove accents resulting from OSX's iconv - \$slug = str_replace(array('\'', '`', '^'), '', \$slug); - - // replace non letter or digits with separator - \$slug = preg_replace('" . $this->getParameter('replace_pattern') . "', \$replacement, \$slug); - - // trim - \$slug = trim(\$slug, \$replacement); - - if (empty(\$slug)) { - return 'n-a'; - } - - return \$slug; -} -"; - } - - public function addLimitSlugSize(&$script) - { - $size = $this->getColumnForParameter('slug_column')->getSize(); - $script .= " - -/** - * Make sure the slug is short enough to accomodate the column size - * - * @param string \$slug the slug to check - * - * @return string the truncated slug - */ -protected static function limitSlugSize(\$slug, \$incrementReservedSpace = 3) -{ - // check length, as suffix could put it over maximum - if (strlen(\$slug) > ($size - \$incrementReservedSpace)) { - \$slug = substr(\$slug, 0, $size - \$incrementReservedSpace); - } - return \$slug; -} -"; - } - - public function addMakeSlugUnique(&$script) - { - $script .= " - -/** - * Get the slug, ensuring its uniqueness - * - * @param string \$slug the slug to check - * @param string \$separator the separator used by slug - * @return string the unique slug - */ -protected function makeSlugUnique(\$slug, \$separator = '" . $this->getParameter('separator') ."', \$increment = 0) -{ - \$slug2 = empty(\$increment) ? \$slug : \$slug . \$separator . \$increment; - \$slugAlreadyExists = " . $this->builder->getStubQueryBuilder()->getClassname() . "::create() - ->filterBySlug(\$slug2) - ->prune(\$this)"; - // watch out: some of the columns may be hidden by the soft_delete behavior - if ($this->table->hasBehavior('soft_delete')) { - $script .= " - ->includeDeleted()"; - } - $script .= " - ->count(); - if (\$slugAlreadyExists) { - return \$this->makeSlugUnique(\$slug, \$separator, ++\$increment); - } else { - return \$slug2; - } -} -"; - } - - public function queryMethods($builder) - { - $this->builder = $builder; - $script = ''; - if ($this->getParameter('slug_column') != 'slug') { - $this->addFilterBySlug($script); - } - $this->addFindOneBySlug($script); - - return $script; - } - - protected function addFilterBySlug(&$script) - { - $script .= " -/** - * Filter the query on the slug column - * - * @param string \$slug The value to use as filter. - * - * @return " . $this->builder->getStubQueryBuilder()->getClassname() . " The current query, for fluid interface - */ -public function filterBySlug(\$slug) -{ - return \$this->addUsingAlias(" . $this->builder->getColumnConstant($this->getColumnForParameter('slug_column')) . ", \$slug, Criteria::EQUAL); -} -"; - } - - protected function addFindOneBySlug(&$script) - { - $script .= " -/** - * Find one object based on its slug - * - * @param string \$slug The value to use as filter. - * @param PropelPDO \$con The optional connection object - * - * @return " . $this->builder->getStubObjectBuilder()->getClassname() . " the result, formatted by the current formatter - */ -public function findOneBySlug(\$slug, \$con = null) -{ - return \$this->filterBySlug(\$slug)->findOne(\$con); -} -"; - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehavior.php b/airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehavior.php deleted file mode 100644 index 3fe78cb9cf..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehavior.php +++ /dev/null @@ -1,83 +0,0 @@ - 'sortable_rank', - 'use_scope' => 'false', - 'scope_column' => 'sortable_scope', - ); - - protected $objectBuilderModifier, $queryBuilderModifier, $peerBuilderModifier; - - /** - * Add the rank_column to the current table - */ - public function modifyTable() - { - if (!$this->getTable()->containsColumn($this->getParameter('rank_column'))) { - $this->getTable()->addColumn(array( - 'name' => $this->getParameter('rank_column'), - 'type' => 'INTEGER' - )); - } - if ($this->getParameter('use_scope') == 'true' && - !$this->getTable()->containsColumn($this->getParameter('scope_column'))) { - $this->getTable()->addColumn(array( - 'name' => $this->getParameter('scope_column'), - 'type' => 'INTEGER' - )); - } - } - - public function getObjectBuilderModifier() - { - if (is_null($this->objectBuilderModifier)) { - $this->objectBuilderModifier = new SortableBehaviorObjectBuilderModifier($this); - } - return $this->objectBuilderModifier; - } - - public function getQueryBuilderModifier() - { - if (is_null($this->queryBuilderModifier)) { - $this->queryBuilderModifier = new SortableBehaviorQueryBuilderModifier($this); - } - return $this->queryBuilderModifier; - } - - public function getPeerBuilderModifier() - { - if (is_null($this->peerBuilderModifier)) { - $this->peerBuilderModifier = new SortableBehaviorPeerBuilderModifier($this); - } - return $this->peerBuilderModifier; - } - - public function useScope() - { - return $this->getParameter('use_scope') == 'true'; - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehaviorObjectBuilderModifier.php b/airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehaviorObjectBuilderModifier.php deleted file mode 100644 index a59d28b0ea..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehaviorObjectBuilderModifier.php +++ /dev/null @@ -1,636 +0,0 @@ - - * @package propel.generator.behavior.sortable - */ -class SortableBehaviorObjectBuilderModifier -{ - protected $behavior, $table, $builder, $objectClassname, $peerClassname; - - public function __construct($behavior) - { - $this->behavior = $behavior; - $this->table = $behavior->getTable(); - } - - protected function getParameter($key) - { - return $this->behavior->getParameter($key); - } - - protected function getColumnAttribute($name) - { - return strtolower($this->behavior->getColumnForParameter($name)->getName()); - } - - protected function getColumnPhpName($name) - { - return $this->behavior->getColumnForParameter($name)->getPhpName(); - } - - protected function setBuilder($builder) - { - $this->builder = $builder; - $this->objectClassname = $builder->getStubObjectBuilder()->getClassname(); - $this->queryClassname = $builder->getStubQueryBuilder()->getClassname(); - $this->peerClassname = $builder->getStubPeerBuilder()->getClassname(); - } - - /** - * Get the getter of the column of the behavior - * - * @return string The related getter, e.g. 'getRank' - */ - protected function getColumnGetter($columnName = 'rank_column') - { - return 'get' . $this->behavior->getColumnForParameter($columnName)->getPhpName(); - } - - /** - * Get the setter of the column of the behavior - * - * @return string The related setter, e.g. 'setRank' - */ - protected function getColumnSetter($columnName = 'rank_column') - { - return 'set' . $this->behavior->getColumnForParameter($columnName)->getPhpName(); - } - - public function preSave($builder) - { - return "\$this->processSortableQueries(\$con);"; - } - - public function preInsert($builder) - { - $useScope = $this->behavior->useScope(); - $this->setBuilder($builder); - return "if (!\$this->isColumnModified({$this->peerClassname}::RANK_COL)) { - \$this->{$this->getColumnSetter()}({$this->queryClassname}::create()->getMaxRank(" . ($useScope ? "\$this->{$this->getColumnGetter('scope_column')}(), " : '') . "\$con) + 1); -} -"; - } - - public function preDelete($builder) - { - $useScope = $this->behavior->useScope(); - $this->setBuilder($builder); - return " -{$this->peerClassname}::shiftRank(-1, \$this->{$this->getColumnGetter()}() + 1, null, " . ($useScope ? "\$this->{$this->getColumnGetter('scope_column')}(), " : '') . "\$con); -{$this->peerClassname}::clearInstancePool(); -"; - } - - public function objectAttributes($builder) - { - return " -/** - * Queries to be executed in the save transaction - * @var array - */ -protected \$sortableQueries = array(); -"; - } - - public function objectMethods($builder) - { - $this->setBuilder($builder); - $script = ''; - if ($this->getParameter('rank_column') != 'rank') { - $this->addRankAccessors($script); - } - if ($this->behavior->useScope() && - $this->getParameter('scope_column') != 'scope_value') { - $this->addScopeAccessors($script); - } - $this->addIsFirst($script); - $this->addIsLast($script); - $this->addGetNext($script); - $this->addGetPrevious($script); - $this->addInsertAtRank($script); - $this->addInsertAtBottom($script); - $this->addInsertAtTop($script); - $this->addMoveToRank($script); - $this->addSwapWith($script); - $this->addMoveUp($script); - $this->addMoveDown($script); - $this->addMoveToTop($script); - $this->addMoveToBottom($script); - $this->addRemoveFromList($script); - $this->addProcessSortableQueries($script); - - return $script; - } - - /** - * Get the wraps for getter/setter, if the rank column has not the default name - * - * @return string - */ - protected function addRankAccessors(&$script) - { - $script .= " -/** - * Wrap the getter for rank value - * - * @return int - */ -public function getRank() -{ - return \$this->{$this->getColumnAttribute('rank_column')}; -} - -/** - * Wrap the setter for rank value - * - * @param int - * @return {$this->objectClassname} - */ -public function setRank(\$v) -{ - return \$this->{$this->getColumnSetter()}(\$v); -} -"; - } - - /** - * Get the wraps for getter/setter, if the scope column has not the default name - * - * @return string - */ - protected function addScopeAccessors(&$script) - { - $script .= " -/** - * Wrap the getter for scope value - * - * @return int - */ -public function getScopeValue() -{ - return \$this->{$this->getColumnAttribute('scope_column')}; -} - -/** - * Wrap the setter for scope value - * - * @param int - * @return {$this->objectClassname} - */ -public function setScopeValue(\$v) -{ - return \$this->{$this->getColumnSetter('scope_column')}(\$v); -} -"; - } - - protected function addIsFirst(&$script) - { - $script .= " -/** - * Check if the object is first in the list, i.e. if it has 1 for rank - * - * @return boolean - */ -public function isFirst() -{ - return \$this->{$this->getColumnGetter()}() == 1; -} -"; - } - - protected function addIsLast(&$script) - { - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Check if the object is last in the list, i.e. if its rank is the highest rank - * - * @param PropelPDO \$con optional connection - * - * @return boolean - */ -public function isLast(PropelPDO \$con = null) -{ - return \$this->{$this->getColumnGetter()}() == {$this->queryClassname}::create()->getMaxRank(" . ($useScope ? "\$this->{$this->getColumnGetter('scope_column')}(), " : '') . "\$con); -} -"; - } - - protected function addGetNext(&$script) - { - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Get the next item in the list, i.e. the one for which rank is immediately higher - * - * @param PropelPDO \$con optional connection - * - * @return {$this->objectClassname} - */ -public function getNext(PropelPDO \$con = null) -{"; - if ($this->behavior->getParameter('rank_column') == 'rank' && $useScope) { - $script .= " - return {$this->queryClassname}::create() - ->filterByRank(\$this->{$this->getColumnGetter()}() + 1) - ->inList(\$this->{$this->getColumnGetter('scope_column')}()) - ->findOne(\$con);"; - } else { - $script .= " - return {$this->queryClassname}::create()->findOneByRank(\$this->{$this->getColumnGetter()}() + 1, " . ($useScope ? "\$this->{$this->getColumnGetter('scope_column')}(), " : '') . "\$con);"; - } - - $script .= " -} -"; - } - - protected function addGetPrevious(&$script) - { - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Get the previous item in the list, i.e. the one for which rank is immediately lower - * - * @param PropelPDO \$con optional connection - * - * @return {$this->objectClassname} - */ -public function getPrevious(PropelPDO \$con = null) -{"; - if ($this->behavior->getParameter('rank_column') == 'rank' && $useScope) { - $script .= " - return {$this->queryClassname}::create() - ->filterByRank(\$this->{$this->getColumnGetter()}() - 1) - ->inList(\$this->{$this->getColumnGetter('scope_column')}()) - ->findOne(\$con);"; - } else { - $script .= " - return {$this->queryClassname}::create()->findOneByRank(\$this->{$this->getColumnGetter()}() - 1, " . ($useScope ? "\$this->{$this->getColumnGetter('scope_column')}(), " : '') . "\$con);"; - } - $script .= " -} -"; - } - - protected function addInsertAtRank(&$script) - { - $useScope = $this->behavior->useScope(); - $peerClassname = $this->peerClassname; - $script .= " -/** - * Insert at specified rank - * The modifications are not persisted until the object is saved. - * - * @param integer \$rank rank value - * @param PropelPDO \$con optional connection - * - * @return {$this->objectClassname} the current object - * - * @throws PropelException - */ -public function insertAtRank(\$rank, PropelPDO \$con = null) -{"; - if ($useScope) { - $script .= " - if (null === \$this->{$this->getColumnGetter('scope_column')}()) { - throw new PropelException('The scope must be defined before inserting an object in a suite'); - }"; - } - $script .= " - \$maxRank = {$this->queryClassname}::create()->getMaxRank(" . ($useScope ? "\$this->{$this->getColumnGetter('scope_column')}(), " : '') . "\$con); - if (\$rank < 1 || \$rank > \$maxRank + 1) { - throw new PropelException('Invalid rank ' . \$rank); - } - // move the object in the list, at the given rank - \$this->{$this->getColumnSetter()}(\$rank); - if (\$rank != \$maxRank + 1) { - // Keep the list modification query for the save() transaction - \$this->sortableQueries []= array( - 'callable' => array('$peerClassname', 'shiftRank'), - 'arguments' => array(1, \$rank, null, " . ($useScope ? "\$this->{$this->getColumnGetter('scope_column')}()" : '') . ") - ); - } - - return \$this; -} -"; - } - - protected function addInsertAtBottom(&$script) - { - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Insert in the last rank - * The modifications are not persisted until the object is saved. - * - * @param PropelPDO \$con optional connection - * - * @return {$this->objectClassname} the current object - * - * @throws PropelException - */ -public function insertAtBottom(PropelPDO \$con = null) -{"; - if ($useScope) { - $script .= " - if (null === \$this->{$this->getColumnGetter('scope_column')}()) { - throw new PropelException('The scope must be defined before inserting an object in a suite'); - }"; - } - $script .= " - \$this->{$this->getColumnSetter()}({$this->queryClassname}::create()->getMaxRank(" . ($useScope ? "\$this->{$this->getColumnGetter('scope_column')}(), " : '') . "\$con) + 1); - - return \$this; -} -"; - } - - protected function addInsertAtTop(&$script) - { - $script .= " -/** - * Insert in the first rank - * The modifications are not persisted until the object is saved. - * - * @return {$this->objectClassname} the current object - */ -public function insertAtTop() -{ - return \$this->insertAtRank(1); -} -"; - } - - protected function addMoveToRank(&$script) - { - $useScope = $this->behavior->useScope(); - $peerClassname = $this->peerClassname; - $script .= " -/** - * Move the object to a new rank, and shifts the rank - * Of the objects inbetween the old and new rank accordingly - * - * @param integer \$newRank rank value - * @param PropelPDO \$con optional connection - * - * @return {$this->objectClassname} the current object - * - * @throws PropelException - */ -public function moveToRank(\$newRank, PropelPDO \$con = null) -{ - if (\$this->isNew()) { - throw new PropelException('New objects cannot be moved. Please use insertAtRank() instead'); - } - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME); - } - if (\$newRank < 1 || \$newRank > {$this->queryClassname}::create()->getMaxRank(" . ($useScope ? "\$this->{$this->getColumnGetter('scope_column')}(), " : '') . "\$con)) { - throw new PropelException('Invalid rank ' . \$newRank); - } - - \$oldRank = \$this->{$this->getColumnGetter()}(); - if (\$oldRank == \$newRank) { - return \$this; - } - - \$con->beginTransaction(); - try { - // shift the objects between the old and the new rank - \$delta = (\$oldRank < \$newRank) ? -1 : 1; - $peerClassname::shiftRank(\$delta, min(\$oldRank, \$newRank), max(\$oldRank, \$newRank), " . ($useScope ? "\$this->{$this->getColumnGetter('scope_column')}(), " : '') . "\$con); - - // move the object to its new rank - \$this->{$this->getColumnSetter()}(\$newRank); - \$this->save(\$con); - - \$con->commit(); - return \$this; - } catch (Exception \$e) { - \$con->rollback(); - throw \$e; - } -} -"; - } - - protected function addSwapWith(&$script) - { - $script .= " -/** - * Exchange the rank of the object with the one passed as argument, and saves both objects - * - * @param {$this->objectClassname} \$object - * @param PropelPDO \$con optional connection - * - * @return {$this->objectClassname} the current object - * - * @throws Exception if the database cannot execute the two updates - */ -public function swapWith(\$object, PropelPDO \$con = null) -{ - if (\$con === null) { - \$con = Propel::getConnection({$this->peerClassname}::DATABASE_NAME); - } - \$con->beginTransaction(); - try { - \$oldRank = \$this->{$this->getColumnGetter()}(); - \$newRank = \$object->{$this->getColumnGetter()}(); - \$this->{$this->getColumnSetter()}(\$newRank); - \$this->save(\$con); - \$object->{$this->getColumnSetter()}(\$oldRank); - \$object->save(\$con); - \$con->commit(); - - return \$this; - } catch (Exception \$e) { - \$con->rollback(); - throw \$e; - } -} -"; - } - - protected function addMoveUp(&$script) - { - $script .= " -/** - * Move the object higher in the list, i.e. exchanges its rank with the one of the previous object - * - * @param PropelPDO \$con optional connection - * - * @return {$this->objectClassname} the current object - */ -public function moveUp(PropelPDO \$con = null) -{ - if (\$this->isFirst()) { - return \$this; - } - if (\$con === null) { - \$con = Propel::getConnection({$this->peerClassname}::DATABASE_NAME); - } - \$con->beginTransaction(); - try { - \$prev = \$this->getPrevious(\$con); - \$this->swapWith(\$prev, \$con); - \$con->commit(); - - return \$this; - } catch (Exception \$e) { - \$con->rollback(); - throw \$e; - } -} -"; - } - - protected function addMoveDown(&$script) - { - $script .= " -/** - * Move the object higher in the list, i.e. exchanges its rank with the one of the next object - * - * @param PropelPDO \$con optional connection - * - * @return {$this->objectClassname} the current object - */ -public function moveDown(PropelPDO \$con = null) -{ - if (\$this->isLast(\$con)) { - return \$this; - } - if (\$con === null) { - \$con = Propel::getConnection({$this->peerClassname}::DATABASE_NAME); - } - \$con->beginTransaction(); - try { - \$next = \$this->getNext(\$con); - \$this->swapWith(\$next, \$con); - \$con->commit(); - - return \$this; - } catch (Exception \$e) { - \$con->rollback(); - throw \$e; - } -} -"; - } - - protected function addMoveToTop(&$script) - { - $script .= " -/** - * Move the object to the top of the list - * - * @param PropelPDO \$con optional connection - * - * @return {$this->objectClassname} the current object - */ -public function moveToTop(PropelPDO \$con = null) -{ - if (\$this->isFirst()) { - return \$this; - } - return \$this->moveToRank(1, \$con); -} -"; - } - - protected function addMoveToBottom(&$script) - { - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Move the object to the bottom of the list - * - * @param PropelPDO \$con optional connection - * - * @return integer the old object's rank - */ -public function moveToBottom(PropelPDO \$con = null) -{ - if (\$this->isLast(\$con)) { - return false; - } - if (\$con === null) { - \$con = Propel::getConnection({$this->peerClassname}::DATABASE_NAME); - } - \$con->beginTransaction(); - try { - \$bottom = {$this->queryClassname}::create()->getMaxRank(" . ($useScope ? "\$this->{$this->getColumnGetter('scope_column')}(), " : '') . "\$con); - \$res = \$this->moveToRank(\$bottom, \$con); - \$con->commit(); - - return \$res; - } catch (Exception \$e) { - \$con->rollback(); - throw \$e; - } -} -"; - } - - protected function addRemoveFromList(&$script) - { - $useScope = $this->behavior->useScope(); - $peerClassname = $this->peerClassname; - $script .= " -/** - * Removes the current object from the list. - * The modifications are not persisted until the object is saved. - * - * @return {$this->objectClassname} the current object - */ -public function removeFromList() -{ - // Keep the list modification query for the save() transaction - \$this->sortableQueries []= array( - 'callable' => array('$peerClassname', 'shiftRank'), - 'arguments' => array(-1, \$this->{$this->getColumnGetter()}() + 1, null" . ($useScope ? ", \$this->{$this->getColumnGetter('scope_column')}()" : '') . ") - ); - // remove the object from the list - \$this->{$this->getColumnSetter('rank_column')}(null);"; - if ($useScope) { - $script .= " - \$this->{$this->getColumnSetter('scope_column')}(null);"; - } - $script .= " - - return \$this; -} -"; - } - - protected function addProcessSortableQueries(&$script) - { - $script .= " -/** - * Execute queries that were saved to be run inside the save transaction - */ -protected function processSortableQueries(\$con) -{ - foreach (\$this->sortableQueries as \$query) { - \$query['arguments'][]= \$con; - call_user_func_array(\$query['callable'], \$query['arguments']); - } - \$this->sortableQueries = array(); -} -"; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehaviorPeerBuilderModifier.php b/airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehaviorPeerBuilderModifier.php deleted file mode 100644 index bb2b687ff4..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehaviorPeerBuilderModifier.php +++ /dev/null @@ -1,367 +0,0 @@ - - * @package propel.generator.behavior.sortable - */ -class SortableBehaviorPeerBuilderModifier -{ - protected $behavior, $table, $builder, $objectClassname, $peerClassname; - - public function __construct($behavior) - { - $this->behavior = $behavior; - $this->table = $behavior->getTable(); - } - - protected function getParameter($key) - { - return $this->behavior->getParameter($key); - } - - protected function getColumnAttribute($name) - { - return strtolower($this->behavior->getColumnForParameter($name)->getName()); - } - - protected function getColumnConstant($name) - { - return strtoupper($this->behavior->getColumnForParameter($name)->getName()); - } - - protected function getColumnPhpName($name) - { - return $this->behavior->getColumnForParameter($name)->getPhpName(); - } - - protected function setBuilder($builder) - { - $this->builder = $builder; - $this->objectClassname = $builder->getStubObjectBuilder()->getClassname(); - $this->peerClassname = $builder->getStubPeerBuilder()->getClassname(); - } - - public function staticAttributes($builder) - { - $tableName = $this->table->getName(); - $script = " -/** - * rank column - */ -const RANK_COL = '" . $tableName . '.' . $this->getColumnConstant('rank_column') . "'; -"; - - if ($this->behavior->useScope()) { - $script .= " -/** - * Scope column for the set - */ -const SCOPE_COL = '" . $tableName . '.' . $this->getColumnConstant('scope_column') . "'; -"; - } - - return $script; - } - - /** - * Static methods - * - * @return string - */ - public function staticMethods($builder) - { - $this->setBuilder($builder); - $script = ''; - - $this->addGetMaxRank($script); - $this->addRetrieveByRank($script); - $this->addReorder($script); - $this->addDoSelectOrderByRank($script); - if ($this->behavior->useScope()) { - $this->addRetrieveList($script); - $this->addCountList($script); - $this->addDeleteList($script); - } - $this->addShiftRank($script); - - return $script; - } - - protected function addGetMaxRank(&$script) - { - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Get the highest rank - * "; - if($useScope) { - $script .= " - * @param int \$scope Scope to determine which suite to consider"; - } - $script .= " - * @param PropelPDO optional connection - * - * @return integer highest position - */ -public static function getMaxRank(" . ($useScope ? "\$scope = null, " : "") . "PropelPDO \$con = null) -{ - if (\$con === null) { - \$con = Propel::getConnection({$this->peerClassname}::DATABASE_NAME); - } - // shift the objects with a position lower than the one of object - \$c = new Criteria(); - \$c->addSelectColumn('MAX(' . {$this->peerClassname}::RANK_COL . ')');"; - if ($useScope) { - $script .= " - \$c->add({$this->peerClassname}::SCOPE_COL, \$scope, Criteria::EQUAL);"; - } - $script .= " - \$stmt = {$this->peerClassname}::doSelectStmt(\$c, \$con); - - return \$stmt->fetchColumn(); -} -"; - } - - protected function addRetrieveByRank(&$script) - { - $peerClassname = $this->peerClassname; - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Get an item from the list based on its rank - * - * @param integer \$rank rank"; - if($useScope) { - $script .= " - * @param int \$scope Scope to determine which suite to consider"; - } - $script .= " - * @param PropelPDO \$con optional connection - * - * @return {$this->objectClassname} - */ -public static function retrieveByRank(\$rank, " . ($useScope ? "\$scope = null, " : "") . "PropelPDO \$con = null) -{ - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME); - } - - \$c = new Criteria; - \$c->add($peerClassname::RANK_COL, \$rank);"; - if($useScope) { - $script .= " - \$c->add($peerClassname::SCOPE_COL, \$scope, Criteria::EQUAL);"; - } - $script .= " - - return $peerClassname::doSelectOne(\$c, \$con); -} -"; - } - - protected function addReorder(&$script) - { - $peerClassname = $this->peerClassname; - $columnGetter = 'get' . $this->behavior->getColumnForParameter('rank_column')->getPhpName(); - $columnSetter = 'set' . $this->behavior->getColumnForParameter('rank_column')->getPhpName(); - $script .= " -/** - * Reorder a set of sortable objects based on a list of id/position - * Beware that there is no check made on the positions passed - * So incoherent positions will result in an incoherent list - * - * @param array \$order id => rank pairs - * @param PropelPDO \$con optional connection - * - * @return boolean true if the reordering took place, false if a database problem prevented it - */ -public static function reorder(array \$order, PropelPDO \$con = null) -{ - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME); - } - - \$con->beginTransaction(); - try { - \$ids = array_keys(\$order); - \$objects = $peerClassname::retrieveByPKs(\$ids); - foreach (\$objects as \$object) { - \$pk = \$object->getPrimaryKey(); - if (\$object->$columnGetter() != \$order[\$pk]) { - \$object->$columnSetter(\$order[\$pk]); - \$object->save(\$con); - } - } - \$con->commit(); - - return true; - } catch (PropelException \$e) { - \$con->rollback(); - throw \$e; - } -} -"; - } - - protected function addDoSelectOrderByRank(&$script) - { - $peerClassname = $this->peerClassname; - $script .= " -/** - * Return an array of sortable objects ordered by position - * - * @param Criteria \$criteria optional criteria object - * @param string \$order sorting order, to be chosen between Criteria::ASC (default) and Criteria::DESC - * @param PropelPDO \$con optional connection - * - * @return array list of sortable objects - */ -public static function doSelectOrderByRank(Criteria \$criteria = null, \$order = Criteria::ASC, PropelPDO \$con = null) -{ - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME); - } - - if (\$criteria === null) { - \$criteria = new Criteria(); - } elseif (\$criteria instanceof Criteria) { - \$criteria = clone \$criteria; - } - - \$criteria->clearOrderByColumns(); - - if (\$order == Criteria::ASC) { - \$criteria->addAscendingOrderByColumn($peerClassname::RANK_COL); - } else { - \$criteria->addDescendingOrderByColumn($peerClassname::RANK_COL); - } - - return $peerClassname::doSelect(\$criteria, \$con); -} -"; - } - - protected function addRetrieveList(&$script) - { - $peerClassname = $this->peerClassname; - $script .= " -/** - * Return an array of sortable objects in the given scope ordered by position - * - * @param int \$scope the scope of the list - * @param string \$order sorting order, to be chosen between Criteria::ASC (default) and Criteria::DESC - * @param PropelPDO \$con optional connection - * - * @return array list of sortable objects - */ -public static function retrieveList(\$scope, \$order = Criteria::ASC, PropelPDO \$con = null) -{ - \$c = new Criteria(); - \$c->add($peerClassname::SCOPE_COL, \$scope); - - return $peerClassname::doSelectOrderByRank(\$c, \$order, \$con); -} -"; - } - - protected function addCountList(&$script) - { - $peerClassname = $this->peerClassname; - $script .= " -/** - * Return the number of sortable objects in the given scope - * - * @param int \$scope the scope of the list - * @param PropelPDO \$con optional connection - * - * @return array list of sortable objects - */ -public static function countList(\$scope, PropelPDO \$con = null) -{ - \$c = new Criteria(); - \$c->add($peerClassname::SCOPE_COL, \$scope); - - return $peerClassname::doCount(\$c, \$con); -} -"; - } - - protected function addDeleteList(&$script) - { - $peerClassname = $this->peerClassname; - $script .= " -/** - * Deletes the sortable objects in the given scope - * - * @param int \$scope the scope of the list - * @param PropelPDO \$con optional connection - * - * @return int number of deleted objects - */ -public static function deleteList(\$scope, PropelPDO \$con = null) -{ - \$c = new Criteria(); - \$c->add($peerClassname::SCOPE_COL, \$scope); - - return $peerClassname::doDelete(\$c, \$con); -} -"; - } - protected function addShiftRank(&$script) - { - $useScope = $this->behavior->useScope(); - $peerClassname = $this->peerClassname; - $script .= " -/** - * Adds \$delta to all Rank values that are >= \$first and <= \$last. - * '\$delta' can also be negative. - * - * @param int \$delta Value to be shifted by, can be negative - * @param int \$first First node to be shifted - * @param int \$last Last node to be shifted"; - if($useScope) { - $script .= " - * @param int \$scope Scope to use for the shift"; - } - $script .= " - * @param PropelPDO \$con Connection to use. - */ -public static function shiftRank(\$delta, \$first, \$last = null, " . ($useScope ? "\$scope = null, " : "") . "PropelPDO \$con = null) -{ - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - \$whereCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$criterion = \$whereCriteria->getNewCriterion($peerClassname::RANK_COL, \$first, Criteria::GREATER_EQUAL); - if (null !== \$last) { - \$criterion->addAnd(\$whereCriteria->getNewCriterion($peerClassname::RANK_COL, \$last, Criteria::LESS_EQUAL)); - } - \$whereCriteria->add(\$criterion);"; - if ($useScope) { - $script .= " - \$whereCriteria->add($peerClassname::SCOPE_COL, \$scope, Criteria::EQUAL);"; - } - $script .= " - - \$valuesCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$valuesCriteria->add($peerClassname::RANK_COL, array('raw' => $peerClassname::RANK_COL . ' + ?', 'value' => \$delta), Criteria::CUSTOM_EQUAL); - - {$this->builder->getPeerBuilder()->getBasePeerClassname()}::doUpdate(\$whereCriteria, \$valuesCriteria, \$con); - $peerClassname::clearInstancePool(); -} -"; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehaviorQueryBuilderModifier.php b/airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehaviorQueryBuilderModifier.php deleted file mode 100644 index 5e469ca326..0000000000 --- a/airtime_mvc/library/propel/generator/lib/behavior/sortable/SortableBehaviorQueryBuilderModifier.php +++ /dev/null @@ -1,283 +0,0 @@ -behavior = $behavior; - $this->table = $behavior->getTable(); - } - - protected function getParameter($key) - { - return $this->behavior->getParameter($key); - } - - protected function getColumn($name) - { - return $this->behavior->getColumnForParameter($name); - } - - protected function setBuilder($builder) - { - $this->builder = $builder; - $this->objectClassname = $builder->getStubObjectBuilder()->getClassname(); - $this->queryClassname = $builder->getStubQueryBuilder()->getClassname(); - $this->peerClassname = $builder->getStubPeerBuilder()->getClassname(); - } - - public function queryMethods($builder) - { - $this->setBuilder($builder); - $script = ''; - - // select filters - if ($this->behavior->useScope()) { - $this->addInList($script); - } - if ($this->getParameter('rank_column') != 'rank') { - $this->addFilterByRank($script); - $this->addOrderByRank($script); - } - - // select termination methods - if ($this->getParameter('rank_column') != 'rank') { - $this->addFindOneByRank($script); - } - $this->addFindList($script); - - // utilities - $this->addGetMaxRank($script); - $this->addReorder($script); - - return $script; - } - - protected function addInList(&$script) - { - $script .= " -/** - * Returns the objects in a certain list, from the list scope - * - * @param int \$scope Scope to determine which objects node to return - * - * @return {$this->queryClassname} The current query, for fuid interface - */ -public function inList(\$scope = null) -{ - return \$this->addUsingAlias({$this->peerClassname}::SCOPE_COL, \$scope, Criteria::EQUAL); -} -"; - } - - protected function addFilterByRank(&$script) - { - $useScope = $this->behavior->useScope(); - $peerClassname = $this->peerClassname; - $script .= " -/** - * Filter the query based on a rank in the list - * - * @param integer \$rank rank"; - if($useScope) { - $script .= " - * @param int \$scope Scope to determine which suite to consider"; - } - $script .= " - * - * @return " . $this->queryClassname . " The current query, for fluid interface - */ -public function filterByRank(\$rank" . ($useScope ? ", \$scope = null" : "") . ") -{ - return \$this"; - if ($useScope) { - $script .= " - ->inList(\$scope)"; - } - $script .= " - ->addUsingAlias($peerClassname::RANK_COL, \$rank, Criteria::EQUAL); -} -"; - } - - protected function addOrderByRank(&$script) - { - $script .= " -/** - * Order the query based on the rank in the list. - * Using the default \$order, returns the item with the lowest rank first - * - * @param string \$order either Criteria::ASC (default) or Criteria::DESC - * - * @return " . $this->queryClassname . " The current query, for fluid interface - */ -public function orderByRank(\$order = Criteria::ASC) -{ - \$order = strtoupper(\$order); - switch (\$order) { - case Criteria::ASC: - return \$this->addAscendingOrderByColumn(\$this->getAliasedColName(" . $this->peerClassname . "::RANK_COL)); - break; - case Criteria::DESC: - return \$this->addDescendingOrderByColumn(\$this->getAliasedColName(" . $this->peerClassname . "::RANK_COL)); - break; - default: - throw new PropelException('" . $this->queryClassname . "::orderBy() only accepts \"asc\" or \"desc\" as argument'); - } -} -"; - } - - protected function addFindOneByRank(&$script) - { - $useScope = $this->behavior->useScope(); - $peerClassname = $this->peerClassname; - $script .= " -/** - * Get an item from the list based on its rank - * - * @param integer \$rank rank"; - if($useScope) { - $script .= " - * @param int \$scope Scope to determine which suite to consider"; - } - $script .= " - * @param PropelPDO \$con optional connection - * - * @return {$this->objectClassname} - */ -public function findOneByRank(\$rank, " . ($useScope ? "\$scope = null, " : "") . "PropelPDO \$con = null) -{ - return \$this - ->filterByRank(\$rank" . ($useScope ? ", \$scope" : "") . ") - ->findOne(\$con); -} -"; - } - - protected function addFindList(&$script) - { - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Returns " . ($useScope ? 'a' : 'the') ." list of objects - *"; - if($useScope) { - $script .= " - * @param int \$scope Scope to determine which list to return"; - } - $script .= " - * @param PropelPDO \$con Connection to use. - * - * @return mixed the list of results, formatted by the current formatter - */ -public function findList(" . ($useScope ? "\$scope = null, " : "") . "\$con = null) -{ - return \$this"; - if ($useScope) { - $script .= " - ->inList(\$scope)"; - } - $script .= " - ->orderByRank() - ->find(\$con); -} -"; - } - - protected function addGetMaxRank(&$script) - { - $useScope = $this->behavior->useScope(); - $script .= " -/** - * Get the highest rank - * "; - if($useScope) { - $script .= " - * @param int \$scope Scope to determine which suite to consider"; - } - $script .= " - * @param PropelPDO optional connection - * - * @return integer highest position - */ -public function getMaxRank(" . ($useScope ? "\$scope = null, " : "") . "PropelPDO \$con = null) -{ - if (\$con === null) { - \$con = Propel::getConnection({$this->peerClassname}::DATABASE_NAME); - } - // shift the objects with a position lower than the one of object - \$this->addSelectColumn('MAX(' . {$this->peerClassname}::RANK_COL . ')');"; - if ($useScope) { - $script .= " - \$this->add({$this->peerClassname}::SCOPE_COL, \$scope, Criteria::EQUAL);"; - } - $script .= " - \$stmt = \$this->getSelectStatement(\$con); - - return \$stmt->fetchColumn(); -} -"; - } - - protected function addReorder(&$script) - { - $peerClassname = $this->peerClassname; - $columnGetter = 'get' . $this->behavior->getColumnForParameter('rank_column')->getPhpName(); - $columnSetter = 'set' . $this->behavior->getColumnForParameter('rank_column')->getPhpName(); - $script .= " -/** - * Reorder a set of sortable objects based on a list of id/position - * Beware that there is no check made on the positions passed - * So incoherent positions will result in an incoherent list - * - * @param array \$order id => rank pairs - * @param PropelPDO \$con optional connection - * - * @return boolean true if the reordering took place, false if a database problem prevented it - */ -public function reorder(array \$order, PropelPDO \$con = null) -{ - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME); - } - - \$con->beginTransaction(); - try { - \$ids = array_keys(\$order); - \$objects = \$this->findPks(\$ids, \$con); - foreach (\$objects as \$object) { - \$pk = \$object->getPrimaryKey(); - if (\$object->$columnGetter() != \$order[\$pk]) { - \$object->$columnSetter(\$order[\$pk]); - \$object->save(\$con); - } - } - \$con->commit(); - - return true; - } catch (PropelException \$e) { - \$con->rollback(); - throw \$e; - } -} -"; - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/builder/DataModelBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/DataModelBuilder.php deleted file mode 100644 index 605f0d5d1a..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/DataModelBuilder.php +++ /dev/null @@ -1,607 +0,0 @@ - - * @package propel.generator.builder - */ -abstract class DataModelBuilder -{ - - /** - * The current table. - * @var Table - */ - private $table; - - /** - * The generator config object holding build properties, etc. - * - * @var GeneratorConfig - */ - private $generatorConfig; - - /** - * An array of warning messages that can be retrieved for display (e.g. as part of phing build process). - * @var array string[] - */ - private $warnings = array(); - - /** - * Peer builder class for current table. - * @var DataModelBuilder - */ - private $peerBuilder; - - /** - * Stub Peer builder class for current table. - * @var DataModelBuilder - */ - private $stubPeerBuilder; - - /** - * Object builder class for current table. - * @var DataModelBuilder - */ - private $objectBuilder; - - /** - * Stub Object builder class for current table. - * @var DataModelBuilder - */ - private $stubObjectBuilder; - - /** - * Query builder class for current table. - * @var DataModelBuilder - */ - private $queryBuilder; - - /** - * Stub Query builder class for current table. - * @var DataModelBuilder - */ - private $stubQueryBuilder; - - /** - * TableMap builder class for current table. - * @var DataModelBuilder - */ - protected $tablemapBuilder; - - /** - * Stub Interface builder class for current table. - * @var DataModelBuilder - */ - private $interfaceBuilder; - - /** - * Stub child object for current table. - * @var DataModelBuilder - */ - private $multiExtendObjectBuilder; - - /** - * Node object builder for current table. - * @var DataModelBuilder - */ - private $nodeBuilder; - - /** - * Node peer builder for current table. - * @var DataModelBuilder - */ - private $nodePeerBuilder; - - /** - * Stub node object builder for current table. - * @var DataModelBuilder - */ - private $stubNodeBuilder; - - /** - * Stub node peer builder for current table. - * @var DataModelBuilder - */ - private $stubNodePeerBuilder; - - /** - * NestedSet object builder for current table. - * @var DataModelBuilder - */ - private $nestedSetBuilder; - - /** - * NestedSet peer builder for current table. - * @var DataModelBuilder - */ - private $nestedSetPeerBuilder; - - /** - * The DDL builder for current table. - * @var DDLBuilder - */ - private $ddlBuilder; - - /** - * The Data-SQL builder for current table. - * @var DataSQLBuilder - */ - private $dataSqlBuilder; - - /** - * The Pluralizer class to use. - * @var Pluralizer - */ - private $pluralizer; - - - /** - * Creates new instance of DataModelBuilder subclass. - * @param Table $table The Table which we are using to build [OM, DDL, etc.]. - */ - public function __construct(Table $table) - { - $this->table = $table; - } - - /** - * Returns new or existing Peer builder class for this table. - * @return PeerBuilder - */ - public function getPeerBuilder() - { - if (!isset($this->peerBuilder)) { - $this->peerBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'peer'); - } - return $this->peerBuilder; - } - - /** - * Returns new or existing Pluralizer class. - * @return Pluralizer - */ - public function getPluralizer() - { - if (!isset($this->pluralizer)) { - $this->pluralizer = $this->getGeneratorConfig()->getConfiguredPluralizer(); - } - return $this->pluralizer; - } - - /** - * Returns new or existing stub Peer builder class for this table. - * @return PeerBuilder - */ - public function getStubPeerBuilder() - { - if (!isset($this->stubPeerBuilder)) { - $this->stubPeerBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'peerstub'); - } - return $this->stubPeerBuilder; - } - - /** - * Returns new or existing Object builder class for this table. - * @return ObjectBuilder - */ - public function getObjectBuilder() - { - if (!isset($this->objectBuilder)) { - $this->objectBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'object'); - } - return $this->objectBuilder; - } - - /** - * Returns new or existing stub Object builder class for this table. - * @return ObjectBuilder - */ - public function getStubObjectBuilder() - { - if (!isset($this->stubObjectBuilder)) { - $this->stubObjectBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'objectstub'); - } - return $this->stubObjectBuilder; - } - - /** - * Returns new or existing Query builder class for this table. - * @return ObjectBuilder - */ - public function getQueryBuilder() - { - if (!isset($this->queryBuilder)) { - $this->queryBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'query'); - } - return $this->queryBuilder; - } - - /** - * Returns new or existing stub Query builder class for this table. - * @return ObjectBuilder - */ - public function getStubQueryBuilder() - { - if (!isset($this->stubQueryBuilder)) { - $this->stubQueryBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'querystub'); - } - return $this->stubQueryBuilder; - } - - /** - * Returns new or existing Object builder class for this table. - * @return ObjectBuilder - */ - public function getTableMapBuilder() - { - if (!isset($this->tablemapBuilder)) { - $this->tablemapBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'tablemap'); - } - return $this->tablemapBuilder; - } - - /** - * Returns new or existing stub Interface builder class for this table. - * @return ObjectBuilder - */ - public function getInterfaceBuilder() - { - if (!isset($this->interfaceBuilder)) { - $this->interfaceBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'interface'); - } - return $this->interfaceBuilder; - } - - /** - * Returns new or existing stub child object builder class for this table. - * @return ObjectBuilder - */ - public function getMultiExtendObjectBuilder() - { - if (!isset($this->multiExtendObjectBuilder)) { - $this->multiExtendObjectBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'objectmultiextend'); - } - return $this->multiExtendObjectBuilder; - } - - /** - * Returns new or existing node Object builder class for this table. - * @return ObjectBuilder - */ - public function getNodeBuilder() - { - if (!isset($this->nodeBuilder)) { - $this->nodeBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'node'); - } - return $this->nodeBuilder; - } - - /** - * Returns new or existing node Peer builder class for this table. - * @return PeerBuilder - */ - public function getNodePeerBuilder() - { - if (!isset($this->nodePeerBuilder)) { - $this->nodePeerBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'nodepeer'); - } - return $this->nodePeerBuilder; - } - - /** - * Returns new or existing stub node Object builder class for this table. - * @return ObjectBuilder - */ - public function getStubNodeBuilder() - { - if (!isset($this->stubNodeBuilder)) { - $this->stubNodeBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'nodestub'); - } - return $this->stubNodeBuilder; - } - - /** - * Returns new or existing stub node Peer builder class for this table. - * @return PeerBuilder - */ - public function getStubNodePeerBuilder() - { - if (!isset($this->stubNodePeerBuilder)) { - $this->stubNodePeerBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'nodepeerstub'); - } - return $this->stubNodePeerBuilder; - } - - /** - * Returns new or existing nested set object builder class for this table. - * @return ObjectBuilder - */ - public function getNestedSetBuilder() - { - if (!isset($this->nestedSetBuilder)) { - $this->nestedSetBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'nestedset'); - } - return $this->nestedSetBuilder; - } - - /** - * Returns new or existing nested set Peer builder class for this table. - * @return PeerBuilder - */ - public function getNestedSetPeerBuilder() - { - if (!isset($this->nestedSetPeerBuilder)) { - $this->nestedSetPeerBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'nestedsetpeer'); - } - return $this->nestedSetPeerBuilder; - } - - /** - * Returns new or existing ddl builder class for this table. - * @return DDLBuilder - */ - public function getDDLBuilder() - { - if (!isset($this->ddlBuilder)) { - $this->ddlBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'ddl'); - } - return $this->ddlBuilder; - } - - /** - * Returns new or existing data sql builder class for this table. - * @return DataSQLBuilder - */ - public function getDataSQLBuilder() - { - if (!isset($this->dataSqlBuilder)) { - $this->dataSqlBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'datasql'); - } - return $this->dataSqlBuilder; - } - - /** - * Convenience method to return a NEW Peer class builder instance. - * - * This is used very frequently from the peer and object builders to get - * a peer builder for a RELATED table. - * - * @param Table $table - * @return PeerBuilder - */ - public function getNewPeerBuilder(Table $table) - { - return $this->getGeneratorConfig()->getConfiguredBuilder($table, 'peer'); - } - - /** - * Convenience method to return a NEW Peer stub class builder instance. - * - * This is used from the peer and object builders to get - * a peer builder for a RELATED table. - * - * @param Table $table - * @return PeerBuilder - */ - public function getNewStubPeerBuilder(Table $table) - { - return $this->getGeneratorConfig()->getConfiguredBuilder($table, 'peerstub'); - } - - /** - * Convenience method to return a NEW Object class builder instance. - * - * This is used very frequently from the peer and object builders to get - * an object builder for a RELATED table. - * - * @param Table $table - * @return ObjectBuilder - */ - public function getNewObjectBuilder(Table $table) - { - return $this->getGeneratorConfig()->getConfiguredBuilder($table, 'object'); - } - - /** - * Convenience method to return a NEW Object stub class builder instance. - * - * This is used from the query builders to get - * an object builder for a RELATED table. - * - * @param Table $table - * @return ObjectBuilder - */ - public function getNewStubObjectBuilder(Table $table) - { - return $this->getGeneratorConfig()->getConfiguredBuilder($table, 'objectstub'); - } - - /** - * Convenience method to return a NEW query class builder instance. - * - * This is used from the query builders to get - * a query builder for a RELATED table. - * - * @param Table $table - * @return QueryBuilder - */ - public function getNewQueryBuilder(Table $table) - { - return $this->getGeneratorConfig()->getConfiguredBuilder($table, 'query'); - } - - /** - * Convenience method to return a NEW query stub class builder instance. - * - * This is used from the query builders to get - * a query builder for a RELATED table. - * - * @param Table $table - * @return QueryBuilder - */ - public function getNewStubQueryBuilder(Table $table) - { - return $this->getGeneratorConfig()->getConfiguredBuilder($table, 'querystub'); - } - - /** - * Returns new Query Inheritance builder class for this table. - * @return ObjectBuilder - */ - public function getNewQueryInheritanceBuilder($child) - { - $queryInheritanceBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'queryinheritance'); - $queryInheritanceBuilder->setChild($child); - return $queryInheritanceBuilder; - } - - /** - * Returns new stub Query Inheritance builder class for this table. - * @return ObjectBuilder - */ - public function getNewStubQueryInheritanceBuilder($child) - { - $stubQueryInheritanceBuilder = $this->getGeneratorConfig()->getConfiguredBuilder($this->getTable(), 'queryinheritancestub'); - $stubQueryInheritanceBuilder->setChild($child); - return $stubQueryInheritanceBuilder; - } - - /** - * Gets the GeneratorConfig object. - * - * @return GeneratorConfig - */ - public function getGeneratorConfig() - { - return $this->generatorConfig; - } - - /** - * Get a specific [name transformed] build property. - * - * @param string $name - * @return string - */ - public function getBuildProperty($name) - { - if ($this->getGeneratorConfig()) { - return $this->getGeneratorConfig()->getBuildProperty($name); - } - return null; // just to be explicit - } - - /** - * Sets the GeneratorConfig object. - * - * @param GeneratorConfig $v - */ - public function setGeneratorConfig(GeneratorConfig $v) - { - $this->generatorConfig = $v; - } - - /** - * Sets the table for this builder. - * @param Table $table - */ - public function setTable(Table $table) - { - $this->table = $table; - } - - /** - * Returns the current Table object. - * @return Table - */ - public function getTable() - { - return $this->table; - } - - /** - * Convenience method to returns the Platform class for this table (database). - * @return Platform - */ - public function getPlatform() - { - if ($this->getTable() && $this->getTable()->getDatabase()) { - return $this->getTable()->getDatabase()->getPlatform(); - } - } - - /** - * Convenience method to returns the database for current table. - * @return Database - */ - public function getDatabase() - { - if ($this->getTable()) { - return $this->getTable()->getDatabase(); - } - } - - /** - * Pushes a message onto the stack of warnings. - * @param string $msg The warning message. - */ - protected function warn($msg) - { - $this->warnings[] = $msg; - } - - /** - * Gets array of warning messages. - * @return array string[] - */ - public function getWarnings() - { - return $this->warnings; - } - - /** - * Wraps call to Platform->quoteIdentifier() with a check to see whether quoting is enabled. - * - * All subclasses should call this quoteIdentifier() method rather than calling the Platform - * method directly. This method is used by both DataSQLBuilder and DDLBuilder, and potentially - * in the OM builders also, which is why it is defined in this class. - * - * @param string $text The text to quote. - * @return string Quoted text. - */ - public function quoteIdentifier($text) - { - if (!$this->getBuildProperty('disableIdentifierQuoting')) { - return $this->getPlatform()->quoteIdentifier($text); - } - return $text; - } - - /** - * Returns the name of the current class being built, with a possible prefix. - * @return string - * @see OMBuilder#getClassname() - */ - public function prefixClassname($identifier) - { - return $this->getBuildProperty('classPrefix') . $identifier; - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/ClassTools.php b/airtime_mvc/library/propel/generator/lib/builder/om/ClassTools.php deleted file mode 100644 index 5e3b5a5f23..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/ClassTools.php +++ /dev/null @@ -1,120 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.generator.builder.om - */ -class ClassTools -{ - - /** - * Gets just classname, given a dot-path to class. - * @param string $qualifiedName - * @return string - */ - public static function classname($qualifiedName) - { - $pos = strrpos($qualifiedName, '.'); - if ($pos === false) { - return $qualifiedName; // there is no '.' in the qualifed name - } else { - return substr($qualifiedName, $pos + 1); // start just after '.' - } - } - - /** - * Gets the path to be used in include()/require() statement. - * - * Supports multiple function signatures: - * - * (1) getFilePath($dotPathClass); - * (2) getFilePath($dotPathPrefix, $className); - * (3) getFilePath($dotPathPrefix, $className, $extension); - * - * @param string $path dot-path to class or to package prefix. - * @param string $classname class name - * @param string $extension The extension to use on the file. - * @return string The constructed file path. - */ - public static function getFilePath($path, $classname = null, $extension = '.php') - { - $path = strtr(ltrim($path, '.'), '.', '/'); - if ($classname !== null) { - if ($path !== "") { $path .= '/'; } - return $path . $classname . $extension; - } else { - return $path . $extension; - } - } - - /** - * Gets the basePeer path if specified for table/db. - * If not, will return 'propel.util.BasePeer' - * @return string - */ - public static function getBasePeer(Table $table) { - $class = $table->getBasePeer(); - if ($class === null) { - $class = "propel.util.BasePeer"; - } - return $class; - } - - /** - * Gets the baseClass path if specified for table/db. - * If not, will return 'propel.om.BaseObject' - * @return string - */ - public static function getBaseClass(Table $table) { - $class = $table->getBaseClass(); - if ($class === null) { - $class = "propel.om.BaseObject"; - } - return $class; - } - - /** - * Gets the interface path if specified for table. - * If not, will return 'propel.om.Persistent'. - * @return string - */ - public static function getInterface(Table $table) { - $interface = $table->getInterface(); - if ($interface === null && !$table->isReadOnly()) { - $interface = "propel.om.Persistent"; - } - return $interface; - } - - /** - * Gets a list of PHP reserved words. - * - * @return array string[] - */ - public static function getPhpReservedWords() - { - return array( - 'and', 'or', 'xor', 'exception', '__FILE__', '__LINE__', - 'array', 'as', 'break', 'case', 'class', 'const', 'continue', - 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', - 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', - 'eval', 'exit', 'extends', 'for', 'foreach', 'function', 'global', - 'if', 'include', 'include_once', 'isset', 'list', 'new', 'print', 'require', - 'require_once', 'return', 'static', 'switch', 'unset', 'use', 'var', 'while', - '__FUNCTION__', '__CLASS__', '__METHOD__', 'final', 'php_user_filter', 'interface', - 'implements', 'extends', 'public', 'protected', 'private', 'abstract', 'clone', 'try', 'catch', - 'throw', 'this', 'namespace' - ); - } -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/ExtensionQueryBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/ExtensionQueryBuilder.php deleted file mode 100644 index 8472c677c4..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/ExtensionQueryBuilder.php +++ /dev/null @@ -1,139 +0,0 @@ -getTable()->getPhpName() . 'Query'; - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - $requiredClassFilePath = $this->getQueryBuilder()->getClassFilePath(); - - $script .=" -require '".$requiredClassFilePath."'; -"; - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - $table = $this->getTable(); - $this->declareClassFromBuilder($this->getQueryBuilder()); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - $baseClassname = $this->getQueryBuilder()->getClassname(); - - $script .= " - -/** - * Skeleton subclass for performing query and update operations on the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * You should add additional methods to this class to meet the - * application requirements. This class will only be generated as - * long as it does not already exist in the output directory. - * - * @package propel.generator.".$this->getPackage()." - */ -class ".$this->getClassname()." extends $baseClassname { -"; - } - - /** - * Specifies the methods that are added as part of the stub query class. - * - * By default there are no methods for the empty stub classes; override this method - * if you want to change that behavior. - * - * @see QueryBuilder::addClassBody() - */ - - protected function addClassBody(&$script) - { - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - $this->applyBehaviorModifier('extensionQueryFilter', $script, ""); - } - - /** - * Checks whether any registered behavior on that table has a modifier for a hook - * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" - * @return boolean - */ - public function hasBehaviorModifier($hookName, $modifier = null) - { - return parent::hasBehaviorModifier($hookName, 'QueryBuilderModifier'); - } - - /** - * Checks whether any registered behavior on that table has a modifier for a hook - * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" - * @param string &$script The script will be modified in this method. - */ - public function applyBehaviorModifier($hookName, &$script, $tab = " ") - { - return $this->applyBehaviorModifierBase($hookName, 'QueryBuilderModifier', $script, $tab); - } - - /** - * Checks whether any registered behavior content creator on that table exists a contentName - * @param string $contentName The name of the content as called from one of this class methods, e.g. "parentClassname" - */ - public function getBehaviorContent($contentName) - { - return $this->getBehaviorContentBase($contentName, 'QueryBuilderModifier'); - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/ExtensionQueryInheritanceBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/ExtensionQueryInheritanceBuilder.php deleted file mode 100644 index 2b8e3f30e9..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/ExtensionQueryInheritanceBuilder.php +++ /dev/null @@ -1,138 +0,0 @@ -getChild()->getClassName() . 'Query'; - } - - /** - * Set the child object that we're operating on currrently. - * @param $child Inheritance - */ - public function setChild(Inheritance $child) - { - $this->child = $child; - } - - /** - * Returns the child object we're operating on currently. - * @return Inheritance - * @throws BuildException - if child was not set. - */ - public function getChild() - { - if (!$this->child) { - throw new BuildException("The PHP5MultiExtendObjectBuilder needs to be told which child class to build (via setChild() method) before it can build the stub class."); - } - return $this->child; - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - $requiredClassFilePath = $this->getStubQueryBuilder()->getClassFilePath(); - - $script .=" -require '".$requiredClassFilePath."'; -"; - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - $table = $this->getTable(); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - - $baseBuilder = $this->getNewQueryInheritanceBuilder($this->getChild()); - $this->declareClassFromBuilder($baseBuilder); - $baseClassname = $baseBuilder->getClassname(); - - $script .= " - -/** - * Skeleton subclass for representing a query for one of the subclasses of the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * You should add additional methods to this class to meet the - * application requirements. This class will only be generated as - * long as it does not already exist in the output directory. - * - * @package propel.generator.".$this->getPackage()." - */ -class " .$this->getClassname() . " extends " . $baseClassname . " { -"; - } - - /** - * Specifies the methods that are added as part of the stub object class. - * - * By default there are no methods for the empty stub classes; override this method - * if you want to change that behavior. - * - * @see ObjectBuilder::addClassBody() - */ - protected function addClassBody(&$script) - { - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - } - -} // MultiExtensionQueryBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/OMBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/OMBuilder.php deleted file mode 100644 index c783347087..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/OMBuilder.php +++ /dev/null @@ -1,526 +0,0 @@ - - * @package propel.generator.builder.om - */ -abstract class OMBuilder extends DataModelBuilder -{ - /** - * Declared fully qualified classnames, to build the 'namespace' statements - * according to this table's namespace. - * @var array - */ - protected $declaredClasses = array(); - - /** - * Builds the PHP source for current class and returns it as a string. - * - * This is the main entry point and defines a basic structure that classes should follow. - * In most cases this method will not need to be overridden by subclasses. This method - * does assume that the output language is PHP code, so it will need to be overridden if - * this is not the case. - * - * @return string The resulting PHP sourcecode. - */ - public function build() - { - $this->validateModel(); - - $script = ''; - if ($this->isAddIncludes()) { - $this->addIncludes($script); - } - $this->addClassOpen($script); - $this->addClassBody($script); - $this->addClassClose($script); - - if($useStatements = $this->getUseStatements($ignoredNamespace = $this->getNamespace())) { - $script = $useStatements . $script; - } - if($namespaceStatement = $this->getNamespaceStatement()) { - $script = $namespaceStatement . $script; - } - //if($this->getTable()->getName() == 'book_club_list') die($ignoredNamespace); - - return "<" . "?php - -" . $script; - } - - /** - * Validates the current table to make sure that it won't - * result in generated code that will not parse. - * - * This method may emit warnings for code which may cause problems - * and will throw exceptions for errors that will definitely cause - * problems. - */ - protected function validateModel() - { - // Validation is currently only implemented in the subclasses. - } - - /** - * Creates a $obj = new Book(); code snippet. Can be used by frameworks, for instance, to - * extend this behavior, e.g. initialize the object after creating the instance or so. - * - * @return string Some code - */ - public function buildObjectInstanceCreationCode($objName, $clsName) - { - return "$objName = new $clsName();"; - } - - /** - * Returns the qualified (prefixed) classname that is being built by the current class. - * This method must be implemented by child classes. - * @return string - */ - abstract public function getUnprefixedClassname(); - - /** - * Returns the prefixed classname that is being built by the current class. - * @return string - * @see DataModelBuilder#prefixClassname() - */ - public function getClassname() - { - return $this->prefixClassname($this->getUnprefixedClassname()); - } - - /** - * Returns the namespaced classname if there is a namespace, and the raw classname otherwise - * @return string - */ - public function getFullyQualifiedClassname() - { - if ($namespace = $this->getNamespace()) { - return $namespace . '\\' . $this->getClassname(); - } else { - return $this->getClassname(); - } - } - - /** - * Gets the dot-path representation of current class being built. - * @return string - */ - public function getClasspath() - { - if ($this->getPackage()) { - $path = $this->getPackage() . '.' . $this->getClassname(); - } else { - $path = $this->getClassname(); - } - return $path; - } - - /** - * Gets the full path to the file for the current class. - * @return string - */ - public function getClassFilePath() - { - return ClassTools::getFilePath($this->getPackage(), $this->getClassname()); - } - - /** - * Gets package name for this table. - * This is overridden by child classes that have different packages. - * @return string - */ - public function getPackage() - { - $pkg = ($this->getTable()->getPackage() ? $this->getTable()->getPackage() : $this->getDatabase()->getPackage()); - if (!$pkg) { - $pkg = $this->getBuildProperty('targetPackage'); - } - return $pkg; - } - - /** - * Returns filesystem path for current package. - * @return string - */ - public function getPackagePath() - { - return strtr($this->getPackage(), '.', '/'); - } - - /** - * Return the user-defined namespace for this table, - * or the database namespace otherwise. - * - * @return string - */ - public function getNamespace() - { - return $this->getTable()->getNamespace(); - } - - public function declareClassNamespace($class, $namespace = '') - { - if (isset($this->declaredClasses[$namespace]) - && in_array($class, $this->declaredClasses[$namespace])) { - return; - } - $this->declaredClasses[$namespace][] = $class; - } - - public function declareClass($fullyQualifiedClassName) - { - $fullyQualifiedClassName = trim($fullyQualifiedClassName, '\\'); - if (($pos = strrpos($fullyQualifiedClassName, '\\')) !== false) { - $this->declareClassNamespace(substr($fullyQualifiedClassName, $pos + 1), substr($fullyQualifiedClassName, 0, $pos)); - } else { - // root namespace - $this->declareClassNamespace($fullyQualifiedClassName); - } - } - - public function declareClassFromBuilder($builder) - { - $this->declareClassNamespace($builder->getClassname(), $builder->getNamespace()); - } - - public function declareClasses() - { - $args = func_get_args(); - foreach ($args as $class) { - $this->declareClass($class); - } - } - - public function getDeclaredClasses($namespace = null) - { - if (null !== $namespace && isset($this->declaredClasses[$namespace])) { - return $this->declaredClasses[$namespace]; - } else { - return $this->declaredClasses; - } - } - - public function getNamespaceStatement() - { - $namespace = $this->getNamespace(); - if ($namespace != '') { - return sprintf("namespace %s; - -", $namespace); - } - } - - public function getUseStatements($ignoredNamespace = null) - { - $declaredClasses = $this->declaredClasses; - unset($declaredClasses[$ignoredNamespace]); - ksort($declaredClasses); - foreach ($declaredClasses as $namespace => $classes) { - sort($classes); - foreach ($classes as $class) { - $script .= sprintf("use %s\\%s; -", $namespace, $class); - } - } - return $script; - } - - /** - * Shortcut method to return the [stub] peer classname for current table. - * This is the classname that is used whenever object or peer classes want - * to invoke methods of the peer classes. - * @return string (e.g. 'MyPeer') - * @see StubPeerBuilder::getClassname() - */ - public function getPeerClassname() { - return $this->getStubPeerBuilder()->getClassname(); - } - - /** - * Shortcut method to return the [stub] query classname for current table. - * This is the classname that is used whenever object or peer classes want - * to invoke methods of the query classes. - * @return string (e.g. 'Myquery') - * @see StubQueryBuilder::getClassname() - */ - public function getQueryClassname() { - return $this->getStubQueryBuilder()->getClassname(); - } - - /** - * Returns the object classname for current table. - * This is the classname that is used whenever object or peer classes want - * to invoke methods of the object classes. - * @return string (e.g. 'My') - * @see StubPeerBuilder::getClassname() - */ - public function getObjectClassname() { - return $this->getStubObjectBuilder()->getClassname(); - } - - /** - * Get the column constant name (e.g. PeerName::COLUMN_NAME). - * - * @param Column $col The column we need a name for. - * @param string $classname The Peer classname to use. - * - * @return string If $classname is provided, then will return $classname::COLUMN_NAME; if not, then the peername is looked up for current table to yield $currTablePeer::COLUMN_NAME. - */ - public function getColumnConstant($col, $classname = null) - { - if ($col === null) { - $e = new Exception("No col specified."); - print $e; - throw $e; - } - if ($classname === null) { - return $this->getBuildProperty('classPrefix') . $col->getConstantName(); - } - // was it overridden in schema.xml ? - if ($col->getPeerName()) { - $const = strtoupper($col->getPeerName()); - } else { - $const = strtoupper($col->getName()); - } - return $classname.'::'.$const; - } - - /** - * Gets the basePeer path if specified for table/db. - * If not, will return 'propel.util.BasePeer' - * @return string - */ - public function getBasePeer(Table $table) { - $class = $table->getBasePeer(); - if ($class === null) { - $class = "propel.util.BasePeer"; - } - return $class; - } - - /** - * Convenience method to get the foreign Table object for an fkey. - * @deprecated use ForeignKey::getForeignTable() instead - * @return Table - */ - protected function getForeignTable(ForeignKey $fk) - { - return $this->getTable()->getDatabase()->getTable($fk->getForeignTableName()); - } - - /** - * Convenience method to get the default Join Type for a relation. - * If the key is required, an INNER JOIN will be returned, else a LEFT JOIN will be suggested, - * unless the schema is provided with the DefaultJoin attribute, which overrules the default Join Type - * - * @param ForeignKey $fk - * @return string - */ - protected function getJoinType(ForeignKey $fk) - { - return $fk->getDefaultJoin() ? - "'".$fk->getDefaultJoin()."'" : - ($fk->isLocalColumnsRequired() ? 'Criteria::INNER_JOIN' : 'Criteria::LEFT_JOIN'); - } - - /** - * Gets the PHP method name affix to be used for fkeys for the current table (not referrers to this table). - * - * The difference between this method and the getRefFKPhpNameAffix() method is that in this method the - * classname in the affix is the foreign table classname. - * - * @param ForeignKey $fk The local FK that we need a name for. - * @param boolean $plural Whether the php name should be plural (e.g. initRelatedObjs() vs. addRelatedObj() - * @return string - */ - public function getFKPhpNameAffix(ForeignKey $fk, $plural = false) - { - if ($fk->getPhpName()) { - if ($plural) { - return $this->getPluralizer()->getPluralForm($fk->getPhpName()); - } else { - return $fk->getPhpName(); - } - } else { - $className = $fk->getForeignTable()->getPhpName(); - if ($plural) { - $className = $this->getPluralizer()->getPluralForm($className); - } - return $className . $this->getRelatedBySuffix($fk); - } - } - - /** - * Gets the "RelatedBy*" suffix (if needed) that is attached to method and variable names. - * - * The related by suffix is based on the local columns of the foreign key. If there is more than - * one column in a table that points to the same foreign table, then a 'RelatedByLocalColName' suffix - * will be appended. - * - * @return string - */ - protected static function getRelatedBySuffix(ForeignKey $fk) - { - $relCol = ''; - foreach ($fk->getLocalForeignMapping() as $localColumnName => $foreignColumnName) { - $localTable = $fk->getTable(); - $localColumn = $localTable->getColumn($localColumnName); - if (!$localColumn) { - throw new Exception("Could not fetch column: $columnName in table " . $localTable->getName()); - } - if (count($localTable->getForeignKeysReferencingTable($fk->getForeignTableName())) > 1 - || count($fk->getForeignTable()->getForeignKeysReferencingTable($fk->getTableName())) > 0 - || $fk->getForeignTableName() == $fk->getTableName()) { - // self referential foreign key, or several foreign keys to the same table, or cross-reference fkey - $relCol .= $localColumn->getPhpName(); - } - } - - if ($relCol != '') { - $relCol = 'RelatedBy' . $relCol; - } - - return $relCol; - } - - /** - * Gets the PHP method name affix to be used for referencing foreign key methods and variable names (e.g. set????(), $coll???). - * - * The difference between this method and the getFKPhpNameAffix() method is that in this method the - * classname in the affix is the classname of the local fkey table. - * - * @param ForeignKey $fk The referrer FK that we need a name for. - * @param boolean $plural Whether the php name should be plural (e.g. initRelatedObjs() vs. addRelatedObj() - * @return string - */ - public function getRefFKPhpNameAffix(ForeignKey $fk, $plural = false) - { - if ($fk->getRefPhpName()) { - if ($plural) { - return $this->getPluralizer()->getPluralForm($fk->getRefPhpName()); - } else { - return $fk->getRefPhpName(); - } - } else { - $className = $fk->getTable()->getPhpName(); - if ($plural) { - $className = $this->getPluralizer()->getPluralForm($className); - } - return $className . $this->getRefRelatedBySuffix($fk); - } - } - - protected static function getRefRelatedBySuffix(ForeignKey $fk) - { - $relCol = ''; - foreach ($fk->getLocalForeignMapping() as $localColumnName => $foreignColumnName) { - $localTable = $fk->getTable(); - $localColumn = $localTable->getColumn($localColumnName); - if (!$localColumn) { - throw new Exception("Could not fetch column: $columnName in table " . $localTable->getName()); - } - $foreignKeysToForeignTable = $localTable->getForeignKeysReferencingTable($fk->getForeignTableName()); - if ($fk->getForeignTableName() == $fk->getTableName()) { - // self referential foreign key - $relCol .= $fk->getForeignTable()->getColumn($foreignColumnName)->getPhpName(); - if (count($foreignKeysToForeignTable) > 1) { - // several self-referential foreign keys - $relCol .= array_search($fk, $foreignKeysToForeignTable); - } - } elseif (count($foreignKeysToForeignTable) > 1 || count($fk->getForeignTable()->getForeignKeysReferencingTable($fk->getTableName())) > 0) { - // several foreign keys to the same table, or symmetrical foreign key in foreign table - $relCol .= $localColumn->getPhpName(); - } - } - - if ($relCol != '') { - $relCol = 'RelatedBy' . $relCol; - } - - return $relCol; - } - - /** - * Whether to add the include statements. - * This is based on the build property propel.addIncludes - */ - protected function isAddIncludes() - { - return $this->getBuildProperty('addIncludes'); - } - - /** - * Checks whether any registered behavior on that table has a modifier for a hook - * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" - * @param string $modifier The name of the modifier object providing the method in the behavior - * @return boolean - */ - public function hasBehaviorModifier($hookName, $modifier) - { - $modifierGetter = 'get' . $modifier; - foreach ($this->getTable()->getBehaviors() as $behavior) { - if(method_exists($behavior->$modifierGetter(), $hookName)) { - return true; - } - } - return false; - } - - /** - * Checks whether any registered behavior on that table has a modifier for a hook - * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" - * @param string $modifier The name of the modifier object providing the method in the behavior - * @param string &$script The script will be modified in this method. - */ - public function applyBehaviorModifierBase($hookName, $modifier, &$script, $tab = " ") - { - $modifierGetter = 'get' . $modifier; - foreach ($this->getTable()->getBehaviors() as $behavior) { - $modifier = $behavior->$modifierGetter(); - if(method_exists($modifier, $hookName)) { - if (strpos($hookName, 'Filter') !== false) { - // filter hook: the script string will be modified by the behavior - $modifier->$hookName($script, $this); - } else { - // regular hook: the behavior returns a string to append to the script string - $script .= "\n" . $tab . '// ' . $behavior->getName() . " behavior\n"; - $script .= preg_replace('/^/m', $tab, $modifier->$hookName($this)); - } - } - } - } - - /** - * Checks whether any registered behavior content creator on that table exists a contentName - * @param string $contentName The name of the content as called from one of this class methods, e.g. "parentClassname" - * @param string $modifier The name of the modifier object providing the method in the behavior - */ - public function getBehaviorContentBase($contentName, $modifier) - { - $modifierGetter = 'get' . $modifier; - foreach ($this->getTable()->getBehaviors() as $behavior) { - $modifier = $behavior->$modifierGetter(); - if(method_exists($modifier, $contentName)) { - return $modifier->$contentName($this); - } - } - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/ObjectBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/ObjectBuilder.php deleted file mode 100644 index a8ed43bfd5..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/ObjectBuilder.php +++ /dev/null @@ -1,186 +0,0 @@ - - * @package propel.generator.builder.om - */ -abstract class ObjectBuilder extends OMBuilder -{ - - /** - * Constructs a new PeerBuilder subclass. - */ - public function __construct(Table $table) { - parent::__construct($table); - } - - /** - * This method adds the contents of the generated class to the script. - * - * This method is abstract and should be overridden by the subclasses. - * - * Hint: Override this method in your subclass if you want to reorganize or - * drastically change the contents of the generated peer class. - * - * @param string &$script The script will be modified in this method. - */ - abstract protected function addClassBody(&$script); - - /** - * Adds the getter methods for the column values. - * This is here because it is probably generic enough to apply to templates being generated - * in different langauges (e.g. PHP4 and PHP5). - * @param string &$script The script will be modified in this method. - */ - protected function addColumnAccessorMethods(&$script) - { - $table = $this->getTable(); - - foreach ($table->getColumns() as $col) { - - // if they're not using the DateTime class than we will generate "compatibility" accessor method - if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) { - $this->addTemporalAccessor($script, $col); - } else { - $this->addDefaultAccessor($script, $col); - } - - if ($col->isLazyLoad()) { - $this->addLazyLoader($script, $col); - } - } - } - - /** - * Adds the mutator (setter) methods for setting column values. - * This is here because it is probably generic enough to apply to templates being generated - * in different langauges (e.g. PHP4 and PHP5). - * @param string &$script The script will be modified in this method. - */ - protected function addColumnMutatorMethods(&$script) - { - foreach ($this->getTable()->getColumns() as $col) { - - if ($col->isLobType()) { - $this->addLobMutator($script, $col); - } elseif ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) { - $this->addTemporalMutator($script, $col); - } else { - $this->addDefaultMutator($script, $col); - } - } - } - - - /** - * Gets the baseClass path if specified for table/db. - * If not, will return 'propel.om.BaseObject' - * @return string - */ - protected function getBaseClass() { - $class = $this->getTable()->getBaseClass(); - if ($class === null) { - $class = "propel.om.BaseObject"; - } - return $class; - } - - /** - * Gets the interface path if specified for current table. - * If not, will return 'propel.om.Persistent'. - * @return string - */ - protected function getInterface() { - $interface = $this->getTable()->getInterface(); - if ($interface === null && !$this->getTable()->isReadOnly()) { - $interface = "propel.om.Persistent"; - } - return $interface; - } - - /** - * Whether to add the generic mutator methods (setByName(), setByPosition(), fromArray()). - * This is based on the build property propel.addGenericMutators, and also whether the - * table is read-only or an alias. - */ - protected function isAddGenericMutators() - { - $table = $this->getTable(); - return (!$table->isAlias() && $this->getBuildProperty('addGenericMutators') && !$table->isReadOnly()); - } - - /** - * Whether to add the generic accessor methods (getByName(), getByPosition(), toArray()). - * This is based on the build property propel.addGenericAccessors, and also whether the - * table is an alias. - */ - protected function isAddGenericAccessors() - { - $table = $this->getTable(); - return (!$table->isAlias() && $this->getBuildProperty('addGenericAccessors')); - } - - /** - * Whether to add the validate() method. - * This is based on the build property propel.addValidateMethod - */ - protected function isAddValidateMethod() - { - return $this->getBuildProperty('addValidateMethod'); - } - - protected function hasDefaultValues() - { - foreach ($this->getTable()->getColumns() as $col) { - if($col->getDefaultValue() !== null) return true; - } - return false; - } - - /** - * Checks whether any registered behavior on that table has a modifier for a hook - * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" - * @return boolean - */ - public function hasBehaviorModifier($hookName, $modifier = null) - { - return parent::hasBehaviorModifier($hookName, 'ObjectBuilderModifier'); - } - - /** - * Checks whether any registered behavior on that table has a modifier for a hook - * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" - * @param string &$script The script will be modified in this method. - */ - public function applyBehaviorModifier($hookName, &$script, $tab = " ") - { - return $this->applyBehaviorModifierBase($hookName, 'ObjectBuilderModifier', $script, $tab); - } - - /** - * Checks whether any registered behavior content creator on that table exists a contentName - * @param string $contentName The name of the content as called from one of this class methods, e.g. "parentClassname" - */ - public function getBehaviorContent($contentName) - { - return $this->getBehaviorContentBase($contentName, 'ObjectBuilderModifier'); - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionNodeBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionNodeBuilder.php deleted file mode 100644 index 8b1bdae652..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionNodeBuilder.php +++ /dev/null @@ -1,111 +0,0 @@ - - * @package propel.generator.builder.om - */ -class PHP5ExtensionNodeBuilder extends ObjectBuilder -{ - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return $this->getTable()->getPhpName() . 'Node'; - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - $script .= " -require '".$this->getNodeBuilder()->getClassFilePath()."'; -"; - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - - $table = $this->getTable(); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - - $baseClassname = $this->getNodeBuilder()->getClassname(); - - $script .= " - -/** - * Skeleton subclass for representing a node from the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * You should add additional methods to this class to meet the - * application requirements. This class will only be generated as - * long as it does not already exist in the output directory. - * - * @package propel.generator.".$this->getPackage()." - */ -class ".$this->getClassname()." extends $baseClassname { -"; - } - - /** - * Specifies the methods that are added as part of the stub object class. - * - * By default there are no methods for the empty stub classes; override this method - * if you want to change that behavior. - * - * @see ObjectBuilder::addClassBody() - */ - protected function addClassBody(&$script) - { - // there is no class body - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - } - -} // PHP5ExtensionObjectBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionNodePeerBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionNodePeerBuilder.php deleted file mode 100644 index 8f5f16cf46..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionNodePeerBuilder.php +++ /dev/null @@ -1,112 +0,0 @@ - - * @package propel.generator.builder.om - */ -class PHP5ExtensionNodePeerBuilder extends PeerBuilder -{ - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return $this->getStubNodeBuilder()->getClassname() . 'Peer'; - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - $script .=" -require '".$this->getNodePeerBuilder()->getClassFilePath()."'; -"; - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - - $table = $this->getTable(); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - - $baseClassname = $this->getNodePeerBuilder()->getClassname(); - - $script .= " - -/** - * Skeleton subclass for performing query and update operations on nodes of the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * You should add additional methods to this class to meet the - * application requirements. This class will only be generated as - * long as it does not already exist in the output directory. - * - * @package propel.generator.".$this->getPackage()." - */ -class ".$this->getClassname()." extends $baseClassname { -"; - } - - /** - * Specifies the methods that are added as part of the stub peer class. - * - * By default there are no methods for the empty stub classes; override this method - * if you want to change that behavior. - * - * @see ObjectBuilder::addClassBody() - */ - - protected function addClassBody(&$script) - { - // there is no class body - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - } - -} // PHP5ExtensionPeerBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionObjectBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionObjectBuilder.php deleted file mode 100644 index b88e1df0d8..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionObjectBuilder.php +++ /dev/null @@ -1,133 +0,0 @@ - - * @package propel.generator.builder.om - */ -class PHP5ExtensionObjectBuilder extends ObjectBuilder -{ - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return $this->getTable()->getPhpName(); - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - switch($this->getTable()->treeMode()) { - case 'NestedSet': - $requiredClassFilePath = $this->getNestedSetBuilder()->getClassFilePath(); - break; - - case 'MaterializedPath': - case 'AdjacencyList': - default: - $requiredClassFilePath = $this->getObjectBuilder()->getClassFilePath(); - break; - } - - $script .=" -require '".$requiredClassFilePath."'; -"; - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - $table = $this->getTable(); - $this->declareClassFromBuilder($this->getObjectBuilder()); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - - switch($table->treeMode()) { - case 'NestedSet': - $baseClassname = $this->getNestedSetBuilder()->getClassname(); - break; - - case 'MaterializedPath': - case "AdjacencyList": - default: - $baseClassname = $this->getObjectBuilder()->getClassname(); - break; - } - - $script .= " - -/** - * Skeleton subclass for representing a row from the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * You should add additional methods to this class to meet the - * application requirements. This class will only be generated as - * long as it does not already exist in the output directory. - * - * @package propel.generator.".$this->getPackage()." - */ -".($table->isAbstract() ? "abstract " : "")."class ".$this->getClassname()." extends $baseClassname { -"; - } - - /** - * Specifies the methods that are added as part of the stub object class. - * - * By default there are no methods for the empty stub classes; override this method - * if you want to change that behavior. - * - * @see ObjectBuilder::addClassBody() - */ - protected function addClassBody(&$script) - { - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - $this->applyBehaviorModifier('extensionObjectFilter', $script, ""); - } - -} // PHP5ExtensionObjectBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionPeerBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionPeerBuilder.php deleted file mode 100644 index ef22ae4caf..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ExtensionPeerBuilder.php +++ /dev/null @@ -1,136 +0,0 @@ - - * @package propel.generator.builder.om - */ -class PHP5ExtensionPeerBuilder extends PeerBuilder -{ - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return $this->getStubObjectBuilder()->getUnprefixedClassname() . 'Peer'; - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - switch($this->getTable()->treeMode()) { - case 'NestedSet': - $requiredClassFilePath = $this->getNestedSetPeerBuilder()->getClassFilePath(); - break; - - case 'MaterializedPath': - case 'AdjacencyList': - default: - $requiredClassFilePath = $this->getPeerBuilder()->getClassFilePath(); - break; - } - - $script .=" -require '".$requiredClassFilePath."'; -"; - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - $table = $this->getTable(); - $this->declareClassFromBuilder($this->getPeerBuilder()); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - - switch($table->treeMode()) { - case 'NestedSet': - $baseClassname = $this->getNestedSetPeerBuilder()->getClassname(); - break; - - case 'MaterializedPath': - case 'AdjacencyList': - default: - $baseClassname = $this->getPeerBuilder()->getClassname(); - break; - } - - $script .= " - -/** - * Skeleton subclass for performing query and update operations on the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * You should add additional methods to this class to meet the - * application requirements. This class will only be generated as - * long as it does not already exist in the output directory. - * - * @package propel.generator.".$this->getPackage()." - */ -class ".$this->getClassname()." extends $baseClassname { -"; - } - - /** - * Specifies the methods that are added as part of the stub peer class. - * - * By default there are no methods for the empty stub classes; override this method - * if you want to change that behavior. - * - * @see ObjectBuilder::addClassBody() - */ - - protected function addClassBody(&$script) - { - // there is no class body - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - $this->applyBehaviorModifier('extensionPeerFilter', $script, ""); - } - - -} // PHP5ExtensionPeerBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5InterfaceBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5InterfaceBuilder.php deleted file mode 100644 index ba6f094a28..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5InterfaceBuilder.php +++ /dev/null @@ -1,108 +0,0 @@ - - * @package propel.generator.builder.om - */ -class PHP5InterfaceBuilder extends ObjectBuilder -{ - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return ClassTools::classname($this->getInterface()); - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - - $table = $this->getTable(); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - - $baseClassname = $this->getObjectBuilder()->getClassname(); - - $script .= " -/** - * This is an interface that should be filled with the public api of the $tableName objects. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * You should add additional method declarations to this interface to meet the - * application requirements. This interface will only be generated as - * long as it does not already exist in the output directory. - * - * @package propel.generator.".$this->getPackage()." - */ -interface ".$this->getClassname()." { -"; - } - - /** - * Specifies the methods that are added as part of the stub object class. - * - * By default there are no methods for the empty stub classes; override this method - * if you want to change that behavior. - * - * @see ObjectBuilder::addClassBody() - */ - protected function addClassBody(&$script) - { - // there is no class body - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - } - -} // PHP5ExtensionObjectBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5MultiExtendObjectBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5MultiExtendObjectBuilder.php deleted file mode 100644 index 5ac7eae06a..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5MultiExtendObjectBuilder.php +++ /dev/null @@ -1,196 +0,0 @@ - - * @package propel.generator.builder.om - */ -class PHP5MultiExtendObjectBuilder extends ObjectBuilder -{ - - /** - * The current child "object" we are operating on. - */ - private $child; - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return $this->getChild()->getClassname(); - } - - /** - * Override method to return child package, if specified. - * @return string - */ - public function getPackage() - { - return ($this->child->getPackage() ? $this->child->getPackage() : parent::getPackage()); - } - - /** - * Set the child object that we're operating on currrently. - * @param $child Inheritance - */ - public function setChild(Inheritance $child) - { - $this->child = $child; - } - - /** - * Returns the child object we're operating on currently. - * @return Inheritance - * @throws BuildException - if child was not set. - */ - public function getChild() - { - if (!$this->child) { - throw new BuildException("The PHP5MultiExtendObjectBuilder needs to be told which child class to build (via setChild() method) before it can build the stub class."); - } - return $this->child; - } - - /** - * Returns classpath to parent class. - * @return string - */ - protected function getParentClasspath() - { - if ($this->getChild()->getAncestor()) { - return $this->getChild()->getAncestor(); - } else { - return $this->getObjectBuilder()->getClasspath(); - } - } - - /** - * Returns classname of parent class. - * @return string - */ - protected function getParentClassname() - { - return ClassTools::classname($this->getParentClasspath()); - } - - /** - * Gets the file path to the parent class. - * @return string - */ - protected function getParentClassFilePath() - { - return ClassTools::getFilePath($this->getParentClasspath()); - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - if ($this->getChild()->getAncestor()) { - $this->declareClassFromBuilder($this->getNewStubObjectBuilder($this->getDatabase()->getTableByPhpName($this->getChild()->getAncestor()))); - } else { - $this->declareClassFromBuilder($this->getObjectBuilder()); - } - $table = $this->getTable(); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - - $baseClassname = $this->getObjectBuilder()->getClassname(); - - $script .= " - -/** - * Skeleton subclass for representing a row from one of the subclasses of the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * You should add additional methods to this class to meet the - * application requirements. This class will only be generated as - * long as it does not already exist in the output directory. - * - * @package propel.generator.".$this->getPackage()." - */ -class ".$this->getClassname()." extends ".$this->getParentClassname()." { -"; - } - - /** - * Specifies the methods that are added as part of the stub object class. - * - * By default there are no methods for the empty stub classes; override this method - * if you want to change that behavior. - * - * @see ObjectBuilder::addClassBody() - */ - protected function addClassBody(&$script) - { - $this->declareClassFromBuilder($this->getStubPeerBuilder()); - $child = $this->getChild(); - $col = $child->getColumn(); - $cfc = $col->getPhpName(); - - $const = "CLASSKEY_".strtoupper($child->getKey()); - - $script .= " - /** - * Constructs a new ".$this->getChild()->getClassname()." class, setting the ".$col->getName()." column to ".$this->getPeerClassname()."::$const. - */ - public function __construct() - {"; - $script .= " - parent::__construct(); - \$this->set$cfc(".$this->getPeerClassname()."::CLASSKEY_".strtoupper($child->getKey())."); - } -"; - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - } - -} // PHP5ExtensionObjectBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5NestedSetBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5NestedSetBuilder.php deleted file mode 100644 index d7e0bb8fc8..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5NestedSetBuilder.php +++ /dev/null @@ -1,1136 +0,0 @@ - - * @package propel.generator.builder.om - */ -class PHP5NestedSetBuilder extends ObjectBuilder -{ - - /** - * Gets the package for the [base] object classes. - * @return string - */ - public function getPackage() - { - return parent::getPackage() . ".om"; - } - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return $this->getBuildProperty('basePrefix') . $this->getStubObjectBuilder()->getUnprefixedClassname() . 'NestedSet'; - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - $script .=" -require '".$this->getObjectBuilder()->getClassFilePath()."'; -"; - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - - $table = $this->getTable(); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - - $script .= " -/** - * Base class that represents a row from the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * @deprecated Since Propel 1.5. Use the nested_set behavior instead of the NestedSet treeMode - * @package propel.generator.".$this->getPackage()." - */ -abstract class ".$this->getClassname()." extends ".$this->getObjectBuilder()->getClassname()." implements NodeObject { -"; - } - - /** - * Specifies the methods that are added as part of the basic OM class. - * This can be overridden by subclasses that wish to add more methods. - * @see ObjectBuilder::addClassBody() - */ - protected function addClassBody(&$script) - { - $table = $this->getTable(); - - $this->addAttributes($script); - - $this->addGetIterator($script); - - $this->addSave($script); - $this->addDelete($script); - - $this->addMakeRoot($script); - - $this->addGetLevel($script); - $this->addGetPath($script); - - $this->addGetNumberOfChildren($script); - $this->addGetNumberOfDescendants($script); - - $this->addGetChildren($script); - $this->addGetDescendants($script); - - $this->addSetLevel($script); - - $this->addSetChildren($script); - $this->addSetParentNode($script); - $this->addSetPrevSibling($script); - $this->addSetNextSibling($script); - - $this->addIsRoot($script); - $this->addIsLeaf($script); - $this->addIsEqualTo($script); - - $this->addHasParent($script); - $this->addHasChildren($script); - $this->addHasPrevSibling($script); - $this->addHasNextSibling($script); - - $this->addRetrieveParent($script); - $this->addRetrieveFirstChild($script); - $this->addRetrieveLastChild($script); - $this->addRetrievePrevSibling($script); - $this->addRetrieveNextSibling($script); - - $this->addInsertAsFirstChildOf($script); - $this->addInsertAsLastChildOf($script); - - $this->addInsertAsPrevSiblingOf($script); - $this->addInsertAsNextSiblingOf($script); - - $this->addMoveToFirstChildOf($script); - $this->addMoveToLastChildOf($script); - - $this->addMoveToPrevSiblingOf($script); - $this->addMoveToNextSiblingOf($script); - - $this->addInsertAsParentOf($script); - - $this->addGetLeft($script); - $this->addGetRight($script); - $this->addGetScopeId($script); - - $this->addSetLeft($script); - $this->addSetRight($script); - $this->addSetScopeId($script); - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - } - - - /** - * Adds class attributes. - * @param string &$script The script will be modified in this method. - */ - protected function addAttributes(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $script .= " - /** - * Store level of node - * @var int - */ - protected \$level = null; - - /** - * Store if node has prev sibling - * @var bool - */ - protected \$hasPrevSibling = null; - - /** - * Store node if has prev sibling - * @var $objectClassName - */ - protected \$prevSibling = null; - - /** - * Store if node has next sibling - * @var bool - */ - protected \$hasNextSibling = null; - - /** - * Store node if has next sibling - * @var $objectClassName - */ - protected \$nextSibling = null; - - /** - * Store if node has parent node - * @var bool - */ - protected \$hasParentNode = null; - - /** - * The parent node for this node. - * @var $objectClassName - */ - protected \$parentNode = null; - - /** - * Store children of the node - * @var array - */ - protected \$_children = null; -"; - } - - protected function addGetIterator(&$script) - { - $script .= " - /** - * Returns a pre-order iterator for this node and its children. - * - * @return NodeIterator - */ - public function getIterator() - { - return new NestedSetRecursiveIterator(\$this); - } -"; - } - - protected function addSave(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Saves modified object data to the datastore. - * If object is saved without left/right values, set them as undefined (0) - * - * @param PropelPDO Connection to use. - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * May be unreliable with parent/children/brother changes - * @throws PropelException - */ - public function save(PropelPDO \$con = null) - { - \$left = \$this->getLeftValue(); - \$right = \$this->getRightValue(); - if (empty(\$left) || empty(\$right)) { - \$root = $peerClassname::retrieveRoot(\$this->getScopeIdValue(), \$con); - $peerClassname::insertAsLastChildOf(\$this, \$root, \$con); - } - - return parent::save(\$con); - } -"; - } - - protected function addDelete(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Removes this object and all descendants from datastore. - * - * @param PropelPDO Connection to use. - * @return void - * @throws PropelException - */ - public function delete(PropelPDO \$con = null) - { - // delete node first - parent::delete(\$con); - - // delete descendants and then shift tree - $peerClassname::deleteDescendants(\$this, \$con); - } -"; - } - - protected function addMakeRoot(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Sets node properties to make it a root node. - * - * @return $objectClassName The current object (for fluent API support) - * @throws PropelException - */ - public function makeRoot() - { - $peerClassname::createRoot(\$this); - return \$this; - } -"; - } - - protected function addGetLevel(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets the level if set, otherwise calculates this and returns it - * - * @param PropelPDO Connection to use. - * @return int - */ - public function getLevel(PropelPDO \$con = null) - { - if (null === \$this->level) { - \$this->level = $peerClassname::getLevel(\$this, \$con); - } - return \$this->level; - } -"; - } - - protected function addSetLevel(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $script .= " - /** - * Sets the level of the node in the tree - * - * @param int \$v new value - * @return $objectClassName The current object (for fluent API support) - */ - public function setLevel(\$level) - { - \$this->level = \$level; - return \$this; - } -"; - } - - protected function addSetChildren(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $script .= " - /** - * Sets the children array of the node in the tree - * - * @param array of $objectClassName \$children array of Propel node object - * @return $objectClassName The current object (for fluent API support) - */ - public function setChildren(array \$children) - { - \$this->_children = \$children; - return \$this; - } -"; - } - - protected function addSetParentNode(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Sets the parentNode of the node in the tree - * - * @param $objectClassName \$parent Propel node object - * @return $objectClassName The current object (for fluent API support) - */ - public function setParentNode(NodeObject \$parent = null) - { - \$this->parentNode = (true === (\$this->hasParentNode = $peerClassname::isValid(\$parent))) ? \$parent : null; - return \$this; - } -"; - } - - protected function addSetPrevSibling(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Sets the previous sibling of the node in the tree - * - * @param $objectClassName \$node Propel node object - * @return $objectClassName The current object (for fluent API support) - */ - public function setPrevSibling(NodeObject \$node = null) - { - \$this->prevSibling = \$node; - \$this->hasPrevSibling = $peerClassname::isValid(\$node); - return \$this; - } -"; - } - - protected function addSetNextSibling(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Sets the next sibling of the node in the tree - * - * @param $objectClassName \$node Propel node object - * @return $objectClassName The current object (for fluent API support) - */ - public function setNextSibling(NodeObject \$node = null) - { - \$this->nextSibling = \$node; - \$this->hasNextSibling = $peerClassname::isValid(\$node); - return \$this; - } -"; - } - - protected function addGetPath(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Get the path to the node in the tree - * - * @param PropelPDO Connection to use. - * @return array - */ - public function getPath(PropelPDO \$con = null) - { - return $peerClassname::getPath(\$this, \$con); - } -"; - } - - protected function addGetNumberOfChildren(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets the number of children for the node (direct descendants) - * - * @param PropelPDO Connection to use. - * @return int - */ - public function getNumberOfChildren(PropelPDO \$con = null) - { - return $peerClassname::getNumberOfChildren(\$this, \$con); - } -"; - } - - protected function addGetNumberOfDescendants(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets the total number of descendants for the node - * - * @param PropelPDO Connection to use. - * @return int - */ - public function getNumberOfDescendants(PropelPDO \$con = null) - { - return $peerClassname::getNumberOfDescendants(\$this, \$con); - } -"; - } - - protected function addGetChildren(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets the children for the node - * - * @param PropelPDO Connection to use. - * @return array - */ - public function getChildren(PropelPDO \$con = null) - { - \$this->getLevel(); - - if (is_array(\$this->_children)) { - return \$this->_children; - } - - return $peerClassname::retrieveChildren(\$this, \$con); - } -"; - } - - protected function addGetDescendants(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets the descendants for the node - * - * @param PropelPDO Connection to use. - * @return array - */ - public function getDescendants(PropelPDO \$con = null) - { - \$this->getLevel(); - - return $peerClassname::retrieveDescendants(\$this, \$con); - } -"; - } - - protected function addIsRoot(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Returns true if node is the root node of the tree. - * - * @return bool - */ - public function isRoot() - { - return $peerClassname::isRoot(\$this); - } -"; - } - - protected function addIsLeaf(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Return true if the node is a leaf node - * - * @return bool - */ - public function isLeaf() - { - return $peerClassname::isLeaf(\$this); - } -"; - } - - protected function addIsEqualTo(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Tests if object is equal to \$node - * - * @param object \$node Propel object for node to compare to - * @return bool - */ - public function isEqualTo(NodeObject \$node) - { - return $peerClassname::isEqualTo(\$this, \$node); - } -"; - } - - protected function addHasParent(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Tests if object has an ancestor - * - * @param PropelPDO \$con Connection to use. - * @return bool - */ - public function hasParent(PropelPDO \$con = null) - { - if (null === \$this->hasParentNode) { - $peerClassname::hasParent(\$this, \$con); - } - return \$this->hasParentNode; - } -"; - } - - protected function addHasChildren(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Determines if the node has children / descendants - * - * @return bool - */ - public function hasChildren() - { - return $peerClassname::hasChildren(\$this); - } -"; - } - - protected function addHasPrevSibling(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Determines if the node has previous sibling - * - * @param PropelPDO \$con Connection to use. - * @return bool - */ - public function hasPrevSibling(PropelPDO \$con = null) - { - if (null === \$this->hasPrevSibling) { - $peerClassname::hasPrevSibling(\$this, \$con); - } - return \$this->hasPrevSibling; - } -"; - } - - protected function addHasNextSibling(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Determines if the node has next sibling - * - * @param PropelPDO \$con Connection to use. - * @return bool - */ - public function hasNextSibling(PropelPDO \$con = null) - { - if (null === \$this->hasNextSibling) { - $peerClassname::hasNextSibling(\$this, \$con); - } - return \$this->hasNextSibling; - } -"; - } - - protected function addRetrieveParent(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets ancestor for the given node if it exists - * - * @param PropelPDO \$con Connection to use. - * @return mixed Propel object if exists else false - */ - public function retrieveParent(PropelPDO \$con = null) - { - if (null === \$this->hasParentNode) { - \$this->parentNode = $peerClassname::retrieveParent(\$this, \$con); - \$this->hasParentNode = $peerClassname::isValid(\$this->parentNode); - } - return \$this->parentNode; - } -"; - } - - protected function addRetrieveFirstChild(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets first child if it exists - * - * @param PropelPDO \$con Connection to use. - * @return mixed Propel object if exists else false - */ - public function retrieveFirstChild(PropelPDO \$con = null) - { - if (\$this->hasChildren(\$con)) { - if (is_array(\$this->_children)) { - return \$this->_children[0]; - } - - return $peerClassname::retrieveFirstChild(\$this, \$con); - } - return false; - } -"; - } - - protected function addRetrieveLastChild(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets last child if it exists - * - * @param PropelPDO \$con Connection to use. - * @return mixed Propel object if exists else false - */ - public function retrieveLastChild(PropelPDO \$con = null) - { - if (\$this->hasChildren(\$con)) { - if (is_array(\$this->_children)) { - \$last = count(\$this->_children) - 1; - return \$this->_children[\$last]; - } - - return $peerClassname::retrieveLastChild(\$this, \$con); - } - return false; - } -"; - } - - protected function addRetrievePrevSibling(&$script) - { - $script .= " - /** - * Gets prev sibling for the given node if it exists - * - * @param PropelPDO \$con Connection to use. - * @return mixed Propel object if exists else false - */ - public function retrievePrevSibling(PropelPDO \$con = null) - { - if (\$this->hasPrevSibling(\$con)) { - return \$this->prevSibling; - } - return \$this->hasPrevSibling; - } -"; - } - - protected function addRetrieveNextSibling(&$script) - { - $script .= " - /** - * Gets next sibling for the given node if it exists - * - * @param PropelPDO \$con Connection to use. - * @return mixed Propel object if exists else false - */ - public function retrieveNextSibling(PropelPDO \$con = null) - { - if (\$this->hasNextSibling(\$con)) { - return \$this->nextSibling; - } - return \$this->hasNextSibling; - } -"; - } - - protected function addInsertAsFirstChildOf(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Inserts as first child of given destination node \$parent - * - * @param $objectClassName \$parent Propel object for destination node - * @param PropelPDO \$con Connection to use. - * @return $objectClassName The current object (for fluent API support) - * @throws PropelException - if this object already exists - */ - public function insertAsFirstChildOf(NodeObject \$parent, PropelPDO \$con = null) - { - if (!\$this->isNew()) - { - throw new PropelException(\"$objectClassName must be new.\"); - } - $peerClassname::insertAsFirstChildOf(\$this, \$parent, \$con); - return \$this; - } -"; - } - - protected function addInsertAsLastChildOf(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Inserts as last child of given destination node \$parent - * - * @param $objectClassName \$parent Propel object for destination node - * @param PropelPDO \$con Connection to use. - * @return $objectClassName The current object (for fluent API support) - * @throws PropelException - if this object already exists - */ - public function insertAsLastChildOf(NodeObject \$parent, PropelPDO \$con = null) - { - if (!\$this->isNew()) - { - throw new PropelException(\"$objectClassName must be new.\"); - } - $peerClassname::insertAsLastChildOf(\$this, \$parent, \$con); - return \$this; - } -"; - } - - protected function addInsertAsPrevSiblingOf(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Inserts \$node as previous sibling to given destination node \$dest - * - * @param $objectClassName \$dest Propel object for destination node - * @param PropelPDO \$con Connection to use. - * @return $objectClassName The current object (for fluent API support) - * @throws PropelException - if this object already exists - */ - public function insertAsPrevSiblingOf(NodeObject \$dest, PropelPDO \$con = null) - { - if (!\$this->isNew()) - { - throw new PropelException(\"$objectClassName must be new.\"); - } - $peerClassname::insertAsPrevSiblingOf(\$this, \$dest, \$con); - return \$this; - } -"; - } - - protected function addInsertAsNextSiblingOf(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Inserts \$node as next sibling to given destination node \$dest - * - * @param $objectClassName \$dest Propel object for destination node - * @param PropelPDO \$con Connection to use. - * @return $objectClassName The current object (for fluent API support) - * @throws PropelException - if this object already exists - */ - public function insertAsNextSiblingOf(NodeObject \$dest, PropelPDO \$con = null) - { - if (!\$this->isNew()) - { - throw new PropelException(\"$objectClassName must be new.\"); - } - $peerClassname::insertAsNextSiblingOf(\$this, \$dest, \$con); - return \$this; - } -"; - } - - protected function addMoveToFirstChildOf(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Moves node to be first child of \$parent - * - * @param $objectClassName \$parent Propel object for destination node - * @param PropelPDO \$con Connection to use. - * @return $objectClassName The current object (for fluent API support) - */ - public function moveToFirstChildOf(NodeObject \$parent, PropelPDO \$con = null) - { - if (\$this->isNew()) - { - throw new PropelException(\"$objectClassName must exist in tree.\"); - } - $peerClassname::moveToFirstChildOf(\$parent, \$this, \$con); - return \$this; - } -"; - } - - protected function addMoveToLastChildOf(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Moves node to be last child of \$parent - * - * @param $objectClassName \$parent Propel object for destination node - * @param PropelPDO \$con Connection to use. - * @return $objectClassName The current object (for fluent API support) - */ - public function moveToLastChildOf(NodeObject \$parent, PropelPDO \$con = null) - { - if (\$this->isNew()) - { - throw new PropelException(\"$objectClassName must exist in tree.\"); - } - $peerClassname::moveToLastChildOf(\$parent, \$this, \$con); - return \$this; - } -"; - } - - protected function addMoveToPrevSiblingOf(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Moves node to be prev sibling to \$dest - * - * @param $objectClassName \$dest Propel object for destination node - * @param PropelPDO \$con Connection to use. - * @return $objectClassName The current object (for fluent API support) - */ - public function moveToPrevSiblingOf(NodeObject \$dest, PropelPDO \$con = null) - { - if (\$this->isNew()) - { - throw new PropelException(\"$objectClassName must exist in tree.\"); - } - $peerClassname::moveToPrevSiblingOf(\$dest, \$this, \$con); - return \$this; - } -"; - } - - protected function addMoveToNextSiblingOf(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Moves node to be next sibling to \$dest - * - * @param $objectClassName \$dest Propel object for destination node - * @param PropelPDO \$con Connection to use. - * @return $objectClassName The current object (for fluent API support) - */ - public function moveToNextSiblingOf(NodeObject \$dest, PropelPDO \$con = null) - { - if (\$this->isNew()) - { - throw new PropelException(\"$objectClassName must exist in tree.\"); - } - $peerClassname::moveToNextSiblingOf(\$dest, \$this, \$con); - return \$this; - } -"; - } - - protected function addInsertAsParentOf(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Inserts node as parent of given node. - * - * @param $objectClassName \$node Propel object for destination node - * @param PropelPDO \$con Connection to use. - * @return $objectClassName The current object (for fluent API support) - */ - public function insertAsParentOf(NodeObject \$node, PropelPDO \$con = null) - { - $peerClassname::insertAsParentOf(\$this, \$node, \$con); - return \$this; - } -"; - } - - protected function addGetLeft(&$script) - { - $table = $this->getTable(); - - foreach ($table->getColumns() as $col) { - if ($col->isNestedSetLeftKey()) { - $left_col_getter_name = 'get'.$col->getPhpName(); - break; - } - } - - $script .= " - /** - * Wraps the getter for the left value - * - * @return int - */ - public function getLeftValue() - { - return \$this->$left_col_getter_name(); - } -"; - } - - protected function addGetRight(&$script) - { - $table = $this->getTable(); - - foreach ($table->getColumns() as $col) { - if ($col->isNestedSetRightKey()) { - $right_col_getter_name = 'get'.$col->getPhpName(); - break; - } - } - - $script .= " - /** - * Wraps the getter for the right value - * - * @return int - */ - public function getRightValue() - { - return \$this->$right_col_getter_name(); - } -"; - } - - protected function addGetScopeId(&$script) - { - $table = $this->getTable(); - - $scope_col_getter_name = null; - foreach ($table->getColumns() as $col) { - if ($col->isTreeScopeKey()) { - $scope_col_getter_name = 'get'.$col->getPhpName(); - break; - } - } - - $script .= " - /** - * Wraps the getter for the scope value - * - * @return int or null if scope is disabled - */ - public function getScopeIdValue() - {"; - if ($scope_col_getter_name) { - $script .= " - return \$this->$scope_col_getter_name();"; - } else { - $script .= " - return null;"; - } - $script .= " - } -"; - } - - protected function addSetLeft(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $table = $this->getTable(); - - foreach ($table->getColumns() as $col) { - if ($col->isNestedSetLeftKey()) { - $left_col_setter_name = 'set'.$col->getPhpName(); - break; - } - } - - $script .= " - /** - * Set the value left column - * - * @param int \$v new value - * @return $objectClassName The current object (for fluent API support) - */ - public function setLeftValue(\$v) - { - \$this->$left_col_setter_name(\$v); - return \$this; - } -"; - } - - protected function addSetRight(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $table = $this->getTable(); - - foreach ($table->getColumns() as $col) { - if ($col->isNestedSetRightKey()) { - $right_col_setter_name = 'set'.$col->getPhpName(); - break; - } - } - - $script .= " - /** - * Set the value of right column - * - * @param int \$v new value - * @return $objectClassName The current object (for fluent API support) - */ - public function setRightValue(\$v) - { - \$this->$right_col_setter_name(\$v); - return \$this; - } -"; - } - - protected function addSetScopeId(&$script) - { - $objectClassName = $this->getStubObjectBuilder()->getClassname(); - $table = $this->getTable(); - - $scope_col_setter_name = null; - foreach ($table->getColumns() as $col) { - if ($col->isTreeScopeKey()) { - $scope_col_setter_name = 'set'.$col->getPhpName(); - break; - } - } - - $script .= " - /** - * Set the value of scope column - * - * @param int \$v new value - * @return $objectClassName The current object (for fluent API support) - */ - public function setScopeIdValue(\$v) - {"; - if ($scope_col_setter_name) { - $script .= " - \$this->$scope_col_setter_name(\$v);"; - } - $script .= " - return \$this; - } -"; - - } - -} // PHP5NestedSetBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5NestedSetPeerBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5NestedSetPeerBuilder.php deleted file mode 100644 index ad5fa05c19..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5NestedSetPeerBuilder.php +++ /dev/null @@ -1,1727 +0,0 @@ - - * @package propel.generator.builder.om - */ -class PHP5NestedSetPeerBuilder extends PeerBuilder -{ - - /** - * Gets the package for the [base] object classes. - * @return string - */ - public function getPackage() - { - return parent::getPackage() . ".om"; - } - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return $this->getBuildProperty('basePrefix') . $this->getStubObjectBuilder()->getUnprefixedClassname() . 'NestedSetPeer'; - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - $script .=" -require '".$this->getPeerBuilder()->getClassFilePath()."'; -"; - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - - $table = $this->getTable(); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - - $script .= " -/** - * Base static class for performing query operations on the tree contained by the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * @deprecated Since Propel 1.5. Use the nested_set behavior instead of the NestedSet treeMode - * @package propel.generator.".$this->getPackage()." - */ -abstract class ".$this->getClassname()." extends ".$this->getPeerBuilder()->getClassName()." implements NodePeer { -"; - } - - /** - * Specifies the methods that are added as part of the basic OM class. - * This can be overridden by subclasses that wish to add more methods. - * @see ObjectBuilder::addClassBody() - */ - protected function addClassBody(&$script) - { - $table = $this->getTable(); - - // FIXME - // - Probably the build needs to be customized for supporting - // tables that are "aliases". -- definitely a fringe usecase, though. - - $this->addConstants($script); - - $this->addCreateRoot($script); - - $this->addRetrieveRoot($script); - - $this->addInsertAsFirstChildOf($script); - $this->addInsertAsLastChildOf($script); - $this->addInsertAsPrevSiblingOf($script); - $this->addInsertAsNextSiblingOf($script); - $this->addInsertAsParentOf($script); - - $this->addInsertRoot($script); - $this->addInsertParent($script); - - $this->addDeleteRoot($script); - $this->addDeleteNode($script); - - $this->addMoveToFirstChildOf($script); - $this->addMoveToLastChildOf($script); - $this->addMoveToPrevSiblingOf($script); - $this->addMoveToNextSiblingOf($script); - - $this->addRetrieveFirstChild($script); - $this->addRetrieveLastChild($script); - $this->addRetrievePrevSibling($script); - $this->addRetrieveNextSibling($script); - - $this->addRetrieveTree($script); - $this->addRetrieveBranch($script); - $this->addRetrieveChildren($script); - $this->addRetrieveDescendants($script); - $this->addRetrieveSiblings($script); - $this->addRetrieveParent($script); - - $this->addGetLevel($script); - $this->addGetNumberOfChildren($script); - $this->addGetNumberOfDescendants($script); - $this->addGetPath($script); - - $this->addIsValid($script); - $this->addIsRoot($script); - $this->addIsLeaf($script); - $this->addIsChildOf($script); - $this->addIsChildOfOrSiblingTo($script); - $this->addIsEqualTo($script); - - $this->addHasParent($script); - $this->addHasPrevSibling($script); - $this->addHasNextSibling($script); - $this->addHasChildren($script); - - $this->addDeleteDescendants($script); - - $this->addGetNode($script); - - $this->addHydrateDescendants($script); - $this->addHydrateChildren($script); - - $this->addShiftRParent($script); - $this->addUpdateLoadedNode($script); - $this->addUpdateDBNode($script); - - $this->addShiftRLValues($script); - $this->addShiftRLRange($script); - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - } - - protected function addConstants(&$script) - { - $table = $this->getTable(); - $tableName = $table->getName(); - - $colname = array(); - - foreach ($table->getColumns() as $col) { - if ($col->isNestedSetLeftKey()) { - $colname['left'] = $tableName . '.' . strtoupper($col->getName()); - } - - if ($col->isNestedSetRightKey()) { - $colname['right'] = $tableName . '.' . strtoupper($col->getName()); - } - - if ($col->isTreeScopeKey()) { - $colname['scope'] = $tableName . '.' . strtoupper($col->getName()); - } - - if (3 == count($colname)) { - break; - } - } - - if(!isset($colname['left'])) { - throw new EngineException("One column must have nestedSetLeftKey attribute set to true for [" . $table->getName() . "] table"); - } - - if(!isset($colname['right'])) { - throw new EngineException("One column must have nestedSetRightKey attribute set to true for [" . $table->getName() . "] table"); - } - - $colname['scope'] = isset($colname['scope']) ? $colname['scope'] : null; - - $script .= " - /** - * Left column for the set - */ - const LEFT_COL = " . var_export($colname['left'], true) . "; - - /** - * Right column for the set - */ - const RIGHT_COL = " . var_export($colname['right'], true) . "; - - /** - * Scope column for the set - */ - const SCOPE_COL = " . var_export($colname['scope'], true) . "; -"; - } - - protected function addCreateRoot(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Creates the supplied node as the root node. - * - * @param $objectClassname \$node Propel object for model - * @throws PropelException - */ - public static function createRoot(NodeObject \$node) - { - if (\$node->getLeftValue()) { - throw new PropelException('Cannot turn an existing node into a root node.'); - } - - \$node->setLeftValue(1); - \$node->setRightValue(2); - } -"; - } - - protected function addRetrieveRoot(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Returns the root node for a given scope id - * - * @param int \$scopeId Scope id to determine which root node to return - * @param PropelPDO \$con Connection to use. - * @return $objectClassname Propel object for root node - */ - public static function retrieveRoot(\$scopeId = null, PropelPDO \$con = null) - { - \$c = new Criteria($peerClassname::DATABASE_NAME); - - \$c->add(self::LEFT_COL, 1, Criteria::EQUAL); - - if (self::SCOPE_COL) { - \$c->add(self::SCOPE_COL, \$scopeId, Criteria::EQUAL); - } - - return $peerClassname::doSelectOne(\$c, \$con); - } -"; - } - - protected function addInsertAsFirstChildOf(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Inserts \$child as first child of given \$parent node - * - * @param $objectClassname \$child Propel object for child node - * @param $objectClassname \$parent Propel object for parent node - * @param PropelPDO \$con Connection to use. - * @return void - */ - public static function insertAsFirstChildOf(NodeObject \$child, NodeObject \$parent, PropelPDO \$con = null) - { - // Update \$child node properties - \$child->setLeftValue(\$parent->getLeftValue() + 1); - \$child->setRightValue(\$parent->getLeftValue() + 2); - \$child->setParentNode(\$parent); - - \$sidv = null; - if (self::SCOPE_COL) { - \$child->setScopeIdValue(\$sidv = \$parent->getScopeIdValue()); - } - - // Update database nodes - self::shiftRLValues(\$child->getLeftValue(), 2, \$con, \$sidv); - - // Update all loaded nodes - self::updateLoadedNode(\$parent, 2, \$con); - } -"; - } - - protected function addInsertAsLastChildOf(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Inserts \$child as last child of destination node \$parent - * - * @param $objectClassname \$child Propel object for child node - * @param $objectClassname \$parent Propel object for parent node - * @param PropelPDO \$con Connection to use. - * @return void - */ - public static function insertAsLastChildOf(NodeObject \$child, NodeObject \$parent, PropelPDO \$con = null) - { - // Update \$child node properties - \$child->setLeftValue(\$parent->getRightValue()); - \$child->setRightValue(\$parent->getRightValue() + 1); - \$child->setParentNode(\$parent); - - \$sidv = null; - if (self::SCOPE_COL) { - \$child->setScopeIdValue(\$sidv = \$parent->getScopeIdValue()); - } - - // Update database nodes - self::shiftRLValues(\$child->getLeftValue(), 2, \$con, \$sidv); - - // Update all loaded nodes - self::updateLoadedNode(\$parent, 2, \$con); - } -"; - } - - protected function addInsertAsPrevSiblingOf(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Inserts \$sibling as previous sibling to destination node \$node - * - * @param $objectClassname \$node Propel object for destination node - * @param $objectClassname \$sibling Propel object for source node - * @param PropelPDO \$con Connection to use. - * @return void - */ - public static function insertAsPrevSiblingOf(NodeObject \$node, NodeObject \$sibling, PropelPDO \$con = null) - { - if (\$sibling->isRoot()) { - throw new PropelException('Root nodes cannot have siblings'); - } - - \$node->setLeftValue(\$sibling->getLeftValue()); - \$node->setRightValue(\$sibling->getLeftValue() + 1); - \$node->setParentNode(\$sibling->retrieveParent()); - - \$sidv = null; - if (self::SCOPE_COL) { - \$node->setScopeIdValue(\$sidv = \$sibling->getScopeIdValue()); - } - - // Update database nodes - self::shiftRLValues(\$node->getLeftValue(), 2, \$con, \$sidv); - - // Update all loaded nodes - self::updateLoadedNode(\$sibling->retrieveParent(), 2, \$con); - } -"; - } - - protected function addInsertAsNextSiblingOf(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Inserts \$sibling as next sibling to destination node \$node - * - * @param $objectClassname \$node Propel object for destination node - * @param $objectClassname \$sibling Propel object for source node - * @param PropelPDO \$con Connection to use. - * @return void - */ - public static function insertAsNextSiblingOf(NodeObject \$node, NodeObject \$sibling, PropelPDO \$con = null) - { - if (\$sibling->isRoot()) { - throw new PropelException('Root nodes cannot have siblings'); - } - - \$node->setLeftValue(\$sibling->getRightValue() + 1); - \$node->setRightValue(\$sibling->getRightValue() + 2); - \$node->setParentNode(\$sibling->retrieveParent()); - - \$sidv = null; - if (self::SCOPE_COL) { - \$node->setScopeIdValue(\$sidv = \$sibling->getScopeIdValue()); - } - - // Update database nodes - self::shiftRLValues(\$node->getLeftValue(), 2, \$con, \$sidv); - - // Update all loaded nodes - self::updateLoadedNode(\$sibling->retrieveParent(), 2, \$con); - } -"; - } - - protected function addInsertAsParentOf(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Inserts \$parent as parent of given node. - * - * @param $objectClassname \$parent Propel object for given parent node - * @param $objectClassname \$node Propel object for given destination node - * @param PropelPDO \$con Connection to use. - * @return void - */ - public static function insertAsParentOf(NodeObject \$parent, NodeObject \$node, PropelPDO \$con = null) - { - \$sidv = null; - if (self::SCOPE_COL) { - \$sidv = \$node->getScopeIdValue(); - } - - self::shiftRLValues(\$node->getLeftValue(), 1, \$con, \$sidv); - self::shiftRLValues(\$node->getRightValue() + 2, 1, \$con, \$sidv); - - if (self::SCOPE_COL) { - \$parent->setScopeIdValue(\$sidv); - } - - \$parent->setLeftValue(\$node->getLeftValue()); - \$parent->setRightValue(\$node->getRightValue() + 2); - - \$previous_parent = \$node->retrieveParent(); - \$parent->setParentNode(\$previous_parent); - \$node->setParentNode(\$parent); - - \$node->save(\$con); - - // Update all loaded nodes - self::updateLoadedNode(\$previous_parent, 2, \$con); - } -"; - } - - protected function addInsertRoot(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Inserts \$node as root node - * - * @param $objectClassname \$node Propel object as root node - * @param PropelPDO \$con Connection to use. - * @return void - */ - public static function insertRoot(NodeObject \$node, PropelPDO \$con = null) - { - \$sidv = null; - if (self::SCOPE_COL) { - \$sidv = \$node->getScopeIdValue(); - } - - $peerClassname::insertAsParentOf($peerClassname::retrieveRoot(\$sidv, \$con), \$node, \$con); - } -"; - } - - protected function addInsertParent(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Inserts \$parent as parent to destination node \$child - * - * @deprecated 1.3 - 2007/11/06 - * @see insertAsParentOf() - * @param $objectClassname \$child Propel object to become child node - * @param $objectClassname \$parent Propel object as parent node - * @param PropelPDO \$con Connection to use. - * @return void - */ - public static function insertParent(NodeObject \$child, NodeObject \$parent, PropelPDO \$con = null) - { - self::insertAsParentOf(\$parent, \$child, \$con); - } -"; - } - - protected function addDeleteRoot(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Delete root node - * - * @param PropelPDO \$con Connection to use. - * @return boolean Deletion status - */ - public static function deleteRoot(\$scopeId = null, PropelPDO \$con = null) - { - if (!self::SCOPE_COL) { - \$scopeId = null; - } - \$root = $peerClassname::retrieveRoot(\$scopeId, \$con); - if ($peerClassname::getNumberOfChildren(\$root) == 1) { - return $peerClassname::deleteNode(\$root, \$con); - } else { - return false; - } - } -"; - } - - protected function addDeleteNode(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Delete \$dest node - * - * @param $objectClassname \$dest Propel object node to delete - * @param PropelPDO \$con Connection to use. - * @return boolean Deletion status - */ - public static function deleteNode(NodeObject \$dest, PropelPDO \$con = null) - { - if (\$dest->getLeftValue() == 1) { - // deleting root implies conditions (see deleteRoot() method) - return $peerClassname::deleteRoot(\$con); - } - - \$sidv = null; - if (self::SCOPE_COL) { - \$sidv = \$dest->getScopeIdValue(); - } - - self::shiftRLRange(\$dest->getLeftValue(), \$dest->getRightValue(), -1, \$con, \$sidv); - self::shiftRLValues(\$dest->getRightValue() + 1, -2, \$con, \$sidv); - return \$dest->delete(\$con); - } -"; - } - - protected function addMoveToFirstChildOf(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Moves \$child to be first child of \$parent - * - * @param $objectClassname \$parent Propel object for parent node - * @param $objectClassname \$child Propel object for child node - * @param PropelPDO \$con Connection to use. - * @return void - */ - public static function moveToFirstChildOf(NodeObject \$parent, NodeObject \$child, PropelPDO \$con = null) - { - if (\$parent->getScopeIdValue() != \$child->getScopeIdValue()) { - throw new PropelException('Moving nodes across trees is not supported'); - } - \$destLeft = \$parent->getLeftValue() + 1; - self::updateDBNode(\$child, \$destLeft, \$con); - - // Update all loaded nodes - self::updateLoadedNode(\$parent, 2, \$con); - } -"; - } - - protected function addMoveToLastChildOf(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Moves \$child to be last child of \$parent - * - * @param $objectClassname \$parent Propel object for parent node - * @param $objectClassname \$child Propel object for child node - * @param PropelPDO \$con Connection to use. - * @return void - */ - public static function moveToLastChildOf(NodeObject \$parent, NodeObject \$child, PropelPDO \$con = null) - { - if (\$parent->getScopeIdValue() != \$child->getScopeIdValue()) { - throw new PropelException('Moving nodes across trees is not supported'); - } - \$destLeft = \$parent->getRightValue(); - self::updateDBNode(\$child, \$destLeft, \$con); - - // Update all loaded nodes - self::updateLoadedNode(\$parent, 2, \$con); - } -"; - } - - protected function addMoveToPrevSiblingOf(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Moves \$node to be prev sibling to \$dest - * - * @param $objectClassname \$dest Propel object for destination node - * @param $objectClassname \$node Propel object for source node - * @param PropelPDO \$con Connection to use. - * @return void - */ - public static function moveToPrevSiblingOf(NodeObject \$dest, NodeObject \$node, PropelPDO \$con = null) - { - if (\$dest->getScopeIdValue() != \$node->getScopeIdValue()) { - throw new PropelException('Moving nodes across trees is not supported'); - } - \$destLeft = \$dest->getLeftValue(); - self::updateDBNode(\$node, \$destLeft, \$con); - - // Update all loaded nodes - self::updateLoadedNode(\$dest->retrieveParent(), 2, \$con); - } -"; - } - - protected function addMoveToNextSiblingOf(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Moves \$node to be next sibling to \$dest - * - * @param $objectClassname \$dest Propel object for destination node - * @param $objectClassname \$node Propel object for source node - * @param PropelPDO \$con Connection to use. - * @return void - */ - public static function moveToNextSiblingOf(NodeObject \$dest, NodeObject \$node, PropelPDO \$con = null) - { - if (\$dest->getScopeIdValue() != \$node->getScopeIdValue()) { - throw new PropelException('Moving nodes across trees is not supported'); - } - \$destLeft = \$dest->getRightValue(); - \$destLeft = \$destLeft + 1; - self::updateDBNode(\$node, \$destLeft, \$con); - - // Update all loaded nodes - self::updateLoadedNode(\$dest->retrieveParent(), 2, \$con); - } -"; - } - - protected function addRetrieveFirstChild(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets first child for the given node if it exists - * - * @param $objectClassname \$node Propel object for src node - * @param PropelPDO \$con Connection to use. - * @return mixed Propel object if exists else false - */ - public static function retrieveFirstChild(NodeObject \$node, PropelPDO \$con = null) - { - \$c = new Criteria($peerClassname::DATABASE_NAME); - \$c->add(self::LEFT_COL, \$node->getLeftValue() + 1, Criteria::EQUAL); - if (self::SCOPE_COL) { - \$c->add(self::SCOPE_COL, \$node->getScopeIdValue(), Criteria::EQUAL); - } - - return $peerClassname::doSelectOne(\$c, \$con); - } -"; - } - - protected function addRetrieveLastChild(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets last child for the given node if it exists - * - * @param $objectClassname \$node Propel object for src node - * @param PropelPDO \$con Connection to use. - * @return mixed Propel object if exists else false - */ - public static function retrieveLastChild(NodeObject \$node, PropelPDO \$con = null) - { - \$c = new Criteria($peerClassname::DATABASE_NAME); - \$c->add(self::RIGHT_COL, \$node->getRightValue() - 1, Criteria::EQUAL); - if (self::SCOPE_COL) { - \$c->add(self::SCOPE_COL, \$node->getScopeIdValue(), Criteria::EQUAL); - } - - return $peerClassname::doSelectOne(\$c, \$con); - } -"; - } - - protected function addRetrievePrevSibling(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets prev sibling for the given node if it exists - * - * @param $objectClassname \$node Propel object for src node - * @param PropelPDO \$con Connection to use. - * @return mixed Propel object if exists else null - */ - public static function retrievePrevSibling(NodeObject \$node, PropelPDO \$con = null) - { - \$c = new Criteria($peerClassname::DATABASE_NAME); - \$c->add(self::RIGHT_COL, \$node->getLeftValue() - 1, Criteria::EQUAL); - if (self::SCOPE_COL) { - \$c->add(self::SCOPE_COL, \$node->getScopeIdValue(), Criteria::EQUAL); - } - \$prevSibling = $peerClassname::doSelectOne(\$c, \$con); - \$node->setPrevSibling(\$prevSibling); - return \$prevSibling; - } -"; - } - - protected function addRetrieveNextSibling(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets next sibling for the given node if it exists - * - * @param $objectClassname \$node Propel object for src node - * @param PropelPDO \$con Connection to use. - * @return mixed Propel object if exists else false - */ - public static function retrieveNextSibling(NodeObject \$node, PropelPDO \$con = null) - { - \$c = new Criteria($peerClassname::DATABASE_NAME); - \$c->add(self::LEFT_COL, \$node->getRightValue() + 1, Criteria::EQUAL); - if (self::SCOPE_COL) { - \$c->add(self::SCOPE_COL, \$node->getScopeIdValue(), Criteria::EQUAL); - } - \$nextSibling = $peerClassname::doSelectOne(\$c, \$con); - \$node->setNextSibling(\$nextSibling); - return \$nextSibling; - } -"; - } - - protected function addRetrieveTree(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Retrieves the entire tree from root - * - * @param PropelPDO \$con Connection to use. - */ - public static function retrieveTree(\$scopeId = null, PropelPDO \$con = null) - { - \$c = new Criteria($peerClassname::DATABASE_NAME); - \$c->addAscendingOrderByColumn(self::LEFT_COL); - if (self::SCOPE_COL) { - \$c->add(self::SCOPE_COL, \$scopeId, Criteria::EQUAL); - } - \$stmt = $peerClassname::doSelectStmt(\$c, \$con); - if (false !== (\$row = \$stmt->fetch(PDO::FETCH_NUM))) { - \$omClass = $peerClassname::getOMClass(\$row, 0); - \$cls = substr('.'.\$omClass, strrpos('.'.\$omClass, '.') + 1); - - \$key = ".$peerClassname."::getPrimaryKeyHashFromRow(\$row, 0); - if (null === (\$root = ".$peerClassname."::getInstanceFromPool(\$key))) { - " . $this->buildObjectInstanceCreationCode('$root', '$cls') . " - \$root->hydrate(\$row); - } - - \$root->setLevel(0); - $peerClassname::hydrateDescendants(\$root, \$stmt); - $peerClassname::addInstanceToPool(\$root); - - \$stmt->closeCursor(); - return \$root; - } - return false; - } -"; - } - - protected function addRetrieveBranch(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Retrieves the entire tree from parent \$node - * - * @param $objectClassname \$node Propel object for parent node - * @param PropelPDO \$con Connection to use. - */ - public static function retrieveBranch(NodeObject \$node, PropelPDO \$con = null) - { - return $peerClassname::retrieveDescendants(\$node, \$con); - } -"; - } - - protected function addRetrieveChildren(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets direct children for the node - * - * @param $objectClassname \$node Propel object for parent node - * @param PropelPDO \$con Connection to use. - */ - public static function retrieveChildren(NodeObject \$node, PropelPDO \$con = null) - { - \$c = new Criteria($peerClassname::DATABASE_NAME); - \$c->addAscendingOrderByColumn(self::LEFT_COL); - if (self::SCOPE_COL) { - \$c->add(self::SCOPE_COL, \$node->getScopeIdValue(), Criteria::EQUAL); - } - \$c->add(self::LEFT_COL, \$node->getLeftValue(), Criteria::GREATER_THAN); - \$c->addAnd(self::RIGHT_COL, \$node->getRightValue(), Criteria::LESS_THAN); - \$stmt = $peerClassname::doSelectStmt(\$c, \$con); - - return $peerClassname::hydrateChildren(\$node, \$stmt); - } -"; - } - - protected function addRetrieveDescendants(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets all descendants for the node - * - * @param $objectClassname \$node Propel object for parent node - * @param PropelPDO \$con Connection to use. - */ - public static function retrieveDescendants(NodeObject \$node, PropelPDO \$con = null) - { - \$c = new Criteria($peerClassname::DATABASE_NAME); - \$c->addAscendingOrderByColumn(self::LEFT_COL); - if (self::SCOPE_COL) { - \$c->add(self::SCOPE_COL, \$node->getScopeIdValue(), Criteria::EQUAL); - } - \$c->add(self::LEFT_COL, \$node->getLeftValue(), Criteria::GREATER_THAN); - \$c->addAnd(self::RIGHT_COL, \$node->getRightValue(), Criteria::LESS_THAN); - \$stmt = $peerClassname::doSelectStmt(\$c, \$con); - - return $peerClassname::hydrateDescendants(\$node, \$stmt); - } -"; - } - - protected function addRetrieveSiblings(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets all siblings for the node - * - * @param $objectClassname \$node Propel object for src node - * @param PropelPDO \$con Connection to use. - */ - public static function retrieveSiblings(NodeObject \$node, PropelPDO \$con = null) - { - \$parent = $peerClassname::retrieveParent(\$node, \$con); - \$siblings = $peerClassname::retrieveChildren(\$parent, \$con); - - return \$siblings; - } -"; - } - - protected function addRetrieveParent(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets immediate ancestor for the given node if it exists - * - * @param $objectClassname \$node Propel object for src node - * @param PropelPDO \$con Connection to use. - * @return mixed Propel object if exists else null - */ - public static function retrieveParent(NodeObject \$node, PropelPDO \$con = null) - { - \$c = new Criteria($peerClassname::DATABASE_NAME); - \$c1 = \$c->getNewCriterion(self::LEFT_COL, \$node->getLeftValue(), Criteria::LESS_THAN); - \$c2 = \$c->getNewCriterion(self::RIGHT_COL, \$node->getRightValue(), Criteria::GREATER_THAN); - - \$c1->addAnd(\$c2); - - \$c->add(\$c1); - if (self::SCOPE_COL) { - \$c->add(self::SCOPE_COL, \$node->getScopeIdValue(), Criteria::EQUAL); - } - \$c->addAscendingOrderByColumn(self::RIGHT_COL); - - \$parent = $peerClassname::doSelectOne(\$c, \$con); - - \$node->setParentNode(\$parent); - - return \$parent; - } -"; - } - - protected function addGetLevel(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets level for the given node - * - * @param $objectClassname \$node Propel object for src node - * @param PropelPDO \$con Connection to use. - * @return int Level for the given node - */ - public static function getLevel(NodeObject \$node, PropelPDO \$con = null) - { - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_READ); - } - - \$sql = \"SELECT COUNT(*) AS level FROM \" . self::TABLE_NAME . \" WHERE \" . self::LEFT_COL . \" < :left AND \" . self::RIGHT_COL . \" > :right\"; - - if (self::SCOPE_COL) { - \$sql .= ' AND ' . self::SCOPE_COL . ' = :scope'; - } - - \$stmt = \$con->prepare(\$sql); - \$stmt->bindValue(':left', \$node->getLeftValue(), PDO::PARAM_INT); - \$stmt->bindValue(':right', \$node->getRightValue(), PDO::PARAM_INT); - if (self::SCOPE_COL) { - \$stmt->bindValue(':scope', \$node->getScopeIdValue()); - } - \$stmt->execute(); - \$row = \$stmt->fetch(); - return \$row['level']; - } -"; - } - - protected function addGetNumberOfChildren(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets number of direct children for given node - * - * @param $objectClassname \$node Propel object for src node - * @param PropelPDO \$con Connection to use. - * @return int Level for the given node - */ - public static function getNumberOfChildren(NodeObject \$node, PropelPDO \$con = null) - { - \$children = $peerClassname::retrieveChildren(\$node); - return count(\$children); - } -"; - } - - protected function addGetNumberOfDescendants(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Gets number of descendants for given node - * - * @param $objectClassname \$node Propel object for src node - * @param PropelPDO \$con Connection to use. - * @return int Level for the given node - */ - public static function getNumberOfDescendants(NodeObject \$node, PropelPDO \$con = null) - { - \$right = \$node->getRightValue(); - \$left = \$node->getLeftValue(); - \$num = (\$right - \$left - 1) / 2; - return \$num; - } -"; - } - - protected function addGetPath(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Returns path to a specific node as an array, useful to create breadcrumbs - * - * @param $objectClassname \$node Propel object of node to create path to - * @param PropelPDO \$con Connection to use. - * @return array Array in order of heirarchy - */ - public static function getPath(NodeObject \$node, PropelPDO \$con = null) - { - \$criteria = new Criteria(); - if (self::SCOPE_COL) { - \$criteria->add(self::SCOPE_COL, \$node->getScopeIdValue(), Criteria::EQUAL); - } - \$criteria->add(self::LEFT_COL, \$node->getLeftValue(), Criteria::LESS_EQUAL); - \$criteria->add(self::RIGHT_COL, \$node->getRightValue(), Criteria::GREATER_EQUAL); - \$criteria->addAscendingOrderByColumn(self::LEFT_COL); - - return self::doSelect(\$criteria, \$con); - } -"; - } - - protected function addIsValid(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Tests if node is valid - * - * @param $objectClassname \$node Propel object for src node - * @return bool - */ - public static function isValid(NodeObject \$node = null) - { - if (is_object(\$node) && \$node->getRightValue() > \$node->getLeftValue()) { - return true; - } else { - return false; - } - } -"; - } - - protected function addIsRoot(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Tests if node is a root - * - * @param $objectClassname \$node Propel object for src node - * @return bool - */ - public static function isRoot(NodeObject \$node) - { - return (\$node->getLeftValue()==1); - } -"; - } - - protected function addIsLeaf(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Tests if node is a leaf - * - * @param $objectClassname \$node Propel object for src node - * @return bool - */ - public static function isLeaf(NodeObject \$node) - { - return ((\$node->getRightValue()-\$node->getLeftValue())==1); - } -"; - } - - protected function addIsChildOf(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Tests if \$child is a child of \$parent - * - * @param $objectClassname \$child Propel object for node - * @param $objectClassname \$parent Propel object for node - * @return bool - */ - public static function isChildOf(NodeObject \$child, NodeObject \$parent) - { - return ((\$child->getLeftValue()>\$parent->getLeftValue()) && (\$child->getRightValue()<\$parent->getRightValue())); - } -"; - } - - protected function addIsChildOfOrSiblingTo(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Tests if \$node1 is a child of or equal to \$node2 - * - * @deprecated 1.3 - 2007/11/09 - * @param $objectClassname \$node1 Propel object for node - * @param $objectClassname \$node2 Propel object for node - * @return bool - */ - public static function isChildOfOrSiblingTo(NodeObject \$node1, NodeObject \$node2) - { - return ((\$node1->getLeftValue()>=\$node2->getLeftValue()) and (\$node1->getRightValue()<=\$node2->getRightValue())); - } -"; - } - - protected function addIsEqualTo(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Tests if \$node1 is equal to \$node2 - * - * @param $objectClassname \$node1 Propel object for node - * @param $objectClassname \$node2 Propel object for node - * @return bool - */ - public static function isEqualTo(NodeObject \$node1, NodeObject \$node2) - { - \$also = true; - if (self::SCOPE_COL) { - \$also = (\$node1->getScopeIdValue() === \$node2->getScopeIdValue()); - } - return \$node1->getLeftValue() == \$node2->getLeftValue() && \$node1->getRightValue() == \$node2->getRightValue() && \$also; - } -"; - } - - protected function addHasParent(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Tests if \$node has an ancestor - * - * @param $objectClassname \$node Propel object for node - * @param PropelPDO \$con Connection to use. - * @return bool - */ - public static function hasParent(NodeObject \$node, PropelPDO \$con = null) - { - return $peerClassname::isValid($peerClassname::retrieveParent(\$node, \$con)); - } -"; - } - - protected function addHasPrevSibling(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Tests if \$node has prev sibling - * - * @param $objectClassname \$node Propel object for node - * @param PropelPDO \$con Connection to use. - * @return bool - */ - public static function hasPrevSibling(NodeObject \$node, PropelPDO \$con = null) - { - return $peerClassname::isValid($peerClassname::retrievePrevSibling(\$node, \$con)); - } -"; - } - - protected function addHasNextSibling(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Tests if \$node has next sibling - * - * @param $objectClassname \$node Propel object for node - * @param PropelPDO \$con Connection to use. - * @return bool - */ - public static function hasNextSibling(NodeObject \$node, PropelPDO \$con = null) - { - return $peerClassname::isValid($peerClassname::retrieveNextSibling(\$node, \$con)); - } -"; - } - - protected function addHasChildren(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Tests if \$node has children - * - * @param $objectClassname \$node Propel object for node - * @return bool - */ - public static function hasChildren(NodeObject \$node) - { - return ((\$node->getRightValue()-\$node->getLeftValue())>1); - } -"; - } - - protected function addDeleteDescendants(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Deletes \$node and all of its descendants - * - * @param $objectClassname \$node Propel object for source node - * @param PropelPDO \$con Connection to use. - */ - public static function deleteDescendants(NodeObject \$node, PropelPDO \$con = null) - { - \$left = \$node->getLeftValue(); - \$right = \$node->getRightValue(); - - \$c = new Criteria($peerClassname::DATABASE_NAME); - \$c1 = \$c->getNewCriterion(self::LEFT_COL, \$left, Criteria::GREATER_THAN); - \$c2 = \$c->getNewCriterion(self::RIGHT_COL, \$right, Criteria::LESS_THAN); - - \$c1->addAnd(\$c2); - - \$c->add(\$c1); - if (self::SCOPE_COL) { - \$c->add(self::SCOPE_COL, \$node->getScopeIdValue(), Criteria::EQUAL); - } - \$c->addAscendingOrderByColumn(self::RIGHT_COL); - - \$result = $peerClassname::doDelete(\$c, \$con); - - self::shiftRLValues(\$right + 1, \$left - \$right -1, \$con, \$node->getScopeIdValue()); - - return \$result; - } -"; - } - - protected function addGetNode(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Returns a node given its primary key or the node itself - * - * @param int/$objectClassname \$node Primary key/instance of required node - * @param PropelPDO \$con Connection to use. - * @return object Propel object for model - */ - public static function getNode(\$node, PropelPDO \$con = null) - { - if (is_object(\$node)) { - return \$node; - } else { - \$object = $peerClassname::retrieveByPK(\$node, \$con); - \$rtn = is_object(\$object) ? \$object : false; - return \$rtn; - } - } -"; - } - - protected function addHydrateDescendants(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $table = $this->getTable(); - $script .= " - /** - * Hydrate recursively the descendants of the given node - * @param $objectClassname \$node Propel object for src node - * @param PDOStatement \$stmt Executed PDOStatement - */ - protected static function hydrateDescendants(NodeObject \$node, PDOStatement \$stmt) - { - \$descendants = array(); - \$children = array(); - \$prevSibling = null; -"; - - if (!$table->getChildrenColumn()) { - $script .= " - // set the class once to avoid overhead in the loop - \$cls = $peerClassname::getOMClass(); - \$cls = substr('.'.\$cls, strrpos('.'.\$cls, '.') + 1); -"; - } - - $script .= " - while (\$row = \$stmt->fetch(PDO::FETCH_NUM)) { - \$key = ".$peerClassname."::getPrimaryKeyHashFromRow(\$row, 0); - if (null === (\$child = ".$peerClassname."::getInstanceFromPool(\$key))) {"; - - if ($table->getChildrenColumn()) { - $script .= " - // class must be set each time from the record row - \$cls = ".$peerClassname."::getOMClass(\$row, 0); - \$cls = substr('.'.\$cls, strrpos('.'.\$cls, '.') + 1); -"; - } - - $script .= " - " . $this->buildObjectInstanceCreationCode('$child', '$cls') . " - \$child->hydrate(\$row); - } - - \$child->setLevel(\$node->getLevel() + 1); - \$child->setParentNode(\$node); - if (!empty(\$prevSibling)) { - \$child->setPrevSibling(\$prevSibling); - \$prevSibling->setNextSibling(\$child); - } - - \$descendants[] = \$child; - - if (\$child->hasChildren()) { - \$descendants = array_merge(\$descendants, $peerClassname::hydrateDescendants(\$child, \$stmt)); - } else { - \$child->setChildren(array()); - } - - \$children[] = \$child; - \$prevSibling = \$child; - - $peerClassname::addInstanceToPool(\$child); - if (\$child->getRightValue() + 1 == \$node->getRightValue()) { - \$child->setNextSibling(null); - break; - } - } - \$node->setChildren(\$children); - return \$descendants; - } -"; - } - - protected function addHydrateChildren(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $table = $this->getTable(); - $script .= " - /** - * Hydrate the children of the given node - * @param $objectClassname \$node Propel object for src node - * @param PDOStatement \$stmt Executed PDOStatement - */ - protected static function hydrateChildren(NodeObject \$node, PDOStatement \$stmt) - { - \$children = array(); - \$prevRight = 0; -"; - - if (!$table->getChildrenColumn()) { - $script .= " - // set the class once to avoid overhead in the loop - \$cls = $peerClassname::getOMClass(); - \$cls = substr('.'.\$cls, strrpos('.'.\$cls, '.') + 1); -"; - } - - $script .= " - while (\$row = \$stmt->fetch(PDO::FETCH_NUM)) { - \$key = ".$peerClassname."::getPrimaryKeyHashFromRow(\$row, 0); - if (null === (\$child = ".$peerClassname."::getInstanceFromPool(\$key))) {"; - - if ($table->getChildrenColumn()) { - $script .= " - // class must be set each time from the record row - \$cls = ".$peerClassname."::getOMClass(\$row, 0); - \$cls = substr('.'.\$cls, strrpos('.'.\$cls, '.') + 1); -"; - } - - $script .= " - " . $this->buildObjectInstanceCreationCode('$child', '$cls') . " - \$child->hydrate(\$row); - } - - \$child->setLevel(\$node->getLevel() + 1); - - if (\$child->getRightValue() > \$prevRight) { - \$children[] = \$child; - \$prevRight = \$child->getRightValue(); - } - - if (\$child->getRightValue() + 1 == \$node->getRightValue()) { - break; - } - } - \$node->setChildren(\$children); - return \$children; - } -"; - } - - /** - * @deprecated 1.3 - 2008/03/11 - * Won't be fixed, defect by design - * Never trust it - */ - protected function addShiftRParent(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Adds '\$delta' to all parent R values. - * '\$delta' can also be negative. - * - * @deprecated 1.3 - 2008/03/11 - * @param $objectClassname \$node Propel object for parent node - * @param int \$delta Value to be shifted by, can be negative - * @param PropelPDO \$con Connection to use. - */ - protected static function shiftRParent(NodeObject \$node, \$delta, PropelPDO \$con = null) - { - if (\$node->hasParent(\$con)) { - \$parent = \$node->retrieveParent(); - self::shiftRParent(\$parent, \$delta, \$con); - } - \$node->setRightValue(\$node->getRightValue() + \$delta); - } -"; - } - - protected function addUpdateLoadedNode(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $table = $this->getTable(); - - $script .= " - /** - * Reload all already loaded nodes to sync them with updated db - * - * @param $objectClassname \$node Propel object for parent node - * @param int \$delta Value to be shifted by, can be negative - * @param PropelPDO \$con Connection to use. - */ - protected static function updateLoadedNode(NodeObject \$node, \$delta, PropelPDO \$con = null) - { - if (Propel::isInstancePoolingEnabled()) { - \$keys = array(); - foreach (self::\$instances as \$obj) { - \$keys[] = \$obj->getPrimaryKey(); - } - - if (!empty(\$keys)) { - // We don't need to alter the object instance pool; we're just modifying these ones - // already in the pool. - \$criteria = new Criteria(self::DATABASE_NAME);"; - if (count($table->getPrimaryKey()) === 1) { - $pkey = $table->getPrimaryKey(); - $col = array_shift($pkey); - $script .= " - \$criteria->add(".$this->getColumnConstant($col).", \$keys, Criteria::IN); -"; - } else { - $fields = array(); - foreach ($table->getPrimaryKey() as $k => $col) { - $fields[] = $this->getColumnConstant($col); - }; - $script .= " - - // Loop on each instances in pool - foreach (\$keys as \$values) { - // Create initial Criterion - \$cton = \$criteria->getNewCriterion(" . $fields[0] . ", \$values[0]);"; - unset($fields[0]); - foreach ($fields as $k => $col) { - $script .= " - - // Create next criterion - \$nextcton = \$criteria->getNewCriterion(" . $col . ", \$values[$k]); - // And merge it with the first - \$cton->addAnd(\$nextcton);"; - } - $script .= " - - // Add final Criterion to Criteria - \$criteria->addOr(\$cton); - }"; - } - - $script .= " - \$stmt = $peerClassname::doSelectStmt(\$criteria, \$con); - while (\$row = \$stmt->fetch(PDO::FETCH_NUM)) { - \$key = $peerClassname::getPrimaryKeyHashFromRow(\$row, 0); - if (null !== (\$object = $peerClassname::getInstanceFromPool(\$key))) {"; - $n = 0; - foreach ($table->getColumns() as $col) { - if ($col->isNestedSetLeftKey()) { - $script .= " - \$object->setLeftValue(\$row[$n]);"; - } else if ($col->isNestedSetRightKey()) { - $script .= " - \$object->setRightValue(\$row[$n]);"; - } - $n++; - } - $script .= " - } - } - \$stmt->closeCursor(); - } - } - } -"; - } - - protected function addUpdateDBNode(&$script) - { - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - $script .= " - /** - * Move \$node and its children to location \$destLeft and updates rest of tree - * - * @param $objectClassname \$node Propel object for node to update - * @param int \$destLeft Destination left value - * @param PropelPDO \$con Connection to use. - */ - protected static function updateDBNode(NodeObject \$node, \$destLeft, PropelPDO \$con = null) - { - \$left = \$node->getLeftValue(); - \$right = \$node->getRightValue(); - - \$treeSize = \$right - \$left +1; - - self::shiftRLValues(\$destLeft, \$treeSize, \$con, \$node->getScopeIdValue()); - - if (\$left >= \$destLeft) { // src was shifted too? - \$left += \$treeSize; - \$right += \$treeSize; - } - - // now there's enough room next to target to move the subtree - self::shiftRLRange(\$left, \$right, \$destLeft - \$left, \$con, \$node->getScopeIdValue()); - - // correct values after source - self::shiftRLValues(\$right + 1, -\$treeSize, \$con, \$node->getScopeIdValue()); - } -"; - } - - protected function addShiftRLValues(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Adds '\$delta' to all L and R values that are >= '\$first'. '\$delta' can also be negative. - * - * @param int \$first First node to be shifted - * @param int \$delta Value to be shifted by, can be negative - * @param PropelPDO \$con Connection to use. - */ - protected static function shiftRLValues(\$first, \$delta, PropelPDO \$con = null, \$scopeId = null) - { - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - \$leftUpdateCol = self::LEFT_COL; - \$rightUpdateCol = self::RIGHT_COL; - - // Shift left column values - \$whereCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$criterion = \$whereCriteria->getNewCriterion( - self::LEFT_COL, - \$first, - Criteria::GREATER_EQUAL); - - if (self::SCOPE_COL) { - \$criterion->addAnd( - \$whereCriteria->getNewCriterion( - self::SCOPE_COL, - \$scopeId, - Criteria::EQUAL)); - } - \$whereCriteria->add(\$criterion); - - \$valuesCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$valuesCriteria->add( - self::LEFT_COL, - array('raw' => \$leftUpdateCol . ' + ?', 'value' => \$delta), - Criteria::CUSTOM_EQUAL); - - {$this->basePeerClassname}::doUpdate(\$whereCriteria, \$valuesCriteria, \$con); - - // Shift right column values - \$whereCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$criterion = \$whereCriteria->getNewCriterion( - self::RIGHT_COL, - \$first, - Criteria::GREATER_EQUAL); - - if (self::SCOPE_COL) { - \$criterion->addAnd( - \$whereCriteria->getNewCriterion( - self::SCOPE_COL, - \$scopeId, - Criteria::EQUAL)); - } - \$whereCriteria->add(\$criterion); - - \$valuesCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$valuesCriteria->add( - self::RIGHT_COL, - array('raw' => \$rightUpdateCol . ' + ?', 'value' => \$delta), - Criteria::CUSTOM_EQUAL); - - {$this->basePeerClassname}::doUpdate(\$whereCriteria, \$valuesCriteria, \$con); - } -"; - } - - protected function addShiftRLRange(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $script .= " - /** - * Adds '\$delta' to all L and R values that are >= '\$first' and <= '\$last'. - * '\$delta' can also be negative. - * - * @param int \$first First node to be shifted (L value) - * @param int \$last Last node to be shifted (L value) - * @param int \$delta Value to be shifted by, can be negative - * @param PropelPDO \$con Connection to use. - * @return array Shifted L and R values - */ - protected static function shiftRLRange(\$first, \$last, \$delta, PropelPDO \$con = null, \$scopeId = null) - { - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - \$leftUpdateCol = substr(self::LEFT_COL, strrpos(self::LEFT_COL, '.') + 1); - \$rightUpdateCol = substr(self::RIGHT_COL, strrpos(self::RIGHT_COL, '.') + 1); - - // Shift left column values - \$whereCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$criterion = \$whereCriteria->getNewCriterion(self::LEFT_COL, \$first, Criteria::GREATER_EQUAL); - \$criterion->addAnd(\$whereCriteria->getNewCriterion(self::LEFT_COL, \$last, Criteria::LESS_EQUAL)); - if (self::SCOPE_COL) { - \$criterion->addAnd(\$whereCriteria->getNewCriterion(self::SCOPE_COL, \$scopeId, Criteria::EQUAL)); - } - \$whereCriteria->add(\$criterion); - - \$valuesCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$valuesCriteria->add( - self::LEFT_COL, - array('raw' => \$leftUpdateCol . ' + ?', 'value' => \$delta), - Criteria::CUSTOM_EQUAL); - - {$this->basePeerClassname}::doUpdate(\$whereCriteria, \$valuesCriteria, \$con); - - // Shift right column values - \$whereCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$criterion = \$whereCriteria->getNewCriterion(self::RIGHT_COL, \$first, Criteria::GREATER_EQUAL); - \$criterion->addAnd(\$whereCriteria->getNewCriterion(self::RIGHT_COL, \$last, Criteria::LESS_EQUAL)); - if (self::SCOPE_COL) { - \$criterion->addAnd(\$whereCriteria->getNewCriterion(self::SCOPE_COL, \$scopeId, Criteria::EQUAL)); - } - \$whereCriteria->add(\$criterion); - - \$valuesCriteria = new Criteria($peerClassname::DATABASE_NAME); - \$valuesCriteria->add( - self::RIGHT_COL, - array('raw' => \$rightUpdateCol . ' + ?', 'value' => \$delta), - Criteria::CUSTOM_EQUAL); - - {$this->basePeerClassname}::doUpdate(\$whereCriteria, \$valuesCriteria, \$con); - - return array('left' => \$first + \$delta, 'right' => \$last + \$delta); - } -"; - } - -} // PHP5NestedSetPeerBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5NodeBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5NodeBuilder.php deleted file mode 100644 index 1f5b0eca1b..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5NodeBuilder.php +++ /dev/null @@ -1,1104 +0,0 @@ - - * @package propel.generator.builder.om - */ -class PHP5NodeBuilder extends ObjectBuilder -{ - - /** - * Gets the package for the [base] object classes. - * @return string - */ - public function getPackage() - { - return parent::getPackage() . ".om"; - } - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return $this->getBuildProperty('basePrefix') . $this->getStubNodeBuilder()->getUnprefixedClassname(); - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - - $table = $this->getTable(); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - - $script .= " -/** - * Base class that represents a row from the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * @package propel.generator.".$this->getPackage()." - */ -abstract class ".$this->getClassname()." implements IteratorAggregate { -"; - } - - /** - * Specifies the methods that are added as part of the basic OM class. - * This can be overridden by subclasses that wish to add more methods. - * @see ObjectBuilder::addClassBody() - */ - protected function addClassBody(&$script) - { - $table = $this->getTable(); - - $this->addAttributes($script); - - $this->addConstructor($script); - - $this->addCallOverload($script); - $this->addSetIteratorOptions($script); - $this->addGetIterator($script); - - $this->addGetNodeObj($script); - $this->addGetNodePath($script); - $this->addGetNodeIndex($script); - $this->addGetNodeLevel($script); - - $this->addHasChildNode($script); - $this->addGetChildNodeAt($script); - $this->addGetFirstChildNode($script); - $this->addGetLastChildNode($script); - $this->addGetSiblingNode($script); - - $this->addGetParentNode($script); - $this->addGetAncestors($script); - $this->addIsRootNode($script); - - $this->addSetNew($script); - $this->addSetDeleted($script); - $this->addAddChildNode($script); - $this->addMoveChildNode($script); - $this->addSave($script); - - $this->addDelete($script); - $this->addEquals($script); - - $this->addAttachParentNode($script); - $this->addAttachChildNode($script); - $this->addDetachParentNode($script); - $this->addDetachChildNode($script); - $this->addShiftChildNodes($script); - $this->addInsertNewChildNode($script); - - $this->addAdjustStatus($script); - $this->addAdjustNodePath($script); - - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - } - - - /** - * Adds class attributes. - * @param string &$script The script will be modified in this method. - */ - protected function addAttributes(&$script) - { - $script .= " - /** - * @var ".$this->getStubObjectBuilder()->getClassname()." object wrapped by this node. - */ - protected \$obj = null; - - /** - * The parent node for this node. - * @var ".$this->getStubNodeBuilder()->getClassname()." - */ - protected \$parentNode = null; - - /** - * Array of child nodes for this node. Nodes indexes are one-based. - * @var array - */ - protected \$childNodes = array(); -"; - } - - /** - * Adds the constructor. - * @param string &$script The script will be modified in this method. - */ - protected function addConstructor(&$script) - { - $script .= " - /** - * Constructor. - * - * @param ".$this->getStubObjectBuilder()->getClassname()." \$obj Object wrapped by this node. - */ - public function __construct(\$obj = null) - { - if (\$obj !== null) { - \$this->obj = \$obj; - } else { - \$setNodePath = 'set' . ".$this->getStubNodePeerBuilder()->getClassname()."::NPATH_PHPNAME; - \$this->obj = new ".$this->getStubObjectBuilder()->getClassname()."(); - \$this->obj->\$setNodePath('0'); - } - } -"; - } - - - - protected function addCallOverload(&$script) - { - $script .= " - /** - * Convenience overload for wrapped object methods. - * - * @param string Method name to call on wrapped object. - * @param mixed Parameter accepted by wrapped object set method. - * @return mixed Return value of wrapped object method. - * @throws PropelException Fails if method is not defined for wrapped object. - */ - public function __call(\$name, \$parms) - { - if (method_exists(\$this->obj, \$name)) - return call_user_func_array(array(\$this->obj, \$name), \$parms); - else - throw new PropelException('get method not defined: \$name'); - } -"; - } - - protected function addSetIteratorOptions(&$script) - { - $script .= " - - /** - * Sets the default options for iterators created from this object. - * The options are specified in map format. The following options - * are supported by all iterators. Some iterators may support other - * options: - * - * \"querydb\" - True if nodes should be retrieved from database. - * \"con\" - Connection to use if retrieving from database. - * - * @param string Type of iterator to use (\"pre\", \"post\", \"level\"). - * @param array Map of option name => value. - * @return void - * @todo Implement other iterator types (i.e. post-order, level, etc.) - */ - public function setIteratorOptions(\$type, \$opts) - { - \$this->itType = \$type; - \$this->itOpts = \$opts; - } -"; - } - - protected function addGetIterator(&$script) - { - $script .= " - /** - * Returns a pre-order iterator for this node and its children. - * - * @param string Type of iterator to use (\"pre\", \"post\", \"level\") - * @param array Map of option name => value. - * @return NodeIterator - */ - public function getIterator(\$type = null, \$opts = null) - { - if (\$type === null) - \$type = (isset(\$this->itType) ? \$this->itType : 'Pre'); - - if (\$opts === null) - \$opts = (isset(\$this->itOpts) ? \$this->itOpts : array()); - - \$itclass = ucfirst(strtolower(\$type)) . 'OrderNodeIterator'; - - require_once('propel/om/' . \$itclass . '.php'); - return new \$itclass(\$this, \$opts); - } -"; - } - - protected function addGetNodeObj(&$script) - { - $script .= " - /** - * Returns the object wrapped by this class. - * @return ".$this->getStubObjectBuilder()->getClassname()." - */ - public function getNodeObj() - { - return \$this->obj; - } -"; - } - - protected function addGetNodePath(&$script) - { - $script .= " - /** - * Convenience method for retrieving nodepath. - * @return string - */ - public function getNodePath() - { - \$getNodePath = 'get' . ".$this->getStubNodePeerBuilder()->getClassname()."::NPATH_PHPNAME; - return \$this->obj->\$getNodePath(); - } -"; - } - - protected function addGetNodeIndex(&$script) - { - $script .= " - /** - * Returns one-based node index among siblings. - * @return int - */ - public function getNodeIndex() - { - \$npath =& \$this->getNodePath(); - \$sep = strrpos(\$npath, ".$this->getStubNodePeerBuilder()->getClassname()."::NPATH_SEP); - return (int) (\$sep !== false ? substr(\$npath, \$sep+1) : \$npath); - } -"; - } - - protected function addGetNodeLevel(&$script) - { - $script .= " - /** - * Returns one-based node level within tree (root node is level 1). - * @return int - */ - public function getNodeLevel() - { - return (substr_count(\$this->getNodePath(), ".$this->getStubNodePeerBuilder()->getClassname()."::NPATH_SEP) + 1); - } -"; - } - - protected function addHasChildNode(&$script) - { - $script .= " - /** - * Returns true if specified node is a child of this node. If recurse is - * true, checks if specified node is a descendant of this node. - * - * @param ".$this->getStubNodeBuilder()->getClassname()." Node to look for. - * @param boolean True if strict comparison should be used. - * @param boolean True if all descendants should be checked. - * @return boolean - */ - public function hasChildNode(\$node, \$strict = false, \$recurse = false) - { - foreach (\$this->childNodes as \$childNode) - { - if (\$childNode->equals(\$node, \$strict)) - return true; - - if (\$recurse && \$childNode->hasChildNode(\$node, \$recurse)) - return true; - } - - return false; - } -"; - } - - protected function addGetChildNodeAt(&$script) - { - $script .= " - /** - * Returns child node at one-based index. Retrieves from database if not - * loaded yet. - * - * @param int One-based child node index. - * @param boolean True if child should be retrieved from database. - * @param PropelPDO Connection to use if retrieving from database. - * @return ".$this->getStubNodeBuilder()->getClassname()." - */ - public function getChildNodeAt(\$i, \$querydb = false, PropelPDO \$con = null) - { - if (\$querydb && - !\$this->obj->isNew() && - !\$this->obj->isDeleted() && - !isset(\$this->childNodes[\$i])) - { - \$criteria = new Criteria(".$this->getStubPeerBuilder()->getClassname()."::DATABASE_NAME); - \$criteria->add(".$this->getStubNodePeerBuilder()->getClassname()."::NPATH_COLNAME, \$this->getNodePath() . ".$this->getStubNodePeerBuilder()->getClassname()."::NPATH_SEP . \$i, Criteria::EQUAL); - - if (\$childObj = ".$this->getStubPeerBuilder()->getClassname()."::doSelectOne(\$criteria, \$con)) - \$this->attachChildNode(new ".$this->getStubNodeBuilder()->getClassname()."(\$childObj)); - } - - return (isset(\$this->childNodes[\$i]) ? \$this->childNodes[\$i] : null); - } -"; - } - - protected function addGetFirstChildNode(&$script) - { - $script .= " - /** - * Returns first child node (if any). Retrieves from database if not loaded yet. - * - * @param boolean True if child should be retrieved from database. - * @param PropelPDO Connection to use if retrieving from database. - * @return ".$this->getStubNodeBuilder()->getClassname()." - */ - public function getFirstChildNode(\$querydb = false, PropelPDO \$con = null) - { - return \$this->getChildNodeAt(1, \$querydb, \$con); - } -"; - } - - protected function addGetLastChildNode(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - - $script .= " - /** - * Returns last child node (if any). - * - * @param boolean True if child should be retrieved from database. - * @param PropelPDO Connection to use if retrieving from database. - */ - public function getLastChildNode(\$querydb = false, PropelPDO \$con = null) - { - \$lastNode = null; - - if (\$this->obj->isNew() || \$this->obj->isDeleted()) - { - end(\$this->childNodes); - \$lastNode = (count(\$this->childNodes) ? current(\$this->childNodes) : null); - } - else if (\$querydb) - { - \$db = Propel::getDb($peerClassname::DATABASE_NAME); - \$criteria = new Criteria($peerClassname::DATABASE_NAME); - \$criteria->add($nodePeerClassname::NPATH_COLNAME, \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . '%', Criteria::LIKE); - \$criteria->addAnd($nodePeerClassname::NPATH_COLNAME, \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . '%' . $nodePeerClassname::NPATH_SEP . '%', Criteria::NOT_LIKE); - $peerClassname::addSelectColumns(\$criteria); - \$criteria->addAsColumn('npathlen', \$db->strLength($nodePeerClassname::NPATH_COLNAME)); - \$criteria->addDescendingOrderByColumn('npathlen'); - \$criteria->addDescendingOrderByColumn($nodePeerClassname::NPATH_COLNAME); - - \$lastObj = $peerClassname::doSelectOne(\$criteria, \$con); - - if (\$lastObj !== null) - { - \$lastNode = new ".$this->getStubNodeBuilder()->getClassname()."(\$lastObj); - - end(\$this->childNodes); - \$endNode = (count(\$this->childNodes) ? current(\$this->childNodes) : null); - - if (\$endNode) - { - if (\$endNode->getNodePath() > \$lastNode->getNodePath()) - throw new PropelException('Cached child node inconsistent with database.'); - else if (\$endNode->getNodePath() == \$lastNode->getNodePath()) - \$lastNode = \$endNode; - else - \$this->attachChildNode(\$lastNode); - } - else - { - \$this->attachChildNode(\$lastNode); - } - } - } - - return \$lastNode; - } -"; - } - - protected function addGetSiblingNode(&$script) - { - $script .= " - /** - * Returns next (or previous) sibling node or null. Retrieves from database if - * not loaded yet. - * - * @param boolean True if previous sibling should be returned. - * @param boolean True if sibling should be retrieved from database. - * @param PropelPDO Connection to use if retrieving from database. - * @return ".$this->getStubNodeBuilder()->getClassname()." - */ - public function getSiblingNode(\$prev = false, \$querydb = false, PropelPDO \$con = null) - { - \$nidx = \$this->getNodeIndex(); - - if (\$this->isRootNode()) - { - return null; - } - else if (\$prev) - { - if (\$nidx > 1 && (\$parentNode = \$this->getParentNode(\$querydb, \$con))) - return \$parentNode->getChildNodeAt(\$nidx-1, \$querydb, \$con); - else - return null; - } - else - { - if (\$parentNode = \$this->getParentNode(\$querydb, \$con)) - return \$parentNode->getChildNodeAt(\$nidx+1, \$querydb, \$con); - else - return null; - } - } -"; - } - - protected function addGetParentNode(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - - $script .= " - /** - * Returns parent node. Loads from database if not cached yet. - * - * @param boolean True if parent should be retrieved from database. - * @param PropelPDO Connection to use if retrieving from database. - * @return ".$this->getStubNodeBuilder()->getClassname()." - */ - public function getParentNode(\$querydb = true, PropelPDO \$con = null) - { - if (\$querydb && - \$this->parentNode === null && - !\$this->isRootNode() && - !\$this->obj->isNew() && - !\$this->obj->isDeleted()) - { - \$npath =& \$this->getNodePath(); - \$sep = strrpos(\$npath, $nodePeerClassname::NPATH_SEP); - \$ppath = substr(\$npath, 0, \$sep); - - \$criteria = new Criteria($peerClassname::DATABASE_NAME); - \$criteria->add($nodePeerClassname::NPATH_COLNAME, \$ppath, Criteria::EQUAL); - - if (\$parentObj = $peerClassname::doSelectOne(\$criteria, \$con)) - { - \$parentNode = new ".$this->getStubNodeBuilder()->getClassname()."(\$parentObj); - \$parentNode->attachChildNode(\$this); - } - } - - return \$this->parentNode; - } -"; - } - - protected function addGetAncestors(&$script) - { - $script .= " - /** - * Returns an array of all ancestor nodes, starting with the root node - * first. - * - * @param boolean True if ancestors should be retrieved from database. - * @param PropelPDO Connection to use if retrieving from database. - * @return array - */ - public function getAncestors(\$querydb = false, PropelPDO \$con = null) - { - \$ancestors = array(); - \$parentNode = \$this; - - while (\$parentNode = \$parentNode->getParentNode(\$querydb, \$con)) - array_unshift(\$ancestors, \$parentNode); - - return \$ancestors; - } -"; - } - - protected function addIsRootNode(&$script) - { - $script .= " - /** - * Returns true if node is the root node of the tree. - * @return boolean - */ - public function isRootNode() - { - return (\$this->getNodePath() === '1'); - } -"; - } - - protected function addSetNew(&$script) - { - $script .= " - /** - * Changes the state of the object and its descendants to 'new'. - * Also changes the node path to '0' to indicate that it is not a - * stored node. - * - * @param boolean - * @return void - */ - public function setNew(\$b) - { - \$this->adjustStatus('new', \$b); - \$this->adjustNodePath(\$this->getNodePath(), '0'); - } -"; - } - - protected function addSetDeleted(&$script) - { - $script .= " - /** - * Changes the state of the object and its descendants to 'deleted'. - * - * @param boolean - * @return void - */ - public function setDeleted(\$b) - { - \$this->adjustStatus('deleted', \$b); - } -"; - } - - protected function addAddChildNode(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - - $script .= " - /** - * Adds the specified node (and its children) as a child to this node. If a - * valid \$beforeNode is specified, the node will be inserted in front of - * \$beforeNode. If \$beforeNode is not specified the node will be appended to - * the end of the child nodes. - * - * @param ".$this->getStubNodeBuilder()->getClassname()." Node to add. - * @param ".$this->getStubNodeBuilder()->getClassname()." Node to insert before. - * @param PropelPDO Connection to use. - */ - public function addChildNode(\$node, \$beforeNode = null, PropelPDO \$con = null) - { - if (\$this->obj->isNew() && !\$node->obj->isNew()) - throw new PropelException('Cannot add stored nodes to a new node.'); - - if (\$this->obj->isDeleted() || \$node->obj->isDeleted()) - throw new PropelException('Cannot add children in a deleted state.'); - - if (\$this->hasChildNode(\$node)) - throw new PropelException('Node is already a child of this node.'); - - if (\$beforeNode && !\$this->hasChildNode(\$beforeNode)) - throw new PropelException('Invalid beforeNode.'); - - if (\$con === null) - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_WRITE); - - if (!\$this->obj->isNew()) \$con->beginTransaction(); - - try { - if (\$beforeNode) - { - // Inserting before a node. - \$childIdx = \$beforeNode->getNodeIndex(); - \$this->shiftChildNodes(1, \$beforeNode->getNodeIndex(), \$con); - } - else - { - // Appending child node. - if (\$lastNode = \$this->getLastChildNode(true, \$con)) - \$childIdx = \$lastNode->getNodeIndex()+1; - else - \$childIdx = 1; - } - - // Add the child (and its children) at the specified index. - - if (!\$this->obj->isNew() && \$node->obj->isNew()) - { - \$this->insertNewChildNode(\$node, \$childIdx, \$con); - } - else - { - // \$this->isNew() && \$node->isNew() || - // !\$this->isNew() && !node->isNew() - - \$srcPath = \$node->getNodePath(); - \$dstPath = \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . \$childIdx; - - if (!\$node->obj->isNew()) - { - $nodePeerClassname::moveNodeSubTree(\$srcPath, \$dstPath, \$con); - \$parentNode = \$node->getParentNode(true, \$con); - } - else - { - \$parentNode = \$node->getParentNode(); - } - - if (\$parentNode) - { - \$parentNode->detachChildNode(\$node); - \$parentNode->shiftChildNodes(-1, \$node->getNodeIndex()+1, \$con); - } - - \$node->adjustNodePath(\$srcPath, \$dstPath); - } - - if (!\$this->obj->isNew()) \$con->commit(); - - \$this->attachChildNode(\$node); - - } catch (SQLException \$e) { - if (!\$this->obj->isNew()) \$con->rollBack(); - throw new PropelException(\$e); - } - } -"; - } - - protected function addMoveChildNode(&$script) - { - $script .= " - /** - * Moves the specified child node in the specified direction. - * - * @param ".$this->getStubNodeBuilder()->getClassname()." Node to move. - * @param int Number of spaces to move among siblings (may be negative). - * @param PropelPDO Connection to use. - * @throws PropelException - */ - public function moveChildNode(\$node, \$direction, PropelPDO \$con = null) - { - throw new PropelException('moveChildNode() not implemented yet.'); - } -"; - } - - - protected function addSave(&$script) - { - - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $script .= " - /** - * Saves modified object data to the datastore. - * - * @param boolean If true, descendants will be saved as well. - * @param PropelPDO Connection to use. - */ - public function save(\$recurse = false, PropelPDO \$con = null) - { - if (\$this->obj->isDeleted()) - throw new PropelException('Cannot save deleted node.'); - - if (substr(\$this->getNodePath(), 0, 1) == '0') - throw new PropelException('Cannot save unattached node.'); - - if (\$this->obj->isColumnModified($nodePeerClassname::NPATH_COLNAME)) - throw new PropelException('Cannot save manually modified node path.'); - - \$this->obj->save(\$con); - - if (\$recurse) - { - foreach (\$this->childNodes as \$childNode) - \$childNode->save(\$recurse, \$con); - } - } -"; - } - - - protected function addDelete(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $script .= " - /** - * Removes this object and all descendants from datastore. - * - * @param PropelPDO Connection to use. - * @return void - * @throws PropelException - */ - public function delete(PropelPDO \$con = null) - { - if (\$this->obj->isDeleted()) { - throw new PropelException('This node has already been deleted.'); - } - - if (\$con === null) { - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if (!\$this->obj->isNew()) { - $nodePeerClassname::deleteNodeSubTree(\$this->getNodePath(), \$con); - } - - if (\$parentNode = \$this->getParentNode(true, \$con)) { - \$parentNode->detachChildNode(\$this); - \$parentNode->shiftChildNodes(-1, \$this->getNodeIndex()+1, \$con); - } - - \$this->setDeleted(true); - } -"; - } - - protected function addEquals(&$script) - { - $nodeClassname = $this->getStubNodeBuilder()->getClassname(); - $script .= " - /** - * Compares the object wrapped by this node with that of another node. Use - * this instead of equality operators to prevent recursive dependency - * errors. - * - * @param $nodeClassname Node to compare. - * @param boolean True if strict comparison should be used. - * @return boolean - */ - public function equals(\$node, \$strict = false) - { - if (\$strict) { - return (\$this->obj === \$node->obj); - } else { - return (\$this->obj == \$node->obj); - } - } -"; - } - - protected function addAttachParentNode(&$script) - { - $nodeClassname = $this->getStubNodeBuilder()->getClassname(); - $script .= " - /** - * This method is used internally when constructing the tree structure - * from the database. To set the parent of a node, you should call - * addChildNode() on the parent. - * - * @param $nodeClassname Parent node to attach. - * @return void - * @throws PropelException - */ - public function attachParentNode(\$node) - { - if (!\$node->hasChildNode(\$this, true)) - throw new PropelException('Failed to attach parent node for non-child.'); - - \$this->parentNode = \$node; - } -"; - } - - - protected function addAttachChildNode(&$script) - { - $nodeClassname = $this->getStubNodeBuilder()->getClassname(); - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $script .= " - /** - * This method is used internally when constructing the tree structure - * from the database. To add a child to a node you should call the - * addChildNode() method instead. - * - * @param $nodeClassname Child node to attach. - * @return void - * @throws PropelException - */ - public function attachChildNode(\$node) - { - if (\$this->hasChildNode(\$node)) - throw new PropelException('Failed to attach child node. Node already exists.'); - - if (\$this->obj->isDeleted() || \$node->obj->isDeleted()) - throw new PropelException('Failed to attach node in deleted state.'); - - if (\$this->obj->isNew() && !\$node->obj->isNew()) - throw new PropelException('Failed to attach non-new child to new node.'); - - if (!\$this->obj->isNew() && \$node->obj->isNew()) - throw new PropelException('Failed to attach new child to non-new node.'); - - if (\$this->getNodePath() . $nodePeerClassname::NPATH_SEP . \$node->getNodeIndex() != \$node->getNodePath()) - throw new PropelException('Failed to attach child node. Node path mismatch.'); - - \$this->childNodes[\$node->getNodeIndex()] = \$node; - ksort(\$this->childNodes); - - \$node->attachParentNode(\$this); - } -"; - } - - protected function addDetachParentNode(&$script) - { - $nodeClassname = $this->getStubNodeBuilder()->getClassname(); - $script .= " - /** - * This method is used internally when deleting nodes. It is used to break - * the link to this node's parent. - * @param $nodeClassname Parent node to detach from. - * @return void - * @throws PropelException - */ - public function detachParentNode(\$node) - { - if (!\$node->hasChildNode(\$this, true)) - throw new PropelException('Failed to detach parent node from non-child.'); - - unset(\$node->childNodes[\$this->getNodeIndex()]); - \$this->parentNode = null; - } -"; - } - - protected function addDetachChildNode(&$script) - { - $script .= " - /** - * This method is used internally when deleting nodes. It is used to break - * the link to this between this node and the specified child. - * @param ".$this->getStubNodeBuilder()->getClassname()." Child node to detach. - * @return void - * @throws PropelException - */ - public function detachChildNode(\$node) - { - if (!\$this->hasChildNode(\$node, true)) - throw new PropelException('Failed to detach non-existent child node.'); - - unset(\$this->childNodes[\$node->getNodeIndex()]); - \$node->parentNode = null; - } -"; - } - - protected function addShiftChildNodes(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - - $script .= " - /** - * Shifts child nodes in the specified direction and offset index. This - * method assumes that there is already space available in the - * direction/offset indicated. - * - * @param int Direction/# spaces to shift. 1=leftshift, 1=rightshift - * @param int Node index to start shift at. - * @param PropelPDO The connection to be used. - * @return void - * @throws PropelException - */ - protected function shiftChildNodes(\$direction, \$offsetIdx, PropelPDO \$con) - { - if (\$this->obj->isDeleted()) - throw new PropelException('Cannot shift nodes for deleted object'); - - \$lastNode = \$this->getLastChildNode(true, \$con); - \$lastIdx = (\$lastNode !== null ? \$lastNode->getNodeIndex() : 0); - - if (\$lastNode === null || \$offsetIdx > \$lastIdx) - return; - - if (\$con === null) - \$con = Propel::getConnection($peerClassname::DATABASE_NAME); - - if (!\$this->obj->isNew()) - { - // Shift nodes in database. - - \$con->beginTransaction(); - - try { - \$n = \$lastIdx - \$offsetIdx + 1; - \$i = \$direction < 1 ? \$offsetIdx : \$lastIdx; - - while (\$n--) - { - \$srcPath = \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . \$i; // 1.2.2 - \$dstPath = \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . (\$i+\$direction); // 1.2.3 - - $nodePeerClassname::moveNodeSubTree(\$srcPath, \$dstPath, \$con); - - \$i -= \$direction; - } - - \$con->commit(); - - } catch (SQLException \$e) { - \$con->rollBack(); - throw new PropelException(\$e); - } - } - - // Shift the in-memory objects. - - \$n = \$lastIdx - \$offsetIdx + 1; - \$i = \$direction < 1 ? \$offsetIdx : \$lastIdx; - - while (\$n--) - { - if (isset(\$this->childNodes[\$i])) - { - \$srcPath = \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . \$i; // 1.2.2 - \$dstPath = \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . (\$i+\$direction); // 1.2.3 - - \$this->childNodes[\$i+\$direction] = \$this->childNodes[\$i]; - \$this->childNodes[\$i+\$direction]->adjustNodePath(\$srcPath, \$dstPath); - - unset(\$this->childNodes[\$i]); - } - - \$i -= \$direction; - } - - ksort(\$this->childNodes); - } -"; - } - - protected function addInsertNewChildNode(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $nodeClassname = $this->getStubNodePeerBuilder()->getClassname(); - - $script .= " - /** - * Inserts the node and its children at the specified childIdx. - * - * @param $nodeClassname Node to insert. - * @param int One-based child index to insert at. - * @param PropelPDO Connection to use. - * @param void - */ - protected function insertNewChildNode(\$node, \$childIdx, PropelPDO \$con) - { - if (!\$node->obj->isNew()) - throw new PropelException('Failed to insert non-new node.'); - - \$setNodePath = 'set' . $nodePeerClassname::NPATH_PHPNAME; - - \$node->obj->\$setNodePath(\$this->getNodePath() . $nodePeerClassname::NPATH_SEP . \$childIdx); - \$node->obj->save(\$con); - - \$i = 1; - foreach (\$node->childNodes as \$childNode) - \$node->insertNewChildNode(\$childNode, \$i++, \$con); - } -"; - } - - protected function addAdjustStatus(&$script) - { - $script .= " - /** - * Adjust new/deleted status of node and all children. - * - * @param string Status to change ('New' or 'Deleted') - * @param boolean Value for status. - * @return void - */ - protected function adjustStatus(\$status, \$b) - { - \$setStatus = 'set' . \$status; - - \$this->obj->\$setStatus(\$b); - - foreach (\$this->childNodes as \$childNode) - \$childNode->obj->\$setStatus(\$b); - } -"; - } - - protected function addAdjustNodePath(&$script) - { - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $script .= " - /** - * Adjust path of node and all children. This is used internally when - * inserting/moving nodes. - * - * @param string Section of old path to change. - * @param string New section to replace old path with. - * @return void - */ - protected function adjustNodePath(\$oldBasePath, \$newBasePath) - { - \$setNodePath = 'set' . $nodePeerClassname::NPATH_PHPNAME; - - \$this->obj->\$setNodePath(\$newBasePath . substr(\$this->getNodePath(), strlen(\$oldBasePath))); - \$this->obj->resetModified($nodePeerClassname::NPATH_COLNAME); - - foreach (\$this->childNodes as \$childNode) - \$childNode->adjustNodePath(\$oldBasePath, \$newBasePath); - } -"; - } - -} // PHP5NodeObjectBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5NodePeerBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5NodePeerBuilder.php deleted file mode 100644 index b84021e702..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5NodePeerBuilder.php +++ /dev/null @@ -1,754 +0,0 @@ - - * @package propel.generator.builder.om - */ -class PHP5NodePeerBuilder extends PeerBuilder -{ - - /** - * Gets the package for the [base] object classes. - * @return string - */ - public function getPackage() - { - return parent::getPackage() . ".om"; - } - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return $this->getBuildProperty('basePrefix') . $this->getStubNodePeerBuilder()->getUnprefixedClassname(); - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - - $table = $this->getTable(); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - - $script .= " -/** - * Base static class for performing query operations on the tree contained by the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * @package propel.generator.".$this->getPackage()." - */ -abstract class ".$this->getClassname()." { -"; - } - - /** - * Specifies the methods that are added as part of the basic OM class. - * This can be overridden by subclasses that wish to add more methods. - * @see ObjectBuilder::addClassBody() - */ - protected function addClassBody(&$script) - { - $table = $this->getTable(); - - // FIXME - // - Probably the build needs to be customized for supporting - // tables that are "aliases". -- definitely a fringe usecase, though. - - $this->addConstants($script); - - $this->addIsCodeBase($script); - - $this->addRetrieveMethods($script); - - $this->addCreateNewRootNode($script); - $this->addInsertNewRootNode($script); - $this->addMoveNodeSubTree($script); - $this->addDeleteNodeSubTree($script); - - $this->addBuildFamilyCriteria($script); - $this->addBuildTree($script); - - $this->addPopulateNodes($script); - - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - } - - protected function addConstants(&$script) - { - $table = $this->getTable(); - - $npath_colname = ''; - $npath_phpname = ''; - $npath_len = 0; - $npath_sep = ''; - foreach ($table->getColumns() as $col) { - if ($col->isNodeKey()) { - $npath_colname = $table->getName() . '.' . strtoupper($col->getName()); - $npath_phpname = $col->getPhpName(); - $npath_len = $col->getSize(); - $npath_sep = $col->getNodeKeySep(); - break; - } - } - $script .= " - const NPATH_COLNAME = '$npath_colname'; - const NPATH_PHPNAME = '$npath_phpname'; - const NPATH_SEP = '$npath_sep'; - const NPATH_LEN = $npath_len; -"; - } - - - protected function addIsCodeBase(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - - $script .= " - /** - * Temp function for CodeBase hacks that will go away. - */ - public static function isCodeBase(\$con = null) - { - if (\$con === null) - \$con = Propel::getConnection($peerClassname::DATABASE_NAME); - - return (get_class(\$con) == 'ODBCConnection' && - get_class(\$con->getAdapter()) == 'CodeBaseAdapter'); - } -"; - } - - - protected function addCreateNewRootNode(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $nodeObjectClassname = $this->getStubNodeBuilder()->getClassname(); - - $script .= " - /** - * Create a new Node at the top of tree. This method will destroy any - * existing root node (along with its children). - * - * Use at your own risk! - * - * @param $objectClassname Object wrapped by new node. - * @param PropelPDO Connection to use. - * @return $nodeObjectClassname - * @throws PropelException - */ - public static function createNewRootNode(\$obj, PropelPDO \$con = null) - { - if (\$con === null) - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_WRITE); - - \$con->beginTransaction(); - - try { - self::deleteNodeSubTree('1', \$con); - - \$setNodePath = 'set' . self::NPATH_PHPNAME; - - \$obj->\$setNodePath('1'); - \$obj->save(\$con); - - \$con->commit(); - } catch (PropelException \$e) { - \$con->rollBack(); - throw \$e; - } - - return new $nodeObjectClassname(\$obj); - } -"; - } - - protected function addInsertNewRootNode(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $nodeObjectClassname = $this->getStubNodeBuilder()->getClassname(); - - $script .= " - /** - * Inserts a new Node at the top of tree. Any existing root node (along with - * its children) will be made a child of the new root node. This is a - * safer alternative to createNewRootNode(). - * - * @param $objectClassname Object wrapped by new node. - * @param PropelPDO Connection to use. - * @return $nodeObjectClassname - * @throws PropelException - */ - public static function insertNewRootNode(\$obj, PropelPDO \$con = null) - { - if (\$con === null) - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_WRITE); - - \$con->beginTransaction(); - try { - // Move root tree to an invalid node path. - $nodePeerClassname::moveNodeSubTree('1', '0', \$con); - - \$setNodePath = 'set' . self::NPATH_PHPNAME; - - // Insert the new root node. - \$obj->\$setNodePath('1'); - \$obj->save(\$con); - - // Move the old root tree as a child of the new root. - $nodePeerClassname::moveNodeSubTree('0', '1' . self::NPATH_SEP . '1', \$con); - - \$con->commit(); - } catch (PropelException \$e) { - \$con->rollBack(); - throw \$e; - } - - return new $nodeObjectClassname(\$obj); - } -"; - } - - /** - * Adds the methods for retrieving nodes. - */ - protected function addRetrieveMethods(&$script) - { - $this->addRetrieveNodes($script); - $this->addRetrieveNodeByPK($script); - $this->addRetrieveNodeByNP($script); - $this->addRetrieveRootNode($script); - - } - - protected function addRetrieveNodes(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - - $script .= " - /** - * Retrieves an array of tree nodes based on specified criteria. Optionally - * includes all parent and/or child nodes of the matching nodes. - * - * @param Criteria Criteria to use. - * @param boolean True if ancestors should also be retrieved. - * @param boolean True if descendants should also be retrieved. - * @param PropelPDO Connection to use. - * @return array Array of root nodes. - */ - public static function retrieveNodes(\$criteria, \$ancestors = false, \$descendants = false, PropelPDO \$con = null) - { - \$criteria = $nodePeerClassname::buildFamilyCriteria(\$criteria, \$ancestors, \$descendants); - \$stmt = ".$this->getStubPeerBuilder()->getClassname()."::doSelectStmt(\$criteria, \$con); - return self::populateNodes(\$stmt, \$criteria); - } -"; - } - - protected function addRetrieveNodeByPK(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $nodeObjectClassname = $this->getStubNodeBuilder()->getClassname(); - - $script .= " - /** - * Retrieves a tree node based on a primary key. Optionally includes all - * parent and/or child nodes of the matching node. - * - * @param mixed $objectClassname primary key (array for composite keys) - * @param boolean True if ancestors should also be retrieved. - * @param boolean True if descendants should also be retrieved. - * @param PropelPDO Connection to use. - * @return $nodeObjectClassname - */ - public static function retrieveNodeByPK(\$pk, \$ancestors = false, \$descendants = false, PropelPDO \$con = null) - { - throw new PropelException('retrieveNodeByPK() not implemented yet.'); - } -"; - } - - protected function addRetrieveNodeByNP(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $nodeObjectClassname = $this->getStubNodeBuilder()->getClassname(); - - $script .= " - /** - * Retrieves a tree node based on a node path. Optionally includes all - * parent and/or child nodes of the matching node. - * - * @param string Node path to retrieve. - * @param boolean True if ancestors should also be retrieved. - * @param boolean True if descendants should also be retrieved. - * @param PropelPDO Connection to use. - * @return $objectClassname - */ - public static function retrieveNodeByNP(\$np, \$ancestors = false, \$descendants = false, PropelPDO \$con = null) - { - \$criteria = new Criteria($peerClassname::DATABASE_NAME); - \$criteria->add(self::NPATH_COLNAME, \$np, Criteria::EQUAL); - \$criteria = self::buildFamilyCriteria(\$criteria, \$ancestors, \$descendants); - \$stmt = $peerClassname::doSelectStmt(\$criteria, \$con); - \$nodes = self::populateNodes(\$stmt, \$criteria); - return (count(\$nodes) == 1 ? \$nodes[0] : null); - } -"; - } - - protected function addRetrieveRootNode(&$script) - { - $script .= " - /** - * Retrieves the root node. - * - * @param string Node path to retrieve. - * @param boolean True if descendants should also be retrieved. - * @param PropelPDO Connection to use. - * @return ".$this->getStubNodeBuilder()->getClassname()." - */ - public static function retrieveRootNode(\$descendants = false, PropelPDO \$con = null) - { - return self::retrieveNodeByNP('1', false, \$descendants, \$con); - } -"; - } - - protected function addMoveNodeSubTree(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $nodeObjectClassname = $this->getStubNodeBuilder()->getClassname(); - - $script .= " - /** - * Moves the node subtree at srcpath to the dstpath. This method is intended - * for internal use by the BaseNode object. Note that it does not check for - * preexisting nodes at the dstpath. It also does not update the node path - * of any Node objects that might currently be in memory. - * - * Use at your own risk! - * - * @param string Source node path to move (root of the src subtree). - * @param string Destination node path to move to (root of the dst subtree). - * @param PropelPDO Connection to use. - * @return void - * @throws PropelException - * @todo This is currently broken for simulated 'onCascadeDelete's. - * @todo Need to abstract the SQL better. The CONCAT sql function doesn't - * seem to be standardized (i.e. mssql), so maybe it needs to be moved - * to DBAdapter. - */ - public static function moveNodeSubTree(\$srcPath, \$dstPath, PropelPDO \$con = null) - { - if (substr(\$dstPath, 0, strlen(\$srcPath)) == \$srcPath) - throw new PropelException('Cannot move a node subtree within itself.'); - - if (\$con === null) - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_WRITE); - - /** - * Example: - * UPDATE table - * SET npath = CONCAT('1.3', SUBSTRING(npath, 6, 74)) - * WHERE npath = '1.2.2' OR npath LIKE '1.2.2.%' - */ - - \$npath = $nodePeerClassname::NPATH_COLNAME; - //the following dot isn`t mean`t a nodeKeySeperator - \$setcol = substr(\$npath, strrpos(\$npath, '.')+1); - \$setcollen = $nodePeerClassname::NPATH_LEN; - \$db = Propel::getDb($peerClassname::DATABASE_NAME); - - // - if ($nodePeerClassname::isCodeBase(\$con)) - { - // This is a hack to get CodeBase working. It will eventually be removed. - // It is a workaround for the following CodeBase bug: - // -Prepared statement parameters cannot be embedded in SQL functions (i.e. CONCAT) - \$sql = \"UPDATE \" . $peerClassname::TABLE_NAME . \" \" . - \"SET \$setcol=\" . \$db->concatString(\"'\$dstPath'\", \$db->subString(\$npath, strlen(\$srcPath)+1, \$setcollen)) . \" \" . - \"WHERE \$npath = '\$srcPath' OR \$npath LIKE '\" . \$srcPath . $nodePeerClassname::NPATH_SEP . \"%'\"; - - \$con->executeUpdate(\$sql); - } - else - { - // - \$sql = \"UPDATE \" . $peerClassname::TABLE_NAME . \" \" . - \"SET \$setcol=\" . \$db->concatString('?', \$db->subString(\$npath, '?', '?')) . \" \" . - \"WHERE \$npath = ? OR \$npath LIKE ?\"; - - \$stmt = \$con->prepare(\$sql); - \$stmt->bindValue(1, \$dstPath); // string - \$srcPathPlus1 = strlen(\$srcPath)+1; - \$stmt->bindValue(2, \$srcPathPlus1); // int - \$stmt->bindValue(3, \$setcollen);// int - \$stmt->bindValue(4, \$srcPath);// string - \$srcPathWC = \$srcPath . $nodePeerClassname::NPATH_SEP . '%'; - \$stmt->bindValue(5, \$srcPathWC); // string - \$stmt->execute(); - // - } - } -"; - } - - protected function addDeleteNodeSubTree(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $nodeObjectClassname = $this->getStubNodeBuilder()->getClassname(); - - $script .= " - /** - * Deletes the node subtree at the specified node path from the database. - * - * @param string Node path to delete - * @param PropelPDO Connection to use. - * @return void - * @throws PropelException - * @todo This is currently broken for simulated 'onCascadeDelete's. - */ - public static function deleteNodeSubTree(\$nodePath, PropelPDO \$con = null) - { - if (\$con === null) - \$con = Propel::getConnection($peerClassname::DATABASE_NAME, Propel::CONNECTION_WRITE); - - /** - * DELETE FROM table - * WHERE npath = '1.2.2' OR npath LIKE '1.2.2.%' - */ - - \$criteria = new Criteria($peerClassname::DATABASE_NAME); - \$criteria->add($nodePeerClassname::NPATH_COLNAME, \$nodePath, Criteria::EQUAL); - \$criteria->addOr($nodePeerClassname::NPATH_COLNAME, \$nodePath . self::NPATH_SEP . '%', Criteria::LIKE); - {$this->basePeerClassname}::doDelete(\$criteria, \$con); - } -"; - } - - protected function addBuildFamilyCriteria(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $nodeObjectClassname = $this->getStubNodeBuilder()->getClassname(); - - $script .= " - /** - * Builds the criteria needed to retrieve node ancestors and/or descendants. - * - * @param Criteria Criteria to start with - * @param boolean True if ancestors should be retrieved. - * @param boolean True if descendants should be retrieved. - * @return Criteria - */ - public static function buildFamilyCriteria(\$criteria, \$ancestors = false, \$descendants = false) - { - /* - Example SQL to retrieve nodepath '1.2.3' with both ancestors and descendants: - - SELECT L.NPATH, L.LABEL, test.NPATH, UCASE(L.NPATH) - FROM test L, test - WHERE test.NPATH='1.2.3' AND - (L.NPATH=SUBSTRING(test.NPATH, 1, LENGTH(L.NPATH)) OR - test.NPATH=SUBSTRING(L.NPATH, 1, LENGTH(test.NPATH))) - ORDER BY UCASE(L.NPATH) ASC - */ - - if (\$criteria === null) - \$criteria = new Criteria($peerClassname::DATABASE_NAME); - - if (!\$criteria->getSelectColumns()) - $peerClassname::addSelectColumns(\$criteria); - - \$db = Propel::getDb(\$criteria->getDbName()); - - if ((\$ancestors || \$descendants) && \$criteria->size()) - { - // If we are retrieving ancestors/descendants, we need to do a - // self-join to locate them. The exception to this is if no search - // criteria is specified. In this case we're retrieving all nodes - // anyway, so there is no need to do a self-join. - - // The left-side of the self-join will contain the columns we'll - // use to build node objects (target node records along with their - // ancestors and/or descendants). The right-side of the join will - // contain the target node records specified by the initial criteria. - // These are used to match the appropriate ancestor/descendant on - // the left. - - // Specify an alias for the left-side table to use. - \$criteria->addAlias('L', $peerClassname::TABLE_NAME); - - // Make sure we have select columns to begin with. - if (!\$criteria->getSelectColumns()) - $peerClassname::addSelectColumns(\$criteria); - - // Replace any existing columns for the right-side table with the - // left-side alias. - \$selectColumns = \$criteria->getSelectColumns(); - \$criteria->clearSelectColumns(); - foreach (\$selectColumns as \$colName) - \$criteria->addSelectColumn(str_replace($peerClassname::TABLE_NAME, 'L', \$colName)); - - \$a = null; - \$d = null; - - \$npathL = $peerClassname::alias('L', $nodePeerClassname::NPATH_COLNAME); - \$npathR = $nodePeerClassname::NPATH_COLNAME; - \$npath_len = $nodePeerClassname::NPATH_LEN; - - if (\$ancestors) - { - // For ancestors, match left-side node paths which are contained - // by right-side node paths. - \$a = \$criteria->getNewCriterion(\$npathL, - \"\$npathL=\" . \$db->subString(\$npathR, 1, \$db->strLength(\$npathL), \$npath_len), - Criteria::CUSTOM); - } - - if (\$descendants) - { - // For descendants, match left-side node paths which contain - // right-side node paths. - \$d = \$criteria->getNewCriterion(\$npathR, - \"\$npathR=\" . \$db->subString(\$npathL, 1, \$db->strLength(\$npathR), \$npath_len), - Criteria::CUSTOM); - } - - if (\$a) - { - if (\$d) \$a->addOr(\$d); - \$criteria->addAnd(\$a); - } - else if (\$d) - { - \$criteria->addAnd(\$d); - } - - // Add the target node path column. This is used by populateNodes(). - \$criteria->addSelectColumn(\$npathR); - - // Sort by node path to speed up tree construction in populateNodes() - \$criteria->addAsColumn('npathlen', \$db->strLength(\$npathL)); - \$criteria->addAscendingOrderByColumn('npathlen'); - \$criteria->addAscendingOrderByColumn(\$npathL); - } - else - { - // Add the target node path column. This is used by populateNodes(). - \$criteria->addSelectColumn($nodePeerClassname::NPATH_COLNAME); - - // Sort by node path to speed up tree construction in populateNodes() - \$criteria->addAsColumn('npathlen', \$db->strLength($nodePeerClassname::NPATH_COLNAME)); - \$criteria->addAscendingOrderByColumn('npathlen'); - \$criteria->addAscendingOrderByColumn($nodePeerClassname::NPATH_COLNAME); - } - - return \$criteria; - } -"; - } - - protected function addBuildTree(&$script) - { - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $nodeObjectClassname = $this->getStubNodeBuilder()->getClassname(); - - $script .= " - /** - * This method reconstructs as much of the tree structure as possible from - * the given array of objects. Depending on how you execute your query, it - * is possible for the ResultSet to contain multiple tree fragments (i.e. - * subtrees). The array returned by this method will contain one entry - * for each subtree root node it finds. The remaining subtree nodes are - * accessible from the $nodeObjectClassname methods of the - * subtree root nodes. - * - * @param array Array of $nodeObjectClassname objects - * @return array Array of $nodeObjectClassname objects - */ - public static function buildTree(\$nodes) - { - // Subtree root nodes to return - \$rootNodes = array(); - - // Build the tree relations - foreach (\$nodes as \$node) - { - \$sep = strrpos(\$node->getNodePath(), $nodePeerClassname::NPATH_SEP); - \$parentPath = (\$sep !== false ? substr(\$node->getNodePath(), 0, \$sep) : ''); - \$parentNode = null; - - // Scan other nodes for parent. - foreach (\$nodes as \$pnode) - { - if (\$pnode->getNodePath() === \$parentPath) - { - \$parentNode = \$pnode; - break; - } - } - - // If parent was found, attach as child, otherwise its a subtree root - if (\$parentNode) - \$parentNode->attachChildNode(\$node); - else - \$rootNodes[] = \$node; - } - - return \$rootNodes; - } -"; - } - - protected function addPopulateNodes(&$script) - { - $table = $this->getTable(); - - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $objectClassname = $this->getStubObjectBuilder()->getClassname(); - - $nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname(); - $nodeObjectClassname = $this->getStubNodeBuilder()->getClassname(); - - $script .= " - /** - * Populates the $objectClassname objects from the - * specified ResultSet, wraps them in $nodeObjectClassname - * objects and build the appropriate node relationships. - * The array returned by this method will only include the initial targets - * of the query, even if ancestors/descendants were also requested. - * The ancestors/descendants will be cached in memory and are accessible via - * the getNode() methods. - * - * @param PDOStatement \$stmt Executed PDOStatement - * @param Criteria - * @return array Array of $nodeObjectClassname objects. - */ - public static function populateNodes(PDOStatement \$stmt, \$criteria) - { - \$nodes = array(); - \$targets = array(); - \$targetfld = count(\$criteria->getSelectColumns()); -"; - - if (!$table->getChildrenColumn()) { - $script .= " - // set the class once to avoid overhead in the loop - \$cls = $peerClassname::getOMClass(); - \$cls = substr('.'.\$cls, strrpos('.'.\$cls, '.') + 1); -"; - } - - $script .= " - // populate the object(s) - foreach(\$stmt->fetchAll() AS \$row) - { - if (!isset(\$nodes[\$row[0]])) - { -"; - if ($table->getChildrenColumn()) { - $script .= " - // class must be set each time from the record row - \$cls = $peerClassname::getOMClass(\$row, 1); - \$cls = substr('.'.\$cls, strrpos('.'.\$cls, '.') + 1); -"; - } - - $script .= " - " . $this->buildObjectInstanceCreationCode('$obj', '$cls') . " - \$obj->hydrate(\$row); - - \$nodes[\$row[0]] = new $nodeObjectClassname(\$obj); - } - - \$node = \$nodes[\$row[0]]; - - if (\$node->getNodePath() === \$row[\$targetfld]) - \$targets[\$node->getNodePath()] = \$node; - } - - $nodePeerClassname::buildTree(\$nodes); - - return array_values(\$targets); - } -"; - } - -} // PHP5NodePeerBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ObjectBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ObjectBuilder.php deleted file mode 100644 index e77e547b84..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ObjectBuilder.php +++ /dev/null @@ -1,4250 +0,0 @@ - - * @package propel.generator.builder.om - */ -class PHP5ObjectBuilder extends ObjectBuilder -{ - - /** - * Gets the package for the [base] object classes. - * @return string - */ - public function getPackage() - { - return parent::getPackage() . ".om"; - } - - public function getNamespace() - { - if ($namespace = parent::getNamespace()) { - if ($this->getGeneratorConfig() && $omns = $this->getGeneratorConfig()->getBuildProperty('namespaceOm')) { - return $namespace . '\\' . $omns; - } else { - return $namespace; - } - } - } - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return $this->getBuildProperty('basePrefix') . $this->getStubObjectBuilder()->getUnprefixedClassname(); - } - - /** - * Validates the current table to make sure that it won't - * result in generated code that will not parse. - * - * This method may emit warnings for code which may cause problems - * and will throw exceptions for errors that will definitely cause - * problems. - */ - protected function validateModel() - { - parent::validateModel(); - - $table = $this->getTable(); - - // Check to see whether any generated foreign key names - // will conflict with column names. - - $colPhpNames = array(); - $fkPhpNames = array(); - - foreach ($table->getColumns() as $col) { - $colPhpNames[] = $col->getPhpName(); - } - - foreach ($table->getForeignKeys() as $fk) { - $fkPhpNames[] = $this->getFKPhpNameAffix($fk, $plural = false); - } - - $intersect = array_intersect($colPhpNames, $fkPhpNames); - if (!empty($intersect)) { - throw new EngineException("One or more of your column names for [" . $table->getName() . "] table conflict with foreign key names (" . implode(", ", $intersect) . ")"); - } - - // Check foreign keys to see if there are any foreign keys that - // are also matched with an inversed referencing foreign key - // (this is currently unsupported behavior) - // see: http://propel.phpdb.org/trac/ticket/549 - - foreach ($table->getForeignKeys() as $fk) { - if ($fk->isMatchedByInverseFK()) { - throw new EngineException("The 1:1 relationship expressed by foreign key " . $fk->getName() . " is defined in both directions; Propel does not currently support this (if you must have both foreign key constraints, consider adding this constraint with a custom SQL file.)" ); - } - } - } - - /** - * Returns the appropriate formatter (from platform) for a date/time column. - * @param Column $col - * @return string - */ - protected function getTemporalFormatter(Column $col) - { - $fmt = null; - if ($col->getType() === PropelTypes::DATE) { - $fmt = $this->getPlatform()->getDateFormatter(); - } elseif ($col->getType() === PropelTypes::TIME) { - $fmt = $this->getPlatform()->getTimeFormatter(); - } elseif ($col->getType() === PropelTypes::TIMESTAMP) { - $fmt = $this->getPlatform()->getTimestampFormatter(); - } - return $fmt; - } - - /** - * Returns the type-casted and stringified default value for the specified Column. - * This only works for scalar default values currently. - * @return string The default value or 'NULL' if there is none. - */ - protected function getDefaultValueString(Column $col) - { - $defaultValue = var_export(null, true); - if (($val = $col->getPhpDefaultValue()) !== null) { - if ($col->isTemporalType()) { - $fmt = $this->getTemporalFormatter($col); - try { - if (!($this->getPlatform() instanceof MysqlPlatform && - ($val === '0000-00-00 00:00:00' || $val === '0000-00-00'))) { - // while technically this is not a default value of NULL, - // this seems to be closest in meaning. - $defDt = new DateTime($val); - $defaultValue = var_export($defDt->format($fmt), true); - } - } catch (Exception $x) { - // prevent endless loop when timezone is undefined - date_default_timezone_set('America/Los_Angeles'); - throw new EngineException("Unable to parse default temporal value for " . $col->getFullyQualifiedName() . ": " .$this->getDefaultValueString($col), $x); - } - } else { - if ($col->isPhpPrimitiveType()) { - settype($val, $col->getPhpType()); - $defaultValue = var_export($val, true); - } elseif ($col->isPhpObjectType()) { - $defaultValue = 'new '.$col->getPhpType().'(' . var_export($val, true) . ')'; - } else { - throw new EngineException("Cannot get default value string for " . $col->getFullyQualifiedName()); - } - } - } - return $defaultValue; - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - - $table = $this->getTable(); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - $interface = $this->getInterface(); - $parentClass = $this->getBehaviorContent('parentClass'); - $parentClass = (null !== $parentClass) ? $parentClass : ClassTools::classname($this->getBaseClass()); - $script .= " -/** - * Base class that represents a row from the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * @package propel.generator.".$this->getPackage()." - */ -abstract class ".$this->getClassname()." extends ".$parentClass." "; - - $interface = ClassTools::getInterface($table); - if ($interface) { - $script .= " implements " . ClassTools::classname($interface); - } - if ($this->getTable()->getInterface()) { - $this->declareClassFromBuilder($this->getInterfaceBuilder()); - } - - $script .= " -{ -"; - } - - /** - * Specifies the methods that are added as part of the basic OM class. - * This can be overridden by subclasses that wish to add more methods. - * @see ObjectBuilder::addClassBody() - */ - protected function addClassBody(&$script) - { - $this->declareClassFromBuilder($this->getStubPeerBuilder()); - $this->declareClassFromBuilder($this->getStubQueryBuilder()); - $this->declareClasses('Propel', 'PropelException', 'PDO', 'PropelPDO', 'Criteria', 'BaseObject', 'Persistent', 'BasePeer', 'PropelObjectcollection'); - - $table = $this->getTable(); - if (!$table->isAlias()) { - $this->addConstants($script); - $this->addAttributes($script); - } - - if ($this->hasDefaultValues()) { - $this->addApplyDefaultValues($script); - $this->addConstructor($script); - } - - $this->addColumnAccessorMethods($script); - $this->addColumnMutatorMethods($script); - - $this->addHasOnlyDefaultValues($script); - - $this->addHydrate($script); - $this->addEnsureConsistency($script); - - if (!$table->isReadOnly()) { - $this->addManipulationMethods($script); - } - - if ($this->isAddValidateMethod()) { - $this->addValidationMethods($script); - } - - if ($this->isAddGenericAccessors()) { - $this->addGetByName($script); - $this->addGetByPosition($script); - $this->addToArray($script); - } - - if ($this->isAddGenericMutators()) { - $this->addSetByName($script); - $this->addSetByPosition($script); - $this->addFromArray($script); - } - - $this->addBuildCriteria($script); - $this->addBuildPkeyCriteria($script); - $this->addGetPrimaryKey($script); - $this->addSetPrimaryKey($script); - $this->addIsPrimaryKeyNull($script); - - $this->addCopy($script); - - if (!$table->isAlias()) { - $this->addGetPeer($script); - } - - $this->addFKMethods($script); - $this->addRefFKMethods($script); - $this->addCrossFKMethods($script); - $this->addClear($script); - $this->addClearAllReferences($script); - - $this->addPrimaryString($script); - - // apply behaviors - $this->applyBehaviorModifier('objectMethods', $script, " "); - - $this->addMagicCall($script); - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - $this->applyBehaviorModifier('objectFilter', $script, ""); - } - - /** - * Adds any constants to the class. - * @param string &$script The script will be modified in this method. - */ - protected function addConstants(&$script) - { - $script .= " - /** - * Peer class name - */ - const PEER = '" . addslashes($this->getStubPeerBuilder()->getFullyQualifiedClassname()) . "'; -"; - } - - /** - * Adds class attributes. - * @param string &$script The script will be modified in this method. - */ - protected function addAttributes(&$script) - { - $table = $this->getTable(); - - $script .= " - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var ".$this->getPeerClassname()." - */ - protected static \$peer; -"; - if (!$table->isAlias()) { - $this->addColumnAttributes($script); - } - - foreach ($table->getForeignKeys() as $fk) { - $this->addFKAttributes($script, $fk); - } - - foreach ($table->getReferrers() as $refFK) { - $this->addRefFKAttributes($script, $refFK); - } - - // many-to-many relationships - foreach ($table->getCrossFks() as $fkList) { - $crossFK = $fkList[1]; - $this->addCrossFKAttributes($script, $crossFK); - } - - - $this->addAlreadyInSaveAttribute($script); - $this->addAlreadyInValidationAttribute($script); - - // apply behaviors - $this->applyBehaviorModifier('objectAttributes', $script, " "); - } - - /** - * Adds variables that store column values. - * @param string &$script The script will be modified in this method. - * @see addColumnNameConstants() - */ - protected function addColumnAttributes(&$script) - { - - $table = $this->getTable(); - - foreach ($table->getColumns() as $col) { - $this->addColumnAttributeComment($script, $col); - $this->addColumnAttributeDeclaration($script, $col); - if ($col->isLazyLoad() ) { - $this->addColumnAttributeLoaderComment($script, $col); - $this->addColumnAttributeLoaderDeclaration($script, $col); - } - } - } - - /** - * Add comment about the attribute (variable) that stores column values - * @param string &$script The script will be modified in this method. - * @param Column $col - **/ - protected function addColumnAttributeComment(&$script, Column $col) - { - $cptype = $col->getPhpType(); - $clo = strtolower($col->getName()); - - $script .= " - /** - * The value for the $clo field."; - if ($col->getDefaultValue()) { - if ($col->getDefaultValue()->isExpression()) { - $script .= " - * Note: this column has a database default value of: (expression) ".$col->getDefaultValue()->getValue(); - } else { - $script .= " - * Note: this column has a database default value of: ". $this->getDefaultValueString($col); - } - } - $script .= " - * @var $cptype - */"; - } - - /** - * Adds the declaration of a column value storage attribute - * @param string &$script The script will be modified in this method. - * @param Column $col - **/ - protected function addColumnAttributeDeclaration(&$script, Column $col) - { - $clo = strtolower($col->getName()); - $script .= " - protected \$" . $clo . "; -"; - } - - /** - * Adds the comment about the attribute keeping track if an attribute value has been loaded - * @param string &$script The script will be modified in this method. - * @param Column $col - **/ - protected function addColumnAttributeLoaderComment(&$script, Column $col) - { - $clo = strtolower($col->getName()); - $script .= " - /** - * Whether the lazy-loaded \$$clo value has been loaded from database. - * This is necessary to avoid repeated lookups if \$$clo column is NULL in the db. - * @var boolean - */"; - } - - /** - * Adds the declaration of the attribute keeping track of an attribute's loaded state - * @param string &$script The script will be modified in this method. - * @param Column $col - **/ - protected function addColumnAttributeLoaderDeclaration(&$script, Column $col) - { - $clo = strtolower($col->getName()); - $script .= " - protected \$".$clo."_isLoaded = false; -"; - } - - /** - * Adds the getPeer() method. - * This is a convenient, non introspective way of getting the Peer class for a particular object. - * @param string &$script The script will be modified in this method. - */ - protected function addGetPeer(&$script) - { - $this->addGetPeerComment($script); - $this->addGetPeerFunctionOpen($script); - $this->addGetPeerFunctionBody($script); - $this->addGetPeerFunctionClose($script); - } - - /** - * Add the comment for the getPeer method - * @param string &$script The script will be modified in this method. - **/ - protected function addGetPeerComment(&$script) { - $script .= " - /** - * Returns a peer instance associated with this om. - * - * Since Peer classes are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return ".$this->getPeerClassname()." - */"; - } - - /** - * Adds the function declaration (function opening) for the getPeer method - * @param string &$script The script will be modified in this method. - **/ - protected function addGetPeerFunctionOpen(&$script) { - $script .= " - public function getPeer() - {"; - } - - /** - * Adds the body of the getPeer method - * @param string &$script The script will be modified in this method. - **/ - protected function addGetPeerFunctionBody(&$script) { - $script .= " - if (self::\$peer === null) { - " . $this->buildObjectInstanceCreationCode('self::$peer', $this->getPeerClassname()) . " - } - return self::\$peer;"; - } - - /** - * Add the function close for the getPeer method - * Note: this is just a } and the body ends with a return statement, so it's quite useless. But it's here anyway for consisency, cause there's a close function for all functions and in some other instances, they are useful - * @param string &$script The script will be modified in this method. - **/ - protected function addGetPeerFunctionClose(&$script) { - $script .= " - } -"; - } - - /** - * Adds the constructor for this object. - * @param string &$script The script will be modified in this method. - * @see addConstructor() - */ - protected function addConstructor(&$script) - { - $this->addConstructorComment($script); - $this->addConstructorOpen($script); - $this->addConstructorBody($script); - $this->addConstructorClose($script); - } - - /** - * Adds the comment for the constructor - * @param string &$script The script will be modified in this method. - **/ - protected function addConstructorComment(&$script) { - $script .= " - /** - * Initializes internal state of ".$this->getClassname()." object. - * @see applyDefaults() - */"; - } - - /** - * Adds the function declaration for the constructor - * @param string &$script The script will be modified in this method. - **/ - protected function addConstructorOpen(&$script) { - $script .= " - public function __construct() - {"; - } - - /** - * Adds the function body for the constructor - * @param string &$script The script will be modified in this method. - **/ - protected function addConstructorBody(&$script) { - $script .= " - parent::__construct(); - \$this->applyDefaultValues();"; - } - - /** - * Adds the function close for the constructor - * @param string &$script The script will be modified in this method. - **/ - protected function addConstructorClose(&$script) { - $script .= " - } -"; - } - - /** - * Adds the applyDefaults() method, which is called from the constructor. - * @param string &$script The script will be modified in this method. - * @see addConstructor() - */ - protected function addApplyDefaultValues(&$script) - { - $this->addApplyDefaultValuesComment($script); - $this->addApplyDefaultValuesOpen($script); - $this->addApplyDefaultValuesBody($script); - $this->addApplyDefaultValuesClose($script); - } - - /** - * Adds the comment for the applyDefaults method - * @param string &$script The script will be modified in this method. - * @see addApplyDefaultValues() - **/ - protected function addApplyDefaultValuesComment(&$script) { - $script .= " - /** - * Applies default values to this object. - * This method should be called from the object's constructor (or - * equivalent initialization method). - * @see __construct() - */"; - } - - /** - * Adds the function declaration for the applyDefaults method - * @param string &$script The script will be modified in this method. - * @see addApplyDefaultValues() - **/ - protected function addApplyDefaultValuesOpen(&$script) { - $script .= " - public function applyDefaultValues() - {"; - } - - /** - * Adds the function body of the applyDefault method - * @param string &$script The script will be modified in this method. - * @see addApplyDefaultValues() - **/ - protected function addApplyDefaultValuesBody(&$script) { - $table = $this->getTable(); - // FIXME - Apply support for PHP default expressions here - // see: http://propel.phpdb.org/trac/ticket/378 - - $colsWithDefaults = array(); - foreach ($table->getColumns() as $col) { - $def = $col->getDefaultValue(); - if ($def !== null && !$def->isExpression()) { - $colsWithDefaults[] = $col; - } - } - - $colconsts = array(); - foreach ($colsWithDefaults as $col) { - $clo = strtolower($col->getName()); - $script .= " - \$this->".$clo." = ".$this->getDefaultValueString($col).";"; - - } - } - - - /** - * Adds the function close for the applyDefaults method - * @param string &$script The script will be modified in this method. - * @see addApplyDefaultValues() - **/ - protected function addApplyDefaultValuesClose(&$script) { - $script .= " - } -"; - } - - // -------------------------------------------------------------- - // - // A C C E S S O R M E T H O D S - // - // -------------------------------------------------------------- - - /** - * Adds a date/time/timestamp getter method. - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see parent::addColumnAccessors() - */ - protected function addTemporalAccessor(&$script, Column $col) - { - $this->addTemporalAccessorComment($script, $col); - $this->addTemporalAccessorOpen($script, $col); - $this->addTemporalAccessorBody($script, $col); - $this->addTemporalAccessorClose($script, $col); - } // addTemporalAccessor - - - /** - * Adds the comment for a temporal accessor - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addTemporalAccessor - **/ - protected function addTemporalAccessorComment(&$script, Column $col) { - $clo = strtolower($col->getName()); - $useDateTime = $this->getBuildProperty('useDateTimeClass'); - - $dateTimeClass = $this->getBuildProperty('dateTimeClass'); - if (!$dateTimeClass) { - $dateTimeClass = 'DateTime'; - } - - $handleMysqlDate = false; - if ($this->getPlatform() instanceof MysqlPlatform) { - if ($col->getType() === PropelTypes::TIMESTAMP) { - $handleMysqlDate = true; - $mysqlInvalidDateString = '0000-00-00 00:00:00'; - } elseif ($col->getType() === PropelTypes::DATE) { - $handleMysqlDate = true; - $mysqlInvalidDateString = '0000-00-00'; - } - // 00:00:00 is a valid time, so no need to check for that. - } - - $script .= " - /** - * Get the [optionally formatted] temporal [$clo] column value. - * ".$col->getDescription(); - if (!$useDateTime) { - $script .= " - * This accessor only only work with unix epoch dates. Consider enabling the propel.useDateTimeClass - * option in order to avoid converstions to integers (which are limited in the dates they can express)."; - } - $script .= " - * - * @param string \$format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw ".($useDateTime ? 'DateTime object' : 'unix timestamp integer')." will be returned."; - if ($useDateTime) { - $script .= " - * @return mixed Formatted date/time value as string or $dateTimeClass object (if format is NULL), NULL if column is NULL" .($handleMysqlDate ? ', and 0 if column value is ' . $mysqlInvalidDateString : ''); - } else { - $script .= " - * @return mixed Formatted date/time value as string or (integer) unix timestamp (if format is NULL), NULL if column is NULL".($handleMysqlDate ? ', and 0 if column value is ' . $mysqlInvalidDateString : ''); - } - $script .= " - * @throws PropelException - if unable to parse/validate the date/time value. - */"; - } - - - /** - * Adds the function declaration for a temporal accessor - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addTemporalAccessor - **/ - protected function addTemporalAccessorOpen(&$script, Column $col) { - $cfc = $col->getPhpName(); - - $defaultfmt = null; - $visibility = $col->getAccessorVisibility(); - - // Default date/time formatter strings are specified in build.properties - if ($col->getType() === PropelTypes::DATE) { - $defaultfmt = $this->getBuildProperty('defaultDateFormat'); - } elseif ($col->getType() === PropelTypes::TIME) { - $defaultfmt = $this->getBuildProperty('defaultTimeFormat'); - } elseif ($col->getType() === PropelTypes::TIMESTAMP) { - $defaultfmt = $this->getBuildProperty('defaultTimeStampFormat'); - } - if (empty($defaultfmt)) { $defaultfmt = null; } - - $script .= " - ".$visibility." function get$cfc(\$format = ".var_export($defaultfmt, true).""; - if ($col->isLazyLoad()) $script .= ", \$con = null"; - $script .= ") - {"; - } - - /** - * Adds the body of the temporal accessor - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addTemporalAccessor - **/ - protected function addTemporalAccessorBody(&$script, Column $col) { - $cfc = $col->getPhpName(); - $clo = strtolower($col->getName()); - - $useDateTime = $this->getBuildProperty('useDateTimeClass'); - - $dateTimeClass = $this->getBuildProperty('dateTimeClass'); - if (!$dateTimeClass) { - $dateTimeClass = 'DateTime'; - } - - $defaultfmt = null; - - // Default date/time formatter strings are specified in build.properties - if ($col->getType() === PropelTypes::DATE) { - $defaultfmt = $this->getBuildProperty('defaultDateFormat'); - } elseif ($col->getType() === PropelTypes::TIME) { - $defaultfmt = $this->getBuildProperty('defaultTimeFormat'); - } elseif ($col->getType() === PropelTypes::TIMESTAMP) { - $defaultfmt = $this->getBuildProperty('defaultTimeStampFormat'); - } - if (empty($defaultfmt)) { $defaultfmt = null; } - - $handleMysqlDate = false; - if ($this->getPlatform() instanceof MysqlPlatform) { - if ($col->getType() === PropelTypes::TIMESTAMP) { - $handleMysqlDate = true; - $mysqlInvalidDateString = '0000-00-00 00:00:00'; - } elseif ($col->getType() === PropelTypes::DATE) { - $handleMysqlDate = true; - $mysqlInvalidDateString = '0000-00-00'; - } - // 00:00:00 is a valid time, so no need to check for that. - } - - if ($col->isLazyLoad()) { - $script .= " - if (!\$this->".$clo."_isLoaded && \$this->$clo === null && !\$this->isNew()) { - \$this->load$cfc(\$con); - } -"; - } - $script .= " - if (\$this->$clo === null) { - return null; - } - -"; - if ($handleMysqlDate) { - $script .= " - if (\$this->$clo === '$mysqlInvalidDateString') { - // while technically this is not a default value of NULL, - // this seems to be closest in meaning. - return null; - } else { - try { - \$dt = new $dateTimeClass(\$this->$clo); - } catch (Exception \$x) { - throw new PropelException(\"Internally stored date/time/timestamp value could not be converted to $dateTimeClass: \" . var_export(\$this->$clo, true), \$x); - } - } -"; - } else { - $script .= " - - try { - \$dt = new $dateTimeClass(\$this->$clo); - } catch (Exception \$x) { - throw new PropelException(\"Internally stored date/time/timestamp value could not be converted to $dateTimeClass: \" . var_export(\$this->$clo, true), \$x); - } -"; - } // if handleMyqlDate - - $script .= " - if (\$format === null) {"; - if ($useDateTime) { - $script .= " - // Because propel.useDateTimeClass is TRUE, we return a $dateTimeClass object. - return \$dt;"; - } else { - $script .= " - // We cast here to maintain BC in API; obviously we will lose data if we're dealing with pre-/post-epoch dates. - return (int) \$dt->format('U');"; - } - $script .= " - } elseif (strpos(\$format, '%') !== false) { - return strftime(\$format, \$dt->format('U')); - } else { - return \$dt->format(\$format); - }"; - } - - - /** - * Adds the body of the temporal accessor - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addTemporalAccessorClose - **/ - protected function addTemporalAccessorClose(&$script, Column $col) { - $script .= " - } -"; - } - - /** - * Adds a normal (non-temporal) getter method. - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see parent::addColumnAccessors() - */ - protected function addDefaultAccessor(&$script, Column $col) - { - $this->addDefaultAccessorComment($script, $col); - $this->addDefaultAccessorOpen($script, $col); - $this->addDefaultAccessorBody($script, $col); - $this->addDefaultAccessorClose($script, $col); - } - - /** - * Add the comment for a default accessor method (a getter) - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addDefaultAccessor() - **/ - protected function addDefaultAccessorComment(&$script, Column $col) { - $clo=strtolower($col->getName()); - - $script .= " - /** - * Get the [$clo] column value. - * ".$col->getDescription(); - if ($col->isLazyLoad()) { - $script .= " - * @param PropelPDO An optional PropelPDO connection to use for fetching this lazy-loaded column."; - } - $script .= " - * @return ".$col->getPhpType()." - */"; - } - - /** - * Adds the function declaration for a default accessor - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addDefaultAccessor() - **/ - protected function addDefaultAccessorOpen(&$script, Column $col) { - $cfc = $col->getPhpName(); - $visibility = $col->getAccessorVisibility(); - - $script .= " - ".$visibility." function get$cfc("; - if ($col->isLazyLoad()) $script .= "PropelPDO \$con = null"; - $script .= ") - {"; - } - - /** - * Adds the function body for a default accessor method - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addDefaultAccessor() - **/ - protected function addDefaultAccessorBody(&$script, Column $col) { - $cfc = $col->getPhpName(); - $clo = strtolower($col->getName()); - if ($col->isLazyLoad()) { - $script .= " - if (!\$this->".$clo."_isLoaded && \$this->$clo === null && !\$this->isNew()) { - \$this->load$cfc(\$con); - } -"; - } - - $script .= " - return \$this->$clo;"; - } - - /** - * Adds the function close for a default accessor method - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addDefaultAccessor() - **/ - protected function addDefaultAccessorClose(&$script, Column $col) { - $script .= " - } -"; - } - - /** - * Adds the lazy loader method. - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see parent::addColumnAccessors() - */ - protected function addLazyLoader(&$script, Column $col) - { - $this->addLazyLoaderComment($script, $col); - $this->addLazyLoaderOpen($script, $col); - $this->addLazyLoaderBody($script, $col); - $this->addLazyLoaderClose($script, $col); - } - - /** - * Adds the comment for the lazy loader method - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addLazyLoader() - **/ - protected function addLazyLoaderComment(&$script, Column $col) { - $clo = strtolower($col->getName()); - - $script .= " - /** - * Load the value for the lazy-loaded [$clo] column. - * - * This method performs an additional query to return the value for - * the [$clo] column, since it is not populated by - * the hydrate() method. - * - * @param \$con PropelPDO (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - any underlying error will be wrapped and re-thrown. - */"; - } - - /** - * Adds the function declaration for the lazy loader method - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addLazyLoader() - **/ - protected function addLazyLoaderOpen(&$script, Column $col) { - $cfc = $col->getPhpName(); - $script .= " - protected function load$cfc(PropelPDO \$con = null) - {"; - } - - /** - * Adds the function body for the lazy loader method - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addLazyLoader() - **/ - protected function addLazyLoaderBody(&$script, Column $col) { - $platform = $this->getPlatform(); - $clo = strtolower($col->getName()); - - $script .= " - \$c = \$this->buildPkeyCriteria(); - \$c->addSelectColumn(".$this->getColumnConstant($col)."); - try { - \$stmt = ".$this->getPeerClassname()."::doSelectStmt(\$c, \$con); - \$row = \$stmt->fetch(PDO::FETCH_NUM); - \$stmt->closeCursor();"; - - if ($col->getType() === PropelTypes::CLOB && $this->getPlatform() instanceof OraclePlatform) { - // PDO_OCI returns a stream for CLOB objects, while other PDO adapters return a string... - $script .= " - \$this->$clo = stream_get_contents(\$row[0]);"; - } elseif ($col->isLobType() && !$platform->hasStreamBlobImpl()) { - $script .= " - if (\$row[0] !== null) { - \$this->$clo = fopen('php://memory', 'r+'); - fwrite(\$this->$clo, \$row[0]); - rewind(\$this->$clo); - } else { - \$this->$clo = null; - }"; - } elseif ($col->isPhpPrimitiveType()) { - $script .= " - \$this->$clo = (\$row[0] !== null) ? (".$col->getPhpType().") \$row[0] : null;"; - } elseif ($col->isPhpObjectType()) { - $script .= " - \$this->$clo = (\$row[0] !== null) ? new ".$col->getPhpType()."(\$row[0]) : null;"; - } else { - $script .= " - \$this->$clo = \$row[0];"; - } - - $script .= " - \$this->".$clo."_isLoaded = true; - } catch (Exception \$e) { - throw new PropelException(\"Error loading value for [$clo] column on demand.\", \$e); - }"; - } - - /** - * Adds the function close for the lazy loader - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addLazyLoader() - **/ - protected function addLazyLoaderClose(&$script, Column $col) { - $script .= " - }"; - } // addLazyLoader() - - // -------------------------------------------------------------- - // - // M U T A T O R M E T H O D S - // - // -------------------------------------------------------------- - - /** - * Adds the open of the mutator (setter) method for a column. - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - */ - protected function addMutatorOpen(&$script, Column $col) - { - $this->addMutatorComment($script, $col); - $this->addMutatorOpenOpen($script, $col); - $this->addMutatorOpenBody($script, $col); - } - - /** - * Adds the comment for a mutator - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addMutatorOpen() - **/ - protected function addMutatorComment(&$script, Column $col) { - $clo = strtolower($col->getName()); - $script .= " - /** - * Set the value of [$clo] column. - * ".$col->getDescription()." - * @param ".$col->getPhpType()." \$v new value - * @return ".$this->getObjectClassname()." The current object (for fluent API support) - */"; - } - - /** - * Adds the mutator function declaration - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addMutatorOpen() - **/ - protected function addMutatorOpenOpen(&$script, Column $col) { - $cfc = $col->getPhpName(); - $visibility = $col->getMutatorVisibility(); - - $script .= " - ".$visibility." function set$cfc(\$v) - {"; - } - - /** - * Adds the mutator open body part - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addMutatorOpen() - **/ - protected function addMutatorOpenBody(&$script, Column $col) { - $clo = strtolower($col->getName()); - $cfc = $col->getPhpName(); - if ($col->isLazyLoad()) { - $script .= " - // explicitly set the is-loaded flag to true for this lazy load col; - // it doesn't matter if the value is actually set or not (logic below) as - // any attempt to set the value means that no db lookup should be performed - // when the get$cfc() method is called. - \$this->".$clo."_isLoaded = true; -"; - } - } - - /** - * Adds the close of the mutator (setter) method for a column. - * - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - */ - protected function addMutatorClose(&$script, Column $col) - { - $this->addMutatorCloseBody($script, $col); - $this->addMutatorCloseClose($script, $col); - } - - /** - * Adds the body of the close part of a mutator - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addMutatorClose() - **/ - protected function addMutatorCloseBody(&$script, Column $col) { - $table = $this->getTable(); - $cfc = $col->getPhpName(); - $clo = strtolower($col->getName()); - - if ($col->isForeignKey()) { - - foreach ($col->getForeignKeys() as $fk) { - - $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); - $colFK = $tblFK->getColumn($fk->getMappedForeignColumn($col->getName())); - - $varName = $this->getFKVarName($fk); - - $script .= " - if (\$this->$varName !== null && \$this->".$varName."->get".$colFK->getPhpName()."() !== \$v) { - \$this->$varName = null; - } -"; - } // foreach fk - } /* if col is foreign key */ - - foreach ($col->getReferrers() as $refFK) { - - $tblFK = $this->getDatabase()->getTable($refFK->getForeignTableName()); - - if ( $tblFK->getName() != $table->getName() ) { - - foreach ($col->getForeignKeys() as $fk) { - - $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); - $colFK = $tblFK->getColumn($fk->getMappedForeignColumn($col->getName())); - - if ($refFK->isLocalPrimaryKey()) { - $varName = $this->getPKRefFKVarName($refFK); - $script .= " - // update associated ".$tblFK->getPhpName()." - if (\$this->$varName !== null) { - \$this->{$varName}->set".$colFK->getPhpName()."(\$v); - } -"; - } else { - $collName = $this->getRefFKCollVarName($refFK); - $script .= " - - // update associated ".$tblFK->getPhpName()." - if (\$this->$collName !== null) { - foreach (\$this->$collName as \$referrerObject) { - \$referrerObject->set".$colFK->getPhpName()."(\$v); - } - } -"; - } // if (isLocalPrimaryKey - } // foreach col->getPrimaryKeys() - } // if tablFk != table - - } // foreach - } - - /** - * Adds the close for the mutator close - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addMutatorClose() - **/ - protected function addMutatorCloseClose(&$script, Column $col) { - $cfc = $col->getPhpName(); - $script .= " - return \$this; - } // set$cfc() -"; - } - - /** - * Adds a setter for BLOB columns. - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see parent::addColumnMutators() - */ - protected function addLobMutator(&$script, Column $col) - { - $this->addMutatorOpen($script, $col); - $clo = strtolower($col->getName()); - $script .= " - // Because BLOB columns are streams in PDO we have to assume that they are - // always modified when a new value is passed in. For example, the contents - // of the stream itself may have changed externally. - if (!is_resource(\$v) && \$v !== null) { - \$this->$clo = fopen('php://memory', 'r+'); - fwrite(\$this->$clo, \$v); - rewind(\$this->$clo); - } else { // it's already a stream - \$this->$clo = \$v; - } - \$this->modifiedColumns[] = ".$this->getColumnConstant($col)."; -"; - $this->addMutatorClose($script, $col); - } // addLobMutatorSnippet - - /** - * Adds a setter method for date/time/timestamp columns. - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see parent::addColumnMutators() - */ - protected function addTemporalMutator(&$script, Column $col) - { - $cfc = $col->getPhpName(); - $clo = strtolower($col->getName()); - $visibility = $col->getMutatorVisibility(); - - $dateTimeClass = $this->getBuildProperty('dateTimeClass'); - if (!$dateTimeClass) { - $dateTimeClass = 'DateTime'; - } - - $script .= " - /** - * Sets the value of [$clo] column to a normalized version of the date/time value specified. - * ".$col->getDescription()." - * @param mixed \$v string, integer (timestamp), or DateTime value. Empty string will - * be treated as NULL for temporal objects. - * @return ".$this->getObjectClassname()." The current object (for fluent API support) - */ - ".$visibility." function set$cfc(\$v) - {"; - if ($col->isLazyLoad()) { - $script .= " - // explicitly set the is-loaded flag to true for this lazy load col; - // it doesn't matter if the value is actually set or not (logic below) as - // any attempt to set the value means that no db lookup should be performed - // when the get$cfc() method is called. - \$this->".$clo."_isLoaded = true; -"; - } - - $fmt = var_export($this->getTemporalFormatter($col), true); - - $script .= " - // we treat '' as NULL for temporal objects because DateTime('') == DateTime('now') - // -- which is unexpected, to say the least. - if (\$v === null || \$v === '') { - \$dt = null; - } elseif (\$v instanceof DateTime) { - \$dt = \$v; - } else { - // some string/numeric value passed; we normalize that so that we can - // validate it. - try { - if (is_numeric(\$v)) { // if it's a unix timestamp - \$dt = new $dateTimeClass('@'.\$v, new DateTimeZone('UTC')); - // We have to explicitly specify and then change the time zone because of a - // DateTime bug: http://bugs.php.net/bug.php?id=43003 - \$dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); - } else { - \$dt = new $dateTimeClass(\$v); - } - } catch (Exception \$x) { - throw new PropelException('Error parsing date/time value: ' . var_export(\$v, true), \$x); - } - } - - if ( \$this->$clo !== null || \$dt !== null ) { - // (nested ifs are a little easier to read in this case) - - \$currNorm = (\$this->$clo !== null && \$tmpDt = new $dateTimeClass(\$this->$clo)) ? \$tmpDt->format($fmt) : null; - \$newNorm = (\$dt !== null) ? \$dt->format($fmt) : null; - - if ( (\$currNorm !== \$newNorm) // normalized values don't match "; - - if (($def = $col->getDefaultValue()) !== null && !$def->isExpression()) { - $defaultValue = $this->getDefaultValueString($col); - $script .= " - || (\$dt->format($fmt) === $defaultValue) // or the entered value matches the default"; - } - - $script .= " - ) - { - \$this->$clo = (\$dt ? \$dt->format($fmt) : null); - \$this->modifiedColumns[] = ".$this->getColumnConstant($col)."; - } - } // if either are not null -"; - $this->addMutatorClose($script, $col); - } - - /** - * Adds setter method for "normal" columns. - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see parent::addColumnMutators() - */ - protected function addDefaultMutator(&$script, Column $col) - { - $clo = strtolower($col->getName()); - - $this->addMutatorOpen($script, $col); - - // Perform type-casting to ensure that we can use type-sensitive - // checking in mutators. - if ($col->isPhpPrimitiveType()) { - $script .= " - if (\$v !== null) { - \$v = (".$col->getPhpType().") \$v; - } -"; - } - - $script .= " - if (\$this->$clo !== \$v"; - if (($def = $col->getDefaultValue()) !== null && !$def->isExpression()) { - $script .= " || \$this->isNew()"; - } - $script .= ") { - \$this->$clo = \$v; - \$this->modifiedColumns[] = ".$this->getColumnConstant($col)."; - } -"; - $this->addMutatorClose($script, $col); - } - - /** - * Adds the hasOnlyDefaultValues() method. - * @param string &$script The script will be modified in this method. - */ - protected function addHasOnlyDefaultValues(&$script) - { - $this->addHasOnlyDefaultValuesComment($script); - $this->addHasOnlyDefaultValuesOpen($script); - $this->addHasOnlyDefaultValuesBody($script); - $this->addHasOnlyDefaultValuesClose($script); - } - - /** - * Adds the comment for the hasOnlyDefaultValues method - * @param string &$script The script will be modified in this method. - * @see addHasOnlyDefaultValues - **/ - protected function addHasOnlyDefaultValuesComment(&$script) { - $script .= " - /** - * Indicates whether the columns in this object are only set to default values. - * - * This method can be used in conjunction with isModified() to indicate whether an object is both - * modified _and_ has some values set which are non-default. - * - * @return boolean Whether the columns in this object are only been set with default values. - */"; - } - - /** - * Adds the function declaration for the hasOnlyDefaultValues method - * @param string &$script The script will be modified in this method. - * @see addHasOnlyDefaultValues - **/ - protected function addHasOnlyDefaultValuesOpen(&$script) { - $script .= " - public function hasOnlyDefaultValues() - {"; - } - - /** - * Adds the function body for the hasOnlyDefaultValues method - * @param string &$script The script will be modified in this method. - * @see addHasOnlyDefaultValues - **/ - protected function addHasOnlyDefaultValuesBody(&$script) { - $table = $this->getTable(); - $colsWithDefaults = array(); - foreach ($table->getColumns() as $col) { - $def = $col->getDefaultValue(); - if ($def !== null && !$def->isExpression()) { - $colsWithDefaults[] = $col; - } - } - - foreach ($colsWithDefaults as $col) { - - $clo = strtolower($col->getName()); - $def = $col->getDefaultValue(); - - $script .= " - if (\$this->$clo !== " . $this->getDefaultValueString($col).") { - return false; - } -"; - } - } - - /** - * Adds the function close for the hasOnlyDefaultValues method - * @param string &$script The script will be modified in this method. - * @see addHasOnlyDefaultValues - **/ - protected function addHasOnlyDefaultValuesClose(&$script) { - $script .= " - // otherwise, everything was equal, so return TRUE - return true;"; - $script .= " - } // hasOnlyDefaultValues() -"; - } - - /** - * Adds the hydrate() method, which sets attributes of the object based on a ResultSet. - * @param string &$script The script will be modified in this method. - */ - protected function addHydrate(&$script) - { - $this->addHydrateComment($script); - $this->addHydrateOpen($script); - $this->addHydrateBody($script); - $this->addHydrateClose($script); - } - - /** - * Adds the comment for the hydrate method - * @param string &$script The script will be modified in this method. - * @see addHydrate() - */ - protected function addHydrateComment(&$script) { - $script .= " - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (0-based \"start column\") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param array \$row The row returned by PDOStatement->fetch(PDO::FETCH_NUM) - * @param int \$startcol 0-based offset column which indicates which restultset column to start with. - * @param boolean \$rehydrate Whether this object is being re-hydrated from the database. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */"; - } - - /** - * Adds the function declaration for the hydrate method - * @param string &$script The script will be modified in this method. - * @see addHydrate() - */ - protected function addHydrateOpen(&$script) { - $script .= " - public function hydrate(\$row, \$startcol = 0, \$rehydrate = false) - {"; - } - - /** - * Adds the function body for the hydrate method - * @param string &$script The script will be modified in this method. - * @see addHydrate() - */ - protected function addHydrateBody(&$script) { - $table = $this->getTable(); - $platform = $this->getPlatform(); - $script .= " - try { -"; - $n = 0; - foreach ($table->getColumns() as $col) { - if (!$col->isLazyLoad()) { - $clo = strtolower($col->getName()); - if ($col->getType() === PropelTypes::CLOB_EMU && $this->getPlatform() instanceof OraclePlatform) { - // PDO_OCI returns a stream for CLOB objects, while other PDO adapters return a string... - $script .= " - \$this->$clo = stream_get_contents(\$row[\$startcol + $n]);"; - } elseif ($col->isLobType() && !$platform->hasStreamBlobImpl()) { - $script .= " - if (\$row[\$startcol + $n] !== null) { - \$this->$clo = fopen('php://memory', 'r+'); - fwrite(\$this->$clo, \$row[\$startcol + $n]); - rewind(\$this->$clo); - } else { - \$this->$clo = null; - }"; - } elseif ($col->isPhpPrimitiveType()) { - $script .= " - \$this->$clo = (\$row[\$startcol + $n] !== null) ? (".$col->getPhpType().") \$row[\$startcol + $n] : null;"; - } elseif ($col->isPhpObjectType()) { - $script .= " - \$this->$clo = (\$row[\$startcol + $n] !== null) ? new ".$col->getPhpType()."(\$row[\$startcol + $n]) : null;"; - } else { - $script .= " - \$this->$clo = \$row[\$startcol + $n];"; - } - $n++; - } // if col->isLazyLoad() - } /* foreach */ - - if ($this->getBuildProperty("addSaveMethod")) { - $script .= " - \$this->resetModified(); -"; - } - - $script .= " - \$this->setNew(false); - - if (\$rehydrate) { - \$this->ensureConsistency(); - } - - return \$startcol + $n; // $n = ".$this->getPeerClassname()."::NUM_COLUMNS - ".$this->getPeerClassname()."::NUM_LAZY_LOAD_COLUMNS). - - } catch (Exception \$e) { - throw new PropelException(\"Error populating ".$this->getStubObjectBuilder()->getClassname()." object\", \$e); - }"; - } - - /** - * Adds the function close for the hydrate method - * @param string &$script The script will be modified in this method. - * @see addHydrate() - */ - protected function addHydrateClose(&$script) { - $script .= " - } -"; - } - - /** - * Adds the buildPkeyCriteria method - * @param string &$script The script will be modified in this method. - **/ - protected function addBuildPkeyCriteria(&$script) { - $this->addBuildPkeyCriteriaComment($script); - $this->addBuildPkeyCriteriaOpen($script); - $this->addBuildPkeyCriteriaBody($script); - $this->addBuildPkeyCriteriaClose($script); - } - - /** - * Adds the comment for the buildPkeyCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildPkeyCriteria() - **/ - protected function addBuildPkeyCriteriaComment(&$script) { - $script .= " - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */"; - } - - /** - * Adds the function declaration for the buildPkeyCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildPkeyCriteria() - **/ - protected function addBuildPkeyCriteriaOpen(&$script) { - $script .= " - public function buildPkeyCriteria() - {"; - } - - /** - * Adds the function body for the buildPkeyCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildPkeyCriteria() - **/ - protected function addBuildPkeyCriteriaBody(&$script) { - $script .= " - \$criteria = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME);"; - foreach ($this->getTable()->getPrimaryKey() as $col) { - $clo = strtolower($col->getName()); - $script .= " - \$criteria->add(".$this->getColumnConstant($col).", \$this->$clo);"; - } - } - - /** - * Adds the function close for the buildPkeyCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildPkeyCriteria() - **/ - protected function addBuildPkeyCriteriaClose(&$script) { - $script .= " - - return \$criteria; - } -"; - } - - /** - * Adds the buildCriteria method - * @param string &$script The script will be modified in this method. - **/ - protected function addBuildCriteria(&$script) - { - $this->addBuildCriteriaComment($script); - $this->addBuildCriteriaOpen($script); - $this->addBuildCriteriaBody($script); - $this->addBuildCriteriaClose($script); - } - - /** - * Adds comment for the buildCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildCriteria() - **/ - protected function addBuildCriteriaComment(&$script) { - $script .= " - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */"; - } - - /** - * Adds the function declaration of the buildCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildCriteria() - **/ - protected function addBuildCriteriaOpen(&$script) { - $script .= " - public function buildCriteria() - {"; - } - - /** - * Adds the function body of the buildCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildCriteria() - **/ - protected function addBuildCriteriaBody(&$script) { - $script .= " - \$criteria = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME); -"; - foreach ($this->getTable()->getColumns() as $col) { - $clo = strtolower($col->getName()); - $script .= " - if (\$this->isColumnModified(".$this->getColumnConstant($col).")) \$criteria->add(".$this->getColumnConstant($col).", \$this->$clo);"; - } - } - - /** - * Adds the function close of the buildCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildCriteria() - **/ - protected function addBuildCriteriaClose(&$script) { - $script .= " - - return \$criteria; - } -"; - } - - /** - * Adds the toArray method - * @param string &$script The script will be modified in this method. - **/ - protected function addToArray(&$script) - { - $fks = $this->getTable()->getForeignKeys(); - $hasFks = count($fks) > 0; - $script .= " - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string \$keyType (optional) One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * Defaults to BasePeer::TYPE_PHPNAME. - * @param boolean \$includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE."; - if ($hasFks) { - $script .= " - * @param boolean \$includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE."; - } - $script .= " - * - * @return array an associative array containing the field names (as keys) and field values - */ - public function toArray(\$keyType = BasePeer::TYPE_PHPNAME, \$includeLazyLoadColumns = true" . ($hasFks ? ", \$includeForeignObjects = false" : '') . ") - { - \$keys = ".$this->getPeerClassname()."::getFieldNames(\$keyType); - \$result = array("; - foreach ($this->getTable()->getColumns() as $num => $col) { - if ($col->isLazyLoad()) { - $script .= " - \$keys[$num] => (\$includeLazyLoadColumns) ? \$this->get".$col->getPhpName()."() : null,"; - } else { - $script .= " - \$keys[$num] => \$this->get".$col->getPhpName()."(),"; - } - } - $script .= " - );"; - if ($hasFks) { - $script .= " - if (\$includeForeignObjects) {"; - foreach ($fks as $fk) { - $script .= " - if (null !== \$this->" . $this->getFKVarName($fk) . ") { - \$result['" . $this->getFKPhpNameAffix($fk, $plural = false) . "'] = \$this->" . $this->getFKVarName($fk) . "->toArray(\$keyType, \$includeLazyLoadColumns, true); - }"; - } - $script .= " - }"; - } - $script .= " - return \$result; - } -"; - } // addToArray() - - /** - * Adds the getByName method - * @param string &$script The script will be modified in this method. - **/ - protected function addGetByName(&$script) - { - $this->addGetByNameComment($script); - $this->addGetByNameOpen($script); - $this->addGetByNameBody($script); - $this->addGetByNameClose($script); - } - - /** - * Adds the comment for the getByName method - * @param string &$script The script will be modified in this method. - * @see addGetByName - **/ - protected function addGetByNameComment(&$script) { - $script .= " - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string \$name name - * @param string \$type The type of fieldname the \$name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return mixed Value of field. - */"; - } - - /** - * Adds the function declaration for the getByName method - * @param string &$script The script will be modified in this method. - * @see addGetByName - **/ - protected function addGetByNameOpen(&$script) { - $script .= " - public function getByName(\$name, \$type = BasePeer::TYPE_PHPNAME) - {"; - } - - /** - * Adds the function body for the getByName method - * @param string &$script The script will be modified in this method. - * @see addGetByName - **/ - protected function addGetByNameBody(&$script) { - $script .= " - \$pos = ".$this->getPeerClassname()."::translateFieldName(\$name, \$type, BasePeer::TYPE_NUM); - \$field = \$this->getByPosition(\$pos);"; - } - - /** - * Adds the function close for the getByName method - * @param string &$script The script will be modified in this method. - * @see addGetByName - **/ - protected function addGetByNameClose(&$script) { - $script .= " - return \$field; - } -"; - } - - /** - * Adds the getByPosition method - * @param string &$script The script will be modified in this method. - **/ - protected function addGetByPosition(&$script) - { - $this->addGetByPositionComment($script); - $this->addGetByPositionOpen($script); - $this->addGetByPositionBody($script); - $this->addGetByPositionClose($script); - } - - /** - * Adds comment for the getByPosition method - * @param string &$script The script will be modified in this method. - * @see addGetByPosition - **/ - protected function addGetByPositionComment(&$script) { - $script .= " - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int \$pos position in xml schema - * @return mixed Value of field at \$pos - */"; - } - - /** - * Adds the function declaration for the getByPosition method - * @param string &$script The script will be modified in this method. - * @see addGetByPosition - **/ - protected function addGetByPositionOpen(&$script) { - $script .= " - public function getByPosition(\$pos) - {"; - } - - /** - * Adds the function body for the getByPosition method - * @param string &$script The script will be modified in this method. - * @see addGetByPosition - **/ - protected function addGetByPositionBody(&$script) { - $table = $this->getTable(); - $script .= " - switch(\$pos) {"; - $i = 0; - foreach ($table->getColumns() as $col) { - $cfc = $col->getPhpName(); - $script .= " - case $i: - return \$this->get$cfc(); - break;"; - $i++; - } /* foreach */ - $script .= " - default: - return null; - break; - } // switch()"; - } - - /** - * Adds the function close for the getByPosition method - * @param string &$script The script will be modified in this method. - * @see addGetByPosition - **/ - protected function addGetByPositionClose(&$script) { - $script .= " - } -"; - } - - protected function addSetByName(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Sets a field from the object by name passed in as a string. - * - * @param string \$name peer name - * @param mixed \$value field value - * @param string \$type The type of fieldname the \$name is of: - * one of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return void - */ - public function setByName(\$name, \$value, \$type = BasePeer::TYPE_PHPNAME) - { - \$pos = ".$this->getPeerClassname()."::translateFieldName(\$name, \$type, BasePeer::TYPE_NUM); - return \$this->setByPosition(\$pos, \$value); - } -"; - } - - protected function addSetByPosition(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int \$pos position in xml schema - * @param mixed \$value field value - * @return void - */ - public function setByPosition(\$pos, \$value) - { - switch(\$pos) {"; - $i = 0; - foreach ($table->getColumns() as $col) { - $cfc = $col->getPhpName(); - $cptype = $col->getPhpType(); - $script .= " - case $i: - \$this->set$cfc(\$value); - break;"; - $i++; - } /* foreach */ - $script .= " - } // switch() - } -"; - } // addSetByPosition() - - protected function addFromArray(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. \$_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. - * The default key type is the column's phpname (e.g. 'AuthorId') - * - * @param array \$arr An array to populate the object from. - * @param string \$keyType The type of keys the array uses. - * @return void - */ - public function fromArray(\$arr, \$keyType = BasePeer::TYPE_PHPNAME) - { - \$keys = ".$this->getPeerClassname()."::getFieldNames(\$keyType); -"; - foreach ($table->getColumns() as $num => $col) { - $cfc = $col->getPhpName(); - $cptype = $col->getPhpType(); - $script .= " - if (array_key_exists(\$keys[$num], \$arr)) \$this->set$cfc(\$arr[\$keys[$num]]);"; - } /* foreach */ - $script .= " - } -"; - } // addFromArray - - /** - * Adds a delete() method to remove the object form the datastore. - * @param string &$script The script will be modified in this method. - */ - protected function addDelete(&$script) - { - $this->addDeleteComment($script); - $this->addDeleteOpen($script); - $this->addDeleteBody($script); - $this->addDeleteClose($script); - } - - /** - * Adds the comment for the delete function - * @param string &$script The script will be modified in this method. - * @see addDelete() - **/ - protected function addDeleteComment(&$script) { - $script .= " - /** - * Removes this object from datastore and sets delete attribute. - * - * @param PropelPDO \$con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */"; - } - - /** - * Adds the function declaration for the delete function - * @param string &$script The script will be modified in this method. - * @see addDelete() - **/ - protected function addDeleteOpen(&$script) { - $script .= " - public function delete(PropelPDO \$con = null) - {"; - } - - /** - * Adds the function body for the delete function - * @param string &$script The script will be modified in this method. - * @see addDelete() - **/ - protected function addDeleteBody(&$script) { - $script .= " - if (\$this->isDeleted()) { - throw new PropelException(\"This object has already been deleted.\"); - } - - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - \$con->beginTransaction(); - try {"; - if($this->getGeneratorConfig()->getBuildProperty('addHooks')) { - $script .= " - \$ret = \$this->preDelete(\$con);"; - // apply behaviors - $this->applyBehaviorModifier('preDelete', $script, " "); - $script .= " - if (\$ret) { - ".$this->getQueryClassname()."::create() - ->filterByPrimaryKey(\$this->getPrimaryKey()) - ->delete(\$con); - \$this->postDelete(\$con);"; - // apply behaviors - $this->applyBehaviorModifier('postDelete', $script, " "); - $script .= " - \$con->commit(); - \$this->setDeleted(true); - } else { - \$con->commit(); - }"; - } else { - // apply behaviors - $this->applyBehaviorModifier('preDelete', $script, " "); - $script .= " - ".$this->getPeerClassname()."::doDelete(\$this, \$con);"; - // apply behaviors - $this->applyBehaviorModifier('postDelete', $script, " "); - $script .= " - \$con->commit(); - \$this->setDeleted(true);"; - } - - $script .= " - } catch (PropelException \$e) { - \$con->rollBack(); - throw \$e; - }"; - } - - /** - * Adds the function close for the delete function - * @param string &$script The script will be modified in this method. - * @see addDelete() - **/ - protected function addDeleteClose(&$script) { - $script .= " - } -"; - } // addDelete() - - /** - * Adds a reload() method to re-fetch the data for this object from the database. - * @param string &$script The script will be modified in this method. - */ - protected function addReload(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean \$deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO \$con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload(\$deep = false, PropelPDO \$con = null) - { - if (\$this->isDeleted()) { - throw new PropelException(\"Cannot reload a deleted object.\"); - } - - if (\$this->isNew()) { - throw new PropelException(\"Cannot reload an unsaved object.\"); - } - - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - \$stmt = ".$this->getPeerClassname()."::doSelectStmt(\$this->buildPkeyCriteria(), \$con); - \$row = \$stmt->fetch(PDO::FETCH_NUM); - \$stmt->closeCursor(); - if (!\$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - \$this->hydrate(\$row, 0, true); // rehydrate -"; - - // support for lazy load columns - foreach ($table->getColumns() as $col) { - if ($col->isLazyLoad()) { - $clo = strtolower($col->getName()); - $script .= " - // Reset the $clo lazy-load column - \$this->" . $clo . " = null; - \$this->".$clo."_isLoaded = false; -"; - } - } - - $script .= " - if (\$deep) { // also de-associate any related objects? -"; - - foreach ($table->getForeignKeys() as $fk) { - $varName = $this->getFKVarName($fk); - $script .= " - \$this->".$varName." = null;"; - } - - foreach ($table->getReferrers() as $refFK) { - if ($refFK->isLocalPrimaryKey()) { - $script .= " - \$this->".$this->getPKRefFKVarName($refFK)." = null; -"; - } else { - $script .= " - \$this->".$this->getRefFKCollVarName($refFK)." = null; -"; - } - } - - $script .= " - } // if (deep) - } -"; - } // addReload() - - /** - * Adds the methods related to refreshing, saving and deleting the object. - * @param string &$script The script will be modified in this method. - */ - protected function addManipulationMethods(&$script) - { - $this->addReload($script); - $this->addDelete($script); - $this->addSave($script); - $this->addDoSave($script); - } - - /** - * Adds the methods related to validationg the object. - * @param string &$script The script will be modified in this method. - */ - protected function addValidationMethods(&$script) - { - $this->addValidationFailuresAttribute($script); - $this->addGetValidationFailures($script); - $this->addValidate($script); - $this->addDoValidate($script); - } - - /** - * Adds the $validationFailures attribute to store ValidationFailed objects. - * @param string &$script The script will be modified in this method. - */ - protected function addValidationFailuresAttribute(&$script) - { - $script .= " - /** - * Array of ValidationFailed objects. - * @var array ValidationFailed[] - */ - protected \$validationFailures = array(); -"; - } - - /** - * Adds the getValidationFailures() method. - * @param string &$script The script will be modified in this method. - */ - protected function addGetValidationFailures(&$script) - { - $script .= " - /** - * Gets any ValidationFailed objects that resulted from last call to validate(). - * - * - * @return array ValidationFailed[] - * @see validate() - */ - public function getValidationFailures() - { - return \$this->validationFailures; - } -"; - } // addGetValidationFailures() - - /** - * Adds the correct getPrimaryKey() method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addGetPrimaryKey(&$script) - { - $pkeys = $this->getTable()->getPrimaryKey(); - if (count($pkeys) == 1) { - $this->addGetPrimaryKey_SinglePK($script); - } elseif (count($pkeys) > 1) { - $this->addGetPrimaryKey_MultiPK($script); - } else { - // no primary key -- this is deprecated, since we don't *need* this method anymore - $this->addGetPrimaryKey_NoPK($script); - } - } - - /** - * Adds the getPrimaryKey() method for tables that contain a single-column primary key. - * @param string &$script The script will be modified in this method. - */ - protected function addGetPrimaryKey_SinglePK(&$script) - { - $table = $this->getTable(); - $pkeys = $table->getPrimaryKey(); - $cptype = $pkeys[0]->getPhpType(); - - $script .= " - /** - * Returns the primary key for this object (row). - * @return $cptype - */ - public function getPrimaryKey() - { - return \$this->get".$pkeys[0]->getPhpName()."(); - } -"; - } // addetPrimaryKey_SingleFK - - /** - * Adds the setPrimaryKey() method for tables that contain a multi-column primary key. - * @param string &$script The script will be modified in this method. - */ - protected function addGetPrimaryKey_MultiPK(&$script) - { - - $script .= " - /** - * Returns the composite primary key for this object. - * The array elements will be in same order as specified in XML. - * @return array - */ - public function getPrimaryKey() - { - \$pks = array();"; - $i = 0; - foreach ($this->getTable()->getPrimaryKey() as $pk) { - $script .= " - \$pks[$i] = \$this->get".$pk->getPhpName()."();"; - $i++; - } /* foreach */ - $script .= " - - return \$pks; - } -"; - } // addGetPrimaryKey_MultiFK() - - /** - * Adds the getPrimaryKey() method for objects that have no primary key. - * This "feature" is dreprecated, since the getPrimaryKey() method is not required - * by the Persistent interface (or used by the templates). Hence, this method is also - * deprecated. - * @param string &$script The script will be modified in this method. - * @deprecated - */ - protected function addGetPrimaryKey_NoPK(&$script) - { - $script .= " - /** - * Returns NULL since this table doesn't have a primary key. - * This method exists only for BC and is deprecated! - * @return null - */ - public function getPrimaryKey() - { - return null; - } -"; - } - /** - * Adds the correct setPrimaryKey() method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addSetPrimaryKey(&$script) - { - $pkeys = $this->getTable()->getPrimaryKey(); - if (count($pkeys) == 1) { - $this->addSetPrimaryKey_SinglePK($script); - } elseif (count($pkeys) > 1) { - $this->addSetPrimaryKey_MultiPK($script); - } else { - // no primary key -- this is deprecated, since we don't *need* this method anymore - $this->addSetPrimaryKey_NoPK($script); - } - } - - /** - * Adds the setPrimaryKey() method for tables that contain a single-column primary key. - * @param string &$script The script will be modified in this method. - */ - protected function addSetPrimaryKey_SinglePK(&$script) - { - - $pkeys = $this->getTable()->getPrimaryKey(); - $col = $pkeys[0]; - $clo=strtolower($col->getName()); - $ctype = $col->getPhpType(); - - $script .= " - /** - * Generic method to set the primary key ($clo column). - * - * @param $ctype \$key Primary key. - * @return void - */ - public function setPrimaryKey(\$key) - { - \$this->set".$col->getPhpName()."(\$key); - } -"; - } // addSetPrimaryKey_SinglePK - - /** - * Adds the setPrimaryKey() method for tables that contain a multi-columnprimary key. - * @param string &$script The script will be modified in this method. - */ - protected function addSetPrimaryKey_MultiPK(&$script) - { - - $script .=" - /** - * Set the [composite] primary key. - * - * @param array \$keys The elements of the composite key (order must match the order in XML file). - * @return void - */ - public function setPrimaryKey(\$keys) - {"; - $i = 0; - foreach ($this->getTable()->getPrimaryKey() as $pk) { - $pktype = $pk->getPhpType(); - $script .= " - \$this->set".$pk->getPhpName()."(\$keys[$i]);"; - $i++; - } /* foreach ($table->getPrimaryKey() */ - $script .= " - } -"; - } // addSetPrimaryKey_MultiPK - - /** - * Adds the setPrimaryKey() method for objects that have no primary key. - * This "feature" is dreprecated, since the setPrimaryKey() method is not required - * by the Persistent interface (or used by the templates). Hence, this method is also - * deprecated. - * @param string &$script The script will be modified in this method. - * @deprecated - */ - protected function addSetPrimaryKey_NoPK(&$script) - { - $script .=" - /** - * Dummy primary key setter. - * - * This function only exists to preserve backwards compatibility. It is no longer - * needed or required by the Persistent interface. It will be removed in next BC-breaking - * release of Propel. - * - * @deprecated - */ - public function setPrimaryKey(\$pk) - { - // do nothing, because this object doesn't have any primary keys - } -"; - } - - /** - * Adds the isPrimaryKeyNull() method - * @param string &$script The script will be modified in this method. - */ - protected function addIsPrimaryKeyNull(&$script) - { - $table = $this->getTable(); - $pkeys = $table->getPrimaryKey(); - - $script .= " - /** - * Returns true if the primary key for this object is null. - * @return boolean - */ - public function isPrimaryKeyNull() - {"; - if (count($pkeys) == 1) { - $script .= " - return null === \$this->get" . $pkeys[0]->getPhpName() . "();"; - } else { - $tests = array(); - foreach ($pkeys as $pkey) { - $tests[]= "(null === \$this->get" . $pkey->getPhpName() . "())"; - } - $script .= " - return " . join(' && ', $tests) . ";"; - } - $script .= " - } -"; - } // addetPrimaryKey_SingleFK - - // -------------------------------------------------------------------- - // Complex OM Methods - // -------------------------------------------------------------------- - - /** - * Constructs variable name for fkey-related objects. - * @param ForeignKey $fk - * @return string - */ - protected function getFKVarName(ForeignKey $fk) - { - return 'a' . $this->getFKPhpNameAffix($fk, $plural = false); - } - - /** - * Constructs variable name for objects which referencing current table by specified foreign key. - * @param ForeignKey $fk - * @return string - */ - protected function getRefFKCollVarName(ForeignKey $fk) - { - return 'coll' . $this->getRefFKPhpNameAffix($fk, $plural = true); - } - - /** - * Constructs variable name for single object which references current table by specified foreign key - * which is ALSO a primary key (hence one-to-one relationship). - * @param ForeignKey $fk - * @return string - */ - protected function getPKRefFKVarName(ForeignKey $fk) - { - return 'single' . $this->getRefFKPhpNameAffix($fk, $plural = false); - } - - // ---------------------------------------------------------------- - // - // F K M E T H O D S - // - // ---------------------------------------------------------------- - - /** - * Adds the methods that get & set objects related by foreign key to the current object. - * @param string &$script The script will be modified in this method. - */ - protected function addFKMethods(&$script) - { - foreach ($this->getTable()->getForeignKeys() as $fk) { - $this->declareClassFromBuilder($this->getNewStubObjectBuilder($fk->getForeignTable())); - $this->declareClassFromBuilder($this->getNewStubQueryBuilder($fk->getForeignTable())); - $this->addFKMutator($script, $fk); - $this->addFKAccessor($script, $fk); - } // foreach fk - } - - /** - * Adds the class attributes that are needed to store fkey related objects. - * @param string &$script The script will be modified in this method. - */ - protected function addFKAttributes(&$script, ForeignKey $fk) - { - $className = $this->getForeignTable($fk)->getPhpName(); - $varName = $this->getFKVarName($fk); - - $script .= " - /** - * @var $className - */ - protected $".$varName."; -"; - } - - /** - * Adds the mutator (setter) method for setting an fkey related object. - * @param string &$script The script will be modified in this method. - */ - protected function addFKMutator(&$script, ForeignKey $fk) - { - $table = $this->getTable(); - $tblFK = $this->getForeignTable($fk); - - $joinTableObjectBuilder = $this->getNewObjectBuilder($tblFK); - $className = $joinTableObjectBuilder->getObjectClassname(); - - $varName = $this->getFKVarName($fk); - - $script .= " - /** - * Declares an association between this object and a $className object. - * - * @param $className \$v - * @return ".$this->getObjectClassname()." The current object (for fluent API support) - * @throws PropelException - */ - public function set".$this->getFKPhpNameAffix($fk, $plural = false)."($className \$v = null) - {"; - foreach ($fk->getLocalColumns() as $columnName) { - $column = $table->getColumn($columnName); - $lfmap = $fk->getLocalForeignMapping(); - $colFKName = $lfmap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); - $script .= " - if (\$v === null) { - \$this->set".$column->getPhpName()."(".$this->getDefaultValueString($column)."); - } else { - \$this->set".$column->getPhpName()."(\$v->get".$colFK->getPhpName()."()); - } -"; - - } /* foreach local col */ - - $script .= " - \$this->$varName = \$v; -"; - - // Now add bi-directional relationship binding, taking into account whether this is - // a one-to-one relationship. - - if ($fk->isLocalPrimaryKey()) { - $script .= " - // Add binding for other direction of this 1:1 relationship. - if (\$v !== null) { - \$v->set".$this->getRefFKPhpNameAffix($fk, $plural = false)."(\$this); - } -"; - } else { - $script .= " - // Add binding for other direction of this n:n relationship. - // If this object has already been added to the $className object, it will not be re-added. - if (\$v !== null) { - \$v->add".$this->getRefFKPhpNameAffix($fk, $plural = false)."(\$this); - } -"; - - } - - $script .= " - return \$this; - } -"; - } - - /** - * Adds the accessor (getter) method for getting an fkey related object. - * @param string &$script The script will be modified in this method. - */ - protected function addFKAccessor(&$script, ForeignKey $fk) - { - $table = $this->getTable(); - - $varName = $this->getFKVarName($fk); - $pCollName = $this->getFKPhpNameAffix($fk, $plural = true); - - $fkPeerBuilder = $this->getNewPeerBuilder($this->getForeignTable($fk)); - $fkQueryBuilder = $this->getNewStubQueryBuilder($this->getForeignTable($fk)); - $fkObjectBuilder = $this->getNewObjectBuilder($this->getForeignTable($fk))->getStubObjectBuilder(); - $className = $fkObjectBuilder->getClassname(); // get the Classname that has maybe a prefix - - $and = ""; - $comma = ""; - $conditional = ""; - $argmap = array(); // foreign -> local mapping - $argsize = 0; - foreach ($fk->getLocalColumns() as $columnName) { - - $lfmap = $fk->getLocalForeignMapping(); - - $localColumn = $table->getColumn($columnName); - $foreignColumn = $fk->getForeignTable()->getColumn($lfmap[$columnName]); - - $column = $table->getColumn($columnName); - $cptype = $column->getPhpType(); - $clo = strtolower($column->getName()); - - if ($cptype == "integer" || $cptype == "float" || $cptype == "double") { - $conditional .= $and . "\$this->". $clo ." != 0"; - } elseif ($cptype == "string") { - $conditional .= $and . "(\$this->" . $clo ." !== \"\" && \$this->".$clo." !== null)"; - } else { - $conditional .= $and . "\$this->" . $clo ." !== null"; - } - - $argmap[] = array('foreign' => $foreignColumn, 'local' => $localColumn); - $and = " && "; - $comma = ", "; - $argsize = $argsize + 1; - } - - // If the related column is a primary kay and if it's a simple association, - // The use retrieveByPk() instead of doSelect() to take advantage of instance pooling - $useRetrieveByPk = count($argmap) == 1 && $argmap[0]['foreign']->isPrimaryKey(); - - $script .= " - - /** - * Get the associated $className object - * - * @param PropelPDO Optional Connection object. - * @return $className The associated $className object. - * @throws PropelException - */ - public function get".$this->getFKPhpNameAffix($fk, $plural = false)."(PropelPDO \$con = null) - {"; - $script .= " - if (\$this->$varName === null && ($conditional)) {"; - if ($useRetrieveByPk) { - $script .= " - \$this->$varName = ".$fkQueryBuilder->getClassname()."::create()->findPk(\$this->$clo, \$con);"; - } else { - $script .= " - \$this->$varName = ".$fkQueryBuilder->getClassname()."::create() - ->filterBy" . $this->getRefFKPhpNameAffix($fk, $plural = false) . "(\$this) // here - ->findOne(\$con);"; - } - if ($fk->isLocalPrimaryKey()) { - $script .= " - // Because this foreign key represents a one-to-one relationship, we will create a bi-directional association. - \$this->{$varName}->set".$this->getRefFKPhpNameAffix($fk, $plural = false)."(\$this);"; - } else { - $script .= " - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - \$this->{$varName}->add".$this->getRefFKPhpNameAffix($fk, $plural = true)."(\$this); - */"; - } - - $script .= " - } - return \$this->$varName; - } -"; - - } // addFKAccessor - - /** - * Adds a convenience method for setting a related object by specifying the primary key. - * This can be used in conjunction with the getPrimaryKey() for systems where nothing is known - * about the actual objects being related. - * @param string &$script The script will be modified in this method. - */ - protected function addFKByKeyMutator(&$script, ForeignKey $fk) - { - $table = $this->getTable(); - - #$className = $this->getForeignTable($fk)->getPhpName(); - $methodAffix = $this->getFKPhpNameAffix($fk); - #$varName = $this->getFKVarName($fk); - - $script .= " - /** - * Provides convenient way to set a relationship based on a - * key. e.g. - * \$bar->setFooKey(\$foo->getPrimaryKey()) - *"; - if (count($fk->getLocalColumns()) > 1) { - $script .= " - * Note: It is important that the xml schema used to create this class - * maintains consistency in the order of related columns between - * ".$table->getName()." and ". $tblFK->getName().". - * If for some reason this is impossible, this method should be - * overridden in ".$table->getPhpName()."."; - } - $script .= " - * @return ".$this->getObjectClassname()." The current object (for fluent API support) - * @throws PropelException - */ - public function set".$methodAffix."Key(\$key) - { -"; - if (count($fk->getLocalColumns()) > 1) { - $i = 0; - foreach ($fk->getLocalColumns() as $colName) { - $col = $table->getColumn($colName); - $fktype = $col->getPhpType(); - $script .= " - \$this->set".$col->getPhpName()."( ($fktype) \$key[$i] ); -"; - $i++; - } /* foreach */ - } else { - $lcols = $fk->getLocalColumns(); - $colName = $lcols[0]; - $col = $table->getColumn($colName); - $fktype = $col->getPhpType(); - $script .= " - \$this->set".$col->getPhpName()."( ($fktype) \$key); -"; - } - $script .= " - return \$this; - } -"; - } // addFKByKeyMutator() - - /** - * Adds the method that fetches fkey-related (referencing) objects but also joins in data from another table. - * @param string &$script The script will be modified in this method. - */ - protected function addRefFKGetJoinMethods(&$script, ForeignKey $refFK) - { - $table = $this->getTable(); - $tblFK = $refFK->getTable(); - $join_behavior = $this->getGeneratorConfig()->getBuildProperty('useLeftJoinsInDoJoinMethods') ? 'Criteria::LEFT_JOIN' : 'Criteria::INNER_JOIN'; - - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $fkQueryClassname = $this->getNewStubQueryBuilder($refFK->getTable())->getClassname(); - $relCol = $this->getRefFKPhpNameAffix($refFK, $plural=true); - $collName = $this->getRefFKCollVarName($refFK); - - $fkPeerBuilder = $this->getNewPeerBuilder($tblFK); - $className = $fkPeerBuilder->getObjectClassname(); - - $lastTable = ""; - foreach ($tblFK->getForeignKeys() as $fk2) { - - $tblFK2 = $this->getForeignTable($fk2); - $doJoinGet = !$tblFK2->isForReferenceOnly(); - - // it doesn't make sense to join in rows from the curent table, since we are fetching - // objects related to *this* table (i.e. the joined rows will all be the same row as current object) - if ($this->getTable()->getPhpName() == $tblFK2->getPhpName()) { - $doJoinGet = false; - } - - $relCol2 = $this->getFKPhpNameAffix($fk2, $plural = false); - - if ( $this->getRelatedBySuffix($refFK) != "" && - ($this->getRelatedBySuffix($refFK) == $this->getRelatedBySuffix($fk2))) { - $doJoinGet = false; - } - - if ($doJoinGet) { - $script .= " - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this ".$table->getPhpName()." is new, it will return - * an empty collection; or if this ".$table->getPhpName()." has previously - * been saved, it will retrieve related $relCol from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in ".$table->getPhpName().". - * - * @param Criteria \$criteria optional Criteria object to narrow the query - * @param PropelPDO \$con optional connection object - * @param string \$join_behavior optional join type to use (defaults to $join_behavior) - * @return PropelCollection|array {$className}[] List of $className objects - */ - public function get".$relCol."Join".$relCol2."(\$criteria = null, \$con = null, \$join_behavior = $join_behavior) - {"; - $script .= " - \$query = $fkQueryClassname::create(null, \$criteria); - \$query->joinWith('" . $this->getFKPhpNameAffix($fk2, $plural=false) . "', \$join_behavior); - - return \$this->get". $relCol . "(\$query, \$con); - } -"; - } /* end if ($doJoinGet) */ - - } /* end foreach ($tblFK->getForeignKeys() as $fk2) { */ - - } // function - - - // ---------------------------------------------------------------- - // - // R E F E R R E R F K M E T H O D S - // - // ---------------------------------------------------------------- - - /** - * Adds the attributes used to store objects that have referrer fkey relationships to this object. - * protected collVarName; - * private lastVarNameCriteria = null; - * @param string &$script The script will be modified in this method. - */ - protected function addRefFKAttributes(&$script, ForeignKey $refFK) - { - $joinedTableObjectBuilder = $this->getNewObjectBuilder($refFK->getTable()); - $className = $joinedTableObjectBuilder->getObjectClassname(); - - if ($refFK->isLocalPrimaryKey()) { - $script .= " - /** - * @var $className one-to-one related $className object - */ - protected $".$this->getPKRefFKVarName($refFK)."; -"; - } else { - $script .= " - /** - * @var array {$className}[] Collection to store aggregation of $className objects. - */ - protected $".$this->getRefFKCollVarName($refFK)."; -"; - } - } - - /** - * Adds the methods for retrieving, initializing, adding objects that are related to this one by foreign keys. - * @param string &$script The script will be modified in this method. - */ - protected function addRefFKMethods(&$script) - { - foreach ($this->getTable()->getReferrers() as $refFK) { - $this->declareClassFromBuilder($this->getNewStubObjectBuilder($refFK->getTable())); - $this->declareClassFromBuilder($this->getNewStubQueryBuilder($refFK->getTable())); - if ($refFK->isLocalPrimaryKey()) { - $this->addPKRefFKGet($script, $refFK); - $this->addPKRefFKSet($script, $refFK); - } else { - $this->addRefFKClear($script, $refFK); - $this->addRefFKInit($script, $refFK); - $this->addRefFKGet($script, $refFK); - $this->addRefFKCount($script, $refFK); - $this->addRefFKAdd($script, $refFK); - $this->addRefFKGetJoinMethods($script, $refFK); - } - } - } - - /** - * Adds the method that clears the referrer fkey collection. - * @param string &$script The script will be modified in this method. - */ - protected function addRefFKClear(&$script, ForeignKey $refFK) { - - $relCol = $this->getRefFKPhpNameAffix($refFK, $plural = true); - $collName = $this->getRefFKCollVarName($refFK); - - $script .= " - /** - * Clears out the $collName collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see add$relCol() - */ - public function clear$relCol() - { - \$this->$collName = null; // important to set this to NULL since that means it is uninitialized - } -"; - } // addRefererClear() - - /** - * Adds the method that initializes the referrer fkey collection. - * @param string &$script The script will be modified in this method. - */ - protected function addRefFKInit(&$script, ForeignKey $refFK) { - - $relCol = $this->getRefFKPhpNameAffix($refFK, $plural = true); - $collName = $this->getRefFKCollVarName($refFK); - - $script .= " - /** - * Initializes the $collName collection. - * - * By default this just sets the $collName collection to an empty array (like clear$collName()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function init$relCol() - { - \$this->$collName = new PropelObjectCollection(); - \$this->{$collName}->setModel('" . $this->getNewStubObjectBuilder($refFK->getTable())->getClassname() . "'); - } -"; - } // addRefererInit() - - /** - * Adds the method that adds an object into the referrer fkey collection. - * @param string &$script The script will be modified in this method. - */ - protected function addRefFKAdd(&$script, ForeignKey $refFK) - { - $tblFK = $refFK->getTable(); - - $joinedTableObjectBuilder = $this->getNewObjectBuilder($refFK->getTable()); - $className = $joinedTableObjectBuilder->getObjectClassname(); - - $collName = $this->getRefFKCollVarName($refFK); - - $script .= " - /** - * Method called to associate a $className object to this object - * through the $className foreign key attribute. - * - * @param $className \$l $className - * @return void - * @throws PropelException - */ - public function add".$this->getRefFKPhpNameAffix($refFK, $plural = false)."($className \$l) - { - if (\$this->$collName === null) { - \$this->init".$this->getRefFKPhpNameAffix($refFK, $plural = true)."(); - } - if (!\$this->{$collName}->contains(\$l)) { // only add it if the **same** object is not already associated - \$this->{$collName}[]= \$l; - \$l->set".$this->getFKPhpNameAffix($refFK, $plural = false)."(\$this); - } - } -"; - } // addRefererAdd - - /** - * Adds the method that returns the size of the referrer fkey collection. - * @param string &$script The script will be modified in this method. - */ - protected function addRefFKCount(&$script, ForeignKey $refFK) - { - $table = $this->getTable(); - $tblFK = $refFK->getTable(); - - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $fkQueryClassname = $this->getNewStubQueryBuilder($refFK->getTable())->getClassname(); - $relCol = $this->getRefFKPhpNameAffix($refFK, $plural = true); - - $collName = $this->getRefFKCollVarName($refFK); - - $joinedTableObjectBuilder = $this->getNewObjectBuilder($refFK->getTable()); - $className = $joinedTableObjectBuilder->getObjectClassname(); - - $script .= " - /** - * Returns the number of related $className objects. - * - * @param Criteria \$criteria - * @param boolean \$distinct - * @param PropelPDO \$con - * @return int Count of related $className objects. - * @throws PropelException - */ - public function count$relCol(Criteria \$criteria = null, \$distinct = false, PropelPDO \$con = null) - { - if(null === \$this->$collName || null !== \$criteria) { - if (\$this->isNew() && null === \$this->$collName) { - return 0; - } else { - \$query = $fkQueryClassname::create(null, \$criteria); - if(\$distinct) { - \$query->distinct(); - } - return \$query - ->filterBy" . $this->getFKPhpNameAffix($refFK) . "(\$this) - ->count(\$con); - } - } else { - return count(\$this->$collName); - } - } -"; - } // addRefererCount - - /** - * Adds the method that returns the referrer fkey collection. - * @param string &$script The script will be modified in this method. - */ - protected function addRefFKGet(&$script, ForeignKey $refFK) - { - $table = $this->getTable(); - $tblFK = $refFK->getTable(); - - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $fkQueryClassname = $this->getNewStubQueryBuilder($refFK->getTable())->getClassname(); - $relCol = $this->getRefFKPhpNameAffix($refFK, $plural = true); - - $collName = $this->getRefFKCollVarName($refFK); - - $joinedTableObjectBuilder = $this->getNewObjectBuilder($refFK->getTable()); - $className = $joinedTableObjectBuilder->getObjectClassname(); - - $script .= " - /** - * Gets an array of $className objects which contain a foreign key that references this object. - * - * If the \$criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without \$criteria, the cached collection is returned. - * If this ".$this->getObjectClassname()." is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria \$criteria optional Criteria object to narrow the query - * @param PropelPDO \$con optional connection object - * @return PropelCollection|array {$className}[] List of $className objects - * @throws PropelException - */ - public function get$relCol(\$criteria = null, PropelPDO \$con = null) - { - if(null === \$this->$collName || null !== \$criteria) { - if (\$this->isNew() && null === \$this->$collName) { - // return empty collection - \$this->init".$this->getRefFKPhpNameAffix($refFK, $plural = true)."(); - } else { - \$$collName = $fkQueryClassname::create(null, \$criteria) - ->filterBy" . $this->getFKPhpNameAffix($refFK) . "(\$this) - ->find(\$con); - if (null !== \$criteria) { - return \$$collName; - } - \$this->$collName = \$$collName; - } - } - return \$this->$collName; - } -"; - } // addRefererGet() - - /** - * Adds the method that gets a one-to-one related referrer fkey. - * This is for one-to-one relationship special case. - * @param string &$script The script will be modified in this method. - */ - protected function addPKRefFKGet(&$script, ForeignKey $refFK) - { - $table = $this->getTable(); - $tblFK = $refFK->getTable(); - - $joinedTableObjectBuilder = $this->getNewObjectBuilder($refFK->getTable()); - $className = $joinedTableObjectBuilder->getObjectClassname(); - - $queryClassname = $this->getNewStubQueryBuilder($refFK->getTable())->getClassname(); - - $varName = $this->getPKRefFKVarName($refFK); - - $script .= " - /** - * Gets a single $className object, which is related to this object by a one-to-one relationship. - * - * @param PropelPDO \$con optional connection object - * @return $className - * @throws PropelException - */ - public function get".$this->getRefFKPhpNameAffix($refFK, $plural = false)."(PropelPDO \$con = null) - { -"; - $script .= " - if (\$this->$varName === null && !\$this->isNew()) { - \$this->$varName = $queryClassname::create()->findPk(\$this->getPrimaryKey(), \$con); - } - - return \$this->$varName; - } -"; - } // addPKRefFKGet() - - /** - * Adds the method that sets a one-to-one related referrer fkey. - * This is for one-to-one relationships special case. - * @param string &$script The script will be modified in this method. - * @param ForeignKey $refFK The referencing foreign key. - */ - protected function addPKRefFKSet(&$script, ForeignKey $refFK) - { - $tblFK = $refFK->getTable(); - - $joinedTableObjectBuilder = $this->getNewObjectBuilder($refFK->getTable()); - $className = $joinedTableObjectBuilder->getObjectClassname(); - - $varName = $this->getPKRefFKVarName($refFK); - - $script .= " - /** - * Sets a single $className object as related to this object by a one-to-one relationship. - * - * @param $className \$v $className - * @return ".$this->getObjectClassname()." The current object (for fluent API support) - * @throws PropelException - */ - public function set".$this->getRefFKPhpNameAffix($refFK, $plural = false)."($className \$v = null) - { - \$this->$varName = \$v; - - // Make sure that that the passed-in $className isn't already associated with this object - if (\$v !== null && \$v->get".$this->getFKPhpNameAffix($refFK, $plural = false)."() === null) { - \$v->set".$this->getFKPhpNameAffix($refFK, $plural = false)."(\$this); - } - - return \$this; - } -"; - } // addPKRefFKSet - - protected function addCrossFKAttributes(&$script, ForeignKey $crossFK) - { - $joinedTableObjectBuilder = $this->getNewObjectBuilder($crossFK->getForeignTable()); - $className = $joinedTableObjectBuilder->getObjectClassname(); - $script .= " - /** - * @var array {$className}[] Collection to store aggregation of $className objects. - */ - protected $" . $this->getCrossFKVarName($crossFK) . "; -"; - } - - protected function getCrossFKVarName(ForeignKey $crossFK) - { - return 'coll' . $this->getFKPhpNameAffix($crossFK, $plural = true); - } - - protected function addCrossFKMethods(&$script) - { - foreach ($this->getTable()->getCrossFks() as $fkList) { - list($refFK, $crossFK) = $fkList; - $this->declareClassFromBuilder($this->getNewStubObjectBuilder($crossFK->getForeignTable())); - $this->declareClassFromBuilder($this->getNewStubQueryBuilder($crossFK->getForeignTable())); - - $this->addCrossFKClear($script, $crossFK); - $this->addCrossFKInit($script, $crossFK); - $this->addCrossFKGet($script, $refFK, $crossFK); - $this->addCrossFKCount($script, $refFK, $crossFK); - $this->addCrossFKAdd($script, $refFK, $crossFK); - } - } - - /** - * Adds the method that clears the referrer fkey collection. - * @param string &$script The script will be modified in this method. - */ - protected function addCrossFKClear(&$script, ForeignKey $crossFK) { - - $relCol = $this->getFKPhpNameAffix($crossFK, $plural = true); - $collName = $this->getCrossFKVarName($crossFK); - - $script .= " - /** - * Clears out the $collName collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see add$relCol() - */ - public function clear$relCol() - { - \$this->$collName = null; // important to set this to NULL since that means it is uninitialized - } -"; - } // addRefererClear() - - /** - * Adds the method that initializes the referrer fkey collection. - * @param string &$script The script will be modified in this method. - */ - protected function addCrossFKInit(&$script, ForeignKey $crossFK) { - - $relCol = $this->getFKPhpNameAffix($crossFK, $plural = true); - $collName = $this->getCrossFKVarName($crossFK); - $relatedObjectClassName = $this->getNewStubObjectBuilder($crossFK->getForeignTable())->getClassname(); - - $script .= " - /** - * Initializes the $collName collection. - * - * By default this just sets the $collName collection to an empty collection (like clear$relCol()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function init$relCol() - { - \$this->$collName = new PropelObjectCollection(); - \$this->{$collName}->setModel('$relatedObjectClassName'); - } -"; - } - - protected function addCrossFKGet(&$script, $refFK, $crossFK) - { - $relatedName = $this->getFKPhpNameAffix($crossFK, $plural = true); - $relatedObjectClassName = $this->getNewStubObjectBuilder($crossFK->getForeignTable())->getClassname(); - $selfRelationName = $this->getFKPhpNameAffix($refFK, $plural = false); - $relatedQueryClassName = $this->getNewStubQueryBuilder($crossFK->getForeignTable())->getClassname(); - $crossRefTableName = $crossFK->getTableName(); - $collName = $this->getCrossFKVarName($crossFK); - $script .= " - /** - * Gets a collection of $relatedObjectClassName objects related by a many-to-many relationship - * to the current object by way of the $crossRefTableName cross-reference table. - * - * If the \$criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without \$criteria, the cached collection is returned. - * If this ".$this->getObjectClassname()." is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria \$criteria Optional query object to filter the query - * @param PropelPDO \$con Optional connection object - * - * @return PropelCollection|array {$relatedObjectClassName}[] List of {$relatedObjectClassName} objects - */ - public function get{$relatedName}(\$criteria = null, PropelPDO \$con = null) - { - if(null === \$this->$collName || null !== \$criteria) { - if (\$this->isNew() && null === \$this->$collName) { - // return empty collection - \$this->init{$relatedName}(); - } else { - \$$collName = $relatedQueryClassName::create(null, \$criteria) - ->filterBy{$selfRelationName}(\$this) - ->find(\$con); - if (null !== \$criteria) { - return \$$collName; - } - \$this->$collName = \$$collName; - } - } - return \$this->$collName; - } -"; - } - - protected function addCrossFKCount(&$script, $refFK, $crossFK) - { - $relatedName = $this->getFKPhpNameAffix($crossFK, $plural = true); - $relatedObjectClassName = $this->getNewStubObjectBuilder($crossFK->getForeignTable())->getClassname(); - $selfRelationName = $this->getFKPhpNameAffix($refFK, $plural = false); - $relatedQueryClassName = $this->getNewStubQueryBuilder($crossFK->getForeignTable())->getClassname(); - $crossRefTableName = $refFK->getTableName(); - $collName = $this->getCrossFKVarName($crossFK); - $script .= " - /** - * Gets the number of $relatedObjectClassName objects related by a many-to-many relationship - * to the current object by way of the $crossRefTableName cross-reference table. - * - * @param Criteria \$criteria Optional query object to filter the query - * @param boolean \$distinct Set to true to force count distinct - * @param PropelPDO \$con Optional connection object - * - * @return int the number of related $relatedObjectClassName objects - */ - public function count{$relatedName}(\$criteria = null, \$distinct = false, PropelPDO \$con = null) - { - if(null === \$this->$collName || null !== \$criteria) { - if (\$this->isNew() && null === \$this->$collName) { - return 0; - } else { - \$query = $relatedQueryClassName::create(null, \$criteria); - if(\$distinct) { - \$query->distinct(); - } - return \$query - ->filterBy{$selfRelationName}(\$this) - ->count(\$con); - } - } else { - return count(\$this->$collName); - } - } -"; - } - - /** - * Adds the method that adds an object into the referrer fkey collection. - * @param string &$script The script will be modified in this method. - */ - protected function addCrossFKAdd(&$script, ForeignKey $refFK, ForeignKey $crossFK) - { - $relCol = $this->getFKPhpNameAffix($crossFK, $plural = true); - $collName = $this->getCrossFKVarName($crossFK); - - $tblFK = $refFK->getTable(); - - $joinedTableObjectBuilder = $this->getNewObjectBuilder($refFK->getTable()); - $className = $joinedTableObjectBuilder->getObjectClassname(); - - $foreignObjectName = '$' . $tblFK->getStudlyPhpName(); - $crossObjectName = '$' . $crossFK->getForeignTable()->getStudlyPhpName(); - $crossObjectClassName = $this->getNewObjectBuilder($crossFK->getForeignTable())->getObjectClassname(); - - $script .= " - /** - * Associate a " . $crossObjectClassName . " object to this object - * through the " . $tblFK->getName() . " cross reference table. - * - * @param " . $crossObjectClassName . " " . $crossObjectName . " The $className object to relate - * @return void - */ - public function add" . $this->getFKPhpNameAffix($crossFK, $plural = false) . "(" . $crossObjectName. ") - { - if (\$this->" . $collName . " === null) { - \$this->init" . $relCol . "(); - } - if (!\$this->" . $collName . "->contains(" . $crossObjectName . ")) { // only add it if the **same** object is not already associated - " . $foreignObjectName . " = new " . $className . "(); - " . $foreignObjectName . "->set" . $this->getFKPhpNameAffix($crossFK, $plural = false) . "(" . $crossObjectName . "); - \$this->add" . $this->getRefFKPhpNameAffix($refFK, $plural = false) . "(" . $foreignObjectName . "); - - \$this->" . $collName . "[]= " . $crossObjectName . "; - } - } -"; - } - - // ---------------------------------------------------------------- - // - // M A N I P U L A T I O N M E T H O D S - // - // ---------------------------------------------------------------- - - /** - * Adds the workhourse doSave() method. - * @param string &$script The script will be modified in this method. - */ - protected function addDoSave(&$script) - { - $table = $this->getTable(); - - $reloadOnUpdate = $table->isReloadOnUpdate(); - $reloadOnInsert = $table->isReloadOnInsert(); - - $script .= " - /** - * Performs the work of inserting or updating the row in the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All related objects are also updated in this method. - * - * @param PropelPDO \$con"; - if ($reloadOnUpdate || $reloadOnInsert) { - $script .= " - * @param boolean \$skipReload Whether to skip the reload for this object from database."; - } - $script .= " - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see save() - */ - protected function doSave(PropelPDO \$con".($reloadOnUpdate || $reloadOnInsert ? ", \$skipReload = false" : "").") - { - \$affectedRows = 0; // initialize var to track total num of affected rows - if (!\$this->alreadyInSave) { - \$this->alreadyInSave = true; -"; - if ($reloadOnInsert || $reloadOnUpdate) { - $script .= " - \$reloadObject = false; -"; - } - - if (count($table->getForeignKeys())) { - - $script .= " - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. -"; - - foreach ($table->getForeignKeys() as $fk) { - $aVarName = $this->getFKVarName($fk); - $script .= " - if (\$this->$aVarName !== null) { - if (\$this->" . $aVarName . "->isModified() || \$this->" . $aVarName . "->isNew()) { - \$affectedRows += \$this->" . $aVarName . "->save(\$con); - } - \$this->set".$this->getFKPhpNameAffix($fk, $plural = false)."(\$this->$aVarName); - } -"; - } // foreach foreign k - } // if (count(foreign keys)) - - if ($table->hasAutoIncrementPrimaryKey() ) { - $script .= " - if (\$this->isNew() ) { - \$this->modifiedColumns[] = " . $this->getColumnConstant($table->getAutoIncrementPrimaryKey() ) . "; - }"; - } - - $script .= " - - // If this object has been modified, then save it to the database. - if (\$this->isModified()) { - if (\$this->isNew()) { - \$criteria = \$this->buildCriteria();"; - - - foreach ($table->getColumns() as $col) { - if ($col->isPrimaryKey() && $col->isAutoIncrement() && $table->getIdMethod() != "none" && !$table->isAllowPkInsert()) { - $colConst = $this->getColumnConstant($col); - $script .= " - if (\$criteria->keyContainsValue(" . $colConst . ") ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('." . $colConst . ".')'); - } -"; - if (!$this->getPlatform()->supportsInsertNullPk()) { - $script .= " - // remove pkey col since this table uses auto-increment and passing a null value for it is not valid - \$criteria->remove(" . $colConst . "); -"; - } - } elseif ($col->isPrimaryKey() && $col->isAutoIncrement() && $table->getIdMethod() != "none" && $table->isAllowPkInsert() && !$this->getPlatform()->supportsInsertNullPk()) { - $script .= " - // remove pkey col if it is null since this table does not accept that - if (\$criteria->containsKey(" . $colConst . ") && !\$criteria->keyContainsValue(" . $colConst . ") ) { - \$criteria->remove(" . $colConst . "); - }"; - } - } - - $script .= " - \$pk = " . $this->getNewPeerBuilder($table)->getBasePeerClassname() . "::doInsert(\$criteria, \$con);"; - if ($reloadOnInsert) { - $script .= " - if (!\$skipReload) { - \$reloadObject = true; - }"; - } - $operator = count($table->getForeignKeys()) ? '+=' : '='; - $script .= " - \$affectedRows " . $operator . " 1;"; - if ($table->getIdMethod() != IDMethod::NO_ID_METHOD) { - - if (count($pks = $table->getPrimaryKey())) { - foreach ($pks as $pk) { - if ($pk->isAutoIncrement()) { - if ($table->isAllowPkInsert()) { - $script .= " - if (\$pk !== null) { - \$this->set".$pk->getPhpName()."(\$pk); //[IMV] update autoincrement primary key - }"; - } else { - $script .= " - \$this->set".$pk->getPhpName()."(\$pk); //[IMV] update autoincrement primary key"; - } - } - } - } - } // if (id method != "none") - - $script .= " - \$this->setNew(false); - } else {"; - if ($reloadOnUpdate) { - $script .= " - if (!\$skipReload) { - \$reloadObject = true; - }"; - } - $operator = count($table->getForeignKeys()) ? '+=' : '='; - $script .= " - \$affectedRows " . $operator . " ".$this->getPeerClassname()."::doUpdate(\$this, \$con); - } -"; - - // We need to rewind any LOB columns - foreach ($table->getColumns() as $col) { - $clo = strtolower($col->getName()); - if ($col->isLobType()) { - $script .= " - // Rewind the $clo LOB column, since PDO does not rewind after inserting value. - if (\$this->$clo !== null && is_resource(\$this->$clo)) { - rewind(\$this->$clo); - } -"; - } - } - - $script .= " - \$this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } -"; - - foreach ($table->getReferrers() as $refFK) { - - if ($refFK->isLocalPrimaryKey()) { - $varName = $this->getPKRefFKVarName($refFK); - $script .= " - if (\$this->$varName !== null) { - if (!\$this->{$varName}->isDeleted()) { - \$affectedRows += \$this->{$varName}->save(\$con); - } - } -"; - } else { - $collName = $this->getRefFKCollVarName($refFK); - $script .= " - if (\$this->$collName !== null) { - foreach (\$this->$collName as \$referrerFK) { - if (!\$referrerFK->isDeleted()) { - \$affectedRows += \$referrerFK->save(\$con); - } - } - } -"; - } // if refFK->isLocalPrimaryKey() - - } /* foreach getReferrers() */ - $script .= " - \$this->alreadyInSave = false; -"; - if ($reloadOnInsert || $reloadOnUpdate) { - $script .= " - if (\$reloadObject) { - \$this->reload(\$con); - } -"; - } - $script .= " - } - return \$affectedRows; - } // doSave() -"; - - } - - /** - * Adds the $alreadyInSave attribute, which prevents attempting to re-save the same object. - * @param string &$script The script will be modified in this method. - */ - protected function addAlreadyInSaveAttribute(&$script) - { - $script .= " - /** - * Flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected \$alreadyInSave = false; -"; - } - - /** - * Adds the save() method. - * @param string &$script The script will be modified in this method. - */ - protected function addSave(&$script) - { - $this->addSaveComment($script); - $this->addSaveOpen($script); - $this->addSaveBody($script); - $this->addSaveClose($script); - } - - /** - * Adds the comment for the save method - * @param string &$script The script will be modified in this method. - * @see addSave() - **/ - protected function addSaveComment(&$script) { - $table = $this->getTable(); - $reloadOnUpdate = $table->isReloadOnUpdate(); - $reloadOnInsert = $table->isReloadOnInsert(); - - $script .= " - /** - * Persists this object to the database. - * - * If the object is new, it inserts it; otherwise an update is performed. - * All modified related objects will also be persisted in the doSave() - * method. This method wraps all precipitate database operations in a - * single transaction."; - if ($reloadOnUpdate) { - $script .= " - * - * Since this table was configured to reload rows on update, the object will - * be reloaded from the database if an UPDATE operation is performed (unless - * the \$skipReload parameter is TRUE)."; - } - if ($reloadOnInsert) { - $script .= " - * - * Since this table was configured to reload rows on insert, the object will - * be reloaded from the database if an INSERT operation is performed (unless - * the \$skipReload parameter is TRUE)."; - } - $script .= " - * - * @param PropelPDO \$con"; - if ($reloadOnUpdate || $reloadOnInsert) { - $script .= " - * @param boolean \$skipReload Whether to skip the reload for this object from database."; - } - $script .= " - * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. - * @throws PropelException - * @see doSave() - */"; - } - - /** - * Adds the function declaration for the save method - * @param string &$script The script will be modified in this method. - * @see addSave() - **/ - protected function addSaveOpen(&$script) { - $table = $this->getTable(); - $reloadOnUpdate = $table->isReloadOnUpdate(); - $reloadOnInsert = $table->isReloadOnInsert(); - $script .= " - public function save(PropelPDO \$con = null".($reloadOnUpdate || $reloadOnInsert ? ", \$skipReload = false" : "").") - {"; - } - - /** - * Adds the function body for the save method - * @param string &$script The script will be modified in this method. - * @see addSave() - **/ - protected function addSaveBody(&$script) { - $table = $this->getTable(); - $reloadOnUpdate = $table->isReloadOnUpdate(); - $reloadOnInsert = $table->isReloadOnInsert(); - - $script .= " - if (\$this->isDeleted()) { - throw new PropelException(\"You cannot save an object that has been deleted.\"); - } - - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - \$con->beginTransaction(); - \$isInsert = \$this->isNew(); - try {"; - - if($this->getGeneratorConfig()->getBuildProperty('addHooks')) { - // save with runtime hools - $script .= " - \$ret = \$this->preSave(\$con);"; - $this->applyBehaviorModifier('preSave', $script, " "); - $script .= " - if (\$isInsert) { - \$ret = \$ret && \$this->preInsert(\$con);"; - $this->applyBehaviorModifier('preInsert', $script, " "); - $script .= " - } else { - \$ret = \$ret && \$this->preUpdate(\$con);"; - $this->applyBehaviorModifier('preUpdate', $script, " "); - $script .= " - } - if (\$ret) { - \$affectedRows = \$this->doSave(\$con".($reloadOnUpdate || $reloadOnInsert ? ", \$skipReload" : "")."); - if (\$isInsert) { - \$this->postInsert(\$con);"; - $this->applyBehaviorModifier('postInsert', $script, " "); - $script .= " - } else { - \$this->postUpdate(\$con);"; - $this->applyBehaviorModifier('postUpdate', $script, " "); - $script .= " - } - \$this->postSave(\$con);"; - $this->applyBehaviorModifier('postSave', $script, " "); - $script .= " - ".$this->getPeerClassname()."::addInstanceToPool(\$this); - } else { - \$affectedRows = 0; - } - \$con->commit(); - return \$affectedRows;"; - } else { - // save without runtime hooks - $this->applyBehaviorModifier('preSave', $script, " "); - if ($this->hasBehaviorModifier('preUpdate')) - { - $script .= " - if(!\$isInsert) {"; - $this->applyBehaviorModifier('preUpdate', $script, " "); - $script .= " - }"; - } - if ($this->hasBehaviorModifier('preInsert')) - { - $script .= " - if(\$isInsert) {"; - $this->applyBehaviorModifier('preInsert', $script, " "); - $script .= " - }"; - } - $script .= " - \$affectedRows = \$this->doSave(\$con".($reloadOnUpdate || $reloadOnInsert ? ", \$skipReload" : "").");"; - $this->applyBehaviorModifier('postSave', $script, " "); - if ($this->hasBehaviorModifier('postUpdate')) - { - $script .= " - if(!\$isInsert) {"; - $this->applyBehaviorModifier('postUpdate', $script, " "); - $script .= " - }"; - } - if ($this->hasBehaviorModifier('postInsert')) - { - $script .= " - if(\$isInsert) {"; - $this->applyBehaviorModifier('postInsert', $script, " "); - $script .= " - }"; - } - $script .= " - \$con->commit(); - ".$this->getPeerClassname()."::addInstanceToPool(\$this); - return \$affectedRows;"; - } - - $script .= " - } catch (PropelException \$e) { - \$con->rollBack(); - throw \$e; - }"; - } - - /** - * Adds the function close for the save method - * @param string &$script The script will be modified in this method. - * @see addSave() - **/ - protected function addSaveClose(&$script) { - $script .= " - } -"; - } - - /** - * Adds the $alreadyInValidation attribute, which prevents attempting to re-validate the same object. - * @param string &$script The script will be modified in this method. - */ - protected function addAlreadyInValidationAttribute(&$script) - { - $script .= " - /** - * Flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected \$alreadyInValidation = false; -"; - } - - /** - * Adds the validate() method. - * @param string &$script The script will be modified in this method. - */ - protected function addValidate(&$script) - { - $script .= " - /** - * Validates the objects modified field values and all objects related to this table. - * - * If \$columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed \$columns Column name or an array of column names. - * @return boolean Whether all columns pass validation. - * @see doValidate() - * @see getValidationFailures() - */ - public function validate(\$columns = null) - { - \$res = \$this->doValidate(\$columns); - if (\$res === true) { - \$this->validationFailures = array(); - return true; - } else { - \$this->validationFailures = \$res; - return false; - } - } -"; - } // addValidate() - - /** - * Adds the workhourse doValidate() method. - * @param string &$script The script will be modified in this method. - */ - protected function addDoValidate(&$script) - { - $table = $this->getTable(); - - $script .= " - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @param array \$columns Array of column names to validate. - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate(\$columns = null) - { - if (!\$this->alreadyInValidation) { - \$this->alreadyInValidation = true; - \$retval = null; - - \$failureMap = array(); -"; - if (count($table->getForeignKeys()) != 0) { - $script .= " - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. -"; - foreach ($table->getForeignKeys() as $fk) { - $aVarName = $this->getFKVarName($fk); - $script .= " - if (\$this->".$aVarName." !== null) { - if (!\$this->".$aVarName."->validate(\$columns)) { - \$failureMap = array_merge(\$failureMap, \$this->".$aVarName."->getValidationFailures()); - } - } -"; - } /* for () */ - } /* if count(fkeys) */ - - $script .= " - - if ((\$retval = ".$this->getPeerClassname()."::doValidate(\$this, \$columns)) !== true) { - \$failureMap = array_merge(\$failureMap, \$retval); - } - -"; - - foreach ($table->getReferrers() as $refFK) { - if ($refFK->isLocalPrimaryKey()) { - $varName = $this->getPKRefFKVarName($refFK); - $script .= " - if (\$this->$varName !== null) { - if (!\$this->".$varName."->validate(\$columns)) { - \$failureMap = array_merge(\$failureMap, \$this->".$varName."->getValidationFailures()); - } - } -"; - } else { - $collName = $this->getRefFKCollVarName($refFK); - $script .= " - if (\$this->$collName !== null) { - foreach (\$this->$collName as \$referrerFK) { - if (!\$referrerFK->validate(\$columns)) { - \$failureMap = array_merge(\$failureMap, \$referrerFK->getValidationFailures()); - } - } - } -"; - } - } /* foreach getReferrers() */ - - $script .= " - - \$this->alreadyInValidation = false; - } - - return (!empty(\$failureMap) ? \$failureMap : true); - } -"; - } // addDoValidate() - - /** - * Adds the ensureConsistency() method to ensure that internal state is correct. - * @param string &$script The script will be modified in this method. - */ - protected function addEnsureConsistency(&$script) - { - $table = $this->getTable(); - - $script .= " - /** - * Checks and repairs the internal consistency of the object. - * - * This method is executed after an already-instantiated object is re-hydrated - * from the database. It exists to check any foreign keys to make sure that - * the objects related to the current object are correct based on foreign key. - * - * You can override this method in the stub class, but you should always invoke - * the base method from the overridden method (i.e. parent::ensureConsistency()), - * in case your model changes. - * - * @throws PropelException - */ - public function ensureConsistency() - { -"; - foreach ($table->getColumns() as $col) { - - $clo=strtolower($col->getName()); - - if ($col->isForeignKey()) { - foreach ($col->getForeignKeys() as $fk) { - - $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); - $colFK = $tblFK->getColumn($fk->getMappedForeignColumn($col->getName())); - $varName = $this->getFKVarName($fk); - - $script .= " - if (\$this->".$varName." !== null && \$this->$clo !== \$this->".$varName."->get".$colFK->getPhpName()."()) { - \$this->$varName = null; - }"; - } // foraech - } /* if col is foreign key */ - - } // foreach - - $script .= " - } // ensureConsistency -"; - } // addCheckRelConsistency - - /** - * Adds the copy() method, which (in complex OM) includes the $deepCopy param for making copies of related objects. - * @param string &$script The script will be modified in this method. - */ - protected function addCopy(&$script) - { - $this->addCopyInto($script); - - $table = $this->getTable(); - - $script .= " - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean \$deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return ".$this->getObjectClassname()." Clone of current object. - * @throws PropelException - */ - public function copy(\$deepCopy = false) - { - // we use get_class(), because this might be a subclass - \$clazz = get_class(\$this); - " . $this->buildObjectInstanceCreationCode('$copyObj', '$clazz') . " - \$this->copyInto(\$copyObj, \$deepCopy); - return \$copyObj; - } -"; - } // addCopy() - - /** - * Adds the copyInto() method, which takes an object and sets contents to match current object. - * In complex OM this method includes the $deepCopy param for making copies of related objects. - * @param string &$script The script will be modified in this method. - */ - protected function addCopyInto(&$script) - { - $table = $this->getTable(); - - $script .= " - /** - * Sets contents of passed object to values from current object. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param object \$copyObj An object of ".$this->getObjectClassname()." (or compatible) type. - * @param boolean \$deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @throws PropelException - */ - public function copyInto(\$copyObj, \$deepCopy = false) - {"; - - $autoIncCols = array(); - foreach ($table->getColumns() as $col) { - /* @var $col Column */ - if ($col->isAutoIncrement()) { - $autoIncCols[] = $col; - } - } - - foreach ($table->getColumns() as $col) { - if (!in_array($col, $autoIncCols, true)) { - $script .= " - \$copyObj->set".$col->getPhpName()."(\$this->".strtolower($col->getName()).");"; - } - } // foreach - - // Avoid useless code by checking to see if there are any referrers - // to this table: - if (count($table->getReferrers()) > 0) { - $script .= " - - if (\$deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - \$copyObj->setNew(false); -"; - foreach ($table->getReferrers() as $fk) { - //HL: commenting out self-referrential check below - // it seems to work as expected and is probably desireable to have those referrers from same table deep-copied. - //if ( $fk->getTable()->getName() != $table->getName() ) { - - if ($fk->isLocalPrimaryKey()) { - - $afx = $this->getRefFKPhpNameAffix($fk, $plural = false); - $script .= " - \$relObj = \$this->get$afx(); - if (\$relObj) { - \$copyObj->set$afx(\$relObj->copy(\$deepCopy)); - } -"; - } else { - - $script .= " - foreach (\$this->get".$this->getRefFKPhpNameAffix($fk, true)."() as \$relObj) { - if (\$relObj !== \$this) { // ensure that we don't try to copy a reference to ourselves - \$copyObj->add".$this->getRefFKPhpNameAffix($fk)."(\$relObj->copy(\$deepCopy)); - } - } -"; - } - // HL: commenting out close of self-referential check - // } /* if tblFK != table */ - } /* foreach */ - $script .= " - } // if (\$deepCopy) -"; - } /* if (count referrers > 0 ) */ - - $script .= " - - \$copyObj->setNew(true);"; - - // Note: we're no longer resetting non-autoincrement primary keys to default values - // due to: http://propel.phpdb.org/trac/ticket/618 - foreach ($autoIncCols as $col) { - $coldefval = $col->getPhpDefaultValue(); - $coldefval = var_export($coldefval, true); - $script .= " - \$copyObj->set".$col->getPhpName() ."($coldefval); // this is a auto-increment column, so set to default value"; - } // foreach - $script .= " - } -"; - } // addCopyInto() - - /** - * Adds clear method - * @param string &$script The script will be modified in this method. - */ - protected function addClear(&$script) - { - $table = $this->getTable(); - - $script .= " - /** - * Clears the current object and sets all attributes to their default values - */ - public function clear() - {"; - foreach ($table->getColumns() as $col) { - $script .= " - \$this->" . strtolower($col->getName()) . " = null;"; - } - - $script .= " - \$this->alreadyInSave = false; - \$this->alreadyInValidation = false; - \$this->clearAllReferences();"; - - if ($this->hasDefaultValues()) { - $script .= " - \$this->applyDefaultValues();"; - } - - $script .= " - \$this->resetModified(); - \$this->setNew(true); - \$this->setDeleted(false); - } -"; - } - - - /** - * Adds clearAllReferencers() method which resets all the collections of referencing - * fk objects. - * @param string &$script The script will be modified in this method. - */ - protected function addClearAllReferences(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Resets all collections of referencing foreign keys. - * - * This method is a user-space workaround for PHP's inability to garbage collect objects - * with circular references. This is currently necessary when using Propel in certain - * daemon or large-volumne/high-memory operations. - * - * @param boolean \$deep Whether to also clear the references on all associated objects. - */ - public function clearAllReferences(\$deep = false) - { - if (\$deep) {"; - $vars = array(); - foreach ($this->getTable()->getReferrers() as $refFK) { - if ($refFK->isLocalPrimaryKey()) { - $varName = $this->getPKRefFKVarName($refFK); - $vars[] = $varName; - $script .= " - if (\$this->$varName) { - \$this->{$varName}->clearAllReferences(\$deep); - }"; - } else { - $varName = $this->getRefFKCollVarName($refFK); - $vars[] = $varName; - $script .= " - if (\$this->$varName) { - foreach ((array) \$this->$varName as \$o) { - \$o->clearAllReferences(\$deep); - } - }"; - } - } - - $script .= " - } // if (\$deep) -"; - - $this->applyBehaviorModifier('objectClearReferences', $script, " "); - - foreach ($vars as $varName) { - $script .= " - \$this->$varName = null;"; - } - - foreach ($table->getForeignKeys() as $fk) { - $className = $this->getForeignTable($fk)->getPhpName(); - $varName = $this->getFKVarName($fk); - $script .= " - \$this->$varName = null;"; - } - - $script .= " - } -"; - } - - /** - * Adds a magic __toString() method if a string column was defined as primary string - * @param string &$script The script will be modified in this method. - */ - protected function addPrimaryString(&$script) - { - foreach ($this->getTable()->getColumns() as $column) { - if ($column->isPrimaryString()) { - $script .= " - /** - * Return the string representation of this object - * - * @return string The value of the '{$column->getName()}' column - */ - public function __toString() - { - return (string) \$this->get{$column->getPhpName()}(); - } -"; - break; - } - } - } - - /** - * Adds a magic __call() method - * @param string &$script The script will be modified in this method. - */ - protected function addMagicCall(&$script) - { - $script .= " - /** - * Catches calls to virtual methods - */ - public function __call(\$name, \$params) - {"; - $this->applyBehaviorModifier('objectCall', $script, " "); - $script .= " - if (preg_match('/get(\w+)/', \$name, \$matches)) { - \$virtualColumn = \$matches[1]; - if (\$this->hasVirtualColumn(\$virtualColumn)) { - return \$this->getVirtualColumn(\$virtualColumn); - } - // no lcfirst in php<5.3... - \$virtualColumn[0] = strtolower(\$virtualColumn[0]); - if (\$this->hasVirtualColumn(\$virtualColumn)) { - return \$this->getVirtualColumn(\$virtualColumn); - } - } - throw new PropelException('Call to undefined method: ' . \$name); - } -"; - } -} // PHP5ObjectBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ObjectNoCollectionBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ObjectNoCollectionBuilder.php deleted file mode 100644 index 8b96998a9c..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5ObjectNoCollectionBuilder.php +++ /dev/null @@ -1,962 +0,0 @@ - - * propel.builder.object.class = builder.om.PHP5ObjectNoCollectionBuilder - * - * - * @deprecated Since Propel 1.5 - * @author Hans Lellelid - * @package propel.generator.builder.om - */ -class PHP5ObjectNoCollectionBuilder extends PHP5ObjectBuilder -{ - - /** - * Adds the lazy loader method. - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see parent::addColumnAccessors() - */ - protected function addLazyLoader(&$script, Column $col) - { - $this->addLazyLoaderComment($script, $col); - $this->addLazyLoaderOpen($script, $col); - $this->addLazyLoaderBody($script, $col); - $this->addLazyLoaderClose($script, $col); - } - - /** - * Adds the comment for the lazy loader method - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addLazyLoader() - **/ - protected function addLazyLoaderComment(&$script, Column $col) { - $clo = strtolower($col->getName()); - - $script .= " - /** - * Load the value for the lazy-loaded [$clo] column. - * - * This method performs an additional query to return the value for - * the [$clo] column, since it is not populated by - * the hydrate() method. - * - * @param \$con PropelPDO (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - any underlying error will be wrapped and re-thrown. - */"; - } - - /** - * Adds the function declaration for the lazy loader method - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addLazyLoader() - **/ - protected function addLazyLoaderOpen(&$script, Column $col) { - $cfc = $col->getPhpName(); - $script .= " - protected function load$cfc(PropelPDO \$con = null) - {"; - } - - /** - * Adds the function body for the lazy loader method - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addLazyLoader() - **/ - protected function addLazyLoaderBody(&$script, Column $col) { - $platform = $this->getPlatform(); - $clo = strtolower($col->getName()); - - $script .= " - \$c = \$this->buildPkeyCriteria(); - \$c->addSelectColumn(".$this->getColumnConstant($col)."); - try { - \$stmt = ".$this->getPeerClassname()."::doSelectStmt(\$c, \$con); - \$row = \$stmt->fetch(PDO::FETCH_NUM); - \$stmt->closeCursor();"; - - if ($col->getType() === PropelTypes::CLOB && $this->getPlatform() instanceof OraclePlatform) { - // PDO_OCI returns a stream for CLOB objects, while other PDO adapters return a string... - $script .= " - \$this->$clo = stream_get_contents(\$row[0]);"; - } elseif ($col->isLobType() && !$platform->hasStreamBlobImpl()) { - $script .= " - if (\$row[0] !== null) { - \$this->$clo = fopen('php://memory', 'r+'); - fwrite(\$this->$clo, \$row[0]); - rewind(\$this->$clo); - } else { - \$this->$clo = null; - }"; - } elseif ($col->isPhpPrimitiveType()) { - $script .= " - \$this->$clo = (\$row[0] !== null) ? (".$col->getPhpType().") \$row[0] : null;"; - } elseif ($col->isPhpObjectType()) { - $script .= " - \$this->$clo = (\$row[0] !== null) ? new ".$col->getPhpType()."(\$row[0]) : null;"; - } else { - $script .= " - \$this->$clo = \$row[0];"; - } - - $script .= " - \$this->".$clo."_isLoaded = true; - } catch (Exception \$e) { - throw new PropelException(\"Error loading value for [$clo] column on demand.\", \$e); - }"; - } - - /** - * Adds the function close for the lazy loader - * @param string &$script The script will be modified in this method. - * @param Column $col The current column. - * @see addLazyLoader() - **/ - protected function addLazyLoaderClose(&$script, Column $col) { - $script .= " - }"; - } // addLazyLoader() - - /** - * Adds the buildPkeyCriteria method - * @param string &$script The script will be modified in this method. - **/ - protected function addBuildPkeyCriteria(&$script) { - $this->addBuildPkeyCriteriaComment($script); - $this->addBuildPkeyCriteriaOpen($script); - $this->addBuildPkeyCriteriaBody($script); - $this->addBuildPkeyCriteriaClose($script); - } - - /** - * Adds the comment for the buildPkeyCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildPkeyCriteria() - **/ - protected function addBuildPkeyCriteriaComment(&$script) { - $script .= " - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */"; - } - - /** - * Adds the function declaration for the buildPkeyCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildPkeyCriteria() - **/ - protected function addBuildPkeyCriteriaOpen(&$script) { - $script .= " - public function buildPkeyCriteria() - {"; - } - - /** - * Adds the function body for the buildPkeyCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildPkeyCriteria() - **/ - protected function addBuildPkeyCriteriaBody(&$script) { - $script .= " - \$criteria = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME);"; - foreach ($this->getTable()->getColumns() as $col) { - $clo = strtolower($col->getName()); - if ($col->isPrimaryKey()) { - $script .= " - \$criteria->add(".$this->getColumnConstant($col).", \$this->$clo);"; - } - } - } - - /** - * Adds the function close for the buildPkeyCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildPkeyCriteria() - **/ - protected function addBuildPkeyCriteriaClose(&$script) { - $script .= " - - return \$criteria; - } -"; - } - - /** - * Adds the buildCriteria method - * @param string &$script The script will be modified in this method. - **/ - protected function addBuildCriteria(&$script) - { - $this->addBuildCriteriaComment($script); - $this->addBuildCriteriaOpen($script); - $this->addBuildCriteriaBody($script); - $this->addBuildCriteriaClose($script); - } - - /** - * Adds comment for the buildCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildCriteria() - **/ - protected function addBuildCriteriaComment(&$script) { - $script .= " - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */"; - } - - /** - * Adds the function declaration of the buildCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildCriteria() - **/ - protected function addBuildCriteriaOpen(&$script) { - $script .= " - public function buildCriteria() - {"; - } - - /** - * Adds the function body of the buildCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildCriteria() - **/ - protected function addBuildCriteriaBody(&$script) { - $script .= " - \$criteria = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME); -"; - foreach ($this->getTable()->getColumns() as $col) { - $clo = strtolower($col->getName()); - $script .= " - if (\$this->isColumnModified(".$this->getColumnConstant($col).")) \$criteria->add(".$this->getColumnConstant($col).", \$this->$clo);"; - } - } - - /** - * Adds the function close of the buildCriteria method - * @param string &$script The script will be modified in this method. - * @see addBuildCriteria() - **/ - protected function addBuildCriteriaClose(&$script) { - $script .= " - - return \$criteria; - } -"; - } - - /** - * Adds the function body for the delete function - * @param string &$script The script will be modified in this method. - * @see addDelete() - **/ - protected function addDeleteBody(&$script) { - $script .= " - if (\$this->isDeleted()) { - throw new PropelException(\"This object has already been deleted.\"); - } - - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - \$con->beginTransaction(); - try {"; - if($this->getGeneratorConfig()->getBuildProperty('addHooks')) { - $script .= " - \$ret = \$this->preDelete(\$con);"; - // apply behaviors - $this->applyBehaviorModifier('preDelete', $script, " "); - $script .= " - if (\$ret) { - ".$this->getPeerClassname()."::doDelete(\$this, \$con); - \$this->postDelete(\$con);"; - // apply behaviors - $this->applyBehaviorModifier('postDelete', $script, " "); - $script .= " - \$con->commit(); - \$this->setDeleted(true); - } else { - \$con->commit(); - }"; - } else { - // apply behaviors - $this->applyBehaviorModifier('preDelete', $script, " "); - $script .= " - ".$this->getPeerClassname()."::doDelete(\$this, \$con);"; - // apply behaviors - $this->applyBehaviorModifier('postDelete', $script, " "); - $script .= " - \$con->commit(); - \$this->setDeleted(true);"; - } - - $script .= " - } catch (PropelException \$e) { - \$con->rollBack(); - throw \$e; - }"; - } - - /** - * Adds a reload() method to re-fetch the data for this object from the database. - * @param string &$script The script will be modified in this method. - */ - protected function addReload(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. - * - * This will only work if the object has been saved and has a valid primary key set. - * - * @param boolean \$deep (optional) Whether to also de-associated any related objects. - * @param PropelPDO \$con (optional) The PropelPDO connection to use. - * @return void - * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db - */ - public function reload(\$deep = false, PropelPDO \$con = null) - { - if (\$this->isDeleted()) { - throw new PropelException(\"Cannot reload a deleted object.\"); - } - - if (\$this->isNew()) { - throw new PropelException(\"Cannot reload an unsaved object.\"); - } - - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_READ); - } - - // We don't need to alter the object instance pool; we're just modifying this instance - // already in the pool. - - \$stmt = ".$this->getPeerClassname()."::doSelectStmt(\$this->buildPkeyCriteria(), \$con); - \$row = \$stmt->fetch(PDO::FETCH_NUM); - \$stmt->closeCursor(); - if (!\$row) { - throw new PropelException('Cannot find matching row in the database to reload object values.'); - } - \$this->hydrate(\$row, 0, true); // rehydrate -"; - - // support for lazy load columns - foreach ($table->getColumns() as $col) { - if ($col->isLazyLoad()) { - $clo = strtolower($col->getName()); - $script .= " - // Reset the $clo lazy-load column - \$this->" . $clo . " = null; - \$this->".$clo."_isLoaded = false; -"; - } - } - - $script .= " - if (\$deep) { // also de-associate any related objects? -"; - - foreach ($table->getForeignKeys() as $fk) { - $varName = $this->getFKVarName($fk); - $script .= " - \$this->".$varName." = null;"; - } - - foreach ($table->getReferrers() as $refFK) { - if ($refFK->isLocalPrimaryKey()) { - $script .= " - \$this->".$this->getPKRefFKVarName($refFK)." = null; -"; - } else { - $script .= " - \$this->".$this->getRefFKCollVarName($refFK)." = null; - \$this->".$this->getRefFKLastCriteriaVarName($refFK)." = null; -"; - } - } - - $script .= " - } // if (deep) - } -"; - } // addReload() - - /** - * Gets variable name for the Criteria which was used to fetch the objects which - * referencing current table by specified foreign key. - * @param ForeignKey $fk - * @return string - */ - protected function getRefFKLastCriteriaVarName(ForeignKey $fk) - { - return 'last' . $this->getRefFKPhpNameAffix($fk, $plural = false) . 'Criteria'; - } - - - - /** - * Adds the accessor (getter) method for getting an fkey related object. - * @param string &$script The script will be modified in this method. - */ - protected function addFKAccessor(&$script, ForeignKey $fk) - { - $table = $this->getTable(); - - $varName = $this->getFKVarName($fk); - $pCollName = $this->getFKPhpNameAffix($fk, $plural = true); - - $fkPeerBuilder = $this->getNewPeerBuilder($this->getForeignTable($fk)); - $fkObjectBuilder = $this->getNewObjectBuilder($this->getForeignTable($fk))->getStubObjectBuilder(); - $className = $fkObjectBuilder->getClassname(); // get the Classname that has maybe a prefix - - $and = ""; - $comma = ""; - $conditional = ""; - $argmap = array(); // foreign -> local mapping - $argsize = 0; - foreach ($fk->getLocalColumns() as $columnName) { - - $lfmap = $fk->getLocalForeignMapping(); - - $localColumn = $table->getColumn($columnName); - $foreignColumn = $fk->getForeignTable()->getColumn($lfmap[$columnName]); - - $column = $table->getColumn($columnName); - $cptype = $column->getPhpType(); - $clo = strtolower($column->getName()); - - if ($cptype == "integer" || $cptype == "float" || $cptype == "double") { - $conditional .= $and . "\$this->". $clo ." != 0"; - } elseif ($cptype == "string") { - $conditional .= $and . "(\$this->" . $clo ." !== \"\" && \$this->".$clo." !== null)"; - } else { - $conditional .= $and . "\$this->" . $clo ." !== null"; - } - - $argmap[] = array('foreign' => $foreignColumn, 'local' => $localColumn); - $and = " && "; - $comma = ", "; - $argsize = $argsize + 1; - } - - // If the related column is a primary kay and if it's a simple association, - // The use retrieveByPk() instead of doSelect() to take advantage of instance pooling - $useRetrieveByPk = count($argmap) == 1 && $argmap[0]['foreign']->isPrimaryKey(); - - $script .= " - - /** - * Get the associated $className object - * - * @param PropelPDO Optional Connection object. - * @return $className The associated $className object. - * @throws PropelException - */ - public function get".$this->getFKPhpNameAffix($fk, $plural = false)."(PropelPDO \$con = null) - {"; - $script .= " - if (\$this->$varName === null && ($conditional)) {"; - if ($useRetrieveByPk) { - $script .= " - \$this->$varName = ".$fkPeerBuilder->getPeerClassname()."::retrieveByPk(\$this->$clo);"; - } else { - $script .= " - \$c = new Criteria(".$fkPeerBuilder->getPeerClassname()."::DATABASE_NAME);"; - foreach ($argmap as $el) { - $fcol = $el['foreign']; - $lcol = $el['local']; - $clo = strtolower($lcol->getName()); - $script .= " - \$c->add(".$fkPeerBuilder->getColumnConstant($fcol).", \$this->".$clo.");"; - } - $script .= " - \$this->$varName = ".$fkPeerBuilder->getPeerClassname()."::doSelectOne(\$c, \$con);"; - } - if ($fk->isLocalPrimaryKey()) { - $script .= " - // Because this foreign key represents a one-to-one relationship, we will create a bi-directional association. - \$this->{$varName}->set".$this->getRefFKPhpNameAffix($fk, $plural = false)."(\$this);"; - } else { - $script .= " - /* The following can be used additionally to - guarantee the related object contains a reference - to this object. This level of coupling may, however, be - undesirable since it could result in an only partially populated collection - in the referenced object. - \$this->{$varName}->add".$this->getRefFKPhpNameAffix($fk, $plural = true)."(\$this); - */"; - } - - $script .= " - } - return \$this->$varName; - } -"; - - } // addFKAccessor - - - /** - * Adds the method that fetches fkey-related (referencing) objects but also joins in data from another table. - * @param string &$script The script will be modified in this method. - */ - protected function addRefFKGetJoinMethods(&$script, ForeignKey $refFK) - { - $table = $this->getTable(); - $tblFK = $refFK->getTable(); - $join_behavior = $this->getGeneratorConfig()->getBuildProperty('useLeftJoinsInDoJoinMethods') ? 'Criteria::LEFT_JOIN' : 'Criteria::INNER_JOIN'; - - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $relCol = $this->getRefFKPhpNameAffix($refFK, $plural=true); - $collName = $this->getRefFKCollVarName($refFK); - $lastCriteriaName = $this->getRefFKLastCriteriaVarName($refFK); - - $fkPeerBuilder = $this->getNewPeerBuilder($tblFK); - - $lastTable = ""; - foreach ($tblFK->getForeignKeys() as $fk2) { - - $tblFK2 = $this->getForeignTable($fk2); - $doJoinGet = !$tblFK2->isForReferenceOnly(); - - // it doesn't make sense to join in rows from the curent table, since we are fetching - // objects related to *this* table (i.e. the joined rows will all be the same row as current object) - if ($this->getTable()->getPhpName() == $tblFK2->getPhpName()) { - $doJoinGet = false; - } - - $relCol2 = $this->getFKPhpNameAffix($fk2, $plural = false); - - if ( $this->getRelatedBySuffix($refFK) != "" && - ($this->getRelatedBySuffix($refFK) == $this->getRelatedBySuffix($fk2))) { - $doJoinGet = false; - } - - if ($doJoinGet) { - $script .= " - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this ".$table->getPhpName()." is new, it will return - * an empty collection; or if this ".$table->getPhpName()." has previously - * been saved, it will retrieve related $relCol from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in ".$table->getPhpName().". - */ - public function get".$relCol."Join".$relCol2."(\$criteria = null, \$con = null, \$join_behavior = $join_behavior) - {"; - $script .= " - if (\$criteria === null) { - \$criteria = new Criteria($peerClassname::DATABASE_NAME); - } - elseif (\$criteria instanceof Criteria) - { - \$criteria = clone \$criteria; - } - - if (\$this->$collName === null) { - if (\$this->isNew()) { - \$this->$collName = array(); - } else { -"; - foreach ($refFK->getForeignColumns() as $columnName) { - $column = $table->getColumn($columnName); - $flMap = $refFK->getForeignLocalMapping(); - $colFKName = $flMap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); - if ($colFK === null) { - throw new EngineException("Column $colFKName not found in " . $tblFK->getName()); - } - $clo = strtolower($column->getName()); - $script .= " - \$criteria->add(".$fkPeerBuilder->getColumnConstant($colFK).", \$this->$clo); -"; - } // end foreach ($fk->getForeignColumns() - - $script .= " - \$this->$collName = ".$fkPeerBuilder->getPeerClassname()."::doSelectJoin$relCol2(\$criteria, \$con, \$join_behavior); - } - } else { - // the following code is to determine if a new query is - // called for. If the criteria is the same as the last - // one, just return the collection. -"; - foreach ($refFK->getForeignColumns() as $columnName) { - $column = $table->getColumn($columnName); - $flMap = $refFK->getForeignLocalMapping(); - $colFKName = $flMap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); - $clo = strtolower($column->getName()); - $script .= " - \$criteria->add(".$fkPeerBuilder->getColumnConstant($colFK).", \$this->$clo); -"; - } /* end foreach ($fk->getForeignColumns() */ - - $script .= " - if (!isset(\$this->$lastCriteriaName) || !\$this->".$lastCriteriaName."->equals(\$criteria)) { - \$this->$collName = ".$fkPeerBuilder->getPeerClassname()."::doSelectJoin$relCol2(\$criteria, \$con, \$join_behavior); - } - } - \$this->$lastCriteriaName = \$criteria; - - return \$this->$collName; - } -"; - } /* end if ($doJoinGet) */ - - } /* end foreach ($tblFK->getForeignKeys() as $fk2) { */ - - } // function - - /** - * Adds the method that initializes the referrer fkey collection. - * @param string &$script The script will be modified in this method. - */ - protected function addRefFKInit(&$script, ForeignKey $refFK) { - - $relCol = $this->getRefFKPhpNameAffix($refFK, $plural = true); - $collName = $this->getRefFKCollVarName($refFK); - - $script .= " - /** - * Initializes the $collName collection (array). - * - * By default this just sets the $collName collection to an empty array (like clear$collName()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @return void - */ - public function init$relCol() - { - \$this->$collName = array(); - } -"; - } // addRefererInit() - - /** - * Adds the method that adds an object into the referrer fkey collection. - * @param string &$script The script will be modified in this method. - */ - protected function addRefFKAdd(&$script, ForeignKey $refFK) - { - $tblFK = $refFK->getTable(); - - $joinedTableObjectBuilder = $this->getNewObjectBuilder($refFK->getTable()); - $className = $joinedTableObjectBuilder->getObjectClassname(); - - $collName = $this->getRefFKCollVarName($refFK); - - $script .= " - /** - * Method called to associate a $className object to this object - * through the $className foreign key attribute. - * - * @param $className \$l $className - * @return void - * @throws PropelException - */ - public function add".$this->getRefFKPhpNameAffix($refFK, $plural = false)."($className \$l) - { - if (\$this->$collName === null) { - \$this->init".$this->getRefFKPhpNameAffix($refFK, $plural = true)."(); - } - if (!in_array(\$l, \$this->$collName, true)) { // only add it if the **same** object is not already associated - array_push(\$this->$collName, \$l); - \$l->set".$this->getFKPhpNameAffix($refFK, $plural = false)."(\$this); - } - } -"; - } // addRefererAdd - - /** - * Adds the method that returns the size of the referrer fkey collection. - * @param string &$script The script will be modified in this method. - */ - protected function addRefFKCount(&$script, ForeignKey $refFK) - { - $table = $this->getTable(); - $tblFK = $refFK->getTable(); - - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - - $fkPeerBuilder = $this->getNewPeerBuilder($refFK->getTable()); - $relCol = $this->getRefFKPhpNameAffix($refFK, $plural = true); - - $collName = $this->getRefFKCollVarName($refFK); - $lastCriteriaName = $this->getRefFKLastCriteriaVarName($refFK); - - $className = $fkPeerBuilder->getObjectClassname(); - - $script .= " - /** - * Returns the number of related $className objects. - * - * @param Criteria \$criteria - * @param boolean \$distinct - * @param PropelPDO \$con - * @return int Count of related $className objects. - * @throws PropelException - */ - public function count$relCol(Criteria \$criteria = null, \$distinct = false, PropelPDO \$con = null) - {"; - - $script .= " - if (\$criteria === null) { - \$criteria = new Criteria($peerClassname::DATABASE_NAME); - } else { - \$criteria = clone \$criteria; - } - - if (\$distinct) { - \$criteria->setDistinct(); - } - - \$count = null; - - if (\$this->$collName === null) { - if (\$this->isNew()) { - \$count = 0; - } else { -"; - foreach ($refFK->getLocalColumns() as $colFKName) { - // $colFKName is local to the referring table (i.e. foreign to this table) - $lfmap = $refFK->getLocalForeignMapping(); - $localColumn = $this->getTable()->getColumn($lfmap[$colFKName]); - $colFK = $refFK->getTable()->getColumn($colFKName); - $clo = strtolower($localColumn->getName()); - $script .= " - \$criteria->add(".$fkPeerBuilder->getColumnConstant($colFK).", \$this->$clo); -"; - } // end foreach ($fk->getForeignColumns() - - $script .= " - \$count = ".$fkPeerBuilder->getPeerClassname()."::doCount(\$criteria, false, \$con); - } - } else { - // criteria has no effect for a new object - if (!\$this->isNew()) { - // the following code is to determine if a new query is - // called for. If the criteria is the same as the last - // one, just return count of the collection. -"; - foreach ($refFK->getLocalColumns() as $colFKName) { - // $colFKName is local to the referring table (i.e. foreign to this table) - $lfmap = $refFK->getLocalForeignMapping(); - $localColumn = $this->getTable()->getColumn($lfmap[$colFKName]); - $colFK = $refFK->getTable()->getColumn($colFKName); - $clo = strtolower($localColumn->getName()); - $script .= " - - \$criteria->add(".$fkPeerBuilder->getColumnConstant($colFK).", \$this->$clo); -"; - } // foreach ($fk->getForeignColumns() - $script .= " - if (!isset(\$this->$lastCriteriaName) || !\$this->".$lastCriteriaName."->equals(\$criteria)) { - \$count = ".$fkPeerBuilder->getPeerClassname()."::doCount(\$criteria, false, \$con); - } else { - \$count = count(\$this->$collName); - } - } else { - \$count = count(\$this->$collName); - } - } - return \$count; - } -"; - } // addRefererCount - - /** - * Adds the method that returns the referrer fkey collection. - * @param string &$script The script will be modified in this method. - */ - protected function addRefFKGet(&$script, ForeignKey $refFK) - { - $table = $this->getTable(); - $tblFK = $refFK->getTable(); - - $peerClassname = $this->getStubPeerBuilder()->getClassname(); - $fkPeerBuilder = $this->getNewPeerBuilder($refFK->getTable()); - $relCol = $this->getRefFKPhpNameAffix($refFK, $plural = true); - - $collName = $this->getRefFKCollVarName($refFK); - $lastCriteriaName = $this->getRefFKLastCriteriaVarName($refFK); - - $className = $fkPeerBuilder->getObjectClassname(); - - $script .= " - /** - * Gets an array of $className objects which contain a foreign key that references this object. - * - * If this collection has already been initialized with an identical Criteria, it returns the collection. - * Otherwise if this ".$this->getObjectClassname()." has previously been saved, it will retrieve - * related $relCol from storage. If this ".$this->getObjectClassname()." is new, it will return - * an empty collection or the current collection, the criteria is ignored on a new object. - * - * @param PropelPDO \$con - * @param Criteria \$criteria - * @return array {$className}[] - * @throws PropelException - */ - public function get$relCol(\$criteria = null, PropelPDO \$con = null) - {"; - - $script .= " - if (\$criteria === null) { - \$criteria = new Criteria($peerClassname::DATABASE_NAME); - } - elseif (\$criteria instanceof Criteria) - { - \$criteria = clone \$criteria; - } - - if (\$this->$collName === null) { - if (\$this->isNew()) { - \$this->$collName = array(); - } else { -"; - foreach ($refFK->getLocalColumns() as $colFKName) { - // $colFKName is local to the referring table (i.e. foreign to this table) - $lfmap = $refFK->getLocalForeignMapping(); - $localColumn = $this->getTable()->getColumn($lfmap[$colFKName]); - $colFK = $refFK->getTable()->getColumn($colFKName); - - $clo = strtolower($localColumn->getName()); - - $script .= " - \$criteria->add(".$fkPeerBuilder->getColumnConstant($colFK).", \$this->$clo); -"; - } // end foreach ($fk->getForeignColumns() - - $script .= " - ".$fkPeerBuilder->getPeerClassname()."::addSelectColumns(\$criteria); - \$this->$collName = ".$fkPeerBuilder->getPeerClassname()."::doSelect(\$criteria, \$con); - } - } else { - // criteria has no effect for a new object - if (!\$this->isNew()) { - // the following code is to determine if a new query is - // called for. If the criteria is the same as the last - // one, just return the collection. -"; - foreach ($refFK->getLocalColumns() as $colFKName) { - // $colFKName is local to the referring table (i.e. foreign to this table) - $lfmap = $refFK->getLocalForeignMapping(); - $localColumn = $this->getTable()->getColumn($lfmap[$colFKName]); - $colFK = $refFK->getTable()->getColumn($colFKName); - $clo = strtolower($localColumn->getName()); - $script .= " - - \$criteria->add(".$fkPeerBuilder->getColumnConstant($colFK).", \$this->$clo); -"; - } // foreach ($fk->getForeignColumns() - $script .= " - ".$fkPeerBuilder->getPeerClassname()."::addSelectColumns(\$criteria); - if (!isset(\$this->$lastCriteriaName) || !\$this->".$lastCriteriaName."->equals(\$criteria)) { - \$this->$collName = ".$fkPeerBuilder->getPeerClassname()."::doSelect(\$criteria, \$con); - } - } - } - \$this->$lastCriteriaName = \$criteria; - return \$this->$collName; - } -"; - } // addRefererGet() - - /** - * Adds the method that gets a one-to-one related referrer fkey. - * This is for one-to-one relationship special case. - * @param string &$script The script will be modified in this method. - */ - protected function addPKRefFKGet(&$script, ForeignKey $refFK) - { - $table = $this->getTable(); - $tblFK = $refFK->getTable(); - - $joinedTableObjectBuilder = $this->getNewObjectBuilder($refFK->getTable()); - $joinedTablePeerBuilder = $this->getNewObjectBuilder($refFK->getTable()); - $className = $joinedTableObjectBuilder->getObjectClassname(); - - $varName = $this->getPKRefFKVarName($refFK); - - $script .= " - /** - * Gets a single $className object, which is related to this object by a one-to-one relationship. - * - * @param PropelPDO \$con - * @return $className - * @throws PropelException - */ - public function get".$this->getRefFKPhpNameAffix($refFK, $plural = false)."(PropelPDO \$con = null) - { -"; - $script .= " - if (\$this->$varName === null && !\$this->isNew()) {"; - - $lfmap = $refFK->getLocalForeignMapping(); - - // remember: this object represents the foreign table, - // so we need foreign columns of the reffk to know the local columns - // that we need to set :) - - $localcols = $refFK->getForeignColumns(); - - // we know that at least every column in the primary key of the foreign table - // is represented in this foreign key - - $params = array(); - foreach ($tblFK->getPrimaryKey() as $col) { - $localColumn = $table->getColumn($lfmap[$col->getName()]); - $clo = strtolower($localColumn->getName()); - $params[] = "\$this->$clo"; - } - - $script .= " - \$this->$varName = ".$joinedTableObjectBuilder->getPeerClassname()."::retrieveByPK(".implode(", ", $params).", \$con); - } - - return \$this->$varName; - } -"; - } // addPKRefFKGet() - -} // PHP5ObjectBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5PeerBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5PeerBuilder.php deleted file mode 100644 index bcb486b132..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5PeerBuilder.php +++ /dev/null @@ -1,2761 +0,0 @@ - - * @package propel.generator.builder.om - */ -class PHP5PeerBuilder extends PeerBuilder -{ - - /** - * Validates the current table to make sure that it won't - * result in generated code that will not parse. - * - * This method may emit warnings for code which may cause problems - * and will throw exceptions for errors that will definitely cause - * problems. - */ - protected function validateModel() - { - parent::validateModel(); - - $table = $this->getTable(); - - // Check to see if any of the column constants are PHP reserved words. - $colConstants = array(); - - foreach ($table->getColumns() as $col) { - $colConstants[] = $this->getColumnName($col); - } - - $reservedConstants = array_map('strtoupper', ClassTools::getPhpReservedWords()); - - $intersect = array_intersect($reservedConstants, $colConstants); - if (!empty($intersect)) { - throw new EngineException("One or more of your column names for [" . $table->getName() . "] table conflict with a PHP reserved word (" . implode(", ", $intersect) . ")"); - } - } - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return $this->getBuildProperty('basePrefix') . $this->getStubPeerBuilder()->getUnprefixedClassname(); - } - - /** - * Gets the package for the [base] peer classes. - * @return string - */ - public function getPackage() - { - return parent::getPackage() . ".om"; - } - - public function getNamespace() - { - if ($namespace = parent::getNamespace()) { - if ($this->getGeneratorConfig() && $omns = $this->getGeneratorConfig()->getBuildProperty('namespaceOm')) { - return $namespace . '\\' . $omns; - } else { - return $namespace; - } - } - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) { - - $tableName = $this->getTable()->getName(); - $tableDesc = $this->getTable()->getDescription(); - - $script .= " -/** - * Base static class for performing query and update operations on the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - - $extendingPeerClass = ''; - $parentClass = $this->getBehaviorContent('parentClass'); - if (null !== $parentClass) { - $extendingPeerClass = ' extends ' . $parentClass; - } elseif ($this->basePeerClassname !== 'BasePeer') { - $extendingPeerClass = ' extends ' . $this->basePeerClassname; - } - - $script .= " - * @package propel.generator.".$this->getPackage()." - */ -abstract class ".$this->getClassname(). $extendingPeerClass . " { -"; - } - - protected function addClassBody(&$script) - { - $this->declareClassFromBuilder($this->getStubPeerBuilder()); - $this->declareClassFromBuilder($this->getStubObjectBuilder()); - parent::addClassBody($script); - $this->declareClasses('Propel', 'PropelException', 'PropelPDO', 'BasePeer', 'Criteria', 'PDO', 'PDOStatement'); - } - - /** - * Closes class. - * Adds closing brace at end of class and the static map builder registration code. - * @param string &$script The script will be modified in this method. - * @see addStaticTableMapRegistration() - */ - protected function addClassClose(&$script) - { - // apply behaviors - $this->applyBehaviorModifier('staticMethods', $script, " "); - - $script .= " -} // " . $this->getClassname() . " -"; - $this->addStaticTableMapRegistration($script); - } - - /** - * Adds the static map builder registration code. - * @param string &$script The script will be modified in this method. - */ - protected function addStaticTableMapRegistration(&$script) - { - $table = $this->getTable(); - - $script .= " -// This is the static code needed to register the TableMap for this table with the main Propel class. -// -".$this->getClassName()."::buildTableMap(); - -"; - $this->applyBehaviorModifier('peerFilter', $script, ""); - } - - public function getTableMapClass() - { - return $this->getTablePhpName() . 'TableMap'; - } - - public function getTablePhpName() - { - return ($this->getTable()->isAbstract() ? '' : $this->getStubObjectBuilder()->getClassname()); - } - - /** - * Adds constant and variable declarations that go at the top of the class. - * @param string &$script The script will be modified in this method. - * @see addColumnNameConstants() - */ - protected function addConstantsAndAttributes(&$script) - { - $dbName = $this->getDatabase()->getName(); - $tableName = $this->getTable()->getName(); - $tablePhpName = $this->getTable()->isAbstract() ? '' : addslashes($this->getStubObjectBuilder()->getFullyQualifiedClassname()); - $script .= " - /** the default database name for this class */ - const DATABASE_NAME = '$dbName'; - - /** the table name for this class */ - const TABLE_NAME = '$tableName'; - - /** the related Propel class for this table */ - const OM_CLASS = '$tablePhpName'; - - /** A class that can be returned by this peer. */ - const CLASS_DEFAULT = '".$this->getStubObjectBuilder()->getClasspath()."'; - - /** the related TableMap class for this table */ - const TM_CLASS = '".$this->getTableMapClass()."'; - - /** The total number of columns. */ - const NUM_COLUMNS = ".$this->getTable()->getNumColumns()."; - - /** The number of lazy-loaded columns. */ - const NUM_LAZY_LOAD_COLUMNS = ".$this->getTable()->getNumLazyLoadColumns()."; -"; - $this->addColumnNameConstants($script); - $this->addInheritanceColumnConstants($script); - - $script .= " - /** - * An identiy map to hold any loaded instances of ".$this->getObjectClassname()." objects. - * This must be public so that other peer classes can access this when hydrating from JOIN - * queries. - * @var array ".$this->getObjectClassname()."[] - */ - public static \$instances = array(); - -"; - - // apply behaviors - $this->applyBehaviorModifier('staticAttributes', $script, " "); - - $this->addFieldNamesAttribute($script); - $this->addFieldKeysAttribute($script); - } - - /** - * Adds the COLUMN_NAME contants to the class definition. - * @param string &$script The script will be modified in this method. - */ - protected function addColumnNameConstants(&$script) - { - foreach ($this->getTable()->getColumns() as $col) { - $script .= " - /** the column name for the ".strtoupper($col->getName()) ." field */ - const ".$this->getColumnName($col) ." = '" . $this->getTable()->getName() . ".".strtoupper($col->getName())."'; -"; - } // foreach - } - - protected function addFieldNamesAttribute(&$script) - { - $table = $this->getTable(); - - $tableColumns = $table->getColumns(); - - $script .= " - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::\$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static \$fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ("; - foreach ($tableColumns as $col) { - $script .= "'".$col->getPhpName()."', "; - } - $script .= "), - BasePeer::TYPE_STUDLYPHPNAME => array ("; - foreach ($tableColumns as $col) { - $script .= "'".$col->getStudlyPhpName()."', "; - } - $script .= "), - BasePeer::TYPE_COLNAME => array ("; - foreach ($tableColumns as $col) { - $script .= $this->getColumnConstant($col, 'self').", "; - } - $script .= "), - BasePeer::TYPE_RAW_COLNAME => array ("; - foreach ($tableColumns as $col) { - $script .= "'" . $col->getConstantColumnName() . "', "; - } - $script .= "), - BasePeer::TYPE_FIELDNAME => array ("; - foreach ($tableColumns as $col) { - $script .= "'".$col->getName()."', "; - } - $script .= "), - BasePeer::TYPE_NUM => array ("; - foreach ($tableColumns as $num => $col) { - $script .= "$num, "; - } - $script .= ") - ); -"; - } - - protected function addFieldKeysAttribute(&$script) - { - $table = $this->getTable(); - - $tableColumns = $table->getColumns(); - - $script .= " - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::\$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 - */ - private static \$fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ("; - foreach ($tableColumns as $num => $col) { - $script .= "'".$col->getPhpName()."' => $num, "; - } - $script .= "), - BasePeer::TYPE_STUDLYPHPNAME => array ("; - foreach ($tableColumns as $num => $col) { - $script .= "'".$col->getStudlyPhpName()."' => $num, "; - } - $script .= "), - BasePeer::TYPE_COLNAME => array ("; - foreach ($tableColumns as $num => $col) { - $script .= $this->getColumnConstant($col, 'self')." => $num, "; - } - $script .= "), - BasePeer::TYPE_RAW_COLNAME => array ("; - foreach ($tableColumns as $num => $col) { - $script .= "'" . $col->getConstantColumnName() . "' => $num, "; - } - $script .= "), - BasePeer::TYPE_FIELDNAME => array ("; - foreach ($tableColumns as $num => $col) { - $script .= "'".$col->getName()."' => $num, "; - } - $script .= "), - BasePeer::TYPE_NUM => array ("; - foreach ($tableColumns as $num => $col) { - $script .= "$num, "; - } - $script .= ") - ); -"; - } // addFielKeysAttribute - - - protected function addGetFieldNames(&$script) - { - $script .= " - /** - * Returns an array of field names. - * - * @param string \$type The type of fieldnames to return: - * One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames(\$type = BasePeer::TYPE_PHPNAME) - { - if (!array_key_exists(\$type, self::\$fieldNames)) { - throw new PropelException('Method getFieldNames() expects the parameter \$type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . \$type . ' was given.'); - } - return self::\$fieldNames[\$type]; - } -"; - - } // addGetFieldNames() - - protected function addTranslateFieldName(&$script) - { - $script .= " - /** - * Translates a fieldname to another type - * - * @param string \$name field name - * @param string \$fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME - * BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM - * @param string \$toType One of the class type constants - * @return string translated name of the field. - * @throws PropelException - if the specified name could not be found in the fieldname mappings. - */ - static public function translateFieldName(\$name, \$fromType, \$toType) - { - \$toNames = self::getFieldNames(\$toType); - \$key = isset(self::\$fieldKeys[\$fromType][\$name]) ? self::\$fieldKeys[\$fromType][\$name] : null; - if (\$key === null) { - throw new PropelException(\"'\$name' could not be found in the field names of type '\$fromType'. These are: \" . print_r(self::\$fieldKeys[\$fromType], true)); - } - return \$toNames[\$key]; - } -"; - } // addTranslateFieldName() - - /** - * Adds the buildTableMap() method. - * @param string &$script The script will be modified in this method. - */ - protected function addBuildTableMap(&$script) - { - $this->declareClassFromBuilder($this->getTableMapBuilder()); - $script .= " - /** - * Add a TableMap instance to the database for this peer class. - */ - public static function buildTableMap() - { - \$dbMap = Propel::getDatabaseMap(".$this->getClassname()."::DATABASE_NAME); - if (!\$dbMap->hasTable(".$this->getClassname()."::TABLE_NAME)) - { - \$dbMap->addTableObject(new ".$this->getTableMapClass()."()); - } - } -"; - } - - /** - * Adds the CLASSKEY_* and CLASSNAME_* constants used for inheritance. - * @param string &$script The script will be modified in this method. - */ - public function addInheritanceColumnConstants(&$script) - { - if ($this->getTable()->getChildrenColumn()) { - - $col = $this->getTable()->getChildrenColumn(); - $cfc = $col->getPhpName(); - - if ($col->isEnumeratedClasses()) { - - if ($col->isPhpPrimitiveNumericType()) $quote = ""; - else $quote = '"'; - - foreach ($col->getChildren() as $child) { - $childBuilder = $this->getMultiExtendObjectBuilder(); - $childBuilder->setChild($child); - - $script .= " - /** A key representing a particular subclass */ - const CLASSKEY_".strtoupper($child->getKey())." = '" . $child->getKey() . "'; -"; - - if (strtoupper($child->getClassname()) != strtoupper($child->getKey())) { - $script .= " - /** A key representing a particular subclass */ - const CLASSKEY_".strtoupper($child->getClassname())." = '" . $child->getKey() . "'; -"; - } - - $script .= " - /** A class that can be returned by this peer. */ - const CLASSNAME_".strtoupper($child->getKey())." = '". $childBuilder->getClasspath() . "'; -"; - } /* foreach children */ - } /* if col->isenumerated...() */ - } /* if table->getchildrencolumn() */ - - } // - - /** - * Adds the alias() utility method. - * @param string &$script The script will be modified in this method. - */ - protected function addAlias(&$script) - { - $script .= " - /** - * Convenience method which changes table.column to alias.column. - * - * Using this method you can maintain SQL abstraction while using column aliases. - * - * \$c->addAlias(\"alias1\", TablePeer::TABLE_NAME); - * \$c->addJoin(TablePeer::alias(\"alias1\", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); - * - * @param string \$alias The alias for the current table. - * @param string \$column The column name for current table. (i.e. ".$this->getPeerClassname()."::COLUMN_NAME). - * @return string - */ - public static function alias(\$alias, \$column) - { - return str_replace(".$this->getPeerClassname()."::TABLE_NAME.'.', \$alias.'.', \$column); - } -"; - } // addAliasMethod - - /** - * Adds the addSelectColumns() method. - * @param string &$script The script will be modified in this method. - */ - protected function addAddSelectColumns(&$script) - { - $script .= " - /** - * Add all the columns needed to create a new object. - * - * Note: any columns that were marked with lazyLoad=\"true\" in the - * XML schema will not be added to the select list and only loaded - * on demand. - * - * @param Criteria \$criteria object containing the columns to add. - * @param string \$alias optional table alias - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function addSelectColumns(Criteria \$criteria, \$alias = null) - { - if (null === \$alias) {"; - foreach ($this->getTable()->getColumns() as $col) { - if (!$col->isLazyLoad()) { - $script .= " - \$criteria->addSelectColumn(".$this->getPeerClassname()."::".$this->getColumnName($col).");"; - } // if !col->isLazyLoad - } // foreach - $script .= " - } else {"; - foreach ($this->getTable()->getColumns() as $col) { - if (!$col->isLazyLoad()) { - $script .= " - \$criteria->addSelectColumn(\$alias . '." . $col->getConstantColumnName()."');"; - } // if !col->isLazyLoad - } // foreach - $script .= " - }"; - $script .=" - } -"; - } // addAddSelectColumns() - - /** - * Adds the doCount() method. - * @param string &$script The script will be modified in this method. - */ - protected function addDoCount(&$script) - { - $script .= " - /** - * Returns the number of rows matching criteria. - * - * @param Criteria \$criteria - * @param boolean \$distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO \$con - * @return int Number of matching rows. - */ - public static function doCount(Criteria \$criteria, \$distinct = false, PropelPDO \$con = null) - { - // we may modify criteria, so copy it first - \$criteria = clone \$criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - \$criteria->setPrimaryTableName(".$this->getPeerClassname()."::TABLE_NAME); - - if (\$distinct && !in_array(Criteria::DISTINCT, \$criteria->getSelectModifiers())) { - \$criteria->setDistinct(); - } - - if (!\$criteria->hasSelectClause()) { - ".$this->getPeerClassname()."::addSelectColumns(\$criteria); - } - - \$criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - \$criteria->setDbName(self::DATABASE_NAME); // Set the correct dbName - - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_READ); - }"; - - // apply behaviors - $this->applyBehaviorModifier('preSelect', $script); - - $script .= " - // BasePeer returns a PDOStatement - \$stmt = ".$this->basePeerClassname."::doCount(\$criteria, \$con); - - if (\$row = \$stmt->fetch(PDO::FETCH_NUM)) { - \$count = (int) \$row[0]; - } else { - \$count = 0; // no rows returned; we infer that means 0 matches. - } - \$stmt->closeCursor(); - return \$count; - }"; - } - - /** - * Adds the doSelectOne() method. - * @param string &$script The script will be modified in this method. - */ - protected function addDoSelectOne(&$script) - { - $script .= " - /** - * Method to select one object from the DB. - * - * @param Criteria \$criteria object used to create the SELECT statement. - * @param PropelPDO \$con - * @return ".$this->getObjectClassname()." - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectOne(Criteria \$criteria, PropelPDO \$con = null) - { - \$critcopy = clone \$criteria; - \$critcopy->setLimit(1); - \$objects = ".$this->getPeerClassname()."::doSelect(\$critcopy, \$con); - if (\$objects) { - return \$objects[0]; - } - return null; - }"; - } - - /** - * Adds the doSelect() method. - * @param string &$script The script will be modified in this method. - */ - protected function addDoSelect(&$script) - { - $script .= " - /** - * Method to do selects. - * - * @param Criteria \$criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO \$con - * @return array Array of selected Objects - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelect(Criteria \$criteria, PropelPDO \$con = null) - { - return ".$this->getPeerClassname()."::populateObjects(".$this->getPeerClassname()."::doSelectStmt(\$criteria, \$con)); - }"; - } - - /** - * Adds the doSelectStmt() method. - * @param string &$script The script will be modified in this method. - */ - protected function addDoSelectStmt(&$script) - { - - $script .= " - /** - * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement. - * - * Use this method directly if you want to work with an executed statement durirectly (for example - * to perform your own object hydration). - * - * @param Criteria \$criteria The Criteria object used to build the SELECT statement. - * @param PropelPDO \$con The connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return PDOStatement The executed PDOStatement object. - * @see ".$this->basePeerClassname."::doSelect() - */ - public static function doSelectStmt(Criteria \$criteria, PropelPDO \$con = null) - { - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_READ); - } - - if (!\$criteria->hasSelectClause()) { - \$criteria = clone \$criteria; - ".$this->getPeerClassname()."::addSelectColumns(\$criteria); - } - - // Set the correct dbName - \$criteria->setDbName(self::DATABASE_NAME);"; - // apply behaviors - if ($this->hasBehaviorModifier('preSelect')) - { - $this->applyBehaviorModifier('preSelect', $script); - } - $script .= " - - // BasePeer returns a PDOStatement - return ".$this->basePeerClassname."::doSelect(\$criteria, \$con); - }"; - } - - /** - * Adds the PHP code to return a instance pool key for the passed-in primary key variable names. - * - * @param array $pkphp An array of PHP var names / method calls representing complete pk. - */ - public function getInstancePoolKeySnippet($pkphp) - { - $pkphp = (array) $pkphp; // make it an array if it is not. - $script = ""; - if (count($pkphp) > 1) { - $script .= "serialize(array("; - $i = 0; - foreach ($pkphp as $pkvar) { - $script .= ($i++ ? ', ' : '') . "(string) $pkvar"; - } - $script .= "))"; - } else { - $script .= "(string) " . $pkphp[0]; - } - return $script; - } - - /** - * Creates a convenience method to add objects to an instance pool. - * @param string &$script The script will be modified in this method. - */ - protected function addAddInstanceToPool(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Adds an object to the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doSelect*() - * methods in your stub classes -- you may need to explicitly add objects - * to the cache in order to ensure that the same objects are always returned by doSelect*() - * and retrieveByPK*() calls. - * - * @param ".$this->getObjectClassname()." \$value A ".$this->getObjectClassname()." object. - * @param string \$key (optional) key to use for instance map (for performance boost if key was already calculated externally). - */ - public static function addInstanceToPool(".$this->getObjectClassname()." \$obj, \$key = null) - { - if (Propel::isInstancePoolingEnabled()) { - if (\$key === null) {"; - - $pks = $this->getTable()->getPrimaryKey(); - - $php = array(); - foreach ($pks as $pk) { - $php[] = '$obj->get' . $pk->getPhpName() . '()'; - } - $script .= " - \$key = ".$this->getInstancePoolKeySnippet($php).";"; - $script .= " - } // if key === null - self::\$instances[\$key] = \$obj; - } - } -"; - } // addAddInstanceToPool() - - /** - * Creates a convenience method to remove objects form an instance pool. - * @param string &$script The script will be modified in this method. - */ - protected function addRemoveInstanceFromPool(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Removes an object from the instance pool. - * - * Propel keeps cached copies of objects in an instance pool when they are retrieved - * from the database. In some cases -- especially when you override doDelete - * methods in your stub classes -- you may need to explicitly remove objects - * from the cache in order to prevent returning objects that no longer exist. - * - * @param mixed \$value A ".$this->getObjectClassname()." object or a primary key value. - */ - public static function removeInstanceFromPool(\$value) - {"; - $script .= " - if (Propel::isInstancePoolingEnabled() && \$value !== null) {"; - $pks = $table->getPrimaryKey(); - - $script .= " - if (is_object(\$value) && \$value instanceof ".$this->getObjectClassname().") {"; - - $php = array(); - foreach ($pks as $pk) { - $php[] = '$value->get' . $pk->getPhpName() . '()'; - } - $script .= " - \$key = ".$this->getInstancePoolKeySnippet($php).";"; - - $script .= " - } elseif (".(count($pks) > 1 ? "is_array(\$value) && count(\$value) === " . count($pks) : "is_scalar(\$value)").") { - // assume we've been passed a primary key"; - - if (count($pks) > 1) { - $php = array(); - for ($i=0; $i < count($pks); $i++) { - $php[] = "\$value[$i]"; - } - } else { - $php = '$value'; - } - $script .= " - \$key = ".$this->getInstancePoolKeySnippet($php).";"; - $script .= " - } else { - \$e = new PropelException(\"Invalid value passed to removeInstanceFromPool(). Expected primary key or ".$this->getObjectClassname()." object; got \" . (is_object(\$value) ? get_class(\$value) . ' object.' : var_export(\$value,true))); - throw \$e; - } - - unset(self::\$instances[\$key]); - } - } // removeInstanceFromPool() -"; - } // addRemoveFromInstancePool() - - /** - * Adds method to clear the instance pool. - * @param string &$script The script will be modified in this method. - */ - protected function addClearInstancePool(&$script) - { - $script .= " - /** - * Clear the instance pool. - * - * @return void - */ - public static function clearInstancePool() - { - self::\$instances = array(); - } - "; - } - - /** - * Adds method to clear the instance pool of related tables. - * @param string &$script The script will be modified in this method. - */ - protected function addClearRelatedInstancePool(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Method to invalidate the instance pool of all tables related to " . $table->getName() . " - * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - {"; - // Handle ON DELETE CASCADE for updating instance pool - - foreach ($table->getReferrers() as $fk) { - - // $fk is the foreign key in the other table, so localTableName will - // actually be the table name of other table - $tblFK = $fk->getTable(); - - $joinedTablePeerBuilder = $this->getNewStubPeerBuilder($tblFK); - $this->declareClassFromBuilder($joinedTablePeerBuilder); - $tblFKPackage = $joinedTablePeerBuilder->getStubPeerBuilder()->getPackage(); - - if (!$tblFK->isForReferenceOnly()) { - // we can't perform operations on tables that are - // not within the schema (i.e. that we have no map for, etc.) - - if ($fk->getOnDelete() == ForeignKey::CASCADE || $fk->getOnDelete() == ForeignKey::SETNULL) { - $script .= " - // Invalidate objects in ".$joinedTablePeerBuilder->getClassname()." instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - ".$joinedTablePeerBuilder->getClassname()."::clearInstancePool();"; - } // if fk is on delete cascade - } // if (! for ref only) - } // foreach - $script .= " - } -"; - } - - /** - * Adds method to get an the instance from the pool, given a key. - * @param string &$script The script will be modified in this method. - */ - protected function addGetInstanceFromPool(&$script) - { - $script .= " - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param string \$key The key (@see getPrimaryKeyHash()) for this instance. - * @return ".$this->getObjectClassname()." Found object or NULL if 1) no instance exists for specified key or 2) instance pooling has been disabled. - * @see getPrimaryKeyHash() - */ - public static function getInstanceFromPool(\$key) - { - if (Propel::isInstancePoolingEnabled()) { - if (isset(self::\$instances[\$key])) { - return self::\$instances[\$key]; - } - } - return null; // just to be explicit - } - "; - } - - /** - * Adds method to get a version of the primary key that can be used as a unique key for identifier map. - * @param string &$script The script will be modified in this method. - */ - protected function addGetPrimaryKeyHash(&$script) - { - $script .= " - /** - * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. - * - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, a serialize()d version of the primary key will be returned. - * - * @param array \$row PropelPDO resultset row. - * @param int \$startcol The 0-based offset for reading from the resultset row. - * @return string A string version of PK or NULL if the components of primary key in result array are all null. - */ - public static function getPrimaryKeyHashFromRow(\$row, \$startcol = 0) - {"; - - // We have to iterate through all the columns so that we know the offset of the primary - // key columns. - $n = 0; - $pk = array(); - $cond = array(); - foreach ($this->getTable()->getColumns() as $col) { - if (!$col->isLazyLoad()) { - if ($col->isPrimaryKey()) { - $part = $n ? "\$row[\$startcol + $n]" : "\$row[\$startcol]"; - $cond[] = $part . " === null"; - $pk[] = $part; - } - $n++; - } - } - - $script .= " - // If the PK cannot be derived from the row, return NULL. - if (".implode(' && ', $cond).") { - return null; - } - return ".$this->getInstancePoolKeySnippet($pk)."; - } -"; - } // addGetPrimaryKeyHash - - /** - * Adds method to get the primary key from a row - * @param string &$script The script will be modified in this method. - */ - protected function addGetPrimaryKeyFromRow(&$script) - { - $script .= " - /** - * Retrieves the primary key from the DB resultset row - * For tables with a single-column primary key, that simple pkey value will be returned. For tables with - * a multi-column primary key, an array of the primary key columns will be returned. - * - * @param array \$row PropelPDO resultset row. - * @param int \$startcol The 0-based offset for reading from the resultset row. - * @return mixed The primary key of the row - */ - public static function getPrimaryKeyFromRow(\$row, \$startcol = 0) - {"; - - // We have to iterate through all the columns so that we know the offset of the primary - // key columns. - $table = $this->getTable(); - $n = 0; - $pks = array(); - foreach ($table->getColumns() as $col) { - if (!$col->isLazyLoad()) { - if ($col->isPrimaryKey()) { - $pk = '(' . $col->getPhpType() . ') ' . ($n ? "\$row[\$startcol + $n]" : "\$row[\$startcol]"); - if ($table->hasCompositePrimaryKey()) { - $pks[] = $pk; - } - } - $n++; - } - } - if ($table->hasCompositePrimaryKey()) { - $script .= " - return array(" . implode($pks, ', '). ");"; - } else { - $script .= " - return " . $pk . ";"; - } - $script .= " - } - "; - } // addGetPrimaryKeyFromRow - - /** - * Adds the populateObjects() method. - * @param string &$script The script will be modified in this method. - */ - protected function addPopulateObjects(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * The returned array will contain objects of the default type or - * objects that inherit from the default. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function populateObjects(PDOStatement \$stmt) - { - \$results = array(); - "; - if (!$table->getChildrenColumn()) { - $script .= " - // set the class once to avoid overhead in the loop - \$cls = ".$this->getPeerClassname()."::getOMClass(false);"; - } - - $script .= " - // populate the object(s) - while (\$row = \$stmt->fetch(PDO::FETCH_NUM)) { - \$key = ".$this->getPeerClassname()."::getPrimaryKeyHashFromRow(\$row, 0); - if (null !== (\$obj = ".$this->getPeerClassname()."::getInstanceFromPool(\$key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // \$obj->hydrate(\$row, 0, true); // rehydrate - \$results[] = \$obj; - } else {"; - if ($table->getChildrenColumn()) { - $script .= " - // class must be set each time from the record row - \$cls = ".$this->getPeerClassname()."::getOMClass(\$row, 0); - \$cls = substr('.'.\$cls, strrpos('.'.\$cls, '.') + 1); - " . $this->buildObjectInstanceCreationCode('$obj', '$cls') . " - \$obj->hydrate(\$row); - \$results[] = \$obj; - ".$this->getPeerClassname()."::addInstanceToPool(\$obj, \$key);"; - } else { - $script .= " - " . $this->buildObjectInstanceCreationCode('$obj', '$cls') . " - \$obj->hydrate(\$row); - \$results[] = \$obj; - ".$this->getPeerClassname()."::addInstanceToPool(\$obj, \$key);"; - } - $script .= " - } // if key exists - } - \$stmt->closeCursor(); - return \$results; - }"; - } - - /** - * Adds the populateObject() method. - * @param string &$script The script will be modified in this method. - */ - protected function addPopulateObject(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Populates an object of the default type or an object that inherit from the default. - * - * @param array \$row PropelPDO resultset row. - * @param int \$startcol The 0-based offset for reading from the resultset row. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - * @return array (" . $this->getStubObjectBuilder()->getClassName(). " object, last column rank) - */ - public static function populateObject(\$row, \$startcol = 0) - { - \$key = ".$this->getPeerClassname()."::getPrimaryKeyHashFromRow(\$row, \$startcol); - if (null !== (\$obj = ".$this->getPeerClassname()."::getInstanceFromPool(\$key))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // \$obj->hydrate(\$row, \$startcol, true); // rehydrate - \$col = \$startcol + " . $this->getPeerClassname() . "::NUM_COLUMNS;"; - if ($table->isAbstract()) { - $script .= " - } elseif (null == \$key) { - // empty resultset, probably from a left join - // since this table is abstract, we can't hydrate an empty object - \$obj = null; - \$col = \$startcol + " . $this->getPeerClassname() . "::NUM_COLUMNS;"; - } - $script .= " - } else {"; - if (!$table->getChildrenColumn()) { - $script .= " - \$cls = ".$this->getPeerClassname()."::OM_CLASS;"; - } else { - $script .= " - \$cls = ".$this->getPeerClassname()."::getOMClass(\$row, \$startcol, false);"; - } - $script .= " - \$obj = new \$cls(); - \$col = \$obj->hydrate(\$row, \$startcol); - " . $this->getPeerClassname() . "::addInstanceToPool(\$obj, \$key); - } - return array(\$obj, \$col); - }"; - } - - /** - * Adds a getOMClass() for non-abstract tables that have inheritance. - * @param string &$script The script will be modified in this method. - */ - protected function addGetOMClass_Inheritance(&$script) - { - $col = $this->getTable()->getChildrenColumn(); - $script .= " - /** - * The returned Class will contain objects of the default type or - * objects that inherit from the default. - * - * @param array \$row PropelPDO result row. - * @param int \$colnum Column to examine for OM class information (first is 0). - * @param boolean \$withPrefix Whether or not to return the path with the class name - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getOMClass(\$row, \$colnum, \$withPrefix = true) - { - try { -"; - if ($col->isEnumeratedClasses()) { - $script .= " - \$omClass = null; - \$classKey = \$row[\$colnum + " . ($col->getPosition() - 1) . "]; - - switch(\$classKey) { -"; - foreach ($col->getChildren() as $child) { - $script .= " - case self::CLASSKEY_".strtoupper($child->getKey()).": - \$omClass = self::CLASSNAME_".strtoupper($child->getKey())."; - break; -"; - } /* foreach */ - $script .= " - default: - \$omClass = self::CLASS_DEFAULT; -"; - $script .= " - } // switch - if (!\$withPrefix) { - \$omClass = substr('.'.\$omClass, strrpos('.'.\$omClass, '.') + 1); - } -"; - } else { /* if not enumerated */ - $script .= " - \$omClass = \$row[\$colnum + ".($col->getPosition()-1)."]; - \$omClass = substr('.'.\$omClass, strrpos('.'.\$omClass, '.') + 1); -"; - } - $script .= " - } catch (Exception \$e) { - throw new PropelException('Unable to get OM class.', \$e); - } - return \$omClass; - } -"; - } - - /** - * Adds a getOMClass() for non-abstract tables that do note use inheritance. - * @param string &$script The script will be modified in this method. - */ - protected function addGetOMClass_NoInheritance(&$script) - { - $script .= " - /** - * The class that the Peer will make instances of. - * - * If \$withPrefix is true, the returned path - * uses a dot-path notation which is tranalted into a path - * relative to a location on the PHP include_path. - * (e.g. path.to.MyClass -> 'path/to/MyClass.php') - * - * @param boolean \$withPrefix Whether or not to return the path with the class name - * @return string path.to.ClassName - */ - public static function getOMClass(\$withPrefix = true) - { - return \$withPrefix ? ".$this->getPeerClassname()."::CLASS_DEFAULT : ".$this->getPeerClassname()."::OM_CLASS; - } -"; - } - - /** - * Adds a getOMClass() signature for abstract tables that do not have inheritance. - * @param string &$script The script will be modified in this method. - */ - protected function addGetOMClass_NoInheritance_Abstract(&$script) - { - $script .= " - /** - * The class that the Peer will make instances of. - * - * This method must be overridden by the stub subclass, because - * ".$this->getObjectClassname()." is declared abstract in the schema. - */ - abstract public static function getOMClass(\$withPrefix = true); -"; - } - - /** - * Adds the doInsert() method. - * @param string &$script The script will be modified in this method. - */ - protected function addDoInsert(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Method perform an INSERT on the database, given a ".$this->getObjectClassname()." or Criteria object. - * - * @param mixed \$values Criteria or ".$this->getObjectClassname()." object containing data that is used to create the INSERT statement. - * @param PropelPDO \$con the PropelPDO connection to use - * @return mixed The new primary key. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doInsert(\$values, PropelPDO \$con = null) - { - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if (\$values instanceof Criteria) { - \$criteria = clone \$values; // rename for clarity - } else { - \$criteria = \$values->buildCriteria(); // build Criteria from ".$this->getObjectClassname()." object - } -"; - - foreach ($table->getColumns() as $col) { - $cfc = $col->getPhpName(); - if ($col->isPrimaryKey() && $col->isAutoIncrement() && $table->getIdMethod() != "none" && !$table->isAllowPkInsert()) { - $script .= " - if (\$criteria->containsKey(".$this->getColumnConstant($col).") && \$criteria->keyContainsValue(" . $this->getColumnConstant($col) . ") ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.".$this->getColumnConstant($col).".')'); - } -"; - if (!$this->getPlatform()->supportsInsertNullPk()) - { - $script .= " - // remove pkey col since this table uses auto-increment and passing a null value for it is not valid - \$criteria->remove(".$this->getColumnConstant($col)."); -"; - } - } elseif ($col->isPrimaryKey() && $col->isAutoIncrement() && $table->getIdMethod() != "none" && $table->isAllowPkInsert() && !$this->getPlatform()->supportsInsertNullPk()) { - $script .= " - // remove pkey col if it is null since this table does not accept that - if (\$criteria->containsKey(".$this->getColumnConstant($col).") && !\$criteria->keyContainsValue(" . $this->getColumnConstant($col) . ") ) { - \$criteria->remove(".$this->getColumnConstant($col)."); - } -"; - } - } - $script .= " - - // Set the correct dbName - \$criteria->setDbName(self::DATABASE_NAME); - - try { - // use transaction because \$criteria could contain info - // for more than one table (I guess, conceivably) - \$con->beginTransaction(); - \$pk = ".$this->basePeerClassname."::doInsert(\$criteria, \$con); - \$con->commit(); - } catch(PropelException \$e) { - \$con->rollBack(); - throw \$e; - } - - return \$pk; - } -"; - } - - /** - * Adds the doUpdate() method. - * @param string &$script The script will be modified in this method. - */ - protected function addDoUpdate(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Method perform an UPDATE on the database, given a ".$this->getObjectClassname()." or Criteria object. - * - * @param mixed \$values Criteria or ".$this->getObjectClassname()." object containing data that is used to create the UPDATE statement. - * @param PropelPDO \$con The connection to use (specify PropelPDO connection object to exert more control over transactions). - * @return int The number of affected rows (if supported by underlying database driver). - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doUpdate(\$values, PropelPDO \$con = null) - { - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - \$selectCriteria = new Criteria(self::DATABASE_NAME); - - if (\$values instanceof Criteria) { - \$criteria = clone \$values; // rename for clarity -"; - foreach ($table->getColumns() as $col) { - if ($col->isPrimaryKey()) { - $script .= " - \$comparison = \$criteria->getComparison(".$this->getColumnConstant($col)."); - \$value = \$criteria->remove(".$this->getColumnConstant($col)."); - if (\$value) { - \$selectCriteria->add(".$this->getColumnConstant($col).", \$value, \$comparison); - } else { - \$selectCriteria->setPrimaryTableName(".$this->getPeerClassname()."::TABLE_NAME); - } -"; - } /* if col is prim key */ - } /* foreach */ - - $script .= " - } else { // \$values is ".$this->getObjectClassname()." object - \$criteria = \$values->buildCriteria(); // gets full criteria - \$selectCriteria = \$values->buildPkeyCriteria(); // gets criteria w/ primary key(s) - } - - // set the correct dbName - \$criteria->setDbName(self::DATABASE_NAME); - - return {$this->basePeerClassname}::doUpdate(\$selectCriteria, \$criteria, \$con); - } -"; - } - - /** - * Adds the doDeleteAll() method. - * @param string &$script The script will be modified in this method. - */ - protected function addDoDeleteAll(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Method to DELETE all rows from the ".$table->getName()." table. - * - * @return int The number of affected rows (if supported by underlying database driver). - */ - public static function doDeleteAll(\$con = null) - { - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - \$affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because \$criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - \$con->beginTransaction(); - "; - if ($this->isDeleteCascadeEmulationNeeded()) { - $script .="\$affectedRows += ".$this->getPeerClassname()."::doOnDeleteCascade(new Criteria(".$this->getPeerClassname()."::DATABASE_NAME), \$con); - "; - } - if ($this->isDeleteSetNullEmulationNeeded()) { - $script .= $this->getPeerClassname() . "::doOnDeleteSetNull(new Criteria(".$this->getPeerClassname() . "::DATABASE_NAME), \$con); - "; - } - $script .= "\$affectedRows += {$this->basePeerClassname}::doDeleteAll(".$this->getPeerClassname()."::TABLE_NAME, \$con, ".$this->getPeerClassname()."::DATABASE_NAME); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - ".$this->getPeerClassname()."::clearInstancePool(); - ".$this->getPeerClassname()."::clearRelatedInstancePool(); - \$con->commit(); - return \$affectedRows; - } catch (PropelException \$e) { - \$con->rollBack(); - throw \$e; - } - } -"; - } - - /** - * Adds the doDelete() method. - * @param string &$script The script will be modified in this method. - */ - protected function addDoDelete(&$script) - { - $table = $this->getTable(); - $emulateCascade = $this->isDeleteCascadeEmulationNeeded() || $this->isDeleteSetNullEmulationNeeded(); - $script .= " - /** - * Method perform a DELETE on the database, given a ".$this->getObjectClassname()." or Criteria object OR a primary key value. - * - * @param mixed \$values Criteria or ".$this->getObjectClassname()." object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param PropelPDO \$con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doDelete(\$values, PropelPDO \$con = null) - { - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_WRITE); - } - - if (\$values instanceof Criteria) {"; - if (!$emulateCascade) { - $script .= " - // invalidate the cache for all objects of this type, since we have no - // way of knowing (without running a query) what objects should be invalidated - // from the cache based on this Criteria. - ".$this->getPeerClassname()."::clearInstancePool();"; - } - $script .= " - // rename for clarity - \$criteria = clone \$values; - } elseif (\$values instanceof ".$this->getObjectClassname().") { // it's a model object"; - if (!$emulateCascade) { - $script .= " - // invalidate the cache for this single object - ".$this->getPeerClassname()."::removeInstanceFromPool(\$values);"; - } - if (count($table->getPrimaryKey()) > 0) { - $script .= " - // create criteria based on pk values - \$criteria = \$values->buildPkeyCriteria();"; - } else { - $script .= " - // create criteria based on pk value - \$criteria = \$values->buildCriteria();"; - } - - $script .= " - } else { // it's a primary key, or an array of pks"; - $script .= " - \$criteria = new Criteria(self::DATABASE_NAME);"; - - if (count($table->getPrimaryKey()) === 1) { - $pkey = $table->getPrimaryKey(); - $col = array_shift($pkey); - $script .= " - \$criteria->add(".$this->getColumnConstant($col).", (array) \$values, Criteria::IN);"; - if (!$emulateCascade) { - $script .= " - // invalidate the cache for this object(s) - foreach ((array) \$values as \$singleval) { - ".$this->getPeerClassname()."::removeInstanceFromPool(\$singleval); - }"; - } - } else { - $script .= " - // primary key is composite; we therefore, expect - // the primary key passed to be an array of pkey values - if (count(\$values) == count(\$values, COUNT_RECURSIVE)) { - // array is not multi-dimensional - \$values = array(\$values); - } - foreach (\$values as \$value) {"; - $i=0; - foreach ($table->getPrimaryKey() as $col) { - if ($i == 0) { - $script .= " - \$criterion = \$criteria->getNewCriterion(".$this->getColumnConstant($col).", \$value[$i]);"; - } else { - $script .= " - \$criterion->addAnd(\$criteria->getNewCriterion(".$this->getColumnConstant($col).", \$value[$i]));"; - } - $i++; - } - $script .= " - \$criteria->addOr(\$criterion);"; - if (!$emulateCascade) { - $script .= " - // we can invalidate the cache for this single PK - ".$this->getPeerClassname()."::removeInstanceFromPool(\$value);"; - } - $script .= " - }"; - } /* if count(table->getPrimaryKeys()) */ - - $script .= " - } - - // Set the correct dbName - \$criteria->setDbName(self::DATABASE_NAME); - - \$affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because \$criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - \$con->beginTransaction(); - "; - - if ($this->isDeleteCascadeEmulationNeeded()) { - $script .= " - // cloning the Criteria in case it's modified by doSelect() or doSelectStmt() - \$c = clone \$criteria; - \$affectedRows += ".$this->getPeerClassname()."::doOnDeleteCascade(\$c, \$con); - "; - } - if ($this->isDeleteSetNullEmulationNeeded()) { - $script .= " - // cloning the Criteria in case it's modified by doSelect() or doSelectStmt() - \$c = clone \$criteria; - " . $this->getPeerClassname() . "::doOnDeleteSetNull(\$c, \$con); - "; - } - - if ($emulateCascade) { - $script .= " - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - if (\$values instanceof Criteria) { - ".$this->getPeerClassname()."::clearInstancePool(); - } elseif (\$values instanceof ".$this->getObjectClassname().") { // it's a model object - ".$this->getPeerClassname()."::removeInstanceFromPool(\$values); - } else { // it's a primary key, or an array of pks - foreach ((array) \$values as \$singleval) { - ".$this->getPeerClassname()."::removeInstanceFromPool(\$singleval); - } - } - "; - } - - $script .= " - \$affectedRows += {$this->basePeerClassname}::doDelete(\$criteria, \$con); - ".$this->getPeerClassname()."::clearRelatedInstancePool(); - \$con->commit(); - return \$affectedRows; - } catch (PropelException \$e) { - \$con->rollBack(); - throw \$e; - } - } -"; - } - - /** - * Adds the doOnDeleteCascade() method, which provides ON DELETE CASCADE emulation. - * @param string &$script The script will be modified in this method. - */ - protected function addDoOnDeleteCascade(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * This is a method for emulating ON DELETE CASCADE for DBs that don't support this - * feature (like MySQL or SQLite). - * - * This method is not very speedy because it must perform a query first to get - * the implicated records and then perform the deletes by calling those Peer classes. - * - * This method should be used within a transaction if possible. - * - * @param Criteria \$criteria - * @param PropelPDO \$con - * @return int The number of affected rows (if supported by underlying database driver). - */ - protected static function doOnDeleteCascade(Criteria \$criteria, PropelPDO \$con) - { - // initialize var to track total num of affected rows - \$affectedRows = 0; - - // first find the objects that are implicated by the \$criteria - \$objects = ".$this->getPeerClassname()."::doSelect(\$criteria, \$con); - foreach (\$objects as \$obj) { -"; - - foreach ($table->getReferrers() as $fk) { - - // $fk is the foreign key in the other table, so localTableName will - // actually be the table name of other table - $tblFK = $fk->getTable(); - - $joinedTablePeerBuilder = $this->getNewPeerBuilder($tblFK); - $tblFKPackage = $joinedTablePeerBuilder->getStubPeerBuilder()->getPackage(); - - if (!$tblFK->isForReferenceOnly()) { - // we can't perform operations on tables that are - // not within the schema (i.e. that we have no map for, etc.) - - $fkClassName = $joinedTablePeerBuilder->getObjectClassname(); - - if ($fk->getOnDelete() == ForeignKey::CASCADE) { - - // backwards on purpose - $columnNamesF = $fk->getLocalColumns(); - $columnNamesL = $fk->getForeignColumns(); - - $script .= " - - // delete related $fkClassName objects - \$criteria = new Criteria(".$joinedTablePeerBuilder->getPeerClassname()."::DATABASE_NAME); - "; - for ($x=0,$xlen=count($columnNamesF); $x < $xlen; $x++) { - $columnFK = $tblFK->getColumn($columnNamesF[$x]); - $columnL = $table->getColumn($columnNamesL[$x]); - - $script .= " - \$criteria->add(".$joinedTablePeerBuilder->getColumnConstant($columnFK) .", \$obj->get".$columnL->getPhpName()."());"; - } - - $script .= " - \$affectedRows += ".$joinedTablePeerBuilder->getPeerClassname()."::doDelete(\$criteria, \$con);"; - - } // if cascade && fkey table name != curr table name - - } // if not for ref only - } // foreach foreign keys - $script .= " - } - return \$affectedRows; - } -"; - } // end addDoOnDeleteCascade - - /** - * Adds the doOnDeleteSetNull() method, which provides ON DELETE SET NULL emulation. - * @param string &$script The script will be modified in this method. - */ - protected function addDoOnDeleteSetNull(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * This is a method for emulating ON DELETE SET NULL DBs that don't support this - * feature (like MySQL or SQLite). - * - * This method is not very speedy because it must perform a query first to get - * the implicated records and then perform the deletes by calling those Peer classes. - * - * This method should be used within a transaction if possible. - * - * @param Criteria \$criteria - * @param PropelPDO \$con - * @return void - */ - protected static function doOnDeleteSetNull(Criteria \$criteria, PropelPDO \$con) - { - - // first find the objects that are implicated by the \$criteria - \$objects = ".$this->getPeerClassname()."::doSelect(\$criteria, \$con); - foreach (\$objects as \$obj) { -"; - - // This logic is almost exactly the same as that in doOnDeleteCascade() - // it may make sense to refactor this, provided that thigns don't - // get too complicated. - - foreach ($table->getReferrers() as $fk) { - - // $fk is the foreign key in the other table, so localTableName will - // actually be the table name of other table - $tblFK = $fk->getTable(); - $refTablePeerBuilder = $this->getNewPeerBuilder($tblFK); - - if (!$tblFK->isForReferenceOnly()) { - // we can't perform operations on tables that are - // not within the schema (i.e. that we have no map for, etc.) - - $fkClassName = $refTablePeerBuilder->getObjectClassname(); - - if ($fk->getOnDelete() == ForeignKey::SETNULL) { - - // backwards on purpose - $columnNamesF = $fk->getLocalColumns(); - $columnNamesL = $fk->getForeignColumns(); // should be same num as foreign - $script .= " - // set fkey col in related $fkClassName rows to NULL - \$selectCriteria = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME); - \$updateValues = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME);"; - - for ($x=0,$xlen=count($columnNamesF); $x < $xlen; $x++) { - $columnFK = $tblFK->getColumn($columnNamesF[$x]); - $columnL = $table->getColumn($columnNamesL[$x]); - $script .= " - \$selectCriteria->add(".$refTablePeerBuilder->getColumnConstant($columnFK).", \$obj->get".$columnL->getPhpName()."()); - \$updateValues->add(".$refTablePeerBuilder->getColumnConstant($columnFK).", null); -"; - } - - $script .= " - {$this->basePeerClassname}::doUpdate(\$selectCriteria, \$updateValues, \$con); // use BasePeer because generated Peer doUpdate() methods only update using pkey -"; - } // if setnull && fkey table name != curr table name - } // if not for ref only - } // foreach foreign keys - - $script .= " - } - } -"; - } - - /** - * Adds the doValidate() method. - * @param string &$script The script will be modified in this method. - */ - protected function addDoValidate(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Validates all modified columns of given ".$this->getObjectClassname()." object. - * If parameter \$columns is either a single column name or an array of column names - * than only those columns are validated. - * - * NOTICE: This does not apply to primary or foreign keys for now. - * - * @param ".$this->getObjectClassname()." \$obj The object to validate. - * @param mixed \$cols Column name or array of column names. - * - * @return mixed TRUE if all columns are valid or the error message of the first invalid column. - */ - public static function doValidate(".$this->getObjectClassname()." \$obj, \$cols = null) - { - \$columns = array(); - - if (\$cols) { - \$dbMap = Propel::getDatabaseMap(".$this->getPeerClassname()."::DATABASE_NAME); - \$tableMap = \$dbMap->getTable(".$this->getPeerClassname()."::TABLE_NAME); - - if (! is_array(\$cols)) { - \$cols = array(\$cols); - } - - foreach (\$cols as \$colName) { - if (\$tableMap->containsColumn(\$colName)) { - \$get = 'get' . \$tableMap->getColumn(\$colName)->getPhpName(); - \$columns[\$colName] = \$obj->\$get(); - } - } - } else { -"; - foreach ($table->getValidators() as $val) { - $col = $val->getColumn(); - if (!$col->isAutoIncrement()) { - $script .= " - if (\$obj->isNew() || \$obj->isColumnModified(".$this->getColumnConstant($col).")) - \$columns[".$this->getColumnConstant($col)."] = \$obj->get".$col->getPhpName()."(); -"; - } // if - } // foreach - - $script .= " - } - - return {$this->basePeerClassname}::doValidate(".$this->getPeerClassname()."::DATABASE_NAME, ".$this->getPeerClassname()."::TABLE_NAME, \$columns); - } -"; - } // end addDoValidate() - - /** - * Adds the retrieveByPK method for tables with single-column primary key. - * @param string &$script The script will be modified in this method. - */ - protected function addRetrieveByPK_SinglePK(&$script) - { - $table = $this->getTable(); - $pks = $table->getPrimaryKey(); - $col = $pks[0]; - - $script .= " - /** - * Retrieve a single object by pkey. - * - * @param ".$col->getPhpType()." \$pk the primary key. - * @param PropelPDO \$con the connection to use - * @return " .$this->getObjectClassname(). " - */ - public static function ".$this->getRetrieveMethodName()."(\$pk, PropelPDO \$con = null) - { - - if (null !== (\$obj = ".$this->getPeerClassname()."::getInstanceFromPool(".$this->getInstancePoolKeySnippet('$pk')."))) { - return \$obj; - } - - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_READ); - } - - \$criteria = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME); - \$criteria->add(".$this->getColumnConstant($col).", \$pk); - - \$v = ".$this->getPeerClassname()."::doSelect(\$criteria, \$con); - - return !empty(\$v) > 0 ? \$v[0] : null; - } -"; - } - - /** - * Adds the retrieveByPKs method for tables with single-column primary key. - * @param string &$script The script will be modified in this method. - */ - protected function addRetrieveByPKs_SinglePK(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Retrieve multiple objects by pkey. - * - * @param array \$pks List of primary keys - * @param PropelPDO \$con the connection to use - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function ".$this->getRetrieveMethodName()."s(\$pks, PropelPDO \$con = null) - { - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_READ); - } - - \$objs = null; - if (empty(\$pks)) { - \$objs = array(); - } else { - \$criteria = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME);"; - $k1 = $table->getPrimaryKey(); - $script .= " - \$criteria->add(".$this->getColumnConstant($k1[0]).", \$pks, Criteria::IN);"; - $script .= " - \$objs = ".$this->getPeerClassname()."::doSelect(\$criteria, \$con); - } - return \$objs; - } -"; - } - - /** - * Adds the retrieveByPK method for tables with multi-column primary key. - * @param string &$script The script will be modified in this method. - */ - protected function addRetrieveByPK_MultiPK(&$script) - { - $table = $this->getTable(); - $script .= " - /** - * Retrieve object using using composite pkey values."; - foreach ($table->getPrimaryKey() as $col) { - $clo = strtolower($col->getName()); - $cptype = $col->getPhpType(); - $script .= " - * @param $cptype $".$clo; - } - $script .= " - * @param PropelPDO \$con - * @return ".$this->getObjectClassname()." - */ - public static function ".$this->getRetrieveMethodName()."("; - - $php = array(); - foreach ($table->getPrimaryKey() as $col) { - $clo = strtolower($col->getName()); - $php[] = '$' . $clo; - } /* foreach */ - - $script .= implode(', ', $php); - - $script .= ", PropelPDO \$con = null) { - \$_instancePoolKey = ".$this->getInstancePoolKeySnippet($php).";"; - $script .= " - if (null !== (\$obj = ".$this->getPeerClassname()."::getInstanceFromPool(\$_instancePoolKey))) { - return \$obj; - } - - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_READ); - } - \$criteria = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME);"; - foreach ($table->getPrimaryKey() as $col) { - $clo = strtolower($col->getName()); - $script .= " - \$criteria->add(".$this->getColumnConstant($col).", $".$clo.");"; - } - $script .= " - \$v = ".$this->getPeerClassname()."::doSelect(\$criteria, \$con); - - return !empty(\$v) ? \$v[0] : null; - }"; - } - - /** - * Adds the getTableMap() method which is a convenience method for apps to get DB metadata. - * @param string &$script The script will be modified in this method. - */ - protected function addGetTableMap(&$script) - { - $script .= " - /** - * Returns the TableMap related to this peer. - * This method is not needed for general use but a specific application could have a need. - * @return TableMap - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function getTableMap() - { - return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); - } -"; - } - - /** - * Adds the complex OM methods to the base addSelectMethods() function. - * @param string &$script The script will be modified in this method. - * @see PeerBuilder::addSelectMethods() - */ - protected function addSelectMethods(&$script) - { - $table = $this->getTable(); - - parent::addSelectMethods($script); - - $this->addDoCountJoin($script); - $this->addDoSelectJoin($script); - - $countFK = count($table->getForeignKeys()); - - $includeJoinAll = true; - - foreach ($this->getTable()->getForeignKeys() as $fk) { - $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); - $this->declareClassFromBuilder($this->getNewStubPeerBuilder($tblFK)); - if ($tblFK->isForReferenceOnly()) { - $includeJoinAll = false; - } - } - - if ($includeJoinAll) { - if ($countFK > 0) { - $this->addDoCountJoinAll($script); - $this->addDoSelectJoinAll($script); - } - if ($countFK > 1) { - $this->addDoCountJoinAllExcept($script); - $this->addDoSelectJoinAllExcept($script); - } - } - - } - - /** - * Get the column offsets of the primary key(s) for specified table. - * - * @param Table $tbl - * @return array int[] The column offsets of the primary key(s). - */ - protected function getPrimaryKeyColOffsets(Table $tbl) - { - $offsets = array(); - $idx = 0; - foreach ($tbl->getColumns() as $col) { - if ($col->isPrimaryKey()) { - $offsets[] = $idx; - } - $idx++; - } - return $offsets; - } - - public function addCriteriaJoin($fk, $table, $joinTable, $joinedTablePeerBuilder) - { - $script = ''; - $lfMap = $fk->getLocalForeignMapping(); - $lftCols = $fk->getLocalColumns(); - if (count($lftCols) == 1) - { - // simple foreign key - $lftCol = $lftCols[0]; - $script .= sprintf(" - \$criteria->addJoin(%s, %s, \$join_behavior);\n", - $this->getColumnConstant($table->getColumn($lftCol) ), - $joinedTablePeerBuilder->getColumnConstant($joinTable->getColumn( $lfMap[$lftCol] ) )); - } - else - { - // composite foreign key - $script .= " - \$criteria->addMultipleJoin(array(\n"; - foreach ($lftCols as $columnName ) { - $script .= sprintf(" array(%s, %s),\n", - $this->getColumnConstant($table->getColumn($columnName) ), - $joinedTablePeerBuilder->getColumnConstant($joinTable->getColumn( $lfMap[$columnName] ) ) - ); - } - $script .= " ), \$join_behavior);\n"; - } - return $script; - } - - /** - * Adds the doSelectJoin*() methods. - * @param string &$script The script will be modified in this method. - */ - protected function addDoSelectJoin(&$script) - { - $table = $this->getTable(); - $className = $this->getObjectClassname(); - $countFK = count($table->getForeignKeys()); - $join_behavior = $this->getJoinBehavior(); - - if ($countFK >= 1) { - - foreach ($table->getForeignKeys() as $fk) { - - $joinTable = $table->getDatabase()->getTable($fk->getForeignTableName()); - - if (!$joinTable->isForReferenceOnly()) { - - // This condition is necessary because Propel lacks a system for - // aliasing the table if it is the same table. - if ( $fk->getForeignTableName() != $table->getName() ) { - - $thisTableObjectBuilder = $this->getNewObjectBuilder($table); - $joinedTableObjectBuilder = $this->getNewObjectBuilder($joinTable); - $joinedTablePeerBuilder = $this->getNewPeerBuilder($joinTable); - - $joinClassName = $joinedTableObjectBuilder->getObjectClassname(); - - $script .= " - - /** - * Selects a collection of $className objects pre-filled with their $joinClassName objects. - * @param Criteria \$criteria - * @param PropelPDO \$con - * @param String \$join_behavior the type of joins to use, defaults to $join_behavior - * @return array Array of $className objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoin".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)."(Criteria \$criteria, \$con = null, \$join_behavior = $join_behavior) - { - \$criteria = clone \$criteria; - - // Set the correct dbName if it has not been overridden - if (\$criteria->getDbName() == Propel::getDefaultDB()) { - \$criteria->setDbName(self::DATABASE_NAME); - } - - ".$this->getPeerClassname()."::addSelectColumns(\$criteria); - \$startcol = (".$this->getPeerClassname()."::NUM_COLUMNS - ".$this->getPeerClassname()."::NUM_LAZY_LOAD_COLUMNS); - ".$joinedTablePeerBuilder->getPeerClassname()."::addSelectColumns(\$criteria); -"; - - $script .= $this->addCriteriaJoin($fk, $table, $joinTable, $joinedTablePeerBuilder); - - // apply behaviors - $this->applyBehaviorModifier('preSelect', $script); - - $script .= " - \$stmt = ".$this->basePeerClassname."::doSelect(\$criteria, \$con); - \$results = array(); - - while (\$row = \$stmt->fetch(PDO::FETCH_NUM)) { - \$key1 = ".$this->getPeerClassname()."::getPrimaryKeyHashFromRow(\$row, 0); - if (null !== (\$obj1 = ".$this->getPeerClassname()."::getInstanceFromPool(\$key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // \$obj1->hydrate(\$row, 0, true); // rehydrate - } else { -"; - if ($table->getChildrenColumn()) { - $script .= " - \$omClass = ".$this->getPeerClassname()."::getOMClass(\$row, 0); - \$cls = substr('.'.\$omClass, strrpos('.'.\$omClass, '.') + 1); -"; - } else { - $script .= " - \$cls = ".$this->getPeerClassname()."::getOMClass(false); -"; - } - $script .= " - " . $this->buildObjectInstanceCreationCode('$obj1', '$cls') . " - \$obj1->hydrate(\$row); - ".$this->getPeerClassname()."::addInstanceToPool(\$obj1, \$key1); - } // if \$obj1 already loaded - - \$key2 = ".$joinedTablePeerBuilder->getPeerClassname()."::getPrimaryKeyHashFromRow(\$row, \$startcol); - if (\$key2 !== null) { - \$obj2 = ".$joinedTablePeerBuilder->getPeerClassname()."::getInstanceFromPool(\$key2); - if (!\$obj2) { -"; - if ($joinTable->getChildrenColumn()) { - $script .= " - \$omClass = ".$joinedTablePeerBuilder->getPeerClassname()."::getOMClass(\$row, \$startcol); - \$cls = substr('.'.\$omClass, strrpos('.'.\$omClass, '.') + 1); -"; - } else { - $script .= " - \$cls = ".$joinedTablePeerBuilder->getPeerClassname()."::getOMClass(false); -"; - } - - $script .= " - " . $this->buildObjectInstanceCreationCode('$obj2', '$cls') . " - \$obj2->hydrate(\$row, \$startcol); - ".$joinedTablePeerBuilder->getPeerClassname()."::addInstanceToPool(\$obj2, \$key2); - } // if obj2 already loaded - - // Add the \$obj1 (".$this->getObjectClassname().") to \$obj2 (".$joinedTablePeerBuilder->getObjectClassname().")"; - if ($fk->isLocalPrimaryKey()) { - $script .= " - // one to one relationship - \$obj1->set" . $joinedTablePeerBuilder->getObjectClassname() . "(\$obj2);"; - } else { - $script .= " - \$obj2->add" . $joinedTableObjectBuilder->getRefFKPhpNameAffix($fk, $plural = false)."(\$obj1);"; - } - $script .= " - - } // if joined row was not null - - \$results[] = \$obj1; - } - \$stmt->closeCursor(); - return \$results; - } -"; - } // if fk table name != this table name - } // if ! is reference only - } // foreach column - } // if count(fk) > 1 - - } // addDoSelectJoin() - - /** - * Adds the doCountJoin*() methods. - * @param string &$script The script will be modified in this method. - */ - protected function addDoCountJoin(&$script) - { - $table = $this->getTable(); - $className = $this->getObjectClassname(); - $countFK = count($table->getForeignKeys()); - $join_behavior = $this->getJoinBehavior(); - - if ($countFK >= 1) { - - foreach ($table->getForeignKeys() as $fk) { - - $joinTable = $table->getDatabase()->getTable($fk->getForeignTableName()); - - if (!$joinTable->isForReferenceOnly()) { - - if ( $fk->getForeignTableName() != $table->getName() ) { - - $thisTableObjectBuilder = $this->getNewObjectBuilder($table); - $joinedTableObjectBuilder = $this->getNewObjectBuilder($joinTable); - $joinedTablePeerBuilder = $this->getNewPeerBuilder($joinTable); - - $joinClassName = $joinedTableObjectBuilder->getObjectClassname(); - - $script .= " - - /** - * Returns the number of rows matching criteria, joining the related ".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)." table - * - * @param Criteria \$criteria - * @param boolean \$distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO \$con - * @param String \$join_behavior the type of joins to use, defaults to $join_behavior - * @return int Number of matching rows. - */ - public static function doCountJoin".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)."(Criteria \$criteria, \$distinct = false, PropelPDO \$con = null, \$join_behavior = $join_behavior) - { - // we're going to modify criteria, so copy it first - \$criteria = clone \$criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - \$criteria->setPrimaryTableName(".$this->getPeerClassname()."::TABLE_NAME); - - if (\$distinct && !in_array(Criteria::DISTINCT, \$criteria->getSelectModifiers())) { - \$criteria->setDistinct(); - } - - if (!\$criteria->hasSelectClause()) { - ".$this->getPeerClassname()."::addSelectColumns(\$criteria); - } - - \$criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - \$criteria->setDbName(self::DATABASE_NAME); - - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_READ); - } -"; - $script .= $this->addCriteriaJoin($fk, $table, $joinTable, $joinedTablePeerBuilder); - - // apply behaviors - $this->applyBehaviorModifier('preSelect', $script); - - $script .= " - \$stmt = ".$this->basePeerClassname."::doCount(\$criteria, \$con); - - if (\$row = \$stmt->fetch(PDO::FETCH_NUM)) { - \$count = (int) \$row[0]; - } else { - \$count = 0; // no rows returned; we infer that means 0 matches. - } - \$stmt->closeCursor(); - return \$count; - } -"; - } // if fk table name != this table name - } // if ! is reference only - } // foreach column - } // if count(fk) > 1 - - } // addDoCountJoin() - - /** - * Adds the doSelectJoinAll() method. - * @param string &$script The script will be modified in this method. - */ - protected function addDoSelectJoinAll(&$script) - { - $table = $this->getTable(); - $className = $this->getObjectClassname(); - $join_behavior = $this->getJoinBehavior(); - - $script .= " - - /** - * Selects a collection of $className objects pre-filled with all related objects. - * - * @param Criteria \$criteria - * @param PropelPDO \$con - * @param String \$join_behavior the type of joins to use, defaults to $join_behavior - * @return array Array of $className objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAll(Criteria \$criteria, \$con = null, \$join_behavior = $join_behavior) - { - \$criteria = clone \$criteria; - - // Set the correct dbName if it has not been overridden - if (\$criteria->getDbName() == Propel::getDefaultDB()) { - \$criteria->setDbName(self::DATABASE_NAME); - } - - ".$this->getPeerClassname()."::addSelectColumns(\$criteria); - \$startcol2 = (".$this->getPeerClassname()."::NUM_COLUMNS - ".$this->getPeerClassname()."::NUM_LAZY_LOAD_COLUMNS); -"; - $index = 2; - foreach ($table->getForeignKeys() as $fk) { - - // Want to cover this case, but the code is not there yet. - // Propel lacks a system for aliasing tables of the same name. - if ( $fk->getForeignTableName() != $table->getName() ) { - $joinTable = $table->getDatabase()->getTable($fk->getForeignTableName()); - $new_index = $index + 1; - - $joinedTablePeerBuilder = $this->getNewPeerBuilder($joinTable); - $joinClassName = $joinedTablePeerBuilder->getObjectClassname(); - - $script .= " - ".$joinedTablePeerBuilder->getPeerClassname()."::addSelectColumns(\$criteria); - \$startcol$new_index = \$startcol$index + (".$joinedTablePeerBuilder->getPeerClassname()."::NUM_COLUMNS - ".$joinedTablePeerBuilder->getPeerClassname()."::NUM_LAZY_LOAD_COLUMNS); -"; - $index = $new_index; - - } // if fk->getForeignTableName != table->getName - } // foreach [sub] foreign keys - - foreach ($table->getForeignKeys() as $fk) { - // want to cover this case, but the code is not there yet. - if ( $fk->getForeignTableName() != $table->getName() ) { - $joinTable = $table->getDatabase()->getTable($fk->getForeignTableName()); - $joinedTablePeerBuilder = $this->getNewPeerBuilder($joinTable); - $script .= $this->addCriteriaJoin($fk, $table, $joinTable, $joinedTablePeerBuilder); - } - } - - // apply behaviors - $this->applyBehaviorModifier('preSelect', $script); - - $script .= " - \$stmt = ".$this->basePeerClassname."::doSelect(\$criteria, \$con); - \$results = array(); - - while (\$row = \$stmt->fetch(PDO::FETCH_NUM)) { - \$key1 = ".$this->getPeerClassname()."::getPrimaryKeyHashFromRow(\$row, 0); - if (null !== (\$obj1 = ".$this->getPeerClassname()."::getInstanceFromPool(\$key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // \$obj1->hydrate(\$row, 0, true); // rehydrate - } else {"; - - if ($table->getChildrenColumn()) { - $script .= " - \$omClass = ".$this->getPeerClassname()."::getOMClass(\$row, 0); - \$cls = substr('.'.\$omClass, strrpos('.'.\$omClass, '.') + 1); -"; - } else { - $script .= " - \$cls = ".$this->getPeerClassname()."::getOMClass(false); -"; - } - - $script .= " - " . $this->buildObjectInstanceCreationCode('$obj1', '$cls') . " - \$obj1->hydrate(\$row); - ".$this->getPeerClassname()."::addInstanceToPool(\$obj1, \$key1); - } // if obj1 already loaded -"; - - $index = 1; - foreach ($table->getForeignKeys() as $fk ) { - // want to cover this case, but the code is not there yet. - // Why not? -because we'd have to alias the tables in the JOIN - if ( $fk->getForeignTableName() != $table->getName() ) { - $joinTable = $table->getDatabase()->getTable($fk->getForeignTableName()); - - $thisTableObjectBuilder = $this->getNewObjectBuilder($table); - $joinedTableObjectBuilder = $this->getNewObjectBuilder($joinTable); - $joinedTablePeerBuilder = $this->getNewPeerBuilder($joinTable); - - - $joinClassName = $joinedTableObjectBuilder->getObjectClassname(); - $interfaceName = $joinClassName; - - if ($joinTable->getInterface()) { - $interfaceName = $this->prefixClassname($joinTable->getInterface()); - } - - $index++; - - $script .= " - // Add objects for joined $joinClassName rows - - \$key$index = ".$joinedTablePeerBuilder->getPeerClassname()."::getPrimaryKeyHashFromRow(\$row, \$startcol$index); - if (\$key$index !== null) { - \$obj$index = ".$joinedTablePeerBuilder->getPeerClassname()."::getInstanceFromPool(\$key$index); - if (!\$obj$index) { -"; - if ($joinTable->getChildrenColumn()) { - $script .= " - \$omClass = ".$joinedTablePeerBuilder->getPeerClassname()."::getOMClass(\$row, \$startcol$index); - \$cls = substr('.'.\$omClass, strrpos('.'.\$omClass, '.') + 1); -"; - } else { - $script .= " - \$cls = ".$joinedTablePeerBuilder->getPeerClassname()."::getOMClass(false); -"; - } /* $joinTable->getChildrenColumn() */ - - $script .= " - " . $this->buildObjectInstanceCreationCode('$obj' . $index, '$cls') . " - \$obj".$index."->hydrate(\$row, \$startcol$index); - ".$joinedTablePeerBuilder->getPeerClassname()."::addInstanceToPool(\$obj$index, \$key$index); - } // if obj$index loaded - - // Add the \$obj1 (".$this->getObjectClassname().") to the collection in \$obj".$index." (".$joinedTablePeerBuilder->getObjectClassname().")"; - if ($fk->isLocalPrimaryKey()) { - $script .= " - \$obj1->set".$joinedTablePeerBuilder->getObjectClassname()."(\$obj".$index.");"; - } else { - $script .= " - \$obj".$index."->add".$joinedTableObjectBuilder->getRefFKPhpNameAffix($fk, $plural = false)."(\$obj1);"; - } - $script .= " - } // if joined row not null -"; - - } // $fk->getForeignTableName() != $table->getName() - } //foreach foreign key - - $script .= " - \$results[] = \$obj1; - } - \$stmt->closeCursor(); - return \$results; - } -"; - - } // end addDoSelectJoinAll() - - - /** - * Adds the doCountJoinAll() method. - * @param string &$script The script will be modified in this method. - */ - protected function addDoCountJoinAll(&$script) - { - $table = $this->getTable(); - $className = $this->getObjectClassname(); - $join_behavior = $this->getJoinBehavior(); - - $script .= " - - /** - * Returns the number of rows matching criteria, joining all related tables - * - * @param Criteria \$criteria - * @param boolean \$distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO \$con - * @param String \$join_behavior the type of joins to use, defaults to $join_behavior - * @return int Number of matching rows. - */ - public static function doCountJoinAll(Criteria \$criteria, \$distinct = false, PropelPDO \$con = null, \$join_behavior = $join_behavior) - { - // we're going to modify criteria, so copy it first - \$criteria = clone \$criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - \$criteria->setPrimaryTableName(".$this->getPeerClassname()."::TABLE_NAME); - - if (\$distinct && !in_array(Criteria::DISTINCT, \$criteria->getSelectModifiers())) { - \$criteria->setDistinct(); - } - - if (!\$criteria->hasSelectClause()) { - ".$this->getPeerClassname()."::addSelectColumns(\$criteria); - } - - \$criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // Set the correct dbName - \$criteria->setDbName(self::DATABASE_NAME); - - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_READ); - } -"; - - foreach ($table->getForeignKeys() as $fk) { - // want to cover this case, but the code is not there yet. - if ( $fk->getForeignTableName() != $table->getName() ) { - $joinTable = $table->getDatabase()->getTable($fk->getForeignTableName()); - $joinedTablePeerBuilder = $this->getNewPeerBuilder($joinTable); - $script .= $this->addCriteriaJoin($fk, $table, $joinTable, $joinedTablePeerBuilder); - } // if fk->getForeignTableName != table->getName - } // foreach [sub] foreign keys - - // apply behaviors - $this->applyBehaviorModifier('preSelect', $script); - - $script .= " - \$stmt = ".$this->basePeerClassname."::doCount(\$criteria, \$con); - - if (\$row = \$stmt->fetch(PDO::FETCH_NUM)) { - \$count = (int) \$row[0]; - } else { - \$count = 0; // no rows returned; we infer that means 0 matches. - } - \$stmt->closeCursor(); - return \$count; - }"; - } // end addDoCountJoinAll() - - /** - * Adds the doSelectJoinAllExcept*() methods. - * @param string &$script The script will be modified in this method. - */ - protected function addDoSelectJoinAllExcept(&$script) - { - $table = $this->getTable(); - $join_behavior = $this->getJoinBehavior(); - - // ------------------------------------------------------------------------ - // doSelectJoinAllExcept*() - // ------------------------------------------------------------------------ - - // 2) create a bunch of doSelectJoinAllExcept*() methods - // -- these were existing in original Torque, so we should keep them for compatibility - - $fkeys = $table->getForeignKeys(); // this sep assignment is necessary otherwise sub-loops over - // getForeignKeys() will cause this to only execute one time. - foreach ($fkeys as $fk ) { - - $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); - - $excludedTable = $table->getDatabase()->getTable($fk->getForeignTableName()); - - $thisTableObjectBuilder = $this->getNewObjectBuilder($table); - $excludedTableObjectBuilder = $this->getNewObjectBuilder($excludedTable); - $excludedTablePeerBuilder = $this->getNewPeerBuilder($excludedTable); - - $excludedClassName = $excludedTableObjectBuilder->getObjectClassname(); - - - $script .= " - - /** - * Selects a collection of ".$this->getObjectClassname()." objects pre-filled with all related objects except ".$thisTableObjectBuilder->getFKPhpNameAffix($fk).". - * - * @param Criteria \$criteria - * @param PropelPDO \$con - * @param String \$join_behavior the type of joins to use, defaults to $join_behavior - * @return array Array of ".$this->getObjectClassname()." objects. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function doSelectJoinAllExcept".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)."(Criteria \$criteria, \$con = null, \$join_behavior = $join_behavior) - { - \$criteria = clone \$criteria; - - // Set the correct dbName if it has not been overridden - // \$criteria->getDbName() will return the same object if not set to another value - // so == check is okay and faster - if (\$criteria->getDbName() == Propel::getDefaultDB()) { - \$criteria->setDbName(self::DATABASE_NAME); - } - - ".$this->getPeerClassname()."::addSelectColumns(\$criteria); - \$startcol2 = (".$this->getPeerClassname()."::NUM_COLUMNS - ".$this->getPeerClassname()."::NUM_LAZY_LOAD_COLUMNS); -"; - $index = 2; - foreach ($table->getForeignKeys() as $subfk) { - // want to cover this case, but the code is not there yet. - // Why not? - because we would have to alias the tables in the join - if ( !($subfk->getForeignTableName() == $table->getName())) { - $joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName()); - $joinTablePeerBuilder = $this->getNewPeerBuilder($joinTable); - $joinClassName = $joinTablePeerBuilder->getObjectClassname(); - - if ($joinClassName != $excludedClassName) { - $new_index = $index + 1; - $script .= " - ".$joinTablePeerBuilder->getPeerClassname()."::addSelectColumns(\$criteria); - \$startcol$new_index = \$startcol$index + (".$joinTablePeerBuilder->getPeerClassname()."::NUM_COLUMNS - ".$joinTablePeerBuilder->getPeerClassname()."::NUM_LAZY_LOAD_COLUMNS); -"; - $index = $new_index; - } // if joinClassName not excludeClassName - } // if subfk is not curr table - } // foreach [sub] foreign keys - - foreach ($table->getForeignKeys() as $subfk) { - // want to cover this case, but the code is not there yet. - if ( $subfk->getForeignTableName() != $table->getName() ) { - $joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName()); - $joinedTablePeerBuilder = $this->getNewPeerBuilder($joinTable); - $joinClassName = $joinedTablePeerBuilder->getObjectClassname(); - - if ($joinClassName != $excludedClassName) - { - $script .= $this->addCriteriaJoin($subfk, $table, $joinTable, $joinedTablePeerBuilder); - } - } - } // foreach fkeys - - // apply behaviors - $this->applyBehaviorModifier('preSelect', $script); - - $script .= " - - \$stmt = ".$this->basePeerClassname ."::doSelect(\$criteria, \$con); - \$results = array(); - - while (\$row = \$stmt->fetch(PDO::FETCH_NUM)) { - \$key1 = ".$this->getPeerClassname()."::getPrimaryKeyHashFromRow(\$row, 0); - if (null !== (\$obj1 = ".$this->getPeerClassname()."::getInstanceFromPool(\$key1))) { - // We no longer rehydrate the object, since this can cause data loss. - // See http://www.propelorm.org/ticket/509 - // \$obj1->hydrate(\$row, 0, true); // rehydrate - } else {"; - if ($table->getChildrenColumn()) { - $script .= " - \$omClass = ".$this->getPeerClassname()."::getOMClass(\$row, 0); - \$cls = substr('.'.\$omClass, strrpos('.'.\$omClass, '.') + 1); -"; - } else { - $script .= " - \$cls = ".$this->getPeerClassname()."::getOMClass(false); -"; - } - - $script .= " - " . $this->buildObjectInstanceCreationCode('$obj1', '$cls') . " - \$obj1->hydrate(\$row); - ".$this->getPeerClassname()."::addInstanceToPool(\$obj1, \$key1); - } // if obj1 already loaded -"; - - $index = 1; - foreach ($table->getForeignKeys() as $subfk ) { - // want to cover this case, but the code is not there yet. - if ( $subfk->getForeignTableName() != $table->getName() ) { - - $joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName()); - - $joinedTableObjectBuilder = $this->getNewObjectBuilder($joinTable); - $joinedTablePeerBuilder = $this->getNewPeerBuilder($joinTable); - - $joinClassName = $joinedTableObjectBuilder->getObjectClassname(); - - $interfaceName = $joinClassName; - if ($joinTable->getInterface()) { - $interfaceName = $this->prefixClassname($joinTable->getInterface()); - } - - if ($joinClassName != $excludedClassName) { - - $index++; - - $script .= " - // Add objects for joined $joinClassName rows - - \$key$index = ".$joinedTablePeerBuilder->getPeerClassname()."::getPrimaryKeyHashFromRow(\$row, \$startcol$index); - if (\$key$index !== null) { - \$obj$index = ".$joinedTablePeerBuilder->getPeerClassname()."::getInstanceFromPool(\$key$index); - if (!\$obj$index) { - "; - - if ($joinTable->getChildrenColumn()) { - $script .= " - \$omClass = ".$joinedTablePeerBuilder->getPeerClassname()."::getOMClass(\$row, \$startcol$index); - \$cls = substr('.'.\$omClass, strrpos('.'.\$omClass, '.') + 1); -"; - } else { - $script .= " - \$cls = ".$joinedTablePeerBuilder->getPeerClassname()."::getOMClass(false); -"; - } /* $joinTable->getChildrenColumn() */ - $script .= " - " . $this->buildObjectInstanceCreationCode('$obj' . $index, '$cls') . " - \$obj".$index."->hydrate(\$row, \$startcol$index); - ".$joinedTablePeerBuilder->getPeerClassname()."::addInstanceToPool(\$obj$index, \$key$index); - } // if \$obj$index already loaded - - // Add the \$obj1 (".$this->getObjectClassname().") to the collection in \$obj".$index." (".$joinedTablePeerBuilder->getObjectClassname().")"; - if ($subfk->isLocalPrimaryKey()) { - $script .= " - \$obj1->set".$joinedTablePeerBuilder->getObjectClassname()."(\$obj".$index.");"; - } else { - $script .= " - \$obj".$index."->add".$joinedTableObjectBuilder->getRefFKPhpNameAffix($subfk, $plural = false)."(\$obj1);"; - } - $script .= " - - } // if joined row is not null -"; - } // if ($joinClassName != $excludedClassName) { - } // $subfk->getForeignTableName() != $table->getName() - } // foreach - $script .= " - \$results[] = \$obj1; - } - \$stmt->closeCursor(); - return \$results; - } -"; - } // foreach fk - - } // addDoSelectJoinAllExcept - - /** - * Adds the doCountJoinAllExcept*() methods. - * @param string &$script The script will be modified in this method. - */ - protected function addDoCountJoinAllExcept(&$script) - { - $table = $this->getTable(); - $join_behavior = $this->getJoinBehavior(); - - $fkeys = $table->getForeignKeys(); // this sep assignment is necessary otherwise sub-loops over - // getForeignKeys() will cause this to only execute one time. - foreach ($fkeys as $fk ) { - - $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); - - $excludedTable = $table->getDatabase()->getTable($fk->getForeignTableName()); - - $thisTableObjectBuilder = $this->getNewObjectBuilder($table); - $excludedTableObjectBuilder = $this->getNewObjectBuilder($excludedTable); - $excludedTablePeerBuilder = $this->getNewPeerBuilder($excludedTable); - - $excludedClassName = $excludedTableObjectBuilder->getObjectClassname(); - - $script .= " - - /** - * Returns the number of rows matching criteria, joining the related ".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)." table - * - * @param Criteria \$criteria - * @param boolean \$distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead. - * @param PropelPDO \$con - * @param String \$join_behavior the type of joins to use, defaults to $join_behavior - * @return int Number of matching rows. - */ - public static function doCountJoinAllExcept".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)."(Criteria \$criteria, \$distinct = false, PropelPDO \$con = null, \$join_behavior = $join_behavior) - { - // we're going to modify criteria, so copy it first - \$criteria = clone \$criteria; - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - \$criteria->setPrimaryTableName(".$this->getPeerClassname()."::TABLE_NAME); - - if (\$distinct && !in_array(Criteria::DISTINCT, \$criteria->getSelectModifiers())) { - \$criteria->setDistinct(); - } - - if (!\$criteria->hasSelectClause()) { - ".$this->getPeerClassname()."::addSelectColumns(\$criteria); - } - - \$criteria->clearOrderByColumns(); // ORDER BY should not affect count - - // Set the correct dbName - \$criteria->setDbName(self::DATABASE_NAME); - - if (\$con === null) { - \$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME, Propel::CONNECTION_READ); - } - "; - - foreach ($table->getForeignKeys() as $subfk) { - // want to cover this case, but the code is not there yet. - if ( $subfk->getForeignTableName() != $table->getName() ) { - $joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName()); - $joinedTablePeerBuilder = $this->getNewPeerBuilder($joinTable); - $joinClassName = $joinedTablePeerBuilder->getObjectClassname(); - - if ($joinClassName != $excludedClassName) - { - $script .= $this->addCriteriaJoin($subfk, $table, $joinTable, $joinedTablePeerBuilder); - } - } - } // foreach fkeys - - // apply behaviors - $this->applyBehaviorModifier('preSelect', $script); - - $script .= " - \$stmt = ".$this->basePeerClassname."::doCount(\$criteria, \$con); - - if (\$row = \$stmt->fetch(PDO::FETCH_NUM)) { - \$count = (int) \$row[0]; - } else { - \$count = 0; // no rows returned; we infer that means 0 matches. - } - \$stmt->closeCursor(); - return \$count; - } -"; - } // foreach fk - - } // addDoCountJoinAllExcept - - /** - * returns the desired join behavior as set in the build properties - * see trac ticket #588, #491 - * - */ - protected function getJoinBehavior() - { - return $this->getGeneratorConfig()->getBuildProperty('useLeftJoinsInDoJoinMethods') ? 'Criteria::LEFT_JOIN' : 'Criteria::INNER_JOIN'; - } - -} // PHP5PeerBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5TableMapBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PHP5TableMapBuilder.php deleted file mode 100644 index a156b29bfa..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PHP5TableMapBuilder.php +++ /dev/null @@ -1,354 +0,0 @@ - - * @package propel.generator.builder.om - */ -class PHP5TableMapBuilder extends OMBuilder -{ - - /** - * Gets the package for the map builder classes. - * @return string - */ - public function getPackage() - { - return parent::getPackage() . '.map'; - } - - public function getNamespace() - { - if ($namespace = parent::getNamespace()) { - if ($this->getGeneratorConfig() && $omns = $this->getGeneratorConfig()->getBuildProperty('namespaceMap')) { - return $namespace . '\\' . $omns; - } else { - return $namespace; - } - } - } - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return $this->getTable()->getPhpName() . 'TableMap'; - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - $table = $this->getTable(); - $script .= " - -/** - * This class defines the structure of the '".$table->getName()."' table. - * - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * - * This map class is used by Propel to do runtime db structure discovery. - * For example, the createSelectSql() method checks the type of a given column used in an - * ORDER BY clause to know whether it needs to apply SQL to make the ORDER BY case-insensitive - * (i.e. if it's a text column type). - * - * @package propel.generator.".$this->getPackage()." - */ -class ".$this->getClassname()." extends TableMap { -"; - } - - /** - * Specifies the methods that are added as part of the map builder class. - * This can be overridden by subclasses that wish to add more methods. - * @see ObjectBuilder::addClassBody() - */ - protected function addClassBody(&$script) - { - $this->declareClasses('TableMap', 'RelationMap'); - $this->addConstants($script); - $this->addAttributes($script); - $this->addInitialize($script); - $this->addBuildRelations($script); - $this->addGetBehaviors($script); - } - - /** - * Adds any constants needed for this TableMap class. - * @param string &$script The script will be modified in this method. - */ - protected function addConstants(&$script) - { - $script .= " - /** - * The (dot-path) name of this class - */ - const CLASS_NAME = '".$this->getClasspath()."'; -"; - } - - /** - * Adds any attributes needed for this TableMap class. - * @param string &$script The script will be modified in this method. - */ - protected function addAttributes(&$script) - { - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - $this->applyBehaviorModifier('tableMapFilter', $script, ""); - } - - /** - * Adds the addInitialize() method to the table map class. - * @param string &$script The script will be modified in this method. - */ - protected function addInitialize(&$script) - { - - $table = $this->getTable(); - $platform = $this->getPlatform(); - $ddlBuilder = $this->getDDLBuilder(); - - $script .= " - /** - * Initialize the table attributes, columns and validators - * Relations are not initialized by this method since they are lazy loaded - * - * @return void - * @throws PropelException - */ - public function initialize() - { - // attributes - \$this->setName('".$table->getName()."'); - \$this->setPhpName('".$table->getPhpName()."'); - \$this->setClassname('" . addslashes($this->getStubObjectBuilder()->getFullyQualifiedClassname()) . "'); - \$this->setPackage('" . parent::getPackage() . "');"; - if ($table->getIdMethod() == "native") { - $script .= " - \$this->setUseIdGenerator(true);"; - } else { - $script .= " - \$this->setUseIdGenerator(false);"; - } - - if ($table->getIdMethodParameters()) { - $params = $table->getIdMethodParameters(); - $imp = $params[0]; - $script .= " - \$this->setPrimaryKeyMethodInfo('".$imp->getValue()."');"; - } elseif ($table->getIdMethod() == IDMethod::NATIVE && ($platform->getNativeIdMethod() == Platform::SEQUENCE || $platform->getNativeIdMethod() == Platform::SERIAL)) { - $script .= " - \$this->setPrimaryKeyMethodInfo('".$ddlBuilder->getSequenceName()."');"; - } - - if ($this->getTable()->getChildrenColumn()) { - $script .= " - \$this->setSingleTableInheritance(true);"; - } - - // Add columns to map - $script .= " - // columns"; - foreach ($table->getColumns() as $col) { - $cup=strtoupper($col->getName()); - $cfc=$col->getPhpName(); - if (!$col->getSize()) { - $size = "null"; - } else { - $size = $col->getSize(); - } - $default = $col->getDefaultValueString(); - if ($col->isPrimaryKey()) { - if ($col->isForeignKey()) { - foreach ($col->getForeignKeys() as $fk) { - $script .= " - \$this->addForeignPrimaryKey('$cup', '$cfc', '".$col->getType()."' , '".$fk->getForeignTableName()."', '".strtoupper($fk->getMappedForeignColumn($col->getName()))."', ".($col->isNotNull() ? 'true' : 'false').", ".$size.", $default);"; - } - } else { - $script .= " - \$this->addPrimaryKey('$cup', '$cfc', '".$col->getType()."', ".var_export($col->isNotNull(), true).", ".$size.", $default);"; - } - } else { - if ($col->isForeignKey()) { - foreach ($col->getForeignKeys() as $fk) { - $script .= " - \$this->addForeignKey('$cup', '$cfc', '".$col->getType()."', '".$fk->getForeignTableName()."', '".strtoupper($fk->getMappedForeignColumn($col->getName()))."', ".($col->isNotNull() ? 'true' : 'false').", ".$size.", $default);"; - } - } else { - $script .= " - \$this->addColumn('$cup', '$cfc', '".$col->getType()."', ".var_export($col->isNotNull(), true).", ".$size.", $default);"; - } - } // if col-is prim key - } // foreach - - // validators - $script .= " - // validators"; - foreach ($table->getValidators() as $val) { - $col = $val->getColumn(); - $cup = strtoupper($col->getName()); - foreach ($val->getRules() as $rule) { - if ($val->getTranslate() !== Validator::TRANSLATE_NONE) { - $script .= " - \$this->addValidator('$cup', '".$rule->getName()."', '".$rule->getClass()."', '".str_replace("'", "\'", $rule->getValue())."', ".$val->getTranslate()."('".str_replace("'", "\'", $rule->getMessage())."'));"; - } else { - $script .= " - \$this->addValidator('$cup', '".$rule->getName()."', '".$rule->getClass()."', '".str_replace("'", "\'", $rule->getValue())."', '".str_replace("'", "\'", $rule->getMessage())."');"; - } // if ($rule->getTranslation() ... - } // foreach rule - } // foreach validator - - $script .= " - } // initialize() -"; - - } - - /** - * Adds the method that build the RelationMap objects - * @param string &$script The script will be modified in this method. - */ - protected function addBuildRelations(&$script) - { - $script .= " - /** - * Build the RelationMap objects for this table relationships - */ - public function buildRelations() - {"; - foreach ($this->getTable()->getForeignKeys() as $fkey) - { - $columnMapping = 'array('; - foreach ($fkey->getLocalForeignMapping() as $key => $value) - { - $columnMapping .= "'$key' => '$value', "; - } - $columnMapping .= ')'; - $onDelete = $fkey->hasOnDelete() ? "'" . $fkey->getOnDelete() . "'" : 'null'; - $onUpdate = $fkey->hasOnUpdate() ? "'" . $fkey->getOnUpdate() . "'" : 'null'; - $script .= " - \$this->addRelation('" . $this->getFKPhpNameAffix($fkey) . "', '" . addslashes($this->getNewStubObjectBuilder($fkey->getForeignTable())->getFullyQualifiedClassname()) . "', RelationMap::MANY_TO_ONE, $columnMapping, $onDelete, $onUpdate);"; - } - foreach ($this->getTable()->getReferrers() as $fkey) - { - $columnMapping = 'array('; - foreach ($fkey->getForeignLocalMapping() as $key => $value) - { - $columnMapping .= "'$key' => '$value', "; - } - $columnMapping .= ')'; - $onDelete = $fkey->hasOnDelete() ? "'" . $fkey->getOnDelete() . "'" : 'null'; - $onUpdate = $fkey->hasOnUpdate() ? "'" . $fkey->getOnUpdate() . "'" : 'null'; - $script .= " - \$this->addRelation('" . $this->getRefFKPhpNameAffix($fkey) . "', '" . addslashes($this->getNewStubObjectBuilder($fkey->getTable())->getFullyQualifiedClassname()) . "', RelationMap::ONE_TO_" . ($fkey->isLocalPrimaryKey() ? "ONE" : "MANY") .", $columnMapping, $onDelete, $onUpdate);"; - } - foreach ($this->getTable()->getCrossFks() as $fkList) - { - list($refFK, $crossFK) = $fkList; - $onDelete = $fkey->hasOnDelete() ? "'" . $fkey->getOnDelete() . "'" : 'null'; - $onUpdate = $fkey->hasOnUpdate() ? "'" . $fkey->getOnUpdate() . "'" : 'null'; - $script .= " - \$this->addRelation('" . $this->getFKPhpNameAffix($crossFK) . "', '" . addslashes($this->getNewStubObjectBuilder($crossFK->getForeignTable())->getFullyQualifiedClassname()) . "', RelationMap::MANY_TO_MANY, array(), $onDelete, $onUpdate);"; - } - $script .= " - } // buildRelations() -"; - } - - /** - * Adds the behaviors getter - * @param string &$script The script will be modified in this method. - */ - protected function addGetBehaviors(&$script) - { - if ($behaviors = $this->getTable()->getBehaviors()) - { - $script .= " - /** - * - * Gets the list of behaviors registered for this table - * - * @return array Associative array (name => parameters) of behaviors - */ - public function getBehaviors() - { - return array("; - foreach ($behaviors as $behavior) - { - $script .= " - '{$behavior->getName()}' => array("; - foreach ($behavior->getParameters() as $key => $value) - { - $script .= "'$key' => '$value', "; - } - $script .= "),"; - } - $script .= " - ); - } // getBehaviors() -"; - } - } - - /** - * Checks whether any registered behavior on that table has a modifier for a hook - * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" - * @return boolean - */ - public function hasBehaviorModifier($hookName, $modifier = null) - { - return parent::hasBehaviorModifier($hookName, 'TableMapBuilderModifier'); - } - - /** - * Checks whether any registered behavior on that table has a modifier for a hook - * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" - * @param string &$script The script will be modified in this method. - */ - public function applyBehaviorModifier($hookName, &$script, $tab = " ") - { - return $this->applyBehaviorModifierBase($hookName, 'TableMapBuilderModifier', $script, $tab); - } -} // PHP5TableMapBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/PeerBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/PeerBuilder.php deleted file mode 100644 index 36c8ecb6f2..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/PeerBuilder.php +++ /dev/null @@ -1,305 +0,0 @@ - - * @package propel.generator.builder.om - */ -abstract class PeerBuilder extends OMBuilder -{ - - protected $basePeerClass; - protected $basePeerClassname; - - /** - * Constructs a new PeerBuilder subclass. - */ - public function __construct(Table $table) { - parent::__construct($table); - $this->basePeerClassname = $this->basePeerClass = $this->getBasePeer($table); - $pos = strrpos($this->basePeerClassname, '.'); - if ($pos !== false) { - $this->basePeerClassname = substr($this->basePeerClassname, $pos + 1); - } - } - - /** - * Adds the addSelectColumns(), doCount(), etc. methods. - * @param string &$script The script will be modified in this method. - */ - protected function addSelectMethods(&$script) - { - $this->addAddSelectColumns($script); - - $this->addDoCount($script); - - // consider refactoring the doSelect stuff - // into a top-level method - $this->addDoSelectOne($script); - $this->addDoSelect($script); - $this->addDoSelectStmt($script); // <-- there's PDO code in here - - $this->addAddInstanceToPool($script); - $this->addRemoveInstanceFromPool($script); - $this->addGetInstanceFromPool($script); - $this->addClearInstancePool($script); - $this->addClearRelatedInstancePool($script); - - $this->addGetPrimaryKeyHash($script); - $this->addGetPrimaryKeyFromRow($script); - $this->addPopulateObjects($script); // <-- there's PDO code in here - $this->addPopulateObject($script); - - } - - /** - * Adds the correct getOMClass() method, depending on whether this table uses inheritance. - * @param string &$script The script will be modified in this method. - */ - protected function addGetOMClassMethod(&$script) - { - $table = $this->getTable(); - if ($table->getChildrenColumn()) { - $this->addGetOMClass_Inheritance($script); - } else { - if ($table->isAbstract()) { - $this->addGetOMClass_NoInheritance_Abstract($script); - } else { - $this->addGetOMClass_NoInheritance($script); - } - } - } - - /** - * Adds the doInsert(), doUpdate(), doDeleteAll(), doValidate(), etc. methods. - * @param string &$script The script will be modified in this method. - */ - protected function addUpdateMethods(&$script) - { - $this->addDoInsert($script); - $this->addDoUpdate($script); - $this->addDoDeleteAll($script); - $this->addDoDelete($script); - if ($this->isDeleteCascadeEmulationNeeded()) { - $this->addDoOnDeleteCascade($script); - } - if ($this->isDeleteSetNullEmulationNeeded()) { - $this->addDoOnDeleteSetNull($script); - } - $this->addDoValidate($script); - } - - /** - * Adds the retrieveByPK() (and possibly retrieveByPKs()) method(s) appropriate for this class. - * @param string &$script The script will be modified in this method. - */ - protected function addRetrieveByPKMethods(&$script) - { - if (count($this->getTable()->getPrimaryKey()) === 1) { - $this->addRetrieveByPK_SinglePK($script); - $this->addRetrieveByPKs_SinglePK($script); - } else { - $this->addRetrieveByPK_MultiPK($script); - } - } - - /** - * This method adds the contents of the generated class to the script. - * - * This method contains the high-level logic that determines which methods - * get generated. - * - * Hint: Override this method in your subclass if you want to reorganize or - * drastically change the contents of the generated peer class. - * - * @param string &$script The script will be modified in this method. - */ - protected function addClassBody(&$script) - { - - $table = $this->getTable(); - - if (!$table->isAlias()) { - $this->addConstantsAndAttributes($script); - } - - $this->addTranslateFieldName($script); - $this->addGetFieldNames($script); - - if (!$table->isAlias()) { - $this->addAlias($script); // alias() utility method (deprecated?) - $this->addSelectMethods($script); - $this->addGetTableMap($script); - } - - $this->addBuildTableMap($script); - - $this->addGetOMClassMethod($script); - - // add the insert, update, delete, validate etc. methods - if (!$table->isAlias() && !$table->isReadOnly()) { - $this->addUpdateMethods($script); - } - - if (count($table->getPrimaryKey()) > 0) { - $this->addRetrieveByPKMethods($script); - } - } - - /** - * Whether the platform in use requires ON DELETE CASCADE emulation and whether there are references to this table. - * @return boolean - */ - protected function isDeleteCascadeEmulationNeeded() - { - $table = $this->getTable(); - if ((!$this->getPlatform()->supportsNativeDeleteTrigger() || $this->getBuildProperty('emulateForeignKeyConstraints')) && count($table->getReferrers()) > 0) { - foreach ($table->getReferrers() as $fk) { - if ($fk->getOnDelete() == ForeignKey::CASCADE) { - return true; - } - } - } - return false; - } - - /** - * Whether the platform in use requires ON DELETE SETNULL emulation and whether there are references to this table. - * @return boolean - */ - protected function isDeleteSetNullEmulationNeeded() - { - $table = $this->getTable(); - if ((!$this->getPlatform()->supportsNativeDeleteTrigger() || $this->getBuildProperty('emulateForeignKeyConstraints')) && count($table->getReferrers()) > 0) { - foreach ($table->getReferrers() as $fk) { - if ($fk->getOnDelete() == ForeignKey::SETNULL) { - return true; - } - } - } - return false; - } - - /** - * Whether to add the generic mutator methods (setByName(), setByPosition(), fromArray()). - * This is based on the build property propel.addGenericMutators, and also whether the - * table is read-only or an alias. - * @return boolean - */ - protected function isAddGenericMutators() - { - $table = $this->getTable(); - return (!$table->isAlias() && $this->getBuildProperty('addGenericMutators') && !$table->isReadOnly()); - } - - /** - * Whether to add the generic accessor methods (getByName(), getByPosition(), toArray()). - * This is based on the build property propel.addGenericAccessors, and also whether the - * table is an alias. - * @return boolean - */ - protected function isAddGenericAccessors() - { - $table = $this->getTable(); - return (!$table->isAlias() && $this->getBuildProperty('addGenericAccessors')); - } - - /** - * Returns the retrieveByPK method name to use for this table. - * If the table is an alias then the method name looks like "retrieveTablenameByPK" - * otherwise simply "retrieveByPK". - * @return string - */ - public function getRetrieveMethodName() - { - if ($this->getTable()->isAlias()) { - $retrieveMethod = "retrieve" . $this->getTable()->getPhpName() . "ByPK"; - } else { - $retrieveMethod = "retrieveByPK"; - } - return $retrieveMethod; - } - - - /** - * COMPATIBILITY: Get the column constant name (e.g. PeerName::COLUMN_NAME). - * - * This method exists simply because it belonged to the 'PeerBuilder' that this - * class is replacing (because of name conflict more than actual functionality overlap). - * When the new builder model is finished this method will be removed. - * - * @param Column $col The column we need a name for. - * @param string $phpName The PHP Name of the peer class. The 'Peer' is appended automatically. - * - * @return string If $phpName is provided, then will return {$phpName}Peer::COLUMN_NAME; if not, just COLUMN_NAME. - * @deprecated - */ - public static function getColumnName(Column $col, $phpName = null) { - // was it overridden in schema.xml ? - if ($col->getPeerName()) { - $const = strtoupper($col->getPeerName()); - } else { - $const = strtoupper($col->getName()); - } - if ($phpName !== null) { - return $phpName . 'Peer::' . $const; - } else { - return $const; - } - } - - /** - * Checks whether any registered behavior on that table has a modifier for a hook - * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" - * @return boolean - */ - public function hasBehaviorModifier($hookName, $modifier = null) - { - return parent::hasBehaviorModifier($hookName, 'PeerBuilderModifier'); - } - - /** - * Checks whether any registered behavior on that table has a modifier for a hook - * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" - * @param string &$script The script will be modified in this method. - */ - public function applyBehaviorModifier($hookName, &$script, $tab = " ") - { - return $this->applyBehaviorModifierBase($hookName, 'PeerBuilderModifier', $script, $tab); - } - - /** - * Checks whether any registered behavior content creator on that table exists a contentName - * @param string $contentName The name of the content as called from one of this class methods, e.g. "parentClassname" - */ - public function getBehaviorContent($contentName) - { - return $this->getBehaviorContentBase($contentName, 'PeerBuilderModifier'); - } - - /** - * Get the BasePeer class name for the current table (e.g. 'BasePeer') - * - * @return string The Base Peer Class name - */ - public function getBasePeerClassname() - { - return $this->basePeerClassname; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/QueryBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/QueryBuilder.php deleted file mode 100644 index 1d21aa59a2..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/QueryBuilder.php +++ /dev/null @@ -1,1065 +0,0 @@ -getGeneratorConfig() && $omns = $this->getGeneratorConfig()->getBuildProperty('namespaceOm')) { - return $namespace . '\\' . $omns; - } else { - return $namespace; - } - } - } - - /** - * Returns the name of the current class being built. - * @return string - */ - public function getUnprefixedClassname() - { - return $this->getBuildProperty('basePrefix') . $this->getStubQueryBuilder()->getUnprefixedClassname(); - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - } - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - $table = $this->getTable(); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - $queryClass = $this->getStubQueryBuilder()->getClassname(); - $modelClass = $this->getStubObjectBuilder()->getClassname(); - $parentClass = $this->getBehaviorContent('parentClass'); - $parentClass = null === $parentClass ? 'ModelCriteria' : $parentClass; - $script .= " -/** - * Base class that represents a query for the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - - // magic orderBy() methods, for IDE completion - foreach ($this->getTable()->getColumns() as $column) { - $script .= " - * @method $queryClass orderBy" . $column->getPhpName() . "(\$order = Criteria::ASC) Order by the " . $column->getName() . " column"; - } - $script .= " - *"; - - // magic groupBy() methods, for IDE completion - foreach ($this->getTable()->getColumns() as $column) { - $script .= " - * @method $queryClass groupBy" . $column->getPhpName() . "() Group by the " . $column->getName() . " column"; - } - - // override the signature of ModelCriteria::left-, right- and innerJoin to specify the class of the returned object, for IDE completion - $script .= " - * - * @method $queryClass leftJoin(\$relation) Adds a LEFT JOIN clause to the query - * @method $queryClass rightJoin(\$relation) Adds a RIGHT JOIN clause to the query - * @method $queryClass innerJoin(\$relation) Adds a INNER JOIN clause to the query - *"; - - // magic XXXjoinYYY() methods, for IDE completion - foreach ($this->getTable()->getForeignKeys() as $fk) { - $relationName = $this->getFKPhpNameAffix($fk); - - $script .= " - * @method $queryClass leftJoin" . $relationName . "(\$relationAlias = '') Adds a LEFT JOIN clause to the query using the " . $relationName . " relation - * @method $queryClass rightJoin" . $relationName . "(\$relationAlias = '') Adds a RIGHT JOIN clause to the query using the " . $relationName . " relation - * @method $queryClass innerJoin" . $relationName . "(\$relationAlias = '') Adds a INNER JOIN clause to the query using the " . $relationName . " relation - *"; - } - foreach ($this->getTable()->getReferrers() as $refFK) { - $relationName = $this->getRefFKPhpNameAffix($refFK); - - $script .= " - * @method $queryClass leftJoin" . $relationName . "(\$relationAlias = '') Adds a LEFT JOIN clause to the query using the " . $relationName . " relation - * @method $queryClass rightJoin" . $relationName . "(\$relationAlias = '') Adds a RIGHT JOIN clause to the query using the " . $relationName . " relation - * @method $queryClass innerJoin" . $relationName . "(\$relationAlias = '') Adds a INNER JOIN clause to the query using the " . $relationName . " relation - *"; - } - - // override the signature of ModelCriteria::findOne() to specify the class of the returned object, for IDE completion - $script .= " - * @method $modelClass findOne(PropelPDO \$con = null) Return the first $modelClass matching the query - * @method $modelClass findOneOrCreate(PropelPDO \$con = null) Return the first $modelClass matching the query, or a new $modelClass object populated from the query conditions when no match is found - *"; - - // magic findBy() methods, for IDE completion - foreach ($this->getTable()->getColumns() as $column) { - $script .= " - * @method $modelClass findOneBy" . $column->getPhpName() . "(" . $column->getPhpType() . " \$" . $column->getName() . ") Return the first $modelClass filtered by the " . $column->getName() . " column"; - } - $script .= " - *"; - foreach ($this->getTable()->getColumns() as $column) { - $script .= " - * @method array findBy" . $column->getPhpName() . "(" . $column->getPhpType() . " \$" . $column->getName() . ") Return $modelClass objects filtered by the " . $column->getName() . " column"; - } - - $script .= " - * - * @package propel.generator.".$this->getPackage()." - */ -abstract class ".$this->getClassname()." extends " . $parentClass . " -{ -"; - } - - /** - * Specifies the methods that are added as part of the stub object class. - * - * By default there are no methods for the empty stub classes; override this method - * if you want to change that behavior. - * - * @see ObjectBuilder::addClassBody() - */ - protected function addClassBody(&$script) - { - // namespaces - $this->declareClasses('ModelCriteria', 'Criteria', 'ModelJoin'); - $this->declareClassFromBuilder($this->getStubQueryBuilder()); - $this->declareClassFromBuilder($this->getStubPeerBuilder()); - - // apply behaviors - $this->applyBehaviorModifier('queryAttributes', $script, " "); - $this->addConstructor($script); - $this->addFactory($script); - $this->addFindPk($script); - $this->addFindPks($script); - $this->addFilterByPrimaryKey($script); - $this->addFilterByPrimaryKeys($script); - foreach ($this->getTable()->getColumns() as $col) { - $this->addFilterByCol($script, $col); - } - foreach ($this->getTable()->getForeignKeys() as $fk) { - $this->addFilterByFK($script, $fk); - $this->addJoinFk($script, $fk); - $this->addUseFKQuery($script, $fk); - } - foreach ($this->getTable()->getReferrers() as $refFK) { - $this->addFilterByRefFK($script, $refFK); - $this->addJoinRefFk($script, $refFK); - $this->addUseRefFKQuery($script, $refFK); - } - foreach ($this->getTable()->getCrossFks() as $fkList) { - list($refFK, $crossFK) = $fkList; - $this->addFilterByCrossFK($script, $refFK, $crossFK); - } - $this->addPrune($script); - $this->addBasePreSelect($script); - $this->addBasePreDelete($script); - $this->addBasePostDelete($script); - $this->addBasePreUpdate($script); - $this->addBasePostUpdate($script); - // apply behaviors - $this->applyBehaviorModifier('queryMethods', $script, " "); - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - $this->applyBehaviorModifier('queryFilter', $script, ""); - } - - /** - * Adds the constructor for this object. - * @param string &$script The script will be modified in this method. - * @see addConstructor() - */ - protected function addConstructor(&$script) - { - $this->addConstructorComment($script); - $this->addConstructorOpen($script); - $this->addConstructorBody($script); - $this->addConstructorClose($script); - } - - /** - * Adds the comment for the constructor - * @param string &$script The script will be modified in this method. - **/ - protected function addConstructorComment(&$script) - { - $script .= " - /** - * Initializes internal state of ".$this->getClassname()." object. - * - * @param string \$dbName The dabase name - * @param string \$modelName The phpName of a model, e.g. 'Book' - * @param string \$modelAlias The alias for the model in this query, e.g. 'b' - */"; - } - - /** - * Adds the function declaration for the constructor - * @param string &$script The script will be modified in this method. - **/ - protected function addConstructorOpen(&$script) - { - $table = $this->getTable(); - $script .= " - public function __construct(\$dbName = '" . $table->getDatabase()->getName() . "', \$modelName = '" . addslashes($this->getNewStubObjectBuilder($table)->getFullyQualifiedClassname()) . "', \$modelAlias = null) - {"; - } - - /** - * Adds the function body for the constructor - * @param string &$script The script will be modified in this method. - **/ - protected function addConstructorBody(&$script) - { - $script .= " - parent::__construct(\$dbName, \$modelName, \$modelAlias);"; - } - - /** - * Adds the function close for the constructor - * @param string &$script The script will be modified in this method. - **/ - protected function addConstructorClose(&$script) - { - $script .= " - } -"; - } - - /** - * Adds the factory for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addFactory(&$script) - { - $this->addFactoryComment($script); - $this->addFactoryOpen($script); - $this->addFactoryBody($script); - $this->addFactoryClose($script); - } - - /** - * Adds the comment for the factory - * @param string &$script The script will be modified in this method. - **/ - protected function addFactoryComment(&$script) - { - $classname = $this->getNewStubQueryBuilder($this->getTable())->getClassname(); - $script .= " - /** - * Returns a new " . $classname . " object. - * - * @param string \$modelAlias The alias of a model in the query - * @param Criteria \$criteria Optional Criteria to build the query from - * - * @return " . $classname . " - */"; - } - - /** - * Adds the function declaration for the factory - * @param string &$script The script will be modified in this method. - **/ - protected function addFactoryOpen(&$script) - { - $script .= " - public static function create(\$modelAlias = null, \$criteria = null) - {"; - } - - /** - * Adds the function body for the factory - * @param string &$script The script will be modified in this method. - **/ - protected function addFactoryBody(&$script) - { - $classname = $this->getNewStubQueryBuilder($this->getTable())->getClassname(); - $script .= " - if (\$criteria instanceof " . $classname . ") { - return \$criteria; - } - \$query = new " . $classname . "(); - if (null !== \$modelAlias) { - \$query->setModelAlias(\$modelAlias); - } - if (\$criteria instanceof Criteria) { - \$query->mergeWith(\$criteria); - } - return \$query;"; - } - - /** - * Adds the function close for the factory - * @param string &$script The script will be modified in this method. - **/ - protected function addFactoryClose(&$script) - { - $script .= " - } -"; - } - - - /** - * Adds the findPk method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addFindPk(&$script) - { - $table = $this->getTable(); - $pks = $table->getPrimaryKey(); - $class = $class = $this->getStubObjectBuilder()->getClassname(); - $script .= " - /** - * Find object by primary key"; - if (count($pks) === 1) { - $pkType = 'mixed'; - $script .= " - * Use instance pooling to avoid a database query if the object exists - * - * \$obj = \$c->findPk(12, \$con);"; - } else { - $examplePk = array_slice(array(12, 34, 56, 78, 91), 0, count($pks)); - $colNames = array(); - foreach ($pks as $col) { - $colNames[]= '$' . $col->getName(); - } - $pkType = 'array['. join($colNames, ', ') . ']'; - $script .= " - * - * \$obj = \$c->findPk(array(" . join($examplePk, ', ') . "), \$con);"; - } - $script .= " - * - * @param " . $pkType . " \$key Primary key to use for the query - * @param PropelPDO \$con an optional connection object - * - * @return " . $class . "|array|mixed the result, formatted by the current formatter - */ - public function findPk(\$key, \$con = null) - {"; - if (count($pks) === 1) { - $poolKeyHashParams = '$key'; - } else { - $poolKeyHashParams = array(); - for ($i = 0, $count = count($pks); $i < $count; $i++) { - $poolKeyHashParams[]= '$key[' . $i . ']'; - } - } - // tip: we don't use findOne() to avoid putting an unecessary LIMIT 1 statement, - // which may be costly on platforms not natively supporting LIMIT (like Oracle) - $script .= " - if ((null !== (\$obj = ".$this->getPeerClassname()."::getInstanceFromPool(".$this->getPeerBuilder()->getInstancePoolKeySnippet($poolKeyHashParams)."))) && \$this->getFormatter()->isObjectFormatter()) { - // the object is alredy in the instance pool - return \$obj; - } else { - // the object has not been requested yet, or the formatter is not an object formatter - \$criteria = \$this->isKeepQuery() ? clone \$this : \$this; - \$stmt = \$criteria - ->filterByPrimaryKey(\$key) - ->getSelectStatement(\$con); - return \$criteria->getFormatter()->init(\$criteria)->formatOne(\$stmt); - } - } -"; - } - - /** - * Adds the findPks method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addFindPks(&$script) - { - $table = $this->getTable(); - $pks = $table->getPrimaryKey(); - $count = count($pks); - $script .= " - /** - * Find objects by primary key - * "; - if ($count === 1) { - $script .= " - * \$objs = \$c->findPks(array(12, 56, 832), \$con);"; - } else { - $script .= " - * \$objs = \$c->findPks(array(array(12, 56), array(832, 123), array(123, 456)), \$con);"; - } - $script .= " - * - * @param array \$keys Primary keys to use for the query - * @param PropelPDO \$con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks(\$keys, \$con = null) - { - \$criteria = \$this->isKeepQuery() ? clone \$this : \$this; - return \$this - ->filterByPrimaryKeys(\$keys) - ->find(\$con); - } -"; - } - - /** - * Adds the filterByPrimaryKey method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addFilterByPrimaryKey(&$script) - { - $script .= " - /** - * Filter the query by primary key - * - * @param mixed \$key Primary key to use for the query - * - * @return " . $this->getStubQueryBuilder()->getClassname() . " The current query, for fluid interface - */ - public function filterByPrimaryKey(\$key) - {"; - $table = $this->getTable(); - $pks = $table->getPrimaryKey(); - if (count($pks) === 1) { - // simple primary key - $col = $pks[0]; - $const = $this->getColumnConstant($col); - $script .= " - return \$this->addUsingAlias($const, \$key, Criteria::EQUAL);"; - } else { - // composite primary key - $i = 0; - foreach ($pks as $col) { - $const = $this->getColumnConstant($col); - $script .= " - \$this->addUsingAlias($const, \$key[$i], Criteria::EQUAL);"; - $i++; - } - $script .= " - - return \$this;"; - } - $script .= " - } -"; - } - - /** - * Adds the filterByPrimaryKey method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addFilterByPrimaryKeys(&$script) - { - $script .= " - /** - * Filter the query by a list of primary keys - * - * @param array \$keys The list of primary key to use for the query - * - * @return " . $this->getStubQueryBuilder()->getClassname() . " The current query, for fluid interface - */ - public function filterByPrimaryKeys(\$keys) - {"; - $table = $this->getTable(); - $pks = $table->getPrimaryKey(); - if (count($pks) === 1) { - // simple primary key - $col = $pks[0]; - $const = $this->getColumnConstant($col); - $script .= " - return \$this->addUsingAlias($const, \$keys, Criteria::IN);"; - } else { - // composite primary key - $script .= " - foreach (\$keys as \$key) {"; - $i = 0; - foreach ($pks as $col) { - $const = $this->getColumnConstant($col); - $script .= " - \$cton$i = \$this->getNewCriterion($const, \$key[$i], Criteria::EQUAL);"; - if ($i>0) { - $script .= " - \$cton0->addAnd(\$cton$i);"; - } - $i++; - } - $script .= " - \$this->addOr(\$cton0); - }"; - $script .= " - - return \$this;"; - } - $script .= " - } -"; - } - - /** - * Adds the filterByCol method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addFilterByCol(&$script, $col) - { - $colPhpName = $col->getPhpName(); - $colName = $col->getName(); - $variableName = $col->getStudlyPhpName(); - $qualifiedName = $this->getColumnConstant($col); - $script .= " - /** - * Filter the query on the $colName column - * "; - if ($col->isNumericType() || $col->isTemporalType()) { - $script .= " - * @param " . $col->getPhpType() . "|array \$$variableName The value to use as filter. - * Accepts an associative array('min' => \$minValue, 'max' => \$maxValue)"; - } elseif ($col->isTextType()) { - $script .= " - * @param string \$$variableName The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE)"; - } elseif ($col->isBooleanType()) { - $script .= " - * @param boolean|string \$$variableName The value to use as filter. - * Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true)"; - } else { - $script .= " - * @param mixed \$$variableName The value to use as filter"; - } - $script .= " - * @param string \$comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return " . $this->getStubQueryBuilder()->getClassname() . " The current query, for fluid interface - */ - public function filterBy$colPhpName(\$$variableName = null, \$comparison = null) - {"; - if ($col->isPrimaryKey() && ($col->getType() == PropelTypes::INTEGER || $col->getType() == PropelTypes::BIGINT)) { - $script .= " - if (is_array(\$$variableName) && null === \$comparison) { - \$comparison = Criteria::IN; - }"; - } elseif ($col->isNumericType() || $col->isTemporalType()) { - $script .= " - if (is_array(\$$variableName)) { - \$useMinMax = false; - if (isset(\${$variableName}['min'])) { - \$this->addUsingAlias($qualifiedName, \${$variableName}['min'], Criteria::GREATER_EQUAL); - \$useMinMax = true; - } - if (isset(\${$variableName}['max'])) { - \$this->addUsingAlias($qualifiedName, \${$variableName}['max'], Criteria::LESS_EQUAL); - \$useMinMax = true; - } - if (\$useMinMax) { - return \$this; - } - if (null === \$comparison) { - \$comparison = Criteria::IN; - } - }"; - } elseif ($col->isTextType()) { - $script .= " - if (null === \$comparison) { - if (is_array(\$$variableName)) { - \$comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', \$$variableName)) { - \$$variableName = str_replace('*', '%', \$$variableName); - \$comparison = Criteria::LIKE; - } - }"; - } elseif ($col->isBooleanType()) { - $script .= " - if (is_string(\$$variableName)) { - \$$colName = in_array(strtolower(\$$variableName), array('false', 'off', '-', 'no', 'n', '0')) ? false : true; - }"; - } - $script .= " - return \$this->addUsingAlias($qualifiedName, \$$variableName, \$comparison); - } -"; - } - - /** - * Adds the filterByFk method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addFilterByFk(&$script, $fk) - { - $table = $this->getTable(); - $queryClass = $this->getStubQueryBuilder()->getClassname(); - $fkTable = $this->getForeignTable($fk); - $fkPhpName = $this->getNewStubObjectBuilder($fkTable)->getClassname(); - $relationName = $this->getFKPhpNameAffix($fk); - $objectName = '$' . $fkTable->getStudlyPhpName(); - $script .= " - /** - * Filter the query by a related $fkPhpName object - * - * @param $fkPhpName $objectName the related object to use as filter - * @param string \$comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return $queryClass The current query, for fluid interface - */ - public function filterBy$relationName($objectName, \$comparison = null) - { - return \$this"; - foreach ($fk->getLocalForeignMapping() as $localColumn => $foreignColumn) { - $localColumnObject = $table->getColumn($localColumn); - $foreignColumnObject = $fkTable->getColumn($foreignColumn); - $script .= " - ->addUsingAlias(" . $this->getColumnConstant($localColumnObject) . ", " . $objectName . "->get" . $foreignColumnObject->getPhpName() . "(), \$comparison)"; - } - $script .= "; - } -"; - } - - /** - * Adds the filterByRefFk method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addFilterByRefFk(&$script, $fk) - { - $table = $this->getTable(); - $queryClass = $this->getStubQueryBuilder()->getClassname(); - $fkTable = $this->getTable()->getDatabase()->getTable($fk->getTableName()); - $fkPhpName = $this->getNewStubObjectBuilder($fkTable)->getClassname(); - $relationName = $this->getRefFKPhpNameAffix($fk); - $objectName = '$' . $fkTable->getStudlyPhpName(); - $script .= " - /** - * Filter the query by a related $fkPhpName object - * - * @param $fkPhpName $objectName the related object to use as filter - * @param string \$comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return $queryClass The current query, for fluid interface - */ - public function filterBy$relationName($objectName, \$comparison = null) - { - return \$this"; - foreach ($fk->getForeignLocalMapping() as $localColumn => $foreignColumn) { - $localColumnObject = $table->getColumn($localColumn); - $foreignColumnObject = $fkTable->getColumn($foreignColumn); - $script .= " - ->addUsingAlias(" . $this->getColumnConstant($localColumnObject) . ", " . $objectName . "->get" . $foreignColumnObject->getPhpName() . "(), \$comparison)"; - } - $script .= "; - } -"; - } - - /** - * Adds the joinFk method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addJoinFk(&$script, $fk) - { - $table = $this->getTable(); - $queryClass = $this->getStubQueryBuilder()->getClassname(); - $fkTable = $this->getForeignTable($fk); - $relationName = $this->getFKPhpNameAffix($fk); - $joinType = $this->getJoinType($fk); - $this->addJoinRelated($script, $fkTable, $queryClass, $relationName, $joinType); - } - - /** - * Adds the joinRefFk method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addJoinRefFk(&$script, $fk) - { - $table = $this->getTable(); - $queryClass = $this->getStubQueryBuilder()->getClassname(); - $fkTable = $this->getTable()->getDatabase()->getTable($fk->getTableName()); - $relationName = $this->getRefFKPhpNameAffix($fk); - $joinType = $this->getJoinType($fk); - $this->addJoinRelated($script, $fkTable, $queryClass, $relationName, $joinType); - } - - /** - * Adds a joinRelated method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addJoinRelated(&$script, $fkTable, $queryClass, $relationName, $joinType) - { - $script .= " - /** - * Adds a JOIN clause to the query using the " . $relationName . " relation - * - * @param string \$relationAlias optional alias for the relation - * @param string \$joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return ". $queryClass . " The current query, for fluid interface - */ - public function join" . $relationName . "(\$relationAlias = '', \$joinType = " . $joinType . ") - { - \$tableMap = \$this->getTableMap(); - \$relationMap = \$tableMap->getRelation('" . $relationName . "'); - - // create a ModelJoin object for this join - \$join = new ModelJoin(); - \$join->setJoinType(\$joinType); - \$join->setRelationMap(\$relationMap, \$this->useAliasInSQL ? \$this->getModelAlias() : null, \$relationAlias); - if (\$previousJoin = \$this->getPreviousJoin()) { - \$join->setPreviousJoin(\$previousJoin); - } - - // add the ModelJoin to the current object - if(\$relationAlias) { - \$this->addAlias(\$relationAlias, \$relationMap->getRightTable()->getName()); - \$this->addJoinObject(\$join, \$relationAlias); - } else { - \$this->addJoinObject(\$join, '" . $relationName . "'); - } - - return \$this; - } -"; - } - - /** - * Adds the useFkQuery method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addUseFkQuery(&$script, $fk) - { - $table = $this->getTable(); - $fkTable = $this->getForeignTable($fk); - $queryClass = $this->getNewStubQueryBuilder($fkTable)->getClassname(); - $relationName = $this->getFKPhpNameAffix($fk); - $joinType = $this->getJoinType($fk); - $this->addUseRelatedQuery($script, $fkTable, $queryClass, $relationName, $joinType); - } - - /** - * Adds the useFkQuery method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addUseRefFkQuery(&$script, $fk) - { - $table = $this->getTable(); - $fkTable = $this->getTable()->getDatabase()->getTable($fk->getTableName()); - $queryClass = $this->getNewStubQueryBuilder($fkTable)->getClassname(); - $relationName = $this->getRefFKPhpNameAffix($fk); - $joinType = $this->getJoinType($fk); - $this->addUseRelatedQuery($script, $fkTable, $queryClass, $relationName, $joinType); - } - - /** - * Adds a useRelatedQuery method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addUseRelatedQuery(&$script, $fkTable, $queryClass, $relationName, $joinType) - { - $script .= " - /** - * Use the $relationName relation " . $fkTable->getPhpName() . " object - * - * @see useQuery() - * - * @param string \$relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string \$joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return $queryClass A secondary query class using the current class as primary query - */ - public function use" . $relationName . "Query(\$relationAlias = '', \$joinType = " . $joinType . ") - { - return \$this - ->join" . $relationName . "(\$relationAlias, \$joinType) - ->useQuery(\$relationAlias ? \$relationAlias : '$relationName', '$queryClass'); - } -"; - } - - protected function addFilterByCrossFK(&$script, $refFK, $crossFK) - { - $queryClass = $this->getStubQueryBuilder()->getClassname(); - $crossRefTable = $crossFK->getTable(); - $foreignTable = $crossFK->getForeignTable(); - $fkPhpName = $foreignTable->getPhpName(); - $crossTableName = $crossRefTable->getName(); - $relName = $this->getFKPhpNameAffix($crossFK, $plural = false); - $objectName = '$' . $foreignTable->getStudlyPhpName(); - $relationName = $this->getRefFKPhpNameAffix($refFK, $plural = false); - $script .= " - /** - * Filter the query by a related $fkPhpName object - * using the $crossTableName table as cross reference - * - * @param $fkPhpName $objectName the related object to use as filter - * @param string \$comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return $queryClass The current query, for fluid interface - */ - public function filterBy{$relName}($objectName, \$comparison = Criteria::EQUAL) - { - return \$this - ->use{$relationName}Query() - ->filterBy{$relName}($objectName, \$comparison) - ->endUse(); - } - "; - } - - /** - * Adds the prune method for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addPrune(&$script) - { - $table = $this->getTable(); - $class = $this->getStubObjectBuilder()->getClassname(); - $objectName = '$' . $table->getStudlyPhpName(); - $script .= " - /** - * Exclude object from result - * - * @param $class $objectName Object to remove from the list of results - * - * @return " . $this->getStubQueryBuilder()->getClassname() . " The current query, for fluid interface - */ - public function prune($objectName = null) - { - if ($objectName) {"; - $pks = $table->getPrimaryKey(); - if (count($pks) > 1) { - $i = 0; - $conditions = array(); - foreach ($pks as $col) { - $const = $this->getColumnConstant($col); - $condName = "'pruneCond" . $i . "'"; - $conditions[]= $condName; - $script .= " - \$this->addCond(". $condName . ", \$this->getAliasedColName($const), " . $objectName . "->get" . $col->getPhpName() . "(), Criteria::NOT_EQUAL);"; - $i++; - } - $conditionsString = implode(', ', $conditions); - $script .= " - \$this->combine(array(" . $conditionsString . "), Criteria::LOGICAL_OR);"; - } else { - $col = $pks[0]; - $const = $this->getColumnConstant($col); - $script .= " - \$this->addUsingAlias($const, " . $objectName . "->get" . $col->getPhpName() . "(), Criteria::NOT_EQUAL);"; - } - $script .= " - } - - return \$this; - } -"; - } - - /** - * Adds the basePreSelect hook for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addBasePreSelect(&$script) - { - $behaviorCode = ''; - $this->applyBehaviorModifier('preSelectQuery', $behaviorCode, " "); - if (!$behaviorCode) { - return; - } - $script .= " - /** - * Code to execute before every SELECT statement - * - * @param PropelPDO \$con The connection object used by the query - */ - protected function basePreSelect(PropelPDO \$con) - {" . $behaviorCode . " - - return \$this->preSelect(\$con); - } -"; - } - - /** - * Adds the basePreDelete hook for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addBasePreDelete(&$script) - { - $behaviorCode = ''; - $this->applyBehaviorModifier('preDeleteQuery', $behaviorCode, " "); - if (!$behaviorCode) { - return; - } - $script .= " - /** - * Code to execute before every DELETE statement - * - * @param PropelPDO \$con The connection object used by the query - */ - protected function basePreDelete(PropelPDO \$con) - {" . $behaviorCode . " - - return \$this->preDelete(\$con); - } -"; - } - - /** - * Adds the basePostDelete hook for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addBasePostDelete(&$script) - { - $behaviorCode = ''; - $this->applyBehaviorModifier('postDeleteQuery', $behaviorCode, " "); - if (!$behaviorCode) { - return; - } - $script .= " - /** - * Code to execute after every DELETE statement - * - * @param int \$affectedRows the number of deleted rows - * @param PropelPDO \$con The connection object used by the query - */ - protected function basePostDelete(\$affectedRows, PropelPDO \$con) - {" . $behaviorCode . " - - return \$this->postDelete(\$affectedRows, \$con); - } -"; - } - - /** - * Adds the basePreUpdate hook for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addBasePreUpdate(&$script) - { - $behaviorCode = ''; - $this->applyBehaviorModifier('preUpdateQuery', $behaviorCode, " "); - if (!$behaviorCode) { - return; - } - $script .= " - /** - * Code to execute before every UPDATE statement - * - * @param array \$values The associatiove array of columns and values for the update - * @param PropelPDO \$con The connection object used by the query - * @param boolean \$forceIndividualSaves If false (default), the resulting call is a BasePeer::doUpdate(), ortherwise it is a series of save() calls on all the found objects - */ - protected function basePreUpdate(&\$values, PropelPDO \$con, \$forceIndividualSaves = false) - {" . $behaviorCode . " - - return \$this->preUpdate(\$values, \$con, \$forceIndividualSaves); - } -"; - } - - /** - * Adds the basePostUpdate hook for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addBasePostUpdate(&$script) - { - $behaviorCode = ''; - $this->applyBehaviorModifier('postUpdateQuery', $behaviorCode, " "); - if (!$behaviorCode) { - return; - } - $script .= " - /** - * Code to execute after every UPDATE statement - * - * @param int \$affectedRows the number of udated rows - * @param PropelPDO \$con The connection object used by the query - */ - protected function basePostUpdate(\$affectedRows, PropelPDO \$con) - {" . $behaviorCode . " - - return \$this->postUpdate(\$affectedRows, \$con); - } -"; - } - - /** - * Checks whether any registered behavior on that table has a modifier for a hook - * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" - * @return boolean - */ - public function hasBehaviorModifier($hookName, $modifier = null) - { - return parent::hasBehaviorModifier($hookName, 'QueryBuilderModifier'); - } - - /** - * Checks whether any registered behavior on that table has a modifier for a hook - * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" - * @param string &$script The script will be modified in this method. - */ - public function applyBehaviorModifier($hookName, &$script, $tab = " ") - { - return $this->applyBehaviorModifierBase($hookName, 'QueryBuilderModifier', $script, $tab); - } - - /** - * Checks whether any registered behavior content creator on that table exists a contentName - * @param string $contentName The name of the content as called from one of this class methods, e.g. "parentClassname" - */ - public function getBehaviorContent($contentName) - { - return $this->getBehaviorContentBase($contentName, 'QueryBuilderModifier'); - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/om/QueryInheritanceBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/om/QueryInheritanceBuilder.php deleted file mode 100644 index 316a87949c..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/om/QueryInheritanceBuilder.php +++ /dev/null @@ -1,276 +0,0 @@ -getBuildProperty('basePrefix') . $this->getNewStubQueryInheritanceBuilder($this->getChild())->getUnprefixedClassname(); - } - - /** - * Gets the package for the [base] object classes. - * @return string - */ - public function getPackage() - { - return parent::getPackage() . ".om"; - } - - public function getNamespace() - { - if ($namespace = parent::getNamespace()) { - if ($this->getGeneratorConfig() && $omns = $this->getGeneratorConfig()->getBuildProperty('namespaceOm')) { - return $namespace . '\\' . $omns; - } else { - return $namespace; - } - } - } - - /** - * Set the child object that we're operating on currrently. - * @param $child Inheritance - */ - public function setChild(Inheritance $child) - { - $this->child = $child; - } - - /** - * Returns the child object we're operating on currently. - * @return Inheritance - * @throws BuildException - if child was not set. - */ - public function getChild() - { - if (!$this->child) { - throw new BuildException("The PHP5MultiExtendObjectBuilder needs to be told which child class to build (via setChild() method) before it can build the stub class."); - } - return $this->child; - } - - /** - * Adds the include() statements for files that this class depends on or utilizes. - * @param string &$script The script will be modified in this method. - */ - protected function addIncludes(&$script) - { - $requiredClassFilePath = $this->getStubQueryBuilder()->getClassFilePath(); - - $script .=" -require '".$requiredClassFilePath."'; -"; - } // addIncludes() - - /** - * Adds class phpdoc comment and openning of class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassOpen(&$script) - { - $table = $this->getTable(); - $tableName = $table->getName(); - $tableDesc = $table->getDescription(); - - $baseBuilder = $this->getStubQueryBuilder(); - $this->declareClassFromBuilder($baseBuilder); - $baseClassname = $baseBuilder->getClassname(); - - $script .= " -/** - * Skeleton subclass for representing a query for one of the subclasses of the '$tableName' table. - * - * $tableDesc - *"; - if ($this->getBuildProperty('addTimeStamp')) { - $now = strftime('%c'); - $script .= " - * This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on: - * - * $now - *"; - } - $script .= " - * You should add additional methods to this class to meet the - * application requirements. This class will only be generated as - * long as it does not already exist in the output directory. - * - * @package propel.generator.".$this->getPackage()." - */ -class " .$this->getClassname() . " extends " . $baseClassname . " { -"; - } - - /** - * Specifies the methods that are added as part of the stub object class. - * - * By default there are no methods for the empty stub classes; override this method - * if you want to change that behavior. - * - * @see ObjectBuilder::addClassBody() - */ - protected function addClassBody(&$script) - { - $this->declareClassFromBuilder($this->getStubPeerBuilder()); - $this->declareClasses('PropelPDO', 'Criteria'); - $this->addFactory($script); - $this->addPreSelect($script); - $this->addPreUpdate($script); - $this->addPreDelete($script); - $this->addDoDeleteAll($script); - } - - /** - * Adds the factory for this object. - * @param string &$script The script will be modified in this method. - */ - protected function addFactory(&$script) - { - $builder = $this->getNewStubQueryInheritanceBuilder($this->getChild()); - $this->declareClassFromBuilder($builder); - $classname = $builder->getClassname(); - $script .= " - /** - * Returns a new " . $classname . " object. - * - * @param string \$modelAlias The alias of a model in the query - * @param Criteria \$criteria Optional Criteria to build the query from - * - * @return " . $classname . " - */ - public static function create(\$modelAlias = null, \$criteria = null) - { - if (\$criteria instanceof " . $classname . ") { - return \$criteria; - } - \$query = new " . $classname . "(); - if (null !== \$modelAlias) { - \$query->setModelAlias(\$modelAlias); - } - if (\$criteria instanceof Criteria) { - \$query->mergeWith(\$criteria); - } - return \$query; - } -"; - } - - protected function addPreSelect(&$script) - { - $child = $this->getChild(); - $col = $child->getColumn(); - - $script .= " - /** - * Filters the query to target only " . $child->getClassname() . " objects. - */ - public function preSelect(PropelPDO \$con) - { - " . $this->getClassKeyCondition() . " - } -"; - } - - protected function addPreUpdate(&$script) - { - $child = $this->getChild(); - $col = $child->getColumn(); - - $script .= " - /** - * Filters the query to target only " . $child->getClassname() . " objects. - */ - public function preUpdate(&\$values, PropelPDO \$con, \$forceIndividualSaves = false) - { - " . $this->getClassKeyCondition() . " - } -"; - } - - protected function addPreDelete(&$script) - { - $child = $this->getChild(); - $col = $child->getColumn(); - - $script .= " - /** - * Filters the query to target only " . $child->getClassname() . " objects. - */ - public function preDelete(PropelPDO \$con) - { - " . $this->getClassKeyCondition() . " - } -"; - } - - protected function getClassKeyCondition() - { - $child = $this->getChild(); - $col = $child->getColumn(); - return "\$this->addUsingAlias(" . $col->getConstantName() . ", " . $this->getPeerClassname()."::CLASSKEY_".strtoupper($child->getKey()).");"; - } - - protected function addDoDeleteAll(&$script) - { - $child = $this->getChild(); - - $script .= " - /** - * Issue a DELETE query based on the current ModelCriteria deleting all rows in the table - * Having the " . $child->getClassname() . " class. - * This method is called by ModelCriteria::deleteAll() inside a transaction - * - * @param PropelPDO \$con a connection object - * - * @return integer the number of deleted rows - */ - public function doDeleteAll(\$con) - { - // condition on class key is already added in preDelete() - return parent::doDelete(\$con); - } -"; - } - - /** - * Closes class. - * @param string &$script The script will be modified in this method. - */ - protected function addClassClose(&$script) - { - $script .= " -} // " . $this->getClassname() . " -"; - } - -} // MultiExtensionQueryBuilder diff --git a/airtime_mvc/library/propel/generator/lib/builder/sql/DDLBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/sql/DDLBuilder.php deleted file mode 100644 index db7fffa79d..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/sql/DDLBuilder.php +++ /dev/null @@ -1,166 +0,0 @@ - - * @package propel.generator.builder.sql - */ -abstract class DDLBuilder extends DataModelBuilder -{ - - /** - * Builds the SQL for current table and returns it as a string. - * - * This is the main entry point and defines a basic structure that classes should follow. - * In most cases this method will not need to be overridden by subclasses. - * - * @return string The resulting SQL DDL. - */ - public function build() - { - $script = ""; - $this->addTable($script); - $this->addIndices($script); - $this->addForeignKeys($script); - return $script; - } - - /** - * Gets the name to use for creating a sequence for the current table. - * - * This will create a new name or use one specified in an id-method-parameter - * tag, if specified. - * - * @return string Sequence name for this table. - */ - public function getSequenceName() - { - $table = $this->getTable(); - static $longNamesMap = array(); - $result = null; - if ($table->getIdMethod() == IDMethod::NATIVE) { - $idMethodParams = $table->getIdMethodParameters(); - $maxIdentifierLength = $table->getDatabase()->getPlatform()->getMaxColumnNameLength(); - if (empty($idMethodParams)) { - if (strlen($table->getName() . "_SEQ") > $maxIdentifierLength) { - if (!isset($longNamesMap[$table->getName()])) { - $longNamesMap[$table->getName()] = strval(count($longNamesMap) + 1); - } - $result = substr($table->getName(), 0, $maxIdentifierLength - strlen("_SEQ_" . $longNamesMap[$table->getName()])) . "_SEQ_" . $longNamesMap[$table->getName()]; - } - else { - $result = substr($table->getName(), 0, $maxIdentifierLength -4) . "_SEQ"; - } - } else { - $result = substr($idMethodParams[0]->getValue(), 0, $maxIdentifierLength); - } - } - return $result; - } - - /** - * Builds the DDL SQL for a Column object. - * @return string - */ - public function getColumnDDL(Column $col) - { - $platform = $this->getPlatform(); - $domain = $col->getDomain(); - - $sb = ""; - $sb .= $this->quoteIdentifier($col->getName()) . " "; - $sb .= $domain->getSqlType(); - if ($platform->hasSize($domain->getSqlType())) { - $sb .= $domain->printSize(); - } - $sb .= " "; - $sb .= $col->getDefaultSetting() . " "; - $sb .= $col->getNotNullString() . " "; - $sb .= $col->getAutoIncrementString(); - - return trim($sb); - } - - /** - * Creates a delimiter-delimited string list of column names, quoted using quoteIdentifier(). - * @param array Column[] or string[] - * @param string $delim The delimiter to use in separating the column names. - * @return string - */ - public function getColumnList($columns, $delim=',') - { - $list = array(); - foreach ($columns as $col) { - if ($col instanceof Column) { - $col = $col->getName(); - } - $list[] = $this->quoteIdentifier($col); - } - return implode($delim, $list); - } - - /** - * This function adds any _database_ start/initialization SQL. - * This is designed to be called for a database, not a specific table, hence it is static. - * @return string The DDL is returned as astring. - */ - public static function getDatabaseStartDDL() - { - return ''; - } - - /** - * This function adds any _database_ end/cleanup SQL. - * This is designed to be called for a database, not a specific table, hence it is static. - * @return string The DDL is returned as astring. - */ - public static function getDatabaseEndDDL() - { - return ''; - } - - /** - * Resets any static variables between building a SQL file for a database. - * - * Theoretically, Propel could build multiple .sql files for multiple databases; in - * many cases we don't want static values to persist between these. This method provides - * a way to clear out static values between iterations, if the subclasses choose to implement - * it. - */ - public static function reset() - { - // nothing by default - } - - /** - * Adds table definition. - * @param string &$script The script will be modified in this method. - */ - abstract protected function addTable(&$script); - - /** - * Adds index definitions. - * @param string &$script The script will be modified in this method. - */ - abstract protected function addIndices(&$script); - - /** - * Adds foreign key constraint definitions. - * @param string &$script The script will be modified in this method. - */ - abstract protected function addForeignKeys(&$script); - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/sql/DataSQLBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/sql/DataSQLBuilder.php deleted file mode 100644 index 0124986029..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/sql/DataSQLBuilder.php +++ /dev/null @@ -1,253 +0,0 @@ - - * @package propel.generator.builder.sql - */ -abstract class DataSQLBuilder extends DataModelBuilder -{ - - /** - * Perform any reset between runs of this builder. - * - * This can be used, for example, to clear any stored start/end SQL. - */ - public static function reset() - { - // does nothing by default - } - - /** - * Gets any SQL to place at the start of all the row inserts. - * - * @return string - */ - public static function getDatabaseStartSql() - { - return ''; - } - - /** - * Gets any SQL to place at the end of all the row inserts. - * - * @return string - */ - public static function getDatabaseEndSql() - { - return ''; - } - - /** - * Gets any SQL to place before row inserts for a new table. - * - * @return string - */ - public function getTableStartSql() - { - return ''; - } - - /** - * Gets any SQL to place at the end of row inserts for a table. - * - * @return string - */ - public function getTableEndSql() - { - return ''; - } - - /** - * The main method in this class, returns the SQL for INSERTing data into a row. - * @param DataRow $row The row to process. - * @return string - */ - public function buildRowSql(DataRow $row) - { - $sql = ""; - $platform = $this->getPlatform(); - $table = $this->getTable(); - - $sql .= "INSERT INTO ".$this->quoteIdentifier($this->getTable()->getName())." ("; - - // add column names to SQL - $colNames = array(); - foreach ($row->getColumnValues() as $colValue) { - $colNames[] = $this->quoteIdentifier($colValue->getColumn()->getName()); - } - - $sql .= implode(',', $colNames); - - $sql .= ") VALUES ("; - - $colVals = array(); - foreach ($row->getColumnValues() as $colValue) { - $colVals[] = $this->getColumnValueSql($colValue); - } - - $sql .= implode(',', $colVals); - $sql .= "); -"; - - return $sql; - } - - /** - * Gets the propertly escaped (and quoted) value for a column. - * @param ColumnValue $colValue - * @return mixed The proper value to be added to the string. - */ - protected function getColumnValueSql(ColumnValue $colValue) - { - $column = $colValue->getColumn(); - $method = 'get' . $column->getPhpNative() . 'Sql'; - return $this->$method($colValue->getValue()); - } - - - - /** - * Gets a representation of a binary value suitable for use in a SQL statement. - * Default behavior is true = 1, false = 0. - * @param boolean $value - * @return int - */ - protected function getBooleanSql($value) - { - return (int) $value; - } - - - /** - * Gets a representation of a BLOB/LONGVARBINARY value suitable for use in a SQL statement. - * @param mixed $blob Blob object or string data. - * @return string - */ - protected function getBlobSql($blob) - { - // they took magic __toString() out of PHP5.0.0; this sucks - if (is_object($blob)) { - return $this->getPlatform()->quote($blob->__toString()); - } else { - return $this->getPlatform()->quote($blob); - } - } - - /** - * Gets a representation of a CLOB/LONGVARCHAR value suitable for use in a SQL statement. - * @param mixed $clob Clob object or string data. - * @return string - */ - protected function getClobSql($clob) - { - // they took magic __toString() out of PHP5.0.0; this sucks - if (is_object($clob)) { - return $this->getPlatform()->quote($clob->__toString()); - } else { - return $this->getPlatform()->quote($clob); - } - } - - /** - * Gets a representation of a date value suitable for use in a SQL statement. - * @param string $value - * @return string - */ - protected function getDateSql($value) - { - return "'" . date('Y-m-d', strtotime($value)) . "'"; - } - - /** - * Gets a representation of a decimal value suitable for use in a SQL statement. - * @param double $value - * @return float - */ - protected function getDecimalSql($value) - { - return (float) $value; - } - - /** - * Gets a representation of a double value suitable for use in a SQL statement. - * @param double $value - * @return double - */ - protected function getDoubleSql($value) - { - return (double) $value; - } - - /** - * Gets a representation of a float value suitable for use in a SQL statement. - * @param float $value - * @return float - */ - protected function getFloatSql($value) - { - return (float) $value; - } - - /** - * Gets a representation of an integer value suitable for use in a SQL statement. - * @param int $value - * @return int - */ - protected function getIntSql($value) - { - return (int) $value; - } - - /** - * Gets a representation of a NULL value suitable for use in a SQL statement. - * @return null - */ - protected function getNullSql() - { - return 'NULL'; - } - - /** - * Gets a representation of a string value suitable for use in a SQL statement. - * @param string $value - * @return string - */ - protected function getStringSql($value) - { - return $this->getPlatform()->quote($value); - } - - /** - * Gets a representation of a time value suitable for use in a SQL statement. - * @param string $value - * @return string - */ - protected function getTimeSql($paramIndex, $value) - { - return "'" . date('H:i:s', strtotime($value)) . "'"; - } - - /** - * Gets a representation of a timestamp value suitable for use in a SQL statement. - * @param string $value - * @return string - */ - function getTimestampSql($value) - { - return "'" . date('Y-m-d H:i:s', strtotime($value)) . "'"; - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/sql/mssql/MssqlDDLBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/sql/mssql/MssqlDDLBuilder.php deleted file mode 100644 index 2bd923e3b0..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/sql/mssql/MssqlDDLBuilder.php +++ /dev/null @@ -1,173 +0,0 @@ - - * @package propel.generator.builder.sql.pgsql - */ -class MssqlDDLBuilder extends DDLBuilder -{ - - private static $dropCount = 0; - - /** - * - * @see parent::addDropStatement() - */ - protected function addDropStatements(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - foreach ($table->getForeignKeys() as $fk) { - $script .= " -IF EXISTS (SELECT 1 FROM sysobjects WHERE type ='RI' AND name='".$fk->getName()."') - ALTER TABLE ".$this->quoteIdentifier($table->getName())." DROP CONSTRAINT ".$this->quoteIdentifier($fk->getName())."; -"; - } - - - self::$dropCount++; - - $script .= " -IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name = '".$table->getName()."') -BEGIN - DECLARE @reftable_".self::$dropCount." nvarchar(60), @constraintname_".self::$dropCount." nvarchar(60) - DECLARE refcursor CURSOR FOR - select reftables.name tablename, cons.name constraintname - from sysobjects tables, - sysobjects reftables, - sysobjects cons, - sysreferences ref - where tables.id = ref.rkeyid - and cons.id = ref.constid - and reftables.id = ref.fkeyid - and tables.name = '".$table->getName()."' - OPEN refcursor - FETCH NEXT from refcursor into @reftable_".self::$dropCount.", @constraintname_".self::$dropCount." - while @@FETCH_STATUS = 0 - BEGIN - exec ('alter table '+@reftable_".self::$dropCount."+' drop constraint '+@constraintname_".self::$dropCount.") - FETCH NEXT from refcursor into @reftable_".self::$dropCount.", @constraintname_".self::$dropCount." - END - CLOSE refcursor - DEALLOCATE refcursor - DROP TABLE ".$this->quoteIdentifier($table->getName())." -END -"; - } - - /** - * @see parent::addColumns() - */ - protected function addTable(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - $script .= " -/* ---------------------------------------------------------------------- */ -/* ".$table->getName()." */ -/* ---------------------------------------------------------------------- */ - -"; - - $this->addDropStatements($script); - - $script .= " - -CREATE TABLE ".$this->quoteIdentifier($table->getName())." -( - "; - - $lines = array(); - - foreach ($table->getColumns() as $col) { - $lines[] = $this->getColumnDDL($col); - } - - if ($table->hasPrimaryKey()) { - $lines[] = "CONSTRAINT ".$this->quoteIdentifier($table->getName()."_PK") . " PRIMARY KEY (".$this->getColumnList($table->getPrimaryKey()).")"; - } - - foreach ($table->getUnices() as $unique ) { - $lines[] = "UNIQUE (".$this->getColumnList($unique->getColumns()).")"; - } - - $sep = ", - "; - $script .= implode($sep, $lines); - $script .= " -); -"; - } - - /** - * Adds CREATE INDEX statements for this table. - * @see parent::addIndices() - */ - protected function addIndices(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - foreach ($table->getIndices() as $index) { - $script .= " -CREATE "; - if ($index->getIsUnique()) { - $script .= "UNIQUE"; - } - $script .= "INDEX ".$this->quoteIdentifier($index->getName())." ON ".$this->quoteIdentifier($table->getName())." (".$this->getColumnList($index->getColumns())."); -"; - } - } - - /** - * - * @see parent::addForeignKeys() - */ - protected function addForeignKeys(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - foreach ($table->getForeignKeys() as $fk) { - $script .= " -BEGIN -ALTER TABLE ".$this->quoteIdentifier($table->getName())." ADD CONSTRAINT ".$this->quoteIdentifier($fk->getName())." FOREIGN KEY (".$this->getColumnList($fk->getLocalColumns()) .") REFERENCES ".$this->quoteIdentifier($fk->getForeignTableName())." (".$this->getColumnList($fk->getForeignColumns()).")"; - if ($fk->hasOnUpdate()) { - if ($fk->getOnUpdate() == ForeignKey::SETNULL) { // there may be others that also won't work - // we have to skip this because it's unsupported. - $this->warn("MSSQL doesn't support the 'SET NULL' option for ON UPDATE (ignoring for ".$this->getColumnList($fk->getLocalColumns())." fk)."); - } else { - $script .= " ON UPDATE ".$fk->getOnUpdate(); - } - - } - if ($fk->hasOnDelete()) { - if ($fk->getOnDelete() == ForeignKey::SETNULL) { // there may be others that also won't work - // we have to skip this because it's unsupported. - $this->warn("MSSQL doesn't support the 'SET NULL' option for ON DELETE (ignoring for ".$this->getColumnList($fk->getLocalColumns())." fk)."); - } else { - $script .= " ON DELETE ".$fk->getOnDelete(); - } - } - $script .= " -END -; -"; - } - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/sql/mssql/MssqlDataSQLBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/sql/mssql/MssqlDataSQLBuilder.php deleted file mode 100644 index a72bad2e08..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/sql/mssql/MssqlDataSQLBuilder.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @package propel.generator.builder.sql.mssql - */ -class MssqlDataSQLBuilder extends DataSQLBuilder -{ - - /** - * - * @param mixed $blob Blob object or string containing data. - * @return string - */ - protected function getBlobSql($blob) - { - // they took magic __toString() out of PHP5.0.0; this sucks - if (is_object($blob)) { - $blob = $blob->__toString(); - } - $data = unpack("H*hex", $blob); - return '0x'.$data['hex']; // no surrounding quotes! - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/sql/mysql/MysqlDDLBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/sql/mysql/MysqlDDLBuilder.php deleted file mode 100644 index 67fb15b199..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/sql/mysql/MysqlDDLBuilder.php +++ /dev/null @@ -1,413 +0,0 @@ - - * @package propel.generator.builder.sql.mysql - */ -class MysqlDDLBuilder extends DDLBuilder -{ - - /** - * Returns some header SQL that disables foreign key checking. - * @return string DDL - */ - public static function getDatabaseStartDDL() - { - $ddl = " -# This is a fix for InnoDB in MySQL >= 4.1.x -# It \"suspends judgement\" for fkey relationships until are tables are set. -SET FOREIGN_KEY_CHECKS = 0; -"; - return $ddl; - } - - /** - * Returns some footer SQL that re-enables foreign key checking. - * @return string DDL - */ - public static function getDatabaseEndDDL() - { - $ddl = " -# This restores the fkey checks, after having unset them earlier -SET FOREIGN_KEY_CHECKS = 1; -"; - return $ddl; - } - - - /** - * - * @see parent::addDropStatement() - */ - protected function addDropStatements(&$script) - { - $script .= " -DROP TABLE IF EXISTS ".$this->quoteIdentifier($this->getTable()->getName())."; -"; - } - - /** - * Builds the SQL for current table and returns it as a string. - * - * This is the main entry point and defines a basic structure that classes should follow. - * In most cases this method will not need to be overridden by subclasses. - * - * @return string The resulting SQL DDL. - */ - public function build() - { - $script = ""; - $this->addTable($script); - return $script; - } - - /** - * - * @see parent::addColumns() - */ - protected function addTable(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - $script .= " -#----------------------------------------------------------------------------- -#-- ".$table->getName()." -#----------------------------------------------------------------------------- -"; - - $this->addDropStatements($script); - - $script .= " - -CREATE TABLE ".$this->quoteIdentifier($table->getName())." -( - "; - - $lines = array(); - - $databaseType = $this->getPlatform()->getDatabaseType(); - - foreach ($table->getColumns() as $col) { - $entry = $this->getColumnDDL($col); - $colinfo = $col->getVendorInfoForType($databaseType); - if ( $colinfo->hasParameter('Charset') ) { - $entry .= ' CHARACTER SET '.$platform->quote($colinfo->getParameter('Charset')); - } - if ( $colinfo->hasParameter('Collation') ) { - $entry .= ' COLLATE '.$platform->quote($colinfo->getParameter('Collation')); - } elseif ( $colinfo->hasParameter('Collate') ) { - $entry .= ' COLLATE '.$platform->quote($colinfo->getParameter('Collate')); - } - if ($col->getDescription()) { - $entry .= " COMMENT ".$platform->quote($col->getDescription()); - } - $lines[] = $entry; - } - - if ($table->hasPrimaryKey()) { - $lines[] = "PRIMARY KEY (".$this->getColumnList($table->getPrimaryKey()).")"; - } - - $this->addIndicesLines($lines); - $this->addForeignKeysLines($lines); - - $sep = ", - "; - $script .= implode($sep, $lines); - - $script .= " -)"; - - $vendorSpecific = $table->getVendorInfoForType($this->getPlatform()->getDatabaseType()); - if ($vendorSpecific->hasParameter('Type')) { - $mysqlTableType = $vendorSpecific->getParameter('Type'); - } elseif ($vendorSpecific->hasParameter('Engine')) { - $mysqlTableType = $vendorSpecific->getParameter('Engine'); - } else { - $mysqlTableType = $this->getBuildProperty("mysqlTableType"); - } - - $script .= sprintf(' %s=%s', $this->getBuildProperty("mysqlTableEngineKeyword"), $mysqlTableType); - - $dbVendorSpecific = $table->getDatabase()->getVendorInfoForType($databaseType); - $tableVendorSpecific = $table->getVendorInfoForType($databaseType); - $vendorSpecific = $dbVendorSpecific->getMergedVendorInfo($tableVendorSpecific); - - if ( $vendorSpecific->hasParameter('Charset') ) { - $script .= ' CHARACTER SET '.$platform->quote($vendorSpecific->getParameter('Charset')); - } - if ( $vendorSpecific->hasParameter('Collate') ) { - $script .= ' COLLATE '.$platform->quote($vendorSpecific->getParameter('Collate')); - } - if ( $vendorSpecific->hasParameter('Checksum') ) { - $script .= ' CHECKSUM='.$platform->quote($vendorSpecific->getParameter('Checksum')); - } - if ( $vendorSpecific->hasParameter('Pack_Keys') ) { - $script .= ' PACK_KEYS='.$platform->quote($vendorSpecific->getParameter('Pack_Keys')); - } - if ( $vendorSpecific->hasParameter('Delay_key_write') ) { - $script .= ' DELAY_KEY_WRITE='.$platform->quote($vendorSpecific->getParameter('Delay_key_write')); - } - - if ($table->getDescription()) { - $script .= " COMMENT=".$platform->quote($table->getDescription()); - } - $script .= "; -"; - } - - /** - * Creates a comma-separated list of column names for the index. - * For MySQL unique indexes there is the option of specifying size, so we cannot simply use - * the getColumnsList() method. - * @param Index $index - * @return string - */ - private function getIndexColumnList(Index $index) - { - $platform = $this->getPlatform(); - - $cols = $index->getColumns(); - $list = array(); - foreach ($cols as $col) { - $list[] = $this->quoteIdentifier($col) . ($index->hasColumnSize($col) ? '(' . $index->getColumnSize($col) . ')' : ''); - } - return implode(', ', $list); - } - - /** - * Adds indexes - */ - protected function addIndicesLines(&$lines) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - foreach ($table->getUnices() as $unique) { - $lines[] = "UNIQUE KEY ".$this->quoteIdentifier($unique->getName())." (".$this->getIndexColumnList($unique).")"; - } - - foreach ($table->getIndices() as $index ) { - $vendorInfo = $index->getVendorInfoForType($platform->getDatabaseType()); - $lines[] .= (($vendorInfo && $vendorInfo->getParameter('Index_type') == 'FULLTEXT') ? 'FULLTEXT ' : '') . "KEY " . $this->quoteIdentifier($index->getName()) . "(" . $this->getIndexColumnList($index) . ")"; - } - - } - - /** - * Adds foreign key declarations & necessary indexes for mysql (if they don't exist already). - * @see parent::addForeignKeys() - */ - protected function addForeignKeysLines(&$lines) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - - /** - * A collection of indexed columns. The keys is the column name - * (concatenated with a comma in the case of multi-col index), the value is - * an array with the names of the indexes that index these columns. We use - * it to determine which additional indexes must be created for foreign - * keys. It could also be used to detect duplicate indexes, but this is not - * implemented yet. - * @var array - */ - $_indices = array(); - - $this->collectIndexedColumns('PRIMARY', $table->getPrimaryKey(), $_indices, 'getName'); - - $_tableIndices = array_merge($table->getIndices(), $table->getUnices()); - foreach ($_tableIndices as $_index) { - $this->collectIndexedColumns($_index->getName(), $_index->getColumns(), $_indices); - } - - // we're determining which tables have foreign keys that point to this table, since MySQL needs an index on - // any column that is referenced by another table (yep, MySQL _is_ a PITA) - $counter = 0; - $allTables = $table->getDatabase()->getTables(); - foreach ($allTables as $_table) { - foreach ($_table->getForeignKeys() as $_foreignKey) { - if ($_foreignKey->getForeignTableName() == $table->getName()) { - $referencedColumns = $_foreignKey->getForeignColumns(); - $referencedColumnsHash = $this->getColumnList($referencedColumns); - if (!array_key_exists($referencedColumnsHash, $_indices)) { - // no matching index defined in the schema, so we have to create one - $indexName = "I_referenced_".$_foreignKey->getName()."_".(++$counter); - $lines[] = "INDEX ".$this->quoteIdentifier($indexName)." (" .$referencedColumnsHash.")"; - // Add this new index to our collection, otherwise we might add it again (bug #725) - $this->collectIndexedColumns($indexName, $referencedColumns, $_indices); - } - } - } - } - - foreach ($table->getForeignKeys() as $fk) { - - $indexName = $this->quoteIdentifier(substr_replace($fk->getName(), 'FI_', strrpos($fk->getName(), 'FK_'), 3)); - - $localColumns = $fk->getLocalColumns(); - $localColumnsHash = $this->getColumnList($localColumns); - - if (!array_key_exists($localColumnsHash, $_indices)) { - // no matching index defined in the schema, so we have to create one. MySQL needs indices on any columns that serve as foreign keys. these are not auto-created prior to 4.1.2 - $lines[] = "INDEX $indexName (".$localColumnsHash.")"; - $this->collectIndexedColumns($indexName, $localColumns, $_indices); - } - $str = "CONSTRAINT ".$this->quoteIdentifier($fk->getName())." - FOREIGN KEY (".$this->getColumnList($fk->getLocalColumns()).") - REFERENCES ".$this->quoteIdentifier($fk->getForeignTableName()) . " (".$this->getColumnList($fk->getForeignColumns()).")"; - if ($fk->hasOnUpdate()) { - $str .= " - ON UPDATE ".$fk->getOnUpdate(); - } - if ($fk->hasOnDelete()) { - $str .= " - ON DELETE ".$fk->getOnDelete(); - } - $lines[] = $str; - } - } - - /** - * Helper function to collect indexed columns. - * @param array $columns The column names, or objects with a $callback method - * @param array $indexedColumns The collected indexes - * @param string $callback The name of a method to call on each of $columns to get the column name, if needed. - * @return unknown_type - */ - private function collectIndexedColumns($indexName, $columns, &$collectedIndexes, $callback = null) - { - // Get the actual column names, using the callback if needed. - // DDLBuilder::getColumnList tests $col instanceof Column, and no callback - maybe we should too? - $colnames = $columns; - if ($callback) { - $colnames = array(); - foreach ($columns as $col) { - $colnames[] = $col->$callback(); - } - } - - /** - * "If the table has a multiple-column index, any leftmost prefix of the - * index can be used by the optimizer to find rows. For example, if you - * have a three-column index on (col1, col2, col3), you have indexed search - * capabilities on (col1), (col1, col2), and (col1, col2, col3)." - * @link http://dev.mysql.com/doc/refman/5.5/en/mysql-indexes.html - */ - $indexedColumns = array(); - foreach ($colnames as $colname) { - $indexedColumns[] = $this->quoteIdentifier($colname); - $indexedColumnsHash = implode(',', $indexedColumns); - if (!array_key_exists($indexedColumnsHash, $collectedIndexes)) { - $collectedIndexes[$indexedColumnsHash] = array(); - } - $collectedIndexes[$indexedColumnsHash][] = $indexName; - } - } - - /** - * Checks whether passed-in array of Column objects contains a column with specified name. - * @param array Column[] or string[] - * @param string $searchcol Column name to search for - */ - private function containsColname($columns, $searchcol) - { - foreach ($columns as $col) { - if ($col instanceof Column) { - $col = $col->getName(); - } - if ($col == $searchcol) { - return true; - } - } - return false; - } - - /** - * Not used for MySQL since foreign keys are declared inside table declaration. - * @see addForeignKeysLines() - */ - protected function addForeignKeys(&$script) - { - } - - /** - * Not used for MySQL since indexes are declared inside table declaration. - * @see addIndicesLines() - */ - protected function addIndices(&$script) - { - } - - /** - * Builds the DDL SQL for a Column object. - * @return string - */ - public function getColumnDDL(Column $col) - { - $platform = $this->getPlatform(); - $domain = $col->getDomain(); - $sqlType = $domain->getSqlType(); - $notNullString = $col->getNotNullString(); - $defaultSetting = $col->getDefaultSetting(); - - // Special handling of TIMESTAMP/DATETIME types ... - // See: http://propel.phpdb.org/trac/ticket/538 - if ($sqlType == 'DATETIME') { - $def = $domain->getDefaultValue(); - if ($def && $def->isExpression()) { // DATETIME values can only have constant expressions - $sqlType = 'TIMESTAMP'; - } - } elseif ($sqlType == 'DATE') { - $def = $domain->getDefaultValue(); - if ($def && $def->isExpression()) { - throw new EngineException("DATE columns cannot have default *expressions* in MySQL."); - } - } elseif ($sqlType == 'TEXT' || $sqlType == 'BLOB') { - if ($domain->getDefaultValue()) { - throw new EngineException("BLOB and TEXT columns cannot have DEFAULT values. in MySQL."); - } - } - - $sb = ""; - $sb .= $this->quoteIdentifier($col->getName()) . " "; - $sb .= $sqlType; - if ($platform->hasSize($sqlType)) { - $sb .= $domain->printSize(); - } - $sb .= " "; - - if ($sqlType == 'TIMESTAMP') { - $notNullString = $col->getNotNullString(); - $defaultSetting = $col->getDefaultSetting(); - if ($notNullString == '') { - $notNullString = 'NULL'; - } - if ($defaultSetting == '' && $notNullString == 'NOT NULL') { - $defaultSetting = 'DEFAULT CURRENT_TIMESTAMP'; - } - $sb .= $notNullString . " " . $defaultSetting . " "; - } else { - $sb .= $defaultSetting . " "; - $sb .= $notNullString . " "; - } - $sb .= $col->getAutoIncrementString(); - - return trim($sb); - } -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/sql/mysql/MysqlDataSQLBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/sql/mysql/MysqlDataSQLBuilder.php deleted file mode 100644 index 5938b6e64c..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/sql/mysql/MysqlDataSQLBuilder.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @package propel.generator.builder.sql.mysql - */ -class MysqlDataSQLBuilder extends DataSQLBuilder -{ - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/sql/oracle/OracleDDLBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/sql/oracle/OracleDDLBuilder.php deleted file mode 100644 index 8503f18342..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/sql/oracle/OracleDDLBuilder.php +++ /dev/null @@ -1,185 +0,0 @@ - - * @package propel.generator.builder.sql.pgsql - */ -class OracleDDLBuilder extends DDLBuilder -{ - - /** - * This function adds any _database_ start/initialization SQL. - * This is designed to be called for a database, not a specific table, hence it is static. - * @see parent::getDatabaseStartDDL() - * - * @return string The DDL is returned as astring. - */ - public static function getDatabaseStartDDL() - { - return " -ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD'; -ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS'; -"; - } - - /** - * - * @see parent::addDropStatement() - */ - protected function addDropStatements(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - $script .= " -DROP TABLE ".$this->quoteIdentifier($table->getName())." CASCADE CONSTRAINTS; -"; - if ($table->getIdMethod() == "native") { - $script .= " -DROP SEQUENCE ".$this->quoteIdentifier($this->getSequenceName())."; -"; - } - } - - /** - * - * @see parent::addColumns() - */ - protected function addTable(&$script) - { - $table = $this->getTable(); - $script .= " - ------------------------------------------------------------------------ --- ".$table->getName()." ------------------------------------------------------------------------ -"; - - $this->addDropStatements($script); - - $script .= " -CREATE TABLE ".$this->quoteIdentifier($table->getName())." -( - "; - - $lines = array(); - - foreach ($table->getColumns() as $col) { - $lines[] = $this->getColumnDDL($col); - } - - $sep = ", - "; - $script .= implode($sep, $lines); - $script .= " -); -"; - $this->addPrimaryKey($script); - $this->addSequences($script); - - } - - /** - * - * - */ - protected function addPrimaryKey(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - $tableName = $table->getName(); - $length = strlen($tableName); - if ($length > 27) { - $length = 27; - } - if ( is_array($table->getPrimaryKey()) && count($table->getPrimaryKey()) ) { - $script .= " -ALTER TABLE ".$this->quoteIdentifier($table->getName())." - ADD CONSTRAINT ".$this->quoteIdentifier(substr($tableName,0,$length)."_PK")." - PRIMARY KEY ("; - $delim = ""; - foreach ($table->getPrimaryKey() as $col) { - $script .= $delim . $this->quoteIdentifier($col->getName()); - $delim = ","; - } - $script .= "); -"; - } - } - - /** - * Adds CREATE SEQUENCE statements for this table. - * - */ - protected function addSequences(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - if ($table->getIdMethod() == "native") { - $script .= " -CREATE SEQUENCE ".$this->quoteIdentifier($this->getSequenceName())." - INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE NOCACHE ORDER; -"; - } - } - - - /** - * Adds CREATE INDEX statements for this table. - * @see parent::addIndices() - */ - protected function addIndices(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - foreach ($table->getIndices() as $index) { - $script .= " -CREATE "; - if ($index->getIsUnique()) { - $script .= "UNIQUE"; - } - $script .= "INDEX ".$this->quoteIdentifier($index->getName()) ." ON ".$this->quoteIdentifier($table->getName())." (".$this->getColumnList($index->getColumns())."); -"; - } - } - - /** - * - * @see parent::addForeignKeys() - */ - protected function addForeignKeys(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - foreach ($table->getForeignKeys() as $fk) { - $script .= " -ALTER TABLE ".$this->quoteIdentifier($table->getName())." - ADD CONSTRAINT ".$this->quoteIdentifier($fk->getName())." - FOREIGN KEY (".$this->getColumnList($fk->getLocalColumns()) .") REFERENCES ".$this->quoteIdentifier($fk->getForeignTableName())." (".$this->getColumnList($fk->getForeignColumns()).")"; - if ($fk->hasOnUpdate()) { - $this->warn("ON UPDATE not yet implemented for Oracle builder.(ignoring for ".$this->getColumnList($fk->getLocalColumns())." fk)."); - //$script .= " ON UPDATE ".$fk->getOnUpdate(); - } - if ($fk->hasOnDelete()) { - $script .= " - ON DELETE ".$fk->getOnDelete(); - } - $script .= "; -"; - } - } - - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/sql/oracle/OracleDataSQLBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/sql/oracle/OracleDataSQLBuilder.php deleted file mode 100644 index bf7a35daeb..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/sql/oracle/OracleDataSQLBuilder.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @package propel.generator.builder.sql.oracle - */ -class OracleDataSQLBuilder extends DataSQLBuilder -{ - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/sql/pgsql/PgsqlDDLBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/sql/pgsql/PgsqlDDLBuilder.php deleted file mode 100644 index 92e0185d11..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/sql/pgsql/PgsqlDDLBuilder.php +++ /dev/null @@ -1,304 +0,0 @@ - - * @package propel.generator.builder.sql.pgsql - */ -class PgsqlDDLBuilder extends DDLBuilder -{ - - /** - * Array that keeps track of already - * added schema names - * - * @var Array of schema names - */ - protected static $addedSchemas = array(); - - /** - * Queue of constraint SQL that will be added to script at the end. - * - * PostgreSQL seems (now?) to not like constraints for tables that don't exist, - * so the solution is to queue up the statements and execute it at the end. - * - * @var array - */ - protected static $queuedConstraints = array(); - - /** - * Reset static vars between db iterations. - */ - public static function reset() - { - self::$addedSchemas = array(); - self::$queuedConstraints = array(); - } - - /** - * Returns all the ALTER TABLE ADD CONSTRAINT lines for inclusion at end of file. - * @return string DDL - */ - public static function getDatabaseEndDDL() - { - $ddl = implode("", self::$queuedConstraints); - return $ddl; - } - - /** - * Get the schema for the current table - * - * @author Markus Lervik - * @access protected - * @return schema name if table has one, else - * null - **/ - protected function getSchema() - { - $table = $this->getTable(); - $vi = $table->getVendorInfoForType($this->getPlatform()->getDatabaseType()); - if ($vi->hasParameter('schema')) { - return $vi->getParameter('schema'); - } - return null; - } - - /** - * Add a schema to the generated SQL script - * - * @author Markus Lervik - * @access protected - * @return string with CREATE SCHEMA statement if - * applicable, else empty string - **/ - protected function addSchema() - { - - $schemaName = $this->getSchema(); - - if ($schemaName !== null) { - - if (!in_array($schemaName, self::$addedSchemas)) { - $platform = $this->getPlatform(); - self::$addedSchemas[] = $schemaName; - return "\nCREATE SCHEMA " . $this->quoteIdentifier($schemaName) . ";\n"; - } - } - - return ''; - - } - - /** - * - * @see parent::addDropStatement() - */ - protected function addDropStatements(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - $script .= " -DROP TABLE ".$this->quoteIdentifier($table->getName())." CASCADE; -"; - - if ($table->getIdMethod() == IDMethod::NATIVE && $table->getIdMethodParameters()) { - $script .= " -DROP SEQUENCE ".$this->quoteIdentifier(strtolower($this->getSequenceName()))."; -"; - } - } - - /** - * - * @see parent::addColumns() - */ - protected function addTable(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - $script .= " ------------------------------------------------------------------------------ --- ".$table->getName()." ------------------------------------------------------------------------------ -"; - - $script .= $this->addSchema(); - - $schemaName = $this->getSchema(); - if ($schemaName !== null) { - $script .= "\nSET search_path TO " . $this->quoteIdentifier($schemaName) . ";\n"; - } - - $this->addDropStatements($script); - $this->addSequences($script); - - $script .= " - -CREATE TABLE ".$this->quoteIdentifier($table->getName())." -( - "; - - $lines = array(); - - foreach ($table->getColumns() as $col) { - /* @var $col Column */ - $colDDL = $this->getColumnDDL($col); - if ($col->isAutoIncrement() && $table->getIdMethodParameters() == null) { - if ($col->getType() === PropelTypes::BIGINT) { - $colDDL = str_replace($col->getDomain()->getSqlType(), 'bigserial', $colDDL); - } else { - $colDDL = str_replace($col->getDomain()->getSqlType(), 'serial', $colDDL); - } - } - $lines[] = $colDDL; - } - - if ($table->hasPrimaryKey()) { - $lines[] = "PRIMARY KEY (".$this->getColumnList($table->getPrimaryKey()).")"; - } - - foreach ($table->getUnices() as $unique ) { - $lines[] = "CONSTRAINT ".$this->quoteIdentifier($unique->getName())." UNIQUE (".$this->getColumnList($unique->getColumns()).")"; - } - - $sep = ", - "; - $script .= implode($sep, $lines); - $script .= " -); - -COMMENT ON TABLE ".$this->quoteIdentifier($table->getName())." IS " . $platform->quote($table->getDescription())."; - -"; - - $this->addColumnComments($script); - - $script .= "\nSET search_path TO public;"; - - } - - /** - * Adds comments for the columns. - * - */ - protected function addColumnComments(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - foreach ($this->getTable()->getColumns() as $col) { - if ( $col->getDescription() != '' ) { - $script .= " -COMMENT ON COLUMN ".$this->quoteIdentifier($table->getName()).".".$this->quoteIdentifier($col->getName())." IS ".$platform->quote($col->getDescription()) ."; -"; - } - } - } - - /** - * Override to provide sequence names that conform to postgres' standard when - * no id-method-parameter specified. - * - * @see DataModelBuilder::getSequenceName() - * @return string - */ - public function getSequenceName() - { - $table = $this->getTable(); - static $longNamesMap = array(); - $result = null; - if ($table->getIdMethod() == IDMethod::NATIVE) { - $idMethodParams = $table->getIdMethodParameters(); - if (empty($idMethodParams)) { - $result = null; - // We're going to ignore a check for max length (mainly - // because I'm not sure how Postgres would handle this w/ SERIAL anyway) - foreach ($table->getColumns() as $col) { - if ($col->isAutoIncrement()) { - $result = $table->getName() . '_' . $col->getName() . '_seq'; - break; // there's only one auto-increment column allowed - } - } - } else { - $result = $idMethodParams[0]->getValue(); - } - } - return $result; - } - - /** - * Adds CREATE SEQUENCE statements for this table. - * - */ - protected function addSequences(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - if ($table->getIdMethod() == IDMethod::NATIVE && $table->getIdMethodParameters() != null) { - $script .= " -CREATE SEQUENCE ".$this->quoteIdentifier(strtolower($this->getSequenceName()))."; -"; - } - } - - - /** - * Adds CREATE INDEX statements for this table. - * @see parent::addIndices() - */ - protected function addIndices(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - foreach ($table->getIndices() as $index) { - $script .= " -CREATE "; - if ($index->getIsUnique()) { - $script .= "UNIQUE"; - } - $script .= "INDEX ".$this->quoteIdentifier($index->getName())." ON ".$this->quoteIdentifier($table->getName())." (".$this->getColumnList($index->getColumns())."); -"; - } - } - - /** - * - * @see parent::addForeignKeys() - */ - protected function addForeignKeys(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - foreach ($table->getForeignKeys() as $fk) { - $privscript = " -ALTER TABLE ".$this->quoteIdentifier($table->getName())." ADD CONSTRAINT ".$this->quoteIdentifier($fk->getName())." FOREIGN KEY (".$this->getColumnList($fk->getLocalColumns()) .") REFERENCES ".$this->quoteIdentifier($fk->getForeignTableName())." (".$this->getColumnList($fk->getForeignColumns()).")"; - if ($fk->hasOnUpdate()) { - $privscript .= " ON UPDATE ".$fk->getOnUpdate(); - } - if ($fk->hasOnDelete()) { - $privscript .= " ON DELETE ".$fk->getOnDelete(); - } - $privscript .= "; -"; - self::$queuedConstraints[] = $privscript; - } - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/sql/pgsql/PgsqlDataSQLBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/sql/pgsql/PgsqlDataSQLBuilder.php deleted file mode 100644 index c5a644bba1..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/sql/pgsql/PgsqlDataSQLBuilder.php +++ /dev/null @@ -1,102 +0,0 @@ - - * @package propel.generator.builder.sql.pgsql - */ -class PgsqlDataSQLBuilder extends DataSQLBuilder -{ - - /** - * The largets serial value encountered this far. - * - * @var int - */ - private $maxSeqVal; - - /** - * Construct a new PgsqlDataSQLBuilder object. - * - * @param Table $table - */ - public function __construct(Table $table) - { - parent::__construct($table); - } - - /** - * The main method in this class, returns the SQL for INSERTing data into a row. - * @param DataRow $row The row to process. - * @return string - */ - public function buildRowSql(DataRow $row) - { - $sql = parent::buildRowSql($row); - - $table = $this->getTable(); - - if ($table->hasAutoIncrementPrimaryKey() && $table->getIdMethod() == IDMethod::NATIVE) { - foreach ($row->getColumnValues() as $colValue) { - if ($colValue->getColumn()->isAutoIncrement()) { - if ($colValue->getValue() > $this->maxSeqVal) { - $this->maxSeqVal = $colValue->getValue(); - } - } - } - } - - return $sql; - } - - public function getTableEndSql() - { - $table = $this->getTable(); - $sql = ""; - if ($table->hasAutoIncrementPrimaryKey() && $table->getIdMethod() == IDMethod::NATIVE) { - $seqname = $this->getDDLBuilder()->getSequenceName(); - $sql .= "SELECT pg_catalog.setval('$seqname', ".((int)$this->maxSeqVal)."); -"; - } - return $sql; - } - - /** - * Get SQL value to insert for Postgres BOOLEAN column. - * @param boolean $value - * @return string The representation of boolean for Postgres ('t' or 'f'). - */ - protected function getBooleanSql($value) - { - if ($value === 'f' || $value === 'false' || $value === "0") { - $value = false; - } - return ($value ? "'t'" : "'f'"); - } - - /** - * - * @param mixed $blob Blob object or string containing data. - * @return string - */ - protected function getBlobSql($blob) - { - // they took magic __toString() out of PHP5.0.0; this sucks - if (is_object($blob)) { - $blob = $blob->__toString(); - } - return "'" . pg_escape_bytea($blob) . "'"; - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/sql/sqlite/SqliteDDLBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/sql/sqlite/SqliteDDLBuilder.php deleted file mode 100644 index 3a2c3c041d..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/sql/sqlite/SqliteDDLBuilder.php +++ /dev/null @@ -1,119 +0,0 @@ - - * @package propel.generator.builder.sql.pgsql - */ -class SqliteDDLBuilder extends DDLBuilder -{ - - /** - * - * @see parent::addDropStatement() - */ - protected function addDropStatements(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - $script .= " -DROP TABLE ".$this->quoteIdentifier($table->getName())."; -"; - } - - /** - * - * @see parent::addColumns() - */ - protected function addTable(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - $script .= " ------------------------------------------------------------------------------ --- ".$table->getName()." ------------------------------------------------------------------------------ -"; - - $this->addDropStatements($script); - - $script .= " - -CREATE TABLE ".$this->quoteIdentifier($table->getName())." -( - "; - - $lines = array(); - - foreach ($table->getColumns() as $col) { - $lines[] = $this->getColumnDDL($col); - } - - if ($table->hasPrimaryKey() && count($table->getPrimaryKey()) > 1) { - $lines[] = "PRIMARY KEY (".$this->getColumnList($table->getPrimaryKey()).")"; - } - - foreach ($table->getUnices() as $unique ) { - $lines[] = "UNIQUE (".$this->getColumnList($unique->getColumns()).")"; - } - - $sep = ", - "; - $script .= implode($sep, $lines); - $script .= " -); -"; - } - - /** - * Adds CREATE INDEX statements for this table. - * @see parent::addIndices() - */ - protected function addIndices(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - foreach ($table->getIndices() as $index) { - $script .= " -CREATE "; - if ($index->getIsUnique()) { - $script .= "UNIQUE"; - } - $script .= "INDEX ".$this->quoteIdentifier($index->getName())." ON ".$this->quoteIdentifier($table->getName())." (".$this->getColumnList($index->getColumns())."); -"; - } - } - - /** - * - * @see parent::addForeignKeys() - */ - protected function addForeignKeys(&$script) - { - $table = $this->getTable(); - $platform = $this->getPlatform(); - - foreach ($table->getForeignKeys() as $fk) { - $script .= " --- SQLite does not support foreign keys; this is just for reference --- FOREIGN KEY (".$this->getColumnList($fk->getLocalColumns()).") REFERENCES ".$fk->getForeignTableName()." (".$this->getColumnList($fk->getForeignColumns()).") -"; - } - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/sql/sqlite/SqliteDataSQLBuilder.php b/airtime_mvc/library/propel/generator/lib/builder/sql/sqlite/SqliteDataSQLBuilder.php deleted file mode 100644 index 7f266afb40..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/sql/sqlite/SqliteDataSQLBuilder.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @package propel.generator.builder.sql.sqlite - */ -class SqliteDataSQLBuilder extends DataSQLBuilder -{ - - /** - * Returns string processed by sqlite_udf_encode_binary() to ensure that binary contents will be handled correctly by sqlite. - * @param mixed $blob Blob or string - * @return string encoded text - */ - protected function getBlobSql($blob) - { - // they took magic __toString() out of PHP5.0.0; this sucks - if (is_object($blob)) { - $blob = $blob->__toString(); - } - return "'" . sqlite_udf_encode_binary($blob) . "'"; - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/util/DefaultEnglishPluralizer.php b/airtime_mvc/library/propel/generator/lib/builder/util/DefaultEnglishPluralizer.php deleted file mode 100644 index 7d0fad6997..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/util/DefaultEnglishPluralizer.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.generator.builder.util - */ -class DefaultEnglishPluralizer implements Pluralizer -{ - - /** - * Generate a plural name based on the passed in root. - * @param string $root The root that needs to be pluralized (e.g. Author) - * @return string The plural form of $root (e.g. Authors). - */ - public function getPluralForm($root) - { - return $root . 's'; - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/util/Pluralizer.php b/airtime_mvc/library/propel/generator/lib/builder/util/Pluralizer.php deleted file mode 100644 index 9f382718ac..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/util/Pluralizer.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.generator.builder.util - */ -interface Pluralizer -{ - - /** - * Generate a plural name based on the passed in root. - * @param string $root The root that needs to be pluralized (e.g. Author) - * @return string The plural form of $root. - */ - public function getPluralForm($root); - -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/util/PropelStringReader.php b/airtime_mvc/library/propel/generator/lib/builder/util/PropelStringReader.php deleted file mode 100644 index fb9fd09923..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/util/PropelStringReader.php +++ /dev/null @@ -1,91 +0,0 @@ -_string = $string; - } - - public function skip($n) - { - $this->currPos = $this->currPos + $n; - } - - public function eof() - { - return $this->currPos == strlen($this->_string); - } - - public function read($len = null) - { - if ($len === null) { - return $this->_string; - } else { - if ($this->currPos >= strlen($this->_string)) { - return -1; - } - $out = substr($this->_string, $this->currPos, $len); - $this->currPos += $len; - return $out; - } - } - - public function mark() - { - $this->mark = $this->currPos; - } - - public function reset() - { - $this->currPos = $this->mark; - } - - public function close() {} - - public function open() {} - - public function ready() {} - - public function markSupported() - { - return true; - } - - public function getResource() - { - return '(string) "'.$this->_string . '"'; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/lib/builder/util/PropelTemplate.php b/airtime_mvc/library/propel/generator/lib/builder/util/PropelTemplate.php deleted file mode 100644 index dd8f937a43..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/util/PropelTemplate.php +++ /dev/null @@ -1,92 +0,0 @@ - - * $template->setTemplate('This is '); - * - * - * @param string $template the template string - */ - public function setTemplate($template) - { - $this->template = $template; - } - - /** - * Set a file as a template. The file can be any regular PHP file. - * - * - * $template->setTemplateFile(dirname(__FILE__) . '/template/foo.php'); - * - * - * @param string $filePath The (absolute or relative to the include path) file path - */ - public function setTemplateFile($filePath) - { - $this->templateFile = $filePath; - } - - /** - * Render the template using the variable provided as arguments. - * - * - * $template = new PropelTemplate(); - * $template->setTemplate('This is '); - * echo $template->render(array('name' => 'Mike')); - * // This is Mike - * - * - * @param array $vars An associative array of argumens to be rendered - * - * @return string The rendered template - */ - public function render($vars = array()) - { - if (null === $this->templateFile && null === $this->template) { - throw new InvalidArgumentException('You must set a template or a template file before rendering'); - } - - extract($vars); - ob_start(); - ob_implicit_flush(0); - - try - { - if (null !== $this->templateFile) { - require($this->templateFile); - } else { - eval('?>' . $this->template . ' (Propel) - * @author Leon Messerschmidt (Torque) - * @author Jason van Zyl (Torque) - * @author Martin Poeschl (Torque) - * @author Daniel Rall (Torque) - * @version $Revision: 1764 $ - * @package propel.generator.builder.util - */ -class XmlToAppData extends AbstractHandler -{ - - /** enables debug output */ - const DEBUG = false; - - private $app; - private $platform; - private $currDB; - private $currTable; - private $currColumn; - private $currFK; - private $currIndex; - private $currUnique; - private $currValidator; - private $currBehavior; - private $currVendorObject; - - private $isForReferenceOnly; - private $currentPackage; - private $currentXmlFile; - private $defaultPackage; - - private $encoding; - - /** two-dimensional array, - first dimension is for schemas(key is the path to the schema file), - second is for tags within the schema */ - private $schemasTagsStack = array(); - - public $parser; - - /** - * Creates a new instance for the specified database type. - * - * @param Platform $platform The type of database for the application. - * @param string $defaultPackage the default PHP package used for the om - * @param string $encoding The database encoding. - */ - public function __construct(Platform $platform, $defaultPackage, $encoding = 'iso-8859-1') - { - $this->app = new AppData($platform); - $this->platform = $platform; - $this->defaultPackage = $defaultPackage; - $this->firstPass = true; - $this->encoding = $encoding; - } - - /** - * Parses a XML input file and returns a newly created and - * populated AppData structure. - * - * @param string $xmlFile The input file to parse. - * @return AppData populated by xmlFile. - */ - public function parseFile($xmlFile) - { - // we don't want infinite recursion - if ($this->isAlreadyParsed($xmlFile)) { - return; - } - - $f = new PhingFile($xmlFile); - - return $this->parseString($f->contents(), $xmlFile); - } - - /** - * Parses a XML input string and returns a newly created and - * populated AppData structure. - * - * @param string $xmlString The input string to parse. - * @param string $xmlFile The input file name. - * @return AppData populated by xmlFile. - */ - public function parseString($xmlString, $xmlFile) - { - // we don't want infinite recursion - if ($this->isAlreadyParsed($xmlFile)) { - return; - } - - // store current schema file path - $this->schemasTagsStack[$xmlFile] = array(); - - $this->currentXmlFile = $xmlFile; - - try { - $sr = new PropelStringReader($xmlString); - - } catch (Exception $e) { - $f = new PhingFile($xmlFile); - throw new Exception("XML File not found: " . $f->getAbsolutePath()); - } - - $br = new BufferedReader($sr); - - $this->parser = new ExpatParser($br); - $this->parser->parserSetOption(XML_OPTION_CASE_FOLDING, 0); - $this->parser->setHandler($this); - - try { - $this->parser->parse(); - } catch (Exception $e) { - $br->close(); - throw $e; - } - $br->close(); - - array_pop($this->schemasTagsStack); - - return $this->app; - } - - /** - * Handles opening elements of the xml file. - * - * @param string $uri - * @param string $localName The local name (without prefix), or the empty string if - * Namespace processing is not being performed. - * @param string $rawName The qualified name (with prefix), or the empty string if - * qualified names are not available. - * @param string $attributes The specified or defaulted attributes - */ - public function startElement($name, $attributes) { - - try { - - $parentTag = $this->peekCurrentSchemaTag(); - - if ($parentTag === false) { - - switch($name) { - case "database": - if ($this->isExternalSchema()) { - $this->currentPackage = @$attributes["package"]; - if ($this->currentPackage === null) { - $this->currentPackage = $this->defaultPackage; - } - } else { - $this->currDB = $this->app->addDatabase($attributes); - } - break; - - default: - $this->_throwInvalidTagException($name); - } - - } elseif ($parentTag == "database") { - - switch($name) { - - case "external-schema": - $xmlFile = @$attributes["filename"]; - - //"referenceOnly" attribute is valid in the main schema XML file only, - //and it's ingnored in the nested external-schemas - if (!$this->isExternalSchema()) { - $isForRefOnly = @$attributes["referenceOnly"]; - $this->isForReferenceOnly = ($isForRefOnly !== null ? (strtolower($isForRefOnly) === "true") : true); // defaults to TRUE - } - - if ($xmlFile{0} != '/') { - $f = new PhingFile($this->currentXmlFile); - $xf = new PhingFile($f->getParent(), $xmlFile); - $xmlFile = $xf->getPath(); - } - - $this->parseFile($xmlFile); - break; - - case "domain": - $this->currDB->addDomain($attributes); - break; - - case "table": - $this->currTable = $this->currDB->addTable($attributes); - if ($this->isExternalSchema()) { - $this->currTable->setForReferenceOnly($this->isForReferenceOnly); - $this->currTable->setPackage($this->currentPackage); - } - break; - - case "vendor": - $this->currVendorObject = $this->currDB->addVendorInfo($attributes); - break; - - case "behavior": - $this->currBehavior = $this->currDB->addBehavior($attributes); - break; - - default: - $this->_throwInvalidTagException($name); - } - - } elseif ($parentTag == "table") { - - switch($name) { - case "column": - $this->currColumn = $this->currTable->addColumn($attributes); - break; - - case "foreign-key": - $this->currFK = $this->currTable->addForeignKey($attributes); - break; - - case "index": - $this->currIndex = $this->currTable->addIndex($attributes); - break; - - case "unique": - $this->currUnique = $this->currTable->addUnique($attributes); - break; - - case "vendor": - $this->currVendorObject = $this->currTable->addVendorInfo($attributes); - break; - - case "validator": - $this->currValidator = $this->currTable->addValidator($attributes); - break; - - case "id-method-parameter": - $this->currTable->addIdMethodParameter($attributes); - break; - - case "behavior": - $this->currBehavior = $this->currTable->addBehavior($attributes); - break; - - default: - $this->_throwInvalidTagException($name); - } - - } elseif ($parentTag == "column") { - - switch($name) { - case "inheritance": - $this->currColumn->addInheritance($attributes); - break; - - case "vendor": - $this->currVendorObject = $this->currColumn->addVendorInfo($attributes); - break; - - default: - $this->_throwInvalidTagException($name); - } - - } elseif ($parentTag == "foreign-key") { - - switch($name) { - case "reference": - $this->currFK->addReference($attributes); - break; - - case "vendor": - $this->currVendorObject = $this->currUnique->addVendorInfo($attributes); - break; - - default: - $this->_throwInvalidTagException($name); - } - - } elseif ($parentTag == "index") { - - switch($name) { - case "index-column": - $this->currIndex->addColumn($attributes); - break; - - case "vendor": - $this->currVendorObject = $this->currIndex->addVendorInfo($attributes); - break; - - default: - $this->_throwInvalidTagException($name); - } - - } elseif ($parentTag == "unique") { - - switch($name) { - case "unique-column": - $this->currUnique->addColumn($attributes); - break; - - case "vendor": - $this->currVendorObject = $this->currUnique->addVendorInfo($attributes); - break; - - default: - $this->_throwInvalidTagException($name); - } - } elseif ($parentTag == "behavior") { - - switch($name) { - case "parameter": - $this->currBehavior->addParameter($attributes); - break; - - default: - $this->_throwInvalidTagException($name); - } - } elseif ($parentTag == "validator") { - switch($name) { - case "rule": - $this->currValidator->addRule($attributes); - break; - default: - $this->_throwInvalidTagException($name); - } - } elseif ($parentTag == "vendor") { - - switch($name) { - case "parameter": - $this->currVendorObject->addParameter($attributes); - break; - default: - $this->_throwInvalidTagException($name); - } - - } else { - // it must be an invalid tag - $this->_throwInvalidTagException($name); - } - - $this->pushCurrentSchemaTag($name); - - } catch (BuildException $e) { - throw $e; - } catch (Exception $e) { - echo $e; - echo "\n"; - throw $e; - } - } - - function _throwInvalidTagException($tag_name) - { - throw new BuildException("Unexpected tag <" . $tag_name . ">", $this->parser->getLocation()); - } - - /** - * Handles closing elements of the xml file. - * - * @param uri - * @param localName The local name (without prefix), or the empty string if - * Namespace processing is not being performed. - * @param rawName The qualified name (with prefix), or the empty string if - * qualified names are not available. - */ - public function endElement($name) - { - if (self::DEBUG) { - print("endElement(" . $name . ") called\n"); - } - - $this->popCurrentSchemaTag(); - } - - protected function peekCurrentSchemaTag() - { - $keys = array_keys($this->schemasTagsStack); - return end($this->schemasTagsStack[end($keys)]); - } - - protected function popCurrentSchemaTag() - { - $keys = array_keys($this->schemasTagsStack); - array_pop($this->schemasTagsStack[end($keys)]); - } - - protected function pushCurrentSchemaTag($tag) - { - $keys = array_keys($this->schemasTagsStack); - $this->schemasTagsStack[end($keys)][] = $tag; - } - - protected function isExternalSchema() - { - return count($this->schemasTagsStack) > 1; - } - - protected function isAlreadyParsed($filePath) - { - return isset($this->schemasTagsStack[$filePath]); - } -} diff --git a/airtime_mvc/library/propel/generator/lib/builder/util/XmlToDataSQL.php b/airtime_mvc/library/propel/generator/lib/builder/util/XmlToDataSQL.php deleted file mode 100644 index 09854080e1..0000000000 --- a/airtime_mvc/library/propel/generator/lib/builder/util/XmlToDataSQL.php +++ /dev/null @@ -1,265 +0,0 @@ - (Propel) - * @version $Revision: 1612 $ - * @package propel.generator.builder.util - */ -class XmlToDataSQL extends AbstractHandler -{ - - /** - * The GeneratorConfig associated with the build. - * - * @var GeneratorConfig - */ - private $generatorConfig; - - /** - * The database. - * - * @var Database - */ - private $database; - - /** - * The output writer for the SQL file. - * - * @var Writer - */ - private $sqlWriter; - - /** - * The database (and output SQL file) encoding. - * - * Values will be converted to this encoding in the output file. - * - * @var string - */ - private $encoding; - - /** - * The classname of the static class that will perform the building. - * - * This is needed because there are some pre/post methods that get called - * on the static class. - * - * @var string - */ - private $builderClazz; - - /** - * The name of the current table being processed. - * - * @var string - */ - private $currTableName; - - /** - * The DataSQLBuilder for the current table. - * - * @var DataSQLBuilder - */ - private $currBuilder; - - /** - * Expat Parser. - * - * @var ExpatParser - */ - public $parser; - - /** - * Flag for enabing debug output to aid in parser tracing. - */ - const DEBUG = false; - - /** - * Construct new XmlToDataSQL class. - * - * This class is passed the Database object so that it knows what to expect from - * the XML file. - * - * @param Database $database - * @param GeneratorConfig $config - * @param string $encoding Database encoding - */ - public function __construct(Database $database, GeneratorConfig $config, $encoding = 'iso-8859-1') - { - $this->database = $database; - $this->generatorConfig = $config; - $this->encoding = $encoding; - } - - /** - * Transform the data dump input file into SQL and writes it to the output stream. - * - * @param PhingFile $xmlFile - * @param Writer $out - */ - public function transform(PhingFile $xmlFile, Writer $out) - { - $this->sqlWriter = $out; - - // Reset some vars just in case this is being run multiple times. - $this->currTableName = $this->currBuilder = null; - - $this->builderClazz = $this->generatorConfig->getBuilderClassname('datasql'); - - try { - $fr = new FileReader($xmlFile); - } catch (Exception $e) { - throw new BuildException("XML File not found: " . $xmlFile->getAbsolutePath()); - } - - $br = new BufferedReader($fr); - - $this->parser = new ExpatParser($br); - $this->parser->parserSetOption(XML_OPTION_CASE_FOLDING, 0); - $this->parser->setHandler($this); - - try { - $this->parser->parse(); - } catch (Exception $e) { - print $e->getMessage() . "\n"; - $br->close(); - } - $br->close(); - } - - /** - * Handles opening elements of the xml file. - */ - public function startElement($name, $attributes) - { - try { - if ($name == "dataset") { - // Clear any start/end DLL - call_user_func(array($this->builderClazz, 'reset')); - $this->sqlWriter->write(call_user_func(array($this->builderClazz, 'getDatabaseStartSql'))); - } else { - - // we're processing a row of data - // where tag name is phpName e.g. - - $table = $this->database->getTableByPhpName($name); - - $columnValues = array(); - foreach ($attributes as $name => $value) { - $col = $table->getColumnByPhpName($name); - $columnValues[] = new ColumnValue($col, iconv('utf-8',$this->encoding, $value)); - } - - $data = new DataRow($table, $columnValues); - - if ($this->currTableName !== $table->getName()) { - // new table encountered - - if ($this->currBuilder !== null) { - $this->sqlWriter->write($this->currBuilder->getTableEndSql()); - } - - $this->currTableName = $table->getName(); - $this->currBuilder = $this->generatorConfig->getConfiguredBuilder($table, 'datasql'); - - $this->sqlWriter->write($this->currBuilder->getTableStartSql()); - } - - // Write the SQL - $this->sqlWriter->write($this->currBuilder->buildRowSql($data)); - - } - - } catch (Exception $e) { - // Exceptions have traditionally not bubbled up nicely from the expat parser, - // so we also print the stack trace here. - print $e; - throw $e; - } - } - - - /** - * Handles closing elements of the xml file. - * - * @param $name The local name (without prefix), or the empty string if - * Namespace processing is not being performed. - */ - public function endElement($name) - { - if (self::DEBUG) { - print("endElement(" . $name . ") called\n"); - } - if ($name == "dataset") { - if ($this->currBuilder !== null) { - $this->sqlWriter->write($this->currBuilder->getTableEndSql()); - } - $this->sqlWriter->write(call_user_func(array($this->builderClazz, 'getDatabaseEndSql'))); - } - } - -} // XmlToData - -/** - * "inner class" - * @package propel.generator.builder.util - */ -class DataRow -{ - private $table; - private $columnValues; - - public function __construct(Table $table, $columnValues) - { - $this->table = $table; - $this->columnValues = $columnValues; - } - - public function getTable() - { - return $this->table; - } - - public function getColumnValues() - { - return $this->columnValues; - } -} - -/** - * "inner" class - * @package propel.generator.builder.util - */ -class ColumnValue { - - private $col; - private $val; - - public function __construct(Column $col, $val) - { - $this->col = $col; - $this->val = $val; - } - - public function getColumn() - { - return $this->col; - } - - public function getValue() - { - return $this->val; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/config/GeneratorConfig.php b/airtime_mvc/library/propel/generator/lib/config/GeneratorConfig.php deleted file mode 100644 index 1190079100..0000000000 --- a/airtime_mvc/library/propel/generator/lib/config/GeneratorConfig.php +++ /dev/null @@ -1,217 +0,0 @@ - - * @package propel.generator.config - */ -class GeneratorConfig { - - /** - * The build properties. - * - * @var array - */ - private $buildProperties = array(); - - /** - * Construct a new GeneratorConfig. - * @param mixed $props Array or Iterator - */ - public function __construct($props = null) - { - if ($props) $this->setBuildProperties($props); - } - - /** - * Gets the build properties. - * @return array - */ - public function getBuildProperties() - { - return $this->buildProperties; - } - - /** - * Parses the passed-in properties, renaming and saving eligible properties in this object. - * - * Renames the propel.xxx properties to just xxx and renames any xxx.yyy properties - * to xxxYyy as PHP doesn't like the xxx.yyy syntax. - * - * @param mixed $props Array or Iterator - */ - public function setBuildProperties($props) - { - $this->buildProperties = array(); - - $renamedPropelProps = array(); - foreach ($props as $key => $propValue) { - if (strpos($key, "propel.") === 0) { - $newKey = substr($key, strlen("propel.")); - $j = strpos($newKey, '.'); - while ($j !== false) { - $newKey = substr($newKey, 0, $j) . ucfirst(substr($newKey, $j + 1)); - $j = strpos($newKey, '.'); - } - $this->setBuildProperty($newKey, $propValue); - } - } - } - - /** - * Gets a specific propel (renamed) property from the build. - * - * @param string $name - * @return mixed - */ - public function getBuildProperty($name) - { - return isset($this->buildProperties[$name]) ? $this->buildProperties[$name] : null; - } - - /** - * Sets a specific propel (renamed) property from the build. - * - * @param string $name - * @param mixed $value - */ - public function setBuildProperty($name, $value) - { - $this->buildProperties[$name] = $value; - } - - /** - * Resolves and returns the class name based on the specified property value. - * - * @param string $propname The name of the property that holds the class path (dot-path notation). - * @return string The class name. - * @throws BuildException If the classname cannot be determined or class cannot be loaded. - */ - public function getClassname($propname) - { - $classpath = $this->getBuildProperty($propname); - if (empty($classpath)) { - throw new BuildException("Unable to find class path for '$propname' property."); - } - - // This is a slight hack to workaround camel case inconsistencies for the DDL classes. - // Basically, we want to turn ?.?.?.sqliteDDLBuilder into ?.?.?.SqliteDDLBuilder - $lastdotpos = strrpos($classpath, '.'); - if ($lastdotpos !== null) { - $classpath{$lastdotpos+1} = strtoupper($classpath{$lastdotpos+1}); - } else { - $classpath = ucfirst($classpath); - } - - if (empty($classpath)) { - throw new BuildException("Unable to find class path for '$propname' property."); - } - - $clazz = Phing::import($classpath); - - return $clazz; - } - - /** - * Resolves and returns the builder class name. - * - * @param string $type - * @return string The class name. - */ - public function getBuilderClassname($type) - { - $propname = 'builder' . ucfirst(strtolower($type)) . 'Class'; - return $this->getClassname($propname); - } - - /** - * Creates and configures a new Platform class. - * - * @param PDO $con - * @return Platform - */ - public function getConfiguredPlatform(PDO $con = null) - { - $clazz = $this->getClassname("platformClass"); - $platform = new $clazz(); - - if (!$platform instanceof Platform) { - throw new BuildException("Specified platform class ($clazz) does not implement Platform interface.", $this->getLocation()); - } - - $platform->setConnection($con); - $platform->setGeneratorConfig($this); - return $platform; - } - - /** - * Creates and configures a new SchemaParser class for specified platform. - * @param PDO $con - * @return SchemaParser - */ - public function getConfiguredSchemaParser(PDO $con = null) - { - $clazz = $this->getClassname("reverseParserClass"); - $parser = new $clazz(); - if (!$parser instanceof SchemaParser) { - throw new BuildException("Specified platform class ($clazz) does implement SchemaParser interface.", $this->getLocation()); - } - $parser->setConnection($con); - $parser->setGeneratorConfig($this); - return $parser; - } - - /** - * Gets a configured data model builder class for specified table and based on type. - * - * @param Table $table - * @param string $type The type of builder ('ddl', 'sql', etc.) - * @return DataModelBuilder - */ - public function getConfiguredBuilder(Table $table, $type, $cache = true) - { - $classname = $this->getBuilderClassname($type); - $builder = new $classname($table); - $builder->setGeneratorConfig($this); - return $builder; - } - - /** - * Gets a configured Pluralizer class. - * - * @return Pluralizer - */ - public function getConfiguredPluralizer() - { - $classname = $this->getBuilderClassname('pluralizer'); - $pluralizer = new $classname(); - return $pluralizer; - } - - /** - * Gets a configured behavior class - * - * @param string $name a behavior name - * @return string a behavior class name - */ - public function getConfiguredBehavior($name) - { - $propname = 'behavior' . ucfirst(strtolower($name)) . 'Class'; - try { - $ret = $this->getClassname($propname); - } catch (BuildException $e) { - // class path not configured - $ret = false; - } - return $ret; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/exception/EngineException.php b/airtime_mvc/library/propel/generator/lib/exception/EngineException.php deleted file mode 100644 index e296c6bbc1..0000000000 --- a/airtime_mvc/library/propel/generator/lib/exception/EngineException.php +++ /dev/null @@ -1,22 +0,0 @@ - (Propel) - * @author Daniel Rall (Torque) - * @author Jason van Zyl (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.exception - */ -class EngineException extends BuildException {} diff --git a/airtime_mvc/library/propel/generator/lib/model/AppData.php b/airtime_mvc/library/propel/generator/lib/model/AppData.php deleted file mode 100644 index 39bb749d02..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/AppData.php +++ /dev/null @@ -1,222 +0,0 @@ - (Propel) - * @author Leon Messerschmidt (Torque) - * @author John McNally (Torque) - * @author Daniel Rall (Torque) - * @version $Revision: 1640 $ - * @package propel.generator.model - */ -class AppData -{ - - /** - * The list of databases for this application. - * @var array Database[] - */ - private $dbList = array(); - - /** - * The platform class for our database(s). - * @var string - */ - private $platform; - - /** - * Name of the database. Only one database definition - * is allowed in one XML descriptor. - */ - private $name; - - /** - * Flag to ensure that initialization is performed only once. - * @var boolean - */ - private $isInitialized = false; - - /** - * Creates a new instance for the specified database type. - * - * @param Platform $platform The platform object to use for any databases added to this application model. - */ - public function __construct(Platform $platform) - { - $this->platform = $platform; - } - - /** - * Gets the platform object to use for any databases added to this application model. - * - * @return Platform - */ - public function getPlatform() - { - return $this->platform; - } - - /** - * Set the name of the database. - * - * @param name of the database. - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Get the name of the database. - * - * @return String name - */ - public function getName() - { - return $this->name; - } - - /** - * Get the short name of the database (without the '-schema' postfix). - * - * @return String name - */ - public function getShortName() - { - return str_replace("-schema", "", $this->name); - } - - /** - * Return an array of all databases - * - * @return Array of Database objects - */ - public function getDatabases($doFinalInit = true) - { - // this is temporary until we'll have a clean solution - // for packaging datamodels/requiring schemas - if ($doFinalInit) { - $this->doFinalInitialization(); - } - return $this->dbList; - } - - /** - * Returns whether this application has multiple databases. - * - * @return boolean True if the application has multiple databases - */ - public function hasMultipleDatabases() - { - return (count($this->dbList) > 1); - } - - /** - * Return the database with the specified name. - * - * @param name database name - * @return A Database object. If it does not exist it returns null - */ - public function getDatabase($name = null, $doFinalInit = true) - { - // this is temporary until we'll have a clean solution - // for packaging datamodels/requiring schemas - if ($doFinalInit) { - $this->doFinalInitialization(); - } - - if ($name === null) { - return $this->dbList[0]; - } - - for ($i=0,$size=count($this->dbList); $i < $size; $i++) { - $db = $this->dbList[$i]; - if ($db->getName() === $name) { - return $db; - } - } - return null; - } - - /** - * Checks whether a database with the specified nam exists in this AppData - * - * @param name database name - * @return boolean - */ - public function hasDatabase($name) - { - foreach ($this->dbList as $db) { - if ($db->getName() === $name) { - return true; - } - } - return false; - } - - /** - * Add a database to the list and sets the AppData property to this - * AppData - * - * @param db the database to add - */ - public function addDatabase($db) - { - if ($db instanceof Database) { - $db->setAppData($this); - if ($db->getPlatform() === null) { - $db->setPlatform($this->platform); - } - $this->dbList[] = $db; - return $db; - } else { - // XML attributes array / hash - $d = new Database(); - $d->setAppData($this); - if ($d->getPlatform() === null) { - $d->setPlatform($this->platform); - } - $d->loadFromXML($db); - return $this->addDatabase($d); // calls self w/ different param type - } - - } - - public function doFinalInitialization() - { - if (!$this->isInitialized) { - for ($i=0, $size=count($this->dbList); $i < $size; $i++) { - $this->dbList[$i]->doFinalInitialization(); - } - $this->isInitialized = true; - } - } - - /** - * Creats a string representation of this AppData. - * The representation is given in xml format. - * - * @return string Representation in xml format - */ - public function toString() - { - $result = "\n"; - for ($i=0,$size=count($this->dbList); $i < $size; $i++) { - $result .= $this->dbList[$i]->toString(); - } - $result .= ""; - return $result; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/Behavior.php b/airtime_mvc/library/propel/generator/lib/model/Behavior.php deleted file mode 100644 index 281158311d..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/Behavior.php +++ /dev/null @@ -1,247 +0,0 @@ -name = $name; - } - - public function getName() - { - return $this->name; - } - - public function setTable(Table $table) - { - $this->table = $table; - } - - public function getTable() - { - return $this->table; - } - - public function setDatabase(Database $database) - { - $this->database = $database; - } - - public function getDatabase() - { - return $this->database; - } - - /** - * Add a parameter - * Expects an associative array looking like array('name' => 'foo', 'value' => bar) - * - * @param array associative array with name and value keys - */ - public function addParameter($attribute) - { - $attribute = array_change_key_case($attribute, CASE_LOWER); - $this->parameters[$attribute['name']] = $attribute['value']; - } - - /** - * Overrides the behavior parameters - * Expects an associative array looking like array('foo' => 'bar') - * - * @param array associative array - */ - public function setParameters($parameters) - { - $this->parameters = $parameters; - } - - /** - * Get the associative array of parameters - * @return array - */ - public function getParameters() - { - return $this->parameters; - } - - public function getParameter($name) - { - return $this->parameters[$name]; - } - - /** - * This method is automatically called on database behaviors when the database model is finished - * Propagate the behavior to the tables of the database - * Override this method to have a database behavior do something special - */ - public function modifyDatabase() - { - foreach ($this->getDatabase()->getTables() as $table) - { - $b = clone $this; - $table->addBehavior($b); - } - } - - /** - * This method is automatically called on table behaviors when the database model is finished - * Override it to add columns to the current table - */ - public function modifyTable() - { - } - - public function setTableModified($bool) - { - $this->isTableModified = $bool; - } - - public function isTableModified() - { - return $this->isTableModified; - } - - public function setEarly($bool = true) - { - $this->isEarly = $bool; - } - - public function isEarly() - { - return $this->isEarly; - } - - /** - * Use Propel's simple templating system to render a PHP file - * using variables passed as arguments. - * - * @param string $filename The template file name, relative to the behavior's dirname - * @param array $vars An associative array of argumens to be rendered - * @param string $templateDir The name of the template subdirectory - * - * @return string The rendered template - */ - public function renderTemplate($filename, $vars = array(), $templateDir = '/templates/') - { - $filePath = $this->getDirname() . $templateDir . $filename; - if (!file_exists($filePath)) { - // try with '.php' at the end - $filePath = $filePath . '.php'; - if (!file_exists($filePath)) { - throw new InvalidArgumentException(sprintf('Template "%s" not found in "%s" directory', - $filename, - $this->getDirname() . $templateDir - )); - } - } - $template = new PropelTemplate(); - $template->setTemplateFile($filePath); - $vars = array_merge($vars, array('behavior' => $this)); - - return $template->render($vars); - } - - /** - * Returns the current dirname of this behavior (also works for descendants) - * - * @return string The absolute directory name - */ - protected function getDirname() - { - if (null === $this->dirname) { - $r = new ReflectionObject($this); - $this->dirname = dirname($r->getFileName()); - } - return $this->dirname; - } - - /** - * Retrieve a column object using a name stored in the behavior parameters - * Useful for table behaviors - * - * @param string $param Name of the parameter storing the column name - * @return ColumnMap The column of the table supporting the behavior - */ - public function getColumnForParameter($param) - { - return $this->getTable()->getColumn($this->getParameter($param)); - } - - /** - * Sets up the Behavior object based on the attributes that were passed to loadFromXML(). - * @see parent::loadFromXML() - */ - protected function setupObject() - { - $this->name = $this->getAttribute("name"); - } - - /** - * @see parent::appendXml(DOMNode) - */ - public function appendXml(DOMNode $node) - { - $doc = ($node instanceof DOMDocument) ? $node : $node->ownerDocument; - - $bNode = $node->appendChild($doc->createElement('behavior')); - $bNode->setAttribute('name', $this->getName()); - - foreach ($this->parameters as $name => $value) { - $parameterNode = $bNode->appendChild($doc->createElement('parameter')); - $parameterNode->setAttribute('name', $name); - $parameterNode->setAttribute('value', $value); - } - } - - public function getTableModifier() - { - return $this; - } - - public function getObjectBuilderModifier() - { - return $this; - } - - public function getQueryBuilderModifier() - { - return $this; - } - - public function getPeerBuilderModifier() - { - return $this; - } - - public function getTableMapBuilderModifier() - { - return $this; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/Column.php b/airtime_mvc/library/propel/generator/lib/model/Column.php deleted file mode 100644 index 053d78066d..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/Column.php +++ /dev/null @@ -1,1188 +0,0 @@ - (Propel) - * @author Leon Messerschmidt (Torque) - * @author Jason van Zyl (Torque) - * @author Jon S. Stevens (Torque) - * @author Daniel Rall (Torque) - * @author Byron Foster (Torque) - * @author Bernd Goldschmidt - * @version $Revision: 1778 $ - * @package propel.generator.model - */ -class Column extends XMLElement -{ - - const DEFAULT_TYPE = "VARCHAR"; - const DEFAULT_VISIBILITY = 'public'; - public static $valid_visibilities = array('public', 'protected', 'private'); - - private $name; - private $description; - private $phpName = null; - private $phpNamingMethod; - private $isNotNull = false; - private $size; - private $namePrefix; - private $accessorVisibility; - private $mutatorVisibility; - - /** - * The name to use for the Peer constant that identifies this column. - * (Will be converted to all-uppercase in the templates.) - * @var string - */ - private $peerName; - - /** - * Native PHP type (scalar or class name) - * @var string "string", "boolean", "int", "double" - */ - private $phpType; - - /** - * @var Table - */ - private $parentTable; - - private $position; - private $isPrimaryKey = false; - private $isNodeKey = false; - private $nodeKeySep; - private $isNestedSetLeftKey = false; - private $isNestedSetRightKey = false; - private $isTreeScopeKey = false; - private $isUnique = false; - private $isAutoIncrement = false; - private $isLazyLoad = false; - private $defaultValue; - private $referrers; - private $isPrimaryString = false; - - // only one type is supported currently, which assumes the - // column either contains the classnames or a key to - // classnames specified in the schema. Others may be - // supported later. - private $inheritanceType; - private $isInheritance; - private $isEnumeratedClasses; - private $inheritanceList; - private $needsTransactionInPostgres; //maybe this can be retrieved from vendorSpecificInfo - - /** class name to do input validation on this column */ - private $inputValidator = null; - - /** - * @var Domain The domain object associated with this Column. - */ - private $domain; - - /** - * Creates a new column and set the name - * - * @param name column name - */ - public function __construct($name = null) - { - $this->name = $name; - } - - /** - * Return a comma delimited string listing the specified columns. - * - * @param columns Either a list of Column objects, or - * a list of String objects with column names. - * @deprecated Use the DDLBuilder->getColumnList() method instead; this will be removed in 1.3 - */ - public static function makeList($columns, Platform $platform) - { - $list = array(); - foreach ($columns as $col) { - if ($col instanceof Column) { - $col = $col->getName(); - } - $list[] = $platform->quoteIdentifier($col); - } - return implode(", ", $list); - } - - /** - * Sets up the Column object based on the attributes that were passed to loadFromXML(). - * @see parent::loadFromXML() - */ - protected function setupObject() - { - try { - $dom = $this->getAttribute("domain"); - if ($dom) { - $this->getDomain()->copy($this->getTable()->getDatabase()->getDomain($dom)); - } else { - $type = strtoupper($this->getAttribute("type")); - if ($type) { - $this->getDomain()->copy($this->getPlatform()->getDomainForType($type)); - } else { - $this->getDomain()->copy($this->getPlatform()->getDomainForType(self::DEFAULT_TYPE)); - } - } - - $this->name = $this->getAttribute("name"); - $this->phpName = $this->getAttribute("phpName"); - $this->phpType = $this->getAttribute("phpType"); - - if ($this->getAttribute("prefix", null) !== null) { - $this->namePrefix = $this->getAttribute("prefix"); - } elseif ($this->getTable()->getAttribute('columnPrefix', null) !== null) { - $this->namePrefix = $this->getTable()->getAttribute('columnPrefix'); - } else { - $this->namePrefix = ''; - } - - // Accessor visibility - if ($this->getAttribute('accessorVisibility', null) !== null) { - $this->setAccessorVisibility($this->getAttribute('accessorVisibility')); - } elseif ($this->getTable()->getAttribute('defaultAccessorVisibility', null) !== null) { - $this->setAccessorVisibility($this->getTable()->getAttribute('defaultAccessorVisibility')); - } elseif ($this->getTable()->getDatabase()->getAttribute('defaultAccessorVisibility', null) !== null) { - $this->setAccessorVisibility($this->getTable()->getDatabase()->getAttribute('defaultAccessorVisibility')); - } else { - $this->setAccessorVisibility(self::DEFAULT_VISIBILITY); - } - - // Mutator visibility - if ($this->getAttribute('mutatorVisibility', null) !== null) { - $this->setMutatorVisibility($this->getAttribute('mutatorVisibility')); - } elseif ($this->getTable()->getAttribute('defaultMutatorVisibility', null) !== null) { - $this->setMutatorVisibility($this->getTable()->getAttribute('defaultMutatorVisibility')); - } elseif ($this->getTable()->getDatabase()->getAttribute('defaultMutatorVisibility', null) !== null) { - $this->setMutatorVisibility($this->getTable()->getDatabase()->getAttribute('defaultMutatorVisibility')); - } else { - $this->setMutatorVisibility(self::DEFAULT_VISIBILITY); - } - - $this->peerName = $this->getAttribute("peerName"); - - // retrieves the method for converting from specified name to a PHP name, defaulting to parent tables default method - $this->phpNamingMethod = $this->getAttribute("phpNamingMethod", $this->parentTable->getDatabase()->getDefaultPhpNamingMethod()); - - $this->isPrimaryString = $this->booleanValue($this->getAttribute("primaryString")); - - $this->isPrimaryKey = $this->booleanValue($this->getAttribute("primaryKey")); - - $this->isNodeKey = $this->booleanValue($this->getAttribute("nodeKey")); - $this->nodeKeySep = $this->getAttribute("nodeKeySep", "."); - - $this->isNestedSetLeftKey = $this->booleanValue($this->getAttribute("nestedSetLeftKey")); - $this->isNestedSetRightKey = $this->booleanValue($this->getAttribute("nestedSetRightKey")); - $this->isTreeScopeKey = $this->booleanValue($this->getAttribute("treeScopeKey")); - - $this->isNotNull = ($this->booleanValue($this->getAttribute("required"), false) || $this->isPrimaryKey); // primary keys are required - - //AutoIncrement/Sequences - $this->isAutoIncrement = $this->booleanValue($this->getAttribute("autoIncrement")); - $this->isLazyLoad = $this->booleanValue($this->getAttribute("lazyLoad")); - - // Add type, size information to associated Domain object - $this->getDomain()->replaceSqlType($this->getAttribute("sqlType")); - if (!$this->getAttribute("size") && $this->getDomain()->getType() == 'VARCHAR' && !$this->getAttribute("sqlType")) { - $size = 255; - } else { - $size = $this->getAttribute("size"); - } - $this->getDomain()->replaceSize($size); - $this->getDomain()->replaceScale($this->getAttribute("scale")); - - $defval = $this->getAttribute("defaultValue", $this->getAttribute("default")); - if ($defval !== null && strtolower($defval) !== 'null') { - $this->getDomain()->setDefaultValue(new ColumnDefaultValue($defval, ColumnDefaultValue::TYPE_VALUE)); - } elseif ($this->getAttribute("defaultExpr") !== null) { - $this->getDomain()->setDefaultValue(new ColumnDefaultValue($this->getAttribute("defaultExpr"), ColumnDefaultValue::TYPE_EXPR)); - } - - $this->inheritanceType = $this->getAttribute("inheritance"); - $this->isInheritance = ($this->inheritanceType !== null - && $this->inheritanceType !== "false"); // here we are only checking for 'false', so don't - // use boleanValue() - - $this->inputValidator = $this->getAttribute("inputValidator"); - $this->description = $this->getAttribute("description"); - } catch (Exception $e) { - throw new EngineException("Error setting up column " . var_export($this->getAttribute("name"), true) . ": " . $e->getMessage()); - } - } - - /** - * Gets domain for this column, creating a new empty domain object if none is set. - * @return Domain - */ - public function getDomain() - { - if ($this->domain === null) { - $this->domain = new Domain(); - } - return $this->domain; - } - - /** - * Returns table.column - */ - public function getFullyQualifiedName() - { - return ($this->parentTable->getName() . '.' . strtoupper($this->getName())); - } - - /** - * Get the name of the column - */ - public function getName() - { - return $this->name; - } - - /** - * Set the name of the column - */ - public function setName($newName) - { - $this->name = $newName; - } - - /** - * Get the description for the Table - */ - public function getDescription() - { - return $this->description; - } - - /** - * Set the description for the Table - * - * @param newDescription description for the Table - */ - public function setDescription($newDescription) - { - $this->description = $newDescription; - } - - /** - * Get name to use in PHP sources. It will set & return - * a self-generated phpName from it's name if it's - * not already set. - * @return string - */ - public function getPhpName() - { - if ($this->phpName === null) { - $this->setPhpName(); - } - return $this->phpName; - } - - /** - * Set name to use in PHP sources. - * - * It will generate a phpName from it's name if no - * $phpName is passed. - * - * @param String $phpName PhpName to be set - */ - public function setPhpName($phpName = null) - { - if ($phpName == null) { - $this->phpName = self::generatePhpName($this->name, $this->phpNamingMethod, $this->namePrefix); - } else { - $this->phpName = $phpName; - } - } - - /** - * Get studly version of PHP name. - * - * The studly name is the PHP name with the first character lowercase. - * - * @return string - */ - public function getStudlyPhpName() - { - $phpname = $this->getPhpName(); - if (strlen($phpname) > 1) { - return strtolower(substr($phpname, 0, 1)) . substr($phpname, 1); - } else { // 0 or 1 chars (I suppose that's rare) - return strtolower($phpname); - } - } - - /** - * Get the visibility of the accessors of this column / attribute - * @return string - */ - public function getAccessorVisibility() { - if ($this->accessorVisibility !== null) { - return $this->accessorVisibility; - } else { - return self::DEFAULT_VISIBILITY; - } - } - - /** - * Set the visibility of the accessor methods for this column / attribute - * @param $newVisibility string - */ - public function setAccessorVisibility($newVisibility) { - if (in_array($newVisibility, self::$valid_visibilities)) { - $this->accessorVisibility = $newVisibility; - } else { - $this->accessorVisibility = self::DEFAULT_VISIBILITY; - } - - } - - /** - * Get the visibility of the mutator of this column / attribute - * @return string - */ - public function getMutatorVisibility() { - if ($this->mutatorVisibility !== null) { - return $this->mutatorVisibility; - } else { - return self::DEFAULT_VISIBILITY; - } - } - - /** - * Set the visibility of the mutator methods for this column / attribute - * @param $newVisibility string - */ - public function setMutatorVisibility($newVisibility) { - if (in_array($newVisibility, self::$valid_visibilities)) { - $this->mutatorVisibility = $newVisibility; - } else { - $this->mutatorVisibility = self::DEFAULT_VISIBILITY; - } - - } - - /** - * Get the column constant name (e.g. PeerName::COLUMN_NAME). - * - * @return string A column constant name for insertion into PHP code - */ - public function getConstantName() - { - $classname = $this->getTable()->getPhpName() . 'Peer'; - $const = $this->getConstantColumnName(); - return $classname.'::'.$const; - } - - public function getConstantColumnName() - { - // was it overridden in schema.xml ? - if ($this->getPeerName()) { - return strtoupper($this->getPeerName()); - } else { - return strtoupper($this->getName()); - } - } - - /** - * Get the Peer constant name that will identify this column. - * @return string - */ - public function getPeerName() { - return $this->peerName; - } - - /** - * Set the Peer constant name that will identify this column. - * @param $name string - */ - public function setPeerName($name) { - $this->peerName = $name; - } - - /** - * Get type to use in PHP sources. - * - * If no type has been specified, then uses results of getPhpNative(). - * - * @return string The type name. - * @see getPhpNative() - */ - public function getPhpType() - { - if ($this->phpType !== null) { - return $this->phpType; - } - return $this->getPhpNative(); - } - - /** - * Get the location of this column within the table (one-based). - * @return int value of position. - */ - public function getPosition() - { - return $this->position; - } - - /** - * Get the location of this column within the table (one-based). - * @param int $v Value to assign to position. - */ - public function setPosition($v) - { - $this->position = $v; - } - - /** - * Set the parent Table of the column - */ - public function setTable(Table $parent) - { - $this->parentTable = $parent; - } - - /** - * Get the parent Table of the column - */ - public function getTable() - { - return $this->parentTable; - } - - /** - * Returns the Name of the table the column is in - */ - public function getTableName() - { - return $this->parentTable->getName(); - } - - /** - * Adds a new inheritance definition to the inheritance list and set the - * parent column of the inheritance to the current column - * @param mixed $inhdata Inheritance or XML data. - */ - public function addInheritance($inhdata) - { - if ($inhdata instanceof Inheritance) { - $inh = $inhdata; - $inh->setColumn($this); - if ($this->inheritanceList === null) { - $this->inheritanceList = array(); - $this->isEnumeratedClasses = true; - } - $this->inheritanceList[] = $inh; - return $inh; - } else { - $inh = new Inheritance(); - $inh->loadFromXML($inhdata); - return $this->addInheritance($inh); - } - } - - /** - * Get the inheritance definitions. - */ - public function getChildren() - { - return $this->inheritanceList; - } - - /** - * Determine if this column is a normal property or specifies a - * the classes that are represented in the table containing this column. - */ - public function isInheritance() - { - return $this->isInheritance; - } - - /** - * Determine if possible classes have been enumerated in the xml file. - */ - public function isEnumeratedClasses() - { - return $this->isEnumeratedClasses; - } - - /** - * Return the isNotNull property of the column - */ - public function isNotNull() - { - return $this->isNotNull; - } - - /** - * Set the isNotNull property of the column - */ - public function setNotNull($status) - { - $this->isNotNull = (boolean) $status; - } - - /** - * Return NOT NULL String for this column - * - * @return "NOT NULL" if null values are not allowed or an empty string. - */ - public function getNotNullString() - { - return $this->getTable()->getDatabase()->getPlatform()->getNullString($this->isNotNull()); - } - - /** - * Set whether the column is the primary string, - * i.e. whether its value is the default string representation of the table - * @param boolean $v - */ - public function setPrimaryString($v) - { - $this->isPrimaryString = (boolean) $v; - } - - /** - * Return true if the column is the primary string, - * i.e. if its value is the default string representation of the table - */ - public function isPrimaryString() - { - return $this->isPrimaryString; - } - - /** - * Set whether the column is a primary key or not. - * @param boolean $v - */ - public function setPrimaryKey($v) - { - $this->isPrimaryKey = (boolean) $v; - } - - /** - * Return true if the column is a primary key - */ - public function isPrimaryKey() - { - return $this->isPrimaryKey; - } - - /** - * Set if the column is the node key of a tree - */ - public function setNodeKey($nk) - { - $this->isNodeKey = (boolean) $nk; - } - - /** - * Return true if the column is a node key of a tree - */ - public function isNodeKey() - { - return $this->isNodeKey; - } - - /** - * Set if the column is the node key of a tree - */ - public function setNodeKeySep($sep) - { - $this->nodeKeySep = (string) $sep; - } - - /** - * Return true if the column is a node key of a tree - */ - public function getNodeKeySep() - { - return $this->nodeKeySep; - } - - /** - * Set if the column is the nested set left key of a tree - */ - public function setNestedSetLeftKey($nslk) - { - $this->isNestedSetLeftKey = (boolean) $nslk; - } - - /** - * Return true if the column is a nested set key of a tree - */ - public function isNestedSetLeftKey() - { - return $this->isNestedSetLeftKey; - } - - /** - * Set if the column is the nested set right key of a tree - */ - public function setNestedSetRightKey($nsrk) - { - $this->isNestedSetRightKey = (boolean) $nsrk; - } - - /** - * Return true if the column is a nested set right key of a tree - */ - public function isNestedSetRightKey() - { - return $this->isNestedSetRightKey; - } - - /** - * Set if the column is the scope key of a tree - */ - public function setTreeScopeKey($tsk) - { - $this->isTreeScopeKey = (boolean) $tsk; - } - - /** - * Return true if the column is a scope key of a tree - * @return boolean - */ - public function isTreeScopeKey() - { - return $this->isTreeScopeKey; - } - - /** - * Set true if the column is UNIQUE - * @param boolean $u - */ - public function setUnique($u) - { - $this->isUnique = $u; - } - - /** - * Get the UNIQUE property. - * @return boolean - */ - public function isUnique() - { - return $this->isUnique; - } - - /** - * Return true if the column requires a transaction in Postgres - * @return boolean - */ - public function requiresTransactionInPostgres() - { - return $this->needsTransactionInPostgres; - } - - /** - * Utility method to determine if this column is a foreign key. - * @return boolean - */ - public function isForeignKey() - { - return (count($this->getForeignKeys()) > 0); - } - - /** - * Whether this column is a part of more than one foreign key. - * @return boolean - */ - public function hasMultipleFK() - { - return (count($this->getForeignKeys()) > 1); - } - - /** - * Get the foreign key objects for this column (if it is a foreign key or part of a foreign key) - * @return array - */ - public function getForeignKeys() - { - return $this->parentTable->getColumnForeignKeys($this->name); - } - - /** - * Adds the foreign key from another table that refers to this column. - */ - public function addReferrer(ForeignKey $fk) - { - if ($this->referrers === null) { - $this->referrers = array(); - } - $this->referrers[] = $fk; - } - - /** - * Get list of references to this column. - */ - public function getReferrers() - { - if ($this->referrers === null) { - $this->referrers = array(); - } - return $this->referrers; - } - - /** - * Sets the domain up for specified Propel type. - * - * Calling this method will implicitly overwrite any previously set type, - * size, scale (or other domain attributes). - * - * @param string $propelType - */ - public function setDomainForType($propelType) - { - $this->getDomain()->copy($this->getPlatform()->getDomainForType($propelType)); - } - - /** - * Sets the propel colunm type. - * @param string $propelType - * @see Domain::setType() - */ - public function setType($propelType) - { - $this->getDomain()->setType($propelType); - if ($propelType == PropelTypes::VARBINARY|| $propelType == PropelTypes::LONGVARBINARY || $propelType == PropelTypes::BLOB) { - $this->needsTransactionInPostgres = true; - } - } - - /** - * Returns the Propel column type as a string. - * @return string The constant representing Propel type: e.g. "VARCHAR". - * @see Domain::getType() - */ - public function getType() - { - return $this->getDomain()->getType(); - } - - /** - * Returns the column PDO type integer for this column's Propel type. - * @return int The integer value representing PDO type param: e.g. PDO::PARAM_INT - */ - public function getPDOType() - { - return PropelTypes::getPDOType($this->getType()); - } - - /** - * Returns the column type as given in the schema as an object - */ - public function getPropelType() - { - return $this->getType(); - } - - /** - * Utility method to know whether column needs Blob/Lob handling. - * @return boolean - */ - public function isLobType() - { - return PropelTypes::isLobType($this->getType()); - } - - /** - * Utility method to see if the column is text type. - */ - public function isTextType() - { - return PropelTypes::isTextType($this->getType()); - } - - /** - * Utility method to see if the column is numeric type. - * @return boolean - */ - public function isNumericType() - { - return PropelTypes::isNumericType($this->getType()); - } - - /** - * Utility method to see if the column is boolean type. - * @return boolean - */ - public function isBooleanType() - { - return PropelTypes::isBooleanType($this->getType()); - } - - /** - * Utility method to know whether column is a temporal column. - * @return boolean - */ - public function isTemporalType() - { - return PropelTypes::isTemporalType($this->getType()); - } - - /** - * @see XMLElement::appendXml(DOMNode) - */ - public function appendXml(DOMNode $node) - { - $doc = ($node instanceof DOMDocument) ? $node : $node->ownerDocument; - - $colNode = $node->appendChild($doc->createElement('column')); - $colNode->setAttribute('name', $this->name); - - if ($this->phpName !== null) { - $colNode->setAttribute('phpName', $this->getPhpName()); - } - - $colNode->setAttribute('type', $this->getType()); - - $domain = $this->getDomain(); - - if ($domain->getSize() !== null) { - $colNode->setAttribute('size', $domain->getSize()); - } - - if ($domain->getScale() !== null) { - $colNode->setAttribute('scale', $domain->getScale()); - } - - if ($this->isPrimaryKey) { - $colNode->setAttribute('primaryKey', var_export($this->isPrimaryKey, true)); - } - - if ($this->isAutoIncrement) { - $colNode->setAttribute('autoIncrement', var_export($this->isAutoIncrement, true)); - } - - if ($this->isNotNull) { - $colNode->setAttribute('required', 'true'); - } else { - $colNode->setAttribute('required', 'false'); - } - - if ($domain->getDefaultValue() !== null) { - $def = $domain->getDefaultValue(); - if ($def->isExpression()) { - $colNode->setAttribute('defaultExpr', $def->getValue()); - } else { - $colNode->setAttribute('defaultValue', $def->getValue()); - } - } - - if ($this->isInheritance()) { - $colNode->setAttribute('inheritance', $this->inheritanceType); - foreach ($this->inheritanceList as $inheritance) { - $inheritance->appendXml($colNode); - } - } - - if ($this->isNodeKey()) { - $colNode->setAttribute('nodeKey', 'true'); - if ($this->getNodeKeySep() !== null) { - $colNode->setAttribute('nodeKeySep', $this->nodeKeySep); - } - } - - foreach ($this->vendorInfos as $vi) { - $vi->appendXml($colNode); - } - } - - /** - * Returns the size of the column - * @return string - */ - public function getSize() - { - return $this->domain->getSize(); - } - - /** - * Set the size of the column - * @param string $newSize - */ - public function setSize($newSize) - { - $this->domain->setSize($newSize); - } - - /** - * Returns the scale of the column - * @return string - */ - public function getScale() - { - return $this->domain->getScale(); - } - - /** - * Set the scale of the column - * @param string $newScale - */ - public function setScale($newScale) - { - $this->domain->setScale($newScale); - } - - /** - * Return the size in brackets for use in an sql - * schema if the type is String. Otherwise return an empty string - */ - public function printSize() - { - return $this->domain->printSize(); - } - - /** - * Return a string that will give this column a default value. - * @return string - */ - public function getDefaultSetting() - { - $dflt = ""; - $defaultValue = $this->getDefaultValue(); - if ($defaultValue !== null) { - $dflt .= "default "; - - if ($this->getDefaultValue()->isExpression()) { - $dflt .= $this->getDefaultValue()->getValue(); - } else { - if ($this->isTextType()) { - $dflt .= $this->getPlatform()->quote($defaultValue->getValue()); - } elseif ($this->getType() == PropelTypes::BOOLEAN) { - $dflt .= $this->getPlatform()->getBooleanString($defaultValue->getValue()); - } else { - $dflt .= $defaultValue->getValue(); - } - } - } - return $dflt; - } - - /** - * Return a string that will give this column a default value in PHP - * @return string - */ - public function getDefaultValueString() - { - $defaultValue = $this->getDefaultValue(); - if ($defaultValue !== null) { - if ($this->isNumericType()) { - $dflt = (float) $defaultValue->getValue(); - } elseif ($this->isTextType() || $this->getDefaultValue()->isExpression()) { - $dflt = "'" . str_replace("'", "\'", $defaultValue->getValue()) . "'"; - } elseif ($this->getType() == PropelTypes::BOOLEAN) { - $dflt = $this->booleanValue($defaultValue->getValue()) ? 'true' : 'false'; - } else { - $dflt = "'" . $defaultValue->getValue() . "'"; - } - } else { - $dflt = "null"; - } - return $dflt; - } - - /** - * Set a string that will give this column a default value. - */ - public function setDefaultValue($def) - { - $this->domain->setDefaultValue($def); - } - - /** - * Get the default value object for this column. - * @return ColumnDefaultValue - * @see Domain::getDefaultValue() - */ - public function getDefaultValue() - { - return $this->domain->getDefaultValue(); - } - - /** - * Get the default value suitable for use in PHP. - * @return mixed - * @see Domain::getPhpDefaultValue() - */ - public function getPhpDefaultValue() - { - return $this->domain->getPhpDefaultValue(); - } - - /** - * Returns the class name to do input validation - */ - public function getInputValidator() - { - return $this->inputValidator; - } - - /** - * Return auto increment/sequence string for the target database. We need to - * pass in the props for the target database! - */ - public function isAutoIncrement() - { - return $this->isAutoIncrement; - } - - /** - * Return auto increment/sequence string for the target database. We need to - * pass in the props for the target database! - */ - public function isLazyLoad() - { - return $this->isLazyLoad; - } - - /** - * Gets the auto-increment string. - * @return string - */ - public function getAutoIncrementString() - { - if ($this->isAutoIncrement()&& IDMethod::NATIVE === $this->getTable()->getIdMethod()) { - return $this->getPlatform()->getAutoIncrement(); - } elseif ($this->isAutoIncrement()) { - throw new EngineException("You have specified autoIncrement for column '" . $this->name . "' but you have not specified idMethod=\"native\" for table '" . $this->getTable()->getName() . "'."); - } - return ""; - } - - /** - * Set the auto increment value. - * Use isAutoIncrement() to find out if it is set or not. - */ - public function setAutoIncrement($value) - { - $this->isAutoIncrement = (boolean) $value; - } - - /** - * Set the column type from a string property - * (normally a string from an sql input file) - * - * @deprecated Do not use; this will be removed in next release. - */ - public function setTypeFromString($typeName, $size) - { - $tn = strtoupper($typeName); - $this->setType($tn); - - if ($size !== null) { - $this->size = $size; - } - - if (strpos($tn, "CHAR") !== false) { - $this->domain->setType(PropelTypes::VARCHAR); - } elseif (strpos($tn, "INT") !== false) { - $this->domain->setType(PropelTypes::INTEGER); - } elseif (strpos($tn, "FLOAT") !== false) { - $this->domain->setType(PropelTypes::FLOAT); - } elseif (strpos($tn, "DATE") !== false) { - $this->domain->setType(PropelTypes::DATE); - } elseif (strpos($tn, "TIME") !== false) { - $this->domain->setType(PropelTypes::TIMESTAMP); - } else if (strpos($tn, "BINARY") !== false) { - $this->domain->setType(PropelTypes::LONGVARBINARY); - } else { - $this->domain->setType(PropelTypes::VARCHAR); - } - } - - /** - * Return a string representation of the native PHP type which corresponds - * to the propel type of this column. Use in the generation of Base objects. - * - * @return string PHP datatype used by propel. - */ - public function getPhpNative() - { - return PropelTypes::getPhpNative($this->getType()); - } - - /** - * Returns true if the column's PHP native type is an boolean, int, long, float, double, string. - * @return boolean - * @see PropelTypes::isPhpPrimitiveType() - */ - public function isPhpPrimitiveType() - { - return PropelTypes::isPhpPrimitiveType($this->getPhpType()); - } - - /** - * Return true if column's PHP native type is an boolean, int, long, float, double. - * @return boolean - * @see PropelTypes::isPhpPrimitiveNumericType() - */ - public function isPhpPrimitiveNumericType() - { - return PropelTypes::isPhpPrimitiveNumericType($this->getPhpType()); - } - - /** - * Returns true if the column's PHP native type is a class name. - * @return boolean - * @see PropelTypes::isPhpObjectType() - */ - public function isPhpObjectType() - { - return PropelTypes::isPhpObjectType($this->getPhpType()); - } - - /** - * Get the platform/adapter impl. - * - * @return Platform - */ - public function getPlatform() - { - return $this->getTable()->getDatabase()->getPlatform(); - } - - /** - * - * @return string - * @deprecated Use DDLBuilder->getColumnDDL() instead; this will be removed in 1.3 - */ - public function getSqlString() - { - $sb = ""; - $sb .= $this->getPlatform()->quoteIdentifier($this->getName()) . " "; - $sb .= $this->getDomain()->getSqlType(); - if ($this->getPlatform()->hasSize($this->getDomain()->getSqlType())) { - $sb .= $this->getDomain()->printSize(); - } - $sb .= " "; - $sb .= $this->getDefaultSetting() . " "; - $sb .= $this->getNotNullString() . " "; - $sb .= $this->getAutoIncrementString(); - return trim($sb); - } - - public static function generatePhpName($name, $phpNamingMethod = PhpNameGenerator::CONV_METHOD_CLEAN, $namePrefix = null) { - return NameFactory::generateName(NameFactory::PHP_GENERATOR, array($name, $phpNamingMethod, $namePrefix)); - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/ColumnDefaultValue.php b/airtime_mvc/library/propel/generator/lib/model/ColumnDefaultValue.php deleted file mode 100644 index 212fc44e43..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/ColumnDefaultValue.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -class ColumnDefaultValue -{ - - const TYPE_VALUE = "value"; - const TYPE_EXPR = "expr"; - - /** - * @var string The default value, as specified in the schema. - */ - private $value; - - /** - * @var string The type of value represented by this object (DefaultValue::TYPE_VALUE or DefaultValue::TYPE_EXPR). - */ - private $type = ColumnDefaultValue::TYPE_VALUE; - - /** - * Creates a new DefaultValue object. - * - * @param string $value The default value, as specified in the schema. - * @param string $type The type of default value (DefaultValue::TYPE_VALUE or DefaultValue::TYPE_EXPR) - */ - public function __construct($value, $type = null) - { - $this->setValue($value); - if ($type !== null) { - $this->setType($type); - } - } - - /** - * @return string The type of default value (DefaultValue::TYPE_VALUE or DefaultValue::TYPE_EXPR) - */ - public function getType() - { - return $this->type; - } - - /** - * @param string $type The type of default value (DefaultValue::TYPE_VALUE or DefaultValue::TYPE_EXPR) - */ - public function setType($type) - { - $this->type = $type; - } - - /** - * Convenience method to indicate whether the value in this object is an expression (as opposed to simple value). - * - * @return boolean Whether value this object holds is an expression. - */ - public function isExpression() - { - return ($this->type == self::TYPE_EXPR); - } - - /** - * @return string The value, as specified in the schema. - */ - public function getValue() - { - return $this->value; - } - - /** - * @param string $value The value, as specified in the schema. - */ - public function setValue($value) - { - $this->value = $value; - } - - -} diff --git a/airtime_mvc/library/propel/generator/lib/model/ConstraintNameGenerator.php b/airtime_mvc/library/propel/generator/lib/model/ConstraintNameGenerator.php deleted file mode 100644 index 735fea1b8f..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/ConstraintNameGenerator.php +++ /dev/null @@ -1,72 +0,0 @@ -NameGenerator implementation for table-specific - * constraints. Conforms to the maximum column name length for the - * type of database in use. - * - * @author Hans Lellelid (Propel) - * @author Daniel Rall (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -class ConstraintNameGenerator implements NameGenerator -{ - /** - * Conditional compilation flag. - */ - const DEBUG = false; - - /** - * First element of inputs should be of type {@link Database}, second - * should be a table name, third is the type identifier (spared if - * trimming is necessary due to database type length constraints), - * and the fourth is a Integer indicating the number - * of this contraint. - * - * @see NameGenerator - * @throws EngineException - */ - public function generateName($inputs) - { - - $db = $inputs[0]; - $name = $inputs[1]; - $namePostfix = $inputs[2]; - $constraintNbr = (string) $inputs[3]; - - // Calculate maximum RDBMS-specific column character limit. - $maxBodyLength = -1; - try { - $maxColumnNameLength = (int) $db->getPlatform()->getMaxColumnNameLength(); - $maxBodyLength = ($maxColumnNameLength - strlen($namePostfix) - - strlen($constraintNbr) - 2); - - if (self::DEBUG) { - print("maxColumnNameLength=" . $maxColumnNameLength - . " maxBodyLength=" . $maxBodyLength . "\n"); - } - } catch (EngineException $e) { - echo $e; - throw $e; - } - - // Do any necessary trimming. - if ($maxBodyLength !== -1 && strlen($name) > $maxBodyLength) { - $name = substr($name, 0, $maxBodyLength); - } - - $name .= self::STD_SEPARATOR_CHAR . $namePostfix - . self::STD_SEPARATOR_CHAR . $constraintNbr; - - return $name; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/Database.php b/airtime_mvc/library/propel/generator/lib/model/Database.php deleted file mode 100644 index e34e4485d9..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/Database.php +++ /dev/null @@ -1,676 +0,0 @@ - (Propel) - * @author Leon Messerschmidt (Torque) - * @author John McNally (Torque) - * @author Martin Poeschl (Torque) - * @author Daniel Rall (Torque) - * @author Byron Foster (Torque) - * @version $Revision: 1802 $ - * @package propel.generator.model - */ -class Database extends XMLElement -{ - - private $platform; - private $tableList = array(); - private $curColumn; - private $name; - private $pkg; - - /** - * Namespace for the generated OM. - * - * @var string - */ - protected $namespace; - - private $baseClass; - private $basePeer; - private $defaultIdMethod; - private $defaultPhpNamingMethod; - private $defaultTranslateMethod; - private $dbParent; - private $tablesByName = array(); - private $tablesByPhpName = array(); - private $heavyIndexing; - protected $tablePrefix = ''; - - private $domainMap = array(); - - /** - * List of behaviors registered for this table - * - * @var array - */ - protected $behaviors = array(); - - /** - * Constructs a new Database object. - * - * @param string $name - */ - public function __construct($name = null) - { - $this->name = $name; - } - - /** - * Sets up the Database object based on the attributes that were passed to loadFromXML(). - * @see parent::loadFromXML() - */ - protected function setupObject() - { - $this->name = $this->getAttribute("name"); - $namespace = $this->getAttribute("namespace", ''); - $package = $this->getAttribute("package"); - if ($namespace && !$package && $this->getBuildProperty('namespaceAutoPackage')) { - $package = str_replace('\\', '.', $namespace); - } - $this->namespace = $namespace; - $this->pkg = $package; - $this->baseClass = $this->getAttribute("baseClass"); - $this->basePeer = $this->getAttribute("basePeer"); - $this->defaultIdMethod = $this->getAttribute("defaultIdMethod", IDMethod::NATIVE); - $this->defaultPhpNamingMethod = $this->getAttribute("defaultPhpNamingMethod", NameGenerator::CONV_METHOD_UNDERSCORE); - $this->defaultTranslateMethod = $this->getAttribute("defaultTranslateMethod", Validator::TRANSLATE_NONE); - $this->heavyIndexing = $this->booleanValue($this->getAttribute("heavyIndexing")); - $this->tablePrefix = $this->getAttribute('tablePrefix', $this->getBuildProperty('tablePrefix')); - } - - /** - * Returns the Platform implementation for this database. - * - * @return Platform a Platform implementation - */ - public function getPlatform() - { - return $this->platform; - } - - /** - * Sets the Platform implementation for this database. - * - * @param Platform $platform A Platform implementation - */ - public function setPlatform($platform) - { - $this->platform = $platform; - } - - /** - * Get the name of the Database - */ - public function getName() - { - return $this->name; - } - - /** - * Set the name of the Database - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Get the value of package. - * @return value of package. - */ - public function getPackage() - { - return $this->pkg; - } - - /** - * Set the value of package. - * @param v Value to assign to package. - */ - public function setPackage($v) - { - $this->pkg = $v; - } - - /** - * Get the value of the namespace. - * @return value of namespace. - */ - public function getNamespace() - { - return $this->namespace; - } - - /** - * Set the value of the namespace. - * @param v Value to assign to namespace. - */ - public function setNamespace($v) - { - $this->namespace = $v; - } - - /** - * Get the value of baseClass. - * @return value of baseClass. - */ - public function getBaseClass() - { - return $this->baseClass; - } - - /** - * Set the value of baseClass. - * @param v Value to assign to baseClass. - */ - public function setBaseClass($v) - { - $this->baseClass = $v; - } - - /** - * Get the value of basePeer. - * @return value of basePeer. - */ - public function getBasePeer() - { - return $this->basePeer; - } - - /** - * Set the value of basePeer. - * @param v Value to assign to basePeer. - */ - public function setBasePeer($v) - { - $this->basePeer = $v; - } - - /** - * Get the value of defaultIdMethod. - * @return value of defaultIdMethod. - */ - public function getDefaultIdMethod() - { - return $this->defaultIdMethod; - } - - /** - * Set the value of defaultIdMethod. - * @param v Value to assign to defaultIdMethod. - */ - public function setDefaultIdMethod($v) - { - $this->defaultIdMethod = $v; - } - - /** - * Get the value of defaultPHPNamingMethod which specifies the - * method for converting schema names for table and column to PHP names. - * @return string The default naming conversion used by this database. - */ - public function getDefaultPhpNamingMethod() - { - return $this->defaultPhpNamingMethod; - } - - /** - * Set the value of defaultPHPNamingMethod. - * @param string $v The default naming conversion for this database to use. - */ - public function setDefaultPhpNamingMethod($v) - { - $this->defaultPhpNamingMethod = $v; - } - - /** - * Get the value of defaultTranslateMethod which specifies the - * method for translate validator error messages. - * @return string The default translate method. - */ - public function getDefaultTranslateMethod() - { - return $this->defaultTranslateMethod; - } - - /** - * Set the value of defaultTranslateMethod. - * @param string $v The default translate method to use. - */ - public function setDefaultTranslateMethod($v) - { - $this->defaultTranslateMethod = $v; - } - - /** - * Get the value of heavyIndexing. - * - * This is a synonym for getHeavyIndexing(). - * - * @return boolean Value of heavyIndexing. - * @see getHeavyIndexing() - */ - public function isHeavyIndexing() - { - return $this->getHeavyIndexing(); - } - - /** - * Get the value of heavyIndexing. - * - * @return boolean Value of heavyIndexing. - */ - public function getHeavyIndexing() - { - return $this->heavyIndexing; - } - - /** - * Set the value of heavyIndexing. - * @param boolean $v Value to assign to heavyIndexing. - */ - public function setHeavyIndexing($v) - { - $this->heavyIndexing = (boolean) $v; - } - - /** - * Return an array of all tables - */ - public function getTables() - { - return $this->tableList; - } - - /** - * Check whether the database has a table. - * @return boolean - */ - public function hasTable($name) - { - return array_key_exists($name, $this->tablesByName); - } - - /** - * Return the table with the specified name. - * @param string $name The name of the table (e.g. 'my_table') - * @return Table a Table object or null if it doesn't exist - */ - public function getTable($name) - { - if ($this->hasTable($name)) { - return $this->tablesByName[$name]; - } - return null; // just to be explicit - } - - /** - * Return the table with the specified phpName. - * @param string $phpName the PHP Name of the table (e.g. 'MyTable') - * @return Table a Table object or null if it doesn't exist - */ - public function getTableByPhpName($phpName) - { - if (isset($this->tablesByPhpName[$phpName])) { - return $this->tablesByPhpName[$phpName]; - } - return null; // just to be explicit - } - - /** - * An utility method to add a new table from an xml attribute. - */ - public function addTable($data) - { - if ($data instanceof Table) { - $tbl = $data; // alias - $tbl->setDatabase($this); - if (isset($this->tablesByName[$tbl->getName()])) { - throw new EngineException("Duplicate table declared: " . $tbl->getName()); - } - $this->tableList[] = $tbl; - $this->tablesByName[ $tbl->getName() ] = $tbl; - $this->tablesByPhpName[ $tbl->getPhpName() ] = $tbl; - if ($tbl->getPackage() === null) { - $tbl->setPackage($this->getPackage()); - } - return $tbl; - } else { - $tbl = new Table(); - $tbl->setDatabase($this); - $tbl->loadFromXML($data); - return $this->addTable($tbl); // call self w/ different param - } - } - - /** - * Set the parent of the database - */ - public function setAppData(AppData $parent) - { - $this->dbParent = $parent; - } - - /** - * Get the parent of the table - */ - public function getAppData() - { - return $this->dbParent; - } - - /** - * Adds Domain object from tag. - * @param mixed XML attributes (array) or Domain object. - */ - public function addDomain($data) { - - if ($data instanceof Domain) { - $domain = $data; // alias - $domain->setDatabase($this); - $this->domainMap[ $domain->getName() ] = $domain; - return $domain; - } else { - $domain = new Domain(); - $domain->setDatabase($this); - $domain->loadFromXML($data); - return $this->addDomain($domain); // call self w/ different param - } - } - - /** - * Get already configured Domain object by name. - * @return Domain - */ - public function getDomain($domainName) - { - if (isset($this->domainMap[$domainName])) { - return $this->domainMap[$domainName]; - } - return null; // just to be explicit - } - - public function getGeneratorConfig() - { - if ($this->getAppData() && $this->getAppData()->getPlatform()) { - return $this->getAppData()->getPlatform()->getGeneratorConfig(); - } else { - return null; - } - } - - public function getBuildProperty($key) - { - if($config = $this->getGeneratorConfig()) { - return $config->getBuildProperty($key); - } else { - return ''; - } - } - - /** - * Adds a new Behavior to the database - * @return Behavior A behavior instance - */ - public function addBehavior($bdata) - { - if ($bdata instanceof Behavior) { - $behavior = $bdata; - $behavior->setDatabase($this); - $this->behaviors[$behavior->getName()] = $behavior; - return $behavior; - } else { - $class = $this->getConfiguredBehavior($bdata['name']); - $behavior = new $class(); - $behavior->loadFromXML($bdata); - return $this->addBehavior($behavior); - } - } - - /** - * Get the database behaviors - * @return Array of Behavior objects - */ - public function getBehaviors() - { - return $this->behaviors; - } - - /** - * check if the database has a behavior by name - * - * @param string $name the behavior name - * @return boolean True if the behavior exists - */ - public function hasBehavior($name) - { - return array_key_exists($name, $this->behaviors); - } - - /** - * Get one database behavior by name - * @param string $name the behavior name - * @return Behavior a behavior object - */ - public function getBehavior($name) - { - return $this->behaviors[$name]; - } - - /** - * Get the table prefix for this database - * - * @return string the table prefix - */ - public function getTablePrefix() - { - return $this->tablePrefix; - } - - - public function doFinalInitialization() - { - if($defaultBehaviors = $this->getBuildProperty('behaviorDefault')) { - // add generic behaviors from build.properties - $defaultBehaviors = explode(',', $defaultBehaviors); - foreach ($defaultBehaviors as $behavior) { - $this->addBehavior(array('name' => trim($behavior))); - } - } - - // execute behavior database modifiers - foreach ($this->getBehaviors() as $behavior) { - $behavior->modifyDatabase(); - } - - $tables = $this->getTables(); - - // execute early table behaviors - foreach ($tables as $table) { - foreach ($table->getEarlyBehaviors() as $behavior) { - if (!$behavior->isTableModified()) { - $behavior->getTableModifier()->modifyTable(); - $behavior->setTableModified(true); - } - } - } - - for ($i=0,$size=count($tables); $i < $size; $i++) { - $currTable = $tables[$i]; - - // check schema integrity - // if idMethod="autoincrement", make sure a column is - // specified as autoIncrement="true" - // FIXME: Handle idMethod="native" via DB adapter. - /* - - --- REMOVING THIS BECAUSE IT'S ANNOYING - - if ($currTable->getIdMethod() == IDMethod::NATIVE ) { - $columns = $currTable->getColumns(); - $foundOne = false; - for ($j=0, $cLen=count($columns); $j < $cLen && !$foundOne; $j++) { - $foundOne = $columns[$j]->isAutoIncrement(); - } - - if (!$foundOne) { - $errorMessage = "Table '" . $currTable->getName() - . "' is set to use native id generation, but it does not " - . "have a column which declared as the one to " - . "auto increment (i.e. autoIncrement=\"true\")"; - - throw new BuildException($errorMessage); - } - } - */ - - $currTable->doFinalInitialization(); - - // setup reverse fk relations - $fks = $currTable->getForeignKeys(); - for ($j=0, $fksLen=count($fks); $j < $fksLen; $j++) { - $currFK = $fks[$j]; - $foreignTable = $this->getTable($currFK->getForeignTableName()); - if ($foreignTable === null) { - throw new BuildException("ERROR!! Attempt to set foreign" - . " key to nonexistent table, " - . $currFK->getForeignTableName() . "!"); - } - - $referrers = $foreignTable->getReferrers(); - if ($referrers === null || !in_array($currFK, $referrers, true) ) { - $foreignTable->addReferrer($currFK); - } - - // local column references - $localColumnNames = $currFK->getLocalColumns(); - - for ($k=0,$lcnLen=count($localColumnNames); $k < $lcnLen; $k++) { - - $local = $currTable->getColumn($localColumnNames[$k]); - - // give notice of a schema inconsistency. - // note we do not prevent the npe as there is nothing - // that we can do, if it is to occur. - if ($local === null) { - throw new BuildException("ERROR!! Attempt to define foreign" - . " key with nonexistent column, " - . $localColumnNames[$k] . ", in table, " - . $currTable->getName() . "!"); - } - - //check for foreign pk's - if ($local->isPrimaryKey()) { - $currTable->setContainsForeignPK(true); - } - - } // for each local col name - - // foreign column references - $foreignColumnNames = $currFK->getForeignColumns(); - for ($k=0,$fcnLen=count($localColumnNames); $k < $fcnLen; $k++) { - $foreign = $foreignTable->getColumn($foreignColumnNames[$k]); - // if the foreign column does not exist, we may have an - // external reference or a misspelling - if ($foreign === null) { - throw new BuildException("ERROR!! Attempt to set foreign" - . " key to nonexistent column, " - . $foreignColumnNames[$k] . ", in table, " - . $foreignTable->getName() . "!"); - } else { - $foreign->addReferrer($currFK); - } - } // for each foreign col ref - } - } - - // Behaviors may have added behaviors of their own - // These behaviors must launch their modifyTable() method, - // Until there is no behavior left - $behaviorsLeft = true; - while ($behaviorsLeft) { - $behaviorsLeft = false; - foreach ($tables as $table) { - foreach ($table->getBehaviors() as $behavior) { - if (!$behavior->isTableModified()) { - $behavior->getTableModifier()->modifyTable(); - $behavior->setTableModified(true); - $behaviorsLeft = true; - } - } - } - } - } - - /** - * @see XMLElement::appendXml(DOMNode) - */ - public function appendXml(DOMNode $node) - { - $doc = ($node instanceof DOMDocument) ? $node : $node->ownerDocument; - - $dbNode = $node->appendChild($doc->createElement('database')); - - $dbNode->setAttribute('name', $this->name); - - if ($this->pkg) { - $dbNode->setAttribute('package', $this->pkg); - } - - if ($this->defaultIdMethod) { - $dbNode->setAttribute('defaultIdMethod', $this->defaultIdMethod); - } - - if ($this->baseClass) { - $dbNode->setAttribute('baseClass', $this->baseClass); - } - - if ($this->basePeer) { - $dbNode->setAttribute('basePeer', $this->basePeer); - } - - if ($this->defaultPhpNamingMethod) { - $dbNode->setAttribute('defaultPhpNamingMethod', $this->defaultPhpNamingMethod); - } - - if ($this->defaultTranslateMethod) { - $dbNode->setAttribute('defaultTranslateMethod', $this->defaultTranslateMethod); - } - - /* - - FIXME - Before we can add support for domains in the schema, we need - to have a method of the Column that indicates whether the column was mapped - to a SPECIFIC domain (since Column->getDomain() will always return a Domain object) - - foreach ($this->domainMap as $domain) { - $domain->appendXml($dbNode); - } - */ - foreach ($this->vendorInfos as $vi) { - $vi->appendXml($dbNode); - } - - foreach ($this->tableList as $table) { - $table->appendXml($dbNode); - } - - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/Domain.php b/airtime_mvc/library/propel/generator/lib/model/Domain.php deleted file mode 100644 index 632e3f3749..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/Domain.php +++ /dev/null @@ -1,386 +0,0 @@ - (Propel) - * @author Martin Poeschl (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -class Domain extends XMLElement -{ - - /** - * @var string The name of this domain - */ - private $name; - - /** - * @var string Description for this domain. - */ - private $description; - - /** - * @var int Size - */ - private $size; - - /** - * @var int Scale - */ - private $scale; - - /** - * @var int Propel type from schema - */ - private $propelType; - - /** - * @var string The SQL type to use for this column - */ - private $sqlType; - - /** - * @var ColumnDefaultValue A default value - */ - private $defaultValue; - - /** - * @var Database - */ - private $database; - - /** - * Creates a new Domain object. - * If this domain needs a name, it must be specified manually. - * - * @param string $type Propel type. - * @param string $sqlType SQL type. - * @param string $size - * @param string $scale - */ - public function __construct($type = null, $sqlType = null, $size = null, $scale = null) - { - $this->propelType = $type; - $this->sqlType = ($sqlType !== null) ? $sqlType : $type; - $this->size = $size; - $this->scale = $scale; - } - - /** - * Copy the values from current object into passed-in Domain. - * @param Domain $domain Domain to copy values into. - */ - public function copy(Domain $domain) - { - $this->defaultValue = $domain->getDefaultValue(); - $this->description = $domain->getDescription(); - $this->name = $domain->getName(); - $this->scale = $domain->getScale(); - $this->size = $domain->getSize(); - $this->sqlType = $domain->getSqlType(); - $this->propelType = $domain->getType(); - } - - /** - * Sets up the Domain object based on the attributes that were passed to loadFromXML(). - * @see parent::loadFromXML() - */ - protected function setupObject() - { - $schemaType = strtoupper($this->getAttribute("type")); - $this->copy($this->getDatabase()->getPlatform()->getDomainForType($schemaType)); - - //Name - $this->name = $this->getAttribute("name"); - - // Default value - $defval = $this->getAttribute("defaultValue", $this->getAttribute("default")); - if ($defval !== null) { - $this->setDefaultValue(new ColumnDefaultValue($defval, ColumnDefaultValue::TYPE_VALUE)); - } elseif ($this->getAttribute("defaultExpr") !== null) { - $this->setDefaultValue(new ColumnDefaultValue($this->getAttribute("defaultExpr"), ColumnDefaultValue::TYPE_EXPR)); - } - - $this->size = $this->getAttribute("size"); - $this->scale = $this->getAttribute("scale"); - $this->description = $this->getAttribute("description"); - } - - /** - * Sets the owning database object (if this domain is being setup via XML). - * @param Database $database - */ - public function setDatabase(Database $database) - { - $this->database = $database; - } - - /** - * Gets the owning database object (if this domain was setup via XML). - * @return Database - */ - public function getDatabase() - { - return $this->database; - } - - /** - * @return string Returns the description. - */ - public function getDescription() - { - return $this->description; - } - - /** - * @param string $description The description to set. - */ - public function setDescription($description) - { - $this->description = $description; - } - - /** - * @return string Returns the name. - */ - public function getName() - { - return $this->name; - } - - /** - * @param string $name The name to set. - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * @return string Returns the scale. - */ - public function getScale() - { - return $this->scale; - } - - /** - * @param string $scale The scale to set. - */ - public function setScale($scale) - { - $this->scale = $scale; - } - - /** - * Replaces the size if the new value is not null. - * - * @param string $value The size to set. - */ - public function replaceScale($value) - { - if ($value !== null) { - $this->scale = $value; - } - } - - /** - * @return int Returns the size. - */ - public function getSize() - { - return $this->size; - } - - /** - * @param int $size The size to set. - */ - public function setSize($size) - { - $this->size = $size; - } - - /** - * Replaces the size if the new value is not null. - * - * @param int $value The size to set. - */ - public function replaceSize($value) - { - if ($value !== null) { - $this->size = $value; - } - } - - /** - * @return string Returns the propelType. - */ - public function getType() - { - return $this->propelType; - } - - /** - * @param string $propelType The PropelTypes type to set. - */ - public function setType($propelType) - { - $this->propelType = $propelType; - } - - /** - * Replaces the type if the new value is not null. - * - * @param string $value The tyep to set. - */ - public function replaceType($value) - { - if ($value !== null) { - $this->propelType = $value; - } - } - - /** - * Gets the default value object. - * @return ColumnDefaultValue The default value object for this domain. - */ - public function getDefaultValue() - { - return $this->defaultValue; - } - - /** - * Gets the default value, type-casted for use in PHP OM. - * @return mixed - * @see getDefaultValue() - */ - public function getPhpDefaultValue() - { - if ($this->defaultValue === null) { - return null; - } else { - if ($this->defaultValue->isExpression()) { - throw new EngineException("Cannot get PHP version of default value for default value EXPRESSION."); - } - if ($this->propelType === PropelTypes::BOOLEAN || $this->propelType === PropelTypes::BOOLEAN_EMU) { - return $this->booleanValue($this->defaultValue->getValue()); - } else { - return $this->defaultValue->getValue(); - } - } - } - - /** - * @param ColumnDefaultValue $value The column default value to set. - */ - public function setDefaultValue(ColumnDefaultValue $value) - { - $this->defaultValue = $value; - } - - /** - * Replaces the default value if the new value is not null. - * - * @param ColumnDefaultValue $value The defualt value object - */ - public function replaceDefaultValue(ColumnDefaultValue $value = null) - { - if ($value !== null) { - $this->defaultValue = $value; - } - } - - /** - * @return string Returns the sqlType. - */ - public function getSqlType() - { - return $this->sqlType; - } - - /** - * @param string $sqlType The sqlType to set. - */ - public function setSqlType($sqlType) - { - $this->sqlType = $sqlType; - } - - /** - * Replaces the SQL type if the new value is not null. - * @param string $sqlType The native SQL type to use for this domain. - */ - public function replaceSqlType($sqlType) - { - if ($sqlType !== null) { - $this->sqlType = $sqlType; - } - } - - /** - * Return the size and scale in brackets for use in an sql schema. - * - * @return string Size and scale or an empty String if there are no values - * available. - */ - public function printSize() - { - if ($this->size !== null && $this->scale !== null) { - return '(' . $this->size . ',' . $this->scale . ')'; - } elseif ($this->size !== null) { - return '(' . $this->size . ')'; - } else { - return ""; - } - } - - /** - * @see XMLElement::appendXml(DOMNode) - */ - public function appendXml(DOMNode $node) - { - $doc = ($node instanceof DOMDocument) ? $node : $node->ownerDocument; - - $domainNode = $node->appendChild($doc->createElement('domain')); - $domainNode->setAttribute('type', $this->getType()); - $domainNode->setAttribute('name', $this->getName()); - - if ($this->sqlType !== $this->getType()) { - $domainNode->setAttribute('sqlType', $this->sqlType); - } - - $def = $this->getDefaultValue(); - if ($def) { - if ($def->isExpression()) { - $domainNode->setAttribute('defaultExpr', $def->getValue()); - } else { - $domainNode->setAttribute('defaultValue', $def->getValue()); - } - } - - if ($this->size) { - $domainNode->setAttribute('size', $this->size); - } - - if ($this->scale) { - $domainNode->setAttribute('scale', $this->scale); - } - - if ($this->description) { - $domainNode->setAttribute('description', $this->description); - } - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/model/ForeignKey.php b/airtime_mvc/library/propel/generator/lib/model/ForeignKey.php deleted file mode 100644 index 75b11584e4..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/ForeignKey.php +++ /dev/null @@ -1,509 +0,0 @@ - - * @author Fedor - * @author Daniel Rall - * @version $Revision: 1778 $ - * @package propel.generator.model - */ -class ForeignKey extends XMLElement -{ - - protected $foreignTableName; - protected $name; - protected $phpName; - protected $refPhpName; - protected $defaultJoin; - protected $onUpdate; - protected $onDelete; - protected $parentTable; - protected $localColumns = array(); - protected $foreignColumns = array(); - - // the uppercase equivalent of the onDelete/onUpdate values in the dtd - const NONE = ""; // No "ON [ DELETE | UPDATE]" behaviour specified. - const NOACTION = "NO ACTION"; - const CASCADE = "CASCADE"; - const RESTRICT = "RESTRICT"; - const SETDEFAULT = "SET DEFAULT"; - const SETNULL = "SET NULL"; - - /** - * Constructs a new ForeignKey object. - * - * @param string $name - */ - public function __construct($name=null) - { - $this->name = $name; - } - - /** - * Sets up the ForeignKey object based on the attributes that were passed to loadFromXML(). - * @see parent::loadFromXML() - */ - protected function setupObject() - { - $this->foreignTableName = $this->getTable()->getDatabase()->getTablePrefix() . $this->getAttribute("foreignTable"); - $this->name = $this->getAttribute("name"); - $this->phpName = $this->getAttribute("phpName"); - $this->refPhpName = $this->getAttribute("refPhpName"); - $this->defaultJoin = $this->getAttribute('defaultJoin'); - $this->onUpdate = $this->normalizeFKey($this->getAttribute("onUpdate")); - $this->onDelete = $this->normalizeFKey($this->getAttribute("onDelete")); - } - - /** - * normalizes the input of onDelete, onUpdate attributes - */ - private function normalizeFKey($attrib) - { - if ($attrib === null || strtoupper($attrib) == "NONE") { - $attrib = self::NONE; - } - $attrib = strtoupper($attrib); - if ($attrib == "SETNULL") { - $attrib = self::SETNULL; - } - return $attrib; - } - - /** - * returns whether or not the onUpdate attribute is set - */ - public function hasOnUpdate() - { - return ($this->onUpdate !== self::NONE); - } - - /** - * returns whether or not the onDelete attribute is set - */ - public function hasOnDelete() - { - return ($this->onDelete !== self::NONE); - } - - /** - * returns the onUpdate attribute - * @return string - */ - public function getOnUpdate() - { - return $this->onUpdate; - } - - /** - * Returns the onDelete attribute - * @return string - */ - public function getOnDelete() - { - return $this->onDelete; - } - - /** - * sets the onDelete attribute - */ - public function setOnDelete($value) - { - $this->onDelete = $this->normalizeFKey($value); - } - - /** - * sets the onUpdate attribute - */ - public function setOnUpdate($value) - { - $this->onUpdate = $this->normalizeFKey($value); - } - - /** - * Returns the name attribute. - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the name attribute. - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Gets the phpName for this foreign key (if any). - * @return string - */ - public function getPhpName() - { - return $this->phpName; - } - - /** - * Sets a phpName to use for this foreign key. - * @param string $name - */ - public function setPhpName($name) - { - $this->phpName = $name; - } - - /** - * Gets the refPhpName for this foreign key (if any). - * @return string - */ - public function getRefPhpName() - { - return $this->refPhpName; - } - - /** - * Sets a refPhpName to use for this foreign key. - * @param string $name - */ - public function setRefPhpName($name) - { - $this->refPhpName = $name; - } - - /** - * Gets the defaultJoin for this foreign key (if any). - * @return string - */ - public function getDefaultJoin() - { - return $this->defaultJoin; - } - - /** - * Sets a defaultJoin to use for this foreign key. - * @param string $name - */ - public function setDefaultJoin($defaultJoin) - { - $this->defaultJoin = $defaultJoin; - } - - /** - * Get the foreignTableName of the FK - */ - public function getForeignTableName() - { - return $this->foreignTableName; - } - - /** - * Set the foreignTableName of the FK - */ - public function setForeignTableName($tableName) - { - $this->foreignTableName = $tableName; - } - - /** - * Gets the resolved foreign Table model object. - * @return Table - */ - public function getForeignTable() - { - return $this->getTable()->getDatabase()->getTable($this->getForeignTableName()); - } - - /** - * Set the parent Table of the foreign key - */ - public function setTable(Table $parent) - { - $this->parentTable = $parent; - } - - /** - * Get the parent Table of the foreign key - */ - public function getTable() - { - return $this->parentTable; - } - - /** - * Returns the Name of the table the foreign key is in - */ - public function getTableName() - { - return $this->parentTable->getName(); - } - - /** - * Adds a new reference entry to the foreign key. - */ - public function addReference($p1, $p2 = null) - { - if (is_array($p1)) { - $this->addReference(@$p1["local"], @$p1["foreign"]); - } else { - if ($p1 instanceof Column) { - $p1 = $p1->getName(); - } - if ($p2 instanceof Column) { - $p2 = $p2->getName(); - } - $this->localColumns[] = $p1; - $this->foreignColumns[] = $p2; - } - } - - /** - * Clear the references of this foreign key - */ - public function clearReferences() - { - $this->localColumns[] = array(); - $this->foreignColumns[] = array(); - } - - /** - * Return a comma delimited string of local column names - * @deprecated because Column::makeList() is deprecated; use the array-returning getLocalColumns() and DDLBuilder->getColumnList() instead instead. - */ - public function getLocalColumnNames() - { - return Column::makeList($this->getLocalColumns(), $this->getTable()->getDatabase()->getPlatform()); - } - - /** - * Return a comma delimited string of foreign column names - * @deprecated because Column::makeList() is deprecated; use the array-returning getForeignColumns() and DDLBuilder->getColumnList() instead instead. - */ - public function getForeignColumnNames() - { - return Column::makeList($this->getForeignColumns(), $this->getTable()->getDatabase()->getPlatform()); - } - - /** - * Return an array of local column names. - * @return array string[] - */ - public function getLocalColumns() - { - return $this->localColumns; - } - - /** - * Utility method to get local column to foreign column - * mapping for this foreign key. - */ - public function getLocalForeignMapping() - { - $h = array(); - for ($i=0, $size=count($this->localColumns); $i < $size; $i++) { - $h[$this->localColumns[$i]] = $this->foreignColumns[$i]; - } - return $h; - } - - /** - * Utility method to get local column to foreign column - * mapping for this foreign key. - */ - public function getForeignLocalMapping() - { - $h = array(); - for ($i=0, $size=count($this->localColumns); $i < $size; $i++) { - $h[$this->foreignColumns[$i]] = $this->localColumns[$i]; - } - return $h; - } - - /** - * Utility method to get local and foreign column objects - * mapping for this foreign key. - */ - public function getColumnObjectsMapping() - { - $mapping = array(); - $localTable = $this->getTable(); - $foreignTable = $this->getForeignTable(); - for ($i=0, $size=count($this->localColumns); $i < $size; $i++) { - $mapping[]= array( - 'local' => $localTable->getColumn($this->localColumns[$i]), - 'foreign' => $foreignTable->getColumn($this->foreignColumns[$i]), - ); - } - return $mapping; - } - - /** - * Get the foreign column mapped to specified local column. - * @return string Column name. - */ - public function getMappedForeignColumn($local) - { - $m = $this->getLocalForeignMapping(); - if (isset($m[$local])) { - return $m[$local]; - } - return null; - } - - /** - * Get the local column mapped to specified foreign column. - * @return string Column name. - */ - public function getMappedLocalColumn($foreign) - { - $m = $this->getForeignLocalMapping(); - if (isset($m[$foreign])) { - return $m[$foreign]; - } - return null; - } - - /** - * Return an array of foreign column objects. - * @return array Column[] - */ - public function getForeignColumns() - { - return $this->foreignColumns; - } - - /** - * Whether this foreign key uses a required column, or a list or required columns. - * - * @return boolean - */ - public function isLocalColumnsRequired() - { - foreach ($this->getLocalColumns() as $columnName) { - if (!$this->getTable()->getColumn($columnName)->isNotNull()) { - return false; - } - } - return true; - } - - /** - * Whether this foreign key is also the primary key of the local table. - * - * @return boolean - */ - public function isLocalPrimaryKey() - { - $localCols = $this->getLocalColumns(); - - $localPKColumnObjs = $this->getTable()->getPrimaryKey(); - - $localPKCols = array(); - foreach ($localPKColumnObjs as $lPKCol) { - $localPKCols[] = $lPKCol->getName(); - } - - return (!array_diff($localPKCols, $localCols)); - } - - /** - * Whether this foreign key is matched by an invertes foreign key (on foreign table). - * - * This is to prevent duplicate columns being generated for a 1:1 relationship that is represented - * by foreign keys on both tables. I don't know if that's good practice ... but hell, why not - * support it. - * - * @param ForeignKey $fk - * @return boolean - * @link http://propel.phpdb.org/trac/ticket/549 - */ - public function isMatchedByInverseFK() - { - return (bool) $this->getInverseFK(); - } - - public function getInverseFK() - { - $foreignTable = $this->getForeignTable(); - $map = $this->getForeignLocalMapping(); - - foreach ($foreignTable->getForeignKeys() as $refFK) { - $fkMap = $refFK->getLocalForeignMapping(); - if ( ($refFK->getTableName() == $this->getTableName()) && ($map == $fkMap) ) { // compares keys and values, but doesn't care about order, included check to make sure it's the same table (fixes #679) - return $refFK; - } - } - } - - /** - * Get the other foreign keys starting on the same table - * Used in many-to-many relationships - * - * @return ForeignKey - */ - public function getOtherFks() - { - $fks = array(); - foreach ($this->getTable()->getForeignKeys() as $fk) { - if ($fk !== $this) { - $fks[]= $fk; - } - } - return $fks; - } - - /** - * @see XMLElement::appendXml(DOMNode) - */ - public function appendXml(DOMNode $node) - { - $doc = ($node instanceof DOMDocument) ? $node : $node->ownerDocument; - - $fkNode = $node->appendChild($doc->createElement('foreign-key')); - - $fkNode->setAttribute('foreignTable', $this->getForeignTableName()); - $fkNode->setAttribute('name', $this->getName()); - - if ($this->getPhpName()) { - $fkNode->setAttribute('phpName', $this->getPhpName()); - } - - if ($this->getRefPhpName()) { - $fkNode->setAttribute('refPhpName', $this->getRefPhpName()); - } - - if ($this->getDefaultJoin()) { - $fkNode->setAttribute('defaultJoin', $this->getDefaultJoin()); - } - - if ($this->getOnDelete()) { - $fkNode->setAttribute('onDelete', $this->getOnDelete()); - } - - if ($this->getOnUpdate()) { - $fkNode->setAttribute('onUpdate', $this->getOnUpdate()); - } - - for ($i=0, $size=count($this->localColumns); $i < $size; $i++) { - $refNode = $fkNode->appendChild($doc->createElement('reference')); - $refNode->setAttribute('local', $this->localColumns[$i]); - $refNode->setAttribute('foreign', $this->foreignColumns[$i]); - } - - foreach ($this->vendorInfos as $vi) { - $vi->appendXml($fkNode); - } - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/IDMethod.php b/airtime_mvc/library/propel/generator/lib/model/IDMethod.php deleted file mode 100644 index 469ddfd857..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/IDMethod.php +++ /dev/null @@ -1,35 +0,0 @@ - (Propel) - * @author Daniel Rall (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -interface IDMethod -{ - - /** - * Key generation via database-specific ID method - * (i.e. auto-increment for MySQL, sequence for Oracle, etc.). - */ - const NATIVE = "native"; - - /** - * No RDBMS key generation (keys may be generated by the - * application). - */ - const NO_ID_METHOD = "none"; - -} diff --git a/airtime_mvc/library/propel/generator/lib/model/IdMethodParameter.php b/airtime_mvc/library/propel/generator/lib/model/IdMethodParameter.php deleted file mode 100644 index f9f1eb60c7..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/IdMethodParameter.php +++ /dev/null @@ -1,108 +0,0 @@ - (Propel) - * @author John McNally (Torque) - * @author Daniel Rall (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -class IdMethodParameter extends XMLElement -{ - - private $name; - private $value; - private $parentTable; - - /** - * Sets up the IdMethodParameter object based on the attributes that were passed to loadFromXML(). - * @see parent::loadFromXML() - */ - protected function setupObject() - { - $this->name = $this->getAttribute("name"); - $this->value = $this->getAttribute("value"); - } - - /** - * Get the parameter name - */ - public function getName() - { - return $this->name; - } - - /** - * Set the parameter name - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Get the parameter value - */ - public function getValue() - { - return $this->value; - } - - /** - * Set the parameter value - */ - public function setValue($value) - { - $this->value = $value; - } - - /** - * Set the parent Table of the id method - */ - public function setTable(Table $parent) - { - $this->parentTable = $parent; - } - - /** - * Get the parent Table of the id method - */ - public function getTable() - { - return $this->parentTable; - } - - /** - * Returns the Name of the table the id method is in - */ - public function getTableName() - { - return $this->parentTable->getName(); - } - - /** - * @see XMLElement::appendXml(DOMNode) - */ - public function appendXml(DOMNode $node) - { - $doc = ($node instanceof DOMDocument) ? $node : $node->ownerDocument; - - $paramNode = $node->appendChild($doc->createElement('id-method-parameter')); - if ($this->getName()) { - $paramNode->setAttribute('name', $this->getName()); - } - $paramNode->setAttribute('value', $this->getValue()); - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/Index.php b/airtime_mvc/library/propel/generator/lib/model/Index.php deleted file mode 100644 index 3e6add9a43..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/Index.php +++ /dev/null @@ -1,285 +0,0 @@ - - * @author Daniel Rall - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -class Index extends XMLElement -{ - - /** enables debug output */ - const DEBUG = false; - - private $indexName; - private $parentTable; - - /** @var array string[] */ - private $indexColumns; - - /** @var array */ - private $indexColumnSizes = array(); - - /** - * Creates a new Index instance. - * - * @param string $name - */ - public function __construct($name=null) - { - $this->indexName = $name; - } - - private function createName() - { - $table = $this->getTable(); - $inputs = array(); - $inputs[] = $table->getDatabase(); - $inputs[] = $table->getName(); - if ($this->isUnique()) { - $inputs[] = "U"; - } else { - $inputs[] = "I"; - } - // ASSUMPTION: This Index not yet added to the list. - if ($this->isUnique()) { - $inputs[] = count($table->getUnices()) + 1; - } else { - $inputs[] = count($table->getIndices()) + 1; - } - - $this->indexName = NameFactory::generateName( - NameFactory::CONSTRAINT_GENERATOR, $inputs); - } - - /** - * Sets up the Index object based on the attributes that were passed to loadFromXML(). - * @see parent::loadFromXML() - */ - protected function setupObject() - { - $this->indexName = $this->getAttribute("name"); - } - - /** - * @see #isUnique() - * @deprecated Use isUnique() instead. - */ - public function getIsUnique() - { - return $this->isUnique(); - } - - /** - * Returns the uniqueness of this index. - */ - public function isUnique() - { - return false; - } - - /** - * @see #getName() - * @deprecated Use getName() instead. - */ - public function getIndexName() - { - return $this->getName(); - } - - /** - * Gets the name of this index. - */ - public function getName() - { - if ($this->indexName === null) { - try { - // generate an index name if we don't have a supplied one - $this->createName(); - } catch (EngineException $e) { - // still no name - } - } - return substr($this->indexName, 0, $this->getTable()->getDatabase()->getPlatform()->getMaxColumnNameLength()); - } - - /** - * @see #setName(String name) - * @deprecated Use setName(String name) instead. - */ - public function setIndexName($name) - { - $this->setName($name); - } - - /** - * Set the name of this index. - */ - public function setName($name) - { - $this->indexName = $name; - } - - /** - * Set the parent Table of the index - */ - public function setTable(Table $parent) - { - $this->parentTable = $parent; - } - - /** - * Get the parent Table of the index - */ - public function getTable() - { - return $this->parentTable; - } - - /** - * Returns the Name of the table the index is in - */ - public function getTableName() - { - return $this->parentTable->getName(); - } - - /** - * Adds a new column to an index. - * @param mixed $data Column or attributes from XML. - */ - public function addColumn($data) - { - if ($data instanceof Column) { - $column = $data; - $this->indexColumns[] = $column->getName(); - if ($column->getSize()) { - $this->indexColumnSizes[$column->getName()] = $column->getSize(); - } - } else { - $attrib = $data; - $name = $attrib["name"]; - $this->indexColumns[] = $name; - if (isset($attrib["size"])) { - $this->indexColumnSizes[$name] = $attrib["size"]; - } - } - } - - /** - * Sets array of columns to use for index. - * - * @param array $indexColumns Column[] - */ - public function setColumns(array $indexColumns) - { - $this->indexColumns = array(); - $this->indexColumnSizes = array(); - foreach ($indexColumns as $col) { - $this->addColumn($col); - } - } - - /** - * Whether there is a size for the specified column. - * @param string $name - * @return boolean - */ - public function hasColumnSize($name) - { - return isset($this->indexColumnSizes[$name]); - } - - /** - * Returns the size for the specified column, if given. - * @param string $name - * @return numeric The size or NULL - */ - public function getColumnSize($name) - { - if (isset($this->indexColumnSizes[$name])) { - return $this->indexColumnSizes[$name]; - } - return null; // just to be explicit - } - - /** - * @see #getColumnList() - * @deprecated Use getColumnList() instead (which is not deprecated too!) - */ - public function getIndexColumnList() - { - return $this->getColumnList(); - } - - /** - * Return a comma delimited string of the columns which compose this index. - * @deprecated because Column::makeList() is deprecated; use the array-returning getColumns() and DDLBuilder->getColumnList() instead instead. - */ - public function getColumnList() - { - return Column::makeList($this->getColumns(), $this->getTable()->getDatabase()->getPlatform()); - } - - /** - * @see #getColumns() - * @deprecated Use getColumns() instead. - */ - public function getIndexColumns() - { - return $this->getColumns(); - } - - - /** - * Check whether the index has columns. - * @return boolean - */ - public function hasColumns() - { - return count($this->indexColumns) > 0; - } - - /** - * Return the list of local columns. You should not edit this list. - * @return array string[] - */ - public function getColumns() - { - return $this->indexColumns; - } - - /** - * @see XMLElement::appendXml(DOMNode) - */ - public function appendXml(DOMNode $node) - { - $doc = ($node instanceof DOMDocument) ? $node : $node->ownerDocument; - - $idxNode = $node->appendChild($doc->createElement('index')); - $idxNode->setAttribute('name', $this->getName()); - - foreach ($this->indexColumns as $colname) { - $idxColNode = $idxNode->appendChild($doc->createElement('index-column')); - $idxColNode->setAttribute('name', $colname); - } - - foreach ($this->vendorInfos as $vi) { - $vi->appendXml($idxNode); - } - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/Inheritance.php b/airtime_mvc/library/propel/generator/lib/model/Inheritance.php deleted file mode 100644 index d5dc0336a3..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/Inheritance.php +++ /dev/null @@ -1,147 +0,0 @@ - (Propel) - * @author John McNally (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -class Inheritance extends XMLElement -{ - - private $key; - private $className; - private $pkg; - private $ancestor; - private $parent; - - /** - * Sets up the Inheritance object based on the attributes that were passed to loadFromXML(). - * @see parent::loadFromXML() - */ - protected function setupObject() - { - $this->key = $this->getAttribute("key"); - $this->className = $this->getAttribute("class"); - $this->pkg = $this->getAttribute("package"); - $this->ancestor = $this->getAttribute("extends"); - } - - /** - * Get the value of key. - * @return value of key. - */ - public function getKey() - { - return $this->key; - } - - /** - * Set the value of key. - * @param v Value to assign to key. - */ - public function setKey($v) - { - $this->key = $v; - } - - /** - * Get the value of parent. - * @return value of parent. - */ - public function getColumn() - { - return $this->parent; - } - - /** - * Set the value of parent. - * @param v Value to assign to parent. - */ - public function setColumn(Column $v) - { - $this->parent = $v; - } - - /** - * Get the value of className. - * @return value of className. - */ - public function getClassName() - { - return $this->className; - } - - /** - * Set the value of className. - * @param v Value to assign to className. - */ - public function setClassName($v) - { - $this->className = $v; - } - - /** - * Get the value of package. - * @return value of package. - */ - public function getPackage() - { - return $this->pkg; - } - - /** - * Set the value of package. - * @param v Value to assign to package. - */ - public function setPackage($v) - { - $this->pkg = $v; - } - - /** - * Get the value of ancestor. - * @return value of ancestor. - */ - public function getAncestor() - { - return $this->ancestor; - } - - /** - * Set the value of ancestor. - * @param v Value to assign to ancestor. - */ - public function setAncestor($v) - { - $this->ancestor = $v; - } - - /** - * @see XMLElement::appendXml(DOMNode) - */ - public function appendXml(DOMNode $node) - { - $doc = ($node instanceof DOMDocument) ? $node : $node->ownerDocument; - - $inherNode = $node->appendChild($doc->createElement('inheritance')); - $inherNode->setAttribute('key', $this->key); - $inherNode->setAttribute('class', $this->className); - - if ($this->ancestor !== null) { - $inherNode->setAttribute('extends', $this->ancestor); - } - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/NameFactory.php b/airtime_mvc/library/propel/generator/lib/model/NameFactory.php deleted file mode 100644 index dc78531eb3..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/NameFactory.php +++ /dev/null @@ -1,77 +0,0 @@ - (Propel) - * @author Daniel Rall (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -class NameFactory -{ - - /** - * The class name of the PHP name generator. - */ - const PHP_GENERATOR = 'PhpNameGenerator'; - - /** - * The fully qualified class name of the constraint name generator. - */ - const CONSTRAINT_GENERATOR = 'ConstraintNameGenerator'; - - /** - * The single instance of this class. - */ - private static $instance; - - /** - * The cache of NameGenerator algorithms in use for - * name generation, keyed by fully qualified class name. - */ - private static $algorithms = array(); - - /** - * Factory method which retrieves an instance of the named generator. - * - * @param name The fully qualified class name of the name - * generation algorithm to retrieve. - */ - protected static function getAlgorithm($name) - { - if (!isset(self::$algorithms[$name])) { - self::$algorithms[$name] = new $name(); - } - return self::$algorithms[$name]; - } - - /** - * Given a list of String objects, implements an - * algorithm which produces a name. - * - * @param string $algorithmName The fully qualified class name of the {@link NameGenerator} - * implementation to use to generate names. - * @param array $inputs Inputs used to generate a name. - * @return The generated name. - * @throws EngineException - */ - public static function generateName($algorithmName, $inputs) - { - $algorithm = self::getAlgorithm($algorithmName); - return $algorithm->generateName($inputs); - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/NameGenerator.php b/airtime_mvc/library/propel/generator/lib/model/NameGenerator.php deleted file mode 100644 index 78b9077c23..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/NameGenerator.php +++ /dev/null @@ -1,73 +0,0 @@ - (Propel) - * @author Daniel Rall (Torque) - * @author Byron Foster (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -interface NameGenerator -{ - - /** - * The character used by most implementations as the separator - * between name elements. - */ - const STD_SEPARATOR_CHAR = '_'; - - /** - * Traditional method for converting schema table and column names - * to PHP names. The CONV_METHOD_XXX constants - * define how names for columns and tables in the database schema - * will be converted to PHP source names. - * - * @see PhpNameGenerator::underscoreMethod() - */ - const CONV_METHOD_UNDERSCORE = "underscore"; - - /** - * Heavier method for converting schema table and column names - * to PHP names. Similar to {@link #CONV_METHOD_UNDERSCORE} but - * this one will pass only letters and numbers through and will - * use as separator any character that is not a letter or a number - * inside the string to be converted. The CONV_METHOD_XXX - * constants define how names for columns and tales in the - * database schema will be converted to PHP source names. - */ - const CONV_METHOD_CLEAN = "clean"; - - /** - * Similar to {@link #CONV_METHOD_UNDERSCORE} except nothing is - * converted to lowercase. - * - * @see PhpNameGenerator::phpnameMethod() - */ - const CONV_METHOD_PHPNAME = "phpname"; - - /** - * Specifies no modification when converting from a schema column - * or table name to a PHP name. - */ - const CONV_METHOD_NOCHANGE = "nochange"; - - /** - * Given a list of String objects, implements an - * algorithm which produces a name. - * - * @param inputs Inputs used to generate a name. - * @return The generated name. - * @throws EngineException - */ - public function generateName($inputs); -} diff --git a/airtime_mvc/library/propel/generator/lib/model/PhpNameGenerator.php b/airtime_mvc/library/propel/generator/lib/model/PhpNameGenerator.php deleted file mode 100644 index fc777ce023..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/PhpNameGenerator.php +++ /dev/null @@ -1,167 +0,0 @@ -NameGenerator implementation for PHP-esque names. - * - * @author Hans Lellelid (Propel) - * @author Daniel Rall (Torque) - * @author Byron Foster (Torque) - * @author Bernd Goldschmidt - * @version $Revision: 1793 $ - * @package propel.generator.model - */ -class PhpNameGenerator implements NameGenerator -{ - - /** - * inputs should consist of two (three) elements, the - * original name of the database element and the method for - * generating the name. - * The optional third element may contain a prefix that will be - * stript from name prior to generate the resulting name. - * There are currently three methods: - * CONV_METHOD_NOCHANGE - xml names are converted - * directly to php names without modification. - * CONV_METHOD_UNDERSCORE will capitalize the first - * letter, remove underscores, and capitalize each letter before - * an underscore. All other letters are lowercased. "phpname" - * works the same as the CONV_METHOD_PHPNAME method - * but will not lowercase any characters. - * - * @param inputs list expected to contain two (optional: three) parameters, - * element 0 contains name to convert, element 1 contains method for conversion, - * optional element 2 contains prefix to be striped from name - * @return The generated name. - * @see NameGenerator - */ - public function generateName($inputs) - { - $schemaName = $inputs[0]; - $method = $inputs[1]; - - if (count($inputs)>2) { - $prefix = $inputs[2]; - if ($prefix != '' && substr($schemaName, 0, strlen($prefix)) == $prefix) { - $schemaName = substr($schemaName, strlen($prefix)); - } - } - - $phpName = null; - - switch ($method) { - case self::CONV_METHOD_CLEAN: - $phpName = $this->cleanMethod($schemaName); - break; - case self::CONV_METHOD_PHPNAME: - $phpName = $this->phpnameMethod($schemaName); - break; - case self::CONV_METHOD_NOCHANGE: - $phpName = $this->nochangeMethod($schemaName); - break; - case self::CONV_METHOD_UNDERSCORE: - default: - $phpName = $this->underscoreMethod($schemaName); - } - - return $phpName; - } - - /** - * Converts a database schema name to php object name by Camelization. - * Removes STD_SEPARATOR_CHAR, capitilizes first letter - * of name and each letter after the STD_SEPERATOR, - * converts the rest of the letters to lowercase. - * - * This method should be named camelizeMethod() for clarity - * - * my_CLASS_name -> MyClassName - * - * @param string $schemaName name to be converted. - * @return string Converted name. - * @see NameGenerator - * @see #underscoreMethod() - */ - protected function underscoreMethod($schemaName) - { - $name = ""; - $tok = strtok($schemaName, self::STD_SEPARATOR_CHAR); - while ($tok) { - $name .= ucfirst(strtolower($tok)); - $tok = strtok(self::STD_SEPARATOR_CHAR); - } - return $name; - } - - /** - * Converts a database schema name to php object name. Removes - * any character that is not a letter or a number and capitilizes - * first letter of the name, the first letter of each alphanumeric - * block and converts the rest of the letters to lowercase. - * - * T$NAMA$RFO_max => TNamaRfoMax - * - * @param string $schemaName name to be converted. - * @return string Converted name. - * @see NameGenerator - * @see #underscoreMethod() - */ - protected function cleanMethod($schemaName) - { - $name = ""; - $regexp = '/([a-z0-9]+)/i'; - $matches = array(); - if (preg_match_all($regexp, $schemaName, $matches)) { - foreach($matches[1] AS $tok) { - $name .= ucfirst(strtolower($tok)); - } - } else { - return $schemaName; - } - return $name; - } - - /** - * Converts a database schema name to php object name. Operates - * same as underscoreMethod but does not convert anything to - * lowercase. - * - * my_CLASS_name -> MyCLASSName - * - * @param string $schemaName name to be converted. - * @return string Converted name. - * @see NameGenerator - * @see #underscoreMethod(String) - */ - protected function phpnameMethod($schemaName) - { - $name = ""; - $tok = strtok($schemaName, self::STD_SEPARATOR_CHAR); - while ($tok !== false) { - $name .= ucfirst($tok); - $tok = strtok(self::STD_SEPARATOR_CHAR); - } - return $name; - } - - /** - * Converts a database schema name to PHP object name. In this - * case no conversion is made. - * - * @param string $name name to be converted. - * @return string The name parameter, unchanged. - */ - protected function nochangeMethod($name) - { - return $name; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/PropelTypes.php b/airtime_mvc/library/propel/generator/lib/model/PropelTypes.php deleted file mode 100644 index 8a037f5535..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/PropelTypes.php +++ /dev/null @@ -1,343 +0,0 @@ - (Propel) - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -class PropelTypes -{ - - const CHAR = "CHAR"; - const VARCHAR = "VARCHAR"; - const LONGVARCHAR = "LONGVARCHAR"; - const CLOB = "CLOB"; - const CLOB_EMU = "CLOB_EMU"; - const NUMERIC = "NUMERIC"; - const DECIMAL = "DECIMAL"; - const TINYINT = "TINYINT"; - const SMALLINT = "SMALLINT"; - const INTEGER = "INTEGER"; - const BIGINT = "BIGINT"; - const REAL = "REAL"; - const FLOAT = "FLOAT"; - const DOUBLE = "DOUBLE"; - const BINARY = "BINARY"; - const VARBINARY = "VARBINARY"; - const LONGVARBINARY = "LONGVARBINARY"; - const BLOB = "BLOB"; - const DATE = "DATE"; - const TIME = "TIME"; - const TIMESTAMP = "TIMESTAMP"; - const BU_DATE = "BU_DATE"; - const BU_TIMESTAMP = "BU_TIMESTAMP"; - const BOOLEAN = "BOOLEAN"; - const BOOLEAN_EMU = "BOOLEAN_EMU"; - - private static $TEXT_TYPES = array( - self::CHAR, self::VARCHAR, self::LONGVARCHAR, self::CLOB, self::DATE, self::TIME, self::TIMESTAMP, self::BU_DATE, self::BU_TIMESTAMP - ); - - private static $LOB_TYPES = array( - self::VARBINARY, self::LONGVARBINARY, self::BLOB - ); - - private static $TEMPORAL_TYPES = array( - self::DATE, self::TIME, self::TIMESTAMP, self::BU_DATE, self::BU_TIMESTAMP - ); - - private static $NUMERIC_TYPES = array( - self::SMALLINT, self::TINYINT, self::INTEGER, self::BIGINT, self::FLOAT, self::DOUBLE, self::NUMERIC, self::DECIMAL, self::REAL - ); - - private static $BOOLEAN_TYPES = array( - self::BOOLEAN, self::BOOLEAN_EMU - ); - - const CHAR_NATIVE_TYPE = "string"; - const VARCHAR_NATIVE_TYPE = "string"; - const LONGVARCHAR_NATIVE_TYPE = "string"; - const CLOB_NATIVE_TYPE = "string"; - const CLOB_EMU_NATIVE_TYPE = "resource"; - const NUMERIC_NATIVE_TYPE = "string"; - const DECIMAL_NATIVE_TYPE = "string"; - const TINYINT_NATIVE_TYPE = "int"; - const SMALLINT_NATIVE_TYPE = "int"; - const INTEGER_NATIVE_TYPE = "int"; - const BIGINT_NATIVE_TYPE = "string"; - const REAL_NATIVE_TYPE = "double"; - const FLOAT_NATIVE_TYPE = "double"; - const DOUBLE_NATIVE_TYPE = "double"; - const BINARY_NATIVE_TYPE = "string"; - const VARBINARY_NATIVE_TYPE = "string"; - const LONGVARBINARY_NATIVE_TYPE = "string"; - const BLOB_NATIVE_TYPE = "resource"; - const BU_DATE_NATIVE_TYPE = "string"; - const DATE_NATIVE_TYPE = "string"; - const TIME_NATIVE_TYPE = "string"; - const TIMESTAMP_NATIVE_TYPE = "string"; - const BU_TIMESTAMP_NATIVE_TYPE = "string"; - const BOOLEAN_NATIVE_TYPE = "boolean"; - const BOOLEAN_EMU_NATIVE_TYPE = "boolean"; - - /** - * Mapping between Propel types and PHP native types. - * - * @var array - */ - private static $propelToPHPNativeMap = array( - self::CHAR => self::CHAR_NATIVE_TYPE, - self::VARCHAR => self::VARCHAR_NATIVE_TYPE, - self::LONGVARCHAR => self::LONGVARCHAR_NATIVE_TYPE, - self::CLOB => self::CLOB_NATIVE_TYPE, - self::CLOB_EMU => self::CLOB_EMU_NATIVE_TYPE, - self::NUMERIC => self::NUMERIC_NATIVE_TYPE, - self::DECIMAL => self::DECIMAL_NATIVE_TYPE, - self::TINYINT => self::TINYINT_NATIVE_TYPE, - self::SMALLINT => self::SMALLINT_NATIVE_TYPE, - self::INTEGER => self::INTEGER_NATIVE_TYPE, - self::BIGINT => self::BIGINT_NATIVE_TYPE, - self::REAL => self::REAL_NATIVE_TYPE, - self::FLOAT => self::FLOAT_NATIVE_TYPE, - self::DOUBLE => self::DOUBLE_NATIVE_TYPE, - self::BINARY => self::BINARY_NATIVE_TYPE, - self::VARBINARY => self::VARBINARY_NATIVE_TYPE, - self::LONGVARBINARY => self::LONGVARBINARY_NATIVE_TYPE, - self::BLOB => self::BLOB_NATIVE_TYPE, - self::DATE => self::DATE_NATIVE_TYPE, - self::BU_DATE => self::BU_DATE_NATIVE_TYPE, - self::TIME => self::TIME_NATIVE_TYPE, - self::TIMESTAMP => self::TIMESTAMP_NATIVE_TYPE, - self::BU_TIMESTAMP => self::BU_TIMESTAMP_NATIVE_TYPE, - self::BOOLEAN => self::BOOLEAN_NATIVE_TYPE, - self::BOOLEAN_EMU => self::BOOLEAN_EMU_NATIVE_TYPE, - ); - - /** - * Mapping between Propel types and Creole types (for rev-eng task) - * - * @var array - */ - private static $propelTypeToCreoleTypeMap = array( - - self::CHAR => self::CHAR, - self::VARCHAR => self::VARCHAR, - self::LONGVARCHAR => self::LONGVARCHAR, - self::CLOB => self::CLOB, - self::NUMERIC => self::NUMERIC, - self::DECIMAL => self::DECIMAL, - self::TINYINT => self::TINYINT, - self::SMALLINT => self::SMALLINT, - self::INTEGER => self::INTEGER, - self::BIGINT => self::BIGINT, - self::REAL => self::REAL, - self::FLOAT => self::FLOAT, - self::DOUBLE => self::DOUBLE, - self::BINARY => self::BINARY, - self::VARBINARY => self::VARBINARY, - self::LONGVARBINARY => self::LONGVARBINARY, - self::BLOB => self::BLOB, - self::DATE => self::DATE, - self::TIME => self::TIME, - self::TIMESTAMP => self::TIMESTAMP, - self::BOOLEAN => self::BOOLEAN, - self::BOOLEAN_EMU => self::BOOLEAN_EMU, - - // These are pre-epoch dates, which we need to map to String type - // since they cannot be properly handled using strtotime() -- or even numeric - // timestamps on Windows. - self::BU_DATE => self::VARCHAR, - self::BU_TIMESTAMP => self::VARCHAR, - - ); - - /** - * Mapping between Propel types and PDO type contants (for prepared statement setting). - * - * @var array - */ - private static $propelTypeToPDOTypeMap = array( - self::CHAR => PDO::PARAM_STR, - self::VARCHAR => PDO::PARAM_STR, - self::LONGVARCHAR => PDO::PARAM_STR, - self::CLOB => PDO::PARAM_STR, - self::CLOB_EMU => PDO::PARAM_STR, - self::NUMERIC => PDO::PARAM_INT, - self::DECIMAL => PDO::PARAM_STR, - self::TINYINT => PDO::PARAM_INT, - self::SMALLINT => PDO::PARAM_INT, - self::INTEGER => PDO::PARAM_INT, - self::BIGINT => PDO::PARAM_INT, - self::REAL => PDO::PARAM_STR, - self::FLOAT => PDO::PARAM_STR, - self::DOUBLE => PDO::PARAM_STR, - self::BINARY => PDO::PARAM_STR, - self::VARBINARY => PDO::PARAM_LOB, - self::LONGVARBINARY => PDO::PARAM_LOB, - self::BLOB => PDO::PARAM_LOB, - self::DATE => PDO::PARAM_STR, - self::TIME => PDO::PARAM_STR, - self::TIMESTAMP => PDO::PARAM_STR, - self::BOOLEAN => PDO::PARAM_BOOL, - self::BOOLEAN_EMU => PDO::PARAM_INT, - - // These are pre-epoch dates, which we need to map to String type - // since they cannot be properly handled using strtotime() -- or even numeric - // timestamps on Windows. - self::BU_DATE => PDO::PARAM_STR, - self::BU_TIMESTAMP => PDO::PARAM_STR, - ); - - /** - * Return native PHP type which corresponds to the - * Creole type provided. Use in the base object class generation. - * - * @param $propelType The Propel type name. - * @return string Name of the native PHP type - */ - public static function getPhpNative($propelType) - { - return self::$propelToPHPNativeMap[$propelType]; - } - - /** - * Returns the correct Creole type _name_ for propel added types - * - * @param $type the propel added type. - * @return string Name of the the correct Creole type (e.g. "VARCHAR"). - */ - public static function getCreoleType($type) - { - return self::$propelTypeToCreoleTypeMap[$type]; - } - - /** - * Resturns the PDO type (PDO::PARAM_* constant) value. - * @return int - */ - public static function getPDOType($type) - { - return self::$propelTypeToPDOTypeMap[$type]; - } - - /** - * Returns Propel type constant corresponding to Creole type code. - * Used but Propel Creole task. - * - * @param int $sqlType The Creole SQL type constant. - * @return string The Propel type to use or NULL if none found. - */ - public static function getPropelType($sqlType) - { - if (isset(self::$creoleToPropelTypeMap[$sqlType])) { - return self::$creoleToPropelTypeMap[$sqlType]; - } - } - - /** - * Get array of Propel types. - * - * @return array string[] - */ - public static function getPropelTypes() - { - return array_keys(self::$propelTypeToCreoleTypeMap); - } - - /** - * Whether passed type is a temporal (date/time/timestamp) type. - * - * @param string $type Propel type - * @return boolean - */ - public static function isTemporalType($type) - { - return in_array($type, self::$TEMPORAL_TYPES); - } - - /** - * Returns true if values for the type need to be quoted. - * - * @param string $type The Propel type to check. - * @return boolean True if values for the type need to be quoted. - */ - public static function isTextType($type) - { - return in_array($type, self::$TEXT_TYPES); - } - - /** - * Returns true if values for the type are numeric. - * - * @param string $type The Propel type to check. - * @return boolean True if values for the type need to be quoted. - */ - public static function isNumericType($type) - { - return in_array($type, self::$NUMERIC_TYPES); - } - - /** - * Returns true if values for the type are boolean. - * - * @param string $type The Propel type to check. - * @return boolean True if values for the type need to be quoted. - */ - public static function isBooleanType($type) - { - return in_array($type, self::$BOOLEAN_TYPES); - } - - /** - * Returns true if type is a LOB type (i.e. would be handled by Blob/Clob class). - * @param string $type Propel type to check. - * @return boolean - */ - public static function isLobType($type) - { - return in_array($type, self::$LOB_TYPES); - } - - /** - * Convenience method to indicate whether a passed-in PHP type is a primitive. - * - * @param string $phpType The PHP type to check - * @return boolean Whether the PHP type is a primitive (string, int, boolean, float) - */ - public static function isPhpPrimitiveType($phpType) - { - return in_array($phpType, array("boolean", "int", "double", "float", "string")); - } - - /** - * Convenience method to indicate whether a passed-in PHP type is a numeric primitive. - * - * @param string $phpType The PHP type to check - * @return boolean Whether the PHP type is a primitive (string, int, boolean, float) - */ - public static function isPhpPrimitiveNumericType($phpType) - { - return in_array($phpType, array("boolean", "int", "double", "float")); - } - - /** - * Convenience method to indicate whether a passed-in PHP type is an object. - * - * @param string $phpType The PHP type to check - * @return boolean Whether the PHP type is a primitive (string, int, boolean, float) - */ - public static function isPhpObjectType($phpType) - { - return (!self::isPhpPrimitiveType($phpType) && !in_array($phpType, array("resource", "array"))); - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/Rule.php b/airtime_mvc/library/propel/generator/lib/model/Rule.php deleted file mode 100644 index d69e4e76be..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/Rule.php +++ /dev/null @@ -1,194 +0,0 @@ - (Propel) - * @author John McNally (Intake) - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -class Rule extends XMLElement -{ - - private $name; - private $value; - private $message; - private $validator; - private $classname; - - /** - * Sets up the Rule object based on the attributes that were passed to loadFromXML(). - * @see parent::loadFromXML() - */ - protected function setupObject() - { - $this->name = $this->getAttribute("name"); - $this->value = $this->getAttribute("value"); - $this->classname = $this->getAttribute("class"); - - /* - * Set some default values if they are not specified. - * This is escpecially useful for maxLength; the size - * is already known by the column and this way it is - * not necessary to manage the same size two times. - * - * Currently there is only one such supported default: - * - maxLength value = column max length - * (this default cannot be easily set at runtime w/o changing - * design of class system in undesired ways) - */ - if ($this->value === null) { - switch($this->name) { - case 'maxLength': - $this->value = $this->validator->getColumn()->getSize(); - break; - } - } - - $this->message = $this->getAttribute("message"); - } - - /** - * Sets the owning validator for this rule. - * @param Validator $validator - * @see Validator::addRule() - */ - public function setValidator(Validator $validator) - { - $this->validator = $validator; - } - - /** - * Gets the owning validator for this rule. - * @return Validator - */ - public function getValidator() - { - return $this->validator; - } - - /** - * Sets the dot-path name of class to use for rule. - * If no class is specified in XML, then a classname will - * be built based on the 'name' attrib. - * @param string $classname dot-path classname (e.g. myapp.propel.MyValidator) - */ - public function setClass($classname) - { - $this->classname = $classname; - } - - /** - * Gets the dot-path name of class to use for rule. - * If no class was specified, this method will build a default classname - * based on the 'name' attribute. E.g. 'maxLength' -> 'propel.validator.MaxLengthValidator' - * @return string dot-path classname (e.g. myapp.propel.MyValidator) - */ - public function getClass() - { - if ($this->classname === null && $this->name !== null) { - return "propel.validator." . ucfirst($this->name) . "Validator"; - } - return $this->classname; - } - - /** - * Sets the name of the validator for this rule. - * This name is used to build the classname if none was specified. - * @param string $name Validator name for this rule (e.g. "maxLength", "required"). - * @see getClass() - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Gets the name of the validator for this rule. - * @return string Validator name for this rule (e.g. "maxLength", "required"). - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the value parameter for this validator rule. - * Note: not all validators need a value parameter (e.g. 'required' validator - * does not). - * @param string $value - */ - public function setValue($value) - { - $this->value = $value; - } - - /** - * Gets the value parameter for this validator rule. - * @return string - */ - public function getValue() - { - return $this->value; - } - - /** - * Sets the message that will be displayed to the user if validation fails. - * This message may be a Gettext msgid (if translation="gettext") or some other - * id for an alternative not-yet-supported translation system. It may also - * be a simple, single-language string. - * @param string $message - * @see setTranslation() - */ - public function setMessage($message) - { - $this->message = $message; - } - - /** - * Gets the message that will be displayed to the user if validation fails. - * This message may be a Gettext msgid (if translation="gettext") or some other - * id for an alternative not-yet-supported translation system. It may also - * be a simple, single-language string. - * @return string - * @see setTranslation() - */ - public function getMessage() - { - $message = str_replace('${value}', $this->getValue(), $this->message); - return $message; - } - - /** - * @see XMLElement::appendXml(DOMNode) - */ - public function appendXml(DOMNode $node) - { - $doc = ($node instanceof DOMDocument) ? $node : $node->ownerDocument; - - $ruleNode = $node->appendChild($doc->createElement('rule')); - $ruleNode->setAttribute('name', $this->getName()); - - if ($this->getValue() !== null) { - $ruleNode->setAttribute('value', $this->getValue()); - } - - if ($this->classname !== null) { - $ruleNode->setAttribute('class', $this->getClass()); - } - - $ruleNode->setAttribute('message', $this->getMessage()); - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/model/Table.php b/airtime_mvc/library/propel/generator/lib/model/Table.php deleted file mode 100644 index 9198e27b1f..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/Table.php +++ /dev/null @@ -1,1579 +0,0 @@ - (Propel) - * @author Leon Messerschmidt (Torque) - * @author Jason van Zyl (Torque) - * @author Martin Poeschl (Torque) - * @author John McNally (Torque) - * @author Daniel Rall (Torque) - * @author Byron Foster (Torque) - * @version $Revision: 1802 $ - * @package propel.generator.model - */ -class Table extends XMLElement implements IDMethod -{ - - /** - * Enables some debug printing. - */ - const DEBUG = false; - - /** - * Columns for this table. - * - * @var array Column[] - */ - private $columnList = array(); - - /** - * Validators for this table. - * - * @var array Validator[] - */ - private $validatorList = array(); - - /** - * Foreign keys for this table. - * - * @var array ForeignKey[] - */ - private $foreignKeys = array(); - - /** - * Indexes for this table. - * - * @var array Index[] - */ - private $indices = array(); - - /** - * Unique indexes for this table. - * - * @var array Unique[] - */ - private $unices = array(); - - /** - * Any parameters for the ID method (currently supports changing sequence name). - * - * @var array - */ - private $idMethodParameters = array(); - - /** - * Table name. - * - * @var string - */ - private $name; - - /** - * Table description. - * - * @var string - */ - private $description; - - /** - * phpName for the table. - * - * @var string - */ - private $phpName; - - /** - * Namespace for the generated OM. - * - * @var string - */ - protected $namespace; - - /** - * ID method for the table (e.g. IDMethod::NATIVE, IDMethod::NONE). - * - * @var string - */ - private $idMethod; - - /** - * Wether an INSERT with set PK is allowed on tables with IDMethod::NATIVE - * - * @var boolean - */ - private $allowPkInsert; - - /** - * Strategry to use for converting column name to phpName. - * - * @var string - */ - private $phpNamingMethod; - - /** - * The Database that this table belongs to. - * - * @var Database - */ - private $database; - - /** - * Foreign Keys that refer to this table. - * - * @var array ForeignKey[] - */ - private $referrers = array(); - - /** - * Names of foreign tables. - * - * @var array string[] - */ - private $foreignTableNames; - - /** - * Whether this table contains a foreign primary key. - * - * @var boolean - */ - private $containsForeignPK; - - /** - * The inheritance column for this table (if any). - * - * @var Column - */ - private $inheritanceColumn; - - /** - * Whether to skip generation of SQL for this table. - * - * @var boolean - */ - private $skipSql; - - /** - * Whether this table is "read-only". - * - * @var boolean - */ - private $readOnly; - - /** - * Whether this table should result in abstract OM classes. - * - * @var boolean - */ - private $abstractValue; - - /** - * Whether this table is an alias for another table. - * - * @var string - */ - private $alias; - - /** - * The interface that the generated "object" class should implement. - * - * @var string - */ - private $enterface; - - /** - * The package for the generated OM. - * - * @var string - */ - private $pkg; - - /** - * The base class to extend for the generated "object" class. - * - * @var string - */ - private $baseClass; - - /** - * The base peer class to extend for generated "peer" class. - * - * @var string - */ - private $basePeer; - - /** - * Map of columns by name. - * - * @var array - */ - private $columnsByName = array(); - - /** - * Map of columns by phpName. - * - * @var array - */ - private $columnsByPhpName = array(); - - /** - * Whether this table needs to use transactions in Postgres. - * - * @var string - * @deprecated - */ - private $needsTransactionInPostgres; - - /** - * Whether to perform additional indexing on this table. - * - * @var boolean - */ - private $heavyIndexing; - - /** - * Whether this table is for reference only. - * - * @var boolean - */ - private $forReferenceOnly; - - /** - * The tree mode (nested set, etc.) implemented by this table. - * - * @var string - */ - private $treeMode; - - /** - * Whether to reload the rows in this table after insert. - * - * @var boolean - */ - private $reloadOnInsert; - - /** - * Whether to reload the rows in this table after update. - * - * @var boolean - */ - private $reloadOnUpdate; - - /** - * List of behaviors registered for this table - * - * @var array - */ - protected $behaviors = array(); - - /** - * Whether this table is a cross-reference table for a many-to-many relationship - * - * @var boolean - */ - protected $isCrossRef = false; - - /** - * Constructs a table object with a name - * - * @param string $name table name - */ - public function __construct($name = null) - { - $this->name = $name; - } - - /** - * Sets up the Rule object based on the attributes that were passed to loadFromXML(). - * @see parent::loadFromXML() - */ - public function setupObject() - { - $this->name = $this->getDatabase()->getTablePrefix() . $this->getAttribute("name"); - // retrieves the method for converting from specified name to a PHP name. - $this->phpNamingMethod = $this->getAttribute("phpNamingMethod", $this->getDatabase()->getDefaultPhpNamingMethod()); - $this->phpName = $this->getAttribute("phpName", $this->buildPhpName($this->getAttribute('name'))); - - $namespace = $this->getAttribute("namespace", ''); - $package = $this->getAttribute("package"); - if ($namespace && !$package && $this->getDatabase()->getBuildProperty('namespaceAutoPackage')) { - $package = str_replace('\\', '.', $namespace); - } - $this->namespace = $namespace; - $this->pkg = $package; - - $this->namespace = $this->getAttribute("namespace"); - $this->idMethod = $this->getAttribute("idMethod", $this->getDatabase()->getDefaultIdMethod()); - $this->allowPkInsert = $this->booleanValue($this->getAttribute("allowPkInsert")); - - - $this->skipSql = $this->booleanValue($this->getAttribute("skipSql")); - $this->readOnly = $this->booleanValue($this->getAttribute("readOnly")); - - $this->abstractValue = $this->booleanValue($this->getAttribute("abstract")); - $this->baseClass = $this->getAttribute("baseClass"); - $this->basePeer = $this->getAttribute("basePeer"); - $this->alias = $this->getAttribute("alias"); - - $this->heavyIndexing = ( $this->booleanValue($this->getAttribute("heavyIndexing")) - || ("false" !== $this->getAttribute("heavyIndexing") - && $this->getDatabase()->isHeavyIndexing() ) ); - $this->description = $this->getAttribute("description"); - $this->enterface = $this->getAttribute("interface"); // sic ('interface' is reserved word) - $this->treeMode = $this->getAttribute("treeMode"); - - $this->reloadOnInsert = $this->booleanValue($this->getAttribute("reloadOnInsert")); - $this->reloadOnUpdate = $this->booleanValue($this->getAttribute("reloadOnUpdate")); - $this->isCrossRef = $this->getAttribute("isCrossRef", false); - } - - /** - *

A hook for the SAX XML parser to call when this table has - * been fully loaded from the XML, and all nested elements have - * been processed.

- * - *

Performs heavy indexing and naming of elements which weren't - * provided with a name.

- */ - public function doFinalInitialization() - { - // Heavy indexing must wait until after all columns composing - // a table's primary key have been parsed. - if ($this->heavyIndexing) { - $this->doHeavyIndexing(); - } - - // Name any indices which are missing a name using the - // appropriate algorithm. - $this->doNaming(); - - // execute behavior table modifiers - foreach ($this->getBehaviors() as $behavior) - { - if (!$behavior->isTableModified()) { - $behavior->getTableModifier()->modifyTable(); - $behavior->setTableModified(true); - } - } - - // if idMethod is "native" and in fact there are no autoIncrement - // columns in the table, then change it to "none" - $anyAutoInc = false; - foreach ($this->getColumns() as $col) { - if ($col->isAutoIncrement()) { - $anyAutoInc = true; - } - } - if ($this->getIdMethod() === IDMethod::NATIVE && !$anyAutoInc) { - $this->setIdMethod(IDMethod::NO_ID_METHOD); - } - - // If there is no PK, then throw an error. Propel 1.3 requires primary keys. - $pk = $this->getPrimaryKey(); - if (empty($pk)) { - throw new EngineException("Table '".$this->getName()."' does not have a primary key defined. Propel requires all tables to have a primary key."); - } - - } - - /** - *

Adds extra indices for multi-part primary key columns.

- * - *

For databases like MySQL, values in a where clause much - * match key part order from the left to right. So, in the key - * definition PRIMARY KEY (FOO_ID, BAR_ID), - * FOO_ID must be the first element used in - * the where clause of the SQL query used against - * this table for the primary key index to be used. This feature - * could cause problems under MySQL with heavily indexed tables, - * as MySQL currently only supports 16 indices per table (i.e. it - * might cause too many indices to be created).

- * - *

See the - * manual for a better description of why heavy indexing is - * useful for quickly searchable database tables.

- */ - private function doHeavyIndexing() - { - if (self::DEBUG) { - print("doHeavyIndex() called on table " . $this->name."\n"); - } - - $pk = $this->getPrimaryKey(); - $size = count($pk); - - // We start at an offset of 1 because the entire column - // list is generally implicitly indexed by the fact that - // it's a primary key. - for ($i=1; $i < $size; $i++) { - $idx = new Index(); - $idx->setColumns(array_slice($pk, $i, $size)); - $this->addIndex($idx); - } - } - - /** - * Names composing objects which haven't yet been named. This - * currently consists of foreign-key and index entities. - */ - public function doNaming() { - - // Assure names are unique across all databases. - try { - for ($i=0, $size = count($this->foreignKeys); $i < $size; $i++) { - $fk = $this->foreignKeys[$i]; - $name = $fk->getName(); - if (empty($name)) { - $name = $this->acquireConstraintName("FK", $i + 1); - $fk->setName($name); - } - } - - for ($i = 0, $size = count($this->indices); $i < $size; $i++) { - $index = $this->indices[$i]; - $name = $index->getName(); - if (empty($name)) { - $name = $this->acquireConstraintName("I", $i + 1); - $index->setName($name); - } - } - - for ($i = 0, $size = count($this->unices); $i < $size; $i++) { - $index = $this->unices[$i]; - $name = $index->getName(); - if (empty($name)) { - $name = $this->acquireConstraintName("U", $i + 1); - $index->setName($name); - } - } - - // NOTE: Most RDBMSes can apparently name unique column - // constraints/indices themselves (using MySQL and Oracle - // as test cases), so we'll assume that we needn't add an - // entry to the system name list for these. - } catch (EngineException $nameAlreadyInUse) { - print $nameAlreadyInUse->getMessage() . "\n"; - print $nameAlreadyInUse->getTraceAsString(); - } - } - - /** - * Macro to a constraint name. - * - * @param nameType constraint type - * @param nbr unique number for this constraint type - * @return unique name for constraint - * @throws EngineException - */ - private function acquireConstraintName($nameType, $nbr) - { - $inputs = array(); - $inputs[] = $this->getDatabase(); - $inputs[] = $this->getName(); - $inputs[] = $nameType; - $inputs[] = $nbr; - return NameFactory::generateName(NameFactory::CONSTRAINT_GENERATOR, $inputs); - } - - /** - * Gets the value of base class for classes produced from this table. - * - * @return The base class for classes produced from this table. - */ - public function getBaseClass() - { - if ($this->isAlias() && $this->baseClass === null) { - return $this->alias; - } elseif ($this->baseClass === null) { - return $this->getDatabase()->getBaseClass(); - } else { - return $this->baseClass; - } - } - - /** - * Set the value of baseClass. - * @param v Value to assign to baseClass. - */ - public function setBaseClass($v) - { - $this->baseClass = $v; - } - - /** - * Get the value of basePeer. - * @return value of basePeer. - */ - public function getBasePeer() - { - if ($this->isAlias() && $this->basePeer === null) { - return $this->alias . "Peer"; - } elseif ($this->basePeer === null) { - return $this->getDatabase()->getBasePeer(); - } else { - return $this->basePeer; - } - } - - /** - * Set the value of basePeer. - * @param v Value to assign to basePeer. - */ - public function setBasePeer($v) - { - $this->basePeer = $v; - } - - /** - * A utility function to create a new column from attrib and add it to this - * table. - * - * @param $coldata xml attributes or Column class for the column to add - * @return the added column - */ - public function addColumn($data) - { - if ($data instanceof Column) { - $col = $data; - $col->setTable($this); - if ($col->isInheritance()) { - $this->inheritanceColumn = $col; - } - if (isset($this->columnsByName[$col->getName()])) { - throw new EngineException('Duplicate column declared: ' . $col->getName()); - } - $this->columnList[] = $col; - $this->columnsByName[$col->getName()] = $col; - $this->columnsByPhpName[$col->getPhpName()] = $col; - $col->setPosition(count($this->columnList)); - $this->needsTransactionInPostgres |= $col->requiresTransactionInPostgres(); - return $col; - } else { - $col = new Column(); - $col->setTable($this); - $col->loadFromXML($data); - return $this->addColumn($col); // call self w/ different param - } - } - - /** - * Add a validator to this table. - * - * Supports two signatures: - * - addValidator(Validator $validator) - * - addValidator(array $attribs) - * - * @param mixed $data Validator object or XML attribs (array) from element. - * @return Validator The added Validator. - * @throws EngineException - */ - public function addValidator($data) - { - if ($data instanceof Validator) { - $validator = $data; - $col = $this->getColumn($validator->getColumnName()); - if ($col == null) { - throw new EngineException("Failed adding validator to table '" . $this->getName() . - "': column '" . $validator->getColumnName() . "' does not exist !"); - } - $validator->setColumn($col); - $validator->setTable($this); - $this->validatorList[] = $validator; - return $validator; - } else { - $validator = new Validator(); - $validator->setTable($this); - $validator->loadFromXML($data); - return $this->addValidator($validator); - } - } - - /** - * A utility function to create a new foreign key - * from attrib and add it to this table. - */ - public function addForeignKey($fkdata) - { - if ($fkdata instanceof ForeignKey) { - $fk = $fkdata; - $fk->setTable($this); - $this->foreignKeys[] = $fk; - - if ($this->foreignTableNames === null) { - $this->foreignTableNames = array(); - } - if (!in_array($fk->getForeignTableName(), $this->foreignTableNames)) { - $this->foreignTableNames[] = $fk->getForeignTableName(); - } - return $fk; - } else { - $fk = new ForeignKey(); - $fk->setTable($this); - $fk->loadFromXML($fkdata); - return $this->addForeignKey($fk); - } - } - - /** - * Gets the column that subclasses of the class representing this - * table can be produced from. - * @return Column - */ - public function getChildrenColumn() - { - return $this->inheritanceColumn; - } - - /** - * Get the subclasses that can be created from this table. - * @return array string[] Class names - */ - public function getChildrenNames() - { - if ($this->inheritanceColumn === null - || !$this->inheritanceColumn->isEnumeratedClasses()) { - return null; - } - $children = $this->inheritanceColumn->getChildren(); - $names = array(); - for ($i = 0, $size=count($children); $i < $size; $i++) { - $names[] = get_class($children[$i]); - } - return $names; - } - - /** - * Adds the foreign key from another table that refers to this table. - */ - public function addReferrer(ForeignKey $fk) - { - if ($this->referrers === null) { - $this->referrers = array(); - } - $this->referrers[] = $fk; - } - - /** - * Get list of references to this table. - */ - public function getReferrers() - { - return $this->referrers; - } - - public function getCrossFks() - { - $crossFks = array(); - foreach ($this->getReferrers() as $refFK) { - if ($refFK->getTable()->getIsCrossRef()) { - foreach ($refFK->getOtherFks() as $crossFK) { - $crossFks[]= array($refFK, $crossFK); - } - } - } - return $crossFks; - } - - /** - * Set whether this table contains a foreign PK - */ - public function setContainsForeignPK($b) - { - $this->containsForeignPK = (boolean) $b; - } - - /** - * Determine if this table contains a foreign PK - */ - public function getContainsForeignPK() - { - return $this->containsForeignPK; - } - - /** - * A list of tables referenced by foreign keys in this table - */ - public function getForeignTableNames() - { - if ($this->foreignTableNames === null) { - $this->foreignTableNames = array(); - } - return $this->foreignTableNames; - } - - /** - * Return true if the column requires a transaction in Postgres - */ - public function requiresTransactionInPostgres() - { - return $this->needsTransactionInPostgres; - } - - /** - * A utility function to create a new id method parameter - * from attrib or object and add it to this table. - */ - public function addIdMethodParameter($impdata) - { - if ($impdata instanceof IdMethodParameter) { - $imp = $impdata; - $imp->setTable($this); - if ($this->idMethodParameters === null) { - $this->idMethodParameters = array(); - } - $this->idMethodParameters[] = $imp; - return $imp; - } else { - $imp = new IdMethodParameter(); - $imp->loadFromXML($impdata); - return $this->addIdMethodParameter($imp); // call self w/ diff param - } - } - - /** - * Adds a new index to the index list and set the - * parent table of the column to the current table - */ - public function addIndex($idxdata) - { - if ($idxdata instanceof Index) { - $index = $idxdata; - $index->setTable($this); - $index->getName(); // we call this method so that the name is created now if it doesn't already exist. - $this->indices[] = $index; - return $index; - } else { - $index = new Index($this); - $index->loadFromXML($idxdata); - return $this->addIndex($index); - } - } - - /** - * Adds a new Unique to the Unique list and set the - * parent table of the column to the current table - */ - public function addUnique($unqdata) - { - if ($unqdata instanceof Unique) { - $unique = $unqdata; - $unique->setTable($this); - $unique->getName(); // we call this method so that the name is created now if it doesn't already exist. - $this->unices[] = $unique; - return $unique; - } else { - $unique = new Unique($this); - $unique->loadFromXML($unqdata); - return $this->addUnique($unique); - } - } - - /** - * Retrieves the configuration object, filled by build.properties - * - * @return GeneratorConfig - */ - public function getGeneratorConfig() - { - return $this->getDatabase()->getAppData()->getPlatform()->getGeneratorConfig(); - } - - /** - * Adds a new Behavior to the table - * @return Behavior A behavior instance - */ - public function addBehavior($bdata) - { - if ($bdata instanceof Behavior) { - $behavior = $bdata; - $behavior->setTable($this); - $this->behaviors[$behavior->getName()] = $behavior; - return $behavior; - } else { - $class = $this->getConfiguredBehavior($bdata['name']); - $behavior = new $class(); - $behavior->loadFromXML($bdata); - return $this->addBehavior($behavior); - } - } - - /** - * Get the table behaviors - * @return Array of Behavior objects - */ - public function getBehaviors() - { - return $this->behaviors; - } - - /** - * Get the early table behaviors - * @return Array of Behavior objects - */ - public function getEarlyBehaviors() - { - $behaviors = array(); - foreach ($this->behaviors as $name => $behavior) { - if ($behavior->isEarly()) { - $behaviors[$name] = $behavior; - } - } - return $behaviors; - } - - /** - * check if the table has a behavior by name - * - * @param string $name the behavior name - * @return boolean True if the behavior exists - */ - public function hasBehavior($name) - { - return array_key_exists($name, $this->behaviors); - } - - /** - * Get one table behavior by name - * - * @param string $name the behavior name - * @return Behavior a behavior object - */ - public function getBehavior($name) - { - return $this->behaviors[$name]; - } - - /** - * Get the name of the Table - */ - public function getName() - { - return $this->name; - } - - /** - * Set the name of the Table - */ - public function setName($newName) - { - $this->name = $newName; - } - - /** - * Get the description for the Table - */ - public function getDescription() - { - return $this->description; - } - - /** - * Set the description for the Table - * - * @param newDescription description for the Table - */ - public function setDescription($newDescription) - { - $this->description = $newDescription; - } - - /** - * Get name to use in PHP sources - * @return string - */ - public function getPhpName() - { - if ($this->phpName === null) { - $inputs = array(); - $inputs[] = $this->name; - $inputs[] = $this->phpNamingMethod; - try { - $this->phpName = NameFactory::generateName(NameFactory::PHP_GENERATOR, $inputs); - } catch (EngineException $e) { - print $e->getMessage() . "\n"; - print $e->getTraceAsString(); - } - } - return $this->phpName; - } - - /** - * Set name to use in PHP sources - * @param string $phpName - */ - public function setPhpName($phpName) - { - $this->phpName = $phpName; - } - - public function buildPhpName($name) - { - return NameFactory::generateName(NameFactory::PHP_GENERATOR, array($name, $this->phpNamingMethod)); - } - - /** - * Get studly version of PHP name. - * - * The studly name is the PHP name with the first character lowercase. - * - * @return string - */ - public function getStudlyPhpName() - { - $phpname = $this->getPhpName(); - if (strlen($phpname) > 1) { - return strtolower(substr($phpname, 0, 1)) . substr($phpname, 1); - } else { // 0 or 1 chars (I suppose that's rare) - return strtolower($phpname); - } - } - - /** - * Get the value of the namespace. - * @return value of namespace. - */ - public function getNamespace() - { - if (strpos($this->namespace, '\\') === 0) { - // absolute table namespace - return substr($this->namespace, 1); - } elseif ($this->namespace && $this->getDatabase() && $this->getDatabase()->getNamespace()) { - return $this->getDatabase()->getNamespace() . '\\' . $this->namespace; - } elseif ($this->getDatabase() && $this->getDatabase()->getNamespace()) { - return $this->getDatabase()->getNamespace(); - } else { - return $this->namespace; - } - } - - /** - * Set the value of the namespace. - * @param v Value to assign to namespace. - */ - public function setNamespace($v) - { - $this->namespace = $v; - } - - /** - * Get the method for generating pk's - * [HL] changing behavior so that Database default method is returned - * if no method has been specified for the table. - * - * @return string - */ - public function getIdMethod() - { - if ($this->idMethod === null) { - return IDMethod::NO_ID_METHOD; - } else { - return $this->idMethod; - } - } - - /** - * Whether we allow to insert primary keys on tables with - * idMethod=native - * - * @return boolean - */ - public function isAllowPkInsert() - { - return $this->allowPkInsert; - } - - - /** - * Set the method for generating pk's - */ - public function setIdMethod($idMethod) - { - $this->idMethod = $idMethod; - } - - /** - * Skip generating sql for this table (in the event it should - * not be created from scratch). - * @return boolean Value of skipSql. - */ - public function isSkipSql() - { - return ($this->skipSql || $this->isAlias() || $this->isForReferenceOnly()); - } - - /** - * Is table read-only, in which case only accessors (and relationship setters) - * will be created. - * @return boolan Value of readOnly. - */ - public function isReadOnly() - { - return $this->readOnly; - } - - /** - * Set whether this table should have its creation sql generated. - * @param boolean $v Value to assign to skipSql. - */ - public function setSkipSql($v) - { - $this->skipSql = $v; - } - - /** - * Whether to force object to reload on INSERT. - * @return boolean - */ - public function isReloadOnInsert() - { - return $this->reloadOnInsert; - } - - /** - * Whether to force object to reload on UPDATE. - * @return boolean - */ - public function isReloadOnUpdate() - { - return $this->reloadOnUpdate; - } - - /** - * PhpName of om object this entry references. - * @return value of external. - */ - public function getAlias() - { - return $this->alias; - } - - /** - * Is this table specified in the schema or is there just - * a foreign key reference to it. - * @return value of external. - */ - public function isAlias() - { - return ($this->alias !== null); - } - - /** - * Set whether this table specified in the schema or is there just - * a foreign key reference to it. - * @param v Value to assign to alias. - */ - public function setAlias($v) - { - $this->alias = $v; - } - - - /** - * Interface which objects for this table will implement - * @return value of interface. - */ - public function getInterface() - { - return $this->enterface; - } - - /** - * Interface which objects for this table will implement - * @param v Value to assign to interface. - */ - public function setInterface($v) - { - $this->enterface = $v; - } - - /** - * When a table is abstract, it marks the business object class that is - * generated as being abstract. If you have a table called "FOO", then the - * Foo BO will be public abstract class Foo - * This helps support class hierarchies - * - * @return value of abstractValue. - */ - public function isAbstract() - { - return $this->abstractValue; - } - - /** - * When a table is abstract, it marks the business object - * class that is generated as being abstract. If you have a - * table called "FOO", then the Foo BO will be - * public abstract class Foo - * This helps support class hierarchies - * - * @param v Value to assign to abstractValue. - */ - public function setAbstract($v) - { - $this->abstractValue = (boolean) $v; - } - - /** - * Get the value of package. - * @return value of package. - */ - public function getPackage() - { - return $this->pkg; - } - - /** - * Set the value of package. - * @param v Value to assign to package. - */ - public function setPackage($v) - { - $this->pkg = $v; - } - - /** - * Returns an Array containing all the columns in the table - * @return array Column[] - */ - public function getColumns() - { - return $this->columnList; - } - - /** - * Utility method to get the number of columns in this table - */ - public function getNumColumns() - { - return count($this->columnList); - } - - /** - * Utility method to get the number of columns in this table - */ - public function getNumLazyLoadColumns() - { - $count = 0; - foreach ($this->columnList as $col) { - if ($col->isLazyLoad()) { - $count++; - } - } - return $count; - } - - /** - * Returns an Array containing all the validators in the table - * @return array Validator[] - */ - public function getValidators() - { - return $this->validatorList; - } - - /** - * Returns an Array containing all the FKs in the table. - * @return array ForeignKey[] - */ - public function getForeignKeys() - { - return $this->foreignKeys; - } - - /** - * Returns a Collection of parameters relevant for the chosen - * id generation method. - */ - public function getIdMethodParameters() - { - return $this->idMethodParameters; - } - - /** - * Returns an Array containing all the FKs in the table - * @return array Index[] - */ - public function getIndices() - { - return $this->indices; - } - - /** - * Returns an Array containing all the UKs in the table - * @return array Unique[] - */ - public function getUnices() - { - return $this->unices; - } - - /** - * Check whether the table has a column. - * @return boolean - */ - public function hasColumn($name) - { - return array_key_exists($name, $this->columnsByName); - } - - /** - * Returns a specified column. - * @return Column Return a Column object or null if it does not exist. - */ - public function getColumn($name) - { - return @$this->columnsByName[$name]; - } - - /** - * Returns a specified column. - * @return Column Return a Column object or null if it does not exist. - */ - public function getColumnByPhpName($phpName) - { - return @$this->columnsByPhpName[$phpName]; - } - - /** - * Get all the foreign keys from this table to the specified table. - * @return array ForeignKey[] - */ - public function getForeignKeysReferencingTable($tablename) - { - $matches = array(); - $keys = $this->getForeignKeys(); - foreach ($keys as $fk) { - if ($fk->getForeignTableName() === $tablename) { - $matches[] = $fk; - } - } - return $matches; - } - - /** - * Return the foreign keys that includes col in it's list of local columns. - * Eg. Foreign key (a,b,c) refrences tbl(x,y,z) will be returned of col is either a,b or c. - * @param string $col - * @return array ForeignKey[] or null if there is no FK for specified column. - */ - public function getColumnForeignKeys($colname) - { - $matches = array(); - foreach ($this->foreignKeys as $fk) { - if (in_array($colname, $fk->getLocalColumns())) { - $matches[] = $fk; - } - } - return $matches; - } - - /** - * Returns true if the table contains a specified column - * @param mixed $col Column or column name. - */ - public function containsColumn($col) - { - if ($col instanceof Column) { - return in_array($col, $this->columnList); - } else { - return ($this->getColumn($col) !== null); - } - } - - /** - * Set the database that contains this table. - * - * @param Database $db - */ - public function setDatabase(Database $db) - { - $this->database = $db; - } - - /** - * Get the database that contains this table. - * - * @return Database - */ - public function getDatabase() - { - return $this->database; - } - - /** - * Flag to determine if code/sql gets created for this table. - * Table will be skipped, if return true. - * @return boolean - */ - public function isForReferenceOnly() - { - return $this->forReferenceOnly; - } - - /** - * Flag to determine if code/sql gets created for this table. - * Table will be skipped, if set to true. - * @param boolean $v - */ - public function setForReferenceOnly($v) - { - $this->forReferenceOnly = (boolean) $v; - } - - /** - * Flag to determine if tree node class should be generated for this table. - * @return valur of treeMode - */ - public function treeMode() - { - return $this->treeMode; - } - - /** - * Flag to determine if tree node class should be generated for this table. - * @param v Value to assign to treeMode. - */ - public function setTreeMode($v) - { - $this->treeMode = $v; - } - - /** - * Appends XML nodes to passed-in DOMNode. - * - * @param DOMNode $node - */ - public function appendXml(DOMNode $node) - { - $doc = ($node instanceof DOMDocument) ? $node : $node->ownerDocument; - - $tableNode = $node->appendChild($doc->createElement('table')); - $tableNode->setAttribute('name', $this->getName()); - - if ($this->phpName !== null) { - $tableNode->setAttribute('phpName', $this->phpName); - } - - if ($this->idMethod !== null) { - $tableNode->setAttribute('idMethod', $this->idMethod); - } - - if ($this->skipSql !== null) { - $tableNode->setAttribute('idMethod', var_export($this->skipSql, true)); - } - - if ($this->readOnly !== null) { - $tableNode->setAttribute('readOnly', var_export($this->readOnly, true)); - } - - if ($this->treeMode !== null) { - $tableNode->setAttribute('treeMode', $this->treeMode); - } - - if ($this->reloadOnInsert !== null) { - $tableNode->setAttribute('reloadOnInsert', var_export($this->reloadOnInsert, true)); - } - - if ($this->reloadOnUpdate !== null) { - $tableNode->setAttribute('reloadOnUpdate', var_export($this->reloadOnUpdate, true)); - } - - if ($this->forReferenceOnly !== null) { - $tableNode->setAttribute('forReferenceOnly', var_export($this->forReferenceOnly, true)); - } - - if ($this->abstractValue !== null) { - $tableNode->setAttribute('abstract', var_export($this->abstractValue, true)); - } - - if ($this->enterface !== null) { - $tableNode->setAttribute('interface', $this->enterface); - } - - if ($this->description !== null) { - $tableNode->setAttribute('description', $this->description); - } - - if ($this->baseClass !== null) { - $tableNode->setAttribute('baseClass', $this->baseClass); - } - - if ($this->basePeer !== null) { - $tableNode->setAttribute('basePeer', $this->basePeer); - } - - if ($this->getIsCrossRef()) { - $tableNode->setAttribute('isCrossRef', $this->getIsCrossRef()); - } - - - foreach ($this->columnList as $col) { - $col->appendXml($tableNode); - } - - foreach ($this->validatorList as $validator) { - $validator->appendXml($tableNode); - } - - foreach ($this->foreignKeys as $fk) { - $fk->appendXml($tableNode); - } - - foreach ($this->idMethodParameters as $param) { - $param->appendXml($tableNode); - } - - foreach ($this->indices as $index) { - $index->appendXml($tableNode); - } - - foreach ($this->unices as $unique) { - $unique->appendXml($tableNode); - } - - foreach ($this->vendorInfos as $vi) { - $vi->appendXml($tableNode); - } - - } - - /** - * Returns the collection of Columns which make up the single primary - * key for this table. - * - * @return array Column[] A list of the primary key parts. - */ - public function getPrimaryKey() - { - $pk = array(); - foreach ($this->columnList as $col) { - if ($col->isPrimaryKey()) { - $pk[] = $col; - } - } - return $pk; - } - - /** - * Determine whether this table has a primary key. - * - * @return boolean Whether this table has any primary key parts. - */ - public function hasPrimaryKey() - { - return (count($this->getPrimaryKey()) > 0); - } - - /** - * Determine whether this table has a composite primary key. - * - * @return boolean Whether this table has more than one primary key parts. - */ - public function hasCompositePrimaryKey() - { - return (count($this->getPrimaryKey()) > 1); - } - - /** - * Determine whether this table has any auto-increment primary key(s). - * - * @return boolean Whether this table has a non-"none" id method and has a primary key column that is auto-increment. - */ - public function hasAutoIncrementPrimaryKey() - { - if ($this->getIdMethod() != IDMethod::NO_ID_METHOD) { - $pks =$this->getPrimaryKey(); - foreach ($pks as $pk) { - if ($pk->isAutoIncrement()) { - return true; - } - } - } - return false; - } - - /** - * Gets the auto increment PK - * - * @return Column if any auto increment PK column - */ - public function getAutoIncrementPrimaryKey() - { - if ($this->getIdMethod() != IDMethod::NO_ID_METHOD) { - $pks =$this->getPrimaryKey(); - foreach ($pks as $pk) { - if ($pk->isAutoIncrement()) { - return $pk; - } - } - } - return null; - } - - /** - * Returns all parts of the primary key, separated by commas. - * - * @return A CSV list of primary key parts. - * @deprecated Use the DDLBuilder->getColumnList() with the #getPrimaryKey() method. - */ - public function printPrimaryKey() - { - return $this->printList($this->columnList); - } - - /** - * Gets the crossRef status for this foreign key - * @return boolean - */ - public function getIsCrossRef() - { - return $this->isCrossRef; - } - - /** - * Sets a crossref status for this foreign key. - * @param boolean $isCrossRef - */ - public function setIsCrossRef($isCrossRef) - { - $this->isCrossRef = (bool) $isCrossRef; - } - - /** - * Returns the elements of the list, separated by commas. - * @param array $list - * @return A CSV list. - * @deprecated Use the DDLBuilder->getColumnList() with the #getPrimaryKey() method. - */ - private function printList($list){ - $result = ""; - $comma = 0; - for ($i=0,$_i=count($list); $i < $_i; $i++) { - $col = $list[$i]; - if ($col->isPrimaryKey()) { - $result .= ($comma++ ? ',' : '') . $this->getDatabase()->getPlatform()->quoteIdentifier($col->getName()); - } - } - return $result; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/Unique.php b/airtime_mvc/library/propel/generator/lib/model/Unique.php deleted file mode 100644 index feec89fcd9..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/Unique.php +++ /dev/null @@ -1,58 +0,0 @@ - (Propel) - * @author Jason van Zyl (Torque) - * @author Daniel Rall (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -class Unique extends Index -{ - - /** - * Returns true. - */ - public function isUnique() - { - return true; - } - - /** - * @see XMLElement::appendXml(DOMNode) - */ - public function appendXml(DOMNode $node) - { - $doc = ($node instanceof DOMDocument) ? $node : $node->ownerDocument; - - $uniqueNode = $node->appendChild($doc->createElement('unique')); - $uniqueNode->setAttribute('name', $this->getName()); - $columns = $this->getColumns(); - foreach ($this->getColumns() as $colname) { - $uniqueColNode = $uniqueNode->appendChild($doc->createElement('unique-column')); - $uniqueColNode->setAttribute('name', $colname); - } - - foreach ($this->vendorInfos as $vi) { - $vi->appendXml($uniqueNode); - } - } - - -} diff --git a/airtime_mvc/library/propel/generator/lib/model/Validator.php b/airtime_mvc/library/propel/generator/lib/model/Validator.php deleted file mode 100644 index 10e3d85754..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/Validator.php +++ /dev/null @@ -1,184 +0,0 @@ - (Propel) - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -class Validator extends XMLElement -{ - - const TRANSLATE_NONE = "none"; - const TRANSLATE_GETTEXT = "gettext"; - - /** - * The column this validator applies to. - * - * @var Column - */ - private $column; - - /** - * The rules for the validation. - * - * @var array Rule[] - */ - private $ruleList = array(); - - /** - * The translation mode. - * - * @var string - */ - private $translate; - - /** - * Parent table. - * - * @var Table - */ - private $table; - - /** - * Sets up the Validator object based on the attributes that were passed to loadFromXML(). - * @see parent::loadFromXML() - */ - protected function setupObject() - { - $this->column = $this->getTable()->getColumn($this->getAttribute("column")); - $this->translate = $this->getAttribute("translate", $this->getTable()->getDatabase()->getDefaultTranslateMethod());; - } - - /** - * Add a Rule to this validator. - * Supports two signatures: - * - addRule(Rule $rule) - * - addRule(array $attribs) - * @param mixed $data Rule object or XML attribs (array) from element. - * @return Rule The added Rule. - */ - public function addRule($data) - { - if ($data instanceof Rule) { - $rule = $data; // alias - $rule->setValidator($this); - $this->ruleList[] = $rule; - return $rule; - } - else { - $rule = new Rule(); - $rule->setValidator($this); - $rule->loadFromXML($data); - return $this->addRule($rule); // call self w/ different param - } - } - - /** - * Gets an array of all added rules for this validator. - * @return array Rule[] - */ - public function getRules() - { - return $this->ruleList; - } - - /** - * Gets the name of the column that this Validator applies to. - * @return string - */ - public function getColumnName() - { - return $this->column->getName(); - } - - /** - * Sets the Column object that this validator applies to. - * @param Column $column - * @see Table::addValidator() - */ - public function setColumn(Column $column) - { - $this->column = $column; - } - - /** - * Gets the Column object that this validator applies to. - * @return Column - */ - public function getColumn() - { - return $this->column; - } - - /** - * Set the owning Table. - * @param Table $table - */ - public function setTable(Table $table) - { - $this->table = $table; - } - - /** - * Get the owning Table. - * @return Table - */ - public function getTable() - { - return $this->table; - } - - /** - * Set the translation mode to use for the message. - * Currently only "gettext" and "none" are supported. The default is "none". - * @param string $method Translation method ("gettext", "none"). - */ - public function setTranslate($method) - { - $this->translate = $method; - } - - /** - * Get the translation mode to use for the message. - * Currently only "gettext" and "none" are supported. The default is "none". - * @return string Translation method ("gettext", "none"). - */ - public function getTranslate() - { - return $this->translate; - } - - /** - * @see XMLElement::appendXml(DOMNode) - */ - public function appendXml(DOMNode $node) - { - $doc = ($node instanceof DOMDocument) ? $node : $node->ownerDocument; - - $valNode = $node->appendChild($doc->createElement('validator')); - $valNode->setAttribute('column', $this->getColumnName()); - - if ($this->translate !== null) { - $valNode->setAttribute('translate', $this->translate); - } - - foreach ($this->ruleList as $rule) { - $rule->appendXml($valNode); - } - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/VendorInfo.php b/airtime_mvc/library/propel/generator/lib/model/VendorInfo.php deleted file mode 100644 index 9f4f19f396..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/VendorInfo.php +++ /dev/null @@ -1,172 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -class VendorInfo extends XMLElement -{ - - /** - * The vendor RDBMS type. - * - * @var string - */ - private $type; - - /** - * Vendor parameters. - * - * @var array - */ - private $parameters = array(); - - /** - * Creates a new VendorInfo instance. - * - * @param string $type RDBMS type (optional) - */ - public function __construct($type = null) - { - $this->type = $type; - } - - /** - * Sets up this object based on the attributes that were passed to loadFromXML(). - * @see parent::loadFromXML() - */ - protected function setupObject() - { - $this->type = $this->getAttribute("type"); - } - - /** - * Set RDBMS type for this vendor-specific info. - * - * @param string $v - */ - public function setType($v) - { - $this->type = $v; - } - - /** - * Get RDBMS type for this vendor-specific info. - * - * @return string - */ - public function getType() - { - return $this->type; - } - - /** - * Adds a new vendor parameter to this object. - * @param array $attrib Attributes from XML. - */ - public function addParameter($attrib) - { - $name = $attrib["name"]; - $this->parameters[$name] = $attrib["value"]; - } - - /** - * Sets parameter value. - * - * @param string $name - * @param mixed $value The value for the parameter. - */ - public function setParameter($name, $value) - { - $this->parameters[$name] = $value; - } - - /** - * Gets parameter value. - * - * @param string $name - * @return mixed Paramter value. - */ - public function getParameter($name) - { - if (isset($this->parameters[$name])) { - return $this->parameters[$name]; - } - return null; // just to be explicit - } - - /** - * Whether parameter exists. - * - * @param string $name - */ - public function hasParameter($name) - { - return isset($this->parameters[$name]); - } - - /** - * Sets assoc array of parameters for venfor specific info. - * - * @param array $params Paramter data. - */ - public function setParameters(array $params = array()) - { - $this->parameters = $params; - } - - /** - * Gets assoc array of parameters for venfor specific info. - * - * @return array - */ - public function getParameters() - { - return $this->parameters; - } - - /** - * Gets a new merged VendorInfo object. - * @param VendorInfo $info - * @return VendorInfo new object with merged parameters - */ - public function getMergedVendorInfo(VendorInfo $merge) - { - $newParams = array_merge($this->getParameters(), $merge->getParameters()); - $newInfo = new VendorInfo($this->getType()); - $newInfo->setParameters($newParams); - return $newInfo; - } - - /** - * @see XMLElement::appendXml(DOMNode) - */ - public function appendXml(DOMNode $node) - { - $doc = ($node instanceof DOMDocument) ? $node : $node->ownerDocument; - - $vendorNode = $node->appendChild($doc->createElement("vendor")); - $vendorNode->setAttribute("type", $this->getType()); - - foreach ($this->parameters as $key => $value) { - $parameterNode = $doc->createElement("parameter"); - $parameterNode->setAttribute("name", $key); - $parameterNode->setAttribute("value", $value); - $vendorNode->appendChild($parameterNode); - } - } -} diff --git a/airtime_mvc/library/propel/generator/lib/model/XMLElement.php b/airtime_mvc/library/propel/generator/lib/model/XMLElement.php deleted file mode 100644 index cb8008c40b..0000000000 --- a/airtime_mvc/library/propel/generator/lib/model/XMLElement.php +++ /dev/null @@ -1,182 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.generator.model - */ -abstract class XMLElement -{ - - /** - * The name => value attributes from XML. - * - * @var array - */ - protected $attributes = array(); - - /** - * Any associated vendor-specific information objects. - * - * @var array VendorInfo[] - */ - protected $vendorInfos = array(); - - /** - * Replaces the old loadFromXML() so that we can use loadFromXML() to load the attribs into the class. - */ - abstract protected function setupObject(); - - /** - * This is the entry point method for loading data from XML. - * It calls a setupObject() method that must be implemented by the child class. - * @param array $attributes The attributes for the XML tag. - */ - public function loadFromXML($attributes) - { - $this->attributes = array_change_key_case($attributes, CASE_LOWER); - $this->setupObject(); - } - - /** - * Returns the assoc array of attributes. - * All attribute names (keys) are lowercase. - * @return array - */ - public function getAttributes() - { - return $this->attributes; - } - - /** - * Gets a particular attribute by [case-insensitive] name. - * If attribute is not set then the $defaultValue is returned. - * @param string $name The [case-insensitive] name of the attribute to lookup. - * @param mixed $defaultValue The default value to use in case the attribute is not set. - * @return mixed The value of the attribute or $defaultValue if not set. - */ - public function getAttribute($name, $defaultValue = null) - { - $name = strtolower($name); - if (isset($this->attributes[$name])) { - return $this->attributes[$name]; - } else { - return $defaultValue; - } - } - - /** - * Converts value specified in XML to a boolean value. - * This is to support the default value when used w/ a boolean column. - * @return value - */ - protected function booleanValue($val) - { - if (is_numeric($val)) { - return (bool) $val; - } else { - return (in_array(strtolower($val), array('true', 't', 'y', 'yes'), true) ? true : false); - } - } - - /** - * Appends DOM elements to represent this object in XML. - * @param DOMNode $node - */ - abstract public function appendXml(DOMNode $node); - - /** - * Sets an associated VendorInfo object. - * - * @param mixed $data VendorInfo object or XML attrib data (array) - * @return VendorInfo - */ - public function addVendorInfo($data) - { - if ($data instanceof VendorInfo) { - $vi = $data; - $this->vendorInfos[$vi->getType()] = $vi; - return $vi; - } else { - $vi = new VendorInfo(); - $vi->loadFromXML($data); - return $this->addVendorInfo($vi); // call self w/ different param - } - } - - /** - * Gets the any associated VendorInfo object. - * @return VendorInfo - */ - public function getVendorInfoForType($type) - { - if (isset($this->vendorInfos[$type])) { - return $this->vendorInfos[$type]; - } else { - // return an empty object - return new VendorInfo(); - } - } - - /** - * Find the best class name for a given behavior - * Looks in build.properties for path like propel.behavior.[bname].class - * If not found, tries to autoload [Bname]Behavior - * If no success, returns 'Behavior' - * - * @param string $bname behavior name, e.g. 'timestampable' - * @return string behavior class name, e.g. 'TimestampableBehavior' - */ - public function getConfiguredBehavior($bname) - { - if ($config = $this->getGeneratorConfig()) { - if ($class = $config->getConfiguredBehavior($bname)) { - return $class; - } - } - // first fallback: maybe the behavior is loaded or autoloaded - $gen = new PhpNameGenerator(); - if(class_exists($class = $gen->generateName($bname, PhpNameGenerator::CONV_METHOD_PHPNAME) . 'Behavior')) { - return $class; - } - // second fallback: use parent behavior class (mostly for unit tests) - return 'Behavior'; - } - - /** - * String representation of the current object. - * - * This is an xml representation with the XML declaration removed. - * - * @see appendXml() - */ - public function toString() - { - $doc = new DOMDocument('1.0'); - $doc->formatOutput = true; - $this->appendXml($doc); - $xmlstr = $doc->saveXML(); - return trim(preg_replace('/<\?xml.*?\?>/', '', $xmlstr)); - } - - /** - * Magic string method - * @see toString() - */ - public function __toString() - { - return $this->toString(); - } -} diff --git a/airtime_mvc/library/propel/generator/lib/platform/DefaultPlatform.php b/airtime_mvc/library/propel/generator/lib/platform/DefaultPlatform.php deleted file mode 100644 index 889d55ec94..0000000000 --- a/airtime_mvc/library/propel/generator/lib/platform/DefaultPlatform.php +++ /dev/null @@ -1,299 +0,0 @@ - (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.platform - */ -class DefaultPlatform implements Platform -{ - - /** - * Mapping from Propel types to Domain objects. - * - * @var array - */ - protected $schemaDomainMap; - - /** - * GeneratorConfig object holding build properties. - * - * @var GeneratorConfig - */ - private $generatorConfig; - - /** - * @var PDO Database connection. - */ - private $con; - - /** - * Default constructor. - * @param PDO $con Optional database connection to use in this platform. - */ - public function __construct(PDO $con = null) - { - if ($con) $this->setConnection($con); - $this->initialize(); - } - - /** - * Set the database connection to use for this Platform class. - * @param PDO $con Database connection to use in this platform. - */ - public function setConnection(PDO $con = null) - { - $this->con = $con; - } - - /** - * Sets the GeneratorConfig to use in the parsing. - * - * @param GeneratorConfig $config - */ - public function setGeneratorConfig(GeneratorConfig $config) - { - $this->generatorConfig = $config; - } - - /** - * Gets the GeneratorConfig option. - * - * @return GeneratorConfig - */ - public function getGeneratorConfig() - { - return $this->generatorConfig; - } - - /** - * Gets a specific propel (renamed) property from the build. - * - * @param string $name - * @return mixed - */ - protected function getBuildProperty($name) - { - if ($this->generatorConfig !== null) { - return $this->generatorConfig->getBuildProperty($name); - } - return null; - } - - /** - * Returns the database connection to use for this Platform class. - * @return PDO The database connection or NULL if none has been set. - */ - public function getConnection() - { - return $this->con; - } - - /** - * Initialize the type -> Domain mapping. - */ - protected function initialize() - { - $this->schemaDomainMap = array(); - foreach (PropelTypes::getPropelTypes() as $type) { - $this->schemaDomainMap[$type] = new Domain($type); - } - // BU_* no longer needed, so map these to the DATE/TIMESTAMP domains - $this->schemaDomainMap[PropelTypes::BU_DATE] = new Domain(PropelTypes::DATE); - $this->schemaDomainMap[PropelTypes::BU_TIMESTAMP] = new Domain(PropelTypes::TIMESTAMP); - - // Boolean is a bit special, since typically it must be mapped to INT type. - $this->schemaDomainMap[PropelTypes::BOOLEAN] = new Domain(PropelTypes::BOOLEAN, "INTEGER"); - } - - /** - * Adds a mapping entry for specified Domain. - * @param Domain $domain - */ - protected function setSchemaDomainMapping(Domain $domain) - { - $this->schemaDomainMap[$domain->getType()] = $domain; - } - - /** - * Returns the short name of the database type that this platform represents. - * For example MysqlPlatform->getDatabaseType() returns 'mysql'. - * @return string - */ - public function getDatabaseType() - { - $clazz = get_class($this); - $pos = strpos($clazz, 'Platform'); - return strtolower(substr($clazz,0,$pos)); - } - - /** - * @see Platform::getMaxColumnNameLength() - */ - public function getMaxColumnNameLength() - { - return 64; - } - - /** - * @see Platform::getNativeIdMethod() - */ - public function getNativeIdMethod() - { - return Platform::IDENTITY; - } - - /** - * @see Platform::getDomainForType() - */ - public function getDomainForType($propelType) - { - if (!isset($this->schemaDomainMap[$propelType])) { - throw new EngineException("Cannot map unknown Propel type " . var_export($propelType, true) . " to native database type."); - } - return $this->schemaDomainMap[$propelType]; - } - - /** - * @return string Returns the SQL fragment to use if null values are disallowed. - * @see Platform::getNullString(boolean) - */ - public function getNullString($notNull) - { - return ($notNull ? "NOT NULL" : ""); - } - - /** - * @see Platform::getAutoIncrement() - */ - public function getAutoIncrement() - { - return "IDENTITY"; - } - - /** - * @see Platform::hasScale(String) - */ - public function hasScale($sqlType) - { - return true; - } - - /** - * @see Platform::hasSize(String) - */ - public function hasSize($sqlType) - { - return true; - } - - /** - * @see Platform::quote() - */ - public function quote($text) - { - if ($this->getConnection()) { - return $this->getConnection()->quote($text); - } else { - return "'" . $this->disconnectedEscapeText($text) . "'"; - } - } - - /** - * Method to escape text when no connection has been set. - * - * The subclasses can implement this using string replacement functions - * or native DB methods. - * - * @param string $text Text that needs to be escaped. - * @return string - */ - protected function disconnectedEscapeText($text) - { - return str_replace("'", "''", $text); - } - - /** - * @see Platform::quoteIdentifier() - */ - public function quoteIdentifier($text) - { - return '"' . $text . '"'; - } - - /** - * @see Platform::supportsNativeDeleteTrigger() - */ - public function supportsNativeDeleteTrigger() - { - return false; - } - - /** - * @see Platform::supportsInsertNullPk() - */ - public function supportsInsertNullPk() - { - return true; - } - - /** - * Whether the underlying PDO driver for this platform returns BLOB columns as streams (instead of strings). - * @return boolean - */ - public function hasStreamBlobImpl() - { - return false; - } - - /** - * @see Platform::getBooleanString() - */ - public function getBooleanString($b) - { - $b = ($b === true || strtolower($b) === 'true' || $b === 1 || $b === '1' || strtolower($b) === 'y' || strtolower($b) === 'yes'); - return ($b ? '1' : '0'); - } - - /** - * Gets the preferred timestamp formatter for setting date/time values. - * @return string - */ - public function getTimestampFormatter() - { - return DateTime::ISO8601; - } - - /** - * Gets the preferred time formatter for setting date/time values. - * @return string - */ - public function getTimeFormatter() - { - return 'H:i:s'; - } - - /** - * Gets the preferred date formatter for setting date/time values. - * @return string - */ - public function getDateFormatter() - { - return 'Y-m-d'; - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/platform/MssqlPlatform.php b/airtime_mvc/library/propel/generator/lib/platform/MssqlPlatform.php deleted file mode 100644 index b8330d9b86..0000000000 --- a/airtime_mvc/library/propel/generator/lib/platform/MssqlPlatform.php +++ /dev/null @@ -1,107 +0,0 @@ - (Propel) - * @author Martin Poeschl (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.platform - */ -class MssqlPlatform extends DefaultPlatform -{ - - /** - * Initializes db specific domain mapping. - */ - protected function initialize() - { - parent::initialize(); - $this->setSchemaDomainMapping(new Domain(PropelTypes::INTEGER, "INT")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BOOLEAN, "INT")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::DOUBLE, "FLOAT")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARCHAR, "TEXT")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::CLOB, "TEXT")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::DATE, "DATETIME")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BU_DATE, "DATETIME")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::TIME, "DATETIME")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::TIMESTAMP, "DATETIME")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BU_TIMESTAMP, "DATETIME")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BINARY, "BINARY(7132)")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::VARBINARY, "IMAGE")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARBINARY, "IMAGE")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BLOB, "IMAGE")); - } - - /** - * @see Platform#getMaxColumnNameLength() - */ - public function getMaxColumnNameLength() - { - return 128; - } - - /** - * @return Explicitly returns NULL if null values are - * allowed (as recomended by Microsoft). - * @see Platform#getNullString(boolean) - */ - public function getNullString($notNull) - { - return ($notNull ? "NOT NULL" : "NULL"); - } - - /** - * @see Platform::supportsNativeDeleteTrigger() - */ - public function supportsNativeDeleteTrigger() - { - return true; - } - - /** - * @see Platform::supportsInsertNullPk() - */ - public function supportsInsertNullPk() - { - return false; - } - - /** - * @see Platform::hasSize(String) - */ - public function hasSize($sqlType) - { - return !("INT" == $sqlType || "TEXT" == $sqlType); - } - - /** - * @see Platform::quoteIdentifier() - */ - public function quoteIdentifier($text) - { - return '[' . $text . ']'; - } - - /** - * Gets the preferred timestamp formatter for setting date/time values. - * @return string - */ - public function getTimestampFormatter() - { - return 'Y-m-d H:i:s'; - } - - -} diff --git a/airtime_mvc/library/propel/generator/lib/platform/MysqlPlatform.php b/airtime_mvc/library/propel/generator/lib/platform/MysqlPlatform.php deleted file mode 100644 index 8bbc0b9db5..0000000000 --- a/airtime_mvc/library/propel/generator/lib/platform/MysqlPlatform.php +++ /dev/null @@ -1,110 +0,0 @@ - (Propel) - * @author Martin Poeschl (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.platform - */ -class MysqlPlatform extends DefaultPlatform -{ - - /** - * Initializes db specific domain mapping. - */ - protected function initialize() - { - parent::initialize(); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BOOLEAN, "TINYINT")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::NUMERIC, "DECIMAL")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARCHAR, "TEXT")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BINARY, "BLOB")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::VARBINARY, "MEDIUMBLOB")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARBINARY, "LONGBLOB")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BLOB, "LONGBLOB")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::CLOB, "LONGTEXT")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::TIMESTAMP, "DATETIME")); - } - - /** - * @see Platform#getAutoIncrement() - */ - public function getAutoIncrement() - { - return "AUTO_INCREMENT"; - } - - /** - * @see Platform#getMaxColumnNameLength() - */ - public function getMaxColumnNameLength() - { - return 64; - } - - /** - * @see Platform::supportsNativeDeleteTrigger() - */ - public function supportsNativeDeleteTrigger() - { - $usingInnoDB = false; - if (class_exists('DataModelBuilder', false)) - { - $usingInnoDB = strtolower($this->getBuildProperty('mysqlTableType')) == 'innodb'; - } - return $usingInnoDB || false; - } - - /** - * @see Platform#hasSize(String) - */ - public function hasSize($sqlType) - { - return !("MEDIUMTEXT" == $sqlType || "LONGTEXT" == $sqlType - || "BLOB" == $sqlType || "MEDIUMBLOB" == $sqlType - || "LONGBLOB" == $sqlType); - } - - /** - * Escape the string for RDBMS. - * @param string $text - * @return string - */ - public function disconnectedEscapeText($text) - { - if (function_exists('mysql_escape_string')) { - return mysql_escape_string($text); - } else { - return addslashes($text); - } - } - - /** - * @see Platform::quoteIdentifier() - */ - public function quoteIdentifier($text) - { - return '`' . $text . '`'; - } - - /** - * Gets the preferred timestamp formatter for setting date/time values. - * @return string - */ - public function getTimestampFormatter() - { - return 'Y-m-d H:i:s'; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/platform/OraclePlatform.php b/airtime_mvc/library/propel/generator/lib/platform/OraclePlatform.php deleted file mode 100644 index 7ecf100b75..0000000000 --- a/airtime_mvc/library/propel/generator/lib/platform/OraclePlatform.php +++ /dev/null @@ -1,113 +0,0 @@ - (Propel) - * @author Martin Poeschl (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.platform - */ -class OraclePlatform extends DefaultPlatform -{ - - /** - * Initializes db specific domain mapping. - */ - protected function initialize() - { - parent::initialize(); - $this->schemaDomainMap[PropelTypes::BOOLEAN] = new Domain(PropelTypes::BOOLEAN_EMU, "NUMBER", "1", "0"); - $this->schemaDomainMap[PropelTypes::CLOB] = new Domain(PropelTypes::CLOB_EMU, "CLOB"); - $this->schemaDomainMap[PropelTypes::CLOB_EMU] = $this->schemaDomainMap[PropelTypes::CLOB]; - $this->setSchemaDomainMapping(new Domain(PropelTypes::TINYINT, "NUMBER", "3", "0")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::SMALLINT, "NUMBER", "5", "0")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::INTEGER, "NUMBER")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BIGINT, "NUMBER", "20", "0")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::REAL, "NUMBER")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::DOUBLE, "FLOAT")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::DECIMAL, "NUMBER")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::NUMERIC, "NUMBER")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::VARCHAR, "NVARCHAR2")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARCHAR, "NVARCHAR2", "2000")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::TIME, "DATE")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::DATE, "DATE")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::TIMESTAMP, "TIMESTAMP")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BINARY, "LONG RAW")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::VARBINARY, "BLOB")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARBINARY, "LONG RAW")); - } - - /** - * @see Platform#getMaxColumnNameLength() - */ - public function getMaxColumnNameLength() - { - return 30; - } - - /** - * @see Platform#getNativeIdMethod() - */ - public function getNativeIdMethod() - { - return Platform::SEQUENCE; - } - - /** - * @see Platform#getAutoIncrement() - */ - public function getAutoIncrement() - { - return ""; - } - - /** - * @see Platform::supportsNativeDeleteTrigger() - */ - public function supportsNativeDeleteTrigger() - { - return true; - } - - /** - * Whether the underlying PDO driver for this platform returns BLOB columns as streams (instead of strings). - * @return boolean - */ - public function hasStreamBlobImpl() - { - return true; - } - - /** - * Quotes identifiers used in database SQL. - * @see Platform::quoteIdentifier() - * @param string $text - * @return string Quoted identifier. - */ - public function quoteIdentifier($text) - { - return $text; - } - - /** - * Gets the preferred timestamp formatter for setting date/time values. - * @see Platform::getTimestampFormatter() - * @return string - */ - public function getTimestampFormatter() - { - return 'Y-m-d H:i:s'; - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/platform/PgsqlPlatform.php b/airtime_mvc/library/propel/generator/lib/platform/PgsqlPlatform.php deleted file mode 100644 index 8e8511b9e0..0000000000 --- a/airtime_mvc/library/propel/generator/lib/platform/PgsqlPlatform.php +++ /dev/null @@ -1,118 +0,0 @@ - (Propel) - * @author Martin Poeschl (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.platform - */ -class PgsqlPlatform extends DefaultPlatform -{ - - /** - * Initializes db specific domain mapping. - */ - protected function initialize() - { - parent::initialize(); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BOOLEAN, "BOOLEAN")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::TINYINT, "INT2")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::SMALLINT, "INT2")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BIGINT, "INT8")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::REAL, "FLOAT")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::DOUBLE, "DOUBLE PRECISION")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARCHAR, "TEXT")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BINARY, "BYTEA")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::VARBINARY, "BYTEA")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARBINARY, "BYTEA")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BLOB, "BYTEA")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::CLOB, "TEXT")); - } - - /** - * @see Platform#getNativeIdMethod() - */ - public function getNativeIdMethod() - { - return Platform::SERIAL; - } - - /** - * @see Platform#getAutoIncrement() - */ - public function getAutoIncrement() - { - return ""; - } - - /** - * @see Platform#getMaxColumnNameLength() - */ - public function getMaxColumnNameLength() - { - return 32; - } - - /** - * Escape the string for RDBMS. - * @param string $text - * @return string - */ - public function disconnectedEscapeText($text) - { - if (function_exists('pg_escape_string')) { - return pg_escape_string($text); - } else { - return parent::disconnectedEscapeText($text); - } - } - - /** - * @see Platform::getBooleanString() - */ - public function getBooleanString($b) - { - // parent method does the checking for allowes tring - // representations & returns integer - $b = parent::getBooleanString($b); - return ($b ? "'t'" : "'f'"); - } - - /** - * @see Platform::supportsNativeDeleteTrigger() - */ - public function supportsNativeDeleteTrigger() - { - return true; - } - - /** - * @see Platform::hasSize(String) - * TODO collect info for all platforms - */ - public function hasSize($sqlType) - { - return !("BYTEA" == $sqlType || "TEXT" == $sqlType); - } - - /** - * Whether the underlying PDO driver for this platform returns BLOB columns as streams (instead of strings). - * @return boolean - */ - public function hasStreamBlobImpl() - { - return true; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/platform/Platform.php b/airtime_mvc/library/propel/generator/lib/platform/Platform.php deleted file mode 100644 index 184116ce21..0000000000 --- a/airtime_mvc/library/propel/generator/lib/platform/Platform.php +++ /dev/null @@ -1,182 +0,0 @@ - (Propel) - * @author Martin Poeschl (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.platform - */ -interface Platform -{ - - /** - * Constant for auto-increment id method. - */ - const IDENTITY = "identity"; - - /** - * Constant for sequence id method. - */ - const SEQUENCE = "sequence"; - - /** - * Constant for serial id method (postgresql). - */ - const SERIAL = "serial"; - - /** - * Sets a database connection to use (for quoting, etc.). - * @param PDO $con The database connection to use in this Platform class. - */ - public function setConnection(PDO $con = null); - - /** - * Returns the database connection to use for this Platform class. - * @return PDO The database connection or NULL if none has been set. - */ - public function getConnection(); - - /** - * Sets the GeneratorConfig which contains any generator build properties. - * - * @param GeneratorConfig $config - */ - public function setGeneratorConfig(GeneratorConfig $config); - - /** - * Gets the GeneratorConfig object. - * - * @return GeneratorConfig - */ - public function getGeneratorConfig(); - - /** - * Returns the short name of the database type that this platform represents. - * For example MysqlPlatform->getDatabaseType() returns 'mysql'. - * @return string - */ - public function getDatabaseType(); - - /** - * Returns the native IdMethod (sequence|identity) - * - * @return string The native IdMethod (Platform:IDENTITY, Platform::SEQUENCE). - */ - public function getNativeIdMethod(); - - /** - * Returns the max column length supported by the db. - * - * @return int The max column length - */ - public function getMaxColumnNameLength(); - - /** - * Returns the db specific domain for a propelType. - * - * @param string $propelType the Propel type name. - * @return Domain The db specific domain. - */ - public function getDomainForType($propelType); - - /** - * @return string The RDBMS-specific SQL fragment for NULL - * or NOT NULL. - */ - public function getNullString($notNull); - - /** - * @return The RDBMS-specific SQL fragment for autoincrement. - */ - public function getAutoIncrement(); - - /** - * Returns if the RDBMS-specific SQL type has a size attribute. - * - * @param string $sqlType the SQL type - * @return boolean True if the type has a size attribute - */ - public function hasSize($sqlType); - - /** - * Returns if the RDBMS-specific SQL type has a scale attribute. - * - * @param string $sqlType the SQL type - * @return boolean True if the type has a scale attribute - */ - public function hasScale($sqlType); - - /** - * Quote and escape needed characters in the string for unerlying RDBMS. - * @param string $text - * @return string - */ - public function quote($text); - - /** - * Quotes identifiers used in database SQL. - * @param string $text - * @return string Quoted identifier. - */ - public function quoteIdentifier($text); - - /** - * Whether RDBMS supports native ON DELETE triggers (e.g. ON DELETE CASCADE). - * @return boolean - */ - public function supportsNativeDeleteTrigger(); - - /** - * Whether RDBMS supports INSERT null values in autoincremented primary keys - * @return boolean - */ - public function supportsInsertNullPk(); - - /** - * Returns the boolean value for the RDBMS. - * - * This value should match the boolean value that is set - * when using Propel's PreparedStatement::setBoolean(). - * - * This function is used to set default column values when building - * SQL. - * - * @param mixed $tf A boolean or string representation of boolean ('y', 'true'). - * @return mixed - */ - public function getBooleanString($tf); - - /** - * Whether the underlying PDO driver for this platform returns BLOB columns as streams (instead of strings). - * @return boolean - */ - public function hasStreamBlobImpl(); - - /** - * Gets the preferred timestamp formatter for setting date/time values. - * @return string - */ - public function getTimestampFormatter(); - - /** - * Gets the preferred date formatter for setting time values. - * @return string - */ - public function getDateFormatter(); - - /** - * Gets the preferred time formatter for setting time values. - * @return string - */ - public function getTimeFormatter(); -} diff --git a/airtime_mvc/library/propel/generator/lib/platform/SqlitePlatform.php b/airtime_mvc/library/propel/generator/lib/platform/SqlitePlatform.php deleted file mode 100644 index d42dcb9781..0000000000 --- a/airtime_mvc/library/propel/generator/lib/platform/SqlitePlatform.php +++ /dev/null @@ -1,87 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.generator.platform - */ -class SqlitePlatform extends DefaultPlatform -{ - - /** - * Initializes db specific domain mapping. - */ - protected function initialize() - { - parent::initialize(); - $this->setSchemaDomainMapping(new Domain(PropelTypes::NUMERIC, "DECIMAL")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARCHAR, "MEDIUMTEXT")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::DATE, "DATETIME")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BINARY, "BLOB")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::VARBINARY, "MEDIUMBLOB")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARBINARY, "LONGBLOB")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::BLOB, "LONGBLOB")); - $this->setSchemaDomainMapping(new Domain(PropelTypes::CLOB, "LONGTEXT")); - } - - /** - * @see Platform#getAutoIncrement() - * @link http://www.sqlite.org/autoinc.html - */ - public function getAutoIncrement() - { - - return "PRIMARY KEY"; - } - - /** - * @see Platform#getMaxColumnNameLength() - */ - public function getMaxColumnNameLength() - { - return 1024; - } - - /** - * @see Platform#hasSize(String) - */ - public function hasSize($sqlType) { - return !("MEDIUMTEXT" == $sqlType || "LONGTEXT" == $sqlType - || "BLOB" == $sqlType || "MEDIUMBLOB" == $sqlType - || "LONGBLOB" == $sqlType); - } - - /** - * Escape the string for RDBMS. - * @param string $text - * @return string - */ - public function disconnectedEscapeText($text) - { - if (function_exists('sqlite_escape_string')) { - return sqlite_escape_string($text); - } else { - return parent::disconnectedEscapeText($text); - } - } - - /** - * @see Platform::quoteIdentifier() - */ - public function quoteIdentifier($text) - { - return '[' . $text . ']'; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/reverse/BaseSchemaParser.php b/airtime_mvc/library/propel/generator/lib/reverse/BaseSchemaParser.php deleted file mode 100644 index ae80621d97..0000000000 --- a/airtime_mvc/library/propel/generator/lib/reverse/BaseSchemaParser.php +++ /dev/null @@ -1,188 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.generator.reverse - */ -abstract class BaseSchemaParser implements SchemaParser -{ - - /** - * The database connection. - * @var PDO - */ - protected $dbh; - - /** - * Stack of warnings. - * - * @var array string[] - */ - protected $warnings = array(); - - /** - * GeneratorConfig object holding build properties. - * - * @var GeneratorConfig - */ - private $generatorConfig; - - /** - * Map native DB types to Propel types. - * (Override in subclasses.) - * @var array - */ - protected $nativeToPropelTypeMap; - - /** - * Map to hold reverse type mapping (initialized on-demand). - * - * @var array - */ - protected $reverseTypeMap; - - /** - * @param PDO $dbh Optional database connection - */ - public function __construct(PDO $dbh = null) - { - if ($dbh) $this->setConnection($dbh); - } - - /** - * Sets the database connection. - * - * @param PDO $dbh - */ - public function setConnection(PDO $dbh) - { - $this->dbh = $dbh; - } - - /** - * Gets the database connection. - * @return PDO - */ - public function getConnection() - { - return $this->dbh; - } - - /** - * Pushes a message onto the stack of warnings. - * - * @param string $msg The warning message. - */ - protected function warn($msg) - { - $this->warnings[] = $msg; - } - - /** - * Gets array of warning messages. - * - * @return array string[] - */ - public function getWarnings() - { - return $this->warnings; - } - - /** - * Sets the GeneratorConfig to use in the parsing. - * - * @param GeneratorConfig $config - */ - public function setGeneratorConfig(GeneratorConfig $config) - { - $this->generatorConfig = $config; - } - - /** - * Gets the GeneratorConfig option. - * - * @return GeneratorConfig - */ - public function getGeneratorConfig() - { - return $this->generatorConfig; - } - - /** - * Gets a specific propel (renamed) property from the build. - * - * @param string $name - * @return mixed - */ - public function getBuildProperty($name) - { - if ($this->generatorConfig !== null) { - return $this->generatorConfig->getBuildProperty($name); - } - return null; - } - - /** - * Gets a type mapping from native type to Propel type. - * - * @return array The mapped Propel type. - */ - abstract protected function getTypeMapping(); - - /** - * Gets a mapped Propel type for specified native type. - * - * @param string $nativeType - * @return string The mapped Propel type. - */ - protected function getMappedPropelType($nativeType) - { - if ($this->nativeToPropelTypeMap === null) { - $this->nativeToPropelTypeMap = $this->getTypeMapping(); - } - if (isset($this->nativeToPropelTypeMap[$nativeType])) { - return $this->nativeToPropelTypeMap[$nativeType]; - } - return null; - } - - /** - * Give a best guess at the native type. - * - * @param string $propelType - * @return string The native SQL type that best matches the specified Propel type. - */ - protected function getMappedNativeType($propelType) - { - if ($this->reverseTypeMap === null) { - $this->reverseTypeMap = array_flip($this->getTypeMapping()); - } - return isset($this->reverseTypeMap[$propelType]) ? $this->reverseTypeMap[$propelType] : null; - } - - /** - * Gets a new VendorInfo object for this platform with specified params. - * - * @param array $params - */ - protected function getNewVendorInfoObject(array $params) - { - $type = $this->getGeneratorConfig()->getConfiguredPlatform()->getDatabaseType(); - $vi = new VendorInfo($type); - $vi->setParameters($params); - return $vi; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/reverse/SchemaParser.php b/airtime_mvc/library/propel/generator/lib/reverse/SchemaParser.php deleted file mode 100644 index 4f6366767f..0000000000 --- a/airtime_mvc/library/propel/generator/lib/reverse/SchemaParser.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.generator.reverse - */ -interface SchemaParser -{ - - /** - * Gets the database connection. - * @return PDO - */ - public function getConnection(); - - /** - * Sets the database connection. - * - * @param PDO $dbh - */ - public function setConnection(PDO $dbh); - - /** - * Sets the GeneratorConfig to use in the parsing. - * - * @param GeneratorConfig $config - */ - public function setGeneratorConfig(GeneratorConfig $config); - - /** - * Gets a specific propel (renamed) property from the build. - * - * @param string $name - * @return mixed - */ - public function getBuildProperty($name); - - /** - * Gets array of warning messages. - * @return array string[] - */ - public function getWarnings(); - - /** - * Parse the schema and populate passed-in Database model object. - * - * @param Database $database - * - * @return int number of generated tables - */ - public function parse(Database $database, PDOTask $task = null); -} diff --git a/airtime_mvc/library/propel/generator/lib/reverse/mssql/MssqlSchemaParser.php b/airtime_mvc/library/propel/generator/lib/reverse/mssql/MssqlSchemaParser.php deleted file mode 100644 index d28c3973df..0000000000 --- a/airtime_mvc/library/propel/generator/lib/reverse/mssql/MssqlSchemaParser.php +++ /dev/null @@ -1,240 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.generator.reverse.mssql - */ -class MssqlSchemaParser extends BaseSchemaParser -{ - - /** - * Map MSSQL native types to Propel types. - * @var array - */ - private static $mssqlTypeMap = array( - "binary" => PropelTypes::BINARY, - "bit" => PropelTypes::BOOLEAN, - "char" => PropelTypes::CHAR, - "datetime" => PropelTypes::TIMESTAMP, - "decimal() identity" => PropelTypes::DECIMAL, - "decimal" => PropelTypes::DECIMAL, - "image" => PropelTypes::LONGVARBINARY, - "int" => PropelTypes::INTEGER, - "int identity" => PropelTypes::INTEGER, - "integer" => PropelTypes::INTEGER, - "money" => PropelTypes::DECIMAL, - "nchar" => PropelTypes::CHAR, - "ntext" => PropelTypes::LONGVARCHAR, - "numeric() identity" => PropelTypes::NUMERIC, - "numeric" => PropelTypes::NUMERIC, - "nvarchar" => PropelTypes::VARCHAR, - "real" => PropelTypes::REAL, - "float" => PropelTypes::FLOAT, - "smalldatetime" => PropelTypes::TIMESTAMP, - "smallint" => PropelTypes::SMALLINT, - "smallint identity" => PropelTypes::SMALLINT, - "smallmoney" => PropelTypes::DECIMAL, - "sysname" => PropelTypes::VARCHAR, - "text" => PropelTypes::LONGVARCHAR, - "timestamp" => PropelTypes::BINARY, - "tinyint identity" => PropelTypes::TINYINT, - "tinyint" => PropelTypes::TINYINT, - "uniqueidentifier" => PropelTypes::CHAR, - "varbinary" => PropelTypes::VARBINARY, - "varchar" => PropelTypes::VARCHAR, - "uniqueidentifier" => PropelTypes::CHAR, - // SQL Server 2000 only - "bigint identity" => PropelTypes::BIGINT, - "bigint" => PropelTypes::BIGINT, - "sql_variant" => PropelTypes::VARCHAR, - ); - - /** - * Gets a type mapping from native types to Propel types - * - * @return array - */ - protected function getTypeMapping() - { - return self::$mssqlTypeMap; - } - - /** - * - */ - public function parse(Database $database, PDOTask $task = null) - { - $stmt = $this->dbh->query("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME <> 'dtproperties'"); - - // First load the tables (important that this happen before filling out details of tables) - $tables = array(); - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $name = $row[0]; - $table = new Table($name); - $database->addTable($table); - $tables[] = $table; - } - - // Now populate only columns. - foreach ($tables as $table) { - $this->addColumns($table); - } - - // Now add indexes and constraints. - foreach ($tables as $table) { - $this->addForeignKeys($table); - $this->addIndexes($table); - $this->addPrimaryKey($table); - } - - return count($tables); - - } - - - /** - * Adds Columns to the specified table. - * - * @param Table $table The Table model class to add columns to. - */ - protected function addColumns(Table $table) - { - $stmt = $this->dbh->query("sp_columns '" . $table->getName() . "'"); - - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - - $name = $row['COLUMN_NAME']; - $type = $row['TYPE_NAME']; - $size = $row['LENGTH']; - $is_nullable = $row['NULLABLE']; - $default = $row['COLUMN_DEF']; - $precision = $row['PRECISION']; - $scale = $row['SCALE']; - $autoincrement = false; - if (strtolower($type) == "int identity") { - $autoincrement = true; - } - - $propelType = $this->getMappedPropelType($type); - if (!$propelType) { - $propelType = Column::DEFAULT_TYPE; - $this->warn("Column [" . $table->getName() . "." . $name. "] has a column type (".$type.") that Propel does not support."); - } - - $column = new Column($name); - $column->setTable($table); - $column->setDomainForType($propelType); - // We may want to provide an option to include this: - // $column->getDomain()->replaceSqlType($type); - $column->getDomain()->replaceSize($size); - $column->getDomain()->replaceScale($scale); - if ($default !== null) { - $column->getDomain()->setDefaultValue(new ColumnDefaultValue($default, ColumnDefaultValue::TYPE_VALUE)); - } - $column->setAutoIncrement($autoincrement); - $column->setNotNull(!$is_nullable); - - $table->addColumn($column); - } - - - } // addColumn() - - /** - * Load foreign keys for this table. - */ - protected function addForeignKeys(Table $table) - { - $database = $table->getDatabase(); - - $stmt = $this->dbh->query("SELECT ccu1.TABLE_NAME, ccu1.COLUMN_NAME, ccu2.TABLE_NAME AS FK_TABLE_NAME, ccu2.COLUMN_NAME AS FK_COLUMN_NAME - FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu1 INNER JOIN - INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc1 ON tc1.CONSTRAINT_NAME = ccu1.CONSTRAINT_NAME AND - CONSTRAINT_TYPE = 'Foreign Key' INNER JOIN - INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1 ON rc1.CONSTRAINT_NAME = tc1.CONSTRAINT_NAME INNER JOIN - INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu2 ON ccu2.CONSTRAINT_NAME = rc1.UNIQUE_CONSTRAINT_NAME - WHERE (ccu1.table_name = '".$table->getName()."')"); - - $row = $stmt->fetch(PDO::FETCH_NUM); - - $foreignKeys = array(); // local store to avoid duplicates - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - - $lcol = $row['COLUMN_NAME']; - $ftbl = $row['FK_TABLE_NAME']; - $fcol = $row['FK_COLUMN_NAME']; - - - $foreignTable = $database->getTable($ftbl); - $foreignColumn = $foreignTable->getColumn($fcol); - $localColumn = $table->getColumn($lcol); - - if (!isset($foreignKeys[$name])) { - $fk = new ForeignKey($name); - $fk->setForeignTableName($foreignTable->getName()); - //$fk->setOnDelete($fkactions['ON DELETE']); - //$fk->setOnUpdate($fkactions['ON UPDATE']); - $table->addForeignKey($fk); - $foreignKeys[$name] = $fk; - } - $foreignKeys[$name]->addReference($localColumn, $foreignColumn); - } - - } - - /** - * Load indexes for this table - */ - protected function addIndexes(Table $table) - { - $stmt = $this->dbh->query("sp_indexes_rowset " . $table->getName()); - - $indexes = array(); - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - $colName = $row["COLUMN_NAME"]; - $name = $row['INDEX_NAME']; - - // FIXME -- Add UNIQUE support - if (!isset($indexes[$name])) { - $indexes[$name] = new Index($name); - $table->addIndex($indexes[$name]); - } - - $indexes[$name]->addColumn($table->getColumn($colName)); - } - } - - /** - * Loads the primary key for this table. - */ - protected function addPrimaryKey(Table $table) - { - $stmt = $this->dbh->query("SELECT COLUMN_NAME - FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS - INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ON - INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME = INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE.constraint_name - WHERE (INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'PRIMARY KEY') AND - (INFORMATION_SCHEMA.TABLE_CONSTRAINTS.TABLE_NAME = '".$table->getName()."')"); - - // Loop through the returned results, grouping the same key_name together - // adding each column for that key. - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $name = $row[0]; - $table->getColumn($name)->setPrimaryKey(true); - } - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/reverse/mysql/MysqlSchemaParser.php b/airtime_mvc/library/propel/generator/lib/reverse/mysql/MysqlSchemaParser.php deleted file mode 100644 index e88f5634e2..0000000000 --- a/airtime_mvc/library/propel/generator/lib/reverse/mysql/MysqlSchemaParser.php +++ /dev/null @@ -1,340 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.generator.reverse.mysql - */ -class MysqlSchemaParser extends BaseSchemaParser -{ - - /** - * @var boolean - */ - private $addVendorInfo = false; - - /** - * Map MySQL native types to Propel types. - * @var array - */ - private static $mysqlTypeMap = array( - 'tinyint' => PropelTypes::TINYINT, - 'smallint' => PropelTypes::SMALLINT, - 'mediumint' => PropelTypes::SMALLINT, - 'int' => PropelTypes::INTEGER, - 'integer' => PropelTypes::INTEGER, - 'bigint' => PropelTypes::BIGINT, - 'int24' => PropelTypes::BIGINT, - 'real' => PropelTypes::REAL, - 'float' => PropelTypes::FLOAT, - 'decimal' => PropelTypes::DECIMAL, - 'numeric' => PropelTypes::NUMERIC, - 'double' => PropelTypes::DOUBLE, - 'char' => PropelTypes::CHAR, - 'varchar' => PropelTypes::VARCHAR, - 'date' => PropelTypes::DATE, - 'time' => PropelTypes::TIME, - 'year' => PropelTypes::INTEGER, - 'datetime' => PropelTypes::TIMESTAMP, - 'timestamp' => PropelTypes::TIMESTAMP, - 'tinyblob' => PropelTypes::BINARY, - 'blob' => PropelTypes::BLOB, - 'mediumblob' => PropelTypes::BLOB, - 'longblob' => PropelTypes::BLOB, - 'longtext' => PropelTypes::CLOB, - 'tinytext' => PropelTypes::VARCHAR, - 'mediumtext' => PropelTypes::LONGVARCHAR, - 'text' => PropelTypes::LONGVARCHAR, - 'enum' => PropelTypes::CHAR, - 'set' => PropelTypes::CHAR, - ); - - /** - * Gets a type mapping from native types to Propel types - * - * @return array - */ - protected function getTypeMapping() - { - return self::$mysqlTypeMap; - } - - /** - * - */ - public function parse(Database $database, PDOTask $task = null) - { - $this->addVendorInfo = $this->getGeneratorConfig()->getBuildProperty('addVendorInfo'); - - $stmt = $this->dbh->query("SHOW TABLES"); - - // First load the tables (important that this happen before filling out details of tables) - $tables = array(); - $task->log("Reverse Engineering Tables"); - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $name = $row[0]; - $task->log(" Adding table '" . $name . "'"); - $table = new Table($name); - $database->addTable($table); - $tables[] = $table; - } - - // Now populate only columns. - $task->log("Reverse Engineering Columns"); - foreach ($tables as $table) { - $task->log(" Adding columns for table '" . $table->getName() . "'"); - $this->addColumns($table); - } - - // Now add indices and constraints. - $task->log("Reverse Engineering Indices And Constraints"); - foreach ($tables as $table) { - $task->log(" Adding indices and constraints for table '" . $table->getName() . "'"); - $this->addForeignKeys($table); - $this->addIndexes($table); - $this->addPrimaryKey($table); - if ($this->addVendorInfo) { - $this->addTableVendorInfo($table); - } - } - - return count($tables); - } - - - /** - * Adds Columns to the specified table. - * - * @param Table $table The Table model class to add columns to. - */ - protected function addColumns(Table $table) - { - $stmt = $this->dbh->query("SHOW COLUMNS FROM `" . $table->getName() . "`"); - - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - - $name = $row['Field']; - $is_nullable = ($row['Null'] == 'YES'); - $autoincrement = (strpos($row['Extra'], 'auto_increment') !== false); - $size = null; - $precision = null; - $scale = null; - - if (preg_match('/^(\w+)[\(]?([\d,]*)[\)]?( |$)/', $row['Type'], $matches)) { - // colname[1] size/precision[2] - $nativeType = $matches[1]; - if ($matches[2]) { - if ( ($cpos = strpos($matches[2], ',')) !== false) { - $size = (int) substr($matches[2], 0, $cpos); - $precision = $size; - $scale = (int) substr($matches[2], $cpos + 1); - } else { - $size = (int) $matches[2]; - } - } - } elseif (preg_match('/^(\w+)\(/', $row['Type'], $matches)) { - $nativeType = $matches[1]; - } else { - $nativeType = $row['Type']; - } - - //BLOBs can't have any default values in MySQL - $default = preg_match('~blob|text~', $nativeType) ? null : $row['Default']; - - $propelType = $this->getMappedPropelType($nativeType); - if (!$propelType) { - $propelType = Column::DEFAULT_TYPE; - $this->warn("Column [" . $table->getName() . "." . $name. "] has a column type (".$nativeType.") that Propel does not support."); - } - - $column = new Column($name); - $column->setTable($table); - $column->setDomainForType($propelType); - // We may want to provide an option to include this: - // $column->getDomain()->replaceSqlType($type); - $column->getDomain()->replaceSize($size); - $column->getDomain()->replaceScale($scale); - if ($default !== null) { - if (in_array($default, array('CURRENT_TIMESTAMP'))) { - $type = ColumnDefaultValue::TYPE_EXPR; - } else { - $type = ColumnDefaultValue::TYPE_VALUE; - } - $column->getDomain()->setDefaultValue(new ColumnDefaultValue($default, $type)); - } - $column->setAutoIncrement($autoincrement); - $column->setNotNull(!$is_nullable); - - if ($this->addVendorInfo) { - $vi = $this->getNewVendorInfoObject($row); - $column->addVendorInfo($vi); - } - - $table->addColumn($column); - } - - - } // addColumn() - - /** - * Load foreign keys for this table. - */ - protected function addForeignKeys(Table $table) - { - $database = $table->getDatabase(); - - $stmt = $this->dbh->query("SHOW CREATE TABLE `" . $table->getName(). "`"); - $row = $stmt->fetch(PDO::FETCH_NUM); - - $foreignKeys = array(); // local store to avoid duplicates - - // Get the information on all the foreign keys - $regEx = '/CONSTRAINT `([^`]+)` FOREIGN KEY \((.+)\) REFERENCES `([^`]*)` \((.+)\)(.*)/'; - if (preg_match_all($regEx,$row[1],$matches)) { - $tmpArray = array_keys($matches[0]); - foreach ($tmpArray as $curKey) { - $name = $matches[1][$curKey]; - $rawlcol = $matches[2][$curKey]; - $ftbl = $matches[3][$curKey]; - $rawfcol = $matches[4][$curKey]; - $fkey = $matches[5][$curKey]; - - $lcols = array(); - foreach(preg_split('/`, `/', $rawlcol) as $piece) { - $lcols[] = trim($piece, '` '); - } - - $fcols = array(); - foreach(preg_split('/`, `/', $rawfcol) as $piece) { - $fcols[] = trim($piece, '` '); - } - - //typical for mysql is RESTRICT - $fkactions = array( - 'ON DELETE' => ForeignKey::RESTRICT, - 'ON UPDATE' => ForeignKey::RESTRICT, - ); - - if ($fkey) { - //split foreign key information -> search for ON DELETE and afterwords for ON UPDATE action - foreach (array_keys($fkactions) as $fkaction) { - $result = NULL; - preg_match('/' . $fkaction . ' (' . ForeignKey::CASCADE . '|' . ForeignKey::SETNULL . ')/', $fkey, $result); - if ($result && is_array($result) && isset($result[1])) { - $fkactions[$fkaction] = $result[1]; - } - } - } - - $localColumns = array(); - $foreignColumns = array(); - - $foreignTable = $database->getTable($ftbl); - - foreach($fcols as $fcol) { - $foreignColumns[] = $foreignTable->getColumn($fcol); - } - foreach($lcols as $lcol) { - $localColumns[] = $table->getColumn($lcol); - } - - if (!isset($foreignKeys[$name])) { - $fk = new ForeignKey($name); - $fk->setForeignTableName($foreignTable->getName()); - $fk->setOnDelete($fkactions['ON DELETE']); - $fk->setOnUpdate($fkactions['ON UPDATE']); - $table->addForeignKey($fk); - $foreignKeys[$name] = $fk; - } - - for($i=0; $i < count($localColumns); $i++) { - $foreignKeys[$name]->addReference($localColumns[$i], $foreignColumns[$i]); - } - - } - - } - - } - - /** - * Load indexes for this table - */ - protected function addIndexes(Table $table) - { - $stmt = $this->dbh->query("SHOW INDEX FROM `" . $table->getName() . "`"); - - // Loop through the returned results, grouping the same key_name together - // adding each column for that key. - - $indexes = array(); - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - $colName = $row["Column_name"]; - $name = $row["Key_name"]; - - if ($name == "PRIMARY") { - continue; - } - - if (!isset($indexes[$name])) { - $isUnique = ($row["Non_unique"] == 0); - if ($isUnique) { - $indexes[$name] = new Unique($name); - } else { - $indexes[$name] = new Index($name); - } - if ($this->addVendorInfo) { - $vi = $this->getNewVendorInfoObject($row); - $indexes[$name]->addVendorInfo($vi); - } - $table->addIndex($indexes[$name]); - } - - $indexes[$name]->addColumn($table->getColumn($colName)); - } - } - - /** - * Loads the primary key for this table. - */ - protected function addPrimaryKey(Table $table) - { - $stmt = $this->dbh->query("SHOW KEYS FROM `" . $table->getName() . "`"); - - // Loop through the returned results, grouping the same key_name together - // adding each column for that key. - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - // Skip any non-primary keys. - if ($row['Key_name'] !== 'PRIMARY') { - continue; - } - $name = $row["Column_name"]; - $table->getColumn($name)->setPrimaryKey(true); - } - } - - /** - * Adds vendor-specific info for table. - * - * @param Table $table - */ - protected function addTableVendorInfo(Table $table) - { - $stmt = $this->dbh->query("SHOW TABLE STATUS LIKE '" . $table->getName() . "'"); - $row = $stmt->fetch(PDO::FETCH_ASSOC); - $vi = $this->getNewVendorInfoObject($row); - $table->addVendorInfo($vi); - } -} diff --git a/airtime_mvc/library/propel/generator/lib/reverse/oracle/OracleSchemaParser.php b/airtime_mvc/library/propel/generator/lib/reverse/oracle/OracleSchemaParser.php deleted file mode 100644 index 0e30a7c7d7..0000000000 --- a/airtime_mvc/library/propel/generator/lib/reverse/oracle/OracleSchemaParser.php +++ /dev/null @@ -1,249 +0,0 @@ - - * @author Guillermo Gutierrez (Adaptation) - * @version $Revision: 1612 $ - * @package propel.generator.reverse.oracle - */ -class OracleSchemaParser extends BaseSchemaParser -{ - - /** - * Map Oracle native types to Propel types. - * - * There really aren't any Oracle native types, so we're just - * using the MySQL ones here. - * - * Left as unsupported: - * BFILE, - * RAW, - * ROWID - * - * Supported but non existant as a specific type in Oracle: - * DECIMAL (NUMBER with scale), - * DOUBLE (FLOAT with precision = 126) - * - * @var array - */ - private static $oracleTypeMap = array( - 'BLOB' => PropelTypes::BLOB, - 'CHAR' => PropelTypes::CHAR, - 'CLOB' => PropelTypes::CLOB, - 'DATE' => PropelTypes::DATE, - 'DECIMAL' => PropelTypes::DECIMAL, - 'DOUBLE' => PropelTypes::DOUBLE, - 'FLOAT' => PropelTypes::FLOAT, - 'LONG' => PropelTypes::LONGVARCHAR, - 'NCHAR' => PropelTypes::CHAR, - 'NCLOB' => PropelTypes::CLOB, - 'NUMBER' => PropelTypes::BIGINT, - 'NVARCHAR2' => PropelTypes::VARCHAR, - 'TIMESTAMP' => PropelTypes::TIMESTAMP, - 'VARCHAR2' => PropelTypes::VARCHAR, - ); - - /** - * Gets a type mapping from native types to Propel types - * - * @return array - */ - protected function getTypeMapping() - { - return self::$oracleTypeMap; - } - - /** - * Searches for tables in the database. Maybe we want to search also the views. - * @param Database $database The Database model class to add tables to. - */ - public function parse(Database $database, PDOTask $task = null) - { - $tables = array(); - $stmt = $this->dbh->query("SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE'"); - - $task->log("Reverse Engineering Table Structures"); - // First load the tables (important that this happen before filling out details of tables) - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - if (strpos($row['OBJECT_NAME'], '$') !== false) { - // this is an Oracle internal table or materialized view - prune - continue; - } - $table = new Table($row['OBJECT_NAME']); - $task->log("Adding table '" . $table->getName() . "'"); - $database->addTable($table); - // Add columns, primary keys and indexes. - $this->addColumns($table); - $this->addPrimaryKey($table); - $this->addIndexes($table); - $tables[] = $table; - } - - $task->log("Reverse Engineering Foreign Keys"); - - foreach ($tables as $table) { - $task->log("Adding foreign keys for table '" . $table->getName() . "'"); - $this->addForeignKeys($table); - } - - return count($tables); - } - - /** - * Adds Columns to the specified table. - * - * @param Table $table The Table model class to add columns to. - */ - protected function addColumns(Table $table) - { - $stmt = $this->dbh->query("SELECT COLUMN_NAME, DATA_TYPE, NULLABLE, DATA_LENGTH, DATA_SCALE, DATA_DEFAULT FROM USER_TAB_COLS WHERE TABLE_NAME = '" . $table->getName() . "'"); - /* @var stmt PDOStatement */ - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - if (strpos($row['COLUMN_NAME'], '$') !== false) { - // this is an Oracle internal column - prune - continue; - } - $size = $row["DATA_LENGTH"]; - $scale = $row["DATA_SCALE"]; - $default = $row['DATA_DEFAULT']; - $type = $row["DATA_TYPE"]; - $isNullable = ($row['NULLABLE'] == 'Y'); - if ($type == "NUMBER" && $row["DATA_SCALE"] > 0) { - $type = "DECIMAL"; - } - if ($type == "FLOAT"&& $row["DATA_PRECISION"] == 126) { - $type = "DOUBLE"; - } - if (strpos($type, 'TIMESTAMP(') !== false) { - $type = substr($type, 0, strpos($type, '(')); - $default = "0000-00-00 00:00:00"; - $size = null; - $scale = null; - } - if ($type == "DATE") { - $default = "0000-00-00"; - $size = null; - $scale = null; - } - - $propelType = $this->getMappedPropelType($type); - if (!$propelType) { - $propelType = Column::DEFAULT_TYPE; - $this->warn("Column [" . $table->getName() . "." . $row['COLUMN_NAME']. "] has a column type (".$row["DATA_TYPE"].") that Propel does not support."); - } - - $column = new Column($row['COLUMN_NAME']); - $column->setPhpName(); // Prevent problems with strange col names - $column->setTable($table); - $column->setDomainForType($propelType); - $column->getDomain()->replaceSize($size); - $column->getDomain()->replaceScale($scale); - if ($default !== null) { - $column->getDomain()->setDefaultValue(new ColumnDefaultValue($default, ColumnDefaultValue::TYPE_VALUE)); - } - $column->setAutoIncrement(false); // Not yet supported - $column->setNotNull(!$isNullable); - $table->addColumn($column); - } - - } // addColumn() - - /** - * Adds Indexes to the specified table. - * - * @param Table $table The Table model class to add columns to. - */ - protected function addIndexes(Table $table) - { - $stmt = $this->dbh->query("SELECT COLUMN_NAME, INDEX_NAME FROM USER_IND_COLUMNS WHERE TABLE_NAME = '" . $table->getName() . "' ORDER BY COLUMN_NAME"); - $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); - - $indices = array(); - foreach ($rows as $row) { - $indices[$row['INDEX_NAME']][]= $row['COLUMN_NAME']; - } - - foreach ($indices as $indexName => $columnNames) { - $index = new Index($indexName); - foreach($columnNames AS $columnName) { - // Oracle deals with complex indices using an internal reference, so... - // let's ignore this kind of index - if ($table->hasColumn($columnName)) { - $index->addColumn($table->getColumn($columnName)); - } - } - // since some of the columns are pruned above, we must only add an index if it has columns - if ($index->hasColumns()) { - $table->addIndex($index); - } - } - } - - /** - * Load foreign keys for this table. - * - * @param Table $table The Table model class to add FKs to - */ - protected function addForeignKeys(Table $table) - { - // local store to avoid duplicates - $foreignKeys = array(); - - $stmt = $this->dbh->query("SELECT CONSTRAINT_NAME, DELETE_RULE, R_CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'R' AND TABLE_NAME = '" . $table->getName(). "'"); - /* @var stmt PDOStatement */ - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - // Local reference - $stmt2 = $this->dbh->query("SELECT COLUMN_NAME FROM USER_CONS_COLUMNS WHERE CONSTRAINT_NAME = '".$row['CONSTRAINT_NAME']."' AND TABLE_NAME = '" . $table->getName(). "'"); - /* @var stmt2 PDOStatement */ - $localReferenceInfo = $stmt2->fetch(PDO::FETCH_ASSOC); - - // Foreign reference - $stmt2 = $this->dbh->query("SELECT TABLE_NAME, COLUMN_NAME FROM USER_CONS_COLUMNS WHERE CONSTRAINT_NAME = '".$row['R_CONSTRAINT_NAME']."'"); - $foreignReferenceInfo = $stmt2->fetch(PDO::FETCH_ASSOC); - - if (!isset($foreignKeys[$row["CONSTRAINT_NAME"]])) { - $fk = new ForeignKey($row["CONSTRAINT_NAME"]); - $fk->setForeignTableName($foreignReferenceInfo['TABLE_NAME']); - $onDelete = ($row["DELETE_RULE"] == 'NO ACTION') ? 'NONE' : $row["DELETE_RULE"]; - $fk->setOnDelete($onDelete); - $fk->setOnUpdate($onDelete); - $fk->addReference(array("local" => $localReferenceInfo['COLUMN_NAME'], "foreign" => $foreignReferenceInfo['COLUMN_NAME'])); - $table->addForeignKey($fk); - $foreignKeys[$row["CONSTRAINT_NAME"]] = $fk; - } - } - } - - /** - * Loads the primary key for this table. - * - * @param Table $table The Table model class to add PK to. - */ - protected function addPrimaryKey(Table $table) - { - $stmt = $this->dbh->query("SELECT COLS.COLUMN_NAME FROM USER_CONSTRAINTS CONS, USER_CONS_COLUMNS COLS WHERE CONS.CONSTRAINT_NAME = COLS.CONSTRAINT_NAME AND CONS.TABLE_NAME = '".$table->getName()."' AND CONS.CONSTRAINT_TYPE = 'P'"); - /* @var stmt PDOStatement */ - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - // This fixes a strange behavior by PDO. Sometimes the - // row values are inside an index 0 of an array - if (array_key_exists(0, $row)) { - $row = $row[0]; - } - $table->getColumn($row['COLUMN_NAME'])->setPrimaryKey(true); - } - } - -} - diff --git a/airtime_mvc/library/propel/generator/lib/reverse/pgsql/PgsqlSchemaParser.php b/airtime_mvc/library/propel/generator/lib/reverse/pgsql/PgsqlSchemaParser.php deleted file mode 100644 index 8acfb18856..0000000000 --- a/airtime_mvc/library/propel/generator/lib/reverse/pgsql/PgsqlSchemaParser.php +++ /dev/null @@ -1,548 +0,0 @@ - - * @version $Revision: 1667 $ - * @package propel.generator.reverse.pgsql - */ -class PgsqlSchemaParser extends BaseSchemaParser -{ - - /** - * Map PostgreSQL native types to Propel types. - * @var array - */ - /** Map MySQL native types to Propel (JDBC) types. */ - private static $pgsqlTypeMap = array( - 'bool' => PropelTypes::BOOLEAN, - 'boolean' => PropelTypes::BOOLEAN, - 'tinyint' => PropelTypes::TINYINT, - 'smallint' => PropelTypes::SMALLINT, - 'mediumint' => PropelTypes::SMALLINT, - 'int' => PropelTypes::INTEGER, - 'int4' => PropelTypes::INTEGER, - 'integer' => PropelTypes::INTEGER, - 'int8' => PropelTypes::BIGINT, - 'bigint' => PropelTypes::BIGINT, - 'int24' => PropelTypes::BIGINT, - 'real' => PropelTypes::REAL, - 'float' => PropelTypes::FLOAT, - 'decimal' => PropelTypes::DECIMAL, - 'numeric' => PropelTypes::NUMERIC, - 'double' => PropelTypes::DOUBLE, - 'char' => PropelTypes::CHAR, - 'varchar' => PropelTypes::VARCHAR, - 'date' => PropelTypes::DATE, - 'time' => PropelTypes::TIME, - 'timetz' => PropelTypes::TIME, - //'year' => PropelTypes::YEAR, PropelTypes::YEAR does not exist... does this need to be mapped to a different propel type? - 'datetime' => PropelTypes::TIMESTAMP, - 'timestamp' => PropelTypes::TIMESTAMP, - 'timestamptz' => PropelTypes::TIMESTAMP, - 'bytea' => PropelTypes::BLOB, - 'text' => PropelTypes::LONGVARCHAR, - ); - - /** - * Gets a type mapping from native types to Propel types - * - * @return array - */ - protected function getTypeMapping() - { - return self::$pgsqlTypeMap; - } - - /** - * - */ - public function parse(Database $database, PDOTask $task = null) - { - $stmt = $this->dbh->query("SELECT version() as ver"); - $nativeVersion = $stmt->fetchColumn(); - - if (!$nativeVersion) { - throw new EngineException("Failed to get database version"); - } - - $arrVersion = sscanf ($nativeVersion, '%*s %d.%d'); - $version = sprintf ("%d.%d", $arrVersion[0], $arrVersion[1]); - - // Clean up - $stmt = null; - - $stmt = $this->dbh->query("SELECT c.oid, - case when n.nspname='public' then c.relname else n.nspname||'.'||c.relname end as relname - FROM pg_class c join pg_namespace n on (c.relnamespace=n.oid) - WHERE c.relkind = 'r' - AND n.nspname NOT IN ('information_schema','pg_catalog') - AND n.nspname NOT LIKE 'pg_temp%' - AND n.nspname NOT LIKE 'pg_toast%' - ORDER BY relname"); - - $tableWraps = array(); - - // First load the tables (important that this happen before filling out details of tables) - $task->log("Reverse Engineering Tables"); - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - $name = $row['relname']; - $task->log(" Adding table '" . $name . "'"); - $oid = $row['oid']; - $table = new Table($name); - $database->addTable($table); - - // Create a wrapper to hold these tables and their associated OID - $wrap = new stdClass; - $wrap->table = $table; - $wrap->oid = $oid; - $tableWraps[] = $wrap; - } - - // Now populate only columns. - $task->log("Reverse Engineering Columns"); - foreach ($tableWraps as $wrap) { - $task->log(" Adding columns for table '" . $wrap->table->getName() . "'"); - $this->addColumns($wrap->table, $wrap->oid, $version); - } - - // Now add indexes and constraints. - $task->log("Reverse Engineering Indices And Constraints"); - foreach ($tableWraps as $wrap) { - $task->log(" Adding indices and constraints for table '" . $wrap->table->getName() . "'"); - $this->addForeignKeys($wrap->table, $wrap->oid, $version); - $this->addIndexes($wrap->table, $wrap->oid, $version); - $this->addPrimaryKey($wrap->table, $wrap->oid, $version); - } - - // TODO - Handle Sequences ... - - return count($tableWraps); - - } - - - /** - * Adds Columns to the specified table. - * - * @param Table $table The Table model class to add columns to. - * @param int $oid The table OID - * @param string $version The database version. - */ - protected function addColumns(Table $table, $oid, $version) - { - - // Get the columns, types, etc. - // Based on code from pgAdmin3 (http://www.pgadmin.org/) - $stmt = $this->dbh->prepare("SELECT - att.attname, - att.atttypmod, - att.atthasdef, - att.attnotnull, - def.adsrc, - CASE WHEN att.attndims > 0 THEN 1 ELSE 0 END AS isarray, - CASE - WHEN ty.typname = 'bpchar' - THEN 'char' - WHEN ty.typname = '_bpchar' - THEN '_char' - ELSE - ty.typname - END AS typname, - ty.typtype - FROM pg_attribute att - JOIN pg_type ty ON ty.oid=att.atttypid - LEFT OUTER JOIN pg_attrdef def ON adrelid=att.attrelid AND adnum=att.attnum - WHERE att.attrelid = ? AND att.attnum > 0 - AND att.attisdropped IS FALSE - ORDER BY att.attnum"); - - $stmt->bindValue(1, $oid, PDO::PARAM_INT); - $stmt->execute(); - - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - - $size = null; - $precision = null; - $scale = null; - - // Check to ensure that this column isn't an array data type - if (((int) $row['isarray']) === 1) { - throw new EngineException (sprintf ("Array datatypes are not currently supported [%s.%s]", $this->name, $row['attname'])); - } // if (((int) $row['isarray']) === 1) - - $name = $row['attname']; - - // If they type is a domain, Process it - if (strtolower ($row['typtype']) == 'd') { - $arrDomain = $this->processDomain ($row['typname']); - $type = $arrDomain['type']; - $size = $arrDomain['length']; - $precision = $size; - $scale = $arrDomain['scale']; - $boolHasDefault = (strlen (trim ($row['atthasdef'])) > 0) ? $row['atthasdef'] : $arrDomain['hasdefault']; - $default = (strlen (trim ($row['adsrc'])) > 0) ? $row['adsrc'] : $arrDomain['default']; - $is_nullable = (strlen (trim ($row['attnotnull'])) > 0) ? $row['attnotnull'] : $arrDomain['notnull']; - $is_nullable = (($is_nullable == 't') ? false : true); - } else { - $type = $row['typname']; - $arrLengthPrecision = $this->processLengthScale ($row['atttypmod'], $type); - $size = $arrLengthPrecision['length']; - $precision = $size; - $scale = $arrLengthPrecision['scale']; - $boolHasDefault = $row['atthasdef']; - $default = $row['adsrc']; - $is_nullable = (($row['attnotnull'] == 't') ? false : true); - } // else (strtolower ($row['typtype']) == 'd') - - $autoincrement = null; - - // if column has a default - if (($boolHasDefault == 't') && (strlen (trim ($default)) > 0)) { - if (!preg_match('/^nextval\(/', $default)) { - $strDefault= preg_replace ('/::[\W\D]*/', '', $default); - $default = str_replace ("'", '', $strDefault); - } else { - $autoincrement = true; - $default = null; - } - } else { - $default = null; - } - - $propelType = $this->getMappedPropelType($type); - if (!$propelType) { - $propelType = Column::DEFAULT_TYPE; - $this->warn("Column [" . $table->getName() . "." . $name. "] has a column type (".$type.") that Propel does not support."); - } - - $column = new Column($name); - $column->setTable($table); - $column->setDomainForType($propelType); - // We may want to provide an option to include this: - // $column->getDomain()->replaceSqlType($type); - $column->getDomain()->replaceSize($size); - $column->getDomain()->replaceScale($scale); - if ($default !== null) { - if (in_array($default, array('now()'))) { - $type = ColumnDefaultValue::TYPE_EXPR; - } else { - $type = ColumnDefaultValue::TYPE_VALUE; - } - $column->getDomain()->setDefaultValue(new ColumnDefaultValue($default, $type)); - } - $column->setAutoIncrement($autoincrement); - $column->setNotNull(!$is_nullable); - - $table->addColumn($column); - } - - - } // addColumn() - - private function processLengthScale($intTypmod, $strName) - { - // Define the return array - $arrRetVal = array ('length'=>null, 'scale'=>null); - - // Some datatypes don't have a Typmod - if ($intTypmod == -1) - { - return $arrRetVal; - } // if ($intTypmod == -1) - - // Numeric Datatype? - if ($strName == $this->getMappedNativeType(PropelTypes::NUMERIC)) { - $intLen = ($intTypmod - 4) >> 16; - $intPrec = ($intTypmod - 4) & 0xffff; - $intLen = sprintf ("%ld", $intLen); - if ($intPrec) - { - $intPrec = sprintf ("%ld", $intPrec); - } // if ($intPrec) - $arrRetVal['length'] = $intLen; - $arrRetVal['scale'] = $intPrec; - } // if ($strName == $this->getMappedNativeType(PropelTypes::NUMERIC)) - elseif ($strName == $this->getMappedNativeType(PropelTypes::TIME) || $strName == 'timetz' - || $strName == $this->getMappedNativeType(PropelTypes::TIMESTAMP) || $strName == 'timestamptz' - || $strName == 'interval' || $strName == 'bit') - { - $arrRetVal['length'] = sprintf ("%ld", $intTypmod); - } // elseif (TIME, TIMESTAMP, INTERVAL, BIT) - else - { - $arrRetVal['length'] = sprintf ("%ld", ($intTypmod - 4)); - } // else - return $arrRetVal; - } // private function processLengthScale ($intTypmod, $strName) - - private function processDomain($strDomain) - { - if (strlen(trim ($strDomain)) < 1) { - throw new EngineException ("Invalid domain name [" . $strDomain . "]"); - } - - $stmt = $this->dbh->prepare("SELECT - d.typname as domname, - b.typname as basetype, - d.typlen, - d.typtypmod, - d.typnotnull, - d.typdefault - FROM pg_type d - INNER JOIN pg_type b ON b.oid = CASE WHEN d.typndims > 0 then d.typelem ELSE d.typbasetype END - WHERE - d.typtype = 'd' - AND d.typname = ? - ORDER BY d.typname"); - $stmt->bindValue(1, $strDomain); - $stmt->execute(); - - $row = $stmt->fetch(PDO::FETCH_ASSOC); - if (!$row) { - throw new EngineException ("Domain [" . $strDomain . "] not found."); - } - - $arrDomain = array (); - $arrDomain['type'] = $row['basetype']; - $arrLengthPrecision = $this->processLengthScale($row['typtypmod'], $row['basetype']); - $arrDomain['length'] = $arrLengthPrecision['length']; - $arrDomain['scale'] = $arrLengthPrecision['scale']; - $arrDomain['notnull'] = $row['typnotnull']; - $arrDomain['default'] = $row['typdefault']; - $arrDomain['hasdefault'] = (strlen (trim ($row['typdefault'])) > 0) ? 't' : 'f'; - - $stmt = null; // cleanup - return $arrDomain; - } // private function processDomain($strDomain) - - /** - * Load foreign keys for this table. - */ - protected function addForeignKeys(Table $table, $oid, $version) - { - $database = $table->getDatabase(); - $stmt = $this->dbh->prepare("SELECT - conname, - confupdtype, - confdeltype, - CASE nl.nspname WHEN 'public' THEN cl.relname ELSE nl.nspname||'.'||cl.relname END as fktab, - a2.attname as fkcol, - CASE nr.nspname WHEN 'public' THEN cr.relname ELSE nr.nspname||'.'||cr.relname END as reftab, - a1.attname as refcol - FROM pg_constraint ct - JOIN pg_class cl ON cl.oid=conrelid - JOIN pg_class cr ON cr.oid=confrelid - JOIN pg_namespace nl ON nl.oid = cl.relnamespace - JOIN pg_namespace nr ON nr.oid = cr.relnamespace - LEFT JOIN pg_catalog.pg_attribute a1 ON a1.attrelid = ct.confrelid - LEFT JOIN pg_catalog.pg_attribute a2 ON a2.attrelid = ct.conrelid - WHERE - contype='f' - AND conrelid = ? - AND a2.attnum = ct.conkey[1] - AND a1.attnum = ct.confkey[1] - ORDER BY conname"); - $stmt->bindValue(1, $oid); - $stmt->execute(); - - $foreignKeys = array(); // local store to avoid duplicates - - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - - $name = $row['conname']; - $local_table = $row['fktab']; - $local_column = $row['fkcol']; - $foreign_table = $row['reftab']; - $foreign_column = $row['refcol']; - - // On Update - switch ($row['confupdtype']) { - case 'c': - $onupdate = ForeignKey::CASCADE; break; - case 'd': - $onupdate = ForeignKey::SETDEFAULT; break; - case 'n': - $onupdate = ForeignKey::SETNULL; break; - case 'r': - $onupdate = ForeignKey::RESTRICT; break; - default: - case 'a': - //NOACTION is the postgresql default - $onupdate = ForeignKey::NONE; break; - } - // On Delete - switch ($row['confdeltype']) { - case 'c': - $ondelete = ForeignKey::CASCADE; break; - case 'd': - $ondelete = ForeignKey::SETDEFAULT; break; - case 'n': - $ondelete = ForeignKey::SETNULL; break; - case 'r': - $ondelete = ForeignKey::RESTRICT; break; - default: - case 'a': - //NOACTION is the postgresql default - $ondelete = ForeignKey::NONE; break; - } - - $foreignTable = $database->getTable($foreign_table); - $foreignColumn = $foreignTable->getColumn($foreign_column); - - $localTable = $database->getTable($local_table); - $localColumn = $localTable->getColumn($local_column); - - if (!isset($foreignKeys[$name])) { - $fk = new ForeignKey($name); - $fk->setForeignTableName($foreignTable->getName()); - $fk->setOnDelete($ondelete); - $fk->setOnUpdate($onupdate); - $table->addForeignKey($fk); - $foreignKeys[$name] = $fk; - } - - $foreignKeys[$name]->addReference($localColumn, $foreignColumn); - } - } - - /** - * Load indexes for this table - */ - protected function addIndexes(Table $table, $oid, $version) - { - $stmt = $this->dbh->prepare("SELECT - DISTINCT ON(cls.relname) - cls.relname as idxname, - indkey, - indisunique - FROM pg_index idx - JOIN pg_class cls ON cls.oid=indexrelid - WHERE indrelid = ? AND NOT indisprimary - ORDER BY cls.relname"); - - $stmt->bindValue(1, $oid); - $stmt->execute(); - - $stmt2 = $this->dbh->prepare("SELECT a.attname - FROM pg_catalog.pg_class c JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid - WHERE c.oid = ? AND a.attnum = ? AND NOT a.attisdropped - ORDER BY a.attnum"); - - $indexes = array(); - - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - $name = $row["idxname"]; - $unique = ($row["indisunique"] == 't') ? true : false; - if (!isset($indexes[$name])) { - if ($unique) { - $indexes[$name] = new Unique($name); - } else { - $indexes[$name] = new Index($name); - } - $table->addIndex($indexes[$name]); - } - - $arrColumns = explode (' ', $row['indkey']); - foreach ($arrColumns as $intColNum) - { - $stmt2->bindValue(1, $oid); - $stmt2->bindValue(2, $intColNum); - $stmt2->execute(); - - $row2 = $stmt2->fetch(PDO::FETCH_ASSOC); - - $indexes[$name]->addColumn($table->getColumn($row2['attname'])); - - } // foreach ($arrColumns as $intColNum) - - } - - } - - /** - * Loads the primary key for this table. - */ - protected function addPrimaryKey(Table $table, $oid, $version) - { - - $stmt = $this->dbh->prepare("SELECT - DISTINCT ON(cls.relname) - cls.relname as idxname, - indkey, - indisunique - FROM pg_index idx - JOIN pg_class cls ON cls.oid=indexrelid - WHERE indrelid = ? AND indisprimary - ORDER BY cls.relname"); - $stmt->bindValue(1, $oid); - $stmt->execute(); - - // Loop through the returned results, grouping the same key_name together - // adding each column for that key. - - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - $arrColumns = explode (' ', $row['indkey']); - foreach ($arrColumns as $intColNum) { - $stmt2 = $this->dbh->prepare("SELECT a.attname - FROM pg_catalog.pg_class c JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid - WHERE c.oid = ? AND a.attnum = ? AND NOT a.attisdropped - ORDER BY a.attnum"); - $stmt2->bindValue(1, $oid); - $stmt2->bindValue(2, $intColNum); - $stmt2->execute(); - - $row2 = $stmt2->fetch(PDO::FETCH_ASSOC); - $table->getColumn($row2['attname'])->setPrimaryKey(true); - - } // foreach ($arrColumns as $intColNum) - } - - } - - /** - * Adds the sequences for this database. - * - * @return void - * @throws SQLException - */ - protected function addSequences(Database $database) - { - /* - -- WE DON'T HAVE ANY USE FOR THESE YET IN REVERSE ENGINEERING ... - $this->sequences = array(); - $result = pg_query($this->conn->getResource(), "SELECT c.oid, - case when n.nspname='public' then c.relname else n.nspname||'.'||c.relname end as relname - FROM pg_class c join pg_namespace n on (c.relnamespace=n.oid) - WHERE c.relkind = 'S' - AND n.nspname NOT IN ('information_schema','pg_catalog') - AND n.nspname NOT LIKE 'pg_temp%' - AND n.nspname NOT LIKE 'pg_toast%' - ORDER BY relname"); - - if (!$result) { - throw new SQLException("Could not list sequences", pg_last_error($this->dblink)); - } - - while ($row = pg_fetch_assoc($result)) { - // FIXME -- decide what info we need for sequences & then create a SequenceInfo object (if needed) - $obj = new stdClass; - $obj->name = $row['relname']; - $obj->oid = $row['oid']; - $this->sequences[strtoupper($row['relname'])] = $obj; - } - */ - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/reverse/sqlite/SqliteSchemaParser.php b/airtime_mvc/library/propel/generator/lib/reverse/sqlite/SqliteSchemaParser.php deleted file mode 100644 index 518d0d049d..0000000000 --- a/airtime_mvc/library/propel/generator/lib/reverse/sqlite/SqliteSchemaParser.php +++ /dev/null @@ -1,195 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.generator.reverse.sqlite - */ -class SqliteSchemaParser extends BaseSchemaParser -{ - - /** - * Map Sqlite native types to Propel types. - * - * There really aren't any SQLite native types, so we're just - * using the MySQL ones here. - * - * @var array - */ - private static $sqliteTypeMap = array( - 'tinyint' => PropelTypes::TINYINT, - 'smallint' => PropelTypes::SMALLINT, - 'mediumint' => PropelTypes::SMALLINT, - 'int' => PropelTypes::INTEGER, - 'integer' => PropelTypes::INTEGER, - 'bigint' => PropelTypes::BIGINT, - 'int24' => PropelTypes::BIGINT, - 'real' => PropelTypes::REAL, - 'float' => PropelTypes::FLOAT, - 'decimal' => PropelTypes::DECIMAL, - 'numeric' => PropelTypes::NUMERIC, - 'double' => PropelTypes::DOUBLE, - 'char' => PropelTypes::CHAR, - 'varchar' => PropelTypes::VARCHAR, - 'date' => PropelTypes::DATE, - 'time' => PropelTypes::TIME, - 'year' => PropelTypes::INTEGER, - 'datetime' => PropelTypes::TIMESTAMP, - 'timestamp' => PropelTypes::TIMESTAMP, - 'tinyblob' => PropelTypes::BINARY, - 'blob' => PropelTypes::BLOB, - 'mediumblob' => PropelTypes::BLOB, - 'longblob' => PropelTypes::BLOB, - 'longtext' => PropelTypes::CLOB, - 'tinytext' => PropelTypes::VARCHAR, - 'mediumtext' => PropelTypes::LONGVARCHAR, - 'text' => PropelTypes::LONGVARCHAR, - 'enum' => PropelTypes::CHAR, - 'set' => PropelTypes::CHAR, - ); - - /** - * Gets a type mapping from native types to Propel types - * - * @return array - */ - protected function getTypeMapping() - { - return self::$sqliteTypeMap; - } - - /** - * - */ - public function parse(Database $database, PDOTask $task = null) - { - $stmt = $this->dbh->query("SELECT name FROM sqlite_master WHERE type='table' UNION ALL SELECT name FROM sqlite_temp_master WHERE type='table' ORDER BY name;"); - - // First load the tables (important that this happen before filling out details of tables) - $tables = array(); - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $name = $row[0]; - $table = new Table($name); - $database->addTable($table); - $tables[] = $table; - } - - // Now populate only columns. - foreach ($tables as $table) { - $this->addColumns($table); - } - - // Now add indexes and constraints. - foreach ($tables as $table) { - $this->addIndexes($table); - } - - return count($tables); - - } - - - /** - * Adds Columns to the specified table. - * - * @param Table $table The Table model class to add columns to. - * @param int $oid The table OID - * @param string $version The database version. - */ - protected function addColumns(Table $table) - { - $stmt = $this->dbh->query("PRAGMA table_info('" . $table->getName() . "')"); - - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - - $name = $row['name']; - - $fulltype = $row['type']; - $size = null; - $precision = null; - $scale = null; - - if (preg_match('/^([^\(]+)\(\s*(\d+)\s*,\s*(\d+)\s*\)$/', $fulltype, $matches)) { - $type = $matches[1]; - $precision = $matches[2]; - $scale = $matches[3]; // aka precision - } elseif (preg_match('/^([^\(]+)\(\s*(\d+)\s*\)$/', $fulltype, $matches)) { - $type = $matches[1]; - $size = $matches[2]; - } else { - $type = $fulltype; - } - // If column is primary key and of type INTEGER, it is auto increment - // See: http://sqlite.org/faq.html#q1 - $autoincrement = ($row['pk'] == 1 && strtolower($type) == 'integer'); - $not_null = $row['notnull']; - $default = $row['dflt_value']; - - - $propelType = $this->getMappedPropelType($type); - if (!$propelType) { - $propelType = Column::DEFAULT_TYPE; - $this->warn("Column [" . $table->getName() . "." . $name. "] has a column type (".$type.") that Propel does not support."); - } - - $column = new Column($name); - $column->setTable($table); - $column->setDomainForType($propelType); - // We may want to provide an option to include this: - // $column->getDomain()->replaceSqlType($type); - $column->getDomain()->replaceSize($size); - $column->getDomain()->replaceScale($scale); - if ($default !== null) { - $column->getDomain()->setDefaultValue(new ColumnDefaultValue($default, ColumnDefaultValue::TYPE_VALUE)); - } - $column->setAutoIncrement($autoincrement); - $column->setNotNull($not_null); - - - if (($row['pk'] == 1) || (strtolower($type) == 'integer')) { - $column->setPrimaryKey(true); - } - - $table->addColumn($column); - - } - - - } // addColumn() - - /** - * Load indexes for this table - */ - protected function addIndexes(Table $table) - { - $stmt = $this->dbh->query("PRAGMA index_list('" . $table->getName() . "')"); - - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - - $name = $row['name']; - $index = new Index($name); - - $stmt2 = $this->dbh->query("PRAGMA index_info('".$name."')"); - while ($row2 = $stmt2->fetch(PDO::FETCH_ASSOC)) { - $colname = $row2['name']; - $index->addColumn($table->getColumn($colname)); - } - - $table->addIndex($index); - - } - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/task/AbstractPropelDataModelTask.php b/airtime_mvc/library/propel/generator/lib/task/AbstractPropelDataModelTask.php deleted file mode 100644 index 597efff24c..0000000000 --- a/airtime_mvc/library/propel/generator/lib/task/AbstractPropelDataModelTask.php +++ /dev/null @@ -1,593 +0,0 @@ - (Propel) - * @author Jason van Zyl (Torque) - * @author Daniel Rall (Torque) - * @package propel.generator.task - */ -abstract class AbstractPropelDataModelTask extends Task -{ - - /** - * Fileset of XML schemas which represent our data models. - * @var array Fileset[] - */ - protected $schemaFilesets = array(); - - /** - * Data models that we collect. One from each XML schema file. - */ - protected $dataModels = array(); - - /** - * Have datamodels been initialized? - * @var boolean - */ - private $dataModelsLoaded = false; - - /** - * Map of data model name to database name. - * Should probably stick to the convention - * of them being the same but I know right now - * in a lot of cases they won't be. - */ - protected $dataModelDbMap; - - /** - * The target database(s) we are generating SQL - * for. Right now we can only deal with a single - * target, but we will support multiple targets - * soon. - */ - protected $targetDatabase; - - /** - * DB encoding to use for XmlToAppData object - */ - protected $dbEncoding = 'iso-8859-1'; - - /** - * Target PHP package to place the generated files in. - */ - protected $targetPackage; - - /** - * @var Mapper - */ - protected $mapperElement; - - /** - * Destination directory for results of template scripts. - * @var PhingFile - */ - protected $outputDirectory; - - /** - * Whether to package the datamodels or not - * @var PhingFile - */ - protected $packageObjectModel; - - /** - * Whether to perform validation (XSD) on the schema.xml file(s). - * @var boolean - */ - protected $validate; - - /** - * The XSD schema file to use for validation. - * @var PhingFile - */ - protected $xsdFile; - - /** - * XSL file to use to normalize (or otherwise transform) schema before validation. - * @var PhingFile - */ - protected $xslFile; - - /** - * Optional database connection url. - * @var string - */ - private $url = null; - - /** - * Optional database connection user name. - * @var string - */ - private $userId = null; - - /** - * Optional database connection password. - * @var string - */ - private $password = null; - - /** - * PDO Connection. - * @var PDO - */ - private $conn = false; - - /** - * An initialized GeneratorConfig object containing the converted Phing props. - * - * @var GeneratorConfig - */ - private $generatorConfig; - - /** - * Return the data models that have been - * processed. - * - * @return List data models - */ - public function getDataModels() - { - if (!$this->dataModelsLoaded) { - $this->loadDataModels(); - } - return $this->dataModels; - } - - /** - * Return the data model to database name map. - * - * @return Hashtable data model name to database name map. - */ - public function getDataModelDbMap() - { - if (!$this->dataModelsLoaded) { - $this->loadDataModels(); - } - return $this->dataModelDbMap; - } - - /** - * Adds a set of xml schema files (nested fileset attribute). - * - * @param set a Set of xml schema files - */ - public function addSchemaFileset(Fileset $set) - { - $this->schemaFilesets[] = $set; - } - - /** - * Get the current target database. - * - * @return String target database(s) - */ - public function getTargetDatabase() - { - return $this->targetDatabase; - } - - /** - * Set the current target database. (e.g. mysql, oracle, ..) - * - * @param v target database(s) - */ - public function setTargetDatabase($v) - { - $this->targetDatabase = $v; - } - - /** - * Get the current target package. - * - * @return string target PHP package. - */ - public function getTargetPackage() - { - return $this->targetPackage; - } - - /** - * Set the current target package. This is where generated PHP classes will - * live. - * - * @param string $v target PHP package. - */ - public function setTargetPackage($v) - { - $this->targetPackage = $v; - } - - /** - * Set the packageObjectModel switch on/off - * - * @param string $v The build.property packageObjectModel - */ - public function setPackageObjectModel($v) - { - $this->packageObjectModel = ($v === '1' ? true : false); - } - - /** - * Set whether to perform validation on the datamodel schema.xml file(s). - * @param boolean $v - */ - public function setValidate($v) - { - $this->validate = $v; - } - - /** - * Set the XSD schema to use for validation of any datamodel schema.xml file(s). - * @param $v PhingFile - */ - public function setXsd(PhingFile $v) - { - $this->xsdFile = $v; - } - - /** - * Set the normalization XSLT to use to transform datamodel schema.xml file(s) before validation and parsing. - * @param $v PhingFile - */ - public function setXsl(PhingFile $v) - { - $this->xslFile = $v; - } - - /** - * [REQUIRED] Set the output directory. It will be - * created if it doesn't exist. - * @param PhingFile $outputDirectory - * @return void - * @throws Exception - */ - public function setOutputDirectory(PhingFile $outputDirectory) { - try { - if (!$outputDirectory->exists()) { - $this->log("Output directory does not exist, creating: " . $outputDirectory->getPath(),Project::MSG_VERBOSE); - if (!$outputDirectory->mkdirs()) { - throw new IOException("Unable to create Ouptut directory: " . $outputDirectory->getAbsolutePath()); - } - } - $this->outputDirectory = $outputDirectory->getCanonicalPath(); - } catch (IOException $ioe) { - throw new BuildException($ioe); - } - } - - /** - * Set the current target database encoding. - * - * @param v target database encoding - */ - public function setDbEncoding($v) - { - $this->dbEncoding = $v; - } - - /** - * Set the DB connection url. - * - * @param string $url connection url - */ - public function setUrl($url) - { - $this->url = $url; - } - - /** - * Set the user name for the DB connection. - * - * @param string $userId database user - */ - public function setUserid($userId) - { - $this->userId = $userId; - } - - /** - * Set the password for the DB connection. - * - * @param string $password database password - */ - public function setPassword($password) - { - $this->password = $password; - } - - /** - * Get the output directory. - * @return string - */ - public function getOutputDirectory() { - return $this->outputDirectory; - } - - /** - * Nested creator, creates one Mapper for this task. - * - * @return Mapper The created Mapper type object. - * @throws BuildException - */ - public function createMapper() { - if ($this->mapperElement !== null) { - throw new BuildException("Cannot define more than one mapper.", $this->location); - } - $this->mapperElement = new Mapper($this->project); - return $this->mapperElement; - } - - /** - * Maps the passed in name to a new filename & returns resolved File object. - * @param string $from - * @return PhingFile Resolved File object. - * @throws BuilException - if no Mapper element se - * - if unable to map new filename. - */ - protected function getMappedFile($from) - { - if (!$this->mapperElement) { - throw new BuildException("This task requires you to use a element to describe how filename changes should be handled."); - } - - $mapper = $this->mapperElement->getImplementation(); - $mapped = $mapper->main($from); - if (!$mapped) { - throw new BuildException("Cannot create new filename based on: " . $from); - } - // Mappers always return arrays since it's possible for some mappers to map to multiple names. - $outFilename = array_shift($mapped); - $outFile = new PhingFile($this->getOutputDirectory(), $outFilename); - return $outFile; - } - - /** - * Gets the PDO connection, if URL specified. - * @return PDO Connection to use (for quoting, Platform class, etc.) or NULL if no connection params were specified. - */ - public function getConnection() - { - if ($this->conn === false) { - $this->conn = null; - if ($this->url) { - $buf = "Using database settings:\n" - . " URL: " . $this->url . "\n" - . ($this->userId ? " user: " . $this->userId . "\n" : "") - . ($this->password ? " password: " . $this->password . "\n" : ""); - - $this->log($buf, Project::MSG_VERBOSE); - - // Set user + password to null if they are empty strings - if (!$this->userId) { $this->userId = null; } - if (!$this->password) { $this->password = null; } - try { - $this->conn = new PDO($this->url, $this->userId, $this->password); - $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - } catch (PDOException $x) { - $this->log("Unable to create a PDO connection: " . $x->getMessage(), Project::MSG_WARN); - } - } - } - return $this->conn; - } - - /** - * Gets all matching XML schema files and loads them into data models for class. - * @return void - */ - protected function loadDataModels() - { - $ads = array(); - - // Get all matched files from schemaFilesets - foreach ($this->schemaFilesets as $fs) { - $ds = $fs->getDirectoryScanner($this->project); - $srcDir = $fs->getDir($this->project); - - $dataModelFiles = $ds->getIncludedFiles(); - - $platform = $this->getGeneratorConfig()->getConfiguredPlatform(); - - // Make a transaction for each file - foreach ($dataModelFiles as $dmFilename) { - - $this->log("Processing: ".$dmFilename); - $xmlFile = new PhingFile($srcDir, $dmFilename); - - $dom = new DomDocument('1.0', 'UTF-8'); - $dom->load($xmlFile->getAbsolutePath()); - - // modify schema to include any external schemas (and remove the external-schema nodes) - $this->includeExternalSchemas($dom, $srcDir); - - // normalize (or transform) the XML document using XSLT - if ($this->getGeneratorConfig()->getBuildProperty('schemaTransform') && $this->xslFile) { - $this->log("Transforming " . $xmlFile->getPath() . " using stylesheet " . $this->xslFile->getPath(), Project::MSG_VERBOSE); - if (!class_exists('XSLTProcessor')) { - $this->log("Could not perform XLST transformation. Make sure PHP has been compiled/configured to support XSLT.", Project::MSG_ERR); - } else { - // normalize the document using normalizer stylesheet - $xslDom = new DomDocument('1.0', 'UTF-8'); - $xslDom->load($this->xslFile->getAbsolutePath()); - $xsl = new XsltProcessor(); - $xsl->importStyleSheet($xslDom); - $dom = $xsl->transformToDoc($dom); - } - } - - // validate the XML document using XSD schema - if ($this->validate && $this->xsdFile) { - $this->log("Validating XML doc (".$xmlFile->getPath().") using schema file " . $this->xsdFile->getPath(), Project::MSG_VERBOSE); - if (!$dom->schemaValidate($this->xsdFile->getAbsolutePath())) { - throw new EngineException("XML schema file (".$xmlFile->getPath().") does not validate. See warnings above for reasons validation failed (make sure error_reporting is set to show E_WARNING if you don't see any).", $this->getLocation()); - } - } - - $xmlParser = new XmlToAppData($platform, $this->getTargetPackage(), $this->dbEncoding); - $ad = $xmlParser->parseString($dom->saveXML(), $xmlFile->getAbsolutePath()); - - $ad->setName($dmFilename); - $ads[] = $ad; - } - } - - if (empty($ads)) { - throw new BuildException("No schema files were found (matching your schema fileset definition)."); - } - - foreach ($ads as $ad) { - // map schema filename with database name - $this->dataModelDbMap[$ad->getName()] = $ad->getDatabase(null, false)->getName(); - } - - if (count($ads)>1 && $this->packageObjectModel) { - $ad = $this->joinDataModels($ads); - $this->dataModels = array($ad); - } else { - $this->dataModels = $ads; - } - - foreach ($this->dataModels as &$ad) { - $ad->doFinalInitialization(); - } - - $this->dataModelsLoaded = true; - } - - /** - * Replaces all external-schema nodes with the content of xml schema that node refers to - * - * Recurses to include any external schema referenced from in an included xml (and deeper) - * Note: this function very much assumes at least a reasonable XML schema, maybe it'll proof - * users don't have those and adding some more informative exceptions would be better - * - * @param DomDocument $dom - * @param string $srcDir - * @return void (objects, DomDocument, are references by default in PHP 5, so returning it is useless) - **/ - protected function includeExternalSchemas(DomDocument $dom, $srcDir) { - $databaseNode = $dom->getElementsByTagName("database")->item(0); - $externalSchemaNodes = $dom->getElementsByTagName("external-schema"); - $fs = FileSystem::getFileSystem(); - $nbIncludedSchemas = 0; - while ($externalSchema = $externalSchemaNodes->item(0)) { - $include = $externalSchema->getAttribute("filename"); - $this->log("Processing external schema: ".$include); - $externalSchema->parentNode->removeChild($externalSchema); - if ($fs->prefixLength($include) != 0) { - $externalSchemaFile = new PhingFile($include); - } else { - $externalSchemaFile = new PhingFile($srcDir, $include); - } - $externalSchemaDom = new DomDocument('1.0', 'UTF-8'); - $externalSchemaDom->load($externalSchemaFile->getAbsolutePath()); - // The external schema may have external schemas of its own ; recurse - $this->includeExternalSchemas($externalSchemaDom, $srcDir); - foreach ($externalSchemaDom->getElementsByTagName("table") as $tableNode) { // see xsd, datatase may only have table or external-schema, the latter was just deleted so this should cover everything - $databaseNode->appendChild($dom->importNode($tableNode, true)); - } - $nbIncludedSchemas++; - } - return $nbIncludedSchemas; - } - - /** - * Joins the datamodels collected from schema.xml files into one big datamodel. - * We need to join the datamodels in this case to allow for foreign keys - * that point to tables in different packages. - * - * @param array[AppData] $ads The datamodels to join - * @return AppData The single datamodel with all other datamodels joined in - */ - protected function joinDataModels($ads) - { - $mainAppData = null; - foreach ($ads as $appData) { - if (null === $mainAppData) { - $mainAppData = $appData; - $appData->setName('JoinedDataModel'); - continue; - } - // merge subsequent schemas to the first one - foreach ($appData->getDatabases(false) as $addDb) { - $addDbName = $addDb->getName(); - if ($mainAppData->hasDatabase($addDbName)) { - $db = $mainAppData->getDatabase($addDbName, false); - // join tables - foreach ($addDb->getTables() as $addTable) { - if ($db->getTable($addTable->getName())) { - throw new BuildException('Duplicate table found: ' . $addDbName . '.'); - } - $db->addTable($addTable); - } - // join database behaviors - foreach ($addDb->getBehaviors() as $addBehavior) { - if (!$db->hasBehavior($addBehavior->getName())) { - $db->addBehavior($addBehavior); - } - } - } else { - $mainAppData->addDatabase($addDb); - } - } - } - return $mainAppData; - } - - /** - * Gets the GeneratorConfig object for this task or creates it on-demand. - * @return GeneratorConfig - */ - protected function getGeneratorConfig() - { - if ($this->generatorConfig === null) { - $this->generatorConfig = new GeneratorConfig(); - $this->generatorConfig->setBuildProperties($this->getProject()->getProperties()); - } - return $this->generatorConfig; - } - - /** - * Checks this class against Basic requrements of any propel datamodel task. - * - * @throws BuildException - if schema fileset was not defined - * - if no output directory was specified - */ - protected function validate() - { - if (empty($this->schemaFilesets)) { - throw new BuildException("You must specify a fileset of XML schemas.", $this->getLocation()); - } - - // Make sure the output directory is set. - if ($this->outputDirectory === null) { - throw new BuildException("The output directory needs to be defined!", $this->getLocation()); - } - - if ($this->validate) { - if (!$this->xsdFile) { - throw new BuildException("'validate' set to TRUE, but no XSD specified (use 'xsd' attribute).", $this->getLocation()); - } - } - - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/task/PropelConvertConfTask.php b/airtime_mvc/library/propel/generator/lib/task/PropelConvertConfTask.php deleted file mode 100644 index 53865c0d6d..0000000000 --- a/airtime_mvc/library/propel/generator/lib/task/PropelConvertConfTask.php +++ /dev/null @@ -1,344 +0,0 @@ - - * @package propel.generator.task - */ -class PropelConvertConfTask extends AbstractPropelDataModelTask -{ - - /** - * @var PhingFile The XML runtime configuration file to be converted. - */ - private $xmlConfFile; - - /** - * @var string This is the file where the converted conf array dump will be placed. - */ - private $outputFile; - - /** - * @var string This is the file where the classmap manifest converted conf array dump will be placed. - */ - private $outputClassmapFile; - - /** - * [REQUIRED] Set the input XML runtime conf file. - * @param PhingFile $v The XML runtime configuration file to be converted. - */ - public function setXmlConfFile(PhingFile $v) - { - $this->xmlConfFile = $v; - } - - /** - * [REQUIRED] Set the output filename for the converted runtime conf. - * The directory is specified using AbstractPropelDataModelTask#setOutputDirectory(). - * @param string $outputFile - * @see AbstractPropelDataModelTask#setOutputDirectory() - */ - public function setOutputFile($outputFile) - { - // this is a string, not a file - $this->outputFile = $outputFile; - } - - /** - * [REQUIRED] Set the output filename for the autoload classmap. - * The directory is specified using AbstractPropelDataModelTask#setOutputDirectory(). - * @param string $outputFile - * @see AbstractPropelDataModelTask#setOutputDirectory() - */ - public function setOutputClassmapFile($outputFile) - { - // this is a string, not a file - $this->outputClassmapFile = $outputFile; - } - - /** - * The main method does the work of the task. - */ - public function main() - { - // Check to make sure the input and output files were specified and that the input file exists. - - if (!$this->xmlConfFile || !$this->xmlConfFile->exists()) { - throw new BuildException("No valid xmlConfFile specified.", $this->getLocation()); - } - - if (!$this->outputFile) { - throw new BuildException("No outputFile specified.", $this->getLocation()); - } - - // Create a PHP array from the runtime-conf.xml file - - $xmlDom = new DOMDocument(); - $xmlDom->load($this->xmlConfFile->getAbsolutePath()); - $xml = simplexml_load_string($xmlDom->saveXML()); - $phpconf = self::simpleXmlToArray($xml); - - /* For some reason the array generated from runtime-conf.xml has separate - * 'log' section and 'propel' sections. To maintain backward compatibility - * we need to put 'log' back into the 'propel' section. - */ - $log = array(); - if (isset($phpconf['log'])) { - $phpconf['propel']['log'] = $phpconf['log']; - unset($phpconf['log']); - } - - if(isset($phpconf['propel'])) { - $phpconf = $phpconf['propel']; - } - - // add generator version - $phpconf['generator_version'] = $this->getGeneratorConfig()->getBuildProperty('version'); - - if (!$this->outputClassmapFile) { - // We'll create a default one for BC - $this->outputClassmapFile = 'classmap-' . $this->outputFile; - } - - // Write resulting PHP data to output file - $outfile = new PhingFile($this->outputDirectory, $this->outputFile); - $output = "getGeneratorConfig()->getBuildProperty('addTimestamp') ? " on " . strftime("%c") : '') . "\n"; - $output .= "// from XML runtime conf file " . $this->xmlConfFile->getPath() . "\n"; - $output .= "\$conf = "; - $output .= var_export($phpconf, true); - $output .= ";\n"; - $output .= "\$conf['classmap'] = include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '".$this->outputClassmapFile."');\n"; - $output .= "return \$conf;"; - - - $this->log("Creating PHP runtime conf file: " . $outfile->getPath()); - if (!file_put_contents($outfile->getAbsolutePath(), $output)) { - throw new BuildException("Error creating output file: " . $outfile->getAbsolutePath(), $this->getLocation()); - } - - // add classmap - $phpconfClassmap = $this->getClassMap(); - $outfile = new PhingFile($this->outputDirectory, $this->outputClassmapFile); - $output = '<' . '?' . "php\n"; - $output .= "// This file generated by Propel " . $phpconf['generator_version'] . " convert-conf target".($this->getGeneratorConfig()->getBuildProperty('addTimestamp') ? " on " . strftime("%c") : '') . "\n"; - $output .= "return "; - $output .= var_export($phpconfClassmap, true); - $output .= ";"; - $this->log("Creating PHP classmap runtime file: " . $outfile->getPath()); - if (!file_put_contents($outfile->getAbsolutePath(), $output)) { - throw new BuildException("Error creating output file: " . $outfile->getAbsolutePath(), $this->getLocation()); - } - - } // main() - - /** - * Recursive function that converts an SimpleXML object into an array. - * @author Christophe VG (based on code form php.net manual comment) - * @param object SimpleXML object. - * @return array Array representation of SimpleXML object. - */ - private static function simpleXmlToArray($xml) - { - $ar = array(); - - foreach ( $xml->children() as $k => $v ) { - - // recurse the child - $child = self::simpleXmlToArray( $v ); - - //print "Recursed down and found: " . var_export($child, true) . "\n"; - - // if it's not an array, then it was empty, thus a value/string - if ( count($child) == 0 ) { - $child = self::getConvertedXmlValue($v); - - } - - // add the childs attributes as if they where children - foreach ( $v->attributes() as $ak => $av ) { - - // if the child is not an array, transform it into one - if ( !is_array( $child ) ) { - $child = array( "value" => $child ); - } - - if ($ak == 'id') { - // special exception: if there is a key named 'id' - // then we will name the current key after that id - $k = self::getConvertedXmlValue($av); - } else { - // otherwise, just add the attribute like a child element - $child[$ak] = self::getConvertedXmlValue($av); - } - } - - // if the $k is already in our children list, we need to transform - // it into an array, else we add it as a value - if ( !in_array( $k, array_keys($ar) ) ) { - $ar[$k] = $child; - } else { - // (This only applies to nested nodes that do not have an @id attribute) - - // if the $ar[$k] element is not already an array, then we need to make it one. - // this is a bit of a hack, but here we check to also make sure that if it is an - // array, that it has numeric keys. this distinguishes it from simply having other - // nested element data. - - if ( !is_array($ar[$k]) || !isset($ar[$k][0]) ) { $ar[$k] = array($ar[$k]); } - $ar[$k][] = $child; - } - - } - - return $ar; - } - - /** - * Process XML value, handling boolean, if appropriate. - * @param object The simplexml value object. - * @return mixed - */ - private static function getConvertedXmlValue($value) - { - $value = (string) $value; // convert from simplexml to string - // handle booleans specially - $lwr = strtolower($value); - if ($lwr === "false") { - $value = false; - } elseif ($lwr === "true") { - $value = true; - } - return $value; - } - - /** - * Lists data model classes and builds an associative array className => classPath - * To be used for autoloading - * @return array - */ - protected function getClassMap() - { - $phpconfClassmap = array(); - - $generatorConfig = $this->getGeneratorConfig(); - - foreach ($this->getDataModels() as $dataModel) { - - foreach ($dataModel->getDatabases() as $database) { - - $classMap = array(); - - foreach ($database->getTables() as $table) { - - if (!$table->isForReferenceOnly()) { - - // ----------------------------------------------------- - // Add TableMap class, - // Peer, Object & Query stub classes, - // and Peer, Object & Query base classes - // ----------------------------------------------------- - // (this code is based on PropelOMTask) - - foreach (array('tablemap', 'peerstub', 'objectstub', 'querystub', 'peer', 'object', 'query') as $target) { - $builder = $generatorConfig->getConfiguredBuilder($table, $target); - $this->log("Adding class mapping: " . $builder->getClassname() . ' => ' . $builder->getClassFilePath()); - $classMap[$builder->getFullyQualifiedClassname()] = $builder->getClassFilePath(); - } - - // ----------------------------------------------------- - // Add children classes for object and query, - // as well as base child query, - // for single tabel inheritance tables. - // ----------------------------------------------------- - - if ($col = $table->getChildrenColumn()) { - if ($col->isEnumeratedClasses()) { - foreach ($col->getChildren() as $child) { - foreach (array('objectmultiextend', 'queryinheritance', 'queryinheritancestub') as $target) { - $builder = $generatorConfig->getConfiguredBuilder($table, $target); - $builder->setChild($child); - $this->log("Adding class mapping: " . $builder->getClassname() . ' => ' . $builder->getClassFilePath()); - $classMap[$builder->getFullyQualifiedClassname()] = $builder->getClassFilePath(); - } - } - } - } - - // ----------------------------------------------------- - // Add base classes for alias tables (undocumented) - // ----------------------------------------------------- - - $baseClass = $table->getBaseClass(); - if ( $baseClass !== null ) { - $className = ClassTools::classname($baseClass); - if (!isset($classMap[$className])) { - $classPath = ClassTools::getFilePath($baseClass); - $this->log('Adding class mapping: ' . $className . ' => ' . $classPath); - $classMap[$className] = $classPath; - } - } - - $basePeer = $table->getBasePeer(); - if ( $basePeer !== null ) { - $className = ClassTools::classname($basePeer); - if (!isset($classMap[$className])) { - $classPath = ClassTools::getFilePath($basePeer); - $this->log('Adding class mapping: ' . $className . ' => ' . $classPath); - $classMap[$className] = $classPath; - } - } - - // ---------------------------------------------- - // Add classes for interface - // ---------------------------------------------- - - if ($table->getInterface()) { - $builder = $generatorConfig->getConfiguredBuilder($table, 'interface'); - $this->log("Adding class mapping: " . $builder->getClassname() . ' => ' . $builder->getClassFilePath()); - $classMap[$builder->getFullyQualifiedClassname()] = $builder->getClassFilePath(); - } - - // ---------------------------------------------- - // Add classes from old treeMode implementations - // ---------------------------------------------- - - if ($table->treeMode() == 'MaterializedPath') { - foreach (array('nodepeerstub', 'nodestub', 'nodepeer', 'node') as $target) { - $builder = $generatorConfig->getConfiguredBuilder($table, $target); - $this->log("Adding class mapping: " . $builder->getClassname() . ' => ' . $builder->getClassFilePath()); - $classMap[$builder->getFullyQualifiedClassname()] = $builder->getClassFilePath(); - } - } - if ($table->treeMode() == 'NestedSet') { - foreach (array('nestedset', 'nestedsetpeer') as $target) { - $builder = $generatorConfig->getConfiguredBuilder($table, $target); - $this->log("Adding class mapping: " . $builder->getClassname() . ' => ' . $builder->getClassFilePath()); - $classMap[$builder->getFullyQualifiedClassname()] = $builder->getClassFilePath(); - } - } - - } // if (!$table->isReferenceOnly()) - } - - $phpconfClassmap = array_merge($phpconfClassmap, $classMap); - } - } - - return $phpconfClassmap; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/task/PropelDataDTDTask.php b/airtime_mvc/library/propel/generator/lib/task/PropelDataDTDTask.php deleted file mode 100644 index 7252ae6769..0000000000 --- a/airtime_mvc/library/propel/generator/lib/task/PropelDataDTDTask.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @package propel.generator.task - */ -class PropelDataDTDTask extends PropelDataModelTemplateTask -{ - - public function main() - { - // check to make sure task received all correct params - $this->validate(); - - if (!$this->mapperElement) { - throw new BuildException("You must use a element to describe how names should be transformed."); - } - - $basepath = $this->getOutputDirectory(); - - // Get new Capsule context - $generator = $this->createContext(); - $generator->put("basepath", $basepath); // make available to other templates - - // we need some values that were loaded into the template context - $basePrefix = $generator->get('basePrefix'); - $project = $generator->get('project'); - - foreach ($this->getDataModels() as $dataModel) { - - $this->log("Processing Datamodel : " . $dataModel->getName()); - - foreach ($dataModel->getDatabases() as $database) { - - $outFile = $this->getMappedFile($dataModel->getName()); - - $generator->put("tables", $database->getTables()); - $generator->parse("data/dtd/dataset.tpl", $outFile->getAbsolutePath()); - - $this->log("Generating DTD for database: " . $database->getName()); - $this->log("Creating DTD file: " . $outFile->getPath()); - - foreach ($database->getTables() as $tbl) { - $this->log("\t + " . $tbl->getName()); - $generator->put("table", $tbl); - $generator->parse("data/dtd/table.tpl", $outFile->getAbsolutePath(), true); - } - - } // foreach database - - } // foreach dataModel - - - } // main() -} diff --git a/airtime_mvc/library/propel/generator/lib/task/PropelDataDumpTask.php b/airtime_mvc/library/propel/generator/lib/task/PropelDataDumpTask.php deleted file mode 100644 index 17cf860ba2..0000000000 --- a/airtime_mvc/library/propel/generator/lib/task/PropelDataDumpTask.php +++ /dev/null @@ -1,354 +0,0 @@ - (Propel) - * @author Fedor Karpelevitch (Torque) - * @author Jason van Zyl (Torque) - * @author Daniel Rall (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.task - */ -class PropelDataDumpTask extends AbstractPropelDataModelTask -{ - - /** - * Database name. - * The database name may be optionally specified in the XML if you only want - * to dump the contents of one database. - */ - private $databaseName; - - /** - * Database URL used for Propel connection. - * This is a PEAR-compatible (loosely) DSN URL. - */ - private $databaseUrl; - - /** - * Database driver used for Propel connection. - * This should normally be left blank so that default (Propel built-in) driver for database type is used. - */ - private $databaseDriver; - - /** - * Database user used for Propel connection. - * @deprecated Put username in databaseUrl. - */ - private $databaseUser; - - /** - * Database password used for Propel connection. - * @deprecated Put password in databaseUrl. - */ - private $databasePassword; - - /** - * Properties file that maps a data XML file to a particular database. - * @var PhingFile - */ - private $datadbmap; - - /** - * The database connection used to retrieve the data to dump. - * Needs to be public so that the TableInfo class can access it. - */ - public $conn; - - /** - * The statement used to acquire the data to dump. - */ - private $stmt; - - /** - * Set the file that maps between data XML files and databases. - * - * @param PhingFile $sqldbmap the db map - * @return void - */ - public function setDataDbMap(PhingFile $datadbmap) - { - $this->datadbmap = $datadbmap; - } - - /** - * Get the file that maps between data XML files and databases. - * - * @return PhingFile $datadbmap. - */ - public function getDataDbMap() - { - return $this->datadbmap; - } - - /** - * Get the database name to dump - * - * @return The DatabaseName value - */ - public function getDatabaseName() - { - return $this->databaseName; - } - - /** - * Set the database name - * - * @param v The new DatabaseName value - */ - public function setDatabaseName($v) - { - $this->databaseName = $v; - } - - /** - * Get the database url - * - * @return The DatabaseUrl value - */ - public function getDatabaseUrl() - { - return $this->databaseUrl; - } - - /** - * Set the database url - * - * @param string $v The PEAR-compatible database DSN URL. - */ - public function setDatabaseUrl($v) - { - $this->databaseUrl = $v; - } - - /** - * Get the database user - * - * @return string database user - * @deprecated - */ - public function getDatabaseUser() - { - return $this->databaseUser; - } - - /** - * Set the database user - * - * @param string $v The new DatabaseUser value - * @deprecated Specify user in DSN URL. - */ - public function setDatabaseUser($v) - { - $this->databaseUser = $v; - } - - /** - * Get the database password - * - * @return string database password - */ - public function getDatabasePassword() - { - return $this->databasePassword; - } - - /** - * Set the database password - * - * @param string $v The new DatabasePassword value - * @deprecated Specify database password in DSN URL. - */ - public function setDatabasePassword($v) - { - $this->databasePassword = $v; - } - - /** - * Get the database driver name - * - * @return string database driver name - */ - public function getDatabaseDriver() - { - return $this->databaseDriver; - } - - /** - * Set the database driver name - * - * @param string $v The new DatabaseDriver value - */ - public function setDatabaseDriver($v) - { - $this->databaseDriver = $v; - } - - /** - * Create the data XML -> database map. - * - * This is necessary because there is currently no other method of knowing which - * data XML files correspond to which database. This map allows us to convert multiple - * data XML files into SQL. - * - * @throws IOException - if unable to store properties - */ - private function createDataDbMap() - { - if ($this->getDataDbMap() === null) { - return; - } - - // Produce the sql -> database map - $datadbmap = new Properties(); - - // Check to see if the sqldbmap has already been created. - if ($this->getDataDbMap()->exists()) { - $datadbmap->load($this->getDataDbMap()); - } - - foreach ($this->getDataModels() as $dataModel) { // there is really one 1 db per datamodel - foreach ($dataModel->getDatabases() as $database) { - - // if database name is specified, then we only want to dump that one db. - if (empty($this->databaseName) || ($this->databaseName && $database->getName() == $this->databaseName)) { - $outFile = $this->getMappedFile($dataModel->getName()); - $datadbmap->setProperty($outFile->getName(), $database->getName()); - } - } - } - - try { - $datadbmap->store($this->getDataDbMap(), "Data XML file -> Database map"); - } catch (IOException $e) { - throw new IOException("Unable to store properties: ". $e->getMessage()); - } - } - - /** - * Iterates through each datamodel/database, dumps the contents of all tables and creates a DOM XML doc. - * - * @return void - * @throws BuildException - */ - public function main() - { - $this->validate(); - - $buf = "Database settings:\n" - . " driver: " . ($this->databaseDriver ? $this->databaseDriver : "(default)" ). "\n" - . " URL: " . $this->databaseUrl . "\n" - . ($this->databaseUser ? " user: " . $this->databaseUser . "\n" : "") - . ($this->databasePassword ? " password: " . $this->databasePassword . "\n" : ""); - - $this->log($buf, Project::MSG_VERBOSE); - - // 1) First create the Data XML -> database name map. - $this->createDataDbMap(); - - // 2) Now go create the XML files from teh database(s) - foreach ($this->getDataModels() as $dataModel) { // there is really one 1 db per datamodel - foreach ($dataModel->getDatabases() as $database) { - - // if database name is specified, then we only want to dump that one db. - if (empty($this->databaseName) || ($this->databaseName && $database->getName() == $this->databaseName)) { - - $outFile = $this->getMappedFile($dataModel->getName()); - - $this->log("Dumping data to XML for database: " . $database->getName()); - $this->log("Writing to XML file: " . $outFile->getName()); - - try { - - $url = str_replace("@DB@", $database->getName(), $this->databaseUrl); - - if ($url !== $this->databaseUrl) { - $this->log("New (resolved) URL: " . $url, Project::MSG_VERBOSE); - } - - if (empty($url)) { - throw new BuildException("Unable to connect to database; no PDO connection URL specified.", $this->getLocation()); - } - - $this->conn = new PDO($url, $this->databaseUser, $this->databasePassword); - $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - - $doc = $this->createXMLDoc($database); - $doc->save($outFile->getAbsolutePath()); - - } catch (SQLException $se) { - $this->log("SQLException while connecting to DB: ". $se->getMessage(), Project::MSG_ERR); - throw new BuildException($se); - } - } // if databaseName && database->getName == databaseName - } // foreach database - } // foreach datamodel - } - - /** - * Gets PDOStatement of query to fetch all data from a table. - * @param string $tableName - * @param Platform $platform - * @return PDOStatement - */ - private function getTableDataStmt($tableName, Platform $platform) - { - return $this->conn->query("SELECT * FROM " . $platform->quoteIdentifier( $tableName ) ); - } - - /** - * Creates a DOM document containing data for specified database. - * @param Database $database - * @return DOMDocument - */ - private function createXMLDoc(Database $database) - { - $doc = new DOMDocument('1.0', 'utf-8'); - $doc->formatOutput = true; // pretty printing - $doc->appendChild($doc->createComment("Created by data/dump/Control.tpl template.")); - - $dsNode = $doc->createElement("dataset"); - $dsNode->setAttribute("name", "all"); - $doc->appendChild($dsNode); - - $platform = $this->getGeneratorConfig()->getConfiguredPlatform($this->conn); - - $this->log("Building DOM tree containing data from tables:"); - - foreach ($database->getTables() as $tbl) { - $this->log("\t+ " . $tbl->getName()); - $stmt = $this->getTableDataStmt($tbl->getName(), $platform); - while ($row = $stmt->fetch()) { - $rowNode = $doc->createElement($tbl->getPhpName()); - foreach ($tbl->getColumns() as $col) { - $cval = $row[$col->getName()]; - if ($cval !== null) { - $rowNode->setAttribute($col->getPhpName(), iconv($this->dbEncoding, 'utf-8', $cval)); - } - } - $dsNode->appendChild($rowNode); - unset($rowNode); - } - unset($stmt); - } - - return $doc; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/task/PropelDataModelTemplateTask.php b/airtime_mvc/library/propel/generator/lib/task/PropelDataModelTemplateTask.php deleted file mode 100644 index fd3e7933c4..0000000000 --- a/airtime_mvc/library/propel/generator/lib/task/PropelDataModelTemplateTask.php +++ /dev/null @@ -1,217 +0,0 @@ - - * @package propel.generator.task - * @version $Revision: 1612 $ - */ -class PropelDataModelTemplateTask extends AbstractPropelDataModelTask -{ - - /** - * This is the file where the generated text - * will be placed. - * @var string - */ - protected $outputFile; - - /** - * Path where Capsule looks for templates. - * @var PhingFile - */ - protected $templatePath; - - /** - * This is the control template that governs the output. - * It may or may not invoke the services of worker - * templates. - * @var string - */ - protected $controlTemplate; - - /** - * [REQUIRED] Set the output file for the - * generation process. - * @param string $outputFile (TODO: change this to File) - * @return void - */ - public function setOutputFile($outputFile) { - $this->outputFile = $outputFile; - } - - /** - * Get the output file for the - * generation process. - * @return string - */ - public function getOutputFile() { - return $this->outputFile; - } - - /** - * [REQUIRED] Set the control template for the - * generating process. - * @param string $controlTemplate - * @return void - */ - public function setControlTemplate ($controlTemplate) { - $this->controlTemplate = $controlTemplate; - } - - /** - * Get the control template for the - * generating process. - * @return string - */ - public function getControlTemplate() { - return $this->controlTemplate; - } - - /** - * [REQUIRED] Set the path where Capsule will look - * for templates using the file template - * loader. - * @return void - * @throws Exception - */ - public function setTemplatePath($templatePath) { - $resolvedPath = ""; - $tok = strtok($templatePath, ","); - while ( $tok ) { - // resolve relative path from basedir and leave - // absolute path untouched. - $fullPath = $this->project->resolveFile($tok); - $cpath = $fullPath->getCanonicalPath(); - if ($cpath === false) { - $this->log("Template directory does not exist: " . $fullPath->getAbsolutePath()); - } else { - $resolvedPath .= $cpath; - } - $tok = strtok(","); - if ( $tok ) { - $resolvedPath .= ","; - } - } - $this->templatePath = $resolvedPath; - } - - /** - * Get the path where Velocity will look - * for templates using the file template - * loader. - * @return string - */ - public function getTemplatePath() { - return $this->templatePath; - } - - /** - * Creates a new Capsule context with some basic properties set. - * (Capsule is a simple PHP encapsulation system -- aka a php "template" class.) - * @return Capsule - */ - protected function createContext() { - - $context = new Capsule(); - - // Make sure the output directory exists, if it doesn't - // then create it. - $outputDir = new PhingFile($this->outputDirectory); - if (!$outputDir->exists()) { - $this->log("Output directory does not exist, creating: " . $outputDir->getAbsolutePath()); - $outputDir->mkdirs(); - } - - // Place our set of data models into the context along - // with the names of the databases as a convenience for now. - $context->put("targetDatabase", $this->getTargetDatabase()); - $context->put("targetPackage", $this->getTargetPackage()); - $context->put("now", strftime("%c")); - - $this->log("Target database type: " . $this->getTargetDatabase()); - $this->log("Target package: " . $this->getTargetPackage()); - $this->log("Using template path: " . $this->templatePath); - $this->log("Output directory: " . $this->getOutputDirectory()); - - $context->setTemplatePath($this->templatePath); - $context->setOutputDirectory($this->outputDirectory); - - $this->populateContextProperties($context); - - return $context; - } - - /** - * Adds the propel build properties to the passed Capsule context. - * - * @param Capsule $context - * @see GeneratorConfig::getBuildProperties() - */ - public function populateContextProperties(Capsule $context) - { - foreach ($this->getGeneratorConfig()->getBuildProperties() as $key => $propValue) { - $this->log('Adding property ${' . $key . '} to context', Project::MSG_DEBUG); - $context->put($key, $propValue); - } - } - - /** - * Performs validation for single-file mode. - * @throws BuildException - if there are any validation errors - */ - protected function singleFileValidate() - { - parent::validate(); - - // Make sure the control template is set. - if ($this->controlTemplate === null) { - throw new BuildException("The control template needs to be defined!"); - } - // Make sure there is an output file. - if ($this->outputFile === null) { - throw new BuildException("The output file needs to be defined!"); - } - - } - - /** - * Creates Capsule context and parses control template. - * @return void - */ - public function main() - { - $this->singleFileValidate(); - $context = $this->createContext(); - - $context->put("dataModels", $this->getDataModels()); - - $path = $this->outputDirectory . DIRECTORY_SEPARATOR . $this->outputFile; - $this->log("Generating to file " . $path); - - try { - $this->log("Parsing control template: " . $this->controlTemplate); - $context->parse($this->controlTemplate, $path); - } catch (Exception $ioe) { - throw new BuildException("Cannot write parsed template: ". $ioe->getMessage()); - } - } -} diff --git a/airtime_mvc/library/propel/generator/lib/task/PropelDataSQLTask.php b/airtime_mvc/library/propel/generator/lib/task/PropelDataSQLTask.php deleted file mode 100644 index f651d07e32..0000000000 --- a/airtime_mvc/library/propel/generator/lib/task/PropelDataSQLTask.php +++ /dev/null @@ -1,193 +0,0 @@ - (Propel) - * @author Jason van Zyl (Torque) - * @author John McNally (Torque) - * @author Fedor Karpelevitch (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.task - */ -class PropelDataSQLTask extends AbstractPropelDataModelTask -{ - - /** - * Properties file that maps an SQL file to a particular database. - * @var PhingFile - */ - private $sqldbmap; - - /** - * Properties file that maps a data XML file to a particular database. - * @var PhingFile - */ - private $datadbmap; - - /** - * The base directory in which to find data XML files. - * @var PhingFile - */ - private $srcDir; - - /** - * Set the file that maps between SQL files and databases. - * - * @param PhingFile $sqldbmap the sql -> db map. - * @return void - */ - public function setSqlDbMap(PhingFile $sqldbmap) - { - $this->sqldbmap = $sqldbmap; - } - - /** - * Get the file that maps between SQL files and databases. - * - * @return PhingFile sqldbmap. - */ - public function getSqlDbMap() - { - return $this->sqldbmap; - } - - /** - * Set the file that maps between data XML files and databases. - * - * @param PhingFile $sqldbmap the db map - * @return void - */ - public function setDataDbMap(PhingFile $datadbmap) - { - $this->datadbmap = $datadbmap; - } - - /** - * Get the file that maps between data XML files and databases. - * - * @return PhingFile $datadbmap. - */ - public function getDataDbMap() - { - return $this->datadbmap; - } - - /** - * Set the src directory for the data xml files listed in the datadbmap file. - * @param PhingFile $srcDir data xml source directory - */ - public function setSrcDir(PhingFile $srcDir) - { - $this->srcDir = $srcDir; - } - - /** - * Get the src directory for the data xml files listed in the datadbmap file. - * - * @return PhingFile data xml source directory - */ - public function getSrcDir() - { - return $this->srcDir; - } - - /** - * Search through all data models looking for matching database. - * @return Database or NULL if none found. - */ - private function getDatabase($name) - { - foreach ($this->getDataModels() as $dm) { - foreach ($dm->getDatabases() as $db) { - if ($db->getName() == $name) { - return $db; - } - } - } - } - - /** - * Main method parses the XML files and creates SQL files. - * - * @return void - * @throws Exception If there is an error parsing the data xml. - */ - public function main() - { - $this->validate(); - - $targetDatabase = $this->getTargetDatabase(); - - $platform = $this->getGeneratorConfig()->getConfiguredPlatform(); - - // Load the Data XML -> DB Name properties - $map = new Properties(); - try { - $map->load($this->getDataDbMap()); - } catch (IOException $ioe) { - throw new BuildException("Cannot open and process the datadbmap!", $ioe); - } - - // Parse each file in the data -> db map - foreach ($map->keys() as $dataXMLFilename) { - - $dataXMLFile = new PhingFile($this->srcDir, $dataXMLFilename); - - // if file exists then proceed - if ($dataXMLFile->exists()) { - - $dbname = $map->get($dataXMLFilename); - - $db = $this->getDatabase($dbname); - - if (!$db) { - throw new BuildException("Cannot find instantiated Database for name '$dbname' from datadbmap file."); - } - - $db->setPlatform($platform); - - $outFile = $this->getMappedFile($dataXMLFilename); - $sqlWriter = new FileWriter($outFile); - - $this->log("Creating SQL from XML data dump file: " . $dataXMLFile->getAbsolutePath()); - - try { - $dataXmlParser = new XmlToDataSQL($db, $this->getGeneratorConfig(), $this->dbEncoding); - $dataXmlParser->transform($dataXMLFile, $sqlWriter); - } catch (Exception $e) { - throw new BuildException("Exception parsing data XML: " . $e->getMessage(), $x); - } - - // Place the generated SQL file(s) - $p = new Properties(); - if ($this->getSqlDbMap()->exists()) { - $p->load($this->getSqlDbMap()); - } - - $p->setProperty($outFile->getName(), $db->getName()); - $p->store($this->getSqlDbMap(), "Sqlfile -> Database map"); - - } else { - $this->log("File '" . $dataXMLFile->getAbsolutePath() - . "' in datadbmap does not exist, so skipping it.", Project::MSG_WARN); - } - - } // foreach data xml file - - } // main() - -} diff --git a/airtime_mvc/library/propel/generator/lib/task/PropelGraphvizTask.php b/airtime_mvc/library/propel/generator/lib/task/PropelGraphvizTask.php deleted file mode 100644 index e778d6e8cc..0000000000 --- a/airtime_mvc/library/propel/generator/lib/task/PropelGraphvizTask.php +++ /dev/null @@ -1,170 +0,0 @@ -exists()) { - $out->mkdirs(); - } - $this->outDir = $out; - } - - - /** - * Set the sqldbmap. - * @param PhingFile $sqldbmap The db map. - */ - public function setSqlDbMap(PhingFile $sqldbmap) - { - $this->sqldbmap = $sqldbmap; - } - - /** - * Get the sqldbmap. - * @return PhingFile $sqldbmap. - */ - public function getSqlDbMap() - { - return $this->sqldbmap; - } - - /** - * Set the database name. - * @param string $database - */ - public function setDatabase($database) - { - $this->database = $database; - } - - /** - * Get the database name. - * @return string - */ - public function getDatabase() - { - return $this->database; - } - - - public function main() - { - - $count = 0; - - $dotSyntax = ''; - - // file we are going to create - - $dbMaps = $this->getDataModelDbMap(); - - foreach ($this->getDataModels() as $dataModel) { - - $dotSyntax .= "digraph G {\n"; - foreach ($dataModel->getDatabases() as $database) { - - $this->log("db: " . $database->getName()); - - //print the tables - foreach ($database->getTables() as $tbl) { - - $this->log("\t+ " . $tbl->getName()); - - ++$count; - $dotSyntax .= 'node'.$tbl->getName().' [label="{
'.$tbl->getName().'|'; - - foreach ($tbl->getColumns() as $col) { - $dotSyntax .= $col->getName() . ' (' . $col->getType() . ')'; - if (count($col->getForeignKeys()) > 0) { - $dotSyntax .= ' [FK]'; - } elseif ($col->isPrimaryKey()) { - $dotSyntax .= ' [PK]'; - } - $dotSyntax .= '\l'; - } - $dotSyntax .= '}", shape=record];'; - $dotSyntax .= "\n"; - } - - //print the relations - - $count = 0; - $dotSyntax .= "\n"; - foreach ($database->getTables() as $tbl) { - ++$count; - - foreach ($tbl->getColumns() as $col) { - $fk = $col->getForeignKeys(); - if ( count($fk) == 0 or $fk === null ) continue; - if ( count($fk) > 1 ) throw( new Exception("not sure what to do here...") ); - $fk = $fk[0]; // try first one - $dotSyntax .= 'node'.$tbl->getName() .':cols -> node'.$fk->getForeignTableName() . ':table [label="' . $col->getName() . '=' . implode(',', $fk->getForeignColumns()) . ' "];'; - $dotSyntax .= "\n"; - } - } - - - - } // foreach database - $dotSyntax .= "}\n"; - - $this->writeDot($dotSyntax,$this->outDir,$database->getName()); - - $dotSyntax = ''; - - } //foreach datamodels - - } // main() - - - /** - * probably insecure - */ - function writeDot($dotSyntax, PhingFile $outputDir, $baseFilename) { - $file = new PhingFile($outputDir, $baseFilename . '.schema.dot'); - $this->log("Writing dot file to " . $file->getAbsolutePath()); - file_put_contents($file->getAbsolutePath(), $dotSyntax); - } - -} diff --git a/airtime_mvc/library/propel/generator/lib/task/PropelOMTask.php b/airtime_mvc/library/propel/generator/lib/task/PropelOMTask.php deleted file mode 100644 index 9dc9c78341..0000000000 --- a/airtime_mvc/library/propel/generator/lib/task/PropelOMTask.php +++ /dev/null @@ -1,231 +0,0 @@ - - * @package propel.generator.task - */ -class PropelOMTask extends AbstractPropelDataModelTask -{ - - /** - * The platform (php4, php5, etc.) for which the om is being built. - * @var string - */ - private $targetPlatform; - - /** - * Sets the platform (php4, php5, etc.) for which the om is being built. - * @param string $v - */ - public function setTargetPlatform($v) { - $this->targetPlatform = $v; - } - - /** - * Gets the platform (php4, php5, etc.) for which the om is being built. - * @return string - */ - public function getTargetPlatform() { - return $this->targetPlatform; - } - - /** - * Utility method to create directory for package if it doesn't already exist. - * @param string $path The [relative] package path. - * @throws BuildException - if there is an error creating directories - */ - protected function ensureDirExists($path) - { - $f = new PhingFile($this->getOutputDirectory(), $path); - if (!$f->exists()) { - if (!$f->mkdirs()) { - throw new BuildException("Error creating directories: ". $f->getPath()); - } - } - } - - /** - * Uses a builder class to create the output class. - * This method assumes that the DataModelBuilder class has been initialized with the build properties. - * @param OMBuilder $builder - * @param boolean $overwrite Whether to overwrite existing files with te new ones (default is YES). - * @todo -cPropelOMTask Consider refactoring build() method into AbstractPropelDataModelTask (would need to be more generic). - */ - protected function build(OMBuilder $builder, $overwrite = true) - { - $path = $builder->getClassFilePath(); - $this->ensureDirExists(dirname($path)); - - $_f = new PhingFile($this->getOutputDirectory(), $path); - - // skip files already created once - if ($_f->exists() && !$overwrite) { - $this->log("\t\t-> (exists) " . $builder->getClassname(), Project::MSG_VERBOSE); - return 0; - } - - $script = $builder->build(); - foreach ($builder->getWarnings() as $warning) { - $this->log($warning, Project::MSG_WARN); - } - - // skip unchanged files - if ($_f->exists() && $script == $_f->contents()) { - $this->log("\t\t-> (unchanged) " . $builder->getClassname(), Project::MSG_VERBOSE); - return 0; - } - - // write / overwrite new / changed files - $this->log("\t\t-> " . $builder->getClassname() . " [builder: " . get_class($builder) . "]"); - file_put_contents($_f->getAbsolutePath(), $script); - return 1; - } - - /** - * Main method builds all the targets for a typical propel project. - */ - public function main() - { - // check to make sure task received all correct params - $this->validate(); - - $generatorConfig = $this->getGeneratorConfig(); - $totalNbFiles = 0; - - foreach ($this->getDataModels() as $dataModel) { - $this->log("Processing Datamodel : " . $dataModel->getName()); - - foreach ($dataModel->getDatabases() as $database) { - - $this->log(" - processing database : " . $database->getName()); - - foreach ($database->getTables() as $table) { - - if (!$table->isForReferenceOnly()) { - - $nbWrittenFiles = 0; - - $this->log("\t+ " . $table->getName()); - - // ----------------------------------------------------------------------------------------- - // Create Peer, Object, and TableMap classes - // ----------------------------------------------------------------------------------------- - - // these files are always created / overwrite any existing files - foreach (array('peer', 'object', 'tablemap', 'query') as $target) { - $builder = $generatorConfig->getConfiguredBuilder($table, $target); - $nbWrittenFiles += $this->build($builder); - } - - // ----------------------------------------------------------------------------------------- - // Create [empty] stub Peer and Object classes if they don't exist - // ----------------------------------------------------------------------------------------- - - // these classes are only generated if they don't already exist - foreach (array('peerstub', 'objectstub', 'querystub') as $target) { - $builder = $generatorConfig->getConfiguredBuilder($table, $target); - $nbWrittenFiles += $this->build($builder, $overwrite=false); - } - - // ----------------------------------------------------------------------------------------- - // Create [empty] stub child Object classes if they don't exist - // ----------------------------------------------------------------------------------------- - - // If table has enumerated children (uses inheritance) then create the empty child stub classes if they don't already exist. - if ($table->getChildrenColumn()) { - $col = $table->getChildrenColumn(); - if ($col->isEnumeratedClasses()) { - foreach ($col->getChildren() as $child) { - foreach (array('queryinheritance') as $target) { - if (!$child->getAncestor()) { - continue; - } - $builder = $generatorConfig->getConfiguredBuilder($table, $target); - $builder->setChild($child); - $nbWrittenFiles += $this->build($builder, $overwrite=true); - } - foreach (array('objectmultiextend', 'queryinheritancestub') as $target) { - $builder = $generatorConfig->getConfiguredBuilder($table, $target); - $builder->setChild($child); - $nbWrittenFiles += $this->build($builder, $overwrite=false); - } - } // foreach - } // if col->is enumerated - } // if tbl->getChildrenCol - - - // ----------------------------------------------------------------------------------------- - // Create [empty] Interface if it doesn't exist - // ----------------------------------------------------------------------------------------- - - // Create [empty] interface if it does not already exist - if ($table->getInterface()) { - $builder = $generatorConfig->getConfiguredBuilder($table, 'interface'); - $nbWrittenFiles += $this->build($builder, $overwrite=false); - } - - // ----------------------------------------------------------------------------------------- - // Create tree Node classes - // ----------------------------------------------------------------------------------------- - - if ($table->treeMode()) { - switch($table->treeMode()) { - case 'NestedSet': - foreach (array('nestedsetpeer', 'nestedset') as $target) { - $builder = $generatorConfig->getConfiguredBuilder($table, $target); - $nbWrittenFiles += $this->build($builder); - } - break; - - case 'MaterializedPath': - foreach (array('nodepeer', 'node') as $target) { - $builder = $generatorConfig->getConfiguredBuilder($table, $target); - $nbWrittenFiles += $this->build($builder); - } - - foreach (array('nodepeerstub', 'nodestub') as $target) { - $builder = $generatorConfig->getConfiguredBuilder($table, $target); - $nbWrittenFiles += $this->build($builder, $overwrite=false); - } - break; - - case 'AdjacencyList': - // No implementation for this yet. - default: - break; - } - - } // if Table->treeMode() - - $totalNbFiles += $nbWrittenFiles; - if ($nbWrittenFiles == 0) { - $this->log("\t\t(no change)"); - } - } // if !$table->isForReferenceOnly() - - } // foreach table - - } // foreach database - - } // foreach dataModel - if ($totalNbFiles) { - $this->log(sprintf("Object model generation complete - %d files written", $totalNbFiles)); - } else { - $this->log("Object model generation complete - All files already up to date"); - } - } // main() -} diff --git a/airtime_mvc/library/propel/generator/lib/task/PropelSQLExec.php b/airtime_mvc/library/propel/generator/lib/task/PropelSQLExec.php deleted file mode 100644 index 4b9ff138e1..0000000000 --- a/airtime_mvc/library/propel/generator/lib/task/PropelSQLExec.php +++ /dev/null @@ -1,701 +0,0 @@ - Database map in the form of a properties - * file to insert each SQL file listed into its designated database. - * - * @author Hans Lellelid - * @author Dominik del Bondio - * @author Jeff Martin (Torque) - * @author Michael McCallum (Torque) - * @author Tim Stephenson (Torque) - * @author Jason van Zyl (Torque) - * @author Martin Poeschl (Torque) - * @version $Revision: 1612 $ - * @package propel.generator.task - */ -class PropelSQLExec extends Task -{ - - private $goodSql = 0; - private $totalSql = 0; - - const DELIM_ROW = "row"; - const DELIM_NORMAL = "normal"; - - /** - * The delimiter type indicating whether the delimiter will - * only be recognized on a line by itself - */ - private $delimiterType = "normal"; // can't use constant just defined - - //private static $delimiterTypes = array(DELIM_NORMAL, DELIM_ROW); - //private static $errorActions = array("continue", "stop", "abort"); - - /** PDO Database connection */ - private $conn = null; - - /** Autocommit flag. Default value is false */ - private $autocommit = false; - - /** DB url. */ - private $url = null; - - /** User name. */ - private $userId = null; - - /** Password */ - private $password = null; - - /** SQL input command */ - private $sqlCommand = ""; - - /** SQL transactions to perform */ - private $transactions = array(); - - /** SQL Statement delimiter */ - private $delimiter = ";"; - - /** Print SQL results. */ - private $print = false; - - /** Print header columns. */ - private $showheaders = true; - - /** Results Output file. */ - private $output = null; - - /** RDBMS Product needed for this SQL. */ - private $rdbms = null; - - /** RDBMS Version needed for this SQL. */ - private $version = null; - - /** Action to perform if an error is found */ - private $onError = "abort"; - - /** Encoding to use when reading SQL statements from a file */ - private $encoding = null; - - /** Src directory for the files listed in the sqldbmap. */ - private $srcDir; - - /** Properties file that maps an individual SQL file to a database. */ - private $sqldbmap; - - /** - * Set the sqldbmap properties file. - * - * @param sqldbmap filename for the sqldbmap - */ - public function setSqlDbMap($sqldbmap) - { - $this->sqldbmap = $this->project->resolveFile($sqldbmap); - } - - /** - * Get the sqldbmap properties file. - * - * @return filename for the sqldbmap - */ - public function getSqlDbMap() - { - return $this->sqldbmap; - } - - /** - * Set the src directory for the sql files listed in the sqldbmap file. - * - * @param PhingFile $srcDir sql source directory - */ - public function setSrcDir(PhingFile $srcDir) - { - $this->srcDir = $srcDir; - } - - /** - * Get the src directory for the sql files listed in the sqldbmap file. - * - * @return PhingFile SQL Source directory - */ - public function getSrcDir() - { - return $this->srcDir; - } - - /** - * Set the sql command to execute - * - * @param sql sql command to execute - */ - public function addText($sql) - { - $this->sqlCommand .= $sql; - } - - /** - * Set the DB connection url. - * - * @param string $url connection url - */ - public function setUrl($url) - { - $this->url = $url; - } - - /** - * Set the user name for the DB connection. - * - * @param string $userId database user - * @deprecated Specify userid in the DSN URL. - */ - public function setUserid($userId) - { - $this->userId = $userId; - } - - /** - * Set the password for the DB connection. - * - * @param string $password database password - * @deprecated Specify password in the DSN URL. - */ - public function setPassword($password) - { - $this->password = $password; - } - - /** - * Set the autocommit flag for the DB connection. - * - * @param boolean $autocommit the autocommit flag - */ - public function setAutoCommit($autocommit) - { - $this->autocommit = (boolean) $autocommit; - } - - /** - * Set the statement delimiter. - * - *

For example, set this to "go" and delimitertype to "ROW" for - * Sybase ASE or MS SQL Server.

- * - * @param string $delimiter - */ - public function setDelimiter($delimiter) - { - $this->delimiter = $delimiter; - } - - /** - * Set the Delimiter type for this sql task. The delimiter type takes two - * values - normal and row. Normal means that any occurence of the delimiter - * terminate the SQL command whereas with row, only a line containing just - * the delimiter is recognized as the end of the command. - * - * @param string $delimiterType - */ - public function setDelimiterType($delimiterType) - { - $this->delimiterType = $delimiterType; - } - - /** - * Set the print flag. - * - * @param boolean $print - */ - public function setPrint($print) - { - $this->print = (boolean) $print; - } - - /** - * Set the showheaders flag. - * - * @param boolean $showheaders - */ - public function setShowheaders($showheaders) - { - $this->showheaders = (boolean) $showheaders; - } - - /** - * Set the output file. - * - * @param PhingFile $output - */ - public function setOutput(PhingFile $output) - { - $this->output = $output; - } - - /** - * Set the action to perform onerror - * - * @param string $action - */ - public function setOnerror($action) - { - $this->onError = $action; - } - - /** - * Load the sql file and then execute it - * - * @throws BuildException - */ - public function main() - { - $this->sqlCommand = trim($this->sqlCommand); - - if ($this->sqldbmap === null || $this->getSqlDbMap()->exists() === false) { - throw new BuildException("You haven't provided an sqldbmap, or " - . "the one you specified doesn't exist: " . $this->sqldbmap->getPath()); - } - - if ($this->url === null) { - throw new BuildException("DSN url attribute must be set!"); - } - - $map = new Properties(); - - try { - $map->load($this->getSqlDbMap()); - } catch (IOException $ioe) { - throw new BuildException("Cannot open and process the sqldbmap!"); - } - - $databases = array(); - - foreach ($map->keys() as $sqlfile) { - - $database = $map->getProperty($sqlfile); - - // Q: already there? - if (!isset($databases[$database])) { - // A: No. - $databases[$database] = array(); - } - - // We want to make sure that the base schemas - // are inserted first. - if (strpos($sqlfile, "schema.sql") !== false) { - // add to the beginning of the array - array_unshift($databases[$database], $sqlfile); - } else { - array_push($databases[$database], $sqlfile); - } - } - - foreach ($databases as $db => $files) { - $transactions = array(); - - foreach ($files as $fileName) { - - $file = new PhingFile($this->srcDir, $fileName); - - if ($file->exists()) { - $this->log("Executing statements in file: " . $file->__toString()); - $transaction = new PropelSQLExecTransaction($this); - $transaction->setSrc($file); - $transactions[] = $transaction; - } else { - $this->log("File '" . $file->__toString() - . "' in sqldbmap does not exist, so skipping it."); - } - } - $this->insertDatabaseSqlFiles($this->url, $db, $transactions); - } - } - - /** - * Take the base url, the target database and insert a set of SQL - * files into the target database. - * - * @param string $url - * @param string $database - * @param array $transactions - */ - private function insertDatabaseSqlFiles($url, $database, $transactions) - { - $url = str_replace("@DB@", $database, $url); - $this->log("Our new url -> " . $url); - - try { - - $buf = "Database settings:" . PHP_EOL - . " URL: " . $url . PHP_EOL - . ($this->userId ? " user: " . $this->userId . PHP_EOL : "") - . ($this->password ? " password: " . $this->password . PHP_EOL : ""); - - $this->log($buf, Project::MSG_VERBOSE); - - // Set user + password to null if they are empty strings - if (!$this->userId) { $this->userId = null; } - - if (!$this->password) { $this->password = null; } - - $this->conn = new PDO($url, $this->userId, $this->password); - $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - - // $this->conn->setAutoCommit($this->autocommit); - // $this->statement = $this->conn->createStatement(); - - $out = null; - - try { - if ($this->output !== null) { - $this->log("Opening PrintStream to output file " . $this->output->__toString(), Project::MSG_VERBOSE); - $out = new FileWriter($this->output); - } - - // Process all transactions - for ($i=0,$size=count($transactions); $i < $size; $i++) { - $transactions[$i]->runTransaction($out); - if (!$this->autocommit) { - $this->log("Commiting transaction", Project::MSG_VERBOSE); - $this->conn->commit(); - } - } - } catch (Exception $e) { - if ($out) $out->close(); - } - - } catch (IOException $e) { - - if (!$this->autocommit && $this->conn !== null && $this->onError == "abort") { - try { - $this->conn->rollBack(); - } catch (PDOException $ex) { - // do nothing. - System::println("Rollback failed."); - } - } - if ($this->statement) $this->statement = null; // close - throw new BuildException($e); - } catch (PDOException $e) { - if (!$this->autocommit && $this->conn !== null && $this->onError == "abort") { - try { - $this->conn->rollBack(); - } catch (PDOException $ex) { - // do nothing. - System::println("Rollback failed"); - } - } - if ($this->statement) $this->statement = null; // close - throw new BuildException($e); - } - - $this->statement = null; // close - - $this->log($this->goodSql . " of " . $this->totalSql - . " SQL statements executed successfully"); - } - - /** - * Read the statements from the .sql file and execute them. - * Lines starting with '//', '--' or 'REM ' are ignored. - * - * Developer note: must be public in order to be called from - * sudo-"inner" class PropelSQLExecTransaction. - * - * @param Reader $reader - * @param $out Optional output stream. - * @throws PDOException - * @throws IOException - */ - public function runStatements(Reader $reader, $out = null) - { - $sql = ""; - $line = ""; - $sqlBacklog = ""; - $hasQuery = false; - - $in = new BufferedReader($reader); - - $parser['pointer'] = 0; - $parser['isInString'] = false; - $parser['stringQuotes'] = ""; - $parser['backslashCount'] = 0; - $parser['parsedString'] = ""; - - $sqlParts = array(); - - while (($line = $in->readLine()) !== null) { - - $line = trim($line); - $line = ProjectConfigurator::replaceProperties($this->project, $line, - $this->project->getProperties()); - - if (StringHelper::startsWith("//", $line) - || StringHelper::startsWith("--", $line) - || StringHelper::startsWith("#", $line)) { - continue; - } - - if (strlen($line) > 4 && strtoupper(substr($line,0, 4)) == "REM ") { - continue; - } - - if ($sqlBacklog !== "") { - $sql = $sqlBacklog; - $sqlBacklog = ""; - } - - $sql .= " " . $line . PHP_EOL; - - // SQL defines "--" as a comment to EOL - // and in Oracle it may contain a hint - // so we cannot just remove it, instead we must end it - if (strpos($line, "--") !== false) { - $sql .= PHP_EOL; - } - - // DELIM_ROW doesn't need this (as far as i can tell) - if ($this->delimiterType == self::DELIM_NORMAL) { - - // old regex, being replaced due to segfaults: - // See: http://propel.phpdb.org/trac/ticket/294 - //$reg = "#((?:\"(?:\\\\.|[^\"])*\"?)+|'(?:\\\\.|[^'])*'?|" . preg_quote($this->delimiter) . ")#"; - //$sqlParts = preg_split($reg, $sql, 0, PREG_SPLIT_DELIM_CAPTURE); - - $i = $parser['pointer']; - $c = strlen($sql); - while ($i < $c) { - - $char = $sql[$i]; - - switch($char) { - case "\\": - $parser['backslashCount']++; - $this->log("c$i: found ".$parser['backslashCount']." backslash(es)", Project::MSG_VERBOSE); - break; - case "'": - case "\"": - if ($parser['isInString'] && $parser['stringQuotes'] == $char) { - if (($parser['backslashCount'] & 1) == 0) { - #$this->log("$i: out of string", Project::MSG_VERBOSE); - $parser['isInString'] = false; - } else { - $this->log("c$i: rejected quoted delimiter", Project::MSG_VERBOSE); - } - - } elseif (!$parser['isInString']) { - $parser['stringQuotes'] = $char; - $parser['isInString'] = true; - #$this->log("$i: into string with $parser['stringQuotes']", Project::MSG_VERBOSE); - } - break; - } - - if ($char == $this->delimiter && !$parser['isInString']) { - $this->log("c$i: valid end of command found!", Project::MSG_VERBOSE); - $sqlParts[] = $parser['parsedString']; - $sqlParts[] = $this->delimiter; - break; - } - $parser['parsedString'] .= $char; - if ($char !== "\\") { - if ($parser['backslashCount']) $this->log("$i: backslash reset", Project::MSG_VERBOSE); - $parser['backslashCount'] = 0; - } - $i++; - $parser['pointer']++; - } - - $sqlBacklog = ""; - foreach ($sqlParts as $sqlPart) { - // we always want to append, even if it's a delim (which will be stripped off later) - $sqlBacklog .= $sqlPart; - - // we found a single (not enclosed by ' or ") delimiter, so we can use all stuff before the delim as the actual query - if ($sqlPart === $this->delimiter) { - $sql = $sqlBacklog; - $sqlBacklog = ""; - $hasQuery = true; - } - } - } - - if ($hasQuery || ($this->delimiterType == self::DELIM_ROW && $line == $this->delimiter)) { - // this assumes there is always a delimter on the end of the SQL statement. - $sql = StringHelper::substring($sql, 0, strlen($sql) - 1 - strlen($this->delimiter)); - $this->log("SQL: " . $sql, Project::MSG_VERBOSE); - $this->execSQL($sql, $out); - $sql = ""; - $hasQuery = false; - - $parser['pointer'] = 0; - $parser['isInString'] = false; - $parser['stringQuotes'] = ""; - $parser['backslashCount'] = 0; - $parser['parsedString'] = ""; - $sqlParts = array(); - } - } - - // Catch any statements not followed by ; - if ($sql !== "") { - $this->execSQL($sql, $out); - } - } - - /** - * Exec the sql statement. - * - * @param sql - * @param out - * @throws PDOException - */ - protected function execSQL($sql, $out = null) - { - // Check and ignore empty statements - if (trim($sql) == "") { - return; - } - - try { - $this->totalSql++; - - if (!$this->autocommit) $this->conn->beginTransaction(); - - $stmt = $this->conn->prepare($sql); - $stmt->execute(); - $this->log($stmt->rowCount() . " rows affected", Project::MSG_VERBOSE); - - if (!$this->autocommit) $this->conn->commit(); - - $this->goodSql++; - } catch (PDOException $e) { - $this->log("Failed to execute: " . $sql, Project::MSG_ERR); - if ($this->onError != "continue") { - throw $e; - } - $this->log($e->getMessage(), Project::MSG_ERR); - } - } - - /** - * print any results in the statement. - * - * @param out - * @throws PDOException - */ - protected function printResults($out = null) - { - $rs = null; - - do { - $rs = $this->statement->getResultSet(); - - if ($rs !== null) { - - $this->log("Processing new result set.", Project::MSG_VERBOSE); - - $line = ""; - - $colsprinted = false; - - while ($rs->next()) { - - if (!$colsprinted && $this->showheaders) { - $first = true; - foreach ($this->fields as $fieldName => $ignore) { - if ($first) $first = false; else $line .= ","; - $line .= $fieldName; - } - } // if show headers - - $first = true; - foreach ($rs->fields as $columnValue) { - - if ($columnValue != null) { - $columnValue = trim($columnValue); - } - - if ($first) { - $first = false; - } else { - $line .= ","; - } - $line .= $columnValue; - } - - if ($out !== null) { - $out->write($line); - $out->newLine(); - } - - System::println($line); - $line = ""; - } // while rs->next() - } - } while ($this->statement->getMoreResults()); - System::println(); - if ($out !== null) $out->newLine(); - } - -} - -/** - * "Inner" class that contains the definition of a new transaction element. - * Transactions allow several files or blocks of statements - * to be executed using the same Propel connection and commit - * operation in between. - * @package propel.generator.task - */ -class PropelSQLExecTransaction -{ - - private $tSrcFile = null; - private $tSqlCommand = ""; - private $parent; - - function __construct($parent) - { - // Parent is required so that we can log things ... - $this->parent = $parent; - } - - public function setSrc(PhingFile $src) - { - $this->tSrcFile = $src; - } - - public function addText($sql) - { - $this->tSqlCommand .= $sql; - } - - /** - * @throws IOException, PDOException - */ - public function runTransaction($out = null) - { - if (!empty($this->tSqlCommand)) { - $this->parent->log("Executing commands", Project::MSG_INFO); - $this->parent->runStatements($this->tSqlCommand, $out); - } - - if ($this->tSrcFile !== null) { - $this->parent->log("Executing file: " . $this->tSrcFile->getAbsolutePath(), Project::MSG_INFO); - $reader = new FileReader($this->tSrcFile); - $this->parent->runStatements($reader, $out); - $reader->close(); - } - } -} diff --git a/airtime_mvc/library/propel/generator/lib/task/PropelSQLTask.php b/airtime_mvc/library/propel/generator/lib/task/PropelSQLTask.php deleted file mode 100644 index 5c7304d2dc..0000000000 --- a/airtime_mvc/library/propel/generator/lib/task/PropelSQLTask.php +++ /dev/null @@ -1,250 +0,0 @@ - - * @package propel.generator.task - */ -class PropelSQLTask extends AbstractPropelDataModelTask -{ - - /** - * The properties file that maps an SQL file to a particular database. - * @var PhingFile - */ - private $sqldbmap; - - /** - * Name of the database. - */ - private $database; - - /** - * Set the sqldbmap. - * @param PhingFile $sqldbmap The db map. - */ - public function setSqlDbMap(PhingFile $sqldbmap) - { - $this->sqldbmap = $sqldbmap; - } - - /** - * Get the sqldbmap. - * @return PhingFile $sqldbmap. - */ - public function getSqlDbMap() - { - return $this->sqldbmap; - } - - /** - * Set the database name. - * @param string $database - */ - public function setDatabase($database) - { - $this->database = $database; - } - - /** - * Get the database name. - * @return string - */ - public function getDatabase() - { - return $this->database; - } - - /** - * Create the sql -> database map. - * - * @throws IOException - if unable to store properties - */ - protected function createSqlDbMap() - { - if ($this->getSqlDbMap() === null) { - return; - } - - // Produce the sql -> database map - $sqldbmap = new Properties(); - - // Check to see if the sqldbmap has already been created. - if ($this->getSqlDbMap()->exists()) { - $sqldbmap->load($this->getSqlDbMap()); - } - - if ($this->packageObjectModel) { - // in this case we'll get the sql file name from the package attribute - $dataModels = $this->packageDataModels(); - foreach ($dataModels as $package => $dataModel) { - foreach ($dataModel->getDatabases() as $database) { - $name = ($package ? $package . '.' : '') . 'schema.xml'; - $sqlFile = $this->getMappedFile($name); - $sqldbmap->setProperty($sqlFile->getName(), $database->getName()); - } - } - } else { - // the traditional way is to map the schema.xml filenames - $dmMap = $this->getDataModelDbMap(); - foreach (array_keys($dmMap) as $dataModelName) { - $sqlFile = $this->getMappedFile($dataModelName); - if ($this->getDatabase() === null) { - $databaseName = $dmMap[$dataModelName]; - } else { - $databaseName = $this->getDatabase(); - } - $sqldbmap->setProperty($sqlFile->getName(), $databaseName); - } - } - - try { - $sqldbmap->store($this->getSqlDbMap(), "Sqlfile -> Database map"); - } catch (IOException $e) { - throw new IOException("Unable to store properties: ". $e->getMessage()); - } - } - - public function main() { - - $this->validate(); - - if (!$this->mapperElement) { - throw new BuildException("You must use a element to describe how names should be transformed."); - } - - if ($this->packageObjectModel) { - $dataModels = $this->packageDataModels(); - } else { - $dataModels = $this->getDataModels(); - } - - // 1) first create a map of filenames to databases; this is used by other tasks like - // the SQLExec task. - $this->createSqlDbMap(); - - // 2) Now actually create the DDL based on the datamodel(s) from XML schema file. - $targetDatabase = $this->getTargetDatabase(); - - $generatorConfig = $this->getGeneratorConfig(); - - $builderClazz = $generatorConfig->getBuilderClassname('ddl'); - - foreach ($dataModels as $package => $dataModel) { - - foreach ($dataModel->getDatabases() as $database) { - - // Clear any start/end DLL - call_user_func(array($builderClazz, 'reset')); - - // file we are going to create - if (!$this->packageObjectModel) { - $name = $dataModel->getName(); - } else { - $name = ($package ? $package . '.' : '') . 'schema.xml'; - } - - $outFile = $this->getMappedFile($name); - - $this->log("Writing to SQL file: " . $outFile->getPath()); - - // First add any "header" SQL - $ddl = call_user_func(array($builderClazz, 'getDatabaseStartDDL')); - - foreach ($database->getTables() as $table) { - - if (!$table->isSkipSql()) { - $builder = $generatorConfig->getConfiguredBuilder($table, 'ddl'); - $this->log("\t+ " . $table->getName() . " [builder: " . get_class($builder) . "]"); - $ddl .= $builder->build(); - foreach ($builder->getWarnings() as $warning) { - $this->log($warning, Project::MSG_WARN); - } - } else { - $this->log("\t + (skipping) " . $table->getName()); - } - - } // foreach database->getTables() - - // Finally check to see if there is any "footer" SQL - $ddl .= call_user_func(array($builderClazz, 'getDatabaseEndDDL')); - - #var_dump($outFile->getAbsolutePath()); - // Now we're done. Write the file! - file_put_contents($outFile->getAbsolutePath(), $ddl); - - } // foreach database - } //foreach datamodels - - } // main() - - /** - * Packages the datamodels to one datamodel per package - * - * This applies only when the the packageObjectModel option is set. We need to - * re-package the datamodels to allow the database package attribute to control - * which tables go into which SQL file. - * - * @return array The packaged datamodels - */ - protected function packageDataModels() { - - static $packagedDataModels; - - if (is_null($packagedDataModels)) { - - $dataModels = $this->getDataModels(); - $dataModel = array_shift($dataModels); - $packagedDataModels = array(); - - $platform = $this->getGeneratorConfig()->getConfiguredPlatform(); - - foreach ($dataModel->getDatabases() as $db) { - foreach ($db->getTables() as $table) { - $package = $table->getPackage(); - if (!isset($packagedDataModels[$package])) { - $dbClone = $this->cloneDatabase($db); - $dbClone->setPackage($package); - $ad = new AppData($platform); - $ad->setName($dataModel->getName()); - $ad->addDatabase($dbClone); - $packagedDataModels[$package] = $ad; - } - $packagedDataModels[$package]->getDatabase($db->getName())->addTable($table); - } - } - } - - return $packagedDataModels; - } - - protected function cloneDatabase($db) { - - $attributes = array ( - 'name' => $db->getName(), - 'baseClass' => $db->getBaseClass(), - 'basePeer' => $db->getBasePeer(), - 'defaultIdMethod' => $db->getDefaultIdMethod(), - 'defaultPhpNamingMethod' => $db->getDefaultPhpNamingMethod(), - 'defaultTranslateMethod' => $db->getDefaultTranslateMethod(), - 'heavyIndexing' => $db->getHeavyIndexing(), - ); - - $clone = new Database(); - $clone->loadFromXML($attributes); - return $clone; - } -} diff --git a/airtime_mvc/library/propel/generator/lib/task/PropelSchemaReverseTask.php b/airtime_mvc/library/propel/generator/lib/task/PropelSchemaReverseTask.php deleted file mode 100644 index e3bc270bfc..0000000000 --- a/airtime_mvc/library/propel/generator/lib/task/PropelSchemaReverseTask.php +++ /dev/null @@ -1,548 +0,0 @@ - - * @version $Revision: 1716 $ - * @package propel.generator.task - */ -class PropelSchemaReverseTask extends PDOTask -{ - - /** - * Zero bit for no validators - */ - const VALIDATORS_NONE = 0; - - /** - * Bit for maxLength validator - */ - const VALIDATORS_MAXLENGTH = 1; - - /** - * Bit for maxValue validator - */ - const VALIDATORS_MAXVALUE = 2; - - /** - * Bit for type validator - */ - const VALIDATORS_TYPE = 4; - - /** - * Bit for required validator - */ - const VALIDATORS_REQUIRED = 8; - - /** - * Bit for unique validator - */ - const VALIDATORS_UNIQUE = 16; - - /** - * Bit for all validators - */ - const VALIDATORS_ALL = 255; - - /** - * File to contain XML database schema. - * @var PhingFIle - */ - protected $xmlSchema; - - /** - * DB encoding to use - * @var string - */ - protected $dbEncoding = 'iso-8859-1'; - - /** - * DB schema to use. - * @var string - */ - protected $dbSchema; - - /** - * The datasource name (used for in schema.xml) - * - * @var string - */ - protected $databaseName; - - /** - * DOM document produced. - * @var DOMDocument - */ - protected $doc; - - /** - * The document root element. - * @var DOMElement - */ - protected $databaseNode; - - /** - * Hashtable of columns that have primary keys. - * @var array - */ - protected $primaryKeys; - - /** - * Whether to use same name for phpName or not. - * @var boolean - */ - protected $samePhpName; - - /** - * whether to add vendor info or not - * @var boolean - */ - protected $addVendorInfo; - - /** - * Bitfield to switch on/off which validators will be created. - * - * @var int - */ - protected $validatorBits = PropelSchemaReverseTask::VALIDATORS_NONE; - - /** - * Collect validatorInfos to create validators. - * - * @var int - */ - protected $validatorInfos; - - /** - * An initialized GeneratorConfig object containing the converted Phing props. - * - * @var GeneratorConfig - */ - private $generatorConfig; - - /** - * Maps validator type tokens to bits - * - * The tokens are used in the propel.addValidators property to define - * which validators are to be added - * - * @var array - */ - static protected $validatorBitMap = array ( - 'none' => PropelSchemaReverseTask::VALIDATORS_NONE, - 'maxlength' => PropelSchemaReverseTask::VALIDATORS_MAXLENGTH, - 'maxvalue' => PropelSchemaReverseTask::VALIDATORS_MAXVALUE, - 'type' => PropelSchemaReverseTask::VALIDATORS_TYPE, - 'required' => PropelSchemaReverseTask::VALIDATORS_REQUIRED, - 'unique' => PropelSchemaReverseTask::VALIDATORS_UNIQUE, - 'all' => PropelSchemaReverseTask::VALIDATORS_ALL, - ); - - /** - * Defines messages that are added to validators - * - * @var array - */ - static protected $validatorMessages = array ( - 'maxlength' => array ( - 'msg' => 'The field %s must be not longer than %s characters.', - 'var' => array('colName', 'value') - ), - 'maxvalue' => array ( - 'msg' => 'The field %s must be not greater than %s.', - 'var' => array('colName', 'value') - ), - 'type' => array ( - 'msg' => 'The column %s must be an %s value.', - 'var' => array('colName', 'value') - ), - 'required' => array ( - 'msg' => 'The field %s is required.', - 'var' => array('colName') - ), - 'unique' => array ( - 'msg' => 'This %s already exists in table %s.', - 'var' => array('colName', 'tableName') - ), - ); - - /** - * Gets the (optional) schema name to use. - * - * @return string - */ - public function getDbSchema() - { - return $this->dbSchema; - } - - /** - * Sets the name of a database schema to use (optional). - * - * @param string $dbSchema - */ - public function setDbSchema($dbSchema) - { - $this->dbSchema = $dbSchema; - } - - /** - * Gets the database encoding. - * - * @return string - */ - public function getDbEncoding($v) - { - return $this->dbEncoding; - } - - /** - * Sets the database encoding. - * - * @param string $v - */ - public function setDbEncoding($v) - { - $this->dbEncoding = $v; - } - - /** - * Gets the datasource name. - * - * @return string - */ - public function getDatabaseName() - { - return $this->databaseName; - } - - /** - * Sets the datasource name. - * - * This will be used as the value in the generated schema.xml - * - * @param string $v - */ - public function setDatabaseName($v) - { - $this->databaseName = $v; - } - - /** - * Sets the output name for the XML file. - * - * @param PhingFile $v - */ - public function setOutputFile(PhingFile $v) - { - $this->xmlSchema = $v; - } - - /** - * Set whether to use the column name as phpName without any translation. - * - * @param boolean $v - */ - public function setSamePhpName($v) - { - $this->samePhpName = $v; - } - - /** - * Set whether to add vendor info to the schema. - * - * @param boolean $v - */ - public function setAddVendorInfo($v) - { - $this->addVendorInfo = (boolean) $v; - } - - /** - * Sets set validator bitfield from a comma-separated list of "validator bit" names. - * - * @param string $v The comma-separated list of which validators to add. - * @return void - */ - public function setAddValidators($v) - { - $validKeys = array_keys(self::$validatorBitMap); - - // lowercase input - $v = strtolower($v); - - $bits = self::VALIDATORS_NONE; - - $exprs = explode(',', $v); - foreach ($exprs as $expr) { - $expr = trim($expr); - if(!empty($expr)) { - if (!isset(self::$validatorBitMap[$expr])) { - throw new BuildException("Unable to interpret validator in expression ('$v'): " . $expr); - } - $bits |= self::$validatorBitMap[$expr]; - } - } - - $this->validatorBits = $bits; - } - - /** - * Checks whether to add validators of specified type or not - * - * @param int $type The validator type constant. - * @return boolean - */ - protected function isValidatorRequired($type) - { - return (($this->validatorBits & $type) === $type); - } - - /** - * Whether to use the column name as phpName without any translation. - * - * @return boolean - */ - public function isSamePhpName() - { - return $this->samePhpName; - } - - /** - * @throws BuildException - */ - public function main() - { - if (!$this->getDatabaseName()) { - throw new BuildException("databaseName attribute is required for schema reverse engineering", $this->getLocation()); - } - - //(not yet supported) $this->log("schema : " . $this->dbSchema); - //DocumentTypeImpl docType = new DocumentTypeImpl(null, "database", null, - // "http://jakarta.apache.org/turbine/dtd/database.dtd"); - - $this->doc = new DOMDocument('1.0', 'utf-8'); - $this->doc->formatOutput = true; // pretty printing - - $this->doc->appendChild($this->doc->createComment("Autogenerated by ".get_class($this)." class.")); - - try { - - $database = $this->buildModel(); - - if ($this->validatorBits !== self::VALIDATORS_NONE) { - $this->addValidators($database); - } - - $database->appendXml($this->doc); - - $this->log("Writing XML to file: " . $this->xmlSchema->getPath()); - $out = new FileWriter($this->xmlSchema); - $xmlstr = $this->doc->saveXML(); - $out->write($xmlstr); - $out->close(); - - } catch (Exception $e) { - $this->log("There was an error building XML from metadata: " . $e->getMessage(), Project::MSG_ERR); - } - - $this->log("Schema reverse engineering finished"); - } - - /** - * Gets the GeneratorConfig object for this task or creates it on-demand. - * @return GeneratorConfig - */ - protected function getGeneratorConfig() - { - if ($this->generatorConfig === null) { - $this->generatorConfig = new GeneratorConfig(); - $this->generatorConfig->setBuildProperties($this->getProject()->getProperties()); - } - return $this->generatorConfig; - } - - /** - * Builds the model classes from the database schema. - * @return Database The built-out Database (with all tables, etc.) - */ - protected function buildModel() - { - $config = $this->getGeneratorConfig(); - $con = $this->getConnection(); - - $database = new Database($this->getDatabaseName()); - $database->setPlatform($config->getConfiguredPlatform($con)); - - // Some defaults ... - $database->setDefaultIdMethod(IDMethod::NATIVE); - - $parser = $config->getConfiguredSchemaParser($con); - - $nbTables = $parser->parse($database, $this); - - $this->log("Successfully Reverse Engineered " . $nbTables . " tables"); - - return $database; - } - - /** - * Adds any requested validators to the data model. - * - * We will add the following type specific validators: - * - * for notNull columns: required validator - * for unique indexes: unique validator - * for varchar types: maxLength validators (CHAR, VARCHAR, LONGVARCHAR) - * for numeric types: maxValue validators (BIGINT, SMALLINT, TINYINT, INTEGER, FLOAT, DOUBLE, NUMERIC, DECIMAL, REAL) - * for integer and timestamp types: notMatch validator with [^\d]+ (BIGINT, SMALLINT, TINYINT, INTEGER, TIMESTAMP) - * for float types: notMatch validator with [^\d\.]+ (FLOAT, DOUBLE, NUMERIC, DECIMAL, REAL) - * - * @param Database $database The Database model. - * @return void - * @todo find out how to evaluate the appropriate size and adjust maxValue rule values appropriate - * @todo find out if float type column values must always notMatch('[^\d\.]+'), i.e. digits and point for any db vendor, language etc. - */ - protected function addValidators(Database $database) - { - - $platform = $this->getGeneratorConfig()->getConfiguredPlatform(); - - foreach ($database->getTables() as $table) { - - $set = new PropelSchemaReverse_ValidatorSet(); - - foreach ($table->getColumns() as $col) { - - if ($col->isNotNull() && $this->isValidatorRequired(self::VALIDATORS_REQUIRED)) { - $validator = $set->getValidator($col); - $validator->addRule($this->getValidatorRule($col, 'required')); - } - - if (in_array($col->getType(), array(PropelTypes::CHAR, PropelTypes::VARCHAR, PropelTypes::LONGVARCHAR)) - && $col->getSize() && $this->isValidatorRequired(self::VALIDATORS_MAXLENGTH)) { - $validator = $set->getValidator($col); - $validator->addRule($this->getValidatorRule($col, 'maxLength', $col->getSize())); - } - - if ($col->isNumericType() && $this->isValidatorRequired(self::VALIDATORS_MAXVALUE)) { - $this->log("WARNING: maxValue validator added for column ".$col->getName().". You will have to adjust the size value manually.", Project::MSG_WARN); - $validator = $set->getValidator($col); - $validator->addRule($this->getValidatorRule($col, 'maxValue', 'REPLACEME')); - } - - if ($col->isPhpPrimitiveType() && $this->isValidatorRequired(self::VALIDATORS_TYPE)) { - $validator = $set->getValidator($col); - $validator->addRule($this->getValidatorRule($col, 'type', $col->getPhpType())); - } - - } - - foreach ($table->getUnices() as $unique) { - $colnames = $unique->getColumns(); - if (count($colnames) == 1) { // currently 'unique' validator only works w/ single columns. - $col = $table->getColumn($colnames[0]); - $validator = $set->getValidator($col); - $validator->addRule($this->getValidatorRule($col, 'unique')); - } - } - - foreach ($set->getValidators() as $validator) { - $table->addValidator($validator); - } - - } // foreach table - - } - - /** - * Gets validator rule for specified type (string). - * - * @param Column $column The column that is being validated. - * @param string $type The type (string) for validator (e.g. 'required'). - * @param mixed $value The value for the validator (if applicable) - */ - protected function getValidatorRule(Column $column, $type, $value = null) - { - $rule = new Rule(); - $rule->setName($type); - if ($value !== null) { - $rule->setValue($value); - } - $rule->setMessage($this->getRuleMessage($column, $type, $value)); - return $rule; - } - - /** - * Gets the message for a specified rule. - * - * @param Column $column - * @param string $type - * @param mixed $value - */ - protected function getRuleMessage(Column $column, $type, $value) - { - // create message - $colName = $column->getName(); - $tableName = $column->getTable()->getName(); - $msg = self::$validatorMessages[strtolower($type)]; - $tmp = compact($msg['var']); - array_unshift($tmp, $msg['msg']); - $msg = call_user_func_array('sprintf', $tmp); - return $msg; - } - -} - -/** - * A helper class to store validator sets indexed by column. - * @package propel.generator.task - */ -class PropelSchemaReverse_ValidatorSet -{ - - /** - * Map of column names to validators. - * - * @var array Validator[] - */ - private $validators = array(); - - /** - * Gets a single validator for specified column name. - * @param Column $column - * @return Validator - */ - public function getValidator(Column $column) - { - $key = $column->getName(); - if (!isset($this->validators[$key])) { - $this->validators[$key] = new Validator(); - $this->validators[$key]->setColumn($column); - } - return $this->validators[$key]; - } - - /** - * Gets all validators. - * @return array Validator[] - */ - public function getValidators() - { - return $this->validators; - } -} diff --git a/airtime_mvc/library/propel/generator/pear/BuildPropelGenPEARPackageTask.php b/airtime_mvc/library/propel/generator/pear/BuildPropelGenPEARPackageTask.php deleted file mode 100644 index 87d21602c2..0000000000 --- a/airtime_mvc/library/propel/generator/pear/BuildPropelGenPEARPackageTask.php +++ /dev/null @@ -1,258 +0,0 @@ -. - */ - -require_once 'phing/tasks/system/MatchingTask.php'; -include_once 'phing/types/FileSet.php'; -include_once 'phing/tasks/ext/pearpackage/Fileset.php'; - -/** - * - * @author Hans Lellelid - * @package phing.tasks.ext - * @version $Revision: 1681 $ - */ -class BuildPropelGenPEARPackageTask extends MatchingTask -{ - - /** Base directory for reading files. */ - private $dir; - - private $version; - private $state = 'stable'; - private $notes; - - private $filesets = array(); - - /** Package file */ - private $packageFile; - - public function init() - { - include_once 'PEAR/PackageFileManager2.php'; - if (!class_exists('PEAR_PackageFileManager2')) { - throw new BuildException("You must have installed PEAR_PackageFileManager2 (PEAR_PackageFileManager >= 1.6.0) in order to create a PEAR package.xml file."); - } - } - - private function setOptions($pkg) - { - $options['baseinstalldir'] = 'propel'; - $options['packagedirectory'] = $this->dir->getAbsolutePath(); - - if (empty($this->filesets)) { - throw new BuildException("You must use a tag to specify the files to include in the package.xml"); - } - - $options['filelistgenerator'] = 'Fileset'; - - // Some PHING-specific options needed by our Fileset reader - $options['phing_project'] = $this->getProject(); - $options['phing_filesets'] = $this->filesets; - - if ($this->packageFile !== null) { - // create one w/ full path - $f = new PhingFile($this->packageFile->getAbsolutePath()); - $options['packagefile'] = $f->getName(); - // must end in trailing slash - $options['outputdirectory'] = $f->getParent() . DIRECTORY_SEPARATOR; - $this->log("Creating package file: " . $f->getPath(), Project::MSG_INFO); - } else { - $this->log("Creating [default] package.xml file in base directory.", Project::MSG_INFO); - } - - // add baseinstalldir exceptions - $options['installexceptions'] = array( - 'pear-propel-gen' => '/', - 'pear-propel-gen.bat' => '/', - ); - - $options['dir_roles'] = array( - 'lib' => 'data', - 'resources' => 'data' - ); - - $options['exceptions'] = array( - 'pear-propel-gen.bat' => 'script', - 'pear-propel-gen' => 'script', - ); - - $pkg->setOptions($options); - - } - - /** - * Main entry point. - * @return void - */ - public function main() - { - if ($this->dir === null) { - throw new BuildException("You must specify the \"dir\" attribute for PEAR package task."); - } - - if ($this->version === null) { - throw new BuildException("You must specify the \"version\" attribute for PEAR package task."); - } - - $package = new PEAR_PackageFileManager2(); - - $this->setOptions($package); - - // the hard-coded stuff - $package->setPackage('propel_generator'); - $package->setSummary('Generator component of the Propel PHP object persistence layer'); - $package->setDescription('Propel is an object persistence layer for PHP5 based on Apache Torque. This package provides the generator engine that builds PHP classes and SQL DDL based on an XML representation of your data model.'); - $package->setChannel('pear.propelorm.org'); - $package->setPackageType('php'); - - $package->setReleaseVersion($this->version); - $package->setAPIVersion($this->version); - - $package->setReleaseStability($this->state); - $package->setAPIStability($this->state); - - $package->setNotes($this->notes); - - $package->setLicense('MIT', 'http://www.opensource.org/licenses/mit-license.php'); - - // Add package maintainers - $package->addMaintainer('lead', 'hans', 'Hans Lellelid', 'hans@xmpl.org'); - $package->addMaintainer('lead', 'david', 'David Zuelke', 'dz@bitxtender.com'); - $package->addMaintainer('lead', 'francois', 'Francois Zaninotto', 'fzaninotto@[gmail].com'); - - // creating a sub-section for 'windows' - $package->addRelease(); - $package->setOSInstallCondition('windows'); - $package->addInstallAs('pear-propel-gen.bat', 'propel-gen.bat'); - $package->addIgnoreToRelease('pear-propel-gen'); - - // creating a sub-section for non-windows - $package->addRelease(); - $package->addInstallAs('pear-propel-gen', 'propel-gen'); - $package->addIgnoreToRelease('pear-propel-gen.bat'); - - // "core" dependencies - $package->setPhpDep('5.2.4'); - $package->setPearinstallerDep('1.4.0'); - - // "package" dependencies - $package->addPackageDepWithChannel('required', 'phing', 'pear.phing.info', '2.3.0'); - - $package->addExtensionDep('required', 'pdo'); - $package->addExtensionDep('required', 'xml'); - $package->addExtensionDep('required', 'xsl'); - - // now add the replacements .... - $package->addReplacement('pear-propel-gen.bat', 'pear-config', '@DATA-DIR@', 'data_dir'); - $package->addReplacement('pear-propel-gen', 'pear-config', '@DATA-DIR@', 'data_dir'); - - // now we run this weird generateContents() method that apparently - // is necessary before we can add replacements ... ? - $package->generateContents(); - - $e = $package->writePackageFile(); - - if (PEAR::isError($e)) { - throw new BuildException("Unable to write package file.", new Exception($e->getMessage())); - } - - } - - /** - * Used by the PEAR_PackageFileManager_PhingFileSet lister. - * @return array FileSet[] - */ - public function getFileSets() - { - return $this->filesets; - } - - // ------------------------------- - // Set properties from XML - // ------------------------------- - - /** - * Nested creator, creates a FileSet for this task - * - * @return FileSet The created fileset object - */ - function createFileSet() - { - $num = array_push($this->filesets, new FileSet()); - return $this->filesets[$num-1]; - } - - /** - * Set the version we are building. - * @param string $v - * @return void - */ - public function setVersion($v) - { - $this->version = $v; - } - - /** - * Set the state we are building. - * @param string $v - * @return void - */ - public function setState($v) - { - $this->state = $v; - } - - /** - * Sets release notes field. - * @param string $v - * @return void - */ - public function setNotes($v) - { - $this->notes = $v; - } - /** - * Sets "dir" property from XML. - * @param PhingFile $f - * @return void - */ - public function setDir(PhingFile $f) - { - $this->dir = $f; - } - - /** - * Sets the file to use for generated package.xml - */ - public function setDestFile(PhingFile $f) - { - $this->packageFile = $f; - } - -} diff --git a/airtime_mvc/library/propel/generator/pear/build-pear-package.xml b/airtime_mvc/library/propel/generator/pear/build-pear-package.xml deleted file mode 100644 index 62ce2103ab..0000000000 --- a/airtime_mvc/library/propel/generator/pear/build-pear-package.xml +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Propel version for package - - - - - - - - - ----------------------------- - | Creating directory layout | - ----------------------------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ----------------------------- - | Creating PEAR package.xml | - ----------------------------- - - - - - - - - - - - - - - - ----------------------------- - | Creating tar.gz package | - ----------------------------- - - - - - - \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/pear/build.properties b/airtime_mvc/library/propel/generator/pear/build.properties deleted file mode 100644 index 0f6c76b900..0000000000 --- a/airtime_mvc/library/propel/generator/pear/build.properties +++ /dev/null @@ -1,5 +0,0 @@ -# In this file you can define any properties taht you want to affect -# all projects built using the propel-gen script on this system -# -# See http://www.propelorm.org/wiki/Documentation/1.5/BuildConfiguration -# for a list of available properties. diff --git a/airtime_mvc/library/propel/generator/pear/pear-build.xml b/airtime_mvc/library/propel/generator/pear/pear-build.xml deleted file mode 100644 index dbc84eebdc..0000000000 --- a/airtime_mvc/library/propel/generator/pear/pear-build.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing additional properties file: ${additional.properties} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/pear/pear-propel-gen b/airtime_mvc/library/propel/generator/pear/pear-propel-gen deleted file mode 100755 index 253ef29208..0000000000 --- a/airtime_mvc/library/propel/generator/pear/pear-propel-gen +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -# ------------------------------------------------------------------------ -# The phing build script for Unix based systems -# $Id: pear-propel-gen,v 1.2 2004/10/17 13:24:09 hlellelid Exp $ -# ------------------------------------------------------------------------ - -# ------------------------------------------------------------------------- -# Do not change anything below this line unless you know what you're doing. -# ------------------------------------------------------------------------- - -# (currently this is not reached) -if (test -z "$PHING_COMMAND") ; then - export PHING_COMMAND="phing" -fi - -if [ $# = 1 ] ; then - saveddir=`pwd` - $PHING_COMMAND -f @DATA-DIR@/propel_generator/pear-build.xml -Dproject.dir=$saveddir $* -else - $PHING_COMMAND -f @DATA-DIR@/propel_generator/pear-build.xml -Dproject.dir=$* -fi - - diff --git a/airtime_mvc/library/propel/generator/pear/pear-propel-gen.bat b/airtime_mvc/library/propel/generator/pear/pear-propel-gen.bat deleted file mode 100644 index 754ea59117..0000000000 --- a/airtime_mvc/library/propel/generator/pear/pear-propel-gen.bat +++ /dev/null @@ -1,30 +0,0 @@ -@ECHO OFF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: The propel-gen build script for Windows based systems -:: $Id: pear-propel-gen.bat,v 1.2 2004/10/17 13:24:09 hlellelid Exp $ -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -::---------------------------------------------------------------------------------- -:: Please set following to the "phing" script. By default this is expected to be -:: on your path. (You don't need to modify this file if that is the case.) - -SET phingScript=phing - -::--------------------------------------------------------------------------------- -::--------------------------------------------------------------------------------- -:: Do not modify below this line!! (Unless you know what your doing :) -::--------------------------------------------------------------------------------- -::--------------------------------------------------------------------------------- - -set nbArgs=0 -for %%x in (%*) do Set /A nbArgs+=1 -if %nbArgs% leq 1 ( - "%phingScript%" -f "@DATA-DIR@\propel_generator\pear-build.xml" -Dproject.dir="%CD%" %* -) else ( - "%phingScript%" -f "@DATA-DIR@\propel_generator\pear-build.xml" -Dproject.dir=%* -) -GOTO :EOF - -:PAUSE_END -PAUSE \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/resources/dtd/database.dtd b/airtime_mvc/library/propel/generator/resources/dtd/database.dtd deleted file mode 100644 index 1de399e8be..0000000000 --- a/airtime_mvc/library/propel/generator/resources/dtd/database.dtd +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/airtime_mvc/library/propel/generator/resources/xsd/custom_datatypes.xsd b/airtime_mvc/library/propel/generator/resources/xsd/custom_datatypes.xsd deleted file mode 100644 index 12e8327cb4..0000000000 --- a/airtime_mvc/library/propel/generator/resources/xsd/custom_datatypes.xsd +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/airtime_mvc/library/propel/generator/resources/xsd/database.xsd b/airtime_mvc/library/propel/generator/resources/xsd/database.xsd deleted file mode 100644 index a54046efab..0000000000 --- a/airtime_mvc/library/propel/generator/resources/xsd/database.xsd +++ /dev/null @@ -1,862 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The name of the column as it appears in the database. - - - - - - - Name used in PHP code to reference this column (in getters, setters, etc.). Defaults to the name transformed by the phpNamingMethod, which defaults to a CamelCase converter. So by default, a column named 'author_id' receives 'AuthorId' as phpName. - - - - - - - Name used for the class constant corresponding to this column in PHP code. Defaults to the uppercase name, so a column named 'author_id' receives 'AUTHOR_ID' as peerName. - - - - - - - - Visibility for the column accessor method. 'public' by default, also accepts 'protected' and 'private'. - - - - - - - Visibility for the column mutator method. 'public' by default, also accepts 'protected' and 'private'. - - - - - - - Set to true to add a primary key on this column. - - - - - - - Set to true to forbid NULL values. - - - - - - - Any of the Propel supported data types. These types are database-agnostic, and converted to the native database type according to the connection. - - - - - - - Native database column type. - - - - - - - PHP type for te column in PHP code. This column's setter uses type casting with the set php_type; besides, generated phpDoc in the model classes use this attribute for code completion. - - - - - - - Numeric length of the column. - - - - - - - Digits after decimal place - - - - - - - Synonym for defaultValue - - - - - - - The default value that the object will have for this column in the PHP instance after creating a "new Object". This value is always interpreted as a string. See defaultExpr for setting an SQL function as a default value. - - - - - - - The default value for this column as expressed in SQL. This value is used solely for the "sql" target which builds your database from the schema.xml file. The defaultExpr is the SQL expression used as the "default" for the column. - - - - - - - - - - Name of the method used to transform the column name into a phpName. Defaults to 'clean', which Removes any character that is not a letter or a number and capitilizes the first letter of the name, the first letter of each alphanumeric block, and converts the rest of the letters to lowercase. Possible values: any of the PhpNameGenerator CONV_METHOD_XXX constants (clean, underscore, phpName, nochange). - - - - - - - A text description of the column. It gets added to the SQL CREATE table as a comment, and appears in the phpDoc bloc of the related getter and setter methods in the ActiveRecord class. - - - - - - - Set to true to skip this column by default during hydration. That means that this column will be hydrated on demand, using a supplementary query. Mostly useful for LOB columns. - - - - - - - (DEPRECATED) For use with treeMode table attribute. - - - - - - - (DEPRECATED) For use with treeMode table attribute. - - - - - - - (DEPRECATED) For use with treeMode table attribute. - - - - - - - (DEPRECATED) For use with treeMode table attribute. - - - - - - - (DEPRECATED) For use with treeMode table attribute. - - - - - - - A column defined as primary string serves as default value for a `__toString()` method in the generated Propel object. - - - - - - - - - - - A reference between a local and a foreign column. Composite foreign keys can have several references. - - - - - - - - - The other table name - - - - - - - Name for this foreign key - - - - - - - Name for the foreign object in methods generated in this class. - - - - - - - Name for this object in methods generated in the foreign class - - - - - - - This affects the default join type used in the generated `joinXXX()` methods in the model query class. Propel uses an INNER JOIN for foreign keys attached to a required column, and a LEFT JOIN for foreign keys attached to a non-required column, but you can override this in the foreign key element. - - - - - - - - - - - - The (absolute or relative to this schema dir name) path to the external schema file. - - - - - - - - - - - - - A column of the table - - - - - - - - A foreign key on one or several columns in this table, referencing a foreign table - - - - - - - - An index on one or several columns of the current table - - - - - - - - A unique index on one or several columns of the current table - - - - - - - - If you are using a database that uses sequences for auto-increment columns (e.g. PostgreSQL or Oracle), you can customize the name of the sequence using this tag - - - - - - - - A validator to be executed on a given column at runtime - - - - - - - - A behavior to be added to the current table. Can modify the table structure, as well as modify the runtime code of the generated Model objects linked to this table. Bundled behaviors include alternative_coding_standards, auto_add_pk, timestampable, sluggable, soft_delete, sortable, nested_set, query_cache, and concrete_inheritance. - - - - - - - - table attributes specific to a database vendor. Only supports MySQL specific table attributes for now (Charset, Collate, Checksum, Pack_keys, Delay_key_write). - - - - - - - - - The name of the table as it appears in the database. - - - - - - - The name of the ActiveRecord class generated for this table. Defaults to the name transformed by the phpNamingMethod, which defaults to a CamelCase converter. So by default, a table named 'foo_author' receives 'FooAuthor' as phpName. - - - - - - - The PHP 5.3 namespace to use for the generated model classes. - - - - - - - - Default visibility for column accessor methods. 'public' by default, also accepts 'protected' and 'private'. - - - - - - - Default visibility for column mutator methods. 'public' by default, also accepts 'protected' and 'private'. - - - - - - - Id method to use for auto-increment columns. - - - - - - - Can be used if you want to define the primary key of a new object being inserted. By default if idMethod is "native", Propel would throw an exception. However, in some cases this feature is useful, for example if you do some replication of data in an master-master environment. - - - - - - - Instructs Propel not to generate DDL SQL for the specified table. This can be used together with readOnly for supperting VIEWS in Propel - - - - - - - Suppresses the mutator/setter methods, save() and delete() methods. - - - - - - - Whether the generated stub class will be abstract (e.g. if you're using inheritance) - - - - - - - Allows you to specify a class that the generated Propel objects should extend (in place of propel.om.BaseObject) - - - - - - - Instructs Propel to use a different SQL-generating BasePeer class (or sub-class of BasePeer). - - - - - - - - Specifies the "package" for the generated classes. Classes are created in subdirectories according to the package attribute value. - - - - - - - - Name of the method used to transform the table name into a phpName. Defaults to 'clean', which Removes any character that is not a letter or a number and capitilizes the first letter of the name, the first letter of each alphanumeric block, and converts the rest of the letters to lowercase. Possible values: any of the PhpNameGenerator CONV_METHOD_XXX constants (clean, underscore, phpName, nochange). - - - - - - - Adds indexes for each component of the primary key (when using composite primary keys) - - - - - - - A text description of the table. It gets added to the SQL CREATE table as a comment, and appears in the phpDoc bloc of the related ActiveRecord class. - - - - - - - Used to indicate that this table is part of a node tree. Currently the only supported values are "NestedSet" and "MaterializedPath" (DEPRECATED: use nested_set behavior instead). - - - - - - - Indicate that the object should be reloaded from the database when an INSERT is performed. This is useful if you have triggers (or other server-side functionality like column default expressions) that alters the database row on INSERT. - - - - - - - Indicate that the object should be reloaded from the database when an UPDATE is performed. This is useful if you have triggers (or other server-side functionality like column default expressions) that alters the database row on UPDATE. - - - - - - - Set to true if the current table is a cross-reference table in a many-to-many relationship to allow generation of getter and setter in each of the tables of the relationship. - - - - - - - - - - - Embed an external schema file into the current schema. Accepts absolute and relative schema file paths. - - - - - - - A table using the database connection. - - - - - - - Behavior to be applied to all the database tables - - - - - - - - The name of the table in the database. Propel advocates the use of singular table names. - - - - - - - Default id method to use for auto-increment columns - - - - - - - - Default visibility for column accessor methods. 'public' by default, also accepts 'protected' and 'private'. - - - - - - - Default visibility for column mutator methods. 'public' by default, also accepts 'protected' and 'private'. - - - - - - - Specifies the "package" for the generated classes. Classes are created in subdirectories according to the package attribute value. - - - - - - - The PHP 5.3 namespace to use for the generated model classes of the database. Can be overridden on a per-table basis. - - - - - - - Allows to specify a default base class that all generated Propel objects should extend (in place of propel.om.BaseObject) - - - - - - - Instructs Propel to use a different SQL-generating BasePeer class (or sub-class of BasePeer) for all generated objects - - - - - - - The default naming method to use in this database. - - - - - - - Adds indexes for each component of the primary key (when using composite primary keys) - - - - - - - Adds a prefix to all the SQL table names - - - - - diff --git a/airtime_mvc/library/propel/generator/resources/xsl/database.xsl b/airtime_mvc/library/propel/generator/resources/xsl/database.xsl deleted file mode 100644 index 81d8217ad5..0000000000 --- a/airtime_mvc/library/propel/generator/resources/xsl/database.xsl +++ /dev/null @@ -1,292 +0,0 @@ - - -]> - - - - - - - - - - - - native - - - underscore - - - false - - - - - - - - - - - - - - - - - - none - - - - - - - - - - - - - - - - - none - - - - - - - - - - - - - - - - - - - - - - - - -
- - false - - - false - - - - - - - - - - -
- - - - - - - none - - - none - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - - - - - - - - - - - - - - - - - - class - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - false - - - VARCHAR - - - false - - - false - - - 255 - - - - - - - - - - - - - - - diff --git a/airtime_mvc/library/propel/runtime/lib/Propel.php b/airtime_mvc/library/propel/runtime/lib/Propel.php deleted file mode 100644 index 6171408e1d..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/Propel.php +++ /dev/null @@ -1,916 +0,0 @@ - (Propel) - * @author Daniel Rall (Torque) - * @author Magnús Þór Torfason (Torque) - * @author Jason van Zyl (Torque) - * @author Rafal Krzewski (Torque) - * @author Martin Poeschl (Torque) - * @author Henning P. Schmiedehausen (Torque) - * @author Kurt Schrader (Torque) - * @version $Revision: 1811 $ - * @package propel.runtime - */ -class Propel -{ - /** - * The Propel version. - */ - const VERSION = '1.5.2'; - - /** - * A constant for default. - */ - const DEFAULT_NAME = "default"; - - /** - * A constant defining 'System is unusuable' logging level - */ - const LOG_EMERG = 0; - - /** - * A constant defining 'Immediate action required' logging level - */ - const LOG_ALERT = 1; - - /** - * A constant defining 'Critical conditions' logging level - */ - const LOG_CRIT = 2; - - /** - * A constant defining 'Error conditions' logging level - */ - const LOG_ERR = 3; - - /** - * A constant defining 'Warning conditions' logging level - */ - const LOG_WARNING = 4; - - /** - * A constant defining 'Normal but significant' logging level - */ - const LOG_NOTICE = 5; - - /** - * A constant defining 'Informational' logging level - */ - const LOG_INFO = 6; - - /** - * A constant defining 'Debug-level messages' logging level - */ - const LOG_DEBUG = 7; - - /** - * The class name for a PDO object. - */ - const CLASS_PDO = 'PDO'; - - /** - * The class name for a PropelPDO object. - */ - const CLASS_PROPEL_PDO = 'PropelPDO'; - - /** - * The class name for a DebugPDO object. - */ - const CLASS_DEBUG_PDO = 'DebugPDO'; - - /** - * Constant used to request a READ connection (applies to replication). - */ - const CONNECTION_READ = 'read'; - - /** - * Constant used to request a WRITE connection (applies to replication). - */ - const CONNECTION_WRITE = 'write'; - - /** - * @var string The db name that is specified as the default in the property file - */ - private static $defaultDBName; - - /** - * @var array The global cache of database maps - */ - private static $dbMaps = array(); - - /** - * @var array The cache of DB adapter keys - */ - private static $adapterMap = array(); - - /** - * @var array Cache of established connections (to eliminate overhead). - */ - private static $connectionMap = array(); - - /** - * @var PropelConfiguration Propel-specific configuration. - */ - private static $configuration; - - /** - * @var bool flag to set to true once this class has been initialized - */ - private static $isInit = false; - - /** - * @var Log optional logger - */ - private static $logger = null; - - /** - * @var string The name of the database mapper class - */ - private static $databaseMapClass = 'DatabaseMap'; - - /** - * @var bool Whether the object instance pooling is enabled - */ - private static $instancePoolingEnabled = true; - - /** - * @var bool For replication, whether to force the use of master connection. - */ - private static $forceMasterConnection = false; - - /** - * @var string Base directory to use for autoloading. Initialized in self::initBaseDir() - */ - protected static $baseDir; - - /** - * @var array A map of class names and their file paths for autoloading - */ - protected static $autoloadMap = array( - - 'DBAdapter' => 'adapter/DBAdapter.php', - 'DBMSSQL' => 'adapter/DBMSSQL.php', - 'MssqlPropelPDO' => 'adapter/MSSQL/MssqlPropelPDO.php', - 'MssqlDebugPDO' => 'adapter/MSSQL/MssqlDebugPDO.php', - 'MssqlDateTime' => 'adapter/MSSQL/MssqlDateTime.class.php', - 'DBMySQL' => 'adapter/DBMySQL.php', - 'DBMySQLi' => 'adapter/DBMySQLi.php', - 'DBNone' => 'adapter/DBNone.php', - 'DBOracle' => 'adapter/DBOracle.php', - 'DBPostgres' => 'adapter/DBPostgres.php', - 'DBSQLite' => 'adapter/DBSQLite.php', - 'DBSybase' => 'adapter/DBSybase.php', - - 'PropelArrayCollection' => 'collection/PropelArrayCollection.php', - 'PropelCollection' => 'collection/PropelCollection.php', - 'PropelObjectCollection' => 'collection/PropelObjectCollection.php', - 'PropelOnDemandCollection' => 'collection/PropelOnDemandCollection.php', - 'PropelOnDemandIterator' => 'collection/PropelOnDemandIterator.php', - - 'PropelConfiguration' => 'config/PropelConfiguration.php', - 'PropelConfigurationIterator' => 'config/PropelConfigurationIterator.php', - - 'PropelPDO' => 'connection/PropelPDO.php', - 'DebugPDO' => 'connection/DebugPDO.php', - 'DebugPDOStatement' => 'connection/DebugPDOStatement.php', - - 'PropelException' => 'exception/PropelException.php', - - 'ModelWith' => 'formatter/ModelWith.php', - 'PropelArrayFormatter' => 'formatter/PropelArrayFormatter.php', - 'PropelFormatter' => 'formatter/PropelFormatter.php', - 'PropelObjectFormatter' => 'formatter/PropelObjectFormatter.php', - 'PropelOnDemandFormatter' => 'formatter/PropelOnDemandFormatter.php', - 'PropelStatementFormatter' => 'formatter/PropelStatementFormatter.php', - - 'BasicLogger' => 'logger/BasicLogger.php', - 'MojaviLogAdapter' => 'logger/MojaviLogAdapter.php', - - 'ColumnMap' => 'map/ColumnMap.php', - 'DatabaseMap' => 'map/DatabaseMap.php', - 'TableMap' => 'map/TableMap.php', - 'RelationMap' => 'map/RelationMap.php', - 'ValidatorMap' => 'map/ValidatorMap.php', - - 'BaseObject' => 'om/BaseObject.php', - 'NodeObject' => 'om/NodeObject.php', - 'Persistent' => 'om/Persistent.php', - 'PreOrderNodeIterator' => 'om/PreOrderNodeIterator.php', - 'NestedSetPreOrderNodeIterator' => 'om/NestedSetPreOrderNodeIterator.php', - 'NestedSetRecursiveIterator' => 'om/NestedSetRecursiveIterator.php', - - 'Criteria' => 'query/Criteria.php', - 'Criterion' => 'query/Criterion.php', - 'CriterionIterator' => 'query/CriterionIterator.php', - 'Join' => 'query/Join.php', - 'ModelCriteria' => 'query/ModelCriteria.php', - 'ModelCriterion' => 'query/ModelCriterion.php', - 'ModelJoin' => 'query/ModelJoin.php', - 'PropelQuery' => 'query/PropelQuery.php', - - 'BasePeer' => 'util/BasePeer.php', - 'NodePeer' => 'util/NodePeer.php', - 'PeerInfo' => 'util/PeerInfo.php', - 'PropelAutoloader' => 'util/PropelAutoloader.php', - 'PropelColumnTypes' => 'util/PropelColumnTypes.php', - 'PropelConditionalProxy' => 'util/PropelConditionalProxy.php', - 'PropelModelPager' => 'util/PropelModelPager.php', - 'PropelPager' => 'util/PropelPager.php', - 'PropelDateTime' => 'util/PropelDateTime.php', - - 'BasicValidator' => 'validator/BasicValidator.php', - 'MatchValidator' => 'validator/MatchValidator.php', - 'MaxLengthValidator' => 'validator/MaxLengthValidator.php', - 'MaxValueValidator' => 'validator/MaxValueValidator.php', - 'MinLengthValidator' => 'validator/MinLengthValidator.php', - 'MinValueValidator' => 'validator/MinValueValidator.php', - 'NotMatchValidator' => 'validator/NotMatchValidator.php', - 'RequiredValidator' => 'validator/RequiredValidator.php', - 'UniqueValidator' => 'validator/UniqueValidator.php', - 'ValidValuesValidator' => 'validator/ValidValuesValidator.php', - 'ValidationFailed' => 'validator/ValidationFailed.php', - ); - - /** - * Initializes Propel - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function initialize() - { - if (self::$configuration === null) { - throw new PropelException("Propel cannot be initialized without a valid configuration. Please check the log files for further details."); - } - - self::configureLogging(); - - // reset the connection map (this should enable runtime changes of connection params) - self::$connectionMap = array(); - - if (isset(self::$configuration['classmap']) && is_array(self::$configuration['classmap'])) { - PropelAutoloader::getInstance()->addClassPaths(self::$configuration['classmap']); - PropelAutoloader::getInstance()->register(); - } - - self::$isInit = true; - } - - /** - * Configure Propel a PHP (array) config file. - * - * @param string Path (absolute or relative to include_path) to config file. - * - * @throws PropelException If configuration file cannot be opened. - * (E_WARNING probably will also be raised by PHP) - */ - public static function configure($configFile) - { - $configuration = include($configFile); - if ($configuration === false) { - throw new PropelException("Unable to open configuration file: " . var_export($configFile, true)); - } - self::setConfiguration($configuration); - } - - /** - * Configure the logging system, if config is specified in the runtime configuration. - */ - protected static function configureLogging() - { - if (self::$logger === null) { - if (isset(self::$configuration['log']) && is_array(self::$configuration['log']) && count(self::$configuration['log'])) { - include_once 'Log.php'; // PEAR Log class - $c = self::$configuration['log']; - $type = isset($c['type']) ? $c['type'] : 'file'; - $name = isset($c['name']) ? $c['name'] : './propel.log'; - $ident = isset($c['ident']) ? $c['ident'] : 'propel'; - $conf = isset($c['conf']) ? $c['conf'] : array(); - $level = isset($c['level']) ? $c['level'] : PEAR_LOG_DEBUG; - self::$logger = Log::singleton($type, $name, $ident, $conf, $level); - } // if isset() - } - } - - /** - * Initialization of Propel a PHP (array) configuration file. - * - * @param string $c The Propel configuration file path. - * - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public static function init($c) - { - self::configure($c); - self::initialize(); - } - - /** - * Determine whether Propel has already been initialized. - * - * @return bool True if Propel is already initialized. - */ - public static function isInit() - { - return self::$isInit; - } - - /** - * Sets the configuration for Propel and all dependencies. - * - * @param mixed The Configuration (array or PropelConfiguration) - */ - public static function setConfiguration($c) - { - if (is_array($c)) { - if (isset($c['propel']) && is_array($c['propel'])) { - $c = $c['propel']; - } - $c = new PropelConfiguration($c); - } - self::$configuration = $c; - } - - /** - * Get the configuration for this component. - * - * @param int - PropelConfiguration::TYPE_ARRAY: return the configuration as an array - * (for backward compatibility this is the default) - * - PropelConfiguration::TYPE_ARRAY_FLAT: return the configuration as a flat array - * ($config['name.space.item']) - * - PropelConfiguration::TYPE_OBJECT: return the configuration as a PropelConfiguration instance - * @return mixed The Configuration (array or PropelConfiguration) - */ - public static function getConfiguration($type = PropelConfiguration::TYPE_ARRAY) - { - return self::$configuration->getParameters($type); - } - - /** - * Override the configured logger. - * - * This is primarily for things like unit tests / debugging where - * you want to change the logger without altering the configuration file. - * - * You can use any logger class that implements the propel.logger.BasicLogger - * interface. This interface is based on PEAR::Log, so you can also simply pass - * a PEAR::Log object to this method. - * - * @param object The new logger to use. ([PEAR] Log or BasicLogger) - */ - public static function setLogger($logger) - { - self::$logger = $logger; - } - - /** - * Returns true if a logger, for example PEAR::Log, has been configured, - * otherwise false. - * - * @return bool True if Propel uses logging - */ - public static function hasLogger() - { - return (self::$logger !== null); - } - - /** - * Get the configured logger. - * - * @return object Configured log class ([PEAR] Log or BasicLogger). - */ - public static function logger() - { - return self::$logger; - } - - /** - * Logs a message - * If a logger has been configured, the logger will be used, otherwrise the - * logging message will be discarded without any further action - * - * @param string The message that will be logged. - * @param string The logging level. - * - * @return bool True if the message was logged successfully or no logger was used. - */ - public static function log($message, $level = self::LOG_DEBUG) - { - if (self::hasLogger()) { - $logger = self::logger(); - switch ($level) { - case self::LOG_EMERG: - return $logger->log($message, $level); - case self::LOG_ALERT: - return $logger->alert($message); - case self::LOG_CRIT: - return $logger->crit($message); - case self::LOG_ERR: - return $logger->err($message); - case self::LOG_WARNING: - return $logger->warning($message); - case self::LOG_NOTICE: - return $logger->notice($message); - case self::LOG_INFO: - return $logger->info($message); - default: - return $logger->debug($message); - } - } - return true; - } - - /** - * Returns the database map information. Name relates to the name - * of the connection pool to associate with the map. - * - * The database maps are "registered" by the generated map builder classes. - * - * @param string The name of the database corresponding to the DatabaseMap to retrieve. - * - * @return DatabaseMap The named DatabaseMap. - * - * @throws PropelException - if database map is null or propel was not initialized properly. - */ - public static function getDatabaseMap($name = null) - { - if ($name === null) { - $name = self::getDefaultDB(); - if ($name === null) { - throw new PropelException("DatabaseMap name is null!"); - } - } - - if (!isset(self::$dbMaps[$name])) { - $clazz = self::$databaseMapClass; - self::$dbMaps[$name] = new $clazz($name); - } - - return self::$dbMaps[$name]; - } - - /** - * Sets the database map object to use for specified datasource. - * - * @param string $name The datasource name. - * @param DatabaseMap $map The database map object to use for specified datasource. - */ - public static function setDatabaseMap($name, DatabaseMap $map) - { - if ($name === null) { - $name = self::getDefaultDB(); - } - self::$dbMaps[$name] = $map; - } - - /** - * For replication, set whether to always force the use of a master connection. - * - * @param boolean $bit True or False - */ - public static function setForceMasterConnection($bit) - { - self::$forceMasterConnection = (bool) $bit; - } - - /** - * For replication, whether to always force the use of a master connection. - * - * @return boolean - */ - public static function getForceMasterConnection() - { - return self::$forceMasterConnection; - } - - /** - * Sets a Connection for specified datasource name. - * - * @param string $name The datasource name for the connection being set. - * @param PropelPDO $con The PDO connection. - * @param string $mode Whether this is a READ or WRITE connection (Propel::CONNECTION_READ, Propel::CONNECTION_WRITE) - */ - public static function setConnection($name, PropelPDO $con, $mode = Propel::CONNECTION_WRITE) - { - if ($name === null) { - $name = self::getDefaultDB(); - } - if ($mode == Propel::CONNECTION_READ) { - self::$connectionMap[$name]['slave'] = $con; - } else { - self::$connectionMap[$name]['master'] = $con; - } - } - - /** - * Gets an already-opened PDO connection or opens a new one for passed-in db name. - * - * @param string $name The datasource name that is used to look up the DSN from the runtime configuation file. - * @param string $mode The connection mode (this applies to replication systems). - * - * @return PDO A database connection - * - * @throws PropelException - if connection cannot be configured or initialized. - */ - public static function getConnection($name = null, $mode = Propel::CONNECTION_WRITE) - { - if ($name === null) { - $name = self::getDefaultDB(); - } - - // IF a WRITE-mode connection was requested - // or Propel is configured to always use the master connection - // THEN return the master connection. - if ($mode != Propel::CONNECTION_READ || self::$forceMasterConnection) { - return self::getMasterConnection($name); - } else { - return self::getSlaveConnection($name); - } - - } - - /** - * Gets an already-opened write PDO connection or opens a new one for passed-in db name. - * - * @param string $name The datasource name that is used to look up the DSN - * from the runtime configuation file. Empty name not allowed. - * - * @return PDO A database connection - * - * @throws PropelException - if connection cannot be configured or initialized. - */ - public static function getMasterConnection($name) - { - if (!isset(self::$connectionMap[$name]['master'])) { - // load connection parameter for master connection - $conparams = isset(self::$configuration['datasources'][$name]['connection']) ? self::$configuration['datasources'][$name]['connection'] : null; - if (empty($conparams)) { - throw new PropelException('No connection information in your runtime configuration file for datasource ['.$name.']'); - } - // initialize master connection - $con = Propel::initConnection($conparams, $name); - self::$connectionMap[$name]['master'] = $con; - } - - return self::$connectionMap[$name]['master']; - } - - /** - * Gets an already-opened read PDO connection or opens a new one for passed-in db name. - * - * @param string $name The datasource name that is used to look up the DSN - * from the runtime configuation file. Empty name not allowed. - * - * @return PDO A database connection - * - * @throws PropelException - if connection cannot be configured or initialized. - */ - public static function getSlaveConnection($name) - { - if (!isset(self::$connectionMap[$name]['slave'])) { - - $slaveconfigs = isset(self::$configuration['datasources'][$name]['slaves']) ? self::$configuration['datasources'][$name]['slaves'] : null; - - if (empty($slaveconfigs)) { - // no slaves configured for this datasource - // fallback to the master connection - self::$connectionMap[$name]['slave'] = self::getMasterConnection($name); - } else { - // Initialize a new slave - if (isset($slaveconfigs['connection']['dsn'])) { - // only one slave connection configured - $conparams = $slaveconfigs['connection']; - } else { - // more than one sleve connection configured - // pickup a random one - $randkey = array_rand($slaveconfigs['connection']); - $conparams = $slaveconfigs['connection'][$randkey]; - if (empty($conparams)) { - throw new PropelException('No connection information in your runtime configuration file for SLAVE ['.$randkey.'] to datasource ['.$name.']'); - } - } - - // initialize slave connection - $con = Propel::initConnection($conparams, $name); - self::$connectionMap[$name]['slave'] = $con; - } - - } // if datasource slave not set - - return self::$connectionMap[$name]['slave']; - } - - /** - * Opens a new PDO connection for passed-in db name. - * - * @param array $conparams Connection paramters. - * @param string $name Datasource name. - * @param string $defaultClass The PDO subclass to instantiate if there is no explicit classname - * specified in the connection params (default is Propel::CLASS_PROPEL_PDO) - * - * @return PDO A database connection of the given class (PDO, PropelPDO, SlavePDO or user-defined) - * - * @throws PropelException - if lower-level exception caught when trying to connect. - */ - public static function initConnection($conparams, $name, $defaultClass = Propel::CLASS_PROPEL_PDO) - { - - $dsn = $conparams['dsn']; - if ($dsn === null) { - throw new PropelException('No dsn specified in your connection parameters for datasource ['.$name.']'); - } - - if (isset($conparams['classname']) && !empty($conparams['classname'])) { - $classname = $conparams['classname']; - if (!class_exists($classname)) { - throw new PropelException('Unable to load specified PDO subclass: ' . $classname); - } - } else { - $classname = $defaultClass; - } - - $user = isset($conparams['user']) ? $conparams['user'] : null; - $password = isset($conparams['password']) ? $conparams['password'] : null; - - // load any driver options from the config file - // driver options are those PDO settings that have to be passed during the connection construction - $driver_options = array(); - if ( isset($conparams['options']) && is_array($conparams['options']) ) { - try { - self::processDriverOptions( $conparams['options'], $driver_options ); - } catch (PropelException $e) { - throw new PropelException('Error processing driver options for datasource ['.$name.']', $e); - } - } - - try { - $con = new $classname($dsn, $user, $password, $driver_options); - $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - if (Propel::getConfiguration(PropelConfiguration::TYPE_OBJECT)->getParameter('debugpdo.logging.enabled', false)) { - $con->useLogging(true); - } - } catch (PDOException $e) { - throw new PropelException("Unable to open PDO connection", $e); - } - - // load any connection options from the config file - // connection attributes are those PDO flags that have to be set on the initialized connection - if (isset($conparams['attributes']) && is_array($conparams['attributes'])) { - $attributes = array(); - try { - self::processDriverOptions( $conparams['attributes'], $attributes ); - } catch (PropelException $e) { - throw new PropelException('Error processing connection attributes for datasource ['.$name.']', $e); - } - foreach ($attributes as $key => $value) { - $con->setAttribute($key, $value); - } - } - - // initialize the connection using the settings provided in the config file. this could be a "SET NAMES " query for MySQL, for instance - $adapter = self::getDB($name); - $adapter->initConnection($con, isset($conparams['settings']) && is_array($conparams['settings']) ? $conparams['settings'] : array()); - - return $con; - } - - /** - * Internal function to handle driver options or conneciton attributes in PDO. - * - * Process the INI file flags to be passed to each connection. - * - * @param array Where to find the list of constant flags and their new setting. - * @param array Put the data into here - * - * @throws PropelException If invalid options were specified. - */ - private static function processDriverOptions($source, &$write_to) - { - foreach ($source as $option => $optiondata) { - if (is_string($option) && strpos($option, '::') !== false) { - $key = $option; - } elseif (is_string($option)) { - $key = 'PropelPDO::' . $option; - } - if (!defined($key)) { - throw new PropelException("Invalid PDO option/attribute name specified: ".$key); - } - $key = constant($key); - - $value = $optiondata['value']; - if (is_string($value) && strpos($value, '::') !== false) { - if (!defined($value)) { - throw new PropelException("Invalid PDO option/attribute value specified: ".$value); - } - $value = constant($value); - } - - $write_to[$key] = $value; - } - } - - /** - * Returns database adapter for a specific datasource. - * - * @param string The datasource name. - * - * @return DBAdapter The corresponding database adapter. - * - * @throws PropelException If unable to find DBdapter for specified db. - */ - public static function getDB($name = null) - { - if ($name === null) { - $name = self::getDefaultDB(); - } - - if (!isset(self::$adapterMap[$name])) { - if (!isset(self::$configuration['datasources'][$name]['adapter'])) { - throw new PropelException("Unable to find adapter for datasource [" . $name . "]."); - } - $db = DBAdapter::factory(self::$configuration['datasources'][$name]['adapter']); - // register the adapter for this name - self::$adapterMap[$name] = $db; - } - - return self::$adapterMap[$name]; - } - - /** - * Sets a database adapter for specified datasource. - * - * @param string $name The datasource name. - * @param DBAdapter $adapter The DBAdapter implementation to use. - */ - public static function setDB($name, DBAdapter $adapter) - { - if ($name === null) { - $name = self::getDefaultDB(); - } - self::$adapterMap[$name] = $adapter; - } - - /** - * Returns the name of the default database. - * - * @return string Name of the default DB - */ - public static function getDefaultDB() - { - if (self::$defaultDBName === null) { - // Determine default database name. - self::$defaultDBName = isset(self::$configuration['datasources']['default']) ? self::$configuration['datasources']['default'] : self::DEFAULT_NAME; - } - return self::$defaultDBName; - } - - /** - * Closes any associated resource handles. - * - * This method frees any database connection handles that have been - * opened by the getConnection() method. - */ - public static function close() - { - foreach (self::$connectionMap as $idx => $cons) { - // Propel::log("Closing connections for " . $idx, Propel::LOG_DEBUG); - unset(self::$connectionMap[$idx]); - } - } - - /** - * Autoload function for loading propel dependencies. - * - * @param string The class name needing loading. - * - * @return boolean TRUE if the class was loaded, false otherwise. - */ - public static function autoload($className) - { - if (isset(self::$autoloadMap[$className])) { - require self::$baseDir . self::$autoloadMap[$className]; - return true; - } - return false; - } - - /** - * Initialize the base directory for the autoloader. - * Avoids a call to dirname(__FILE__) each time self::autoload() is called. - * FIXME put in the constructor if the Propel class ever becomes a singleton - */ - public static function initBaseDir() - { - self::$baseDir = dirname(__FILE__) . '/'; - } - - /** - * Include once a file specified in DOT notation and return unqualified classname. - * - * Typically, Propel uses autoload is used to load classes and expects that all classes - * referenced within Propel are included in Propel's autoload map. This method is only - * called when a specific non-Propel classname was specified -- for example, the - * classname of a validator in the schema.xml. This method will attempt to include that - * class via autoload and then relative to a location on the include_path. - * - * @param string $class dot-path to clas (e.g. path.to.my.ClassName). - * @return string unqualified classname - */ - public static function importClass($path) { - - // extract classname - if (($pos = strrpos($path, '.')) === false) { - $class = $path; - } else { - $class = substr($path, $pos + 1); - } - - // check if class exists, using autoloader to attempt to load it. - if (class_exists($class, $useAutoload=true)) { - return $class; - } - - // turn to filesystem path - $path = strtr($path, '.', DIRECTORY_SEPARATOR) . '.php'; - - // include class - $ret = include_once($path); - if ($ret === false) { - throw new PropelException("Unable to import class: " . $class . " from " . $path); - } - - // return qualified name - return $class; - } - - /** - * Set your own class-name for Database-Mapping. Then - * you can change the whole TableMap-Model, but keep its - * functionality for Criteria. - * - * @param string The name of the class. - */ - public static function setDatabaseMapClass($name) - { - self::$databaseMapClass = $name; - } - - /** - * Disable instance pooling. - * - * @return boolean true if the method changed the instance pooling state, - * false if it was already disabled - */ - public static function disableInstancePooling() - { - if (!self::$instancePoolingEnabled) { - return false; - } - self::$instancePoolingEnabled = false; - return true; - } - - /** - * Enable instance pooling (enabled by default). - * - * @return boolean true if the method changed the instance pooling state, - * false if it was already enabled - */ - public static function enableInstancePooling() - { - if (self::$instancePoolingEnabled) { - return false; - } - self::$instancePoolingEnabled = true; - return true; - } - - /** - * the instance pooling behaviour. True by default. - * - * @return boolean Whether the pooling is enabled or not. - */ - public static function isInstancePoolingEnabled() - { - return self::$instancePoolingEnabled; - } -} - -// Since the Propel class is not a true singleton, this code cannot go into the __construct() -Propel::initBaseDir(); -spl_autoload_register(array('Propel', 'autoload')); diff --git a/airtime_mvc/library/propel/runtime/lib/adapter/DBAdapter.php b/airtime_mvc/library/propel/runtime/lib/adapter/DBAdapter.php deleted file mode 100644 index 4da98dc384..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/adapter/DBAdapter.php +++ /dev/null @@ -1,297 +0,0 @@ - defines the interface for a Propel database adapter. - * - *

Support for new databases is added by subclassing - * DBAdapter and implementing its abstract interface, and by - * registering the new database adapter and corresponding Propel - * driver in the private adapters map (array) in this class.

- * - *

The Propel database adapters exist to present a uniform - * interface to database access across all available databases. Once - * the necessary adapters have been written and configured, - * transparent swapping of databases is theoretically supported with - * zero code change and minimal configuration file - * modifications.

- * - * @author Hans Lellelid (Propel) - * @author Jon S. Stevens (Torque) - * @author Brett McLaughlin (Torque) - * @author Daniel Rall (Torque) - * @version $Revision: 1612 $ - * @package propel.runtime.adapter - */ -abstract class DBAdapter -{ - - const ID_METHOD_NONE = 0; - const ID_METHOD_AUTOINCREMENT = 1; - const ID_METHOD_SEQUENCE = 2; - - /** - * Propel driver to Propel adapter map. - * @var array - */ - private static $adapters = array( - 'mysql' => 'DBMySQL', - 'mysqli' => 'DBMySQLi', - 'mssql' => 'DBMSSQL', - 'dblib' => 'DBMSSQL', - 'sybase' => 'DBSybase', - 'oracle' => 'DBOracle', - 'oci' => 'DBOracle', - 'pgsql' => 'DBPostgres', - 'sqlite' => 'DBSQLite', - '' => 'DBNone', - ); - - /** - * Creates a new instance of the database adapter associated - * with the specified Propel driver. - * - * @param string $driver The name of the Propel driver to - * create a new adapter instance for or a shorter form adapter key. - * @return DBAdapter An instance of a Propel database adapter. - * @throws PropelException if the adapter could not be instantiated. - */ - public static function factory($driver) { - $adapterClass = isset(self::$adapters[$driver]) ? self::$adapters[$driver] : null; - if ($adapterClass !== null) { - $a = new $adapterClass(); - return $a; - } else { - throw new PropelException("Unsupported Propel driver: " . $driver . ": Check your configuration file"); - } - } - - /** - * This method is called after a connection was created to run necessary - * post-initialization queries or code. - * - * If a charset was specified, this will be set before any other queries - * are executed. - * - * This base method runs queries specified using the "query" setting. - * - * @param PDO A PDO connection instance. - * @param array An array of settings. - * @see setCharset() - */ - public function initConnection(PDO $con, array $settings) - { - if (isset($settings['charset']['value'])) { - $this->setCharset($con, $settings['charset']['value']); - } - if (isset($settings['queries']) && is_array($settings['queries'])) { - foreach ($settings['queries'] as $queries) { - foreach ((array)$queries as $query) { - $con->exec($query); - } - } - } - } - - /** - * Sets the character encoding using SQL standard SET NAMES statement. - * - * This method is invoked from the default initConnection() method and must - * be overridden for an RDMBS which does _not_ support this SQL standard. - * - * @param PDO A PDO connection instance. - * @param string The charset encoding. - * @see initConnection() - */ - public function setCharset(PDO $con, $charset) - { - $con->exec("SET NAMES '" . $charset . "'"); - } - - /** - * This method is used to ignore case. - * - * @param string The string to transform to upper case. - * @return string The upper case string. - */ - public abstract function toUpperCase($in); - - /** - * Returns the character used to indicate the beginning and end of - * a piece of text used in a SQL statement (generally a single - * quote). - * - * @return string The text delimeter. - */ - public function getStringDelimiter() - { - return '\''; - } - - /** - * This method is used to ignore case. - * - * @param string $in The string whose case to ignore. - * @return string The string in a case that can be ignored. - */ - public abstract function ignoreCase($in); - - /** - * This method is used to ignore case in an ORDER BY clause. - * Usually it is the same as ignoreCase, but some databases - * (Interbase for example) does not use the same SQL in ORDER BY - * and other clauses. - * - * @param string $in The string whose case to ignore. - * @return string The string in a case that can be ignored. - */ - public function ignoreCaseInOrderBy($in) - { - return $this->ignoreCase($in); - } - - /** - * Returns SQL which concatenates the second string to the first. - * - * @param string String to concatenate. - * @param string String to append. - * @return string - */ - public abstract function concatString($s1, $s2); - - /** - * Returns SQL which extracts a substring. - * - * @param string String to extract from. - * @param int Offset to start from. - * @param int Number of characters to extract. - * @return string - */ - public abstract function subString($s, $pos, $len); - - /** - * Returns SQL which calculates the length (in chars) of a string. - * - * @param string String to calculate length of. - * @return string - */ - public abstract function strLength($s); - - - /** - * Quotes database objec identifiers (table names, col names, sequences, etc.). - * @param string $text The identifier to quote. - * @return string The quoted identifier. - */ - public function quoteIdentifier($text) - { - return '"' . $text . '"'; - } - - /** - * Quotes a database table which could have space seperating it from an alias, both should be identified seperately - * @param string $table The table name to quo - * @return string The quoted table name - **/ - public function quoteIdentifierTable($table) { - return implode(" ", array_map(array($this, "quoteIdentifier"), explode(" ", $table) ) ); - } - - /** - * Returns the native ID method for this RDBMS. - * @return int one of DBAdapter:ID_METHOD_SEQUENCE, DBAdapter::ID_METHOD_AUTOINCREMENT. - */ - protected function getIdMethod() - { - return DBAdapter::ID_METHOD_AUTOINCREMENT; - } - - /** - * Whether this adapter uses an ID generation system that requires getting ID _before_ performing INSERT. - * @return boolean - */ - public function isGetIdBeforeInsert() - { - return ($this->getIdMethod() === DBAdapter::ID_METHOD_SEQUENCE); - } - - /** - * Whether this adapter uses an ID generation system that requires getting ID _before_ performing INSERT. - * @return boolean - */ - public function isGetIdAfterInsert() - { - return ($this->getIdMethod() === DBAdapter::ID_METHOD_AUTOINCREMENT); - } - - /** - * Gets the generated ID (either last ID for autoincrement or next sequence ID). - * @return mixed - */ - public function getId(PDO $con, $name = null) - { - return $con->lastInsertId($name); - } - - /** - * Returns timestamp formatter string for use in date() function. - * @return string - */ - public function getTimestampFormatter() - { - return "Y-m-d H:i:s"; - } - - /** - * Returns date formatter string for use in date() function. - * @return string - */ - public function getDateFormatter() - { - return "Y-m-d"; - } - - /** - * Returns time formatter string for use in date() function. - * @return string - */ - public function getTimeFormatter() - { - return "H:i:s"; - } - - /** - * Should Column-Names get identifiers for inserts or updates. - * By default false is returned -> backwards compability. - * - * it`s a workaround...!!! - * - * @todo should be abstract - * @return boolean - * @deprecated - */ - public function useQuoteIdentifier() - { - return false; - } - - /** - * Modifies the passed-in SQL to add LIMIT and/or OFFSET. - */ - public abstract function applyLimit(&$sql, $offset, $limit); - - /** - * Gets the SQL string that this adapter uses for getting a random number. - * - * @param mixed $seed (optional) seed value for databases that support this - */ - public abstract function random($seed = null); - -} diff --git a/airtime_mvc/library/propel/runtime/lib/adapter/DBMSSQL.php b/airtime_mvc/library/propel/runtime/lib/adapter/DBMSSQL.php deleted file mode 100644 index f98fa7dfc7..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/adapter/DBMSSQL.php +++ /dev/null @@ -1,215 +0,0 @@ - (Propel) - * @version $Revision: 1700 $ - * @package propel.runtime.adapter - */ -class DBMSSQL extends DBAdapter -{ - - /** - * This method is used to ignore case. - * - * @param in The string to transform to upper case. - * @return The upper case string. - */ - public function toUpperCase($in) - { - return $this->ignoreCase($in); - } - - /** - * This method is used to ignore case. - * - * @param in The string whose case to ignore. - * @return The string in a case that can be ignored. - */ - public function ignoreCase($in) - { - return 'UPPER(' . $in . ')'; - } - - /** - * Returns SQL which concatenates the second string to the first. - * - * @param string String to concatenate. - * @param string String to append. - * @return string - */ - public function concatString($s1, $s2) - { - return '(' . $s1 . ' + ' . $s2 . ')'; - } - - /** - * Returns SQL which extracts a substring. - * - * @param string String to extract from. - * @param int Offset to start from. - * @param int Number of characters to extract. - * @return string - */ - public function subString($s, $pos, $len) - { - return 'SUBSTRING(' . $s . ', ' . $pos . ', ' . $len . ')'; - } - - /** - * Returns SQL which calculates the length (in chars) of a string. - * - * @param string String to calculate length of. - * @return string - */ - public function strLength($s) - { - return 'LEN(' . $s . ')'; - } - - /** - * @see DBAdapter::quoteIdentifier() - */ - public function quoteIdentifier($text) - { - return '[' . $text . ']'; - } - - /** - * @see DBAdapter::random() - */ - public function random($seed = null) - { - return 'RAND(' . ((int)$seed) . ')'; - } - - /** - * Simulated Limit/Offset - * This rewrites the $sql query to apply the offset and limit. - * some of the ORDER BY logic borrowed from Doctrine MsSqlPlatform - * @see DBAdapter::applyLimit() - * @author Benjamin Runnels - */ - public function applyLimit(&$sql, $offset, $limit) - { - // make sure offset and limit are numeric - if(! is_numeric($offset) || ! is_numeric($limit)) - { - throw new PropelException('DBMSSQL::applyLimit() expects a number for argument 2 and 3'); - } - - //split the select and from clauses out of the original query - $selectSegment = array(); - - $selectText = 'SELECT '; - - if (preg_match('/\Aselect(\s+)distinct/i', $sql)) { - $selectText .= 'DISTINCT '; - } - - preg_match('/\Aselect(.*)from(.*)/si', $sql, $selectSegment); - if(count($selectSegment) == 3) { - $selectStatement = trim($selectSegment[1]); - $fromStatement = trim($selectSegment[2]); - } else { - throw new Exception('DBMSSQL::applyLimit() could not locate the select statement at the start of the query.'); - } - - // if we're starting at offset 0 then theres no need to simulate limit, - // just grab the top $limit number of rows - if($offset == 0) { - $sql = $selectText . 'TOP ' . $limit . ' ' . $selectStatement . ' FROM ' . $fromStatement; - return; - } - - //get the ORDER BY clause if present - $orderStatement = stristr($fromStatement, 'ORDER BY'); - $orders = ''; - - if($orderStatement !== false) { - //remove order statement from the from statement - $fromStatement = trim(str_replace($orderStatement, '', $fromStatement)); - - $order = str_ireplace('ORDER BY', '', $orderStatement); - $orders = explode(',', $order); - - for($i = 0; $i < count($orders); $i ++) { - $orderArr[trim(preg_replace('/\s+(ASC|DESC)$/i', '', $orders[$i]))] = array( - 'sort' => (stripos($orders[$i], ' DESC') !== false) ? 'DESC' : 'ASC', - 'key' => $i - ); - } - } - - //setup inner and outer select selects - $innerSelect = ''; - $outerSelect = ''; - foreach(explode(', ', $selectStatement) as $selCol) { - $selColArr = explode(' ', $selCol); - $selColCount = count($selColArr) - 1; - - //make sure the current column isn't * or an aggregate - if($selColArr[0] != '*' && ! strstr($selColArr[0], '(')) { - if(isset($orderArr[$selColArr[0]])) { - $orders[$orderArr[$selColArr[0]]['key']] = $selColArr[0] . ' ' . $orderArr[$selColArr[0]]['sort']; - } - - //use the alias if one was present otherwise use the column name - $alias = (! stristr($selCol, ' AS ')) ? $this->quoteIdentifier($selColArr[0]) : $this->quoteIdentifier($selColArr[$selColCount]); - - //save the first non-aggregate column for use in ROW_NUMBER() if required - if(! isset($firstColumnOrderStatement)) { - $firstColumnOrderStatement = 'ORDER BY ' . $selColArr[0]; - } - - //add an alias to the inner select so all columns will be unique - $innerSelect .= $selColArr[0] . ' AS ' . $alias . ', '; - $outerSelect .= $alias . ', '; - } else { - //agregate columns must always have an alias clause - if(! stristr($selCol, ' AS ')) { - throw new Exception('DBMSSQL::applyLimit() requires aggregate columns to have an Alias clause'); - } - - //aggregate column alias can't be used as the count column you must use the entire aggregate statement - if(isset($orderArr[$selColArr[$selColCount]])) { - $orders[$orderArr[$selColArr[$selColCount]]['key']] = str_replace($selColArr[$selColCount - 1] . ' ' . $selColArr[$selColCount], '', $selCol) . $orderArr[$selColArr[$selColCount]]['sort']; - } - - //quote the alias - $alias = $this->quoteIdentifier($selColArr[$selColCount]); - $innerSelect .= str_replace($selColArr[$selColCount], $alias, $selCol) . ', '; - $outerSelect .= $alias . ', '; - } - } - - if(is_array($orders)) { - $orderStatement = 'ORDER BY ' . implode(', ', $orders); - } else { - //use the first non aggregate column in our select statement if no ORDER BY clause present - if(isset($firstColumnOrderStatement)) { - $orderStatement = $firstColumnOrderStatement; - } else { - throw new Exception('DBMSSQL::applyLimit() unable to find column to use with ROW_NUMBER()'); - } - } - - //substring the select strings to get rid of the last comma and add our FROM and SELECT clauses - $innerSelect = $selectText . 'ROW_NUMBER() OVER(' . $orderStatement . ') AS RowNumber, ' . substr($innerSelect, 0, - 2) . ' FROM'; - //outer select can't use * because of the RowNumber column - $outerSelect = 'SELECT ' . substr($outerSelect, 0, - 2) . ' FROM'; - - //ROW_NUMBER() starts at 1 not 0 - $sql = $outerSelect . ' (' . $innerSelect . ' ' . $fromStatement . ') AS derivedb WHERE RowNumber BETWEEN ' . ($offset + 1) . ' AND ' . ($limit + $offset); - return; - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/adapter/DBMySQL.php b/airtime_mvc/library/propel/runtime/lib/adapter/DBMySQL.php deleted file mode 100644 index 99818e8cd2..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/adapter/DBMySQL.php +++ /dev/null @@ -1,145 +0,0 @@ - (Propel) - * @author Jon S. Stevens (Torque) - * @author Brett McLaughlin (Torque) - * @author Daniel Rall (Torque) - * @version $Revision: 1612 $ - * @package propel.runtime.adapter - */ -class DBMySQL extends DBAdapter -{ - - /** - * This method is used to ignore case. - * - * @param in The string to transform to upper case. - * @return The upper case string. - */ - public function toUpperCase($in) - { - return "UPPER(" . $in . ")"; - } - - /** - * This method is used to ignore case. - * - * @param in The string whose case to ignore. - * @return The string in a case that can be ignored. - */ - public function ignoreCase($in) - { - return "UPPER(" . $in . ")"; - } - - /** - * Returns SQL which concatenates the second string to the first. - * - * @param string String to concatenate. - * @param string String to append. - * @return string - */ - public function concatString($s1, $s2) - { - return "CONCAT($s1, $s2)"; - } - - /** - * Returns SQL which extracts a substring. - * - * @param string String to extract from. - * @param int Offset to start from. - * @param int Number of characters to extract. - * @return string - */ - public function subString($s, $pos, $len) - { - return "SUBSTRING($s, $pos, $len)"; - } - - /** - * Returns SQL which calculates the length (in chars) of a string. - * - * @param string String to calculate length of. - * @return string - */ - public function strLength($s) - { - return "CHAR_LENGTH($s)"; - } - - - /** - * Locks the specified table. - * - * @param Connection $con The Propel connection to use. - * @param string $table The name of the table to lock. - * @throws PDOException No Statement could be created or - * executed. - */ - public function lockTable(PDO $con, $table) - { - $con->exec("LOCK TABLE " . $table . " WRITE"); - } - - /** - * Unlocks the specified table. - * - * @param PDO $con The PDO connection to use. - * @param string $table The name of the table to unlock. - * @throws PDOException No Statement could be created or - * executed. - */ - public function unlockTable(PDO $con, $table) - { - $statement = $con->exec("UNLOCK TABLES"); - } - - /** - * @see DBAdapter::quoteIdentifier() - */ - public function quoteIdentifier($text) - { - return '`' . $text . '`'; - } - - /** - * @see DBAdapter::useQuoteIdentifier() - */ - public function useQuoteIdentifier() - { - return true; - } - - /** - * @see DBAdapter::applyLimit() - */ - public function applyLimit(&$sql, $offset, $limit) - { - if ( $limit > 0 ) { - $sql .= " LIMIT " . ($offset > 0 ? $offset . ", " : "") . $limit; - } else if ( $offset > 0 ) { - $sql .= " LIMIT " . $offset . ", 18446744073709551615"; - } - } - - /** - * @see DBAdapter::random() - */ - public function random($seed = null) - { - return 'rand('.((int) $seed).')'; - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/adapter/DBNone.php b/airtime_mvc/library/propel/runtime/lib/adapter/DBNone.php deleted file mode 100644 index 1349f17da7..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/adapter/DBNone.php +++ /dev/null @@ -1,104 +0,0 @@ - (Propel) - * @author Jon S. Stevens (Torque) - * @author Brett McLaughlin (Torque) - * @version $Revision: 1612 $ - * @package propel.runtime.adapter - */ -class DBNone extends DBAdapter -{ - - /** - * @see DBAdapter::initConnection() - */ - public function initConnection(PDO $con, array $settings) - { - } - - /** - * This method is used to ignore case. - * - * @param in The string to transform to upper case. - * @return The upper case string. - */ - public function toUpperCase($in) - { - return $in; - } - - /** - * This method is used to ignore case. - * - * @param in The string whose case to ignore. - * @return The string in a case that can be ignored. - */ - public function ignoreCase($in) - { - return $in; - } - - /** - * Returns SQL which concatenates the second string to the first. - * - * @param string String to concatenate. - * @param string String to append. - * @return string - */ - public function concatString($s1, $s2) - { - return ($s1 . $s2); - } - - /** - * Returns SQL which extracts a substring. - * - * @param string String to extract from. - * @param int Offset to start from. - * @param int Number of characters to extract. - * @return string - */ - public function subString($s, $pos, $len) - { - return substr($s, $pos, $len); - } - - /** - * Returns SQL which calculates the length (in chars) of a string. - * - * @param string String to calculate length of. - * @return string - */ - public function strLength($s) - { - return strlen($s); - } - - /** - * Modifies the passed-in SQL to add LIMIT and/or OFFSET. - */ - public function applyLimit(&$sql, $offset, $limit) - { - } - - /** - * Gets the SQL string that this adapter uses for getting a random number. - * - * @param mixed $seed (optional) seed value for databases that support this - */ - public function random($seed = null) - { - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/adapter/DBOracle.php b/airtime_mvc/library/propel/runtime/lib/adapter/DBOracle.php deleted file mode 100644 index f67000a8e4..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/adapter/DBOracle.php +++ /dev/null @@ -1,150 +0,0 @@ - (Propel) - * @author Hans Lellelid (Propel) - * @author Jon S. Stevens (Torque) - * @author Brett McLaughlin (Torque) - * @author Bill Schneider (Torque) - * @author Daniel Rall (Torque) - * @version $Revision: 1669 $ - * @package propel.runtime.adapter - */ -class DBOracle extends DBAdapter -{ - /** - * This method is called after a connection was created to run necessary - * post-initialization queries or code. - * Removes the charset query and adds the date queries - * - * @param PDO A PDO connection instance. - * @see parent::initConnection() - */ - public function initConnection(PDO $con, array $settings) - { - $con->exec("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD'"); - $con->exec("ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS'"); - if (isset($settings['queries']) && is_array($settings['queries'])) { - foreach ($settings['queries'] as $queries) { - foreach ((array)$queries as $query) { - $con->exec($query); - } - } - } - } - - /** - * This method is used to ignore case. - * - * @param string $in The string to transform to upper case. - * @return string The upper case string. - */ - public function toUpperCase($in) - { - return "UPPER(" . $in . ")"; - } - - /** - * This method is used to ignore case. - * - * @param string $in The string whose case to ignore. - * @return string The string in a case that can be ignored. - */ - public function ignoreCase($in) - { - return "UPPER(" . $in . ")"; - } - - /** - * Returns SQL which concatenates the second string to the first. - * - * @param string String to concatenate. - * @param string String to append. - * @return string - */ - public function concatString($s1, $s2) - { - return "CONCAT($s1, $s2)"; - } - - /** - * Returns SQL which extracts a substring. - * - * @param string String to extract from. - * @param int Offset to start from. - * @param int Number of characters to extract. - * @return string - */ - public function subString($s, $pos, $len) - { - return "SUBSTR($s, $pos, $len)"; - } - - /** - * Returns SQL which calculates the length (in chars) of a string. - * - * @param string String to calculate length of. - * @return string - */ - public function strLength($s) - { - return "LENGTH($s)"; - } - - /** - * @see DBAdapter::applyLimit() - */ - public function applyLimit(&$sql, $offset, $limit, $criteria = null) - { - if (BasePeer::needsSelectAliases($criteria)) { - $selectSql = BasePeer::createSelectSqlPart($criteria, $params, true); - $sql = $selectSql . substr($sql, strpos('FROM', $sql)); - } - $sql = 'SELECT B.* FROM (' - . 'SELECT A.*, rownum AS PROPEL_ROWNUM FROM (' . $sql . ') A ' - . ') B WHERE '; - - if ( $offset > 0 ) { - $sql .= ' B.PROPEL_ROWNUM > ' . $offset; - if ( $limit > 0 ) { - $sql .= ' AND B.PROPEL_ROWNUM <= ' . ( $offset + $limit ); - } - } else { - $sql .= ' B.PROPEL_ROWNUM <= ' . $limit; - } - } - - protected function getIdMethod() - { - return DBAdapter::ID_METHOD_SEQUENCE; - } - - public function getId(PDO $con, $name = null) - { - if ($name === null) { - throw new PropelException("Unable to fetch next sequence ID without sequence name."); - } - - $stmt = $con->query("SELECT " . $name . ".nextval FROM dual"); - $row = $stmt->fetch(PDO::FETCH_NUM); - - return $row[0]; - } - - public function random($seed=NULL) - { - return 'dbms_random.value'; - } - - -} diff --git a/airtime_mvc/library/propel/runtime/lib/adapter/DBPostgres.php b/airtime_mvc/library/propel/runtime/lib/adapter/DBPostgres.php deleted file mode 100644 index ad32434022..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/adapter/DBPostgres.php +++ /dev/null @@ -1,141 +0,0 @@ -http://www.pgsql.org - * - * @author Hans Lellelid (Propel) - * @author Hakan Tandogan (Torque) - * @version $Revision: 1612 $ - * @package propel.runtime.adapter - */ -class DBPostgres extends DBAdapter -{ - - /** - * This method is used to ignore case. - * - * @param string $in The string to transform to upper case. - * @return string The upper case string. - */ - public function toUpperCase($in) - { - return "UPPER(" . $in . ")"; - } - - /** - * This method is used to ignore case. - * - * @param in The string whose case to ignore. - * @return The string in a case that can be ignored. - */ - public function ignoreCase($in) - { - return "UPPER(" . $in . ")"; - } - - /** - * Returns SQL which concatenates the second string to the first. - * - * @param string String to concatenate. - * @param string String to append. - * @return string - */ - public function concatString($s1, $s2) - { - return "($s1 || $s2)"; - } - - /** - * Returns SQL which extracts a substring. - * - * @param string String to extract from. - * @param int Offset to start from. - * @param int Number of characters to extract. - * @return string - */ - public function subString($s, $pos, $len) - { - return "substring($s from $pos" . ($len > -1 ? "for $len" : "") . ")"; - } - - /** - * Returns SQL which calculates the length (in chars) of a string. - * - * @param string String to calculate length of. - * @return string - */ - public function strLength($s) - { - return "char_length($s)"; - } - - /** - * @see DBAdapter::getIdMethod() - */ - protected function getIdMethod() - { - return DBAdapter::ID_METHOD_SEQUENCE; - } - - /** - * Gets ID for specified sequence name. - */ - public function getId(PDO $con, $name = null) - { - if ($name === null) { - throw new PropelException("Unable to fetch next sequence ID without sequence name."); - } - $stmt = $con->query("SELECT nextval(".$con->quote($name).")"); - $row = $stmt->fetch(PDO::FETCH_NUM); - return $row[0]; - } - - /** - * Returns timestamp formatter string for use in date() function. - * @return string - */ - public function getTimestampFormatter() - { - return "Y-m-d H:i:s O"; - } - - /** - * Returns timestamp formatter string for use in date() function. - * @return string - */ - public function getTimeFormatter() - { - return "H:i:s O"; - } - - /** - * @see DBAdapter::applyLimit() - */ - public function applyLimit(&$sql, $offset, $limit) - { - if ( $limit > 0 ) { - $sql .= " LIMIT ".$limit; - } - if ( $offset > 0 ) { - $sql .= " OFFSET ".$offset; - } - } - - /** - * @see DBAdapter::random() - */ - public function random($seed=NULL) - { - return 'random()'; - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/adapter/DBSQLite.php b/airtime_mvc/library/propel/runtime/lib/adapter/DBSQLite.php deleted file mode 100644 index 4b1da232d5..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/adapter/DBSQLite.php +++ /dev/null @@ -1,116 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.runtime.adapter - */ -class DBSQLite extends DBAdapter -{ - - /** - * For SQLite this method has no effect, since SQLite doesn't support specifying a character - * set (or, another way to look at it, it doesn't require a single character set per DB). - * - * @param PDO A PDO connection instance. - * @param string The charset encoding. - * @throws PropelException If the specified charset doesn't match sqlite_libencoding() - */ - public function setCharset(PDO $con, $charset) - { - } - - /** - * This method is used to ignore case. - * - * @param in The string to transform to upper case. - * @return The upper case string. - */ - public function toUpperCase($in) - { - return 'UPPER(' . $in . ')'; - } - - /** - * This method is used to ignore case. - * - * @param in The string whose case to ignore. - * @return The string in a case that can be ignored. - */ - public function ignoreCase($in) - { - return 'UPPER(' . $in . ')'; - } - - /** - * Returns SQL which concatenates the second string to the first. - * - * @param string String to concatenate. - * @param string String to append. - * @return string - */ - public function concatString($s1, $s2) - { - return "($s1 || $s2)"; - } - - /** - * Returns SQL which extracts a substring. - * - * @param string String to extract from. - * @param int Offset to start from. - * @param int Number of characters to extract. - * @return string - */ - public function subString($s, $pos, $len) - { - return "substr($s, $pos, $len)"; - } - - /** - * Returns SQL which calculates the length (in chars) of a string. - * - * @param string String to calculate length of. - * @return string - */ - public function strLength($s) - { - return "length($s)"; - } - - /** - * @see DBAdapter::quoteIdentifier() - */ - public function quoteIdentifier($text) - { - return '[' . $text . ']'; - } - - /** - * @see DBAdapter::applyLimit() - */ - public function applyLimit(&$sql, $offset, $limit) - { - if ( $limit > 0 ) { - $sql .= " LIMIT " . $limit . ($offset > 0 ? " OFFSET " . $offset : ""); - } elseif ( $offset > 0 ) { - $sql .= " LIMIT -1 OFFSET " . $offset; - } - } - - public function random($seed=NULL) - { - return 'random()'; - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/adapter/MSSQL/MssqlDateTime.class.php b/airtime_mvc/library/propel/runtime/lib/adapter/MSSQL/MssqlDateTime.class.php deleted file mode 100644 index 512c9b4974..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/adapter/MSSQL/MssqlDateTime.class.php +++ /dev/null @@ -1,35 +0,0 @@ -getNestedTransactionCount(); - if ( $opcount === 0 ) { - $return = self::exec('BEGIN TRANSACTION'); - if ($this->useDebug) { - $this->log('Begin transaction', null, __METHOD__); - } - $this->isUncommitable = false; - } - $this->nestedTransactionCount++; - return $return; - } - - /** - * Commit a transaction. - * - * It is necessary to override the abstract PDO transaction functions here, as - * the PDO driver for MSSQL does not support transactions. - */ - public function commit() - { - $return = true; - $opcount = $this->getNestedTransactionCount(); - if ($opcount > 0) { - if ($opcount === 1) { - if ($this->isUncommitable) { - throw new PropelException('Cannot commit because a nested transaction was rolled back'); - } else { - $return = self::exec('COMMIT TRANSACTION'); - if ($this->useDebug) { - $this->log('Commit transaction', null, __METHOD__); - } - - } - } - $this->nestedTransactionCount--; - } - return $return; - } - - /** - * Roll-back a transaction. - * - * It is necessary to override the abstract PDO transaction functions here, as - * the PDO driver for MSSQL does not support transactions. - */ - public function rollBack() - { - $return = true; - $opcount = $this->getNestedTransactionCount(); - if ($opcount > 0) { - if ($opcount === 1) { - $return = self::exec('ROLLBACK TRANSACTION'); - if ($this->useDebug) { - $this->log('Rollback transaction', null, __METHOD__); - } - } else { - $this->isUncommitable = true; - } - $this->nestedTransactionCount--; - } - return $return; - } - - /** - * Rollback the whole transaction, even if this is a nested rollback - * and reset the nested transaction count to 0. - * - * It is necessary to override the abstract PDO transaction functions here, as - * the PDO driver for MSSQL does not support transactions. - */ - public function forceRollBack() - { - $return = true; - $opcount = $this->getNestedTransactionCount(); - if ($opcount > 0) { - // If we're in a transaction, always roll it back - // regardless of nesting level. - $return = self::exec('ROLLBACK TRANSACTION'); - - // reset nested transaction count to 0 so that we don't - // try to commit (or rollback) the transaction outside this scope. - $this->nestedTransactionCount = 0; - - if ($this->useDebug) { - $this->log('Rollback transaction', null, __METHOD__); - } - } - return $return; - } - - public function lastInsertId($seqname = null) - { - $result = self::query('SELECT SCOPE_IDENTITY()'); - return (int) $result->fetchColumn(); - } - - public function quoteIdentifier($text) - { - return '[' . $text . ']'; - } - - public function useQuoteIdentifier() - { - return true; - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/collection/PropelArrayCollection.php b/airtime_mvc/library/propel/runtime/lib/collection/PropelArrayCollection.php deleted file mode 100644 index c85bcecc4b..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/collection/PropelArrayCollection.php +++ /dev/null @@ -1,188 +0,0 @@ -getConnection(Propel::CONNECTION_WRITE); - } - $con->beginTransaction(); - try { - $obj = $this->getWorkerObject(); - foreach ($this as $element) { - $obj->clear(); - $obj->fromArray($element); - $obj->setNew($obj->isPrimaryKeyNull()); - $obj->save($con); - } - $con->commit(); - } catch (PropelException $e) { - $con->rollback(); - } - } - - /** - * Delete all the elements in the collection - */ - public function delete($con = null) - { - if (null === $con) { - $con = $this->getConnection(Propel::CONNECTION_WRITE); - } - $con->beginTransaction(); - try { - foreach ($this as $element) { - $obj = $this->getWorkerObject(); - $obj->setDeleted(false); - $obj->fromArray($element); - $obj->delete($con); - } - $con->commit(); - } catch (PropelException $e) { - $con->rollback(); - throw $e; - } - } - - /** - * Get an array of the primary keys of all the objects in the collection - * - * @return array The list of the primary keys of the collection - */ - public function getPrimaryKeys($usePrefix = true) - { - $callable = array($this->getPeerClass(), 'getPrimaryKeyFromRow'); - $ret = array(); - foreach ($this as $key => $element) { - $key = $usePrefix ? ($this->getModel() . '_' . $key) : $key; - $ret[$key]= call_user_func($callable, array_values($element)); - } - - return $ret; - } - - /** - * Populates the collection from an array - * Uses the object model to force the column types - * Does not empty the collection before adding the data from the array - * - * @param array $arr - */ - public function fromArray($arr) - { - $obj = $this->getWorkerObject(); - foreach ($arr as $element) { - $obj->clear(); - $obj->fromArray($element); - $this->append($obj->toArray()); - } - } - - /** - * Get an array representation of the collection - * This is not an alias for getData(), since it returns a copy of the data - * - * @param string $keyColumn If null, the returned array uses an incremental index. - * Otherwise, the array is indexed using the specified column - * @param boolean $usePrefix If true, the returned array prefixes keys - * with the model class name ('Article_0', 'Article_1', etc). - * - * - * $bookCollection->toArray(); - * array( - * 0 => array('Id' => 123, 'Title' => 'War And Peace'), - * 1 => array('Id' => 456, 'Title' => 'Don Juan'), - * ) - * $bookCollection->toArray('Id'); - * array( - * 123 => array('Id' => 123, 'Title' => 'War And Peace'), - * 456 => array('Id' => 456, 'Title' => 'Don Juan'), - * ) - * $bookCollection->toArray(null, true); - * array( - * 'Book_0' => array('Id' => 123, 'Title' => 'War And Peace'), - * 'Book_1' => array('Id' => 456, 'Title' => 'Don Juan'), - * ) - * - * @return array - */ - public function toArray($keyColumn = null, $usePrefix = false) - { - $ret = array(); - foreach ($this as $key => $element) { - $key = null === $keyColumn ? $key : $element[$keyColumn]; - $key = $usePrefix ? ($this->getModel() . '_' . $key) : $key; - $ret[$key] = $element; - } - - return $ret; - } - - /** - * Synonym for toArray(), to provide a similar interface to PopelObjectCollection - */ - public function getArrayCopy($keyColumn = null, $usePrefix = false) - { - if (null === $keyColumn && false === $usePrefix) { - return parent::getArrayCopy(); - } else { - return $this->toArray($keyColumn, $usePrefix); - } - } - - /** - * Get an associative array representation of the collection - * The first parameter specifies the column to be used for the key, - * And the seconf for the value. - * - * $res = $coll->toKeyValue('Id', 'Name'); - * - * - * @return array - */ - public function toKeyValue($keyColumn, $valueColumn) - { - $ret = array(); - foreach ($this as $obj) { - $ret[$obj[$keyColumn]] = $obj[$valueColumn]; - } - - return $ret; - } - - protected function getWorkerObject() - { - if (null === $this->workerObject) { - if ($this->model == '') { - throw new PropelException('You must set the collection model before interacting with it'); - } - $class = $this->getModel(); - $this->workerObject = new $class(); - } - - return $this->workerObject; - } - -} - -?> \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/collection/PropelCollection.php b/airtime_mvc/library/propel/runtime/lib/collection/PropelCollection.php deleted file mode 100644 index a62b12da77..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/collection/PropelCollection.php +++ /dev/null @@ -1,409 +0,0 @@ -getArrayCopy(); - } - - /** - * Set the data in the collection - * - * @param array $data - */ - public function setData($data) - { - $this->exchangeArray($data); - } - - /** - * Gets the position of the internal pointer - * This position can be later used in seek() - * - * @return int - */ - public function getPosition() - { - return (int) $this->getInternalIterator()->key(); - } - - /** - * Move the internal pointer to the beginning of the list - * And get the first element in the collection - * - * @return mixed - */ - public function getFirst() - { - $this->getInternalIterator()->rewind(); - return $this->getCurrent(); - } - - /** - * Check whether the internal pointer is at the beginning of the list - * - * @return boolean - */ - public function isFirst() - { - return $this->getPosition() == 0; - } - - /** - * Move the internal pointer backward - * And get the previous element in the collection - * - * @return mixed - */ - public function getPrevious() - { - $pos = $this->getPosition(); - if ($pos == 0) { - return null; - } else { - $this->getInternalIterator()->seek($pos - 1); - return $this->getCurrent(); - } - } - - /** - * Get the current element in the collection - * - * @return mixed - */ - public function getCurrent() - { - return $this->getInternalIterator()->current(); - } - - /** - * Move the internal pointer forward - * And get the next element in the collection - * - * @return mixed - */ - public function getNext() - { - $this->getInternalIterator()->next(); - return $this->getCurrent(); - } - - /** - * Move the internal pointer to the end of the list - * And get the last element in the collection - * - * @return mixed - */ - public function getLast() - { - $count = $this->count(); - if ($count == 0) { - return null; - } else { - $this->getInternalIterator()->seek($count - 1); - return $this->getCurrent(); - } - } - - /** - * Check whether the internal pointer is at the end of the list - * - * @return boolean - */ - public function isLast() - { - $count = $this->count(); - if ($count == 0) { - // empty list... so yes, this is the last - return true; - } else { - return $this->getPosition() == $count - 1; - } - } - - /** - * Check if the collection is empty - * - * @return boolean - */ - public function isEmpty() - { - return $this->count() == 0; - } - - /** - * Check if the current index is an odd integer - * - * @return boolean - */ - public function isOdd() - { - return (boolean) ($this->getInternalIterator()->key() % 2); - } - - /** - * Check if the current index is an even integer - * - * @return boolean - */ - public function isEven() - { - return !$this->isOdd(); - } - - /** - * Get an element from its key - * Alias for ArrayObject::offsetGet() - * - * @param mixed $key - * - * @return mixed The element - */ - public function get($key) - { - if (!$this->offsetExists($key)) { - throw new PropelException('Unknown key ' . $key); - } - return $this->offsetGet($key); - } - - /** - * Pops an element off the end of the collection - * - * @return mixed The popped element - */ - public function pop() - { - if ($this->count() == 0) { - return null; - } - $ret = $this->getLast(); - $lastKey = $this->getInternalIterator()->key(); - $this->offsetUnset((string) $lastKey); - return $ret; - } - - /** - * Pops an element off the beginning of the collection - * - * @return mixed The popped element - */ - public function shift() - { - // the reindexing is complicated to deal with through the iterator - // so let's use the simple solution - $arr = $this->getArrayCopy(); - $ret = array_shift($arr); - $this->exchangeArray($arr); - - return $ret; - } - - /** - * Prepend one or more elements to the beginning of the collection - * - * @param mixed $value the element to prepend - * - * @return int The number of new elements in the array - */ - public function prepend($value) - { - // the reindexing is complicated to deal with through the iterator - // so let's use the simple solution - $arr = $this->getArrayCopy(); - $ret = array_unshift($arr, $value); - $this->exchangeArray($arr); - - return $ret; - } - - /** - * Add an element to the collection with the given key - * Alias for ArrayObject::offsetSet() - * - * @param mixed $key - * @param mixed $value - */ - public function set($key, $value) - { - return $this->offsetSet($key, $value); - } - - /** - * Removes a specified collection element - * Alias for ArrayObject::offsetUnset() - * - * @param mixed $key - * - * @return mixed The removed element - */ - public function remove($key) - { - if (!$this->offsetExists($key)) { - throw new PropelException('Unknown key ' . $key); - } - return $this->offsetUnset($key); - } - - /** - * Clears the collection - * - * @return array The previous collection - */ - public function clear() - { - return $this->exchangeArray(array()); - } - - /** - * Whether or not this collection contains a specified element - * - * @param mixed $element the element - * - * @return boolean - */ - public function contains($element) - { - return in_array($element, $this->getArrayCopy(), true); - } - - /** - * Search an element in the collection - * - * @param mixed $element - * - * @return mixed Returns the key for the element if it is found in the collection, FALSE otherwise - */ - public function search($element) - { - return array_search($element, $this->getArrayCopy(), true); - } - - // Serializable interface - - public function serialize() - { - $repr = array( - 'data' => $this->getArrayCopy(), - 'model' => $this->model, - ); - return serialize($repr); - } - - public function unserialize($data) - { - $repr = unserialize($data); - $this->exchangeArray($repr['data']); - $this->model = $repr['model']; - } - - // IteratorAggregate method - - /** - * Overrides ArrayObject::getIterator() to save the iterator object - * for internal use e.g. getNext(), isOdd(), etc. - */ - public function getIterator() - { - $this->iterator = new ArrayIterator($this); - return $this->iterator; - } - - public function getInternalIterator() - { - if (null === $this->iterator) { - return $this->getIterator(); - } - return $this->iterator; - } - - // Propel collection methods - - /** - * Set the model of the elements in the collection - * - * @param string $model Name of the Propel object classes stored in the collection - */ - public function setModel($model) - { - $this->model = $model; - } - - /** - * Get the model of the elements in the collection - * - * @return string Name of the Propel object class stored in the collection - */ - public function getModel() - { - return $this->model; - } - - /** - * Get the peer class of the elements in the collection - * - * @return string Name of the Propel peer class stored in the collection - */ - public function getPeerClass() - { - if ($this->model == '') { - throw new PropelException('You must set the collection model before interacting with it'); - } - return constant($this->getModel() . '::PEER'); - } - - public function setFormatter(PropelFormatter $formatter) - { - $this->formatter = $formatter; - } - - public function getFormatter() - { - return $this->formatter; - } - - /** - * Get a connection object for the database containing the elements of the collection - * - * @param string $type The connection type (Propel::CONNECTION_READ by default; can be Propel::connection_WRITE) - * - * @return PropelPDO a connection object - */ - public function getConnection($type = Propel::CONNECTION_READ) - { - $databaseName = constant($this->getPeerClass() . '::DATABASE_NAME'); - - return Propel::getConnection($databaseName, $type); - } - -} - -?> \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/collection/PropelObjectCollection.php b/airtime_mvc/library/propel/runtime/lib/collection/PropelObjectCollection.php deleted file mode 100644 index 37061affa6..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/collection/PropelObjectCollection.php +++ /dev/null @@ -1,249 +0,0 @@ -getConnection(Propel::CONNECTION_WRITE); - } - $con->beginTransaction(); - try { - foreach ($this as $element) { - $element->save($con); - } - $con->commit(); - } catch (PropelException $e) { - $con->rollback(); - throw $e; - } - } - - /** - * Delete all the elements in the collection - */ - public function delete($con = null) - { - if (null === $con) { - $con = $this->getConnection(Propel::CONNECTION_WRITE); - } - $con->beginTransaction(); - try { - foreach ($this as $element) { - $element->delete($con); - } - $con->commit(); - } catch (PropelException $e) { - $con->rollback(); - throw $e; - } - } - - /** - * Get an array of the primary keys of all the objects in the collection - * - * @return array The list of the primary keys of the collection - */ - public function getPrimaryKeys($usePrefix = true) - { - $ret = array(); - foreach ($this as $key => $obj) { - $key = $usePrefix ? ($this->getModel() . '_' . $key) : $key; - $ret[$key]= $obj->getPrimaryKey(); - } - - return $ret; - } - - /** - * Populates the collection from an array - * Each object is populated from an array and the result is stored - * Does not empty the collection before adding the data from the array - * - * @param array $arr - */ - public function fromArray($arr) - { - $class = $this->getModel(); - foreach ($arr as $element) { - $obj = new $class(); - $obj->fromArray($element); - $this->append($obj); - } - } - - /** - * Get an array representation of the collection - * Each object is turned into an array and the result is returned - * - * @param string $keyColumn If null, the returned array uses an incremental index. - * Otherwise, the array is indexed using the specified column - * @param boolean $usePrefix If true, the returned array prefixes keys - * with the model class name ('Article_0', 'Article_1', etc). - * - * - * $bookCollection->toArray(); - * array( - * 0 => array('Id' => 123, 'Title' => 'War And Peace'), - * 1 => array('Id' => 456, 'Title' => 'Don Juan'), - * ) - * $bookCollection->toArray('Id'); - * array( - * 123 => array('Id' => 123, 'Title' => 'War And Peace'), - * 456 => array('Id' => 456, 'Title' => 'Don Juan'), - * ) - * $bookCollection->toArray(null, true); - * array( - * 'Book_0' => array('Id' => 123, 'Title' => 'War And Peace'), - * 'Book_1' => array('Id' => 456, 'Title' => 'Don Juan'), - * ) - * - * @return array - */ - public function toArray($keyColumn = null, $usePrefix = false) - { - $ret = array(); - $keyGetterMethod = 'get' . $keyColumn; - foreach ($this as $key => $obj) { - $key = null === $keyColumn ? $key : $obj->$keyGetterMethod(); - $key = $usePrefix ? ($this->getModel() . '_' . $key) : $key; - $ret[$key] = $obj->toArray(); - } - - return $ret; - } - - /** - * Get an array representation of the collection - * - * @param string $keyColumn If null, the returned array uses an incremental index. - * Otherwise, the array is indexed using the specified column - * @param boolean $usePrefix If true, the returned array prefixes keys - * with the model class name ('Article_0', 'Article_1', etc). - * - * - * $bookCollection->getArrayCopy(); - * array( - * 0 => $book0, - * 1 => $book1, - * ) - * $bookCollection->getArrayCopy('Id'); - * array( - * 123 => $book0, - * 456 => $book1, - * ) - * $bookCollection->getArrayCopy(null, true); - * array( - * 'Book_0' => $book0, - * 'Book_1' => $book1, - * ) - * - * @return array - */ - public function getArrayCopy($keyColumn = null, $usePrefix = false) - { - if (null === $keyColumn && false === $usePrefix) { - return parent::getArrayCopy(); - } - $ret = array(); - $keyGetterMethod = 'get' . $keyColumn; - foreach ($this as $key => $obj) { - $key = null === $keyColumn ? $key : $obj->$keyGetterMethod(); - $key = $usePrefix ? ($this->getModel() . '_' . $key) : $key; - $ret[$key] = $obj; - } - - return $ret; - } - - /** - * Get an associative array representation of the collection - * The first parameter specifies the column to be used for the key, - * And the seconf for the value. - * - * $res = $coll->toKeyValue('Id', 'Name'); - * - * - * @return array - */ - public function toKeyValue($keyColumn = 'PrimaryKey', $valueColumn = null) - { - $ret = array(); - $keyGetterMethod = 'get' . $keyColumn; - $valueGetterMethod = (null === $valueColumn) ? '__toString' : ('get' . $valueColumn); - foreach ($this as $obj) { - $ret[$obj->$keyGetterMethod()] = $obj->$valueGetterMethod(); - } - - return $ret; - } - - /** - * Makes an additional query to populate the objects related to the collection objects - * by a certain relation - * - * @param string $relation Relation name (e.g. 'Book') - * @param Criteria $criteria Optional Criteria object to filter the related object collection - * @param PropelPDO $con Optional connection object - * - * @return PropelObjectCollection the list of related objects - */ - public function populateRelation($relation, $criteria = null, $con = null) - { - if (!Propel::isInstancePoolingEnabled()) { - throw new PropelException('populateRelation() needs instance pooling to be enabled prior to populating the collection'); - } - $relationMap = $this->getFormatter()->getTableMap()->getRelation($relation); - $symRelationMap = $relationMap->getSymmetricalRelation(); - - // query the db for the related objects - $useMethod = 'use' . $symRelationMap->getName() . 'Query'; - $query = PropelQuery::from($relationMap->getRightTable()->getPhpName()); - if (null !== $criteria) { - $query->mergeWith($criteria); - } - $relatedObjects = $query - ->$useMethod() - ->filterByPrimaryKeys($this->getPrimaryKeys()) - ->endUse() - ->find($con); - - // associate the related objects to the main objects - if ($relationMap->getType() == RelationMap::ONE_TO_MANY) { - $getMethod = 'get' . $symRelationMap->getName(); - $addMethod = 'add' . $relationMap->getName(); - foreach ($relatedObjects as $object) { - $mainObj = $object->$getMethod(); // instance pool is used here to avoid a query - $mainObj->$addMethod($object); - } - } elseif ($relationMap->getType() == RelationMap::MANY_TO_ONE) { - // nothing to do; the instance pool will catch all calls to getRelatedObject() - // and return the object in memory - } else { - throw new PropelException('populateRelation() does not support this relation type'); - } - - return $relatedObjects; - } - -} - -?> \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/collection/PropelOnDemandCollection.php b/airtime_mvc/library/propel/runtime/lib/collection/PropelOnDemandCollection.php deleted file mode 100644 index 409aef32f0..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/collection/PropelOnDemandCollection.php +++ /dev/null @@ -1,151 +0,0 @@ -iterator = new PropelOnDemandIterator($formatter, $stmt); - } - - // IteratorAggregate Interface - - public function getIterator() - { - return $this->iterator; - } - - // ArrayAccess Interface - - public function offsetExists($offset) - { - if ($offset == $this->currentKey) { - return true; - } - throw new PropelException('The On Demand Collection does not allow acces by offset'); - } - - public function offsetGet($offset) - { - if ($offset == $this->currentKey) { - return $this->currentRow; - } - throw new PropelException('The On Demand Collection does not allow acces by offset'); - } - - public function offsetSet($offset, $value) - { - throw new PropelException('The On Demand Collection is read only'); - } - - public function offsetUnset($offset) - { - throw new PropelException('The On Demand Collection is read only'); - } - - // Serializable Interface - - public function serialize() - { - throw new PropelException('The On Demand Collection cannot be serialized'); - } - - public function unserialize($data) - { - throw new PropelException('The On Demand Collection cannot be serialized'); - } - - // Countable Interface - - /** - * Returns the number of rows in the resultset - * Warning: this number is inaccurate for most databases. Do not rely on it for a portable application. - * - * @return int number of results - */ - public function count() - { - return $this->iterator->count(); - } - - // ArrayObject methods - - public function append($value) - { - throw new PropelException('The On Demand Collection is read only'); - } - - public function prepend($value) - { - throw new PropelException('The On Demand Collection is read only'); - } - - public function asort() - { - throw new PropelException('The On Demand Collection is read only'); - } - - public function exchangeArray($input) - { - throw new PropelException('The On Demand Collection is read only'); - } - - public function getArrayCopy() - { - throw new PropelException('The On Demand Collection does not allow acces by offset'); - } - - public function getFlags() - { - throw new PropelException('The On Demand Collection does not allow acces by offset'); - } - - public function ksort() - { - throw new PropelException('The On Demand Collection is read only'); - } - - public function natcasesort() - { - throw new PropelException('The On Demand Collection is read only'); - } - - public function natsort() - { - throw new PropelException('The On Demand Collection is read only'); - } - - public function setFlags($flags) - { - throw new PropelException('The On Demand Collection does not allow acces by offset'); - } - - public function uasort($cmp_function) - { - throw new PropelException('The On Demand Collection is read only'); - } - - public function uksort($cmp_function) - { - throw new PropelException('The On Demand Collection is read only'); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/collection/PropelOnDemandIterator.php b/airtime_mvc/library/propel/runtime/lib/collection/PropelOnDemandIterator.php deleted file mode 100644 index e814781b58..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/collection/PropelOnDemandIterator.php +++ /dev/null @@ -1,118 +0,0 @@ -formatter = $formatter; - $this->stmt = $stmt; - $this->enableInstancePoolingOnFinish = Propel::disableInstancePooling(); - } - - public function closeCursor() - { - $this->stmt->closeCursor(); - } - - /** - * Returns the number of rows in the resultset - * Warning: this number is inaccurate for most databases. Do not rely on it for a portable application. - * - * @return int number of results - */ - public function count() - { - return $this->stmt->rowCount(); - } - - // Iterator Interface - - /** - * Gets the current Model object in the collection - * This is where the hydration takes place. - * - * @see PropelObjectFormatter::getAllObjectsFromRow() - * - * @return BaseObject - */ - public function current() - { - return $this->formatter->getAllObjectsFromRow($this->currentRow); - } - - /** - * Gets the current key in the iterator - * - * @return string - */ - public function key() - { - return $this->currentKey; - } - - /** - * Advances the curesor in the statement - * Closes the cursor if the end of the statement is reached - */ - public function next() - { - $this->currentRow = $this->stmt->fetch(PDO::FETCH_NUM); - $this->currentKey++; - $this->isValid = (boolean) $this->currentRow; - if (!$this->isValid) { - $this->closeCursor(); - if ($this->enableInstancePoolingOnFinish) { - Propel::enableInstancePooling(); - } - } - } - - /** - * Initializes the iterator by advancing to the first position - * This method can only be called once (this is a NoRewindIterator) - */ - public function rewind() - { - // check that the hydration can begin - if (null === $this->formatter) { - throw new PropelException('The On Demand collection requires a formatter. Add it by calling setFormatter()'); - } - if (null === $this->stmt) { - throw new PropelException('The On Demand collection requires a statement. Add it by calling setStatement()'); - } - if (null !== $this->isValid) { - throw new PropelException('The On Demand collection can only be iterated once'); - } - - // initialize the current row and key - $this->next(); - } - - public function valid() - { - return $this->isValid; - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/config/PropelConfiguration.php b/airtime_mvc/library/propel/runtime/lib/config/PropelConfiguration.php deleted file mode 100644 index 299677f296..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/config/PropelConfiguration.php +++ /dev/null @@ -1,159 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.runtime.config - */ -class PropelConfiguration implements ArrayAccess -{ - const TYPE_ARRAY = 1; - - const TYPE_ARRAY_FLAT = 2; - - const TYPE_OBJECT = 3; - - /** - * @var array An array of parameters - */ - protected $parameters = array(); - - /** - * Construct a new configuration container - * - * @param array $parameters - */ - public function __construct(array $parameters = array()) - { - $this->parameters = $parameters; - } - - /** - * @see http://www.php.net/ArrayAccess - */ - public function offsetExists($offset) - { - return array_key_exists($offset, $this->parameters); - } - - /** - * @see http://www.php.net/ArrayAccess - */ - public function offsetSet($offset, $value) - { - $this->parameter[$offset] = $value; - } - - /** - * @see http://www.php.net/ArrayAccess - */ - public function offsetGet($offset) - { - return $this->parameters[$offset]; - } - - /** - * @see http://www.php.net/ArrayAccess - */ - public function offsetUnset($offset) - { - unset($this->parameters[$offset]); - } - - /** - * Get parameter value from the container - * - * @param string $name Parameter name - * @param mixed $default Default value to be used if the - * requested value is not found - * @return mixed Parameter value or the default - */ - public function getParameter($name, $default = null) - { - $ret = $this->parameters; - $parts = explode('.', $name); //name.space.name - while ($part = array_shift($parts)) { - if (isset($ret[$part])) { - $ret = $ret[$part]; - } else { - return $default; - } - } - return $ret; - } - - /** - * Store a value to the container - * - * @param string $name Configuration item name (name.space.name) - * @param mixed $value Value to be stored - */ - public function setParameter($name, $value) - { - $param = &$this->parameters; - $parts = explode('.', $name); //name.space.name - while ($part = array_shift($parts)) { - $param = &$param[$part]; - } - $param = $value; - } - - /** - * - * - * @param int $type - * @return mixed - */ - public function getParameters($type = PropelConfiguration::TYPE_ARRAY) - { - switch ($type) { - case PropelConfiguration::TYPE_ARRAY: - return $this->parameters; - case PropelConfiguration::TYPE_ARRAY_FLAT: - return $this->toFlatArray(); - case PropelConfiguration::TYPE_OBJECT: - return $this; - default: - throw new PropelException('Unknown configuration type: '. var_export($type, true)); - } - - } - - - /** - * Get the configuration as a flat array. ($array['name.space.item'] = 'value') - * - * @return array - */ - protected function toFlatArray() - { - $result = array(); - $it = new PropelConfigurationIterator(new RecursiveArrayIterator($this->parameters), RecursiveIteratorIterator::SELF_FIRST); - foreach($it as $key => $value) { - $ns = $it->getDepth() ? $it->getNamespace() . '.'. $key : $key; - if ($it->getNodeType() == PropelConfigurationIterator::NODE_ITEM) { - $result[$ns] = $value; - } - } - - return $result; - } - -} - -?> diff --git a/airtime_mvc/library/propel/runtime/lib/config/PropelConfigurationIterator.php b/airtime_mvc/library/propel/runtime/lib/config/PropelConfigurationIterator.php deleted file mode 100644 index 45552d9dbc..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/config/PropelConfigurationIterator.php +++ /dev/null @@ -1,103 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.runtime.config - */ -class PropelConfigurationIterator extends RecursiveIteratorIterator -{ - /** - * Node is a parent node - */ - const NODE_PARENT = 0; - - /** - * Node is an actual configuration item - */ - const NODE_ITEM = 1; - - /** - * Namespace stack when recursively iterating the configuration tree - * - * @var array - */ - protected $namespaceStack = array(); - - /** - * Current node type. Possible values: null (undefined), self::NODE_PARENT or self::NODE_ITEM - * - * @var int - */ - protected $nodeType = null; - - /** - * Get current namespace - * - * @return string - */ - public function getNamespace() - { - return implode('.', $this->namespaceStack); - } - - /** - * Get current node type. - * - * @see http://www.php.net/RecursiveIteratorIterator - * @return int - * - null (undefined) - * - self::NODE_PARENT - * - self::NODE_ITEM - */ - public function getNodeType() - { - return $this->nodeType; - } - - /** - * Get the current element - * - * @see http://www.php.net/RecursiveIteratorIterator - * @return mixed - */ - public function current() - { - $current = parent::current(); - if (is_array($current)) { - $this->namespaceStack[] = $this->key(); - $this->nodeType = self::NODE_PARENT; - } - else { - $this->nodeType = self::NODE_ITEM; - } - - return $current; - } - - /** - * Called after current child iterator is invalid and right before it gets destructed. - * - * @see http://www.php.net/RecursiveIteratorIterator - */ - public function endChildren() - { - if ($this->namespaceStack) { - array_pop($this->namespaceStack); - } - } - -} - -?> diff --git a/airtime_mvc/library/propel/runtime/lib/connection/DebugPDO.php b/airtime_mvc/library/propel/runtime/lib/connection/DebugPDO.php deleted file mode 100644 index e9dd0759ad..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/connection/DebugPDO.php +++ /dev/null @@ -1,111 +0,0 @@ -setParameter('debugpdo.logging.details.slow.enabled', true); - * $config->setParameter('debugpdo.logging.details.slow.threshold', 1.5); - * $config->setParameter('debugpdo.logging.details.time.enabled', true); - * - * @author Francois Zaninotto - * @author Cameron Brunner - * @author Hans Lellelid - * @author Christian Abegg - * @author Jarno Rantanen - * @since 2006-09-22 - * @package propel.runtime.connection - */ -class DebugPDO extends PropelPDO -{ - public $useDebug = true; -} diff --git a/airtime_mvc/library/propel/runtime/lib/connection/DebugPDOStatement.php b/airtime_mvc/library/propel/runtime/lib/connection/DebugPDOStatement.php deleted file mode 100644 index f1b2243e19..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/connection/DebugPDOStatement.php +++ /dev/null @@ -1,122 +0,0 @@ - - * @author Jarno Rantanen - * @since 2007-07-12 - * @package propel.runtime.connection - */ -class DebugPDOStatement extends PDOStatement -{ - - /** - * The PDO connection from which this instance was created. - * - * @var PropelPDO - */ - protected $pdo; - - /** - * Hashmap for resolving the PDO::PARAM_* class constants to their human-readable names. - * - * This is only used in logging the binding of variables. - * - * @see self::bindValue() - * @var array - */ - protected static $typeMap = array( - PDO::PARAM_BOOL => "PDO::PARAM_BOOL", - PDO::PARAM_INT => "PDO::PARAM_INT", - PDO::PARAM_STR => "PDO::PARAM_STR", - PDO::PARAM_LOB => "PDO::PARAM_LOB", - PDO::PARAM_NULL => "PDO::PARAM_NULL", - ); - - /** - * @var array The values that have been bound - */ - protected $boundValues = array(); - - /** - * Construct a new statement class with reference to main DebugPDO object from - * which this instance was created. - * - * @param DebugPDO $pdo Reference to the parent PDO instance. - */ - protected function __construct(PropelPDO $pdo) - { - $this->pdo = $pdo; - } - - public function getExecutedQueryString() - { - $sql = $this->queryString; - $matches = array(); - if (preg_match_all('/(:p[0-9]+\b)/', $sql, $matches)) { - $size = count($matches[1]); - for ($i = $size-1; $i >= 0; $i--) { - $pos = $matches[1][$i]; - $sql = str_replace($pos, $this->boundValues[$pos], $sql); - } - } - - return $sql; - } - - /** - * Executes a prepared statement. Returns a boolean value indicating success. - * - * Overridden for query counting and logging. - * - * @return bool - */ - public function execute($input_parameters = null) - { - $debug = $this->pdo->getDebugSnapshot(); - $return = parent::execute($input_parameters); - - $sql = $this->getExecutedQueryString(); - $this->pdo->log($sql, null, __METHOD__, $debug); - $this->pdo->setLastExecutedQuery($sql); - $this->pdo->incrementQueryCount(); - - return $return; - } - - /** - * Binds a value to a corresponding named or question mark placeholder in the SQL statement - * that was use to prepare the statement. Returns a boolean value indicating success. - * - * @param int $pos Parameter identifier (for determining what to replace in the query). - * @param mixed $value The value to bind to the parameter. - * @param int $type Explicit data type for the parameter using the PDO::PARAM_* constants. Defaults to PDO::PARAM_STR. - * @return boolean - */ - public function bindValue($pos, $value, $type = PDO::PARAM_STR) - { - $debug = $this->pdo->getDebugSnapshot(); - $typestr = isset(self::$typeMap[$type]) ? self::$typeMap[$type] : '(default)'; - $return = parent::bindValue($pos, $value, $type); - $valuestr = $type == PDO::PARAM_LOB ? '[LOB value]' : var_export($value, true); - $msg = "Binding $valuestr at position $pos w/ PDO type $typestr"; - - $this->boundValues[$pos] = $valuestr; - - $this->pdo->log($msg, null, __METHOD__, $debug); - - return $return; - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/connection/PropelPDO.php b/airtime_mvc/library/propel/runtime/lib/connection/PropelPDO.php deleted file mode 100644 index 6bfa5a07b4..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/connection/PropelPDO.php +++ /dev/null @@ -1,716 +0,0 @@ - - * @author Hans Lellelid - * @author Christian Abegg - * @since 2006-09-22 - * @package propel.runtime.connection - */ -class PropelPDO extends PDO -{ - - /** - * Attribute to use to set whether to cache prepared statements. - */ - const PROPEL_ATTR_CACHE_PREPARES = -1; - - const DEFAULT_SLOW_THRESHOLD = 0.1; - const DEFAULT_ONLYSLOW_ENABLED = false; - - /** - * The current transaction depth. - * @var int - */ - protected $nestedTransactionCount = 0; - - /** - * Cache of prepared statements (PDOStatement) keyed by md5 of SQL. - * - * @var array [md5(sql) => PDOStatement] - */ - protected $preparedStatements = array(); - - /** - * Whether to cache prepared statements. - * - * @var boolean - */ - protected $cachePreparedStatements = false; - - /** - * Whether the final commit is possible - * Is false if a nested transaction is rolled back - */ - protected $isUncommitable = false; - - /** - * Count of queries performed. - * - * @var int - */ - protected $queryCount = 0; - - /** - * SQL code of the latest performed query. - * - * @var string - */ - protected $lastExecutedQuery; - - /** - * Whether or not the debug is enabled - * - * @var boolean - */ - public $useDebug = false; - - /** - * Configured BasicLogger (or compatible) logger. - * - * @var BasicLogger - */ - protected $logger; - - /** - * The log level to use for logging. - * - * @var int - */ - private $logLevel = Propel::LOG_DEBUG; - - /** - * The default value for runtime config item "debugpdo.logging.methods". - * - * @var array - */ - protected static $defaultLogMethods = array( - 'PropelPDO::exec', - 'PropelPDO::query', - 'DebugPDOStatement::execute', - ); - - /** - * Creates a PropelPDO instance representing a connection to a database. - *. - * If so configured, specifies a custom PDOStatement class and makes an entry - * to the log with the state of this object just after its initialization. - * Add PropelPDO::__construct to $defaultLogMethods to see this message - * - * @param string $dsn Connection DSN. - * @param string $username (optional) The user name for the DSN string. - * @param string $password (optional) The password for the DSN string. - * @param array $driver_options (optional) A key=>value array of driver-specific connection options. - * @throws PDOException if there is an error during connection initialization. - */ - public function __construct($dsn, $username = null, $password = null, $driver_options = array()) - { - if ($this->useDebug) { - $debug = $this->getDebugSnapshot(); - } - - parent::__construct($dsn, $username, $password, $driver_options); - - if ($this->useDebug) { - $this->configureStatementClass('DebugPDOStatement', $suppress = true); - $this->log('Opening connection', null, __METHOD__, $debug); - } - } - - /** - * Gets the current transaction depth. - * @return int - */ - public function getNestedTransactionCount() - { - return $this->nestedTransactionCount; - } - - /** - * Set the current transaction depth. - * @param int $v The new depth. - */ - protected function setNestedTransactionCount($v) - { - $this->nestedTransactionCount = $v; - } - - /** - * Is this PDO connection currently in-transaction? - * This is equivalent to asking whether the current nested transaction count - * is greater than 0. - * @return boolean - */ - public function isInTransaction() - { - return ($this->getNestedTransactionCount() > 0); - } - - /** - * Check whether the connection contains a transaction that can be committed. - * To be used in an evironment where Propelexceptions are caught. - * - * @return boolean True if the connection is in a committable transaction - */ - public function isCommitable() - { - return $this->isInTransaction() && !$this->isUncommitable; - } - - /** - * Overrides PDO::beginTransaction() to prevent errors due to already-in-progress transaction. - */ - public function beginTransaction() - { - $return = true; - if (!$this->nestedTransactionCount) { - $return = parent::beginTransaction(); - if ($this->useDebug) { - $this->log('Begin transaction', null, __METHOD__); - } - $this->isUncommitable = false; - } - $this->nestedTransactionCount++; - return $return; - } - - /** - * Overrides PDO::commit() to only commit the transaction if we are in the outermost - * transaction nesting level. - */ - public function commit() - { - $return = true; - $opcount = $this->nestedTransactionCount; - if ($opcount > 0) { - if ($opcount === 1) { - if ($this->isUncommitable) { - throw new PropelException('Cannot commit because a nested transaction was rolled back'); - } else { - $return = parent::commit(); - if ($this->useDebug) { - $this->log('Commit transaction', null, __METHOD__); - } - } - } - $this->nestedTransactionCount--; - } - return $return; - } - - /** - * Overrides PDO::rollBack() to only rollback the transaction if we are in the outermost - * transaction nesting level - * @return boolean Whether operation was successful. - */ - public function rollBack() - { - $return = true; - $opcount = $this->nestedTransactionCount; - if ($opcount > 0) { - if ($opcount === 1) { - $return = parent::rollBack(); - if ($this->useDebug) { - $this->log('Rollback transaction', null, __METHOD__); - } - } else { - $this->isUncommitable = true; - } - $this->nestedTransactionCount--; - } - return $return; - } - - /** - * Rollback the whole transaction, even if this is a nested rollback - * and reset the nested transaction count to 0. - * @return boolean Whether operation was successful. - */ - public function forceRollBack() - { - $return = true; - if ($this->nestedTransactionCount) { - // If we're in a transaction, always roll it back - // regardless of nesting level. - $return = parent::rollBack(); - - // reset nested transaction count to 0 so that we don't - // try to commit (or rollback) the transaction outside this scope. - $this->nestedTransactionCount = 0; - - if ($this->useDebug) { - $this->log('Rollback transaction', null, __METHOD__); - } - } - return $return; - } - - /** - * Sets a connection attribute. - * - * This is overridden here to provide support for setting Propel-specific attributes - * too. - * - * @param int $attribute The attribute to set (e.g. PropelPDO::PROPEL_ATTR_CACHE_PREPARES). - * @param mixed $value The attribute value. - */ - public function setAttribute($attribute, $value) - { - switch($attribute) { - case self::PROPEL_ATTR_CACHE_PREPARES: - $this->cachePreparedStatements = $value; - break; - default: - parent::setAttribute($attribute, $value); - } - } - - /** - * Gets a connection attribute. - * - * This is overridden here to provide support for setting Propel-specific attributes - * too. - * - * @param int $attribute The attribute to get (e.g. PropelPDO::PROPEL_ATTR_CACHE_PREPARES). - */ - public function getAttribute($attribute) - { - switch($attribute) { - case self::PROPEL_ATTR_CACHE_PREPARES: - return $this->cachePreparedStatements; - break; - default: - return parent::getAttribute($attribute); - } - } - - /** - * Prepares a statement for execution and returns a statement object. - * - * Overrides PDO::prepare() in order to: - * - Add logging and query counting if logging is true. - * - Add query caching support if the PropelPDO::PROPEL_ATTR_CACHE_PREPARES was set to true. - * - * @param string $sql This must be a valid SQL statement for the target database server. - * @param array One or more key => value pairs to set attribute values - * for the PDOStatement object that this method returns. - * @return PDOStatement - */ - public function prepare($sql, $driver_options = array()) - { - if ($this->useDebug) { - $debug = $this->getDebugSnapshot(); - } - - if ($this->cachePreparedStatements) { - if (!isset($this->preparedStatements[$sql])) { - $return = parent::prepare($sql, $driver_options); - $this->preparedStatements[$sql] = $return; - } else { - $return = $this->preparedStatements[$sql]; - } - } else { - $return = parent::prepare($sql, $driver_options); - } - - if ($this->useDebug) { - $this->log($sql, null, __METHOD__, $debug); - } - - return $return; - } - - /** - * Execute an SQL statement and return the number of affected rows. - * - * Overrides PDO::exec() to log queries when required - * - * @return int - */ - public function exec($sql) - { - if ($this->useDebug) { - $debug = $this->getDebugSnapshot(); - } - - $return = parent::exec($sql); - - if ($this->useDebug) { - $this->log($sql, null, __METHOD__, $debug); - $this->setLastExecutedQuery($sql); - $this->incrementQueryCount(); - } - - return $return; - } - - /** - * Executes an SQL statement, returning a result set as a PDOStatement object. - * Despite its signature here, this method takes a variety of parameters. - * - * Overrides PDO::query() to log queries when required - * - * @see http://php.net/manual/en/pdo.query.php for a description of the possible parameters. - * @return PDOStatement - */ - public function query() - { - if ($this->useDebug) { - $debug = $this->getDebugSnapshot(); - } - - $args = func_get_args(); - if (version_compare(PHP_VERSION, '5.3', '<')) { - $return = call_user_func_array(array($this, 'parent::query'), $args); - } else { - $return = call_user_func_array('parent::query', $args); - } - - if ($this->useDebug) { - $sql = $args[0]; - $this->log($sql, null, __METHOD__, $debug); - $this->setLastExecutedQuery($sql); - $this->incrementQueryCount(); - } - - return $return; - } - - /** - * Clears any stored prepared statements for this connection. - */ - public function clearStatementCache() - { - $this->preparedStatements = array(); - } - - /** - * Configures the PDOStatement class for this connection. - * - * @param boolean $suppressError Whether to suppress an exception if the statement class cannot be set. - * @throws PropelException if the statement class cannot be set (and $suppressError is false). - */ - protected function configureStatementClass($class = 'PDOStatement', $suppressError = true) - { - // extending PDOStatement is only supported with non-persistent connections - if (!$this->getAttribute(PDO::ATTR_PERSISTENT)) { - $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array($class, array($this))); - } elseif (!$suppressError) { - throw new PropelException('Extending PDOStatement is not supported with persistent connections.'); - } - } - - /** - * Returns the number of queries this DebugPDO instance has performed on the database connection. - * - * When using DebugPDOStatement as the statement class, any queries by DebugPDOStatement instances - * are counted as well. - * - * @return int - * @throws PropelException if persistent connection is used (since unable to override PDOStatement in that case). - */ - public function getQueryCount() - { - // extending PDOStatement is not supported with persistent connections - if ($this->getAttribute(PDO::ATTR_PERSISTENT)) { - throw new PropelException('Extending PDOStatement is not supported with persistent connections. Count would be inaccurate, because we cannot count the PDOStatment::execute() calls. Either don\'t use persistent connections or don\'t call PropelPDO::getQueryCount()'); - } - return $this->queryCount; - } - - /** - * Increments the number of queries performed by this DebugPDO instance. - * - * Returns the original number of queries (ie the value of $this->queryCount before calling this method). - * - * @return int - */ - public function incrementQueryCount() - { - $this->queryCount++; - } - - /** - * Get the SQL code for the latest query executed by Propel - * - * @return string Executable SQL code - */ - public function getLastExecutedQuery() - { - return $this->lastExecutedQuery; - } - - /** - * Set the SQL code for the latest query executed by Propel - * - * @param string $query Executable SQL code - */ - public function setLastExecutedQuery($query) - { - $this->lastExecutedQuery = $query; - } - - /** - * Enable or disable the query debug features - * - * @var boolean $value True to enable debug (default), false to disable it - */ - public function useDebug($value = true) - { - if ($value) { - $this->configureStatementClass('DebugPDOStatement', $suppress = true); - } else { - // reset query logging - $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('PDOStatement')); - $this->setLastExecutedQuery(''); - $this->queryCount = 0; - } - $this->clearStatementCache(); - $this->useDebug = $value; - } - - /** - * Sets the logging level to use for logging method calls and SQL statements. - * - * @param int $level Value of one of the Propel::LOG_* class constants. - */ - public function setLogLevel($level) - { - $this->logLevel = $level; - } - - /** - * Sets a logger to use. - * - * The logger will be used by this class to log various method calls and their properties. - * - * @param BasicLogger $logger A Logger with an API compatible with BasicLogger (or PEAR Log). - */ - public function setLogger($logger) - { - $this->logger = $logger; - } - - /** - * Gets the logger in use. - * - * @return BasicLogger $logger A Logger with an API compatible with BasicLogger (or PEAR Log). - */ - public function getLogger() - { - return $this->logger; - } - - /** - * Logs the method call or SQL using the Propel::log() method or a registered logger class. - * - * @uses self::getLogPrefix() - * @see self::setLogger() - * - * @param string $msg Message to log. - * @param int $level (optional) Log level to use; will use self::setLogLevel() specified level by default. - * @param string $methodName (optional) Name of the method whose execution is being logged. - * @param array $debugSnapshot (optional) Previous return value from self::getDebugSnapshot(). - */ - public function log($msg, $level = null, $methodName = null, array $debugSnapshot = null) - { - // If logging has been specifically disabled, this method won't do anything - if (!$this->getLoggingConfig('enabled', true)) { - return; - } - - // If the method being logged isn't one of the ones to be logged, bail - if (!in_array($methodName, $this->getLoggingConfig('methods', self::$defaultLogMethods))) { - return; - } - - // If a logging level wasn't provided, use the default one - if ($level === null) { - $level = $this->logLevel; - } - - // Determine if this query is slow enough to warrant logging - if ($this->getLoggingConfig("onlyslow", self::DEFAULT_ONLYSLOW_ENABLED)) { - $now = $this->getDebugSnapshot(); - if ($now['microtime'] - $debugSnapshot['microtime'] < $this->getLoggingConfig("details.slow.threshold", self::DEFAULT_SLOW_THRESHOLD)) return; - } - - // If the necessary additional parameters were given, get the debug log prefix for the log line - if ($methodName && $debugSnapshot) { - $msg = $this->getLogPrefix($methodName, $debugSnapshot) . $msg; - } - - // We won't log empty messages - if (!$msg) { - return; - } - - // Delegate the actual logging forward - if ($this->logger) { - $this->logger->log($msg, $level); - } else { - Propel::log($msg, $level); - } - } - - /** - * Returns a snapshot of the current values of some functions useful in debugging. - * - * @return array - */ - public function getDebugSnapshot() - { - if ($this->useDebug) { - return array( - 'microtime' => microtime(true), - 'memory_get_usage' => memory_get_usage($this->getLoggingConfig('realmemoryusage', false)), - 'memory_get_peak_usage' => memory_get_peak_usage($this->getLoggingConfig('realmemoryusage', false)), - ); - } else { - throw new PropelException('Should not get debug snapshot when not debugging'); - } - } - - /** - * Returns a named configuration item from the Propel runtime configuration, from under the - * 'debugpdo.logging' prefix. If such a configuration setting hasn't been set, the given default - * value will be returned. - * - * @param string $key Key for which to return the value. - * @param mixed $defaultValue Default value to apply if config item hasn't been set. - * @return mixed - */ - protected function getLoggingConfig($key, $defaultValue) - { - return Propel::getConfiguration(PropelConfiguration::TYPE_OBJECT)->getParameter("debugpdo.logging.$key", $defaultValue); - } - - /** - * Returns a prefix that may be prepended to a log line, containing debug information according - * to the current configuration. - * - * Uses a given $debugSnapshot to calculate how much time has passed since the call to self::getDebugSnapshot(), - * how much the memory consumption by PHP has changed etc. - * - * @see self::getDebugSnapshot() - * - * @param string $methodName Name of the method whose execution is being logged. - * @param array $debugSnapshot A previous return value from self::getDebugSnapshot(). - * @return string - */ - protected function getLogPrefix($methodName, $debugSnapshot) - { - $prefix = ''; - $now = $this->getDebugSnapshot(); - $logDetails = array_keys($this->getLoggingConfig('details', array())); - $innerGlue = $this->getLoggingConfig('innerglue', ': '); - $outerGlue = $this->getLoggingConfig('outerglue', ' | '); - - // Iterate through each detail that has been configured to be enabled - foreach ($logDetails as $detailName) { - - if (!$this->getLoggingConfig("details.$detailName.enabled", false)) - continue; - - switch ($detailName) { - - case 'slow'; - $value = $now['microtime'] - $debugSnapshot['microtime'] >= $this->getLoggingConfig("details.$detailName.threshold", self::DEFAULT_SLOW_THRESHOLD) ? 'YES' : ' NO'; - break; - - case 'time': - $value = number_format($now['microtime'] - $debugSnapshot['microtime'], $this->getLoggingConfig("details.$detailName.precision", 3)) . ' sec'; - $value = str_pad($value, $this->getLoggingConfig("details.$detailName.pad", 10), ' ', STR_PAD_LEFT); - break; - - case 'mem': - $value = self::getReadableBytes($now['memory_get_usage'], $this->getLoggingConfig("details.$detailName.precision", 1)); - $value = str_pad($value, $this->getLoggingConfig("details.$detailName.pad", 9), ' ', STR_PAD_LEFT); - break; - - case 'memdelta': - $value = $now['memory_get_usage'] - $debugSnapshot['memory_get_usage']; - $value = ($value > 0 ? '+' : '') . self::getReadableBytes($value, $this->getLoggingConfig("details.$detailName.precision", 1)); - $value = str_pad($value, $this->getLoggingConfig("details.$detailName.pad", 10), ' ', STR_PAD_LEFT); - break; - - case 'mempeak': - $value = self::getReadableBytes($now['memory_get_peak_usage'], $this->getLoggingConfig("details.$detailName.precision", 1)); - $value = str_pad($value, $this->getLoggingConfig("details.$detailName.pad", 9), ' ', STR_PAD_LEFT); - break; - - case 'querycount': - $value = $this->getQueryCount(); - $value = str_pad($value, $this->getLoggingConfig("details.$detailName.pad", 2), ' ', STR_PAD_LEFT); - break; - - case 'method': - $value = $methodName; - $value = str_pad($value, $this->getLoggingConfig("details.$detailName.pad", 28), ' ', STR_PAD_RIGHT); - break; - - default: - $value = 'n/a'; - break; - - } - - $prefix .= $detailName . $innerGlue . $value . $outerGlue; - - } - - return $prefix; - } - - /** - * Returns a human-readable representation of the given byte count. - * - * @param int $bytes Byte count to convert. - * @param int $precision How many decimals to include. - * @return string - */ - protected function getReadableBytes($bytes, $precision) - { - $suffix = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); - $total = count($suffix); - - for ($i = 0; $bytes > 1024 && $i < $total; $i++) - $bytes /= 1024; - - return number_format($bytes, $precision) . ' ' . $suffix[$i]; - } - - /** - * If so configured, makes an entry to the log of the state of this object just prior to its destruction. - * Add PropelPDO::__destruct to $defaultLogMethods to see this message - * - * @see self::log() - */ - public function __destruct() - { - if ($this->useDebug) { - $this->log('Closing connection', null, __METHOD__, $this->getDebugSnapshot()); - } - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/exception/PropelException.php b/airtime_mvc/library/propel/runtime/lib/exception/PropelException.php deleted file mode 100644 index b6a7bc7008..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/exception/PropelException.php +++ /dev/null @@ -1,50 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.runtime.exception - */ -class PropelException extends Exception { - - /** The nested "cause" exception. */ - protected $cause; - - function __construct($p1, $p2 = null) { - - $cause = null; - - if ($p2 !== null) { - $msg = $p1; - $cause = $p2; - } else { - if ($p1 instanceof Exception) { - $msg = ""; - $cause = $p1; - } else { - $msg = $p1; - } - } - - parent::__construct($msg); - - if ($cause !== null) { - $this->cause = $cause; - $this->message .= " [wrapped: " . $cause->getMessage() ."]"; - } - } - - function getCause() { - return $this->cause; - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/formatter/ModelWith.php b/airtime_mvc/library/propel/runtime/lib/formatter/ModelWith.php deleted file mode 100644 index 2e295505d7..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/formatter/ModelWith.php +++ /dev/null @@ -1,144 +0,0 @@ -init($join); - } - } - - /** - * Define the joined hydration schema based on a join object. - * Fills the ModelWith properties using a ModelJoin as source - * - * @param ModelJoin $join - */ - public function init(ModelJoin $join) - { - $tableMap = $join->getTableMap(); - $this->modelName = $tableMap->getClassname(); - $this->modelPeerName = $tableMap->getPeerClassname(); - $this->isSingleTableInheritance = $tableMap->isSingleTableInheritance(); - $relation = $join->getRelationMap(); - if ($relation->getType() == RelationMap::ONE_TO_MANY) { - $this->isAdd = true; - $this->relationName = $relation->getName() . 's'; - $this->relationMethod = 'add' . $relation->getName(); - } else { - $this->relationName = $relation->getName(); - $this->relationMethod = 'set' . $relation->getName(); - } - if (!$join->isPrimary()) { - $this->relatedClass = $join->hasLeftTableAlias() ? $join->getLeftTableAlias() : $relation->getLeftTable()->getPhpName(); - } - } - - // DataObject getters & setters - - public function setModelName($modelName) - { - $this->modelName = $modelName; - } - - public function getModelName() - { - return $this->modelName; - } - - public function setModelPeerName($modelPeerName) - { - $this->modelPeerName = $modelPeerName; - } - - public function getModelPeerName() - { - return $this->modelPeerName; - } - - public function setIsSingleTableInheritance($isSingleTableInheritance) - { - $this->isSingleTableInheritance = $isSingleTableInheritance; - } - - public function isSingleTableInheritance() - { - return $this->isSingleTableInheritance; - } - - public function setIsAdd($isAdd) - { - $this->isAdd = $isAdd;; - } - - public function isAdd() - { - return $this->isAdd; - } - - public function setRelationName($relationName) - { - $this->relationName = $relationName; - } - - public function getRelationName() - { - return $this->relationName; - } - - public function setRelationMethod($relationMethod) - { - $this->relationMethod = $relationMethod; - } - - public function getRelationMethod() - { - return $this->relationMethod; - } - - public function setRelatedClass($relatedClass) - { - $this->relatedClass = $relatedClass; - } - - public function getRelatedClass() - { - return $this->relatedClass; - } - - // Utility methods - - public function isPrimary() - { - return null === $this->relatedClass; - } - - public function __toString() - { - return sprintf("modelName: %s, relationName: %s, relationMethod: %s, relatedClass: %s", $this->modelName, $this->relationName, $this->relationMethod, $this->relatedClass); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/formatter/PropelArrayFormatter.php b/airtime_mvc/library/propel/runtime/lib/formatter/PropelArrayFormatter.php deleted file mode 100644 index 97bc334270..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/formatter/PropelArrayFormatter.php +++ /dev/null @@ -1,170 +0,0 @@ -checkInit(); - if($class = $this->collectionName) { - $collection = new $class(); - $collection->setModel($this->class); - $collection->setFormatter($this); - } else { - $collection = array(); - } - if ($this->isWithOneToMany() && $this->hasLimit) { - throw new PropelException('Cannot use limit() in conjunction with with() on a one-to-many relationship. Please remove the with() call, or the limit() call.'); - } - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - if ($object = &$this->getStructuredArrayFromRow($row)) { - $collection[] = $object; - } - } - $this->currentObjects = array(); - $this->alreadyHydratedObjects = array(); - $stmt->closeCursor(); - - return $collection; - } - - public function formatOne(PDOStatement $stmt) - { - $this->checkInit(); - $result = null; - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - if ($object = &$this->getStructuredArrayFromRow($row)) { - $result = &$object; - } - } - $this->currentObjects = array(); - $this->alreadyHydratedObjects = array(); - $stmt->closeCursor(); - return $result; - } - - /** - * Formats an ActiveRecord object - * - * @param BaseObject $record the object to format - * - * @return array The original record turned into an array - */ - public function formatRecord($record = null) - { - return $record ? $record->toArray() : array(); - } - - public function isObjectFormatter() - { - return false; - } - - - /** - * Hydrates a series of objects from a result row - * The first object to hydrate is the model of the Criteria - * The following objects (the ones added by way of ModelCriteria::with()) are linked to the first one - * - * @param array $row associative array indexed by column number, - * as returned by PDOStatement::fetch(PDO::FETCH_NUM) - * - * @return Array - */ - public function &getStructuredArrayFromRow($row) - { - $col = 0; - - // hydrate main object or take it from registry - $mainObjectIsNew = false; - $mainKey = call_user_func(array($this->peer, 'getPrimaryKeyHashFromRow'), $row); - // we hydrate the main object even in case of a one-to-many relationship - // in order to get the $col variable increased anyway - $obj = $this->getSingleObjectFromRow($row, $this->class, $col); - if (!isset($this->alreadyHydratedObjects[$this->class][$mainKey])) { - $this->alreadyHydratedObjects[$this->class][$mainKey] = $obj->toArray(); - $mainObjectIsNew = true; - } - - $hydrationChain = array(); - - // related objects added using with() - foreach ($this->getWith() as $relAlias => $modelWith) { - - // determine class to use - if ($modelWith->isSingleTableInheritance()) { - $class = call_user_func(array($modelWith->getModelPeerName(), 'getOMClass'), $row, $col, false); - $refl = new ReflectionClass($class); - if ($refl->isAbstract()) { - $col += constant($class . 'Peer::NUM_COLUMNS'); - continue; - } - } else { - $class = $modelWith->getModelName(); - } - - // hydrate related object or take it from registry - $key = call_user_func(array($modelWith->getModelPeerName(), 'getPrimaryKeyHashFromRow'), $row, $col); - // we hydrate the main object even in case of a one-to-many relationship - // in order to get the $col variable increased anyway - $secondaryObject = $this->getSingleObjectFromRow($row, $class, $col); - if (!isset($this->alreadyHydratedObjects[$relAlias][$key])) { - - if ($secondaryObject->isPrimaryKeyNull()) { - $this->alreadyHydratedObjects[$relAlias][$key] = array(); - } else { - $this->alreadyHydratedObjects[$relAlias][$key] = $secondaryObject->toArray(); - } - } - - if ($modelWith->isPrimary()) { - $arrayToAugment = &$this->alreadyHydratedObjects[$this->class][$mainKey]; - } else { - $arrayToAugment = &$hydrationChain[$modelWith->getRelatedClass()]; - } - - if ($modelWith->isAdd()) { - if (!isset($arrayToAugment[$modelWith->getRelationName()]) || !in_array($this->alreadyHydratedObjects[$relAlias][$key], $arrayToAugment[$modelWith->getRelationName()])) { - $arrayToAugment[$modelWith->getRelationName()][] = &$this->alreadyHydratedObjects[$relAlias][$key]; - } - } else { - $arrayToAugment[$modelWith->getRelationName()] = &$this->alreadyHydratedObjects[$relAlias][$key]; - } - - $hydrationChain[$relAlias] = &$this->alreadyHydratedObjects[$relAlias][$key]; - } - - // columns added using withColumn() - foreach ($this->getAsColumns() as $alias => $clause) { - $this->alreadyHydratedObjects[$this->class][$mainKey][$alias] = $row[$col]; - $col++; - } - - if ($mainObjectIsNew) { - return $this->alreadyHydratedObjects[$this->class][$mainKey]; - } else { - // we still need to return a reference to something to avoid a warning - return $emptyVariable; - } - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/formatter/PropelFormatter.php b/airtime_mvc/library/propel/runtime/lib/formatter/PropelFormatter.php deleted file mode 100644 index 5933515d99..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/formatter/PropelFormatter.php +++ /dev/null @@ -1,202 +0,0 @@ -init($criteria); - } - } - - /** - * Define the hydration schema based on a query object. - * Fills the Formatter's properties using a Criteria as source - * - * @param ModelCriteria $criteria - * - * @return PropelFormatter The current formatter object - */ - public function init(ModelCriteria $criteria) - { - $this->dbName = $criteria->getDbName(); - $this->class = $criteria->getModelName(); - $this->peer = $criteria->getModelPeerName(); - $this->setWith($criteria->getWith()); - $this->asColumns = $criteria->getAsColumns(); - $this->hasLimit = $criteria->getLimit() != 0; - - return $this; - } - - // DataObject getters & setters - - public function setDbName($dbName) - { - $this->dbName = $dbName; - } - - public function getDbName() - { - return $this->dbName; - } - - public function setClass($class) - { - $this->class = $class; - } - - public function getClass() - { - return $this->class; - } - - public function setPeer($peer) - { - $this->peer = $peer; - } - - public function getPeer() - { - return $this->peer; - } - - public function setWith($withs = array()) - { - $this->with = array(); - foreach ($withs as $relation => $join) { - $this->with[$relation] = new ModelWith($join); - } - } - - public function getWith() - { - return $this->with; - } - - public function setAsColumns($asColumns = array()) - { - $this->asColumns = $asColumns; - } - - public function getAsColumns() - { - return $this->asColumns; - } - - public function setHasLimit($hasLimit = false) - { - $this->hasLimit = $hasLimit; - } - - public function hasLimit() - { - return $this->hasLimit; - } - - /** - * Formats an ActiveRecord object - * - * @param BaseObject $record the object to format - * - * @return BaseObject The original record - */ - public function formatRecord($record = null) - { - return $record; - } - - abstract public function format(PDOStatement $stmt); - - abstract public function formatOne(PDOStatement $stmt); - - abstract public function isObjectFormatter(); - - public function checkInit() - { - if (null === $this->peer) { - throw new PropelException('You must initialize a formatter object before calling format() or formatOne()'); - } - } - - public function getTableMap() - { - return Propel::getDatabaseMap($this->dbName)->getTableByPhpName($this->class); - } - - protected function isWithOneToMany() - { - foreach ($this->with as $modelWith) { - if ($modelWith->isAdd()) { - return true; - } - } - return false; - } - - /** - * Gets the worker object for the class. - * To save memory, we don't create a new object for each row, - * But we keep hydrating a single object per class. - * The column offset in the row is used to index the array of classes - * As there may be more than one object of the same class in the chain - * - * @param int $col Offset of the object in the list of objects to hydrate - * @param string $class Propel model object class - * - * @return BaseObject - */ - protected function getWorkerObject($col, $class) - { - if(isset($this->currentObjects[$col])) { - $this->currentObjects[$col]->clear(); - } else { - $this->currentObjects[$col] = new $class(); - } - return $this->currentObjects[$col]; - } - - /** - * Gets a Propel object hydrated from a selection of columns in statement row - * - * @param array $row associative array indexed by column number, - * as returned by PDOStatement::fetch(PDO::FETCH_NUM) - * @param string $class The classname of the object to create - * @param int $col The start column for the hydration (modified) - * - * @return BaseObject - */ - public function getSingleObjectFromRow($row, $class, &$col = 0) - { - $obj = $this->getWorkerObject($col, $class); - $col = $obj->hydrate($row, $col); - - return $obj; - } - - -} diff --git a/airtime_mvc/library/propel/runtime/lib/formatter/PropelObjectFormatter.php b/airtime_mvc/library/propel/runtime/lib/formatter/PropelObjectFormatter.php deleted file mode 100644 index af6444e121..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/formatter/PropelObjectFormatter.php +++ /dev/null @@ -1,112 +0,0 @@ -checkInit(); - if($class = $this->collectionName) { - $collection = new $class(); - $collection->setModel($this->class); - $collection->setFormatter($this); - } else { - $collection = array(); - } - if ($this->isWithOneToMany()) { - if ($this->hasLimit) { - throw new PropelException('Cannot use limit() in conjunction with with() on a one-to-many relationship. Please remove the with() call, or the limit() call.'); - } - $pks = array(); - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $object = $this->getAllObjectsFromRow($row); - $pk = $object->getPrimaryKey(); - if (!in_array($pk, $pks)) { - $collection[] = $object; - $pks[] = $pk; - } - } - } else { - // only many-to-one relationships - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $collection[] = $this->getAllObjectsFromRow($row); - } - } - $stmt->closeCursor(); - - return $collection; - } - - public function formatOne(PDOStatement $stmt) - { - $this->checkInit(); - $result = null; - while ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $result = $this->getAllObjectsFromRow($row); - } - $stmt->closeCursor(); - - return $result; - } - - public function isObjectFormatter() - { - return true; - } - - /** - * Hydrates a series of objects from a result row - * The first object to hydrate is the model of the Criteria - * The following objects (the ones added by way of ModelCriteria::with()) are linked to the first one - * - * @param array $row associative array indexed by column number, - * as returned by PDOStatement::fetch(PDO::FETCH_NUM) - * - * @return BaseObject - */ - public function getAllObjectsFromRow($row) - { - // main object - list($obj, $col) = call_user_func(array($this->peer, 'populateObject'), $row); - // related objects added using with() - foreach ($this->getWith() as $class => $modelWith) { - list($endObject, $col) = call_user_func(array($modelWith->getModelPeerName(), 'populateObject'), $row, $col); - // as we may be in a left join, the endObject may be empty - // in which case it should not be related to the previous object - if (null === $endObject || $endObject->isPrimaryKeyNull()) { - continue; - } - if (isset($hydrationChain)) { - $hydrationChain[$class] = $endObject; - } else { - $hydrationChain = array($class => $endObject); - } - $startObject = $modelWith->isPrimary() ? $obj : $hydrationChain[$modelWith->getRelatedClass()]; - call_user_func(array($startObject, $modelWith->getRelationMethod()), $endObject); - } - // columns added using withColumn() - foreach ($this->getAsColumns() as $alias => $clause) { - $obj->setVirtualColumn($alias, $row[$col]); - $col++; - } - return $obj; - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/formatter/PropelOnDemandFormatter.php b/airtime_mvc/library/propel/runtime/lib/formatter/PropelOnDemandFormatter.php deleted file mode 100644 index f717ccb20e..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/formatter/PropelOnDemandFormatter.php +++ /dev/null @@ -1,96 +0,0 @@ -isSingleTableInheritance = $criteria->getTableMap()->isSingleTableInheritance(); - - return $this; - } - - public function format(PDOStatement $stmt) - { - $this->checkInit(); - if ($this->isWithOneToMany()) { - throw new PropelException('PropelOnDemandFormatter cannot hydrate related objects using a one-to-many relationship. Try removing with() from your query.'); - } - $class = $this->collectionName; - $collection = new $class(); - $collection->setModel($this->class); - $collection->initIterator($this, $stmt); - - return $collection; - } - - /** - * Hydrates a series of objects from a result row - * The first object to hydrate is the model of the Criteria - * The following objects (the ones added by way of ModelCriteria::with()) are linked to the first one - * - * @param array $row associative array indexed by column number, - * as returned by PDOStatement::fetch(PDO::FETCH_NUM) - * - * @return BaseObject - */ - public function getAllObjectsFromRow($row) - { - $col = 0; - // main object - $class = $this->isSingleTableInheritance ? call_user_func(array($his->peer, 'getOMClass'), $row, $col, false) : $this->class; - $obj = $this->getSingleObjectFromRow($row, $class, $col); - // related objects using 'with' - foreach ($this->getWith() as $modelWith) { - if ($modelWith->isSingleTableInheritance()) { - $class = call_user_func(array($modelWith->getModelPeerName(), 'getOMClass'), $row, $col, false); - $refl = new ReflectionClass($class); - if ($refl->isAbstract()) { - $col += constant($class . 'Peer::NUM_COLUMNS'); - continue; - } - } else { - $class = $modelWith->getModelName(); - } - $endObject = $this->getSingleObjectFromRow($row, $class, $col); - // as we may be in a left join, the endObject may be empty - // in which case it should not be related to the previous object - if (null === $endObject || $endObject->isPrimaryKeyNull()) { - continue; - } - if (isset($hydrationChain)) { - $hydrationChain[$class] = $endObject; - } else { - $hydrationChain = array($class => $endObject); - } - $startObject = $modelWith->isPrimary() ? $obj : $hydrationChain[$modelWith->getRelatedClass()]; - call_user_func(array($startObject, $modelWith->getRelationMethod()), $endObject); - } - foreach ($this->getAsColumns() as $alias => $clause) { - $obj->setVirtualColumn($alias, $row[$col]); - $col++; - } - return $obj; - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/formatter/PropelStatementFormatter.php b/airtime_mvc/library/propel/runtime/lib/formatter/PropelStatementFormatter.php deleted file mode 100644 index 5103c8234b..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/formatter/PropelStatementFormatter.php +++ /dev/null @@ -1,45 +0,0 @@ -rowCount() == 0) { - return null; - } else { - return $stmt; - } - } - - public function formatRecord($record = null) - { - throw new PropelException('The Statement formatter cannot transform a record into a statement'); - } - - public function isObjectFormatter() - { - return false; - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/logger/BasicLogger.php b/airtime_mvc/library/propel/runtime/lib/logger/BasicLogger.php deleted file mode 100644 index ce335d2eed..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/logger/BasicLogger.php +++ /dev/null @@ -1,91 +0,0 @@ - - * and Jon Parise . - * - * @author Hans Lellelid - * @version $Revision: 1612 $ - * @package propel.runtime.logger - */ -interface BasicLogger -{ - - /** - * A convenience function for logging an alert event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function alert($message); - - /** - * A convenience function for logging a critical event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function crit($message); - - /** - * A convenience function for logging an error event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function err($message); - - /** - * A convenience function for logging a warning event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function warning($message); - /** - * A convenience function for logging an critical event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function notice($message); - /** - * A convenience function for logging an critical event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function info($message); - - /** - * A convenience function for logging a debug event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function debug($message); - - /** - * Primary method to handle logging. - * - * @param mixed $message String or Exception object containing the message - * to log. - * @param int $severity The numeric severity. Defaults to null so that no - * assumptions are made about the logging backend. - */ - public function log($message, $severity = null); - -} diff --git a/airtime_mvc/library/propel/runtime/lib/logger/MojaviLogAdapter.php b/airtime_mvc/library/propel/runtime/lib/logger/MojaviLogAdapter.php deleted file mode 100644 index af8e48423f..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/logger/MojaviLogAdapter.php +++ /dev/null @@ -1,160 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.runtime.logger - */ -class MojaviLogAdapter implements BasicLogger -{ - - /** - * Instance of mojavi logger - */ - private $logger = null; - - /** - * constructor for setting up Mojavi log adapter - * - * @param ErrorLog $logger instance of Mojavi error log obtained by - * calling LogManager::getLogger(); - */ - public function __construct($logger = null) - { - $this->logger = $logger; - } - - /** - * A convenience function for logging an alert event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function alert($message) - { - $this->log($message, 'alert'); - } - - /** - * A convenience function for logging a critical event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function crit($message) - { - $this->log($message, 'crit'); - } - - /** - * A convenience function for logging an error event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function err($message) - { - $this->log($message, 'err'); - } - - /** - * A convenience function for logging a warning event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function warning($message) - { - $this->log($message, 'warning'); - } - - - /** - * A convenience function for logging an critical event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function notice($message) - { - $this->log($message, 'notice'); - } - /** - * A convenience function for logging an critical event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function info($message) - { - $this->log($message, 'info'); - } - - /** - * A convenience function for logging a debug event. - * - * @param mixed $message String or Exception object containing the message - * to log. - */ - public function debug($message) - { - $this->log($message, 'debug'); - } - - /** - * Primary method to handle logging. - * - * @param mixed $message String or Exception object containing the message - * to log. - * @param int $severity The numeric severity. Defaults to null so that no - * assumptions are made about the logging backend. - */ - public function log($message, $severity = null) - { - if (is_null($this->logger)) - $this->logger = LogManager::getLogger('propel'); - - switch($severity) - { - case 'crit': - $method = 'fatal'; - break; - case 'err': - $method = 'error'; - break; - case 'alert': - case 'warning': - $method = 'warning'; - break; - case 'notice': - case 'info': - $method = 'info'; - break; - case 'debug': - default: - $method = 'debug'; - } - - // get a backtrace to pass class, function, file, & line to Mojavi logger - $trace = debug_backtrace(); - - // call the appropriate Mojavi logger method - $this->logger->{$method} ( - $message, - $trace[2]['class'], - $trace[2]['function'], - $trace[1]['file'], - $trace[1]['line'] - ); - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/map/ColumnMap.php b/airtime_mvc/library/propel/runtime/lib/map/ColumnMap.php deleted file mode 100644 index 69868ced5f..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/map/ColumnMap.php +++ /dev/null @@ -1,464 +0,0 @@ - (Propel) - * @author John D. McNally (Torque) - * @version $Revision: 1612 $ - * @package propel.runtime.map - */ -class ColumnMap -{ - - // Propel type of the column - protected $type; - - // Size of the column - protected $size = 0; - - // Is it a primary key? - protected $pk = false; - - // Is null value allowed? - protected $notNull = false; - - // The default value for this column - protected $defaultValue; - - // Name of the table that this column is related to - protected $relatedTableName = ""; - - // Name of the column that this column is related to - protected $relatedColumnName = ""; - - // The TableMap for this column - protected $table; - - // The name of the column - protected $columnName; - - // The php name of the column - protected $phpName; - - // The validators for this column - protected $validators = array(); - - /** - * Constructor. - * - * @param string $name The name of the column. - * @param TableMap containingTable TableMap of the table this column is in. - */ - public function __construct($name, TableMap $containingTable) - { - $this->columnName = $name; - $this->table = $containingTable; - } - - /** - * Get the name of a column. - * - * @return string A String with the column name. - */ - public function getName() - { - return $this->columnName; - } - - /** - * Get the table map this column belongs to. - * @return TableMap - */ - public function getTable() - { - return $this->table; - } - - /** - * Get the name of the table this column is in. - * - * @return string A String with the table name. - */ - public function getTableName() - { - return $this->table->getName(); - } - - /** - * Get the table name + column name. - * - * @return string A String with the full column name. - */ - public function getFullyQualifiedName() - { - return $this->getTableName() . "." . $this->columnName; - } - - /** - * Set the php anme of this column. - * - * @param string $phpName A string representing the PHP name. - * @return void - */ - public function setPhpName($phpName) - { - $this->phpName = $phpName; - } - - /** - * Get the name of a column. - * - * @return string A String with the column name. - */ - public function getPhpName() - { - return $this->phpName; - } - - /** - * Set the Propel type of this column. - * - * @param string $type A string representing the Propel type (e.g. PropelColumnTypes::DATE). - * @return void - */ - public function setType($type) - { - $this->type = $type; - } - - /** - * Get the Propel type of this column. - * - * @return string A string representing the Propel type (e.g. PropelColumnTypes::DATE). - */ - public function getType() - { - return $this->type; - } - - /** - * Get the PDO type of this column. - * - * @return int The PDO::PARMA_* value - */ - public function getPdoType() - { - return PropelColumnTypes::getPdoType($this->type); - } - - /** - * Whether this is a BLOB, LONGVARBINARY, or VARBINARY. - * @return boolean - */ - public function isLob() - { - return ($this->type == PropelColumnTypes::BLOB || $this->type == PropelColumnTypes::VARBINARY || $this->type == PropelColumnTypes::LONGVARBINARY); - } - - /** - * Whether this is a DATE/TIME/TIMESTAMP column. - * - * @return boolean - * @since 1.3 - */ - public function isTemporal() - { - return ($this->type == PropelColumnTypes::TIMESTAMP || $this->type == PropelColumnTypes::DATE || $this->type == PropelColumnTypes::TIME || $this->type == PropelColumnTypes::BU_DATE || $this->type == PropelColumnTypes::BU_TIMESTAMP); - } - - /** - * Whether this is a DATE/TIME/TIMESTAMP column that is post-epoch (1970). - * - * PHP cannot handle pre-epoch timestamps well -- hence the need to differentiate - * between epoch and pre-epoch timestamps. - * - * @return boolean - * @deprecated Propel supports non-epoch dates - */ - public function isEpochTemporal() - { - return ($this->type == PropelColumnTypes::TIMESTAMP || $this->type == PropelColumnTypes::DATE || $this->type == PropelColumnTypes::TIME); - } - - /** - * Whether this column is numeric (int, decimal, bigint etc). - * @return boolean - */ - public function isNumeric() - { - return ($this->type == PropelColumnTypes::NUMERIC || $this->type == PropelColumnTypes::DECIMAL || $this->type == PropelColumnTypes::TINYINT || $this->type == PropelColumnTypes::SMALLINT || $this->type == PropelColumnTypes::INTEGER || $this->type == PropelColumnTypes::BIGINT || $this->type == PropelColumnTypes::REAL || $this->type == PropelColumnTypes::FLOAT || $this->type == PropelColumnTypes::DOUBLE); - } - - /** - * Whether this column is a text column (varchar, char, longvarchar). - * @return boolean - */ - public function isText() - { - return ($this->type == PropelColumnTypes::VARCHAR || $this->type == PropelColumnTypes::LONGVARCHAR || $this->type == PropelColumnTypes::CHAR); - } - - /** - * Set the size of this column. - * - * @param int $size An int specifying the size. - * @return void - */ - public function setSize($size) - { - $this->size = $size; - } - - /** - * Get the size of this column. - * - * @return int An int specifying the size. - */ - public function getSize() - { - return $this->size; - } - - /** - * Set if this column is a primary key or not. - * - * @param boolean $pk True if column is a primary key. - * @return void - */ - public function setPrimaryKey($pk) - { - $this->pk = $pk; - } - - /** - * Is this column a primary key? - * - * @return boolean True if column is a primary key. - */ - public function isPrimaryKey() - { - return $this->pk; - } - - /** - * Set if this column may be null. - * - * @param boolean nn True if column may be null. - * @return void - */ - public function setNotNull($nn) - { - $this->notNull = $nn; - } - - /** - * Is null value allowed ? - * - * @return boolean True if column may not be null. - */ - public function isNotNull() - { - return ($this->notNull || $this->isPrimaryKey()); - } - - /** - * Sets the default value for this column. - * @param mixed $defaultValue the default value for the column - * @return void - */ - public function setDefaultValue($defaultValue) - { - $this->defaultValue = $defaultValue; - } - - /** - * Gets the default value for this column. - * @return mixed String or NULL - */ - public function getDefaultValue() - { - return $this->defaultValue; - } - - /** - * Set the foreign key for this column. - * - * @param string tableName The name of the table that is foreign. - * @param string columnName The name of the column that is foreign. - * @return void - */ - public function setForeignKey($tableName, $columnName) - { - if ($tableName && $columnName) { - $this->relatedTableName = $tableName; - $this->relatedColumnName = $columnName; - } else { - $this->relatedTableName = ""; - $this->relatedColumnName = ""; - } - } - - /** - * Is this column a foreign key? - * - * @return boolean True if column is a foreign key. - */ - public function isForeignKey() - { - if ($this->relatedTableName) { - return true; - } else { - return false; - } - } - - /** - * Get the RelationMap object for this foreign key - */ - public function getRelation() - { - if(!$this->relatedTableName) return null; - foreach ($this->getTable()->getRelations() as $name => $relation) - { - if($relation->getType() == RelationMap::MANY_TO_ONE) - { - if ($relation->getForeignTable()->getName() == $this->getRelatedTableName() - && array_key_exists($this->getFullyQualifiedName(), $relation->getColumnMappings())) - { - return $relation; - } - } - } - } - - /** - * Get the table.column that this column is related to. - * - * @return string A String with the full name for the related column. - */ - public function getRelatedName() - { - return $this->relatedTableName . "." . $this->relatedColumnName; - } - - /** - * Get the table name that this column is related to. - * - * @return string A String with the name for the related table. - */ - public function getRelatedTableName() - { - return $this->relatedTableName; - } - - /** - * Get the column name that this column is related to. - * - * @return string A String with the name for the related column. - */ - public function getRelatedColumnName() - { - return $this->relatedColumnName; - } - - /** - * Get the TableMap object that this column is related to. - * - * @return TableMap The related TableMap object - * @throws PropelException when called on a column with no foreign key - */ - public function getRelatedTable() - { - if ($this->relatedTableName) { - return $this->table->getDatabaseMap()->getTable($this->relatedTableName); - } else { - throw new PropelException("Cannot fetch RelatedTable for column with no foreign key: " . $this->columnName); - } - } - - /** - * Get the TableMap object that this column is related to. - * - * @return ColumnMap The related ColumnMap object - * @throws PropelException when called on a column with no foreign key - */ - public function getRelatedColumn() - { - return $this->getRelatedTable()->getColumn($this->relatedColumnName); - } - - public function addValidator($validator) - { - $this->validators[] = $validator; - } - - public function hasValidators() - { - return count($this->validators) > 0; - } - - public function getValidators() - { - return $this->validators; - } - - /** - * Performs DB-specific ignore case, but only if the column type necessitates it. - * @param string $str The expression we want to apply the ignore case formatting to (e.g. the column name). - * @param DBAdapter $db - */ - public function ignoreCase($str, DBAdapter $db) - { - if ($this->isText()) { - return $db->ignoreCase($str); - } else { - return $str; - } - } - - /** - * Normalizes the column name, removing table prefix and uppercasing. - * - * article.first_name becomes FIRST_NAME - * - * @param string $name - * @return string Normalized column name. - */ - public static function normalizeName($name) - { - if (false !== ($pos = strpos($name, '.'))) { - $name = substr($name, $pos + 1); - } - $name = strtoupper($name); - return $name; - } - - // deprecated methods - - /** - * Gets column name - * @deprecated Use getName() instead - * @return string - * @deprecated Use getName() instead. - */ - public function getColumnName() - { - return $this->getName(); - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/map/DatabaseMap.php b/airtime_mvc/library/propel/runtime/lib/map/DatabaseMap.php deleted file mode 100644 index e4e29e4447..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/map/DatabaseMap.php +++ /dev/null @@ -1,191 +0,0 @@ - (Propel) - * @author John D. McNally (Torque) - * @author Daniel Rall (Torque) - * @version $Revision: 1802 $ - * @package propel.runtime.map - */ -class DatabaseMap -{ - - /** @var string Name of the database. */ - protected $name; - - /** @var array TableMap[] Tables in the database, using table name as key */ - protected $tables = array(); - - /** @var array TableMap[] Tables in the database, using table phpName as key */ - protected $tablesByPhpName = array(); - - /** - * Constructor. - * - * @param string $name Name of the database. - */ - public function __construct($name) - { - $this->name = $name; - } - - /** - * Get the name of this database. - * - * @return string The name of the database. - */ - public function getName() - { - return $this->name; - } - - /** - * Add a new table to the database by name. - * - * @param string $tableName The name of the table. - * @return TableMap The newly created TableMap. - */ - public function addTable($tableName) - { - $this->tables[$tableName] = new TableMap($tableName, $this); - return $this->tables[$tableName]; - } - - /** - * Add a new table object to the database. - * - * @param TableMap $table The table to add - */ - public function addTableObject(TableMap $table) - { - $table->setDatabaseMap($this); - $this->tables[$table->getName()] = $table; - $this->tablesByPhpName[$table->getClassname()] = $table; - } - - /** - * Add a new table to the database, using the tablemap class name. - * - * @param string $tableMapClass The name of the table map to add - * @return TableMap The TableMap object - */ - public function addTableFromMapClass($tableMapClass) - { - $table = new $tableMapClass(); - if(!$this->hasTable($table->getName())) { - $this->addTableObject($table); - return $table; - } else { - return $this->getTable($table->getName()); - } - } - - /** - * Does this database contain this specific table? - * - * @param string $name The String representation of the table. - * @return boolean True if the database contains the table. - */ - public function hasTable($name) - { - if ( strpos($name, '.') > 0) { - $name = substr($name, 0, strpos($name, '.')); - } - return array_key_exists($name, $this->tables); - } - - /** - * Get a TableMap for the table by name. - * - * @param string $name Name of the table. - * @return TableMap A TableMap - * @throws PropelException if the table is undefined - */ - public function getTable($name) - { - if (!isset($this->tables[$name])) { - throw new PropelException("Cannot fetch TableMap for undefined table: " . $name ); - } - return $this->tables[$name]; - } - - /** - * Get a TableMap[] of all of the tables in the database. - * - * @return array A TableMap[]. - */ - public function getTables() - { - return $this->tables; - } - - /** - * Get a ColumnMap for the column by name. - * Name must be fully qualified, e.g. book.AUTHOR_ID - * - * @param $qualifiedColumnName Name of the column. - * @return ColumnMap A TableMap - * @throws PropelException if the table is undefined, or if the table is undefined - */ - public function getColumn($qualifiedColumnName) - { - list($tableName, $columnName) = explode('.', $qualifiedColumnName); - return $this->getTable($tableName)->getColumn($columnName, false); - } - - // deprecated methods - - /** - * Does this database contain this specific table? - * - * @deprecated Use hasTable() instead - * @param string $name The String representation of the table. - * @return boolean True if the database contains the table. - */ - public function containsTable($name) - { - return $this->hasTable($name); - } - - public function getTableByPhpName($phpName) - { - if (array_key_exists($phpName, $this->tablesByPhpName)) { - return $this->tablesByPhpName[$phpName]; - } else if (class_exists($tmClass = $phpName . 'TableMap')) { - $this->addTableFromMapClass($tmClass); - return $this->tablesByPhpName[$phpName]; - } else if (class_exists($tmClass = substr_replace($phpName, '\\map\\', strrpos($phpName, '\\'), 1) . 'TableMap')) { - $this->addTableFromMapClass($tmClass); - return $this->tablesByPhpName[$phpName]; - } else { - throw new PropelException("Cannot fetch TableMap for undefined table phpName: " . $phpName); - } - } - - /** - * Convenience method to get the DBAdapter registered with Propel for this database. - * @return DBAdapter - * @see Propel::getDB(string) - */ - public function getDBAdapter() - { - return Propel::getDB($this->name); - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/map/RelationMap.php b/airtime_mvc/library/propel/runtime/lib/map/RelationMap.php deleted file mode 100644 index 059cd00a4f..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/map/RelationMap.php +++ /dev/null @@ -1,299 +0,0 @@ -name = $name; - } - - /** - * Get the name of this relation. - * - * @return string The name of the relation. - */ - public function getName() - { - return $this->name; - } - - /** - * Set the type - * - * @param integer $type The relation type (either self::MANY_TO_ONE, self::ONE_TO_MANY, or self::ONE_TO_ONE) - */ - public function setType($type) - { - $this->type = $type; - } - - /** - * Get the type - * - * @return integer the relation type - */ - public function getType() - { - return $this->type; - } - - /** - * Set the local table - * - * @param TableMap $table The local table for this relationship - */ - public function setLocalTable($table) - { - $this->localTable = $table; - } - - /** - * Get the local table - * - * @return TableMap The local table for this relationship - */ - public function getLocalTable() - { - return $this->localTable; - } - - /** - * Set the foreign table - * - * @param TableMap $table The foreign table for this relationship - */ - public function setForeignTable($table) - { - $this->foreignTable = $table; - } - - /** - * Get the foreign table - * - * @return TableMap The foreign table for this relationship - */ - public function getForeignTable() - { - return $this->foreignTable; - } - - /** - * Get the left table of the relation - * - * @return TableMap The left table for this relationship - */ - public function getLeftTable() - { - return ($this->getType() == RelationMap::MANY_TO_ONE) ? $this->getLocalTable() : $this->getForeignTable(); - } - - /** - * Get the right table of the relation - * - * @return TableMap The right table for this relationship - */ - public function getRightTable() - { - return ($this->getType() == RelationMap::MANY_TO_ONE) ? $this->getForeignTable() : $this->getLocalTable(); - } - - /** - * Add a column mapping - * - * @param ColumnMap $local The local column - * @param ColumnMap $foreign The foreign column - */ - public function addColumnMapping(ColumnMap $local, ColumnMap $foreign) - { - $this->localColumns[] = $local; - $this->foreignColumns[] = $foreign; - } - - /** - * Get an associative array mapping local column names to foreign column names - * The arrangement of the returned array depends on the $direction parameter: - * - If the value is RelationMap::LOCAL_TO_FOREIGN, then the returned array is local => foreign - * - If the value is RelationMap::LEFT_TO_RIGHT, then the returned array is left => right - * - * @param int $direction How the associative array must return columns - * @return Array Associative array (local => foreign) of fully qualified column names - */ - public function getColumnMappings($direction = RelationMap::LOCAL_TO_FOREIGN) - { - $h = array(); - if ($direction == RelationMap::LEFT_TO_RIGHT && $this->getType() == RelationMap::MANY_TO_ONE) { - $direction = RelationMap::LOCAL_TO_FOREIGN; - } - for ($i=0, $size=count($this->localColumns); $i < $size; $i++) { - if ($direction == RelationMap::LOCAL_TO_FOREIGN) { - $h[$this->localColumns[$i]->getFullyQualifiedName()] = $this->foreignColumns[$i]->getFullyQualifiedName(); - } else { - $h[$this->foreignColumns[$i]->getFullyQualifiedName()] = $this->localColumns[$i]->getFullyQualifiedName(); - } - } - return $h; - } - - /** - * Returns true if the relation has more than one column mapping - * - * @return boolean - */ - public function isComposite() - { - return $this->countColumnMappings() > 1; - } - - /** - * Return the number of column mappings - * - * @return int - */ - public function countColumnMappings() - { - return count($this->localColumns); - } - - /** - * Get the local columns - * - * @return Array list of ColumnMap objects - */ - public function getLocalColumns() - { - return $this->localColumns; - } - - /** - * Get the foreign columns - * - * @return Array list of ColumnMap objects - */ - public function getForeignColumns() - { - return $this->foreignColumns; - } - - /** - * Get the left columns of the relation - * - * @return array of ColumnMap objects - */ - public function getLeftColumns() - { - return ($this->getType() == RelationMap::MANY_TO_ONE) ? $this->getLocalColumns() : $this->getForeignColumns(); - } - - /** - * Get the right columns of the relation - * - * @return array of ColumnMap objects - */ - public function getRightColumns() - { - return ($this->getType() == RelationMap::MANY_TO_ONE) ? $this->getForeignColumns() : $this->getLocalColumns(); - } - - - /** - * Set the onUpdate behavior - * - * @param string $onUpdate - */ - public function setOnUpdate($onUpdate) - { - $this->onUpdate = $onUpdate; - } - - /** - * Get the onUpdate behavior - * - * @return integer the relation type - */ - public function getOnUpdate() - { - return $this->onUpdate; - } - - /** - * Set the onDelete behavior - * - * @param string $onDelete - */ - public function setOnDelete($onDelete) - { - $this->onDelete = $onDelete; - } - - /** - * Get the onDelete behavior - * - * @return integer the relation type - */ - public function getOnDelete() - { - return $this->onDelete; - } - - /** - * Gets the symmetrical relation - * - * @return RelationMap - */ - public function getSymmetricalRelation() - { - $localMapping = array($this->getLeftColumns(), $this->getRightColumns()); - foreach ($this->getRightTable()->getRelations() as $relation) { - if ($localMapping == array($relation->getRightColumns(), $relation->getLeftColumns())) { - return $relation; - } - } - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/map/TableMap.php b/airtime_mvc/library/propel/runtime/lib/map/TableMap.php deleted file mode 100644 index 164e137f52..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/map/TableMap.php +++ /dev/null @@ -1,712 +0,0 @@ - (Propel) - * @author John D. McNally (Torque) - * @author Daniel Rall (Torque) - * @version $Revision: 1612 $ - * @package propel.runtime.map - */ -class TableMap -{ - - /** - * Columns in the table - * @var array TableMap[] - */ - protected $columns = array(); - - /** - * Columns in the table, using table phpName as key - * @var array TableMap[] - */ - protected $columnsByPhpName = array(); - - // The database this table belongs to - protected $dbMap; - - // The name of the table - protected $tableName; - - // The PHP name of the table - protected $phpName; - - // The Classname for this table - protected $classname; - - // The Package for this table - protected $package; - - // Whether to use an id generator for pkey - protected $useIdGenerator; - - // Whether the table uses single table inheritance - protected $isSingleTableInheritance = false; - - // The primary key columns in the table - protected $primaryKeys = array(); - - // The foreign key columns in the table - protected $foreignKeys = array(); - - // The relationships in the table - protected $relations = array(); - - // Relations are lazy loaded. This property tells if the relations are loaded or not - protected $relationsBuilt = false; - - // Object to store information that is needed if the for generating primary keys - protected $pkInfo; - - /** - * Construct a new TableMap. - * - */ - public function __construct($name = null, $dbMap = null) - { - if (null !== $name) { - $this->setName($name); - } - if (null !== $dbMap) { - $this->setDatabaseMap($dbMap); - } - $this->initialize(); - } - - /** - * Initialize the TableMap to build columns, relations, etc - * This method should be overridden by descendents - */ - public function initialize() - { - } - - /** - * Set the DatabaseMap containing this TableMap. - * - * @param DatabaseMap $dbMap A DatabaseMap. - */ - public function setDatabaseMap(DatabaseMap $dbMap) - { - $this->dbMap = $dbMap; - } - - /** - * Get the DatabaseMap containing this TableMap. - * - * @return DatabaseMap A DatabaseMap. - */ - public function getDatabaseMap() - { - return $this->dbMap; - } - - /** - * Set the name of the Table. - * - * @param string $name The name of the table. - */ - public function setName($name) - { - $this->tableName = $name; - } - - /** - * Get the name of the Table. - * - * @return string A String with the name of the table. - */ - public function getName() - { - return $this->tableName; - } - - /** - * Set the PHP name of the Table. - * - * @param string $phpName The PHP Name for this table - */ - public function setPhpName($phpName) - { - $this->phpName = $phpName; - } - - /** - * Get the PHP name of the Table. - * - * @return string A String with the name of the table. - */ - public function getPhpName() - { - return $this->phpName; - } - - /** - * Set the Classname of the Table. Could be useful for calling - * Peer and Object methods dynamically. - * @param string $classname The Classname - */ - public function setClassname($classname) - { - $this->classname = $classname; - } - - /** - * Get the Classname of the Propel Class belonging to this table. - * @return string - */ - public function getClassname() - { - return $this->classname; - } - - /** - * Get the Peer Classname of the Propel Class belonging to this table. - * @return string - */ - public function getPeerClassname() - { - return constant($this->classname . '::PEER'); - } - - /** - * Set the Package of the Table - * - * @param string $package The Package - */ - public function setPackage($package) - { - $this->package = $package; - } - - /** - * Get the Package of the table. - * @return string - */ - public function getPackage() - { - return $this->package; - } - - /** - * Set whether or not to use Id generator for primary key. - * @param boolean $bit - */ - public function setUseIdGenerator($bit) - { - $this->useIdGenerator = $bit; - } - - /** - * Whether to use Id generator for primary key. - * @return boolean - */ - public function isUseIdGenerator() - { - return $this->useIdGenerator; - } - - /** - * Set whether or not to this table uses single table inheritance - * @param boolean $bit - */ - public function setSingleTableInheritance($bit) - { - $this->isSingleTableInheritance = $bit; - } - - /** - * Whether this table uses single table inheritance - * @return boolean - */ - public function isSingleTableInheritance() - { - return $this->isSingleTableInheritance; - } - - /** - * Sets the pk information needed to generate a key - * - * @param $pkInfo information needed to generate a key - */ - public function setPrimaryKeyMethodInfo($pkInfo) - { - $this->pkInfo = $pkInfo; - } - - /** - * Get the information used to generate a primary key - * - * @return An Object. - */ - public function getPrimaryKeyMethodInfo() - { - return $this->pkInfo; - } - - /** - * Add a column to the table. - * - * @param string name A String with the column name. - * @param string $type A string specifying the Propel type. - * @param boolean $isNotNull Whether column does not allow NULL values. - * @param int $size An int specifying the size. - * @param boolean $pk True if column is a primary key. - * @param string $fkTable A String with the foreign key table name. - * @param $fkColumn A String with the foreign key column name. - * @param string $defaultValue The default value for this column. - * @return ColumnMap The newly created column. - */ - public function addColumn($name, $phpName, $type, $isNotNull = false, $size = null, $defaultValue = null, $pk = false, $fkTable = null, $fkColumn = null) - { - $col = new ColumnMap($name, $this); - $col->setType($type); - $col->setSize($size); - $col->setPhpName($phpName); - $col->setNotNull($isNotNull); - $col->setDefaultValue($defaultValue); - - if ($pk) { - $col->setPrimaryKey(true); - $this->primaryKeys[$name] = $col; - } - - if ($fkTable && $fkColumn) { - $col->setForeignKey($fkTable, $fkColumn); - $this->foreignKeys[$name] = $col; - } - - $this->columns[$name] = $col; - $this->columnsByPhpName[$phpName] = $col; - - return $col; - } - - /** - * Add a pre-created column to this table. It will replace any - * existing column. - * - * @param ColumnMap $cmap A ColumnMap. - * @return ColumnMap The added column map. - */ - public function addConfiguredColumn($cmap) - { - $this->columns[ $cmap->getColumnName() ] = $cmap; - return $cmap; - } - - /** - * Does this table contain the specified column? - * - * @param mixed $name name of the column or ColumnMap instance - * @param boolean $normalize Normalize the column name (if column name not like FIRST_NAME) - * @return boolean True if the table contains the column. - */ - public function hasColumn($name, $normalize = true) - { - if ($name instanceof ColumnMap) { - $name = $name->getColumnName(); - } else if($normalize) { - $name = ColumnMap::normalizeName($name); - } - return isset($this->columns[$name]); - } - - /** - * Get a ColumnMap for the table. - * - * @param string $name A String with the name of the table. - * @param boolean $normalize Normalize the column name (if column name not like FIRST_NAME) - * @return ColumnMap A ColumnMap. - * @throws PropelException if the column is undefined - */ - public function getColumn($name, $normalize = true) - { - if ($normalize) { - $name = ColumnMap::normalizeName($name); - } - if (!$this->hasColumn($name, false)) { - throw new PropelException("Cannot fetch ColumnMap for undefined column: " . $name); - } - return $this->columns[$name]; - } - - /** - * Does this table contain the specified column? - * - * @param mixed $phpName name of the column - * @return boolean True if the table contains the column. - */ - public function hasColumnByPhpName($phpName) - { - return isset($this->columnsByPhpName[$phpName]); - } - - /** - * Get a ColumnMap for the table. - * - * @param string $phpName A String with the name of the table. - * @return ColumnMap A ColumnMap. - * @throws PropelException if the column is undefined - */ - public function getColumnByPhpName($phpName) - { - if (!isset($this->columnsByPhpName[$phpName])) { - throw new PropelException("Cannot fetch ColumnMap for undefined column phpName: " . $phpName); - } - return $this->columnsByPhpName[$phpName]; - } - - /** - * Get a ColumnMap[] of the columns in this table. - * - * @return array A ColumnMap[]. - */ - public function getColumns() - { - return $this->columns; - } - - /** - * Add a primary key column to this Table. - * - * @param string $columnName A String with the column name. - * @param string $type A string specifying the Propel type. - * @param boolean $isNotNull Whether column does not allow NULL values. - * @param $size An int specifying the size. - * @return ColumnMap Newly added PrimaryKey column. - */ - public function addPrimaryKey($columnName, $phpName, $type, $isNotNull = false, $size = null, $defaultValue = null) - { - return $this->addColumn($columnName, $phpName, $type, $isNotNull, $size, $defaultValue, true, null, null); - } - - /** - * Add a foreign key column to the table. - * - * @param string $columnName A String with the column name. - * @param string $type A string specifying the Propel type. - * @param string $fkTable A String with the foreign key table name. - * @param string $fkColumn A String with the foreign key column name. - * @param boolean $isNotNull Whether column does not allow NULL values. - * @param int $size An int specifying the size. - * @param string $defaultValue The default value for this column. - * @return ColumnMap Newly added ForeignKey column. - */ - public function addForeignKey($columnName, $phpName, $type, $fkTable, $fkColumn, $isNotNull = false, $size = 0, $defaultValue = null) - { - return $this->addColumn($columnName, $phpName, $type, $isNotNull, $size, $defaultValue, false, $fkTable, $fkColumn); - } - - /** - * Add a foreign primary key column to the table. - * - * @param string $columnName A String with the column name. - * @param string $type A string specifying the Propel type. - * @param string $fkTable A String with the foreign key table name. - * @param string $fkColumn A String with the foreign key column name. - * @param boolean $isNotNull Whether column does not allow NULL values. - * @param int $size An int specifying the size. - * @param string $defaultValue The default value for this column. - * @return ColumnMap Newly created foreign pkey column. - */ - public function addForeignPrimaryKey($columnName, $phpName, $type, $fkTable, $fkColumn, $isNotNull = false, $size = 0, $defaultValue = null) - { - return $this->addColumn($columnName, $phpName, $type, $isNotNull, $size, $defaultValue, true, $fkTable, $fkColumn); - } - - /** - * Returns array of ColumnMap objects that make up the primary key for this table - * - * @return array ColumnMap[] - */ - public function getPrimaryKeys() - { - return $this->primaryKeys; - } - - /** - * Returns array of ColumnMap objects that are foreign keys for this table - * - * @return array ColumnMap[] - */ - public function getForeignKeys() - { - return $this->foreignKeys; - } - - /** - * Add a validator to a table's column - * - * @param string $columnName The name of the validator's column - * @param string $name The rule name of this validator - * @param string $classname The dot-path name of class to use (e.g. myapp.propel.MyValidator) - * @param string $value - * @param string $message The error message which is returned on invalid values - * @return void - */ - public function addValidator($columnName, $name, $classname, $value, $message) - { - if (false !== ($pos = strpos($columnName, '.'))) { - $columnName = substr($columnName, $pos + 1); - } - - $col = $this->getColumn($columnName); - if ($col !== null) { - $validator = new ValidatorMap($col); - $validator->setName($name); - $validator->setClass($classname); - $validator->setValue($value); - $validator->setMessage($message); - $col->addValidator($validator); - } - } - - /** - * Build relations - * Relations are lazy loaded for performance reasons - * This method should be overridden by descendents - */ - public function buildRelations() - { - } - - /** - * Adds a RelationMap to the table - * - * @param string $name The relation name - * @param string $tablePhpName The related table name - * @param integer $type The relation type (either RelationMap::MANY_TO_ONE, RelationMap::ONE_TO_MANY, or RelationMAp::ONE_TO_ONE) - * @param array $columnMapping An associative array mapping column names (local => foreign) - * @return RelationMap the built RelationMap object - */ - public function addRelation($name, $tablePhpName, $type, $columnMapping = array(), $onDelete = null, $onUpdate = null) - { - // note: using phpName for the second table allows the use of DatabaseMap::getTableByPhpName() - // and this method autoloads the TableMap if the table isn't loaded yet - $relation = new RelationMap($name); - $relation->setType($type); - $relation->setOnUpdate($onUpdate); - $relation->setOnDelete($onDelete); - // set tables - if ($type == RelationMap::MANY_TO_ONE) { - $relation->setLocalTable($this); - $relation->setForeignTable($this->dbMap->getTableByPhpName($tablePhpName)); - } else { - $relation->setLocalTable($this->dbMap->getTableByPhpName($tablePhpName)); - $relation->setForeignTable($this); - $columnMapping = array_flip($columnMapping); - } - // set columns - foreach ($columnMapping as $local => $foreign) { - $relation->addColumnMapping( - $relation->getLocalTable()->getColumn($local), - $relation->getForeignTable()->getColumn($foreign) - ); - } - $this->relations[$name] = $relation; - return $relation; - } - - /** - * Gets a RelationMap of the table by relation name - * This method will build the relations if they are not built yet - * - * @param String $name The relation name - * @return boolean true if the relation exists - */ - public function hasRelation($name) - { - return array_key_exists($name, $this->getRelations()); - } - - /** - * Gets a RelationMap of the table by relation name - * This method will build the relations if they are not built yet - * - * @param String $name The relation name - * @return RelationMap The relation object - * @throws PropelException When called on an inexistent relation - */ - public function getRelation($name) - { - if (!array_key_exists($name, $this->getRelations())) - { - throw new PropelException('Calling getRelation() on an unknown relation, ' . $name); - } - return $this->relations[$name]; - } - - /** - * Gets the RelationMap objects of the table - * This method will build the relations if they are not built yet - * - * @return Array list of RelationMap objects - */ - public function getRelations() - { - if(!$this->relationsBuilt) - { - $this->buildRelations(); - $this->relationsBuilt = true; - } - return $this->relations; - } - - /** - * - * Gets the list of behaviors registered for this table - * - * @return array - */ - public function getBehaviors() - { - return array(); - } - - // Deprecated methods and attributres, to be removed - - /** - * Does this table contain the specified column? - * - * @deprecated Use hasColumn instead - * @param mixed $name name of the column or ColumnMap instance - * @param boolean $normalize Normalize the column name (if column name not like FIRST_NAME) - * @return boolean True if the table contains the column. - */ - public function containsColumn($name, $normalize = true) - { - return $this->hasColumn($name, $normalize); - } - - /** - * Normalizes the column name, removing table prefix and uppercasing. - * article.first_name becomes FIRST_NAME - * - * @deprecated Use ColumnMap::normalizeColumName() instead - * @param string $name - * @return string Normalized column name. - */ - protected function normalizeColName($name) - { - return ColumnMap::normalizeName($name); - } - - /** - * Returns array of ColumnMap objects that make up the primary key for this table. - * - * @deprecated Use getPrimaryKeys instead - * @return array ColumnMap[] - */ - public function getPrimaryKeyColumns() - { - return array_values($this->primaryKeys); - } - - //---Utility methods for doing intelligent lookup of table names - - /** - * The prefix on the table name. - * @deprecated Not used anywhere in Propel - */ - private $prefix; - - /** - * Get table prefix name. - * - * @deprecated Not used anywhere in Propel - * @return string A String with the prefix. - */ - public function getPrefix() - { - return $this->prefix; - } - - /** - * Set table prefix name. - * - * @deprecated Not used anywhere in Propel - * @param string $prefix The prefix for the table name (ie: SCARAB for - * SCARAB_PROJECT). - * @return void - */ - public function setPrefix($prefix) - { - $this->prefix = $prefix; - } - - /** - * Tell me if i have PREFIX in my string. - * - * @deprecated Not used anywhere in Propel - * @param data A String. - * @return boolean True if prefix is contained in data. - */ - protected function hasPrefix($data) - { - return (strpos($data, $this->prefix) === 0); - } - - /** - * Removes the PREFIX if found - * - * @deprecated Not used anywhere in Propel - * @param string $data A String. - * @return string A String with data, but with prefix removed. - */ - protected function removePrefix($data) - { - return $this->hasPrefix($data) ? substr($data, strlen($this->prefix)) : $data; - } - - /** - * Removes the PREFIX, removes the underscores and makes - * first letter caps. - * - * SCARAB_FOO_BAR becomes FooBar. - * - * @deprecated Not used anywhere in Propel. At buildtime, use Column::generatePhpName() for that purpose - * @param data A String. - * @return string A String with data processed. - */ - public final function removeUnderScores($data) - { - $out = ''; - $tmp = $this->removePrefix($data); - $tok = strtok($tmp, '_'); - while ($tok) { - $out .= ucfirst($tok); - $tok = strtok('_'); - } - return $out; - } - - /** - * Makes the first letter caps and the rest lowercase. - * - * @deprecated Not used anywhere in Propel. - * @param string $data A String. - * @return string A String with data processed. - */ - private function firstLetterCaps($data) - { - return(ucfirst(strtolower($data))); - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/map/ValidatorMap.php b/airtime_mvc/library/propel/runtime/lib/map/ValidatorMap.php deleted file mode 100644 index 11f18c0a7f..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/map/ValidatorMap.php +++ /dev/null @@ -1,92 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.runtime.map - */ -class ValidatorMap -{ - /** rule name of this validator */ - private $name; - /** the dot-path to class to use for validator */ - private $classname; - /** value to check against */ - private $value; - /** execption message thrown on invalid input */ - private $message; - /** related column */ - private $column; - - public function __construct($containingColumn) - { - $this->column = $containingColumn; - } - - public function getColumn() - { - return $this->column; - } - - public function getColumnName() - { - return $this->column->getColumnName(); - } - - public function setName($name) - { - $this->name = $name; - } - - public function setClass($classname) - { - $this->classname = $classname; - } - - public function setValue($value) - { - $this->value = $value; - } - - public function setMessage($message) - { - $this->message = $message; - } - - public function getName() - { - return $this->name; - } - - public function getClass() - { - return $this->classname; - } - - public function getValue() - { - return $this->value; - } - - public function getMessage() - { - return $this->message; - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/om/BaseObject.php b/airtime_mvc/library/propel/runtime/lib/om/BaseObject.php deleted file mode 100644 index a0a7d126ea..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/om/BaseObject.php +++ /dev/null @@ -1,319 +0,0 @@ - (Propel) - * @author Frank Y. Kim (Torque) - * @author John D. McNally (Torque) - * @version $Revision: 1673 $ - * @package propel.runtime.om - */ -abstract class BaseObject -{ - - /** - * attribute to determine if this object has previously been saved. - * @var boolean - */ - protected $_new = true; - - /** - * attribute to determine whether this object has been deleted. - * @var boolean - */ - protected $_deleted = false; - - /** - * The columns that have been modified in current object. - * Tracking modified columns allows us to only update modified columns. - * @var array - */ - protected $modifiedColumns = array(); - - /** - * The (virtual) columns that are added at runtime - * The formatters can add supplementary columns based on a resultset - * @var array - */ - protected $virtualColumns = array(); - - /** - * Empty constructor (this allows people with their own BaseObject implementation to use its constructor) - */ - public function __construct() { - - } - - /** - * Returns whether the object has been modified. - * - * @return boolean True if the object has been modified. - */ - public function isModified() - { - return !empty($this->modifiedColumns); - } - - /** - * Has specified column been modified? - * - * @param string $col column fully qualified name (BasePeer::TYPE_COLNAME), e.g. Book::AUTHOR_ID - * @return boolean True if $col has been modified. - */ - public function isColumnModified($col) - { - return in_array($col, $this->modifiedColumns); - } - - /** - * Get the columns that have been modified in this object. - * @return array A unique list of the modified column names for this object. - */ - public function getModifiedColumns() - { - return array_unique($this->modifiedColumns); - } - - /** - * Returns whether the object has ever been saved. This will - * be false, if the object was retrieved from storage or was created - * and then saved. - * - * @return true, if the object has never been persisted. - */ - public function isNew() - { - return $this->_new; - } - - /** - * Setter for the isNew attribute. This method will be called - * by Propel-generated children and Peers. - * - * @param boolean $b the state of the object. - */ - public function setNew($b) - { - $this->_new = (boolean) $b; - } - - /** - * Whether this object has been deleted. - * @return boolean The deleted state of this object. - */ - public function isDeleted() - { - return $this->_deleted; - } - - /** - * Specify whether this object has been deleted. - * @param boolean $b The deleted state of this object. - * @return void - */ - public function setDeleted($b) - { - $this->_deleted = (boolean) $b; - } - - /** - * Code to be run before persisting the object - * @param PropelPDO $con - * @return bloolean - */ - public function preSave(PropelPDO $con = null) - { - return true; - } - - /** - * Code to be run after persisting the object - * @param PropelPDO $con - */ - public function postSave(PropelPDO $con = null) { } - - /** - * Code to be run before inserting to database - * @param PropelPDO $con - * @return boolean - */ - public function preInsert(PropelPDO $con = null) - { - return true; - } - - /** - * Code to be run after inserting to database - * @param PropelPDO $con - */ - public function postInsert(PropelPDO $con = null) { } - - /** - * Code to be run before updating the object in database - * @param PropelPDO $con - * @return boolean - */ - public function preUpdate(PropelPDO $con = null) - { - return true; - } - - /** - * Code to be run after updating the object in database - * @param PropelPDO $con - */ - public function postUpdate(PropelPDO $con = null) { } - - /** - * Code to be run before deleting the object in database - * @param PropelPDO $con - * @return boolean - */ - public function preDelete(PropelPDO $con = null) - { - return true; - } - - /** - * Code to be run after deleting the object in database - * @param PropelPDO $con - */ - public function postDelete(PropelPDO $con = null) { } - - /** - * Sets the modified state for the object to be false. - * @param string $col If supplied, only the specified column is reset. - * @return void - */ - public function resetModified($col = null) - { - if ($col !== null) { - while (($offset = array_search($col, $this->modifiedColumns)) !== false) { - array_splice($this->modifiedColumns, $offset, 1); - } - } else { - $this->modifiedColumns = array(); - } - } - - /** - * Compares this with another BaseObject instance. If - * obj is an instance of BaseObject, delegates to - * equals(BaseObject). Otherwise, returns false. - * - * @param obj The object to compare to. - * @return Whether equal to the object specified. - */ - public function equals($obj) - { - $thisclazz = get_class($this); - if (is_object($obj) && $obj instanceof $thisclazz) { - if ($this === $obj) { - return true; - } elseif ($this->getPrimaryKey() === null || $obj->getPrimaryKey() === null) { - return false; - } else { - return ($this->getPrimaryKey() === $obj->getPrimaryKey()); - } - } else { - return false; - } - } - - /** - * If the primary key is not null, return the hashcode of the - * primary key. Otherwise calls Object.hashCode(). - * - * @return int Hashcode - */ - public function hashCode() - { - $ok = $this->getPrimaryKey(); - if ($ok === null) { - return crc32(serialize($this)); - } - return crc32(serialize($ok)); // serialize because it could be an array ("ComboKey") - } - - /** - * Get the associative array of the virtual columns in this object - * - * @param string $name The virtual column name - * - * @return array - */ - public function getVirtualColumns() - { - return $this->virtualColumns; - } - - /** - * Checks the existence of a virtual column in this object - * - * @return boolean - */ - public function hasVirtualColumn($name) - { - return array_key_exists($name, $this->virtualColumns); - } - - /** - * Get the value of a virtual column in this object - * - * @return mixed - */ - public function getVirtualColumn($name) - { - if (!$this->hasVirtualColumn($name)) { - throw new PropelException('Cannot get value of inexistent virtual column ' . $name); - } - return $this->virtualColumns[$name]; - } - - /** - * Get the value of a virtual column in this object - * - * @param string $name The virtual column name - * @param mixed $value The value to give to the virtual column - * - * @return BaseObject The current object, for fluid interface - */ - public function setVirtualColumn($name, $value) - { - $this->virtualColumns[$name] = $value; - return $this; - } - - /** - * Logs a message using Propel::log(). - * - * @param string $msg - * @param int $priority One of the Propel::LOG_* logging levels - * @return boolean - */ - protected function log($msg, $priority = Propel::LOG_INFO) - { - return Propel::log(get_class($this) . ': ' . $msg, $priority); - } - - /** - * Clean up internal collections prior to serializing - * Avoids recursive loops that turn into segmentation faults when serializing - */ - public function __sleep() - { - $this->clearAllReferences(); - return array_keys(get_object_vars($this)); - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/om/NestedSetRecursiveIterator.php b/airtime_mvc/library/propel/runtime/lib/om/NestedSetRecursiveIterator.php deleted file mode 100644 index 97a83028ce..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/om/NestedSetRecursiveIterator.php +++ /dev/null @@ -1,86 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.runtime.om - */ -class NestedSetRecursiveIterator implements RecursiveIterator -{ - protected $topNode = null; - - protected $curNode = null; - - public function __construct($node) - { - $this->topNode = $node; - $this->curNode = $node; - } - - public function rewind() - { - $this->curNode = $this->topNode; - } - - public function valid() - { - return ($this->curNode !== null); - } - - public function current() - { - return $this->curNode; - } - - public function key() - { - $method = method_exists($this->curNode, 'getPath') ? 'getPath' : 'getAncestors'; - $key = array(); - foreach ($this->curNode->$method() as $node) { - $key[] = $node->getPrimaryKey(); - } - return implode('.', $key); - } - - public function next() - { - $nextNode = null; - $method = method_exists($this->curNode, 'retrieveNextSibling') ? 'retrieveNextSibling' : 'getNextSibling'; - if ($this->valid()) { - while (null === $nextNode) { - if (null === $this->curNode) { - break; - } - - if ($this->curNode->hasNextSibling()) { - $nextNode = $this->curNode->$method(); - } else { - break; - } - } - $this->curNode = $nextNode; - } - return $this->curNode; - } - - public function hasChildren() - { - return $this->curNode->hasChildren(); - } - - public function getChildren() - { - $method = method_exists($this->curNode, 'retrieveFirstChild') ? 'retrieveFirstChild' : 'getFirstChild'; - return new NestedSetRecursiveIterator($this->curNode->$method()); - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/om/NodeObject.php b/airtime_mvc/library/propel/runtime/lib/om/NodeObject.php deleted file mode 100644 index 9353fe671d..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/om/NodeObject.php +++ /dev/null @@ -1,324 +0,0 @@ - (Propel) - * @version $Revision: 1612 $ - * @package propel.runtime.om - */ -interface NodeObject extends IteratorAggregate -{ - /** - * If object is saved without left/right values, set them as undefined (0) - * - * @param PropelPDO $con Connection to use. - * @return void - * @throws PropelException - */ - public function save(PropelPDO $con = null); - - /** - * Delete node and descendants - * - * @param PropelPDO $con Connection to use. - * @return void - * @throws PropelException - */ - public function delete(PropelPDO $con = null); - - /** - * Sets node properties to make it a root node. - * - * @return object The current object (for fluent API support) - * @throws PropelException - */ - public function makeRoot(); - - /** - * Gets the level if set, otherwise calculates this and returns it - * - * @param PropelPDO $con Connection to use. - * @return int - */ - public function getLevel(PropelPDO $con = null); - - /** - * Get the path to the node in the tree - * - * @param PropelPDO $con Connection to use. - * @return array - */ - public function getPath(PropelPDO $con = null); - - /** - * Gets the number of children for the node (direct descendants) - * - * @param PropelPDO $con Connection to use. - * @return int - */ - public function getNumberOfChildren(PropelPDO $con = null); - - /** - * Gets the total number of desceandants for the node - * - * @param PropelPDO $con Connection to use. - * @return int - */ - public function getNumberOfDescendants(PropelPDO $con = null); - - /** - * Gets the children for the node - * - * @param PropelPDO $con Connection to use. - * @return array - */ - public function getChildren(PropelPDO $con = null); - - /** - * Gets the descendants for the node - * - * @param PropelPDO $con Connection to use. - * @return array - */ - public function getDescendants(PropelPDO $con = null); - - /** - * Sets the level of the node in the tree - * - * @param int $v new value - * @return object The current object (for fluent API support) - */ - public function setLevel($level); - - /** - * Sets the children array of the node in the tree - * - * @param array of Node $children array of Propel node object - * @return object The current object (for fluent API support) - */ - public function setChildren(array $children); - - /** - * Sets the parentNode of the node in the tree - * - * @param Node $parent Propel node object - * @return object The current object (for fluent API support) - */ - public function setParentNode(NodeObject $parent = null); - - /** - * Sets the previous sibling of the node in the tree - * - * @param Node $node Propel node object - * @return object The current object (for fluent API support) - */ - public function setPrevSibling(NodeObject $node = null); - - /** - * Sets the next sibling of the node in the tree - * - * @param Node $node Propel node object - * @return object The current object (for fluent API support) - */ - public function setNextSibling(NodeObject $node = null); - - /** - * Determines if the node is the root node - * - * @return bool - */ - public function isRoot(); - - /** - * Determines if the node is a leaf node - * - * @return bool - */ - public function isLeaf(); - - /** - * Tests if object is equal to $node - * - * @param object $node Propel object for node to compare to - * @return bool - */ - public function isEqualTo(NodeObject $node); - - /** - * Tests if object has an ancestor - * - * @param PropelPDO $con Connection to use. - * @return bool - */ - public function hasParent(PropelPDO $con = null); - - /** - * Determines if the node has children / descendants - * - * @return bool - */ - public function hasChildren(); - - /** - * Determines if the node has previous sibling - * - * @param PropelPDO $con Connection to use. - * @return bool - */ - public function hasPrevSibling(PropelPDO $con = null); - - /** - * Determines if the node has next sibling - * - * @param PropelPDO $con Connection to use. - * @return bool - */ - public function hasNextSibling(PropelPDO $con = null); - - /** - * Gets ancestor for the given node if it exists - * - * @param PropelPDO $con Connection to use. - * @return mixed Propel object if exists else false - */ - public function retrieveParent(PropelPDO $con = null); - - /** - * Gets first child if it exists - * - * @param PropelPDO $con Connection to use. - * @return mixed Propel object if exists else false - */ - public function retrieveFirstChild(PropelPDO $con = null); - - /** - * Gets last child if it exists - * - * @param PropelPDO $con Connection to use. - * @return mixed Propel object if exists else false - */ - public function retrieveLastChild(PropelPDO $con = null); - - /** - * Gets prev sibling for the given node if it exists - * - * @param PropelPDO $con Connection to use. - * @return mixed Propel object if exists else false - */ - public function retrievePrevSibling(PropelPDO $con = null); - - /** - * Gets next sibling for the given node if it exists - * - * @param PropelPDO $con Connection to use. - * @return mixed Propel object if exists else false - */ - public function retrieveNextSibling(PropelPDO $con = null); - - /** - * Inserts as first child of destination node $parent - * - * @param object $parent Propel object for given destination node - * @param PropelPDO $con Connection to use. - * @return object The current object (for fluent API support) - */ - public function insertAsFirstChildOf(NodeObject $parent, PropelPDO $con = null); - - /** - * Inserts as last child of destination node $parent - * - * @param object $parent Propel object for given destination node - * @param PropelPDO $con Connection to use. - * @return object The current object (for fluent API support) - */ - public function insertAsLastChildOf(NodeObject $parent, PropelPDO $con = null); - - /** - * Inserts node as previous sibling to destination node $dest - * - * @param object $dest Propel object for given destination node - * @param PropelPDO $con Connection to use. - * @return object The current object (for fluent API support) - */ - public function insertAsPrevSiblingOf(NodeObject $dest, PropelPDO $con = null); - - /** - * Inserts node as next sibling to destination node $dest - * - * @param object $dest Propel object for given destination node - * @param PropelPDO $con Connection to use. - * @return object The current object (for fluent API support) - */ - public function insertAsNextSiblingOf(NodeObject $dest, PropelPDO $con = null); - - /** - * Moves node to be first child of $parent - * - * @param object $parent Propel object for destination node - * @param PropelPDO $con Connection to use. - * @return void - */ - public function moveToFirstChildOf(NodeObject $parent, PropelPDO $con = null); - - /** - * Moves node to be last child of $parent - * - * @param object $parent Propel object for destination node - * @param PropelPDO $con Connection to use. - * @return void - */ - public function moveToLastChildOf(NodeObject $parent, PropelPDO $con = null); - - /** - * Moves node to be prev sibling to $dest - * - * @param object $dest Propel object for destination node - * @param PropelPDO $con Connection to use. - * @return void - */ - public function moveToPrevSiblingOf(NodeObject $dest, PropelPDO $con = null); - - /** - * Moves node to be next sibling to $dest - * - * @param object $dest Propel object for destination node - * @param PropelPDO $con Connection to use. - * @return void - */ - public function moveToNextSiblingOf(NodeObject $dest, PropelPDO $con = null); - - /** - * Inserts node as parent of given node. - * - * @param object $node Propel object for given destination node - * @param PropelPDO $con Connection to use. - * @return void - * @throws Exception When trying to insert node as parent of a root node - */ - public function insertAsParentOf(NodeObject $node, PropelPDO $con = null); - - /** - * Wraps the getter for the scope value - * - * @return int - */ - public function getScopeIdValue(); - - /** - * Set the value of scope column - * - * @param int $v new value - * @return object The current object (for fluent API support) - */ - public function setScopeIdValue($v); -} // NodeObject diff --git a/airtime_mvc/library/propel/runtime/lib/om/Persistent.php b/airtime_mvc/library/propel/runtime/lib/om/Persistent.php deleted file mode 100644 index 02d6c20d95..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/om/Persistent.php +++ /dev/null @@ -1,108 +0,0 @@ - (Propel) - * @author John D. McNally (Torque) - * @author Fedor K. (Torque) - * @version $Revision: 1612 $ - * @package propel.runtime.om - */ -interface Persistent -{ - - /** - * getter for the object primaryKey. - * - * @return ObjectKey the object primaryKey as an Object - */ - public function getPrimaryKey(); - - /** - * Sets the PrimaryKey for the object. - * - * @param mixed $primaryKey The new PrimaryKey object or string (result of PrimaryKey.toString()). - * @return void - * @throws Exception, This method might throw an exceptions - */ - public function setPrimaryKey($primaryKey); - - - /** - * Returns whether the object has been modified, since it was - * last retrieved from storage. - * - * @return boolean True if the object has been modified. - */ - public function isModified(); - - /** - * Has specified column been modified? - * - * @param string $col - * @return boolean True if $col has been modified. - */ - public function isColumnModified($col); - - /** - * Returns whether the object has ever been saved. This will - * be false, if the object was retrieved from storage or was created - * and then saved. - * - * @return boolean True, if the object has never been persisted. - */ - public function isNew(); - - /** - * Setter for the isNew attribute. This method will be called - * by Propel-generated children and Peers. - * - * @param boolean $b the state of the object. - */ - public function setNew($b); - - /** - * Resets (to false) the "modified" state for this object. - * - * @return void - */ - public function resetModified(); - - /** - * Whether this object has been deleted. - * @return boolean The deleted state of this object. - */ - public function isDeleted(); - - /** - * Specify whether this object has been deleted. - * @param boolean $b The deleted state of this object. - * @return void - */ - public function setDeleted($b); - - /** - * Deletes the object. - * @param PropelPDO $con - * @return void - * @throws Exception - */ - public function delete(PropelPDO $con = null); - - /** - * Saves the object. - * @param PropelPDO $con - * @return void - * @throws Exception - */ - public function save(PropelPDO $con = null); -} diff --git a/airtime_mvc/library/propel/runtime/lib/om/PreOrderNodeIterator.php b/airtime_mvc/library/propel/runtime/lib/om/PreOrderNodeIterator.php deleted file mode 100644 index 0afde7f916..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/om/PreOrderNodeIterator.php +++ /dev/null @@ -1,78 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.runtime.om - */ -class PreOrderNodeIterator implements Iterator -{ - private $topNode = null; - - private $curNode = null; - - private $querydb = false; - - private $con = null; - - public function __construct($node, $opts) { - $this->topNode = $node; - $this->curNode = $node; - - if (isset($opts['con'])) - $this->con = $opts['con']; - - if (isset($opts['querydb'])) - $this->querydb = $opts['querydb']; - } - - public function rewind() { - $this->curNode = $this->topNode; - } - - public function valid() { - return ($this->curNode !== null); - } - - public function current() { - return $this->curNode; - } - - public function key() { - return $this->curNode->getNodePath(); - } - - public function next() { - - if ($this->valid()) - { - $nextNode = $this->curNode->getFirstChildNode($this->querydb, $this->con); - - while ($nextNode === null) - { - if ($this->curNode === null || $this->curNode->equals($this->topNode)) - break; - - $nextNode = $this->curNode->getSiblingNode(false, $this->querydb, $this->con); - - if ($nextNode === null) - $this->curNode = $this->curNode->getParentNode($this->querydb, $this->con); - } - - $this->curNode = $nextNode; - } - - return $this->curNode; - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/query/Criteria.php b/airtime_mvc/library/propel/runtime/lib/query/Criteria.php deleted file mode 100644 index cbb3317f1f..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/query/Criteria.php +++ /dev/null @@ -1,1561 +0,0 @@ - (Propel) - * @author Kaspars Jaudzems (Propel) - * @author Frank Y. Kim (Torque) - * @author John D. McNally (Torque) - * @author Brett McLaughlin (Torque) - * @author Eric Dobbs (Torque) - * @author Henning P. Schmiedehausen (Torque) - * @author Sam Joseph (Torque) - * @version $Revision: 1765 $ - * @package propel.runtime.query - */ -class Criteria implements IteratorAggregate -{ - - /** Comparison type. */ - const EQUAL = "="; - - /** Comparison type. */ - const NOT_EQUAL = "<>"; - - /** Comparison type. */ - const ALT_NOT_EQUAL = "!="; - - /** Comparison type. */ - const GREATER_THAN = ">"; - - /** Comparison type. */ - const LESS_THAN = "<"; - - /** Comparison type. */ - const GREATER_EQUAL = ">="; - - /** Comparison type. */ - const LESS_EQUAL = "<="; - - /** Comparison type. */ - const LIKE = " LIKE "; - - /** Comparison type. */ - const NOT_LIKE = " NOT LIKE "; - - /** PostgreSQL comparison type */ - const ILIKE = " ILIKE "; - - /** PostgreSQL comparison type */ - const NOT_ILIKE = " NOT ILIKE "; - - /** Comparison type. */ - const CUSTOM = "CUSTOM"; - - /** Comparison type for update */ - const CUSTOM_EQUAL = "CUSTOM_EQUAL"; - - /** Comparison type. */ - const DISTINCT = "DISTINCT"; - - /** Comparison type. */ - const IN = " IN "; - - /** Comparison type. */ - const NOT_IN = " NOT IN "; - - /** Comparison type. */ - const ALL = "ALL"; - - /** Comparison type. */ - const JOIN = "JOIN"; - - /** Binary math operator: AND */ - const BINARY_AND = "&"; - - /** Binary math operator: OR */ - const BINARY_OR = "|"; - - /** "Order by" qualifier - ascending */ - const ASC = "ASC"; - - /** "Order by" qualifier - descending */ - const DESC = "DESC"; - - /** "IS NULL" null comparison */ - const ISNULL = " IS NULL "; - - /** "IS NOT NULL" null comparison */ - const ISNOTNULL = " IS NOT NULL "; - - /** "CURRENT_DATE" ANSI SQL function */ - const CURRENT_DATE = "CURRENT_DATE"; - - /** "CURRENT_TIME" ANSI SQL function */ - const CURRENT_TIME = "CURRENT_TIME"; - - /** "CURRENT_TIMESTAMP" ANSI SQL function */ - const CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP"; - - /** "LEFT JOIN" SQL statement */ - const LEFT_JOIN = "LEFT JOIN"; - - /** "RIGHT JOIN" SQL statement */ - const RIGHT_JOIN = "RIGHT JOIN"; - - /** "INNER JOIN" SQL statement */ - const INNER_JOIN = "INNER JOIN"; - - /** logical OR operator */ - const LOGICAL_OR = "OR"; - - /** logical AND operator */ - const LOGICAL_AND = "AND"; - - protected $ignoreCase = false; - protected $singleRecord = false; - - /** - * Storage of select data. Collection of column names. - * @var array - */ - protected $selectColumns = array(); - - /** - * Storage of aliased select data. Collection of column names. - * @var array - */ - protected $asColumns = array(); - - /** - * Storage of select modifiers data. Collection of modifier names. - * @var array - */ - protected $selectModifiers = array(); - - /** - * Storage of conditions data. Collection of Criterion objects. - * @var array - */ - protected $map = array(); - - /** - * Storage of ordering data. Collection of column names. - * @var array - */ - protected $orderByColumns = array(); - - /** - * Storage of grouping data. Collection of column names. - * @var array - */ - protected $groupByColumns = array(); - - /** - * Storage of having data. - * @var Criterion - */ - protected $having = null; - - /** - * Storage of join data. colleciton of Join objects. - * @var array - */ - protected $joins = array(); - - /** - * The name of the database. - * @var string - */ - protected $dbName; - - /** - * The primary table for this Criteria. - * Useful in cases where there are no select or where - * columns. - * @var string - */ - protected $primaryTableName; - - /** The name of the database as given in the contructor. */ - protected $originalDbName; - - /** - * To limit the number of rows to return. 0 means return all - * rows. - */ - protected $limit = 0; - - /** To start the results at a row other than the first one. */ - protected $offset = 0; - - /** - * Comment to add to the SQL query - * @var string - */ - protected $queryComment; - - // flag to note that the criteria involves a blob. - protected $blobFlag = null; - - protected $aliases = array(); - - protected $useTransaction = false; - - /** - * Storage for Criterions expected to be combined - * @var array - */ - protected $namedCriterions = array(); - - /** - * Creates a new instance with the default capacity which corresponds to - * the specified database. - * - * @param dbName The dabase name. - */ - public function __construct($dbName = null) - { - $this->setDbName($dbName); - $this->originalDbName = $dbName; - } - - /** - * Implementing SPL IteratorAggregate interface. This allows - * you to foreach () over a Criteria object. - */ - public function getIterator() - { - return new CriterionIterator($this); - } - - /** - * Get the criteria map, i.e. the array of Criterions - * @return array - */ - public function getMap() - { - return $this->map; - } - - /** - * Brings this criteria back to its initial state, so that it - * can be reused as if it was new. Except if the criteria has grown in - * capacity, it is left at the current capacity. - * @return void - */ - public function clear() - { - $this->map = array(); - $this->namedCriterions = array(); - $this->ignoreCase = false; - $this->singleRecord = false; - $this->selectModifiers = array(); - $this->selectColumns = array(); - $this->orderByColumns = array(); - $this->groupByColumns = array(); - $this->having = null; - $this->asColumns = array(); - $this->joins = array(); - $this->dbName = $this->originalDbName; - $this->offset = 0; - $this->limit = -1; - $this->blobFlag = null; - $this->aliases = array(); - $this->useTransaction = false; - } - - /** - * Add an AS clause to the select columns. Usage: - * - * - * Criteria myCrit = new Criteria(); - * myCrit->addAsColumn("alias", "ALIAS(".MyPeer::ID.")"); - * - * - * @param string $name Wanted Name of the column (alias). - * @param string $clause SQL clause to select from the table - * - * If the name already exists, it is replaced by the new clause. - * - * @return Criteria A modified Criteria object. - */ - public function addAsColumn($name, $clause) - { - $this->asColumns[$name] = $clause; - return $this; - } - - /** - * Get the column aliases. - * - * @return array An assoc array which map the column alias names - * to the alias clauses. - */ - public function getAsColumns() - { - return $this->asColumns; - } - - /** - * Returns the column name associated with an alias (AS-column). - * - * @param string $alias - * @return string $string - */ - public function getColumnForAs($as) - { - if (isset($this->asColumns[$as])) { - return $this->asColumns[$as]; - } - } - - /** - * Allows one to specify an alias for a table that can - * be used in various parts of the SQL. - * - * @param string $alias - * @param string $table - * - * @return Criteria A modified Criteria object. - */ - public function addAlias($alias, $table) - { - $this->aliases[$alias] = $table; - - return $this; - } - - /** - * Remove an alias for a table (useful when merging Criterias). - * - * @param string $alias - * - * @return Criteria A modified Criteria object. - */ - public function removeAlias($alias) - { - unset($this->aliases[$alias]); - - return $this; - } - - /** - * Returns the aliases for this Criteria - * - * @return array - */ - public function getAliases() - { - return $this->aliases; - } - - /** - * Returns the table name associated with an alias. - * - * @param string $alias - * @return string $string - */ - public function getTableForAlias($alias) - { - if (isset($this->aliases[$alias])) { - return $this->aliases[$alias]; - } - } - - /** - * Get the keys of the criteria map, i.e. the list of columns bearing a condition - * - * print_r($c->keys()); - * => array('book.price', 'book.title', 'author.first_name') - * - * - * @return array - */ - public function keys() - { - return array_keys($this->map); - } - - /** - * Does this Criteria object contain the specified key? - * - * @param string $column [table.]column - * @return boolean True if this Criteria object contain the specified key. - */ - public function containsKey($column) - { - // must use array_key_exists() because the key could - // exist but have a NULL value (that'd be valid). - return array_key_exists($column, $this->map); - } - - /** - * Does this Criteria object contain the specified key and does it have a value set for the key - * - * @param string $column [table.]column - * @return boolean True if this Criteria object contain the specified key and a value for that key - */ - public function keyContainsValue($column) - { - // must use array_key_exists() because the key could - // exist but have a NULL value (that'd be valid). - return (array_key_exists($column, $this->map) && ($this->map[$column]->getValue() !== null) ); - } - - /** - * Whether this Criteria has any where columns. - * - * This counts conditions added with the add() method. - * - * @return boolean - * @see add() - */ - public function hasWhereClause() - { - return !empty($this->map); - } - - /** - * Will force the sql represented by this criteria to be executed within - * a transaction. This is here primarily to support the oid type in - * postgresql. Though it can be used to require any single sql statement - * to use a transaction. - * @return void - */ - public function setUseTransaction($v) - { - $this->useTransaction = (boolean) $v; - } - - /** - * Whether the sql command specified by this criteria must be wrapped - * in a transaction. - * - * @return boolean - */ - public function isUseTransaction() - { - return $this->useTransaction; - } - - /** - * Method to return criteria related to columns in a table. - * - * Make sure you call containsKey($column) prior to calling this method, - * since no check on the existence of the $column is made in this method. - * - * @param string $column Column name. - * @return Criterion A Criterion object. - */ - public function getCriterion($column) - { - return $this->map[$column]; - } - - /** - * Method to return the latest Criterion in a table. - * - * @return Criterion A Criterion or null no Criterion is added. - */ - public function getLastCriterion() - { - if($cnt = count($this->map)) { - $map = array_values($this->map); - return $map[$cnt - 1]; - } - return null; - } - - /** - * Method to return criterion that is not added automatically - * to this Criteria. This can be used to chain the - * Criterions to form a more complex where clause. - * - * @param string $column Full name of column (for example TABLE.COLUMN). - * @param mixed $value - * @param string $comparison - * @return Criterion - */ - public function getNewCriterion($column, $value = null, $comparison = self::EQUAL) - { - return new Criterion($this, $column, $value, $comparison); - } - - /** - * Method to return a String table name. - * - * @param string $name Name of the key. - * @return string The value of the object at key. - */ - public function getColumnName($name) - { - if (isset($this->map[$name])) { - return $this->map[$name]->getColumn(); - } - return null; - } - - /** - * Shortcut method to get an array of columns indexed by table. - * - * print_r($c->getTablesColumns()); - * => array( - * 'book' => array('book.price', 'book.title'), - * 'author' => array('author.first_name') - * ) - * - * - * @return array array(table => array(table.column1, table.column2)) - */ - public function getTablesColumns() - { - $tables = array(); - foreach ($this->keys() as $key) { - $tableName = substr($key, 0, strrpos($key, '.' )); - $tables[$tableName][] = $key; - } - return $tables; - } - - /** - * Method to return a comparison String. - * - * @param string $key String name of the key. - * @return string A String with the value of the object at key. - */ - public function getComparison($key) - { - if ( isset ( $this->map[$key] ) ) { - return $this->map[$key]->getComparison(); - } - return null; - } - - /** - * Get the Database(Map) name. - * - * @return string A String with the Database(Map) name. - */ - public function getDbName() - { - return $this->dbName; - } - - /** - * Set the DatabaseMap name. If null is supplied, uses value - * provided by Propel::getDefaultDB(). - * - * @param string $dbName The Database (Map) name. - * @return void - */ - public function setDbName($dbName = null) - { - $this->dbName = ($dbName === null ? Propel::getDefaultDB() : $dbName); - } - - /** - * Get the primary table for this Criteria. - * - * This is useful for cases where a Criteria may not contain - * any SELECT columns or WHERE columns. This must be explicitly - * set, of course, in order to be useful. - * - * @return string - */ - public function getPrimaryTableName() - { - return $this->primaryTableName; - } - - /** - * Sets the primary table for this Criteria. - * - * This is useful for cases where a Criteria may not contain - * any SELECT columns or WHERE columns. This must be explicitly - * set, of course, in order to be useful. - * - * @param string $v - */ - public function setPrimaryTableName($tableName) - { - $this->primaryTableName = $tableName; - } - - /** - * Method to return a String table name. - * - * @param string $name The name of the key. - * @return string The value of table for criterion at key. - */ - public function getTableName($name) - { - if (isset($this->map[$name])) { - return $this->map[$name]->getTable(); - } - return null; - } - - /** - * Method to return the value that was added to Criteria. - * - * @param string $name A String with the name of the key. - * @return mixed The value of object at key. - */ - public function getValue($name) - { - if (isset($this->map[$name])) { - return $this->map[$name]->getValue(); - } - return null; - } - - /** - * An alias to getValue() -- exposing a Hashtable-like interface. - * - * @param string $key An Object. - * @return mixed The value within the Criterion (not the Criterion object). - */ - public function get($key) - { - return $this->getValue($key); - } - - /** - * Overrides Hashtable put, so that this object is returned - * instead of the value previously in the Criteria object. - * The reason is so that it more closely matches the behavior - * of the add() methods. If you want to get the previous value - * then you should first Criteria.get() it yourself. Note, if - * you attempt to pass in an Object that is not a String, it will - * throw a NPE. The reason for this is that none of the add() - * methods support adding anything other than a String as a key. - * - * @param string $key - * @param mixed $value - * @return Instance of self. - */ - public function put($key, $value) - { - return $this->add($key, $value); - } - - /** - * Copies all of the mappings from the specified Map to this Criteria - * These mappings will replace any mappings that this Criteria had for any - * of the keys currently in the specified Map. - * - * if the map was another Criteria, its attributes are copied to this - * Criteria, overwriting previous settings. - * - * @param mixed $t Mappings to be stored in this map. - */ - public function putAll($t) - { - if (is_array($t)) { - foreach ($t as $key=>$value) { - if ($value instanceof Criterion) { - $this->map[$key] = $value; - } else { - $this->put($key, $value); - } - } - } elseif ($t instanceof Criteria) { - $this->joins = $t->joins; - } - } - - /** - * This method adds a new criterion to the list of criterias. - * If a criterion for the requested column already exists, it is - * replaced. If is used as follow: - * - * - * $crit = new Criteria(); - * $crit->add($column, $value, Criteria::GREATER_THAN); - * - * - * Any comparison can be used. - * - * The name of the table must be used implicitly in the column name, - * so the Column name must be something like 'TABLE.id'. - * - * @param string $critOrColumn The column to run the comparison on, or Criterion object. - * @param mixed $value - * @param string $comparison A String. - * - * @return A modified Criteria object. - */ - public function add($p1, $value = null, $comparison = null) - { - if ($p1 instanceof Criterion) { - $this->map[$p1->getTable() . '.' . $p1->getColumn()] = $p1; - } else { - $criterion = new Criterion($this, $p1, $value, $comparison); - $this->map[$p1] = $criterion; - } - return $this; - } - - /** - * This method creates a new criterion but keeps it for later use with combine() - * Until combine() is called, the condition is not added to the query - * - * - * $crit = new Criteria(); - * $crit->addCond('cond1', $column1, $value1, Criteria::GREATER_THAN); - * $crit->addCond('cond2', $column2, $value2, Criteria::EQUAL); - * $crit->combine(array('cond1', 'cond2'), Criteria::LOGICAL_OR); - * - * - * Any comparison can be used. - * - * The name of the table must be used implicitly in the column name, - * so the Column name must be something like 'TABLE.id'. - * - * @param string $name name to combine the criterion later - * @param string $p1 The column to run the comparison on, or Criterion object. - * @param mixed $value - * @param string $comparison A String. - * - * @return A modified Criteria object. - */ - public function addCond($name, $p1, $value = null, $comparison = null) - { - if ($p1 instanceof Criterion) { - $this->namedCriterions[$name] = $p1; - } else { - $criterion = new Criterion($this, $p1, $value, $comparison); - $this->namedCriterions[$name] = $criterion; - } - return $this; - } - - /** - * Combine several named criterions with a logical operator - * - * @param array $criterions array of the name of the criterions to combine - * @param string $operator logical operator, either Criteria::LOGICAL_AND, or Criteria::LOGICAL_OR - * @param string $name optional name to combine the criterion later - */ - public function combine($criterions = array(), $operator = self::LOGICAL_AND, $name = null) - { - $operatorMethod = (strtoupper($operator) == self::LOGICAL_AND) ? 'addAnd' : 'addOr'; - $namedCriterions = array(); - foreach ($criterions as $key) { - if (array_key_exists($key, $this->namedCriterions)) { - $namedCriterions[]= $this->namedCriterions[$key]; - unset($this->namedCriterions[$key]); - } else { - throw new PropelException('Cannot combine unknown condition ' . $key); - } - } - $firstCriterion = array_shift($namedCriterions); - foreach ($namedCriterions as $criterion) { - $firstCriterion->$operatorMethod($criterion); - } - if ($name === null) { - $this->add($firstCriterion, null, null); - } else { - $this->addCond($name, $firstCriterion, null, null); - } - - return $this; - } - - /** - * This is the way that you should add a join of two tables. - * Example usage: - * - * $c->addJoin(ProjectPeer::ID, FooPeer::PROJECT_ID, Criteria::LEFT_JOIN); - * // LEFT JOIN FOO ON PROJECT.ID = FOO.PROJECT_ID - * - * - * @param mixed $left A String with the left side of the join. - * @param mixed $right A String with the right side of the join. - * @param mixed $operator A String with the join operator - * among Criteria::INNER_JOIN, Criteria::LEFT_JOIN, - * and Criteria::RIGHT_JOIN - * - * @return Criteria A modified Criteria object. - */ - public function addJoin($left, $right, $operator = null) - { - $join = new Join(); - if (!is_array($left)) { - // simple join - $join->addCondition($left, $right); - } else { - // join with multiple conditions - // deprecated: use addMultipleJoin() instead - foreach ($left as $key => $value) - { - $join->addCondition($value, $right[$key]); - } - } - $join->setJoinType($operator); - - return $this->addJoinObject($join); - } - - /** - * Add a join with multiple conditions - * @see http://propel.phpdb.org/trac/ticket/167, http://propel.phpdb.org/trac/ticket/606 - * - * Example usage: - * $c->addMultipleJoin(array( - * array(LeftPeer::LEFT_COLUMN, RightPeer::RIGHT_COLUMN), // if no third argument, defaults to Criteria::EQUAL - * array(FoldersPeer::alias( 'fo', FoldersPeer::LFT ), FoldersPeer::alias( 'parent', FoldersPeer::RGT ), Criteria::LESS_EQUAL ) - * ), - * Criteria::LEFT_JOIN - * ); - * - * @see addJoin() - * @param array $conditions An array of conditions, each condition being an array (left, right, operator) - * @param string $joinType A String with the join operator. Defaults to an implicit join. - * - * @return Criteria A modified Criteria object. - */ - public function addMultipleJoin($conditions, $joinType = null) - { - $join = new Join(); - foreach ($conditions as $condition) { - $join->addCondition($condition[0], $condition[1], isset($condition[2]) ? $condition[2] : Criteria::EQUAL); - } - $join->setJoinType($joinType); - - return $this->addJoinObject($join); - } - - /** - * Add a join object to the Criteria - * - * @param Join $join A join object - * - * @return Criteria A modified Criteria object - */ - public function addJoinObject(Join $join) - { - if (!in_array($join, $this->joins)) { // compare equality, NOT identity - $this->joins[] = $join; - } - return $this; - } - - - /** - * Get the array of Joins. - * @return array Join[] - */ - public function getJoins() - { - return $this->joins; - } - - /** - * Adds "ALL" modifier to the SQL statement. - * @return Criteria Modified Criteria object (for fluent API) - */ - public function setAll() - { - $this->removeSelectModifier(self::DISTINCT); - $this->addSelectModifier(self::ALL); - - return $this; - } - - /** - * Adds "DISTINCT" modifier to the SQL statement. - * @return Criteria Modified Criteria object (for fluent API) - */ - public function setDistinct() - { - $this->removeSelectModifier(self::ALL); - $this->addSelectModifier(self::DISTINCT); - - return $this; - } - - /** - * Adds a modifier to the SQL statement. - * e.g. self::ALL, self::DISTINCT, 'SQL_CALC_FOUND_ROWS', 'HIGH_PRIORITY', etc. - * - * @param string $modifier The modifier to add - * - * @return Criteria Modified Criteria object (for fluent API) - */ - public function addSelectModifier($modifier) - { - //only allow the keyword once - if (!$this->hasSelectModifier($modifier)) { - $this->selectModifiers[] = $modifier; - } - - return $this; - } - - /** - * Removes a modifier to the SQL statement. - * Checks for existence before removal - * - * @param string $modifier The modifier to add - * - * @return Criteria Modified Criteria object (for fluent API) - */ - public function removeSelectModifier($modifier) - { - $this->selectModifiers = array_values(array_diff($this->selectModifiers, array($modifier))); - - return $this; - } - - /** - * Checks the existence of a SQL select modifier - * - * @param string $modifier The modifier to add - * - * @return bool - */ - public function hasSelectModifier($modifier) - { - return in_array($modifier, $this->selectModifiers); - } - - /** - * Sets ignore case. - * - * @param boolean $b True if case should be ignored. - * @return Criteria Modified Criteria object (for fluent API) - */ - public function setIgnoreCase($b) - { - $this->ignoreCase = (boolean) $b; - return $this; - } - - /** - * Is ignore case on or off? - * - * @return boolean True if case is ignored. - */ - public function isIgnoreCase() - { - return $this->ignoreCase; - } - - /** - * Set single record? Set this to true if you expect the query - * to result in only a single result record (the default behaviour is to - * throw a PropelException if multiple records are returned when the query - * is executed). This should be used in situations where returning multiple - * rows would indicate an error of some sort. If your query might return - * multiple records but you are only interested in the first one then you - * should be using setLimit(1). - * - * @param boolean $b Set to TRUE if you expect the query to select just one record. - * @return Criteria Modified Criteria object (for fluent API) - */ - public function setSingleRecord($b) - { - $this->singleRecord = (boolean) $b; - return $this; - } - - /** - * Is single record? - * - * @return boolean True if a single record is being returned. - */ - public function isSingleRecord() - { - return $this->singleRecord; - } - - /** - * Set limit. - * - * @param limit An int with the value for limit. - * @return Criteria Modified Criteria object (for fluent API) - */ - public function setLimit($limit) - { - // TODO: do we enforce int here? 32bit issue if we do - $this->limit = $limit; - return $this; - } - - /** - * Get limit. - * - * @return int An int with the value for limit. - */ - public function getLimit() - { - return $this->limit; - } - - /** - * Set offset. - * - * @param int $offset An int with the value for offset. (Note this values is - * cast to a 32bit integer and may result in truncatation) - * @return Criteria Modified Criteria object (for fluent API) - */ - public function setOffset($offset) - { - $this->offset = (int) $offset; - return $this; - } - - /** - * Get offset. - * - * @return An int with the value for offset. - */ - public function getOffset() - { - return $this->offset; - } - - /** - * Add select column. - * - * @param string $name Name of the select column. - * @return Criteria Modified Criteria object (for fluent API) - */ - public function addSelectColumn($name) - { - $this->selectColumns[] = $name; - return $this; - } - - /** - * Set the query comment, that appears after the first verb in the SQL query - * - * @param string $comment The comment to add to the query, without comment sign - * @return Criteria Modified Criteria object (for fluent API) - */ - public function setComment($comment = null) - { - $this->queryComment = $comment; - - return $this; - } - - /** - * Get the query comment, that appears after the first verb in the SQL query - * - * @return string The comment to add to the query, without comment sign - */ - public function getComment() - { - return $this->queryComment; - } - - /** - * Whether this Criteria has any select columns. - * - * This will include columns added with addAsColumn() method. - * - * @return boolean - * @see addAsColumn() - * @see addSelectColumn() - */ - public function hasSelectClause() - { - return (!empty($this->selectColumns) || !empty($this->asColumns)); - } - - /** - * Get select columns. - * - * @return array An array with the name of the select columns. - */ - public function getSelectColumns() - { - return $this->selectColumns; - } - - /** - * Clears current select columns. - * - * @return Criteria Modified Criteria object (for fluent API) - */ - public function clearSelectColumns() - { - $this->selectColumns = $this->asColumns = array(); - return $this; - } - - /** - * Get select modifiers. - * - * @return An array with the select modifiers. - */ - public function getSelectModifiers() - { - return $this->selectModifiers; - } - - /** - * Add group by column name. - * - * @param string $groupBy The name of the column to group by. - * @return A modified Criteria object. - */ - public function addGroupByColumn($groupBy) - { - $this->groupByColumns[] = $groupBy; - return $this; - } - - /** - * Add order by column name, explicitly specifying ascending. - * - * @param name The name of the column to order by. - * @return A modified Criteria object. - */ - public function addAscendingOrderByColumn($name) - { - $this->orderByColumns[] = $name . ' ' . self::ASC; - return $this; - } - - /** - * Add order by column name, explicitly specifying descending. - * - * @param string $name The name of the column to order by. - * @return Criteria Modified Criteria object (for fluent API) - */ - public function addDescendingOrderByColumn($name) - { - $this->orderByColumns[] = $name . ' ' . self::DESC; - return $this; - } - - /** - * Get order by columns. - * - * @return array An array with the name of the order columns. - */ - public function getOrderByColumns() - { - return $this->orderByColumns; - } - - /** - * Clear the order-by columns. - * - * @return Criteria Modified Criteria object (for fluent API) - */ - public function clearOrderByColumns() - { - $this->orderByColumns = array(); - return $this; - } - - /** - * Clear the group-by columns. - * - * @return Criteria - */ - public function clearGroupByColumns() - { - $this->groupByColumns = array(); - return $this; - } - - /** - * Get group by columns. - * - * @return array - */ - public function getGroupByColumns() - { - return $this->groupByColumns; - } - - /** - * Get Having Criterion. - * - * @return Criterion A Criterion object that is the having clause. - */ - public function getHaving() - { - return $this->having; - } - - /** - * Remove an object from the criteria. - * - * @param string $key A string with the key to be removed. - * @return mixed The removed value. - */ - public function remove($key) - { - if ( isset ( $this->map[$key] ) ) { - $removed = $this->map[$key]; - unset ( $this->map[$key] ); - if ( $removed instanceof Criterion ) { - return $removed->getValue(); - } - return $removed; - } - } - - /** - * Build a string representation of the Criteria. - * - * @return string A String with the representation of the Criteria. - */ - public function toString() - { - - $sb = "Criteria:"; - try { - - $params = array(); - $sb .= "\nSQL (may not be complete): " - . BasePeer::createSelectSql($this, $params); - - $sb .= "\nParams: "; - $paramstr = array(); - foreach ($params as $param) { - $paramstr[] = $param['table'] . '.' . $param['column'] . ' => ' . var_export($param['value'], true); - } - $sb .= implode(", ", $paramstr); - - } catch (Exception $exc) { - $sb .= "(Error: " . $exc->getMessage() . ")"; - } - - return $sb; - } - - /** - * Returns the size (count) of this criteria. - * @return int - */ - public function size() - { - return count($this->map); - } - - /** - * This method checks another Criteria to see if they contain - * the same attributes and hashtable entries. - * @return boolean - */ - public function equals($crit) - { - if ($crit === null || !($crit instanceof Criteria)) { - return false; - } elseif ($this === $crit) { - return true; - } elseif ($this->size() === $crit->size()) { - - // Important: nested criterion objects are checked - - $criteria = $crit; // alias - if ($this->offset === $criteria->getOffset() - && $this->limit === $criteria->getLimit() - && $this->ignoreCase === $criteria->isIgnoreCase() - && $this->singleRecord === $criteria->isSingleRecord() - && $this->dbName === $criteria->getDbName() - && $this->selectModifiers === $criteria->getSelectModifiers() - && $this->selectColumns === $criteria->getSelectColumns() - && $this->asColumns === $criteria->getAsColumns() - && $this->orderByColumns === $criteria->getOrderByColumns() - && $this->groupByColumns === $criteria->getGroupByColumns() - && $this->aliases === $criteria->getAliases() - ) // what about having ?? - { - foreach ($criteria->keys() as $key) { - if ($this->containsKey($key)) { - $a = $this->getCriterion($key); - $b = $criteria->getCriterion($key); - if (!$a->equals($b)) { - return false; - } - } else { - return false; - } - } - $joins = $criteria->getJoins(); - if (count($joins) != count($this->joins)) { - return false; - } - foreach ($joins as $key => $join) { - if (!$join->equals($this->joins[$key])) { - return false; - } - } - return true; - } else { - return false; - } - } - return false; - } - - /** - * Add the content of a Criteria to the current Criteria - * In case of conflict, the current Criteria keeps its properties - * - * @param Criteria $criteria The criteria to read properties from - * @param string $operator The logical operator used to combine conditions - * Defaults to Criteria::LOGICAL_AND, also accapts Criteria::LOGICAL_OR - * - * @return Criteria The current criteria object - */ - public function mergeWith(Criteria $criteria, $operator = Criteria::LOGICAL_AND) - { - // merge limit - $limit = $criteria->getLimit(); - if($limit != 0 && $this->getLimit() == 0) { - $this->limit = $limit; - } - - // merge offset - $offset = $criteria->getOffset(); - if($offset != 0 && $this->getOffset() == 0) { - $this->offset = $offset; - } - - // merge select modifiers - $selectModifiers = $criteria->getSelectModifiers(); - if ($selectModifiers && ! $this->selectModifiers){ - $this->selectModifiers = $selectModifiers; - } - - // merge select columns - $this->selectColumns = array_merge($this->getSelectColumns(), $criteria->getSelectColumns()); - - // merge as columns - $commonAsColumns = array_intersect_key($this->getAsColumns(), $criteria->getAsColumns()); - if (!empty($commonAsColumns)) { - throw new PropelException('The given criteria contains an AsColumn with an alias already existing in the current object'); - } - $this->asColumns = array_merge($this->getAsColumns(), $criteria->getAsColumns()); - - // merge orderByColumns - $orderByColumns = array_merge($this->getOrderByColumns(), $criteria->getOrderByColumns()); - $this->orderByColumns = array_unique($orderByColumns); - - // merge groupByColumns - $groupByColumns = array_merge($this->getGroupByColumns(), $criteria->getGroupByColumns()); - $this->groupByColumns = array_unique($groupByColumns); - - // merge where conditions - if ($operator == Criteria::LOGICAL_AND) { - foreach ($criteria->getMap() as $key => $criterion) { - if ($this->containsKey($key)) { - $this->addAnd($criterion); - } else { - $this->add($criterion); - } - } - } else { - foreach ($criteria->getMap() as $key => $criterion) { - $this->addOr($criterion); - } - } - - - // merge having - if ($having = $criteria->getHaving()) { - if ($this->getHaving()) { - $this->addHaving($this->getHaving()->addAnd($having)); - } else { - $this->addHaving($having); - } - } - - // merge alias - $commonAliases = array_intersect_key($this->getAliases(), $criteria->getAliases()); - if (!empty($commonAliases)) { - throw new PropelException('The given criteria contains an alias already existing in the current object'); - } - $this->aliases = array_merge($this->getAliases(), $criteria->getAliases()); - - // merge join - $this->joins = array_merge($this->getJoins(), $criteria->getJoins()); - - return $this; - } - - /** - * This method adds a prepared Criterion object to the Criteria as a having clause. - * You can get a new, empty Criterion object with the - * getNewCriterion() method. - * - *

- * - * $crit = new Criteria(); - * $c = $crit->getNewCriterion(BasePeer::ID, 5, Criteria::LESS_THAN); - * $crit->addHaving($c); - * - * - * @param having A Criterion object - * - * @return A modified Criteria object. - */ - public function addHaving(Criterion $having) - { - $this->having = $having; - return $this; - } - - /** - * If a criterion for the requested column already exists, the condition is "AND"ed to the existing criterion (necessary for Propel 1.4 compatibility). - * If no criterion for the requested column already exists, the condition is "AND"ed to the latest criterion. - * If no criterion exist, the condition is added a new criterion - * - * Any comparison can be used. - * - * Supports a number of different signatures: - * - addAnd(column, value, comparison) - * - addAnd(column, value) - * - addAnd(Criterion) - * - * @return Criteria A modified Criteria object. - */ - public function addAnd($p1, $p2 = null, $p3 = null, $preferColumnCondition = true) - { - $criterion = ($p1 instanceof Criterion) ? $p1 : new Criterion($this, $p1, $p2, $p3); - - $key = $criterion->getTable() . '.' . $criterion->getColumn(); - if ($preferColumnCondition && $this->containsKey($key)) { - // FIXME: addAnd() operates preferably on existing conditions on the same column - // this may cause unexpected results, but it's there for BC with Propel 14 - $this->getCriterion($key)->addAnd($criterion); - } else { - // simply add the condition to the list - this is the expected behavior - $this->add($criterion); - } - - return $this; - } - - /** - * If a criterion for the requested column already exists, the condition is "OR"ed to the existing criterion (necessary for Propel 1.4 compatibility). - * If no criterion for the requested column already exists, the condition is "OR"ed to the latest criterion. - * If no criterion exist, the condition is added a new criterion - * - * Any comparison can be used. - * - * Supports a number of different signatures: - * - addOr(column, value, comparison) - * - addOr(column, value) - * - addOr(Criterion) - * - * @return Criteria A modified Criteria object. - */ - public function addOr($p1, $p2 = null, $p3 = null, $preferColumnCondition = true) - { - $rightCriterion = ($p1 instanceof Criterion) ? $p1 : new Criterion($this, $p1, $p2, $p3); - - $key = $rightCriterion->getTable() . '.' . $rightCriterion->getColumn(); - if ($preferColumnCondition && $this->containsKey($key)) { - // FIXME: addOr() operates preferably on existing conditions on the same column - // this may cause unexpected results, but it's there for BC with Propel 14 - $leftCriterion = $this->getCriterion($key); - } else { - // fallback to the latest condition - this is the expected behavior - $leftCriterion = $this->getLastCriterion(); - } - - if ($leftCriterion !== null) { - // combine the given criterion with the existing one with an 'OR' - $leftCriterion->addOr($rightCriterion); - } else { - // nothing to do OR / AND with, so make it first condition - $this->add($rightCriterion); - } - - return $this; - } - - // Fluid Conditions - - /** - * Returns the current object if the condition is true, - * or a PropelConditionalProxy instance otherwise. - * Allows for conditional statements in a fluid interface. - * - * @param bool $cond - * - * @return PropelConditionalProxy|Criteria - */ - public function _if($cond) - { - if($cond) { - return $this; - } else { - return new PropelConditionalProxy($this); - } - } - - /** - * Returns a PropelConditionalProxy instance. - * Allows for conditional statements in a fluid interface. - * - * @param bool $cond ignored - * - * @return PropelConditionalProxy - */ - public function _elseif($cond) - { - return new PropelConditionalProxy($this); - } - - /** - * Returns a PropelConditionalProxy instance. - * Allows for conditional statements in a fluid interface. - * - * @return PropelConditionalProxy - */ - public function _else() - { - return new PropelConditionalProxy($this); - } - - /** - * Returns the current object - * Allows for conditional statements in a fluid interface. - * - * @return Criteria - */ - public function _endif() - { - return $this; - } - - /** - * Ensures deep cloning of attached objects - */ - public function __clone() - { - foreach ($this->map as $key => $criterion) { - $this->map[$key] = clone $criterion; - } - foreach ($this->joins as $key => $join) { - $this->joins[$key] = clone $join; - } - if (null !== $this->having) { - $this->having = clone $this->having; - } - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/query/Criterion.php b/airtime_mvc/library/propel/runtime/lib/query/Criterion.php deleted file mode 100644 index cc412bc050..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/query/Criterion.php +++ /dev/null @@ -1,543 +0,0 @@ - (Propel) - * @version $Revision: 1740 $ - * @package propel.runtime.query - */ -class Criterion -{ - - const UND = " AND "; - const ODER = " OR "; - - /** Value of the CO. */ - protected $value; - - /** Comparison value. - * @var SqlEnum - */ - protected $comparison; - - /** Table name. */ - protected $table; - - /** Real table name */ - protected $realtable; - - /** Column name. */ - protected $column; - - /** flag to ignore case in comparison */ - protected $ignoreStringCase = false; - - /** - * The DBAdaptor which might be used to get db specific - * variations of sql. - */ - protected $db; - - /** - * other connected criteria and their conjunctions. - */ - protected $clauses = array(); - protected $conjunctions = array(); - - /** "Parent" Criteria class */ - protected $parent; - - /** - * Create a new instance. - * - * @param Criteria $parent The outer class (this is an "inner" class). - * @param string $column TABLE.COLUMN format. - * @param mixed $value - * @param string $comparison - */ - public function __construct(Criteria $outer, $column, $value, $comparison = null) - { - $this->value = $value; - $dotPos = strrpos($column, '.'); - if ($dotPos === false) { - // no dot => aliased column - $this->table = null; - $this->column = $column; - } else { - $this->table = substr($column, 0, $dotPos); - $this->column = substr($column, $dotPos + 1); - } - $this->comparison = ($comparison === null) ? Criteria::EQUAL : $comparison; - $this->init($outer); - } - - /** - * Init some properties with the help of outer class - * @param Criteria $criteria The outer class - */ - public function init(Criteria $criteria) - { - // init $this->db - try { - $db = Propel::getDB($criteria->getDbName()); - $this->setDB($db); - } catch (Exception $e) { - // we are only doing this to allow easier debugging, so - // no need to throw up the exception, just make note of it. - Propel::log("Could not get a DBAdapter, sql may be wrong", Propel::LOG_ERR); - } - - // init $this->realtable - $realtable = $criteria->getTableForAlias($this->table); - $this->realtable = $realtable ? $realtable : $this->table; - - } - - /** - * Get the column name. - * - * @return string A String with the column name. - */ - public function getColumn() - { - return $this->column; - } - - /** - * Set the table name. - * - * @param name A String with the table name. - * @return void - */ - public function setTable($name) - { - $this->table = $name; - } - - /** - * Get the table name. - * - * @return string A String with the table name. - */ - public function getTable() - { - return $this->table; - } - - /** - * Get the comparison. - * - * @return string A String with the comparison. - */ - public function getComparison() - { - return $this->comparison; - } - - /** - * Get the value. - * - * @return mixed An Object with the value. - */ - public function getValue() - { - return $this->value; - } - - /** - * Get the value of db. - * The DBAdapter which might be used to get db specific - * variations of sql. - * @return DBAdapter value of db. - */ - public function getDB() - { - return $this->db; - } - - /** - * Set the value of db. - * The DBAdapter might be used to get db specific variations of sql. - * @param DBAdapter $v Value to assign to db. - * @return void - */ - public function setDB(DBAdapter $v) - { - $this->db = $v; - foreach ( $this->clauses as $clause ) { - $clause->setDB($v); - } - } - - /** - * Sets ignore case. - * - * @param boolean $b True if case should be ignored. - * @return Criterion A modified Criterion object. - */ - public function setIgnoreCase($b) - { - $this->ignoreStringCase = (boolean) $b; - return $this; - } - - /** - * Is ignore case on or off? - * - * @return boolean True if case is ignored. - */ - public function isIgnoreCase() - { - return $this->ignoreStringCase; - } - - /** - * Get the list of clauses in this Criterion. - * @return array - */ - private function getClauses() - { - return $this->clauses; - } - - /** - * Get the list of conjunctions in this Criterion - * @return array - */ - public function getConjunctions() - { - return $this->conjunctions; - } - - /** - * Append an AND Criterion onto this Criterion's list. - */ - public function addAnd(Criterion $criterion) - { - $this->clauses[] = $criterion; - $this->conjunctions[] = self::UND; - return $this; - } - - /** - * Append an OR Criterion onto this Criterion's list. - * @return Criterion - */ - public function addOr(Criterion $criterion) - { - $this->clauses[] = $criterion; - $this->conjunctions[] = self::ODER; - return $this; - } - - /** - * Appends a Prepared Statement representation of the Criterion - * onto the buffer. - * - * @param string &$sb The string that will receive the Prepared Statement - * @param array $params A list to which Prepared Statement parameters will be appended - * @return void - * @throws PropelException - if the expression builder cannot figure out how to turn a specified - * expression into proper SQL. - */ - public function appendPsTo(&$sb, array &$params) - { - $sb .= str_repeat ( '(', count($this->clauses) ); - - $this->dispatchPsHandling($sb, $params); - - foreach ($this->clauses as $key => $clause) { - $sb .= $this->conjunctions[$key]; - $clause->appendPsTo($sb, $params); - $sb .= ')'; - } - } - - /** - * Figure out which Criterion method to use - * to build the prepared statement and parameters using to the Criterion comparison - * and call it to append the prepared statement and the parameters of the current clause - * - * @param string &$sb The string that will receive the Prepared Statement - * @param array $params A list to which Prepared Statement parameters will be appended - */ - protected function dispatchPsHandling(&$sb, array &$params) - { - switch ($this->comparison) { - case Criteria::CUSTOM: - // custom expression with no parameter binding - $this->appendCustomToPs($sb, $params); - break; - case Criteria::IN: - case Criteria::NOT_IN: - // table.column IN (?, ?) or table.column NOT IN (?, ?) - $this->appendInToPs($sb, $params); - break; - case Criteria::LIKE: - case Criteria::NOT_LIKE: - case Criteria::ILIKE: - case Criteria::NOT_ILIKE: - // table.column LIKE ? or table.column NOT LIKE ? (or ILIKE for Postgres) - $this->appendLikeToPs($sb, $params); - break; - default: - // table.column = ? or table.column >= ? etc. (traditional expressions, the default) - $this->appendBasicToPs($sb, $params); - } - } - - /** - * Appends a Prepared Statement representation of the Criterion onto the buffer - * For custom expressions with no binding, e.g. 'NOW() = 1' - * - * @param string &$sb The string that will receive the Prepared Statement - * @param array $params A list to which Prepared Statement parameters will be appended - */ - protected function appendCustomToPs(&$sb, array &$params) - { - if ($this->value !== "") { - $sb .= (string) $this->value; - } - } - - /** - * Appends a Prepared Statement representation of the Criterion onto the buffer - * For IN expressions, e.g. table.column IN (?, ?) or table.column NOT IN (?, ?) - * - * @param string &$sb The string that will receive the Prepared Statement - * @param array $params A list to which Prepared Statement parameters will be appended - */ - protected function appendInToPs(&$sb, array &$params) - { - if ($this->value !== "") { - $bindParams = array(); - $index = count($params); // to avoid counting the number of parameters for each element in the array - foreach ((array) $this->value as $value) { - $params[] = array('table' => $this->realtable, 'column' => $this->column, 'value' => $value); - $index++; // increment this first to correct for wanting bind params to start with :p1 - $bindParams[] = ':p' . $index; - } - if (count($bindParams)) { - $field = ($this->table === null) ? $this->column : $this->table . '.' . $this->column; - $sb .= $field . $this->comparison . '(' . implode(',', $bindParams) . ')'; - } else { - $sb .= ($this->comparison === Criteria::IN) ? "1<>1" : "1=1"; - } - } - } - - /** - * Appends a Prepared Statement representation of the Criterion onto the buffer - * For LIKE expressions, e.g. table.column LIKE ? or table.column NOT LIKE ? (or ILIKE for Postgres) - * - * @param string &$sb The string that will receive the Prepared Statement - * @param array $params A list to which Prepared Statement parameters will be appended - */ - protected function appendLikeToPs(&$sb, array &$params) - { - $field = ($this->table === null) ? $this->column : $this->table . '.' . $this->column; - $db = $this->getDb(); - // If selection is case insensitive use ILIKE for PostgreSQL or SQL - // UPPER() function on column name for other databases. - if ($this->ignoreStringCase) { - if ($db instanceof DBPostgres) { - if ($this->comparison === Criteria::LIKE) { - $this->comparison = Criteria::ILIKE; - } elseif ($this->comparison === Criteria::NOT_LIKE) { - $this->comparison = Criteria::NOT_ILIKE; - } - } else { - $field = $db->ignoreCase($field); - } - } - - $params[] = array('table' => $this->realtable, 'column' => $this->column, 'value' => $this->value); - - $sb .= $field . $this->comparison; - - // If selection is case insensitive use SQL UPPER() function - // on criteria or, if Postgres we are using ILIKE, so not necessary. - if ($this->ignoreStringCase && !($db instanceof DBPostgres)) { - $sb .= $db->ignoreCase(':p'.count($params)); - } else { - $sb .= ':p'.count($params); - } - } - - /** - * Appends a Prepared Statement representation of the Criterion onto the buffer - * For traditional expressions, e.g. table.column = ? or table.column >= ? etc. - * - * @param string &$sb The string that will receive the Prepared Statement - * @param array $params A list to which Prepared Statement parameters will be appended - */ - protected function appendBasicToPs(&$sb, array &$params) - { - $field = ($this->table === null) ? $this->column : $this->table . '.' . $this->column; - // NULL VALUES need special treatment because the SQL syntax is different - // i.e. table.column IS NULL rather than table.column = null - if ($this->value !== null) { - - // ANSI SQL functions get inserted right into SQL (not escaped, etc.) - if ($this->value === Criteria::CURRENT_DATE || $this->value === Criteria::CURRENT_TIME || $this->value === Criteria::CURRENT_TIMESTAMP) { - $sb .= $field . $this->comparison . $this->value; - } else { - - $params[] = array('table' => $this->realtable, 'column' => $this->column, 'value' => $this->value); - - // default case, it is a normal col = value expression; value - // will be replaced w/ '?' and will be inserted later using PDO bindValue() - if ($this->ignoreStringCase) { - $sb .= $this->getDb()->ignoreCase($field) . $this->comparison . $this->getDb()->ignoreCase(':p'.count($params)); - } else { - $sb .= $field . $this->comparison . ':p'.count($params); - } - - } - } else { - - // value is null, which means it was either not specified or specifically - // set to null. - if ($this->comparison === Criteria::EQUAL || $this->comparison === Criteria::ISNULL) { - $sb .= $field . Criteria::ISNULL; - } elseif ($this->comparison === Criteria::NOT_EQUAL || $this->comparison === Criteria::ISNOTNULL) { - $sb .= $field . Criteria::ISNOTNULL; - } else { - // for now throw an exception, because not sure how to interpret this - throw new PropelException("Could not build SQL for expression: $field " . $this->comparison . " NULL"); - } - - } - } - - /** - * This method checks another Criteria to see if they contain - * the same attributes and hashtable entries. - * @return boolean - */ - public function equals($obj) - { - // TODO: optimize me with early outs - if ($this === $obj) { - return true; - } - - if (($obj === null) || !($obj instanceof Criterion)) { - return false; - } - - $crit = $obj; - - $isEquiv = ( ( ($this->table === null && $crit->getTable() === null) - || ( $this->table !== null && $this->table === $crit->getTable() ) - ) - && $this->column === $crit->getColumn() - && $this->comparison === $crit->getComparison()); - - // check chained criterion - - $clausesLength = count($this->clauses); - $isEquiv &= (count($crit->getClauses()) == $clausesLength); - $critConjunctions = $crit->getConjunctions(); - $critClauses = $crit->getClauses(); - for ($i=0; $i < $clausesLength && $isEquiv; $i++) { - $isEquiv &= ($this->conjunctions[$i] === $critConjunctions[$i]); - $isEquiv &= ($this->clauses[$i] === $critClauses[$i]); - } - - if ($isEquiv) { - $isEquiv &= $this->value === $crit->getValue(); - } - - return $isEquiv; - } - - /** - * Returns a hash code value for the object. - */ - public function hashCode() - { - $h = crc32(serialize($this->value)) ^ crc32($this->comparison); - - if ($this->table !== null) { - $h ^= crc32($this->table); - } - - if ($this->column !== null) { - $h ^= crc32($this->column); - } - - foreach ( $this->clauses as $clause ) { - // TODO: i KNOW there is a php incompatibility with the following line - // but i dont remember what it is, someone care to look it up and - // replace it if it doesnt bother us? - // $clause->appendPsTo($sb='',$params=array()); - $sb = ''; - $params = array(); - $clause->appendPsTo($sb,$params); - $h ^= crc32(serialize(array($sb,$params))); - unset ( $sb, $params ); - } - - return $h; - } - - /** - * Get all tables from nested criterion objects - * @return array - */ - public function getAllTables() - { - $tables = array(); - $this->addCriterionTable($this, $tables); - return $tables; - } - - /** - * method supporting recursion through all criterions to give - * us a string array of tables from each criterion - * @return void - */ - private function addCriterionTable(Criterion $c, array &$s) - { - $s[] = $c->getTable(); - foreach ( $c->getClauses() as $clause ) { - $this->addCriterionTable($clause, $s); - } - } - - /** - * get an array of all criterion attached to this - * recursing through all sub criterion - * @return array Criterion[] - */ - public function getAttachedCriterion() - { - $criterions = array($this); - foreach ($this->getClauses() as $criterion) { - $criterions = array_merge($criterions, $criterion->getAttachedCriterion()); - } - return $criterions; - } - - /** - * Ensures deep cloning of attached objects - */ - public function __clone() - { - foreach ($this->clauses as $key => $criterion) { - $this->clauses[$key] = clone $criterion; - } - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/query/CriterionIterator.php b/airtime_mvc/library/propel/runtime/lib/query/CriterionIterator.php deleted file mode 100644 index 12f29ff66e..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/query/CriterionIterator.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.runtime.query - */ -class CriterionIterator implements Iterator -{ - - private $idx = 0; - private $criteria; - private $criteriaKeys; - private $criteriaSize; - - public function __construct(Criteria $criteria) { - $this->criteria = $criteria; - $this->criteriaKeys = $criteria->keys(); - $this->criteriaSize = count($this->criteriaKeys); - } - - public function rewind() { - $this->idx = 0; - } - - public function valid() { - return $this->idx < $this->criteriaSize; - } - - public function key() { - return $this->criteriaKeys[$this->idx]; - } - - public function current() { - return $this->criteria->getCriterion($this->criteriaKeys[$this->idx]); - } - - public function next() { - $this->idx++; - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/query/Join.php b/airtime_mvc/library/propel/runtime/lib/query/Join.php deleted file mode 100644 index de7b92b5ed..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/query/Join.php +++ /dev/null @@ -1,250 +0,0 @@ - - * table_a LEFT JOIN table_b ON table_a.id = table_b.a_id - * - * - * @author Francois Zaninotto (Propel) - * @author Hans Lellelid (Propel) - * @author Kaspars Jaudzems (Propel) - * @author Frank Y. Kim (Torque) - * @author John D. McNally (Torque) - * @author Brett McLaughlin (Torque) - * @author Eric Dobbs (Torque) - * @author Henning P. Schmiedehausen (Torque) - * @author Sam Joseph (Torque) - * @package propel.runtime.query - */ -class Join -{ - // default comparison type - const EQUAL = "="; - - // the left parts of the join condition - protected $left = array(); - - // the right parts of the join condition - protected $right = array(); - - // the comparison operators for each pair of columns in the join condition - protected $operator = array(); - - // the type of the join (LEFT JOIN, ...), or null for an implicit join - protected $joinType = null; - - // the number of conditions in the join - protected $count = 0; - - /** - * Constructor - * Use it preferably with no arguments, and then use addCondition() and setJoinType() - * Syntax with arguments used mainly for backwards compatibility - * - * @param string $leftColumn The left column of the join condition - * (may contain an alias name) - * @param string $rightColumn The right column of the join condition - * (may contain an alias name) - * @param string $joinType The type of the join. Valid join types are null (implicit join), - * Criteria::LEFT_JOIN, Criteria::RIGHT_JOIN, and Criteria::INNER_JOIN - */ - public function __construct($leftColumn = null, $rightColumn = null, $joinType = null) - { - if(!is_null($leftColumn)) { - if (!is_array($leftColumn)) { - // simple join - $this->addCondition($leftColumn, $rightColumn); - } else { - // join with multiple conditions - if (count($leftColumn) != count($rightColumn) ) { - throw new PropelException("Unable to create join because the left column count isn't equal to the right column count"); - } - foreach ($leftColumn as $key => $value) - { - $this->addCondition($value, $rightColumn[$key]); - } - } - $this->setJoinType($joinType); - } - } - - /** - * Join condition definition - * - * @param string $left The left column of the join condition - * (may contain an alias name) - * @param string $right The right column of the join condition - * (may contain an alias name) - * @param string $operator The comparison operator of the join condition, default Join::EQUAL - */ - public function addCondition($left, $right, $operator = self::EQUAL) - { - $this->left[] = $left; - $this->right[] = $right; - $this->operator[] = $operator; - $this->count++; - } - - /** - * Retrieve the number of conditions in the join - * - * @return integer The number of conditions in the join - */ - public function countConditions() - { - return $this->count; - } - - /** - * Return an array of the join conditions - * - * @return array An array of arrays representing (left, comparison, right) for each condition - */ - public function getConditions() - { - $conditions = array(); - for ($i=0; $i < $this->count; $i++) { - $conditions[] = array( - 'left' => $this->getLeftColumn($i), - 'operator' => $this->getOperator($i), - 'right' => $this->getRightColumn($i) - ); - } - return $conditions; - } - - /** - * @return the comparison operator for the join condition - */ - public function getOperator($index = 0) - { - return $this->operator[$index]; - } - - public function getOperators() - { - return $this->operator; - } - - /** - * Set the join type - * - * @param string $joinType The type of the join. Valid join types are - * null (adding the join condition to the where clause), - * Criteria::LEFT_JOIN(), Criteria::RIGHT_JOIN(), and Criteria::INNER_JOIN() - */ - public function setJoinType($joinType = null) - { - $this->joinType = $joinType; - } - - /** - * Get the join type - * - * @return string The type of the join, i.e. Criteria::LEFT_JOIN(), ..., - * or null for adding the join condition to the where Clause - */ - public function getJoinType() - { - return $this->joinType; - } - - /** - * @return the left column of the join condition - */ - public function getLeftColumn($index = 0) - { - return $this->left[$index]; - } - - /** - * @return all right columns of the join condition - */ - public function getLeftColumns() - { - return $this->left; - } - - - public function getLeftColumnName($index = 0) - { - return substr($this->left[$index], strrpos($this->left[$index], '.') + 1); - } - - public function getLeftTableName($index = 0) - { - return substr($this->left[$index], 0, strrpos($this->left[$index], '.')); - } - - /** - * @return the right column of the join condition - */ - public function getRightColumn($index = 0) - { - return $this->right[$index]; - } - - /** - * @return all right columns of the join condition - */ - public function getRightColumns() - { - return $this->right; - } - - public function getRightColumnName($index = 0) - { - return substr($this->right[$index], strrpos($this->right[$index], '.') + 1); - } - - public function getRightTableName($index = 0) - { - return substr($this->right[$index], 0, strrpos($this->right[$index], '.')); - } - - public function equals($join) - { - return $join !== null - && $join instanceof Join - && $this->joinType == $join->getJoinType() - && $this->getConditions() == $join->getConditions(); - } - - /** - * returns a String representation of the class, - * mainly for debugging purposes - * - * @return string A String representation of the class - */ - public function toString() - { - $result = ''; - if ($this->joinType !== null) { - $result .= $this->joinType . ' : '; - } - foreach ($this->getConditions() as $index => $condition) { - $result .= implode($condition); - if ($index + 1 < $this->count) { - $result .= ' AND '; - } - } - $result .= '(ignoreCase not considered)'; - - return $result; - } - - public function __toString() - { - return $this->toString(); - } -} - \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/query/ModelCriteria.php b/airtime_mvc/library/propel/runtime/lib/query/ModelCriteria.php deleted file mode 100644 index 4082133a98..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/query/ModelCriteria.php +++ /dev/null @@ -1,1841 +0,0 @@ -join from going wrong - protected $isKeepQuery = false; // whether to clone the current object before termination methods - - /** - * Creates a new instance with the default capacity which corresponds to - * the specified database. - * - * @param string $dbName The dabase name - * @param string $modelName The phpName of a model, e.g. 'Book' - * @param string $modelAlias The alias for the model in this query, e.g. 'b' - */ - public function __construct($dbName = null, $modelName, $modelAlias = null) - { - $this->setDbName($dbName); - $this->originalDbName = $dbName; - $this->modelName = $modelName; - $this->modelPeerName = constant($this->modelName . '::PEER'); - $this->modelAlias = $modelAlias; - $this->tableMap = Propel::getDatabaseMap($this->getDbName())->getTableByPhpName($this->modelName); - } - - /** - * Returns the name of the class for this model criteria - * - * @return string - */ - public function getModelName() - { - return $this->modelName; - } - - /** - * Sets the alias for the model in this query - * - * @param string $modelAlias The model alias - * @param boolean $useAliasInSQL Whether to use the alias in the SQL code (false by default) - * - * @return ModelCriteria The current object, for fluid interface - */ - public function setModelAlias($modelAlias, $useAliasInSQL = false) - { - if ($useAliasInSQL) { - $this->addAlias($modelAlias, $this->tableMap->getName()); - $this->useAliasInSQL = true; - } - $this->modelAlias = $modelAlias; - - return $this; - } - - /** - * Returns the alias of the main class for this model criteria - * - * @return string The model alias - */ - public function getModelAlias() - { - return $this->modelAlias; - } - - /** - * Return the string to use in a clause as a model prefix for the main model - * - * @return string The model alias if it exists, the model name if not - */ - public function getModelAliasOrName() - { - return $this->modelAlias ? $this->modelAlias : $this->modelName; - } - - /** - * Returns the name of the Peer class for this model criteria - * - * @return string - */ - public function getModelPeerName() - { - return $this->modelPeerName; - } - - /** - * Returns the TabkleMap object for this Criteria - * - * @return TableMap - */ - public function getTableMap() - { - return $this->tableMap; - } - - /** - * Sets the formatter to use for the find() output - * Formatters must extend PropelFormatter - * Use the ModelCriteria constants for class names: - * - * $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - * - * - * @param string|PropelFormatter $formatter a formatter class name, or a formatter instance - * @return ModelCriteria The current object, for fluid interface - */ - public function setFormatter($formatter) - { - if(is_string($formatter)) { - $formatter = new $formatter(); - } - if (!$formatter instanceof PropelFormatter) { - throw new PropelException('setFormatter() only accepts classes extending PropelFormatter'); - } - $this->formatter = $formatter; - - return $this; - } - - /** - * Gets the formatter to use for the find() output - * Defaults to an instance of ModelCriteria::$defaultFormatterClass, i.e. PropelObjectsFormatter - * - * @return PropelFormatter - */ - public function getFormatter() - { - if (null === $this->formatter) { - $formatterClass = $this->defaultFormatterClass; - $this->formatter = new $formatterClass(); - } - return $this->formatter; - } - - /** - * Adds a condition on a column based on a pseudo SQL clause - * but keeps it for later use with combine() - * Until combine() is called, the condition is not added to the query - * Uses introspection to translate the column phpName into a fully qualified name - * - * $c->condition('cond1', 'b.Title = ?', 'foo'); - * - * - * @see Criteria::add() - * - * @param string $conditionName A name to store the condition for a later combination with combine() - * @param string $clause The pseudo SQL clause, e.g. 'AuthorId = ?' - * @param mixed $value A value for the condition - * - * @return ModelCriteria The current object, for fluid interface - */ - public function condition($conditionName, $clause, $value = null) - { - $this->addCond($conditionName, $this->getCriterionForClause($clause, $value), null, null); - - return $this; - } - - /** - * Adds a condition on a column based on a column phpName and a value - * Uses introspection to translate the column phpName into a fully qualified name - * Warning: recognizes only the phpNames of the main Model (not joined tables) - * - * $c->filterBy('Title', 'foo'); - * - * - * @see Criteria::add() - * - * @param string $column A string representing thecolumn phpName, e.g. 'AuthorId' - * @param mixed $value A value for the condition - * @param string $comparison What to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ModelCriteria The current object, for fluid interface - */ - public function filterBy($column, $value, $comparison = Criteria::EQUAL) - { - return $this->add($this->getRealColumnName($column), $value, $comparison); - } - - /** - * Adds a list of conditions on the columns of the current model - * Uses introspection to translate the column phpName into a fully qualified name - * Warning: recognizes only the phpNames of the main Model (not joined tables) - * - * $c->filterByArray(array( - * 'Title' => 'War And Peace', - * 'Publisher' => $publisher - * )); - * - * - * @see filterBy() - * - * @param mixed $conditions An array of conditions, using column phpNames as key - * - * @return ModelCriteria The current object, for fluid interface - */ - public function filterByArray($conditions) - { - foreach ($conditions as $column => $args) { - call_user_func_array(array($this, 'filterBy' . $column), (array) $args); - } - - return $this; - } - - /** - * Adds a condition on a column based on a pseudo SQL clause - * Uses introspection to translate the column phpName into a fully qualified name - * - * // simple clause - * $c->where('b.Title = ?', 'foo'); - * // named conditions - * $c->condition('cond1', 'b.Title = ?', 'foo'); - * $c->condition('cond2', 'b.ISBN = ?', 12345); - * $c->where(array('cond1', 'cond2'), Criteria::LOGICAL_OR); - * - * - * @see Criteria::add() - * - * @param mixed $clause A string representing the pseudo SQL clause, e.g. 'Book.AuthorId = ?' - * Or an array of condition names - * @param mixed $value A value for the condition - * - * @return ModelCriteria The current object, for fluid interface - */ - public function where($clause, $value = null) - { - if (is_array($clause)) { - // where(array('cond1', 'cond2'), Criteria::LOGICAL_OR) - $criterion = $this->getCriterionForConditions($clause, $value); - } else { - // where('Book.AuthorId = ?', 12) - $criterion = $this->getCriterionForClause($clause, $value); - } - $this->addAnd($criterion, null, null); - - return $this; - } - - /** - * Adds a condition on a column based on a pseudo SQL clause - * Uses introspection to translate the column phpName into a fully qualified name - * - * // simple clause - * $c->orWhere('b.Title = ?', 'foo'); - * // named conditions - * $c->condition('cond1', 'b.Title = ?', 'foo'); - * $c->condition('cond2', 'b.ISBN = ?', 12345); - * $c->orWhere(array('cond1', 'cond2'), Criteria::LOGICAL_OR); - * - * - * @see Criteria::addOr() - * - * @param string $clause The pseudo SQL clause, e.g. 'AuthorId = ?' - * @param mixed $value A value for the condition - * - * @return ModelCriteria The current object, for fluid interface - */ - public function orWhere($clause, $value = null) - { - if (is_array($clause)) { - // orWhere(array('cond1', 'cond2'), Criteria::LOGICAL_OR) - $criterion = $this->getCriterionForConditions($clause, $value); - } else { - // orWhere('Book.AuthorId = ?', 12) - $criterion = $this->getCriterionForClause($clause, $value); - } - $this->addOr($criterion, null, null); - - return $this; - } - - /** - * Adds a having condition on a column based on a pseudo SQL clause - * Uses introspection to translate the column phpName into a fully qualified name - * - * // simple clause - * $c->having('b.Title = ?', 'foo'); - * // named conditions - * $c->condition('cond1', 'b.Title = ?', 'foo'); - * $c->condition('cond2', 'b.ISBN = ?', 12345); - * $c->having(array('cond1', 'cond2'), Criteria::LOGICAL_OR); - * - * - * @see Criteria::addHaving() - * - * @param mixed $clause A string representing the pseudo SQL clause, e.g. 'Book.AuthorId = ?' - * Or an array of condition names - * @param mixed $value A value for the condition - * - * @return ModelCriteria The current object, for fluid interface - */ - public function having($clause, $value = null) - { - if (is_array($clause)) { - // having(array('cond1', 'cond2'), Criteria::LOGICAL_OR) - $criterion = $this->getCriterionForConditions($clause, $value); - } else { - // having('Book.AuthorId = ?', 12) - $criterion = $this->getCriterionForClause($clause, $value); - } - $this->addHaving($criterion); - - return $this; - } - - /** - * Adds an ORDER BY clause to the query - * Usability layer on top of Criteria::addAscendingOrderByColumn() and Criteria::addDescendingOrderByColumn() - * Infers $column and $order from $columnName and some optional arguments - * Examples: - * $c->orderBy('Book.CreatedAt') - * => $c->addAscendingOrderByColumn(BookPeer::CREATED_AT) - * $c->orderBy('Book.CategoryId', 'desc') - * => $c->addDescendingOrderByColumn(BookPeer::CATEGORY_ID) - * - * @param string $columnName The column to order by - * @param string $order The sorting order. Criteria::ASC by default, also accepts Criteria::DESC - * - * @return ModelCriteria The current object, for fluid interface - */ - public function orderBy($columnName, $order = Criteria::ASC) - { - list($column, $realColumnName) = $this->getColumnFromName($columnName, false); - $order = strtoupper($order); - switch ($order) { - case Criteria::ASC: - $this->addAscendingOrderByColumn($realColumnName); - break; - case Criteria::DESC: - $this->addDescendingOrderByColumn($realColumnName); - break; - default: - throw new PropelException('ModelCriteria::orderBy() only accepts Criteria::ASC or Criteria::DESC as argument'); - } - - return $this; - } - - /** - * Adds a GROUB BY clause to the query - * Usability layer on top of Criteria::addGroupByColumn() - * Infers $column $columnName - * Examples: - * $c->groupBy('Book.AuthorId') - * => $c->addGroupByColumn(BookPeer::AUTHOR_ID) - * - * @param string $columnName The column to group by - * - * @return ModelCriteria The current object, for fluid interface - */ - public function groupBy($columnName) - { - list($column, $realColumnName) = $this->getColumnFromName($columnName, false); - $this->addGroupByColumn($realColumnName); - - return $this; - } - - /** - * Adds a DISTINCT clause to the query - * Alias for Criteria::setDistinct() - * - * @return ModelCriteria The current object, for fluid interface - */ - public function distinct() - { - $this->setDistinct(); - - return $this; - } - - /** - * Adds a LIMIT clause (or its subselect equivalent) to the query - * Alias for Criteria:::setLimit() - * - * @param int $limit Maximum number of results to return by the query - * - * @return ModelCriteria The current object, for fluid interface - */ - public function limit($limit) - { - $this->setLimit($limit); - - return $this; - } - - /** - * Adds an OFFSET clause (or its subselect equivalent) to the query - * Alias for of Criteria::setOffset() - * - * @param int $offset Offset of the first result to return - * - * @return ModelCriteria The current object, for fluid interface - */ - public function offset($offset) - { - $this->setOffset($offset); - - return $this; - } - - /** - * This method returns the previousJoin for this ModelCriteria, - * by default this is null, but after useQuery this is set the to the join of that use - * - * @return Join the previousJoin for this ModelCriteria - */ - public function getPreviousJoin() - { - return $this->previousJoin; - } - - /** - * This method sets the previousJoin for this ModelCriteria, - * by default this is null, but after useQuery this is set the to the join of that use - * - * @param Join $previousJoin The previousJoin for this ModelCriteria - */ - public function setPreviousJoin(Join $previousJoin) - { - $this->previousJoin = $previousJoin; - } - - /** - * This method returns an already defined join clause from the query - * - * @param string $name The name of the join clause - * - * @return Join A join object - */ - public function getJoin($name) - { - return $this->joins[$name]; - } - - /** - * Adds a JOIN clause to the query - * Infers the ON clause from a relation name - * Uses the Propel table maps, based on the schema, to guess the related columns - * Beware that the default JOIN operator is INNER JOIN, while Criteria defaults to WHERE - * Examples: - * - * $c->join('Book.Author'); - * => $c->addJoin(BookPeer::AUTHOR_ID, AuthorPeer::ID, Criteria::INNER_JOIN); - * $c->join('Book.Author', Criteria::RIGHT_JOIN); - * => $c->addJoin(BookPeer::AUTHOR_ID, AuthorPeer::ID, Criteria::RIGHT_JOIN); - * $c->join('Book.Author a', Criteria::RIGHT_JOIN); - * => $c->addAlias('a', AuthorPeer::TABLE_NAME); - * => $c->addJoin(BookPeer::AUTHOR_ID, 'a.ID', Criteria::RIGHT_JOIN); - * - * - * @param string $relation Relation to use for the join - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return ModelCriteria The current object, for fluid interface - */ - public function join($relation, $joinType = Criteria::INNER_JOIN) - { - // relation looks like '$leftName.$relationName $relationAlias' - list($fullName, $relationAlias) = self::getClassAndAlias($relation); - if (strpos($fullName, '.') === false) { - // simple relation name, refers to the current table - $leftName = $this->getModelAliasOrName(); - $relationName = $fullName; - $previousJoin = $this->getPreviousJoin(); - $tableMap = $this->getTableMap(); - } else { - list($leftName, $relationName) = explode('.', $fullName); - // find the TableMap for the left table using the $leftName - if ($leftName == $this->getModelAliasOrName()) { - $previousJoin = $this->getPreviousJoin(); - $tableMap = $this->getTableMap(); - } elseif (isset($this->joins[$leftName])) { - $previousJoin = $this->joins[$leftName]; - $tableMap = $previousJoin->getTableMap(); - } else { - throw new PropelException('Unknown table or alias ' . $leftName); - } - } - $leftTableAlias = isset($this->aliases[$leftName]) ? $leftName : null; - - // find the RelationMap in the TableMap using the $relationName - if(!$tableMap->hasRelation($relationName)) { - throw new PropelException('Unknown relation ' . $relationName . ' on the ' . $leftName .' table'); - } - $relationMap = $tableMap->getRelation($relationName); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - if(null !== $previousJoin) { - $join->setPreviousJoin($previousJoin); - } - $join->setRelationMap($relationMap, $leftTableAlias, $relationAlias); - - // add the ModelJoin to the current object - if($relationAlias !== null) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, $relationName); - } - - return $this; - } - - /** - * Add a join object to the Criteria - * @see Criteria::addJoinObject() - * @param Join $join A join object - * - * @return ModelCriteria The current object, for fluid interface - */ - public function addJoinObject(Join $join, $name = null) - { - if (!in_array($join, $this->joins)) { // compare equality, NOT identity - $this->joins[$name] = $join; - } - return $this; - } - - /** - * Adds a JOIN clause to the query and hydrates the related objects - * Shortcut for $c->join()->with() - * - * $c->joinWith('Book.Author'); - * => $c->join('Book.Author'); - * => $c->with('Author'); - * $c->joinWith('Book.Author a', Criteria::RIGHT_JOIN); - * => $c->join('Book.Author a', Criteria::RIGHT_JOIN); - * => $c->with('a'); - * - * - * @param string $relation Relation to use for the join - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return ModelCriteria The current object, for fluid interface - */ - public function joinWith($relation, $joinType = Criteria::INNER_JOIN) - { - $this->join($relation, $joinType); - $this->with(self::getRelationName($relation)); - - return $this; - } - - /** - * Adds a relation to hydrate together with the main object - * The relation must be initialized via a join() prior to calling with() - * Examples: - * - * $c->join('Book.Author'); - * $c->with('Author'); - * - * $c->join('Book.Author a', Criteria::RIGHT_JOIN); - * $c->with('a'); - * - * WARNING: on a one-to-many relationship, the use of with() combined with limit() - * will return a wrong number of results for the related objects - * - * @param string $relation Relation to use for the join - * - * @return ModelCriteria The current object, for fluid interface - */ - public function with($relation) - { - if (!isset($this->joins[$relation])) { - throw new PropelException('Unknown relation name or alias ' . $relation); - } - $join = $this->joins[$relation]; - if ($join->getRelationMap()->getType() == RelationMap::MANY_TO_MANY) { - throw new PropelException('with() does not allow hydration for many-to-many relationships'); - } elseif ($join->getRelationMap()->getType() == RelationMap::ONE_TO_MANY) { - // For performance reasons, the formatters will use a special routine in this case - $this->isWithOneToMany = true; - } - - // check that the columns of the main class are already added (but only if this isn't a useQuery) - if (!$this->hasSelectClause() && !$this->getPrimaryCriteria()) { - $this->addSelfSelectColumns(); - } - // add the columns of the related class - $this->addRelationSelectColumns($relation); - - // list the join for later hydration in the formatter - $this->with[$relation] = $join; - - return $this; - } - - /** - * Gets the array of ModelWith specifying which objects must be hydrated - * together with the main object. - * - * @see with() - * @return array - */ - public function getWith() - { - return $this->with; - } - - public function isWithOneToMany() - { - return $this->isWithOneToMany; - } - - /** - * Adds a supplementary column to the select clause - * These columns can later be retrieved from the hydrated objects using getVirtualColumn() - * - * @param string $clause The SQL clause with object model column names - * e.g. 'UPPER(Author.FirstName)' - * @param string $name Optional alias for the added column - * If no alias is provided, the clause is used as a column alias - * This alias is used for retrieving the column via BaseObject::getVirtualColumn($alias) - * - * @return ModelCriteria The current object, for fluid interface - */ - public function withColumn($clause, $name = null) - { - if (null === $name) { - $name = str_replace(array('.', '(', ')'), '', $clause); - } - $clause = trim($clause); - $this->replaceNames($clause); - // check that the columns of the main class are already added (if this is the primary ModelCriteria) - if (!$this->hasSelectClause() && !$this->getPrimaryCriteria()) { - $this->addSelfSelectColumns(); - } - $this->addAsColumn($name, $clause); - - return $this; - } - - /** - * Initializes a secondary ModelCriteria object, to be later merged with the current object - * - * @see ModelCriteria::endUse() - * @param string $relationName Relation name or alias - * @param string $secondCriteriaClass Classname for the ModelCriteria to be used - * - * @return ModelCriteria The secondary criteria object - */ - public function useQuery($relationName, $secondaryCriteriaClass = null) - { - if (!isset($this->joins[$relationName])) { - throw new PropelException('Unknown class or alias ' . $relationName); - } - $className = $this->joins[$relationName]->getTableMap()->getPhpName(); - if (null === $secondaryCriteriaClass) { - $secondaryCriteria = PropelQuery::from($className); - } else { - $secondaryCriteria = new $secondaryCriteriaClass(); - } - if ($className != $relationName) { - $secondaryCriteria->setModelAlias($relationName, $relationName == $this->joins[$relationName]->getRelationMap()->getName() ? false : true); - } - $secondaryCriteria->setPrimaryCriteria($this, $this->joins[$relationName]); - - return $secondaryCriteria; - } - - /** - * Finalizes a secondary criteria and merges it with its primary Criteria - * - * @see Criteria::mergeWith() - * - * @return ModelCriteria The primary criteria object - */ - public function endUse() - { - if (isset($this->aliases[$this->modelAlias])) { - $this->removeAlias($this->modelAlias); - } - $primaryCriteria = $this->getPrimaryCriteria(); - $primaryCriteria->mergeWith($this); - - return $primaryCriteria; - } - - /** - * Add the content of a Criteria to the current Criteria - * In case of conflict, the current Criteria keeps its properties - * @see Criteria::mergeWith() - * - * @param Criteria $criteria The criteria to read properties from - * @param string $operator The logical operator used to combine conditions - * Defaults to Criteria::LOGICAL_AND, also accapts Criteria::LOGICAL_OR - * - * @return ModelCriteria The primary criteria object - */ - public function mergeWith(Criteria $criteria, $operator = Criteria::LOGICAL_AND) - { - parent::mergeWith($criteria, $operator); - - // merge with - if ($criteria instanceof ModelCriteria) { - $this->with = array_merge($this->getWith(), $criteria->getWith()); - } - - return $this; - } - - /** - * Clear the conditions to allow the reuse of the query object. - * The ModelCriteria's Model and alias 'all the properties set by construct) will remain. - * - * @return ModelCriteria The primary criteria object - */ - public function clear() - { - parent::clear(); - - $this->with = array(); - $this->primaryCriteria = null; - $this->formatter=null; - - return $this; - } - /** - * Sets the primary Criteria for this secondary Criteria - * - * @param ModelCriteria $criteria The primary criteria - * @param Join $previousJoin The previousJoin for this ModelCriteria - */ - public function setPrimaryCriteria(ModelCriteria $criteria, Join $previousJoin) - { - $this->primaryCriteria = $criteria; - $this->setPreviousJoin($previousJoin); - } - - /** - * Gets the primary criteria for this secondary Criteria - * - * @return ModelCriteria The primary criteria - */ - public function getPrimaryCriteria() - { - return $this->primaryCriteria; - } - - /** - * Adds the select columns for a the current table - * - * @return ModelCriteria The current object, for fluid interface - */ - public function addSelfSelectColumns() - { - call_user_func(array($this->modelPeerName, 'addSelectColumns'), $this, $this->useAliasInSQL ? $this->modelAlias : null); - - return $this; - } - - /** - * Adds the select columns for a relation - * - * @param string $relation The relation name or alias, as defined in join() - * - * @return ModelCriteria The current object, for fluid interface - */ - public function addRelationSelectColumns($relation) - { - $join = $this->joins[$relation]; - call_user_func(array($join->getTableMap()->getPeerClassname(), 'addSelectColumns'), $this, $join->getRelationAlias()); - - return $this; - } - - /** - * Returns the class and alias of a string representing a model or a relation - * e.g. 'Book b' => array('Book', 'b') - * e.g. 'Book' => array('Book', null) - * - * @param string $class The classname to explode - * - * @return array list($className, $aliasName) - */ - public static function getClassAndAlias($class) - { - if(strpos($class, ' ') !== false) { - list($class, $alias) = explode(' ', $class); - } else { - $alias = null; - } - return array($class, $alias); - } - - /** - * Returns the name of a relation from a string. - * The input looks like '$leftName.$relationName $relationAlias' - * - * @param string $relation Relation to use for the join - * @return string the relationName used in the join - */ - public static function getRelationName($relation) - { - // get the relationName - list($fullName, $relationAlias) = self::getClassAndAlias($relation); - if ($relationAlias) { - $relationName = $relationAlias; - } elseif (false === strpos($fullName, '.')) { - $relationName = $fullName; - } else { - list($leftName, $relationName) = explode('.', $fullName); - } - - return $relationName; - } - - /** - * Triggers the automated cloning on termination. - * By default, temrination methods don't clone the current object, - * even though they modify it. If the query must be reused after termination, - * you must call this method prior to temrination. - * - * @param boolean $isKeepQuery - * - * @return ModelCriteria The current object, for fluid interface - */ - public function keepQuery($isKeepQuery = true) - { - $this->isKeepQuery = (bool) $isKeepQuery; - - return $this; - } - - /** - * Checks whether the automated cloning on termination is enabled. - * - * @return boolean true if cloning must be done before termination - */ - public function isKeepQuery() - { - return $this->isKeepQuery; - } - - /** - * Code to execute before every SELECT statement - * - * @param PropelPDO $con The connection object used by the query - */ - protected function basePreSelect(PropelPDO $con) - { - return $this->preSelect($con); - } - - protected function preSelect(PropelPDO $con) - { - } - - /** - * Issue a SELECT query based on the current ModelCriteria - * and format the list of results with the current formatter - * By default, returns an array of model objects - * - * @param PropelPDO $con an optional connection object - * - * @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function find($con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - $stmt = $criteria->getSelectStatement($con); - - return $criteria->getFormatter()->init($criteria)->format($stmt); - } - - /** - * Issue a SELECT ... LIMIT 1 query based on the current ModelCriteria - * and format the result with the current formatter - * By default, returns a model object - * - * @param PropelPDO $con an optional connection object - * - * @return mixed the result, formatted by the current formatter - */ - public function findOne($con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - $criteria->limit(1); - $stmt = $criteria->getSelectStatement($con); - - return $criteria->getFormatter()->init($criteria)->formatOne($stmt); - } - - /** - * Issue a SELECT ... LIMIT 1 query based on the current ModelCriteria - * and format the result with the current formatter - * By default, returns a model object - * - * @param PropelPDO $con an optional connection object - * - * @return mixed the result, formatted by the current formatter - */ - public function findOneOrCreate($con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - $criteria->limit(1); - $stmt = $criteria->getSelectStatement($con); - if (!$ret = $this->findOne($con)) { - $class = $this->getModelName(); - $obj = new $class(); - foreach ($this->keys() as $key) { - $obj->setByName($key, $this->getValue($key), BasePeer::TYPE_COLNAME); - } - $ret = $this->getFormatter()->formatRecord($obj); - } - return $ret; - } - - /** - * Find object by primary key - * Behaves differently if the model has simple or composite primary key - * - * // simple primary key - * $book = $c->findPk(12, $con); - * // composite primary key - * $bookOpinion = $c->findPk(array(34, 634), $con); - * - * @param mixed $key Primary key to use for the query - * @param PropelPDO $con an optional connection object - * - * @return mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - $pkCols = $this->getTableMap()->getPrimaryKeyColumns(); - if (count($pkCols) == 1) { - // simple primary key - $pkCol = $pkCols[0]; - $this->add($pkCol->getFullyQualifiedName(), $key); - return $this->findOne($con); - } else { - // composite primary key - foreach ($pkCols as $pkCol) { - $keyPart = array_shift($key); - $this->add($pkCol->getFullyQualifiedName(), $keyPart); - } - return $this->findOne($con); - } - } - - /** - * Find objects by primary key - * Behaves differently if the model has simple or composite primary key - * - * // simple primary key - * $books = $c->findPks(array(12, 56, 832), $con); - * // composite primary key - * $bookOpinion = $c->findPks(array(array(34, 634), array(45, 518), array(34, 765)), $con); - * - * @param array $keys Primary keys to use for the query - * @param PropelPDO $con an optional connection object - * - * @return mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - $pkCols = $this->getTableMap()->getPrimaryKeyColumns(); - if (count($pkCols) == 1) { - // simple primary key - $pkCol = array_shift($pkCols); - $this->add($pkCol->getFullyQualifiedName(), $keys, Criteria::IN); - } else { - // composite primary key - throw new PropelException('Multiple object retrieval is not implemented for composite primary keys'); - } - return $this->find($con); - } - - protected function getSelectStatement($con = null) - { - $dbMap = Propel::getDatabaseMap($this->getDbName()); - $db = Propel::getDB($this->getDbName()); - if ($con === null) { - $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); - } - - // check that the columns of the main class are already added (if this is the primary ModelCriteria) - if (!$this->hasSelectClause() && !$this->getPrimaryCriteria()) { - $this->addSelfSelectColumns(); - } - - $con->beginTransaction(); - try { - $this->basePreSelect($con); - $params = array(); - $sql = BasePeer::createSelectSql($this, $params); - $stmt = $con->prepare($sql); - BasePeer::populateStmtValues($stmt, $params, $dbMap, $db); - $stmt->execute(); - $con->commit(); - } catch (Exception $e) { - if ($stmt) { - $stmt = null; // close - } - $con->rollBack(); - Propel::log($e->getMessage(), Propel::LOG_ERR); - throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); - } - - return $stmt; - } - - /** - * Apply a condition on a column and issues the SELECT query - * - * @see filterBy() - * @see find() - * - * @param string $column A string representing the column phpName, e.g. 'AuthorId' - * @param mixed $value A value for the condition - * @param PropelPDO $con An optional connection object - * - * @return mixed the list of results, formatted by the current formatter - */ - public function findBy($column, $value, $con = null) - { - $method = 'filterBy' . $column; - $this->$method($value); - - return $this->find($con); - } - - /** - * Apply a list of conditions on columns and issues the SELECT query - * - * $c->findByArray(array( - * 'Title' => 'War And Peace', - * 'Publisher' => $publisher - * ), $con); - * - * - * @see filterByArray() - * @see find() - * - * @param mixed $conditions An array of conditions, using column phpNames as key - * @param PropelPDO $con an optional connection object - * - * @return mixed the list of results, formatted by the current formatter - */ - public function findByArray($conditions, $con = null) - { - $this->filterByArray($conditions); - - return $this->find($con); - } - - /** - * Apply a condition on a column and issues the SELECT ... LIMIT 1 query - * - * @see filterBy() - * @see findOne() - * - * @param mixed $column A string representing thecolumn phpName, e.g. 'AuthorId' - * @param mixed $value A value for the condition - * @param PropelPDO $con an optional connection object - * - * @return mixed the result, formatted by the current formatter - */ - public function findOneBy($column, $value, $con = null) - { - $method = 'filterBy' . $column; - $this->$method($value); - - return $this->findOne($con); - } - - /** - * Apply a list of conditions on columns and issues the SELECT ... LIMIT 1 query - * - * $c->findOneByArray(array( - * 'Title' => 'War And Peace', - * 'Publisher' => $publisher - * ), $con); - * - * - * @see filterByArray() - * @see findOne() - * - * @param mixed $conditions An array of conditions, using column phpNames as key - * @param PropelPDO $con an optional connection object - * - * @return mixed the list of results, formatted by the current formatter - */ - public function findOneByArray($conditions, $con = null) - { - $this->filterByArray($conditions); - - return $this->findOne($con); - } - - /** - * Issue a SELECT COUNT(*) query based on the current ModelCriteria - * - * @param PropelPDO $con an optional connection object - * - * @return integer the number of results - */ - public function count($con = null) - { - if ($con === null) { - $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); - } - - $criteria = $this->isKeepQuery() ? clone $this : $this; - $criteria->setDbName($this->getDbName()); // Set the correct dbName - $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count - - // We need to set the primary table name, since in the case that there are no WHERE columns - // it will be impossible for the BasePeer::createSelectSql() method to determine which - // tables go into the FROM clause. - $criteria->setPrimaryTableName(constant($this->modelPeerName.'::TABLE_NAME')); - - $stmt = $criteria->getCountStatement($con); - if ($row = $stmt->fetch(PDO::FETCH_NUM)) { - $count = (int) $row[0]; - } else { - $count = 0; // no rows returned; we infer that means 0 matches. - } - $stmt->closeCursor(); - - return $count; - } - - protected function getCountStatement($con = null) - { - $dbMap = Propel::getDatabaseMap($this->getDbName()); - $db = Propel::getDB($this->getDbName()); - if ($con === null) { - $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); - } - - // check that the columns of the main class are already added (if this is the primary ModelCriteria) - if (!$this->hasSelectClause() && !$this->getPrimaryCriteria()) { - $this->addSelfSelectColumns(); - } - - $needsComplexCount = $this->getGroupByColumns() - || $this->getOffset() - || $this->getLimit() - || $this->getHaving() - || in_array(Criteria::DISTINCT, $this->getSelectModifiers()); - - $con->beginTransaction(); - try { - $this->basePreSelect($con); - $params = array(); - if ($needsComplexCount) { - if (BasePeer::needsSelectAliases($this)) { - if ($this->getHaving()) { - throw new PropelException('Propel cannot create a COUNT query when using HAVING and duplicate column names in the SELECT part'); - } - BasePeer::turnSelectColumnsToAliases($this); - } - $selectSql = BasePeer::createSelectSql($this, $params); - $sql = 'SELECT COUNT(*) FROM (' . $selectSql . ') propelmatch4cnt'; - } else { - // Replace SELECT columns with COUNT(*) - $this->clearSelectColumns()->addSelectColumn('COUNT(*)'); - $sql = BasePeer::createSelectSql($this, $params); - } - $stmt = $con->prepare($sql); - BasePeer::populateStmtValues($stmt, $params, $dbMap, $db); - $stmt->execute(); - $con->commit(); - } catch (PropelException $e) { - $con->rollback(); - throw $e; - } - - return $stmt; - } - - /** - * Issue a SELECT query based on the current ModelCriteria - * and uses a page and a maximum number of results per page - * to compute an offet and a limit. - * - * @param int $page number of the page to start the pager on. Page 1 means no offset - * @param int $maxPerPage maximum number of results per page. Determines the limit - * @param PropelPDO $con an optional connection object - * - * @return PropelModelPager a pager object, supporting iteration - */ - public function paginate($page = 1, $maxPerPage = 10, $con = null) - { - $criteria = $this->isKeepQuery() ? clone $this : $this; - $pager = new PropelModelPager($criteria, $maxPerPage); - $pager->setPage($page); - $pager->init(); - - return $pager; - } - - /** - * Code to execute before every DELETE statement - * - * @param PropelPDO $con The connection object used by the query - */ - protected function basePreDelete(PropelPDO $con) - { - return $this->preDelete($con); - } - - protected function preDelete(PropelPDO $con) - { - } - - /** - * Code to execute after every DELETE statement - * - * @param int $affectedRows the number of deleted rows - * @param PropelPDO $con The connection object used by the query - */ - protected function basePostDelete($affectedRows, PropelPDO $con) - { - return $this->postDelete($affectedRows, $con); - } - - protected function postDelete($affectedRows, PropelPDO $con) - { - } - - /** - * Issue a DELETE query based on the current ModelCriteria - * An optional hook on basePreDelete() can prevent the actual deletion - * - * @param PropelPDO $con an optional connection object - * - * @return integer the number of deleted rows - */ - public function delete($con = null) - { - if (count($this->getMap()) == 0) { - throw new PropelException('delete() expects a Criteria with at least one condition. Use deleteAll() to delete all the rows of a table'); - } - - if ($con === null) { - $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ); - } - - $criteria = $this->isKeepQuery() ? clone $this : $this; - $criteria->setDbName($this->getDbName()); - - $con->beginTransaction(); - try { - if(!$affectedRows = $criteria->basePreDelete($con)) { - $affectedRows = $criteria->doDelete($con); - } - $criteria->basePostDelete($affectedRows, $con); - $con->commit(); - } catch (PropelException $e) { - $con->rollback(); - throw $e; - } - - return $affectedRows; - } - - /** - * Issue a DELETE query based on the current ModelCriteria - * This method is called by ModelCriteria::delete() inside a transaction - * - * @param PropelPDO $con a connection object - * - * @return integer the number of deleted rows - */ - public function doDelete($con) - { - $affectedRows = call_user_func(array($this->modelPeerName, 'doDelete'), $this, $con); - - return $affectedRows; - } - - /** - * Issue a DELETE query based on the current ModelCriteria deleting all rows in the table - * An optional hook on basePreDelete() can prevent the actual deletion - * - * @param PropelPDO $con an optional connection object - * - * @return integer the number of deleted rows - */ - public function deleteAll($con = null) - { - if ($con === null) { - $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_WRITE); - } - $con->beginTransaction(); - try { - if(!$affectedRows = $this->basePreDelete($con)) { - $affectedRows = $this->doDeleteAll($con); - } - $this->basePostDelete($affectedRows, $con); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $affectedRows; - } - - /** - * Issue a DELETE query based on the current ModelCriteria deleting all rows in the table - * This method is called by ModelCriteria::deleteAll() inside a transaction - * - * @param PropelPDO $con a connection object - * - * @return integer the number of deleted rows - */ - public function doDeleteAll($con) - { - $affectedRows = call_user_func(array($this->modelPeerName, 'doDeleteAll'), $con); - - return $affectedRows; - } - - /** - * Code to execute before every UPDATE statement - * - * @param array $values The associatiove array of columns and values for the update - * @param PropelPDO $con The connection object used by the query - * @param boolean $forceIndividualSaves If false (default), the resulting call is a BasePeer::doUpdate(), ortherwise it is a series of save() calls on all the found objects - */ - protected function basePreUpdate(&$values, PropelPDO $con, $forceIndividualSaves = false) - { - return $this->preUpdate($values, $con, $forceIndividualSaves); - } - - protected function preUpdate(&$values, PropelPDO $con, $forceIndividualSaves = false) - { - } - - /** - * Code to execute after every UPDATE statement - * - * @param int $affectedRows the number of updated rows - * @param PropelPDO $con The connection object used by the query - */ - protected function basePostUpdate($affectedRows, PropelPDO $con) - { - return $this->postUpdate($affectedRows, $con); - } - - protected function postUpdate($affectedRows, PropelPDO $con) - { - } - - /** - * Issue an UPDATE query based the current ModelCriteria and a list of changes. - * An optional hook on basePreUpdate() can prevent the actual update. - * Beware that behaviors based on hooks in the object's save() method - * will only be triggered if you force individual saves, i.e. if you pass true as second argument. - * - * @param array $values Associative array of keys and values to replace - * @param PropelPDO $con an optional connection object - * @param boolean $forceIndividualSaves If false (default), the resulting call is a BasePeer::doUpdate(), ortherwise it is a series of save() calls on all the found objects - * - * @return Integer Number of updated rows - */ - public function update($values, $con = null, $forceIndividualSaves = false) - { - if (!is_array($values)) { - throw new PropelException('set() expects an array as first argument'); - } - if (count($this->getJoins())) { - throw new PropelException('set() does not support multitable updates, please do not use join()'); - } - - if ($con === null) { - $con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_WRITE); - } - - $criteria = $this->isKeepQuery() ? clone $this : $this; - $criteria->setPrimaryTableName(constant($this->modelPeerName.'::TABLE_NAME')); - - $con->beginTransaction(); - try { - - if(!$affectedRows = $criteria->basePreUpdate($values, $con, $forceIndividualSaves)) { - $affectedRows = $criteria->doUpdate($values, $con, $forceIndividualSaves); - } - $criteria->basePostUpdate($affectedRows, $con); - - $con->commit(); - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $affectedRows; - } - - /** - * Issue an UPDATE query based the current ModelCriteria and a list of changes. - * This method is called by ModelCriteria::update() inside a transaction. - * - * @param array $values Associative array of keys and values to replace - * @param PropelPDO $con a connection object - * @param boolean $forceIndividualSaves If false (default), the resulting call is a BasePeer::doUpdate(), ortherwise it is a series of save() calls on all the found objects - * - * @return Integer Number of updated rows - */ - public function doUpdate($values, $con, $forceIndividualSaves = false) - { - if($forceIndividualSaves) { - - // Update rows one by one - $objects = $this->setFormatter(ModelCriteria::FORMAT_OBJECT)->find($con); - foreach ($objects as $object) { - foreach ($values as $key => $value) { - $object->setByName($key, $value); - } - } - $objects->save($con); - $affectedRows = count($objects); - - } else { - - // update rows in a single query - $set = new Criteria(); - foreach ($values as $columnName => $value) { - $realColumnName = $this->getTableMap()->getColumnByPhpName($columnName)->getFullyQualifiedName(); - $set->add($realColumnName, $value); - } - $affectedRows = BasePeer::doUpdate($this, $set, $con); - call_user_func(array($this->modelPeerName, 'clearInstancePool')); - call_user_func(array($this->modelPeerName, 'clearRelatedInstancePool')); - } - - return $affectedRows; - } - - /** - * Creates a Criterion object based on a list of existing condition names and a comparator - * - * @param array $conditions The list of condition names, e.g. array('cond1', 'cond2') - * @param string $comparator A comparator, Criteria::LOGICAL_AND (default) or Criteria::LOGICAL_OR - * - * @return Criterion a Criterion or ModelCriterion object - */ - protected function getCriterionForConditions($conditions, $comparator = null) - { - $comparator = (null === $comparator) ? Criteria::LOGICAL_AND : $comparator; - $this->combine($conditions, $comparator, 'propel_temp_name'); - $criterion = $this->namedCriterions['propel_temp_name']; - unset($this->namedCriterions['propel_temp_name']); - - return $criterion; - } - - /** - * Creates a Criterion object based on a SQL clause and a value - * Uses introspection to translate the column phpName into a fully qualified name - * - * @param string $clause The pseudo SQL clause, e.g. 'AuthorId = ?' - * @param mixed $value A value for the condition - * - * @return Criterion a Criterion or ModelCriterion object - */ - protected function getCriterionForClause($clause, $value) - { - $clause = trim($clause); - if($this->replaceNames($clause)) { - // at least one column name was found and replaced in the clause - // this is enough to determine the type to bind the parameter to - if (preg_match('/IN \?$/i', $clause) !== 0) { - $operator = ModelCriteria::MODEL_CLAUSE_ARRAY; - } elseif (preg_match('/LIKE \?$/i', $clause) !== 0) { - $operator = ModelCriteria::MODEL_CLAUSE_LIKE; - } elseif (substr_count($clause, '?') > 1) { - $operator = ModelCriteria::MODEL_CLAUSE_SEVERAL; - } else { - $operator = ModelCriteria::MODEL_CLAUSE; - } - $criterion = new ModelCriterion($this, $this->replacedColumns[0], $value, $operator, $clause); - if ($this->currentAlias != '') { - $criterion->setTable($this->currentAlias); - } - } else { - // no column match in clause, must be an expression like '1=1' - if (strpos($clause, '?') !== false) { - throw new PropelException("Cannot determine the column to bind to the parameter in clause '$clause'"); - } - $criterion = new Criterion($this, null, $clause, Criteria::CUSTOM); - } - return $criterion; - } - - /** - * Replaces complete column names (like Article.AuthorId) in an SQL clause - * by their exact Propel column fully qualified name (e.g. article.AUTHOR_ID) - * but ignores the column names inside quotes - * - * Note: if you know a way to do so in one step, and in an efficient way, I'm interested :) - * - * @param string $clause SQL clause to inspect (modified by the method) - * - * @return boolean Whether the method managed to find and replace at least one column name - */ - protected function replaceNames(&$clause) - { - $this->replacedColumns = array(); - $this->currentAlias = ''; - $this->foundMatch = false; - $regexp = <<foundMatch; - } - - /** - * Callback function to replace expressions containing column names with expressions using the real column names - * Handles strings properly - * e.g. 'CONCAT(Book.Title, "Book.Title") = ?' - * => 'CONCAT(book.TITLE, "Book.Title") = ?' - * - * @param array $matches Matches found by preg_replace_callback - * - * @return string the expression replacement - */ - protected function doReplaceName($matches) - { - if(!$matches[0]) { - return ''; - } - // replace names only in expressions, not in strings delimited by quotes - return $matches[1] . preg_replace_callback('/\w+\.\w+/', array($this, 'doReplaceNameInExpression'), $matches[2]); - } - - /** - * Callback function to replace column names by their real name in a clause - * e.g. 'Book.Title IN ?' - * => 'book.TITLE IN ?' - * - * @param array $matches Matches found by preg_replace_callback - * - * @return string the column name replacement - */ - protected function doReplaceNameInExpression($matches) - { - $key = $matches[0]; - list($column, $realColumnName) = $this->getColumnFromName($key); - if ($column instanceof ColumnMap) { - $this->replacedColumns[]= $column; - $this->foundMatch = true; - return $realColumnName; - } else { - return $key; - } - } - - /** - * Finds a column and a SQL translation for a pseudo SQL column name - * Respects table aliases previously registered in a join() or addAlias() - * Examples: - * - * $c->getColumnFromName('Book.Title'); - * => array($bookTitleColumnMap, 'book.TITLE') - * $c->join('Book.Author a') - * ->getColumnFromName('a.FirstName'); - * => array($authorFirstNameColumnMap, 'a.FIRST_NAME') - * - * - * @param string $phpName String representing the column name in a pseudo SQL clause, e.g. 'Book.Title' - * - * @return array List($columnMap, $realColumnName) - */ - protected function getColumnFromName($phpName, $failSilently = true) - { - if (strpos($phpName, '.') === false) { - $class = $this->getModelAliasOrName(); - } else { - list($class, $phpName) = explode('.', $phpName); - } - - if ($class == $this->getModelAliasOrName()) { - // column of the Criteria's model - $tableMap = $this->getTableMap(); - } elseif (isset($this->joins[$class])) { - // column of a relations's model - $tableMap = $this->joins[$class]->getTableMap(); - } else { - if ($failSilently) { - return array(null, null); - } else { - throw new PropelException('Unknown model or alias ' . $class); - } - } - - if ($tableMap->hasColumnByPhpName($phpName)) { - $column = $tableMap->getColumnByPhpName($phpName); - if (isset($this->aliases[$class])) { - $this->currentAlias = $class; - $realColumnName = $class . '.' . $column->getName(); - } else { - $realColumnName = $column->getFullyQualifiedName(); - } - return array($column, $realColumnName); - } elseif (isset($this->asColumns[$phpName])) { - // aliased column - return array(null, $phpName); - } else { - if ($failSilently) { - return array(null, null); - } else { - throw new PropelException('Unknown column ' . $phpName . ' on model or alias ' . $class); - } - } - } - - /** - * Return a fully qualified column name corresponding to a simple column phpName - * Uses model alias if it exists - * Warning: restricted to the columns of the main model - * e.g. => 'Title' => 'book.TITLE' - * - * @param string $columnName the Column phpName, without the table name - * - * @return string the fully qualified column name - */ - protected function getRealColumnName($columnName) - { - if (!$this->getTableMap()->hasColumnByPhpName($columnName)) { - throw new PropelException('Unkown column ' . $columnName . ' in model ' . $this->modelName); - } - if ($this->useAliasInSQL) { - return $this->modelAlias . '.' . $this->getTableMap()->getColumnByPhpName($columnName)->getName(); - } else { - return $this->getTableMap()->getColumnByPhpName($columnName)->getFullyQualifiedName(); - } - } - - /** - * Changes the table part of a a fully qualified column name if a true model alias exists - * e.g. => 'book.TITLE' => 'b.TITLE' - * This is for use as first argument of Criteria::add() - * - * @param string $colName the fully qualified column name, e.g 'book.TITLE' or BookPeer::TITLE - * - * @return string the fully qualified column name, using table alias if applicatble - */ - public function getAliasedColName($colName) - { - if ($this->useAliasInSQL) { - return $this->modelAlias . substr($colName, strpos($colName, '.')); - } else { - return $colName; - } - } - - /** - * Overrides Criteria::add() to force the use of a true table alias if it exists - * - * @see Criteria::add() - * @param string $column The colName of column to run the comparison on (e.g. BookPeer::ID) - * @param mixed $value - * @param string $comparison A String. - * - * @return ModelCriteria A modified Criteria object. - */ - public function addUsingAlias($p1, $value = null, $comparison = null) - { - $key = $this->getAliasedColName($p1); - return $this->containsKey($key) ? $this->addAnd($key, $value, $comparison) : $this->add($key, $value, $comparison); - } - - /** - * Get all the parameters to bind to this criteria - * Does part of the job of BasePeer::createSelectSql() for the cache - * - * @return array list of parameters, each parameter being an array like - * array('table' => $realtable, 'column' => $column, 'value' => $value) - */ - public function getParams() - { - $params = array(); - $dbMap = Propel::getDatabaseMap($this->getDbName()); - - foreach ($this->getMap() as $criterion) { - - $table = null; - foreach ($criterion->getAttachedCriterion() as $attachedCriterion) { - $tableName = $attachedCriterion->getTable(); - - $table = $this->getTableForAlias($tableName); - if (null === $table) { - $table = $tableName; - } - - if (($this->isIgnoreCase() || $attachedCriterion->isIgnoreCase()) - && $dbMap->getTable($table)->getColumn($attachedCriterion->getColumn())->isText()) { - $attachedCriterion->setIgnoreCase(true); - } - } - - $sb = ''; - $criterion->appendPsTo($sb, $params); - } - - $having = $this->getHaving(); - if ($having !== null) { - $sb = ''; - $having->appendPsTo($sb, $params); - } - - return $params; - } - - /** - * Handle the magic - * Supports findByXXX(), findOneByXXX(), filterByXXX(), orderByXXX(), and groupByXXX() methods, - * where XXX is a column phpName. - * Supports XXXJoin(), where XXX is a join direction (in 'left', 'right', 'inner') - */ - public function __call($name, $arguments) - { - // Maybe it's a magic call to one of the methods supporting it, e.g. 'findByTitle' - static $methods = array('findBy', 'findOneBy', 'filterBy', 'orderBy', 'groupBy'); - foreach ($methods as $method) - { - if(strpos($name, $method) === 0) - { - $columns = substr($name, strlen($method)); - if(in_array($method, array('findBy', 'findOneBy')) && strpos($columns, 'And') !== false) { - $method = $method . 'Array'; - $columns = explode('And', $columns); - $conditions = array(); - foreach ($columns as $column) { - $conditions[$column] = array_shift($arguments); - } - array_unshift($arguments, $conditions); - } else { - array_unshift($arguments, $columns); - } - return call_user_func_array(array($this, $method), $arguments); - } - } - - // Maybe it's a magic call to a qualified joinWith method, e.g. 'leftJoinWith' or 'joinWithAuthor' - if(($pos = stripos($name, 'joinWith')) !== false) { - $type = substr($name, 0, $pos); - if(in_array($type, array('left', 'right', 'inner'))) { - $joinType = strtoupper($type) . ' JOIN'; - } else { - $joinType = Criteria::INNER_JOIN; - } - if(!$relation = substr($name, $pos + 8)) { - $relation = $arguments[0]; - } - return $this->joinWith($relation, $joinType); - } - - // Maybe it's a magic call to a qualified join method, e.g. 'leftJoin' - if(($pos = strpos($name, 'Join')) > 0) - { - $type = substr($name, 0, $pos); - if(in_array($type, array('left', 'right', 'inner'))) - { - $joinType = strtoupper($type) . ' JOIN'; - // Test if first argument is suplied, else don't provide an alias to joinXXX (default value) - if (!isset($arguments[0])) { - $arguments[0] = ''; - } - array_push($arguments, $joinType); - $method = substr($name, $pos); - // no lcfirst in php<5.3... - $method[0] = strtolower($method[0]); - return call_user_func_array(array($this, $method), $arguments); - } - } - - throw new PropelException(sprintf('Undefined method %s::%s()', __CLASS__, $name)); - } - - /** - * Ensures deep cloning of attached objects - */ - public function __clone() - { - parent::__clone(); - foreach ($this->with as $key => $join) { - $this->with[$key] = clone $join; - } - if (null !== $this->formatter) { - $this->formatter = clone $this->formatter; - } - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/query/ModelCriterion.php b/airtime_mvc/library/propel/runtime/lib/query/ModelCriterion.php deleted file mode 100644 index beeeda79a8..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/query/ModelCriterion.php +++ /dev/null @@ -1,283 +0,0 @@ -value = $value; - if ($column instanceof ColumnMap) { - $this->column = $column->getName(); - $this->table = $column->getTable()->getName(); - } else { - $dotPos = strrpos($column,'.'); - if ($dotPos === false) { - // no dot => aliased column - $this->table = null; - $this->column = $column; - } else { - $this->table = substr($column, 0, $dotPos); - $this->column = substr($column, $dotPos+1, strlen($column)); - } - } - $this->comparison = ($comparison === null ? Criteria::EQUAL : $comparison); - $this->clause = $clause; - $this->init($outer); - } - - public function getClause() - { - return $this->clause; - } - - /** - * Figure out which MocelCriterion method to use - * to build the prepared statement and parameters using to the Criterion comparison - * and call it to append the prepared statement and the parameters of the current clause. - * For performance reasons, this method tests the cases of parent::dispatchPsHandling() - * first, and that is not possible through inheritance ; that's why the parent - * code is duplicated here. - * - * @param string &$sb The string that will receive the Prepared Statement - * @param array $params A list to which Prepared Statement parameters will be appended - */ - protected function dispatchPsHandling(&$sb, array &$params) - { - switch ($this->comparison) { - case Criteria::CUSTOM: - // custom expression with no parameter binding - $this->appendCustomToPs($sb, $params); - break; - case Criteria::IN: - case Criteria::NOT_IN: - // table.column IN (?, ?) or table.column NOT IN (?, ?) - $this->appendInToPs($sb, $params); - break; - case Criteria::LIKE: - case Criteria::NOT_LIKE: - case Criteria::ILIKE: - case Criteria::NOT_ILIKE: - // table.column LIKE ? or table.column NOT LIKE ? (or ILIKE for Postgres) - $this->appendLikeToPs($sb, $params); - break; - case ModelCriteria::MODEL_CLAUSE: - // regular model clause, e.g. 'book.TITLE = ?' - $this->appendModelClauseToPs($sb, $params); - break; - case ModelCriteria::MODEL_CLAUSE_LIKE: - // regular model clause, e.g. 'book.TITLE = ?' - $this->appendModelClauseLikeToPs($sb, $params); - break; - case ModelCriteria::MODEL_CLAUSE_SEVERAL: - // Ternary model clause, e.G 'book.ID BETWEEN ? AND ?' - $this->appendModelClauseSeveralToPs($sb, $params); - break; - case ModelCriteria::MODEL_CLAUSE_ARRAY: - // IN or NOT IN model clause, e.g. 'book.TITLE NOT IN ?' - $this->appendModelClauseArrayToPs($sb, $params); - break; - default: - // table.column = ? or table.column >= ? etc. (traditional expressions, the default) - $this->appendBasicToPs($sb, $params); - - } - } - - /** - * Appends a Prepared Statement representation of the ModelCriterion onto the buffer - * For regular model clauses, e.g. 'book.TITLE = ?' - * - * @param string &$sb The string that will receive the Prepared Statement - * @param array $params A list to which Prepared Statement parameters will be appended - */ - public function appendModelClauseToPs(&$sb, array &$params) - { - if ($this->value !== null) { - $params[] = array('table' => $this->realtable, 'column' => $this->column, 'value' => $this->value); - $sb .= str_replace('?', ':p'.count($params), $this->clause); - } else { - $sb .= $this->clause; - } - } - - /** - * Appends a Prepared Statement representation of the ModelCriterion onto the buffer - * For LIKE model clauses, e.g. 'book.TITLE LIKE ?' - * Handles case insensitivity for VARCHAR columns - * - * @param string &$sb The string that will receive the Prepared Statement - * @param array $params A list to which Prepared Statement parameters will be appended - */ - public function appendModelClauseLikeToPs(&$sb, array &$params) - { - // LIKE is case insensitive in mySQL and SQLite, but not in PostGres - // If the column is case insensitive, use ILIKE / NOT ILIKE instead of LIKE / NOT LIKE - if ($this->ignoreStringCase && $this->getDb() instanceof DBPostgres) { - $this->clause = preg_replace('/LIKE \?$/i', 'ILIKE ?', $this->clause); - } - $this->appendModelClauseToPs($sb, $params); - } - - /** - * Appends a Prepared Statement representation of the ModelCriterion onto the buffer - * For ternary model clauses, e.G 'book.ID BETWEEN ? AND ?' - * - * @param string &$sb The string that will receive the Prepared Statement - * @param array $params A list to which Prepared Statement parameters will be appended - */ - public function appendModelClauseSeveralToPs(&$sb, array &$params) - { - $clause = $this->clause; - foreach ((array) $this->value as $value) { - if ($value === null) { - // FIXME we eventually need to translate a BETWEEN to - // something like WHERE (col < :p1 OR :p1 IS NULL) AND (col < :p2 OR :p2 IS NULL) - // in order to support null values - throw new PropelException('Null values are not supported inside BETWEEN clauses'); - } - $params[] = array('table' => $this->realtable, 'column' => $this->column, 'value' => $value); - $clause = self::strReplaceOnce('?', ':p'.count($params), $clause); - } - $sb .= $clause; - } - - /** - * Appends a Prepared Statement representation of the ModelCriterion onto the buffer - * For IN or NOT IN model clauses, e.g. 'book.TITLE NOT IN ?' - * - * @param string &$sb The string that will receive the Prepared Statement - * @param array $params A list to which Prepared Statement parameters will be appended - */ - public function appendModelClauseArrayToPs(&$sb, array &$params) - { - $_bindParams = array(); // the param names used in query building - $_idxstart = count($params); - $valuesLength = 0; - foreach ( (array) $this->value as $value ) { - $valuesLength++; // increment this first to correct for wanting bind params to start with :p1 - $params[] = array('table' => $this->realtable, 'column' => $this->column, 'value' => $value); - $_bindParams[] = ':p'.($_idxstart + $valuesLength); - } - if ($valuesLength !== 0) { - $sb .= str_replace('?', '(' . implode(',', $_bindParams) . ')', $this->clause); - } else { - $sb .= (stripos($this->clause, ' NOT IN ') === false) ? "1<>1" : "1=1"; - } - unset ( $value, $valuesLength ); - } - - /** - * This method checks another Criteria to see if they contain - * the same attributes and hashtable entries. - * @return boolean - */ - public function equals($obj) - { - // TODO: optimize me with early outs - if ($this === $obj) { - return true; - } - - if (($obj === null) || !($obj instanceof ModelCriterion)) { - return false; - } - - $crit = $obj; - - $isEquiv = ( ( ($this->table === null && $crit->getTable() === null) - || ( $this->table !== null && $this->table === $crit->getTable() ) - ) - && $this->clause === $crit->getClause() - && $this->column === $crit->getColumn() - && $this->comparison === $crit->getComparison()); - - // check chained criterion - - $clausesLength = count($this->clauses); - $isEquiv &= (count($crit->getClauses()) == $clausesLength); - $critConjunctions = $crit->getConjunctions(); - $critClauses = $crit->getClauses(); - for ($i=0; $i < $clausesLength && $isEquiv; $i++) { - $isEquiv &= ($this->conjunctions[$i] === $critConjunctions[$i]); - $isEquiv &= ($this->clauses[$i] === $critClauses[$i]); - } - - if ($isEquiv) { - $isEquiv &= $this->value === $crit->getValue(); - } - - return $isEquiv; - } - - /** - * Returns a hash code value for the object. - */ - public function hashCode() - { - $h = crc32(serialize($this->value)) ^ crc32($this->comparison) ^ crc32($this->clause); - - if ($this->table !== null) { - $h ^= crc32($this->table); - } - - if ($this->column !== null) { - $h ^= crc32($this->column); - } - - foreach ( $this->clauses as $clause ) { - // TODO: i KNOW there is a php incompatibility with the following line - // but i dont remember what it is, someone care to look it up and - // replace it if it doesnt bother us? - // $clause->appendPsTo($sb='',$params=array()); - $sb = ''; - $params = array(); - $clause->appendPsTo($sb,$params); - $h ^= crc32(serialize(array($sb,$params))); - unset ( $sb, $params ); - } - - return $h; - } - - /** - * Replace only once - * taken from http://www.php.net/manual/en/function.str-replace.php - * - */ - protected static function strReplaceOnce($search, $replace, $subject) - { - $firstChar = strpos($subject, $search); - if($firstChar !== false) { - $beforeStr = substr($subject,0,$firstChar); - $afterStr = substr($subject, $firstChar + strlen($search)); - return $beforeStr.$replace.$afterStr; - } else { - return $subject; - } - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/query/ModelJoin.php b/airtime_mvc/library/propel/runtime/lib/query/ModelJoin.php deleted file mode 100644 index 59bbfce5d9..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/query/ModelJoin.php +++ /dev/null @@ -1,166 +0,0 @@ -getLeftColumns(); - $rightCols = $relationMap->getRightColumns(); - $nbColumns = $relationMap->countColumnMappings(); - for ($i=0; $i < $nbColumns; $i++) { - $leftColName = ($leftTableAlias ? $leftTableAlias : $leftCols[$i]->getTableName()) . '.' . $leftCols[$i]->getName(); - $rightColName = ($relationAlias ? $relationAlias : $rightCols[$i]->getTableName()) . '.' . $rightCols[$i]->getName(); - $this->addCondition($leftColName, $rightColName, Criteria::EQUAL); - } - $this->relationMap = $relationMap; - $this->leftTableAlias = $leftTableAlias; - $this->relationAlias = $relationAlias; - - return $this; - } - - public function getRelationMap() - { - return $this->relationMap; - } - - /** - * Sets the right tableMap for this join - * - * @param TableMap $tableMap The table map to use - * - * @return ModelJoin The current join object, for fluid interface - */ - public function setTableMap(TableMap $tableMap) - { - $this->tableMap = $tableMap; - - return $this; - } - - /** - * Gets the right tableMap for this join - * - * @return TableMap The table map - */ - public function getTableMap() - { - if (null === $this->tableMap && null !== $this->relationMap) - { - $this->tableMap = $this->relationMap->getRightTable(); - } - return $this->tableMap; - } - - public function setPreviousJoin(ModelJoin $join) - { - $this->previousJoin = $join; - - return $this; - } - - public function getPreviousJoin() - { - return $this->previousJoin; - } - - public function isPrimary() - { - return null === $this->previousJoin; - } - - public function setLeftTableAlias($leftTableAlias) - { - $this->leftTableAlias = $leftTableAlias; - - return $this; - } - - public function getLeftTableAlias() - { - return $this->leftTableAlias; - } - - public function hasLeftTableAlias() - { - return null !== $this->leftTableAlias; - } - - public function setRelationAlias($relationAlias) - { - $this->relationAlias = $relationAlias; - - return $this; - } - - public function getRelationAlias() - { - return $this->relationAlias; - } - - public function hasRelationAlias() - { - return null !== $this->relationAlias; - } - - /** - * This method returns the last related, but already hydrated object up until this join - * Starting from $startObject and continuously calling the getters to get - * to the base object for the current join. - * - * This method only works if PreviousJoin has been defined, - * which only happens when you provide dotted relations when calling join - * - * @param Object $startObject the start object all joins originate from and which has already hydrated - * @return Object the base Object of this join - */ - public function getObjectToRelate($startObject) - { - if($this->isPrimary()) { - return $startObject; - } else { - $previousJoin = $this->getPreviousJoin(); - $previousObject = $previousJoin->getObjectToRelate($startObject); - $method = 'get' . $previousJoin->getRelationMap()->getName(); - return $previousObject->$method(); - } - } - - public function equals($join) - { - return parent::equals($join) - && $this->relationMap == $join->getRelationMap() - && $this->previousJoin == $join->getPreviousJoin() - && $this->relationAlias == $join->getRelationAlias(); - } - - public function __toString() - { - return parent::toString() - . ' tableMap: ' . ($this->tableMap ? get_class($this->tableMap) : 'null') - . ' relationMap: ' . $this->relationMap->getName() - . ' previousJoin: ' . ($this->previousJoin ? '(' . $this->previousJoin . ')' : 'null') - . ' relationAlias: ' . $this->relationAlias; - } -} - \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/query/PropelQuery.php b/airtime_mvc/library/propel/runtime/lib/query/PropelQuery.php deleted file mode 100644 index 18f93c9b92..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/query/PropelQuery.php +++ /dev/null @@ -1,33 +0,0 @@ -setModelAlias($alias); - } - return $query; - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/util/BasePeer.php b/airtime_mvc/library/propel/runtime/lib/util/BasePeer.php deleted file mode 100644 index 0e6c91254e..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/util/BasePeer.php +++ /dev/null @@ -1,1099 +0,0 @@ - (Propel) - * @author Kaspars Jaudzems (Propel) - * @author Heltem (Propel) - * @author Frank Y. Kim (Torque) - * @author John D. McNally (Torque) - * @author Brett McLaughlin (Torque) - * @author Stephen Haberman (Torque) - * @version $Revision: 1772 $ - * @package propel.runtime.util - */ -class BasePeer -{ - - /** Array (hash) that contains the cached mapBuilders. */ - private static $mapBuilders = array(); - - /** Array (hash) that contains cached validators */ - private static $validatorMap = array(); - - /** - * phpname type - * e.g. 'AuthorId' - */ - const TYPE_PHPNAME = 'phpName'; - - /** - * studlyphpname type - * e.g. 'authorId' - */ - const TYPE_STUDLYPHPNAME = 'studlyPhpName'; - - /** - * column (peer) name type - * e.g. 'book.AUTHOR_ID' - */ - const TYPE_COLNAME = 'colName'; - - /** - * column part of the column peer name - * e.g. 'AUTHOR_ID' - */ - const TYPE_RAW_COLNAME = 'rawColName'; - - /** - * column fieldname type - * e.g. 'author_id' - */ - const TYPE_FIELDNAME = 'fieldName'; - - /** - * num type - * simply the numerical array index, e.g. 4 - */ - const TYPE_NUM = 'num'; - - static public function getFieldnames ($classname, $type = self::TYPE_PHPNAME) { - - // TODO we should take care of including the peer class here - - $peerclass = 'Base' . $classname . 'Peer'; // TODO is this always true? - $callable = array($peerclass, 'getFieldnames'); - - return call_user_func($callable, $type); - } - - static public function translateFieldname($classname, $fieldname, $fromType, $toType) { - - // TODO we should take care of including the peer class here - - $peerclass = 'Base' . $classname . 'Peer'; // TODO is this always true? - $callable = array($peerclass, 'translateFieldname'); - $args = array($fieldname, $fromType, $toType); - - return call_user_func_array($callable, $args); - } - - /** - * Method to perform deletes based on values and keys in a - * Criteria. - * - * @param Criteria $criteria The criteria to use. - * @param PropelPDO $con A PropelPDO connection object. - * @return int The number of rows affected by last statement execution. For most - * uses there is only one delete statement executed, so this number - * will correspond to the number of rows affected by the call to this - * method. Note that the return value does require that this information - * is returned (supported) by the PDO driver. - * @throws PropelException - */ - public static function doDelete(Criteria $criteria, PropelPDO $con) - { - $db = Propel::getDB($criteria->getDbName()); - $dbMap = Propel::getDatabaseMap($criteria->getDbName()); - - // Set up a list of required tables (one DELETE statement will - // be executed per table) - $tables = $criteria->getTablesColumns(); - if (empty($tables)) { - throw new PropelException("Cannot delete from an empty Criteria"); - } - - $affectedRows = 0; // initialize this in case the next loop has no iterations. - - foreach ($tables as $tableName => $columns) { - - $whereClause = array(); - $params = array(); - $stmt = null; - try { - $sql = 'DELETE '; - if ($queryComment = $criteria->getComment()) { - $sql .= '/* ' . $queryComment . ' */ '; - } - if ($realTableName = $criteria->getTableForAlias($tableName)) { - if ($db->useQuoteIdentifier()) { - $realTableName = $db->quoteIdentifierTable($realTableName); - } - $sql .= $tableName . ' FROM ' . $realTableName . ' AS ' . $tableName; - } else { - if ($db->useQuoteIdentifier()) { - $tableName = $db->quoteIdentifierTable($tableName); - } - $sql .= 'FROM ' . $tableName; - } - - foreach ($columns as $colName) { - $sb = ""; - $criteria->getCriterion($colName)->appendPsTo($sb, $params); - $whereClause[] = $sb; - } - $sql .= " WHERE " . implode(" AND ", $whereClause); - - $stmt = $con->prepare($sql); - self::populateStmtValues($stmt, $params, $dbMap, $db); - $stmt->execute(); - $affectedRows = $stmt->rowCount(); - } catch (Exception $e) { - Propel::log($e->getMessage(), Propel::LOG_ERR); - throw new PropelException(sprintf('Unable to execute DELETE statement [%s]', $sql), $e); - } - - } // for each table - - return $affectedRows; - } - - /** - * Method to deletes all contents of specified table. - * - * This method is invoked from generated Peer classes like this: - * - * public static function doDeleteAll($con = null) - * { - * if ($con === null) $con = Propel::getConnection(self::DATABASE_NAME); - * BasePeer::doDeleteAll(self::TABLE_NAME, $con, self::DATABASE_NAME); - * } - * - * - * @param string $tableName The name of the table to empty. - * @param PropelPDO $con A PropelPDO connection object. - * @param string $databaseName the name of the database. - * @return int The number of rows affected by the statement. Note - * that the return value does require that this information - * is returned (supported) by the Propel db driver. - * @throws PropelException - wrapping SQLException caught from statement execution. - */ - public static function doDeleteAll($tableName, PropelPDO $con, $databaseName = null) - { - try { - $db = Propel::getDB($databaseName); - if ($db->useQuoteIdentifier()) { - $tableName = $db->quoteIdentifierTable($tableName); - } - $sql = "DELETE FROM " . $tableName; - $stmt = $con->prepare($sql); - $stmt->execute(); - return $stmt->rowCount(); - } catch (Exception $e) { - Propel::log($e->getMessage(), Propel::LOG_ERR); - throw new PropelException(sprintf('Unable to execute DELETE ALL statement [%s]', $sql), $e); - } - } - - /** - * Method to perform inserts based on values and keys in a - * Criteria. - *

- * If the primary key is auto incremented the data in Criteria - * will be inserted and the auto increment value will be returned. - *

- * If the primary key is included in Criteria then that value will - * be used to insert the row. - *

- * If no primary key is included in Criteria then we will try to - * figure out the primary key from the database map and insert the - * row with the next available id using util.db.IDBroker. - *

- * If no primary key is defined for the table the values will be - * inserted as specified in Criteria and null will be returned. - * - * @param Criteria $criteria Object containing values to insert. - * @param PropelPDO $con A PropelPDO connection. - * @return mixed The primary key for the new row if (and only if!) the primary key - * is auto-generated. Otherwise will return null. - * @throws PropelException - */ - public static function doInsert(Criteria $criteria, PropelPDO $con) { - - // the primary key - $id = null; - - $db = Propel::getDB($criteria->getDbName()); - - // Get the table name and method for determining the primary - // key value. - $keys = $criteria->keys(); - if (!empty($keys)) { - $tableName = $criteria->getTableName( $keys[0] ); - } else { - throw new PropelException("Database insert attempted without anything specified to insert"); - } - - $dbMap = Propel::getDatabaseMap($criteria->getDbName()); - $tableMap = $dbMap->getTable($tableName); - $keyInfo = $tableMap->getPrimaryKeyMethodInfo(); - $useIdGen = $tableMap->isUseIdGenerator(); - //$keyGen = $con->getIdGenerator(); - - $pk = self::getPrimaryKey($criteria); - - // only get a new key value if you need to - // the reason is that a primary key might be defined - // but you are still going to set its value. for example: - // a join table where both keys are primary and you are - // setting both columns with your own values - - // pk will be null if there is no primary key defined for the table - // we're inserting into. - if ($pk !== null && $useIdGen && !$criteria->keyContainsValue($pk->getFullyQualifiedName()) && $db->isGetIdBeforeInsert()) { - try { - $id = $db->getId($con, $keyInfo); - } catch (Exception $e) { - throw new PropelException("Unable to get sequence id.", $e); - } - $criteria->add($pk->getFullyQualifiedName(), $id); - } - - try { - $adapter = Propel::getDB($criteria->getDBName()); - - $qualifiedCols = $criteria->keys(); // we need table.column cols when populating values - $columns = array(); // but just 'column' cols for the SQL - foreach ($qualifiedCols as $qualifiedCol) { - $columns[] = substr($qualifiedCol, strrpos($qualifiedCol, '.') + 1); - } - - // add identifiers - if ($adapter->useQuoteIdentifier()) { - $columns = array_map(array($adapter, 'quoteIdentifier'), $columns); - $tableName = $adapter->quoteIdentifierTable($tableName); - } - - $sql = 'INSERT INTO ' . $tableName - . ' (' . implode(',', $columns) . ')' - . ' VALUES ('; - // . substr(str_repeat("?,", count($columns)), 0, -1) . - for($p=1, $cnt=count($columns); $p <= $cnt; $p++) { - $sql .= ':p'.$p; - if ($p !== $cnt) $sql .= ','; - } - $sql .= ')'; - - $stmt = $con->prepare($sql); - self::populateStmtValues($stmt, self::buildParams($qualifiedCols, $criteria), $dbMap, $db); - $stmt->execute(); - - } catch (Exception $e) { - Propel::log($e->getMessage(), Propel::LOG_ERR); - throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), $e); - } - - // If the primary key column is auto-incremented, get the id now. - if ($pk !== null && $useIdGen && $db->isGetIdAfterInsert()) { - try { - $id = $db->getId($con, $keyInfo); - } catch (Exception $e) { - throw new PropelException("Unable to get autoincrement id.", $e); - } - } - - return $id; - } - - /** - * Method used to update rows in the DB. Rows are selected based - * on selectCriteria and updated using values in updateValues. - *

- * Use this method for performing an update of the kind: - *

- * WHERE some_column = some value AND could_have_another_column = - * another value AND so on. - * - * @param $selectCriteria A Criteria object containing values used in where - * clause. - * @param $updateValues A Criteria object containing values used in set - * clause. - * @param PropelPDO $con The PropelPDO connection object to use. - * @return int The number of rows affected by last update statement. For most - * uses there is only one update statement executed, so this number - * will correspond to the number of rows affected by the call to this - * method. Note that the return value does require that this information - * is returned (supported) by the Propel db driver. - * @throws PropelException - */ - public static function doUpdate(Criteria $selectCriteria, Criteria $updateValues, PropelPDO $con) { - - $db = Propel::getDB($selectCriteria->getDbName()); - $dbMap = Propel::getDatabaseMap($selectCriteria->getDbName()); - - // Get list of required tables, containing all columns - $tablesColumns = $selectCriteria->getTablesColumns(); - if (empty($tablesColumns)) { - $tablesColumns = array($selectCriteria->getPrimaryTableName() => array()); - } - - // we also need the columns for the update SQL - $updateTablesColumns = $updateValues->getTablesColumns(); - - $affectedRows = 0; // initialize this in case the next loop has no iterations. - - foreach ($tablesColumns as $tableName => $columns) { - - $whereClause = array(); - $params = array(); - $stmt = null; - try { - $sql = 'UPDATE '; - if ($queryComment = $selectCriteria->getComment()) { - $sql .= '/* ' . $queryComment . ' */ '; - } - // is it a table alias? - if ($tableName2 = $selectCriteria->getTableForAlias($tableName)) { - $udpateTable = $tableName2 . ' ' . $tableName; - $tableName = $tableName2; - } else { - $udpateTable = $tableName; - } - if ($db->useQuoteIdentifier()) { - $sql .= $db->quoteIdentifierTable($udpateTable); - } else { - $sql .= $udpateTable; - } - $sql .= " SET "; - $p = 1; - foreach ($updateTablesColumns[$tableName] as $col) { - $updateColumnName = substr($col, strrpos($col, '.') + 1); - // add identifiers for the actual database? - if ($db->useQuoteIdentifier()) { - $updateColumnName = $db->quoteIdentifier($updateColumnName); - } - if ($updateValues->getComparison($col) != Criteria::CUSTOM_EQUAL) { - $sql .= $updateColumnName . '=:p'.$p++.', '; - } else { - $param = $updateValues->get($col); - $sql .= $updateColumnName . ' = '; - if (is_array($param)) { - if (isset($param['raw'])) { - $raw = $param['raw']; - $rawcvt = ''; - // parse the $params['raw'] for ? chars - for($r=0,$len=strlen($raw); $r < $len; $r++) { - if ($raw{$r} == '?') { - $rawcvt .= ':p'.$p++; - } else { - $rawcvt .= $raw{$r}; - } - } - $sql .= $rawcvt . ', '; - } else { - $sql .= ':p'.$p++.', '; - } - if (isset($param['value'])) { - $updateValues->put($col, $param['value']); - } - } else { - $updateValues->remove($col); - $sql .= $param . ', '; - } - } - } - - $params = self::buildParams($updateTablesColumns[$tableName], $updateValues); - - $sql = substr($sql, 0, -2); - if (!empty($columns)) { - foreach ($columns as $colName) { - $sb = ""; - $selectCriteria->getCriterion($colName)->appendPsTo($sb, $params); - $whereClause[] = $sb; - } - $sql .= " WHERE " . implode(" AND ", $whereClause); - } - - $stmt = $con->prepare($sql); - - // Replace ':p?' with the actual values - self::populateStmtValues($stmt, $params, $dbMap, $db); - - $stmt->execute(); - - $affectedRows = $stmt->rowCount(); - - $stmt = null; // close - - } catch (Exception $e) { - if ($stmt) $stmt = null; // close - Propel::log($e->getMessage(), Propel::LOG_ERR); - throw new PropelException(sprintf('Unable to execute UPDATE statement [%s]', $sql), $e); - } - - } // foreach table in the criteria - - return $affectedRows; - } - - /** - * Executes query build by createSelectSql() and returns the resultset statement. - * - * @param Criteria $criteria A Criteria. - * @param PropelPDO $con A PropelPDO connection to use. - * @return PDOStatement The resultset. - * @throws PropelException - * @see createSelectSql() - */ - public static function doSelect(Criteria $criteria, PropelPDO $con = null) - { - $dbMap = Propel::getDatabaseMap($criteria->getDbName()); - $db = Propel::getDB($criteria->getDbName()); - $stmt = null; - - if ($con === null) { - $con = Propel::getConnection($criteria->getDbName(), Propel::CONNECTION_READ); - } - - if ($criteria->isUseTransaction()) { - $con->beginTransaction(); - } - - try { - - $params = array(); - $sql = self::createSelectSql($criteria, $params); - - $stmt = $con->prepare($sql); - - self::populateStmtValues($stmt, $params, $dbMap, $db); - - $stmt->execute(); - - if ($criteria->isUseTransaction()) { - $con->commit(); - } - - } catch (Exception $e) { - if ($stmt) { - $stmt = null; // close - } - if ($criteria->isUseTransaction()) { - $con->rollBack(); - } - Propel::log($e->getMessage(), Propel::LOG_ERR); - throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e); - } - - return $stmt; - } - - /** - * Executes a COUNT query using either a simple SQL rewrite or, for more complex queries, a - * sub-select of the SQL created by createSelectSql() and returns the statement. - * - * @param Criteria $criteria A Criteria. - * @param PropelPDO $con A PropelPDO connection to use. - * @return PDOStatement The resultset statement. - * @throws PropelException - * @see createSelectSql() - */ - public static function doCount(Criteria $criteria, PropelPDO $con = null) - { - $dbMap = Propel::getDatabaseMap($criteria->getDbName()); - $db = Propel::getDB($criteria->getDbName()); - - if ($con === null) { - $con = Propel::getConnection($criteria->getDbName(), Propel::CONNECTION_READ); - } - - $stmt = null; - - if ($criteria->isUseTransaction()) { - $con->beginTransaction(); - } - - $needsComplexCount = $criteria->getGroupByColumns() - || $criteria->getOffset() - || $criteria->getLimit() - || $criteria->getHaving() - || in_array(Criteria::DISTINCT, $criteria->getSelectModifiers()); - - try { - - $params = array(); - - if ($needsComplexCount) { - if (self::needsSelectAliases($criteria)) { - if ($criteria->getHaving()) { - throw new PropelException('Propel cannot create a COUNT query when using HAVING and duplicate column names in the SELECT part'); - } - self::turnSelectColumnsToAliases($criteria); - } - $selectSql = self::createSelectSql($criteria, $params); - $sql = 'SELECT COUNT(*) FROM (' . $selectSql . ') propelmatch4cnt'; - } else { - // Replace SELECT columns with COUNT(*) - $criteria->clearSelectColumns()->addSelectColumn('COUNT(*)'); - $sql = self::createSelectSql($criteria, $params); - } - - $stmt = $con->prepare($sql); - self::populateStmtValues($stmt, $params, $dbMap, $db); - $stmt->execute(); - - if ($criteria->isUseTransaction()) { - $con->commit(); - } - - } catch (Exception $e) { - if ($stmt !== null) { - $stmt = null; - } - if ($criteria->isUseTransaction()) { - $con->rollBack(); - } - Propel::log($e->getMessage(), Propel::LOG_ERR); - throw new PropelException(sprintf('Unable to execute COUNT statement [%s]', $sql), $e); - } - - return $stmt; - } - - /** - * Populates values in a prepared statement. - * - * This method is designed to work with the createSelectSql() method, which creates - * both the SELECT SQL statement and populates a passed-in array of parameter - * values that should be substituted. - * - * - * $params = array(); - * $sql = BasePeer::createSelectSql($criteria, $params); - * BasePeer::populateStmtValues($stmt, $params, Propel::getDatabaseMap($critera->getDbName()), Propel::getDB($criteria->getDbName())); - * - * - * @param PDOStatement $stmt - * @param array $params array('column' => ..., 'table' => ..., 'value' => ...) - * @param DatabaseMap $dbMap - * @return int The number of params replaced. - * @see createSelectSql() - * @see doSelect() - */ - public static function populateStmtValues(PDOStatement $stmt, array $params, DatabaseMap $dbMap, DBAdapter $db) - { - $i = 1; - foreach ($params as $param) { - $tableName = $param['table']; - $columnName = $param['column']; - $value = $param['value']; - - if (null === $value) { - - $stmt->bindValue(':p'.$i++, null, PDO::PARAM_NULL); - - } elseif (null !== $tableName) { - - $cMap = $dbMap->getTable($tableName)->getColumn($columnName); - $type = $cMap->getType(); - $pdoType = $cMap->getPdoType(); - - // FIXME - This is a temporary hack to get around apparent bugs w/ PDO+MYSQL - // See http://pecl.php.net/bugs/bug.php?id=9919 - if ($pdoType == PDO::PARAM_BOOL && $db instanceof DBMySQL) { - $value = (int) $value; - $pdoType = PDO::PARAM_INT; - } elseif (is_numeric($value) && $cMap->isEpochTemporal()) { // it's a timestamp that needs to be formatted - if ($type == PropelColumnTypes::TIMESTAMP) { - $value = date($db->getTimestampFormatter(), $value); - } else if ($type == PropelColumnTypes::DATE) { - $value = date($db->getDateFormatter(), $value); - } else if ($type == PropelColumnTypes::TIME) { - $value = date($db->getTimeFormatter(), $value); - } - } elseif ($value instanceof DateTime && $cMap->isTemporal()) { // it's a timestamp that needs to be formatted - if ($type == PropelColumnTypes::TIMESTAMP || $type == PropelColumnTypes::BU_TIMESTAMP) { - $value = $value->format($db->getTimestampFormatter()); - } else if ($type == PropelColumnTypes::DATE || $type == PropelColumnTypes::BU_DATE) { - $value = $value->format($db->getDateFormatter()); - } else if ($type == PropelColumnTypes::TIME) { - $value = $value->format($db->getTimeFormatter()); - } - } elseif (is_resource($value) && $cMap->isLob()) { - // we always need to make sure that the stream is rewound, otherwise nothing will - // get written to database. - rewind($value); - } - - $stmt->bindValue(':p'.$i++, $value, $pdoType); - } else { - $stmt->bindValue(':p'.$i++, $value); - } - } // foreach - } - - /** - * Applies any validators that were defined in the schema to the specified columns. - * - * @param string $dbName The name of the database - * @param string $tableName The name of the table - * @param array $columns Array of column names as key and column values as value. - */ - public static function doValidate($dbName, $tableName, $columns) - { - $dbMap = Propel::getDatabaseMap($dbName); - $tableMap = $dbMap->getTable($tableName); - $failureMap = array(); // map of ValidationFailed objects - foreach ($columns as $colName => $colValue) { - if ($tableMap->containsColumn($colName)) { - $col = $tableMap->getColumn($colName); - foreach ($col->getValidators() as $validatorMap) { - $validator = BasePeer::getValidator($validatorMap->getClass()); - if ($validator && ($col->isNotNull() || $colValue !== null) && $validator->isValid($validatorMap, $colValue) === false) { - if (!isset($failureMap[$colName])) { // for now we do one ValidationFailed per column, not per rule - $failureMap[$colName] = new ValidationFailed($colName, $validatorMap->getMessage(), $validator); - } - } - } - } - } - return (!empty($failureMap) ? $failureMap : true); - } - - /** - * Helper method which returns the primary key contained - * in the given Criteria object. - * - * @param Criteria $criteria A Criteria. - * @return ColumnMap If the Criteria object contains a primary - * key, or null if it doesn't. - * @throws PropelException - */ - private static function getPrimaryKey(Criteria $criteria) - { - // Assume all the keys are for the same table. - $keys = $criteria->keys(); - $key = $keys[0]; - $table = $criteria->getTableName($key); - - $pk = null; - - if (!empty($table)) { - - $dbMap = Propel::getDatabaseMap($criteria->getDbName()); - - $pks = $dbMap->getTable($table)->getPrimaryKeys(); - if (!empty($pks)) { - $pk = array_shift($pks); - } - } - return $pk; - } - - /** - * Checks whether the Criteria needs to use column aliasing - * This is implemented in a service class rather than in Criteria itself - * in order to avoid doing the tests when it's not necessary (e.g. for SELECTs) - */ - public static function needsSelectAliases(Criteria $criteria) - { - $columnNames = array(); - foreach ($criteria->getSelectColumns() as $fullyQualifiedColumnName) { - if ($pos = strrpos($fullyQualifiedColumnName, '.')) { - $columnName = substr($fullyQualifiedColumnName, $pos); - if (isset($columnNames[$columnName])) { - // more than one column with the same name, so aliasing is required - return true; - } - $columnNames[$columnName] = true; - } - } - return false; - } - - /** - * Ensures uniqueness of select column names by turning them all into aliases - * This is necessary for queries on more than one table when the tables share a column name - * @see http://propel.phpdb.org/trac/ticket/795 - * - * @param Criteria $criteria - * - * @return Criteria The input, with Select columns replaced by aliases - */ - public static function turnSelectColumnsToAliases(Criteria $criteria) - { - $selectColumns = $criteria->getSelectColumns(); - // clearSelectColumns also clears the aliases, so get them too - $asColumns = $criteria->getAsColumns(); - $criteria->clearSelectColumns(); - $columnAliases = $asColumns; - // add the select columns back - foreach ($selectColumns as $clause) { - // Generate a unique alias - $baseAlias = preg_replace('/\W/', '_', $clause); - $alias = $baseAlias; - // If it already exists, add a unique suffix - $i = 0; - while (isset($columnAliases[$alias])) { - $i++; - $alias = $baseAlias . '_' . $i; - } - // Add it as an alias - $criteria->addAsColumn($alias, $clause); - $columnAliases[$alias] = $clause; - } - // Add the aliases back, don't modify them - foreach ($asColumns as $name => $clause) { - $criteria->addAsColumn($name, $clause); - } - - return $criteria; - } - - /** - * Method to create an SQL query based on values in a Criteria. - * - * This method creates only prepared statement SQL (using ? where values - * will go). The second parameter ($params) stores the values that need - * to be set before the statement is executed. The reason we do it this way - * is to let the PDO layer handle all escaping & value formatting. - * - * @param Criteria $criteria Criteria for the SELECT query. - * @param array &$params Parameters that are to be replaced in prepared statement. - * @return string - * @throws PropelException Trouble creating the query string. - */ - public static function createSelectSql(Criteria $criteria, &$params) - { - $db = Propel::getDB($criteria->getDbName()); - $dbMap = Propel::getDatabaseMap($criteria->getDbName()); - - $fromClause = array(); - $joinClause = array(); - $joinTables = array(); - $whereClause = array(); - $orderByClause = array(); - - $orderBy = $criteria->getOrderByColumns(); - $groupBy = $criteria->getGroupByColumns(); - $ignoreCase = $criteria->isIgnoreCase(); - - // get the first part of the SQL statement, the SELECT part - $selectSql = self::createSelectSqlPart($criteria, $fromClause); - - // add the criteria to WHERE clause - // this will also add the table names to the FROM clause if they are not already - // included via a LEFT JOIN - foreach ($criteria->keys() as $key) { - - $criterion = $criteria->getCriterion($key); - $table = null; - foreach ($criterion->getAttachedCriterion() as $attachedCriterion) { - $tableName = $attachedCriterion->getTable(); - - $table = $criteria->getTableForAlias($tableName); - if ($table !== null) { - $fromClause[] = $table . ' ' . $tableName; - } else { - $fromClause[] = $tableName; - $table = $tableName; - } - - if (($criteria->isIgnoreCase() || $attachedCriterion->isIgnoreCase()) - && $dbMap->getTable($table)->getColumn($attachedCriterion->getColumn())->isText()) { - $attachedCriterion->setIgnoreCase(true); - } - } - - $criterion->setDB($db); - - $sb = ''; - $criterion->appendPsTo($sb, $params); - $whereClause[] = $sb; - } - - // Handle joins - // joins with a null join type will be added to the FROM clause and the condition added to the WHERE clause. - // joins of a specified type: the LEFT side will be added to the fromClause and the RIGHT to the joinClause - foreach ($criteria->getJoins() as $join) { - // The join might have been established using an alias name - $leftTable = $join->getLeftTableName(); - if ($realTable = $criteria->getTableForAlias($leftTable)) { - $leftTableForFrom = $realTable . ' ' . $leftTable; - $leftTable = $realTable; - } else { - $leftTableForFrom = $leftTable; - } - - $rightTable = $join->getRightTableName(); - if ($realTable = $criteria->getTableForAlias($rightTable)) { - $rightTableForFrom = $realTable . ' ' . $rightTable; - $rightTable = $realTable; - } else { - $rightTableForFrom = $rightTable; - } - - // determine if casing is relevant. - if ($ignoreCase = $criteria->isIgnoreCase()) { - $leftColType = $dbMap->getTable($leftTable)->getColumn($join->getLeftColumnName())->getType(); - $rightColType = $dbMap->getTable($rightTable)->getColumn($join->getRightColumnName())->getType(); - $ignoreCase = ($leftColType == 'string' || $rightColType == 'string'); - } - - // build the condition - $condition = ''; - foreach ($join->getConditions() as $index => $conditionDesc) { - if ($ignoreCase) { - $condition .= $db->ignoreCase($conditionDesc['left']) . $conditionDesc['operator'] . $db->ignoreCase($conditionDesc['right']); - } else { - $condition .= implode($conditionDesc); - } - if ($index + 1 < $join->countConditions()) { - $condition .= ' AND '; - } - } - - // add 'em to the queues.. - if ($joinType = $join->getJoinType()) { - // real join - if (!$fromClause) { - $fromClause[] = $leftTableForFrom; - } - $joinTables[] = $rightTableForFrom; - $joinClause[] = $join->getJoinType() . ' ' . $rightTableForFrom . " ON ($condition)"; - } else { - // implicit join, translates to a where - $fromClause[] = $leftTableForFrom; - $fromClause[] = $rightTableForFrom; - $whereClause[] = $condition; - } - } - - // Unique from clause elements - $fromClause = array_unique($fromClause); - $fromClause = array_diff($fromClause, array('')); - - // tables should not exist in both the from and join clauses - if ($joinTables && $fromClause) { - foreach ($fromClause as $fi => $ftable) { - if (in_array($ftable, $joinTables)) { - unset($fromClause[$fi]); - } - } - } - - // Add the GROUP BY columns - $groupByClause = $groupBy; - - $having = $criteria->getHaving(); - $havingString = null; - if ($having !== null) { - $sb = ''; - $having->appendPsTo($sb, $params); - $havingString = $sb; - } - - if (!empty($orderBy)) { - - foreach ($orderBy as $orderByColumn) { - - // Add function expression as-is. - - if (strpos($orderByColumn, '(') !== false) { - $orderByClause[] = $orderByColumn; - continue; - } - - // Split orderByColumn (i.e. "table.column DESC") - - $dotPos = strrpos($orderByColumn, '.'); - - if ($dotPos !== false) { - $tableName = substr($orderByColumn, 0, $dotPos); - $columnName = substr($orderByColumn, $dotPos + 1); - } else { - $tableName = ''; - $columnName = $orderByColumn; - } - - $spacePos = strpos($columnName, ' '); - - if ($spacePos !== false) { - $direction = substr($columnName, $spacePos); - $columnName = substr($columnName, 0, $spacePos); - } else { - $direction = ''; - } - - $tableAlias = $tableName; - if ($aliasTableName = $criteria->getTableForAlias($tableName)) { - $tableName = $aliasTableName; - } - - $columnAlias = $columnName; - if ($asColumnName = $criteria->getColumnForAs($columnName)) { - $columnName = $asColumnName; - } - - $column = $tableName ? $dbMap->getTable($tableName)->getColumn($columnName) : null; - - if ($criteria->isIgnoreCase() && $column && $column->isText()) { - $ignoreCaseColumn = $db->ignoreCaseInOrderBy("$tableAlias.$columnAlias"); - $orderByClause[] = $ignoreCaseColumn . $direction; - $selectSql .= ', ' . $ignoreCaseColumn; - } else { - $orderByClause[] = $orderByColumn; - } - } - } - - if (empty($fromClause) && $criteria->getPrimaryTableName()) { - $fromClause[] = $criteria->getPrimaryTableName(); - } - - // from / join tables quoted if it is necessary - if ($db->useQuoteIdentifier()) { - $fromClause = array_map(array($db, 'quoteIdentifierTable'), $fromClause); - $joinClause = $joinClause ? $joinClause : array_map(array($db, 'quoteIdentifierTable'), $joinClause); - } - - // build from-clause - $from = ''; - if (!empty($joinClause) && count($fromClause) > 1) { - $from .= implode(" CROSS JOIN ", $fromClause); - } else { - $from .= implode(", ", $fromClause); - } - - $from .= $joinClause ? ' ' . implode(' ', $joinClause) : ''; - - // Build the SQL from the arrays we compiled - $sql = $selectSql - ." FROM " . $from - .($whereClause ? " WHERE ".implode(" AND ", $whereClause) : "") - .($groupByClause ? " GROUP BY ".implode(",", $groupByClause) : "") - .($havingString ? " HAVING ".$havingString : "") - .($orderByClause ? " ORDER BY ".implode(",", $orderByClause) : ""); - - // APPLY OFFSET & LIMIT to the query. - if ($criteria->getLimit() || $criteria->getOffset()) { - $db->applyLimit($sql, $criteria->getOffset(), $criteria->getLimit(), $criteria); - } - - return $sql; - } - - /** - * Builds the SELECT part of a SQL statement based on a Criteria - * taking into account select columns and 'as' columns (i.e. columns aliases) - */ - public static function createSelectSqlPart(Criteria $criteria, &$fromClause, $aliasAll = false) - { - $selectClause = array(); - - if ($aliasAll) { - self::turnSelectColumnsToAliases($criteria); - // no select columns after that, they are all aliases - } else { - foreach ($criteria->getSelectColumns() as $columnName) { - - // expect every column to be of "table.column" formation - // it could be a function: e.g. MAX(books.price) - - $tableName = null; - - $selectClause[] = $columnName; // the full column name: e.g. MAX(books.price) - - $parenPos = strrpos($columnName, '('); - $dotPos = strrpos($columnName, '.', ($parenPos !== false ? $parenPos : 0)); - - if ($dotPos !== false) { - if ($parenPos === false) { // table.column - $tableName = substr($columnName, 0, $dotPos); - } else { // FUNC(table.column) - // functions may contain qualifiers so only take the last - // word as the table name. - // COUNT(DISTINCT books.price) - $lastSpace = strpos($tableName, ' '); - if ($lastSpace !== false) { // COUNT(DISTINCT books.price) - $tableName = substr($tableName, $lastSpace + 1); - } else { - $tableName = substr($columnName, $parenPos + 1, $dotPos - ($parenPos + 1)); - } - } - // is it a table alias? - $tableName2 = $criteria->getTableForAlias($tableName); - if ($tableName2 !== null) { - $fromClause[] = $tableName2 . ' ' . $tableName; - } else { - $fromClause[] = $tableName; - } - } // if $dotPost !== false - } - } - - // set the aliases - foreach ($criteria->getAsColumns() as $alias => $col) { - $selectClause[] = $col . ' AS ' . $alias; - } - - $selectModifiers = $criteria->getSelectModifiers(); - $queryComment = $criteria->getComment(); - - // Build the SQL from the arrays we compiled - $sql = "SELECT " - . ($queryComment ? '/* ' . $queryComment . ' */ ' : '') - . ($selectModifiers ? (implode(' ', $selectModifiers) . ' ') : '') - . implode(", ", $selectClause); - - return $sql; - } - - /** - * Builds a params array, like the kind populated by Criterion::appendPsTo(). - * This is useful for building an array even when it is not using the appendPsTo() method. - * @param array $columns - * @param Criteria $values - * @return array params array('column' => ..., 'table' => ..., 'value' => ...) - */ - private static function buildParams($columns, Criteria $values) - { - $params = array(); - foreach ($columns as $key) { - if ($values->containsKey($key)) { - $crit = $values->getCriterion($key); - $params[] = array('column' => $crit->getColumn(), 'table' => $crit->getTable(), 'value' => $crit->getValue()); - } - } - return $params; - } - - /** - * This function searches for the given validator $name under propel/validator/$name.php, - * imports and caches it. - * - * @param string $classname The dot-path name of class (e.g. myapp.propel.MyValidator) - * @return Validator object or null if not able to instantiate validator class (and error will be logged in this case) - */ - public static function getValidator($classname) - { - try { - $v = isset(self::$validatorMap[$classname]) ? self::$validatorMap[$classname] : null; - if ($v === null) { - $cls = Propel::importClass($classname); - $v = new $cls(); - self::$validatorMap[$classname] = $v; - } - return $v; - } catch (Exception $e) { - Propel::log("BasePeer::getValidator(): failed trying to instantiate " . $classname . ": ".$e->getMessage(), Propel::LOG_ERR); - } - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/util/NodePeer.php b/airtime_mvc/library/propel/runtime/lib/util/NodePeer.php deleted file mode 100644 index d40b7642aa..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/util/NodePeer.php +++ /dev/null @@ -1,369 +0,0 @@ - (Propel) - * @version $Revision: 1612 $ - * @package propel.runtime.util - */ -interface NodePeer -{ - /** - * Creates the supplied node as the root node. - * - * @param object $node Propel object for model - * @return object Inserted propel object for model - */ - public static function createRoot(NodeObject $node); - - /** - * Returns the root node for a given scope id - * - * @param int $scopeId Scope id to determine which root node to return - * @param PropelPDO $con Connection to use. - * @return object Propel object for root node - */ - public static function retrieveRoot($scopeId = 1, PropelPDO $con = null); - - /** - * Inserts $child as first child of destination node $parent - * - * @param object $child Propel object for child node - * @param object $parent Propel object for parent node - * @param PropelPDO $con Connection to use. - * @return void - */ - public static function insertAsFirstChildOf(NodeObject $child, NodeObject $parent, PropelPDO $con = null); - - /** - * Inserts $child as last child of destination node $parent - * - * @param object $child Propel object for child node - * @param object $parent Propel object for parent node - * @param PropelPDO $con Connection to use. - * @return void - */ - public static function insertAsLastChildOf(NodeObject $child, NodeObject $parent, PropelPDO $con = null); - - /** - * Inserts $sibling as previous sibling to destination node $node - * - * @param object $node Propel object for destination node - * @param object $sibling Propel object for source node - * @param PropelPDO $con Connection to use. - * @return void - */ - public static function insertAsPrevSiblingOf(NodeObject $node, NodeObject $sibling, PropelPDO $con = null); - - /** - * Inserts $sibling as next sibling to destination node $node - * - * @param object $node Propel object for destination node - * @param object $sibling Propel object for source node - * @param PropelPDO $con Connection to use. - * @return void - */ - public static function insertAsNextSiblingOf(NodeObject $node, NodeObject $sibling, PropelPDO $con = null); - - /** - * Inserts $parent as parent of given $node. - * - * @param object $parent Propel object for given parent node - * @param object $node Propel object for given destination node - * @param PropelPDO $con Connection to use. - * @return void - * @throws Exception When trying to insert node as parent of a root node - */ - public static function insertAsParentOf(NodeObject $parent, NodeObject $node, PropelPDO $con = null); - - /** - * Inserts $node as root node - * - * @param object $node Propel object as root node - * @param PropelPDO $con Connection to use. - * @return void - */ - public static function insertRoot(NodeObject $node, PropelPDO $con = null); - - /** - * Delete root node - * - * @param int $scopeId Scope id to determine which root node to delete - * @param PropelPDO $con Connection to use. - * @return boolean Deletion status - */ - public static function deleteRoot($scopeId = 1, PropelPDO $con = null); - - /** - * Delete $dest node - * - * @param object $dest Propel object node to delete - * @param PropelPDO $con Connection to use. - * @return boolean Deletion status - */ - public static function deleteNode(NodeObject $dest, PropelPDO $con = null); - - /** - * Moves $child to be first child of $parent - * - * @param object $parent Propel object for parent node - * @param object $child Propel object for child node - * @param PropelPDO $con Connection to use. - * @return void - */ - public static function moveToFirstChildOf(NodeObject $parent, NodeObject $child, PropelPDO $con = null); - - /** - * Moves $node to be last child of $dest - * - * @param object $dest Propel object for destination node - * @param object $node Propel object for source node - * @param PropelPDO $con Connection to use. - * @return void - */ - public static function moveToLastChildOf(NodeObject $dest, NodeObject $node, PropelPDO $con = null); - - /** - * Moves $node to be prev sibling to $dest - * - * @param object $dest Propel object for destination node - * @param object $node Propel object for source node - * @param PropelPDO $con Connection to use. - * @return void - */ - public static function moveToPrevSiblingOf(NodeObject $dest, NodeObject $node, PropelPDO $con = null); - - /** - * Moves $node to be next sibling to $dest - * - * @param object $dest Propel object for destination node - * @param object $node Propel object for source node - * @param PropelPDO $con Connection to use. - * @return void - */ - public static function moveToNextSiblingOf(NodeObject $dest, NodeObject $node, PropelPDO $con = null); - - /** - * Gets first child for the given node if it exists - * - * @param object $node Propel object for src node - * @param PropelPDO $con Connection to use. - * @return mixed Propel object if exists else false - */ - public static function retrieveFirstChild(NodeObject $node, PropelPDO $con = null); - - /** - * Gets last child for the given node if it exists - * - * @param object $node Propel object for src node - * @param PropelPDO $con Connection to use. - * @return mixed Propel object if exists else false - */ - public static function retrieveLastChild(NodeObject $node, PropelPDO $con = null); - - /** - * Gets prev sibling for the given node if it exists - * - * @param object $node Propel object for src node - * @param PropelPDO $con Connection to use. - * @return mixed Propel object if exists else false - */ - public static function retrievePrevSibling(NodeObject $node, PropelPDO $con = null); - - /** - * Gets next sibling for the given node if it exists - * - * @param object $node Propel object for src node - * @param PropelPDO $con Connection to use. - * @return mixed Propel object if exists else false - */ - public static function retrieveNextSibling(NodeObject $node, PropelPDO $con = null); - - /** - * Retrieves the entire tree from root - * - * @param int $scopeId Scope id to determine which scope tree to return - * @param PropelPDO $con Connection to use. - */ - public static function retrieveTree($scopeId = 1, PropelPDO $con = null); - - /** - * Retrieves the entire tree from parent $node - * - * @param PropelPDO $con Connection to use. - */ - public static function retrieveBranch(NodeObject $node, PropelPDO $con = null); - - /** - * Gets direct children for the node - * - * @param object $node Propel object for parent node - * @param PropelPDO $con Connection to use. - */ - public static function retrieveChildren(NodeObject $node, PropelPDO $con = null); - - /** - * Gets all descendants for the node - * - * @param object $node Propel object for parent node - * @param PropelPDO $con Connection to use. - */ - public static function retrieveDescendants(NodeObject $node, PropelPDO $con = null); - - /** - * Gets all siblings for the node - * - * @param object $node Propel object for src node - * @param PropelPDO $con Connection to use. - */ - public static function retrieveSiblings(NodeObject $node, PropelPDO $con = null); - - /** - * Gets ancestor for the given node if it exists - * - * @param object $node Propel object for src node - * @param PropelPDO $con Connection to use. - * @return mixed Propel object if exists else false - */ - public static function retrieveParent(NodeObject $node, PropelPDO $con = null); - - /** - * Gets level for the given node - * - * @param object $node Propel object for src node - * @param PropelPDO $con Connection to use. - * @return int Level for the given node - */ - public static function getLevel(NodeObject $node, PropelPDO $con = null); - - /** - * Gets number of direct children for given node - * - * @param object $node Propel object for src node - * @param PropelPDO $con Connection to use. - * @return int Level for the given node - */ - public static function getNumberOfChildren(NodeObject $node, PropelPDO $con = null); - - /** - * Gets number of descendants for given node - * - * @param object $node Propel object for src node - * @param PropelPDO $con Connection to use. - * @return int Level for the given node - */ - public static function getNumberOfDescendants(NodeObject $node, PropelPDO $con = null); - - /** - * Returns path to a specific node as an array, useful to create breadcrumbs - * - * @param object $node Propel object of node to create path to - * @param PropelPDO $con Connection to use. - * @return array Array in order of heirarchy - */ - public static function getPath(NodeObject $node, PropelPDO $con = null); - - /** - * Tests if node is valid - * - * @param object $node Propel object for src node - * @return bool - */ - public static function isValid(NodeObject $node = null); - - /** - * Tests if node is a root - * - * @param object $node Propel object for src node - * @return bool - */ - public static function isRoot(NodeObject $node); - - /** - * Tests if node is a leaf - * - * @param object $node Propel object for src node - * @return bool - */ - public static function isLeaf(NodeObject $node); - - /** - * Tests if $child is a child of $parent - * - * @param object $child Propel object for node - * @param object $parent Propel object for node - * @return bool - */ - public static function isChildOf(NodeObject $child, NodeObject $parent); - - /** - * Tests if $node1 is equal to $node2 - * - * @param object $node1 Propel object for node - * @param object $node2 Propel object for node - * @return bool - */ - public static function isEqualTo(NodeObject $node1, NodeObject $node2); - - /** - * Tests if $node has an ancestor - * - * @param object $node Propel object for node - * @param PropelPDO $con Connection to use. - * @return bool - */ - public static function hasParent(NodeObject $node, PropelPDO $con = null); - - /** - * Tests if $node has prev sibling - * - * @param object $node Propel object for node - * @param PropelPDO $con Connection to use. - * @return bool - */ - public static function hasPrevSibling(NodeObject $node, PropelPDO $con = null); - - /** - * Tests if $node has next sibling - * - * @param object $node Propel object for node - * @param PropelPDO $con Connection to use. - * @return bool - */ - public static function hasNextSibling(NodeObject $node, PropelPDO $con = null); - - /** - * Tests if $node has children - * - * @param object $node Propel object for node - * @return bool - */ - public static function hasChildren(NodeObject $node); - - /** - * Deletes $node and all of its descendants - * - * @param object $node Propel object for source node - * @param PropelPDO $con Connection to use. - */ - public static function deleteDescendants(NodeObject $node, PropelPDO $con = null); - - /** - * Returns a node given its primary key or the node itself - * - * @param int/object $node Primary key/instance of required node - * @param PropelPDO $con Connection to use. - * @return object Propel object for model - */ - public static function getNode($node, PropelPDO $con = null); - -} // NodePeer diff --git a/airtime_mvc/library/propel/runtime/lib/util/PropelAutoloader.php b/airtime_mvc/library/propel/runtime/lib/util/PropelAutoloader.php deleted file mode 100644 index 1bba65cec9..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/util/PropelAutoloader.php +++ /dev/null @@ -1,113 +0,0 @@ - $classPath - */ - public function addClassPaths($classMap) - { - $this->classes = array_merge($this->classes, $classMap); - } - - /** - * Sets the path for a particular class. - * - * @param string $class A PHP class name - * @param string $path A path (absolute or relative to the include path) - */ - public function addClassPath($class, $path) - { - $this->classes[$class] = $path; - } - - /** - * Returns the path where a particular class can be found. - * - * @param string $class A PHP class name - * - * @return string|null A path (absolute or relative to the include path) - */ - public function getClassPath($class) - { - return isset($this->classes[$class]) ? $this->classes[$class] : null; - } - - /** - * Handles autoloading of classes that have been registered in this instance - * - * @param string $class A class name. - * - * @return boolean Returns true if the class has been loaded - */ - public function autoload($class) - { - if (isset($this->classes[$class])) { - require $this->classes[$class]; - return true; - } - return false; - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/util/PropelColumnTypes.php b/airtime_mvc/library/propel/runtime/lib/util/PropelColumnTypes.php deleted file mode 100644 index e23c6f3506..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/util/PropelColumnTypes.php +++ /dev/null @@ -1,88 +0,0 @@ - (Propel) - * @version $Revision: 1612 $ - * @package propel.runtime.util - */ -class PropelColumnTypes -{ - - const - CHAR = "CHAR", - VARCHAR = "VARCHAR", - LONGVARCHAR = "LONGVARCHAR", - CLOB = "CLOB", - CLOB_EMU = "CLOB_EMU", - NUMERIC = "NUMERIC", - DECIMAL = "DECIMAL", - TINYINT = "TINYINT", - SMALLINT = "SMALLINT", - INTEGER = "INTEGER", - BIGINT = "BIGINT", - REAL = "REAL", - FLOAT = "FLOAT", - DOUBLE = "DOUBLE", - BINARY = "BINARY", - VARBINARY = "VARBINARY", - LONGVARBINARY = "LONGVARBINARY", - BLOB = "BLOB", - DATE = "DATE", - TIME = "TIME", - TIMESTAMP = "TIMESTAMP", - BU_DATE = "BU_DATE", - BU_TIMESTAMP = "BU_TIMESTAMP", - BOOLEAN = "BOOLEAN", - BOOLEAN_EMU = "BOOLEAN_EMU"; - - private static $propelToPdoMap = array( - self::CHAR => PDO::PARAM_STR, - self::VARCHAR => PDO::PARAM_STR, - self::LONGVARCHAR => PDO::PARAM_STR, - self::CLOB => PDO::PARAM_LOB, - self::CLOB_EMU => PDO::PARAM_STR, - self::NUMERIC => PDO::PARAM_STR, - self::DECIMAL => PDO::PARAM_STR, - self::TINYINT => PDO::PARAM_INT, - self::SMALLINT => PDO::PARAM_INT, - self::INTEGER => PDO::PARAM_INT, - self::BIGINT => PDO::PARAM_STR, - self::REAL => PDO::PARAM_STR, - self::FLOAT => PDO::PARAM_STR, - self::DOUBLE => PDO::PARAM_STR, - self::BINARY => PDO::PARAM_STR, - self::VARBINARY => PDO::PARAM_STR, - self::LONGVARBINARY => PDO::PARAM_STR, - self::BLOB => PDO::PARAM_LOB, - self::DATE => PDO::PARAM_STR, - self::TIME => PDO::PARAM_STR, - self::TIMESTAMP => PDO::PARAM_STR, - self::BU_DATE => PDO::PARAM_STR, - self::BU_TIMESTAMP => PDO::PARAM_STR, - self::BOOLEAN => PDO::PARAM_BOOL, - self::BOOLEAN_EMU => PDO::PARAM_INT, - ); - - /** - * Resturns the PDO type (PDO::PARAM_* constant) value for the Propel type provided. - * @param string $propelType - * @return int - */ - public static function getPdoType($propelType) - { - return self::$propelToPdoMap[$propelType]; - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/util/PropelConditionalProxy.php b/airtime_mvc/library/propel/runtime/lib/util/PropelConditionalProxy.php deleted file mode 100644 index e153760fed..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/util/PropelConditionalProxy.php +++ /dev/null @@ -1,71 +0,0 @@ - - * $c->_if(true) // returns $c - * ->doStuff() // executed - * ->_else() // returns a PropelConditionalProxy instance - * ->doOtherStuff() // not executed - * ->_endif(); // returns $c - * $c->_if(false) // returns a PropelConditionalProxy instance - * ->doStuff() // not executed - * ->_else() // returns $c - * ->doOtherStuff() // executed - * ->_endif(); // returns $c - * @see Criteria - * - * @author Francois Zaninotto - * @version $Revision: 1612 $ - * @package propel.runtime.util - */ -class PropelConditionalProxy -{ - protected $mainObject; - - public function __construct($mainObject) - { - $this->mainObject = $mainObject; - } - - public function _if() - { - throw new PropelException('_if() statements cannot be nested'); - } - - public function _elseif($cond) - { - if($cond) { - return $this->mainObject; - } else { - return $this; - } - } - - public function _else() - { - return $this->mainObject; - } - - public function _endif() - { - return $this->mainObject; - } - - public function __call($name, $arguments) - { - return $this; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/runtime/lib/util/PropelDateTime.php b/airtime_mvc/library/propel/runtime/lib/util/PropelDateTime.php deleted file mode 100644 index cfa1276dd1..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/util/PropelDateTime.php +++ /dev/null @@ -1,76 +0,0 @@ -dateString = $this->format('Y-m-d H:i:s'); - $this->tzString = $this->getTimeZone()->getName(); - return array('dateString', 'tzString'); - } - - /** - * PHP "magic" function called when object is restored from serialized state. - * Calls DateTime constructor with previously stored string value of date. - */ - function __wakeup() - { - parent::__construct($this->dateString, new DateTimeZone($this->tzString)); - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/util/PropelModelPager.php b/airtime_mvc/library/propel/runtime/lib/util/PropelModelPager.php deleted file mode 100644 index 5236ebbd56..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/util/PropelModelPager.php +++ /dev/null @@ -1,349 +0,0 @@ - - * @author François Zaninotto - * @version $Revision: 1665 $ - * @package propel.runtime.query - */ -class PropelModelPager implements IteratorAggregate, Countable -{ - protected - $query = null, - $page = 1, - $maxPerPage = 10, - $lastPage = 1, - $nbResults = 0, - $objects = null, - $parameters = array(), - $currentMaxLink = 1, - $parameterHolder = null, - $maxRecordLimit = false, - $results = null, - $resultsCounter = 0; - - public function __construct(Criteria $query, $maxPerPage = 10) - { - $this->setQuery($query); - $this->setMaxPerPage($maxPerPage); - } - - public function setQuery(Criteria $query) - { - $this->query = $query; - } - - public function getQuery() - { - return $this->query; - } - - public function init() - { - $hasMaxRecordLimit = ($this->getMaxRecordLimit() !== false); - $maxRecordLimit = $this->getMaxRecordLimit(); - - $qForCount = clone $this->getQuery(); - $count = $qForCount - ->offset(0) - ->limit(0) - ->count(); - - $this->setNbResults($hasMaxRecordLimit ? min($count, $maxRecordLimit) : $count); - - $q = $this->getQuery() - ->offset(0) - ->limit(0); - - if (($this->getPage() == 0 || $this->getMaxPerPage() == 0)) { - $this->setLastPage(0); - } else { - $this->setLastPage(ceil($this->getNbResults() / $this->getMaxPerPage())); - - $offset = ($this->getPage() - 1) * $this->getMaxPerPage(); - $q->offset($offset); - - if ($hasMaxRecordLimit) { - $maxRecordLimit = $maxRecordLimit - $offset; - if ($maxRecordLimit > $this->getMaxPerPage()) { - $q->limit($this->getMaxPerPage()); - } else { - $q->limit($maxRecordLimit); - } - } else { - $q->limit($this->getMaxPerPage()); - } - } - } - - /** - * Get the collection of results in the page - * - * @return PropelObjectCollection A collection of results - */ - public function getResults() - { - if (null === $this->results) { - $this->results = $this->getQuery() - ->setFormatter(ModelCriteria::FORMAT_OBJECT) - ->find(); - } - return $this->results; - } - - public function getCurrentMaxLink() - { - return $this->currentMaxLink; - } - - public function getMaxRecordLimit() - { - return $this->maxRecordLimit; - } - - public function setMaxRecordLimit($limit) - { - $this->maxRecordLimit = $limit; - } - - public function getLinks($nb_links = 5) - { - $links = array(); - $tmp = $this->page - floor($nb_links / 2); - $check = $this->lastPage - $nb_links + 1; - $limit = ($check > 0) ? $check : 1; - $begin = ($tmp > 0) ? (($tmp > $limit) ? $limit : $tmp) : 1; - - $i = (int) $begin; - while (($i < $begin + $nb_links) && ($i <= $this->lastPage)) { - $links[] = $i++; - } - - $this->currentMaxLink = count($links) ? $links[count($links) - 1] : 1; - - return $links; - } - - /** - * Test whether the number of results exceeds the max number of results per page - * - * @return boolean true if the pager displays only a subset of the results - */ - public function haveToPaginate() - { - return (($this->getMaxPerPage() != 0) && ($this->getNbResults() > $this->getMaxPerPage())); - } - - /** - * Get the index of the first element in the page - * Returns 1 on the first page, $maxPerPage +1 on the second page, etc - * - * @return int - */ - public function getFirstIndex() - { - if ($this->page == 0) { - return 1; - } else { - return ($this->page - 1) * $this->maxPerPage + 1; - } - } - - /** - * Get the index of the last element in the page - * Always less than or eaqual to $maxPerPage - * - * @return int - */ - public function getLastIndex() - { - if ($this->page == 0) { - return $this->nbResults; - } else { - if (($this->page * $this->maxPerPage) >= $this->nbResults) { - return $this->nbResults; - } else { - return ($this->page * $this->maxPerPage); - } - } - } - - /** - * Get the total number of results of the query - * This can be greater than $maxPerPage - * - * @return int - */ - public function getNbResults() - { - return $this->nbResults; - } - - /** - * Set the total number of results of the query - * - * @param int $nb - */ - protected function setNbResults($nb) - { - $this->nbResults = $nb; - } - - /** - * Check whether the current page is the first page - * - * @return boolean true if the current page is the first page - */ - public function isFirstPage() - { - return $this->getPage() == $this->getFirstPage(); - } - - /** - * Get the number of the first page - * - * @return int Always 1 - */ - public function getFirstPage() - { - return 1; - } - - /** - * Check whether the current page is the last page - * - * @return boolean true if the current page is the last page - */ - public function isLastPage() - { - return $this->getPage() == $this->getLastPage(); - } - - /** - * Get the number of the last page - * - * @return int - */ - public function getLastPage() - { - return $this->lastPage; - } - - /** - * Set the number of the first page - * - * @param int $page - */ - protected function setLastPage($page) - { - $this->lastPage = $page; - if ($this->getPage() > $page) { - $this->setPage($page); - } - } - - /** - * Get the number of the current page - * - * @return int - */ - public function getPage() - { - return $this->page; - } - - /** - * Set the number of the current page - * - * @param int $page - */ - public function setPage($page) - { - $this->page = intval($page); - if ($this->page <= 0) { - // set first page, which depends on a maximum set - $this->page = $this->getMaxPerPage() ? 1 : 0; - } - } - - /** - * Get the number of the next page - * - * @return int - */ - public function getNextPage() - { - return min($this->getPage() + 1, $this->getLastPage()); - } - - /** - * Get the number of the previous page - * - * @return int - */ - public function getPreviousPage() - { - return max($this->getPage() - 1, $this->getFirstPage()); - } - - /** - * Get the maximum number results per page - * - * @return int - */ - public function getMaxPerPage() - { - return $this->maxPerPage; - } - - /** - * Set the maximum number results per page - * - * @param int $max - */ - public function setMaxPerPage($max) - { - if ($max > 0) { - $this->maxPerPage = $max; - if ($this->page == 0) { - $this->page = 1; - } - } else if ($max == 0) { - $this->maxPerPage = 0; - $this->page = 0; - } else { - $this->maxPerPage = 1; - if ($this->page == 0) { - $this->page = 1; - } - } - } - - public function getIterator() - { - return $this->getResults()->getIterator(); - } - - /** - * Returns the total number of results. - * - * @see Countable - * @return int - */ - public function count() - { - return $this->getNbResults(); - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/util/PropelPager.php b/airtime_mvc/library/propel/runtime/lib/util/PropelPager.php deleted file mode 100644 index 8fefdbc0ae..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/util/PropelPager.php +++ /dev/null @@ -1,597 +0,0 @@ -addDescendingOrderByColumn(poemPeer::SID); - * - * // with join - * $pager = new PropelPager($c, 'poemPeer', 'doSelectJoinPoemUsers', 1, 50); - * - * // without Join - * - * $pager = new PropelPager($c, 'poemPeer', 'doSelect', 1, 50); - * - * Some template: - * - *

- * Total Pages: getTotalPages()?> Total Records: getTotalRecordCount()?> - *

- * - * - * - * - * - * - * - * - * - * - *
- * getFirstPage):?> - * | - * - * - * getPrev()):?> - * Previous| - * - * - * getPrevLinks() as $link):?> - * | - * - * getPage()?> - * getNextLinks() as $link):?> - * | - * - * - * getNext()):?> - * Last| - * - * - * getLastPage()):?> - * | - * - *
- * - * - * - * - * - * - * - * getResult() as $poem):?> - * - * - * - * - * - * - * - *
TitleAuteurDatecomments
getTitle()?>getPoemUsers()->getUname()?>getTime()?>getComments()?>
- * - * - * @author Rob Halff - * @author Niklas Närhinen - * @version $Revision: 1612 $ - * @copyright Copyright (c) 2004 Rob Halff: LGPL - See LICENCE - * @package propel.runtime.util - */ -class PropelPager implements Countable, Iterator -{ - - private $recordCount; - private $pages; - private $peerClass; - private $peerSelectMethod; - private $peerCountMethod; - private $criteria; - private $countCriteria; - private $page; - private $rs = null; - - //Iterator vars - private $currentKey = 0; - - /** @var int Start row (offset) */ - protected $start = 0; - - /** @var int Max rows to return (0 means all) */ - protected $max = 0; - - /** - * Create a new Propel Pager. - * @param Criteria $c - * @param string $peerClass The name of the static Peer class. - * @param string $peerSelectMethod The name of the static method for selecting content from the Peer class. - * @param int $page The current page (1-based). - * @param int $rowsPerPage The number of rows that should be displayed per page. - */ - public function __construct($c = null, $peerClass = null, $peerSelectMethod = null, $page = 1, $rowsPerPage = 25) - { - if (!isset($c)) { - $c = new Criteria(); - } - $this->setCriteria($c); - $this->setPeerClass($peerClass); - $this->setPeerSelectMethod($peerSelectMethod); - $this->guessPeerCountMethod(); - $this->setPage($page); - $this->setRowsPerPage($rowsPerPage); - } - - /** - * Set the criteria for this pager. - * @param Criteria $c - * @return void - */ - public function setCriteria(Criteria $c) - { - $this->criteria = $c; - } - - /** - * Return the Criteria object for this pager. - * @return Criteria - */ - public function getCriteria() - { - return $this->criteria; - } - - /** - * Set the Peer Classname - * - * @param string $class - * @return void - */ - public function setPeerClass($class) - { - $this->peerClass = $class; - } - - /** - * Return the Peer Classname. - * @return string - */ - public function getPeerClass() - { - return $this->peerClass; - } - - /** - * Set the Peer select method. - * This exists for legacy support, please use setPeerSelectMethod(). - * @param string $method The name of the static method to call on the Peer class. - * @return void - * @see setPeerSelectMethod() - * @deprecated - */ - public function setPeerMethod($method) - { - $this->setPeerSelectMethod($method); - } - - /** - * Return the Peer select method. - * This exists for legacy support, please use getPeerSelectMethod(). - * @return string - * @see getPeerSelectMethod() - * @deprecated - */ - public function getPeerMethod() - { - return $this->getPeerSelectMethod(); - } - - /** - * Set the Peer select method. - * - * @param string $method The name of the static method to call on the Peer class. - * @return void - */ - public function setPeerSelectMethod($method) - { - $this->peerSelectMethod = $method; - } - - /** - * Return the Peer select method. - * @return string - */ - public function getPeerSelectMethod() - { - return $this->peerSelectMethod; - } - - /** - * Sets the Count method. - * This is set based on the Peer method, for example if Peer method is doSelectJoin*() then the - * count method will be doCountJoin*(). - * @param string $method The name of the static method to call on the Peer class. - */ - public function setPeerCountMethod($method) - { - $this->peerCountMethod = $method; - } - - /** - * Return the Peer count method. - */ - public function getPeerCountMethod() - { - return $this->peerCountMethod; - } - - /** - * Guesses the Peer count method based on the select method. - */ - private function guessPeerCountMethod() - { - $selectMethod = $this->getPeerSelectMethod(); - if ($selectMethod == 'doSelect') { - $countMethod = 'doCount'; - } elseif ( ($pos = stripos($selectMethod, 'doSelectJoin')) === 0) { - $countMethod = 'doCount' . substr($selectMethod, strlen('doSelect')); - } else { - // we will fall back to doCount() if we don't understand the join - // method; however, it probably won't be accurate. Maybe triggering an error would - // be appropriate ... - $countMethod = 'doCount'; - } - $this->setPeerCountMethod($countMethod); - } - - /** - * Get the paged resultset - * - * @return mixed $rs - */ - public function getResult() - { - if (!isset($this->rs)) { - $this->doRs(); - } - - return $this->rs; - } - - /** - * Get the paged resultset - * - * Main method which creates a paged result set based on the criteria - * and the requested peer select method. - * - */ - private function doRs() - { - $this->criteria->setOffset($this->start); - $this->criteria->setLimit($this->max); - $this->rs = call_user_func(array($this->getPeerClass(), $this->getPeerSelectMethod()), $this->criteria); - } - - /** - * Get the first page - * - * For now I can only think of returning 1 always. - * It should probably return 0 if there are no pages - * - * @return int 1 - */ - public function getFirstPage() - { - return '1'; - } - - /** - * Convenience method to indicate whether current page is the first page. - * - * @return boolean - */ - public function atFirstPage() - { - return $this->getPage() == $this->getFirstPage(); - } - - /** - * Get last page - * - * @return int $lastPage - */ - public function getLastPage() - { - $totalPages = $this->getTotalPages(); - if ($totalPages == 0) { - return 1; - } else { - return $totalPages; - } - } - - /** - * Convenience method to indicate whether current page is the last page. - * - * @return boolean - */ - public function atLastPage() - { - return $this->getPage() == $this->getLastPage(); - } - - /** - * get total pages - * - * @return int $this->pages - */ - public function getTotalPages() { - if (!isset($this->pages)) { - $recordCount = $this->getTotalRecordCount(); - if ($this->max > 0) { - $this->pages = ceil($recordCount/$this->max); - } else { - $this->pages = 0; - } - } - return $this->pages; - } - - /** - * get an array of previous id's - * - * @param int $range - * @return array $links - */ - public function getPrevLinks($range = 5) - { - $total = $this->getTotalPages(); - $start = $this->getPage() - 1; - $end = $this->getPage() - $range; - $first = $this->getFirstPage(); - $links = array(); - for ($i=$start; $i>$end; $i--) { - if ($i < $first) { - break; - } - $links[] = $i; - } - - return array_reverse($links); - } - - /** - * get an array of next id's - * - * @param int $range - * @return array $links - */ - public function getNextLinks($range = 5) - { - $total = $this->getTotalPages(); - $start = $this->getPage() + 1; - $end = $this->getPage() + $range; - $last = $this->getLastPage(); - $links = array(); - for ($i=$start; $i<$end; $i++) { - if ($i > $last) { - break; - } - $links[] = $i; - } - - return $links; - } - - /** - * Returns whether last page is complete - * - * @return bool Last page complete or not - */ - public function isLastPageComplete() - { - return !($this->getTotalRecordCount() % $this->max); - } - - /** - * get previous id - * - * @return mixed $prev - */ - public function getPrev() { - if ($this->getPage() != $this->getFirstPage()) { - $prev = $this->getPage() - 1; - } else { - $prev = false; - } - return $prev; - } - - /** - * get next id - * - * @return mixed $next - */ - public function getNext() { - if ($this->getPage() != $this->getLastPage()) { - $next = $this->getPage() + 1; - } else { - $next = false; - } - return $next; - } - - /** - * Set the current page number (First page is 1). - * @param int $page - * @return void - */ - public function setPage($page) - { - $this->page = $page; - // (re-)calculate start rec - $this->calculateStart(); - } - - /** - * Get current page. - * @return int - */ - public function getPage() - { - return $this->page; - } - - /** - * Set the number of rows per page. - * @param int $r - */ - public function setRowsPerPage($r) - { - $this->max = $r; - // (re-)calculate start rec - $this->calculateStart(); - } - - /** - * Get number of rows per page. - * @return int - */ - public function getRowsPerPage() - { - return $this->max; - } - - /** - * Calculate startrow / max rows based on current page and rows-per-page. - * @return void - */ - private function calculateStart() - { - $this->start = ( ($this->page - 1) * $this->max ); - } - - /** - * Gets the total number of (un-LIMITed) records. - * - * This method will perform a query that executes un-LIMITed query. - * - * @return int Total number of records - disregarding page, maxrows, etc. - */ - public function getTotalRecordCount() - { - - if (!isset($this->rs)) { - $this->doRs(); - } - - if (empty($this->recordCount)) { - $this->countCriteria = clone $this->criteria; - $this->countCriteria->setLimit(0); - $this->countCriteria->setOffset(0); - - $this->recordCount = call_user_func( - array( - $this->getPeerClass(), - $this->getPeerCountMethod() - ), - $this->countCriteria - ); - - } - - return $this->recordCount; - - } - - /** - * Sets the start row or offset. - * @param int $v - */ - public function setStart($v) - { - $this->start = $v; - } - - /** - * Sets max rows (limit). - * @param int $v - * @return void - */ - public function setMax($v) - { - $this->max = $v; - } - - /** - * Returns the count of the current page's records - * @return int - */ - public function count() - { - return count($this->getResult()); - } - - /** - * Returns the current element of the iterator - * @return mixed - */ - public function current() - { - if (!isset($this->rs)) { - $this->doRs(); - } - return $this->rs[$this->currentKey]; - } - - /** - * Returns the current key of the iterator - * @return int - */ - public function key() - { - return $this->currentKey; - } - - /** - * Advances the iterator to the next element - * @return void - */ - public function next() - { - $this->currentKey++; - } - - /** - * Resets the iterator to the first element - * @return void - */ - public function rewind() - { - $this->currentKey = 0; - } - - /** - * Checks if the current key exists in the container - * @return boolean - */ - public function valid() - { - if (!isset($this->rs)) { - $this->doRs(); - } - return in_array($this->currentKey, array_keys($this->rs)); - } - -} diff --git a/airtime_mvc/library/propel/runtime/lib/validator/BasicValidator.php b/airtime_mvc/library/propel/runtime/lib/validator/BasicValidator.php deleted file mode 100644 index 5733e0bf8e..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/validator/BasicValidator.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.runtime.validator - */ -interface BasicValidator -{ - - /** - * Determine whether a value meets the criteria specified - * - * @param ValidatorMap $map A column map object for the column to be validated. - * @param string $str a String to be tested - * - * @return mixed TRUE if valid, error message otherwise - */ - public function isValid(ValidatorMap $map, $str); - -} diff --git a/airtime_mvc/library/propel/runtime/lib/validator/MatchValidator.php b/airtime_mvc/library/propel/runtime/lib/validator/MatchValidator.php deleted file mode 100644 index a2890e9b58..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/validator/MatchValidator.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * - * - * - * - * - * - * @author Michael Aichler - * @author Hans Lellelid - * @version $Revision: 1612 $ - * @package propel.runtime.validator - */ -class MatchValidator implements BasicValidator -{ - /** - * Prepares the regular expression entered in the XML - * for use with preg_match(). - * @param string $exp - * @return string Prepared regular expession. - */ - private function prepareRegexp($exp) - { - // remove surrounding '/' marks so that they don't get escaped in next step - if ($exp{0} !== '/' || $exp{strlen($exp)-1} !== '/' ) { - $exp = '/' . $exp . '/'; - } - - // if they did not escape / chars; we do that for them - $exp = preg_replace('/([^\\\])\/([^$])/', '$1\/$2', $exp); - - return $exp; - } - - /** - * Whether the passed string matches regular expression. - */ - public function isValid (ValidatorMap $map, $str) - { - return (preg_match($this->prepareRegexp($map->getValue()), $str) != 0); - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/validator/MaxLengthValidator.php b/airtime_mvc/library/propel/runtime/lib/validator/MaxLengthValidator.php deleted file mode 100644 index 286c82c7e8..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/validator/MaxLengthValidator.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * - * - * - * - * - * - * @author Michael Aichler - * @version $Revision: 1612 $ - * @package propel.runtime.validator - */ -class MaxLengthValidator implements BasicValidator -{ - - public function isValid (ValidatorMap $map, $str) - { - return strlen($str) <= intval($map->getValue()); - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/validator/MaxValueValidator.php b/airtime_mvc/library/propel/runtime/lib/validator/MaxValueValidator.php deleted file mode 100644 index b712940431..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/validator/MaxValueValidator.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * - * - * - * - * - * - * - * @author Michael Aichler - * @version $Revision: 1612 $ - * @package propel.runtime.validator - */ -class MaxValueValidator implements BasicValidator -{ - - /** - * @see BasicValidator::isValid() - */ - public function isValid (ValidatorMap $map, $value) - { - if (is_null($value) == false && is_numeric($value) == true) { - return intval($value) <= intval($map->getValue()); - } - - return false; - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/validator/MinLengthValidator.php b/airtime_mvc/library/propel/runtime/lib/validator/MinLengthValidator.php deleted file mode 100644 index e5c0345961..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/validator/MinLengthValidator.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * - * - * - * - * - * - * @author Michael Aichler - * @version $Revision: 1612 $ - * @package propel.runtime.validator - */ -class MinLengthValidator implements BasicValidator -{ - - /** - * @see BasicValidator::isValid() - */ - public function isValid (ValidatorMap $map, $str) - { - return strlen($str) >= intval($map->getValue()); - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/validator/MinValueValidator.php b/airtime_mvc/library/propel/runtime/lib/validator/MinValueValidator.php deleted file mode 100644 index d58894663b..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/validator/MinValueValidator.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * - * - * - * - * - * - * - * @author Michael Aichler - * @version $Revision: 1612 $ - * @package propel.runtime.validator - */ -class MinValueValidator implements BasicValidator -{ - - /** - * @see BasicValidator::isValid() - */ - public function isValid (ValidatorMap $map, $value) - { - if (is_null($value) == false && is_numeric($value)) { - return intval($value) >= intval($map->getValue()); - } - - return false; - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/validator/NotMatchValidator.php b/airtime_mvc/library/propel/runtime/lib/validator/NotMatchValidator.php deleted file mode 100644 index f0f72998d9..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/validator/NotMatchValidator.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * - * - * - * - * - * - * @author Michael Aichler - * @author Hans Lellelid - * @version $Revision: 1612 $ - * @package propel.runtime.validator - */ -class NotMatchValidator implements BasicValidator -{ - /** - * Prepares the regular expression entered in the XML - * for use with preg_match(). - * @param string $exp - * @return string Prepared regular expession. - */ - private function prepareRegexp($exp) - { - // remove surrounding '/' marks so that they don't get escaped in next step - if ($exp{0} !== '/' || $exp{strlen($exp)-1} !== '/' ) { - $exp = '/' . $exp . '/'; - } - - // if they did not escape / chars; we do that for them - $exp = preg_replace('/([^\\\])\/([^$])/', '$1\/$2', $exp); - - return $exp; - } - - /** - * Whether the passed string matches regular expression. - */ - public function isValid (ValidatorMap $map, $str) - { - return (preg_match($this->prepareRegexp($map->getValue()), $str) == 0); - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/validator/RequiredValidator.php b/airtime_mvc/library/propel/runtime/lib/validator/RequiredValidator.php deleted file mode 100644 index 57ab63a6fd..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/validator/RequiredValidator.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * - * - * - * - * - * - * @author Michael Aichler - * @version $Revision: 1612 $ - * @package propel.runtime.validator - */ -class RequiredValidator implements BasicValidator -{ - - /** - * @see BasicValidator::isValid() - */ - public function isValid (ValidatorMap $map, $str) - { - return ($str !== null && $str !== ""); - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/validator/TypeValidator.php b/airtime_mvc/library/propel/runtime/lib/validator/TypeValidator.php deleted file mode 100644 index 141760f0a9..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/validator/TypeValidator.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * - * - * - * - * - * - * @author Hans Lellelid - * @version $Revision: 1612 $ - * @package propel.runtime.validator - */ -class TypeValidator implements BasicValidator -{ - public function isValid(ValidatorMap $map, $value) - { - switch ($map->getValue()) { - case 'array': - return is_array($value); - break; - case 'bool': - case 'boolean': - return is_bool($value); - break; - case 'float': - return is_float($value); - break; - case 'int': - case 'integer': - return is_int($value); - break; - case 'numeric': - return is_numeric($value); - break; - case 'object': - return is_object($value); - break; - case 'resource': - return is_resource($value); - break; - case 'scalar': - return is_scalar($value); - break; - case 'string': - return is_string($value); - break; - case 'function': - return function_exists($value); - break; - default: - throw new PropelException('Unkonwn type ' . $map->getValue()); - break; - } - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/validator/UniqueValidator.php b/airtime_mvc/library/propel/runtime/lib/validator/UniqueValidator.php deleted file mode 100644 index 49cc91d34b..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/validator/UniqueValidator.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * - * - * - * - * - * - * @author Michael Aichler - * @version $Revision: 1612 $ - * @package propel.runtime.validator - */ -class UniqueValidator implements BasicValidator -{ - - /** - * @see BasicValidator::isValid() - */ - public function isValid (ValidatorMap $map, $str) - { - $column = $map->getColumn(); - - $c = new Criteria(); - $c->add($column->getFullyQualifiedName(), $str, Criteria::EQUAL); - - $table = $column->getTable()->getClassName(); - - $clazz = $table . 'Peer'; - $count = call_user_func(array($clazz, 'doCount'), $c); - - $isValid = ($count === 0); - - return $isValid; - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/validator/ValidValuesValidator.php b/airtime_mvc/library/propel/runtime/lib/validator/ValidValuesValidator.php deleted file mode 100644 index d680108e98..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/validator/ValidValuesValidator.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * - * - * - * - * - * - * @author Michael Aichler - * @version $Revision: 1612 $ - * @package propel.runtime.validator - */ -class ValidValuesValidator implements BasicValidator -{ - - public function isValid (ValidatorMap $map, $str) - { - return in_array($str, preg_split("/[|,]/", $map->getValue())); - } -} diff --git a/airtime_mvc/library/propel/runtime/lib/validator/ValidationFailed.php b/airtime_mvc/library/propel/runtime/lib/validator/ValidationFailed.php deleted file mode 100644 index ed34720742..0000000000 --- a/airtime_mvc/library/propel/runtime/lib/validator/ValidationFailed.php +++ /dev/null @@ -1,115 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.runtime.validator - * @see BasePeer::doValidate() - */ -class ValidationFailed { - - /** Column name in tablename.COLUMN_NAME format */ - private $colname; - - /** Message to display to user. */ - private $message; - - /** Validator object that caused this to fail. */ - private $validator; - - /** - * Construct a new ValidationFailed object. - * @param string $colname Column name. - * @param string $message Message to display to user. - * @param object $validator The Validator that caused this column to fail. - */ - public function __construct($colname, $message, $validator = null) - { - $this->colname = $colname; - $this->message = $message; - $this->validator = $validator; - } - - /** - * Set the column name. - * @param string $v - */ - public function setColumn($v) - { - $this->colname = $v; - } - - /** - * Gets the column name. - * @return string Qualified column name (tablename.COLUMN_NAME) - */ - public function getColumn() - { - return $this->colname; - } - - /** - * Set the message for the validation failure. - * @param string $v - */ - public function setMessage($v) - { - $this->message = $v; - } - - /** - * Gets the message for the validation failure. - * @return string - */ - public function getMessage() - { - return $this->message; - } - - /** - * Set the validator object that caused this to fail. - * @param object $v - */ - public function setValidator($v) - { - $this->validator = $v; - } - - /** - * Gets the validator object that caused this to fail. - * @return object - */ - public function getValidator() - { - return $this->validator; - } - - /** - * "magic" method to get string represenation of object. - * Maybe someday PHP5 will support the invoking this method automatically - * on (string) cast. Until then it's pretty useless. - * @return string - */ - public function __toString() - { - return $this->getMessage(); - } - -} diff --git a/airtime_mvc/library/propel/runtime/pear/BuildPropelPEARPackageTask.php b/airtime_mvc/library/propel/runtime/pear/BuildPropelPEARPackageTask.php deleted file mode 100644 index 023820fc4f..0000000000 --- a/airtime_mvc/library/propel/runtime/pear/BuildPropelPEARPackageTask.php +++ /dev/null @@ -1,205 +0,0 @@ - - * @package phing.tasks.ext - * @version $Revision: 1681 $ - */ -class BuildPropelPEARPackageTask extends MatchingTask -{ - - /** Base directory for reading files. */ - private $dir; - - private $version; - private $state = 'stable'; - private $notes; - - private $filesets = array(); - - /** Package file */ - private $packageFile; - - public function init() - { - include_once 'PEAR/PackageFileManager2.php'; - if (!class_exists('PEAR_PackageFileManager2')) { - throw new BuildException("You must have installed PEAR_PackageFileManager2 (PEAR_PackageFileManager >= 1.6.0) in order to create a PEAR package.xml file."); - } - } - - private function setOptions($pkg) - { - $options['baseinstalldir'] = 'propel'; - $options['packagedirectory'] = $this->dir->getAbsolutePath(); - - if (empty($this->filesets)) { - throw new BuildException("You must use a tag to specify the files to include in the package.xml"); - } - - $options['filelistgenerator'] = 'Fileset'; - - // Some PHING-specific options needed by our Fileset reader - $options['phing_project'] = $this->getProject(); - $options['phing_filesets'] = $this->filesets; - - if ($this->packageFile !== null) { - // create one w/ full path - $f = new PhingFile($this->packageFile->getAbsolutePath()); - $options['packagefile'] = $f->getName(); - // must end in trailing slash - $options['outputdirectory'] = $f->getParent() . DIRECTORY_SEPARATOR; - $this->log("Creating package file: " . $f->getPath(), Project::MSG_INFO); - } else { - $this->log("Creating [default] package.xml file in base directory.", Project::MSG_INFO); - } - - $pkg->setOptions($options); - - } - - /** - * Main entry point. - * @return void - */ - public function main() - { - if ($this->dir === null) { - throw new BuildException("You must specify the \"dir\" attribute for PEAR package task."); - } - - if ($this->version === null) { - throw new BuildException("You must specify the \"version\" attribute for PEAR package task."); - } - - $package = new PEAR_PackageFileManager2(); - - $this->setOptions($package); - - // the hard-coded stuff - $package->setPackage('propel_runtime'); - $package->setSummary('Runtime component of the Propel PHP object persistence layer'); - $package->setDescription('Propel is an object persistence layer for PHP5 based on Apache Torque. This package provides the runtime engine that transparently handles object persistence and retrieval.'); - $package->setChannel('pear.propelorm.org'); - $package->setPackageType('php'); - - $package->setReleaseVersion($this->version); - $package->setAPIVersion($this->version); - - $package->setReleaseStability($this->state); - $package->setAPIStability($this->state); - - $package->setNotes($this->notes); - - $package->setLicense('MIT', 'http://www.opensource.org/licenses/mit-license.php'); - - // Add package maintainers - $package->addMaintainer('lead', 'hans', 'Hans Lellelid', 'hans@xmpl.org'); - $package->addMaintainer('lead', 'david', 'David Zuelke', 'dz@bitxtender.com'); - $package->addMaintainer('lead', 'francois', 'Francois Zaninotto', 'fzaninotto@[gmail].com'); - - // "core" dependencies - $package->setPhpDep('5.2.0'); - $package->setPearinstallerDep('1.4.0'); - - // "package" dependencies - $package->addExtensionDep('required', 'pdo'); - $package->addExtensionDep('required', 'spl'); - - // now we run this weird generateContents() method that apparently - // is necessary before we can add replacements ... ? - $package->generateContents(); - - $e = $package->writePackageFile(); - - if (PEAR::isError($e)) { - throw new BuildException("Unable to write package file.", new Exception($e->getMessage())); - } - - } - - /** - * Used by the PEAR_PackageFileManager_PhingFileSet lister. - * @return array FileSet[] - */ - public function getFileSets() - { - return $this->filesets; - } - - // ------------------------------- - // Set properties from XML - // ------------------------------- - - /** - * Nested creator, creates a FileSet for this task - * - * @return FileSet The created fileset object - */ - function createFileSet() - { - $num = array_push($this->filesets, new FileSet()); - return $this->filesets[$num-1]; - } - - /** - * Set the version we are building. - * @param string $v - * @return void - */ - public function setVersion($v) - { - $this->version = $v; - } - - /** - * Set the state we are building. - * @param string $v - * @return void - */ - public function setState($v) - { - $this->state = $v; - } - - /** - * Sets release notes field. - * @param string $v - * @return void - */ - public function setNotes($v) - { - $this->notes = $v; - } - /** - * Sets "dir" property from XML. - * @param PhingFile $f - * @return void - */ - public function setDir(PhingFile $f) - { - $this->dir = $f; - } - - /** - * Sets the file to use for generated package.xml - */ - public function setDestFile(PhingFile $f) - { - $this->packageFile = $f; - } - -} diff --git a/airtime_mvc/library/propel/runtime/pear/build-pear-package.xml b/airtime_mvc/library/propel/runtime/pear/build-pear-package.xml deleted file mode 100644 index 31a7415305..0000000000 --- a/airtime_mvc/library/propel/runtime/pear/build-pear-package.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Propel version for package - - - - - - - - - ----------------------------- - | Creating directory layout | - ----------------------------- - - - - - - - - - - - - - - ----------------------------- - | Creating PEAR package.xml | - ----------------------------- - - - - - - - - - - - - - - - ----------------------------- - | Creating tar.gz package | - ----------------------------- - - - - - - \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/README b/airtime_mvc/library/propel/test/README deleted file mode 100644 index eb0e1934b9..0000000000 --- a/airtime_mvc/library/propel/test/README +++ /dev/null @@ -1,139 +0,0 @@ -= Running The Propel Unit Tests = - -== Background == - -Propel uses [http://www.phpunit.de PHPUnit 3.9] to test the build and runtime frameworks. - -You can find the unit test classes and support files in the [browser:branches/1.4/test/testsuite] directory. - -== Install PHPUnit == - -In order to run the tests, you must install PHPUnit, PEAR:Log, and Phing: -{{{ -> pear channel-discover pear.phpunit.de -> pear install phpunit/PHPUnit-3.3.9 -}}} - -{{{ -> pear channel-discover pear.phing.info -> pear install phing/phing-2.3.3 -}}} - -{{{ -> pear install log -}}} - -Tip: The latest release of PHPUnit (3.4) is not totally BC with the 3.3, and doesn't have a Phing adapter yet. That's why the Propel unit tests still use PHPUnit version 3.3. - -== Configure the Database to be Used in the Tests == - -You must configure both the generator and the runtime connection settings. -{{{ -// in test/fixtures/bookstore/build.properties -propel.database = mysql -propel.database.url = mysql:dbname=test -propel.mysqlTableType = InnoDB -propel.disableIdentifierQuoting=true -# For MySQL or Oracle, you also need to specify username & password -propel.database.user = myusername -propel.database.password = p@ssw0rd -}}} - -{{{ -// in test/fixtures/bookstore/runtime-conf.xml - - - mysql - - - DebugPDO - mysql:dbname=test - myusername - p@ssw0rd - - - - - - - - - - utf8 - - - -}}} - -== Build the Propel Model and Initialize the Database == - -{{{ -> cd /path/to/propel/test -> ../generator/bin/propel-gen fixtures/bookstore main -> mysqladmin create test -> ../generator/bin/propel-gen fixtures/bookstore insert-sql -}}} - -**Tip**: To run the unit tests for the namespace support in PHP 5.3, you must also build the `fixtures/namespaced` project. - -== Run the Unit Tests == - -Run all the unit tests at once using Phing: -{{{ -> cd /path/to/propel/test -> phing -f test.xml -verbose -}}} - -'''Tip''': The `-verbose` option will force the display of PHP notices, which are hidden by default. - -To run a single test, specify the classname (minus 'Test' ending) on the commandline, using the `test` property. For example to run only GeneratedObjectTest: - -{{{ -> phing -f test.xml -verbose -Dtest=GeneratedObject -}}} - -Tip: If you want to set up custom Phing properties for your unit tests, create a `test.properties` file inside the main `test/` directory. Phing will automatically try to load it if it exists. - -== How the Tests Work == - -Every method in the test classes that begins with 'test' is run as a test case by PHPUnit. All tests are run in isolation; the `setUp()` method is called at the beginning of ''each'' test and the `tearDown()` method is called at the end. - -The [browser:branches/1.4/test/tools/helpers/bookstore/BookstoreTestBase.php BookstoreTestBase] class specifies `setUp()` and `tearDown()` methods which populate and depopulate, respectively, the database. This means that every unit test is run with a cleanly populated database. To see the sample data that is populated, take a look at the [browser:branches/1.4/test/tools/helpers/bookstore/BookstoreDataPopulator.php BookstoreDataPopulator] class. You can also add data to this class, if needed by your tests; however, proceed cautiously when changing existing data in there as there may be unit tests that depend on it. More typically, you can simply create the data you need from within your test method. It will be deleted by the `tearDown()` method, so no need to clean up after yourself. - -== Writing Tests == - -If you've made a change to a template or to Propel behavior, the right thing to do is write a unit test that ensures that it works properly -- and continues to work in the future. - -Writing a unit test often means adding a method to one of the existing test classes. For example, let's test a feature in the Propel templates that supports saving of objects when only default values have been specified. Just add a `testSaveWithDefaultValues()` method to the [browser:branches/1.4/test/testsuite/generator/engine/builder/om/php5/GeneratedObjectTest.php GeneratedObjectTest] class, as follows: - -{{{ -#!php -setName('Penguin'); - // in the past this wouldn't have marked object as modified - // since 'Penguin' is the value that's already set for that attrib - $pub->save(); - - // if getId() returns the new ID, then we know save() worked. - $this->assertTrue($pub->getId() !== null, "Expect Publisher->save() to work with only default values."); -} -?> -}}} - -Run the test again using the command line to check that it passes: - -{{{ -> phing -f test.xml -Dtest=GeneratedObject -}}} - -You can also write additional unit test classes to any of the directories in `test/testsuite/` (or add new directories if needed). The Phing task will find these files automatically and run them. \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/bookstore-packaged-test.php b/airtime_mvc/library/propel/test/bookstore-packaged-test.php deleted file mode 100644 index 7455e90111..0000000000 --- a/airtime_mvc/library/propel/test/bookstore-packaged-test.php +++ /dev/null @@ -1,811 +0,0 @@ - - * @version $Revision: 1612 $ - */ - -// Setup configuration. It is expected that the bookstore-conf.php file exists in ../build/conf -// - -error_reporting(E_ALL); - -$conf_path = realpath(dirname(__FILE__) . '/../projects/bookstore-packaged/build/conf/bookstore-packaged-conf.php'); -if (!file_exists($conf_path)) { - print "Make sure that you specify properties in conf/bookstore-packaged.properties and " - ."build propel before running this script."; - exit; -} - -// Add PHP_CLASSPATH, if set -if (getenv("PHP_CLASSPATH")) { - set_include_path(getenv("PHP_CLASSPATH") . PATH_SEPARATOR . get_include_path()); -} - - // Add build/classes/ and classes/ to path -set_include_path( - realpath(dirname(__FILE__) . '/../projects/bookstore-packaged/build/classes') . PATH_SEPARATOR . - dirname(__FILE__) . '/../../runtime/classes' . PATH_SEPARATOR . - get_include_path() -); - - - // Require classes. - require_once 'propel/Propel.php'; - require_once 'author/Author.php'; - require_once 'publisher/Publisher.php'; - require_once 'book/Book.php'; - require_once 'review/Review.php'; - include_once 'media/Media.php'; - include_once 'log/BookstoreLog.php'; - include_once 'book_club_list/BookClubList.php'; - include_once 'book_club_list/BookListRel.php'; - - include_once 'Benchmark/Timer.php'; - - $timer = new Benchmark_Timer; - - $timer->start(); - - // Some utility functions - function boolTest($cond) { - if ($cond) { - return "[OK]\n"; - } else { - return "[FAILED]\n"; - } - } - - try { - // Initialize Propel - Propel::init($conf_path); - } catch (Exception $e) { - die("Error initializing propel: ". $e->__toString()); - } - -function check_tables_empty() { - try { - - print "\nChecking to see that tables are empty\n"; - print "-------------------------------------\n\n"; - - print "Ensuring that there are no records in [author] table: "; - $res = AuthorPeer::doSelect(new Criteria()); - print boolTest(empty($res)); - - print "Ensuring that there are no records in [publisher] table: "; - $res2 = PublisherPeer::doSelect(new Criteria()); - print boolTest(empty($res2)); - - print "Ensuring that there are no records in [book] table: "; - $res3 = AuthorPeer::doSelect(new Criteria()); - print boolTest(empty($res3)); - - print "Ensuring that there are no records in [review] table: "; - $res4 = ReviewPeer::doSelect(new Criteria()); - print boolTest(empty($res4)); - - print "Ensuring that there are no records in [media] table: "; - $res5 = MediaPeer::doSelect(new Criteria()); - print boolTest(empty($res5)); - - print "Ensuring that there are no records in [book_club_list] table: "; - $res6 = BookClubListPeer::doSelect(new Criteria()); - print boolTest(empty($res6)); - - print "Ensuring that there are no records in [book_x_list] table: "; - $res7 = BookListRelPeer::doSelect(new Criteria()); - print boolTest(empty($res7)); - - return (empty($res) && empty($res2) && empty($res3) && empty($res4) && empty($res5)); - - } catch (Exception $e) { - die("Error ensuring tables were empty: " . $e->__toString()); - } -} - -// Check to see if records already exist in any of the three tables. If so, display an error -// and exit. - -if (!check_tables_empty()) { - die("Tables must be empty to perform these tests."); -} - -// Add publisher records -// --------------------- - -try { - print "\nAdding some new publishers to the list\n"; - print "--------------------------------------\n\n"; - - $scholastic = new Publisher(); - $scholastic->setName("Scholastic"); - // do not save, will do later to test cascade - print "Added publisher \"Scholastic\" [not saved yet].\n"; - - $morrow = new Publisher(); - $morrow->setName("William Morrow"); - $morrow->save(); - $morrow_id = $morrow->getId(); - print "Added publisher \"William Morrow\" [id = $morrow_id].\n"; - - $penguin = new Publisher(); - $penguin->setName("Penguin"); - $penguin->save(); - $penguin_id = $penguin->getId(); - print "Added publisher \"Penguin\" [id = $penguin_id].\n"; - - $vintage = new Publisher(); - $vintage->setName("Vintage"); - $vintage->save(); - $vintage_id = $vintage->getId(); - print "Added publisher \"Vintage\" [id = $vintage_id].\n"; - -} catch (Exception $e) { - die("Error adding publisher: " . $e->__toString()); -} - -// Add author records -// ------------------ - -try { - print "\nAdding some new authors to the list\n"; - print "--------------------------------------\n\n"; - - $rowling = new Author(); - $rowling->setFirstName("J.K."); - $rowling->setLastName("Rowling"); - // no save() - print "Added author \"J.K. Rowling\" [not saved yet].\n"; - - $stephenson = new Author(); - $stephenson->setFirstName("Neal"); - $stephenson->setLastName("Stephenson"); - $stephenson->save(); - $stephenson_id = $stephenson->getId(); - print "Added author \"Neal Stephenson\" [id = $stephenson_id].\n"; - - $byron = new Author(); - $byron->setFirstName("George"); - $byron->setLastName("Byron"); - $byron->save(); - $byron_id = $byron->getId(); - print "Added author \"George Byron\" [id = $byron_id].\n"; - - - $grass = new Author(); - $grass->setFirstName("Gunter"); - $grass->setLastName("Grass"); - $grass->save(); - $grass_id = $grass->getId(); - print "Added author \"Gunter Grass\" [id = $grass_id].\n"; - -} catch (Exception $e) { - die("Error adding author: " . $e->__toString()); -} - -// Add book records -// ---------------- - -try { - - print "\nAdding some new books to the list\n"; - print "-------------------------------------\n\n"; - - $phoenix = new Book(); - $phoenix->setTitle("Harry Potter and the Order of the Phoenix"); - $phoenix->setISBN("043935806X"); - - print "Trying cascading save (Harry Potter): "; - $phoenix->setAuthor($rowling); - $phoenix->setPublisher($scholastic); - $phoenix->save(); - $phoenix_id = $phoenix->getId(); - print boolTest(true); - print "Added book \"Harry Potter and the Order of the Phoenix\" [id = $phoenix_id].\n"; - - $qs = new Book(); - $qs->setISBN("0380977427"); - $qs->setTitle("Quicksilver"); - $qs->setAuthor($stephenson); - $qs->setPublisher($morrow); - $qs->save(); - $qs_id = $qs->getId(); - print "Added book \"Quicksilver\" [id = $qs_id].\n"; - - $dj = new Book(); - $dj->setISBN("0140422161"); - $dj->setTitle("Don Juan"); - $dj->setAuthor($byron); - $dj->setPublisher($penguin); - $dj->save(); - $dj_id = $qs->getId(); - print "Added book \"Don Juan\" [id = $dj_id].\n"; - - $td = new Book(); - $td->setISBN("067972575X"); - $td->setTitle("The Tin Drum"); - $td->setAuthor($grass); - $td->setPublisher($vintage); - $td->save(); - $td_id = $td->getId(); - print "Added book \"The Tin Drum\" [id = $dj_id].\n"; - -} catch (Exception $e) { - die("Error saving book: " . $e->__toString()); -} - -// Add review records -// ------------------ - -try { - - print "\nAdding some book reviews to the list\n"; - print "------------------------------------\n\n"; - - $r1 = new Review(); - $r1->setBook($phoenix); - $r1->setReviewedBy("Washington Post"); - $r1->setRecommended(true); - $r1->setReviewDate(time()); - $r1->save(); - $r1_id = $r1->getId(); - print "Added Washington Post book review [id = $r1_id].\n"; - - $r2 = new Review(); - $r2->setBook($phoenix); - $r2->setReviewedBy("New York Times"); - $r2->setRecommended(false); - $r2->setReviewDate(time()); - $r2->save(); - $r2_id = $r2->getId(); - print "Added New York Times book review [id = $r2_id].\n"; - -} catch (Exception $e) { - die("Error saving book review: " . $e->__toString()); -} - -// Perform a "complex" search -// -------------------------- - -try { - - print "\nDoing complex search on books\n"; - print "-----------------------------\n\n"; - - $crit = new Criteria(); - $crit->add(BookPeer::TITLE, 'Harry%', Criteria::LIKE); - - print "Looking for \"Harry%\": "; - $results = BookPeer::doSelect($crit); - print boolTest(count($results) === 1); - - - $crit2 = new Criteria(); - $crit2->add(BookPeer::ISBN, array("0380977427", "0140422161"), Criteria::IN); - $results = BookPeer::doSelect($crit2); - print "Looking for ISBN IN (\"0380977427\", \"0140422161\"): "; - print boolTest(count($results) === 2); - -} catch (Exception $e) { - die("Error while performing complex query: " . $e->__toString()); -} - - -// Perform a "limit" search -// ------------------------ - -try { - - print "\nDoing LIMITed search on books\n"; - print "-----------------------------\n\n"; - - $crit = new Criteria(); - $crit->setLimit(2); - $crit->setOffset(1); - $crit->addAscendingOrderByColumn(BookPeer::TITLE); - - print "Checking to make sure correct number returned: "; - $results = BookPeer::doSelect($crit); - print boolTest(count($results) === 2); - - print "Checking to make sure correct books returned: "; - // we ordered on book title, so we expect to get - print boolTest( $results[0]->getTitle() == "Harry Potter and the Order of the Phoenix" && $results[1]->getTitle() == "Quicksilver" ); - - -} catch (Exception $e) { - die("Error while performing LIMIT query: " . $e->__toString()); -} - - - -// Perform a lookup & update! -// -------------------------- - -try { - - print "\nUpdating just-created book title\n"; - print "--------------------------------\n\n"; - - print "First finding book by PK (=$qs_id) .... "; - - try { - $qs_lookup = BookPeer::retrieveByPk($qs_id); - } catch (Exception $e) { - print "ERROR!\n"; - die("Error retrieving by pk: " . $e->__toString()); - } - - if ($qs_lookup) { - print "FOUND!\n"; - } else { - print "NOT FOUND :(\n"; - die("Couldn't find just-created book: book_id = $qs_id"); - } - - try { - $new_title = "Quicksilver (".crc32(uniqid(rand())).")"; - print "Attempting to update found object (".$qs_lookup->getTitle()." -> ".$new_title."): "; - $qs_lookup->setTitle($new_title); - $qs_lookup->save(); - print boolTest(true); - } catch (Exception $e) { - die("Error saving (updating) book: " . $e->__toString()); - } - - print "Making sure object was correctly updated: "; - $qs_lookup2 = BookPeer::retrieveByPk($qs_id); - print boolTest($qs_lookup2->getTitle() == $new_title); - -} catch (Exception $e) { - die("Error updating book: " . $e->__toString()); -} - - -// Test some basic DATE / TIME stuff -// --------------------------------- - -try { - print "\nTesting the DATE/TIME columns\n"; - print "-----------------------------\n\n"; - - // that's the control timestamp. - $control = strtotime('2004-02-29 00:00:00'); - - // should be two in the db - $r = ReviewPeer::doSelectOne(new Criteria()); - $r_id = $r->getId(); - $r->setReviewDate($control); - $r->save(); - - $r2 = ReviewPeer::retrieveByPk($r_id); - - print "Checking ability to fetch native unix timestamp: "; - print boolTest($r2->getReviewDate(null) === $control); - - print "Checking ability to use date() formatter: "; - print boolTest($r2->getReviewDate('n-j-Y') === '2-29-2004'); - - print "[FYI] Here's the strftime() formatter for current locale: " . $r2->getReviewDate('%x') . "\n"; - -} catch (Exception $e) { - die("Error test date/time: " . $e->__toString()); -} - -// Handle BLOB/CLOB Columns -// ------------------------ - -try { - print "\nTesting the BLOB/CLOB columns\n"; - print "-------------------------------\n\n"; - - $blob_path = dirname(__FILE__) . '/etc/lob/tin_drum.gif'; - $blob2_path = dirname(__FILE__) . '/etc/lob/propel.gif'; - $clob_path = dirname(__FILE__) . '/etc/lob/tin_drum.txt'; - - $m1 = new Media(); - $m1->setBook($phoenix); - $m1->setCoverImage(file_get_contents($blob_path)); - $m1->setExcerpt(file_get_contents($clob_path)); - $m1->save(); - $m1_id = $m1->getId(); - print "Added Media collection [id = $m1_id].\n"; - - print "Looking for just-created mediat by PK (=$m1_id) .... "; - - try { - $m1_lookup = MediaPeer::retrieveByPk($m1_id); - } catch (Exception $e) { - print "ERROR!\n"; - die("Error retrieving media by pk: " . $e->__toString()); - } - - if ($m1_lookup) { - print "FOUND!\n"; - } else { - print "NOT FOUND :(\n"; - die("Couldn't find just-created media item: media_id = $m1_id"); - } - - print "Making sure BLOB was correctly updated: "; - print boolTest( $m1_lookup->getCoverImage()->getContents() === file_get_contents($blob_path)); - print "Making sure CLOB was correctly updated: "; - print boolTest((string) $m1_lookup->getExcerpt()->getContents() === file_get_contents($clob_path)); - - - // now update the BLOB column and save it & check the results - - $b = $m1_lookup->getCoverImage(); - $b->setContents(file_get_contents($blob2_path)); - $m1_lookup->setCoverImage($b); - $m1_lookup->save(); - - try { - $m2_lookup = MediaPeer::retrieveByPk($m1_id); - } catch (Exception $e) { - print "ERROR!\n"; - die("Error retrieving media by pk: " . $e->__toString()); - } - - print "Making sure BLOB was correctly overwritten: "; - print boolTest($m2_lookup->getCoverImage()->getContents() === file_get_contents($blob2_path)); - -} catch (Exception $e) { - die("Error doing blob/clob updates: " . $e->__toString()); -} - -// Test Validators -// --------------- - -try { - - print "\nTesting the column validators\n"; - print "-----------------------------\n\n"; - - $bk1 = new Book(); - $bk1->setTitle("12345"); // min length is 10 - $ret = $bk1->validate(); - - print "Making sure validation failed: "; - print boolTest($ret !== true); - - print "Making sure 1 validation message was returned: "; - print boolTest(count($ret) === 1); - - print "Making sure expected validation message was returned: "; - $el = array_shift($ret); - print boolTest(stripos($el->getMessage(), "must be more than") !== false); - - print "\n(Unique validator)\n"; - - $bk2 = new Book(); - $bk2->setTitle("Don Juan"); - $ret = $bk2->validate(); - - print "Making sure validation failed: "; - print boolTest($ret !== true); - - print "Making sure 1 validation message was returned: "; - print boolTest(count($ret) === 1); - - print "Making sure expected validation message was returned: "; - $el = array_shift($ret); - print boolTest(stripos($el->getMessage(), "Book title already in database.") !== false); - - print "\n(Now trying some more complex validation.)\n"; - $auth1 = new Author(); - $auth1->setFirstName("Hans"); - // last name required; will fail - - $bk1->setAuthor($auth1); - - $rev1 = new Review(); - $rev1->setReviewDate("08/09/2001"); - // will fail: reviewed_by column required - - $bk1->addReview($rev1); - - $ret2 = $bk1->validate(); - - print "Making sure 6 validation messages were returned: "; - print boolTest(count($ret2) === 6); - - print "Making sure correct columns failed: "; - print boolTest(array_keys($ret2) === array( - AuthorPeer::LAST_NAME, - AuthorPeer::EMAIL, - AuthorPeer::AGE, - BookPeer::TITLE, - ReviewPeer::REVIEWED_BY, - ReviewPeer::STATUS - )); - - - $bk2 = new Book(); - $bk2->setTitle("12345678901"); // passes - - $auth2 = new Author(); - $auth2->setLastName("Blah"); //passes - $auth2->setEmail("some@body.com"); //passes - $auth2->setAge(50); //passes - $bk2->setAuthor($auth2); - - $rev2 = new Review(); - $rev2->setReviewedBy("Me!"); // passes - $rev2->setStatus("new"); // passes - $bk2->addReview($rev2); - - $ret3 = $bk2->validate(); - - print "Making sure complex validation can pass: "; - print boolTest($ret3 === true); - -} catch (Exception $e) { - die("Error doing validation tests: " . $e->__toString()); -} - - -// Test doCount() -// -try { - - print "\nTesting doCount() functionality\n"; - print "-------------------------------\n\n"; - - $c = new Criteria(); - $records = BookPeer::doSelect($c); - $count = BookPeer::doCount($c); - - print "Making sure correct number of results: "; - print boolTest(count($records) === $count); - -} catch (Exception $e) { - die("Error deleting book: " . $e->__toString()); -} - -// Test many-to-many relationships -// --------------- - -try { - - print "\nTesting many-to-many relationships\n"; - print "-----------------------------\n\n"; - - // init book club list 1 with 2 books - - $blc1 = new BookClubList(); - $blc1->setGroupLeader("Crazyleggs"); - $blc1->setTheme("Happiness"); - - $brel1 = new BookListRel(); - $brel1->setBook($phoenix); - - $brel2 = new BookListRel(); - $brel2->setBook($dj); - - $blc1->addBookListRel($brel1); - $blc1->addBookListRel($brel2); - - $blc1->save(); - - print "Making sure BookClubList 1 was saved: "; - print boolTest(!is_null($blc1->getId())); - - // init book club list 2 with 1 book - - $blc2 = new BookClubList(); - $blc2->setGroupLeader("John Foo"); - $blc2->setTheme("Default"); - - $brel3 = new BookListRel(); - $brel3->setBook($phoenix); - - $blc2->addBookListRel($brel3); - - $blc2->save(); - - print "Making sure BookClubList 2 was saved: "; - print boolTest(!is_null($blc2->getId())); - - // re-fetch books and lists from db to be sure that nothing is cached - - $crit = new Criteria(); - $crit->add(BookPeer::ID, $phoenix->getId()); - $phoenix = BookPeer::doSelectOne($crit); - print "Making sure book 'phoenix' has been re-fetched from db: "; - print boolTest(!empty($phoenix)); - - $crit = new Criteria(); - $crit->add(BookClubListPeer::ID, $blc1->getId()); - $blc1 = BookClubListPeer::doSelectOne($crit); - print "Making sure BookClubList 1 has been re-fetched from db: "; - print boolTest(!empty($blc1)); - - $crit = new Criteria(); - $crit->add(BookClubListPeer::ID, $blc2->getId()); - $blc2 = BookClubListPeer::doSelectOne($crit); - print "Making sure BookClubList 2 has been re-fetched from db: "; - print boolTest(!empty($blc2)); - - $relCount = $phoenix->countBookListRels(); - print "Making sure book 'phoenix' has 2 BookListRels: "; - print boolTest($relCount == 2); - - $relCount = $blc1->countBookListRels(); - print "Making sure BookClubList 1 has 2 BookListRels: "; - print boolTest($relCount == 2); - - $relCount = $blc2->countBookListRels(); - print "Making sure BookClubList 2 has 1 BookListRel: "; - print boolTest($relCount == 1); - - -} catch (Exception $e) { - die("Error doing many-to-many relationships tests: " . $e->__toString()); -} - -// Test multiple databases -// --------------- - -try { - - print "\nTesting multiple databases\n"; - print "-----------------------------\n\n"; - - $line = new BookstoreLog(); - $line->setIdent('bookstore-packaged-test'); - $line->setTime(time()); - $line->setMessage('We are testing to write something to the log database ...'); - $line->setPriority('debug'); - $line->save(); - - $line_id = $line->getId(); - print "Making sure BookstoreLog was saved: "; - print boolTest(!empty($line_id)); - -} catch (Exception $e) { - die("Error doing multiple databases tests: " . $e->__toString()); -} - -// Cleanup (tests DELETE) -// ---------------------- - -try { - - print "\nRemoving books that were just created\n"; - print "-------------------------------------\n\n"; - - print "First finding book by PK (=$phoenix_id) .... "; - try { - $hp = BookPeer::retrieveByPk($phoenix_id); - } catch (Exception $e) { - print "ERROR!\n"; - die("Error retrieving by pk: " . $e->__toString()); - } - - if ($hp) { - print "FOUND!\n"; - } else { - print "NOT FOUND :(\n"; - die("Couldn't find just-created book: book_id = $phoenix_id"); - } - - print "Attempting to delete [multi-table] by found pk: "; - $c = new Criteria(); - $c->add(BookPeer::ID, $hp->getId()); - // The only way for cascading to work currently - // is to specify the author_id and publisher_id (i.e. the fkeys - // have to be in the criteria). - $c->add(AuthorPeer::ID, $hp->getId()); - $c->add(PublisherPeer::ID, $hp->getId()); - $c->setSingleRecord(true); - BookPeer::doDelete($c); - print boolTest(true); - - print "Checking to make sure correct records were removed.\n"; - print "\tFrom author table: "; - $res = AuthorPeer::doSelect(new Criteria()); - print boolTest(count($res) === 3); - print "\tFrom publisher table: "; - $res2 = PublisherPeer::doSelect(new Criteria()); - print boolTest(count($res2) === 3); - print "\tFrom book table: "; - $res3 = BookPeer::doSelect(new Criteria()); - print boolTest(count($res3) === 3); - - print "Attempting to delete books by complex criteria: "; - $c = new Criteria(); - $cn = $c->getNewCriterion(BookPeer::ISBN, "043935806X"); - $cn->addOr($c->getNewCriterion(BookPeer::ISBN, "0380977427")); - $cn->addOr($c->getNewCriterion(BookPeer::ISBN, "0140422161")); - $c->add($cn); - BookPeer::doDelete($c); - print boolTest(true); - - print "Attempting to delete book [id = $td_id]: "; - $td->delete(); - print boolTest(true); - - print "Attempting to delete author [id = $stephenson_id]: "; - AuthorPeer::doDelete($stephenson_id); - print boolTest(true); - - print "Attempting to delete author [id = $byron_id]: "; - AuthorPeer::doDelete($byron_id); - print boolTest(true); - - print "Attempting to delete author [id = $grass_id]: "; - $grass->delete(); - print boolTest(true); - - print "Attempting to delete publisher [id = $morrow_id]: "; - PublisherPeer::doDelete($morrow_id); - print boolTest(true); - - print "Attempting to delete publisher [id = $penguin_id]: "; - PublisherPeer::doDelete($penguin_id); - print boolTest(true); - - print "Attempting to delete publisher [id = $vintage_id]: "; - $vintage->delete(); - print boolTest(true); - - // These have to be deleted manually also since we have onDelete - // set to SETNULL in the foreign keys in book. Is this correct? - print "Attempting to delete author [lastname = 'Rowling']: "; - $rowling->delete(); - print boolTest(true); - - print "Attempting to delete publisher [lastname = 'Scholastic']: "; - $scholastic->delete(); - print boolTest(true); - - print "Attempting to delete BookClubList 1: "; - $blc1->delete(); - print boolTest(true); - - print "Attempting to delete BookClubList 2: "; - $blc2->delete(); - print boolTest(true); - -} catch (Exception $e) { - die("Error deleting book: " . $e->__toString()); -} - - -// Check again to make sure that tables are empty -// ---------------------------------------------- - -check_tables_empty(); - - - - - -$timer->stop(); -print $timer->display(); diff --git a/airtime_mvc/library/propel/test/etc/lob/propel.gif b/airtime_mvc/library/propel/test/etc/lob/propel.gif deleted file mode 100644 index 48e881ef5f537ca18162b0dd36467d88549ed225..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2671 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 N`HOj7RTB$X{ST6!mO}sl diff --git a/airtime_mvc/library/propel/test/etc/lob/tin_drum.gif b/airtime_mvc/library/propel/test/etc/lob/tin_drum.gif deleted file mode 100644 index a0de847bb781a3a8d119daa27ac4e650d5245d4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8202 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 - - - - - - - - -
- - - - -
- - -
- diff --git a/airtime_mvc/library/propel/test/etc/xsl/coverage-frames.xsl b/airtime_mvc/library/propel/test/etc/xsl/coverage-frames.xsl deleted file mode 100644 index edfcf2983e..0000000000 --- a/airtime_mvc/library/propel/test/etc/xsl/coverage-frames.xsl +++ /dev/null @@ -1,636 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Coverage Results. - - - - - - - - - <h2>Frame Alert</h2> - <p> - This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. - </p> - - - - - - - - .bannercell { - border: 0px; - padding: 0px; - } - body { - margin-left: 10; - margin-right: 10; - background-color:#FFFFFF; - font-family: verdana,arial,sanserif; - color:#000000; - } - a { - color: #003399; - } - a:hover { - color: #888888; - } - .a td { - background: #efefef; - } - .b td { - background: #fff; - } - th, td { - text-align: left; - vertical-align: top; - } - th { - font-weight:bold; - background: #ccc; - color: black; - } - table, th, td { - font-size: 12px; - border: none - } - table.log tr td, tr th { - } - h2 { - font-weight:bold; - font-size: 12px; - margin-bottom: 5; - } - h3 { - font-size:100%; - font-weight: 12px; - background: #DFDFDF - color: white; - text-decoration: none; - padding: 5px; - margin-right: 2px; - margin-left: 2px; - margin-bottom: 0; - } - .small { - font-size: 9px; - } -TD.empty { - FONT-SIZE: 2px; BACKGROUND: #c0c0c0; BORDER:#9c9c9c 1px solid; - color: #c0c0c0; -} -TD.fullcover { - FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER:#9c9c9c 1px solid; - color: #00df00; -} -TD.covered { - FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER-LEFT:#9c9c9c 1px solid;BORDER-TOP:#9c9c9c 1px solid;BORDER-BOTTOM:#9c9c9c 1px solid; - color: #00df00; -} -TD.uncovered { - FONT-SIZE: 2px; BACKGROUND: #df0000; BORDER:#9c9c9c 1px solid; - color: #df0000; -} -PRE.srcLine { - BACKGROUND: #ffffff; MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; -} -td.lineCount, td.coverageCount { - BACKGROUND: #F0F0F0; PADDING-RIGHT: 3px; - text-align: right; -} -td.lineCountHighlight { - background: #C8C8F0; PADDING-RIGHT: 3px; - text-align: right; -} -td.coverageCountHighlight { - background: #F0C8C8; PADDING-RIGHT: 3px; - text-align: right; -} -span.srcLineHighlight { - background: #F0C8C8; -} -span.srcLine { - background: #C8C8F0; -} -TD.srcLineClassStart { - WIDTH: 100%; BORDER-TOP:#dcdcdc 1px solid; FONT-WEIGHT: bold; -} -.srcLine , .srcLine ol, .srcLine ol li {margin: 0;} -.srcLine .de1, .srcLine .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal;} -.srcLine .imp {font-weight: bold; color: red;} -.srcLine .kw1 {color: #b1b100;} -.srcLine .kw2 {color: #000000; font-weight: bold;} -.srcLine .kw3 {color: #000066;} -.srcLine .co1 {color: #808080; font-style: italic;} -.srcLine .co2 {color: #808080; font-style: italic;} -.srcLine .coMULTI {color: #808080; font-style: italic;} -.srcLine .es0 {color: #000099; font-weight: bold;} -.srcLine .br0 {color: #66cc66;} -.srcLine .st0 {color: #ff0000;} -.srcLine .nu0 {color: #cc66cc;} -.srcLine .me1 {color: #006600;} -.srcLine .me2 {color: #006600;} -.srcLine .re0 {color: #0000ff;} - - - - - - - - - -

All Classes

- - - - - - - / - .html - - - - - -
- - - - (-) - - - () - - -
- - -
- - - - - - - - -

Overview

-

All Packages

- - - - - - - -
- - - -
- - - - - - - - - - - - - - - - - - - -
Packages: Classes: Methods: LOC:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Methods covered
Total coverage

PackagesMethods covered
- - - -
- - - - - - . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-
- -

Classes

- - - - - - - -
- - - - (-) - - - () - - -
- - -
- - - - - - - - - - - - - - - - - - -
Classes: Methods: LOC:
-
- - - - - - - - - - - - - - - - - - - - -
PackageMethods covered

ClassesMethods covered
- - - -
- - - - - - - - - - - - - - - - - -
Methods: LOC:
-
- - - - - - - - - - - - -
Source fileMethods covered
- - -
-
- - - - -
- - - - - - - - - - - - -
- - http://phing.info/ - -

Source Code Coverage

Designed for use with PHPUnit2, Xdebug and Phing.
-
-
- - - - - - -

Report generated at
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
- -
- - - - - - - - - - - - - - - - - - - - - - - -
   
- -
-
-
- - - - - - - - - - 0 - - - - - - - - srcLineClassStart - - - -
-
-
- - -
-
-
- -
-
- - -
- - - - - - ../ - - - - - - ../ - - - - - - - - stylesheet.css - - - - - - a - b - - - - - - diff --git a/airtime_mvc/library/propel/test/etc/xsl/log.xsl b/airtime_mvc/library/propel/test/etc/xsl/log.xsl deleted file mode 100644 index a460b667cd..0000000000 --- a/airtime_mvc/library/propel/test/etc/xsl/log.xsl +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - - - - - Phing Build Log - - - - - - - - - -
- - http://phing.info/ - - - Phing -
- - - -

- - - - - - - -

-
- Phing -
-
- - -
- - - - - - failed - complete - - - - - - - - - - - - - -
Build FailedBuild CompleteTotal Time:
- -
- See the stacktrace. -
-
- - - -
phing.file
phing.version
- -

Build events

- - - - - - - -
targettaskmessage
-

- - - -

Error details

- - -
-
-
- -

-
- - - - - - - a - b - - - [ ] - - - - - - -
diff --git a/airtime_mvc/library/propel/test/etc/xsl/phpunit2-noframes.xsl b/airtime_mvc/library/propel/test/etc/xsl/phpunit2-noframes.xsl deleted file mode 100644 index 20b96a707c..0000000000 --- a/airtime_mvc/library/propel/test/etc/xsl/phpunit2-noframes.xsl +++ /dev/null @@ -1,445 +0,0 @@ - - - - - - - - - - - Unit Test Results - - - - - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Failure - Error - - - - - - - - - - -
- - - -
-
- - - - - - - - -

Packages

- - - - -

Package

- - - - - - -
-

- - - - -

Test Cases

- - - - -

TestCase

- - - - - - - - - - -
-

- - - - -

Summary

- - - - - - - - - - - - - - - - - - - Failure - Error - - - - - - - - - - -
AssertionsTestsFailuresErrorsSuccess rateTime
- - - - - - - -
- - - - -
- Note: failures are anticipated and checked for with assertions while errors are unanticipated. -
-
- - - -

Unit Test Results

- - - - - -
Designed for use with PHPUnit2 and Phing.
-
-
- - - - - - -

Report generated at
-
- - - - Name - Assertions - Tests - Errors - Failures - Time(s) - - - - - - - Name - Assertions - Tests - Errors - Failures - Time(s) - - - - - - - Name - Status - Type - Assertions - Time (s) - - - - - - - - - - - Failure - Error - - - - - - - - - - - - - - - - - - - - - - Error - - - - - - Failure - - - - Error - - - - Success - - - - - - - - - - - - - - - - - - - - - - - - - N/A - - - - - - -

- - - - -
- - -
- - - - - - - - - - - - -
- -
- - - - - - - - - - - - - diff --git a/airtime_mvc/library/propel/test/etc/xsl/str.replace.function.xsl b/airtime_mvc/library/propel/test/etc/xsl/str.replace.function.xsl deleted file mode 100644 index 626e5498cf..0000000000 --- a/airtime_mvc/library/propel/test/etc/xsl/str.replace.function.xsl +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ERROR: function implementation of str:replace() relies on exsl:node-set(). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/book.schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/book.schema.xml deleted file mode 100644 index 27810c5ec1..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/book.schema.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/book_club_list.schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/book_club_list.schema.xml deleted file mode 100644 index 6b6cb5fcdc..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/book_club_list.schema.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - -
- - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/build.properties b/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/build.properties deleted file mode 100644 index 3113ded435..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/build.properties +++ /dev/null @@ -1,19 +0,0 @@ -# $Id: build.properties 1756 2010-05-10 08:54:06Z francois $ -# -# This is a project-specific build.properties file. The properties -# in this file override anything set in Propel's top-level build.properties -# file when *this* project is being built. -# -# See top-level build.properties-sample for explanation of configuration -# options. -# -# Because this file is included before the top-level build.properties file, -# you cannot refer to any properties set therein. - -propel.project = bookstore-packaged -propel.database = sqlite -propel.database.url = sqlite://localhost/./test/@DB@.db -# propel.database.createUrl = (doesn't aply for SQLite, since db is auto-created) - -propel.targetPackage = bookstore-packaged -propel.packageObjectModel = true \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/external/author.schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/external/author.schema.xml deleted file mode 100644 index 14ce34fba2..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/external/author.schema.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/log.schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/log.schema.xml deleted file mode 100644 index 96590489cc..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/log.schema.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/media.schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/media.schema.xml deleted file mode 100644 index 0aa3a2f9b1..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/media.schema.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/publisher.schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/publisher.schema.xml deleted file mode 100644 index 9f6408210f..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/publisher.schema.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/review.schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/review.schema.xml deleted file mode 100644 index f486c8014d..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/review.schema.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/runtime-conf.xml b/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/runtime-conf.xml deleted file mode 100644 index be7a2bd426..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore-packaged/runtime-conf.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - propel-bookstore-packaged - 7 - - - - - - - sqlite - - - sqlite - localhost - ./bookstore.db - - - - - - - sqlite - - - sqlite - localhost - ./bookstore-log.db - - - - - - - \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-aggregate-schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-aggregate-schema.xml deleted file mode 100644 index 8ad697d032..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-aggregate-schema.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - -
- - - - - - - -
- - - - - - - - -
- - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-auto-add-pk-schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-auto-add-pk-schema.xml deleted file mode 100644 index 881b4d5364..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-auto-add-pk-schema.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - -
- - - - - -
- - - - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-concrete-inheritance-schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-concrete-inheritance-schema.xml deleted file mode 100644 index e54760333a..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-concrete-inheritance-schema.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - -
- - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-nested-set-schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-nested-set-schema.xml deleted file mode 100644 index c89acd4377..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-nested-set-schema.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - -
- - - - - - - - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-schema.xml deleted file mode 100644 index 191b54bd1b..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-schema.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-sluggable-schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-sluggable-schema.xml deleted file mode 100644 index 29f962670f..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-sluggable-schema.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - -
- - - - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-soft-delete-schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-soft-delete-schema.xml deleted file mode 100644 index 3b9f464bff..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-soft-delete-schema.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - -
- - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-sortable-schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-sortable-schema.xml deleted file mode 100644 index 1f08c71720..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-sortable-schema.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - -
- - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-timestampable-schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-timestampable-schema.xml deleted file mode 100644 index 8504663052..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore/behavior-timestampable-schema.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - -
- - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore/build.properties b/airtime_mvc/library/propel/test/fixtures/bookstore/build.properties deleted file mode 100644 index 1981cc4b6b..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore/build.properties +++ /dev/null @@ -1,35 +0,0 @@ -# $Id: build.properties 1688 2010-04-19 20:23:27Z francois $ -# -# This is a project-specific build.properties file. The properties -# in this file override anything set in Propel's top-level build.properties -# file when *this* project is being built. -# -# See top-level build.properties-sample for explanation of configuration -# options. -# -# Because this file is included before the top-level build.properties file, -# you cannot refer to any properties set therein. - -propel.project = bookstore -propel.database = mysql -propel.database.url = mysql:dbname=test -propel.mysqlTableType = InnoDB -propel.disableIdentifierQuoting=true - -# For MySQL or Oracle, you also need to specify username & password -#propel.database.user = [db username] -#propel.database.password = [db password] - -# Note that if you do not wish to specify the database (e.g. if you -# are using multiple databses) you can use the @DB@ token which -# will be replaced with a database at runtime. -# E.g.: propel.database.url = sqlite://localhost/./test/@DB@.db -# This will work for the datadump and the insert-sql tasks. - -# propel.database.createUrl = (doesn't apply for SQLite, since db is auto-created) - -propel.targetPackage = bookstore - -# We need to test behavior hooks -propel.behavior.test_all_hooks.class = ../test.tools.helpers.bookstore.behavior.Testallhooksbehavior -propel.behavior.do_nothing.class = ../test.tools.helpers.bookstore.behavior.DonothingBehavior \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore/cms-schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore/cms-schema.xml deleted file mode 100644 index bf85a0df0a..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore/cms-schema.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - -
- - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore/runtime-conf.xml b/airtime_mvc/library/propel/test/fixtures/bookstore/runtime-conf.xml deleted file mode 100644 index e38b7bf9fa..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore/runtime-conf.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - - - propel-bookstore - propel.log - 7 - - - - - - - - mysql - - - DebugPDO - mysql:dbname=test - - - - - - - - - - - - - utf8 - - - - - - - mysql - - DebugPDO - mysql:dbname=test - - - - - - - - - utf8 - - - - - - mysql - - DebugPDO - mysql:dbname=test - - - - - - - - - utf8 - - - - - - - diff --git a/airtime_mvc/library/propel/test/fixtures/bookstore/schema.xml b/airtime_mvc/library/propel/test/fixtures/bookstore/schema.xml deleted file mode 100644 index c55066ceba..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/bookstore/schema.xml +++ /dev/null @@ -1,320 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - - - - - - - -
- - - - - - -
- - - - - - - - - - -
- - - - - - -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
- - - - -
- - - - - -
- - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - -
- - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/namespaced/build.properties b/airtime_mvc/library/propel/test/fixtures/namespaced/build.properties deleted file mode 100644 index 9dc98b564c..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/namespaced/build.properties +++ /dev/null @@ -1,31 +0,0 @@ -# $Id: build.properties 1688 2010-04-19 20:23:27Z francois $ -# -# This is a project-specific build.properties file. The properties -# in this file override anything set in Propel's top-level build.properties -# file when *this* project is being built. -# -# See top-level build.properties-sample for explanation of configuration -# options. -# -# Because this file is included before the top-level build.properties file, -# you cannot refer to any properties set therein. - -propel.project = bookstore_namespaced -propel.database = mysql -propel.database.url = mysql:dbname=test -propel.mysqlTableType = InnoDB -propel.disableIdentifierQuoting=true - -# For MySQL or Oracle, you also need to specify username & password -#propel.database.user = [db username] -#propel.database.password = [db password] - -# Note that if you do not wish to specify the database (e.g. if you -# are using multiple databses) you can use the @DB@ token which -# will be replaced with a database at runtime. -# E.g.: propel.database.url = sqlite://localhost/./test/@DB@.db -# This will work for the datadump and the insert-sql tasks. - -# propel.database.createUrl = (doesn't apply for SQLite, since db is auto-created) - -propel.targetPackage = bookstore \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/fixtures/namespaced/runtime-conf.xml b/airtime_mvc/library/propel/test/fixtures/namespaced/runtime-conf.xml deleted file mode 100644 index ccc5a5c875..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/namespaced/runtime-conf.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - propel-bookstore - propel.log - 7 - - - - - - - - mysql - - - DebugPDO - mysql:dbname=test - - - - - - - - - - - - - utf8 - - - - - - - - diff --git a/airtime_mvc/library/propel/test/fixtures/namespaced/schema.xml b/airtime_mvc/library/propel/test/fixtures/namespaced/schema.xml deleted file mode 100644 index 0951482aaf..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/namespaced/schema.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/nestedset/build.properties b/airtime_mvc/library/propel/test/fixtures/nestedset/build.properties deleted file mode 100644 index 7105e18abf..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/nestedset/build.properties +++ /dev/null @@ -1,35 +0,0 @@ -# $Id: build.properties 1260 2009-10-26 20:43:51Z francois $ -# -# This is a project-specific build.properties file. The properties -# in this file override anything set in Propel's top-level build.properties -# file when *this* project is being built. -# -# See top-level build.properties-sample for explanation of configuration -# options. -# -# Because this file is included before the top-level build.properties file, -# you cannot refer to any properties set therein. - -propel.project = nestedset -propel.database = sqlite -propel.database.url = sqlite:/var/tmp/nestedset.db -# For MySQL or Oracle, you also need to specify username & password -# propel.database.user = [db username] -# propel.database.password = [db password] - -# Note that if you do not wish to specify the database (e.g. if you -# are using multiple databses) you can use the @DB@ token which -# will be replaced with a database at runtime. -# E.g.: propel.database.url = sqlite://localhost/./test/@DB@.db -# This will work for the datadump and the insert-sql tasks. - -# propel.database.createUrl = (doesn't aply for SQLite, since db is auto-created) - -propel.targetPackage = nestedset - -# The unit tests need to test this stuff -propel.addGenericAccessors = true -propel.addGenericMutators = true - -# Use the new PHP 5.2 DateTime class -propel.useDateTimeClass = true diff --git a/airtime_mvc/library/propel/test/fixtures/nestedset/nestedset-schema.xml b/airtime_mvc/library/propel/test/fixtures/nestedset/nestedset-schema.xml deleted file mode 100644 index 9a49d51034..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/nestedset/nestedset-schema.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - -
-
diff --git a/airtime_mvc/library/propel/test/fixtures/nestedset/runtime-conf.xml b/airtime_mvc/library/propel/test/fixtures/nestedset/runtime-conf.xml deleted file mode 100644 index 8cc8fca13e..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/nestedset/runtime-conf.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - propel-nestedset - 7 - - - - - - - sqlite - - - sqlite - sqlite:/var/tmp/nestedset.db - - - - - - - diff --git a/airtime_mvc/library/propel/test/fixtures/treetest/build.properties b/airtime_mvc/library/propel/test/fixtures/treetest/build.properties deleted file mode 100644 index eca0fdfcfe..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/treetest/build.properties +++ /dev/null @@ -1,26 +0,0 @@ -# $Id: build.properties 1260 2009-10-26 20:43:51Z francois $ -# -# This is a project-specific build.properties file. The properties -# in this file override anything set in Propel's top-level build.properties -# file when *this* project is being built. -# -# See top-level build.properties-sample for explanation of configuration -# options. -# -# Because this file is included before the top-level build.properties file, -# you cannot refer to any properties set therein. - -propel.targetPackage = treetest -propel.project = treetest - -propel.database = sqlite -propel.database.url = sqlite:/var/tmp/treetest.db - -#propel.database = mysql -#propel.database.url = mysql://localhost/test - -#propel.database = codebase -#propel.database.url = odbc://localhost/Driver=CodeBaseOdbcStand;DBQ=test;?adapter=CodeBase - - - diff --git a/airtime_mvc/library/propel/test/fixtures/treetest/runtime-conf.xml b/airtime_mvc/library/propel/test/fixtures/treetest/runtime-conf.xml deleted file mode 100644 index c20f28ae43..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/treetest/runtime-conf.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - propel-treetest - 7 - - - - - - - sqlite - - - sqlite - sqlite:/var/tmp/treetest.db - - - - - - - diff --git a/airtime_mvc/library/propel/test/fixtures/treetest/treetest-schema.xml b/airtime_mvc/library/propel/test/fixtures/treetest/treetest-schema.xml deleted file mode 100644 index a2f11e8890..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/treetest/treetest-schema.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - -
- -
diff --git a/airtime_mvc/library/propel/test/fixtures/unique-column/column-schema.xml b/airtime_mvc/library/propel/test/fixtures/unique-column/column-schema.xml deleted file mode 100644 index 6c0dcf7259..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/unique-column/column-schema.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - -
-
diff --git a/airtime_mvc/library/propel/test/fixtures/unique-column/table-schema.xml b/airtime_mvc/library/propel/test/fixtures/unique-column/table-schema.xml deleted file mode 100644 index 0fb6b26f22..0000000000 --- a/airtime_mvc/library/propel/test/fixtures/unique-column/table-schema.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - -
- - - - -
-
diff --git a/airtime_mvc/library/propel/test/speed.php b/airtime_mvc/library/propel/test/speed.php deleted file mode 100644 index c013f18f5d..0000000000 --- a/airtime_mvc/library/propel/test/speed.php +++ /dev/null @@ -1,401 +0,0 @@ -iterations = $iterations; - } - - public function run() - { - $timers = array(); - fwrite(STDOUT, "Running scenario"); - // perform tests - for ($i=0; $i < $this->iterations; $i++) { - fwrite(STDOUT, '.'); - $this->setUp(); - $t = microtime(true); - $this->testSpeed(); - $timers[]= microtime(true) - $t; - $this->tearDown(); - } - fwrite(STDOUT, " done\n"); - // sort tests - sort($timers); - - // eliminate first and last - array_shift($timers); - array_pop($timers); - - return array_sum($timers) / count($timers); - } - - protected function emptyTables() - { - $res1 = AuthorPeer::doDeleteAll(); - $res2 = PublisherPeer::doDeleteAll(); - $res3 = AuthorPeer::doDeleteAll(); - $res4 = ReviewPeer::doDeleteAll(); - $res5 = MediaPeer::doDeleteAll(); - $res6 = BookClubListPeer::doDeleteAll(); - $res7 = BookListRelPeer::doDeleteAll(); - } - - public function setUp() - { - $this->con = Propel::getConnection(BookPeer::DATABASE_NAME); - $this->con->beginTransaction(); - $this->emptyTables(); - } - - public function tearDown() - { - $this->emptyTables(); - $this->con->commit(); - } - - public function testSpeed() - { - // Add publisher records - // --------------------- - - $scholastic = new Publisher(); - $scholastic->setName("Scholastic"); - // do not save, will do later to test cascade - - $morrow = new Publisher(); - $morrow->setName("William Morrow"); - $morrow->save(); - $morrow_id = $morrow->getId(); - - $penguin = new Publisher(); - $penguin->setName("Penguin"); - $penguin->save(); - $penguin_id = $penguin->getId(); - - $vintage = new Publisher(); - $vintage->setName("Vintage"); - $vintage->save(); - $vintage_id = $vintage->getId(); - - // Add author records - // ------------------ - - $rowling = new Author(); - $rowling->setFirstName("J.K."); - $rowling->setLastName("Rowling"); - // no save() - - $stephenson = new Author(); - $stephenson->setFirstName("Neal"); - $stephenson->setLastName("Stephenson"); - $stephenson->save(); - $stephenson_id = $stephenson->getId(); - - $byron = new Author(); - $byron->setFirstName("George"); - $byron->setLastName("Byron"); - $byron->save(); - $byron_id = $byron->getId(); - - $grass = new Author(); - $grass->setFirstName("Gunter"); - $grass->setLastName("Grass"); - $grass->save(); - $grass_id = $grass->getId(); - - // Add book records - // ---------------- - - $phoenix = new Book(); - $phoenix->setTitle("Harry Potter and the Order of the Phoenix"); - $phoenix->setISBN("043935806X"); - - // cascading save (Harry Potter) - $phoenix->setAuthor($rowling); - $phoenix->setPublisher($scholastic); - $phoenix->save(); - $phoenix_id = $phoenix->getId(); - - $qs = new Book(); - $qs->setISBN("0380977427"); - $qs->setTitle("Quicksilver"); - $qs->setAuthor($stephenson); - $qs->setPublisher($morrow); - $qs->save(); - $qs_id = $qs->getId(); - - $dj = new Book(); - $dj->setISBN("0140422161"); - $dj->setTitle("Don Juan"); - $dj->setAuthor($byron); - $dj->setPublisher($penguin); - $dj->save(); - $dj_id = $qs->getId(); - - $td = new Book(); - $td->setISBN("067972575X"); - $td->setTitle("The Tin Drum"); - $td->setAuthor($grass); - $td->setPublisher($vintage); - $td->save(); - $td_id = $td->getId(); - - // Add review records - // ------------------ - - $r1 = new Review(); - $r1->setBook($phoenix); - $r1->setReviewedBy("Washington Post"); - $r1->setRecommended(true); - $r1->setReviewDate(time()); - $r1->save(); - $r1_id = $r1->getId(); - - $r2 = new Review(); - $r2->setBook($phoenix); - $r2->setReviewedBy("New York Times"); - $r2->setRecommended(false); - $r2->setReviewDate(time()); - $r2->save(); - $r2_id = $r2->getId(); - - // Perform a "complex" search - // -------------------------- - - $results = BookQuery::create() - ->filterByTitle('Harry%') - ->find(); - - $results = BookQuery::create() - ->where('Book.ISBN IN ?', array("0380977427", "0140422161")) - ->find(); - - // Perform a "limit" search - // ------------------------ - - $results = BookQuery::create() - ->limit(2) - ->offset(1) - ->orderByTitle() - ->find(); - - // Perform a lookup & update! - // -------------------------- - - $qs_lookup = BookQuery::create()->findPk($qs_id); - $new_title = "Quicksilver (".crc32(uniqid(rand())).")"; - $qs_lookup->setTitle($new_title); - $qs_lookup->save(); - - $qs_lookup2 = BookQuery::create()->findPk($qs_id); - - // Test some basic DATE / TIME stuff - // --------------------------------- - - // that's the control timestamp. - $control = strtotime('2004-02-29 00:00:00'); - - // should be two in the db - $r = ReviewQuery::create()->findOne(); - $r_id = $r->getId(); - $r->setReviewDate($control); - $r->save(); - - $r2 = ReviewQuery::create()->findPk($r_id); - - // Testing the DATE/TIME columns - // ----------------------------- - - // that's the control timestamp. - $control = strtotime('2004-02-29 00:00:00'); - - // should be two in the db - $r = ReviewQuery::create()->findOne(); - $r_id = $r->getId(); - $r->setReviewDate($control); - $r->save(); - - $r2 = ReviewQuery::create()->findPk($r_id); - - // Testing the column validators - // ----------------------------- - - $bk1 = new Book(); - $bk1->setTitle("12345"); // min length is 10 - $ret = $bk1->validate(); - - // Unique validator - $bk2 = new Book(); - $bk2->setTitle("Don Juan"); - $ret = $bk2->validate(); - - // Now trying some more complex validation. - $auth1 = new Author(); - $auth1->setFirstName("Hans"); - // last name required; will fail - - $bk1->setAuthor($auth1); - - $rev1 = new Review(); - $rev1->setReviewDate("08/09/2001"); - // will fail: reviewed_by column required - - $bk1->addReview($rev1); - - $ret2 = $bk1->validate(); - - $bk2 = new Book(); - $bk2->setTitle("12345678901"); // passes - - $auth2 = new Author(); - $auth2->setLastName("Blah"); //passes - $auth2->setEmail("some@body.com"); //passes - $auth2->setAge(50); //passes - $bk2->setAuthor($auth2); - - $rev2 = new Review(); - $rev2->setReviewedBy("Me!"); // passes - $rev2->setStatus("new"); // passes - $bk2->addReview($rev2); - - $ret3 = $bk2->validate(); - - // Testing doCount() functionality - // ------------------------------- - - $count = BookQuery::create()->count(); - - // Testing many-to-many relationships - // ---------------------------------- - - // init book club list 1 with 2 books - - $blc1 = new BookClubList(); - $blc1->setGroupLeader("Crazyleggs"); - $blc1->setTheme("Happiness"); - - $brel1 = new BookListRel(); - $brel1->setBook($phoenix); - - $brel2 = new BookListRel(); - $brel2->setBook($dj); - - $blc1->addBookListRel($brel1); - $blc1->addBookListRel($brel2); - - $blc1->save(); - - // init book club list 2 with 1 book - - $blc2 = new BookClubList(); - $blc2->setGroupLeader("John Foo"); - $blc2->setTheme("Default"); - - $brel3 = new BookListRel(); - $brel3->setBook($phoenix); - - $blc2->addBookListRel($brel3); - - $blc2->save(); - - // re-fetch books and lists from db to be sure that nothing is cached - - $phoenix = BookQuery::create() - ->filterById($phoenix->getId()) - ->findOne(); - - $blc1 = BookClubListQuery::create() - ->filterById($blc1->getId()) - ->findOne(); - - $blc2 = BookClubListQuery::create() - ->filterbyId($blc2->getId()) - ->findOne(); - - $relCount = $phoenix->countBookListRels(); - - $relCount = $blc1->countBookListRels(); - - $relCount = $blc2->countBookListRels(); - - // Removing books that were just created - // ------------------------------------- - - $hp = BookQuery::create()->findPk($phoenix_id); - $c = new Criteria(); - $c->add(BookPeer::ID, $hp->getId()); - // The only way for cascading to work currently - // is to specify the author_id and publisher_id (i.e. the fkeys - // have to be in the criteria). - $c->add(AuthorPeer::ID, $hp->getId()); - $c->add(PublisherPeer::ID, $hp->getId()); - $c->setSingleRecord(true); - BookPeer::doDelete($c); - - // Attempting to delete books by complex criteria - BookQuery::create() - ->filterByISBN("043935806X") - ->orWhere('Book.ISBN = ?', "0380977427") - ->orWhere('Book.ISBN = ?', "0140422161") - ->delete(); - - $td->delete(); - - AuthorQuery::create()->filterById($stephenson_id)->delete(); - - AuthorQuery::create()->filterById($byron_id)->delete(); - - $grass->delete(); - - PublisherQuery::create()->filterById($morrow_id)->delete(); - - PublisherQuery::create()->filterById($penguin_id)->delete(); - - $vintage->delete(); - - // These have to be deleted manually also since we have onDelete - // set to SETNULL in the foreign keys in book. Is this correct? - $rowling->delete(); - - $scholastic->delete(); - - $blc1->delete(); - - $blc2->delete(); - } -} - -$test = new PropelSpeedTest(100); -echo "Test speed: {$test->run()} ({$test->iterations} iterations)\n"; diff --git a/airtime_mvc/library/propel/test/test.xml b/airtime_mvc/library/propel/test/test.xml deleted file mode 100644 index e97215e7fd..0000000000 --- a/airtime_mvc/library/propel/test/test.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ------------------------------------------------- - +++++ Running Propel unit tests - ------------------------------------------------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/AutoAddPkBehaviorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/AutoAddPkBehaviorTest.php deleted file mode 100644 index a59f845758..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/AutoAddPkBehaviorTest.php +++ /dev/null @@ -1,70 +0,0 @@ -assertEquals(count($table6->getColumns()), 2, 'auto_add_pk adds one column by default'); - $pks = $table6->getPrimaryKeys(); - $this->assertEquals(count($pks), 1, 'auto_add_pk adds a simple primary key by default'); - $pk = array_pop($pks); - $this->assertEquals($pk->getName(), 'ID', 'auto_add_pk adds an id column by default'); - $this->assertEquals($pk->getType(), 'INTEGER', 'auto_add_pk adds an integer column by default'); - $this->assertTrue($pk->isPrimaryKey(), 'auto_add_pk adds a primary key column by default'); - $this->assertTrue($table6->isUseIdGenerator(), 'auto_add_pk adds an autoIncrement column by default'); - } - - public function testNoTrigger() - { - $table7 = Table7Peer::getTableMap(); - $this->assertEquals(count($table7->getColumns()), 2, 'auto_add_pk does not add a column when the table already has a primary key'); - $this->assertFalse(method_exists('Table7', 'getId'), 'auto_add_pk does not add an id column when the table already has a primary key'); - $pks = $table7->getPrimaryKeys(); - $pk = array_pop($pks); - $this->assertEquals($pk->getName(), 'FOO', 'auto_add_pk does not change an existing primary key'); - } - - public function testParameters() - { - $table8 = Table8Peer::getTableMap(); - $this->assertEquals(count($table8->getColumns()), 3, 'auto_add_pk adds one column with custom parameters'); - $pks = $table8->getPrimaryKeys(); - $pk = array_pop($pks); - $this->assertEquals($pk->getName(), 'IDENTIFIER', 'auto_add_pk accepts customization of pk column name'); - $this->assertEquals($pk->getType(), 'BIGINT', 'auto_add_pk accepts customization of pk column type'); - $this->assertTrue($pk->isPrimaryKey(), 'auto_add_pk adds a primary key column with custom parameters'); - $this->assertFalse($table8->isUseIdGenerator(), 'auto_add_pk accepts customization of pk column autoIncrement'); - } - - public function testForeignKey() - { - $t6 = new Table6(); - $t6->setTitle('foo'); - $t6->save(); - $t8 = new Table8(); - $t8->setIdentifier(1); - $t8->setTable6($t6); - $t8->save(); - $this->assertEquals($t8->getFooId(), $t6->getId(), 'Auto added pkeys can be used in relations'); - $t8->delete(); - $t6->delete(); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/ObjectBehaviorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/ObjectBehaviorTest.php deleted file mode 100644 index f42c8e9c2b..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/ObjectBehaviorTest.php +++ /dev/null @@ -1,152 +0,0 @@ -assertEquals($t->customAttribute, 1, 'objectAttributes hook is called when adding attributes'); - } - - public function testPreSave() - { - $t = new Table3(); - $t->preSave = 0; - $t->save(); - $this->assertEquals($t->preSave, 1, 'preSave hook is called on object insertion'); - $this->assertEquals($t->preSaveBuilder, 'PHP5ObjectBuilder', 'preSave hook is called with the object builder as parameter'); - $this->assertFalse($t->preSaveIsAfterSave, 'preSave hook is called before save'); - $t->preSave = 0; - $t->setTitle('foo'); - $t->save(); - $this->assertEquals($t->preSave, 1, 'preSave hook is called on object modification'); - } - - public function testPostSave() - { - $t = new Table3(); - $t->postSave = 0; - $t->save(); - $this->assertEquals($t->postSave, 1, 'postSave hook is called on object insertion'); - $this->assertEquals($t->postSaveBuilder, 'PHP5ObjectBuilder', 'postSave hook is called with the object builder as parameter'); - $this->assertTrue($t->postSaveIsAfterSave, 'postSave hook is called after save'); - $t->postSave = 0; - $t->setTitle('foo'); - $t->save(); - $this->assertEquals($t->postSave, 1, 'postSave hook is called on object modification'); - } - - public function testPreInsert() - { - $t = new Table3(); - $t->preInsert = 0; - $t->save(); - $this->assertEquals($t->preInsert, 1, 'preInsert hook is called on object insertion'); - $this->assertEquals($t->preInsertBuilder, 'PHP5ObjectBuilder', 'preInsert hook is called with the object builder as parameter'); - $this->assertFalse($t->preInsertIsAfterSave, 'preInsert hook is called before save'); - $t->preInsert = 0; - $t->setTitle('foo'); - $t->save(); - $this->assertEquals($t->preInsert, 0, 'preInsert hook is not called on object modification'); - } - - public function testPostInsert() - { - $t = new Table3(); - $t->postInsert = 0; - $t->save(); - $this->assertEquals($t->postInsert, 1, 'postInsert hook is called on object insertion'); - $this->assertEquals($t->postInsertBuilder, 'PHP5ObjectBuilder', 'postInsert hook is called with the object builder as parameter'); - $this->assertTrue($t->postInsertIsAfterSave, 'postInsert hook is called after save'); - $t->postInsert = 0; - $t->setTitle('foo'); - $t->save(); - $this->assertEquals($t->postInsert, 0, 'postInsert hook is not called on object modification'); - } - - public function testPreUpdate() - { - $t = new Table3(); - $t->preUpdate = 0; - $t->save(); - $this->assertEquals($t->preUpdate, 0, 'preUpdate hook is not called on object insertion'); - $t->preUpdate = 0; - $t->setTitle('foo'); - $t->save(); - $this->assertEquals($t->preUpdate, 1, 'preUpdate hook is called on object modification'); - $this->assertEquals($t->preUpdateBuilder, 'PHP5ObjectBuilder', 'preUpdate hook is called with the object builder as parameter'); - $this->assertFalse($t->preUpdateIsAfterSave, 'preUpdate hook is called before save'); - } - - public function testPostUpdate() - { - $t = new Table3(); - $t->postUpdate = 0; - $t->save(); - $this->assertEquals($t->postUpdate, 0, 'postUpdate hook is not called on object insertion'); - $t->postUpdate = 0; - $t->setTitle('foo'); - $t->save(); - $this->assertEquals($t->postUpdate, 1, 'postUpdate hook is called on object modification'); - $this->assertEquals($t->postUpdateBuilder, 'PHP5ObjectBuilder', 'postUpdate hook is called with the object builder as parameter'); - $this->assertTrue($t->postUpdateIsAfterSave, 'postUpdate hook is called after save'); - } - - public function testPreDelete() - { - $t = new Table3(); - $t->save(); - $this->preDelete = 0; - $t->delete(); - $this->assertEquals($t->preDelete, 1, 'preDelete hook is called on object deletion'); - $this->assertEquals($t->preDeleteBuilder, 'PHP5ObjectBuilder', 'preDelete hook is called with the object builder as parameter'); - $this->assertTrue($t->preDeleteIsBeforeDelete, 'preDelete hook is called before deletion'); - } - - public function testPostDelete() - { - $t = new Table3(); - $t->save(); - $this->postDelete = 0; - $t->delete(); - $this->assertEquals($t->postDelete, 1, 'postDelete hook is called on object deletion'); - $this->assertEquals($t->postDeleteBuilder, 'PHP5ObjectBuilder', 'postDelete hook is called with the object builder as parameter'); - $this->assertFalse($t->postDeleteIsBeforeDelete, 'postDelete hook is called before deletion'); - } - - public function testObjectMethods() - { - $t = new Table3(); - $this->assertTrue(method_exists($t, 'hello'), 'objectMethods hook is called when adding methods'); - $this->assertEquals($t->hello(), 'PHP5ObjectBuilder', 'objectMethods hook is called with the object builder as parameter'); - } - - public function testObjectCall() - { - $t = new Table3(); - $this->assertEquals('bar', $t->foo(), 'objectCall hook is called when building the magic __call()'); - } - - public function testObjectFilter() - { - $t = new Table3(); - $this->assertTrue(class_exists('testObjectFilter'), 'objectFilter hook allows complete manipulation of the generated script'); - $this->assertEquals(testObjectFilter::FOO, 'PHP5ObjectBuilder', 'objectFilter hook is called with the object builder as parameter'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/PeerBehaviorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/PeerBehaviorTest.php deleted file mode 100644 index 5e968f2c43..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/PeerBehaviorTest.php +++ /dev/null @@ -1,61 +0,0 @@ -assertEquals(Table3Peer::$customStaticAttribute, 1, 'staticAttributes hook is called when adding attributes'); - $this->assertEquals(Table3Peer::$staticAttributeBuilder, 'PHP5PeerBuilder', 'staticAttributes hook is called with the peer builder as parameter'); - } - - public function testStaticMethods() - { - $this->assertTrue(method_exists('Table3Peer', 'hello'), 'staticMethods hook is called when adding methods'); - $this->assertEquals(Table3Peer::hello(), 'PHP5PeerBuilder', 'staticMethods hook is called with the peer builder as parameter'); - } - - public function testPreSelect() - { - $con = Propel::getConnection(Table3Peer::DATABASE_NAME, Propel::CONNECTION_READ); - $con->preSelect = 0; - Table3Peer::doSelect(new Criteria, $con); - $this->assertNotEquals($con->preSelect, 0, 'preSelect hook is called in doSelect()'); - $con->preSelect = 0; - Table3Peer::doSelectOne(new Criteria, $con); - $this->assertNotEquals($con->preSelect, 0, 'preSelect hook is called in doSelectOne()'); - $con->preSelect = 0; - Table3Peer::doCount(new Criteria, $con); - $this->assertNotEquals($con->preSelect, 0, 'preSelect hook is called in doCount()'); - $con->preSelect = 0; - Table3Peer::doSelectStmt(new Criteria, $con); - $this->assertNotEquals($con->preSelect, 0, 'preSelect hook is called in doSelectStmt()'); - // and for the doSelectJoin and doCountJoin methods, well just believe my word - - $con->preSelect = 0; - Table3Peer::doSelect(new Criteria, $con); - $this->assertEquals($con->preSelect, 'PHP5PeerBuilder', 'preSelect hook is called with the peer builder as parameter'); - } - - public function testPeerFilter() - { - Table3Peer::TABLE_NAME; - $this->assertTrue(class_exists('testPeerFilter'), 'peerFilter hook allows complete manipulation of the generated script'); - $this->assertEquals(testPeerFilter::FOO, 'PHP5PeerBuilder', 'peerFilter hook is called with the peer builder as parameter'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/SoftDeleteBehaviorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/SoftDeleteBehaviorTest.php deleted file mode 100644 index 2f3fecb974..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/SoftDeleteBehaviorTest.php +++ /dev/null @@ -1,360 +0,0 @@ -assertEquals(count($table2->getColumns()), 3, 'SoftDelete adds one columns by default'); - $this->assertTrue(method_exists('Table4', 'getDeletedAt'), 'SoftDelete adds an updated_at column by default'); - $table1 = Table5Peer::getTableMap(); - $this->assertEquals(count($table1->getColumns()), 3, 'SoftDelete does not add a column when it already exists'); - $this->assertTrue(method_exists('Table5', 'getDeletedOn'), 'SoftDelete allows customization of deleted_column name'); - } - - public function testStaticSoftDeleteStatus() - { - $this->assertTrue(Table4Peer::isSoftDeleteEnabled(), 'The static soft delete is enabled by default'); - Table4Peer::disableSoftDelete(); - $this->assertFalse(Table4Peer::isSoftDeleteEnabled(), 'disableSoftDelete() disables the static soft delete'); - Table4Peer::enableSoftDelete(); - $this->assertTrue(Table4Peer::isSoftDeleteEnabled(), 'enableSoftDelete() enables the static soft delete'); - } - - public function testInstancePoolingAndSoftDelete() - { - Table4Peer::doForceDeleteAll($this->con); - $t = new Table4(); - $t->save($this->con); - Table4Peer::enableSoftDelete(); - $t->delete($this->con); - $t2 = Table4Peer::retrieveByPk($t->getPrimaryKey(), $this->con); - $this->assertNull($t2, 'An object is removed from the instance pool on soft deletion'); - Table4Peer::disableSoftDelete(); - $t2 = Table4Peer::retrieveByPk($t->getPrimaryKey(), $this->con); - $this->assertNotNull($t2); - Table4Peer::enableSoftDelete(); - $t2 = Table4Peer::retrieveByPk($t->getPrimaryKey(), $this->con); - $this->assertNull($t2, 'A soft deleted object is removed from the instance pool when the soft delete behavior is enabled'); - } - - public function testStaticDoForceDelete() - { - $t1 = new Table4(); - $t1->save(); - Table4Peer::doForceDelete($t1); - Table4Peer::disableSoftDelete(); - $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doForceDelete() actually deletes records'); - } - - public function testStaticDoSoftDelete() - { - $t1 = new Table4(); - $t1->save(); - $t2 = new Table4(); - $t2->save(); - $t3 = new Table4(); - $t3->save(); - // softDelete with a criteria - $c = new Criteria(); - $c->add(Table4Peer::ID, $t1->getId()); - Table4Peer::doSoftDelete($c); - Table4Peer::disableSoftDelete(); - $this->assertEquals(3, Table4Peer::doCount(new Criteria()), 'doSoftDelete() keeps deleted record in the database'); - Table4Peer::enableSoftDelete(); - $this->assertEquals(2, Table4Peer::doCount(new Criteria()), 'doSoftDelete() marks deleted record as deleted'); - // softDelete with a value - Table4Peer::doSoftDelete(array($t2->getId())); - Table4Peer::disableSoftDelete(); - $this->assertEquals(3, Table4Peer::doCount(new Criteria()), 'doSoftDelete() keeps deleted record in the database'); - Table4Peer::enableSoftDelete(); - $this->assertEquals(1, Table4Peer::doCount(new Criteria()), 'doSoftDelete() marks deleted record as deleted'); - // softDelete with an object - Table4Peer::doSoftDelete($t3); - Table4Peer::disableSoftDelete(); - $this->assertEquals(3, Table4Peer::doCount(new Criteria()), 'doSoftDelete() keeps deleted record in the database'); - Table4Peer::enableSoftDelete(); - $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doSoftDelete() marks deleted record as deleted'); - } - - public function testStaticDoDelete() - { - $t1 = new Table4(); - $t1->save(); - $t2 = new Table4(); - $t2->save(); - Table4Peer::disableSoftDelete(); - Table4Peer::doDelete($t1); - Table4Peer::disableSoftDelete(); - $this->assertEquals(1, Table4Peer::doCount(new Criteria()), 'doDelete() calls doForceDelete() when soft delete is disabled'); - Table4Peer::enableSoftDelete(); - Table4Peer::doDelete($t2); - Table4Peer::disableSoftDelete(); - $this->assertEquals(1, Table4Peer::doCount(new Criteria()), 'doDelete() calls doSoftDelete() when soft delete is enabled'); - Table4Peer::enableSoftDelete(); - $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doDelete() calls doSoftDelete() when soft delete is enabled'); - } - - public function testStaticDoForceDeleteAll() - { - $t1 = new Table4(); - $t1->save(); - Table4Peer::doForceDeleteAll(); - Table4Peer::disableSoftDelete(); - $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doForceDeleteAll() actually deletes records'); - } - - public function testStaticDoSoftDeleteAll() - { - $t1 = new Table4(); - $t1->save(); - $t2 = new Table4(); - $t2->save(); - Table4Peer::enableSoftDelete(); - Table4Peer::doSoftDeleteAll(); - Table4Peer::disableSoftDelete(); - $this->assertEquals(2, Table4Peer::doCount(new Criteria()), 'doSoftDeleteAll() keeps deleted record in the database'); - Table4Peer::enableSoftDelete(); - $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doSoftDeleteAll() marks deleted record as deleted'); - } - - public function testStaticDoDeleteAll() - { - $t1 = new Table4(); - $t1->save(); - $t2 = new Table4(); - $t2->save(); - Table4Peer::disableSoftDelete(); - Table4Peer::doDeleteAll(); - Table4Peer::disableSoftDelete(); - $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doDeleteAll() calls doForceDeleteAll() when soft delete is disabled'); - $t1 = new Table4(); - $t1->save(); - $t2 = new Table4(); - $t2->save(); - Table4Peer::enableSoftDelete(); - Table4Peer::doDeleteAll(); - Table4Peer::disableSoftDelete(); - $this->assertEquals(2, Table4Peer::doCount(new Criteria()), 'doDeleteAll() calls doSoftDeleteAll() when soft delete is disabled'); - Table4Peer::enableSoftDelete(); - $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doDeleteAll() calls doSoftDeleteAll() when soft delete is disabled'); - } - - public function testSelect() - { - $t = new Table4(); - $t->setDeletedAt(123); - $t->save(); - Table4Peer::enableSoftDelete(); - $this->assertEquals(0, Table4Peer::doCount(new Criteria), 'rows with a deleted_at date are hidden for select queries'); - Table4Peer::disableSoftDelete(); - $this->assertEquals(1, Table4Peer::doCount(new Criteria), 'rows with a deleted_at date are visible for select queries once the static soft_delete is enabled'); - $this->assertTrue(Table4Peer::isSoftDeleteEnabled(), 'Executing a select query enables the static soft delete again'); - } - - public function testDelete() - { - $t = new Table4(); - $t->save(); - $this->assertNull($t->getDeletedAt(), 'deleted_column is null by default'); - $t->delete(); - $this->assertNotNull($t->getDeletedAt(), 'deleted_column is not null after a soft delete'); - $this->assertEquals(0, Table4Peer::doCount(new Criteria), 'soft deleted rows are hidden for select queries'); - Table4Peer::disableSoftDelete(); - $this->assertEquals(1, Table4Peer::doCount(new Criteria), 'soft deleted rows are still present in the database'); - } - - public function testDeleteUndeletable() - { - $t = new UndeletableTable4(); - $t->save(); - $t->delete(); - $this->assertNull($t->getDeletedAt(), 'soft_delete is not triggered for objects wit ha preDelete hook returning false'); - $this->assertEquals(1, Table4Peer::doCount(new Criteria), 'soft_delete is not triggered for objects wit ha preDelete hook returning false'); - } - - public function testUnDelete() - { - $t = new Table4(); - $t->save(); - $t->delete(); - $t->undelete(); - $this->assertNull($t->getDeletedAt(), 'deleted_column is null again after an undelete'); - $this->assertEquals(1, Table4Peer::doCount(new Criteria), 'undeleted rows are visible for select queries'); - } - - public function testForceDelete() - { - $t = new Table4(); - $t->save(); - $t->forceDelete(); - $this->assertTrue($t->isDeleted(), 'forceDelete() actually deletes a row'); - Table4Peer::disableSoftDelete(); - $this->assertEquals(0, Table4Peer::doCount(new Criteria), 'forced deleted rows are not present in the database'); - } - - public function testQueryIncludeDeleted() - { - $t = new Table4(); - $t->setDeletedAt(123); - $t->save(); - Table4Peer::enableSoftDelete(); - $this->assertEquals(0, Table4Query::create()->count(), 'rows with a deleted_at date are hidden for select queries'); - $this->assertEquals(1, Table4Query::create()->includeDeleted()->count(), 'rows with a deleted_at date are visible for select queries using includeDeleted()'); - } - - public function testQueryForceDelete() - { - $t1 = new Table4(); - $t1->save(); - Table4Query::create()->filterById($t1->getId())->forceDelete(); - Table4Peer::disableSoftDelete(); - $this->assertEquals(0, Table4Query::create()->count(), 'forceDelete() actually deletes records'); - } - - public function testQuerySoftDelete() - { - $t1 = new Table4(); - $t1->save(); - $t2 = new Table4(); - $t2->save(); - $t3 = new Table4(); - $t3->save(); - - Table4Query::create() - ->filterById($t1->getId()) - ->softDelete(); - Table4Peer::disableSoftDelete(); - $this->assertEquals(3, Table4Query::create()->count(), 'softDelete() keeps deleted record in the database'); - Table4Peer::enableSoftDelete(); - $this->assertEquals(2, Table4Query::create()->count(), 'softDelete() marks deleted record as deleted'); - } - - public function testQueryDelete() - { - $t1 = new Table4(); - $t1->save(); - $t2 = new Table4(); - $t2->save(); - - Table4Peer::disableSoftDelete(); - Table4Query::create()->filterById($t1->getId())->delete(); - Table4Peer::disableSoftDelete(); - $this->assertEquals(1, Table4Query::create()->count(), 'delete() calls forceDelete() when soft delete is disabled'); - Table4Peer::enableSoftDelete(); - Table4Query::create()->filterById($t2->getId())->delete(); - Table4Peer::disableSoftDelete(); - $this->assertEquals(1, Table4Query::create()->count(), 'delete() calls softDelete() when soft delete is enabled'); - Table4Peer::enableSoftDelete(); - $this->assertEquals(0, Table4Query::create()->count(), 'delete() calls softDelete() when soft delete is enabled'); - } - - public function testQueryForceDeleteAll() - { - $t1 = new Table4(); - $t1->save(); - Table4Query::create()->forceDeleteAll(); - Table4Peer::disableSoftDelete(); - $this->assertEquals(0, Table4Query::create()->count(), 'forceDeleteAll() actually deletes records'); - } - - public function testQuerySoftDeleteAll() - { - $t1 = new Table4(); - $t1->save(); - $t2 = new Table4(); - $t2->save(); - Table4Peer::enableSoftDelete(); - Table4Query::create()->softDelete(); - Table4Peer::disableSoftDelete(); - $this->assertEquals(2, Table4Query::create()->count(), 'softDelete() keeps deleted record in the database'); - Table4Peer::enableSoftDelete(); - $this->assertEquals(0, Table4Query::create()->count(), 'softDelete() marks deleted record as deleted'); - } - - public function testQueryDeleteAll() - { - $t1 = new Table4(); - $t1->save(); - $t2 = new Table4(); - $t2->save(); - Table4Peer::disableSoftDelete(); - Table4Query::create()->deleteAll(); - Table4Peer::disableSoftDelete(); - $this->assertEquals(0, Table4Query::create()->count(), 'deleteAll() calls forceDeleteAll() when soft delete is disabled'); - - $t1 = new Table4(); - $t1->save(); - $t2 = new Table4(); - $t2->save(); - Table4Peer::enableSoftDelete(); - Table4Query::create()->deleteAll(); - Table4Peer::disableSoftDelete(); - $this->assertEquals(2, Table4Query::create()->count(), 'deleteAll() calls softDeleteAll() when soft delete is disabled'); - Table4Peer::enableSoftDelete(); - $this->assertEquals(0, Table4Query::create()->count(), 'deleteAll() calls softDeleteAll() when soft delete is disabled'); - } - - public function testQuerySelect() - { - $t = new Table4(); - $t->setDeletedAt(123); - $t->save(); - Table4Peer::enableSoftDelete(); - $this->assertEquals(0, Table4Query::create()->count(), 'rows with a deleted_at date are hidden for select queries'); - Table4Peer::disableSoftDelete(); - $this->assertEquals(1, Table4Query::create()->count(), 'rows with a deleted_at date are visible for select queries once the static soft_delete is enabled'); - $this->assertTrue(Table4Peer::isSoftDeleteEnabled(), 'Executing a select query enables the static soft delete again'); - } - - public function testCustomization() - { - Table5Peer::disableSoftDelete(); - Table5Peer::doDeleteAll(); - Table5Peer::enableSoftDelete(); - $t = new Table5(); - $t->save(); - $this->assertNull($t->getDeletedOn(), 'deleted_column is null by default'); - $t->delete(); - $this->assertNotNull($t->getDeletedOn(), 'deleted_column is not null after a soft delete'); - $this->assertEquals(0, Table5Peer::doCount(new Criteria), 'soft deleted rows are hidden for select queries'); - Table5Peer::disableSoftDelete(); - $this->assertEquals(1, Table5Peer::doCount(new Criteria), 'soft deleted rows are still present in the database'); - } -} - -class UndeletableTable4 extends Table4 -{ - public function preDelete(PropelPDO $con = null) - { - parent::preDelete($con); - $this->setTitle('foo'); - return false; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/TableBehaviorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/TableBehaviorTest.php deleted file mode 100644 index 25e534f7e5..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/TableBehaviorTest.php +++ /dev/null @@ -1,34 +0,0 @@ -assertTrue($t->hasColumn('test'), 'modifyTable hook is called when building the model structure'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/TimestampableBehaviorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/TimestampableBehaviorTest.php deleted file mode 100644 index ba80d64f8b..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/TimestampableBehaviorTest.php +++ /dev/null @@ -1,215 +0,0 @@ -assertEquals(count($table2->getColumns()), 4, 'Timestampable adds two columns by default'); - $this->assertTrue(method_exists('Table2', 'getCreatedAt'), 'Timestamplable adds a created_at column by default'); - $this->assertTrue(method_exists('Table2', 'getUpdatedAt'), 'Timestamplable adds an updated_at column by default'); - $table1 = Table1Peer::getTableMap(); - $this->assertEquals(count($table1->getColumns()), 4, 'Timestampable does not add two columns when they already exist'); - $this->assertTrue(method_exists('Table1', 'getCreatedOn'), 'Timestamplable allows customization of create_column name'); - $this->assertTrue(method_exists('Table1', 'getUpdatedOn'), 'Timestamplable allows customization of update_column name'); - } - - public function testPreSave() - { - $t1 = new Table2(); - $this->assertNull($t1->getUpdatedAt()); - $tsave = time(); - $t1->save(); - $this->assertEquals($t1->getUpdatedAt('U'), $tsave, 'Timestampable sets updated_column to time() on creation'); - sleep(1); - $t1->setTitle('foo'); - $tupdate = time(); - $t1->save(); - $this->assertEquals($t1->getUpdatedAt('U'), $tupdate, 'Timestampable changes updated_column to time() on update'); - } - - public function testPreSaveNoChange() - { - $t1 = new Table2(); - $this->assertNull($t1->getUpdatedAt()); - $tsave = time(); - $t1->save(); - $this->assertEquals($t1->getUpdatedAt('U'), $tsave, 'Timestampable sets updated_column to time() on creation'); - sleep(1); - $tupdate = time(); - $t1->save(); - $this->assertEquals($t1->getUpdatedAt('U'), $tsave, 'Timestampable only changes updated_column if the object was modified'); - } - - public function testPreSaveManuallyUpdated() - { - $t1 = new Table2(); - $t1->setUpdatedAt(time() - 10); - $tsave = time(); - $t1->save(); - $this->assertNotEquals($t1->getUpdatedAt('U'), $tsave, 'Timestampable does not set updated_column to time() on creation when it is set by the user'); - // tip: if I set it to time()-10 a second time, the object sees that I want to change it to the same value - // and skips the update, therefore the updated_at is not in the list of modified columns, - // and the behavior changes it to the current date... let's say it's an edge case - $t1->setUpdatedAt(time() - 15); - $tupdate = time(); - $t1->save(); - $this->assertNotEquals($t1->getUpdatedAt('U'), $tupdate, 'Timestampable does not change updated_column to time() on update when it is set by the user'); - } - - public function testPreInsert() - { - $t1 = new Table2(); - $this->assertNull($t1->getCreatedAt()); - $tsave = time(); - $t1->save(); - $this->assertEquals($t1->getCreatedAt('U'), $tsave, 'Timestampable sets created_column to time() on creation'); - sleep(1); - $t1->setTitle('foo'); - $tupdate = time(); - $t1->save(); - $this->assertEquals($t1->getCreatedAt('U'), $tsave, 'Timestampable does not update created_column on update'); - } - - public function testPreInsertManuallyUpdated() - { - $t1 = new Table2(); - $t1->setCreatedAt(time() - 10); - $tsave = time(); - $t1->save(); - $this->assertNotEquals($t1->getCreatedAt('U'), $tsave, 'Timestampable does not set created_column to time() on creation when it is set by the user'); - } - - public function testObjectKeepUpdateDateUnchanged() - { - $t1 = new Table2(); - $t1->setUpdatedAt(time() - 10); - $tsave = time(); - $t1->save(); - $this->assertNotEquals($t1->getUpdatedAt('U'), $tsave); - // let's save it a second time; the updated_at should be changed - $t1->setTitle('foo'); - $tsave = time(); - $t1->save(); - $this->assertEquals($t1->getUpdatedAt('U'), $tsave); - - // now let's do this a second time - $t1 = new Table2(); - $t1->setUpdatedAt(time() - 10); - $tsave = time(); - $t1->save(); - $this->assertNotEquals($t1->getUpdatedAt('U'), $tsave); - // let's save it a second time; the updated_at should be changed - $t1->keepUpdateDateUnchanged(); - $t1->setTitle('foo'); - $tsave = time(); - $t1->save(); - $this->assertNotEquals($t1->getUpdatedAt('U'), $tsave, 'keepUpdateDateUnchanged() prevents the behavior from updating the update date'); - - } - - protected function populateUpdatedAt() - { - Table2Query::create()->deleteAll(); - $ts = new PropelObjectCollection(); - $ts->setModel('Table2'); - for ($i=0; $i < 10; $i++) { - $t = new Table2(); - $t->setTitle('UpdatedAt' . $i); - $t->setUpdatedAt(time() - $i * 24 * 60 * 60); - $ts[]= $t; - } - $ts->save(); - } - - protected function populateCreatedAt() - { - Table2Query::create()->deleteAll(); - $ts = new PropelObjectCollection(); - $ts->setModel('Table2'); - for ($i=0; $i < 10; $i++) { - $t = new Table2(); - $t->setTitle('CreatedAt' . $i); - $t->setCreatedAt(time() - $i * 24 * 60 * 60); - $ts[]= $t; - } - $ts->save(); - } - - public function testQueryRecentlyUpdated() - { - $q = Table2Query::create()->recentlyUpdated(); - $this->assertTrue($q instanceof Table2Query, 'recentlyUpdated() returns the current Query object'); - $this->populateUpdatedAt(); - $ts = Table2Query::create()->recentlyUpdated()->count(); - $this->assertEquals(8, $ts, 'recentlyUpdated() returns the elements updated in the last 7 days by default'); - $ts = Table2Query::create()->recentlyUpdated(5)->count(); - $this->assertEquals(6, $ts, 'recentlyUpdated() accepts a number of days as parameter'); - } - - public function testQueryRecentlyCreated() - { - $q = Table2Query::create()->recentlyCreated(); - $this->assertTrue($q instanceof Table2Query, 'recentlyCreated() returns the current Query object'); - $this->populateCreatedAt(); - $ts = Table2Query::create()->recentlyCreated()->count(); - $this->assertEquals(8, $ts, 'recentlyCreated() returns the elements created in the last 7 days by default'); - $ts = Table2Query::create()->recentlyCreated(5)->count(); - $this->assertEquals(6, $ts, 'recentlyCreated() accepts a number of days as parameter'); - } - - public function testQueryLastUpdatedFirst() - { - $q = Table2Query::create()->lastUpdatedFirst(); - $this->assertTrue($q instanceof Table2Query, 'lastUpdatedFirst() returns the current Query object'); - $this->populateUpdatedAt(); - $t = Table2Query::create()->lastUpdatedFirst()->findOne(); - $this->assertEquals('UpdatedAt0', $t->getTitle(), 'lastUpdatedFirst() returns element with most recent update date first'); - } - - public function testQueryFirstUpdatedFirst() - { - $q = Table2Query::create()->firstUpdatedFirst(); - $this->assertTrue($q instanceof Table2Query, 'firstUpdatedFirst() returns the current Query object'); - $this->populateUpdatedAt(); - $t = Table2Query::create()->firstUpdatedFirst()->findOne(); - $this->assertEquals('UpdatedAt9', $t->getTitle(), 'firstUpdatedFirst() returns the element with oldest updated date first'); - } - - public function testQueryLastCreatedFirst() - { - $q = Table2Query::create()->lastCreatedFirst(); - $this->assertTrue($q instanceof Table2Query, 'lastCreatedFirst() returns the current Query object'); - $this->populateCreatedAt(); - $t = Table2Query::create()->lastCreatedFirst()->findOne(); - $this->assertEquals('CreatedAt0', $t->getTitle(), 'lastCreatedFirst() returns element with most recent create date first'); - } - - public function testQueryFirstCreatedFirst() - { - $q = Table2Query::create()->firstCreatedFirst(); - $this->assertTrue($q instanceof Table2Query, 'firstCreatedFirst() returns the current Query object'); - $this->populateCreatedAt(); - $t = Table2Query::create()->firstCreatedFirst()->findOne(); - $this->assertEquals('CreatedAt9', $t->getTitle(), 'firstCreatedFirst() returns the element with oldest create date first'); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/aggregate_column/AggregateColumnBehaviorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/aggregate_column/AggregateColumnBehaviorTest.php deleted file mode 100644 index 3019727c54..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/aggregate_column/AggregateColumnBehaviorTest.php +++ /dev/null @@ -1,254 +0,0 @@ -assertEquals(count($postTable->getColumns()), 2, 'AggregateColumn adds one column by default'); - $this->assertTrue(method_exists('AggregatePost', 'getNbComments')); - } - - public function testCompute() - { - AggregateCommentQuery::create()->deleteAll($this->con); - AggregatePostQuery::create()->deleteAll($this->con); - $post = new AggregatePost(); - $post->save($this->con); - $this->assertEquals(0, $post->computeNbComments($this->con), 'The compute method returns 0 for objects with no related objects'); - $comment1 = new AggregateComment(); - $comment1->setAggregatePost($post); - $comment1->save($this->con); - $this->assertEquals(1, $post->computeNbComments($this->con), 'The compute method computes the aggregate function on related objects'); - $comment2 = new AggregateComment(); - $comment2->setAggregatePost($post); - $comment2->save($this->con); - $this->assertEquals(2, $post->computeNbComments($this->con), 'The compute method computes the aggregate function on related objects'); - $comment1->delete($this->con); - $this->assertEquals(1, $post->computeNbComments($this->con), 'The compute method computes the aggregate function on related objects'); - } - - public function testUpdate() - { - AggregateCommentQuery::create()->deleteAll($this->con); - AggregatePostQuery::create()->deleteAll($this->con); - $post = new AggregatePost(); - $post->save($this->con); - $comment = new TestableComment(); - $comment->setAggregatePost($post); - $comment->save($this->con); - $this->assertNull($post->getNbComments()); - $post->updateNbComments($this->con); - $this->assertEquals(1, $post->getNbComments(), 'The update method updates the aggregate column'); - $comment->delete($this->con); - $this->assertEquals(1, $post->getNbComments()); - $post->updateNbComments($this->con); - $this->assertEquals(0, $post->getNbComments(), 'The update method updates the aggregate column'); - } - - public function testCreateRelated() - { - AggregateCommentQuery::create()->deleteAll($this->con); - AggregatePostQuery::create()->deleteAll($this->con); - $post = new AggregatePost(); - $post->save($this->con); - $comment1 = new AggregateComment(); - $comment1->save($this->con); - $this->assertNull($post->getNbComments(), 'Adding a new foreign object does not update the aggregate column'); - $comment2 = new AggregateComment(); - $comment2->setAggregatePost($post); - $comment2->save($this->con); - $this->assertEquals(1, $post->getNbComments(), 'Adding a new related object updates the aggregate column'); - $comment3 = new AggregateComment(); - $comment3->setAggregatePost($post); - $comment3->save($this->con); - $this->assertEquals(2, $post->getNbComments(), 'Adding a new related object updates the aggregate column'); - } - - public function testUpdateRelated() - { - list($poll, $item1, $item2) = $this->populatePoll(); - $this->assertEquals(19, $poll->getTotalScore()); - $item1->setScore(10); - $item1->save($this->con); - $this->assertEquals(17, $poll->getTotalScore(), 'Updating a related object updates the aggregate column'); - } - - public function testDeleteRelated() - { - list($poll, $item1, $item2) = $this->populatePoll(); - $this->assertEquals(19, $poll->getTotalScore()); - $item1->delete($this->con); - $this->assertEquals(7, $poll->getTotalScore(), 'Deleting a related object updates the aggregate column'); - $item2->delete($this->con); - $this->assertNull($poll->getTotalScore(), 'Deleting a related object updates the aggregate column'); - } - - public function testUpdateRelatedWithQuery() - { - list($poll, $item1, $item2) = $this->populatePoll(); - $this->assertEquals(19, $poll->getTotalScore()); - AggregateItemQuery::create() - ->update(array('Score' => 4), $this->con); - $this->assertEquals(8, $poll->getTotalScore(), 'Updating related objects with a query updates the aggregate column'); - } - - public function testUpdateRelatedWithQueryUsingAlias() - { - list($poll, $item1, $item2) = $this->populatePoll(); - $this->assertEquals(19, $poll->getTotalScore()); - AggregateItemQuery::create() - ->setModelAlias('foo', true) - ->update(array('Score' => 4), $this->con); - $this->assertEquals(8, $poll->getTotalScore(), 'Updating related objects with a query using alias updates the aggregate column'); - } - - public function testDeleteRelatedWithQuery() - { - list($poll, $item1, $item2) = $this->populatePoll(); - $this->assertEquals(19, $poll->getTotalScore()); - AggregateItemQuery::create() - ->deleteAll($this->con); - $this->assertNull($poll->getTotalScore(), 'Deleting related objects with a query updates the aggregate column'); - } - - public function testDeleteRelatedWithQueryUsingAlias() - { - list($poll, $item1, $item2) = $this->populatePoll(); - $this->assertEquals(19, $poll->getTotalScore()); - AggregateItemQuery::create() - ->setModelAlias('foo', true) - ->filterById($item1->getId()) - ->delete($this->con); - $this->assertEquals(7, $poll->getTotalScore(), 'Deleting related objects with a query using alias updates the aggregate column'); - } - - public function testRemoveRelation() - { - AggregateCommentQuery::create()->deleteAll($this->con); - AggregatePostQuery::create()->deleteAll($this->con); - $post = new AggregatePost(); - $post->save($this->con); - $comment1 = new AggregateComment(); - $comment1->setAggregatePost($post); - $comment1->save($this->con); - $comment2 = new AggregateComment(); - $comment2->setAggregatePost($post); - $comment2->save($this->con); - $this->assertEquals(2, $post->getNbComments()); - $comment2->setAggregatePost(null); - $comment2->save($this->con); - $this->assertEquals(1, $post->getNbComments(), 'Removing a relation changes the related object aggregate column'); - } - - public function testReplaceRelation() - { - AggregateCommentQuery::create()->deleteAll($this->con); - AggregatePostQuery::create()->deleteAll($this->con); - $post1 = new AggregatePost(); - $post1->save($this->con); - $post2 = new AggregatePost(); - $post2->save($this->con); - $comment = new AggregateComment(); - $comment->setAggregatePost($post1); - $comment->save($this->con); - $this->assertEquals(1, $post1->getNbComments()); - $this->assertNull($post2->getNbComments()); - $comment->setAggregatePost($post2); - $comment->save($this->con); - $this->assertEquals(0, $post1->getNbComments(), 'Replacing a relation changes the related object aggregate column'); - $this->assertEquals(1, $post2->getNbComments(), 'Replacing a relation changes the related object aggregate column'); - } - - protected function populatePoll() - { - AggregateItemQuery::create()->deleteAll($this->con); - AggregatePollQuery::create()->deleteAll($this->con); - $poll = new AggregatePoll(); - $poll->save($this->con); - $item1 = new AggregateItem(); - $item1->setScore(12); - $item1->setAggregatePoll($poll); - $item1->save($this->con); - $item2 = new AggregateItem(); - $item2->setScore(7); - $item2->setAggregatePoll($poll); - $item2->save($this->con); - return array($poll, $item1, $item2); - } - -} - -class TestableComment extends AggregateComment -{ - // overrides the parent save() to bypass behavior hooks - public function save(PropelPDO $con = null) - { - $con->beginTransaction(); - try { - $affectedRows = $this->doSave($con); - AggregateCommentPeer::addInstanceToPool($this); - $con->commit(); - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - // overrides the parent delete() to bypass behavior hooks - public function delete(PropelPDO $con = null) - { - $con->beginTransaction(); - try { - TestableAggregateCommentQuery::create() - ->filterByPrimaryKey($this->getPrimaryKey()) - ->delete($con); - $con->commit(); - $this->setDeleted(true); - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - -} - -class TestableAggregateCommentQuery extends AggregateCommentQuery -{ - public static function create($modelAlias = null, $criteria = null) - { - return new TestableAggregateCommentQuery(); - } - - // overrides the parent basePreDelete() to bypass behavior hooks - protected function basePreDelete(PropelPDO $con) - { - return $this->preDelete($con); - } - - // overrides the parent basePostDelete() to bypass behavior hooks - protected function basePostDelete($affectedRows, PropelPDO $con) - { - return $this->postDelete($affectedRows, $con); - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/concrete_inheritance/ConcreteInheritanceBehaviorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/concrete_inheritance/ConcreteInheritanceBehaviorTest.php deleted file mode 100644 index 8c86fa122d..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/concrete_inheritance/ConcreteInheritanceBehaviorTest.php +++ /dev/null @@ -1,202 +0,0 @@ -getBehaviors(); - $this->assertTrue(array_key_exists('concrete_inheritance_parent', $behaviors), 'modifyTable() gives the parent table the concrete_inheritance_parent behavior'); - $this->assertEquals('descendant_class', $behaviors['concrete_inheritance_parent']['descendant_column'], 'modifyTable() passed the descendent_column parameter to the parent behavior'); - } - - public function testModifyTableAddsParentColumn() - { - $contentColumns = array('id', 'title', 'category_id'); - $article = ConcreteArticlePeer::getTableMap(); - foreach ($contentColumns as $column) { - $this->assertTrue($article->containsColumn($column), 'modifyTable() adds the columns of the parent table'); - } - $quizz = ConcreteQuizzPeer::getTableMap(); - $this->assertEquals(3, count($quizz->getColumns()), 'modifyTable() does not add a column of the parent table if a similar column exists'); - } - - public function testModifyTableCopyDataAddsOneToOneRelationships() - { - $article = ConcreteArticlePeer::getTableMap(); - $this->assertTrue($article->hasRelation('ConcreteContent'), 'modifyTable() adds a relationship to the parent'); - $relation = $article->getRelation('ConcreteContent'); - $this->assertEquals(RelationMap::MANY_TO_ONE, $relation->getType(), 'modifyTable adds a one-to-one relationship'); - $content = ConcreteContentPeer::getTableMap(); - $relation = $content->getRelation('ConcreteArticle'); - $this->assertEquals(RelationMap::ONE_TO_ONE, $relation->getType(), 'modifyTable adds a one-to-one relationship'); - } - - public function testModifyTableNoCopyDataNoParentRelationship() - { - $quizz = ConcreteQuizzPeer::getTableMap(); - $this->assertFalse($quizz->hasRelation('ConcreteContent'), 'modifyTable() does not add a relationship to the parent when copy_data is false'); - } - - public function testModifyTableCopyDataRemovesAutoIncrement() - { - $content = new ConcreteContent(); - $content->save(); - $c = new Criteria; - $c->add(ConcreteArticlePeer::ID, $content->getId()); - try { - ConcreteArticlePeer::doInsert($c); - $this->assertTrue(true, 'modifyTable() removed autoIncrement from copied Primary keys'); - } catch (PropelException $e) { - $this->fail('modifyTable() removed autoIncrement from copied Primary keys'); - } - } - - /** - * @expectedException PropelException - */ - public function testModifyTableNoCopyDataKeepsAutoIncrement() - { - $content = new ConcreteContent(); - $content->save(); - $c = new Criteria; - $c->add(ConcreteQuizzPeer::ID, $content->getId()); - ConcreteQuizzPeer::doInsert($c); - } - - public function testModifyTableAddsForeignKeys() - { - $article = ConcreteArticlePeer::getTableMap(); - $this->assertTrue($article->hasRelation('ConcreteCategory'), 'modifyTable() copies relationships from parent table'); - } - - public function testModifyTableAddsForeignKeysWithoutDuplicates() - { - $article = ConcreteAuthorPeer::getTableMap(); - $this->assertTrue($article->hasRelation('ConcreteNews'), 'modifyTable() copies relationships from parent table and removes hardcoded refPhpName'); - } - - public function testModifyTableAddsValidators() - { - $article = ConcreteArticlePeer::getTableMap(); - $this->assertTrue($article->getColumn('title')->hasValidators(), 'modifyTable() copies validators from parent table'); - } - - // no way to test copying of indices and uniques, except by reverse engineering the db... - - public function testParentObjectClass() - { - $article = new ConcreteArticle(); // to autoload the BaseConcreteArticle class - $r = new ReflectionClass('BaseConcreteArticle'); - $this->assertEquals('ConcreteContent', $r->getParentClass()->getName(), 'concrete_inheritance changes the parent class of the Model Object to the parent object class'); - $quizz = new ConcreteQuizz(); // to autoload the BaseConcreteQuizz class - $r = new ReflectionClass('BaseConcreteQuizz'); - $this->assertEquals('ConcreteContent', $r->getParentClass()->getName(), 'concrete_inheritance changes the parent class of the Model Object to the parent object class'); - } - - public function testParentQueryClass() - { - $q = new ConcreteArticleQuery(); // to autoload the BaseConcreteArticleQuery class - $r = new ReflectionClass('BaseConcreteArticleQuery'); - $this->assertEquals('ConcreteContentQuery', $r->getParentClass()->getName(), 'concrete_inheritance changes the parent class of the Query Object to the parent object class'); - $q = new ConcreteQuizzQuery(); // to autoload the BaseConcreteQuizzQuery class - $r = new ReflectionClass('BaseConcreteQuizzQuery'); - $this->assertEquals('ConcreteContentQuery', $r->getParentClass()->getName(), 'concrete_inheritance changes the parent class of the Query Object to the parent object class'); - } - - public function testPreSaveCopyData() - { - ConcreteArticleQuery::create()->deleteAll(); - ConcreteQuizzQuery::create()->deleteAll(); - ConcreteContentQuery::create()->deleteAll(); - ConcreteCategoryQuery::create()->deleteAll(); - $category = new ConcreteCategory(); - $category->setName('main'); - $article = new ConcreteArticle(); - $article->setConcreteCategory($category); - $article->save(); - $this->assertNotNull($article->getId()); - $this->assertNotNull($category->getId()); - $content = ConcreteContentQuery::create()->findPk($article->getId()); - $this->assertNotNull($content); - $this->assertEquals($category->getId(), $content->getCategoryId()); - } - - public function testPreSaveNoCopyData() - { - ConcreteArticleQuery::create()->deleteAll(); - ConcreteQuizzQuery::create()->deleteAll(); - ConcreteContentQuery::create()->deleteAll(); - $quizz = new ConcreteQuizz(); - $quizz->save(); - $this->assertNotNull($quizz->getId()); - $content = ConcreteContentQuery::create()->findPk($quizz->getId()); - $this->assertNull($content); - } - - public function testGetParentOrCreateNew() - { - $article = new ConcreteArticle(); - $content = $article->getParentOrCreate(); - $this->assertTrue($content instanceof ConcreteContent, 'getParentOrCreate() returns an instance of the parent class'); - $this->assertTrue($content->isNew(), 'getParentOrCreate() returns a new instance of the parent class if the object is new'); - $this->assertEquals('ConcreteArticle', $content->getDescendantClass(), 'getParentOrCreate() correctly sets the descendant_class of the parent object'); - } - - public function testGetParentOrCreateExisting() - { - $article = new ConcreteArticle(); - $article->save(); - ConcreteContentPeer::clearInstancePool(); - $content = $article->getParentOrCreate(); - $this->assertTrue($content instanceof ConcreteContent, 'getParentOrCreate() returns an instance of the parent class'); - $this->assertFalse($content->isNew(), 'getParentOrCreate() returns an existing instance of the parent class if the object is persisted'); - $this->assertEquals($article->getId(), $content->getId(), 'getParentOrCreate() returns the parent object related to the current object'); - } - - public function testGetSyncParent() - { - $category = new ConcreteCategory(); - $category->setName('main'); - $article = new ConcreteArticle(); - $article->setTitle('FooBar'); - $article->setConcreteCategory($category); - $content = $article->getSyncParent(); - $this->assertEquals('FooBar', $content->getTitle(), 'getSyncParent() returns a synchronized parent object'); - $this->assertEquals($category, $content->getConcreteCategory(), 'getSyncParent() returns a synchronized parent object'); - } - - public function testPostDeleteCopyData() - { - ConcreteArticleQuery::create()->deleteAll(); - ConcreteQuizzQuery::create()->deleteAll(); - ConcreteContentQuery::create()->deleteAll(); - ConcreteCategoryQuery::create()->deleteAll(); - $category = new ConcreteCategory(); - $category->setName('main'); - $article = new ConcreteArticle(); - $article->setConcreteCategory($category); - $article->save(); - $id = $article->getId(); - $article->delete(); - $this->assertNull(ConcreteContentQuery::create()->findPk($id), 'delete() removes the parent record as well'); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/concrete_inheritance/ConcreteInheritanceParentBehaviorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/concrete_inheritance/ConcreteInheritanceParentBehaviorTest.php deleted file mode 100644 index b62cd3d00b..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/concrete_inheritance/ConcreteInheritanceParentBehaviorTest.php +++ /dev/null @@ -1,53 +0,0 @@ -deleteAll(); - ConcreteQuizzQuery::create()->deleteAll(); - ConcreteContentQuery::create()->deleteAll(); - $content = new ConcreteContent(); - $content->save(); - $this->assertFalse($content->hasChildObject()); - - $article = new ConcreteArticle(); - $article->save(); - $content = $article->getConcreteContent(); - $this->assertTrue($content->hasChildObject()); - } - - public function testGetChildObject() - { - ConcreteArticleQuery::create()->deleteAll(); - ConcreteQuizzQuery::create()->deleteAll(); - ConcreteContentQuery::create()->deleteAll(); - $content = new ConcreteContent(); - $content->save(); - $this->assertNull($content->getChildObject()); - - $article = new ConcreteArticle(); - $article->save(); - $content = $article->getConcreteContent(); - $this->assertEquals($article, $content->getChildObject()); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorObjectBuilderModifierTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorObjectBuilderModifierTest.php deleted file mode 100644 index 2abb542d1d..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorObjectBuilderModifierTest.php +++ /dev/null @@ -1,1351 +0,0 @@ -setTreeLeft('123'); - $this->assertEquals($t->getLeftValue(), '123', 'nested_set adds a getLeftValue() method'); - $t->setTreeRight('456'); - $this->assertEquals($t->getRightValue(), '456', 'nested_set adds a getRightValue() method'); - $t->setLevel('789'); - $this->assertEquals($t->getLevel(), '789', 'nested_set adds a getLevel() method'); - } - - public function testParameters() - { - $t = new Table10(); - $t->setMyLeftColumn('123'); - $this->assertEquals($t->getLeftValue(), '123', 'nested_set adds a getLeftValue() method'); - $t->setMyRightColumn('456'); - $this->assertEquals($t->getRightValue(), '456', 'nested_set adds a getRightValue() method'); - $t->setMyLevelColumn('789'); - $this->assertEquals($t->getLevel(), '789', 'nested_set adds a getLevel() method'); - $t->setMyScopeColumn('012'); - $this->assertEquals($t->getScopeValue(), '012', 'nested_set adds a getScopeValue() method'); - } - - public function testObjectAttributes() - { - $expectedAttributes = array('nestedSetQueries'); - foreach ($expectedAttributes as $attribute) { - $this->assertClassHasAttribute($attribute, 'Table9'); - } - } - - public function testSaveOutOfTree() - { - Table9Peer::doDeleteAll(); - $t1 = new Table9(); - $t1->setTitle('t1'); - try { - $t1->save(); - $this->assertTrue(true, 'A node can be saved without valid tree information'); - } catch (Exception $e) { - $this->fail('A node can be saved without valid tree information'); - } - try { - $t1->makeRoot(); - $this->assertTrue(true, 'A saved node can be turned into root'); - } catch (Exception $e) { - $this->fail('A saved node can be turned into root'); - } - $t1->save(); - $t2 = new Table9(); - $t2->setTitle('t1'); - $t2->save(); - try { - $t2->insertAsFirstChildOf($t1); - $this->assertTrue(true, 'A saved node can be inserted into the tree'); - } catch (Exception $e) { - $this->fail('A saved node can be inserted into the tree'); - } - try { - $t2->save(); - $this->assertTrue(true, 'A saved node can be inserted into the tree'); - } catch (Exception $e) { - $this->fail('A saved node can be inserted into the tree'); - } - } - - public function testPreUpdate() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - $t3->setLeftValue(null); - try { - $t3->save(); - $this->fail('Trying to save a node incorrectly updated throws an exception'); - } catch (Exception $e) { - $this->assertTrue(true, 'Trying to save a node incorrectly updated throws an exception'); - } - } - - public function testDelete() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $t5->delete(); - $this->assertEquals(13, $t3->getRightValue(), 'delete() does not update existing nodes (because delete() clears the instance cache)'); - $expected = array( - 't1' => array(1, 8, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 7, 1), - 't4' => array(5, 6, 2), - ); - $this->assertEquals($expected, $this->dumpTree(), 'delete() deletes all descendants and shifts the entire subtree correctly'); - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - try { - $t1->delete(); - $this->fail('delete() throws an exception when called on a root node'); - } catch (PropelException $e) { - $this->assertTrue(true, 'delete() throws an exception when called on a root node'); - } - $this->assertNotEquals(array(), Table9Peer::doSelect(new Criteria()), 'delete() called on the root node does not delete the whole tree'); - } - - public function testMakeRoot() - { - $t = new Table9(); - $t->makeRoot(); - $this->assertEquals($t->getLeftValue(), 1, 'makeRoot() initializes left_column to 1'); - $this->assertEquals($t->getRightValue(), 2, 'makeRoot() initializes right_column to 2'); - $this->assertEquals($t->getLevel(), 0, 'makeRoot() initializes right_column to 0'); - $t = new Table9(); - $t->setLeftValue(12); - try { - $t->makeRoot(); - $this->fail('makeRoot() throws an exception when called on an object with a left_column value'); - } catch (PropelException $e) { - $this->assertTrue(true, 'makeRoot() throws an exception when called on an object with a left_column value'); - } - } - - public function testIsInTree() - { - $t1 = new Table9(); - $this->assertFalse($t1->isInTree(), 'inInTree() returns false for nodes with no left and right value'); - $t1->save(); - $this->assertFalse($t1->isInTree(), 'inInTree() returns false for saved nodes with no left and right value'); - $t1->setLeftValue(1)->setRightValue(0); - $this->assertFalse($t1->isInTree(), 'inInTree() returns false for nodes with zero left value'); - $t1->setLeftValue(0)->setRightValue(1); - $this->assertFalse($t1->isInTree(), 'inInTree() returns false for nodes with zero right value'); - $t1->setLeftValue(1)->setRightValue(1); - $this->assertFalse($t1->isInTree(), 'inInTree() returns false for nodes with equal left and right value'); - $t1->setLeftValue(1)->setRightValue(2); - $this->assertTrue($t1->isInTree(), 'inInTree() returns true for nodes with left < right value'); - $t1->setLeftValue(2)->setRightValue(1); - $this->assertFalse($t1->isInTree(), 'inInTree() returns false for nodes with left > right value'); - } - - public function testIsRoot() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertTrue($t1->isRoot(), 'root is seen as root'); - $this->assertFalse($t2->isRoot(), 'leaf is not seen as root'); - $this->assertFalse($t3->isRoot(), 'node is not seen as root'); - } - - public function testIsLeaf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertFalse($t1->isLeaf(), 'root is not seen as leaf'); - $this->assertTrue($t2->isLeaf(), 'leaf is seen as leaf'); - $this->assertFalse($t3->isLeaf(), 'node is not seen as leaf'); - } - - public function testIsDescendantOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertFalse($t1->isDescendantOf($t1), 'root is not seen as a descendant of root'); - $this->assertTrue($t2->isDescendantOf($t1), 'direct child is seen as a descendant of root'); - $this->assertFalse($t1->isDescendantOf($t2), 'root is not seen as a descendant of leaf'); - $this->assertTrue($t5->isDescendantOf($t1), 'grandchild is seen as a descendant of root'); - $this->assertTrue($t5->isDescendantOf($t3), 'direct child is seen as a descendant of node'); - $this->assertFalse($t3->isDescendantOf($t5), 'node is not seen as a descendant of its parent'); - } - - public function testIsAncestorOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertFalse($t1->isAncestorOf($t1), 'root is not seen as an ancestor of root'); - $this->assertTrue($t1->isAncestorOf($t2), 'root is seen as an ancestor of direct child'); - $this->assertFalse($t2->isAncestorOf($t1), 'direct child is not seen as an ancestor of root'); - $this->assertTrue($t1->isAncestorOf($t5), 'root is seen as an ancestor of grandchild'); - $this->assertTrue($t3->isAncestorOf($t5), 'parent is seen as an ancestor of node'); - $this->assertFalse($t5->isAncestorOf($t3), 'child is not seen as an ancestor of its parent'); - } - - public function testHasParent() - { - Table9Peer::doDeleteAll(); - $t0 = new Table9(); - $t1 = new Table9(); - $t1->setTitle('t1')->setLeftValue(1)->setRightValue(6)->setLevel(0)->save(); - $t2 = new Table9(); - $t2->setTitle('t2')->setLeftValue(2)->setRightValue(5)->setLevel(1)->save(); - $t3 = new Table9(); - $t3->setTitle('t3')->setLeftValue(3)->setRightValue(4)->setLevel(2)->save(); - $this->assertFalse($t0->hasParent(), 'empty node has no parent'); - $this->assertFalse($t1->hasParent(), 'root node has no parent'); - $this->assertTrue($t2->hasParent(), 'not root node has a parent'); - $this->assertTrue($t3->hasParent(), 'leaf node has a parent'); - } - - public function testGetParent() - { - Table9Peer::doDeleteAll(); - $t0 = new Table9(); - $this->assertFalse($t0->hasParent(), 'empty node has no parent'); - $t1 = new Table9(); - $t1->setTitle('t1')->setLeftValue(1)->setRightValue(8)->setLevel(0)->save(); - $t2 = new Table9(); - $t2->setTitle('t2')->setLeftValue(2)->setRightValue(7)->setLevel(1)->save(); - $t3 = new Table9(); - $t3->setTitle('t3')->setLeftValue(3)->setRightValue(4)->setLevel(2)->save(); - $t4 = new Table9(); - $t4->setTitle('t4')->setLeftValue(5)->setRightValue(6)->setLevel(2)->save(); - $this->assertNull($t1->getParent($this->con), 'getParent() return null for root nodes'); - $this->assertEquals($t2->getParent($this->con), $t1, 'getParent() correctly retrieves parent for nodes'); - $this->assertEquals($t3->getParent($this->con), $t2, 'getParent() correctly retrieves parent for leafs'); - $this->assertEquals($t4->getParent($this->con), $t2, 'getParent() retrieves the same parent for two siblings'); - } - - public function testGetParentCache() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $con = Propel::getConnection(); - $count = $con->getQueryCount(); - $parent = $t5->getParent($con); - $parent = $t5->getParent($con); - $this->assertEquals($count + 1, $con->getQueryCount(), 'getParent() only issues a query once'); - $this->assertEquals('t3', $parent->getTitle(), 'getParent() returns the parent Node'); - } - - public function testHasPrevSibling() - { - Table9Peer::doDeleteAll(); - $t0 = new Table9(); - $t1 = new Table9(); - $t1->setTitle('t1')->setLeftValue(1)->setRightValue(6)->save(); - $t2 = new Table9(); - $t2->setTitle('t2')->setLeftValue(2)->setRightValue(3)->save(); - $t3 = new Table9(); - $t3->setTitle('t3')->setLeftValue(4)->setRightValue(5)->save(); - $this->assertFalse($t0->hasPrevSibling(), 'empty node has no previous sibling'); - $this->assertFalse($t1->hasPrevSibling(), 'root node has no previous sibling'); - $this->assertFalse($t2->hasPrevSibling(), 'first sibling has no previous sibling'); - $this->assertTrue($t3->hasPrevSibling(), 'not first sibling has a previous siblingt'); - } - - public function testGetPrevSibling() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertNull($t1->getPrevSibling($this->con), 'getPrevSibling() returns null for root nodes'); - $this->assertNull($t2->getPrevSibling($this->con), 'getPrevSibling() returns null for first siblings'); - $this->assertEquals($t3->getPrevSibling($this->con), $t2, 'getPrevSibling() correctly retrieves prev sibling'); - $this->assertNull($t6->getPrevSibling($this->con), 'getPrevSibling() returns null for first siblings'); - $this->assertEquals($t7->getPrevSibling($this->con), $t6, 'getPrevSibling() correctly retrieves prev sibling'); - } - - public function testHasNextSibling() - { - Table9Peer::doDeleteAll(); - $t0 = new Table9(); - $t1 = new Table9(); - $t1->setTitle('t1')->setLeftValue(1)->setRightValue(6)->save(); - $t2 = new Table9(); - $t2->setTitle('t2')->setLeftValue(2)->setRightValue(3)->save(); - $t3 = new Table9(); - $t3->setTitle('t3')->setLeftValue(4)->setRightValue(5)->save(); - $this->assertFalse($t0->hasNextSibling(), 'empty node has no next sibling'); - $this->assertFalse($t1->hasNextSibling(), 'root node has no next sibling'); - $this->assertTrue($t2->hasNextSibling(), 'not last sibling has a next sibling'); - $this->assertFalse($t3->hasNextSibling(), 'last sibling has no next sibling'); - } - - public function testGetNextSibling() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertNull($t1->getNextSibling($this->con), 'getNextSibling() returns null for root nodes'); - $this->assertEquals($t2->getNextSibling($this->con), $t3, 'getNextSibling() correctly retrieves next sibling'); - $this->assertNull($t3->getNextSibling($this->con), 'getNextSibling() returns null for last siblings'); - $this->assertEquals($t6->getNextSibling($this->con), $t7, 'getNextSibling() correctly retrieves next sibling'); - $this->assertNull($t7->getNextSibling($this->con), 'getNextSibling() returns null for last siblings'); - } - - public function testAddNestedSetChildren() - { - $t0 = new Table9(); - $t1 = new Table9(); - $t2 = new Table9(); - $t0->addNestedSetChild($t1); - $t0->addNestedSetChild($t2); - $this->assertEquals(2, $t0->countChildren(), 'addNestedSetChild() adds the object to the internal children collection'); - $this->assertEquals($t0, $t1->getParent(), 'addNestedSetChild() sets the object as th parent of the parameter'); - $this->assertEquals($t0, $t2->getParent(), 'addNestedSetChild() sets the object as th parent of the parameter'); - } - - public function testHasChildren() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertTrue($t1->hasChildren(), 'root has children'); - $this->assertFalse($t2->hasChildren(), 'leaf has no children'); - $this->assertTrue($t3->hasChildren(), 'node has children'); - } - - public function testGetChildren() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertTrue($t2->getChildren() instanceof PropelObjectCollection, 'getChildren() returns a collection'); - $this->assertEquals(0, count($t2->getChildren()), 'getChildren() returns an empty collection for leafs'); - $children = $t3->getChildren(); - $expected = array( - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - ); - $this->assertEquals($expected, $this->dumpNodes($children, true), 'getChildren() returns a collection of children'); - $c = new Criteria(); - $c->add(Table9Peer::TITLE, 't5'); - $children = $t3->getChildren($c); - $expected = array( - 't5' => array(7, 12, 2), - ); - $this->assertEquals($expected, $this->dumpNodes($children, true), 'getChildren() accepts a criteria as parameter'); - } - - public function testGetChildrenCache() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - $con = Propel::getConnection(); - $count = $con->getQueryCount(); - $children = $t3->getChildren(null, $con); - $children = $t3->getChildren(null, $con); - $this->assertEquals($count + 1, $con->getQueryCount(), 'getChildren() only issues a query once'); - $expected = array( - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - ); - $this->assertEquals($expected, $this->dumpNodes($children, true), 'getChildren() returns a collection of children'); - // when using criteria, cache is not used - $c = new Criteria(); - $c->add(Table9Peer::TITLE, 't5'); - $children = $t3->getChildren($c, $con); - $this->assertEquals($count + 2, $con->getQueryCount(), 'getChildren() issues a new query when âssed a non-null Criteria'); - $expected = array( - 't5' => array(7, 12, 2), - ); - $this->assertEquals($expected, $this->dumpNodes($children, true), 'getChildren() accepts a criteria as parameter'); - // but not erased either - $children = $t3->getChildren(null, $con); - $this->assertEquals($count + 2, $con->getQueryCount(), 'getChildren() keeps its internal cache after being called with a Criteria'); - $expected = array( - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - ); - $this->assertEquals($expected, $this->dumpNodes($children, true), 'getChildren() returns a collection of children'); - } - - public function testCountChildren() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertEquals(0, $t2->countChildren(), 'countChildren() returns 0 for leafs'); - $this->assertEquals(2, $t3->countChildren(), 'countChildren() returns the number of children'); - $c = new Criteria(); - $c->add(Table9Peer::TITLE, 't5'); - $this->assertEquals(1, $t3->countChildren($c), 'countChildren() accepts a criteria as parameter'); - } - - public function testCountChildrenCache() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $con = Propel::getConnection(); - $count = $con->getQueryCount(); - $children = $t3->getChildren(null, $con); - $nbChildren = $t3->countChildren(null, $con); - $this->assertEquals($count + 1, $con->getQueryCount(), 'countChildren() uses the internal collection when passed no Criteria'); - $nbChildren = $t3->countChildren(new Criteria(), $con); - $this->assertEquals($count + 2, $con->getQueryCount(), 'countChildren() issues a new query when passed a Criteria'); - } - - public function testGetFirstChild() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - $t5->moveToNextSiblingOf($t3); - /* Results in - t1 - | \ \ - t2 t3 t5 - | | \ - t4 t6 t7 - */ - $this->assertEquals($t2, $t1->getFirstChild(), 'getFirstChild() returns the first child'); - } - - public function testGetLastChild() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - $t5->moveToNextSiblingOf($t3); - /* Results in - t1 - | \ \ - t2 t3 t5 - | | \ - t4 t6 t7 - */ - $this->assertEquals($t5, $t1->getLastChild(), 'getLastChild() returns the last child'); - } - - public function testGetSiblings() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertEquals(array(), $t1->getSiblings(), 'getSiblings() returns an empty array for root'); - $descendants = $t5->getSiblings(); - $expected = array( - 't4' => array(5, 6, 2), - ); - $this->assertEquals($expected, $this->dumpNodes($descendants), 'getSiblings() returns an array of siblings'); - $descendants = $t5->getSiblings(true); - $expected = array( - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - ); - $this->assertEquals($expected, $this->dumpNodes($descendants), 'getSiblings(true) includes the current node'); - $t5->moveToNextSiblingOf($t3); - /* Results in - t1 - | \ \ - t2 t3 t5 - | | \ - t4 t6 t7 - */ - $this->assertEquals(0, count($t4->getSiblings()), 'getSiblings() returns an empty colleciton for lone children'); - $descendants = $t3->getSiblings(); - $expected = array( - 't2' => array(2, 3, 1), - 't5' => array(8, 13, 1), - ); - $this->assertEquals($expected, $this->dumpNodes($descendants), 'getSiblings() returns all siblings'); - } - - public function testGetDescendants() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertEquals(array(), $t2->getDescendants(), 'getDescendants() returns an empty array for leafs'); - $descendants = $t3->getDescendants(); - $expected = array( - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - ); - $this->assertEquals($expected, $this->dumpNodes($descendants), 'getDescendants() returns an array of descendants'); - $c = new Criteria(); - $c->add(Table9Peer::TITLE, 't5'); - $descendants = $t3->getDescendants($c); - $expected = array( - 't5' => array(7, 12, 2), - ); - $this->assertEquals($expected, $this->dumpNodes($descendants), 'getDescendants() accepts a criteria as parameter'); - } - - public function testCountDescendants() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertEquals(0, $t2->countDescendants(), 'countDescendants() returns 0 for leafs'); - $this->assertEquals(4, $t3->countDescendants(), 'countDescendants() returns the number of descendants'); - $c = new Criteria(); - $c->add(Table9Peer::TITLE, 't5'); - $this->assertEquals(1, $t3->countDescendants($c), 'countDescendants() accepts a criteria as parameter'); - } - - public function testGetBranch() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertEquals(array($t2), $t2->getBranch()->getArrayCopy(), 'getBranch() returns the current node for leafs'); - $descendants = $t3->getBranch(); - $expected = array( - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - ); - $this->assertEquals($expected, $this->dumpNodes($descendants), 'getBranch() returns an array of descendants, uncluding the current node'); - $c = new Criteria(); - $c->add(Table9Peer::TITLE, 't3', Criteria::NOT_EQUAL); - $descendants = $t3->getBranch($c); - unset($expected['t3']); - $this->assertEquals($expected, $this->dumpNodes($descendants), 'getBranch() accepts a criteria as first parameter'); - } - - public function testGetAncestors() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertEquals(array(), $t1->getAncestors(), 'getAncestors() returns an empty array for roots'); - $ancestors = $t5->getAncestors(); - $expected = array( - 't1' => array(1, 14, 0), - 't3' => array(4, 13, 1), - ); - $this->assertEquals($expected, $this->dumpNodes($ancestors), 'getAncestors() returns an array of ancestors'); - $c = new Criteria(); - $c->add(Table9Peer::TITLE, 't3'); - $ancestors = $t5->getAncestors($c); - $expected = array( - 't3' => array(4, 13, 1), - ); - $this->assertEquals($expected, $this->dumpNodes($ancestors), 'getAncestors() accepts a criteria as parameter'); - } - - public function testAddChild() - { - Table9Peer::doDeleteAll(); - $t1 = new Table9(); - $t1->setTitle('t1'); - $t1->makeRoot(); - $t1->save(); - $t2 = new Table9(); - $t2->setTitle('t2'); - $t1->addChild($t2); - $t2->save(); - $t3 = new Table9(); - $t3->setTitle('t3'); - $t1->addChild($t3); - $t3->save(); - $t4 = new Table9(); - $t4->setTitle('t4'); - $t2->addChild($t4); - $t4->save(); - $expected = array( - 't1' => array(1, 8, 0), - 't2' => array(4, 7, 1), - 't3' => array(2, 3, 1), - 't4' => array(5, 6, 2), - ); - $this->assertEquals($expected, $this->dumpTree(), 'addChild() adds the child and saves it'); - } - - public function testInsertAsFirstChildOf() - { - $this->assertTrue(method_exists('Table9', 'insertAsFirstChildOf'), 'nested_set adds a insertAsFirstChildOf() method'); - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $t8 = new PublicTable9(); - $t8->setTitle('t8'); - $t = $t8->insertAsFirstChildOf($t3); - $this->assertEquals($t8, $t, 'insertAsFirstChildOf() returns the object it was called on'); - $this->assertEquals(5, $t4->getLeftValue(), 'insertAsFirstChildOf() does not modify the tree until the object is saved'); - $t8->save(); - $this->assertEquals(5, $t8->getLeftValue(), 'insertAsFirstChildOf() sets the left value correctly'); - $this->assertEquals(6, $t8->getRightValue(), 'insertAsFirstChildOf() sets the right value correctly'); - $this->assertEquals(2, $t8->getLevel(), 'insertAsFirstChildOf() sets the level correctly'); - $expected = array( - 't1' => array(1, 16, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 15, 1), - 't4' => array(7, 8, 2), - 't5' => array(9, 14, 2), - 't6' => array(10, 11, 3), - 't7' => array(12, 13, 3), - 't8' => array(5, 6, 2) - ); - $this->assertEquals($expected, $this->dumpTree(), 'insertAsFirstChildOf() shifts the other nodes correctly'); - try { - $t8->insertAsFirstChildOf($t4); - $this->fail('insertAsFirstChildOf() throws an exception when called on a saved object'); - } catch (PropelException $e) { - $this->assertTrue(true, 'insertAsFirstChildOf() throws an exception when called on a saved object'); - } - } - - public function testInsertAsLastChildOf() - { - $this->assertTrue(method_exists('Table9', 'insertAsLastChildOf'), 'nested_set adds a insertAsLastChildOf() method'); - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $t8 = new PublicTable9(); - $t8->setTitle('t8'); - $t = $t8->insertAsLastChildOf($t3); - $this->assertEquals($t8, $t, 'insertAsLastChildOf() returns the object it was called on'); - $this->assertEquals(13, $t3->getRightValue(), 'insertAsLastChildOf() does not modify the tree until the object is saved'); - $t8->save(); - $this->assertEquals(13, $t8->getLeftValue(), 'insertAsLastChildOf() sets the left value correctly'); - $this->assertEquals(14, $t8->getRightValue(), 'insertAsLastChildOf() sets the right value correctly'); - $this->assertEquals(2, $t8->getLevel(), 'insertAsLastChildOf() sets the level correctly'); - $expected = array( - 't1' => array(1, 16, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 15, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - 't8' => array(13, 14, 2) - ); - $this->assertEquals($expected, $this->dumpTree(), 'insertAsLastChildOf() shifts the other nodes correctly'); - try { - $t8->insertAsLastChildOf($t4); - $this->fail('insertAsLastChildOf() throws an exception when called on a saved object'); - } catch (PropelException $e) { - $this->assertTrue(true, 'insertAsLastChildOf() throws an exception when called on a saved object'); - } - } - - public function testInsertAsPrevSiblingOf() - { - $this->assertTrue(method_exists('Table9', 'insertAsPrevSiblingOf'), 'nested_set adds a insertAsPrevSiblingOf() method'); - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $t8 = new PublicTable9(); - $t8->setTitle('t8'); - $t = $t8->insertAsPrevSiblingOf($t3); - $this->assertEquals($t8, $t, 'insertAsPrevSiblingOf() returns the object it was called on'); - $this->assertEquals(4, $t3->getLeftValue(), 'insertAsPrevSiblingOf() does not modify the tree until the object is saved'); - $t8->save(); - $this->assertEquals(4, $t8->getLeftValue(), 'insertAsPrevSiblingOf() sets the left value correctly'); - $this->assertEquals(5, $t8->getRightValue(), 'insertAsPrevSiblingOf() sets the right value correctly'); - $this->assertEquals(1, $t8->getLevel(), 'insertAsPrevSiblingOf() sets the level correctly'); - $expected = array( - 't1' => array(1, 16, 0), - 't2' => array(2, 3, 1), - 't3' => array(6, 15, 1), - 't4' => array(7, 8, 2), - 't5' => array(9, 14, 2), - 't6' => array(10, 11, 3), - 't7' => array(12, 13, 3), - 't8' => array(4, 5, 1) - ); - $this->assertEquals($expected, $this->dumpTree(), 'insertAsPrevSiblingOf() shifts the other nodes correctly'); - try { - $t8->insertAsPrevSiblingOf($t4); - $this->fail('insertAsPrevSiblingOf() throws an exception when called on a saved object'); - } catch (PropelException $e) { - $this->assertTrue(true, 'insertAsPrevSiblingOf() throws an exception when called on a saved object'); - } - } - - public function testInsertAsNextSiblingOf() - { - $this->assertTrue(method_exists('Table9', 'insertAsNextSiblingOf'), 'nested_set adds a insertAsNextSiblingOf() method'); - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $t8 = new PublicTable9(); - $t8->setTitle('t8'); - $t = $t8->insertAsNextSiblingOf($t3); - $this->assertEquals($t8, $t, 'insertAsNextSiblingOf() returns the object it was called on'); - $this->assertEquals(14, $t1->getRightValue(), 'insertAsNextSiblingOf() does not modify the tree until the object is saved'); - $t8->save(); - $this->assertEquals(14, $t8->getLeftValue(), 'insertAsNextSiblingOf() sets the left value correctly'); - $this->assertEquals(15, $t8->getRightValue(), 'insertAsNextSiblingOf() sets the right value correctly'); - $this->assertEquals(1, $t8->getLevel(), 'insertAsNextSiblingOf() sets the level correctly'); - $expected = array( - 't1' => array(1, 16, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - 't8' => array(14, 15, 1) - ); - $this->assertEquals($expected, $this->dumpTree(), 'insertAsNextSiblingOf() shifts the other nodes correctly'); - try { - $t8->insertAsNextSiblingOf($t4); - $this->fail('insertAsNextSiblingOf() throws an exception when called on a saved object'); - } catch (PropelException $e) { - $this->assertTrue(true, 'insertAsNextSiblingOf() throws an exception when called on a saved object'); - } - } - - public function testMoveToFirstChildOf() - { - $this->assertTrue(method_exists('Table9', 'moveToFirstChildOf'), 'nested_set adds a moveToFirstChildOf() method'); - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - try { - $t3->moveToFirstChildOf($t5); - $this->fail('moveToFirstChildOf() throws an exception when the target is a child node'); - } catch (PropelException $e) { - $this->assertTrue(true, 'moveToFirstChildOf() throws an exception when the target is a child node'); - } - // moving down - $t = $t3->moveToFirstChildOf($t2); - $this->assertEquals($t3, $t, 'moveToFirstChildOf() returns the object it was called on'); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 13, 1), - 't3' => array(3, 12, 2), - 't4' => array(4, 5, 3), - 't5' => array(6, 11, 3), - 't6' => array(7, 8, 4), - 't7' => array(9, 10, 4), - ); - $this->assertEquals($expected, $this->dumpTree(), 'moveToFirstChildOf() moves the entire subtree down correctly'); - // moving up - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - $t5->moveToFirstChildOf($t1); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(8, 9, 1), - 't3' => array(10, 13, 1), - 't4' => array(11, 12, 2), - 't5' => array(2, 7, 1), - 't6' => array(3, 4, 2), - 't7' => array(5, 6, 2), - ); - $this->assertEquals($expected, $this->dumpTree(), 'moveToFirstChildOf() moves the entire subtree up correctly'); - // moving to the same level - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - $t5->moveToFirstChildOf($t3); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(11, 12, 2), - 't5' => array(5, 10, 2), - 't6' => array(6, 7, 3), - 't7' => array(8, 9, 3), - ); - $this->assertEquals($expected, $this->dumpTree(), 'moveToFirstChildOf() moves the entire subtree to the same level correctly'); - } - - public function testMoveToFirstChildOfAndChildrenCache() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - // fill children cache - $t3->getChildren(); - $t1->getChildren(); - // move - $t5->moveToFirstChildOf($t1); - $children = $t3->getChildren(); - $expected = array( - 't4' => array(11, 12, 2), - ); - $this->assertEquals($expected, $this->dumpNodes($children, true), 'moveToFirstChildOf() reinitializes the child collection of all concerned nodes'); - $children = $t1->getChildren(); - $expected = array( - 't5' => array(2, 7, 1), - 't2' => array(8, 9, 1), - 't3' => array(10, 13, 1), - ); - $this->assertEquals($expected, $this->dumpNodes($children, true), 'moveToFirstChildOf() reinitializes the child collection of all concerned nodes'); - } - - public function testMoveToLastChildOf() - { - $this->assertTrue(method_exists('Table9', 'moveToLastChildOf'), 'nested_set adds a moveToLastChildOf() method'); - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - try { - $t3->moveToLastChildOf($t5); - $this->fail('moveToLastChildOf() throws an exception when the target is a child node'); - } catch (PropelException $e) { - $this->assertTrue(true, 'moveToLastChildOf() throws an exception when the target is a child node'); - } - // moving up - $t = $t5->moveToLastChildOf($t1); - $this->assertEquals($t5, $t, 'moveToLastChildOf() returns the object it was called on'); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 7, 1), - 't4' => array(5, 6, 2), - 't5' => array(8, 13, 1), - 't6' => array(9, 10, 2), - 't7' => array(11, 12, 2), - ); - $this->assertEquals($expected, $this->dumpTree(), 'moveToLastChildOf() moves the entire subtree up correctly'); - // moving down - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - $t3->moveToLastChildOf($t2); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 13, 1), - 't3' => array(3, 12, 2), - 't4' => array(4, 5, 3), - 't5' => array(6, 11, 3), - 't6' => array(7, 8, 4), - 't7' => array(9, 10, 4), - ); - $this->assertEquals($expected, $this->dumpTree(), 'moveToLastChildOf() moves the entire subtree down correctly'); - // moving to the same level - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - $t4->moveToLastChildOf($t3); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(11, 12, 2), - 't5' => array(5, 10, 2), - 't6' => array(6, 7, 3), - 't7' => array(8, 9, 3), - ); - $this->assertEquals($expected, $this->dumpTree(), 'moveToLastChildOf() moves the entire subtree to the same level correctly'); - } - - public function testMoveToLastChildOfAndChildrenCache() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - // fill children cache - $t3->getChildren(); - $t1->getChildren(); - // move - $t5->moveToLastChildOf($t1); - $children = $t3->getChildren(); - $expected = array( - 't4' => array(5, 6, 2), - ); - $this->assertEquals($expected, $this->dumpNodes($children, true), 'moveToLastChildOf() reinitializes the child collection of all concerned nodes'); - $children = $t1->getChildren(); - $expected = array( - 't2' => array(2, 3, 1), - 't3' => array(4, 7, 1), - 't5' => array(8, 13, 1), - ); - $this->assertEquals($expected, $this->dumpNodes($children, true), 'moveToLastChildOf() reinitializes the child collection of all concerned nodes'); - } - - public function testMoveToPrevSiblingOf() - { - $this->assertTrue(method_exists('Table9', 'moveToPrevSiblingOf'), 'nested_set adds a moveToPrevSiblingOf() method'); - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - try { - $t5->moveToPrevSiblingOf($t1); - $this->fail('moveToPrevSiblingOf() throws an exception when the target is a root node'); - } catch (PropelException $e) { - $this->assertTrue(true, 'moveToPrevSiblingOf() throws an exception when the target is a root node'); - } - try { - $t5->moveToPrevSiblingOf($t6); - $this->fail('moveToPrevSiblingOf() throws an exception when the target is a child node'); - } catch (PropelException $e) { - $this->assertTrue(true, 'moveToPrevSiblingOf() throws an exception when the target is a child node'); - } - // moving up - $t = $t5->moveToPrevSiblingOf($t3); - /* Results in - t1 - | \ \ - t2 t5 t3 - | \ | - t6 t7 t4 - */ - $this->assertEquals($t5, $t, 'moveToPrevSiblingOf() returns the object it was called on'); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(10, 13, 1), - 't4' => array(11, 12, 2), - 't5' => array(4, 9, 1), - 't6' => array(5, 6, 2), - 't7' => array(7, 8, 2), - ); - $this->assertEquals($expected, $this->dumpTree(), 'moveToPrevSiblingOf() moves the entire subtree up correctly'); - // moving down - $t5->moveToPrevSiblingOf($t4); - /* Results in - t1 - | \ - t2 t3 - | \ - t5 t4 - | \ - t6 t7 - */ - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(11, 12, 2), - 't5' => array(5, 10, 2), - 't6' => array(6, 7, 3), - 't7' => array(8, 9, 3), - ); - $this->assertEquals($expected, $this->dumpTree(), 'moveToPrevSiblingOf() moves the entire subtree down correctly'); - // moving at the same level - $t4->moveToPrevSiblingOf($t5); - /* Results in - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - ); - $this->assertEquals($expected, $this->dumpTree(), 'moveToPrevSiblingOf() moves the entire subtree at the same level correctly'); - } - - public function testMoveToPrevSiblingOfAndChildrenCache() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - // fill children cache - $t3->getChildren(); - $t1->getChildren(); - // move - $t5->moveToPrevSiblingOf($t2); - $children = $t3->getChildren(); - $expected = array( - 't4' => array(11, 12, 2), - ); - $this->assertEquals($expected, $this->dumpNodes($children, true), 'moveToPrevSiblingOf() reinitializes the child collection of all concerned nodes'); - $children = $t1->getChildren(); - $expected = array( - 't5' => array(2, 7, 1), - 't2' => array(8, 9, 1), - 't3' => array(10, 13, 1), - ); - $this->assertEquals($expected, $this->dumpNodes($children, true), 'moveToPrevSiblingOf() reinitializes the child collection of all concerned nodes'); - } - - public function testMoveToNextSiblingOfAndChildrenCache() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - // fill children cache - $t3->getChildren(); - $t1->getChildren(); - // move - $t5->moveToNextSiblingOf($t3); - $children = $t3->getChildren(); - $expected = array( - 't4' => array(5, 6, 2), - ); - $this->assertEquals($expected, $this->dumpNodes($children, true), 'moveToNextSiblingOf() reinitializes the child collection of all concerned nodes'); - $children = $t1->getChildren(); - $expected = array( - 't2' => array(2, 3, 1), - 't3' => array(4, 7, 1), - 't5' => array(8, 13, 1), - ); - $this->assertEquals($expected, $this->dumpNodes($children, true), 'moveToNextSiblingOf() reinitializes the child collection of all concerned nodes'); - } - - public function testMoveToNextSiblingOf() - { - $this->assertTrue(method_exists('Table9', 'moveToNextSiblingOf'), 'nested_set adds a moveToNextSiblingOf() method'); - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - try { - $t5->moveToNextSiblingOf($t1); - $this->fail('moveToNextSiblingOf() throws an exception when the target is a root node'); - } catch (PropelException $e) { - $this->assertTrue(true, 'moveToNextSiblingOf() throws an exception when the target is a root node'); - } - try { - $t5->moveToNextSiblingOf($t6); - $this->fail('moveToNextSiblingOf() throws an exception when the target is a child node'); - } catch (PropelException $e) { - $this->assertTrue(true, 'moveToNextSiblingOf() throws an exception when the target is a child node'); - } - // moving up - $t = $t5->moveToNextSiblingOf($t3); - /* Results in - t1 - | \ \ - t2 t3 t5 - | | \ - t4 t6 t7 - */ - $this->assertEquals($t5, $t, 'moveToPrevSiblingOf() returns the object it was called on'); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 7, 1), - 't4' => array(5, 6, 2), - 't5' => array(8, 13, 1), - 't6' => array(9, 10, 2), - 't7' => array(11, 12, 2), - ); - $this->assertEquals($expected, $this->dumpTree(), 'moveToNextSiblingOf() moves the entire subtree up correctly'); - // moving down - $t = $t5->moveToNextSiblingOf($t4); - /* Results in - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - ); - $this->assertEquals($expected, $this->dumpTree(), 'moveToNextSiblingOf() moves the entire subtree down correctly'); - // moving at the same level - $t = $t4->moveToNextSiblingOf($t5); - /* Results in - t1 - | \ - t2 t3 - | \ - t5 t4 - | \ - t6 t7 - */ - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(11, 12, 2), - 't5' => array(5, 10, 2), - 't6' => array(6, 7, 3), - 't7' => array(8, 9, 3), - ); - $this->assertEquals($expected, $this->dumpTree(), 'moveToNextSiblingOf() moves the entire subtree at the same level correctly'); - } - - public function testDeleteDescendants() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertNull($t2->deleteDescendants(), 'deleteDescendants() returns null leafs'); - $this->assertEquals(4, $t3->deleteDescendants(), 'deleteDescendants() returns the number of deleted nodes'); - $this->assertEquals(5, $t3->getRightValue(), 'deleteDescendants() updates the current node'); - $this->assertEquals(5, $t4->getLeftValue(), 'deleteDescendants() does not update existing nodes (because delete() clears the instance cache)'); - $expected = array( - 't1' => array(1, 6, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 5, 1), - ); - $this->assertEquals($expected, $this->dumpTree(), 'deleteDescendants() shifts the entire subtree correctly'); - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->assertEquals(6, $t1->deleteDescendants(), 'deleteDescendants() can be called on the root node'); - $expected = array( - 't1' => array(1, 2, 0), - ); - $this->assertEquals($expected, $this->dumpTree(), 'deleteDescendants() can delete all descendants of the root node'); - } - - public function testGetIterator() - { - $fixtures = $this->initTree(); - $this->assertTrue(method_exists('Table9', 'getIterator'), 'nested_set adds a getIterator() method'); - $root = Table9Peer::retrieveRoot(); - $iterator = $root->getIterator(); - $this->assertTrue($iterator instanceof NestedSetRecursiveIterator, 'getIterator() returns a NestedSetRecursiveIterator'); - foreach ($iterator as $node) { - $expected = array_shift($fixtures); - $this->assertEquals($expected, $node, 'getIterator returns an iterator parsing the tree order by left column'); - } - } - - public function testCompatibilityProxies() - { - $proxies = array('createRoot', 'retrieveParent', 'setParentNode', 'getNumberOfDescendants', 'getNumberOfChildren', 'retrievePrevSibling', 'retrieveNextSibling', 'retrieveFirstChild', 'retrieveLastChild', 'getPath'); - foreach ($proxies as $method) { - $this->assertFalse(method_exists('Table9', $method), 'proxies are not enabled by default'); - $this->assertTrue(method_exists('Table10', $method), 'setting method_proxies to true adds compatibility proxies'); - } - $t = new Table10(); - $t->createRoot(); - $this->assertEquals($t->getLeftValue(), 1, 'createRoot() is an alias for makeRoot()'); - $this->assertEquals($t->getRightValue(), 2, 'createRoot() is an alias for makeRoot()'); - $this->assertEquals($t->getLevel(), 0, 'createRoot() is an alias for makeRoot()'); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorObjectBuilderModifierWithScopeTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorObjectBuilderModifierWithScopeTest.php deleted file mode 100644 index 439ff588ff..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorObjectBuilderModifierWithScopeTest.php +++ /dev/null @@ -1,551 +0,0 @@ -add(Table10Peer::TITLE, $title); - return Table10Peer::doSelectOne($c); - } - - public function testDelete() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $t5->delete(); - $expected = array( - 't1' => array(1, 8, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 7, 1), - 't4' => array(5, 6, 2), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(1), 'delete() deletes all descendants and shifts the entire subtree correctly'); - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(2), 'delete() does not delete anything out of the scope'); - } - - public function testIsDescendantOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $this->assertFalse($t8->isDescendantOf($t9), 'root is not seen as a child of root'); - $this->assertTrue($t9->isDescendantOf($t8), 'direct child is seen as a child of root'); - try { - $t2->isDescendantOf($t8); - $this->fail('isDescendantOf() throws an exception when comparing two nodes of different trees'); - } catch (PropelException $e) { - $this->assertTrue(true, 'isDescendantOf() throws an exception when comparing two nodes of different trees'); - } - } - - public function testGetParent() - { - $this->initTreeWithScope(); - $t1 = $this->getByTitle('t1'); - $this->assertNull($t1->getParent($this->con), 'getParent() return null for root nodes'); - $t2 = $this->getByTitle('t2'); - $this->assertEquals($t2->getParent($this->con), $t1, 'getParent() correctly retrieves parent for leafs'); - $t3 = $this->getByTitle('t3'); - $this->assertEquals($t3->getParent($this->con), $t1, 'getParent() correctly retrieves parent for nodes'); - $t4 = $this->getByTitle('t4'); - $this->assertEquals($t4->getParent($this->con), $t3, 'getParent() retrieves the same parent for nodes'); - } - - public function testGetPrevSibling() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $this->assertNull($t1->getPrevSibling($this->con), 'getPrevSibling() returns null for root nodes'); - $this->assertNull($t2->getPrevSibling($this->con), 'getPrevSibling() returns null for first siblings'); - $this->assertEquals($t3->getPrevSibling($this->con), $t2, 'getPrevSibling() correctly retrieves prev sibling'); - $this->assertNull($t6->getPrevSibling($this->con), 'getPrevSibling() returns null for first siblings'); - $this->assertEquals($t7->getPrevSibling($this->con), $t6, 'getPrevSibling() correctly retrieves prev sibling'); - } - - public function testGetNextSibling() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $this->assertNull($t1->getNextSibling($this->con), 'getNextSibling() returns null for root nodes'); - $this->assertEquals($t2->getNextSibling($this->con), $t3, 'getNextSibling() correctly retrieves next sibling'); - $this->assertNull($t3->getNextSibling($this->con), 'getNextSibling() returns null for last siblings'); - $this->assertEquals($t6->getNextSibling($this->con), $t7, 'getNextSibling() correctly retrieves next sibling'); - $this->assertNull($t7->getNextSibling($this->con), 'getNextSibling() returns null for last siblings'); - } - - public function testGetDescendants() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $descendants = $t3->getDescendants(); - $expected = array( - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - ); - $this->assertEquals($expected, $this->dumpNodes($descendants), 'getDescendants() returns descendants from the current scope only'); - } - - public function testGetAncestors() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $this->assertEquals(array(), $t1->getAncestors(), 'getAncestors() returns an empty array for roots'); - $ancestors = $t5->getAncestors(); - $expected = array( - 't1' => array(1, 14, 0), - 't3' => array(4, 13, 1), - ); - $this->assertEquals($expected, $this->dumpNodes($ancestors), 'getAncestors() returns ancestors from the current scope only'); - } - - public function testInsertAsFirstChildOf() - { - $this->assertTrue(method_exists('Table10', 'insertAsFirstChildOf'), 'nested_set adds a insertAsFirstChildOf() method'); - $fixtures = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $t11 = new PublicTable10(); - $t11->setTitle('t11'); - $t11->insertAsFirstChildOf($fixtures[2]); // first child of t3 - $this->assertEquals(1, $t11->getScopeValue(), 'insertAsFirstChildOf() sets the scope value correctly'); - $t11->save(); - $expected = array( - 't1' => array(1, 16, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 15, 1), - 't4' => array(7, 8, 2), - 't5' => array(9, 14, 2), - 't6' => array(10, 11, 3), - 't7' => array(12, 13, 3), - 't11' => array(5, 6, 2) - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(1), 'insertAsFirstChildOf() shifts the other nodes correctly'); - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(2), 'insertAsFirstChildOf() does not shift anything out of the scope'); - } - - public function testInsertAsLastChildOf() - { - $this->assertTrue(method_exists('Table10', 'insertAsLastChildOf'), 'nested_set adds a insertAsLastChildOf() method'); - $fixtures = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $t11 = new PublicTable10(); - $t11->setTitle('t11'); - $t11->insertAsLastChildOf($fixtures[2]); // last child of t3 - $this->assertEquals(1, $t11->getScopeValue(), 'insertAsLastChildOf() sets the scope value correctly'); - $t11->save(); - $expected = array( - 't1' => array(1, 16, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 15, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - 't11' => array(13, 14, 2) - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(1), 'insertAsLastChildOf() shifts the other nodes correctly'); - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(2), 'insertAsLastChildOf() does not shift anything out of the scope'); - } - - public function testInsertAsPrevSiblingOf() - { - $this->assertTrue(method_exists('Table10', 'insertAsPrevSiblingOf'), 'nested_set adds a insertAsPrevSiblingOf() method'); - $fixtures = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $t11 = new PublicTable10(); - $t11->setTitle('t11'); - $t11->insertAsPrevSiblingOf($fixtures[2]); // prev sibling of t3 - $this->assertEquals(1, $t11->getScopeValue(), 'insertAsPrevSiblingOf() sets the scope value correctly'); - $t11->save(); - $expected = array( - 't1' => array(1, 16, 0), - 't2' => array(2, 3, 1), - 't3' => array(6, 15, 1), - 't4' => array(7, 8, 2), - 't5' => array(9, 14, 2), - 't6' => array(10, 11, 3), - 't7' => array(12, 13, 3), - 't11' => array(4, 5, 1) - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(1), 'insertAsPrevSiblingOf() shifts the other nodes correctly'); - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(2), 'insertAsPrevSiblingOf() does not shift anything out of the scope'); - } - - public function testInsertAsNextSiblingOf() - { - $this->assertTrue(method_exists('Table10', 'insertAsNextSiblingOf'), 'nested_set adds a insertAsNextSiblingOf() method'); - $fixtures = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $t11 = new PublicTable10(); - $t11->setTitle('t11'); - $t11->insertAsNextSiblingOf($fixtures[2]); // next sibling of t3 - $this->assertEquals(1, $t11->getScopeValue(), 'insertAsNextSiblingOf() sets the scope value correctly'); - $t11->save(); - $expected = array( - 't1' => array(1, 16, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - 't11' => array(14, 15, 1) - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(1), 'insertAsNextSiblingOf() shifts the other nodes correctly'); - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(2), 'insertAsNextSiblingOf() does not shift anything out of the scope'); - } - - public function testMoveToFirstChildOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - try { - $t8->moveToFirstChildOf($t3); - $this->fail('moveToFirstChildOf() throws an exception when the target is in a different tree'); - } catch (PropelException $e) { - $this->assertTrue(true, 'moveToFirstChildOf() throws an exception when the target is in a different tree'); - } - try { - $t5->moveToLastChildOf($t2); - $this->assertTrue(true, 'moveToFirstChildOf() does not throw an exception when the target is in the same tree'); - } catch (PropelException $e) { - $this->fail('moveToFirstChildOf() does not throw an exception when the target is in the same tree'); - } - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(2), 'moveToFirstChildOf() does not shift anything out of the scope'); - } - - public function testMoveToLastChildOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - try { - $t8->moveToLastChildOf($t3); - $this->fail('moveToLastChildOf() throws an exception when the target is in a different tree'); - } catch (PropelException $e) { - $this->assertTrue(true, 'moveToLastChildOf() throws an exception when the target is in a different tree'); - } - try { - $t5->moveToLastChildOf($t2); - $this->assertTrue(true, 'moveToLastChildOf() does not throw an exception when the target is in the same tree'); - } catch (PropelException $e) { - $this->fail('moveToLastChildOf() does not throw an exception when the target is in the same tree'); - } - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(2), 'moveToLastChildOf() does not shift anything out of the scope'); - } - - public function testMoveToPrevSiblingOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - try { - $t8->moveToPrevSiblingOf($t3); - $this->fail('moveToPrevSiblingOf() throws an exception when the target is in a different tree'); - } catch (PropelException $e) { - $this->assertTrue(true, 'moveToPrevSiblingOf() throws an exception when the target is in a different tree'); - } - try { - $t5->moveToPrevSiblingOf($t2); - $this->assertTrue(true, 'moveToPrevSiblingOf() does not throw an exception when the target is in the same tree'); - } catch (PropelException $e) { - $this->fail('moveToPrevSiblingOf() does not throw an exception when the target is in the same tree'); - } - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(2), 'moveToPrevSiblingOf() does not shift anything out of the scope'); - } - - public function testMoveToNextSiblingOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - try { - $t8->moveToNextSiblingOf($t3); - $this->fail('moveToNextSiblingOf() throws an exception when the target is in a different tree'); - } catch (PropelException $e) { - $this->assertTrue(true, 'moveToNextSiblingOf() throws an exception when the target is in a different tree'); - } - try { - $t5->moveToNextSiblingOf($t2); - $this->assertTrue(true, 'moveToNextSiblingOf() does not throw an exception when the target is in the same tree'); - } catch (PropelException $e) { - $this->fail('moveToNextSiblingOf() does not throw an exception when the target is in the same tree'); - } - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(2), 'moveToNextSiblingOf() does not shift anything out of the scope'); - } - - public function testDeleteDescendants() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $this->assertEquals(4, $t3->deleteDescendants(), 'deleteDescendants() returns the number of deleted nodes'); - $expected = array( - 't1' => array(1, 6, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 5, 1), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(1), 'deleteDescendants() shifts the entire subtree correctly'); - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(2), 'deleteDescendants() does not delete anything out of the scope'); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorPeerBuilderModifierTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorPeerBuilderModifierTest.php deleted file mode 100644 index 24555b3cd3..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorPeerBuilderModifierTest.php +++ /dev/null @@ -1,350 +0,0 @@ -assertEquals(Table9Peer::LEFT_COL, 'table9.TREE_LEFT', 'nested_set adds a LEFT_COL constant'); - $this->assertEquals(Table9Peer::RIGHT_COL, 'table9.TREE_RIGHT', 'nested_set adds a RIGHT_COL constant'); - $this->assertEquals(Table9Peer::LEVEL_COL, 'table9.TREE_LEVEL', 'nested_set adds a LEVEL_COL constant'); - } - - public function testRetrieveRoot() - { - $this->assertTrue(method_exists('Table9Peer', 'retrieveRoot'), 'nested_set adds a retrieveRoot() method'); - Table9Peer::doDeleteAll(); - $this->assertNull(Table9Peer::retrieveRoot(), 'retrieveRoot() returns null as long as no root node is defined'); - $t1 = new Table9(); - $t1->setLeftValue(123); - $t1->setRightValue(456); - $t1->save(); - $this->assertNull(Table9Peer::retrieveRoot(), 'retrieveRoot() returns null as long as no root node is defined'); - $t2 = new Table9(); - $t2->setLeftValue(1); - $t2->setRightValue(2); - $t2->save(); - $this->assertEquals(Table9Peer::retrieveRoot(), $t2, 'retrieveRoot() retrieves the root node'); - } - - public function testRetrieveTree() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - $tree = Table9Peer::retrieveTree(); - $this->assertEquals(array($t1, $t2, $t3, $t4, $t5, $t6, $t7), $tree, 'retrieveTree() retrieves the whole tree'); - $c = new Criteria(); - $c->add(Table9Peer::LEFT_COL, 4, Criteria::GREATER_EQUAL); - $tree = Table9Peer::retrieveTree($c); - $this->assertEquals(array($t3, $t4, $t5, $t6, $t7), $tree, 'retrieveTree() accepts a Criteria as first parameter'); - } - - public function testIsValid() - { - $this->assertTrue(method_exists('Table9Peer', 'isValid'), 'nested_set adds an isValid() method'); - $this->assertFalse(Table9Peer::isValid(null), 'isValid() returns false when passed null '); - $t1 = new Table9(); - $this->assertFalse(Table9Peer::isValid($t1), 'isValid() returns false when passed an empty node object'); - $t2 = new Table9(); - $t2->setLeftValue(5)->setRightValue(2); - $this->assertFalse(Table9Peer::isValid($t2), 'isValid() returns false when passed a node object with left > right'); - $t3 = new Table9(); - $t3->setLeftValue(5)->setRightValue(5); - $this->assertFalse(Table9Peer::isValid($t3), 'isValid() returns false when passed a node object with left = right'); - $t4 = new Table9(); - $t4->setLeftValue(2)->setRightValue(5); - $this->assertTrue(Table9Peer::isValid($t4), 'isValid() returns true when passed a node object with left < right'); - } - - public function testDeleteTree() - { - $this->initTree(); - Table9Peer::deleteTree(); - $this->assertEquals(array(), Table9Peer::doSelect(new Criteria()), 'deleteTree() deletes the whole tree'); - } - - public function testShiftRLValuesDelta() - { - $this->initTree(); - Table9Peer::shiftRLValues($delta = 1, $left = 1); - Table9Peer::clearInstancePool(); - $expected = array( - 't1' => array(2, 15, 0), - 't2' => array(3, 4, 1), - 't3' => array(5, 14, 1), - 't4' => array(6, 7, 2), - 't5' => array(8, 13, 2), - 't6' => array(9, 10, 3), - 't7' => array(11, 12, 3), - ); - $this->assertEquals($this->dumpTree(), $expected, 'shiftRLValues shifts all nodes with a positive amount'); - $this->initTree(); - Table9Peer::shiftRLValues($delta = -1, $left = 1); - Table9Peer::clearInstancePool(); - $expected = array( - 't1' => array(0, 13, 0), - 't2' => array(1, 2, 1), - 't3' => array(3, 12, 1), - 't4' => array(4, 5, 2), - 't5' => array(6, 11, 2), - 't6' => array(7, 8, 3), - 't7' => array(9, 10, 3), - ); - $this->assertEquals($this->dumpTree(), $expected, 'shiftRLValues can shift all nodes with a negative amount'); - $this->initTree(); - Table9Peer::shiftRLValues($delta = 3, $left = 1); - Table9Peer::clearInstancePool(); - $expected = array( - 't1'=> array(4, 17, 0), - 't2' => array(5, 6, 1), - 't3' => array(7, 16, 1), - 't4' => array(8, 9, 2), - 't5' => array(10, 15, 2), - 't6' => array(11, 12, 3), - 't7' => array(13, 14, 3), - ); - $this->assertEquals($this->dumpTree(), $expected, 'shiftRLValues shifts all nodes several units to the right'); - Table9Peer::shiftRLValues($delta = -3, $left = 1); - Table9Peer::clearInstancePool(); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - ); - $this->assertEquals($this->dumpTree(), $expected, 'shiftRLValues shifts all nodes several units to the left'); - } - - public function testShiftRLValuesLeftLimit() - { - $this->initTree(); - Table9Peer::shiftRLValues($delta = 1, $left = 15); - Table9Peer::clearInstancePool(); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - ); - $this->assertEquals($this->dumpTree(), $expected, 'shiftRLValues does not shift anything when the left parameter is higher than the highest right value'); - $this->initTree(); - Table9Peer::shiftRLValues($delta = 1, $left = 5); - Table9Peer::clearInstancePool(); - $expected = array( - 't1' => array(1, 15, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 14, 1), - 't4' => array(6, 7, 2), - 't5' => array(8, 13, 2), - 't6' => array(9, 10, 3), - 't7' => array(11, 12, 3), - ); - $this->assertEquals($this->dumpTree(), $expected, 'shiftRLValues shifts only the nodes having a LR value higher than the given left parameter'); - $this->initTree(); - Table9Peer::shiftRLValues($delta = 1, $left = 1); - Table9Peer::clearInstancePool(); - $expected = array( - 't1'=> array(2, 15, 0), - 't2' => array(3, 4, 1), - 't3' => array(5, 14, 1), - 't4' => array(6, 7, 2), - 't5' => array(8, 13, 2), - 't6' => array(9, 10, 3), - 't7' => array(11, 12, 3), - ); - $this->assertEquals($this->dumpTree(), $expected, 'shiftRLValues shifts all nodes when the left parameter is 1'); - } - - public function testShiftRLValuesRightLimit() - { - $this->initTree(); - Table9Peer::shiftRLValues($delta = 1, $left = 1, $right = 0); - Table9Peer::clearInstancePool(); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - ); - $this->assertEquals($this->dumpTree(), $expected, 'shiftRLValues does not shift anything when the right parameter is 0'); - $this->initTree(); - Table9Peer::shiftRLValues($delta = 1, $left = 1, $right = 5); - Table9Peer::clearInstancePool(); - $expected = array( - 't1' => array(2, 14, 0), - 't2' => array(3, 4, 1), - 't3' => array(5, 13, 1), - 't4' => array(6, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - ); - $this->assertEquals($this->dumpTree(), $expected, 'shiftRLValues shiftRLValues shifts only the nodes having a LR value lower than the given right parameter'); - $this->initTree(); - Table9Peer::shiftRLValues($delta = 1, $left = 1, $right = 15); - Table9Peer::clearInstancePool(); - $expected = array( - 't1'=> array(2, 15, 0), - 't2' => array(3, 4, 1), - 't3' => array(5, 14, 1), - 't4' => array(6, 7, 2), - 't5' => array(8, 13, 2), - 't6' => array(9, 10, 3), - 't7' => array(11, 12, 3), - ); - $this->assertEquals($this->dumpTree(), $expected, 'shiftRLValues shifts all nodes when the right parameter is higher than the highest right value'); - } - - public function testShiftLevel() - { - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $this->initTree(); - Table9Peer::shiftLevel($delta = 1, $first = 7, $last = 12); - Table9Peer::clearInstancePool(); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 3), - 't6' => array(8, 9, 4), - 't7' => array(10, 11, 4), - ); - $this->assertEquals($this->dumpTree(), $expected, 'shiftLevel shifts all nodes with a left value between the first and last'); - $this->initTree(); - Table9Peer::shiftLevel($delta = -1, $first = 7, $last = 12); - Table9Peer::clearInstancePool(); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 1), - 't6' => array(8, 9, 2), - 't7' => array(10, 11, 2), - ); - $this->assertEquals($this->dumpTree(), $expected, 'shiftLevel shifts all nodes wit ha negative amount'); - } - - public function testUpdateLoadedNodes() - { - $this->assertTrue(method_exists('Table9Peer', 'updateLoadedNodes'), 'nested_set adds a updateLoadedNodes() method'); - $fixtures = $this->initTree(); - Table9Peer::shiftRLValues(1, 5); - $expected = array( - 't1' => array(1, 14), - 't2' => array(2, 3), - 't3' => array(4, 13), - 't4' => array(5, 6), - 't5' => array(7, 12), - 't6' => array(8, 9), - 't7' => array(10, 11), - ); - $actual = array(); - foreach ($fixtures as $t) { - $actual[$t->getTitle()] = array($t->getLeftValue(), $t->getRightValue()); - } - $this->assertEquals($actual, $expected, 'Loaded nodes are not in sync before calling updateLoadedNodes()'); - Table9Peer::updateLoadedNodes(); - $expected = array( - 't1' => array(1, 15), - 't2' => array(2, 3), - 't3' => array(4, 14), - 't4' => array(6, 7), - 't5' => array(8, 13), - 't6' => array(9, 10), - 't7' => array(11, 12), - ); - $actual = array(); - foreach ($fixtures as $t) { - $actual[$t->getTitle()] = array($t->getLeftValue(), $t->getRightValue()); - } - $this->assertEquals($actual, $expected, 'Loaded nodes are in sync after calling updateLoadedNodes()'); - } - - public function testMakeRoomForLeaf() - { - $this->assertTrue(method_exists('Table9Peer', 'makeRoomForLeaf'), 'nested_set adds a makeRoomForLeaf() method'); - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $t = Table9Peer::makeRoomForLeaf(5); // first child of t3 - $expected = array( - 't1' => array(1, 16, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 15, 1), - 't4' => array(7, 8, 2), - 't5' => array(9, 14, 2), - 't6' => array(10, 11, 3), - 't7' => array(12, 13, 3), - ); - $this->assertEquals($expected, $this->dumpTree(), 'makeRoomForLeaf() shifts the other nodes correctly'); - foreach ($expected as $key => $values) - { - $this->assertEquals($values, array($$key->getLeftValue(), $$key->getRightValue(), $$key->getLevel()), 'makeRoomForLeaf() updates nodes already in memory'); - } - } - - public function testFixLevels() - { - $fixtures = $this->initTree(); - // reset the levels - foreach ($fixtures as $node) { - $node->setLevel(null)->save(); - } - // fix the levels - Table9Peer::fixLevels(); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - ); - $this->assertEquals($expected, $this->dumpTree(), 'fixLevels() fixes the levels correctly'); - Table9Peer::fixLevels(); - $this->assertEquals($expected, $this->dumpTree(), 'fixLevels() can be called several times'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorPeerBuilderModifierWithScopeTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorPeerBuilderModifierWithScopeTest.php deleted file mode 100644 index 87026d3484..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorPeerBuilderModifierWithScopeTest.php +++ /dev/null @@ -1,253 +0,0 @@ -assertEquals(Table10Peer::LEFT_COL, 'table10.MY_LEFT_COLUMN', 'nested_set adds a LEFT_COL constant using the custom left_column parameter'); - $this->assertEquals(Table10Peer::RIGHT_COL, 'table10.MY_RIGHT_COLUMN', 'nested_set adds a RIGHT_COL constant using the custom right_column parameter'); - $this->assertEquals(Table10Peer::LEVEL_COL, 'table10.MY_LEVEL_COLUMN', 'nested_set adds a LEVEL_COL constant using the custom level_column parameter'); - $this->assertEquals(Table10Peer::SCOPE_COL, 'table10.MY_SCOPE_COLUMN', 'nested_set adds a SCOPE_COL constant when the use_scope parameter is true'); - } - - public function testRetrieveRoots() - { - $this->assertTrue(method_exists('Table10Peer', 'retrieveRoots'), 'nested_set adds a retrieveRoots() method for trees that use scope'); - $this->assertFalse(method_exists('Table9Peer', 'retrieveRoots'), 'nested_set does not add a retrieveRoots() method for trees that don\'t use scope'); - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $this->assertEquals(array($t1, $t8), Table10Peer::retrieveRoots(), 'retrieveRoots() returns the tree roots'); - $c = new Criteria(); - $c->add(Table10Peer::TITLE, 't1'); - $this->assertEquals(array($t1), Table10Peer::retrieveRoots($c), 'retrieveRoots() accepts a Criteria as first parameter'); - } - - public function testRetrieveRoot() - { - $this->assertTrue(method_exists('Table10Peer', 'retrieveRoot'), 'nested_set adds a retrieveRoot() method'); - Table10Peer::doDeleteAll(); - $t1 = new Table10(); - $t1->setLeftValue(1); - $t1->setRightValue(2); - $t1->setScopeValue(2); - $t1->save(); - $this->assertNull(Table10Peer::retrieveRoot(1), 'retrieveRoot() returns null as long as no root node is defined in the required scope'); - $t2 = new Table10(); - $t2->setLeftValue(1); - $t2->setRightValue(2); - $t2->setScopeValue(1); - $t2->save(); - $this->assertEquals(Table10Peer::retrieveRoot(1), $t2, 'retrieveRoot() retrieves the root node in the required scope'); - } - - public function testRetrieveTree() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $tree = Table10Peer::retrieveTree(1); - $this->assertEquals(array($t1, $t2, $t3, $t4, $t5, $t6, $t7), $tree, 'retrieveTree() retrieves the scoped tree'); - $tree = Table10Peer::retrieveTree(2); - $this->assertEquals(array($t8, $t9, $t10), $tree, 'retrieveTree() retrieves the scoped tree'); - $c = new Criteria(); - $c->add(Table10Peer::LEFT_COL, 4, Criteria::GREATER_EQUAL); - $tree = Table10Peer::retrieveTree(1, $c); - $this->assertEquals(array($t3, $t4, $t5, $t6, $t7), $tree, 'retrieveTree() accepts a Criteria as first parameter'); - } - - public function testDeleteTree() - { - $this->initTreeWithScope(); - Table10Peer::deleteTree(1); - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($this->dumpTreeWithScope(2), $expected, 'deleteTree() does not delete anything out of the scope'); - } - - public function testShiftRLValues() - { - $this->assertTrue(method_exists('Table10Peer', 'shiftRLValues'), 'nested_set adds a shiftRLValues() method'); - $this->initTreeWithScope(); - Table10Peer::shiftRLValues(1, 100, null, 1); - Table10Peer::clearInstancePool(); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - ); - $this->assertEquals($this->dumpTreeWithScope(1), $expected, 'shiftRLValues does not shift anything when the first parameter is higher than the highest right value'); - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($this->dumpTreeWithScope(2), $expected, 'shiftRLValues does not shift anything out of the scope'); - $this->initTreeWithScope(); - Table10Peer::shiftRLValues(1, 1, null, 1); - Table10Peer::clearInstancePool(); - $expected = array( - 't1' => array(2, 15, 0), - 't2' => array(3, 4, 1), - 't3' => array(5, 14, 1), - 't4' => array(6, 7, 2), - 't5' => array(8, 13, 2), - 't6' => array(9, 10, 3), - 't7' => array(11, 12, 3), - ); - $this->assertEquals($this->dumpTreeWithScope(1), $expected, 'shiftRLValues can shift all nodes to the right'); - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($this->dumpTreeWithScope(2), $expected, 'shiftRLValues does not shift anything out of the scope'); - $this->initTreeWithScope(); - Table10Peer::shiftRLValues(-1, 1, null, 1); - Table10Peer::clearInstancePool(); - $expected = array( - 't1' => array(0, 13, 0), - 't2' => array(1, 2, 1), - 't3' => array(3, 12, 1), - 't4' => array(4, 5, 2), - 't5' => array(6, 11, 2), - 't6' => array(7, 8, 3), - 't7' => array(9, 10, 3), - ); - $this->assertEquals($this->dumpTreeWithScope(1), $expected, 'shiftRLValues can shift all nodes to the left'); - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($this->dumpTreeWithScope(2), $expected, 'shiftRLValues does not shift anything out of the scope'); - $this->initTreeWithScope(); - Table10Peer::shiftRLValues(1, 5, null, 1); - Table10Peer::clearInstancePool(); - $expected = array( - 't1' => array(1, 15, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 14, 1), - 't4' => array(6, 7, 2), - 't5' => array(8, 13, 2), - 't6' => array(9, 10, 3), - 't7' => array(11, 12, 3), - ); - $this->assertEquals($this->dumpTreeWithScope(1), $expected, 'shiftRLValues can shift some nodes to the right'); - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($this->dumpTreeWithScope(2), $expected, 'shiftRLValues does not shift anything out of the scope'); - } - - public function testShiftLevel() - { - $this->initTreeWithScope(); - Table10Peer::shiftLevel($delta = 1, $first = 7, $last = 12, $scope = 1); - Table10Peer::clearInstancePool(); - $expected = array( - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 3), - 't6' => array(8, 9, 4), - 't7' => array(10, 11, 4), - ); - $this->assertEquals($this->dumpTreeWithScope(1), $expected, 'shiftLevel can shift level whith a scope'); - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($this->dumpTreeWithScope(2), $expected, 'shiftLevel does not shift anything out of the scope'); - } - - public function testMakeRoomForLeaf() - { - $this->assertTrue(method_exists('Table10Peer', 'makeRoomForLeaf'), 'nested_set adds a makeRoomForLeaf() method'); - $fixtures = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $t = Table10Peer::makeRoomForLeaf(5, 1); // first child of t3 - $expected = array( - 't1' => array(1, 16, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 15, 1), - 't4' => array(7, 8, 2), - 't5' => array(9, 14, 2), - 't6' => array(10, 11, 3), - 't7' => array(12, 13, 3), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(1), 'makeRoomForLeaf() shifts the other nodes correctly'); - $expected = array( - 't8' => array(1, 6, 0), - 't9' => array(2, 3, 1), - 't10' => array(4, 5, 1), - ); - $this->assertEquals($expected, $this->dumpTreeWithScope(2), 'makeRoomForLeaf() does not shift anything out of the scope'); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorQueryBuilderModifierTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorQueryBuilderModifierTest.php deleted file mode 100644 index 8a6f5729b6..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorQueryBuilderModifierTest.php +++ /dev/null @@ -1,283 +0,0 @@ -initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $objs = Table9Query::create() - ->descendantsOf($t7) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array()); - $this->assertEquals($coll, $objs, 'decendantsOf() filters by descendants'); - $objs = Table9Query::create() - ->descendantsOf($t3) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t4, $t5, $t6, $t7)); - $this->assertEquals($coll, $objs, 'decendantsOf() filters by descendants'); - } - - public function testBranchOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $objs = Table9Query::create() - ->branchOf($t7) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t7)); - $this->assertEquals($coll, $objs, 'branchOf() filters by descendants and includes object passed as parameter'); - $objs = Table9Query::create() - ->branchOf($t3) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t3, $t4, $t5, $t6, $t7)); - $this->assertEquals($coll, $objs, 'branchOf() filters by descendants and includes object passed as parameter'); - $objs = Table9Query::create() - ->branchOf($t1) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t1, $t2, $t3, $t4, $t5, $t6, $t7)); - $this->assertEquals($coll, $objs, 'branchOf() returns the whole tree for the root node'); - } - - public function testChildrenOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $objs = Table9Query::create() - ->childrenOf($t6) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array()); - $this->assertEquals($coll, $objs, 'childrenOf() returns empty collection for leaf nodes'); - $objs = Table9Query::create() - ->childrenOf($t5) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t6, $t7)); - $this->assertEquals($coll, $objs, 'childrenOf() filters by children'); - $objs = Table9Query::create() - ->childrenOf($t3) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t4, $t5)); - $this->assertEquals($coll, $objs, 'childrenOf() filters by children and not by descendants'); - } - - public function testSiblingsOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $desc = Table9Query::create() - ->siblingsOf($t1) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array()); - $this->assertEquals($coll, $desc, 'siblingsOf() returns empty collection for the root node'); - $desc = Table9Query::create() - ->siblingsOf($t3) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t2)); - $this->assertEquals($coll, $desc, 'siblingsOf() filters by siblings'); - } - - public function testAncestorsOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $objs = Table9Query::create() - ->ancestorsOf($t1) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array()); - $this->assertEquals($coll, $objs, 'ancestorsOf() returns empty collection for root node'); - $objs = Table9Query::create() - ->ancestorsOf($t3) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t1)); - $this->assertEquals($coll, $objs, 'ancestorsOf() filters by ancestors'); - $objs = Table9Query::create() - ->ancestorsOf($t7) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t1, $t3, $t5)); - $this->assertEquals($coll, $objs, 'childrenOf() filters by ancestors'); - } - - public function testRootsOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - /* Tree used for tests - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - */ - $objs = Table9Query::create() - ->rootsOf($t1) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t1)); - $this->assertEquals($coll, $objs, 'rootsOf() returns the root node for root node'); - $objs = Table9Query::create() - ->rootsOf($t3) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t1, $t3)); - $this->assertEquals($coll, $objs, 'rootsOf() filters by ancestors and includes the node passed as parameter'); - $objs = Table9Query::create() - ->rootsOf($t7) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t1, $t3, $t5, $t7)); - $this->assertEquals($coll, $objs, 'rootsOf() filters by ancestors and includes the node passed as parameter'); - } - - public function testOrderByBranch() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - $t5->moveToPrevSiblingOf($t4); - /* Results in - t1 - | \ - t2 t3 - | \ - t5 t4 - | \ - t6 t7 - */ - $objs = Table9Query::create() - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t1, $t2, $t3, $t5, $t6, $t7, $t4), 'orderByBranch() orders by branch left to right'); - $objs = Table9Query::create() - ->orderByBranch(true) - ->find(); - $coll = $this->buildCollection(array($t4, $t7, $t6, $t5, $t3, $t2, $t1), 'orderByBranch(true) orders by branch right to left'); - } - - public function testOrderByLevel() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - $t5->moveToPrevSiblingOf($t4); - /* Results in - t1 - | \ - t2 t3 - | \ - t5 t4 - | \ - t6 t7 - */ - $objs = Table9Query::create() - ->orderByLevel() - ->find(); - $coll = $this->buildCollection(array($t1, $t2, $t5, $t4, $t6, $t7), 'orderByLevel() orders by level, from the root to the leaf'); - $objs = Table9Query::create() - ->orderByLevel(true) - ->find(); - $coll = $this->buildCollection(array($t7, $t6, $t4, $t5, $t2, $t1), 'orderByLevel(true) orders by level, from the leaf to the root'); - } - - public function testFindRoot() - { - $this->assertTrue(method_exists('Table9Query', 'findRoot'), 'nested_set adds a findRoot() method'); - Table9Query::create()->deleteAll(); - $this->assertNull(Table9Query::create()->findRoot(), 'findRoot() returns null as long as no root node is defined'); - $t1 = new Table9(); - $t1->setLeftValue(123); - $t1->setRightValue(456); - $t1->save(); - $this->assertNull(Table9Query::create()->findRoot(), 'findRoot() returns null as long as no root node is defined'); - $t2 = new Table9(); - $t2->setLeftValue(1); - $t2->setRightValue(2); - $t2->save(); - $this->assertEquals(Table9Query::create()->findRoot(), $t2, 'findRoot() retrieves the root node'); - } - - public function testfindTree() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7) = $this->initTree(); - $tree = Table9Query::create()->findTree(); - $coll = $this->buildCollection(array($t1, $t2, $t3, $t4, $t5, $t6, $t7)); - $this->assertEquals($coll, $tree, 'findTree() retrieves the whole tree, ordered by branch'); - } - - protected function buildCollection($arr) - { - $coll = new PropelObjectCollection(); - $coll->setData($arr); - $coll->setModel('Table9'); - - return $coll; - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorQueryBuilderModifierWithScopeTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorQueryBuilderModifierWithScopeTest.php deleted file mode 100644 index a7c2836289..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorQueryBuilderModifierWithScopeTest.php +++ /dev/null @@ -1,285 +0,0 @@ -initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $objs = Table10Query::create() - ->treeRoots() - ->find(); - $coll = $this->buildCollection(array($t1, $t8)); - $this->assertEquals($coll, $objs, 'treeRoots() filters by roots'); - } - - public function testInTree() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $tree = Table10Query::create() - ->inTree(1) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t1, $t2, $t3, $t4, $t5, $t6, $t7)); - $this->assertEquals($coll, $tree, 'inTree() filters by node'); - $tree = Table10Query::create() - ->inTree(2) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t8, $t9, $t10)); - $this->assertEquals($coll, $tree, 'inTree() filters by node'); - } - - public function testDescendantsOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $objs = Table10Query::create() - ->descendantsOf($t1) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t2, $t3, $t4, $t5, $t6, $t7)); - $this->assertEquals($coll, $objs, 'decendantsOf() filters by descendants of the same scope'); - } - - public function testBranchOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $objs = Table10Query::create() - ->branchOf($t1) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t1, $t2, $t3, $t4, $t5, $t6, $t7)); - $this->assertEquals($coll, $objs, 'branchOf() filters by branch of the same scope'); - - } - - public function testChildrenOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $objs = Table10Query::create() - ->childrenOf($t1) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t2, $t3)); - $this->assertEquals($coll, $objs, 'childrenOf() filters by children of the same scope'); - } - - public function testSiblingsOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $desc = Table10Query::create() - ->siblingsOf($t3) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t2)); - $this->assertEquals($coll, $desc, 'siblingsOf() returns filters by siblings of the same scope'); - } - - public function testAncestorsOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $objs = Table10Query::create() - ->ancestorsOf($t5) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t1, $t3), 'ancestorsOf() filters by ancestors of the same scope'); - } - - public function testRootsOf() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $objs = Table10Query::create() - ->rootsOf($t5) - ->orderByBranch() - ->find(); - $coll = $this->buildCollection(array($t1, $t3, $t5), 'rootsOf() filters by ancestors of the same scope'); - } - - public function testFindRoot() - { - $this->assertTrue(method_exists('Table10Query', 'findRoot'), 'nested_set adds a findRoot() method'); - Table10Query::create()->deleteAll(); - $this->assertNull(Table10Query::create()->findRoot(1), 'findRoot() returns null as long as no root node is defined'); - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $this->assertEquals($t1, Table10Query::create()->findRoot(1), 'findRoot() returns a tree root'); - $this->assertEquals($t8, Table10Query::create()->findRoot(2), 'findRoot() returns a tree root'); - } - - public function testFindTree() - { - list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10) = $this->initTreeWithScope(); - /* Tree used for tests - Scope 1 - t1 - | \ - t2 t3 - | \ - t4 t5 - | \ - t6 t7 - Scope 2 - t8 - | \ - t9 t10 - */ - $tree = Table10Query::create()->findTree(1); - $coll = $this->buildCollection(array($t1, $t2, $t3, $t4, $t5, $t6, $t7)); - $this->assertEquals($coll, $tree, 'findTree() retrieves the tree of a scope, ordered by branch'); - $tree = Table10Query::create()->findTree(2); - $coll = $this->buildCollection(array($t8, $t9, $t10)); - $this->assertEquals($coll, $tree, 'findTree() retrieves the tree of a scope, ordered by branch'); - } - - protected function buildCollection($arr) - { - $coll = new PropelObjectCollection(); - $coll->setData($arr); - $coll->setModel('Table10'); - - return $coll; - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorTest.php deleted file mode 100644 index 06594aac80..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/nestedset/NestedSetBehaviorTest.php +++ /dev/null @@ -1,48 +0,0 @@ -assertEquals(count($table9->getColumns()), 5, 'nested_set adds three column by default'); - $this->assertTrue(method_exists('Table9', 'getTreeLeft'), 'nested_set adds a tree_left column by default'); - $this->assertTrue(method_exists('Table9', 'getLeftValue'), 'nested_set maps the left_value getter with the tree_left column'); - $this->assertTrue(method_exists('Table9', 'getTreeRight'), 'nested_set adds a tree_right column by default'); - $this->assertTrue(method_exists('Table9', 'getRightValue'), 'nested_set maps the right_value getter with the tree_right column'); - $this->assertTrue(method_exists('Table9', 'getTreeLevel'), 'nested_set adds a tree_level column by default'); - $this->assertTrue(method_exists('Table9', 'getLevel'), 'nested_set maps the level getter with the tree_level column'); - $this->assertFalse(method_exists('Table9', 'getTreeScope'), 'nested_set does not add a tree_scope column by default'); - $this->assertFalse(method_exists('Table9', 'getScopeValue'), 'nested_set does not map the scope_value getter with the tree_scope column by default'); - - } - - public function testParameters() - { - $table10 = Table10Peer::getTableMap(); - $this->assertEquals(count($table10->getColumns()), 6, 'nested_set does not add columns when they already exist'); - $this->assertTrue(method_exists('Table10', 'getLeftValue'), 'nested_set maps the left_value getter with the tree_left column'); - $this->assertTrue(method_exists('Table10', 'getRightValue'), 'nested_set maps the right_value getter with the tree_right column'); - $this->assertTrue(method_exists('Table10', 'getLevel'), 'nested_set maps the level getter with the tree_level column'); - $this->assertTrue(method_exists('Table10', 'getScopeValue'), 'nested_set maps the scope_value getter with the tree_scope column when the use_scope parameter is true'); - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sluggable/SluggableBehaviorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/sluggable/SluggableBehaviorTest.php deleted file mode 100644 index a65bf3ea82..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sluggable/SluggableBehaviorTest.php +++ /dev/null @@ -1,299 +0,0 @@ -assertEquals(count($table13->getColumns()), 3, 'Sluggable adds one columns by default'); - $this->assertTrue(method_exists('Table13', 'getSlug'), 'Sluggable adds a slug column by default'); - $table14 = Table14Peer::getTableMap(); - $this->assertEquals(count($table14->getColumns()), 3, 'Sluggable does not add a column when it already exists'); - $this->assertTrue(method_exists('Table14', 'getUrl'), 'Sluggable allows customization of slug_column name'); - $this->assertTrue(method_exists('Table14', 'getSlug'), 'Sluggable adds a standard getter for the slug column'); - } - - public function testObjectGetter() - { - $this->assertTrue(method_exists('Table13', 'getSlug'), 'Sluggable adds a getter for the slug column'); - $t = new Table13(); - $t->setSlug('foo'); - $this->assertEquals('foo', $t->getSlug(), 'getSlug() returns the object slug'); - $this->assertTrue(method_exists('Table14', 'getSlug'), 'Sluggable adds a getter for the slug column, even if the column does not have the default name'); - $t = new Table14(); - $t->setUrl('foo'); - $this->assertEquals('foo', $t->getSlug(), 'getSlug() returns the object slug'); - } - - public function testObjectSetter() - { - $this->assertTrue(method_exists('Table13', 'setSlug'), 'Sluggable adds a setter for the slug column'); - $t = new Table13(); - $t->setSlug('foo'); - $this->assertEquals('foo', $t->getSlug(), 'setSlug() sets the object slug'); - $this->assertTrue(method_exists('Table14', 'setSlug'), 'Sluggable adds a setter for the slug column, even if the column does not have the default name'); - $t = new Table14(); - $t->setSlug('foo'); - $this->assertEquals('foo', $t->getUrl(), 'setSlug() sets the object slug'); - } - - public function testObjectCreateRawSlug() - { - $t = new TestableTable13(); - $this->assertEquals('n-a', $t->createRawSlug(), 'createRawSlug() returns an empty string for an empty object with no pattern'); - $t->setTitle('Hello, World'); - $this->assertEquals('hello-world', $t->createRawSlug(), 'createRawSlug() returns the cleaned up object string representation by default'); - - $t = new TestableTable14(); - $this->assertEquals('/foo/n-a/bar', $t->createRawSlug(), 'createRawSlug() returns a slug for an empty object with a pattern'); - $t->setTitle('Hello, World'); - $this->assertEquals('/foo/hello-world/bar', $t->createRawSlug(), 'createRawSlug() returns a slug based on a pattern'); - } - - public static function cleanupSlugProvider() - { - return array( - array('', 'n-a'), - array('foo', 'foo'), - array('foo bar', 'foo-bar'), - array('foo bar', 'foo-bar'), - array('FoO', 'foo'), - array('fôo', 'foo'), - array(' foo ', 'foo'), - array('f/o:o', 'f-o-o'), - array('foo1', 'foo1'), - ); - } - - /** - * @dataProvider cleanupSlugProvider - */ - public function testObjectCleanupSlugPart($in, $out) - { - $t = new TestableTable13(); - $this->assertEquals($out, $t->cleanupSlugPart($in), 'cleanupSlugPart() cleans up the slug part'); - } - - public static function limitSlugSizeProvider() - { - return array( - array('123', '123'), - array(str_repeat('*', 80), str_repeat('*', 80)), - array(str_repeat('*', 97), str_repeat('*', 97)), - array(str_repeat('*', 98), str_repeat('*', 97)), - array(str_repeat('*', 99), str_repeat('*', 97)), - array(str_repeat('*', 100), str_repeat('*', 97)), - array(str_repeat('*', 150), str_repeat('*', 97)), - ); - } - - /** - * @dataProvider limitSlugSizeProvider - */ - public function testObjectLimitSlugSize($in, $out) - { - $t = new TestableTable14(); - $this->assertEquals($out, $t->limitSlugSize($in), 'limitSlugsize() limits the slug size'); - } - - public function testObjectMakeSlugUnique() - { - Table13Query::create()->deleteAll(); - $t = new TestableTable13(); - $this->assertEquals('', $t->makeSlugUnique(''), 'makeSlugUnique() returns the input slug when the input is empty'); - $this->assertEquals('foo', $t->makeSlugUnique('foo'), 'makeSlugUnique() returns the input slug when the table is empty'); - $t->setSlug('foo'); - $t->save(); - $t = new TestableTable13(); - $this->assertEquals('bar', $t->makeSlugUnique('bar'), 'makeSlugUnique() returns the input slug when the table does not contain a similar slug'); - $t->save(); - $t = new TestableTable13(); - $this->assertEquals('foo-1', $t->makeSlugUnique('foo'), 'makeSlugUnique() returns an incremented input when it already exists'); - $t->setSlug('foo-1'); - $t->save(); - $t = new TestableTable13(); - $this->assertEquals('foo-2', $t->makeSlugUnique('foo'), 'makeSlugUnique() returns an incremented input when it already exists'); - } - - public function testObjectCreateSlug() - { - Table13Query::create()->deleteAll(); - $t = new TestableTable13(); - $this->assertEquals('n-a', $t->createSlug(), 'createSlug() returns n-a for an empty object'); - $t->setTitle('Hello, World!'); - $this->assertEquals('hello-world', $t->createSlug(), 'createSlug() returns a cleaned up slug'); - $t->setSlug('hello-world'); - $t->save(); - $t = new TestableTable13(); - $t->setTitle('Hello; wOrld'); - $this->assertEquals('hello-world-1', $t->createSlug(), 'createSlug() returns a unique slug'); - - Table14Query::create()->deleteAll(); - $t = new TestableTable14(); - $this->assertEquals('/foo/n-a/bar', $t->createSlug(), 'createSlug() returns a slug for an empty object with a pattern'); - $t->setTitle('Hello, World!'); - $this->assertEquals('/foo/hello-world/bar', $t->createSlug(), 'createSlug() returns a cleaned up slug'); - $t->setSlug('/foo/hello-world/bar'); - $t->save(); - $t = new TestableTable14(); - $t->setTitle('Hello; wOrld:'); - $this->assertEquals('/foo/hello-world/bar/1', $t->createSlug(), 'createSlug() returns a unique slug'); - } - - public function testObjectPreSave() - { - Table14Query::create()->deleteAll(); - $t = new Table14(); - $t->save(); - $this->assertEquals('/foo/n-a/bar', $t->getSlug(), 'preSave() sets a default slug for empty objects'); - $t = new Table14(); - $t->setTitle('Hello, World'); - $t->save(); - $this->assertEquals('/foo/hello-world/bar', $t->getSlug(), 'preSave() sets a cleanued up slug for objects'); - $t = new Table14(); - $t->setTitle('Hello, World'); - $t->save(); - $this->assertEquals('/foo/hello-world/bar/1', $t->getSlug(), 'preSave() sets a unique slug for objects'); - $t = new Table14(); - $t->setTitle('Hello, World'); - $t->setSlug('/foo/custom/bar'); - $t->save(); - $this->assertEquals('/foo/custom/bar', $t->getSlug(), 'preSave() uses the given slug if it exists'); - $t = new Table14(); - $t->setTitle('Hello, World'); - $t->setSlug('/foo/custom/bar'); - $t->save(); - $this->assertEquals('/foo/custom/bar/1', $t->getSlug(), 'preSave() uses the given slug if it exists and makes it unique'); - } - - public function testObjectSlugLifecycle() - { - Table13Query::create()->deleteAll(); - $t = new Table13(); - $t->setTitle('Hello, World'); - $t->save(); - $this->assertEquals('hello-world', $t->getSlug(), 'preSave() creates a slug for new objects'); - $t->setSlug('hello-bar'); - $t->save(); - $this->assertEquals('hello-bar', $t->getSlug(), 'setSlug() allows to override default slug'); - $t->setSlug(''); - $t->save(); - $this->assertEquals('hello-world', $t->getSlug(), 'setSlug(null) relaunches the slug generation'); - - Table14Query::create()->deleteAll(); - $t = new Table14(); - $t->setTitle('Hello, World2'); - $t->setSlug('hello-bar2'); - $t->save(); - $this->assertEquals('hello-bar2', $t->getSlug(), 'setSlug() allows to override default slug, even before save'); - $t->setSlug(''); - $t->save(); - $this->assertEquals('/foo/hello-world2/bar', $t->getSlug(), 'setSlug(null) relaunches the slug generation'); - } - - public function testObjectSlugAutoUpdate() - { - Table13Query::create()->deleteAll(); - $t = new Table13(); - $t->setTitle('Hello, World'); - $t->save(); - $this->assertEquals('hello-world', $t->getSlug(), 'preSave() creates a slug for new objects'); - $t->setTitle('Hello, My World'); - $t->save(); - $this->assertEquals('hello-my-world', $t->getSlug(), 'preSave() autoupdates slug on object change'); - $t->setTitle('Hello, My Whole New World'); - $t->setSlug('hello-bar'); - $t->save(); - $this->assertEquals('hello-bar', $t->getSlug(), 'preSave() does not autoupdate slug when it was set by the user'); - } - - public function testObjectSlugAutoUpdatePermanent() - { - Table14Query::create()->deleteAll(); - $t = new Table14(); - $t->setTitle('Hello, World'); - $t->save(); - $this->assertEquals('/foo/hello-world/bar', $t->getSlug(), 'preSave() creates a slug for new objects'); - $t->setTitle('Hello, My World'); - $t->save(); - $this->assertEquals('/foo/hello-world/bar', $t->getSlug(), 'preSave() does not autoupdate slug on object change for permanent slugs'); - $t->setSlug('hello-bar'); - $t->save(); - $this->assertEquals('hello-bar', $t->getSlug(), 'setSlug() still works for permanent slugs'); - } - - public function testQueryFindOneBySlug() - { - $this->assertTrue(method_exists('Table13Query', 'findOneBySlug'), 'The generated query provides a findOneBySlug() method'); - $this->assertTrue(method_exists('Table14Query', 'findOneBySlug'), 'The generated query provides a findOneBySlug() method even if the slug column doesnt have the default name'); - - Table14Query::create()->deleteAll(); - $t1 = new Table14(); - $t1->setTitle('Hello, World'); - $t1->save(); - $t2 = new Table14(); - $t2->setTitle('Hello, Cruel World'); - $t2->save(); - $t = Table14Query::create()->findOneBySlug('/foo/hello-world/bar'); - $this->assertEquals($t1, $t, 'findOneBySlug() returns a single object matching the slug'); - } -} - -class TestableTable13 extends Table13 -{ - public function createSlug() - { - return parent::createSlug(); - } - - public function createRawSlug() - { - return parent::createRawSlug(); - } - - public static function cleanupSlugPart($slug, $separator = '-') - { - return parent::cleanupSlugPart($slug, $separator); - } - - public function makeSlugUnique($slug, $separator = '-', $increment = 0) - { - return parent::makeSlugUnique($slug, $separator, $increment); - } -} - -class TestableTable14 extends Table14 -{ - public function createSlug() - { - return parent::createSlug(); - } - - public function createRawSlug() - { - return parent::createRawSlug(); - } - - public static function limitSlugSize($slug, $incrementReservedSpace = 3) - { - return parent::limitSlugSize($slug, $incrementReservedSpace); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorObjectBuilderModifierTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorObjectBuilderModifierTest.php deleted file mode 100644 index 125e03a7f5..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorObjectBuilderModifierTest.php +++ /dev/null @@ -1,279 +0,0 @@ -populateTable11(); - } - - public function testPreInsert() - { - Table11Peer::doDeleteAll(); - $t1 = new Table11(); - $t1->save(); - $this->assertEquals($t1->getRank(), 1, 'Sortable inserts new line in first position if no row present'); - $t2 = new Table11(); - $t2->setTitle('row2'); - $t2->save(); - $this->assertEquals($t2->getRank(), 2, 'Sortable inserts new line in last position'); - } - - public function testPreDelete() - { - $max = Table11Peer::getMaxRank(); - $t3 = Table11Peer::retrieveByRank(3); - $t3->delete(); - $this->assertEquals($max - 1, Table11Peer::getMaxRank(), 'Sortable rearrange subsequent rows on delete'); - $c = new Criteria(); - $c->add(Table11Peer::TITLE, 'row4'); - $t4 = Table11Peer::doSelectOne($c); - $this->assertEquals(3, $t4->getRank(), 'Sortable rearrange subsequent rows on delete'); - } - - public function testIsFirst() - { - $first = Table11Peer::retrieveByRank(1); - $middle = Table11Peer::retrieveByRank(2); - $last = Table11Peer::retrieveByRank(4); - $this->assertTrue($first->isFirst(), 'isFirst() returns true for the first in the rank'); - $this->assertFalse($middle->isFirst(), 'isFirst() returns false for a middle rank'); - $this->assertFalse($last->isFirst(), 'isFirst() returns false for the last in the rank'); - } - - public function testIsLast() - { - $first = Table11Peer::retrieveByRank(1); - $middle = Table11Peer::retrieveByRank(2); - $last = Table11Peer::retrieveByRank(4); - $this->assertFalse($first->isLast(), 'isLast() returns false for the first in the rank'); - $this->assertFalse($middle->isLast(), 'isLast() returns false for a middle rank'); - $this->assertTrue($last->isLast(), 'isLast() returns true for the last in the rank'); - } - - public function testGetNext() - { - $t = Table11Peer::retrieveByRank(3); - $this->assertEquals(4, $t->getNext()->getRank(), 'getNext() returns the next object in rank'); - - $t = Table11Peer::retrieveByRank(4); - $this->assertNull($t->getNext(), 'getNext() returns null for the last object'); - } - - public function testGetPrevious() - { - $t = Table11Peer::retrieveByRank(3); - $this->assertEquals(2, $t->getPrevious()->getRank(), 'getPrevious() returns the previous object in rank'); - - $t = Table11Peer::retrieveByRank(1); - $this->assertNull($t->getPrevious(), 'getPrevious() returns null for the first object'); - } - - public function testInsertAtRank() - { - $t = new Table11(); - $t->setTitle('new'); - $t->insertAtRank(2); - $this->assertEquals(2, $t->getRank(), 'insertAtRank() sets the position'); - $this->assertTrue($t->isNew(), 'insertAtRank() doesn\'t save the object'); - $t->save(); - $expected = array(1 => 'row1', 2 => 'new', 3 => 'row2', 4 => 'row3', 5 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArray(), 'insertAtRank() shifts the entire suite'); - } - - public function testInsertAtMaxRankPlusOne() - { - $t = new Table11(); - $t->setTitle('new'); - $t->insertAtRank(5); - $this->assertEquals(5, $t->getRank(), 'insertAtRank() sets the position'); - $t->save(); - $expected = array(1 => 'row1', 2 => 'row2', 3 => 'row3', 4 => 'row4', 5 => 'new'); - $this->assertEquals($expected, $this->getFixturesArray(), 'insertAtRank() can insert an object at the end of the list'); - } - - /** - * @expectedException PropelException - */ - public function testInsertAtNegativeRank() - { - $t = new Table11(); - $t->insertAtRank(0); - } - - /** - * @expectedException PropelException - */ - public function testInsertAtOverMaxRank() - { - $t = new Table11(); - $t->insertAtRank(6); - } - - public function testInsertAtBottom() - { - $t = new Table11(); - $t->setTitle('new'); - $t->insertAtBottom(); - $this->assertEquals(5, $t->getRank(), 'insertAtBottom() sets the position to the last'); - $this->assertTrue($t->isNew(), 'insertAtBottom() doesn\'t save the object'); - $t->save(); - $expected = array(1 => 'row1', 2 => 'row2', 3 => 'row3', 4 => 'row4', 5 => 'new'); - $this->assertEquals($expected, $this->getFixturesArray(), 'insertAtBottom() does not shift the entire suite'); - } - - public function testInsertAtTop() - { - $t = new Table11(); - $t->setTitle('new'); - $t->insertAtTop(); - $this->assertEquals(1, $t->getRank(), 'insertAtTop() sets the position to 1'); - $this->assertTrue($t->isNew(), 'insertAtTop() doesn\'t save the object'); - $t->save(); - $expected = array(1 => 'new', 2 => 'row1', 3 => 'row2', 4 => 'row3', 5 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArray(), 'insertAtTop() shifts the entire suite'); - } - - public function testMoveToRank() - { - $t2 = Table11Peer::retrieveByRank(2); - $t2->moveToRank(3); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveToRank() can move up'); - $t2->moveToRank(1); - $expected = array(1 => 'row2', 2 => 'row1', 3 => 'row3', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveToRank() can move to the first rank'); - $t2->moveToRank(4); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row4', 4 => 'row2'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveToRank() can move to the last rank'); - $t2->moveToRank(2); - $expected = array(1 => 'row1', 2 => 'row2', 3 => 'row3', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveToRank() can move down'); - } - - /** - * @expectedException PropelException - */ - public function testMoveToNewObject() - { - $t = new Table11(); - $t->moveToRank(2); - } - - /** - * @expectedException PropelException - */ - public function testMoveToNegativeRank() - { - $t = Table11Peer::retrieveByRank(2); - $t->moveToRank(0); - } - - /** - * @expectedException PropelException - */ - public function testMoveToOverMaxRank() - { - $t = Table11Peer::retrieveByRank(2); - $t->moveToRank(5); - } - - public function testSwapWith() - { - $t2 = Table11Peer::retrieveByRank(2); - $t4 = Table11Peer::retrieveByRank(4); - $t2->swapWith($t4); - $expected = array(1 => 'row1', 2 => 'row4', 3 => 'row3', 4 => 'row2'); - $this->assertEquals($expected, $this->getFixturesArray(), 'swapWith() swaps ranks of the two objects and leaves the other ranks unchanged'); - } - - public function testMoveUp() - { - $t3 = Table11Peer::retrieveByRank(3); - $res = $t3->moveUp(); - $this->assertEquals($t3, $res, 'moveUp() returns the current object'); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveUp() swaps ranks with the object of higher rank'); - $t3->moveUp(); - $expected = array(1 => 'row3', 2 => 'row1', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveUp() swaps ranks with the object of higher rank'); - $res = $t3->moveUp(); - $expected = array(1 => 'row3', 2 => 'row1', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveUp() changes nothing when called on the object at the top'); - } - - public function testMoveDown() - { - $t2 = Table11Peer::retrieveByRank(2); - $res = $t2->moveDown(); - $this->assertEquals($t2, $res, 'moveDown() returns the current object'); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveDown() swaps ranks with the object of lower rank'); - $t2->moveDown(); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row4', 4 => 'row2'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveDown() swaps ranks with the object of lower rank'); - $res = $t2->moveDown(); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row4', 4 => 'row2'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveDown() changes nothing when called on the object at the bottom'); - } - - public function testMoveToTop() - { - $t3 = Table11Peer::retrieveByRank(3); - $res = $t3->moveToTop(); - $this->assertEquals($t3, $res, 'moveToTop() returns the current oobject'); - $expected = array(1 => 'row3', 2 => 'row1', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveToTop() moves to the top'); - $res = $t3->moveToTop(); - $expected = array(1 => 'row3', 2 => 'row1', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveToTop() changes nothing when called on the top node'); - } - - public function testMoveToBottom() - { - $t2 = Table11Peer::retrieveByRank(2); - $res = $t2->moveToBottom(); - $this->assertEquals($t2, $res, 'moveToBottom() returns the current object'); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row4', 4 => 'row2'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveToBottom() moves to the bottom'); - $res = $t2->moveToBottom(); - $this->assertFalse($res, 'moveToBottom() returns false when called on the bottom node'); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row4', 4 => 'row2'); - $this->assertEquals($expected, $this->getFixturesArray(), 'moveToBottom() changes nothing when called on the bottom node'); - } - - public function testRemoveFromList() - { - $t2 = Table11Peer::retrieveByRank(2); - $res = $t2->removeFromList(); - $this->assertTrue($res instanceof Table11, 'removeFromList() returns the current object'); - $this->assertNull($res->getRank(), 'removeFromList() resets the object\'s rank'); - Table11Peer::clearInstancePool(); - $expected = array(1 => 'row1', 2 => 'row2', 3 => 'row3', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArray(), 'removeFromList() does not change the list until the object is saved'); - $t2->save(); - Table11Peer::clearInstancePool(); - $expected = array(null => 'row2', 1 => 'row1', 2 => 'row3', 3 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArray(), 'removeFromList() changes the list once the object is saved'); - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorObjectBuilderModifierWithScopeTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorObjectBuilderModifierWithScopeTest.php deleted file mode 100644 index 22261880a0..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorObjectBuilderModifierWithScopeTest.php +++ /dev/null @@ -1,335 +0,0 @@ -populateTable12(); - } - - public function testPreInsert() - { - Table12Peer::doDeleteAll(); - $t1 = new Table12(); - $t1->setScopeValue(1); - $t1->save(); - $this->assertEquals($t1->getRank(), 1, 'Sortable inserts new line in first position if no row present'); - $t2 = new Table12(); - $t2->setScopeValue(1); - $t2->save(); - $this->assertEquals($t2->getRank(), 2, 'Sortable inserts new line in last position'); - $t2 = new Table12(); - $t2->setScopeValue(2); - $t2->save(); - $this->assertEquals($t2->getRank(), 1, 'Sortable inserts new line in last position'); - } - - public function testPreDelete() - { - $max = Table12Peer::getMaxRank(1); - $t3 = Table12Peer::retrieveByRank(3, 1); - $t3->delete(); - $this->assertEquals($max - 1, Table12Peer::getMaxRank(1), 'Sortable rearrange subsequent rows on delete'); - $c = new Criteria(); - $c->add(Table12Peer::TITLE, 'row4'); - $t4 = Table12Peer::doSelectOne($c); - $this->assertEquals(3, $t4->getRank(), 'Sortable rearrange subsequent rows on delete'); - $expected = array(1 => 'row5', 2 => 'row6'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(2), 'delete() leaves other suites unchanged'); - } - - public function testIsFirst() - { - $first = Table12Peer::retrieveByRank(1, 1); - $middle = Table12Peer::retrieveByRank(2, 1); - $last = Table12Peer::retrieveByRank(4, 1); - $this->assertTrue($first->isFirst(), 'isFirst() returns true for the first in the rank'); - $this->assertFalse($middle->isFirst(), 'isFirst() returns false for a middle rank'); - $this->assertFalse($last->isFirst(), 'isFirst() returns false for the last in the rank'); - $first = Table12Peer::retrieveByRank(1, 2); - $last = Table12Peer::retrieveByRank(2, 2); - $this->assertTrue($first->isFirst(), 'isFirst() returns true for the first in the rank'); - $this->assertFalse($last->isFirst(), 'isFirst() returns false for the last in the rank'); - } - - public function testIsLast() - { - $first = Table12Peer::retrieveByRank(1, 1); - $middle = Table12Peer::retrieveByRank(2, 1); - $last = Table12Peer::retrieveByRank(4, 1); - $this->assertFalse($first->isLast(), 'isLast() returns false for the first in the rank'); - $this->assertFalse($middle->isLast(), 'isLast() returns false for a middle rank'); - $this->assertTrue($last->isLast(), 'isLast() returns true for the last in the rank'); - $first = Table12Peer::retrieveByRank(1, 2); - $last = Table12Peer::retrieveByRank(2, 2); - $this->assertFalse($first->isLast(), 'isLast() returns false for the first in the rank'); - $this->assertTrue($last->isLast(), 'isLast() returns true for the last in the rank'); - } - - public function testGetNext() - { - $t = Table12Peer::retrieveByRank(1, 1); - $this->assertEquals('row2', $t->getNext()->getTitle(), 'getNext() returns the next object in rank in the same suite'); - $t = Table12Peer::retrieveByRank(1, 2); - $this->assertEquals('row6', $t->getNext()->getTitle(), 'getNext() returns the next object in rank in the same suite'); - - $t = Table12Peer::retrieveByRank(3, 1); - $this->assertEquals(4, $t->getNext()->getRank(), 'getNext() returns the next object in rank'); - - $t = Table12Peer::retrieveByRank(4, 1); - $this->assertNull($t->getNext(), 'getNext() returns null for the last object'); - } - - public function testGetPrevious() - { - $t = Table12Peer::retrieveByRank(2, 1); - $this->assertEquals('row1', $t->getPrevious()->getTitle(), 'getPrevious() returns the previous object in rank in the same suite'); - $t = Table12Peer::retrieveByRank(2, 2); - $this->assertEquals('row5', $t->getPrevious()->getTitle(), 'getPrevious() returns the previous object in rank in the same suite'); - - $t = Table12Peer::retrieveByRank(3, 1); - $this->assertEquals(2, $t->getPrevious()->getRank(), 'getPrevious() returns the previous object in rank'); - - $t = Table12Peer::retrieveByRank(1, 1); - $this->assertNull($t->getPrevious(), 'getPrevious() returns null for the first object'); - } - - public function testInsertAtRank() - { - $t = new Table12(); - $t->setTitle('new'); - $t->setScopeValue(1); - $t->insertAtRank(2); - $this->assertEquals(2, $t->getRank(), 'insertAtRank() sets the position'); - $this->assertTrue($t->isNew(), 'insertAtTop() doesn\'t save the object'); - $t->save(); - $expected = array(1 => 'row1', 2 => 'new', 3 => 'row2', 4 => 'row3', 5 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'insertAtRank() shifts the entire suite'); - $expected = array(1 => 'row5', 2 => 'row6'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(2), 'insertAtRank() leaves other suites unchanged'); - } - - /** - * @expectedException PropelException - */ - public function testInsertAtNegativeRank() - { - $t = new Table12(); - $t->setScopeValue(1); - $t->insertAtRank(0); - } - - /** - * @expectedException PropelException - */ - public function testInsertAtOverMaxRank() - { - $t = new Table12(); - $t->setScopeValue(1); - $t->insertAtRank(6); - } - - /** - * @expectedException PropelException - */ - public function testInsertAtNoScope() - { - $t = new Table12(); - $t->insertAtRank(3); - } - - public function testInsertAtBottom() - { - $t = new Table12(); - $t->setTitle('new'); - $t->setScopeValue(1); - $t->insertAtBottom(); - $this->assertEquals(5, $t->getRank(), 'insertAtBottom() sets the position to the last'); - $this->assertTrue($t->isNew(), 'insertAtTop() doesn\'t save the object'); - $t->save(); - $expected = array(1 => 'row1', 2 => 'row2', 3 => 'row3', 4 => 'row4', 5 => 'new'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'insertAtBottom() does not shift the entire suite'); - $expected = array(1 => 'row5', 2 => 'row6'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(2), 'insertAtBottom() leaves other suites unchanged'); - } - - /** - * @expectedException PropelException - */ - public function testInsertAtBottomNoScope() - { - $t = new Table12(); - $t->insertAtBottom(); - } - - public function testInsertAtTop() - { - $t = new Table12(); - $t->setTitle('new'); - $t->setScopeValue(1); - $t->insertAtTop(); - $this->assertEquals(1, $t->getRank(), 'insertAtTop() sets the position to 1'); - $this->assertTrue($t->isNew(), 'insertAtTop() doesn\'t save the object'); - $t->save(); - $expected = array(1 => 'new', 2 => 'row1', 3 => 'row2', 4 => 'row3', 5 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'insertAtTop() shifts the entire suite'); - $expected = array(1 => 'row5', 2 => 'row6'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(2), 'insertAtTop() leaves other suites unchanged'); - } - - public function testMoveToRank() - { - $t2 = Table12Peer::retrieveByRank(2, 1); - $t2->moveToRank(3); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveToRank() can move up'); - $expected = array(1 => 'row5', 2 => 'row6'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(2), 'moveToRank() leaves other suites unchanged'); - $t2->moveToRank(1); - $expected = array(1 => 'row2', 2 => 'row1', 3 => 'row3', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveToRank() can move to the first rank'); - $t2->moveToRank(4); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row4', 4 => 'row2'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveToRank() can move to the last rank'); - $t2->moveToRank(2); - $expected = array(1 => 'row1', 2 => 'row2', 3 => 'row3', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveToRank() can move down'); - } - - /** - * @expectedException PropelException - */ - public function testMoveToNewObject() - { - $t = new Table12(); - $t->moveToRank(2); - } - - /** - * @expectedException PropelException - */ - public function testMoveToNegativeRank() - { - $t = Table12Peer::retrieveByRank(2, 1); - $t->moveToRank(0); - } - - /** - * @expectedException PropelException - */ - public function testMoveToOverMaxRank() - { - $t = Table12Peer::retrieveByRank(2, 1); - $t->moveToRank(5); - } - - public function testSwapWith() - { - $t2 = Table12Peer::retrieveByRank(2, 1); - $t4 = Table12Peer::retrieveByRank(4, 1); - $t2->swapWith($t4); - $expected = array(1 => 'row1', 2 => 'row4', 3 => 'row3', 4 => 'row2'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'swapWith() swaps ranks of the two objects and leaves the other ranks unchanged'); - $expected = array(1 => 'row5', 2 => 'row6'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(2), 'swapWith() leaves other suites unchanged'); - } - - public function testMoveUp() - { - $t3 = Table12Peer::retrieveByRank(3, 1); - $res = $t3->moveUp(); - $this->assertEquals($t3, $res, 'moveUp() returns the current object'); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveUp() swaps ranks with the object of higher rank'); - $expected = array(1 => 'row5', 2 => 'row6'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(2), 'moveUp() leaves other suites unchanged'); - $t3->moveUp(); - $expected = array(1 => 'row3', 2 => 'row1', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveUp() swaps ranks with the object of higher rank'); - $res = $t3->moveUp(); - $expected = array(1 => 'row3', 2 => 'row1', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveUp() changes nothing when called on the object at the top'); - } - - public function testMoveDown() - { - $t2 = Table12Peer::retrieveByRank(2, 1); - $res = $t2->moveDown(); - $this->assertEquals($t2, $res, 'moveDown() returns the current object'); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveDown() swaps ranks with the object of lower rank'); - $expected = array(1 => 'row5', 2 => 'row6'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(2), 'moveDown() leaves other suites unchanged'); - $t2->moveDown(); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row4', 4 => 'row2'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveDown() swaps ranks with the object of lower rank'); - $res = $t2->moveDown(); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row4', 4 => 'row2'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveDown() changes nothing when called on the object at the bottom'); - } - - public function testMoveToTop() - { - $t3 = Table12Peer::retrieveByRank(3, 1); - $res = $t3->moveToTop(); - $this->assertEquals($t3, $res, 'moveToTop() returns the current object'); - $expected = array(1 => 'row3', 2 => 'row1', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveToTop() moves to the top'); - $expected = array(1 => 'row5', 2 => 'row6'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(2), 'moveToTop() leaves other suites unchanged'); - $res = $t3->moveToTop(); - $expected = array(1 => 'row3', 2 => 'row1', 3 => 'row2', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveToTop() changes nothing when called on the top node'); - } - - public function testMoveToBottom() - { - $t2 = Table12Peer::retrieveByRank(2, 1); - $res = $t2->moveToBottom(); - $this->assertEquals($t2, $res, 'moveToBottom() returns the current object'); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row4', 4 => 'row2'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveToBottom() moves to the bottom'); - $expected = array(1 => 'row5', 2 => 'row6'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(2), 'moveToBottom() leaves other suites unchanged'); - $res = $t2->moveToBottom(); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row4', 4 => 'row2'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'moveToBottom() changes nothing when called on the bottom node'); - } - - public function testRemoveFromList() - { - $t2 = Table12Peer::retrieveByRank(2, 1); - $res = $t2->removeFromList(); - $this->assertTrue($res instanceof Table12, 'removeFromList() returns the current object'); - $this->assertNull($res->getRank(), 'removeFromList() resets the object\'s rank'); - Table12Peer::clearInstancePool(); - $expected = array(1 => 'row1', 2 => 'row2', 3 => 'row3', 4 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'removeFromList() does not change the list until the object is saved'); - $t2->save(); - Table12Peer::clearInstancePool(); - $expected = array(1 => 'row1', 2 => 'row3', 3 => 'row4'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'removeFromList() changes the list once the object is saved'); - $expected = array(1 => 'row5', 2 => 'row6'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(2), 'removeFromList() leaves other suites unchanged'); - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorPeerBuilderModifierTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorPeerBuilderModifierTest.php deleted file mode 100644 index 3ffb26b7e4..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorPeerBuilderModifierTest.php +++ /dev/null @@ -1,83 +0,0 @@ -populateTable11(); - } - - public function testStaticAttributes() - { - $this->assertEquals(Table11Peer::RANK_COL, 'table11.SORTABLE_RANK'); - } - - public function testGetMaxRank() - { - $this->assertEquals(4, Table11Peer::getMaxRank(), 'getMaxRank() returns the maximum rank'); - $t4 = Table11Peer::retrieveByRank(4); - $t4->delete(); - $this->assertEquals(3, Table11Peer::getMaxRank(), 'getMaxRank() returns the maximum rank'); - Table11Peer::doDeleteAll(); - $this->assertNull(Table11Peer::getMaxRank(), 'getMaxRank() returns null for empty tables'); - } - public function testRetrieveByRank() - { - $t = Table11Peer::retrieveByRank(5); - $this->assertNull($t, 'retrieveByRank() returns null for an unknown rank'); - $t3 = Table11Peer::retrieveByRank(3); - $this->assertEquals(3, $t3->getRank(), 'retrieveByRank() returns the object with the required rank'); - $this->assertEquals('row3', $t3->getTitle(), 'retrieveByRank() returns the object with the required rank'); - } - - public function testReorder() - { - $objects = Table11Peer::doSelect(new Criteria()); - $ids = array(); - foreach ($objects as $object) { - $ids[]= $object->getPrimaryKey(); - } - $ranks = array(4, 3, 2, 1); - $order = array_combine($ids, $ranks); - Table11Peer::reorder($order); - $expected = array(1 => 'row3', 2 => 'row2', 3 => 'row4', 4 => 'row1'); - $this->assertEquals($expected, $this->getFixturesArray(), 'reorder() reorders the suite'); - } - - public function testDoSelectOrderByRank() - { - $objects = Table11Peer::doSelectOrderByRank(); - $oldRank = 0; - while ($object = array_shift($objects)) { - $this->assertTrue($object->getRank() > $oldRank); - $oldRank = $object->getRank(); - } - $objects = Table11Peer::doSelectOrderByRank(null, Criteria::DESC); - $oldRank = 10; - while ($object = array_shift($objects)) { - $this->assertTrue($object->getRank() < $oldRank); - $oldRank = $object->getRank(); - } - } - - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorPeerBuilderModifierWithScopeTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorPeerBuilderModifierWithScopeTest.php deleted file mode 100644 index f9a80f6e53..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorPeerBuilderModifierWithScopeTest.php +++ /dev/null @@ -1,114 +0,0 @@ -populateTable12(); - } - - public function testStaticAttributes() - { - $this->assertEquals(Table12Peer::RANK_COL, 'table12.POSITION'); - $this->assertEquals(Table12Peer::SCOPE_COL, 'table12.MY_SCOPE_COLUMN'); - } - - public function testGetMaxRank() - { - $this->assertEquals(4, Table12Peer::getMaxRank(1), 'getMaxRank() returns the maximum rank of the suite'); - $this->assertEquals(2, Table12Peer::getMaxRank(2), 'getMaxRank() returns the maximum rank of the suite'); - $t4 = Table12Peer::retrieveByRank(4, 1); - $t4->delete(); - $this->assertEquals(3, Table12Peer::getMaxRank(1), 'getMaxRank() returns the maximum rank'); - Table12Peer::doDeleteAll(); - $this->assertNull(Table12Peer::getMaxRank(1), 'getMaxRank() returns null for empty tables'); - } - public function testRetrieveByRank() - { - $t = Table12Peer::retrieveByRank(5, 1); - $this->assertNull($t, 'retrieveByRank() returns null for an unknown rank'); - $t3 = Table12Peer::retrieveByRank(3, 1); - $this->assertEquals(3, $t3->getRank(), 'retrieveByRank() returns the object with the required rank in the required suite'); - $this->assertEquals('row3', $t3->getTitle(), 'retrieveByRank() returns the object with the required rank in the required suite'); - $t6 = Table12Peer::retrieveByRank(2, 2); - $this->assertEquals(2, $t6->getRank(), 'retrieveByRank() returns the object with the required rank in the required suite'); - $this->assertEquals('row6', $t6->getTitle(), 'retrieveByRank() returns the object with the required rank in the required suite'); - } - - public function testReorder() - { - $c = new Criteria(); - $c->add(Table12Peer::SCOPE_COL, 1); - $objects = Table12Peer::doSelectOrderByRank($c); - $ids = array(); - foreach ($objects as $object) { - $ids[]= $object->getPrimaryKey(); - } - $ranks = array(4, 3, 2, 1); - $order = array_combine($ids, $ranks); - Table12Peer::reorder($order); - $expected = array(1 => 'row4', 2 => 'row3', 3 => 'row2', 4 => 'row1'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'reorder() reorders the suite'); - $expected = array(1 => 'row5', 2 => 'row6'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(2), 'reorder() leaves other suites unchanged'); - } - - public function testDoSelectOrderByRank() - { - $c = new Criteria(); - $c->add(Table12Peer::SCOPE_COL, 1); - $objects = Table12Peer::doSelectOrderByRank($c); - $oldRank = 0; - while ($object = array_shift($objects)) { - $this->assertTrue($object->getRank() > $oldRank); - $oldRank = $object->getRank(); - } - $c = new Criteria(); - $c->add(Table12Peer::SCOPE_COL, 1); - $objects = Table12Peer::doSelectOrderByRank($c, Criteria::DESC); - $oldRank = 10; - while ($object = array_shift($objects)) { - $this->assertTrue($object->getRank() < $oldRank); - $oldRank = $object->getRank(); - } - } - - public function testRetrieveList() - { - $this->assertEquals(4, count(Table12Peer::retrieveList(1)), 'retrieveList() returns the list of objects in the scope'); - $this->assertEquals(2, count(Table12Peer::retrieveList(2)), 'retrieveList() returns the list of objects in the scope'); - } - - public function testCountList() - { - $this->assertEquals(4, Table12Peer::countList(1), 'countList() returns the list of objects in the scope'); - $this->assertEquals(2, Table12Peer::countList(2), 'countList() returns the list of objects in the scope'); - } - - public function testDeleteList() - { - $this->assertEquals(4, Table12Peer::deleteList(1), 'deleteList() returns the list of objects in the scope'); - $this->assertEquals(2, Table12Peer::doCount(new Criteria()), 'deleteList() deletes the objects in the scope'); - $this->assertEquals(2, Table12Peer::deleteList(2), 'deleteList() returns the list of objects in the scope'); - $this->assertEquals(0, Table12Peer::doCount(new Criteria()), 'deleteList() deletes the objects in the scope'); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorQueryBuilderModifierTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorQueryBuilderModifierTest.php deleted file mode 100644 index 15614f10c2..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorQueryBuilderModifierTest.php +++ /dev/null @@ -1,115 +0,0 @@ -populateTable11(); - } - - public function testFilterByRank() - { - $this->assertTrue(Table11Query::create()->filterByRank(1) instanceof Table11Query, 'filterByRank() returns the current query object'); - $this->assertEquals('row1', Table11Query::create()->filterByRank(1)->findOne()->getTitle(), 'filterByRank() filters on the rank'); - $this->assertEquals('row4', Table11Query::create()->filterByRank(4)->findOne()->getTitle(), 'filterByRank() filters on the rank'); - $this->assertNull(Table11Query::create()->filterByRank(5)->findOne(), 'filterByRank() filters on the rank, which makes the query return no result on a non-existent rank'); - } - - public function testOrderByRank() - { - $this->assertTrue(Table11Query::create()->orderByRank() instanceof Table11Query, 'orderByRank() returns the current query object'); - // default order - $query = Table11Query::create()->orderByRank(); - $expectedQuery = Table11Query::create()->addAscendingOrderByColumn(Table11Peer::SORTABLE_RANK); - $this->assertEquals($expectedQuery, $query, 'orderByRank() orders the query by rank asc'); - // asc order - $query = Table11Query::create()->orderByRank(Criteria::ASC); - $expectedQuery = Table11Query::create()->addAscendingOrderByColumn(Table11Peer::SORTABLE_RANK); - $this->assertEquals($expectedQuery, $query, 'orderByRank() orders the query by rank, using the argument as sort direction'); - // desc order - $query = Table11Query::create()->orderByRank(Criteria::DESC); - $expectedQuery = Table11Query::create()->addDescendingOrderByColumn(Table11Peer::SORTABLE_RANK); - $this->assertEquals($expectedQuery, $query, 'orderByRank() orders the query by rank, using the argument as sort direction'); - } - - /** - * @expectedException PropelException - */ - public function testOrderByRankIncorrectDirection() - { - Table11Query::create()->orderByRank('foo'); - } - - public function testFindList() - { - $ts = Table11Query::create()->findList(); - $this->assertTrue($ts instanceof PropelObjectCollection, 'findList() returns a collection of objects'); - $this->assertEquals(4, count($ts), 'findList() does not filter the query'); - $this->assertEquals('row1', $ts[0]->getTitle(), 'findList() returns an ordered list'); - $this->assertEquals('row2', $ts[1]->getTitle(), 'findList() returns an ordered list'); - $this->assertEquals('row3', $ts[2]->getTitle(), 'findList() returns an ordered list'); - $this->assertEquals('row4', $ts[3]->getTitle(), 'findList() returns an ordered list'); - } - - public function testFindOneByRank() - { - $this->assertTrue(Table11Query::create()->findOneByRank(1) instanceof Table11, 'findOneByRank() returns an instance of the model object'); - $this->assertEquals('row1', Table11Query::create()->findOneByRank(1)->getTitle(), 'findOneByRank() returns a single item based on the rank'); - $this->assertEquals('row4', Table11Query::create()->findOneByRank(4)->getTitle(), 'findOneByRank() returns a single item based on the rank'); - $this->assertNull(Table11Query::create()->findOneByRank(5), 'findOneByRank() returns no result on a non-existent rank'); - } - - public function testGetMaxRank() - { - $this->assertEquals(4, Table11Query::create()->getMaxRank(), 'getMaxRank() returns the maximum rank'); - // delete one - $t4 = Table11Query::create()->findOneByRank(4); - $t4->delete(); - $this->assertEquals(3, Table11Query::create()->getMaxRank(), 'getMaxRank() returns the maximum rank'); - // add one - $t = new Table11(); - $t->save(); - $this->assertEquals(4, Table11Query::create()->getMaxRank(), 'getMaxRank() returns the maximum rank'); - // delete all - Table11Query::create()->deleteAll(); - $this->assertNull(Table11Query::create()->getMaxRank(), 'getMaxRank() returns null for empty tables'); - // add one - $t = new Table11(); - $t->save(); - $this->assertEquals(1, Table11Query::create()->getMaxRank(), 'getMaxRank() returns the maximum rank'); - } - - public function testReorder() - { - $objects = Table11Query::create()->find(); - $ids = array(); - foreach ($objects as $object) { - $ids[]= $object->getPrimaryKey(); - } - $ranks = array(4, 3, 2, 1); - $order = array_combine($ids, $ranks); - Table11Query::create()->reorder($order); - $expected = array(1 => 'row3', 2 => 'row2', 3 => 'row4', 4 => 'row1'); - $this->assertEquals($expected, $this->getFixturesArray(), 'reorder() reorders the suite'); - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorQueryBuilderModifierWithScopeTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorQueryBuilderModifierWithScopeTest.php deleted file mode 100644 index db6f41b6dd..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorQueryBuilderModifierWithScopeTest.php +++ /dev/null @@ -1,142 +0,0 @@ -populateTable12(); - } - - public function testInList() - { - /* List used for tests - scope=1 scope=2 - row1 row5 - row2 row6 - row3 - row4 - */ - $query = Table12Query::create()->inList(1); - $expectedQuery = Table12Query::create()->add(Table12Peer::MY_SCOPE_COLUMN, 1, Criteria::EQUAL); - $this->assertEquals($expectedQuery, $query, 'inList() filters the query by scope'); - $this->assertEquals(4, $query->count(), 'inList() filters the query by scope'); - $query = Table12Query::create()->inList(2); - $expectedQuery = Table12Query::create()->add(Table12Peer::MY_SCOPE_COLUMN, 2, Criteria::EQUAL); - $this->assertEquals($expectedQuery, $query, 'inList() filters the query by scope'); - $this->assertEquals(2, $query->count(), 'inList() filters the query by scope'); - } - - public function testFilterByRank() - { - /* List used for tests - scope=1 scope=2 - row1 row5 - row2 row6 - row3 - row4 - */ - $this->assertEquals('row1', Table12Query::create()->filterByRank(1, 1)->findOne()->getTitle(), 'filterByRank() filters on the rank and the scope'); - $this->assertEquals('row5', Table12Query::create()->filterByRank(1, 2)->findOne()->getTitle(), 'filterByRank() filters on the rank and the scope'); - $this->assertEquals('row4', Table12Query::create()->filterByRank(4, 1)->findOne()->getTitle(), 'filterByRank() filters on the rank and the scope'); - $this->assertNull(Table12Query::create()->filterByRank(4, 2)->findOne(), 'filterByRank() filters on the rank and the scope, which makes the query return no result on a non-existent rank'); - } - - public function testOrderByRank() - { - $this->assertTrue(Table12Query::create()->orderByRank() instanceof Table12Query, 'orderByRank() returns the current query object'); - // default order - $query = Table12Query::create()->orderByRank(); - $expectedQuery = Table12Query::create()->addAscendingOrderByColumn(Table12Peer::POSITION); - $this->assertEquals($expectedQuery, $query, 'orderByRank() orders the query by rank asc'); - // asc order - $query = Table12Query::create()->orderByRank(Criteria::ASC); - $expectedQuery = Table12Query::create()->addAscendingOrderByColumn(Table12Peer::POSITION); - $this->assertEquals($expectedQuery, $query, 'orderByRank() orders the query by rank, using the argument as sort direction'); - // desc order - $query = Table12Query::create()->orderByRank(Criteria::DESC); - $expectedQuery = Table12Query::create()->addDescendingOrderByColumn(Table12Peer::POSITION); - $this->assertEquals($expectedQuery, $query, 'orderByRank() orders the query by rank, using the argument as sort direction'); - } - - public function testFindList() - { - $ts = Table12Query::create()->findList(1); - $this->assertTrue($ts instanceof PropelObjectCollection, 'findList() returns a collection of objects'); - $this->assertEquals(4, count($ts), 'findList() filters the query by scope'); - $this->assertEquals('row1', $ts[0]->getTitle(), 'findList() returns an ordered scoped list'); - $this->assertEquals('row2', $ts[1]->getTitle(), 'findList() returns an ordered scoped list'); - $this->assertEquals('row3', $ts[2]->getTitle(), 'findList() returns an ordered scoped list'); - $this->assertEquals('row4', $ts[3]->getTitle(), 'findList() returns an ordered scoped list'); - $ts = Table12Query::create()->findList(2); - $this->assertEquals(2, count($ts), 'findList() filters the query by scope'); - $this->assertEquals('row5', $ts[0]->getTitle(), 'findList() returns an ordered scoped list'); - $this->assertEquals('row6', $ts[1]->getTitle(), 'findList() returns an ordered scoped list'); - } - - public function testFindOneByRank() - { - $this->assertTrue(Table12Query::create()->findOneByRank(1, 1) instanceof Table12, 'findOneByRank() returns an instance of the model object'); - $this->assertEquals('row1', Table12Query::create()->findOneByRank(1, 1)->getTitle(), 'findOneByRank() returns a single item based on the rank and the scope'); - $this->assertEquals('row5', Table12Query::create()->findOneByRank(1, 2)->getTitle(), 'findOneByRank() returns a single item based on the rank and the scope'); - $this->assertEquals('row4', Table12Query::create()->findOneByRank(4, 1)->getTitle(), 'findOneByRank() returns a single item based on the rank a,d the scope'); - $this->assertNull(Table12Query::create()->findOneByRank(4, 2), 'findOneByRank() returns no result on a non-existent rank and scope'); - } - - public function testGetMaxRank() - { - $this->assertEquals(4, Table12Query::create()->getMaxRank(1), 'getMaxRank() returns the maximum rank in the scope'); - $this->assertEquals(2, Table12Query::create()->getMaxRank(2), 'getMaxRank() returns the maximum rank in the scope'); - // delete one - $t4 = Table12Query::create()->findOneByRank(4, 1); - $t4->delete(); - $this->assertEquals(3, Table12Query::create()->getMaxRank(1), 'getMaxRank() returns the maximum rank'); - // add one - $t = new Table12(); - $t->setMyScopeColumn(1); - $t->save(); - $this->assertEquals(4, Table12Query::create()->getMaxRank(1), 'getMaxRank() returns the maximum rank'); - // delete all - Table12Query::create()->deleteAll(); - $this->assertNull(Table12Query::create()->getMaxRank(1), 'getMaxRank() returns null for empty tables'); - // add one - $t = new Table12(); - $t->setMyScopeColumn(1); - $t->save(); - $this->assertEquals(1, Table12Query::create()->getMaxRank(1), 'getMaxRank() returns the maximum rank'); - } - - public function testReorder() - { - $objects = Table12Query::create()->findList(1); - $ids = array(); - foreach ($objects as $object) { - $ids[]= $object->getPrimaryKey(); - } - $ranks = array(4, 3, 2, 1); - $order = array_combine($ids, $ranks); - Table12Query::create()->reorder($order); - $expected = array(1 => 'row4', 2 => 'row3', 3 => 'row2', 4 => 'row1'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(1), 'reorder() reorders the suite'); - $expected = array(1 => 'row5', 2 => 'row6'); - $this->assertEquals($expected, $this->getFixturesArrayWithScope(2), 'reorder() leaves other suites unchanged'); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorTest.php deleted file mode 100644 index 6192614a5d..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/behavior/sortable/SortableBehaviorTest.php +++ /dev/null @@ -1,33 +0,0 @@ -assertEquals(count($table11->getColumns()), 3, 'Sortable adds one columns by default'); - $this->assertTrue(method_exists('Table11', 'getRank'), 'Sortable adds a rank column by default'); - $table12 = Table12Peer::getTableMap(); - $this->assertEquals(count($table12->getColumns()), 4, 'Sortable does not add a column when it already exists'); - $this->assertTrue(method_exists('Table12', 'getPosition'), 'Sortable allows customization of rank_column name'); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/NamespaceTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/NamespaceTest.php deleted file mode 100644 index ff69d6f7ed..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/NamespaceTest.php +++ /dev/null @@ -1,225 +0,0 @@ -markTestSkipped('Namespace support requires PHP 5.3'); - } - parent::setUp(); - Propel::init('fixtures/namespaced/build/conf/bookstore_namespaced-conf.php'); - } - - protected function tearDown() - { - parent::tearDown(); - Propel::init('fixtures/bookstore/build/conf/bookstore-conf.php'); - } - - public function testInsert() - { - $book = new \Foo\Bar\NamespacedBook(); - $book->setTitle('foo'); - $book->save(); - $this->assertFalse($book->isNew()); - - $publisher = new \Baz\NamespacedPublisher(); - $publisher->save(); - $this->assertFalse($publisher->isNew()); - } - - public function testUpdate() - { - $book = new \Foo\Bar\NamespacedBook(); - $book->setTitle('foo'); - $book->save(); - $book->setTitle('bar'); - $book->save(); - $this->assertFalse($book->isNew()); - } - - public function testRelate() - { - $author = new NamespacedAuthor(); - $book = new \Foo\Bar\NamespacedBook(); - $book->setNamespacedAuthor($author); - $book->save(); - $this->assertFalse($book->isNew()); - $this->assertFalse($author->isNew()); - - $author = new NamespacedAuthor(); - $book = new \Foo\Bar\NamespacedBook(); - $author->addNamespacedBook($book); - $author->save(); - $this->assertFalse($book->isNew()); - $this->assertFalse($author->isNew()); - - $publisher = new \Baz\NamespacedPublisher(); - $book = new \Foo\Bar\NamespacedBook(); - $book->setNamespacedPublisher($publisher); - $book->save(); - $this->assertFalse($book->isNew()); - $this->assertFalse($publisher->isNew()); - } - - public function testBasicQuery() - { - \Foo\Bar\NamespacedBookQuery::create()->deleteAll(); - \Baz\NamespacedPublisherQuery::create()->deleteAll(); - $noNamespacedBook = \Foo\Bar\NamespacedBookQuery::create()->findOne(); - $this->assertNull($noNamespacedBook); - $noPublihser = \Baz\NamespacedPublisherQuery::create()->findOne(); - $this->assertNull($noPublihser); - } - - public function testFind() - { - \Foo\Bar\NamespacedBookQuery::create()->deleteAll(); - $book = new \Foo\Bar\NamespacedBook(); - $book->setTitle('War And Peace'); - $book->save(); - $book2 = \Foo\Bar\NamespacedBookQuery::create()->findPk($book->getId()); - $this->assertEquals($book, $book2); - $book3 = \Foo\Bar\NamespacedBookQuery::create()->findOneByTitle($book->getTitle()); - $this->assertEquals($book, $book3); - } - - public function testGetRelatedManyToOne() - { - \Foo\Bar\NamespacedBookQuery::create()->deleteAll(); - \Baz\NamespacedPublisherQuery::create()->deleteAll(); - $publisher = new \Baz\NamespacedPublisher(); - $book = new \Foo\Bar\NamespacedBook(); - $book->setNamespacedPublisher($publisher); - $book->save(); - \Foo\Bar\NamespacedBookPeer::clearInstancePool(); - \Baz\NamespacedPublisherPeer::clearInstancePool(); - $book2 = \Foo\Bar\NamespacedBookQuery::create()->findPk($book->getId()); - $publisher2 = $book2->getNamespacedPublisher(); - $this->assertEquals($publisher->getId(), $publisher2->getId()); - } - - public function testGetRelatedOneToMany() - { - \Foo\Bar\NamespacedBookQuery::create()->deleteAll(); - \Baz\NamespacedPublisherQuery::create()->deleteAll(); - $author = new NamespacedAuthor(); - $book = new \Foo\Bar\NamespacedBook(); - $book->setNamespacedAuthor($author); - $book->save(); - \Foo\Bar\NamespacedBookPeer::clearInstancePool(); - NamespacedAuthorPeer::clearInstancePool(); - $author2 = NamespacedAuthorQuery::create()->findPk($author->getId()); - $book2 = $author2->getNamespacedBooks()->getFirst(); - $this->assertEquals($book->getId(), $book2->getId()); - } - - public function testFindWithManyToOne() - { - \Foo\Bar\NamespacedBookQuery::create()->deleteAll(); - \Baz\NamespacedPublisherQuery::create()->deleteAll(); - $publisher = new \Baz\NamespacedPublisher(); - $book = new \Foo\Bar\NamespacedBook(); - $book->setNamespacedPublisher($publisher); - $book->save(); - \Foo\Bar\NamespacedBookPeer::clearInstancePool(); - \Baz\NamespacedPublisherPeer::clearInstancePool(); - $book2 = \Foo\Bar\NamespacedBookQuery::create() - ->joinWith('NamespacedPublisher') - ->findPk($book->getId()); - $publisher2 = $book2->getNamespacedPublisher(); - $this->assertEquals($publisher->getId(), $publisher2->getId()); - } - - public function testFindWithOneToMany() - { - \Foo\Bar\NamespacedBookQuery::create()->deleteAll(); - NamespacedAuthorQuery::create()->deleteAll(); - $author = new NamespacedAuthor(); - $book = new \Foo\Bar\NamespacedBook(); - $book->setNamespacedAuthor($author); - $book->save(); - \Foo\Bar\NamespacedBookPeer::clearInstancePool(); - NamespacedAuthorPeer::clearInstancePool(); - $author2 = NamespacedAuthorQuery::create() - ->joinWith('NamespacedBook') - ->findPk($author->getId()); - $book2 = $author2->getNamespacedBooks()->getFirst(); - $this->assertEquals($book->getId(), $book2->getId()); - } - - public function testSingleTableInheritance() - { - \Foo\Bar\NamespacedBookstoreEmployeeQuery::create()->deleteAll(); - $emp = new \Foo\Bar\NamespacedBookstoreEmployee(); - $emp->setName('Henry'); - $emp->save(); - $man = new \Foo\Bar\NamespacedBookstoreManager(); - $man->setName('John'); - $man->save(); - $cas = new \Foo\Bar\NamespacedBookstoreCashier(); - $cas->setName('William'); - $cas->save(); - $emps = \Foo\Bar\NamespacedBookstoreEmployeeQuery::create() - ->orderByName() - ->find(); - $this->assertEquals(3, count($emps)); - $this->assertTrue($emps[0] instanceof \Foo\Bar\NamespacedBookstoreEmployee); - $this->assertTrue($emps[1] instanceof \Foo\Bar\NamespacedBookstoreManager); - $this->assertTrue($emps[2] instanceof \Foo\Bar\NamespacedBookstoreCashier); - $nbMan = \Foo\Bar\NamespacedBookstoreManagerQuery::create() - ->count(); - $this->assertEquals(1, $nbMan); - } - - public function testManyToMany() - { - \Foo\Bar\NamespacedBookQuery::create()->deleteAll(); - \Baz\NamespacedBookClubQuery::create()->deleteAll(); - NamespacedBookListRelQuery::create()->deleteAll(); - $book1 = new \Foo\Bar\NamespacedBook(); - $book1->setTitle('bar'); - $book1->save(); - $book2 = new \Foo\Bar\NamespacedBook(); - $book2->setTitle('foo'); - $book2->save(); - $bookClub1 = new \Baz\NamespacedBookClub(); - $bookClub1->addNamespacedBook($book1); - $bookClub1->addNamespacedBook($book2); - $bookClub1->save(); - $bookClub2 = new \Baz\NamespacedBookClub(); - $bookClub2->addNamespacedBook($book1); - $bookClub2->save(); - $this->assertEquals(2, $book1->countNamespacedBookClubs()); - $this->assertEquals(1, $book2->countNamespacedBookClubs()); - $nbRels = NamespacedBookListRelQuery::create()->count(); - $this->assertEquals(3, $nbRels); - $con = Propel::getConnection(NamespacedBookListRelPeer::DATABASE_NAME); - $books = \Foo\Bar\NamespacedBookQuery::create() - ->orderByTitle() - ->joinWith('NamespacedBookListRel') - ->joinWith('NamespacedBookListRel.NamespacedBookClub') - ->find($con); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedNestedSetObjectTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedNestedSetObjectTest.php deleted file mode 100644 index e6f7fb943b..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedNestedSetObjectTest.php +++ /dev/null @@ -1,187 +0,0 @@ -assertTrue($pp->isRoot(), 'Node must be root'); - } - - /** - * Test xxxNestedSet::isRoot() as false - */ - public function testObjectIsRootFalse() - { - $c = new Criteria(PagePeer::DATABASE_NAME); - $c->add(PagePeer::TITLE, 'school', Criteria::EQUAL); - - $school = PagePeer::doSelectOne($c); - $this->assertFalse($school->isRoot(), 'Node must not be root'); - } - - /** - * Test xxxNestedSet::retrieveParent() as true. - */ - public function testObjectRetrieveParentTrue() - { - $c = new Criteria(PagePeer::DATABASE_NAME); - $c->add(PagePeer::TITLE, 'school', Criteria::EQUAL); - - $school = PagePeer::doSelectOne($c); - $this->assertNotNull($school->retrieveParent(), 'Parent node must exist'); - } - - /** - * Test xxxNestedSet::retrieveParent() as false. - */ - public function testObjectRetrieveParentFalse() - { - $c = new Criteria(PagePeer::DATABASE_NAME); - $c->add(PagePeer::TITLE, 'home', Criteria::EQUAL); - - $home = PagePeer::doSelectOne($c); - $this->assertNull($home->retrieveParent(), 'Parent node must not exist and retrieved not be null'); - } - - /** - * Test xxxNestedSet::hasParent() as true. - */ - public function testObjectHasParentTrue() - { - $c = new Criteria(); - $c->add(PagePeer::TITLE, 'school', Criteria::EQUAL); - - $school = PagePeer::doSelectOne($c); - $this->assertTrue($school->hasParent(), 'Node must have parent node'); - } - - /** - * Test xxxNestedSet::hasParent() as false - */ - public function testObjectHasParentFalse() - { - $c = new Criteria(); - $c->add(PagePeer::TITLE, 'home', Criteria::EQUAL); - - $home = PagePeer::doSelectOne($c); - $this->assertFalse($home->hasParent(), 'Root node must not have parent'); - } - - /** - * Test xxxNestedSet::isLeaf() as true. - */ - public function testObjectIsLeafTrue() - { - $c = new Criteria(); - $c->add(PagePeer::TITLE, 'simulator', Criteria::EQUAL); - - $simulator = PagePeer::doSelectOne($c); - $this->assertTrue($simulator->isLeaf($simulator), 'Node must be a leaf'); - } - - /** - * Test xxxNestedSet::isLeaf() as false - */ - public function testObjectIsLeafFalse() - { - $c = new Criteria(); - $c->add(PagePeer::TITLE, 'contact', Criteria::EQUAL); - - $contact = PagePeer::doSelectOne($c); - $this->assertFalse($contact->isLeaf($contact), 'Node must not be a leaf'); - } - - /** - * Test xxxNestedSet::makeRoot() - */ - public function testObjectMakeRoot() - { - $page = new Page(); - $page->makeRoot(); - $this->assertEquals(1, $page->getLeftValue(), 'Node left value must equal 1'); - $this->assertEquals(2, $page->getRightValue(), 'Node right value must equal 2'); - } - - /** - * Test xxxNestedSet::makeRoot() exception - * @expectedException PropelException - */ - public function testObjectMakeRootException() - { - $c = new Criteria(); - $c->add(PagePeer::TITLE, 'home', Criteria::EQUAL); - - $home = PagePeer::doSelectOne($c); - $home->makeRoot(); - } - - /** - * Test xxxNestedSet::getDescendants() - */ - public function testPeerGetDescendants() - { - $nodesWithoutPool = array(); - CategoryPeer::clearInstancePool(); - $cat = CategoryPeer::retrieveRoot(1); - $children = $cat->getDescendants(); - foreach($children as $child) - { - $nodesWithoutPool[] = $child->getTitle(); - } - $this->assertEquals($nodesWithoutPool, array('Cat_1_1', 'Cat_1_1_1', 'Cat_1_1_1_1')); - } - - /** - * Test xxxNestedSet::getDescendantsTwice() - */ - public function testPeerGetDescendantsTwice() - { - $nodesWithoutPool = array(); - $nodesWithPool = array(); - - CategoryPeer::clearInstancePool(); - $cat = CategoryPeer::retrieveRoot(1); - $children = $cat->getDescendants(); - foreach($children as $child) - { - $nodesWithoutPool[] = $child->getTitle(); - } - - $cat = CategoryPeer::retrieveRoot(1); - $children = $cat->getDescendants(); - foreach($children as $child) - { - $nodesWithPool[] = $child->getTitle(); - } - $this->assertEquals($nodesWithoutPool, $nodesWithPool, 'Retrieved nodes must be the same with and without InstancePooling'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedNestedSetPeerTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedNestedSetPeerTest.php deleted file mode 100644 index ae255c010e..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedNestedSetPeerTest.php +++ /dev/null @@ -1,188 +0,0 @@ -assertNotNull($pp, 'Node must exist and not be null'); - $this->assertEquals(1, $pp->getLeftValue(), 'Node left value must be equal to 1'); - } - - /** - * Test retrieveRoot() as false - */ - public function testRetrieveRootNotExist() - { - $pp = PagePeer::retrieveRoot(2); - $this->assertNull($pp, 'Root with such scopeId must not exist'); - } - - /** - * Test xxxNestedSetPeer::isRoot() as true - */ - public function testPeerIsRootTrue() - { - $pp = PagePeer::retrieveRoot(1); - $this->assertTrue(PagePeer::isRoot($pp), 'Node must be root'); - } - - /** - * Test xxxNestedSetPeer::isRoot() as false - */ - public function testPeerIsRootFalse() - { - $c = new Criteria(PagePeer::DATABASE_NAME); - $c->add(PagePeer::TITLE, 'school', Criteria::EQUAL); - - $school = PagePeer::doSelectOne($c); - $this->assertFalse(PagePeer::isRoot($school), 'Node must not be root'); - } - - /** - * Test xxxNestedSetPeer::retrieveParent() as true. - */ - public function testPeerRetrieveParentTrue() - { - $c = new Criteria(PagePeer::DATABASE_NAME); - $c->add(PagePeer::TITLE, 'school', Criteria::EQUAL); - - $school = PagePeer::doSelectOne($c); - $this->assertNotNull(PagePeer::retrieveParent($school), 'Parent node must exist'); - } - - /** - * Test xxxNestedSetPeer::retrieveParent() as false. - */ - public function testPeerRetrieveParentFalse() - { - $c = new Criteria(PagePeer::DATABASE_NAME); - $c->add(PagePeer::TITLE, 'home', Criteria::EQUAL); - - $home = PagePeer::doSelectOne($c); - $this->assertNull(PagePeer::retrieveParent($home), 'Parent node must not exist and retrieved not be null'); - } - - /** - * Test xxxNestedSetPeer::hasParent() as true. - */ - public function testPeerHasParentTrue() - { - $c = new Criteria(); - $c->add(PagePeer::TITLE, 'school', Criteria::EQUAL); - - $school = PagePeer::doSelectOne($c); - $this->assertTrue(PagePeer::hasParent($school), 'Node must have parent node'); - } - - /** - * Test xxxNestedSetPeer::hasParent() as false - */ - public function testPeerHasParentFalse() - { - $c = new Criteria(); - $c->add(PagePeer::TITLE, 'home', Criteria::EQUAL); - - $home = PagePeer::doSelectOne($c); - $this->assertFalse(PagePeer::hasParent($home), 'Root node must not have parent'); - } - - /** - * Test xxxNestedSetPeer::isValid() as true. - */ - public function testPeerIsValidTrue() - { - $c = new Criteria(); - $c->add(PagePeer::TITLE, 'school', Criteria::EQUAL); - - $school = PagePeer::doSelectOne($c); - $this->assertTrue(PagePeer::isValid($school), 'Node must be valid'); - } - - /** - * Test xxxNestedSetPeer::isValid() as false - */ - public function testPeerIsValidFalse() - { - $page = new Page(); - $this->assertFalse(PagePeer::isValid($page), 'Node left and right values must be invalid'); - $this->assertFalse(PagePeer::isValid(null), 'Null must be invalid'); - } - - /** - * Test xxxNestedSetPeer::isLeaf() as true. - */ - public function testPeerIsLeafTrue() - { - $c = new Criteria(); - $c->add(PagePeer::TITLE, 'simulator', Criteria::EQUAL); - - $simulator = PagePeer::doSelectOne($c); - $this->assertTrue(PagePeer::isLeaf($simulator), 'Node must be a leaf'); - } - - /** - * Test xxxNestedSetPeer::isLeaf() as false - */ - public function testPeerIsLeafFalse() - { - $c = new Criteria(); - $c->add(PagePeer::TITLE, 'contact', Criteria::EQUAL); - - $contact = PagePeer::doSelectOne($c); - $this->assertFalse(PagePeer::isLeaf($contact), 'Node must not be a leaf'); - } - - /** - * Test xxxNestedSetPeer::createRoot() - */ - public function testPeerCreateRoot() - { - $page = new Page(); - PagePeer::createRoot($page); - $this->assertEquals(1, $page->getLeftValue(), 'Node left value must equal 1'); - $this->assertEquals(2, $page->getRightValue(), 'Node right value must equal 2'); - } - - /** - * Test xxxNestedSetPeer::createRoot() exception - * @expectedException PropelException - */ - public function testPeerCreateRootException() - { - $c = new Criteria(); - $c->add(PagePeer::TITLE, 'home', Criteria::EQUAL); - - $home = PagePeer::doSelectOne($c); - PagePeer::createRoot($home); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedNestedSetTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedNestedSetTest.php deleted file mode 100644 index b091785516..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedNestedSetTest.php +++ /dev/null @@ -1,120 +0,0 @@ -getDepth()) - , $item->getId() , ': ' - , $item->getTitle() - , ' [', $item->getLeftValue(), ':', $item->getRightValue() , ']' - . "\n"; - } - } - - /** - * Adds a new Page row with specified parent Id. - * - * @param int $parentId - */ - protected function addNewChildPage($parentId) - { - $db = Propel::getConnection(PagePeer::DATABASE_NAME); - - //$db->beginTransaction(); - - $parent = PagePeer::retrieveByPK($parentId); - $page = new Page(); - $page->setTitle('new page '.time()); - $page->insertAsLastChildOf($parent); - $page->save(); - - //$db->commit(); - } - - /** - * Asserts that the Page table tree integrity is intact. - */ - protected function assertPageTreeIntegrity() - { - $db = Propel::getConnection(PagePeer::DATABASE_NAME); - - $values = array(); - $log = ''; - - foreach ($db->query('SELECT Id, LeftChild, RightChild, Title FROM Page', PDO::FETCH_NUM) as $row) { - - list($id, $leftChild, $rightChild, $title) = $row; - - if (!in_array($leftChild, $values)) { - $values[] = (int) $leftChild; - } else { - $this->fail('Duplicate LeftChild value '.$leftChild); - } - - if (!in_array($rightChild, $values)) { - $values[] = (int) $rightChild; - } else { - $this->fail('Duplicate RightChild value '.$rightChild); - } - - $log .= "[$id($leftChild:$rightChild)]"; - } - - sort($values); - - if ($values[count($values)-1] != count($values)) { - $message = sprintf("Tree integrity NOT ok (%s)\n", $log); - $message .= sprintf('Integrity error: value count: %d, high value: %d', count($values), $values[count($values)-1]); - $this->fail($message); - } - - } - - /** - * Tests adding a node to the Page tree. - */ - public function testAdd() - { - $db = Propel::getConnection(PagePeer::DATABASE_NAME); - - // I'm not sure if the specific ID matters, but this should match original - // code. The ID will change with subsequent runs (e.g. the first time it will be 11) - $startId = $db->query('SELECT MIN(Id) FROM Page')->fetchColumn(); - $this->addNewChildPage($startId + 10); - $this->assertPageTreeIntegrity(); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedObjectLobTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedObjectLobTest.php deleted file mode 100644 index 290e73c4f6..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedObjectLobTest.php +++ /dev/null @@ -1,289 +0,0 @@ - - * @package generator.builder.om - */ -class GeneratedObjectLobTest extends BookstoreEmptyTestBase -{ - - /** - * Array of filenames pointing to blob/clob files indexed by the basename. - * - * @var array string[] - */ - protected $sampleLobFiles = array(); - - protected function setUp() - { - parent::setUp(); - BookstoreDataPopulator::populate(); - $this->sampleLobFiles['tin_drum.gif'] = TESTS_BASE_DIR . '/etc/lob/tin_drum.gif'; - $this->sampleLobFiles['tin_drum.txt'] = TESTS_BASE_DIR . '/etc/lob/tin_drum.txt'; - $this->sampleLobFiles['propel.gif'] = TESTS_BASE_DIR . '/etc/lob/propel.gif'; - } - - /** - * Gets a LOB filename. - * - * @param string $basename Basename of LOB filename to return (if left blank, will choose random file). - * @return string - * @throws Exception - if specified basename doesn't correspond to a registered LOB filename - */ - protected function getLobFile($basename = null) - { - if ($basename === null) { - $basename = array_rand($this->sampleLobFiles); - } - - if (isset($this->sampleLobFiles[$basename])) { - return $this->sampleLobFiles[$basename]; - } else { - throw new Exception("Invalid base LOB filename: $basename"); - } - } - - /** - * Test the LOB results returned in a resultset. - */ - public function testLobResults() - { - - $blob_path = $this->getLobFile('tin_drum.gif'); - $clob_path = $this->getLobFile('tin_drum.txt'); - - $book = BookPeer::doSelectOne(new Criteria()); - - $m1 = new Media(); - $m1->setBook($book); - $m1->setCoverImage(file_get_contents($blob_path)); - $m1->setExcerpt(file_get_contents($clob_path)); - $m1->save(); - $m1_id = $m1->getId(); - - $m1->reload(); - - $img = $m1->getCoverImage(); - $txt = $m1->getExcerpt(); - - $this->assertType('resource', $img, "Expected results of BLOB method to be a resource."); - $this->assertType('string', $txt, "Expected results of CLOB method to be a string."); - - $stat = fstat($img); - $size = $stat['size']; - - $this->assertEquals(filesize($blob_path), $size, "Expected filesize to match stat(blobrsc)"); - $this->assertEquals(filesize($clob_path), strlen($txt), "Expected filesize to match clob strlen"); - } - - /** - * Test to make sure that file pointer is not when it is fetched - * from the object. - * - * This is actually a test for correct behavior and does not completely fix - * the associated ticket (which was resolved wontfix). - * - * This does test the rewind-after-save functionality, however. - * - * @link http://propel.phpdb.org/trac/ticket/531 - */ - public function testLobRepeatRead() - { - $blob_path = $this->getLobFile('tin_drum.gif'); - $clob_path = $this->getLobFile('tin_drum.txt'); - - $book = BookPeer::doSelectOne(new Criteria()); - - $m1 = new Media(); - $m1->setBook($book); - $m1->setCoverImage(file_get_contents($blob_path)); - $m1->setExcerpt(file_get_contents($clob_path)); - $m1->save(); - - $img = $m1->getCoverImage(); - - // 1) Assert that this resource has been rewound. - - $this->assertEquals(0, ftell($img), "Expected position of cursor in file pointer to be 0"); - - // 1) Assert that we've got a valid stream to start with - - $this->assertType('resource', $img, "Expected results of BLOB method to be a resource."); - - // read first 100 bytes - $firstBytes = fread($img, 100); - - $img2 = $m1->getCoverImage(); - $this->assertSame($img, $img2, "Assert that the two resources are the same."); - - // read next 100 bytes - $nextBytes = fread($img, 100); - - $this->assertNotEquals(bin2hex($firstBytes), bin2hex($nextBytes), "Expected the first 100 and next 100 bytes to not be identical."); - } - - /** - * Tests the setting of null LOBs - */ - public function testLobNulls() - { - $book = BookPeer::doSelectOne(new Criteria()); - - $m1 = new Media(); - $m1->setBook($book); - $this->assertTrue($m1->getCoverImage() === null, "Initial LOB value for a new object should be null."); - - $m1->save(); - $m1_id = $m1->getId(); - - $m2 = new Media(); - $m2->setBook($book); - $m2->setCoverImage(null); - $this->assertTrue($m2->getCoverImage() === null, "Setting a LOB to null should cause accessor to return null."); - - $m2->save(); - $m2_id = $m2->getId(); - - $m1->reload(); - $this->assertTrue($m1->getCoverImage() === null, "Default null LOB value should be null after a reload."); - - $m2->reload(); - $this->assertTrue($m2->getCoverImage() === null, "LOB value set to null should be null after a reload."); - } - - /** - * Tests the setting of LOB (BLOB and CLOB) values. - */ - public function testLobSetting() - { - $blob_path = $this->getLobFile('tin_drum.gif'); - $blob2_path = $this->getLobFile('propel.gif'); - - $clob_path = $this->getLobFile('tin_drum.txt'); - $book = BookPeer::doSelectOne(new Criteria()); - - $m1 = new Media(); - $m1->setBook($book); - $m1->setCoverImage(file_get_contents($blob_path)); - $m1->setExcerpt(file_get_contents($clob_path)); - $m1->save(); - $m1_id = $m1->getId(); - - // 1) Assert that we've got a valid stream to start with - $img = $m1->getCoverImage(); - $this->assertType('resource', $img, "Expected results of BLOB method to be a resource."); - - // 2) Test setting a BLOB column with file contents - $m1->setCoverImage(file_get_contents($blob2_path)); - $this->assertType('resource', $m1->getCoverImage(), "Expected to get a resource back after setting BLOB with file contents."); - - // commit those changes & reload - $m1->save(); - - // 3) Verify that we've got a valid resource after reload - $m1->reload(); - $this->assertType('resource', $m1->getCoverImage(), "Expected to get a resource back after setting reloading object."); - - // 4) Test isModified() behavior - $fp = fopen("php://temp", "r+"); - fwrite($fp, file_get_contents($blob2_path)); - - $m1->setCoverImage($fp); - $this->assertTrue($m1->isModified(), "Expected Media object to be modified, despite fact that stream is to same data"); - - // 5) Test external modification of the stream (and re-setting it into the object) - $stream = $m1->getCoverImage(); - fwrite($stream, file_get_contents($blob_path)); // change the contents of the stream - - $m1->setCoverImage($stream); - - $this->assertTrue($m1->isModified(), "Expected Media object to be modified when stream contents changed."); - $this->assertNotEquals(file_get_contents($blob2_path), stream_get_contents($m1->getCoverImage())); - - $m1->save(); - - // 6) Assert that when we call the setter with a stream, that the file in db gets updated. - - $m1->reload(); // start with a fresh copy from db - - // Ensure that object is set up correctly - $this->assertNotEquals(file_get_contents($blob_path), stream_get_contents($m1->getCoverImage()), "The object is not correctly set up to verify the stream-setting test."); - - $fp = fopen($blob_path, "r"); - $m1->setCoverImage($fp); - $m1->save(); - $m1->reload(); // refresh from db - - // Assert that we've updated the db - $this->assertEquals(file_get_contents($blob_path), stream_get_contents($m1->getCoverImage()), "Expected the updated BLOB value after setting with a stream."); - - // 7) Assert that 'w' mode works - - } - - public function testLobSetting_WriteMode() - { - $blob_path = $this->getLobFile('tin_drum.gif'); - $blob2_path = $this->getLobFile('propel.gif'); - - $clob_path = $this->getLobFile('tin_drum.txt'); - $book = BookPeer::doSelectOne(new Criteria()); - - $m1 = new Media(); - $m1->setBook($book); - $m1->setCoverImage(file_get_contents($blob_path)); - $m1->setExcerpt(file_get_contents($clob_path)); - $m1->save(); - - MediaPeer::clearInstancePool(); - - // make sure we have the latest from the db: - $m2 = MediaPeer::retrieveByPK($m1->getId()); - - // now attempt to assign a temporary stream, opened in 'w' mode, to the db - - $stream = fopen("php://memory", 'w'); - fwrite($stream, file_get_contents($blob2_path)); - $m2->setCoverImage($stream); - $m2->save(); - fclose($stream); - - $m2->reload(); - $this->assertEquals(file_get_contents($blob2_path), stream_get_contents($m2->getCoverImage()), "Expected contents to match when setting stream w/ 'w' mode"); - - $stream2 = fopen("php://memory", 'w+'); - fwrite($stream2, file_get_contents($blob_path)); - rewind($stream2); - $this->assertEquals(file_get_contents($blob_path), stream_get_contents($stream2), "Expecting setup to be correct"); - - $m2->setCoverImage($stream2); - $m2->save(); - $m2->reload(); - - $this->assertEquals(file_get_contents($blob_path), stream_get_contents($m2->getCoverImage()), "Expected contents to match when setting stream w/ 'w+' mode"); - - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedObjectRelTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedObjectRelTest.php deleted file mode 100644 index 465545560e..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedObjectRelTest.php +++ /dev/null @@ -1,352 +0,0 @@ - - * @package generator.builder.om - */ -class GeneratedObjectRelTest extends BookstoreEmptyTestBase -{ - - protected function setUp() - { - parent::setUp(); - } - - /** - * Tests one side of a bi-directional setting of many-to-many relationships. - */ - public function testManyToMany_Dir1() - { - $list = new BookClubList(); - $list->setGroupLeader('Archimedes Q. Porter'); - // No save ... - - $book = new Book(); - $book->setTitle( "Jungle Expedition Handbook" ); - $book->setISBN('TEST'); - // No save ... - - $this->assertEquals(0, count($list->getBookListRels()) ); - $this->assertEquals(0, count($book->getBookListRels()) ); - $this->assertEquals(0, count(BookListRelPeer::doSelect(new Criteria())) ); - - $xref = new BookListRel(); - $xref->setBook($book); - $list->addBookListRel($xref); - - $this->assertEquals(1, count($list->getBookListRels())); - $this->assertEquals(1, count($book->getBookListRels()) ); - $this->assertEquals(0, count(BookListRelPeer::doSelect(new Criteria())) ); - - $list->save(); - - $this->assertEquals(1, count($list->getBookListRels()) ); - $this->assertEquals(1, count($book->getBookListRels()) ); - $this->assertEquals(1, count(BookListRelPeer::doSelect(new Criteria())) ); - - } - - /** - * Tests reverse setting of one of many-to-many relationship, with all saves cascaded. - */ - public function testManyToMany_Dir2_Unsaved() - { - $list = new BookClubList(); - $list->setGroupLeader('Archimedes Q. Porter'); - // No save ... - - $book = new Book(); - $book->setTitle( "Jungle Expedition Handbook" ); - $book->setISBN('TEST'); - // No save (yet) ... - - $this->assertEquals(0, count($list->getBookListRels()) ); - $this->assertEquals(0, count($book->getBookListRels()) ); - $this->assertEquals(0, count(BookListRelPeer::doSelect(new Criteria())) ); - - $xref = new BookListRel(); - $xref->setBookClubList($list); - $book->addBookListRel($xref); - - $this->assertEquals(1, count($list->getBookListRels()) ); - $this->assertEquals(1, count($book->getBookListRels()) ); - $this->assertEquals(0, count(BookListRelPeer::doSelect(new Criteria())) ); - $book->save(); - - $this->assertEquals(1, count($list->getBookListRels()) ); - $this->assertEquals(1, count($book->getBookListRels()) ); - $this->assertEquals(1, count(BookListRelPeer::doSelect(new Criteria())) ); - - } - - /** - * Tests reverse setting of relationships, saving one of the objects first. - * @link http://propel.phpdb.org/trac/ticket/508 - */ - public function testManyToMany_Dir2_Saved() - { - $list = new BookClubList(); - $list->setGroupLeader('Archimedes Q. Porter'); - $list->save(); - - $book = new Book(); - $book->setTitle( "Jungle Expedition Handbook" ); - $book->setISBN('TEST'); - // No save (yet) ... - - $this->assertEquals(0, count($list->getBookListRels()) ); - $this->assertEquals(0, count($book->getBookListRels()) ); - $this->assertEquals(0, count(BookListRelPeer::doSelect(new Criteria())) ); - - // Now set the relationship from the opposite direction. - - $xref = new BookListRel(); - $xref->setBookClubList($list); - $book->addBookListRel($xref); - - $this->assertEquals(1, count($list->getBookListRels()) ); - $this->assertEquals(1, count($book->getBookListRels()) ); - $this->assertEquals(0, count(BookListRelPeer::doSelect(new Criteria())) ); - $book->save(); - - $this->assertEquals(1, count($list->getBookListRels()) ); - $this->assertEquals(1, count($book->getBookListRels()) ); - $this->assertEquals(1, count(BookListRelPeer::doSelect(new Criteria())) ); - - } - - public function testManyToManyGetterExists() - { - $this->assertTrue(method_exists('BookClubList', 'getBooks'), 'Object generator correcly adds getter for the crossRefFk'); - $this->assertFalse(method_exists('BookClubList', 'getBookClubLists'), 'Object generator correcly adds getter for the crossRefFk'); - } - - public function testManyToManyGetterNewObject() - { - $blc1 = new BookClubList(); - $books = $blc1->getBooks(); - $this->assertTrue($books instanceof PropelObjectCollection, 'getCrossRefFK() returns a Propel collection'); - $this->assertEquals('Book', $books->getModel(), 'getCrossRefFK() returns a collection of the correct model'); - $this->assertEquals(0, count($books), 'getCrossRefFK() returns an empty list for new objects'); - $query = BookQuery::create() - ->filterByTitle('Harry Potter and the Order of the Phoenix'); - $books = $blc1->getBooks($query); - $this->assertEquals(0, count($books), 'getCrossRefFK() accepts a query as first parameter'); - } - - public function testManyToManyGetter() - { - BookstoreDataPopulator::populate(); - $blc1 = BookClubListQuery::create()->findOneByGroupLeader('Crazyleggs'); - $books = $blc1->getBooks(); - $this->assertTrue($books instanceof PropelObjectCollection, 'getCrossRefFK() returns a Propel collection'); - $this->assertEquals('Book', $books->getModel(), 'getCrossRefFK() returns a collection of the correct model'); - $this->assertEquals(2, count($books), 'getCrossRefFK() returns the correct list of objects'); - $query = BookQuery::create() - ->filterByTitle('Harry Potter and the Order of the Phoenix'); - $books = $blc1->getBooks($query); - $this->assertEquals(1, count($books), 'getCrossRefFK() accepts a query as first parameter'); - } - - public function testManyToManyCounterExists() - { - $this->assertTrue(method_exists('BookClubList', 'countBooks'), 'Object generator correcly adds counter for the crossRefFk'); - $this->assertFalse(method_exists('BookClubList', 'countBookClubLists'), 'Object generator correcly adds counter for the crossRefFk'); - } - - public function testManyToManyCounterNewObject() - { - $blc1 = new BookClubList(); - $nbBooks = $blc1->countBooks(); - $this->assertEquals(0, $nbBooks, 'countCrossRefFK() returns 0 for new objects'); - $query = BookQuery::create() - ->filterByTitle('Harry Potter and the Order of the Phoenix'); - $nbBooks = $blc1->countBooks($query); - $this->assertEquals(0, $nbBooks, 'countCrossRefFK() accepts a query as first parameter'); - } - - public function testManyToManyCounter() - { - BookstoreDataPopulator::populate(); - $blc1 = BookClubListQuery::create()->findOneByGroupLeader('Crazyleggs'); - $nbBooks = $blc1->countBooks(); - $this->assertEquals(2, $nbBooks, 'countCrossRefFK() returns the correct list of objects'); - $query = BookQuery::create() - ->filterByTitle('Harry Potter and the Order of the Phoenix'); - $nbBooks = $blc1->countBooks($query); - $this->assertEquals(1, $nbBooks, 'countCrossRefFK() accepts a query as first parameter'); - } - - public function testManyToManyAdd() - { - $list = new BookClubList(); - $list->setGroupLeader('Archimedes Q. Porter'); - - $book = new Book(); - $book->setTitle( "Jungle Expedition Handbook" ); - $book->setISBN('TEST'); - - $list->addBook($book); - $this->assertEquals(1, $list->countBooks(), 'addCrossFk() sets the internal collection properly'); - $this->assertEquals(1, $list->countBookListRels(), 'addCrossFk() sets the internal cross reference collection properly'); - - $list->save(); - $this->assertFalse($book->isNew(), 'related object is saved if added'); - $rels = $list->getBookListRels(); - $rel = $rels[0]; - $this->assertFalse($rel->isNew(), 'cross object is saved if added'); - - $list->clearBookListRels(); - $list->clearBooks(); - $books = $list->getBooks(); - $expected = new PropelObjectCollection(array($book)); - $expected->setModel('Book'); - $this->assertEquals($expected, $books, 'addCrossFk() adds the object properly'); - $this->assertEquals(1, $list->countBookListRels()); - } - - - /** - * Test behavior of columns that are implicated in multiple foreign keys. - * @link http://propel.phpdb.org/trac/ticket/228 - */ - public function testMultiFkImplication() - { - BookstoreDataPopulator::populate(); - // Create a new bookstore, contest, bookstore_contest, and bookstore_contest_entry - $b = new Bookstore(); - $b->setStoreName("Foo!"); - $b->save(); - - $c = new Contest(); - $c->setName("Bookathon Contest"); - $c->save(); - - $bc = new BookstoreContest(); - $bc->setBookstore($b); - $bc->setContest($c); - $bc->save(); - - $c = new Customer(); - $c->setName("Happy Customer"); - $c->save(); - - $bce = new BookstoreContestEntry(); - $bce->setBookstore($b); - $bce->setBookstoreContest($bc); - $bce->setCustomer($c); - $bce->save(); - - $bce->setBookstoreId(null); - - $this->assertNull($bce->getBookstoreContest()); - $this->assertNull($bce->getBookstore()); - } - - /** - * Test the clearing of related object collection. - * @link http://propel.phpdb.org/trac/ticket/529 - */ - public function testClearRefFk() - { - BookstoreDataPopulator::populate(); - $book = new Book(); - $book->setISBN("Foo-bar-baz"); - $book->setTitle("The book title"); - - // No save ... - - $r = new Review(); - $r->setReviewedBy('Me'); - $r->setReviewDate(new DateTime("now")); - - $book->addReview($r); - - // No save (yet) ... - - $this->assertEquals(1, count($book->getReviews()) ); - $book->clearReviews(); - $this->assertEquals(0, count($book->getReviews())); - } - - /** - * This tests to see whether modified objects are being silently overwritten by calls to fk accessor methods. - * @link http://propel.phpdb.org/trac/ticket/509#comment:5 - */ - public function testModifiedObjectOverwrite() - { - BookstoreDataPopulator::populate(); - $author = new Author(); - $author->setFirstName("John"); - $author->setLastName("Public"); - - $books = $author->getBooks(); // empty, of course - $this->assertEquals(0, count($books), "Expected empty collection."); - - $book = new Book(); - $book->setTitle("A sample book"); - $book->setISBN("INITIAL ISBN"); - - $author->addBook($book); - - $author->save(); - - $book->setISBN("MODIFIED ISBN"); - - $books = $author->getBooks(); - $this->assertEquals(1, count($books), "Expected 1 book."); - $this->assertSame($book, $books[0], "Expected the same object to be returned by fk accessor."); - $this->assertEquals("MODIFIED ISBN", $books[0]->getISBN(), "Expected the modified value NOT to have been overwritten."); - } - - public function testFKGetterUseInstancePool() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $author = AuthorPeer::doSelectOne(new Criteria(), $con); - // populate book instance pool - $books = $author->getBooks(null, $con); - $sql = $con->getLastExecutedQuery(); - $author = $books[0]->getAuthor($con); - $this->assertEquals($sql, $con->getLastExecutedQuery(), 'refFK getter uses instance pool if possible'); - } - - public function testRefFKGetJoin() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - PublisherPeer::clearInstancePool(); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $author = AuthorPeer::doSelectOne(new Criteria(), $con); - // populate book instance pool - $books = $author->getBooksJoinPublisher(null, $con); - $sql = $con->getLastExecutedQuery(); - $publisher = $books[0]->getPublisher($con); - $this->assertEquals($sql, $con->getLastExecutedQuery(), 'refFK getter uses instance pool if possible'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedObjectTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedObjectTest.php deleted file mode 100644 index 63dead162f..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedObjectTest.php +++ /dev/null @@ -1,1355 +0,0 @@ - - * @package generator.builder.om - */ -class GeneratedObjectTest extends BookstoreEmptyTestBase -{ - protected function setUp() - { - parent::setUp(); - require_once 'tools/helpers/bookstore/behavior/TestAuthor.php'; - } - - /** - * Test saving an object after setting default values for it. - */ - public function testSaveWithDefaultValues() - { - // From the schema.xml, I am relying on the following: - // - that 'Penguin' is the default Name for a Publisher - // - that 2001-01-01 is the default ReviewDate for a Review - - // 1) check regular values (VARCHAR) - $pub = new Publisher(); - $pub->setName('Penguin'); - $pub->save(); - $this->assertTrue($pub->getId() !== null, "Expect Publisher to have been saved when default value set."); - - // 2) check date/time values - $review = new Review(); - // note that this is different from how it's represented in schema, but should resolve to same unix timestamp - $review->setReviewDate('2001-01-01'); - $this->assertTrue($review->isModified(), "Expect Review to have been marked 'modified' after default date/time value set."); - - } - - /** - * Test isModified() to be false after setting default value second time - */ - public function testDefaultValueSetTwice() - { - $pub = new Publisher(); - $pub->setName('Penguin'); - $pub->save(); - - $pubId = $pub->getId(); - - PublisherPeer::clearInstancePool(); - - $pub2 = PublisherPeer::retrieveByPK($pubId); - $pub2->setName('Penguin'); - $this->assertFalse($pub2->isModified(), "Expect Publisher to be not modified after setting default value second time."); - } - - public function testHasApplyDefaultValues() - { - $this->assertTrue(method_exists('Publisher', 'applyDefaultValues'), 'Tables with default values should have an applyDefaultValues() method'); - $this->assertFalse(method_exists('Book', 'applyDefaultValues'), 'Tables with no default values should not have an applyDefaultValues() method'); - } - - /** - * Test default return values. - */ - public function testDefaultValues() - { - $r = new Review(); - $this->assertEquals('2001-01-01', $r->getReviewDate('Y-m-d')); - - $this->assertFalse($r->isModified(), "expected isModified() to be false"); - - $acct = new BookstoreEmployeeAccount(); - $this->assertEquals(true, $acct->getEnabled()); - $this->assertFalse($acct->isModified()); - - $acct->setLogin("testuser"); - $acct->setPassword("testpass"); - $this->assertTrue($acct->isModified()); - } - - /** - * Tests the use of default expressions and the reloadOnInsert and reloadOnUpdate attributes. - * - * @link http://propel.phpdb.org/trac/ticket/378 - * @link http://propel.phpdb.org/trac/ticket/555 - */ - public function testDefaultExpresions() - { - if (Propel::getDb(BookstoreEmployeePeer::DATABASE_NAME) instanceof DBSqlite) { - $this->markTestSkipped("Cannot test default expressions with SQLite"); - } - - $b = new Bookstore(); - $b->setStoreName("Foo!"); - $b->save(); - - $employee = new BookstoreEmployee(); - $employee->setName("Johnny Walker"); - - $acct = new BookstoreEmployeeAccount(); - $acct->setBookstoreEmployee($employee); - $acct->setLogin("test-login"); - - $this->assertNull($acct->getCreated(), "Expected created column to be NULL."); - $this->assertNull($acct->getAuthenticator(), "Expected authenticator column to be NULL."); - - $acct->save(); - - $acct = BookstoreEmployeeAccountPeer::retrieveByPK($acct->getEmployeeId()); - - $this->assertNotNull($acct->getAuthenticator(), "Expected a valid (non-NULL) authenticator column after save."); - $this->assertEquals('Password', $acct->getAuthenticator(), "Expected authenticator='Password' after save."); - $this->assertNotNull($acct->getCreated(), "Expected a valid date after retrieving saved object."); - - $now = new DateTime("now"); - $this->assertEquals($now->format("Y-m-d"), $acct->getCreated("Y-m-d")); - - $acct->setCreated($now); - $this->assertEquals($now->format("Y-m-d"), $acct->getCreated("Y-m-d")); - - // Unfortunately we can't really test the conjunction of reloadOnInsert and reloadOnUpdate when using just - // default values. (At least not in a cross-db way.) - } - - /** - * Tests the use of default expressions and the reloadOnInsert attribute. - * - * @link http://propel.phpdb.org/trac/ticket/378 - * @link http://propel.phpdb.org/trac/ticket/555 - */ - public function testDefaultExpresions_ReloadOnInsert() - { - if (Propel::getDb(BookstoreEmployeePeer::DATABASE_NAME) instanceof DBSqlite) { - $this->markTestSkipped("Cannot test default date expressions with SQLite"); - } - - // Create a new bookstore, contest, bookstore_contest, and bookstore_contest_entry - - $b = new Bookstore(); - $b->setStoreName("Barnes & Noble"); - $b->save(); - - $c = new Contest(); - $c->setName("Bookathon Contest"); - $c->save(); - - $bc = new BookstoreContest(); - $bc->setBookstore($b); - $bc->setContest($c); - $bc->save(); - - $c = new Customer(); - $c->setName("Happy Customer"); - $c->save(); - - $bce = new BookstoreContestEntry(); - $bce->setBookstore($b); - $bce->setBookstoreContest($bc); - $bce->setCustomer($c); - $bce->save(); - - $this->assertNotNull($bce->getEntryDate(), "Expected a non-null entry_date after save."); - } - - /** - * Tests the overriding reloadOnInsert at runtime. - * - * @link http://propel.phpdb.org/trac/ticket/378 - * @link http://propel.phpdb.org/trac/ticket/555 - */ - public function testDefaultExpresions_ReloadOnInsert_Override() - { - if (Propel::getDb(BookstoreEmployeePeer::DATABASE_NAME) instanceof DBSqlite) { - $this->markTestSkipped("Cannot test default date expressions with SQLite"); - } - - // Create a new bookstore, contest, bookstore_contest, and bookstore_contest_entry - $b = new Bookstore(); - $b->setStoreName("Barnes & Noble"); - $b->save(); - - $c = new Contest(); - $c->setName("Bookathon Contest"); - $c->save(); - - $bc = new BookstoreContest(); - $bc->setBookstore($b); - $bc->setContest($c); - $bc->save(); - - $c = new Customer(); - $c->setName("Happy Customer"); - $c->save(); - - $bce = new BookstoreContestEntry(); - $bce->setBookstore($b); - $bce->setBookstoreContest($bc); - $bce->setCustomer($c); - $bce->save(null, $skipReload=true); - - $this->assertNull($bce->getEntryDate(), "Expected a NULL entry_date after save."); - } - - /** - * Tests the use of default expressions and the reloadOnUpdate attribute. - * - * @link http://propel.phpdb.org/trac/ticket/555 - */ - public function testDefaultExpresions_ReloadOnUpdate() - { - $b = new Bookstore(); - $b->setStoreName("Foo!"); - $b->save(); - - $sale = new BookstoreSale(); - $sale->setBookstore(BookstorePeer::doSelectOne(new Criteria())); - $sale->setSaleName("Spring Sale"); - $sale->save(); - - // Expect that default values are set, but not default expressions - $this->assertNull($sale->getDiscount(), "Expected discount to be NULL."); - - $sale->setSaleName("Winter Clearance"); - $sale->save(); - // Since reloadOnUpdate = true, we expect the discount to be set now. - - $this->assertNotNull($sale->getDiscount(), "Expected discount to be non-NULL after save."); - } - - /** - * Tests the overriding reloadOnUpdate at runtime. - * - * @link http://propel.phpdb.org/trac/ticket/378 - * @link http://propel.phpdb.org/trac/ticket/555 - */ - public function testDefaultExpresions_ReloadOnUpdate_Override() - { - $b = new Bookstore(); - $b->setStoreName("Foo!"); - $b->save(); - - $sale = new BookstoreSale(); - $sale->setBookstore(BookstorePeer::doSelectOne(new Criteria())); - $sale->setSaleName("Spring Sale"); - $sale->save(); - - // Expect that default values are set, but not default expressions - $this->assertNull($sale->getDiscount(), "Expected discount to be NULL."); - - $sale->setSaleName("Winter Clearance"); - $sale->save(null, $skipReload=true); - - // Since reloadOnUpdate = true, we expect the discount to be set now. - - $this->assertNull($sale->getDiscount(), "Expected NULL value for discount after save."); - } - - /** - * Test the behavior of date/time/values. - * This requires that the model was built with propel.useDateTimeClass=true. - */ - public function testTemporalValues_PreEpoch() - { - $r = new Review(); - - $preEpochDate = new DateTime('1602-02-02'); - - $r->setReviewDate($preEpochDate); - - $this->assertEquals('1602-02-02', $r->getReviewDate(null)->format("Y-m-d")); - - $r->setReviewDate('1702-02-02'); - - $this->assertTrue($r->isModified()); - - $this->assertEquals('1702-02-02', $r->getReviewDate(null)->format("Y-m-d")); - - // Now test for setting null - $r->setReviewDate(null); - $this->assertNull($r->getReviewDate()); - - } - - /** - * Test setting invalid date/time. - */ - public function testSetTemporalValue_Invalid() - { - $this->markTestSkipped(); - // FIXME - Figure out why this doesn't work (causes a PHP ERROR instead of throwing Exception) in - // the Phing+PHPUnit context - $r = new Review(); - try { - $r->setReviewDate("Invalid Date"); - $this->fail("Expected PropelException when setting date column w/ invalid date"); - } catch (PropelException $x) { - print "Caught expected PropelException: " . $x->__toString(); - } - } - - /** - * Test setting TIMESTAMP columns w/ unix int timestamp. - */ - public function testTemporalValues_Unix() - { - $store = new Bookstore(); - $store->setStoreName("test"); - $store->setStoreOpenTime(strtotime('12:55')); - $store->save(); - $this->assertEquals('12:55', $store->getStoreOpenTime(null)->format('H:i')); - - $acct = new BookstoreEmployeeAccount(); - $acct->setCreated(time()); - $this->assertEquals(date('Y-m-d H:i'), $acct->getCreated('Y-m-d H:i')); - - $review = new Review(); - $review->setReviewDate(time()); - $this->assertEquals(date('Y-m-d'), $review->getReviewDate('Y-m-d')); - } - - /** - * Test setting empty temporal values. - * @link http://propel.phpdb.org/trac/ticket/586 - */ - public function testTemporalValues_Empty() - { - $review = new Review(); - $review->setReviewDate(''); - $this->assertNull($review->getReviewDate()); - } - - /** - * Test setting TIME columns. - */ - public function testTemporalValues_TimeSetting() - { - $store = new Bookstore(); - $store->setStoreName("test"); - $store->setStoreOpenTime("12:55"); - $store->save(); - - $store = new Bookstore(); - $store->setStoreName("test2"); - $store->setStoreOpenTime(new DateTime("12:55")); - $store->save(); - } - - /** - * Test setting TIME columns. - */ - public function testTemporalValues_DateSetting() - { - BookstoreDataPopulator::populate(); - - $r = new Review(); - $r->setBook(BookPeer::doSelectOne(new Criteria())); - $r->setReviewDate(new DateTime('1999-12-20')); - $r->setReviewedBy("Hans"); - $r->setRecommended(false); - $r->save(); - } - - /** - * Testing creating & saving new object & instance pool. - */ - public function testObjectInstances_New() - { - $emp = new BookstoreEmployee(); - $emp->setName(md5(microtime())); - $emp->save(); - $id = $emp->getId(); - - $retrieved = BookstoreEmployeePeer::retrieveByPK($id); - $this->assertSame($emp, $retrieved, "Expected same object (from instance pool)"); - } - - /** - * - */ - public function testObjectInstances_Fkeys() - { - // Establish a relationship between one employee and account - // and then change the employee_id and ensure that the account - // is not pulling the old employee. - - $pub1 = new Publisher(); - $pub1->setName('Publisher 1'); - $pub1->save(); - - $pub2 = new Publisher(); - $pub2->setName('Publisher 2'); - $pub2->save(); - - $book = new Book(); - $book->setTitle("Book Title"); - $book->setISBN("1234"); - $book->setPublisher($pub1); - $book->save(); - - $this->assertSame($pub1, $book->getPublisher()); - - // now change values behind the scenes - $con = Propel::getConnection(BookstoreEmployeeAccountPeer::DATABASE_NAME); - $con->exec("UPDATE " . BookPeer::TABLE_NAME . " SET " - . " publisher_id = " . $pub2->getId() - . " WHERE id = " . $book->getId()); - - - $book2 = BookPeer::retrieveByPK($book->getId()); - $this->assertSame($book, $book2, "Expected same book object instance"); - - $this->assertEquals($pub1->getId(), $book->getPublisherId(), "Expected book to have OLD publisher id before reload()"); - - $book->reload(); - - $this->assertEquals($pub2->getId(), $book->getPublisherId(), "Expected book to have new publisher id"); - $this->assertSame($pub2, $book->getPublisher(), "Expected book to have new publisher object associated."); - - // Now let's set it back, just to be double sure ... - - $con->exec("UPDATE " . BookPeer::TABLE_NAME . " SET " - . " publisher_id = " . $pub1->getId() - . " WHERE id = " . $book->getId()); - - $book->reload(); - - $this->assertEquals($pub1->getId(), $book->getPublisherId(), "Expected book to have old publisher id (again)."); - $this->assertSame($pub1, $book->getPublisher(), "Expected book to have old publisher object associated (again)."); - - } - - /** - * Test the effect of typecast on primary key values and instance pool retrieval. - */ - public function testObjectInstancePoolTypecasting() - { - $reader = new BookReader(); - $reader->setName("Tester"); - $reader->save(); - $readerId = $reader->getId(); - - $book = new Book(); - $book->setTitle("BookTest"); - $book->setISBN("TEST"); - $book->save(); - $bookId = $book->getId(); - - $opinion = new BookOpinion(); - $opinion->setBookId((string)$bookId); - $opinion->setReaderId((string)$readerId); - $opinion->setRating(5); - $opinion->setRecommendToFriend(false); - $opinion->save(); - - - $opinion2 = BookOpinionPeer::retrieveByPK($bookId, $readerId); - - $this->assertSame($opinion, $opinion2, "Expected same object to be retrieved from differently type-casted primary key values."); - - } - - /** - * Test the reload() method. - */ - public function testReload() - { - BookstoreDataPopulator::populate(); - $a = AuthorPeer::doSelectOne(new Criteria()); - - $origName = $a->getFirstName(); - - $a->setFirstName(md5(time())); - - $this->assertNotEquals($origName, $a->getFirstName()); - $this->assertTrue($a->isModified()); - - $a->reload(); - - $this->assertEquals($origName, $a->getFirstName()); - $this->assertFalse($a->isModified()); - - } - - /** - * Test reload(deep=true) method. - */ - public function testReloadDeep() - { - BookstoreDataPopulator::populate(); - - // arbitrary book - $b = BookPeer::doSelectOne(new Criteria()); - - // arbitrary, different author - $c = new Criteria(); - $c->add(AuthorPeer::ID, $b->getAuthorId(), Criteria::NOT_EQUAL); - $a = AuthorPeer::doSelectOne($c); - - $origAuthor = $b->getAuthor(); - - $b->setAuthor($a); - - $this->assertNotEquals($origAuthor, $b->getAuthor(), "Expected just-set object to be different from obj from DB"); - $this->assertTrue($b->isModified()); - - $b->reload($deep=true); - - $this->assertEquals($origAuthor, $b->getAuthor(), "Expected object in DB to be restored"); - $this->assertFalse($a->isModified()); - } - - /** - * Test saving an object and getting correct number of affected rows from save(). - * This includes tests of cascading saves to fk-related objects. - */ - public function testSaveReturnValues() - { - - $author = new Author(); - $author->setFirstName("Mark"); - $author->setLastName("Kurlansky"); - // do not save - - $pub = new Publisher(); - $pub->setName("Penguin Books"); - // do not save - - $book = new Book(); - $book->setTitle("Salt: A World History"); - $book->setISBN("0142001619"); - $book->setAuthor($author); - $book->setPublisher($pub); - - $affected = $book->save(); - $this->assertEquals(3, $affected, "Expected 3 affected rows when saving book + publisher + author."); - - // change nothing ... - $affected = $book->save(); - $this->assertEquals(0, $affected, "Expected 0 affected rows when saving already-saved book."); - - // modify the book (UPDATE) - $book->setTitle("Salt A World History"); - $affected = $book->save(); - $this->assertEquals(1, $affected, "Expected 1 affected row when saving modified book."); - - // modify the related author - $author->setLastName("Kurlanski"); - $affected = $book->save(); - $this->assertEquals(1, $affected, "Expected 1 affected row when saving book with updated author."); - - // modify both the related author and the book - $author->setLastName("Kurlansky"); - $book->setTitle("Salt: A World History"); - $affected = $book->save(); - $this->assertEquals(2, $affected, "Expected 2 affected rows when saving updated book with updated author."); - - } - - /** - * Test deleting an object using the delete() method. - */ - public function testDelete() - { - BookstoreDataPopulator::populate(); - - // 1) grab an arbitrary object - $book = BookPeer::doSelectOne(new Criteria()); - $bookId = $book->getId(); - - // 2) delete it - $book->delete(); - - // 3) make sure it can't be save()d now that it's deleted - try { - $book->setTitle("Will Fail"); - $book->save(); - $this->fail("Expect an exception to be thrown when attempting to save() a deleted object."); - } catch (PropelException $e) {} - - // 4) make sure that it doesn't exist in db - $book = BookPeer::retrieveByPK($bookId); - $this->assertNull($book, "Expect NULL from retrieveByPK on deleted Book."); - - } - - /** - * - */ - public function testNoColsModified() - { - $e1 = new BookstoreEmployee(); - $e1->setName('Employee 1'); - - $e2 = new BookstoreEmployee(); - $e2->setName('Employee 2'); - - $super = new BookstoreEmployee(); - // we don't know who the supervisor is yet - $super->addSubordinate($e1); - $super->addSubordinate($e2); - - $affected = $super->save(); - - } - - /** - * Tests new one-to-one functionality. - */ - public function testOneToOne() - { - BookstoreDataPopulator::populate(); - - $emp = BookstoreEmployeePeer::doSelectOne(new Criteria()); - - $acct = new BookstoreEmployeeAccount(); - $acct->setBookstoreEmployee($emp); - $acct->setLogin("testuser"); - $acct->setPassword("testpass"); - - $this->assertSame($emp->getBookstoreEmployeeAccount(), $acct, "Expected same object instance."); - } - - /** - * Test the type sensitivity of the resturning columns. - * - */ - public function testTypeSensitive() - { - BookstoreDataPopulator::populate(); - - $book = BookPeer::doSelectOne(new Criteria()); - - $r = new Review(); - $r->setReviewedBy("testTypeSensitive Tester"); - $r->setReviewDate(time()); - $r->setBook($book); - $r->setRecommended(true); - $r->save(); - - $id = $r->getId(); - unset($r); - - // clear the instance cache to force reload from database. - ReviewPeer::clearInstancePool(); - BookPeer::clearInstancePool(); - - // reload and verify that the types are the same - $r2 = ReviewPeer::retrieveByPK($id); - - $this->assertType('integer', $r2->getId(), "Expected getId() to return an integer."); - $this->assertType('string', $r2->getReviewedBy(), "Expected getReviewedBy() to return a string."); - $this->assertType('boolean', $r2->getRecommended(), "Expected getRecommended() to return a boolean."); - $this->assertType('Book', $r2->getBook(), "Expected getBook() to return a Book."); - $this->assertType('float', $r2->getBook()->getPrice(), "Expected Book->getPrice() to return a float."); - $this->assertType('DateTime', $r2->getReviewDate(null), "Expected Book->getReviewDate() to return a DateTime."); - - } - - /** - * This is a test for expected exceptions when saving UNIQUE. - * See http://propel.phpdb.org/trac/ticket/2 - */ - public function testSaveUnique() - { - // The whole test is in a transaction, but this test needs real transactions - $this->con->commit(); - - $emp = new BookstoreEmployee(); - $emp->setName(md5(microtime())); - - $acct = new BookstoreEmployeeAccount(); - $acct->setBookstoreEmployee($emp); - $acct->setLogin("foo"); - $acct->setPassword("bar"); - $acct->save(); - - // now attempt to create a new acct - $acct2 = $acct->copy(); - - try { - $acct2->save(); - $this->fail("Expected PropelException in first attempt to save object with duplicate value for UNIQUE constraint."); - } catch (Exception $x) { - try { - // attempt to save it again - $acct3 = $acct->copy(); - $acct3->save(); - $this->fail("Expected PropelException in second attempt to save object with duplicate value for UNIQUE constraint."); - } catch (Exception $x) { - // this is expected. - } - // now let's double check that it can succeed if we're not violating the constraint. - $acct3->setLogin("foo2"); - $acct3->save(); - } - - $this->con->beginTransaction(); - } - - /** - * Test for correct reporting of isModified(). - */ - public function testIsModified() - { - // 1) Basic test - - $a = new Author(); - $a->setFirstName("John"); - $a->setLastName("Doe"); - $a->setAge(25); - - $this->assertTrue($a->isModified(), "Expected Author to be modified after setting values."); - - $a->save(); - - $this->assertFalse($a->isModified(), "Expected Author to be unmodified after saving set values."); - - // 2) Test behavior with setting vars of different types - - // checking setting int col to string val - $a->setAge('25'); - $this->assertFalse($a->isModified(), "Expected Author to be unmodified after setting int column to string-cast of same value."); - - $a->setFirstName("John2"); - $this->assertTrue($a->isModified(), "Expected Author to be modified after changing string column value."); - - // checking setting string col to int val - $a->setFirstName("1"); - $a->save(); - $this->assertFalse($a->isModified(), "Expected Author to be unmodified after saving set values."); - - $a->setFirstName(1); - $this->assertFalse($a->isModified(), "Expected Author to be unmodified after setting string column to int-cast of same value."); - - // 3) Test for appropriate behavior of NULL - - // checking "" -> NULL - $a->setFirstName(""); - $a->save(); - $this->assertFalse($a->isModified(), "Expected Author to be unmodified after saving set values."); - - $a->setFirstName(null); - $this->assertTrue($a->isModified(), "Expected Author to be modified after changing empty string column value to NULL."); - - $a->setFirstName("John"); - $a->setAge(0); - $a->save(); - $this->assertFalse($a->isModified(), "Expected Author to be unmodified after saving set values."); - - $a->setAge(null); - $this->assertTrue($a->isModified(), "Expected Author to be modified after changing 0-value int column to NULL."); - - $a->save(); - $this->assertFalse($a->isModified(), "Expected Author to be unmodified after saving set values."); - - $a->setAge(0); - $this->assertTrue($a->isModified(), "Expected Author to be modified after changing NULL-value int column to 0."); - - } - - /** - * Test the BaseObject#equals(). - */ - public function testEquals() - { - BookstoreDataPopulator::populate(); - - $b = BookPeer::doSelectOne(new Criteria()); - $c = new Book(); - $c->setId($b->getId()); - $this->assertTrue($b->equals($c), "Expected Book objects to be equal()"); - - $a = new Author(); - $a->setId($b->getId()); - $this->assertFalse($b->equals($a), "Expected Book and Author with same primary key NOT to match."); - } - - /** - * Test checking for non-default values. - * @see http://propel.phpdb.org/trac/ticket/331 - */ - public function testHasOnlyDefaultValues() - { - $emp = new BookstoreEmployee(); - $emp->setName(md5(microtime())); - - $acct2 = new BookstoreEmployeeAccount(); - - $acct = new BookstoreEmployeeAccount(); - $acct->setBookstoreEmployee($emp); - $acct->setLogin("foo"); - $acct->setPassword("bar"); - $acct->save(); - - $this->assertFalse($acct->isModified(), "Expected BookstoreEmployeeAccount NOT to be modified after save()."); - - $acct->setEnabled(true); - $acct->setPassword($acct2->getPassword()); - - $this->assertTrue($acct->isModified(), "Expected BookstoreEmployeeAccount to be modified after setting default values."); - - $this->assertTrue($acct->hasOnlyDefaultValues(), "Expected BookstoreEmployeeAccount to not have only default values."); - - $acct->setPassword("bar"); - $this->assertFalse($acct->hasOnlyDefaultValues(), "Expected BookstoreEmployeeAccount to have at one non-default value after setting one value to non-default."); - - // Test a default date/time value - $r = new Review(); - $r->setReviewDate(new DateTime("now")); - $this->assertFalse($r->hasOnlyDefaultValues()); - } - - public function testDefaultFkColVal() - { - BookstoreDataPopulator::populate(); - - $sale = new BookstoreSale(); - $this->assertEquals(1, $sale->getBookstoreId(), "Expected BookstoreSale object to have a default bookstore_id of 1."); - - $bookstore = BookstorePeer::doSelectOne(new Criteria()); - - $sale->setBookstore($bookstore); - $this->assertEquals($bookstore->getId(), $sale->getBookstoreId(), "Expected FK id to have changed when assigned a valid FK."); - - $sale->setBookstore(null); - $this->assertEquals(1, $sale->getBookstoreId(), "Expected BookstoreSale object to have reset to default ID."); - - $sale->setPublisher(null); - $this->assertEquals(null, $sale->getPublisherId(), "Expected BookstoreSale object to have reset to NULL publisher ID."); - } - - public function testCountRefFk() - { - $book = new Book(); - $book->setTitle("Test Book"); - $book->setISBN("TT-EE-SS-TT"); - - $num = 5; - - for ($i=2; $i < $num + 2; $i++) { - $r = new Review(); - $r->setReviewedBy('Hans ' . $num); - $dt = new DateTime("now"); - $dt->modify("-".$i." weeks"); - $r->setReviewDate($dt); - $r->setRecommended(($i % 2) == 0); - $book->addReview($r); - } - - $this->assertEquals($num, $book->countReviews(), "Expected countReviews to return $num"); - $this->assertEquals($num, count($book->getReviews()), "Expected getReviews to return $num reviews"); - - $book->save(); - - BookPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - - $book = BookPeer::retrieveByPK($book->getId()); - $this->assertEquals($num, $book->countReviews(), "Expected countReviews() to return $num (after save)"); - $this->assertEquals($num, count($book->getReviews()), "Expected getReviews() to return $num (after save)"); - - // Now set different criteria and expect different results - $c = new Criteria(); - $c->add(ReviewPeer::RECOMMENDED, false); - $this->assertEquals(floor($num/2), $book->countReviews($c), "Expected " . floor($num/2) . " results from countReviews(recomm=false)"); - - // Change Criteria, run again -- expect different. - $c = new Criteria(); - $c->add(ReviewPeer::RECOMMENDED, true); - $this->assertEquals(ceil($num/2), count($book->getReviews($c)), "Expected " . ceil($num/2) . " results from getReviews(recomm=true)"); - - $this->assertEquals($num, $book->countReviews(), "Expected countReviews to return $num with new empty Criteria"); - } - - /** - * Test copyInto method. - */ - public function testCopyInto_Deep() - { - BookstoreDataPopulator::populate(); - - // Test a "normal" object - $c = new Criteria(); - $c->add(BookPeer::TITLE, 'Harry%', Criteria::LIKE); - - $book = BookPeer::doSelectOne($c); - $reviews = $book->getReviews(); - - $b2 = $book->copy(true); - $this->assertType('Book', $b2); - $this->assertNull($b2->getId()); - - $r2 = $b2->getReviews(); - - $this->assertEquals(count($reviews), count($r2)); - - // Test a one-to-one object - $emp = BookstoreEmployeePeer::doSelectOne(new Criteria()); - $e2 = $emp->copy(true); - - $this->assertType('BookstoreEmployee', $e2); - $this->assertNull($e2->getId()); - - $this->assertEquals($emp->getBookstoreEmployeeAccount()->getLogin(), $e2->getBookstoreEmployeeAccount()->getLogin()); - } - - /** - * Test copying when an object has composite primary key. - * @link http://propel.phpdb.org/trac/ticket/618 - */ - public function testCopy_CompositePK() - { - $br = new BookReader(); - $br->setName("TestReader"); - $br->save(); - $br->copy(); - - $b = new Book(); - $b->setTitle("TestBook"); - $b->setISBN("XX-XX-XX-XX"); - $b->save(); - - $op = new BookOpinion(); - $op->setBookReader($br); - $op->setBook($b); - $op->setRating(10); - $op->setRecommendToFriend(true); - $op->save(); - - - $br2 = $br->copy(true); - - $this->assertNull($br2->getId()); - - $opinions = $br2->getBookOpinions(); - $this->assertEquals(1, count($opinions), "Expected to have a related BookOpinion after copy()"); - - // We DO expect the reader_id to be null - $this->assertNull($opinions[0]->getReaderId()); - // but we DO NOT expect the book_id to be null - $this->assertEquals($op->getBookId(), $opinions[0]->getBookId()); - } - - public function testToArray() - { - $b = new Book(); - $b->setTitle('Don Juan'); - - $arr1 = $b->toArray(); - $expectedKeys = array( - 'Id', - 'Title', - 'ISBN', - 'Price', - 'PublisherId', - 'AuthorId' - ); - $this->assertEquals($expectedKeys, array_keys($arr1), 'toArray() returns an associative array with BasePeer::TYPE_PHPNAME keys by default'); - $this->assertEquals('Don Juan', $arr1['Title'], 'toArray() returns an associative array representation of the object'); - } - - public function testToArrayKeyType() - { - $b = new Book(); - $b->setTitle('Don Juan'); - - $arr1 = $b->toArray(BasePeer::TYPE_COLNAME); - $expectedKeys = array( - BookPeer::ID, - BookPeer::TITLE, - BookPeer::ISBN, - BookPeer::PRICE, - BookPeer::PUBLISHER_ID, - BookPeer::AUTHOR_ID - ); - $this->assertEquals($expectedKeys, array_keys($arr1), 'toArray() accepts a $keyType parameter to change the result keys'); - $this->assertEquals('Don Juan', $arr1[BookPeer::TITLE], 'toArray() returns an associative array representation of the object'); - } - - /** - * Test the toArray() method with new lazyLoad param. - * @link http://propel.phpdb.org/trac/ticket/527 - */ - public function testToArrayLazyLoad() - { - BookstoreDataPopulator::populate(); - - $c = new Criteria(); - $c->add(MediaPeer::COVER_IMAGE, null, Criteria::NOT_EQUAL); - $c->add(MediaPeer::EXCERPT, null, Criteria::NOT_EQUAL); - - $m = MediaPeer::doSelectOne($c); - if ($m === null) { - $this->fail("Test requires at least one media row w/ cover_image and excerpt NOT NULL"); - } - - $arr1 = $m->toArray(BasePeer::TYPE_COLNAME); - $this->assertNotNull($arr1[MediaPeer::COVER_IMAGE]); - $this->assertType('resource', $arr1[MediaPeer::COVER_IMAGE]); - - $arr2 = $m->toArray(BasePeer::TYPE_COLNAME, false); - $this->assertNull($arr2[MediaPeer::COVER_IMAGE]); - $this->assertNull($arr2[MediaPeer::EXCERPT]); - - $diffKeys = array_keys(array_diff($arr1, $arr2)); - - $expectedDiff = array(MediaPeer::COVER_IMAGE, MediaPeer::EXCERPT); - - $this->assertEquals($expectedDiff, $diffKeys); - } - - public function testToArrayIncludeForeignObjects() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - PublisherPeer::clearInstancePool(); - - $c = new Criteria(); - $c->add(BookPeer::TITLE, 'Don Juan'); - $books = BookPeer::doSelectJoinAuthor($c); - $book = $books[0]; - - $arr1 = $book->toArray(BasePeer::TYPE_PHPNAME, null, true); - $expectedKeys = array( - 'Id', - 'Title', - 'ISBN', - 'Price', - 'PublisherId', - 'AuthorId', - 'Author' - ); - $this->assertEquals($expectedKeys, array_keys($arr1), 'toArray() can return sub arrays for hydrated related objects'); - $this->assertEquals('George', $arr1['Author']['FirstName'], 'toArray() can return sub arrays for hydrated related objects'); - - $c = new Criteria(); - $c->add(BookPeer::TITLE, 'Don Juan'); - $books = BookPeer::doSelectJoinAll($c); - $book = $books[0]; - - $arr2 = $book->toArray(BasePeer::TYPE_PHPNAME, null, true); - $expectedKeys = array( - 'Id', - 'Title', - 'ISBN', - 'Price', - 'PublisherId', - 'AuthorId', - 'Publisher', - 'Author' - ); - $this->assertEquals($expectedKeys, array_keys($arr2), 'toArray() can return sub arrays for hydrated related objects'); - } - - /** - * Test regexp validator for ticket:542 - * @link http://propel.phpdb.org/trac/ticket/542 - */ - public function testRegexValidator() - { - $b = new Bookstore(); - $b->setWebsite("http://this.is.valid.com/foo.bar"); - $res = $b->validate(); - $this->assertTrue($res, "Expected URL to validate"); - } - - /** - * Test that setting the auto-increment primary key will result in exception. - */ - public function testSettingAutoIncrementPK() - { - // The whole test is in a transaction, but this test needs real transactions - $this->con->commit(); - - $b = new Bookstore(); - $b->setId(1); - $b->setStoreName("Test"); - try { - $b->save(); - $this->fail("Expected setting auto-increment primary key to result in Exception"); - } catch (Exception $x) { - $this->assertType('PropelException', $x); - } - - // ... but we should silently ignore NULL values, since these are really - // the same as "not set" in PHP world. - $b = new Bookstore(); - $b->setId(null); - $b->setStoreName("Test2"); - try { - $b->save(); - } catch (Exception $x) { - $this->fail("Expected no exception when setting auto-increment primary key to NULL"); - } - // success ... - - $this->con->beginTransaction(); - } - - /** - * Checks wether we are allowed to specify the primary key on a - * table with allowPkInsert=true set - * - * saves the object, gets it from data-source again and then compares - * them for equality (thus the instance pool is also checked) - */ - public function testAllowPkInsertOnIdMethodNativeTable() - { - $cu = new Customer; - $cu->setPrimaryKey(100000); - $cu->save(); - - $this->assertEquals(100000, $cu->getPrimaryKey()); - - $cu2 = CustomerPeer::retrieveByPk(100000); - - $this->assertSame($cu, $cu2); - } - /** - * Checks if it is allowed to save new, empty objects with a auto increment column - */ - public function testAllowEmptyWithAutoIncrement() - { - $bookreader = new BookReader(); - $bookreader->save(); - - $this->assertFalse($bookreader->isNew() ); - } - - /** - * Test foreign key relationships based on references to unique cols but not PK. - * @link http://propel.phpdb.org/trac/ticket/691 - */ - public function testUniqueFkRel() - { - $employee = new BookstoreEmployee(); - $employee->setName("Johnny Walker"); - - $acct = new BookstoreEmployeeAccount(); - $acct->setBookstoreEmployee($employee); - $acct->setLogin("test-login"); - $acct->save(); - $acctId = $acct->getEmployeeId(); - - $al = new AcctAuditLog(); - $al->setBookstoreEmployeeAccount($acct); - $al->save(); - $alId = $al->getId(); - - BookstoreEmployeePeer::clearInstancePool(); - BookstoreEmployeeAccountPeer::clearInstancePool(); - AcctAuditLogPeer::clearInstancePool(); - - $al2 = AcctAuditLogPeer::retrieveByPK($alId); - /* @var $al2 AcctAuditLog */ - $mapacct = $al2->getBookstoreEmployeeAccount(); - $lookupacct = BookstoreEmployeeAccountPeer::retrieveByPK($acctId); - - $logs = $lookupacct->getAcctAuditLogs(); - - $this->assertTrue(count($logs) == 1, "Expected 1 audit log result."); - $this->assertEquals($logs[0]->getId(), $al->getId(), "Expected returned audit log to match created audit log."); - } - - public function testIsPrimaryKeyNull() - { - $b = new Book(); - $this->assertTrue($b->isPrimaryKeyNull()); - $b->setPrimaryKey(123); - $this->assertFalse($b->isPrimaryKeyNull()); - $b->setPrimaryKey(null); - $this->assertTrue($b->isPrimaryKeyNull()); - } - - public function testIsPrimaryKeyNullCompmosite() - { - $b = new BookOpinion(); - $this->assertTrue($b->isPrimaryKeyNull()); - $b->setPrimaryKey(array(123, 456)); - $this->assertFalse($b->isPrimaryKeyNull()); - $b->setPrimaryKey(array(123, null)); - $this->assertFalse($b->isPrimaryKeyNull()); - $b->setPrimaryKey(array(null, 456)); - $this->assertFalse($b->isPrimaryKeyNull()); - $b->setPrimaryKey(array(null, null)); - $this->assertTrue($b->isPrimaryKeyNull()); - } - - public function testAddPrimaryString() - { - $this->assertFalse(method_exists('Author', '__toString'), 'addPrimaryString() does not add a __toString() method if no column has the primaryString attribute'); - $this->assertTrue(method_exists('Book', '__toString'), 'addPrimaryString() adds a __toString() method if a column has the primaryString attribute'); - $book = new Book(); - $book->setTitle('foo'); - $this->assertEquals((string) $book, 'foo', 'addPrimaryString() adds a __toString() method returning the value of the the first column where primaryString is true'); - } - - public function testPreInsert() - { - $author = new TestAuthor(); - $author->setFirstName("bogus"); - $author->setLastName("Lastname"); - $author->save(); - $this->assertEquals('PreInsertedFirstname', $author->getFirstName()); - } - - public function testPreUpdate() - { - $author = new TestAuthor(); - $author->setFirstName("bogus"); - $author->setLastName("Lastname"); - $author->save(); - $author->setNew(false); - $author->save(); - $this->assertEquals('PreUpdatedFirstname', $author->getFirstName()); - } - - public function testPostInsert() - { - $author = new TestAuthor(); - $author->setFirstName("bogus"); - $author->setLastName("Lastname"); - $author->save(); - $this->assertEquals('PostInsertedLastName', $author->getLastName()); - } - - public function testPostUpdate() - { - $author = new TestAuthor(); - $author->setFirstName("bogus"); - $author->setLastName("Lastname"); - $author->save(); - $author->setNew(false); - $author->save(); - $this->assertEquals('PostUpdatedLastName', $author->getLastName()); - } - - public function testPreSave() - { - $author = new TestAuthor(); - $author->setFirstName("bogus"); - $author->setLastName("Lastname"); - $author->save(); - $this->assertEquals('pre@save.com', $author->getEmail()); - } - - public function testPreSaveFalse() - { - $con = Propel::getConnection(AuthorPeer::DATABASE_NAME); - $author = new TestAuthorSaveFalse(); - $author->setFirstName("bogus"); - $author->setLastName("Lastname"); - $res = $author->save($con); - $this->assertEquals(0, $res); - $this->assertEquals('pre@save.com', $author->getEmail()); - $this->assertNotEquals(115, $author->getAge()); - $this->assertTrue($author->isNew()); - $this->assertEquals(1, $con->getNestedTransactionCount()); - } - - public function testPostSave() - { - $author = new TestAuthor(); - $author->setFirstName("bogus"); - $author->setLastName("Lastname"); - $author->save(); - $this->assertEquals(115, $author->getAge()); - } - - public function testPreDelete() - { - $author = new TestAuthor(); - $author->setFirstName("bogus"); - $author->setLastName("Lastname"); - $author->save(); - $author->delete(); - $this->assertEquals("Pre-Deleted", $author->getFirstName()); - } - - public function testPreDeleteFalse() - { - $con = Propel::getConnection(AuthorPeer::DATABASE_NAME); - $author = new TestAuthorDeleteFalse(); - $author->setFirstName("bogus"); - $author->setLastName("Lastname"); - $author->save($con); - $author->delete($con); - $this->assertEquals("Pre-Deleted", $author->getFirstName()); - $this->assertNotEquals("Post-Deleted", $author->getLastName()); - $this->assertFalse($author->isDeleted()); - $this->assertEquals(1, $con->getNestedTransactionCount()); - } - - public function testPostDelete() - { - $author = new TestAuthor(); - $author->setFirstName("bogus"); - $author->setLastName("Lastname"); - $author->save(); - $author->delete(); - $this->assertEquals("Post-Deleted", $author->getLastName()); - } - - public function testMagicVirtualColumnGetter() - { - $book = new Book(); - $book->setVirtualColumn('Foo', 'bar'); - $this->assertEquals('bar', $book->getFoo(), 'generated __call() catches getters for virtual columns'); - $book = new Book(); - $book->setVirtualColumn('foo', 'bar'); - $this->assertEquals('bar', $book->getFoo(), 'generated __call() catches getters for virtual columns starting with a lowercase character'); - } - - public static function conditionsForTestReadOnly() - { - return array( - array('reload'), - array('delete'), - array('save'), - array('doSave'), - ); - } - - /** - * @dataProvider conditionsForTestReadOnly - */ - public function testReadOnly($method) - { - $cv = new ContestView(); - $this->assertFalse(method_exists($cv, $method), 'readOnly tables end up with no ' . $method . ' method in the generated object class'); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedPeerDoDeleteTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedPeerDoDeleteTest.php deleted file mode 100644 index b68a53ba45..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedPeerDoDeleteTest.php +++ /dev/null @@ -1,545 +0,0 @@ - - * @package generator.builder.om - */ -class GeneratedPeerDoDeleteTest extends BookstoreEmptyTestBase -{ - protected function setUp() - { - parent::setUp(); - BookstoreDataPopulator::populate(); - } - - /** - * Test ability to delete multiple rows via single Criteria object. - */ - public function testDoDelete_MultiTable() { - - $selc = new Criteria(); - $selc->add(BookPeer::TITLE, "Harry Potter and the Order of the Phoenix"); - $hp = BookPeer::doSelectOne($selc); - - // print "Attempting to delete [multi-table] by found pk: "; - $c = new Criteria(); - $c->add(BookPeer::ID, $hp->getId()); - // The only way for multi-delete to work currently - // is to specify the author_id and publisher_id (i.e. the fkeys - // have to be in the criteria). - $c->add(AuthorPeer::ID, $hp->getAuthorId()); - $c->add(PublisherPeer::ID, $hp->getPublisherId()); - $c->setSingleRecord(true); - BookPeer::doDelete($c); - - //print_r(AuthorPeer::doSelect(new Criteria())); - - // check to make sure the right # of records was removed - $this->assertEquals(3, count(AuthorPeer::doSelect(new Criteria())), "Expected 3 authors after deleting."); - $this->assertEquals(3, count(PublisherPeer::doSelect(new Criteria())), "Expected 3 publishers after deleting."); - $this->assertEquals(3, count(BookPeer::doSelect(new Criteria())), "Expected 3 books after deleting."); - } - - /** - * Test using a complex criteria to delete multiple rows from a single table. - */ - public function testDoDelete_ComplexCriteria() { - - //print "Attempting to delete books by complex criteria: "; - $c = new Criteria(); - $cn = $c->getNewCriterion(BookPeer::ISBN, "043935806X"); - $cn->addOr($c->getNewCriterion(BookPeer::ISBN, "0380977427")); - $cn->addOr($c->getNewCriterion(BookPeer::ISBN, "0140422161")); - $c->add($cn); - BookPeer::doDelete($c); - - // now there should only be one book left; "The Tin Drum" - - $books = BookPeer::doSelect(new Criteria()); - - $this->assertEquals(1, count($books), "Expected 1 book remaining after deleting."); - $this->assertEquals("The Tin Drum", $books[0]->getTitle(), "Expect the only remaining book to be 'The Tin Drum'"); - } - - /** - * Test that cascading deletes are happening correctly (whether emulated or native). - */ - public function testDoDelete_Cascade_Simple() - { - - // The 'media' table will cascade from book deletes - - // 1) Assert the row exists right now - - $medias = MediaPeer::doSelect(new Criteria()); - $this->assertTrue(count($medias) > 0, "Expected to find at least one row in 'media' table."); - $media = $medias[0]; - $mediaId = $media->getId(); - - // 2) Delete the owning book - - $owningBookId = $media->getBookId(); - BookPeer::doDelete($owningBookId); - - // 3) Assert that the media row is now also gone - - $obj = MediaPeer::retrieveByPK($mediaId); - $this->assertNull($obj, "Expect NULL when retrieving on no matching Media."); - - } - - /** - * Test that cascading deletes are happening correctly for composite pk. - * @link http://propel.phpdb.org/trac/ticket/544 - */ - public function testDoDelete_Cascade_CompositePK() - { - - $origBceCount = BookstoreContestEntryPeer::doCount(new Criteria()); - - $cust1 = new Customer(); - $cust1->setName("Cust1"); - $cust1->save(); - - $cust2 = new Customer(); - $cust2->setName("Cust2"); - $cust2->save(); - - $c1 = new Contest(); - $c1->setName("Contest1"); - $c1->save(); - - $c2 = new Contest(); - $c2->setName("Contest2"); - $c2->save(); - - $store1 = new Bookstore(); - $store1->setStoreName("Store1"); - $store1->save(); - - $bc1 = new BookstoreContest(); - $bc1->setBookstore($store1); - $bc1->setContest($c1); - $bc1->save(); - - $bc2 = new BookstoreContest(); - $bc2->setBookstore($store1); - $bc2->setContest($c2); - $bc2->save(); - - $bce1 = new BookstoreContestEntry(); - $bce1->setEntryDate("now"); - $bce1->setCustomer($cust1); - $bce1->setBookstoreContest($bc1); - $bce1->save(); - - $bce2 = new BookstoreContestEntry(); - $bce2->setEntryDate("now"); - $bce2->setCustomer($cust1); - $bce2->setBookstoreContest($bc2); - $bce2->save(); - - // Now, if we remove $bc1, we expect *only* bce1 to be no longer valid. - - BookstoreContestPeer::doDelete($bc1); - - $newCount = BookstoreContestEntryPeer::doCount(new Criteria()); - - $this->assertEquals($origBceCount + 1, $newCount, "Expected new number of rows in BCE to be orig + 1"); - - $bcetest = BookstoreContestEntryPeer::retrieveByPK($store1->getId(), $c1->getId(), $cust1->getId()); - $this->assertNull($bcetest, "Expected BCE for store1 to be cascade deleted."); - - $bcetest2 = BookstoreContestEntryPeer::retrieveByPK($store1->getId(), $c2->getId(), $cust1->getId()); - $this->assertNotNull($bcetest2, "Expected BCE for store2 to NOT be cascade deleted."); - - } - - /** - * Test that onDelete="SETNULL" is happening correctly (whether emulated or native). - */ - public function testDoDelete_SetNull() { - - // The 'author_id' column in 'book' table will be set to null when author is deleted. - - // 1) Get an arbitrary book - $c = new Criteria(); - $book = BookPeer::doSelectOne($c); - $bookId = $book->getId(); - $authorId = $book->getAuthorId(); - unset($book); - - // 2) Delete the author for that book - AuthorPeer::doDelete($authorId); - - // 3) Assert that the book.author_id column is now NULL - - $book = BookPeer::retrieveByPK($bookId); - $this->assertNull($book->getAuthorId(), "Expect the book.author_id to be NULL after the author was removed."); - - } - - /** - * Test deleting a row by passing in the primary key to the doDelete() method. - */ - public function testDoDelete_ByPK() { - - // 1) get an arbitrary book - $book = BookPeer::doSelectOne(new Criteria()); - $bookId = $book->getId(); - - // 2) now delete that book - BookPeer::doDelete($bookId); - - // 3) now make sure it's gone - $obj = BookPeer::retrieveByPK($bookId); - $this->assertNull($obj, "Expect NULL when retrieving on no matching Book."); - - } - - public function testDoDelete_ByPks() { - // 1) get all of the books - $books = BookPeer::doSelect(new Criteria()); - $bookCount = count($books); - - // 2) we have enough books to do this test - $this->assertGreaterThan(1, $bookCount, 'There are at least two books'); - - // 3) select two random books - $book1 = $books[0]; - $book2 = $books[1]; - - // 4) delete the books - BookPeer::doDelete(array($book1->getId(), $book2->getId())); - - // 5) we should have two less books than before - $this->assertEquals($bookCount-2, BookPeer::doCount(new Criteria()), 'Two books deleted successfully.'); - } - - /** - * Test deleting a row by passing the generated object to doDelete(). - */ - public function testDoDelete_ByObj() { - - // 1) get an arbitrary book - $book = BookPeer::doSelectOne(new Criteria()); - $bookId = $book->getId(); - - // 2) now delete that book - BookPeer::doDelete($book); - - // 3) now make sure it's gone - $obj = BookPeer::retrieveByPK($bookId); - $this->assertNull($obj, "Expect NULL when retrieving on no matching Book."); - - } - - - /** - * Test the doDeleteAll() method for single table. - */ - public function testDoDeleteAll() { - - BookPeer::doDeleteAll(); - $this->assertEquals(0, count(BookPeer::doSelect(new Criteria())), "Expect all book rows to have been deleted."); - } - - /** - * Test the state of the instance pool after a doDeleteAll() call. - */ - public function testDoDeleteAllInstancePool() - { - $review = ReviewPeer::doSelectOne(new Criteria); - $book = $review->getBook(); - BookPeer::doDeleteAll(); - $this->assertNull(BookPeer::retrieveByPk($book->getId()), 'doDeleteAll invalidates instance pool'); - $this->assertNull(ReviewPeer::retrieveByPk($review->getId()), 'doDeleteAll invalidates instance pool of releted tables with ON DELETE CASCADE'); - } - - /** - * Test the doDeleteAll() method when onDelete="CASCADE". - */ - public function testDoDeleteAll_Cascade() { - - BookPeer::doDeleteAll(); - $this->assertEquals(0, count(MediaPeer::doSelect(new Criteria())), "Expect all media rows to have been cascade deleted."); - $this->assertEquals(0, count(ReviewPeer::doSelect(new Criteria())), "Expect all review rows to have been cascade deleted."); - } - - /** - * Test the doDeleteAll() method when onDelete="SETNULL". - */ - public function testDoDeleteAll_SetNull() { - - $c = new Criteria(); - $c->add(BookPeer::AUTHOR_ID, null, Criteria::NOT_EQUAL); - - // 1) make sure there are some books with valid authors - $this->assertTrue(count(BookPeer::doSelect($c)) > 0, "Expect some book.author_id columns that are not NULL."); - - // 2) delete all the authors - AuthorPeer::doDeleteAll(); - - // 3) now verify that the book.author_id columns are all nul - $this->assertEquals(0, count(BookPeer::doSelect($c)), "Expect all book.author_id columns to be NULL."); - } - - /** - * @link http://propel.phpdb.org/trac/ticket/519 - */ - public function testDoDeleteCompositePK() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - ReaderFavoritePeer::doDeleteAll(); - // Create books with IDs 1 to 3 - // Create readers with IDs 1 and 2 - - $this->createBookWithId(1); - $this->createBookWithId(2); - $this->createBookWithId(3); - $this->createReaderWithId(1); - $this->createReaderWithId(2); - - for ($i=1; $i <= 3; $i++) { - for ($j=1; $j <= 2; $j++) { - $bo = new BookOpinion(); - $bo->setBookId($i); - $bo->setReaderId($j); - $bo->save(); - - $rf = new ReaderFavorite(); - $rf->setBookId($i); - $rf->setReaderId($j); - $rf->save(); - } - } - - $this->assertEquals(6, ReaderFavoritePeer::doCount(new Criteria())); - - // Now delete 2 of those rows (2 is special in that it is the number of rows - // being deleted, as well as the number of things in the primary key) - ReaderFavoritePeer::doDelete(array(array(1,1), array(2,2))); - $this->assertEquals(4, ReaderFavoritePeer::doCount(new Criteria())); - - //Note: these composite PK's are pairs of (BookId, ReaderId) - $this->assertNotNull(ReaderFavoritePeer::retrieveByPK(2,1)); - $this->assertNotNull(ReaderFavoritePeer::retrieveByPK(1,2)); - $this->assertNotNull(ReaderFavoritePeer::retrieveByPk(3,1)); - $this->assertNotNull(ReaderFavoritePeer::retrieveByPk(3,2)); - $this->assertNull(ReaderFavoritePeer::retrieveByPK(1,1)); - $this->assertNull(ReaderFavoritePeer::retrieveByPK(2,2)); - - //test deletion of a single composite PK - ReaderFavoritePeer::doDelete(array(3,1)); - $this->assertEquals(3, ReaderFavoritePeer::doCount(new Criteria())); - $this->assertNotNull(ReaderFavoritePeer::retrieveByPK(2,1)); - $this->assertNotNull(ReaderFavoritePeer::retrieveByPK(1,2)); - $this->assertNotNull(ReaderFavoritePeer::retrieveByPk(3,2)); - $this->assertNull(ReaderFavoritePeer::retrieveByPK(1,1)); - $this->assertNull(ReaderFavoritePeer::retrieveByPK(2,2)); - $this->assertNull(ReaderFavoritePeer::retrieveByPk(3,1)); - - //test deleting the last three - ReaderFavoritePeer::doDelete(array(array(2,1), array(1,2), array(3,2))); - $this->assertEquals(0, ReaderFavoritePeer::doCount(new Criteria())); - } - - /** - * Test the doInsert() method when passed a Criteria object. - */ - public function testDoInsert_Criteria() { - - $name = "A Sample Publisher - " . time(); - - $values = new Criteria(); - $values->add(PublisherPeer::NAME, $name); - PublisherPeer::doInsert($values); - - $c = new Criteria(); - $c->add(PublisherPeer::NAME, $name); - - $matches = PublisherPeer::doSelect($c); - $this->assertEquals(1, count($matches), "Expect there to be exactly 1 publisher just-inserted."); - $this->assertTrue( 1 != $matches[0]->getId(), "Expected to have different ID than one put in values Criteria."); - - } - - /** - * Test the doInsert() method when passed a generated object. - */ - public function testDoInsert_Obj() { - - $name = "A Sample Publisher - " . time(); - - $values = new Publisher(); - $values->setName($name); - PublisherPeer::doInsert($values); - - $c = new Criteria(); - $c->add(PublisherPeer::NAME, $name); - - $matches = PublisherPeer::doSelect($c); - $this->assertEquals(1, count($matches), "Expect there to be exactly 1 publisher just-inserted."); - $this->assertTrue( 1 != $matches[0]->getId(), "Expected to have different ID than one put in values Criteria."); - - } - - /** - * Tests the return type of doCount*() methods. - */ - public function testDoCountType() - { - $c = new Criteria(); - $this->assertType('integer', BookPeer::doCount($c), "Expected doCount() to return an integer."); - $this->assertType('integer', BookPeer::doCountJoinAll($c), "Expected doCountJoinAll() to return an integer."); - $this->assertType('integer', BookPeer::doCountJoinAuthor($c), "Expected doCountJoinAuthor() to return an integer."); - } - - /** - * Tests the doCount() method with limit/offset. - */ - public function testDoCountLimitOffset() - { - BookPeer::doDeleteAll(); - - for ($i=0; $i < 25; $i++) { - $b = new Book(); - $b->setTitle("Book $i"); - $b->setISBN("ISBN $i"); - $b->save(); - } - - $c = new Criteria(); - $totalCount = BookPeer::doCount($c); - - $this->assertEquals(25, $totalCount); - - $c2 = new Criteria(); - $c2->setLimit(10); - $this->assertEquals(10, BookPeer::doCount($c2)); - - $c3 = new Criteria(); - $c3->setOffset(10); - $this->assertEquals(15, BookPeer::doCount($c3)); - - $c4 = new Criteria(); - $c4->setOffset(5); - $c4->setLimit(5); - $this->assertEquals(5, BookPeer::doCount($c4)); - - $c5 = new Criteria(); - $c5->setOffset(20); - $c5->setLimit(10); - $this->assertEquals(5, BookPeer::doCount($c5)); - } - - /** - * Test doCountJoin*() methods. - */ - public function testDoCountJoin() - { - BookPeer::doDeleteAll(); - - for ($i=0; $i < 25; $i++) { - $b = new Book(); - $b->setTitle("Book $i"); - $b->setISBN("ISBN $i"); - $b->save(); - } - - $c = new Criteria(); - $totalCount = BookPeer::doCount($c); - - $this->assertEquals($totalCount, BookPeer::doCountJoinAuthor($c)); - $this->assertEquals($totalCount, BookPeer::doCountJoinPublisher($c)); - } - - /** - * Test doCountJoin*() methods with ORDER BY columns in Criteria. - * @link http://propel.phpdb.org/trac/ticket/627 - */ - public function testDoCountJoinWithOrderBy() - { - $c = new Criteria(BookPeer::DATABASE_NAME); - $c->addAscendingOrderByColumn(BookPeer::ID); - - // None of these should not throw an exception! - BookPeer::doCountJoinAll($c); - BookPeer::doCountJoinAllExceptAuthor($c); - BookPeer::doCountJoinAuthor($c); - } - - /** - * Test passing null values to removeInstanceFromPool(). - */ - public function testRemoveInstanceFromPool_Null() - { - // if it throws an exception, then it's broken. - try { - BookPeer::removeInstanceFromPool(null); - } catch (Exception $x) { - $this->fail("Expected to get no exception when removing an instance from the pool."); - } - } - - /** - * @see testDoDeleteCompositePK() - */ - private function createBookWithId($id) - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $b = BookPeer::retrieveByPK($id); - if (!$b) { - $b = new Book(); - $b->setTitle("Book$id")->setISBN("BookISBN$id")->save(); - $b1Id = $b->getId(); - $sql = "UPDATE " . BookPeer::TABLE_NAME . " SET id = ? WHERE id = ?"; - $stmt = $con->prepare($sql); - $stmt->bindValue(1, $id); - $stmt->bindValue(2, $b1Id); - $stmt->execute(); - } - } - - /** - * @see testDoDeleteCompositePK() - */ - private function createReaderWithId($id) - { - $con = Propel::getConnection(BookReaderPeer::DATABASE_NAME); - $r = BookReaderPeer::retrieveByPK($id); - if (!$r) { - $r = new BookReader(); - $r->setName('Reader'.$id)->save(); - $r1Id = $r->getId(); - $sql = "UPDATE " . BookReaderPeer::TABLE_NAME . " SET id = ? WHERE id = ?"; - $stmt = $con->prepare($sql); - $stmt->bindValue(1, $id); - $stmt->bindValue(2, $r1Id); - $stmt->execute(); - } - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedPeerDoSelectTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedPeerDoSelectTest.php deleted file mode 100644 index e6be9d3f6d..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedPeerDoSelectTest.php +++ /dev/null @@ -1,439 +0,0 @@ - - * @package generator.builder.om - */ -class GeneratedPeerDoSelectTest extends BookstoreEmptyTestBase -{ - protected function setUp() - { - parent::setUp(); - BookstoreDataPopulator::populate(); - } - - public function testDoSelect() - { - $books = BookPeer::doSelect(new Criteria()); - $this->assertEquals(4, count($books), 'doSelect() with an empty Criteria returns all results'); - $book1 = $books[0]; - - $c = new Criteria(); - $c->add(BookPeer::ID, $book1->getId()); - $res = BookPeer::doSelect($c); - $this->assertEquals(array($book1), $res, 'doSelect() accepts a Criteria object with a condition'); - - $c = new Criteria(); - $c->add(BookPeer::ID, $book1->getId()); - $c->add(BookPeer::TITLE, $book1->getTitle()); - $res = BookPeer::doSelect($c); - $this->assertEquals(array($book1), $res, 'doSelect() accepts a Criteria object with several condition'); - - $c = new Criteria(); - $c->add(BookPeer::ID, 'foo'); - $res = BookPeer::doSelect($c); - $this->assertEquals(array(), $res, 'doSelect() accepts an incorrect Criteria'); - } - - /** - * Tests performing doSelect() and doSelectJoin() using LIMITs. - */ - public function testDoSelect_Limit() { - - // 1) get the total number of items in a particular table - $count = BookPeer::doCount(new Criteria()); - - $this->assertTrue($count > 1, "Need more than 1 record in books table to perform this test."); - - $limitcount = $count - 1; - - $lc = new Criteria(); - $lc->setLimit($limitcount); - - $results = BookPeer::doSelect($lc); - - $this->assertEquals($limitcount, count($results), "Expected $limitcount results from BookPeer::doSelect()"); - - // re-create it just to avoid side-effects - $lc2 = new Criteria(); - $lc2->setLimit($limitcount); - $results2 = BookPeer::doSelectJoinAuthor($lc2); - - $this->assertEquals($limitcount, count($results2), "Expected $limitcount results from BookPeer::doSelectJoinAuthor()"); - - } - - /** - * Test the basic functionality of the doSelectJoin*() methods. - */ - public function testDoSelectJoin() - { - - BookPeer::clearInstancePool(); - - $c = new Criteria(); - - $books = BookPeer::doSelect($c); - $obj = $books[0]; - // $size = strlen(serialize($obj)); - - BookPeer::clearInstancePool(); - - $joinBooks = BookPeer::doSelectJoinAuthor($c); - $obj2 = $joinBooks[0]; - $obj2Array = $obj2->toArray(BasePeer::TYPE_PHPNAME, true, true); - // $joinSize = strlen(serialize($obj2)); - - $this->assertEquals(count($books), count($joinBooks), "Expected to find same number of rows in doSelectJoin*() call as doSelect() call."); - - // $this->assertTrue($joinSize > $size, "Expected a serialized join object to be larger than a non-join object."); - - $this->assertTrue(array_key_exists('Author', $obj2Array)); - } - - /** - * Test the doSelectJoin*() methods when the related object is NULL. - */ - public function testDoSelectJoin_NullFk() - { - $b1 = new Book(); - $b1->setTitle("Test NULLFK 1"); - $b1->setISBN("NULLFK-1"); - $b1->save(); - - $b2 = new Book(); - $b2->setTitle("Test NULLFK 2"); - $b2->setISBN("NULLFK-2"); - $b2->setAuthor(new Author()); - $b2->getAuthor()->setFirstName("Hans")->setLastName("L"); - $b2->save(); - - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - - $c = new Criteria(); - $c->add(BookPeer::ISBN, 'NULLFK-%', Criteria::LIKE); - $c->addAscendingOrderByColumn(BookPeer::ISBN); - - $matches = BookPeer::doSelectJoinAuthor($c); - $this->assertEquals(2, count($matches), "Expected 2 matches back from new books; got back " . count($matches)); - - $this->assertNull($matches[0]->getAuthor(), "Expected first book author to be null"); - $this->assertType('Author', $matches[1]->getAuthor(), "Expected valid Author object for second book."); - } - - public function testDoSelectJoinOneToOne() - { - $con = Propel::getConnection(); - $count = $con->getQueryCount(); - Propel::disableInstancePooling(); - $c = new Criteria(); - $accs = BookstoreEmployeeAccountPeer::doSelectJoinBookstoreEmployee($c); - Propel::enableInstancePooling(); - $this->assertEquals(1, $con->getQueryCount() - $count, 'doSelectJoin() makes only one query in a one-to-one relationship'); - } - - public function testDoSelectOne() - { - $books = BookPeer::doSelect(new Criteria()); - $book1 = $books[0]; - - $c = new Criteria(); - $c->add(BookPeer::ID, $book1->getId()); - $res = BookPeer::doSelectOne($c); - $this->assertEquals($book1, $res, 'doSelectOne() returns a single object'); - - $c = new Criteria(); - $c->add(BookPeer::ID, 'foo'); - $res = BookPeer::doSelectOne($c); - $this->assertNull($res, 'doSelectOne() returns null if the Criteria matches no record'); - } - - public function testObjectInstances() - { - - $sample = BookPeer::doSelectOne(new Criteria()); - $samplePk = $sample->getPrimaryKey(); - - // 1) make sure consecutive calls to retrieveByPK() return the same object. - - $b1 = BookPeer::retrieveByPK($samplePk); - $b2 = BookPeer::retrieveByPK($samplePk); - - $sampleval = md5(microtime()); - - $this->assertTrue($b1 === $b2, "Expected object instances to match for calls with same retrieveByPK() method signature."); - - // 2) make sure that calls to doSelect also return references to the same objects. - $allbooks = BookPeer::doSelect(new Criteria()); - foreach ($allbooks as $testb) { - if ($testb->getPrimaryKey() == $b1->getPrimaryKey()) { - $this->assertTrue($testb === $b1, "Expected same object instance from doSelect() as from retrieveByPK()"); - } - } - - // 3) test fetching related objects - $book = BookPeer::retrieveByPK($samplePk); - - $bookauthor = $book->getAuthor(); - - $author = AuthorPeer::retrieveByPK($bookauthor->getId()); - - $this->assertTrue($bookauthor === $author, "Expected same object instance when calling fk object accessor as retrieveByPK()"); - - // 4) test a doSelectJoin() - $morebooks = BookPeer::doSelectJoinAuthor(new Criteria()); - for ($i=0,$j=0; $j < count($morebooks); $i++, $j++) { - $testb1 = $allbooks[$i]; - $testb2 = $allbooks[$j]; - $this->assertTrue($testb1 === $testb2, "Expected the same objects from consecutive doSelect() calls."); - // we could probably also test this by just verifying that $book & $testb are the same - if ($testb1->getPrimaryKey() === $book) { - $this->assertTrue($book->getAuthor() === $testb1->getAuthor(), "Expected same author object in calls to pkey-matching books."); - } - } - - - // 5) test creating a new object, saving it, and then retrieving that object (should all be same instance) - $b = new BookstoreEmployee(); - $b->setName("Testing"); - $b->setJobTitle("Testing"); - $b->save(); - - $empId = $b->getId(); - - $this->assertSame($b, BookstoreEmployeePeer::retrieveByPK($empId), "Expected newly saved object to be same instance as pooled."); - - } - - /** - * Test inheritance features. - */ - public function testInheritance() - { - $manager = new BookstoreManager(); - $manager->setName("Manager 1"); - $manager->setJobTitle("Warehouse Manager"); - $manager->save(); - $managerId = $manager->getId(); - - $employee = new BookstoreEmployee(); - $employee->setName("Employee 1"); - $employee->setJobTitle("Janitor"); - $employee->setSupervisorId($managerId); - $employee->save(); - $empId = $employee->getId(); - - $cashier = new BookstoreCashier(); - $cashier->setName("Cashier 1"); - $cashier->setJobTitle("Cashier"); - $cashier->save(); - $cashierId = $cashier->getId(); - - // 1) test the pooled instances' - $c = new Criteria(); - $c->add(BookstoreEmployeePeer::ID, array($managerId, $empId, $cashierId), Criteria::IN); - $c->addAscendingOrderByColumn(BookstoreEmployeePeer::ID); - - $objects = BookstoreEmployeePeer::doSelect($c); - - $this->assertEquals(3, count($objects), "Expected 3 objects to be returned."); - - list($o1, $o2, $o3) = $objects; - - $this->assertSame($o1, $manager); - $this->assertSame($o2, $employee); - $this->assertSame($o3, $cashier); - - // 2) test a forced reload from database - BookstoreEmployeePeer::clearInstancePool(); - - list($o1,$o2,$o3) = BookstoreEmployeePeer::doSelect($c); - - $this->assertTrue($o1 instanceof BookstoreManager, "Expected BookstoreManager object, got " . get_class($o1)); - $this->assertTrue($o2 instanceof BookstoreEmployee, "Expected BookstoreEmployee object, got " . get_class($o2)); - $this->assertTrue($o3 instanceof BookstoreCashier, "Expected BookstoreCashier object, got " . get_class($o3)); - - } - - /** - * Test hydration of joined rows that contain lazy load columns. - * @link http://propel.phpdb.org/trac/ticket/464 - */ - public function testHydrationJoinLazyLoad() - { - BookstoreEmployeeAccountPeer::doDeleteAll(); - BookstoreEmployeePeer::doDeleteAll(); - AcctAccessRolePeer::doDeleteAll(); - - $bemp2 = new BookstoreEmployee(); - $bemp2->setName("Pieter"); - $bemp2->setJobTitle("Clerk"); - $bemp2->save(); - - $role = new AcctAccessRole(); - $role->setName("Admin"); - - $bempacct = new BookstoreEmployeeAccount(); - $bempacct->setBookstoreEmployee($bemp2); - $bempacct->setAcctAccessRole($role); - $bempacct->setLogin("john"); - $bempacct->setPassword("johnp4ss"); - $bempacct->save(); - - $c = new Criteria(); - $results = BookstoreEmployeeAccountPeer::doSelectJoinAll($c); - $o = $results[0]; - - $this->assertEquals('Admin', $o->getAcctAccessRole()->getName()); - } - - /** - * Testing foreign keys with multiple referrer columns. - * @link http://propel.phpdb.org/trac/ticket/606 - */ - public function testMultiColFk() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - ReaderFavoritePeer::doDeleteAll(); - - $b1 = new Book(); - $b1->setTitle("Book1"); - $b1->setISBN("ISBN-1"); - $b1->save(); - - $r1 = new BookReader(); - $r1-> setName("Me"); - $r1->save(); - - $bo1 = new BookOpinion(); - $bo1->setBookId($b1->getId()); - $bo1->setReaderId($r1->getId()); - $bo1->setRating(9); - $bo1->setRecommendToFriend(true); - $bo1->save(); - - $rf1 = new ReaderFavorite(); - $rf1->setReaderId($r1->getId()); - $rf1->setBookId($b1->getId()); - $rf1->save(); - - $c = new Criteria(ReaderFavoritePeer::DATABASE_NAME); - $c->add(ReaderFavoritePeer::BOOK_ID, $b1->getId()); - $c->add(ReaderFavoritePeer::READER_ID, $r1->getId()); - - $results = ReaderFavoritePeer::doSelectJoinBookOpinion($c); - $this->assertEquals(1, count($results), "Expected 1 result"); - } - - /** - * Testing foreign keys with multiple referrer columns. - * @link http://propel.phpdb.org/trac/ticket/606 - */ - public function testMultiColJoin() - { - BookstoreContestPeer::doDeleteAll(); - BookstoreContestEntryPeer::doDeleteAll(); - - $bs = new Bookstore(); - $bs->setStoreName("Test1"); - $bs->setPopulationServed(5); - $bs->save(); - $bs1Id = $bs->getId(); - - $bs2 = new Bookstore(); - $bs2->setStoreName("Test2"); - $bs2->setPopulationServed(5); - $bs2->save(); - $bs2Id = $bs2->getId(); - - $ct1 = new Contest(); - $ct1->setName("Contest1!"); - $ct1->save(); - $ct1Id = $ct1->getId(); - - $ct2 = new Contest(); - $ct2->setName("Contest2!"); - $ct2->save(); - $ct2Id = $ct2->getId(); - - $cmr = new Customer(); - $cmr->setName("Customer1"); - $cmr->save(); - $cmr1Id = $cmr->getId(); - - $cmr2 = new Customer(); - $cmr2->setName("Customer2"); - $cmr2->save(); - $cmr2Id = $cmr2->getId(); - - $contest = new BookstoreContest(); - $contest->setBookstoreId($bs1Id); - $contest->setContestId($ct1Id); - $contest->save(); - - $contest = new BookstoreContest(); - $contest->setBookstoreId($bs2Id); - $contest->setContestId($ct1Id); - $contest->save(); - - $entry = new BookstoreContestEntry(); - $entry->setBookstoreId($bs1Id); - $entry->setContestId($ct1Id); - $entry->setCustomerId($cmr1Id); - $entry->save(); - - $entry = new BookstoreContestEntry(); - $entry->setBookstoreId($bs1Id); - $entry->setContestId($ct1Id); - $entry->setCustomerId($cmr2Id); - $entry->save(); - - // Note: this test isn't really working very well. We setup fkeys that - // require that the BookstoreContest rows exist and then try to violate - // the rules ... :-/ This may work in some lenient databases, but an error - // is expected here. - - /* - * Commented out for now ... though without it, this test may not really be testing anything - $entry = new BookstoreContestEntry(); - $entry->setBookstoreId($bs1Id); - $entry->setContestId($ct2Id); - $entry->setCustomerId($cmr2Id); - $entry->save(); - */ - - - $c = new Criteria(); - $c->addJoin(array(BookstoreContestEntryPeer::BOOKSTORE_ID, BookstoreContestEntryPeer::CONTEST_ID), array(BookstoreContestPeer::BOOKSTORE_ID, BookstoreContestPeer::CONTEST_ID) ); - - $results = BookstoreContestEntryPeer::doSelect($c); - $this->assertEquals(2, count($results) ); - foreach ($results as $result) { - $this->assertEquals($bs1Id, $result->getBookstoreId() ); - $this->assertEquals($ct1Id, $result->getContestId() ); - } - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedPeerTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedPeerTest.php deleted file mode 100644 index 91d3755ce8..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/GeneratedPeerTest.php +++ /dev/null @@ -1,90 +0,0 @@ - - * @package generator.builder.om - */ -class GeneratedPeerTest extends BookstoreTestBase -{ - public function testAlias() - { - $this->assertEquals('foo.ID', BookPeer::alias('foo', BookPeer::ID), 'alias() returns a column name using the table alias'); - $this->assertEquals('book.ID', BookPeer::alias('book', BookPeer::ID), 'alias() returns a column name using the table alias'); - $this->assertEquals('foo.COVER_IMAGE', MediaPeer::alias('foo', MediaPeer::COVER_IMAGE), 'alias() also works for lazy-loaded columns'); - $this->assertEquals('foo.SUBTITLE', EssayPeer::alias('foo', EssayPeer::SUBTITLE), 'alias() also works for columns with custom phpName'); - } - - public function testAddSelectColumns() - { - $c = new Criteria(); - BookPeer::addSelectColumns($c); - $expected = array( - BookPeer::ID, - BookPeer::TITLE, - BookPeer::ISBN, - BookPeer::PRICE, - BookPeer::PUBLISHER_ID, - BookPeer::AUTHOR_ID - ); - $this->assertEquals($expected, $c->getSelectColumns(), 'addSelectColumns() adds the columns of the model to the criteria'); - } - - public function testAddSelectColumnsLazyLoad() - { - $c = new Criteria(); - MediaPeer::addSelectColumns($c); - $expected = array( - MediaPeer::ID, - MediaPeer::BOOK_ID - ); - $this->assertEquals($expected, $c->getSelectColumns(), 'addSelectColumns() does not add lazy loaded columns'); - } - - public function testAddSelectColumnsAlias() - { - $c = new Criteria(); - BookPeer::addSelectColumns($c, 'foo'); - $expected = array( - 'foo.ID', - 'foo.TITLE', - 'foo.ISBN', - 'foo.PRICE', - 'foo.PUBLISHER_ID', - 'foo.AUTHOR_ID' - ); - $this->assertEquals($expected, $c->getSelectColumns(), 'addSelectColumns() uses the second parameter as a table alias'); - } - - public function testAddSelectColumnsAliasLazyLoad() - { - $c = new Criteria(); - MediaPeer::addSelectColumns($c, 'bar'); - $expected = array( - 'bar.ID', - 'bar.BOOK_ID' - ); - $this->assertEquals($expected, $c->getSelectColumns(), 'addSelectColumns() does not add lazy loaded columns but uses the second parameter as an alias'); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/OMBuilderNamespaceTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/OMBuilderNamespaceTest.php deleted file mode 100644 index c78f9532a7..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/OMBuilderNamespaceTest.php +++ /dev/null @@ -1,149 +0,0 @@ -addTable($t); - $builder = new TestableOMBuilder2($t); - $this->assertNull($builder->getNamespace(), 'Builder namespace is null when neither the db nor the table have namespace'); - } - - public function testDbNamespace() - { - $d = new Database('fooDb'); - $d->setNamespace('Foo\\Bar'); - $t = new Table('fooTable'); - $d->addTable($t); - $builder = new TestableOMBuilder2($t); - $this->assertEquals('Foo\\Bar', $builder->getNamespace(), 'Builder namespace is the database namespace when no table namespace is set'); - } - - public function testTableNamespace() - { - $d = new Database('fooDb'); - $t = new Table('fooTable'); - $t->setNamespace('Foo\\Bar'); - $d->addTable($t); - $builder = new TestableOMBuilder2($t); - $this->assertEquals('Foo\\Bar', $builder->getNamespace(), 'Builder namespace is the table namespace when no database namespace is set'); - } - - public function testAbsoluteTableNamespace() - { - $d = new Database('fooDb'); - $t = new Table('fooTable'); - $t->setNamespace('\\Foo\\Bar'); - $d->addTable($t); - $builder = new TestableOMBuilder2($t); - $this->assertEquals('Foo\\Bar', $builder->getNamespace(), 'Builder namespace is the table namespace when it is set as absolute'); - } - - public function testAbsoluteTableNamespaceAndDbNamespace() - { - $d = new Database('fooDb'); - $d->setNamespace('Baz'); - $t = new Table('fooTable'); - $t->setNamespace('\\Foo\\Bar'); - $d->addTable($t); - $builder = new TestableOMBuilder2($t); - $this->assertEquals('Foo\\Bar', $builder->getNamespace(), 'Builder namespace is the table namespace when it is set as absolute'); - } - - public function testTableNamespaceAndDbNamespace() - { - $d = new Database('fooDb'); - $d->setNamespace('Baz'); - $t = new Table('fooTable'); - $t->setNamespace('Foo\\Bar'); - $d->addTable($t); - $builder = new TestableOMBuilder2($t); - $this->assertEquals('Baz\\Foo\\Bar', $builder->getNamespace(), 'Builder namespace is composed from the database and table namespaces when both are set'); - } - - public function testDeclareClassNamespace() - { - $builder = new TestableOMBuilder2(new Table('fooTable')); - $builder->declareClassNamespace('Foo'); - $this->assertEquals(array('' => array('Foo')), $builder->getDeclaredClasses()); - $builder->declareClassNamespace('Bar'); - $this->assertEquals(array('' => array('Foo', 'Bar')), $builder->getDeclaredClasses()); - $builder->declareClassNamespace('Foo'); - $this->assertEquals(array('' => array('Foo', 'Bar')), $builder->getDeclaredClasses()); - $builder = new TestableOMBuilder2(new Table('fooTable')); - $builder->declareClassNamespace('Foo', 'Foo'); - $this->assertEquals(array('Foo' => array('Foo')), $builder->getDeclaredClasses()); - $builder->declareClassNamespace('Bar', 'Foo'); - $this->assertEquals(array('Foo' => array('Foo', 'Bar')), $builder->getDeclaredClasses()); - $builder->declareClassNamespace('Foo', 'Foo'); - $this->assertEquals(array('Foo' => array('Foo', 'Bar')), $builder->getDeclaredClasses()); - $builder->declareClassNamespace('Bar', 'Bar'); - $this->assertEquals(array('Foo' => array('Foo', 'Bar'), 'Bar' => array('Bar')), $builder->getDeclaredClasses()); - } - - public function testGetDeclareClass() - { - $builder = new TestableOMBuilder2(new Table('fooTable')); - $this->assertEquals(array(), $builder->getDeclaredClasses()); - $builder->declareClass('\\Foo'); - $this->assertEquals(array('Foo'), $builder->getDeclaredClasses('')); - $builder->declareClass('Bar'); - $this->assertEquals(array('Foo', 'Bar'), $builder->getDeclaredClasses('')); - $builder->declareClass('Foo\\Bar'); - $this->assertEquals(array('Bar'), $builder->getDeclaredClasses('Foo')); - $builder->declareClass('Foo\\Bar\\Baz'); - $this->assertEquals(array('Bar'), $builder->getDeclaredClasses('Foo')); - $this->assertEquals(array('Baz'), $builder->getDeclaredClasses('Foo\\Bar')); - $builder->declareClass('\\Hello\\World'); - $this->assertEquals(array('World'), $builder->getDeclaredClasses('Hello')); - } - - public function testDeclareClasses() - { - $builder = new TestableOMBuilder2(new Table('fooTable')); - $builder->declareClasses('Foo', '\\Bar', 'Baz\\Baz', 'Hello\\Cruel\\World'); - $expected = array( - '' => array('Foo', 'Bar'), - 'Baz' => array('Baz'), - 'Hello\\Cruel' => array('World') - ); - $this->assertEquals($expected, $builder->getDeclaredClasses()); - } -} - -class TestableOMBuilder2 extends OMBuilder -{ - public static function getRelatedBySuffix(ForeignKey $fk) - { - return parent::getRelatedBySuffix($fk); - } - - public static function getRefRelatedBySuffix(ForeignKey $fk) - { - return parent::getRefRelatedBySuffix($fk); - } - - public function getUnprefixedClassname() {} -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/OMBuilderTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/OMBuilderTest.php deleted file mode 100644 index 1d7162e708..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/OMBuilderTest.php +++ /dev/null @@ -1,89 +0,0 @@ -parseFile('fixtures/bookstore/schema.xml'); - $this->database = $appData->getDatabase("bookstore"); - } - - protected function getForeignKey($tableName, $index) - { - $fks = $this->database->getTable($tableName)->getForeignKeys(); - return $fks[$index]; - } - - public static function getRelatedBySuffixDataProvider() - { - return array( - array('book', 0, '', ''), - array('essay', 0, 'RelatedByFirstAuthor', 'RelatedByFirstAuthor'), - array('essay', 1, 'RelatedBySecondAuthor', 'RelatedBySecondAuthor'), - array('essay', 2, 'RelatedById', 'RelatedByNextEssayId'), - array('bookstore_employee', 0, 'RelatedById', 'RelatedBySupervisorId'), - array('composite_essay', 0, 'RelatedById0', 'RelatedByFirstEssayId'), - array('composite_essay', 1, 'RelatedById1', 'RelatedBySecondEssayId'), - array('man', 0, 'RelatedByWifeId', 'RelatedByWifeId'), - array('woman', 0, 'RelatedByHusbandId', 'RelatedByHusbandId'), - ); - } - - /** - * @dataProvider getRelatedBySuffixDataProvider - */ - public function testGetRelatedBySuffix($table, $index, $expectedSuffix, $expectedReverseSuffix) - { - $fk = $this->getForeignKey($table, $index); - $this->assertEquals($expectedSuffix, TestableOMBuilder::getRefRelatedBySuffix($fk)); - $this->assertEquals($expectedReverseSuffix, TestableOMBuilder::getRelatedBySuffix($fk)); - } - - public function testClear() - { - $b = new Book(); - $b->setNew(false); - $b->clear(); - $this->assertTrue($b->isNew(), 'clear() sets the object to new'); - $b = new Book(); - $b->setDeleted(true); - $b->clear(); - $this->assertFalse($b->isDeleted(), 'clear() sets the object to not deleted'); - } -} - -class TestableOMBuilder extends OMBuilder -{ - public static function getRelatedBySuffix(ForeignKey $fk) - { - return parent::getRelatedBySuffix($fk); - } - - public static function getRefRelatedBySuffix(ForeignKey $fk) - { - return parent::getRefRelatedBySuffix($fk); - } - - public function getUnprefixedClassname() {} -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/PHP5TableMapBuilderTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/PHP5TableMapBuilderTest.php deleted file mode 100644 index f6463e51b5..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/PHP5TableMapBuilderTest.php +++ /dev/null @@ -1,149 +0,0 @@ -databaseMap = Propel::getDatabaseMap('bookstore'); - } - - public function testColumnDefaultValue() - { - $table = $this->databaseMap->getTableByPhpName('BookstoreEmployeeAccount'); - $this->assertNull($table->getColumn('login')->getDefaultValue(), 'null default values are correctly mapped'); - $this->assertEquals('\'@\'\'34"', $table->getColumn('password')->getDefaultValue(), 'string default values are correctly escaped and mapped'); - $this->assertTrue($table->getColumn('enabled')->getDefaultValue(), 'boolean default values are correctly mapped'); - $this->assertFalse($table->getColumn('not_enabled')->getDefaultValue(), 'boolean default values are correctly mapped'); - $this->assertEquals('CURRENT_TIMESTAMP', $table->getColumn('created')->getDefaultValue(), 'expression default values are correctly mapped'); - $this->assertNull($table->getColumn('role_id')->getDefaultValue(), 'explicit null default values are correctly mapped'); - } - - public function testRelationCount() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $this->assertEquals(9, count($bookTable->getRelations()), 'The map builder creates relations for both incoming and outgoing keys'); - } - - public function testSimpleRelationName() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $this->assertTrue($bookTable->hasRelation('Publisher'), 'The map builder creates relations based on the foreign table name, calemized'); - $this->assertTrue($bookTable->hasRelation('BookListRel'), 'The map builder creates relations based on the foreign table phpName, if provided'); - } - - public function testAliasRelationName() - { - $bookEmpTable = $this->databaseMap->getTableByPhpName('BookstoreEmployee'); - $this->assertTrue($bookEmpTable->hasRelation('Supervisor'), 'The map builder creates relations based on the foreign key phpName'); - $this->assertTrue($bookEmpTable->hasRelation('Subordinate'), 'The map builder creates relations based on the foreign key refPhpName'); - } - - public function testDuplicateRelationName() - { - $essayTable = $this->databaseMap->getTableByPhpName('Essay'); - $this->assertTrue($essayTable->hasRelation('AuthorRelatedByFirstAuthor'), 'The map builder creates relations based on the foreign table name and the foreign key'); - $this->assertTrue($essayTable->hasRelation('AuthorRelatedBySecondAuthor'), 'The map builder creates relations based on the foreign table name and the foreign key'); - } - - public function testRelationDirectionManyToOne() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $this->assertEquals(RelationMap::MANY_TO_ONE, $bookTable->getRelation('Publisher')->getType(), 'The map builder creates MANY_TO_ONE relations for every foreign key'); - $this->assertEquals(RelationMap::MANY_TO_ONE, $bookTable->getRelation('Author')->getType(), 'The map builder creates MANY_TO_ONE relations for every foreign key'); - } - - public function testRelationDirectionOneToMany() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $this->assertEquals(RelationMap::ONE_TO_MANY, $bookTable->getRelation('Review')->getType(), 'The map builder creates ONE_TO_MANY relations for every incoming foreign key'); - $this->assertEquals(RelationMap::ONE_TO_MANY, $bookTable->getRelation('Media')->getType(), 'The map builder creates ONE_TO_MANY relations for every incoming foreign key'); - $this->assertEquals(RelationMap::ONE_TO_MANY, $bookTable->getRelation('BookListRel')->getType(), 'The map builder creates ONE_TO_MANY relations for every incoming foreign key'); - $this->assertEquals(RelationMap::ONE_TO_MANY, $bookTable->getRelation('BookOpinion')->getType(), 'The map builder creates ONE_TO_MANY relations for every incoming foreign key'); - $this->assertEquals(RelationMap::ONE_TO_MANY, $bookTable->getRelation('ReaderFavorite')->getType(), 'The map builder creates ONE_TO_MANY relations for every incoming foreign key'); - $this->assertEquals(RelationMap::ONE_TO_MANY, $bookTable->getRelation('BookstoreContest')->getType(), 'The map builder creates ONE_TO_MANY relations for every incoming foreign key'); - } - - public function testRelationDirectionOneToOne() - { - $bookEmpTable = $this->databaseMap->getTableByPhpName('BookstoreEmployee'); - $this->assertEquals(RelationMap::ONE_TO_ONE, $bookEmpTable->getRelation('BookstoreEmployeeAccount')->getType(), 'The map builder creates ONE_TO_ONE relations for every incoming foreign key to a primary key'); - } - - public function testRelationDirectionManyToMAny() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $this->assertEquals(RelationMap::MANY_TO_MANY, $bookTable->getRelation('BookClubList')->getType(), 'The map builder creates MANY_TO_MANY relations for every cross key'); - } - - public function testRelationsColumns() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $expectedMapping = array('book.PUBLISHER_ID' => 'publisher.ID'); - $this->assertEquals($expectedMapping, $bookTable->getRelation('Publisher')->getColumnMappings(), 'The map builder adds columns in the correct order for foreign keys'); - $expectedMapping = array('review.BOOK_ID' => 'book.ID'); - $this->assertEquals($expectedMapping, $bookTable->getRelation('Review')->getColumnMappings(), 'The map builder adds columns in the correct order for incoming foreign keys'); - $publisherTable = $this->databaseMap->getTableByPhpName('Publisher'); - $expectedMapping = array('book.PUBLISHER_ID' => 'publisher.ID'); - $this->assertEquals($expectedMapping, $publisherTable->getRelation('Book')->getColumnMappings(), 'The map builder adds local columns where the foreign key lies'); - $rfTable = $this->databaseMap->getTableByPhpName('ReaderFavorite'); - $expectedMapping = array( - 'reader_favorite.BOOK_ID' => 'book_opinion.BOOK_ID', - 'reader_favorite.READER_ID' => 'book_opinion.READER_ID' - ); - $this->assertEquals($expectedMapping, $rfTable->getRelation('BookOpinion')->getColumnMappings(), 'The map builder adds all columns for composite foreign keys'); - $expectedMapping = array(); - $this->assertEquals($expectedMapping, $bookTable->getRelation('BookClubList')->getColumnMappings(), 'The map builder provides no column mapping for many-to-many relationships'); - } - - public function testRelationOnDelete() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $this->assertEquals('SET NULL', $bookTable->getRelation('Publisher')->getOnDelete(), 'The map builder adds columns with the correct onDelete'); - } - - public function testRelationOnUpdate() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $this->assertNull($bookTable->getRelation('Publisher')->getOnUpdate(), 'The map builder adds columns with onDelete null by default'); - $this->assertEquals('CASCADE', $bookTable->getRelation('Author')->getOnUpdate(), 'The map builder adds columns with the correct onUpdate'); - } - - public function testBehaviors() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $this->assertEquals($bookTable->getBehaviors(), array(), 'getBehaviors() returns an empty array when no behaviors are registered'); - $tmap = Propel::getDatabaseMap(Table1Peer::DATABASE_NAME)->getTable(Table1Peer::TABLE_NAME); - $expectedBehaviorParams = array('timestampable' => array('create_column' => 'created_on', 'update_column' => 'updated_on')); - $this->assertEquals($tmap->getBehaviors(), $expectedBehaviorParams, 'The map builder creates a getBehaviors() method to retrieve behaviors parameters when behaviors are registered'); - } - - public function testSingleTableInheritance() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $this->assertFalse($bookTable->isSingleTableInheritance(), 'isSingleTabkeInheritance() returns false by default'); - - $empTable = $this->databaseMap->getTableByPhpName('BookstoreEmployee'); - $this->assertTrue($empTable->isSingleTableInheritance(), 'isSingleTabkeInheritance() returns true for tables using single table inheritance'); - - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/QueryBuilderInheritanceTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/QueryBuilderInheritanceTest.php deleted file mode 100644 index 10fbb1e23e..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/QueryBuilderInheritanceTest.php +++ /dev/null @@ -1,95 +0,0 @@ -assertTrue($query instanceof BookstoreCashierQuery, 'the create() factory returns an instance of the correct class'); - } - - public function testFindFilter() - { - BookstoreDataPopulator::depopulate($this->con); - $employee = new BookstoreEmployee(); - $employee->save($this->con); - $manager = new BookstoreManager(); - $manager->save($this->con); - $cashier1 = new BookstoreCashier(); - $cashier1->save($this->con); - $cashier2 = new BookstoreCashier(); - $cashier2->save($this->con); - $nbEmp = BookstoreEmployeeQuery::create()->count($this->con); - $this->assertEquals(4, $nbEmp, 'find() in main query returns all results'); - $nbMan = BookstoreManagerQuery::create()->count($this->con); - $this->assertEquals(1, $nbMan, 'find() in sub query returns only child results'); - $nbCash = BookstoreCashierQuery::create()->count($this->con); - $this->assertEquals(2, $nbCash, 'find() in sub query returns only child results'); - } - - public function testUpdateFilter() - { - BookstoreDataPopulator::depopulate($this->con); - $manager = new BookstoreManager(); - $manager->save($this->con); - $cashier1 = new BookstoreCashier(); - $cashier1->save($this->con); - $cashier2 = new BookstoreCashier(); - $cashier2->save($this->con); - BookstoreManagerQuery::create()->update(array('Name' => 'foo'), $this->con); - $nbMan = BookstoreEmployeeQuery::create() - ->filterByName('foo') - ->count($this->con); - $this->assertEquals(1, $nbMan, 'Update in sub query affects only child results'); - } - - public function testDeleteFilter() - { - BookstoreDataPopulator::depopulate($this->con); - $manager = new BookstoreManager(); - $manager->save($this->con); - $cashier1 = new BookstoreCashier(); - $cashier1->save($this->con); - $cashier2 = new BookstoreCashier(); - $cashier2->save($this->con); - BookstoreManagerQuery::create() - ->filterByName() - ->delete(); - $nbCash = BookstoreEmployeeQuery::create()->count(); - $this->assertEquals(2, $nbCash, 'Delete in sub query affects only child results'); - } - - public function testDeleteAllFilter() - { - BookstoreDataPopulator::depopulate($this->con); - $manager = new BookstoreManager(); - $manager->save($this->con); - $cashier1 = new BookstoreCashier(); - $cashier1->save($this->con); - $cashier2 = new BookstoreCashier(); - $cashier2->save($this->con); - BookstoreManagerQuery::create()->deleteAll(); - $nbCash = BookstoreEmployeeQuery::create()->count(); - $this->assertEquals(2, $nbCash, 'Delete in sub query affects only child results'); - } -} - diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/QueryBuilderTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/om/QueryBuilderTest.php deleted file mode 100644 index 056c1afd47..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/om/QueryBuilderTest.php +++ /dev/null @@ -1,912 +0,0 @@ -assertTrue($q instanceof ModelCriteria, 'Model query extends ModelCriteria'); - } - - public function testConstructor() - { - $query = new BookQuery(); - $this->assertEquals($query->getDbName(), 'bookstore', 'Constructor sets dabatase name'); - $this->assertEquals($query->getModelName(), 'Book', 'Constructor sets model name'); - } - - public function testCreate() - { - $query = BookQuery::create(); - $this->assertTrue($query instanceof BookQuery, 'create() returns an object of its class'); - $this->assertEquals($query->getDbName(), 'bookstore', 'create() sets dabatase name'); - $this->assertEquals($query->getModelName(), 'Book', 'create() sets model name'); - $query = BookQuery::create('foo'); - $this->assertTrue($query instanceof BookQuery, 'create() returns an object of its class'); - $this->assertEquals($query->getDbName(), 'bookstore', 'create() sets dabatase name'); - $this->assertEquals($query->getModelName(), 'Book', 'create() sets model name'); - $this->assertEquals($query->getModelAlias(), 'foo', 'create() can set the model alias'); - } - - public function testCreateCustom() - { - // see the myBookQuery class definition at the end of this file - $query = myCustomBookQuery::create(); - $this->assertTrue($query instanceof myCustomBookQuery, 'create() returns an object of its class'); - $this->assertTrue($query instanceof BookQuery, 'create() returns an object of its class'); - $this->assertEquals($query->getDbName(), 'bookstore', 'create() sets dabatase name'); - $this->assertEquals($query->getModelName(), 'Book', 'create() sets model name'); - $query = myCustomBookQuery::create('foo'); - $this->assertTrue($query instanceof myCustomBookQuery, 'create() returns an object of its class'); - $this->assertEquals($query->getDbName(), 'bookstore', 'create() sets dabatase name'); - $this->assertEquals($query->getModelName(), 'Book', 'create() sets model name'); - $this->assertEquals($query->getModelAlias(), 'foo', 'create() can set the model alias'); - } - - public function testBasePreSelect() - { - $method = new ReflectionMethod('Table2Query', 'basePreSelect'); - $this->assertEquals('ModelCriteria', $method->getDeclaringClass()->getName(), 'BaseQuery does not override basePreSelect() by default'); - - $method = new ReflectionMethod('Table3Query', 'basePreSelect'); - $this->assertEquals('BaseTable3Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides basePreSelect() when a behavior is registered'); - } - - public function testBasePreDelete() - { - $method = new ReflectionMethod('Table2Query', 'basePreDelete'); - $this->assertEquals('ModelCriteria', $method->getDeclaringClass()->getName(), 'BaseQuery does not override basePreDelete() by default'); - - $method = new ReflectionMethod('Table3Query', 'basePreDelete'); - $this->assertEquals('BaseTable3Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides basePreDelete() when a behavior is registered'); - } - - public function testBasePostDelete() - { - $method = new ReflectionMethod('Table2Query', 'basePostDelete'); - $this->assertEquals('ModelCriteria', $method->getDeclaringClass()->getName(), 'BaseQuery does not override basePostDelete() by default'); - - $method = new ReflectionMethod('Table3Query', 'basePostDelete'); - $this->assertEquals('BaseTable3Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides basePostDelete() when a behavior is registered'); - } - - public function testBasePreUpdate() - { - $method = new ReflectionMethod('Table2Query', 'basePreUpdate'); - $this->assertEquals('ModelCriteria', $method->getDeclaringClass()->getName(), 'BaseQuery does not override basePreUpdate() by default'); - - $method = new ReflectionMethod('Table3Query', 'basePreUpdate'); - $this->assertEquals('BaseTable3Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides basePreUpdate() when a behavior is registered'); - } - - public function testBasePostUpdate() - { - $method = new ReflectionMethod('Table2Query', 'basePostUpdate'); - $this->assertEquals('ModelCriteria', $method->getDeclaringClass()->getName(), 'BaseQuery does not override basePostUpdate() by default'); - - $method = new ReflectionMethod('Table3Query', 'basePostUpdate'); - $this->assertEquals('BaseTable3Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides basePostUpdate() when a behavior is registered'); - } - - public function testQuery() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - $q = new BookQuery(); - $book = $q - ->setModelAlias('b') - ->where('b.Title like ?', 'Don%') - ->orderBy('b.ISBN', 'desc') - ->findOne(); - $this->assertTrue($book instanceof Book); - $this->assertEquals('Don Juan', $book->getTitle()); - } - - public function testFindPk() - { - $method = new ReflectionMethod('Table4Query', 'findPk'); - $this->assertEquals('BaseTable4Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides findPk()'); - } - - public function testFindPkSimpleKey() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - BookPeer::clearInstancePool(); - $con = Propel::getConnection('bookstore'); - - // prepare the test data - $c = new ModelCriteria('bookstore', 'Book'); - $c->orderBy('Book.Id', 'desc'); - $testBook = $c->findOne(); - $count = $con->getQueryCount(); - - BookPeer::clearInstancePool(); - - $q = new BookQuery(); - $book = $q->findPk($testBook->getId()); - $this->assertEquals($testBook, $book, 'BaseQuery overrides findPk() to make it faster'); - $this->assertEquals($count+1, $con->getQueryCount(), 'findPk() issues a database query when instance pool is empty'); - - $q = new BookQuery(); - $book = $q->findPk($testBook->getId()); - $this->assertEquals($testBook, $book, 'BaseQuery overrides findPk() to make it faster'); - $this->assertEquals($count+1, $con->getQueryCount(), 'findPk() does not issue a database query when instance is in pool'); - } - - public function testFindPkCompositeKey() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->find(); - foreach ($books as $book) { - $book->save(); - } - - BookPeer::clearInstancePool(); - - // retrieve the test data - $c = new ModelCriteria('bookstore', 'BookListRel'); - $bookListRelTest = $c->findOne(); - $pk = $bookListRelTest->getPrimaryKey(); - - $q = new BookListRelQuery(); - $bookListRel = $q->findPk($pk); - $this->assertEquals($bookListRelTest, $bookListRel, 'BaseQuery overrides findPk() for composite primary keysto make it faster'); - } - - public function testFindPks() - { - $method = new ReflectionMethod('Table4Query', 'findPks'); - $this->assertEquals('BaseTable4Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides findPks()'); - } - - public function testFindPksSimpleKey() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - BookPeer::clearInstancePool(); - - // prepare the test data - $c = new ModelCriteria('bookstore', 'Book'); - $c->orderBy('Book.Id', 'desc'); - $testBooks = $c->find(); - $testBook1 = $testBooks->pop(); - $testBook2 = $testBooks->pop(); - - $q = new BookQuery(); - $books = $q->findPks(array($testBook1->getId(), $testBook2->getId())); - $this->assertEquals(array($testBook1, $testBook2), $books->getData(), 'BaseQuery overrides findPks() to make it faster'); - } - - public function testFindPksCompositeKey() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->find(); - foreach ($books as $book) { - $book->save(); - } - - BookPeer::clearInstancePool(); - - // retrieve the test data - $c = new ModelCriteria('bookstore', 'BookListRel'); - $bookListRelTest = $c->find(); - $search = array(); - foreach ($bookListRelTest as $obj) { - $search[]= $obj->getPrimaryKey(); - } - - $q = new BookListRelQuery(); - $objs = $q->findPks($search); - $this->assertEquals($bookListRelTest, $objs, 'BaseQuery overrides findPks() for composite primary keys to make it work'); - } - - public function testFilterBy() - { - foreach (BookPeer::getFieldNames(BasePeer::TYPE_PHPNAME) as $colName) { - $filterMethod = 'filterBy' . $colName; - $this->assertTrue(method_exists('BookQuery', $filterMethod), 'QueryBuilder adds filterByColumn() methods for every column'); - $q = BookQuery::create()->$filterMethod(1); - $this->assertTrue($q instanceof BookQuery, 'filterByColumn() returns the current query instance'); - } - } - - public function testFilterByPrimaryKeySimpleKey() - { - $q = BookQuery::create()->filterByPrimaryKey(12); - $q1 = BookQuery::create()->add(BookPeer::ID, 12, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByPrimaryKey() translates to a Criteria::EQUAL in the PK column'); - - $q = BookQuery::create()->setModelAlias('b', true)->filterByPrimaryKey(12); - $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.ID', 12, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByPrimaryKey() uses true table alias if set'); - } - - public function testFilterByPrimaryKeyCompositeKey() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->find(); - foreach ($books as $book) { - $book->save(); - } - - BookPeer::clearInstancePool(); - - // retrieve the test data - $c = new ModelCriteria('bookstore', 'BookListRel'); - $bookListRelTest = $c->findOne(); - $pk = $bookListRelTest->getPrimaryKey(); - - $q = new BookListRelQuery(); - $q->filterByPrimaryKey($pk); - - $q1 = BookListRelQuery::create() - ->add(BookListRelPeer::BOOK_ID, $pk[0], Criteria::EQUAL) - ->add(BookListRelPeer::BOOK_CLUB_LIST_ID, $pk[1], Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByPrimaryKey() translates to a Criteria::EQUAL in the PK columns'); - } - - public function testFilterByPrimaryKeysSimpleKey() - { - $q = BookQuery::create()->filterByPrimaryKeys(array(10, 11, 12)); - $q1 = BookQuery::create()->add(BookPeer::ID, array(10, 11, 12), Criteria::IN); - $this->assertEquals($q1, $q, 'filterByPrimaryKeys() translates to a Criteria::IN on the PK column'); - - $q = BookQuery::create()->setModelAlias('b', true)->filterByPrimaryKeys(array(10, 11, 12)); - $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.ID', array(10, 11, 12), Criteria::IN); - $this->assertEquals($q1, $q, 'filterByPrimaryKeys() uses true table alias if set'); - } - - public function testFilterByPrimaryKeysCompositeKey() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->find(); - foreach ($books as $book) { - $book->save(); - } - - BookPeer::clearInstancePool(); - - // retrieve the test data - $c = new ModelCriteria('bookstore', 'BookListRel'); - $bookListRelTest = $c->find(); - $search = array(); - foreach ($bookListRelTest as $obj) { - $search[]= $obj->getPrimaryKey(); - } - - $q = new BookListRelQuery(); - $q->filterByPrimaryKeys($search); - - $q1 = BookListRelQuery::create(); - foreach ($search as $key) { - $cton0 = $q1->getNewCriterion(BookListRelPeer::BOOK_ID, $key[0], Criteria::EQUAL); - $cton1 = $q1->getNewCriterion(BookListRelPeer::BOOK_CLUB_LIST_ID, $key[1], Criteria::EQUAL); - $cton0->addAnd($cton1); - $q1->addOr($cton0); - } - $this->assertEquals($q1, $q, 'filterByPrimaryKeys() translates to a series of Criteria::EQUAL in the PK columns'); - } - - public function testFilterByIntegerPk() - { - $q = BookQuery::create()->filterById(12); - $q1 = BookQuery::create()->add(BookPeer::ID, 12, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByPkColumn() translates to a Criteria::EQUAL by default'); - - $q = BookQuery::create()->filterById(12, Criteria::NOT_EQUAL); - $q1 = BookQuery::create()->add(BookPeer::ID, 12, Criteria::NOT_EQUAL); - $this->assertEquals($q1, $q, 'filterByPkColumn() accepts an optional comparison operator'); - - $q = BookQuery::create()->setModelAlias('b', true)->filterById(12); - $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.ID', 12, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByPkColumn() uses true table alias if set'); - - $q = BookQuery::create()->filterById(array(10, 11, 12)); - $q1 = BookQuery::create()->add(BookPeer::ID, array(10, 11, 12), Criteria::IN); - $this->assertEquals($q1, $q, 'filterByPkColumn() translates to a Criteria::IN when passed a simple array key'); - - $q = BookQuery::create()->filterById(array(10, 11, 12), Criteria::NOT_IN); - $q1 = BookQuery::create()->add(BookPeer::ID, array(10, 11, 12), Criteria::NOT_IN); - $this->assertEquals($q1, $q, 'filterByPkColumn() accepts a comparison when passed a simple array key'); - } - - public function testFilterByNumber() - { - $q = BookQuery::create()->filterByPrice(12); - $q1 = BookQuery::create()->add(BookPeer::PRICE, 12, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::EQUAL by default'); - - $q = BookQuery::create()->filterByPrice(12, Criteria::NOT_EQUAL); - $q1 = BookQuery::create()->add(BookPeer::PRICE, 12, Criteria::NOT_EQUAL); - $this->assertEquals($q1, $q, 'filterByNumColumn() accepts an optional comparison operator'); - - $q = BookQuery::create()->setModelAlias('b', true)->filterByPrice(12); - $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.PRICE', 12, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByNumColumn() uses true table alias if set'); - - $q = BookQuery::create()->filterByPrice(array(10, 11, 12)); - $q1 = BookQuery::create()->add(BookPeer::PRICE, array(10, 11, 12), Criteria::IN); - $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::IN when passed a simple array key'); - - $q = BookQuery::create()->filterByPrice(array(10, 11, 12), Criteria::NOT_IN); - $q1 = BookQuery::create()->add(BookPeer::PRICE, array(10, 11, 12), Criteria::NOT_IN); - $this->assertEquals($q1, $q, 'filterByNumColumn() accepts a comparison when passed a simple array key'); - - $q = BookQuery::create()->filterByPrice(array('min' => 10)); - $q1 = BookQuery::create()->add(BookPeer::PRICE, 10, Criteria::GREATER_EQUAL); - $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::GREATER_EQUAL when passed a \'min\' key'); - - $q = BookQuery::create()->filterByPrice(array('max' => 12)); - $q1 = BookQuery::create()->add(BookPeer::PRICE, 12, Criteria::LESS_EQUAL); - $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::LESS_EQUAL when passed a \'max\' key'); - - $q = BookQuery::create()->filterByPrice(array('min' => 10, 'max' => 12)); - $q1 = BookQuery::create() - ->add(BookPeer::PRICE, 10, Criteria::GREATER_EQUAL) - ->addAnd(BookPeer::PRICE, 12, Criteria::LESS_EQUAL); - $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a between when passed both a \'min\' and a \'max\' key'); - } - - public function testFilterByTimestamp() - { - $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(12); - $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a Criteria::EQUAL by default'); - - $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(12, Criteria::NOT_EQUAL); - $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::NOT_EQUAL); - $this->assertEquals($q1, $q, 'filterByDateColumn() accepts an optional comparison operator'); - - $q = BookstoreEmployeeAccountQuery::create()->setModelAlias('b', true)->filterByCreated(12); - $q1 = BookstoreEmployeeAccountQuery::create()->setModelAlias('b', true)->add('b.CREATED', 12, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByDateColumn() uses true table alias if set'); - - $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(array('min' => 10)); - $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 10, Criteria::GREATER_EQUAL); - $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a Criteria::GREATER_EQUAL when passed a \'min\' key'); - - $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(array('max' => 12)); - $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::LESS_EQUAL); - $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a Criteria::LESS_EQUAL when passed a \'max\' key'); - - $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(array('min' => 10, 'max' => 12)); - $q1 = BookstoreEmployeeAccountQuery::create() - ->add(BookstoreEmployeeAccountPeer::CREATED, 10, Criteria::GREATER_EQUAL) - ->addAnd(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::LESS_EQUAL); - $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a between when passed both a \'min\' and a \'max\' key'); - } - - public function testFilterByString() - { - $q = BookQuery::create()->filterByTitle('foo'); - $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo', Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::EQUAL by default'); - - $q = BookQuery::create()->filterByTitle('foo', Criteria::NOT_EQUAL); - $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo', Criteria::NOT_EQUAL); - $this->assertEquals($q1, $q, 'filterByStringColumn() accepts an optional comparison operator'); - - $q = BookQuery::create()->setModelAlias('b', true)->filterByTitle('foo'); - $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.TITLE', 'foo', Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByStringColumn() uses true table alias if set'); - - $q = BookQuery::create()->filterByTitle(array('foo', 'bar')); - $q1 = BookQuery::create()->add(BookPeer::TITLE, array('foo', 'bar'), Criteria::IN); - $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::IN when passed an array'); - - $q = BookQuery::create()->filterByTitle(array('foo', 'bar'), Criteria::NOT_IN); - $q1 = BookQuery::create()->add(BookPeer::TITLE, array('foo', 'bar'), Criteria::NOT_IN); - $this->assertEquals($q1, $q, 'filterByStringColumn() accepts a comparison when passed an array'); - - $q = BookQuery::create()->filterByTitle('foo%'); - $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo%', Criteria::LIKE); - $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::LIKE when passed a string with a % wildcard'); - - $q = BookQuery::create()->filterByTitle('foo%', Criteria::NOT_LIKE); - $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo%', Criteria::NOT_LIKE); - $this->assertEquals($q1, $q, 'filterByStringColumn() accepts a comparison when passed a string with a % wildcard'); - - $q = BookQuery::create()->filterByTitle('foo%', Criteria::EQUAL); - $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo%', Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByStringColumn() accepts a comparison when passed a string with a % wildcard'); - - $q = BookQuery::create()->filterByTitle('*foo'); - $q1 = BookQuery::create()->add(BookPeer::TITLE, '%foo', Criteria::LIKE); - $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::LIKE when passed a string with a * wildcard, and turns * into %'); - - $q = BookQuery::create()->filterByTitle('*f%o*o%'); - $q1 = BookQuery::create()->add(BookPeer::TITLE, '%f%o%o%', Criteria::LIKE); - $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::LIKE when passed a string with mixed wildcards, and turns *s into %s'); - } - - public function testFilterByBoolean() - { - $q = ReviewQuery::create()->filterByRecommended(true); - $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a Criteria::EQUAL by default'); - - $q = ReviewQuery::create()->filterByRecommended(true, Criteria::NOT_EQUAL); - $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::NOT_EQUAL); - $this->assertEquals($q1, $q, 'filterByBooleanColumn() accepts an optional comparison operator'); - - $q = ReviewQuery::create()->filterByRecommended(false); - $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a Criteria::EQUAL by default'); - - $q = ReviewQuery::create()->setModelAlias('b', true)->filterByRecommended(true); - $q1 = ReviewQuery::create()->setModelAlias('b', true)->add('b.RECOMMENDED', true, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByBooleanColumn() uses true table alias if set'); - - $q = ReviewQuery::create()->filterByRecommended('true'); - $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = true when passed a true string'); - - $q = ReviewQuery::create()->filterByRecommended('yes'); - $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = true when passed a true string'); - - $q = ReviewQuery::create()->filterByRecommended('1'); - $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = true when passed a true string'); - - $q = ReviewQuery::create()->filterByRecommended('false'); - $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = false when passed a false string'); - - $q = ReviewQuery::create()->filterByRecommended('no'); - $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = false when passed a false string'); - - $q = ReviewQuery::create()->filterByRecommended('0'); - $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = false when passed a false string'); - } - - public function testFilterByFk() - { - $this->assertTrue(method_exists('BookQuery', 'filterByAuthor'), 'QueryBuilder adds filterByFk() methods'); - $this->assertTrue(method_exists('BookQuery', 'filterByPublisher'), 'QueryBuilder adds filterByFk() methods for all fkeys'); - - $this->assertTrue(method_exists('EssayQuery', 'filterByAuthorRelatedByFirstAuthor'), 'QueryBuilder adds filterByFk() methods for several fkeys on the same table'); - $this->assertTrue(method_exists('EssayQuery', 'filterByAuthorRelatedBySecondAuthor'), 'QueryBuilder adds filterByFk() methods for several fkeys on the same table'); - } - - public function testFilterByFkSimpleKey() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - // prepare the test data - $testBook = BookQuery::create() - ->innerJoin('Book.Author') // just in case there are books with no author - ->findOne(); - $testAuthor = $testBook->getAuthor(); - - $book = BookQuery::create() - ->filterByAuthor($testAuthor) - ->findOne(); - $this->assertEquals($testBook, $book, 'Generated query handles filterByFk() methods correctly for simple fkeys'); - - $q = BookQuery::create()->filterByAuthor($testAuthor); - $q1 = BookQuery::create()->add(BookPeer::AUTHOR_ID, $testAuthor->getId(), Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByFk() translates to a Criteria::EQUAL by default'); - - $q = BookQuery::create()->filterByAuthor($testAuthor, Criteria::NOT_EQUAL); - $q1 = BookQuery::create()->add(BookPeer::AUTHOR_ID, $testAuthor->getId(), Criteria::NOT_EQUAL); - $this->assertEquals($q1, $q, 'filterByFk() accepts an optional comparison operator'); - } - - public function testFilterByFkCompositeKey() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - BookstoreDataPopulator::populateOpinionFavorite(); - - // prepare the test data - $testOpinion = BookOpinionQuery::create() - ->innerJoin('BookOpinion.ReaderFavorite') // just in case there are books with no author - ->findOne(); - $testFavorite = $testOpinion->getReaderFavorite(); - - $favorite = ReaderFavoriteQuery::create() - ->filterByBookOpinion($testOpinion) - ->findOne(); - $this->assertEquals($testFavorite, $favorite, 'Generated query handles filterByFk() methods correctly for composite fkeys'); - } - - public function testFilterByRefFk() - { - $this->assertTrue(method_exists('BookQuery', 'filterByReview'), 'QueryBuilder adds filterByRefFk() methods'); - $this->assertTrue(method_exists('BookQuery', 'filterByMedia'), 'QueryBuilder adds filterByRefFk() methods for all fkeys'); - - $this->assertTrue(method_exists('AuthorQuery', 'filterByEssayRelatedByFirstAuthor'), 'QueryBuilder adds filterByRefFk() methods for several fkeys on the same table'); - $this->assertTrue(method_exists('AuthorQuery', 'filterByEssayRelatedBySecondAuthor'), 'QueryBuilder adds filterByRefFk() methods for several fkeys on the same table'); - } - - public function testFilterByRefFkSimpleKey() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - // prepare the test data - $testBook = BookQuery::create() - ->innerJoin('Book.Author') // just in case there are books with no author - ->findOne(); - $testAuthor = $testBook->getAuthor(); - - $author = AuthorQuery::create() - ->filterByBook($testBook) - ->findOne(); - $this->assertEquals($testAuthor, $author, 'Generated query handles filterByRefFk() methods correctly for simple fkeys'); - - $q = AuthorQuery::create()->filterByBook($testBook); - $q1 = AuthorQuery::create()->add(AuthorPeer::ID, $testBook->getAuthorId(), Criteria::EQUAL); - $this->assertEquals($q1, $q, 'filterByRefFk() translates to a Criteria::EQUAL by default'); - - $q = AuthorQuery::create()->filterByBook($testBook, Criteria::NOT_EQUAL); - $q1 = AuthorQuery::create()->add(AuthorPeer::ID, $testBook->getAuthorId(), Criteria::NOT_EQUAL); - $this->assertEquals($q1, $q, 'filterByRefFk() accepts an optional comparison operator'); - } - - public function testFilterByRefFkCompositeKey() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - BookstoreDataPopulator::populateOpinionFavorite(); - - // prepare the test data - $testOpinion = BookOpinionQuery::create() - ->innerJoin('BookOpinion.ReaderFavorite') // just in case there are books with no author - ->findOne(); - $testFavorite = $testOpinion->getReaderFavorite(); - - $opinion = BookOpinionQuery::create() - ->filterByReaderFavorite($testFavorite) - ->findOne(); - $this->assertEquals($testOpinion, $opinion, 'Generated query handles filterByRefFk() methods correctly for composite fkeys'); - } - - public function testFilterByCrossFK() - { - $this->assertTrue(method_exists('BookQuery', 'filterByBookClubList'), 'Generated query handles filterByCrossRefFK() for many-to-many relationships'); - $this->assertFalse(method_exists('BookQuery', 'filterByBook'), 'Generated query handles filterByCrossRefFK() for many-to-many relationships'); - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - $blc1 = BookClubListQuery::create()->findOneByGroupLeader('Crazyleggs'); - $nbBooks = BookQuery::create() - ->filterByBookClubList($blc1) - ->count(); - $this->assertEquals(2, $nbBooks, 'Generated query handles filterByCrossRefFK() methods correctly'); - } - - public function testJoinFk() - { - $q = BookQuery::create() - ->joinAuthor(); - $q1 = BookQuery::create() - ->join('Book.Author', Criteria::LEFT_JOIN); - $this->assertTrue($q->equals($q1), 'joinFk() translates to a left join on non-required columns'); - - $q = ReviewQuery::create() - ->joinBook(); - $q1 = ReviewQuery::create() - ->join('Review.Book', Criteria::INNER_JOIN); - $this->assertTrue($q->equals($q1), 'joinFk() translates to an inner join on required columns'); - - $q = BookQuery::create() - ->joinAuthor('a'); - $q1 = BookQuery::create() - ->join('Book.Author a', Criteria::LEFT_JOIN); - $this->assertTrue($q->equals($q1), 'joinFk() accepts a relation alias as first parameter'); - - $q = BookQuery::create() - ->joinAuthor('', Criteria::INNER_JOIN); - $q1 = BookQuery::create() - ->join('Book.Author', Criteria::INNER_JOIN); - $this->assertTrue($q->equals($q1), 'joinFk() accepts a join type as second parameter'); - - $q = EssayQuery::create() - ->joinAuthorRelatedBySecondAuthor(); - $q1 = EssayQuery::create() - ->join('Essay.AuthorRelatedBySecondAuthor', "INNER JOIN"); - $this->assertTrue($q->equals($q1), 'joinFk() translates to a "INNER JOIN" when this is defined as defaultJoin in the schema'); - } - - public function testJoinFkAlias() - { - $q = BookQuery::create('b') - ->joinAuthor('a'); - $q1 = BookQuery::create('b') - ->join('b.Author a', Criteria::LEFT_JOIN); - $this->assertTrue($q->equals($q1), 'joinFk() works fine with table aliases'); - - $q = BookQuery::create() - ->setModelAlias('b', true) - ->joinAuthor('a'); - $q1 = BookQuery::create() - ->setModelAlias('b', true) - ->join('b.Author a', Criteria::LEFT_JOIN); - $this->assertTrue($q->equals($q1), 'joinFk() works fine with true table aliases'); - } - - public function testJoinRefFk() - { - $q = AuthorQuery::create() - ->joinBook(); - $q1 = AuthorQuery::create() - ->join('Author.Book', Criteria::LEFT_JOIN); - $this->assertTrue($q->equals($q1), 'joinRefFk() translates to a left join on non-required columns'); - - $q = BookQuery::create() - ->joinreview(); - $q1 = BookQuery::create() - ->join('Book.Review', Criteria::INNER_JOIN); - $this->assertTrue($q->equals($q1), 'joinRefFk() translates to an inner join on required columns'); - - $q = AuthorQuery::create() - ->joinBook('b'); - $q1 = AuthorQuery::create() - ->join('Author.Book b', Criteria::LEFT_JOIN); - $this->assertTrue($q->equals($q1), 'joinRefFk() accepts a relation alias as first parameter'); - - $q = AuthorQuery::create() - ->joinBook('', Criteria::INNER_JOIN); - $q1 = AuthorQuery::create() - ->join('Author.Book', Criteria::INNER_JOIN); - $this->assertTrue($q->equals($q1), 'joinRefFk() accepts a join type as second parameter'); - - $q = AuthorQuery::create() - ->joinEssayRelatedBySecondAuthor(); - $q1 = AuthorQuery::create() - ->join('Author.EssayRelatedBySecondAuthor', Criteria::INNER_JOIN); - $this->assertTrue($q->equals($q1), 'joinRefFk() translates to a "INNER JOIN" when this is defined as defaultJoin in the schema'); - } - - public function testUseFkQuerySimple() - { - $q = BookQuery::create() - ->useAuthorQuery() - ->filterByFirstName('Leo') - ->endUse(); - $q1 = BookQuery::create() - ->join('Book.Author', Criteria::LEFT_JOIN) - ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL); - $this->assertTrue($q->equals($q1), 'useFkQuery() translates to a condition on a left join on non-required columns'); - - $q = ReviewQuery::create() - ->useBookQuery() - ->filterByTitle('War And Peace') - ->endUse(); - $q1 = ReviewQuery::create() - ->join('Review.Book', Criteria::INNER_JOIN) - ->add(BookPeer::TITLE, 'War And Peace', Criteria::EQUAL); - $this->assertTrue($q->equals($q1), 'useFkQuery() translates to a condition on aninner join on required columns'); - } - - public function testUseFkQueryJoinType() - { - $q = BookQuery::create() - ->useAuthorQuery(null, Criteria::LEFT_JOIN) - ->filterByFirstName('Leo') - ->endUse(); - $q1 = BookQuery::create() - ->join('Book.Author', Criteria::LEFT_JOIN) - ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL); - $this->assertTrue($q->equals($q1), 'useFkQuery() accepts a join type as second parameter'); - } - - public function testUseFkQueryAlias() - { - $q = BookQuery::create() - ->useAuthorQuery('a') - ->filterByFirstName('Leo') - ->endUse(); - $join = new ModelJoin(); - $join->setJoinType(Criteria::LEFT_JOIN); - $join->setTableMap(AuthorPeer::getTableMap()); - $join->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'a'); - $join->setRelationAlias('a'); - $q1 = BookQuery::create() - ->addAlias('a', AuthorPeer::TABLE_NAME) - ->addJoinObject($join, 'a') - ->add('a.FIRST_NAME', 'Leo', Criteria::EQUAL); - $this->assertTrue($q->equals($q1), 'useFkQuery() uses the first argument as a table alias'); - } - - public function testUseFkQueryMixed() - { - $q = BookQuery::create() - ->useAuthorQuery() - ->filterByFirstName('Leo') - ->endUse() - ->filterByTitle('War And Peace'); - $q1 = BookQuery::create() - ->join('Book.Author', Criteria::LEFT_JOIN) - ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL) - ->add(BookPeer::TITLE, 'War And Peace', Criteria::EQUAL); - $this->assertTrue($q->equals($q1), 'useFkQuery() allows combining conditions on main and related query'); - } - - public function testUseFkQueryTwice() - { - $q = BookQuery::create() - ->useAuthorQuery() - ->filterByFirstName('Leo') - ->endUse() - ->useAuthorQuery() - ->filterByLastName('Tolstoi') - ->endUse(); - $q1 = BookQuery::create() - ->join('Book.Author', Criteria::LEFT_JOIN) - ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL) - ->add(AuthorPeer::LAST_NAME, 'Tolstoi', Criteria::EQUAL); - $this->assertTrue($q->equals($q1), 'useFkQuery() called twice on the same relation does not create two joins'); - } - - public function testUseFkQueryTwiceTwoAliases() - { - $q = BookQuery::create() - ->useAuthorQuery('a') - ->filterByFirstName('Leo') - ->endUse() - ->useAuthorQuery('b') - ->filterByLastName('Tolstoi') - ->endUse(); - $join1 = new ModelJoin(); - $join1->setJoinType(Criteria::LEFT_JOIN); - $join1->setTableMap(AuthorPeer::getTableMap()); - $join1->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'a'); - $join1->setRelationAlias('a'); - $join2 = new ModelJoin(); - $join2->setJoinType(Criteria::LEFT_JOIN); - $join2->setTableMap(AuthorPeer::getTableMap()); - $join2->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'b'); - $join2->setRelationAlias('b'); - $q1 = BookQuery::create() - ->addAlias('a', AuthorPeer::TABLE_NAME) - ->addJoinObject($join1, 'a') - ->add('a.FIRST_NAME', 'Leo', Criteria::EQUAL) - ->addAlias('b', AuthorPeer::TABLE_NAME) - ->addJoinObject($join2, 'b') - ->add('b.LAST_NAME', 'Tolstoi', Criteria::EQUAL); - $this->assertTrue($q->equals($q1), 'useFkQuery() called twice on the same relation with two aliases creates two joins'); - } - - public function testUseFkQueryNested() - { - $q = ReviewQuery::create() - ->useBookQuery() - ->useAuthorQuery() - ->filterByFirstName('Leo') - ->endUse() - ->endUse(); - $q1 = ReviewQuery::create() - ->join('Review.Book', Criteria::INNER_JOIN) - ->join('Book.Author', Criteria::LEFT_JOIN) - ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL); - // embedded queries create joins that keep a relation to the parent - // as this is not testable, we need to use another testing technique - $params = array(); - $result = BasePeer::createSelectSql($q, $params); - $expectedParams = array(); - $expectedResult = BasePeer::createSelectSql($q1, $expectedParams); - $this->assertEquals($expectedParams, $params, 'useFkQuery() called nested creates two joins'); - $this->assertEquals($expectedResult, $result, 'useFkQuery() called nested creates two joins'); - } - - public function testUseFkQueryTwoRelations() - { - $q = BookQuery::create() - ->useAuthorQuery() - ->filterByFirstName('Leo') - ->endUse() - ->usePublisherQuery() - ->filterByName('Penguin') - ->endUse(); - $q1 = BookQuery::create() - ->join('Book.Author', Criteria::LEFT_JOIN) - ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL) - ->join('Book.Publisher', Criteria::LEFT_JOIN) - ->add(PublisherPeer::NAME, 'Penguin', Criteria::EQUAL); - $this->assertTrue($q->equals($q1), 'useFkQuery() called twice on two relations creates two joins'); - } - - public function testPrune() - { - $q = BookQuery::create()->prune(); - $this->assertTrue($q instanceof BookQuery, 'prune() returns the current Query object'); - } - - public function testPruneSimpleKey() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - $nbBooks = BookQuery::create()->prune()->count(); - $this->assertEquals(4, $nbBooks, 'prune() does nothing when passed a null object'); - - $testBook = BookQuery::create()->findOne(); - $nbBooks = BookQuery::create()->prune($testBook)->count(); - $this->assertEquals(3, $nbBooks, 'prune() removes an object from the result'); - } - - public function testPruneCompositeKey() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->find(); - foreach ($books as $book) { - $book->save(); - } - - BookPeer::clearInstancePool(); - - $nbBookListRel = BookListRelQuery::create()->prune()->count(); - $this->assertEquals(2, $nbBookListRel, 'prune() does nothing when passed a null object'); - - $testBookListRel = BookListRelQuery::create()->findOne(); - $nbBookListRel = BookListRelQuery::create()->prune($testBookListRel)->count(); - $this->assertEquals(1, $nbBookListRel, 'prune() removes an object from the result'); - } -} - -class myCustomBookQuery extends BookQuery -{ - public static function create($modelAlias = null, $criteria = null) - { - if ($criteria instanceof myCustomBookQuery) { - return $criteria; - } - $query = new myCustomBookQuery(); - if (null !== $modelAlias) { - $query->setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - return $query; - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/util/PropelTemplateTest.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/util/PropelTemplateTest.php deleted file mode 100644 index bba32ac12c..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/util/PropelTemplateTest.php +++ /dev/null @@ -1,54 +0,0 @@ -setTemplate('Hello, '); - $res = $t->render(); - $this->assertEquals('Hello, 3', $res); - } - - public function testRenderStringOneParam() - { - $t = new PropelTemplate(); - $t->setTemplate('Hello, '); - $res = $t->render(array('name' => 'John')); - $this->assertEquals('Hello, John', $res); - } - - public function testRenderStringParams() - { - $time = time(); - $t = new PropelTemplate(); - $t->setTemplate('Hello, , it is to go!'); - $res = $t->render(array('name' => 'John', 'time' => $time)); - $this->assertEquals('Hello, John, it is ' . $time . ' to go!', $res); - } - - public function testRenderFile() - { - $t = new PropelTemplate(); - $t->setTemplateFile(dirname(__FILE__).'/template.php'); - $res = $t->render(array('name' => 'John')); - $this->assertEquals('Hello, John', $res); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/builder/util/template.php b/airtime_mvc/library/propel/test/testsuite/generator/builder/util/template.php deleted file mode 100644 index 2ae040501a..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/builder/util/template.php +++ /dev/null @@ -1 +0,0 @@ -Hello, \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/model/BehaviorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/model/BehaviorTest.php deleted file mode 100644 index af1daecb83..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/model/BehaviorTest.php +++ /dev/null @@ -1,113 +0,0 @@ -Martin Poeschl - * @version $Revision: 1773 $ - * @package generator.model - */ -class BehaviorTest extends PHPUnit_Framework_TestCase { - - private $xmlToAppData; - private $appData; - - public function testSetupObject() - { - $b = new Behavior(); - $b->loadFromXML(array('name' => 'foo')); - $this->assertEquals($b->getName(), 'foo', 'setupObject() sets the Behavior name from XML attributes'); - } - - public function testName() - { - $b = new Behavior(); - $this->assertNull($b->getName(), 'Behavior name is null by default'); - $b->setName('foo'); - $this->assertEquals($b->getName(), 'foo', 'setName() sets the name, and getName() gets it'); - } - - public function testTable() - { - $b = new Behavior(); - $this->assertNull($b->getTable(), 'Behavior Table is null by default'); - $t = new Table(); - $t->setName('fooTable'); - $b->setTable($t); - $this->assertEquals($b->getTable(), $t, 'setTable() sets the name, and getTable() gets it'); - } - - public function testParameters() - { - $b = new Behavior(); - $this->assertEquals($b->getParameters(), array(), 'Behavior parameters is an empty array by default'); - $b->addParameter(array('name' => 'foo', 'value' => 'bar')); - $this->assertEquals($b->getParameters(), array('foo' => 'bar'), 'addParameter() sets a parameter from an associative array'); - $b->addParameter(array('name' => 'foo2', 'value' => 'bar2')); - $this->assertEquals($b->getParameters(), array('foo' => 'bar', 'foo2' => 'bar2'), 'addParameter() adds a parameter from an associative array'); - $b->addParameter(array('name' => 'foo', 'value' => 'bar3')); - $this->assertEquals($b->getParameters(), array('foo' => 'bar3', 'foo2' => 'bar2'), 'addParameter() changes a parameter from an associative array'); - $this->assertEquals($b->getParameter('foo'), 'bar3', 'getParameter() retrieves a parameter value by name'); - $b->setParameters(array('foo3' => 'bar3', 'foo4' => 'bar4')); - $this->assertEquals($b->getParameters(), array('foo3' => 'bar3', 'foo4' => 'bar4'), 'setParameters() changes the whole parameter array'); - } - - /** - * test if the tables get the package name from the properties file - * - */ - public function testXmlToAppData() - { - include_once 'builder/util/XmlToAppData.php'; - $this->xmlToAppData = new XmlToAppData(new MysqlPlatform(), "defaultpackage", null); - $this->appData = $this->xmlToAppData->parseFile('fixtures/bookstore/behavior-timestampable-schema.xml'); - $table = $this->appData->getDatabase("bookstore-behavior")->getTable('table1'); - $behaviors = $table->getBehaviors(); - $this->assertEquals(count($behaviors), 1, 'XmlToAppData ads as many behaviors as there are behaviors tags'); - $behavior = $table->getBehavior('timestampable'); - $this->assertEquals($behavior->getTable()->getName(), 'table1', 'XmlToAppData sets the behavior table correctly'); - $this->assertEquals($behavior->getParameters(), array('create_column' => 'created_on', 'update_column' => 'updated_on'), 'XmlToAppData sets the behavior parameters correctly'); - } - - public function testMofifyTable() - { - set_include_path(get_include_path() . PATH_SEPARATOR . "fixtures/bookstore/build/classes"); - Propel::init('fixtures/bookstore/build/conf/bookstore-conf.php'); - $tmap = Propel::getDatabaseMap(Table2Peer::DATABASE_NAME)->getTable(Table2Peer::TABLE_NAME); - $this->assertEquals(count($tmap->getColumns()), 4, 'A behavior can modify its table by implementing modifyTable()'); - } - - public function testModifyDatabase() - { - set_include_path(get_include_path() . PATH_SEPARATOR . "fixtures/bookstore/build/classes"); - require_once dirname(__FILE__) . '/../../../../runtime/lib/Propel.php'; - Propel::init('fixtures/bookstore/build/conf/bookstore-conf.php'); - $tmap = Propel::getDatabaseMap(Table3Peer::DATABASE_NAME)->getTable(Table3Peer::TABLE_NAME); - $this->assertTrue(array_key_exists('do_nothing', $tmap->getBehaviors()), 'A database behavior is automatically copied to all its table'); - } - - public function testGetColumnForParameter() - { - $this->xmlToAppData = new XmlToAppData(new MysqlPlatform(), "defaultpackage", null); - $this->appData = $this->xmlToAppData->parseFile('fixtures/bookstore/behavior-timestampable-schema.xml'); - - $table = $this->appData->getDatabase("bookstore-behavior")->getTable('table1'); - $behavior = $table->getBehavior('timestampable'); - $this->assertEquals($table->getColumn('created_on'), $behavior->getColumnForParameter('create_column'), 'getColumnForParameter() returns the configured column for behavior based on a parameter name'); - - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/model/ColumnTest.php b/airtime_mvc/library/propel/test/testsuite/generator/model/ColumnTest.php deleted file mode 100644 index dbaf694329..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/model/ColumnTest.php +++ /dev/null @@ -1,81 +0,0 @@ -Martin Poeschl - * @version $Revision: 1612 $ - * @package generator.model - */ -class ColumnTest extends PHPUnit_Framework_TestCase { - - /** - * Tests static Column::makeList() method. - * @deprecated - Column::makeList() is deprecated and set to be removed in 1.3 - */ - public function testMakeList() - { - $expected = "`Column0`, `Column1`, `Column2`, `Column3`, `Column4`"; - $objArray = array(); - for ($i=0; $i<5; $i++) { - $c = new Column(); - $c->setName("Column" . $i); - $objArray[] = $c; - } - - $list = Column::makeList($objArray, new MySQLPlatform()); - $this->assertEquals($expected, $list, sprintf("Expected '%s' match, got '%s' ", var_export($expected, true), var_export($list,true))); - - $strArray = array(); - for ($i=0; $i<5; $i++) { - $strArray[] = "Column" . $i; - } - - $list = Column::makeList($strArray, new MySQLPlatform()); - $this->assertEquals($expected, $list, sprintf("Expected '%s' match, got '%s' ", var_export($expected, true), var_export($list,true))); - - } - - public function testPhpNamingMethod() - { - set_include_path(get_include_path() . PATH_SEPARATOR . "fixtures/bookstore/build/classes"); - Propel::init('fixtures/bookstore/build/conf/bookstore-conf.php'); - $bookTmap = Propel::getDatabaseMap(BookPeer::DATABASE_NAME)->getTable(BookPeer::TABLE_NAME); - $this->assertEquals('AuthorId', $bookTmap->getColumn('AUTHOR_ID')->getPhpName(), 'setPhpName() uses the default phpNamingMethod'); - $pageTmap = Propel::getDatabaseMap(PagePeer::DATABASE_NAME)->getTable(PagePeer::TABLE_NAME); - $this->assertEquals('LeftChild', $pageTmap->getColumn('LEFTCHILD')->getPhpName(), 'setPhpName() uses the configured phpNamingMethod'); - } - - public function testGetConstantName() - { - $xmlToAppData = new XmlToAppData(new MysqlPlatform(), "defaultpackage", null); - $appData = $xmlToAppData->parseFile('fixtures/bookstore/behavior-timestampable-schema.xml'); - $column = $appData->getDatabase("bookstore-behavior")->getTable('table1')->getColumn('title'); - $this->assertEquals('Table1Peer::TITLE', $column->getConstantName(), 'getConstantName() returns the complete constant name by default'); - } - - public function testIsLocalColumnsRequired() - { - $xmlToAppData = new XmlToAppData(new MysqlPlatform(), "defaultpackage", null); - $appData = $xmlToAppData->parseFile('fixtures/bookstore/schema.xml'); - $fk = $appData->getDatabase("bookstore")->getTable('book')->getColumnForeignKeys('publisher_id'); - $this->assertFalse($fk[0]->isLocalColumnsRequired()); - $fk = $appData->getDatabase("bookstore")->getTable('review')->getColumnForeignKeys('book_id'); - $this->assertTrue($fk[0]->isLocalColumnsRequired()); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/model/NameFactoryTest.php b/airtime_mvc/library/propel/test/testsuite/generator/model/NameFactoryTest.php deleted file mode 100644 index e65ae05f4a..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/model/NameFactoryTest.php +++ /dev/null @@ -1,151 +0,0 @@ -Unit tests for class NameFactory and known - * NameGenerator implementations.

- * - *

To add more tests, add entries to the ALGORITHMS, - * INPUTS, and OUTPUTS arrays, and code to - * the makeInputs() method.

- * - *

This test assumes that it's being run using the MySQL database - * adapter, DBMM. MySQL has a column length limit of 64 - * characters.

- * - * @author Daniel Rall - * @version $Id: NameFactoryTest.php 1612 2010-03-16 22:56:21Z francois $ - * @package generator.model - */ -class NameFactoryTest extends BaseTestCase -{ - /** The database to mimic in generating the SQL. */ - const DATABASE_TYPE = "mysql"; - - /** - * The list of known name generation algorithms, specified as the - * fully qualified class names to NameGenerator - * implementations. - */ - private static $ALGORITHMS = array(NameFactory::CONSTRAINT_GENERATOR, NameFactory::PHP_GENERATOR); - - /** - * Two dimensional arrays of inputs for each algorithm. - */ - private static $INPUTS = array(); - - - /** - * Given the known inputs, the expected name outputs. - */ - private static $OUTPUTS = array(); - - /** - * Used as an input. - */ - private $database; - - /** - * Creates a new instance. - * - */ - public function __construct() { - - self::$INPUTS = array( - array( array(self::makeString(61), "I", 1), - array(self::makeString(61), "I", 2), - array(self::makeString(65), "I", 3), - array(self::makeString(4), "FK", 1), - array(self::makeString(5), "FK", 2) - ), - array( - array("MY_USER", NameGenerator::CONV_METHOD_UNDERSCORE), - array("MY_USER", NameGenerator::CONV_METHOD_PHPNAME), - array("MY_USER", NameGenerator::CONV_METHOD_NOCHANGE) - ) - ); - - - self::$OUTPUTS = array( - array( - self::makeString(60) . "_I_1", - self::makeString(60) . "_I_2", - self::makeString(60) . "_I_3", - self::makeString(4) . "_FK_1", - self::makeString(5) . "_FK_2"), - array("MyUser", "MYUSER", "MY_USER") - ); - - } - - /** - * Creates a string of the specified length consisting entirely of - * the character A. Useful for simulating table - * names, etc. - * - * @param int $len the number of characters to include in the string - * @return a string of length len with every character an 'A' - */ - private static function makeString($len) { - $buf = ""; - for ($i = 0; $i < $len; $i++) { - $buf .= 'A'; - } - return $buf; - } - - /** Sets up the Propel model. */ - public function setUp() - { - $appData = new AppData(new MysqlPlatform()); - $this->database = new Database(); - $appData->addDatabase($this->database); - } - - /** - * @throws Exception on fail - */ - public function testNames() { - for ($algoIndex = 0; $algoIndex < count(self::$ALGORITHMS); $algoIndex++) { - $algo = self::$ALGORITHMS[$algoIndex]; - $algoInputs = self::$INPUTS[$algoIndex]; - for ($i = 0; $i < count($algoInputs); $i++) { - $inputs = $this->makeInputs($algo, $algoInputs[$i]); - $generated = NameFactory::generateName($algo, $inputs); - $expected = self::$OUTPUTS[$algoIndex][$i]; - $this->assertEquals($expected, $generated, 0, "Algorithm " . $algo . " failed to generate an unique name"); - } - } - } - - /** - * Creates the list of arguments to pass to the specified type of - * NameGenerator implementation. - * - * @param algo The class name of the NameGenerator to - * create an argument list for. - * @param inputs The (possibly partial) list inputs from which to - * generate the final list. - * @return the list of arguments to pass to the NameGenerator - */ - private function makeInputs($algo, $inputs) - { - if (NameFactory::CONSTRAINT_GENERATOR == $algo) { - array_unshift($inputs, $this->database); - } - return $inputs; - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/model/PhpNameGeneratorTest.php b/airtime_mvc/library/propel/test/testsuite/generator/model/PhpNameGeneratorTest.php deleted file mode 100644 index ecde25cc69..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/model/PhpNameGeneratorTest.php +++ /dev/null @@ -1,55 +0,0 @@ -Martin Poeschl - * @version $Revision: 1612 $ - * @package generator.model - */ -class PhpNameGeneratorTest extends PHPUnit_Framework_TestCase -{ - public static function testPhpnameMethodDataProvider() - { - return array( - array('foo', 'Foo'), - array('Foo', 'Foo'), - array('FOO', 'FOO'), - array('123', '123'), - array('foo_bar', 'FooBar'), - array('bar_1', 'Bar1'), - array('bar_0', 'Bar0'), - array('my_CLASS_name', 'MyCLASSName'), - ); - } - - /** - * @dataProvider testPhpnameMethodDataProvider - */ - public function testPhpnameMethod($input, $output) - { - $generator = new TestablePhpNameGenerator(); - $this->assertEquals($output, $generator->phpnameMethod($input)); - } - -} - -class TestablePhpNameGenerator extends PhpNameGenerator -{ - public function phpnameMethod($schemaName) - { - return parent::phpnameMethod($schemaName); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/generator/model/TableTest.php b/airtime_mvc/library/propel/test/testsuite/generator/model/TableTest.php deleted file mode 100644 index d77a52f1ac..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/model/TableTest.php +++ /dev/null @@ -1,109 +0,0 @@ -xmlToAppData = new XmlToAppData(new MysqlPlatform(), "defaultpackage", null); - - //$this->appData = $this->xmlToAppData->parseFile(dirname(__FILE__) . "/tabletest-schema.xml"); - $this->appData = $this->xmlToAppData->parseFile("etc/schema/tabletest-schema.xml"); - - $db = $this->appData->getDatabase("iddb"); - $expected = IDMethod::NATIVE; - $result = $db->getDefaultIdMethod(); - $this->assertEquals($expected, $result); - - $table2 = $db->getTable("table_native"); - $expected = IDMethod::NATIVE; - $result = $table2->getIdMethod(); - $this->assertEquals($expected, $result); - - $table = $db->getTable("table_none"); - $expected = IDMethod::NO_ID_METHOD; - $result = $table->getIdMethod(); - $this->assertEquals($expected, $result); - } - - public function testGeneratorConfig() - { - $xmlToAppData = new XmlToAppData(new MysqlPlatform(), "defaultpackage", null); - $appData = $xmlToAppData->parseFile('fixtures/bookstore/behavior-timestampable-schema.xml'); - $table = $appData->getDatabase("bookstore-behavior")->getTable('table1'); - $config = new GeneratorConfig(); - $config->setBuildProperties(array('propel.foo.bar.class' => 'bazz')); - $table->getDatabase()->getAppData()->getPlatform()->setGeneratorConfig($config); - $this->assertThat($table->getGeneratorConfig(), $this->isInstanceOf('GeneratorConfig'), 'getGeneratorConfig() returns an instance of the generator configuration'); - $this->assertEquals($table->getGeneratorConfig()->getBuildProperty('fooBarClass'), 'bazz', 'getGeneratorConfig() returns the instance of the generator configuration used in the platform'); - } - - public function testAddBehavior() - { - $platform = new MysqlPlatform(); - $config = new GeneratorConfig(); - $config->setBuildProperties(array( - 'propel.behavior.timestampable.class' => 'behavior.TimestampableBehavior' - )); - $platform->setGeneratorConfig($config); - $xmlToAppData = new XmlToAppData($platform, "defaultpackage", null); - $appData = $xmlToAppData->parseFile('fixtures/bookstore/behavior-timestampable-schema.xml'); - $table = $appData->getDatabase("bookstore-behavior")->getTable('table1'); - $this->assertThat($table->getBehavior('timestampable'), $this->isInstanceOf('TimestampableBehavior'), 'addBehavior() uses the behavior class defined in build.properties'); - } - - public function testUniqueColumnName() - { - $platform = new MysqlPlatform(); - $config = new GeneratorConfig(); - $platform->setGeneratorConfig($config); - $xmlToAppData = new XmlToAppData($platform, 'defaultpackage', null); - try - { - $appData = $xmlToAppData->parseFile('fixtures/unique-column/column-schema.xml'); - $this->fail('Parsing file with duplicate column names in one table throws exception'); - } catch (EngineException $e) { - $this->assertTrue(true, 'Parsing file with duplicate column names in one table throws exception'); - } - } - - public function testUniqueTableName() - { - $platform = new MysqlPlatform(); - $config = new GeneratorConfig(); - $platform->setGeneratorConfig($config); - $xmlToAppData = new XmlToAppData($platform, 'defaultpackage', null); - try { - $appData = $xmlToAppData->parseFile('fixtures/unique-column/table-schema.xml'); - $this->fail('Parsing file with duplicate table name throws exception'); - } catch (EngineException $e) { - $this->assertTrue(true, 'Parsing file with duplicate table name throws exception'); - } - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/platform/DefaultPlatformTest.php b/airtime_mvc/library/propel/test/testsuite/generator/platform/DefaultPlatformTest.php deleted file mode 100644 index db1c91ef9e..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/platform/DefaultPlatformTest.php +++ /dev/null @@ -1,45 +0,0 @@ -getPlatform(); - - $unquoted = "Nice"; - $quoted = $p->quote($unquoted); - - $this->assertEquals("'$unquoted'", $quoted); - - - $unquoted = "Naughty ' string"; - $quoted = $p->quote($unquoted); - $expected = "'Naughty '' string'"; - $this->assertEquals($expected, $quoted); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/platform/PlatformTestBase.php b/airtime_mvc/library/propel/test/testsuite/generator/platform/PlatformTestBase.php deleted file mode 100644 index f384ca8c01..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/platform/PlatformTestBase.php +++ /dev/null @@ -1,55 +0,0 @@ -platform = new $clazz(); - } - - /** - * - */ - protected function tearDown() - { - parent::tearDown(); - } - - /** - * - * @return Platform - */ - protected function getPlatform() - { - return $this->platform; - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/generator/platform/SqlitePlatformTest.php b/airtime_mvc/library/propel/test/testsuite/generator/platform/SqlitePlatformTest.php deleted file mode 100644 index 4380485e32..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/generator/platform/SqlitePlatformTest.php +++ /dev/null @@ -1,48 +0,0 @@ -pdo = new PDO("sqlite::memory:"); - - } - - public function tearDown() - { - parent::tearDown(); - } - - public function testQuoteConnected() - { - $p = $this->getPlatform(); - $p->setConnection($this->pdo); - - $unquoted = "Naughty ' string"; - $quoted = $p->quote($unquoted); - - $expected = "'Naughty '' string'"; - $this->assertEquals($expected, $quoted); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/misc/BookstoreTest.php b/airtime_mvc/library/propel/test/testsuite/misc/BookstoreTest.php deleted file mode 100644 index c0f63e28e5..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/misc/BookstoreTest.php +++ /dev/null @@ -1,870 +0,0 @@ - - * @package misc - */ -class BookstoreTest extends BookstoreEmptyTestBase -{ - public function testScenario() - { - // Add publisher records - // --------------------- - - try { - $scholastic = new Publisher(); - $scholastic->setName("Scholastic"); - // do not save, will do later to test cascade - - $morrow = new Publisher(); - $morrow->setName("William Morrow"); - $morrow->save(); - $morrow_id = $morrow->getId(); - - $penguin = new Publisher(); - $penguin->setName("Penguin"); - $penguin->save(); - $penguin_id = $penguin->getId(); - - $vintage = new Publisher(); - $vintage->setName("Vintage"); - $vintage->save(); - $vintage_id = $vintage->getId(); - $this->assertTrue(true, 'Save Publisher records'); - } catch (Exception $e) { - $this->fail('Save publisher records'); - } - - // Add author records - // ------------------ - - try { - $rowling = new Author(); - $rowling->setFirstName("J.K."); - $rowling->setLastName("Rowling"); - // do not save, will do later to test cascade - - $stephenson = new Author(); - $stephenson->setFirstName("Neal"); - $stephenson->setLastName("Stephenson"); - $stephenson->save(); - $stephenson_id = $stephenson->getId(); - - $byron = new Author(); - $byron->setFirstName("George"); - $byron->setLastName("Byron"); - $byron->save(); - $byron_id = $byron->getId(); - - $grass = new Author(); - $grass->setFirstName("Gunter"); - $grass->setLastName("Grass"); - $grass->save(); - $grass_id = $grass->getId(); - $this->assertTrue(true, 'Save Author records'); - } catch (Exception $e) { - $this->fail('Save Author records'); - } - - // Add book records - // ---------------- - - try { - $phoenix = new Book(); - $phoenix->setTitle("Harry Potter and the Order of the Phoenix"); - $phoenix->setISBN("043935806X"); - $phoenix->setAuthor($rowling); - $phoenix->setPublisher($scholastic); - $phoenix->save(); - $phoenix_id = $phoenix->getId(); - $this->assertFalse($rowling->isNew(), 'saving book also saves related author'); - $this->assertFalse($scholastic->isNew(), 'saving book also saves related publisher'); - - $qs = new Book(); - $qs->setISBN("0380977427"); - $qs->setTitle("Quicksilver"); - $qs->setAuthor($stephenson); - $qs->setPublisher($morrow); - $qs->save(); - $qs_id = $qs->getId(); - - $dj = new Book(); - $dj->setISBN("0140422161"); - $dj->setTitle("Don Juan"); - $dj->setAuthor($byron); - $dj->setPublisher($penguin); - $dj->save(); - $dj_id = $qs->getId(); - - $td = new Book(); - $td->setISBN("067972575X"); - $td->setTitle("The Tin Drum"); - $td->setAuthor($grass); - $td->setPublisher($vintage); - $td->save(); - $td_id = $td->getId(); - $this->assertTrue(true, 'Save Book records'); - } catch (Exception $e) { - $this->fail('Save Author records'); - } - - // Add review records - // ------------------ - - try { - $r1 = new Review(); - $r1->setBook($phoenix); - $r1->setReviewedBy("Washington Post"); - $r1->setRecommended(true); - $r1->setReviewDate(time()); - $r1->save(); - $r1_id = $r1->getId(); - - $r2 = new Review(); - $r2->setBook($phoenix); - $r2->setReviewedBy("New York Times"); - $r2->setRecommended(false); - $r2->setReviewDate(time()); - $r2->save(); - $r2_id = $r2->getId(); - $this->assertTrue(true, 'Save Review records'); - } catch (Exception $e) { - $this->fail('Save Review records'); - } - - // Perform a "complex" search - // -------------------------- - - $crit = new Criteria(); - $crit->add(BookPeer::TITLE, 'Harry%', Criteria::LIKE); - $results = BookPeer::doSelect($crit); - $this->assertEquals(1, count($results)); - - $crit2 = new Criteria(); - $crit2->add(BookPeer::ISBN, array("0380977427", "0140422161"), Criteria::IN); - $results = BookPeer::doSelect($crit2); - $this->assertEquals(2, count($results)); - - // Perform a "limit" search - // ------------------------ - - $crit = new Criteria(); - $crit->setLimit(2); - $crit->setOffset(1); - $crit->addAscendingOrderByColumn(BookPeer::TITLE); - - $results = BookPeer::doSelect($crit); - $this->assertEquals(2, count($results)); - - // we ordered on book title, so we expect to get - $this->assertEquals("Harry Potter and the Order of the Phoenix", $results[0]->getTitle()); - $this->assertEquals("Quicksilver", $results[1]->getTitle()); - - // Perform a lookup & update! - // -------------------------- - - // Updating just-created book title - // First finding book by PK (=$qs_id) .... - $qs_lookup = BookPeer::retrieveByPk($qs_id); - $this->assertNotNull($qs_lookup, 'just-created book can be found by pk'); - - $new_title = "Quicksilver (".crc32(uniqid(rand())).")"; - // Attempting to update found object - $qs_lookup->setTitle($new_title); - $qs_lookup->save(); - - // Making sure object was correctly updated: "; - $qs_lookup2 = BookPeer::retrieveByPk($qs_id); - $this->assertEquals($new_title, $qs_lookup2->getTitle()); - - // Test some basic DATE / TIME stuff - // --------------------------------- - - // that's the control timestamp. - $control = strtotime('2004-02-29 00:00:00'); - - // should be two in the db - $r = ReviewPeer::doSelectOne(new Criteria()); - $r_id = $r->getId(); - $r->setReviewDate($control); - $r->save(); - - $r2 = ReviewPeer::retrieveByPk($r_id); - - $this->assertEquals(new Datetime('2004-02-29 00:00:00'), $r2->getReviewDate(null), 'ability to fetch DateTime'); - $this->assertEquals($control, $r2->getReviewDate('U'), 'ability to fetch native unix timestamp'); - $this->assertEquals('2-29-2004', $r2->getReviewDate('n-j-Y'), 'ability to use date() formatter'); - - // Handle BLOB/CLOB Columns - // ------------------------ - - $blob_path = dirname(__FILE__) . '/../../etc/lob/tin_drum.gif'; - $blob2_path = dirname(__FILE__) . '/../../etc/lob/propel.gif'; - $clob_path = dirname(__FILE__) . '/../../etc/lob/tin_drum.txt'; - - $m1 = new Media(); - $m1->setBook($phoenix); - $m1->setCoverImage(file_get_contents($blob_path)); - $m1->setExcerpt(file_get_contents($clob_path)); - $m1->save(); - $m1_id = $m1->getId(); - - $m1_lookup = MediaPeer::retrieveByPk($m1_id); - - $this->assertNotNull($m1_lookup, 'Can find just-created media item'); - $this->assertEquals(file_get_contents($blob_path), stream_get_contents($m1_lookup->getCoverImage()), 'BLOB was correctly updated'); - $this->assertEquals(file_get_contents($clob_path), (string) $m1_lookup->getExcerpt(), 'CLOB was correctly updated'); - - // now update the BLOB column and save it & check the results - $m1_lookup->setCoverImage(file_get_contents($blob2_path)); - $m1_lookup->save(); - - $m2_lookup = MediaPeer::retrieveByPk($m1_id); - $this->assertNotNull($m2_lookup, 'Can find just-created media item'); - - $this->assertEquals(file_get_contents($blob2_path), stream_get_contents($m2_lookup->getCoverImage()), 'BLOB was correctly overwritten'); - - // Test Validators - // --------------- - - require_once 'tools/helpers/bookstore/validator/ISBNValidator.php'; - - $bk1 = new Book(); - $bk1->setTitle("12345"); // min length is 10 - $ret = $bk1->validate(); - - $this->assertFalse($ret, 'validation failed'); - $failures = $bk1->getValidationFailures(); - $this->assertEquals(1, count($failures), '1 validation message was returned'); - - $el = array_shift($failures); - $this->assertContains("must be more than", $el->getMessage(), 'Expected validation message was returned'); - - $bk2 = new Book(); - $bk2->setTitle("Don Juan"); - $ret = $bk2->validate(); - - $this->assertFalse($ret, 'validation failed'); - - $failures = $bk2->getValidationFailures(); - $this->assertEquals(1, count($failures), '1 validation message was returned'); - - $el = array_shift($failures); - $this->assertContains("Book title already in database.", $el->getMessage(), 'Expected validation message was returned'); - - //Now trying some more complex validation. - $auth1 = new Author(); - $auth1->setFirstName("Hans"); - // last name required; will fail - - $bk1->setAuthor($auth1); - - $rev1 = new Review(); - $rev1->setReviewDate("08/09/2001"); - // will fail: reviewed_by column required - - $bk1->addReview($rev1); - - $ret2 = $bk1->validate(); - $this->assertFalse($ret2, 'validation failed'); - - $failures2 = $bk1->getValidationFailures(); - - $this->assertEquals(3, count($failures2), '3 validation messages were returned'); - - $expectedKeys = array( - AuthorPeer::LAST_NAME, - BookPeer::TITLE, - ReviewPeer::REVIEWED_BY, - ); - $this->assertEquals($expectedKeys, array_keys($failures2), 'correct columns failed'); - - $bk2 = new Book(); - $bk2->setTitle("12345678901"); // passes - - $auth2 = new Author(); - $auth2->setLastName("Blah"); //passes - $auth2->setEmail("some@body.com"); //passes - $auth2->setAge(50); //passes - $bk2->setAuthor($auth2); - - $rev2 = new Review(); - $rev2->setReviewedBy("Me!"); // passes - $rev2->setStatus("new"); // passes - $bk2->addReview($rev2); - - $ret3 = $bk2->validate(); - - $this->assertTrue($ret3, 'complex validation can pass'); - - // Testing doCount() functionality - // ------------------------------- - - $c = new Criteria(); - $records = BookPeer::doSelect($c); - $count = BookPeer::doCount($c); - - $this->assertEquals($count, count($records), 'correct number of results'); - - // Test many-to-many relationships - // --------------- - - // init book club list 1 with 2 books - - $blc1 = new BookClubList(); - $blc1->setGroupLeader("Crazyleggs"); - $blc1->setTheme("Happiness"); - - $brel1 = new BookListRel(); - $brel1->setBook($phoenix); - - $brel2 = new BookListRel(); - $brel2->setBook($dj); - - $blc1->addBookListRel($brel1); - $blc1->addBookListRel($brel2); - - $blc1->save(); - - $this->assertNotNull($blc1->getId(), 'BookClubList 1 was saved'); - - // init book club list 2 with 1 book - - $blc2 = new BookClubList(); - $blc2->setGroupLeader("John Foo"); - $blc2->setTheme("Default"); - - $brel3 = new BookListRel(); - $brel3->setBook($phoenix); - - $blc2->addBookListRel($brel3); - - $blc2->save(); - - $this->assertNotNull($blc2->getId(), 'BookClubList 2 was saved'); - - // re-fetch books and lists from db to be sure that nothing is cached - - $crit = new Criteria(); - $crit->add(BookPeer::ID, $phoenix->getId()); - $phoenix = BookPeer::doSelectOne($crit); - $this->assertNotNull($phoenix, "book 'phoenix' has been re-fetched from db"); - - $crit = new Criteria(); - $crit->add(BookClubListPeer::ID, $blc1->getId()); - $blc1 = BookClubListPeer::doSelectOne($crit); - $this->assertNotNull($blc1, 'BookClubList 1 has been re-fetched from db'); - - $crit = new Criteria(); - $crit->add(BookClubListPeer::ID, $blc2->getId()); - $blc2 = BookClubListPeer::doSelectOne($crit); - $this->assertNotNull($blc2, 'BookClubList 2 has been re-fetched from db'); - - $relCount = $phoenix->countBookListRels(); - $this->assertEquals(2, $relCount, "book 'phoenix' has 2 BookListRels"); - - $relCount = $blc1->countBookListRels(); - $this->assertEquals(2, $relCount, 'BookClubList 1 has 2 BookListRels'); - - $relCount = $blc2->countBookListRels(); - $this->assertEquals(1, $relCount, 'BookClubList 2 has 1 BookListRel'); - - // Cleanup (tests DELETE) - // ---------------------- - - // Removing books that were just created - // First finding book by PK (=$phoenix_id) .... - $hp = BookPeer::retrieveByPk($phoenix_id); - $this->assertNotNull($hp, 'Could find just-created book'); - - // Attempting to delete [multi-table] by found pk - $c = new Criteria(); - $c->add(BookPeer::ID, $hp->getId()); - // The only way for cascading to work currently - // is to specify the author_id and publisher_id (i.e. the fkeys - // have to be in the criteria). - $c->add(AuthorPeer::ID, $hp->getAuthor()->getId()); - $c->add(PublisherPeer::ID, $hp->getPublisher()->getId()); - $c->setSingleRecord(true); - BookPeer::doDelete($c); - - // Checking to make sure correct records were removed. - $this->assertEquals(3, AuthorPeer::doCount(new Criteria()), 'Correct records were removed from author table'); - $this->assertEquals(3, PublisherPeer::doCount(new Criteria()), 'Correct records were removed from publisher table'); - $this->assertEquals(3, BookPeer::doCount(new Criteria()), 'Correct records were removed from book table'); - - // Attempting to delete books by complex criteria - $c = new Criteria(); - $cn = $c->getNewCriterion(BookPeer::ISBN, "043935806X"); - $cn->addOr($c->getNewCriterion(BookPeer::ISBN, "0380977427")); - $cn->addOr($c->getNewCriterion(BookPeer::ISBN, "0140422161")); - $c->add($cn); - BookPeer::doDelete($c); - - // Attempting to delete book [id = $td_id] - $td->delete(); - - // Attempting to delete authors - AuthorPeer::doDelete($stephenson_id); - AuthorPeer::doDelete($byron_id); - $grass->delete(); - - // Attempting to delete publishers - PublisherPeer::doDelete($morrow_id); - PublisherPeer::doDelete($penguin_id); - $vintage->delete(); - - // These have to be deleted manually also since we have onDelete - // set to SETNULL in the foreign keys in book. Is this correct? - $rowling->delete(); - $scholastic->delete(); - $blc1->delete(); - $blc2->delete(); - - $this->assertEquals(array(), AuthorPeer::doSelect(new Criteria()), 'no records in [author] table'); - $this->assertEquals(array(), PublisherPeer::doSelect(new Criteria()), 'no records in [publisher] table'); - $this->assertEquals(array(), BookPeer::doSelect(new Criteria()), 'no records in [book] table'); - $this->assertEquals(array(), ReviewPeer::doSelect(new Criteria()), 'no records in [review] table'); - $this->assertEquals(array(), MediaPeer::doSelect(new Criteria()), 'no records in [media] table'); - $this->assertEquals(array(), BookClubListPeer::doSelect(new Criteria()), 'no records in [book_club_list] table'); - $this->assertEquals(array(), BookListRelPeer::doSelect(new Criteria()), 'no records in [book_x_list] table'); - - } - - public function testScenarioUsingQuery() - { - // Add publisher records - // --------------------- - - try { - $scholastic = new Publisher(); - $scholastic->setName("Scholastic"); - // do not save, will do later to test cascade - - $morrow = new Publisher(); - $morrow->setName("William Morrow"); - $morrow->save(); - $morrow_id = $morrow->getId(); - - $penguin = new Publisher(); - $penguin->setName("Penguin"); - $penguin->save(); - $penguin_id = $penguin->getId(); - - $vintage = new Publisher(); - $vintage->setName("Vintage"); - $vintage->save(); - $vintage_id = $vintage->getId(); - $this->assertTrue(true, 'Save Publisher records'); - } catch (Exception $e) { - $this->fail('Save publisher records'); - } - - // Add author records - // ------------------ - - try { - $rowling = new Author(); - $rowling->setFirstName("J.K."); - $rowling->setLastName("Rowling"); - // do not save, will do later to test cascade - - $stephenson = new Author(); - $stephenson->setFirstName("Neal"); - $stephenson->setLastName("Stephenson"); - $stephenson->save(); - $stephenson_id = $stephenson->getId(); - - $byron = new Author(); - $byron->setFirstName("George"); - $byron->setLastName("Byron"); - $byron->save(); - $byron_id = $byron->getId(); - - $grass = new Author(); - $grass->setFirstName("Gunter"); - $grass->setLastName("Grass"); - $grass->save(); - $grass_id = $grass->getId(); - $this->assertTrue(true, 'Save Author records'); - } catch (Exception $e) { - $this->fail('Save Author records'); - } - - // Add book records - // ---------------- - - try { - $phoenix = new Book(); - $phoenix->setTitle("Harry Potter and the Order of the Phoenix"); - $phoenix->setISBN("043935806X"); - $phoenix->setAuthor($rowling); - $phoenix->setPublisher($scholastic); - $phoenix->save(); - $phoenix_id = $phoenix->getId(); - $this->assertFalse($rowling->isNew(), 'saving book also saves related author'); - $this->assertFalse($scholastic->isNew(), 'saving book also saves related publisher'); - - $qs = new Book(); - $qs->setISBN("0380977427"); - $qs->setTitle("Quicksilver"); - $qs->setAuthor($stephenson); - $qs->setPublisher($morrow); - $qs->save(); - $qs_id = $qs->getId(); - - $dj = new Book(); - $dj->setISBN("0140422161"); - $dj->setTitle("Don Juan"); - $dj->setAuthor($byron); - $dj->setPublisher($penguin); - $dj->save(); - $dj_id = $qs->getId(); - - $td = new Book(); - $td->setISBN("067972575X"); - $td->setTitle("The Tin Drum"); - $td->setAuthor($grass); - $td->setPublisher($vintage); - $td->save(); - $td_id = $td->getId(); - $this->assertTrue(true, 'Save Book records'); - } catch (Exception $e) { - $this->fail('Save Author records'); - } - - // Add review records - // ------------------ - - try { - $r1 = new Review(); - $r1->setBook($phoenix); - $r1->setReviewedBy("Washington Post"); - $r1->setRecommended(true); - $r1->setReviewDate(time()); - $r1->save(); - $r1_id = $r1->getId(); - - $r2 = new Review(); - $r2->setBook($phoenix); - $r2->setReviewedBy("New York Times"); - $r2->setRecommended(false); - $r2->setReviewDate(time()); - $r2->save(); - $r2_id = $r2->getId(); - $this->assertTrue(true, 'Save Review records'); - } catch (Exception $e) { - $this->fail('Save Review records'); - } - - // Perform a "complex" search - // -------------------------- - - $results = BookQuery::create() - ->filterByTitle('Harry%') - ->find(); - $this->assertEquals(1, count($results)); - - $results = BookQuery::create() - ->where('Book.ISBN IN ?', array("0380977427", "0140422161")) - ->find(); - $this->assertEquals(2, count($results)); - - // Perform a "limit" search - // ------------------------ - - $results = BookQuery::create() - ->limit(2) - ->offset(1) - ->orderByTitle() - ->find(); - $this->assertEquals(2, count($results)); - // we ordered on book title, so we expect to get - $this->assertEquals("Harry Potter and the Order of the Phoenix", $results[0]->getTitle()); - $this->assertEquals("Quicksilver", $results[1]->getTitle()); - - // Perform a lookup & update! - // -------------------------- - - // Updating just-created book title - // First finding book by PK (=$qs_id) .... - $qs_lookup = BookQuery::create()->findPk($qs_id); - $this->assertNotNull($qs_lookup, 'just-created book can be found by pk'); - - $new_title = "Quicksilver (".crc32(uniqid(rand())).")"; - // Attempting to update found object - $qs_lookup->setTitle($new_title); - $qs_lookup->save(); - - // Making sure object was correctly updated: "; - $qs_lookup2 = BookQuery::create()->findPk($qs_id); - $this->assertEquals($new_title, $qs_lookup2->getTitle()); - - // Test some basic DATE / TIME stuff - // --------------------------------- - - // that's the control timestamp. - $control = strtotime('2004-02-29 00:00:00'); - - // should be two in the db - $r = ReviewQuery::create()->findOne(); - $r_id = $r->getId(); - $r->setReviewDate($control); - $r->save(); - - $r2 = ReviewQuery::create()->findPk($r_id); - $this->assertEquals(new Datetime('2004-02-29 00:00:00'), $r2->getReviewDate(null), 'ability to fetch DateTime'); - $this->assertEquals($control, $r2->getReviewDate('U'), 'ability to fetch native unix timestamp'); - $this->assertEquals('2-29-2004', $r2->getReviewDate('n-j-Y'), 'ability to use date() formatter'); - - // Handle BLOB/CLOB Columns - // ------------------------ - - $blob_path = dirname(__FILE__) . '/../../etc/lob/tin_drum.gif'; - $blob2_path = dirname(__FILE__) . '/../../etc/lob/propel.gif'; - $clob_path = dirname(__FILE__) . '/../../etc/lob/tin_drum.txt'; - - $m1 = new Media(); - $m1->setBook($phoenix); - $m1->setCoverImage(file_get_contents($blob_path)); - $m1->setExcerpt(file_get_contents($clob_path)); - $m1->save(); - $m1_id = $m1->getId(); - - $m1_lookup = MediaQuery::create()->findPk($m1_id); - - $this->assertNotNull($m1_lookup, 'Can find just-created media item'); - $this->assertEquals(file_get_contents($blob_path), stream_get_contents($m1_lookup->getCoverImage()), 'BLOB was correctly updated'); - $this->assertEquals(file_get_contents($clob_path), (string) $m1_lookup->getExcerpt(), 'CLOB was correctly updated'); - - // now update the BLOB column and save it & check the results - $m1_lookup->setCoverImage(file_get_contents($blob2_path)); - $m1_lookup->save(); - - $m2_lookup = MediaQuery::create()->findPk($m1_id); - $this->assertNotNull($m2_lookup, 'Can find just-created media item'); - - $this->assertEquals(file_get_contents($blob2_path), stream_get_contents($m2_lookup->getCoverImage()), 'BLOB was correctly overwritten'); - - // Test Validators - // --------------- - - require_once 'tools/helpers/bookstore/validator/ISBNValidator.php'; - - $bk1 = new Book(); - $bk1->setTitle("12345"); // min length is 10 - $ret = $bk1->validate(); - - $this->assertFalse($ret, 'validation failed'); - $failures = $bk1->getValidationFailures(); - $this->assertEquals(1, count($failures), '1 validation message was returned'); - - $el = array_shift($failures); - $this->assertContains("must be more than", $el->getMessage(), 'Expected validation message was returned'); - - $bk2 = new Book(); - $bk2->setTitle("Don Juan"); - $ret = $bk2->validate(); - - $this->assertFalse($ret, 'validation failed'); - - $failures = $bk2->getValidationFailures(); - $this->assertEquals(1, count($failures), '1 validation message was returned'); - - $el = array_shift($failures); - $this->assertContains("Book title already in database.", $el->getMessage(), 'Expected validation message was returned'); - - //Now trying some more complex validation. - $auth1 = new Author(); - $auth1->setFirstName("Hans"); - // last name required; will fail - - $bk1->setAuthor($auth1); - - $rev1 = new Review(); - $rev1->setReviewDate("08/09/2001"); - // will fail: reviewed_by column required - - $bk1->addReview($rev1); - - $ret2 = $bk1->validate(); - $this->assertFalse($ret2, 'validation failed'); - - $failures2 = $bk1->getValidationFailures(); - - $this->assertEquals(3, count($failures2), '3 validation messages were returned'); - - $expectedKeys = array( - AuthorPeer::LAST_NAME, - BookPeer::TITLE, - ReviewPeer::REVIEWED_BY, - ); - $this->assertEquals($expectedKeys, array_keys($failures2), 'correct columns failed'); - - $bk2 = new Book(); - $bk2->setTitle("12345678901"); // passes - - $auth2 = new Author(); - $auth2->setLastName("Blah"); //passes - $auth2->setEmail("some@body.com"); //passes - $auth2->setAge(50); //passes - $bk2->setAuthor($auth2); - - $rev2 = new Review(); - $rev2->setReviewedBy("Me!"); // passes - $rev2->setStatus("new"); // passes - $bk2->addReview($rev2); - - $ret3 = $bk2->validate(); - - $this->assertTrue($ret3, 'complex validation can pass'); - - // Testing doCount() functionality - // ------------------------------- - - // old way - $c = new Criteria(); - $records = BookPeer::doSelect($c); - $count = BookPeer::doCount($c); - $this->assertEquals($count, count($records), 'correct number of results'); - - // new way - $count = BookQuery::create()->count(); - $this->assertEquals($count, count($records), 'correct number of results'); - - // Test many-to-many relationships - // --------------- - - // init book club list 1 with 2 books - - $blc1 = new BookClubList(); - $blc1->setGroupLeader("Crazyleggs"); - $blc1->setTheme("Happiness"); - - $brel1 = new BookListRel(); - $brel1->setBook($phoenix); - - $brel2 = new BookListRel(); - $brel2->setBook($dj); - - $blc1->addBookListRel($brel1); - $blc1->addBookListRel($brel2); - - $blc1->save(); - - $this->assertNotNull($blc1->getId(), 'BookClubList 1 was saved'); - - // init book club list 2 with 1 book - - $blc2 = new BookClubList(); - $blc2->setGroupLeader("John Foo"); - $blc2->setTheme("Default"); - - $brel3 = new BookListRel(); - $brel3->setBook($phoenix); - - $blc2->addBookListRel($brel3); - - $blc2->save(); - - $this->assertNotNull($blc2->getId(), 'BookClubList 2 was saved'); - - // re-fetch books and lists from db to be sure that nothing is cached - - $crit = new Criteria(); - $crit->add(BookPeer::ID, $phoenix->getId()); - $phoenix = BookPeer::doSelectOne($crit); - $this->assertNotNull($phoenix, "book 'phoenix' has been re-fetched from db"); - - $crit = new Criteria(); - $crit->add(BookClubListPeer::ID, $blc1->getId()); - $blc1 = BookClubListPeer::doSelectOne($crit); - $this->assertNotNull($blc1, 'BookClubList 1 has been re-fetched from db'); - - $crit = new Criteria(); - $crit->add(BookClubListPeer::ID, $blc2->getId()); - $blc2 = BookClubListPeer::doSelectOne($crit); - $this->assertNotNull($blc2, 'BookClubList 2 has been re-fetched from db'); - - $relCount = $phoenix->countBookListRels(); - $this->assertEquals(2, $relCount, "book 'phoenix' has 2 BookListRels"); - - $relCount = $blc1->countBookListRels(); - $this->assertEquals(2, $relCount, 'BookClubList 1 has 2 BookListRels'); - - $relCount = $blc2->countBookListRels(); - $this->assertEquals(1, $relCount, 'BookClubList 2 has 1 BookListRel'); - - // Cleanup (tests DELETE) - // ---------------------- - - // Removing books that were just created - // First finding book by PK (=$phoenix_id) .... - $hp = BookQuery::create()->findPk($phoenix_id); - $this->assertNotNull($hp, 'Could find just-created book'); - - // Attempting to delete [multi-table] by found pk - $c = new Criteria(); - $c->add(BookPeer::ID, $hp->getId()); - // The only way for cascading to work currently - // is to specify the author_id and publisher_id (i.e. the fkeys - // have to be in the criteria). - $c->add(AuthorPeer::ID, $hp->getAuthor()->getId()); - $c->add(PublisherPeer::ID, $hp->getPublisher()->getId()); - $c->setSingleRecord(true); - BookPeer::doDelete($c); - - // Checking to make sure correct records were removed. - $this->assertEquals(3, AuthorPeer::doCount(new Criteria()), 'Correct records were removed from author table'); - $this->assertEquals(3, PublisherPeer::doCount(new Criteria()), 'Correct records were removed from publisher table'); - $this->assertEquals(3, BookPeer::doCount(new Criteria()), 'Correct records were removed from book table'); - - // Attempting to delete books by complex criteria - BookQuery::create() - ->filterByISBN("043935806X") - ->orWhere('Book.ISBN = ?', "0380977427") - ->orWhere('Book.ISBN = ?', "0140422161") - ->delete(); - - // Attempting to delete book [id = $td_id] - $td->delete(); - - // Attempting to delete authors - AuthorQuery::create()->filterById($stephenson_id)->delete(); - AuthorQuery::create()->filterById($byron_id)->delete(); - $grass->delete(); - - // Attempting to delete publishers - PublisherQuery::create()->filterById($morrow_id)->delete(); - PublisherQuery::create()->filterById($penguin_id)->delete(); - $vintage->delete(); - - // These have to be deleted manually also since we have onDelete - // set to SETNULL in the foreign keys in book. Is this correct? - $rowling->delete(); - $scholastic->delete(); - $blc1->delete(); - $blc2->delete(); - - $this->assertEquals(array(), AuthorPeer::doSelect(new Criteria()), 'no records in [author] table'); - $this->assertEquals(array(), PublisherPeer::doSelect(new Criteria()), 'no records in [publisher] table'); - $this->assertEquals(array(), BookPeer::doSelect(new Criteria()), 'no records in [book] table'); - $this->assertEquals(array(), ReviewPeer::doSelect(new Criteria()), 'no records in [review] table'); - $this->assertEquals(array(), MediaPeer::doSelect(new Criteria()), 'no records in [media] table'); - $this->assertEquals(array(), BookClubListPeer::doSelect(new Criteria()), 'no records in [book_club_list] table'); - $this->assertEquals(array(), BookListRelPeer::doSelect(new Criteria()), 'no records in [book_x_list] table'); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/misc/CharacterEncodingTest.php b/airtime_mvc/library/propel/test/testsuite/misc/CharacterEncodingTest.php deleted file mode 100644 index dfc9c03e70..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/misc/CharacterEncodingTest.php +++ /dev/null @@ -1,112 +0,0 @@ - - * @package misc - */ -class CharacterEncodingTest extends BookstoreTestBase -{ - /** - * Database adapter. - * @var DBAdapter - */ - private $adapter; - - public function setUp() - { - parent::setUp(); - if (!extension_loaded('iconv')) { - throw new Exception("Character-encoding tests require iconv extension to be loaded."); - } - } - - public function testUtf8() - { - $this->markTestSkipped(); - - $db = Propel::getDB(BookPeer::DATABASE_NAME); - - $title = "Смерть на брудершафт. Младенец и черт"; - // 1234567890123456789012345678901234567 - // 1 2 3 - - $a = new Author(); - $a->setFirstName("Б."); - $a->setLastName("ÐКУÐИÐ"); - - $p = new Publisher(); - $p->setName("Детектив роÑÑийÑкий, оÑтроÑÑŽÐ¶ÐµÑ‚Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð·Ð°"); - - $b = new Book(); - $b->setTitle($title); - $b->setISBN("B-59246"); - $b->setAuthor($a); - $b->setPublisher($p); - $b->save(); - - $b->reload(); - - $this->assertEquals(37, iconv_strlen($b->getTitle(), 'utf-8'), "Expected 37 characters (not bytes) in title."); - $this->assertTrue(strlen($b->getTitle()) > iconv_strlen($b->getTitle(), 'utf-8'), "Expected more bytes than characters in title."); - - } - - public function testInvalidCharset() - { - $this->markTestSkipped(); - - $db = Propel::getDB(BookPeer::DATABASE_NAME); - if ($db instanceof DBSQLite) { - $this->markTestSkipped(); - } - - $a = new Author(); - $a->setFirstName("Б."); - $a->setLastName("ÐКУÐИÐ"); - $a->save(); - - $authorNameWindows1251 = iconv("utf-8", "windows-1251", $a->getLastName()); - $a->setLastName($authorNameWindows1251); - - // Different databases seem to handle invalid data differently (no surprise, I guess...) - if ($db instanceof DBPostgres) { - try { - $a->save(); - $this->fail("Expected an exception when saving non-UTF8 data to database."); - } catch (Exception $x) { - print $x; - } - - } else { - - // No exception is thrown by MySQL ... (others need to be tested still) - $a->save(); - $a->reload(); - - $this->assertEquals("",$a->getLastName(), "Expected last_name to be empty (after inserting invalid charset data)"); - } - - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/misc/FieldnameRelatedTest.php b/airtime_mvc/library/propel/test/testsuite/misc/FieldnameRelatedTest.php deleted file mode 100644 index fe43a94bbd..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/misc/FieldnameRelatedTest.php +++ /dev/null @@ -1,396 +0,0 @@ - - * @package misc - */ -class FieldnameRelatedTest extends PHPUnit_Framework_TestCase -{ - protected function setUp() - { - parent::setUp(); - set_include_path(get_include_path() . PATH_SEPARATOR . "fixtures/bookstore/build/classes"); - require_once 'bookstore/map/BookTableMap.php'; - require_once 'bookstore/BookPeer.php'; - require_once 'bookstore/Book.php'; - } - - /** - * Tests if fieldname type constants are defined - */ - public function testFieldNameTypeConstants () { - - $result = defined('BasePeer::TYPE_PHPNAME'); - $this->assertTrue($result); - } - - /** - * Tests the Base[Object]Peer::getFieldNames() method - */ - public function testGetFieldNames () - { - $types = array( - BasePeer::TYPE_PHPNAME, - BasePeer::TYPE_COLNAME, - BasePeer::TYPE_FIELDNAME, - BasePeer::TYPE_NUM - ); - $expecteds = array ( - BasePeer::TYPE_PHPNAME => array( - 0 => 'Id', - 1 => 'Title', - 2 => 'ISBN', - 3 => 'Price', - 4 => 'PublisherId', - 5 => 'AuthorId' - ), - BasePeer::TYPE_STUDLYPHPNAME => array( - 0 => 'id', - 1 => 'title', - 2 => 'iSBN', - 3 => 'price', - 4 => 'publisherId', - 5 => 'authorId' - ), - BasePeer::TYPE_COLNAME => array( - 0 => 'book.ID', - 1 => 'book.TITLE', - 2 => 'book.ISBN', - 3 => 'book.PRICE', - 4 => 'book.PUBLISHER_ID', - 5 => 'book.AUTHOR_ID' - ), - BasePeer::TYPE_FIELDNAME => array( - 0 => 'id', - 1 => 'title', - 2 => 'isbn', - 3 => 'price', - 4 => 'publisher_id', - 5 => 'author_id' - ), - BasePeer::TYPE_NUM => array( - 0 => 0, - 1 => 1, - 2 => 2, - 3 => 3, - 4 => 4, - 5 => 5 - ) - ); - - foreach ($types as $type) { - $results[$type] = BookPeer::getFieldnames($type); - $this->assertEquals( - $expecteds[$type], - $results[$type], - 'expected was: ' . print_r($expecteds[$type], 1) . - 'but getFieldnames() returned ' . print_r($results[$type], 1) - ); - } - } - - /** - * Tests the Base[Object]Peer::translateFieldName() method - */ - public function testTranslateFieldName () { - - $types = array( - BasePeer::TYPE_PHPNAME, - BasePeer::TYPE_STUDLYPHPNAME, - BasePeer::TYPE_COLNAME, - BasePeer::TYPE_FIELDNAME, - BasePeer::TYPE_NUM - ); - $expecteds = array ( - BasePeer::TYPE_PHPNAME => 'AuthorId', - BasePeer::TYPE_STUDLYPHPNAME => 'authorId', - BasePeer::TYPE_COLNAME => 'book.AUTHOR_ID', - BasePeer::TYPE_FIELDNAME => 'author_id', - BasePeer::TYPE_NUM => 5, - ); - foreach ($types as $fromType) { - foreach ($types as $toType) { - $name = $expecteds[$fromType]; - $expected = $expecteds[$toType]; - $result = BookPeer::translateFieldName($name, $fromType, $toType); - $this->assertEquals($expected, $result); - } - } - } - - /** - * Tests the BasePeer::getFieldNames() method - */ - public function testGetFieldNamesStatic () { - - $types = array( - BasePeer::TYPE_PHPNAME, - BasePeer::TYPE_STUDLYPHPNAME, - BasePeer::TYPE_COLNAME, - BasePeer::TYPE_FIELDNAME, - BasePeer::TYPE_NUM - ); - $expecteds = array ( - BasePeer::TYPE_PHPNAME => array( - 0 => 'Id', - 1 => 'Title', - 2 => 'ISBN', - 3 => 'Price', - 4 => 'PublisherId', - 5 => 'AuthorId' - ), - BasePeer::TYPE_STUDLYPHPNAME => array( - 0 => 'id', - 1 => 'title', - 2 => 'iSBN', - 3 => 'price', - 4 => 'publisherId', - 5 => 'authorId' - ), - BasePeer::TYPE_COLNAME => array( - 0 => 'book.ID', - 1 => 'book.TITLE', - 2 => 'book.ISBN', - 3 => 'book.PRICE', - 4 => 'book.PUBLISHER_ID', - 5 => 'book.AUTHOR_ID' - ), - BasePeer::TYPE_FIELDNAME => array( - 0 => 'id', - 1 => 'title', - 2 => 'isbn', - 3 => 'price', - 4 => 'publisher_id', - 5 => 'author_id' - ), - BasePeer::TYPE_NUM => array( - 0 => 0, - 1 => 1, - 2 => 2, - 3 => 3, - 4 => 4, - 5 => 5 - ) - ); - - foreach ($types as $type) { - $results[$type] = BasePeer::getFieldnames('Book', $type); - $this->assertEquals( - $expecteds[$type], - $results[$type], - 'expected was: ' . print_r($expecteds[$type], 1) . - 'but getFieldnames() returned ' . print_r($results[$type], 1) - ); - } - } - - /** - * Tests the BasePeer::translateFieldName() method - */ - public function testTranslateFieldNameStatic () { - - $types = array( - BasePeer::TYPE_PHPNAME, - BasePeer::TYPE_STUDLYPHPNAME, - BasePeer::TYPE_COLNAME, - BasePeer::TYPE_FIELDNAME, - BasePeer::TYPE_NUM - ); - $expecteds = array ( - BasePeer::TYPE_PHPNAME => 'AuthorId', - BasePeer::TYPE_STUDLYPHPNAME => 'authorId', - BasePeer::TYPE_COLNAME => 'book.AUTHOR_ID', - BasePeer::TYPE_FIELDNAME => 'author_id', - BasePeer::TYPE_NUM => 5, - ); - foreach ($types as $fromType) { - foreach ($types as $toType) { - $name = $expecteds[$fromType]; - $expected = $expecteds[$toType]; - $result = BasePeer::translateFieldName('Book', $name, $fromType, $toType); - $this->assertEquals($expected, $result); - } - } - } - - /** - * Tests the Base[Object]::getByName() method - */ - public function testGetByName() { - - $types = array( - BasePeer::TYPE_PHPNAME => 'Title', - BasePeer::TYPE_STUDLYPHPNAME => 'title', - BasePeer::TYPE_COLNAME => 'book.TITLE', - BasePeer::TYPE_FIELDNAME => 'title', - BasePeer::TYPE_NUM => 1 - ); - - $book = new Book(); - $book->setTitle('Harry Potter and the Order of the Phoenix'); - - $expected = 'Harry Potter and the Order of the Phoenix'; - foreach ($types as $type => $name) { - $result = $book->getByName($name, $type); - $this->assertEquals($expected, $result); - } - } - - /** - * Tests the Base[Object]::setByName() method - */ - public function testSetByName() { - - $book = new Book(); - $types = array( - BasePeer::TYPE_PHPNAME => 'Title', - BasePeer::TYPE_STUDLYPHPNAME => 'title', - BasePeer::TYPE_COLNAME => 'book.TITLE', - BasePeer::TYPE_FIELDNAME => 'title', - BasePeer::TYPE_NUM => 1 - ); - - $title = 'Harry Potter and the Order of the Phoenix'; - foreach ($types as $type => $name) { - $book->setByName($name, $title, $type); - $result = $book->getTitle(); - $this->assertEquals($title, $result); - } - } - - /** - * Tests the Base[Object]::fromArray() method - * - * this also tests populateFromArray() because that's an alias - */ - public function testFromArray(){ - - $types = array( - BasePeer::TYPE_PHPNAME, - BasePeer::TYPE_STUDLYPHPNAME, - BasePeer::TYPE_COLNAME, - BasePeer::TYPE_FIELDNAME, - BasePeer::TYPE_NUM - ); - $expecteds = array ( - BasePeer::TYPE_PHPNAME => array ( - 'Title' => 'Harry Potter and the Order of the Phoenix', - 'ISBN' => '043935806X' - ), - BasePeer::TYPE_STUDLYPHPNAME => array ( - 'title' => 'Harry Potter and the Order of the Phoenix', - 'iSBN' => '043935806X' - ), - BasePeer::TYPE_COLNAME => array ( - 'book.TITLE' => 'Harry Potter and the Order of the Phoenix', - 'book.ISBN' => '043935806X' - ), - BasePeer::TYPE_FIELDNAME => array ( - 'title' => 'Harry Potter and the Order of the Phoenix', - 'isbn' => '043935806X' - ), - BasePeer::TYPE_NUM => array ( - '1' => 'Harry Potter and the Order of the Phoenix', - '2' => '043935806X' - ) - ); - - $book = new Book(); - - foreach ($types as $type) { - $expected = $expecteds[$type]; - $book->fromArray($expected, $type); - $result = array(); - foreach (array_keys($expected) as $key) { - $result[$key] = $book->getByName($key, $type); - } - $this->assertEquals( - $expected, - $result, - 'expected was: ' . print_r($expected, 1) . - 'but fromArray() returned ' . print_r($result, 1) - ); - } - } - - /** - * Tests the Base[Object]::toArray() method - */ - public function testToArray(){ - - $types = array( - BasePeer::TYPE_PHPNAME, - BasePeer::TYPE_STUDLYPHPNAME, - BasePeer::TYPE_COLNAME, - BasePeer::TYPE_FIELDNAME, - BasePeer::TYPE_NUM - ); - - $book = new Book(); - $book->fromArray(array ( - 'Title' => 'Harry Potter and the Order of the Phoenix', - 'ISBN' => '043935806X' - )); - - $expecteds = array ( - BasePeer::TYPE_PHPNAME => array ( - 'Title' => 'Harry Potter and the Order of the Phoenix', - 'ISBN' => '043935806X' - ), - BasePeer::TYPE_STUDLYPHPNAME => array ( - 'title' => 'Harry Potter and the Order of the Phoenix', - 'iSBN' => '043935806X' - ), - BasePeer::TYPE_COLNAME => array ( - 'book.TITLE' => 'Harry Potter and the Order of the Phoenix', - 'book.ISBN' => '043935806X' - ), - BasePeer::TYPE_FIELDNAME => array ( - 'title' => 'Harry Potter and the Order of the Phoenix', - 'isbn' => '043935806X' - ), - BasePeer::TYPE_NUM => array ( - '1' => 'Harry Potter and the Order of the Phoenix', - '2' => '043935806X' - ) - ); - - foreach ($types as $type) { - $expected = $expecteds[$type]; - $result = $book->toArray($type); - // remove ID since its autoincremented at each test iteration - $result = array_slice($result, 1, 2, true); - $this->assertEquals( - $expected, - $result, - 'expected was: ' . print_r($expected, 1) . - 'but toArray() returned ' . print_r($result, 1) - ); - } - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/misc/Ticket520Test.php b/airtime_mvc/library/propel/test/testsuite/misc/Ticket520Test.php deleted file mode 100644 index e95390b05f..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/misc/Ticket520Test.php +++ /dev/null @@ -1,250 +0,0 @@ -setFirstName("Douglas"); - $a->setLastName("Adams"); - - $b1 = new Book(); - $b1->setTitle("The Hitchhikers Guide To The Galaxy"); - $a->addBook($b1); - - $b2 = new Book(); - $b2->setTitle("The Restaurant At The End Of The Universe"); - $a->addBook($b2); - - // Passing no Criteria means "use the internal collection or query the database" - // in that case two objects are added, so it should return 2 - $books = $a->getBooks(); - $this->assertEquals(2, count($books)); - } - - public function testNewObjectsNotAvailableWithCriteria() - { - $a = new Author(); - $a->setFirstName("Douglas"); - $a->setLastName("Adams"); - - $b1 = new Book(); - $b1->setTitle("The Hitchhikers Guide To The Galaxy"); - $a->addBook($b1); - - $b2 = new Book(); - $b2->setTitle("The Restaurant At The End Of The Universe"); - $a->addBook($b2); - - $c = new Criteria(); - $c->add(BookPeer::TITLE, "%Hitchhiker%", Criteria::LIKE); - - $guides = $a->getBooks($c); - $this->assertEquals(0, count($guides), 'Passing a Criteria means "force a database query"'); - } - - public function testNewObjectsAvailableAfterCriteria() - { - $a = new Author(); - $a->setFirstName("Douglas"); - $a->setLastName("Adams"); - - $b1 = new Book(); - $b1->setTitle("The Hitchhikers Guide To The Galaxy"); - $a->addBook($b1); - - $b2 = new Book(); - $b2->setTitle("The Restaurant At The End Of The Universe"); - $a->addBook($b2); - - $c = new Criteria(); - $c->add(BookPeer::TITLE, "%Hitchhiker%", Criteria::LIKE); - - $guides = $a->getBooks($c); - - $books = $a->getBooks(); - $this->assertEquals(2, count($books), 'A previous query with a Criteria does not erase the internal collection'); - } - - public function testSavedObjectsWithCriteria() - { - $a = new Author(); - $a->setFirstName("Douglas"); - $a->setLastName("Adams"); - - $b1 = new Book(); - $b1->setTitle("The Hitchhikers Guide To The Galaxy"); - $a->addBook($b1); - - $b2 = new Book(); - $b2->setTitle("The Restaurant At The End Of The Universe"); - $a->addBook($b2); - - $c = new Criteria(); - $c->add(BookPeer::TITLE, "%Hitchhiker%", Criteria::LIKE); - - $guides = $a->getBooks($c); - - $a->save(); - $booksAfterSave = $a->getBooks($c); - $this->assertEquals(1, count($booksAfterSave), 'A previous query with a Criteria is not cached'); - } - - public function testAddNewObjectAfterSave() - { - $a = new Author(); - $a->setFirstName("Douglas"); - $a->setLastName("Adams"); - - $a->save(); - - $b1 = new Book(); - $b1->setTitle("The Hitchhikers Guide To The Galaxy"); - $a->addBook($b1); - - $books = $a->getBooks(); - $this->assertEquals(1, count($books)); - $this->assertTrue($books->contains($b1)); - - /* Now this is the initial ticket 520: If we have a saved author, - add a new book but happen to call getBooks() before we call save() again, - the book used to be lost. */ - $a->save(); - $this->assertFalse($b1->isNew(), 'related objects are also saved after fetching them'); - } - - public function testAddNewObjectAfterSaveWithPoisonedCache() - { - /* This is like testAddNewObjectAfterSave(), - but this time we "poison" the author's $colBooks cache - before adding the book by calling getBooks(). */ - - $a = new Author(); - $a->setFirstName("Douglas"); - $a->setLastName("Adams"); - - $a->save(); - $a->getBooks(); - - $b1 = new Book(); - $b1->setTitle("The Hitchhikers Guide To The Galaxy"); - $a->addBook($b1); - - $books = $a->getBooks(); - $this->assertEquals(1, count($books)); - $this->assertTrue($books->contains($b1), 'new related objects not deleted after fetching them'); - } - - public function testCachePoisoning() - { - /* Like testAddNewObjectAfterSaveWithPoisonedCache, emphasizing - cache poisoning. */ - - $a = new Author(); - $a->setFirstName("Douglas"); - $a->setLastName("Adams"); - - $a->save(); - - $c = new Criteria(); - $c->add(BookPeer::TITLE, "%Restaurant%", Criteria::LIKE); - - $this->assertEquals(0, count($a->getBooks($c))); - - $b1 = new Book(); - $b1->setTitle("The Hitchhikers Guide To The Galaxy"); - $a->addBook($b1); - - /* Like testAddNewObjectAfterSaveWithPoisonedCache, but this time - with a real criteria. */ - $this->assertEquals(0, count($a->getBooks($c))); - - $a->save(); - $this->assertFalse($b1->isNew()); - $this->assertEquals(0, count($a->getBooks($c))); - } - - public function testDeletedBookDisappears() - { - $this->markTestSkipped(); - - $a = new Author(); - $a->setFirstName("Douglas"); - $a->setLastName("Adams"); - - $b1 = new Book(); - $b1->setTitle("The Hitchhikers Guide To The Galaxy"); - $a->addBook($b1); - - $b2 = new Book(); - $b2->setTitle("The Restaurant At The End Of The Universe"); - $a->addBook($b2); - - /* As you cannot write $a->remove($b2), you have to delete $b2 - directly. */ - - /* All objects unsaved. As of revision 851, this circumvents the - $colBooks cache. Anyway, fails because getBooks() never checks if - a colBooks entry has been deleted. */ - $this->assertEquals(2, count($a->getBooks())); - $b2->delete(); - $this->assertEquals(1, count($a->getBooks())); - - /* Even if we had saved everything before and the delete() had - actually updated the DB, the $b2 would still be a "zombie" in - $a's $colBooks field. */ - } - - public function testNewObjectsGetLostOnJoin() { - /* While testNewObjectsAvailableWhenSaveNotCalled passed as of - revision 851, in this case we call getBooksJoinPublisher() instead - of just getBooks(). get...Join...() does not contain the check whether - the current object is new, it will always consult the DB and lose the - new objects entirely. Thus the test fails. (At least for Propel 1.2 ?!?) */ - $this->markTestSkipped(); - - $a = new Author(); - $a->setFirstName("Douglas"); - $a->setLastName("Adams"); - - $p = new Publisher(); - $p->setName('Pan Books Ltd.'); - - $b1 = new Book(); - $b1->setTitle("The Hitchhikers Guide To The Galaxy"); - $b1->setPublisher($p); // uh... did not check that :^) - $a->addBook($b1); - - $b2 = new Book(); - $b2->setTitle("The Restaurant At The End Of The Universe"); - $b2->setPublisher($p); - $a->addBook($b2); - - $books = $a->getBooksJoinPublisher(); - $this->assertEquals(2, count($books)); - $this->assertContains($b1, $books); - $this->assertContains($b2, $books); - - $a->save(); - $this->assertFalse($b1->isNew()); - $this->assertFalse($b2->isNew()); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/adapter/DBOracleTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/adapter/DBOracleTest.php deleted file mode 100644 index 25f1f1d171..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/adapter/DBOracleTest.php +++ /dev/null @@ -1,47 +0,0 @@ -setDbName('oracle'); - BookPeer::addSelectColumns($c); - $c->setLimit(1); - $params = array(); - $sql = BasePeer::createSelectSql($c, $params); - $this->assertEquals('SELECT B.* FROM (SELECT A.*, rownum AS PROPEL_ROWNUM FROM (SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM book) A ) B WHERE B.PROPEL_ROWNUM <= 1', $sql, 'applyLimit() creates a subselect with the original column names by default'); - } - - public function testApplyLimitDuplicateColumnName() - { - Propel::setDb('oracle', new DBOracle()); - $c = new Criteria(); - $c->setDbName('oracle'); - BookPeer::addSelectColumns($c); - AuthorPeer::addSelectColumns($c); - $c->setLimit(1); - $params = array(); - $sql = BasePeer::createSelectSql($c, $params); - $this->assertEquals('SELECT B.* FROM (SELECT A.*, rownum AS PROPEL_ROWNUM FROM (SELECT book.ID AS book_ID, book.TITLE AS book_TITLE, book.ISBN AS book_ISBN, book.PRICE AS book_PRICE, book.PUBLISHER_ID AS book_PUBLISHER_ID, book.AUTHOR_ID AS book_AUTHOR_ID, author.ID AS author_ID, author.FIRST_NAME AS author_FIRST_NAME, author.LAST_NAME AS author_LAST_NAME, author.EMAIL AS author_EMAIL, author.AGE AS author_AGESELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID, author.ID, author.FIRST_NAME, author.LAST_NAME, author.EMAIL, author.AGE FROM book, author) A ) B WHERE B.PROPEL_ROWNUM <= 1', $sql, 'applyLimit() creates a subselect with aliased column names when a duplicate column name is found'); - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelArrayCollectionTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelArrayCollectionTest.php deleted file mode 100644 index a6a374936f..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelArrayCollectionTest.php +++ /dev/null @@ -1,152 +0,0 @@ -con); - } - - public function testSave() - { - $books = PropelQuery::from('Book')->setFormatter(ModelCriteria::FORMAT_ARRAY)->find(); - foreach ($books as &$book) { - $book['Title'] = 'foo'; - } - $books->save(); - // check that the modifications are persisted - BookPeer::clearInstancePool(); - $books = PropelQuery::from('Book')->find(); - foreach ($books as $book) { - $this->assertEquals('foo', $book->getTitle('foo')); - } - } - - public function testDelete() - { - $books = PropelQuery::from('Book')->setFormatter(ModelCriteria::FORMAT_ARRAY)->find(); - $books->delete(); - // check that the modifications are persisted - BookPeer::clearInstancePool(); - $books = PropelQuery::from('Book')->find(); - $this->assertEquals(0, count($books)); - } - - public function testGetPrimaryKeys() - { - $books = PropelQuery::from('Book')->setFormatter(ModelCriteria::FORMAT_ARRAY)->find(); - $pks = $books->getPrimaryKeys(); - $this->assertEquals(4, count($pks)); - - $keys = array('Book_0', 'Book_1', 'Book_2', 'Book_3'); - $this->assertEquals($keys, array_keys($pks)); - - $pks = $books->getPrimaryKeys(false); - $keys = array(0, 1, 2, 3); - $this->assertEquals($keys, array_keys($pks)); - - $bookObjects = PropelQuery::from('Book')->find(); - foreach ($pks as $key => $value) { - $this->assertEquals($bookObjects[$key]->getPrimaryKey(), $value); - } - } - - public function testFromArray() - { - $author = new Author(); - $author->setFirstName('Jane'); - $author->setLastName('Austen'); - $author->save(); - $books = array( - array('Title' => 'Mansfield Park', 'AuthorId' => $author->getId()), - array('Title' => 'Pride And PRejudice', 'AuthorId' => $author->getId()) - ); - $col = new PropelArrayCollection(); - $col->setModel('Book'); - $col->fromArray($books); - $col->save(); - - $nbBooks = PropelQuery::from('Book')->count(); - $this->assertEquals(6, $nbBooks); - - $booksByJane = PropelQuery::from('Book b') - ->join('b.Author a') - ->where('a.LastName = ?', 'Austen') - ->count(); - $this->assertEquals(2, $booksByJane); - } - - public function testToArray() - { - $books = PropelQuery::from('Book')->setFormatter(ModelCriteria::FORMAT_ARRAY)->find(); - $booksArray = $books->toArray(); - $this->assertEquals(4, count($booksArray)); - - $bookObjects = PropelQuery::from('Book')->find(); - foreach ($booksArray as $key => $book) { - $this->assertEquals($bookObjects[$key]->toArray(), $book); - } - - $booksArray = $books->toArray(); - $keys = array(0, 1, 2, 3); - $this->assertEquals($keys, array_keys($booksArray)); - - $booksArray = $books->toArray(null, true); - $keys = array('Book_0', 'Book_1', 'Book_2', 'Book_3'); - $this->assertEquals($keys, array_keys($booksArray)); - - $booksArray = $books->toArray('Title'); - $keys = array('Harry Potter and the Order of the Phoenix', 'Quicksilver', 'Don Juan', 'The Tin Drum'); - $this->assertEquals($keys, array_keys($booksArray)); - - $booksArray = $books->toArray('Title', true); - $keys = array('Book_Harry Potter and the Order of the Phoenix', 'Book_Quicksilver', 'Book_Don Juan', 'Book_The Tin Drum'); - $this->assertEquals($keys, array_keys($booksArray)); - } - - public function getWorkerObject() - { - $col = new TestablePropelArrayCollection(); - $col->setModel('Book'); - $book = $col->getWorkerObject(); - $this->assertTrue($book instanceof Book, 'getWorkerObject() returns an object of the collection model'); - $book->foo = 'bar'; - $this->assertEqual('bar', $col->getWorkerObject()->foo, 'getWorkerObject() returns always the same object'); - } - - /** - * @expectedException PropelException - */ - public function testGetWorkerObjectNoModel() - { - $col = new TestablePropelArrayCollection(); - $col->getWorkerObject(); - } - -} - -class TestablePropelArrayCollection extends PropelArrayCollection -{ - public function getWorkerObject() - { - return parent::getWorkerObject(); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelCollectionTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelCollectionTest.php deleted file mode 100644 index fa76def29a..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelCollectionTest.php +++ /dev/null @@ -1,353 +0,0 @@ -assertEquals('bar1', $col[0], 'PropelCollection allows access via $foo[$index]'); - $this->assertEquals('bar2', $col[1], 'PropelCollection allows access via $foo[$index]'); - $this->assertEquals('bar3', $col[2], 'PropelCollection allows access via $foo[$index]'); - } - - public function testGetData() - { - $col = new PropelCollection(); - $this->assertEquals(array(), $col->getData(), 'getData() returns an empty array for empty collections'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $this->assertEquals($data, $col->getData(), 'getData() returns the collection data'); - $col[0] = 'bar4'; - $this->assertEquals('bar1', $data[0], 'getData() returns a copy of the collection data'); - } - - public function testSetData() - { - $col = new PropelCollection(); - $col->setData(array()); - $this->assertEquals(array(), $col->getArrayCopy(), 'setData() can set data to an empty array'); - - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection(); - $col->setData($data); - $this->assertEquals($data, $col->getArrayCopy(), 'setData() sets the collection data'); - } - - public function testGetPosition() - { - $col = new PropelCollection(); - $this->assertEquals(0, $col->getPosition(), 'getPosition() returns 0 on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $expectedPositions = array(0, 1, 2); - foreach ($col as $element) { - $this->assertEquals(array_shift($expectedPositions), $col->getPosition(), 'getPosition() returns the current position'); - $this->assertEquals($element, $col->getCurrent(), 'getPosition() does not change the current position'); - } - } - - public function testGetFirst() - { - $col = new PropelCollection(); - $this->assertNull($col->getFirst(), 'getFirst() returns null on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $this->assertEquals('bar1', $col->getFirst(), 'getFirst() returns value of the first element in the collection'); - } - - public function testIsFirst() - { - $col = new PropelCollection(); - $this->assertTrue($col->isFirst(), 'isFirst() returns true on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $expectedRes = array(true, false, false); - foreach ($col as $element) { - $this->assertEquals(array_shift($expectedRes), $col->isFirst(), 'isFirst() returns true only for the first element'); - $this->assertEquals($element, $col->getCurrent(), 'isFirst() does not change the current position'); - } - } - - public function testGetPrevious() - { - $col = new PropelCollection(); - $this->assertNull($col->getPrevious(), 'getPrevious() returns null on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $this->assertNull($col->getPrevious(), 'getPrevious() returns null when the internal pointer is at the beginning of the list'); - $col->getNext(); - $this->assertEquals('bar1', $col->getPrevious(), 'getPrevious() returns the previous element'); - $this->assertEquals('bar1', $col->getCurrent(), 'getPrevious() decrements the internal pointer'); - } - - public function testGetCurrent() - { - $col = new PropelCollection(); - $this->assertNull($col->getCurrent(), 'getCurrent() returns null on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $this->assertEquals('bar1', $col->getCurrent(), 'getCurrent() returns the value of the first element when the internal pointer is at the beginning of the list'); - foreach ($col as $key => $value) { - $this->assertEquals($value, $col->getCurrent(), 'getCurrent() returns the value of the current element in the collection'); - } - } - - public function testGetNext() - { - $col = new PropelCollection(); - $this->assertNull($col->getNext(), 'getNext() returns null on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $this->assertEquals('bar2', $col->getNext(), 'getNext() returns the second element when the internal pointer is at the beginning of the list'); - $this->assertEquals('bar2', $col->getCurrent(), 'getNext() increments the internal pointer'); - $col->getNext(); - $this->assertNull($col->getNext(), 'getNext() returns null when the internal pointer is at the end of the list'); - } - - public function testGetLast() - { - $col = new PropelCollection(); - $this->assertNull($col->getLast(), 'getLast() returns null on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $this->assertEquals('bar3', $col->getLast(), 'getLast() returns the last element'); - $this->assertEquals('bar3', $col->getCurrent(), 'getLast() moves the internal pointer to the last element'); - } - - public function testIsLAst() - { - $col = new PropelCollection(); - $this->assertTrue($col->isLast(), 'isLast() returns true on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $expectedRes = array(false, false, true); - foreach ($col as $element) { - $this->assertEquals(array_shift($expectedRes), $col->isLast(), 'isLast() returns true only for the last element'); - $this->assertEquals($element, $col->getCurrent(), 'isLast() does not change the current position'); - } - } - - public function testIsEmpty() - { - $col = new PropelCollection(); - $this->assertTrue($col->isEmpty(), 'isEmpty() returns true on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $this->assertFalse($col->isEmpty(), 'isEmpty() returns false on a non empty collection'); - } - - public function testIsOdd() - { - $col = new PropelCollection(); - $this->assertFalse($col->isOdd(), 'isOdd() returns false on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection(); - $col->setData($data); - foreach ($col as $key => $value) { - $this->assertEquals((boolean) ($key % 2), $col->isOdd(), 'isOdd() returns true only when the key is odd'); - } - } - - public function testIsEven() - { - $col = new PropelCollection(); - $this->assertTrue($col->isEven(), 'isEven() returns true on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection(); - $col->setData($data); - foreach ($col as $key => $value) { - $this->assertEquals(!(boolean) ($key % 2), $col->isEven(), 'isEven() returns true only when the key is even'); - } - } - - public function testGet() - { - $col = new PropelCollection(array('foo', 'bar')); - $this->assertEquals('foo', $col->get(0), 'get() returns an element from its key'); - } - - /** - * @expectedException PropelException - */ - public function testGetUnknownOffset() - { - $col = new PropelCollection(); - $bar = $col->get('foo'); - } - - public function testPop() - { - $col = new PropelCollection(); - $this->assertNull($col->pop(), 'pop() returns null on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $this->assertEquals('bar3', $col->pop(), 'pop() returns the last element of the collection'); - $this->assertEquals(array('bar1', 'bar2'), $col->getData(), 'pop() removes the last element of the collection'); - } - - public function testShift() - { - $col = new PropelCollection(); - $this->assertNull($col->shift(), 'shift() returns null on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $this->assertEquals('bar1', $col->shift(), 'shift() returns the first element of the collection'); - $this->assertEquals(array('bar2', 'bar3'), $col->getData(), 'shift() removes the first element of the collection'); - } - - public function testPrepend() - { - $col = new PropelCollection(); - $this->assertEquals(1, $col->prepend('a'), 'prepend() returns 1 on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $this->assertEquals(4, $col->prepend('bar4'), 'prepend() returns the new number of elements in the collection when adding a variable'); - $this->assertEquals(array('bar4', 'bar1', 'bar2', 'bar3'), $col->getData(), 'prepend() adds new element to the beginning of the collection'); - } - - public function testSet() - { - $col = new PropelCollection(); - $col->set(4, 'bar'); - $this->assertEquals(array(4 => 'bar'), $col->getData(), 'set() adds an element to the collection with a key'); - - $col = new PropelCollection(); - $col->set(null, 'foo'); - $col->set(null, 'bar'); - $this->assertEquals(array('foo', 'bar'), $col->getData(), 'set() adds an element to the collection without a key'); - } - - public function testRemove() - { - $col = new PropelCollection(); - $col[0] = 'bar'; - $col[1] = 'baz'; - $col->remove(1); - $this->assertEquals(array('bar'), $col->getData(), 'remove() removes an element from its key'); - } - - /** - * @expectedException PropelException - */ - public function testRemoveUnknownOffset() - { - $col = new PropelCollection(); - $col->remove(2); - } - - public function testClear() - { - $col = new PropelCollection(); - $col->clear(); - $this->assertEquals(array(), $col->getData(), 'clear() empties the collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $col->clear(); - $this->assertEquals(array(), $col->getData(), 'clear() empties the collection'); - } - - public function testContains() - { - $col = new PropelCollection(); - $this->assertFalse($col->contains('foo_1'), 'contains() returns false on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $this->assertTrue($col->contains('bar1'), 'contains() returns true when the key exists'); - $this->assertFalse($col->contains('bar4'), 'contains() returns false when the key does not exist'); - } - - public function testSearch() - { - $col = new PropelCollection(); - $this->assertFalse($col->search('bar1'), 'search() returns false on an empty collection'); - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $this->assertEquals(1, $col->search('bar2'), 'search() returns the key when the element exists'); - $this->assertFalse($col->search('bar4'), 'search() returns false when the element does not exist'); - } - - public function testSerializable() - { - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $col->setModel('Foo'); - $serializedCol = serialize($col); - - $col2 = unserialize($serializedCol); - $this->assertEquals($col, $col2, 'PropelCollection is serializable'); - } - - public function testGetIterator() - { - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $it1 = $col->getIterator(); - $it2 = $col->getIterator(); - $this->assertNotSame($it1, $it2, 'getIterator() returns always a new iterator'); - } - - public function testGetInternalIterator() - { - $data = array('bar1', 'bar2', 'bar3'); - $col = new PropelCollection($data); - $it1 = $col->getInternalIterator(); - $it2 = $col->getINternalIterator(); - $this->assertSame($it1, $it2, 'getInternalIterator() returns always the same iterator'); - $col->getInternalIterator()->next(); - $this->assertEquals('bar2', $col->getInternalIterator()->current(), 'getInternalIterator() returns always the same iterator'); - } - - public function testGetPeerClass() - { - $col = new PropelCollection(); - $col->setModel('Book'); - $this->assertEquals('BookPeer', $col->getPeerClass(), 'getPeerClass() returns the Peer class for the collection model'); - } - - /** - * @expectedException PropelException - */ - public function testGetPeerClassNoModel() - { - $col = new PropelCollection(); - $col->getPeerClass(); - } - - public function testGetConnection() - { - $col = new PropelCollection(); - $col->setModel('Book'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $this->assertEquals($con, $col->getConnection(), 'getConnection() returns a connection for the collection model'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); - $this->assertEquals($con, $col->getConnection(Propel::CONNECTION_WRITE), 'getConnection() accepts a connection type parameter'); - } - - /** - * @expectedException PropelException - */ - public function testGetConnectionNoModel() - { - $col = new PropelCollection(); - $col->getConnection(); - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelObjectCollectionTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelObjectCollectionTest.php deleted file mode 100644 index 55c14f2a90..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelObjectCollectionTest.php +++ /dev/null @@ -1,236 +0,0 @@ -con); - } - - public function testSave() - { - $books = PropelQuery::from('Book')->find(); - foreach ($books as $book) { - $book->setTitle('foo'); - } - $books->save(); - // check that all the books are saved - foreach ($books as $book) { - $this->assertFalse($book->isModified()); - } - // check that the modifications are persisted - BookPeer::clearInstancePool(); - $books = PropelQuery::from('Book')->find(); - foreach ($books as $book) { - $this->assertEquals('foo', $book->getTitle('foo')); - } - } - - public function testDelete() - { - $books = PropelQuery::from('Book')->find(); - $books->delete(); - // check that all the books are deleted - foreach ($books as $book) { - $this->assertTrue($book->isDeleted()); - } - // check that the modifications are persisted - BookPeer::clearInstancePool(); - $books = PropelQuery::from('Book')->find(); - $this->assertEquals(0, count($books)); - } - - public function testGetPrimaryKeys() - { - $books = PropelQuery::from('Book')->find(); - $pks = $books->getPrimaryKeys(); - $this->assertEquals(4, count($pks)); - - $keys = array('Book_0', 'Book_1', 'Book_2', 'Book_3'); - $this->assertEquals($keys, array_keys($pks)); - - $pks = $books->getPrimaryKeys(false); - $keys = array(0, 1, 2, 3); - $this->assertEquals($keys, array_keys($pks)); - - foreach ($pks as $key => $value) { - $this->assertEquals($books[$key]->getPrimaryKey(), $value); - } - } - - public function testFromArray() - { - $author = new Author(); - $author->setFirstName('Jane'); - $author->setLastName('Austen'); - $author->save(); - $books = array( - array('Title' => 'Mansfield Park', 'AuthorId' => $author->getId()), - array('Title' => 'Pride And PRejudice', 'AuthorId' => $author->getId()) - ); - $col = new PropelObjectCollection(); - $col->setModel('Book'); - $col->fromArray($books); - $col->save(); - - $nbBooks = PropelQuery::from('Book')->count(); - $this->assertEquals(6, $nbBooks); - - $booksByJane = PropelQuery::from('Book b') - ->join('b.Author a') - ->where('a.LastName = ?', 'Austen') - ->count(); - $this->assertEquals(2, $booksByJane); - } - - public function testToArray() - { - $books = PropelQuery::from('Book')->find(); - $booksArray = $books->toArray(); - $this->assertEquals(4, count($booksArray)); - - foreach ($booksArray as $key => $book) { - $this->assertEquals($books[$key]->toArray(), $book); - } - - $booksArray = $books->toArray(); - $keys = array(0, 1, 2, 3); - $this->assertEquals($keys, array_keys($booksArray)); - - $booksArray = $books->toArray(null, true); - $keys = array('Book_0', 'Book_1', 'Book_2', 'Book_3'); - $this->assertEquals($keys, array_keys($booksArray)); - - $booksArray = $books->toArray('Title'); - $keys = array('Harry Potter and the Order of the Phoenix', 'Quicksilver', 'Don Juan', 'The Tin Drum'); - $this->assertEquals($keys, array_keys($booksArray)); - - $booksArray = $books->toArray('Title', true); - $keys = array('Book_Harry Potter and the Order of the Phoenix', 'Book_Quicksilver', 'Book_Don Juan', 'Book_The Tin Drum'); - $this->assertEquals($keys, array_keys($booksArray)); - } - - public function testGetArrayCopy() - { - $books = PropelQuery::from('Book')->find(); - $booksArray = $books->getArrayCopy(); - $this->assertEquals(4, count($booksArray)); - - foreach ($booksArray as $key => $book) { - $this->assertEquals($books[$key], $book); - } - - $booksArray = $books->getArrayCopy(); - $keys = array(0, 1, 2, 3); - $this->assertEquals($keys, array_keys($booksArray)); - - $booksArray = $books->getArrayCopy(null, true); - $keys = array('Book_0', 'Book_1', 'Book_2', 'Book_3'); - $this->assertEquals($keys, array_keys($booksArray)); - - $booksArray = $books->getArrayCopy('Title'); - $keys = array('Harry Potter and the Order of the Phoenix', 'Quicksilver', 'Don Juan', 'The Tin Drum'); - $this->assertEquals($keys, array_keys($booksArray)); - - $booksArray = $books->getArrayCopy('Title', true); - $keys = array('Book_Harry Potter and the Order of the Phoenix', 'Book_Quicksilver', 'Book_Don Juan', 'Book_The Tin Drum'); - $this->assertEquals($keys, array_keys($booksArray)); - } - - public function testToKeyValue() - { - $books = PropelQuery::from('Book')->find(); - - $expected = array(); - foreach ($books as $book) { - $expected[$book->getTitle()] = $book->getISBN(); - } - $booksArray = $books->toKeyValue('Title', 'ISBN'); - $this->assertEquals(4, count($booksArray)); - $this->assertEquals($expected, $booksArray, 'toKeyValue() turns the collection to an associative array'); - - $expected = array(); - foreach ($books as $book) { - $expected[$book->getISBN()] = $book->getTitle(); - } - $booksArray = $books->toKeyValue('ISBN'); - $this->assertEquals($expected, $booksArray, 'toKeyValue() uses __toString() for the value if no second field name is passed'); - - $expected = array(); - foreach ($books as $book) { - $expected[$book->getId()] = $book->getTitle(); - } - $booksArray = $books->toKeyValue(); - $this->assertEquals($expected, $booksArray, 'toKeyValue() uses primary key for the key and __toString() for the value if no field name is passed'); - } - - public function testPopulateRelation() - { - AuthorPeer::clearInstancePool(); - BookPeer::clearInstancePool(); - $authors = AuthorQuery::create()->find(); - $books = $authors->populateRelation('Book'); - $this->assertTrue($books instanceof PropelObjectCollection, 'populateRelation() returns a PropelCollection instance'); - $this->assertEquals('Book', $books->getModel(), 'populateRelation() returns a collection of the related objects'); - $this->assertEquals(4, count($books), 'populateRelation() the list of related objects'); - } - - public function testPopulateRelationCriteria() - { - AuthorPeer::clearInstancePool(); - BookPeer::clearInstancePool(); - $authors = AuthorQuery::create()->find(); - $c = new Criteria(); - $c->setLimit(3); - $books = $authors->populateRelation('Book', $c); - $this->assertEquals(3, count($books), 'populateRelation() accepts an optional criteria object to filter the query'); - } - - public function testPopulateRelationOneToMany() - { - $con = Propel::getConnection(); - AuthorPeer::clearInstancePool(); - BookPeer::clearInstancePool(); - $authors = AuthorQuery::create()->find($con); - $count = $con->getQueryCount(); - $books = $authors->populateRelation('Book', null, $con); - foreach ($authors as $author) { - foreach ($author->getBooks() as $book) { - $this->assertEquals($author, $book->getAuthor()); - } - } - $this->assertEquals($count + 1, $con->getQueryCount(), 'populateRelation() populates a one-to-many relationship with a single supplementary query'); - } - - public function testPopulateRelationManyToOne() - { - $con = Propel::getConnection(); - AuthorPeer::clearInstancePool(); - BookPeer::clearInstancePool(); - $books = BookQuery::create()->find($con); - $count = $con->getQueryCount(); - $books->populateRelation('Author', null, $con); - foreach ($books as $book) { - $author = $book->getAuthor(); - } - $this->assertEquals($count + 1, $con->getQueryCount(), 'populateRelation() populates a many-to-one relationship with a single supplementary query'); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelOnDemandCollectionTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelOnDemandCollectionTest.php deleted file mode 100644 index 8ceddb22e6..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelOnDemandCollectionTest.php +++ /dev/null @@ -1,76 +0,0 @@ -con); - $this->books = PropelQuery::from('Book')->setFormatter(ModelCriteria::FORMAT_ON_DEMAND)->find(); - } - - public function testSetFormatter() - { - $this->assertTrue($this->books instanceof PropelOnDemandCollection); - $this->assertEquals(4, count($this->books)); - } - - public function testKeys() - { - $i = 0; - foreach ($this->books as $key => $book) { - $this->assertEquals($i, $key); - $i++; - } - } - - /** - * @expectedException PropelException - */ - public function testoffsetExists() - { - $this->books->offsetExists(2); - } - - /** - * @expectedException PropelException - */ - public function testoffsetGet() - { - $this->books->offsetGet(2); - } - - /** - * @expectedException PropelException - */ - public function testoffsetSet() - { - $this->books->offsetSet(2, 'foo'); - } - - /** - * @expectedException PropelException - */ - public function testoffsetUnset() - { - $this->books->offsetUnset(2); - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelOnDemandIteratorTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelOnDemandIteratorTest.php deleted file mode 100644 index 587f4602e2..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/collection/PropelOnDemandIteratorTest.php +++ /dev/null @@ -1,59 +0,0 @@ -con); - } - - public function testInstancePoolingDisabled() - { - Propel::enableInstancePooling(); - $books = PropelQuery::from('Book') - ->setFormatter(ModelCriteria::FORMAT_ON_DEMAND) - ->find($this->con); - foreach ($books as $book) { - $this->assertFalse(Propel::isInstancePoolingEnabled()); - } - } - - public function testInstancePoolingReenabled() - { - Propel::enableInstancePooling(); - $books = PropelQuery::from('Book') - ->setFormatter(ModelCriteria::FORMAT_ON_DEMAND) - ->find($this->con); - foreach ($books as $book) { - } - $this->assertTrue(Propel::isInstancePoolingEnabled()); - - Propel::disableInstancePooling(); - $books = PropelQuery::from('Book') - ->setFormatter(ModelCriteria::FORMAT_ON_DEMAND) - ->find($this->con); - foreach ($books as $book) { - } - $this->assertFalse(Propel::isInstancePoolingEnabled()); - Propel::enableInstancePooling(); - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/connection/PropelPDOTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/connection/PropelPDOTest.php deleted file mode 100644 index 0befc1d1d3..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/connection/PropelPDOTest.php +++ /dev/null @@ -1,425 +0,0 @@ -assertFalse($con->getAttribute(PropelPDO::PROPEL_ATTR_CACHE_PREPARES)); - $con->setAttribute(PropelPDO::PROPEL_ATTR_CACHE_PREPARES, true); - $this->assertTrue($con->getAttribute(PropelPDO::PROPEL_ATTR_CACHE_PREPARES)); - - $con->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER); - $this->assertEquals(PDO::CASE_LOWER, $con->getAttribute(PDO::ATTR_CASE)); - } - - public function testNestedTransactionCommit() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $driver = $con->getAttribute(PDO::ATTR_DRIVER_NAME); - - $this->assertEquals(0, $con->getNestedTransactionCount(), 'nested transaction is equal to 0 before transaction'); - $this->assertFalse($con->isInTransaction(), 'PropelPDO is not in transaction by default'); - - $con->beginTransaction(); - - $this->assertEquals(1, $con->getNestedTransactionCount(), 'nested transaction is incremented after main transaction begin'); - $this->assertTrue($con->isInTransaction(), 'PropelPDO is in transaction after main transaction begin'); - - try { - - $a = new Author(); - $a->setFirstName('Test'); - $a->setLastName('User'); - $a->save($con); - $authorId = $a->getId(); - $this->assertNotNull($authorId, "Expected valid new author ID"); - - $con->beginTransaction(); - - $this->assertEquals(2, $con->getNestedTransactionCount(), 'nested transaction is incremented after nested transaction begin'); - $this->assertTrue($con->isInTransaction(), 'PropelPDO is in transaction after nested transaction begin'); - - try { - - $a2 = new Author(); - $a2->setFirstName('Test2'); - $a2->setLastName('User2'); - $a2->save($con); - $authorId2 = $a2->getId(); - $this->assertNotNull($authorId2, "Expected valid new author ID"); - - $con->commit(); - - $this->assertEquals(1, $con->getNestedTransactionCount(), 'nested transaction decremented after nested transaction commit'); - $this->assertTrue($con->isInTransaction(), 'PropelPDO is in transaction after main transaction commit'); - - } catch (Exception $e) { - $con->rollBack(); - throw $e; - } - - $con->commit(); - - $this->assertEquals(0, $con->getNestedTransactionCount(), 'nested transaction decremented after main transaction commit'); - $this->assertFalse($con->isInTransaction(), 'PropelPDO is not in transaction after main transaction commit'); - - } catch (Exception $e) { - $con->rollBack(); - } - - AuthorPeer::clearInstancePool(); - $at = AuthorPeer::retrieveByPK($authorId); - $this->assertNotNull($at, "Committed transaction is persisted in database"); - $at2 = AuthorPeer::retrieveByPK($authorId2); - $this->assertNotNull($at2, "Committed transaction is persisted in database"); - } - - /** - * @link http://propel.phpdb.org/trac/ticket/699 - */ - public function testNestedTransactionRollBackRethrow() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $driver = $con->getAttribute(PDO::ATTR_DRIVER_NAME); - - $con->beginTransaction(); - try { - - $a = new Author(); - $a->setFirstName('Test'); - $a->setLastName('User'); - $a->save($con); - $authorId = $a->getId(); - - $this->assertNotNull($authorId, "Expected valid new author ID"); - - $con->beginTransaction(); - - $this->assertEquals(2, $con->getNestedTransactionCount(), 'nested transaction is incremented after nested transaction begin'); - $this->assertTrue($con->isInTransaction(), 'PropelPDO is in transaction after nested transaction begin'); - - try { - $con->exec('INVALID SQL'); - $this->fail("Expected exception on invalid SQL"); - } catch (PDOException $x) { - $con->rollBack(); - - $this->assertEquals(1, $con->getNestedTransactionCount(), 'nested transaction decremented after nested transaction rollback'); - $this->assertTrue($con->isInTransaction(), 'PropelPDO is in transaction after main transaction rollback'); - - throw $x; - } - - $con->commit(); - } catch (Exception $x) { - $con->rollBack(); - } - - AuthorPeer::clearInstancePool(); - $at = AuthorPeer::retrieveByPK($authorId); - $this->assertNull($at, "Rolled back transaction is not persisted in database"); - } - - /** - * @link http://propel.phpdb.org/trac/ticket/699 - */ - public function testNestedTransactionRollBackSwallow() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $driver = $con->getAttribute(PDO::ATTR_DRIVER_NAME); - - $con->beginTransaction(); - try { - - $a = new Author(); - $a->setFirstName('Test'); - $a->setLastName('User'); - $a->save($con); - - $authorId = $a->getId(); - $this->assertNotNull($authorId, "Expected valid new author ID"); - - $con->beginTransaction(); - try { - - $a2 = new Author(); - $a2->setFirstName('Test2'); - $a2->setLastName('User2'); - $a2->save($con); - $authorId2 = $a2->getId(); - $this->assertNotNull($authorId2, "Expected valid new author ID"); - - $con->exec('INVALID SQL'); - $this->fail("Expected exception on invalid SQL"); - } catch (PDOException $e) { - $con->rollBack(); - // NO RETHROW - } - - $a3 = new Author(); - $a3->setFirstName('Test2'); - $a3->setLastName('User2'); - $a3->save($con); - - $authorId3 = $a3->getId(); - $this->assertNotNull($authorId3, "Expected valid new author ID"); - - $con->commit(); - $this->fail("Commit fails after a nested rollback"); - } catch (PropelException $e) { - $this->assertTrue(true, "Commit fails after a nested rollback"); - $con->rollback(); - } - - AuthorPeer::clearInstancePool(); - $at = AuthorPeer::retrieveByPK($authorId); - $this->assertNull($at, "Rolled back transaction is not persisted in database"); - $at2 = AuthorPeer::retrieveByPK($authorId2); - $this->assertNull($at2, "Rolled back transaction is not persisted in database"); - $at3 = AuthorPeer::retrieveByPK($authorId3); - $this->assertNull($at3, "Rolled back nested transaction is not persisted in database"); - } - - public function testNestedTransactionForceRollBack() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $driver = $con->getAttribute(PDO::ATTR_DRIVER_NAME); - - // main transaction - $con->beginTransaction(); - - $a = new Author(); - $a->setFirstName('Test'); - $a->setLastName('User'); - $a->save($con); - $authorId = $a->getId(); - - // nested transaction - $con->beginTransaction(); - - $a2 = new Author(); - $a2->setFirstName('Test2'); - $a2->setLastName('User2'); - $a2->save($con); - $authorId2 = $a2->getId(); - - // force rollback - $con->forceRollback(); - - $this->assertEquals(0, $con->getNestedTransactionCount(), 'nested transaction is null after nested transaction forced rollback'); - $this->assertFalse($con->isInTransaction(), 'PropelPDO is not in transaction after nested transaction force rollback'); - - AuthorPeer::clearInstancePool(); - $at = AuthorPeer::retrieveByPK($authorId); - $this->assertNull($at, "Rolled back transaction is not persisted in database"); - $at2 = AuthorPeer::retrieveByPK($authorId2); - $this->assertNull($at2, "Forced Rolled back nested transaction is not persisted in database"); - } - - public function testLatestQuery() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $con->setLastExecutedQuery(123); - $this->assertEquals(123, $con->getLastExecutedQuery(), 'PropelPDO has getter and setter for last executed query'); - } - - public function testLatestQueryMoreThanTenArgs() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c = new Criteria(); - $c->add(BookPeer::ID, array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), Criteria::IN); - $books = BookPeer::doSelect($c, $con); - $expected = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.ID IN (1,1,1,1,1,1,1,1,1,1,1,1)"; - $this->assertEquals($expected, $con->getLastExecutedQuery(), 'PropelPDO correctly replaces arguments in queries'); - } - - public function testQueryCount() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $count = $con->getQueryCount(); - $con->incrementQueryCount(); - $this->assertEquals($count + 1, $con->getQueryCount(), 'PropelPDO has getter and incrementer for query count'); - } - - public function testUseDebug() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $con->useDebug(false); - $this->assertEquals(array('PDOStatement'), $con->getAttribute(PDO::ATTR_STATEMENT_CLASS), 'Statement is PDOStatement when debug is false'); - $con->useDebug(true); - $this->assertEquals(array('DebugPDOStatement', array($con)), $con->getAttribute(PDO::ATTR_STATEMENT_CLASS), 'statement is DebugPDOStament when debug is true'); - } - - public function testDebugLatestQuery() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c = new Criteria(); - $c->add(BookPeer::TITLE, 'Harry%s', Criteria::LIKE); - - $con->useDebug(false); - $this->assertEquals('', $con->getLastExecutedQuery(), 'PropelPDO reinitializes the latest query when debug is set to false'); - - $books = BookPeer::doSelect($c, $con); - $this->assertEquals('', $con->getLastExecutedQuery(), 'PropelPDO does not update the last executed query when useLogging is false'); - - $con->useDebug(true); - $books = BookPeer::doSelect($c, $con); - $latestExecutedQuery = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.TITLE LIKE 'Harry%s'"; - if (!Propel::getDB(BookPeer::DATABASE_NAME)->useQuoteIdentifier()) { - $latestExecutedQuery = str_replace('`', '', $latestExecutedQuery); - } - $this->assertEquals($latestExecutedQuery, $con->getLastExecutedQuery(), 'PropelPDO updates the last executed query when useLogging is true'); - - BookPeer::doDeleteAll($con); - $latestExecutedQuery = "DELETE FROM `book`"; - $this->assertEquals($latestExecutedQuery, $con->getLastExecutedQuery(), 'PropelPDO updates the last executed query on delete operations'); - - $sql = 'DELETE FROM book WHERE 1=1'; - $con->exec($sql); - $this->assertEquals($sql, $con->getLastExecutedQuery(), 'PropelPDO updates the last executed query on exec operations'); - - $sql = 'DELETE FROM book WHERE 2=2'; - $con->query($sql); - $this->assertEquals($sql, $con->getLastExecutedQuery(), 'PropelPDO updates the last executed query on query operations'); - - $stmt = $con->prepare('DELETE FROM book WHERE 1=:p1'); - $stmt->bindValue(':p1', '2'); - $stmt->execute(); - $this->assertEquals("DELETE FROM book WHERE 1='2'", $con->getLastExecutedQuery(), 'PropelPDO updates the last executed query on prapared statements'); - - $con->useDebug(false); - $this->assertEquals('', $con->getLastExecutedQuery(), 'PropelPDO reinitializes the latest query when debug is set to false'); - - $con->useDebug(true); - } - - public function testDebugQueryCount() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c = new Criteria(); - $c->add(BookPeer::TITLE, 'Harry%s', Criteria::LIKE); - - $con->useDebug(false); - $this->assertEquals(0, $con->getQueryCount(), 'PropelPDO does not update the query count when useLogging is false'); - - $books = BookPeer::doSelect($c, $con); - $this->assertEquals(0, $con->getQueryCount(), 'PropelPDO does not update the query count when useLogging is false'); - - $con->useDebug(true); - $books = BookPeer::doSelect($c, $con); - $this->assertEquals(1, $con->getQueryCount(), 'PropelPDO updates the query count when useLogging is true'); - - BookPeer::doDeleteAll($con); - $this->assertEquals(2, $con->getQueryCount(), 'PropelPDO updates the query count on delete operations'); - - $sql = 'DELETE FROM book WHERE 1=1'; - $con->exec($sql); - $this->assertEquals(3, $con->getQueryCount(), 'PropelPDO updates the query count on exec operations'); - - $sql = 'DELETE FROM book WHERE 2=2'; - $con->query($sql); - $this->assertEquals(4, $con->getQueryCount(), 'PropelPDO updates the query count on query operations'); - - $stmt = $con->prepare('DELETE FROM book WHERE 1=:p1'); - $stmt->bindValue(':p1', '2'); - $stmt->execute(); - $this->assertEquals(5, $con->getQueryCount(), 'PropelPDO updates the query count on prapared statements'); - - $con->useDebug(false); - $this->assertEquals(0, $con->getQueryCount(), 'PropelPDO reinitializes the query count when debug is set to false'); - - $con->useDebug(true); - } - - public function testDebugLog() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $config = Propel::getConfiguration(PropelConfiguration::TYPE_OBJECT); - - // save data to return to normal state after test - $logger = $con->getLogger(); - - $testLog = new myLogger(); - $con->setLogger($testLog); - - $logEverything = array('PropelPDO::exec', 'PropelPDO::query', 'PropelPDO::beginTransaction', 'PropelPDO::commit', 'PropelPDO::rollBack', 'DebugPDOStatement::execute'); - Propel::getConfiguration(PropelConfiguration::TYPE_OBJECT)->setParameter("debugpdo.logging.methods", $logEverything); - $con->useDebug(true); - - // test transaction log - $con->beginTransaction(); - $this->assertEquals('log: Begin transaction', $testLog->latestMessage, 'PropelPDO logs begin transation in debug mode'); - - $con->commit(); - $this->assertEquals('log: Commit transaction', $testLog->latestMessage, 'PropelPDO logs commit transation in debug mode'); - - $con->beginTransaction(); - $con->rollBack(); - $this->assertEquals('log: Rollback transaction', $testLog->latestMessage, 'PropelPDO logs rollback transation in debug mode'); - - $con->beginTransaction(); - $testLog->latestMessage = ''; - $con->beginTransaction(); - $this->assertEquals('', $testLog->latestMessage, 'PropelPDO does not log nested begin transation in debug mode'); - $con->commit(); - $this->assertEquals('', $testLog->latestMessage, 'PropelPDO does not log nested commit transation in debug mode'); - $con->beginTransaction(); - $con->rollBack(); - $this->assertEquals('', $testLog->latestMessage, 'PropelPDO does not log nested rollback transation in debug mode'); - $con->rollback(); - - // test query log - $con->beginTransaction(); - - $c = new Criteria(); - $c->add(BookPeer::TITLE, 'Harry%s', Criteria::LIKE); - - $books = BookPeer::doSelect($c, $con); - $latestExecutedQuery = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.TITLE LIKE 'Harry%s'"; - $this->assertEquals('log: ' . $latestExecutedQuery, $testLog->latestMessage, 'PropelPDO logs queries and populates bound parameters in debug mode'); - - BookPeer::doDeleteAll($con); - $latestExecutedQuery = "DELETE FROM `book`"; - $this->assertEquals('log: ' . $latestExecutedQuery, $testLog->latestMessage, 'PropelPDO logs deletion queries in debug mode'); - - $latestExecutedQuery = 'DELETE FROM book WHERE 1=1'; - $con->exec($latestExecutedQuery); - $this->assertEquals('log: ' . $latestExecutedQuery, $testLog->latestMessage, 'PropelPDO logs exec queries in debug mode'); - - $con->commit(); - - // return to normal state after test - $con->setLogger($logger); - $config->setParameter("debugpdo.logging.methods", array('PropelPDO::exec', 'PropelPDO::query', 'DebugPDOStatement::execute')); - } -} - -class myLogger -{ - public $latestMessage = ''; - - public function __call($method, $arguments) - { - $this->latestMessage = $method . ': ' . array_shift($arguments); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelArrayFormatterTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelArrayFormatterTest.php deleted file mode 100644 index b1bcde670f..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelArrayFormatterTest.php +++ /dev/null @@ -1,129 +0,0 @@ -query('SELECT * FROM book'); - $formatter = new PropelArrayFormatter(); - try { - $books = $formatter->format($stmt); - $this->fail('PropelArrayFormatter::format() throws an exception when called with no valid criteria'); - } catch (PropelException $e) { - $this->assertTrue(true,'PropelArrayFormatter::format() throws an exception when called with no valid criteria'); - } - } - - public function testFormatManyResults() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book'); - $formatter = new PropelArrayFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - $this->assertTrue($books instanceof PropelCollection, 'PropelArrayFormatter::format() returns a PropelCollection'); - $this->assertEquals(4, count($books), 'PropelArrayFormatter::format() returns as many rows as the results in the query'); - foreach ($books as $book) { - $this->assertTrue(is_array($book), 'PropelArrayFormatter::format() returns an array of arrays'); - } - } - - public function testFormatOneResult() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book WHERE book.TITLE = "Quicksilver"'); - $formatter = new PropelArrayFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - $this->assertTrue($books instanceof PropelCollection, 'PropelArrayFormatter::format() returns a PropelCollection'); - $this->assertEquals(1, count($books), 'PropelArrayFormatter::format() returns as many rows as the results in the query'); - $book = $books->shift(); - $this->assertTrue(is_array($book), 'PropelArrayFormatter::format() returns an array of arrays'); - $this->assertEquals('Quicksilver', $book['Title'], 'PropelArrayFormatter::format() returns the arrays matching the query'); - $expected = array('Id', 'Title', 'ISBN', 'Price', 'PublisherId', 'AuthorId'); - $this->assertEquals($expected, array_keys($book), 'PropelArrayFormatter::format() returns an associative array with column phpNames as keys'); - } - - public function testFormatNoResult() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book WHERE book.TITLE = "foo"'); - $formatter = new PropelArrayFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - $this->assertTrue($books instanceof PropelCollection, 'PropelArrayFormatter::format() returns a PropelCollection'); - $this->assertEquals(0, count($books), 'PropelArrayFormatter::format() returns as many rows as the results in the query'); - } - - public function testFormatOneNoCriteria() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book'); - $formatter = new PropelArrayFormatter(); - try { - $book = $formatter->formatOne($stmt); - $this->fail('PropelArrayFormatter::formatOne() throws an exception when called with no valid criteria'); - } catch (PropelException $e) { - $this->assertTrue(true,'PropelArrayFormatter::formatOne() throws an exception when called with no valid criteria'); - } - } - - public function testFormatOneManyResults() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book'); - $formatter = new PropelArrayFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $book = $formatter->formatOne($stmt); - - $this->assertTrue(is_array($book), 'PropelArrayFormatter::formatOne() returns an array'); - $this->assertEquals(array('Id', 'Title', 'ISBN', 'Price', 'PublisherId', 'AuthorId'), array_keys($book), 'PropelArrayFormatter::formatOne() returns a single row even if the query has many results'); - } - - public function testFormatOneNoResult() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book WHERE book.TITLE = "foo"'); - $formatter = new PropelArrayFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $book = $formatter->formatOne($stmt); - - $this->assertNull($book, 'PropelArrayFormatter::formatOne() returns null when no result'); - } - - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelArrayFormatterWithTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelArrayFormatterWithTest.php deleted file mode 100644 index e0addfc469..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelArrayFormatterWithTest.php +++ /dev/null @@ -1,383 +0,0 @@ -findOne($con); - $count = $con->getQueryCount(); - $this->assertEquals($book['Title'], 'Don Juan', 'Main object is correctly hydrated ' . $msg); - $author = $book['Author']; - $this->assertEquals($author['LastName'], 'Byron', 'Related object is correctly hydrated ' . $msg); - $publisher = $book['Publisher']; - $this->assertEquals($publisher['Name'], 'Penguin', 'Related object is correctly hydrated ' . $msg); - } - - public function testFindOneWith() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $c->orderBy('Book.Title'); - $c->join('Book.Author'); - $c->with('Author'); - $c->join('Book.Publisher'); - $c->with('Publisher'); - $this->assertCorrectHydration1($c, 'without instance pool'); - } - - public function testFindOneWithAlias() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $c->orderBy('Book.Title'); - $c->join('Book.Author a'); - $c->with('a'); - $c->join('Book.Publisher p'); - $c->with('p'); - $this->assertCorrectHydration1($c, 'with alias'); - } - - public function testFindOneWithMainAlias() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $c->setModelAlias('b', true); - $c->orderBy('b.Title'); - $c->join('b.Author a'); - $c->with('a'); - $c->join('b.Publisher p'); - $c->with('p'); - $this->assertCorrectHydration1($c, 'with main alias'); - } - - public function testFindOneWithUsingInstancePool() - { - BookstoreDataPopulator::populate(); - // instance pool contains all objects by default, since they were just populated - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $c->orderBy('Book.Title'); - $c->join('Book.Author'); - $c->with('Author'); - $c->join('Book.Publisher'); - $c->with('Publisher'); - $this->assertCorrectHydration1($c, 'with instance pool'); - } - - public function testFindOneWithEmptyLeftJoin() - { - // save a book with no author - $b = new Book(); - $b->setTitle('Foo'); - $b->save(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $c->where('Book.Title = ?', 'Foo'); - $c->leftJoin('Book.Author'); - $c->with('Author'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $book = $c->findOne($con); - $count = $con->getQueryCount(); - $author = $book['Author']; - $this->assertEquals(array(), $author, 'Related object is not hydrated if empty'); - } - - public function testFindOneWithRelationName() - { - BookstoreDataPopulator::populate(); - BookstoreEmployeePeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'BookstoreEmployee'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $c->join('BookstoreEmployee.Supervisor s'); - $c->with('s'); - $c->where('s.Name = ?', 'John'); - $emp = $c->findOne(); - $this->assertEquals($emp['Name'], 'Pieter', 'Main object is correctly hydrated'); - $sup = $emp['Supervisor']; - $this->assertEquals($sup['Name'], 'John', 'Related object is correctly hydrated'); - } - - /** - * @see http://www.propelorm.org/ticket/959 - */ - public function testFindOneWithSameRelatedObject() - { - BookPeer::doDeleteAll(); - AuthorPeer::doDeleteAll(); - $auth = new Author(); - $auth->setFirstName('John'); - $auth->save(); - $book1 = new Book(); - $book1->setTitle('Hello'); - $book1->setAuthor($auth); - $book1->save(); - $book2 = new Book(); - $book2->setTitle('World'); - $book2->setAuthor($auth); - $book2->save(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $c->join('Book.Author'); - $c->with('Author'); - $books = $c->find(); - - $this->assertEquals(2, count($books)); - $firstBook = $books[0]; - $this->assertTrue(isset($firstBook['Author'])); - $secondBook = $books[1]; - $this->assertTrue(isset($secondBook['Author'])); - } - - public function testFindOneWithDuplicateRelation() - { - EssayPeer::doDeleteAll(); - $auth1 = new Author(); - $auth1->setFirstName('John'); - $auth1->save(); - $auth2 = new Author(); - $auth2->setFirstName('Jack'); - $auth2->save(); - $essay = new Essay(); - $essay->setTitle('Foo'); - $essay->setFirstAuthor($auth1->getId()); - $essay->setSecondAuthor($auth2->getId()); - $essay->save(); - AuthorPeer::clearInstancePool(); - EssayPeer::clearInstancePool(); - - $c = new ModelCriteria('bookstore', 'Essay'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $c->join('Essay.AuthorRelatedByFirstAuthor'); - $c->with('AuthorRelatedByFirstAuthor'); - $c->where('Essay.Title = ?', 'Foo'); - $essay = $c->findOne(); - $this->assertEquals($essay['Title'], 'Foo', 'Main object is correctly hydrated'); - $firstAuthor = $essay['AuthorRelatedByFirstAuthor']; - $this->assertEquals($firstAuthor['FirstName'], 'John', 'Related object is correctly hydrated'); - $this->assertFalse(array_key_exists('AuthorRelatedBySecondAuthor', $essay), 'Only related object specified in with() is hydrated'); - } - - public function testFindOneWithDistantClass() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Review'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $c->where('Review.Recommended = ?', true); - $c->join('Review.Book'); - $c->with('Book'); - $c->join('Book.Author'); - $c->with('Author'); - $review = $c->findOne(); - $this->assertEquals($review['ReviewedBy'], 'Washington Post', 'Main object is correctly hydrated'); - $book = $review['Book']; - $this->assertEquals('Harry Potter and the Order of the Phoenix', $book['Title'], 'Related object is correctly hydrated'); - $author = $book['Author']; - $this->assertEquals('J.K.', $author['FirstName'], 'Related object is correctly hydrated'); - } - - /** - * @expectedException PropelException - */ - public function testFindOneWithOneToManyAndLimit() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $c->add(BookPeer::ISBN, '043935806X'); - $c->leftJoin('Book.Review'); - $c->with('Review'); - $c->limit(5); - $books = $c->find(); - } - - public function testFindOneWithOneToMany() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $c->add(BookPeer::ISBN, '043935806X'); - $c->leftJoin('Book.Review'); - $c->with('Review'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $books = $c->find($con); - $this->assertEquals(1, count($books), 'with() does not duplicate the main object'); - $book = $books[0]; - $this->assertEquals($book['Title'], 'Harry Potter and the Order of the Phoenix', 'Main object is correctly hydrated'); - $this->assertEquals(array('Id', 'Title', 'ISBN', 'Price', 'PublisherId', 'AuthorId', 'Reviews'), array_keys($book), 'with() adds a plural index for the one to many relationship'); - $reviews = $book['Reviews']; - $this->assertEquals(2, count($reviews), 'Related objects are correctly hydrated'); - $review1 = $reviews[0]; - $this->assertEquals(array('Id', 'ReviewedBy', 'ReviewDate', 'Recommended', 'Status', 'BookId'), array_keys($review1), 'with() Related objects are correctly hydrated'); - } - - public function testFindOneWithOneToManyCustomOrder() - { - $author1 = new Author(); - $author1->setFirstName('AA'); - $author2 = new Author(); - $author2->setFirstName('BB'); - $book1 = new Book(); - $book1->setTitle('Aaa'); - $book1->setAuthor($author1); - $book1->save(); - $book2 = new Book(); - $book2->setTitle('Bbb'); - $book2->setAuthor($author2); - $book2->save(); - $book3 = new Book(); - $book3->setTitle('Ccc'); - $book3->setAuthor($author1); - $book3->save(); - $authors = AuthorQuery::create() - ->setFormatter(ModelCriteria::FORMAT_ARRAY) - ->leftJoin('Author.Book') - ->orderBy('Book.Title') - ->with('Book') - ->find(); - $this->assertEquals(2, count($authors), 'with() used on a many-to-many doesn\'t change the main object count'); - } - - public function testFindOneWithOneToManyThenManyToOne() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Author'); - $c->add(AuthorPeer::LAST_NAME, 'Rowling'); - $c->leftJoinWith('Author.Book'); - $c->leftJoinWith('Book.Review'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $authors = $c->find($con); - $this->assertEquals(1, count($authors), 'with() does not duplicate the main object'); - $rowling = $authors[0]; - $this->assertEquals($rowling['FirstName'], 'J.K.', 'Main object is correctly hydrated'); - $books = $rowling['Books']; - $this->assertEquals(1, count($books), 'Related objects are correctly hydrated'); - $book = $books[0]; - $this->assertEquals($book['Title'], 'Harry Potter and the Order of the Phoenix', 'Related object is correctly hydrated'); - $reviews = $book['Reviews']; - $this->assertEquals(2, count($reviews), 'Related objects are correctly hydrated'); - } - - public function testFindOneWithOneToManyThenManyToOneUsingAlias() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Author'); - $c->add(AuthorPeer::LAST_NAME, 'Rowling'); - $c->leftJoinWith('Author.Book b'); - $c->leftJoinWith('b.Review r'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $authors = $c->find($con); - $this->assertEquals(1, count($authors), 'with() does not duplicate the main object'); - $rowling = $authors[0]; - $this->assertEquals($rowling['FirstName'], 'J.K.', 'Main object is correctly hydrated'); - $books = $rowling['Books']; - $this->assertEquals(1, count($books), 'Related objects are correctly hydrated'); - $book = $books[0]; - $this->assertEquals($book['Title'], 'Harry Potter and the Order of the Phoenix', 'Related object is correctly hydrated'); - $reviews = $book['Reviews']; - $this->assertEquals(2, count($reviews), 'Related objects are correctly hydrated'); - } - - public function testFindOneWithColumn() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $c->filterByTitle('The Tin Drum'); - $c->join('Book.Author'); - $c->withColumn('Author.FirstName', 'AuthorName'); - $c->withColumn('Author.LastName', 'AuthorName2'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $book = $c->findOne($con); - $this->assertEquals(array('Id', 'Title', 'ISBN', 'Price', 'PublisherId', 'AuthorId', 'AuthorName', 'AuthorName2'), array_keys($book), 'withColumn() do not change the resulting model class'); - $this->assertEquals('The Tin Drum', $book['Title']); - $this->assertEquals('Gunter', $book['AuthorName'], 'PropelArrayFormatter adds withColumns as columns'); - $this->assertEquals('Grass', $book['AuthorName2'], 'PropelArrayFormatter correctly hydrates all as columns'); - } - - public function testFindOneWithClassAndColumn() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ARRAY); - $c->filterByTitle('The Tin Drum'); - $c->join('Book.Author'); - $c->withColumn('Author.FirstName', 'AuthorName'); - $c->withColumn('Author.LastName', 'AuthorName2'); - $c->with('Author'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $book = $c->findOne($con); - $this->assertEquals(array('Id', 'Title', 'ISBN', 'Price', 'PublisherId', 'AuthorId', 'Author', 'AuthorName', 'AuthorName2'), array_keys($book), 'withColumn() do not change the resulting model class'); - $this->assertEquals('The Tin Drum', $book['Title']); - $this->assertEquals('Gunter', $book['Author']['FirstName'], 'PropelArrayFormatter correctly hydrates withclass and columns'); - $this->assertEquals('Gunter', $book['AuthorName'], 'PropelArrayFormatter adds withColumns as columns'); - $this->assertEquals('Grass', $book['AuthorName2'], 'PropelArrayFormatter correctly hydrates all as columns'); - } - - public function testFindPkWithOneToMany() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $book = BookQuery::create() - ->findOneByTitle('Harry Potter and the Order of the Phoenix', $con); - $pk = $book->getPrimaryKey(); - BookPeer::clearInstancePool(); - $book = BookQuery::create() - ->setFormatter(ModelCriteria::FORMAT_ARRAY) - ->joinWith('Review') - ->findPk($pk, $con); - $reviews = $book['Reviews']; - $this->assertEquals(2, count($reviews), 'Related objects are correctly hydrated'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelObjectFormatterInheritanceTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelObjectFormatterInheritanceTest.php deleted file mode 100644 index 95ea1cce36..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelObjectFormatterInheritanceTest.php +++ /dev/null @@ -1,55 +0,0 @@ -setName('b1'); - $b1->save(); - $b2 = new BookstoreManager(); - $b2->setName('b2'); - $b2->save(); - $b3 = new BookstoreCashier(); - $b3->setName('b3'); - $b3->save(); - } - - public function testFormat() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - BookstoreEmployeePeer::clearInstancePool(); - - $stmt = $con->query('SELECT * FROM bookstore_employee'); - $formatter = new PropelObjectFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'BookstoreEmployee')); - $emps = $formatter->format($stmt); - $expectedClass = array( - 'b1' =>'BookstoreEmployee', - 'b2' =>'BookstoreManager', - 'b3' =>'BookstoreCashier' - ); - foreach ($emps as $emp) { - $this->assertEquals($expectedClass[$emp->getName()], get_class($emp), 'format() creates objects of the correct class when using inheritance'); - } - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelObjectFormatterTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelObjectFormatterTest.php deleted file mode 100644 index 7321a2fbf7..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelObjectFormatterTest.php +++ /dev/null @@ -1,125 +0,0 @@ -query('SELECT * FROM book'); - $formatter = new PropelObjectFormatter(); - try { - $books = $formatter->format($stmt); - $this->fail('PropelObjectFormatter::format() trows an exception when called with no valid criteria'); - } catch (PropelException $e) { - $this->assertTrue(true,'PropelObjectFormatter::format() trows an exception when called with no valid criteria'); - } - } - - public function testFormatManyResults() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book'); - $formatter = new PropelObjectFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - $this->assertTrue($books instanceof PropelCollection, 'PropelObjectFormatter::format() returns a PropelCollection'); - $this->assertEquals(4, count($books), 'PropelObjectFormatter::format() returns as many rows as the results in the query'); - foreach ($books as $book) { - $this->assertTrue($book instanceof Book, 'PropelObjectFormatter::format() returns an array of Model objects'); - } - } - - public function testFormatOneResult() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book WHERE book.TITLE = "Quicksilver"'); - $formatter = new PropelObjectFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - $this->assertTrue($books instanceof PropelCollection, 'PropelObjectFormatter::format() returns a PropelCollection'); - $this->assertEquals(1, count($books), 'PropelObjectFormatter::format() returns as many rows as the results in the query'); - $book = $books->shift(); - $this->assertTrue($book instanceof Book, 'PropelObjectFormatter::format() returns an array of Model objects'); - $this->assertEquals('Quicksilver', $book->getTitle(), 'PropelObjectFormatter::format() returns the model objects matching the query'); - } - - public function testFormatNoResult() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book WHERE book.TITLE = "foo"'); - $formatter = new PropelObjectFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - $this->assertTrue($books instanceof PropelCollection, 'PropelObjectFormatter::format() returns a PropelCollection'); - $this->assertEquals(0, count($books), 'PropelObjectFormatter::format() returns as many rows as the results in the query'); - } - - public function testFormatOneNoCriteria() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book'); - $formatter = new PropelObjectFormatter(); - try { - $book = $formatter->formatOne($stmt); - $this->fail('PropelObjectFormatter::formatOne() throws an exception when called with no valid criteria'); - } catch (PropelException $e) { - $this->assertTrue(true,'PropelObjectFormatter::formatOne() throws an exception when called with no valid criteria'); - } - } - - public function testFormatOneManyResults() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book'); - $formatter = new PropelObjectFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $book = $formatter->formatOne($stmt); - - $this->assertTrue($book instanceof Book, 'PropelObjectFormatter::formatOne() returns a model object'); - } - - public function testFormatOneNoResult() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book WHERE book.TITLE = "foo"'); - $formatter = new PropelObjectFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $book = $formatter->formatOne($stmt); - - $this->assertNull($book, 'PropelObjectFormatter::formatOne() returns null when no result'); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelObjectFormatterWithTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelObjectFormatterWithTest.php deleted file mode 100644 index 14279d9a30..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelObjectFormatterWithTest.php +++ /dev/null @@ -1,406 +0,0 @@ -findOne($con); - $count = $con->getQueryCount(); - $this->assertEquals($book->getTitle(), 'Don Juan', 'Main object is correctly hydrated ' . $msg); - $author = $book->getAuthor(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query ' . $msg); - $this->assertEquals($author->getLastName(), 'Byron', 'Related object is correctly hydrated ' . $msg); - $publisher = $book->getPublisher(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query ' . $msg); - $this->assertEquals($publisher->getName(), 'Penguin', 'Related object is correctly hydrated ' . $msg); - } - - public function testFindOneWith() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->orderBy('Book.Title'); - $c->join('Book.Author'); - $c->with('Author'); - $c->join('Book.Publisher'); - $c->with('Publisher'); - $this->assertCorrectHydration1($c, 'without instance pool'); - } - - public function testFindOneWithAlias() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->orderBy('Book.Title'); - $c->join('Book.Author a'); - $c->with('a'); - $c->join('Book.Publisher p'); - $c->with('p'); - $this->assertCorrectHydration1($c, 'with alias'); - } - - public function testFindOneWithMainAlias() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setModelAlias('b', true); - $c->orderBy('b.Title'); - $c->join('b.Author a'); - $c->with('a'); - $c->join('b.Publisher p'); - $c->with('p'); - $this->assertCorrectHydration1($c, 'with main alias'); - } - - public function testFindOneWithUsingInstancePool() - { - BookstoreDataPopulator::populate(); - // instance pool contains all objects by default, since they were just populated - $c = new ModelCriteria('bookstore', 'Book'); - $c->orderBy('Book.Title'); - $c->join('Book.Author'); - $c->with('Author'); - $c->join('Book.Publisher'); - $c->with('Publisher'); - $this->assertCorrectHydration1($c, 'with instance pool'); - } - - public function testFindOneWithoutUsingInstancePool() - { - BookstoreDataPopulator::populate(); - Propel::disableInstancePooling(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->orderBy('Book.Title'); - $c->join('Book.Author'); - $c->with('Author'); - $c->join('Book.Publisher'); - $c->with('Publisher'); - $this->assertCorrectHydration1($c, 'without instance pool'); - Propel::enableInstancePooling(); - } - - public function testFindOneWithEmptyLeftJoin() - { - // save a book with no author - $b = new Book(); - $b->setTitle('Foo'); - $b->save(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->where('Book.Title = ?', 'Foo'); - $c->leftJoin('Book.Author'); - $c->with('Author'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $book = $c->findOne($con); - $count = $con->getQueryCount(); - $author = $book->getAuthor(); - $this->assertNull($author, 'Related object is not hydrated if empty'); - } - - public function testFindOneWithRelationName() - { - BookstoreDataPopulator::populate(); - BookstoreEmployeePeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'BookstoreEmployee'); - $c->join('BookstoreEmployee.Supervisor s'); - $c->with('s'); - $c->where('s.Name = ?', 'John'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $emp = $c->findOne($con); - $count = $con->getQueryCount(); - $this->assertEquals($emp->getName(), 'Pieter', 'Main object is correctly hydrated'); - $sup = $emp->getSupervisor(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query'); - $this->assertEquals($sup->getName(), 'John', 'Related object is correctly hydrated'); - } - - public function testFindOneWithDuplicateRelation() - { - EssayPeer::doDeleteAll(); - $auth1 = new Author(); - $auth1->setFirstName('John'); - $auth1->save(); - $auth2 = new Author(); - $auth2->setFirstName('Jack'); - $auth2->save(); - $essay = new Essay(); - $essay->setTitle('Foo'); - $essay->setFirstAuthor($auth1->getId()); - $essay->setSecondAuthor($auth2->getId()); - $essay->save(); - AuthorPeer::clearInstancePool(); - EssayPeer::clearInstancePool(); - - $c = new ModelCriteria('bookstore', 'Essay'); - $c->join('Essay.AuthorRelatedByFirstAuthor'); - $c->with('AuthorRelatedByFirstAuthor'); - $c->where('Essay.Title = ?', 'Foo'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $essay = $c->findOne($con); - $count = $con->getQueryCount(); - $this->assertEquals($essay->getTitle(), 'Foo', 'Main object is correctly hydrated'); - $firstAuthor = $essay->getAuthorRelatedByFirstAuthor(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query'); - $this->assertEquals($firstAuthor->getFirstName(), 'John', 'Related object is correctly hydrated'); - $secondAuthor = $essay->getAuthorRelatedBySecondAuthor(); - $this->assertEquals($count + 1, $con->getQueryCount(), 'with() does not hydrate objects not in with'); - } - - public function testFindOneWithDistantClass() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - Propel::enableInstancePooling(); - $c = new ModelCriteria('bookstore', 'Review'); - $c->where('Review.Recommended = ?', true); - $c->join('Review.Book'); - $c->with('Book'); - $c->join('Book.Author'); - $c->with('Author'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $review = $c->findOne($con); - $count = $con->getQueryCount(); - $this->assertEquals($review->getReviewedBy(), 'Washington Post', 'Main object is correctly hydrated'); - $book = $review->getBook(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query'); - $this->assertEquals('Harry Potter and the Order of the Phoenix', $book->getTitle(), 'Related object is correctly hydrated'); - $author = $book->getAuthor(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query'); - $this->assertEquals('J.K.', $author->getFirstName(), 'Related object is correctly hydrated'); - } - - /** - * @expectedException PropelException - */ - public function testFindOneWithOneToManyAndLimit() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->add(BookPeer::ISBN, '043935806X'); - $c->leftJoin('Book.Review'); - $c->with('Review'); - $c->limit(5); - $books = $c->find(); - } - - public function testFindOneWithOneToMany() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->add(BookPeer::ISBN, '043935806X'); - $c->leftJoin('Book.Review'); - $c->with('Review'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $books = $c->find($con); - $this->assertEquals(1, count($books), 'with() does not duplicate the main object'); - $book = $books[0]; - $count = $con->getQueryCount(); - $this->assertEquals($book->getTitle(), 'Harry Potter and the Order of the Phoenix', 'Main object is correctly hydrated'); - $reviews = $book->getReviews(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query '); - $this->assertEquals(2, count($reviews), 'Related objects are correctly hydrated'); - try { - $book->save(); - } catch (Exception $e) { - $this->fail('with() does not force objects to be new'); - } - } - - public function testFindOneWithOneToManyCustomOrder() - { - $author1 = new Author(); - $author1->setFirstName('AA'); - $author2 = new Author(); - $author2->setFirstName('BB'); - $book1 = new Book(); - $book1->setTitle('Aaa'); - $book1->setAuthor($author1); - $book1->save(); - $book2 = new Book(); - $book2->setTitle('Bbb'); - $book2->setAuthor($author2); - $book2->save(); - $book3 = new Book(); - $book3->setTitle('Ccc'); - $book3->setAuthor($author1); - $book3->save(); - $authors = AuthorQuery::create() - ->leftJoin('Author.Book') - ->orderBy('Book.Title') - ->with('Book') - ->find(); - $this->assertEquals(2, count($authors), 'with() used on a many-to-many doesn\'t change the main object count'); - } - - public function testFindOneWithOneToManyThenManyToOne() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Author'); - $c->add(AuthorPeer::LAST_NAME, 'Rowling'); - $c->leftJoinWith('Author.Book'); - $c->leftJoinWith('Book.Review'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $authors = $c->find($con); - $this->assertEquals(1, count($authors), 'with() does not duplicate the main object'); - $rowling = $authors[0]; - $count = $con->getQueryCount(); - $this->assertEquals($rowling->getFirstName(), 'J.K.', 'Main object is correctly hydrated'); - $books = $rowling->getBooks(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query '); - $this->assertEquals(1, count($books), 'Related objects are correctly hydrated'); - $book = $books[0]; - $this->assertEquals($book->getTitle(), 'Harry Potter and the Order of the Phoenix', 'Related object is correctly hydrated'); - $reviews = $book->getReviews(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query '); - $this->assertEquals(2, count($reviews), 'Related objects are correctly hydrated'); - } - - public function testFindOneWithOneToManyThenManyToOneUsingJoinRelated() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - - $con = Propel::getConnection(AuthorPeer::DATABASE_NAME); - $authors = AuthorQuery::create() - ->filterByLastName('Rowling') - ->joinBook('book') - ->with('book') - ->useQuery('book') - ->joinReview('review') - ->with('review') - ->endUse() - ->find($con); - $this->assertEquals(1, count($authors), 'with() does not duplicate the main object'); - $rowling = $authors[0]; - $count = $con->getQueryCount(); - $this->assertEquals($rowling->getFirstName(), 'J.K.', 'Main object is correctly hydrated'); - $books = $rowling->getBooks(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query '); - $this->assertEquals(1, count($books), 'Related objects are correctly hydrated'); - $book = $books[0]; - $this->assertEquals($book->getTitle(), 'Harry Potter and the Order of the Phoenix', 'Related object is correctly hydrated'); - $reviews = $book->getReviews(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query '); - $this->assertEquals(2, count($reviews), 'Related objects are correctly hydrated'); - } - - public function testFindOneWithOneToManyThenManyToOneUsingAlias() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Author'); - $c->add(AuthorPeer::LAST_NAME, 'Rowling'); - $c->leftJoinWith('Author.Book b'); - $c->leftJoinWith('b.Review r'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $authors = $c->find($con); - $this->assertEquals(1, count($authors), 'with() does not duplicate the main object'); - $rowling = $authors[0]; - $count = $con->getQueryCount(); - $this->assertEquals($rowling->getFirstName(), 'J.K.', 'Main object is correctly hydrated'); - $books = $rowling->getBooks(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query '); - $this->assertEquals(1, count($books), 'Related objects are correctly hydrated'); - $book = $books[0]; - $this->assertEquals($book->getTitle(), 'Harry Potter and the Order of the Phoenix', 'Related object is correctly hydrated'); - $reviews = $book->getReviews(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query '); - $this->assertEquals(2, count($reviews), 'Related objects are correctly hydrated'); - } - - public function testFindOneWithColumn() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->filterByTitle('The Tin Drum'); - $c->join('Book.Author'); - $c->withColumn('Author.FirstName', 'AuthorName'); - $c->withColumn('Author.LastName', 'AuthorName2'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $book = $c->findOne($con); - $this->assertTrue($book instanceof Book, 'withColumn() do not change the resulting model class'); - $this->assertEquals('The Tin Drum', $book->getTitle()); - $this->assertEquals('Gunter', $book->getVirtualColumn('AuthorName'), 'PropelObjectFormatter adds withColumns as virtual columns'); - $this->assertEquals('Grass', $book->getVirtualColumn('AuthorName2'), 'PropelObjectFormatter correctly hydrates all virtual columns'); - $this->assertEquals('Gunter', $book->getAuthorName(), 'PropelObjectFormatter adds withColumns as virtual columns'); - } - - public function testFindOneWithClassAndColumn() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->filterByTitle('The Tin Drum'); - $c->join('Book.Author'); - $c->withColumn('Author.FirstName', 'AuthorName'); - $c->withColumn('Author.LastName', 'AuthorName2'); - $c->with('Author'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $book = $c->findOne($con); - $this->assertTrue($book instanceof Book, 'withColumn() do not change the resulting model class'); - $this->assertEquals('The Tin Drum', $book->getTitle()); - $this->assertTrue($book->getAuthor() instanceof Author, 'PropelObjectFormatter correctly hydrates with class'); - $this->assertEquals('Gunter', $book->getAuthor()->getFirstName(), 'PropelObjectFormatter correctly hydrates with class'); - $this->assertEquals('Gunter', $book->getVirtualColumn('AuthorName'), 'PropelObjectFormatter adds withColumns as virtual columns'); - $this->assertEquals('Grass', $book->getVirtualColumn('AuthorName2'), 'PropelObjectFormatter correctly hydrates all virtual columns'); - } - - public function testFindPkWithOneToMany() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $book = BookQuery::create() - ->findOneByTitle('Harry Potter and the Order of the Phoenix', $con); - $pk = $book->getPrimaryKey(); - BookPeer::clearInstancePool(); - $book = BookQuery::create() - ->joinWith('Review') - ->findPk($pk, $con); - $count = $con->getQueryCount(); - $reviews = $book->getReviews(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query '); - $this->assertEquals(2, count($reviews), 'Related objects are correctly hydrated'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelOnDemandFormatterTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelOnDemandFormatterTest.php deleted file mode 100644 index a4c29bb38c..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelOnDemandFormatterTest.php +++ /dev/null @@ -1,151 +0,0 @@ -query('SELECT * FROM book'); - $formatter = new PropelOnDemandFormatter(); - try { - $books = $formatter->format($stmt); - $this->fail('PropelOnDemandFormatter::format() trows an exception when called with no valid criteria'); - } catch (PropelException $e) { - $this->assertTrue(true,'PropelOnDemandFormatter::format() trows an exception when called with no valid criteria'); - } - } - - public function testFormatManyResults() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - BookstoreDataPopulator::populate($con); - - $stmt = $con->query('SELECT * FROM book'); - $formatter = new PropelOnDemandFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - $this->assertTrue($books instanceof PropelOnDemandCollection, 'PropelOnDemandFormatter::format() returns a PropelOnDemandCollection'); - $this->assertEquals(4, count($books), 'PropelOnDemandFormatter::format() returns a collection that counts as many rows as the results in the query'); - foreach ($books as $book) { - $this->assertTrue($book instanceof Book, 'PropelOnDemandFormatter::format() returns an traversable collection of Model objects'); - } - } - - /** - * @expectedException PropelException - */ - public function testFormatManyResultsIteratedTwice() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - BookstoreDataPopulator::populate($con); - - $stmt = $con->query('SELECT * FROM book'); - $formatter = new PropelOnDemandFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - foreach ($books as $book) { - // do nothing - } - foreach ($books as $book) { - // this should throw a PropelException since we're iterating a second time over a stream - } - } - - public function testFormatALotOfResults() - { - $nbBooks = 50; - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - Propel::disableInstancePooling(); - $book = new Book(); - for ($i=0; $i < $nbBooks; $i++) { - $book->clear(); - $book->setTitle('BookTest' . $i); - $book->save($con); - } - - $stmt = $con->query('SELECT * FROM book'); - $formatter = new PropelOnDemandFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - $this->assertTrue($books instanceof PropelOnDemandCollection, 'PropelOnDemandFormatter::format() returns a PropelOnDemandCollection'); - $this->assertEquals($nbBooks, count($books), 'PropelOnDemandFormatter::format() returns a collection that counts as many rows as the results in the query'); - $i = 0; - foreach ($books as $book) { - $this->assertTrue($book instanceof Book, 'PropelOnDemandFormatter::format() returns a collection of Model objects'); - $this->assertEquals('BookTest' . $i, $book->getTitle(), 'PropelOnDemandFormatter::format() returns the model objects matching the query'); - $i++; - } - Propel::enableInstancePooling(); - } - - - public function testFormatOneResult() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - BookstoreDataPopulator::populate($con); - - $stmt = $con->query('SELECT * FROM book WHERE book.TITLE = "Quicksilver"'); - $formatter = new PropelOnDemandFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - $this->assertTrue($books instanceof PropelOnDemandCollection, 'PropelOnDemandFormatter::format() returns a PropelOnDemandCollection'); - $this->assertEquals(1, count($books), 'PropelOnDemandFormatter::format() returns a collection that counts as many rows as the results in the query'); - foreach ($books as $book) { - $this->assertTrue($book instanceof Book, 'PropelOnDemandFormatter::format() returns a collection of Model objects'); - $this->assertEquals('Quicksilver', $book->getTitle(), 'PropelOnDemandFormatter::format() returns the model objects matching the query'); - } - } - - public function testFormatNoResult() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book WHERE book.TITLE = "foo"'); - $formatter = new PropelOnDemandFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - $this->assertTrue($books instanceof PropelOnDemandCollection, 'PropelOnDemandFormatter::format() returns a PropelCollection'); - $this->assertEquals(0, count($books), 'PropelOnDemandFormatter::format() returns an empty collection when no record match the query'); - foreach ($books as $book) { - $this->fail('PropelOnDemandFormatter returns an empty iterator when no record match the query'); - } - } - - public function testFormatOneManyResults() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - BookstoreDataPopulator::populate($con); - - $stmt = $con->query('SELECT * FROM book'); - $formatter = new PropelOnDemandFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $book = $formatter->formatOne($stmt); - - $this->assertTrue($book instanceof Book, 'PropelOnDemandFormatter::formatOne() returns a model object'); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelOnDemandFormatterWithTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelOnDemandFormatterWithTest.php deleted file mode 100644 index 264d7b25e9..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelOnDemandFormatterWithTest.php +++ /dev/null @@ -1,277 +0,0 @@ -limit(1); - $books = $c->find($con); - foreach ($books as $book) { - break; - } - $count = $con->getQueryCount(); - $this->assertEquals($book->getTitle(), 'Don Juan', 'Main object is correctly hydrated ' . $msg); - $author = $book->getAuthor(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query ' . $msg); - $this->assertEquals($author->getLastName(), 'Byron', 'Related object is correctly hydrated ' . $msg); - $publisher = $book->getPublisher(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query ' . $msg); - $this->assertEquals($publisher->getName(), 'Penguin', 'Related object is correctly hydrated ' . $msg); - } - - public function testFindOneWith() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ON_DEMAND); - $c->orderBy('Book.Title'); - $c->join('Book.Author'); - $c->with('Author'); - $c->join('Book.Publisher'); - $c->with('Publisher'); - $this->assertCorrectHydration1($c, 'without instance pool'); - } - - public function testFindOneWithAlias() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ON_DEMAND); - $c->orderBy('Book.Title'); - $c->join('Book.Author a'); - $c->with('a'); - $c->join('Book.Publisher p'); - $c->with('p'); - $this->assertCorrectHydration1($c, 'with alias'); - } - - public function testFindOneWithMainAlias() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ON_DEMAND); - $c->setModelAlias('b', true); - $c->orderBy('b.Title'); - $c->join('b.Author a'); - $c->with('a'); - $c->join('b.Publisher p'); - $c->with('p'); - $this->assertCorrectHydration1($c, 'with main alias'); - } - - public function testFindOneWithUsingInstancePool() - { - BookstoreDataPopulator::populate(); - // instance pool contains all objects by default, since they were just populated - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ON_DEMAND); - $c->orderBy('Book.Title'); - $c->join('Book.Author'); - $c->with('Author'); - $c->join('Book.Publisher'); - $c->with('Publisher'); - $this->assertCorrectHydration1($c, 'with instance pool'); - } - - public function testFindOneWithEmptyLeftJoin() - { - // save a book with no author - $b = new Book(); - $b->setTitle('Foo'); - $b->save(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ON_DEMAND); - $c->where('Book.Title = ?', 'Foo'); - $c->leftJoin('Book.Author'); - $c->with('Author'); - $c->limit(1); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $books = $c->find($con); - foreach ($books as $book) { - break; - } - $count = $con->getQueryCount(); - $author = $book->getAuthor(); - $this->assertNull($author, 'Related object is not hydrated if empty'); - } - - public function testFindOneWithRelationName() - { - BookstoreDataPopulator::populate(); - BookstoreEmployeePeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'BookstoreEmployee'); - $c->join('BookstoreEmployee.Supervisor s'); - $c->with('s'); - $c->where('s.Name = ?', 'John'); - $c->limit(1); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $emps = $c->find($con); - foreach ($emps as $emp) { - break; - } - $count = $con->getQueryCount(); - $this->assertEquals($emp->getName(), 'Pieter', 'Main object is correctly hydrated'); - $sup = $emp->getSupervisor(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query'); - $this->assertEquals($sup->getName(), 'John', 'Related object is correctly hydrated'); - } - - public function testFindOneWithDuplicateRelation() - { - EssayPeer::doDeleteAll(); - $auth1 = new Author(); - $auth1->setFirstName('John'); - $auth1->save(); - $auth2 = new Author(); - $auth2->setFirstName('Jack'); - $auth2->save(); - $essay = new Essay(); - $essay->setTitle('Foo'); - $essay->setFirstAuthor($auth1->getId()); - $essay->setSecondAuthor($auth2->getId()); - $essay->save(); - AuthorPeer::clearInstancePool(); - EssayPeer::clearInstancePool(); - - $c = new ModelCriteria('bookstore', 'Essay'); - $c->setFormatter(ModelCriteria::FORMAT_ON_DEMAND); - $c->join('Essay.AuthorRelatedByFirstAuthor'); - $c->with('AuthorRelatedByFirstAuthor'); - $c->where('Essay.Title = ?', 'Foo'); - $c->limit(1); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $essays = $c->find($con); - foreach ($essays as $essay) { - break; - } - $count = $con->getQueryCount(); - $this->assertEquals($essay->getTitle(), 'Foo', 'Main object is correctly hydrated'); - $firstAuthor = $essay->getAuthorRelatedByFirstAuthor(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query'); - $this->assertEquals($firstAuthor->getFirstName(), 'John', 'Related object is correctly hydrated'); - $secondAuthor = $essay->getAuthorRelatedBySecondAuthor(); - $this->assertEquals($count + 1, $con->getQueryCount(), 'with() does not hydrate objects not in with'); - } - - public function testFindOneWithDistantClass() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Review'); - $c->setFormatter(ModelCriteria::FORMAT_ON_DEMAND); - $c->where('Review.Recommended = ?', true); - $c->join('Review.Book'); - $c->with('Book'); - $c->join('Book.Author'); - $c->with('Author'); - $c->limit(1); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $reviews = $c->find($con); - foreach ($reviews as $review) { - break; - } - $count = $con->getQueryCount(); - $this->assertEquals($review->getReviewedBy(), 'Washington Post', 'Main object is correctly hydrated'); - $book = $review->getBook(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query'); - $this->assertEquals('Harry Potter and the Order of the Phoenix', $book->getTitle(), 'Related object is correctly hydrated'); - $author = $book->getAuthor(); - $this->assertEquals($count, $con->getQueryCount(), 'with() hydrates the related objects to save a query'); - $this->assertEquals('J.K.', $author->getFirstName(), 'Related object is correctly hydrated'); - } - - /** - * @expectedException PropelException - */ - public function testFindOneWithOneToMany() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ON_DEMAND); - $c->add(BookPeer::ISBN, '043935806X'); - $c->leftJoin('Book.Review'); - $c->with('Review'); - $books = $c->find(); - } - - public function testFindOneWithColumn() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ON_DEMAND); - $c->filterByTitle('The Tin Drum'); - $c->join('Book.Author'); - $c->withColumn('Author.FirstName', 'AuthorName'); - $c->withColumn('Author.LastName', 'AuthorName2'); - $c->limit(1); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $books = $c->find($con); - foreach ($books as $book) { - break; - } - $this->assertTrue($book instanceof Book, 'withColumn() do not change the resulting model class'); - $this->assertEquals('The Tin Drum', $book->getTitle()); - $this->assertEquals('Gunter', $book->getVirtualColumn('AuthorName'), 'PropelObjectFormatter adds withColumns as virtual columns'); - $this->assertEquals('Grass', $book->getVirtualColumn('AuthorName2'), 'PropelObjectFormatter correctly hydrates all virtual columns'); - $this->assertEquals('Gunter', $book->getAuthorName(), 'PropelObjectFormatter adds withColumns as virtual columns'); - } - - public function testFindOneWithClassAndColumn() - { - BookstoreDataPopulator::populate(); - BookPeer::clearInstancePool(); - AuthorPeer::clearInstancePool(); - ReviewPeer::clearInstancePool(); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_ON_DEMAND); - $c->filterByTitle('The Tin Drum'); - $c->join('Book.Author'); - $c->withColumn('Author.FirstName', 'AuthorName'); - $c->withColumn('Author.LastName', 'AuthorName2'); - $c->with('Author'); - $c->limit(1); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $books = $c->find($con); - foreach ($books as $book) { - break; - } - $this->assertTrue($book instanceof Book, 'withColumn() do not change the resulting model class'); - $this->assertEquals('The Tin Drum', $book->getTitle()); - $this->assertTrue($book->getAuthor() instanceof Author, 'PropelObjectFormatter correctly hydrates with class'); - $this->assertEquals('Gunter', $book->getAuthor()->getFirstName(), 'PropelObjectFormatter correctly hydrates with class'); - $this->assertEquals('Gunter', $book->getVirtualColumn('AuthorName'), 'PropelObjectFormatter adds withColumns as virtual columns'); - $this->assertEquals('Grass', $book->getVirtualColumn('AuthorName2'), 'PropelObjectFormatter correctly hydrates all virtual columns'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelStatementFormatterTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelStatementFormatterTest.php deleted file mode 100644 index c2ea8077e5..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/formatter/PropelStatementFormatterTest.php +++ /dev/null @@ -1,124 +0,0 @@ -query('SELECT * FROM book'); - $formatter = new PropelStatementFormatter(); - try { - $books = $formatter->format($stmt); - $this->assertTrue(true, 'PropelStatementFormatter::format() does not trow an exception when called with no valid criteria'); - } catch (PropelException $e) { - $this->fail('PropelStatementFormatter::format() does not trow an exception when called with no valid criteria'); - } - } - - public function testFormatManyResults() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book'); - $formatter = new PropelStatementFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - $this->assertTrue($books instanceof PDOStatement, 'PropelStatementFormatter::format() returns a PDOStatement'); - $this->assertEquals(4, $books->rowCount(), 'PropelStatementFormatter::format() returns as many rows as the results in the query'); - while ($book = $books->fetch()) { - $this->assertTrue(is_array($book), 'PropelStatementFormatter::format() returns a statement that can be fetched'); - } - } - - public function testFormatOneResult() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book WHERE book.TITLE = "Quicksilver"'); - $formatter = new PropelStatementFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - $this->assertTrue($books instanceof PDOStatement, 'PropelStatementFormatter::format() returns a PDOStatement'); - $this->assertEquals(1, $books->rowCount(), 'PropelStatementFormatter::format() returns as many rows as the results in the query'); - $book = $books->fetch(PDO::FETCH_ASSOC); - $this->assertEquals('Quicksilver', $book['title'], 'PropelStatementFormatter::format() returns the rows matching the query'); - } - - public function testFormatNoResult() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book WHERE book.TITLE = "foo"'); - $formatter = new PropelStatementFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $books = $formatter->format($stmt); - - $this->assertTrue($books instanceof PDOStatement, 'PropelStatementFormatter::format() returns a PDOStatement'); - $this->assertEquals(0, $books->rowCount(), 'PropelStatementFormatter::format() returns as many rows as the results in the query'); - } - - public function testFormatoneNoCriteria() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book'); - $formatter = new PropelStatementFormatter(); - try { - $books = $formatter->formatOne($stmt); - $this->assertTrue(true, 'PropelStatementFormatter::formatOne() does not trow an exception when called with no valid criteria'); - } catch (PropelException $e) { - $this->fail('PropelStatementFormatter::formatOne() does not trow an exception when called with no valid criteria'); - } - } - - public function testFormatOneManyResults() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book'); - $formatter = new PropelStatementFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $book = $formatter->formatOne($stmt); - - $this->assertTrue($book instanceof PDOStatement, 'PropelStatementFormatter::formatOne() returns a PDO Statement'); - } - - public function testFormatOneNoResult() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $stmt = $con->query('SELECT * FROM book WHERE book.TITLE = "foo"'); - $formatter = new PropelStatementFormatter(); - $formatter->init(new ModelCriteria('bookstore', 'Book')); - $book = $formatter->formatOne($stmt); - - $this->assertNull($book, 'PropelStatementFormatter::formatOne() returns null when no result'); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/map/ColumnMapTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/map/ColumnMapTest.php deleted file mode 100644 index f3225848fa..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/map/ColumnMapTest.php +++ /dev/null @@ -1,141 +0,0 @@ -dmap = new DatabaseMap('foodb'); - $this->tmap = new TableMap('foo', $this->dmap); - $this->columnName = 'bar'; - $this->cmap = new ColumnMap($this->columnName, $this->tmap); - } - - protected function tearDown() - { - // nothing to do for now - parent::tearDown(); - } - - public function testConstructor() - { - $this->assertEquals($this->columnName, $this->cmap->getName(), 'constructor sets the column name'); - $this->assertEquals($this->tmap, $this->cmap->getTable(), 'Constructor sets the table map'); - $this->assertNull($this->cmap->getType(), 'A new column map has no type'); - } - - public function testPhpName() - { - $this->assertNull($this->cmap->getPhpName(), 'phpName is empty until set'); - $this->cmap->setPhpName('FooBar'); - $this->assertEquals('FooBar', $this->cmap->getPhpName(), 'phpName is set by setPhpName()'); - } - - public function testType() - { - $this->assertNull($this->cmap->getType(), 'type is empty until set'); - $this->cmap->setType('FooBar'); - $this->assertEquals('FooBar', $this->cmap->getType(), 'type is set by setType()'); - } - - public function tesSize() - { - $this->assertEquals(0, $this->cmap->getSize(), 'size is empty until set'); - $this->cmap->setSize(123); - $this->assertEquals(123, $this->cmap->getSize(), 'size is set by setSize()'); - } - - public function testPrimaryKey() - { - $this->assertFalse($this->cmap->isPrimaryKey(), 'primaryKey is false by default'); - $this->cmap->setPrimaryKey(true); - $this->assertTrue($this->cmap->isPrimaryKey(), 'primaryKey is set by setPrimaryKey()'); - } - - public function testNotNull() - { - $this->assertFalse($this->cmap->isNotNull(), 'notNull is false by default'); - $this->cmap->setNotNull(true); - $this->assertTrue($this->cmap->isNotNull(), 'notNull is set by setPrimaryKey()'); - } - - public function testDefaultValue() - { - $this->assertNull($this->cmap->getDefaultValue(), 'defaultValue is empty until set'); - $this->cmap->setDefaultValue('FooBar'); - $this->assertEquals('FooBar', $this->cmap->getDefaultValue(), 'defaultValue is set by setDefaultValue()'); - } - - public function testGetForeignKey() - { - $this->assertFalse($this->cmap->isForeignKey(), 'foreignKey is false by default'); - try - { - $this->cmap->getRelatedTable(); - $this->fail('getRelatedTable throws an exception when called on a column with no foreign key'); - } catch(PropelException $e) { - $this->assertTrue(true, 'getRelatedTable throws an exception when called on a column with no foreign key'); - } - try - { - $this->cmap->getRelatedColumn(); - $this->fail('getRelatedColumn throws an exception when called on a column with no foreign key'); - } catch(PropelException $e) { - $this->assertTrue(true, 'getRelatedColumn throws an exception when called on a column with no foreign key'); - } - $relatedTmap = $this->dmap->addTable('foo2'); - // required to let the database map use the foreign TableMap - $relatedCmap = $relatedTmap->addColumn('BAR2', 'Bar2', 'INTEGER'); - $this->cmap->setForeignKey('foo2', 'BAR2'); - $this->assertTrue($this->cmap->isForeignKey(), 'foreignKey is true after setting the foreign key via setForeignKey()'); - $this->assertEquals($relatedTmap, $this->cmap->getRelatedTable(), 'getRelatedTable returns the related TableMap object'); - $this->assertEquals($relatedCmap, $this->cmap->getRelatedColumn(), 'getRelatedColumn returns the related ColumnMap object'); - } - - public function testGetRelation() - { - set_include_path(get_include_path() . PATH_SEPARATOR . "fixtures/bookstore/build/classes"); - Propel::init('fixtures/bookstore/build/conf/bookstore-conf.php'); - $bookTable = BookPeer::getTableMap(); - $titleColumn = $bookTable->getColumn('TITLE'); - $this->assertNull($titleColumn->getRelation(), 'getRelation() returns null for non-foreign key columns'); - $publisherColumn = $bookTable->getColumn('PUBLISHER_ID'); - $this->assertEquals($publisherColumn->getRelation(), $bookTable->getRelation('Publisher'), 'getRelation() returns the RelationMap object for this foreign key'); - $bookstoreTable = BookstoreEmployeePeer::getTableMap(); - $supervisorColumn = $bookstoreTable->getColumn('SUPERVISOR_ID'); - $this->assertEquals($supervisorColumn->getRelation(), $supervisorColumn->getRelation('Supervisor'), 'getRelation() returns the RelationMap object even whit ha specific refPhpName'); - - } - - public function testNormalizeName() - { - $this->assertEquals('', ColumnMap::normalizeName(''), 'normalizeColumnName() returns an empty string when passed an empty string'); - $this->assertEquals('BAR', ColumnMap::normalizeName('bar'), 'normalizeColumnName() uppercases the input'); - $this->assertEquals('BAR_BAZ', ColumnMap::normalizeName('bar_baz'), 'normalizeColumnName() does not mind underscores'); - $this->assertEquals('BAR', ColumnMap::normalizeName('FOO.BAR'), 'normalizeColumnName() removes table prefix'); - $this->assertEquals('BAR', ColumnMap::normalizeName('BAR'), 'normalizeColumnName() leaves normalized column names unchanged'); - $this->assertEquals('BAR_BAZ', ColumnMap::normalizeName('foo.bar_baz'), 'normalizeColumnName() can do all the above at the same time'); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/map/DatabaseMapTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/map/DatabaseMapTest.php deleted file mode 100644 index 7a078131da..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/map/DatabaseMapTest.php +++ /dev/null @@ -1,171 +0,0 @@ -setName('baz'); - $this->setPhpName('Baz'); - } -} - -/** - * Test class for DatabaseMap. - * - * @author François Zaninotto - * @version $Id: DatabaseMapTest.php 1773 2010-05-25 10:25:06Z francois $ - * @package runtime.map - */ -class DatabaseMapTest extends PHPUnit_Framework_TestCase -{ - protected $databaseMap; - - protected function setUp() - { - parent::setUp(); - $this->databaseName = 'foodb'; - $this->databaseMap = TestDatabaseBuilder::getDmap(); - } - - protected function tearDown() - { - // nothing to do for now - parent::tearDown(); - } - - public function testConstructor() - { - $this->assertEquals($this->databaseName, $this->databaseMap->getName(), 'constructor sets the table name'); - } - - public function testAddTable() - { - $this->assertFalse($this->databaseMap->hasTable('foo'), 'tables are empty by default'); - try - { - $this->databaseMap->getTable('foo'); - $this->fail('getTable() throws an exception when called on an inexistent table'); - } catch(PropelException $e) { - $this->assertTrue(true, 'getTable() throws an exception when called on an inexistent table'); - } - $tmap = $this->databaseMap->addTable('foo'); - $this->assertTrue($this->databaseMap->hasTable('foo'), 'hasTable() returns true when the table was added by way of addTable()'); - $this->assertEquals($tmap, $this->databaseMap->getTable('foo'), 'getTable() returns a table by name when the table was added by way of addTable()'); - } - - public function testAddTableObject() - { - $this->assertFalse($this->databaseMap->hasTable('foo2'), 'tables are empty by default'); - try - { - $this->databaseMap->getTable('foo2'); - $this->fail('getTable() throws an exception when called on a table with no builder'); - } catch(PropelException $e) { - $this->assertTrue(true, 'getTable() throws an exception when called on a table with no builder'); - } - $tmap = new TableMap('foo2'); - $this->databaseMap->addTableObject($tmap); - $this->assertTrue($this->databaseMap->hasTable('foo2'), 'hasTable() returns true when the table was added by way of addTableObject()'); - $this->assertEquals($tmap, $this->databaseMap->getTable('foo2'), 'getTable() returns a table by name when the table was added by way of addTableObject()'); - } - - public function testAddTableFromMapClass() - { - $table1 = $this->databaseMap->addTableFromMapClass('BazTableMap'); - try - { - $table2 = $this->databaseMap->getTable('baz'); - $this->assertEquals($table1, $table2, 'addTableFromMapClass() adds a table from a map class'); - } catch(PropelException $e) { - $this->fail('addTableFromMapClass() adds a table from a map class'); - } - } - - public function testGetColumn() - { - try - { - $this->databaseMap->getColumn('foo.BAR'); - $this->fail('getColumn() throws an exception when called on column of an inexistent table'); - } catch(PropelException $e) { - $this->assertTrue(true, 'getColumn() throws an exception when called on column of an inexistent table'); - } - $tmap = $this->databaseMap->addTable('foo'); - try - { - $this->databaseMap->getColumn('foo.BAR'); - $this->fail('getColumn() throws an exception when called on an inexistent column of an existent table'); - } catch(PropelException $e) { - $this->assertTrue(true, 'getColumn() throws an exception when called on an inexistent column of an existent table'); - } - $column = $tmap->addColumn('BAR', 'Bar', 'INTEGER'); - $this->assertEquals($column, $this->databaseMap->getColumn('foo.BAR'), 'getColumn() returns a ColumnMap object based on a fully qualified name'); - } - - public function testGetTableByPhpName() - { - try - { - $this->databaseMap->getTableByPhpName('Foo1'); - $this->fail('getTableByPhpName() throws an exception when called on an inexistent table'); - } catch(PropelException $e) { - $this->assertTrue(true, 'getTableByPhpName() throws an exception when called on an inexistent table'); - } - $tmap = $this->databaseMap->addTable('foo1'); - try - { - $this->databaseMap->getTableByPhpName('Foo1'); - $this->fail('getTableByPhpName() throws an exception when called on a table with no phpName'); - } catch(PropelException $e) { - $this->assertTrue(true, 'getTableByPhpName() throws an exception when called on a table with no phpName'); - } - $tmap2 = new TableMap('foo2'); - $tmap2->setClassname('Foo2'); - $this->databaseMap->addTableObject($tmap2); - $this->assertEquals($tmap2, $this->databaseMap->getTableByPhpName('Foo2'), 'getTableByPhpName() returns tableMap when phpName was set by way of TableMap::setPhpName()'); - } - - public function testGetTableByPhpNameNotLoaded() - { - set_include_path(get_include_path() . PATH_SEPARATOR . "fixtures/bookstore/build/classes"); - require_once 'bookstore/map/BookTableMap.php'; - require_once 'bookstore/om/BaseBookPeer.php'; - require_once 'bookstore/BookPeer.php'; - $this->assertEquals('book', Propel::getDatabaseMap('bookstore')->getTableByPhpName('Book')->getName(), 'getTableByPhpName() can autoload a TableMap when the Peer class is generated and autoloaded'); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/map/GeneratedRelationMapTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/map/GeneratedRelationMapTest.php deleted file mode 100644 index 62b84a77c0..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/map/GeneratedRelationMapTest.php +++ /dev/null @@ -1,75 +0,0 @@ -databaseMap = Propel::getDatabaseMap('bookstore'); - } - - public function testGetRightTable() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $authorTable = $this->databaseMap->getTableByPhpName('Author'); - $this->assertEquals($authorTable, $bookTable->getRelation('Author')->getRightTable(), 'getRightTable() returns correct table when called on a many to one relationship'); - $this->assertEquals($bookTable, $authorTable->getRelation('Book')->getRightTable(), 'getRightTable() returns correct table when called on a one to many relationship'); - $bookEmpTable = $this->databaseMap->getTableByPhpName('BookstoreEmployee'); - $bookEmpAccTable = $this->databaseMap->getTableByPhpName('BookstoreEmployeeAccount'); - $this->assertEquals($bookEmpAccTable, $bookEmpTable->getRelation('BookstoreEmployeeAccount')->getRightTable(), 'getRightTable() returns correct table when called on a one to one relationship'); - $this->assertEquals($bookEmpTable, $bookEmpAccTable->getRelation('BookstoreEmployee')->getRightTable(), 'getRightTable() returns correct table when called on a one to one relationship'); - } - - public function testColumnMappings() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $this->assertEquals(array('book.AUTHOR_ID' => 'author.ID'), $bookTable->getRelation('Author')->getColumnMappings(), 'getColumnMappings returns local to foreign by default'); - $this->assertEquals(array('book.AUTHOR_ID' => 'author.ID'), $bookTable->getRelation('Author')->getColumnMappings(RelationMap::LEFT_TO_RIGHT), 'getColumnMappings returns local to foreign when asked left to right for a many to one relationship'); - - $authorTable = $this->databaseMap->getTableByPhpName('Author'); - $this->assertEquals(array('book.AUTHOR_ID' => 'author.ID'), $authorTable->getRelation('Book')->getColumnMappings(), 'getColumnMappings returns local to foreign by default'); - $this->assertEquals(array('author.ID' => 'book.AUTHOR_ID'), $authorTable->getRelation('Book')->getColumnMappings(RelationMap::LEFT_TO_RIGHT), 'getColumnMappings returns foreign to local when asked left to right for a one to many relationship'); - - $bookEmpTable = $this->databaseMap->getTableByPhpName('BookstoreEmployee'); - $this->assertEquals(array('bookstore_employee_account.EMPLOYEE_ID' => 'bookstore_employee.ID'), $bookEmpTable->getRelation('BookstoreEmployeeAccount')->getColumnMappings(), 'getColumnMappings returns local to foreign by default'); - $this->assertEquals(array('bookstore_employee.ID' => 'bookstore_employee_account.EMPLOYEE_ID'), $bookEmpTable->getRelation('BookstoreEmployeeAccount')->getColumnMappings(RelationMap::LEFT_TO_RIGHT), 'getColumnMappings returns foreign to local when asked left to right for a one to one relationship'); - } - - public function testCountColumnMappings() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $this->assertEquals(1, $bookTable->getRelation('Author')->countColumnMappings()); - - $rfTable = $this->databaseMap->getTableByPhpName('ReaderFavorite'); - $this->assertEquals(2, $rfTable->getRelation('BookOpinion')->countColumnMappings()); - } - - public function testIsComposite() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $this->assertFalse($bookTable->getRelation('Author')->isComposite()); - - $rfTable = $this->databaseMap->getTableByPhpName('ReaderFavorite'); - $this->assertTrue($rfTable->getRelation('BookOpinion')->isComposite()); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/map/RelatedMapSymmetricalTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/map/RelatedMapSymmetricalTest.php deleted file mode 100644 index 6737aa7df2..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/map/RelatedMapSymmetricalTest.php +++ /dev/null @@ -1,70 +0,0 @@ -databaseMap = Propel::getDatabaseMap('bookstore'); - } - - public function testOneToMany() - { - $bookTable = $this->databaseMap->getTableByPhpName('Book'); - $bookToAuthor = $bookTable->getRelation('Author'); - $authorTable = $this->databaseMap->getTableByPhpName('Author'); - $authorToBook = $authorTable->getRelation('Book'); - $this->assertEquals($authorToBook, $bookToAuthor->getSymmetricalRelation()); - $this->assertEquals($bookToAuthor, $authorToBook->getSymmetricalRelation()); - } - - public function testOneToOne() - { - $accountTable = $this->databaseMap->getTableByPhpName('BookstoreEmployeeAccount'); - $accountToEmployee = $accountTable->getRelation('BookstoreEmployee'); - $employeeTable = $this->databaseMap->getTableByPhpName('BookstoreEmployee'); - $employeeToAccount = $employeeTable->getRelation('BookstoreEmployeeAccount'); - $this->assertEquals($accountToEmployee, $employeeToAccount->getSymmetricalRelation()); - $this->assertEquals($employeeToAccount, $accountToEmployee->getSymmetricalRelation()); - } - - public function testSeveralRelationsOnSameTable() - { - $authorTable = $this->databaseMap->getTableByPhpName('Author'); - $authorToEssay = $authorTable->getRelation('EssayRelatedByFirstAuthor'); - $essayTable = $this->databaseMap->getTableByPhpName('Essay'); - $essayToAuthor = $essayTable->getRelation('AuthorRelatedByFirstAuthor'); - $this->assertEquals($authorToEssay, $essayToAuthor->getSymmetricalRelation()); - $this->assertEquals($essayToAuthor, $authorToEssay->getSymmetricalRelation()); - } - - public function testCompositeForeignKey() - { - $favoriteTable = $this->databaseMap->getTableByPhpName('ReaderFavorite'); - $favoriteToOpinion = $favoriteTable->getRelation('BookOpinion'); - $opinionTable = $this->databaseMap->getTableByPhpName('BookOpinion'); - $opinionToFavorite = $opinionTable->getRelation('ReaderFavorite'); - $this->assertEquals($favoriteToOpinion, $opinionToFavorite->getSymmetricalRelation()); - $this->assertEquals($opinionToFavorite, $favoriteToOpinion->getSymmetricalRelation()); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/map/RelationMapTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/map/RelationMapTest.php deleted file mode 100644 index 202755781b..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/map/RelationMapTest.php +++ /dev/null @@ -1,89 +0,0 @@ -databaseMap = new DatabaseMap('foodb'); - $this->relationName = 'foo'; - $this->rmap = new RelationMap($this->relationName); - } - - public function testConstructor() - { - $this->assertEquals($this->relationName, $this->rmap->getName(), 'constructor sets the relation name'); - } - - public function testLocalTable() - { - $this->assertNull($this->rmap->getLocalTable(), 'A new relation has no local table'); - $tmap1 = new TableMap('foo', $this->databaseMap); - $this->rmap->setLocalTable($tmap1); - $this->assertEquals($tmap1, $this->rmap->getLocalTable(), 'The local table is set by setLocalTable()'); - } - - public function testForeignTable() - { - $this->assertNull($this->rmap->getForeignTable(), 'A new relation has no foreign table'); - $tmap2 = new TableMap('bar', $this->databaseMap); - $this->rmap->setForeignTable($tmap2); - $this->assertEquals($tmap2, $this->rmap->getForeignTable(), 'The foreign table is set by setForeignTable()'); - } - - public function testProperties() - { - $properties = array('type', 'onUpdate', 'onDelete'); - foreach ($properties as $property) - { - $getter = 'get' . ucfirst($property); - $setter = 'set' . ucfirst($property); - $this->assertNull($this->rmap->$getter(), "A new relation has no $property"); - $this->rmap->$setter('foo_value'); - $this->assertEquals('foo_value', $this->rmap->$getter(), "The $property is set by setType()"); - } - } - - public function testColumns() - { - $this->assertEquals(array(), $this->rmap->getLocalColumns(), 'A new relation has no local columns'); - $this->assertEquals(array(), $this->rmap->getForeignColumns(), 'A new relation has no foreign columns'); - $tmap1 = new TableMap('foo', $this->databaseMap); - $col1 = $tmap1->addColumn('FOO1', 'Foo1PhpName', 'INTEGER'); - $tmap2 = new TableMap('bar', $this->databaseMap); - $col2 = $tmap2->addColumn('BAR1', 'Bar1PhpName', 'INTEGER'); - $this->rmap->addColumnMapping($col1, $col2); - $this->assertEquals(array($col1), $this->rmap->getLocalColumns(), 'addColumnMapping() adds a local table'); - $this->assertEquals(array($col2), $this->rmap->getForeignColumns(), 'addColumnMapping() adds a foreign table'); - $expected = array('foo.FOO1' => 'bar.BAR1'); - $this->assertEquals($expected, $this->rmap->getColumnMappings(), 'getColumnMappings() returns an associative array of column mappings'); - $col3 = $tmap1->addColumn('FOOFOO', 'FooFooPhpName', 'INTEGER'); - $col4 = $tmap2->addColumn('BARBAR', 'BarBarPhpName', 'INTEGER'); - $this->rmap->addColumnMapping($col3, $col4); - $this->assertEquals(array($col1, $col3), $this->rmap->getLocalColumns(), 'addColumnMapping() adds a local table'); - $this->assertEquals(array($col2, $col4), $this->rmap->getForeignColumns(), 'addColumnMapping() adds a foreign table'); - $expected = array('foo.FOO1' => 'bar.BAR1', 'foo.FOOFOO' => 'bar.BARBAR'); - $this->assertEquals($expected, $this->rmap->getColumnMappings(), 'getColumnMappings() returns an associative array of column mappings'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/map/TableMapTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/map/TableMapTest.php deleted file mode 100644 index 42e7e748b7..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/map/TableMapTest.php +++ /dev/null @@ -1,286 +0,0 @@ -rmap = $this->addRelation('Bar', 'Bar', RelationMap::MANY_TO_ONE); - } -} - -class BarTableMap extends TableMap -{ - public function initialize() - { - $this->setName('bar'); - $this->setPhpName('Bar'); - } -} - - - -/** - * Test class for TableMap. - * - * @author François Zaninotto - * @version $Id: TableMapTest.php 1773 2010-05-25 10:25:06Z francois $ - * @package runtime.map - */ -class TableMapTest extends PHPUnit_Framework_TestCase -{ - protected $databaseMap; - - protected function setUp() - { - parent::setUp(); - $this->databaseMap = new DatabaseMap('foodb'); - $this->tableName = 'foo'; - $this->tmap = new TableMap($this->tableName, $this->databaseMap); - } - - protected function tearDown() - { - // nothing to do for now - parent::tearDown(); - } - - public function testConstructor() - { - $this->assertEquals(array(), $this->tmap->getColumns(), 'A new table map has no columns'); - $this->assertEquals($this->tableName, $this->tmap->getName(), 'constructor can set the table name'); - $this->assertEquals($this->databaseMap, $this->tmap->getDatabaseMap(), 'Constructor can set the database map'); - try { - $tmap = new TableMap(); - $this->assertTrue(true, 'A table map can be instanciated with no parameters'); - } catch (Exception $e) { - $this->fail('A table map can be instanciated with no parameters'); - } - } - - public function testProperties() - { - $tmap = new TableMap(); - $properties = array('name', 'phpName', 'className', 'package'); - foreach ($properties as $property) - { - $getter = 'get' . ucfirst($property); - $setter = 'set' . ucfirst($property); - $this->assertNull($tmap->$getter(), "A new relation has no $property"); - $tmap->$setter('foo_value'); - $this->assertEquals('foo_value', $tmap->$getter(), "The $property is set by setType()"); - } - } - - public function testHasColumn() - { - $this->assertFalse($this->tmap->hasColumn('BAR'), 'hascolumn() returns false when the column is not in the table map'); - $column = $this->tmap->addColumn('BAR', 'Bar', 'INTEGER'); - $this->assertTrue($this->tmap->hasColumn('BAR'), 'hascolumn() returns true when the column is in the table map'); - $this->assertTrue($this->tmap->hasColumn('foo.bar'), 'hascolumn() accepts a denormalized column name'); - $this->assertFalse($this->tmap->hasColumn('foo.bar', false), 'hascolumn() accepts a $normalize parameter to skip name normalization'); - $this->assertTrue($this->tmap->hasColumn('BAR', false), 'hascolumn() accepts a $normalize parameter to skip name normalization'); - $this->assertTrue($this->tmap->hasColumn($column), 'hascolumn() accepts a ColumnMap object as parameter'); - } - - public function testGetColumn() - { - $column = $this->tmap->addColumn('BAR', 'Bar', 'INTEGER'); - $this->assertEquals($column, $this->tmap->getColumn('BAR'), 'getColumn returns a ColumnMap according to a column name'); - try - { - $this->tmap->getColumn('FOO'); - $this->fail('getColumn throws an exception when called on an inexistent column'); - } catch(PropelException $e) {} - $this->assertEquals($column, $this->tmap->getColumn('foo.bar'), 'getColumn accepts a denormalized column name'); - try - { - $this->tmap->getColumn('foo.bar', false); - $this->fail('getColumn accepts a $normalize parameter to skip name normalization'); - } catch(PropelException $e) {} - } - - public function testGetColumnByPhpName() - { - $column = $this->tmap->addColumn('BAR_BAZ', 'BarBaz', 'INTEGER'); - $this->assertEquals($column, $this->tmap->getColumnByPhpName('BarBaz'), 'getColumnByPhpName() returns a ColumnMap according to a column phpName'); - try - { - $this->tmap->getColumn('Foo'); - $this->fail('getColumnByPhpName() throws an exception when called on an inexistent column'); - } catch(PropelException $e) {} - } - - public function testGetColumns() - { - $this->assertEquals(array(), $this->tmap->getColumns(), 'getColumns returns an empty array when no columns were added'); - $column1 = $this->tmap->addColumn('BAR', 'Bar', 'INTEGER'); - $column2 = $this->tmap->addColumn('BAZ', 'Baz', 'INTEGER'); - $this->assertEquals(array('BAR' => $column1, 'BAZ' => $column2), $this->tmap->getColumns(), 'getColumns returns the columns indexed by name'); - } - - public function testAddPrimaryKey() - { - $column1 = $this->tmap->addPrimaryKey('BAR', 'Bar', 'INTEGER'); - $this->assertTrue($column1->isPrimaryKey(), 'Columns added by way of addPrimaryKey() are primary keys'); - $column2 = $this->tmap->addColumn('BAZ', 'Baz', 'INTEGER'); - $this->assertFalse($column2->isPrimaryKey(), 'Columns added by way of addColumn() are not primary keys by default'); - $column3 = $this->tmap->addColumn('BAZZ', 'Bazz', 'INTEGER', null, null, null, true); - $this->assertTrue($column3->isPrimaryKey(), 'Columns added by way of addColumn() can be defined as primary keys'); - $column4 = $this->tmap->addForeignKey('BAZZZ', 'Bazzz', 'INTEGER', 'Table1', 'column1'); - $this->assertFalse($column4->isPrimaryKey(), 'Columns added by way of addForeignKey() are not primary keys'); - $column5 = $this->tmap->addForeignPrimaryKey('BAZZZZ', 'Bazzzz', 'INTEGER', 'table1', 'column1'); - $this->assertTrue($column5->isPrimaryKey(), 'Columns added by way of addForeignPrimaryKey() are primary keys'); - } - - public function testGetPrimaryKeyColumns() - { - $this->assertEquals(array(), $this->tmap->getPrimaryKeyColumns(), 'getPrimaryKeyColumns() returns an empty array by default'); - $column1 = $this->tmap->addPrimaryKey('BAR', 'Bar', 'INTEGER'); - $column3 = $this->tmap->addColumn('BAZZ', 'Bazz', 'INTEGER', null, null, null, true); - $expected = array($column1, $column3); - $this->assertEquals($expected, $this->tmap->getPrimaryKeyColumns(), 'getPrimaryKeyColumns() returns an array of the table primary keys'); - } - - public function testGetPrimaryKeys() - { - $this->assertEquals(array(), $this->tmap->getPrimaryKeys(), 'getPrimaryKeys() returns an empty array by default'); - $column1 = $this->tmap->addPrimaryKey('BAR', 'Bar', 'INTEGER'); - $column3 = $this->tmap->addColumn('BAZZ', 'Bazz', 'INTEGER', null, null, null, true); - $expected = array('BAR' => $column1, 'BAZZ' => $column3); - $this->assertEquals($expected, $this->tmap->getPrimaryKeys(), 'getPrimaryKeys() returns an array of the table primary keys'); - } - - public function testAddForeignKey() - { - $column1 = $this->tmap->addForeignKey('BAR', 'Bar', 'INTEGER', 'Table1', 'column1'); - $this->assertTrue($column1->isForeignKey(), 'Columns added by way of addForeignKey() are foreign keys'); - $column2 = $this->tmap->addColumn('BAZ', 'Baz', 'INTEGER'); - $this->assertFalse($column2->isForeignKey(), 'Columns added by way of addColumn() are not foreign keys by default'); - $column3 = $this->tmap->addColumn('BAZZ', 'Bazz', 'INTEGER', null, null, null, false, 'Table1', 'column1'); - $this->assertTrue($column3->isForeignKey(), 'Columns added by way of addColumn() can be defined as foreign keys'); - $column4 = $this->tmap->addPrimaryKey('BAZZZ', 'Bazzz', 'INTEGER'); - $this->assertFalse($column4->isForeignKey(), 'Columns added by way of addPrimaryKey() are not foreign keys'); - $column5 = $this->tmap->addForeignPrimaryKey('BAZZZZ', 'Bazzzz', 'INTEGER', 'table1', 'column1'); - $this->assertTrue($column5->isForeignKey(), 'Columns added by way of addForeignPrimaryKey() are foreign keys'); - } - - public function testGetForeignKeys() - { - $this->assertEquals(array(), $this->tmap->getForeignKeys(), 'getForeignKeys() returns an empty array by default'); - $column1 = $this->tmap->addForeignKey('BAR', 'Bar', 'INTEGER', 'Table1', 'column1'); - $column3 = $this->tmap->addColumn('BAZZ', 'Bazz', 'INTEGER', null, null, null, false, 'Table1', 'column1'); - $expected = array('BAR' => $column1, 'BAZZ' => $column3); - $this->assertEquals($expected, $this->tmap->getForeignKeys(), 'getForeignKeys() returns an array of the table foreign keys'); - } - - public function testLazyLoadRelations() - { - try { - $this->tmap->getRelation('Bar'); - $this->fail('getRelation() throws an exception when called on a table with no relations'); - } catch (PropelException $e) { - $this->assertTrue(true, 'getRelation() throws an exception when called on a table with no relations'); - } - $foreigntmap = new BarTableMap(); - $this->databaseMap->addTableObject($foreigntmap); - $localtmap = new FooTableMap(); - $this->databaseMap->addTableObject($localtmap); - $rmap = $localtmap->getRelation('Bar'); - $this->assertEquals($rmap, $localtmap->rmap, 'getRelation() returns the relations lazy loaded by buildRelations()'); - } - - public function testAddRelation() - { - $foreigntmap1 = new TableMap('bar'); - $foreigntmap1->setClassname('Bar'); - $this->databaseMap->addTableObject($foreigntmap1); - $foreigntmap2 = new TableMap('baz'); - $foreigntmap2->setClassname('Baz'); - $this->databaseMap->addTableObject($foreigntmap2); - $this->rmap1 = $this->tmap->addRelation('Bar', 'Bar', RelationMap::MANY_TO_ONE); - $this->rmap2 = $this->tmap->addRelation('Bazz', 'Baz', RelationMap::ONE_TO_MANY); - $this->tmap->getRelations(); - // now on to the test - $this->assertEquals($this->rmap1->getLocalTable(), $this->tmap, 'adding a relation with HAS_ONE sets the local table to the current table'); - $this->assertEquals($this->rmap1->getForeignTable(), $foreigntmap1, 'adding a relation with HAS_ONE sets the foreign table according to the name given'); - $this->assertEquals(RelationMap::MANY_TO_ONE, $this->rmap1->getType(), 'adding a relation with HAS_ONE sets the foreign table type accordingly'); - - $this->assertEquals($this->rmap2->getForeignTable(), $this->tmap, 'adding a relation with HAS_MANY sets the foreign table to the current table'); - $this->assertEquals($this->rmap2->getLocalTable(), $foreigntmap2, 'adding a relation with HAS_MANY sets the local table according to the name given'); - $this->assertEquals(RelationMap::ONE_TO_MANY, $this->rmap2->getType(), 'adding a relation with HAS_MANY sets the foreign table type accordingly'); - - $expectedRelations = array('Bar' => $this->rmap1, 'Bazz' => $this->rmap2); - $this->assertEquals($expectedRelations, $this->tmap->getRelations(), 'getRelations() returns an associative array of all the relations'); - } - - // deprecated method - public function testNormalizeColName() - { - $tmap = new TestableTableMap(); - $this->assertEquals('', $tmap->normalizeColName(''), 'normalizeColName returns an empty string when passed an empty string'); - $this->assertEquals('BAR', $tmap->normalizeColName('bar'), 'normalizeColName uppercases the input'); - $this->assertEquals('BAR_BAZ', $tmap->normalizeColName('bar_baz'), 'normalizeColName does not mind underscores'); - $this->assertEquals('BAR', $tmap->normalizeColName('FOO.BAR'), 'normalizeColName removes table prefix'); - $this->assertEquals('BAR', $tmap->normalizeColName('BAR'), 'normalizeColName leaves normalized column names unchanged'); - $this->assertEquals('BAR_BAZ', $tmap->normalizeColName('foo.bar_baz'), 'normalizeColName can do all the above at the same time'); - } - - // deprecated method - public function testContainsColumn() - { - $this->assertFalse($this->tmap->containsColumn('BAR'), 'containsColumn returns false when the column is not in the table map'); - $column = $this->tmap->addColumn('BAR', 'Bar', 'INTEGER'); - $this->assertTrue($this->tmap->containsColumn('BAR'), 'containsColumn returns true when the column is in the table map'); - $this->assertTrue($this->tmap->containsColumn('foo.bar'), 'containsColumn accepts a denormalized column name'); - $this->assertFalse($this->tmap->containsColumn('foo.bar', false), 'containsColumn accepts a $normalize parameter to skip name normalization'); - $this->assertTrue($this->tmap->containsColumn('BAR', false), 'containsColumn accepts a $normalize parameter to skip name normalization'); - $this->assertTrue($this->tmap->containsColumn($column), 'containsColumn accepts a ColumnMap object as parameter'); - } - - // deprecated methods - public function testPrefix() - { - $tmap = new TestableTableMap(); - $this->assertNull($tmap->getPrefix(), 'prefix is empty until set'); - $this->assertFalse($tmap->hasPrefix('barbaz'), 'hasPrefix returns false when prefix is not set'); - $tmap->setPrefix('bar'); - $this->assertEquals('bar', $tmap->getPrefix(), 'prefix is set by setPrefix()'); - $this->assertTrue($tmap->hasPrefix('barbaz'), 'hasPrefix returns true when prefix is set and found in string'); - $this->assertFalse($tmap->hasPrefix('baz'), 'hasPrefix returns false when prefix is set and not found in string'); - $this->assertFalse($tmap->hasPrefix('bazbar'), 'hasPrefix returns false when prefix is set and not found anywhere in string'); - $this->assertEquals('baz', $tmap->removePrefix('barbaz'), 'removePrefix returns string without prefix if found at the beginning'); - $this->assertEquals('bazbaz', $tmap->removePrefix('bazbaz'), 'removePrefix returns original string when prefix is not found'); - $this->assertEquals('bazbar', $tmap->removePrefix('bazbar'), 'removePrefix returns original string when prefix is not found at the beginning'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/om/BaseObjectSerializeTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/om/BaseObjectSerializeTest.php deleted file mode 100644 index 16a6fb836c..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/om/BaseObjectSerializeTest.php +++ /dev/null @@ -1,95 +0,0 @@ -assertEquals($book, unserialize($sb)); - } - - public function testSerializePopulatedObject() - { - $book = new Book(); - $book->setTitle('Foo1'); - $book->setISBN('1234'); - $sb = serialize($book); - $this->assertEquals($book, unserialize($sb)); - } - - public function testSerializePersistedObject() - { - $book = new Book(); - $book->setTitle('Foo2'); - $book->setISBN('1234'); - $book->save(); - $sb = serialize($book); - $this->assertEquals($book, unserialize($sb)); - } - - public function testSerializeHydratedObject() - { - $book = new Book(); - $book->setTitle('Foo3'); - $book->setISBN('1234'); - $book->save(); - BookPeer::clearInstancePool(); - - $book = BookQuery::create()->findOneByTitle('Foo3'); - $sb = serialize($book); - $this->assertEquals($book, unserialize($sb)); - } - - public function testSerializeObjectWithRelations() - { - $author = new Author(); - $author->setFirstName('John'); - $book = new Book(); - $book->setTitle('Foo4'); - $book->setISBN('1234'); - $book->setAuthor($author); - $book->save(); - $b = clone $book; - $sb = serialize($b); - $book->clearAllReferences(); - $this->assertEquals($book, unserialize($sb)); - } - - public function testSerializeObjectWithCollections() - { - $book1 = new Book(); - $book1->setTitle('Foo5'); - $book1->setISBN('1234'); - $book2 = new Book(); - $book2->setTitle('Foo6'); - $book2->setISBN('1234'); - $author = new Author(); - $author->setFirstName('JAne'); - $author->addBook($book1); - $author->addBook($book2); - $author->save(); - $a = clone $author; - $sa = serialize($a); - $author->clearAllReferences(); - $this->assertEquals($author, unserialize($sa)); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/om/BaseObjectTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/om/BaseObjectTest.php deleted file mode 100644 index dd3f4ebe28..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/om/BaseObjectTest.php +++ /dev/null @@ -1,69 +0,0 @@ -assertEquals(array(), $b->getVirtualColumns(), 'getVirtualColumns() returns an empty array for new objects'); - $b->virtualColumns = array('foo' => 'bar'); - $this->assertEquals(array('foo' => 'bar'), $b->getVirtualColumns(), 'getVirtualColumns() returns an associative array of virtual columns'); - } - - public function testHasVirtualColumn() - { - $b = new TestableBaseObject(); - $this->assertFalse($b->hasVirtualColumn('foo'), 'hasVirtualColumn() returns false if the virtual column is not set'); - $b->virtualColumns = array('foo' => 'bar'); - $this->assertTrue($b->hasVirtualColumn('foo'), 'hasVirtualColumn() returns true if the virtual column is set'); - } - - /** - * @expectedException PropelException - */ - public function testGetVirtualColumnWrongKey() - { - $b = new TestableBaseObject(); - $b->getVirtualColumn('foo'); - } - - public function testGetVirtualColumn() - { - $b = new TestableBaseObject(); - $b->virtualColumns = array('foo' => 'bar'); - $this->assertEquals('bar', $b->getVirtualColumn('foo'), 'getVirtualColumn() returns a virtual column value based on its key'); - } - - public function testSetVirtualColumn() - { - $b = new TestableBaseObject(); - $b->setVirtualColumn('foo', 'bar'); - $this->assertEquals('bar', $b->getVirtualColumn('foo'), 'setVirtualColumn() sets a virtual column value based on its key'); - $b->setVirtualColumn('foo', 'baz'); - $this->assertEquals('baz', $b->getVirtualColumn('foo'), 'setVirtualColumn() can modify the value of an existing virtual column'); - $this->assertEquals($b, $b->setVirtualColumn('foo', 'bar'), 'setVirtualColumn() returns the current object'); - } -} - -class TestableBaseObject extends BaseObject -{ - public $virtualColumns = array(); -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaCombineTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaCombineTest.php deleted file mode 100644 index d5cec12ea7..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaCombineTest.php +++ /dev/null @@ -1,385 +0,0 @@ -c = new Criteria(); - $this->savedAdapter = Propel::getDB(null); - Propel::setDB(null, new DBSQLite()); - } - - protected function tearDown() - { - Propel::setDB(null, $this->savedAdapter); - parent::tearDown(); - } - - /** - * test various properties of Criterion and nested criterion - */ - public function testNestedCriterion() - { - $table2 = "myTable2"; - $column2 = "myColumn2"; - $value2 = "myValue2"; - $key2 = "$table2.$column2"; - - $table3 = "myTable3"; - $column3 = "myColumn3"; - $value3 = "myValue3"; - $key3 = "$table3.$column3"; - - $table4 = "myTable4"; - $column4 = "myColumn4"; - $value4 = "myValue4"; - $key4 = "$table4.$column4"; - - $table5 = "myTable5"; - $column5 = "myColumn5"; - $value5 = "myValue5"; - $key5 = "$table5.$column5"; - - $crit2 = $this->c->getNewCriterion($key2, $value2, Criteria::EQUAL); - $crit3 = $this->c->getNewCriterion($key3, $value3, Criteria::EQUAL); - $crit4 = $this->c->getNewCriterion($key4, $value4, Criteria::EQUAL); - $crit5 = $this->c->getNewCriterion($key5, $value5, Criteria::EQUAL); - - $crit2->addAnd($crit3)->addOr($crit4->addAnd($crit5)); - $expect = "((myTable2.myColumn2=:p1 AND myTable3.myColumn3=:p2) " - . "OR (myTable4.myColumn4=:p3 AND myTable5.myColumn5=:p4))"; - - $sb = ""; - $params = array(); - $crit2->appendPsTo($sb, $params); - - $expect_params = array( - array('table' => 'myTable2', 'column' => 'myColumn2', 'value' => 'myValue2'), - array('table' => 'myTable3', 'column' => 'myColumn3', 'value' => 'myValue3'), - array('table' => 'myTable4', 'column' => 'myColumn4', 'value' => 'myValue4'), - array('table' => 'myTable5', 'column' => 'myColumn5', 'value' => 'myValue5'), - ); - - $this->assertEquals($expect, $sb); - $this->assertEquals($expect_params, $params); - - $crit6 = $this->c->getNewCriterion($key2, $value2, Criteria::EQUAL); - $crit7 = $this->c->getNewCriterion($key3, $value3, Criteria::EQUAL); - $crit8 = $this->c->getNewCriterion($key4, $value4, Criteria::EQUAL); - $crit9 = $this->c->getNewCriterion($key5, $value5, Criteria::EQUAL); - - $crit6->addAnd($crit7)->addOr($crit8)->addAnd($crit9); - $expect = "(((myTable2.myColumn2=:p1 AND myTable3.myColumn3=:p2) " - . "OR myTable4.myColumn4=:p3) AND myTable5.myColumn5=:p4)"; - - $sb = ""; - $params = array(); - $crit6->appendPsTo($sb, $params); - - $expect_params = array( - array('table' => 'myTable2', 'column' => 'myColumn2', 'value' => 'myValue2'), - array('table' => 'myTable3', 'column' => 'myColumn3', 'value' => 'myValue3'), - array('table' => 'myTable4', 'column' => 'myColumn4', 'value' => 'myValue4'), - array('table' => 'myTable5', 'column' => 'myColumn5', 'value' => 'myValue5'), - ); - - $this->assertEquals($expect, $sb); - $this->assertEquals($expect_params, $params); - - // should make sure we have tests for all possibilities - - $crita = $crit2->getAttachedCriterion(); - - $this->assertEquals($crit2, $crita[0]); - $this->assertEquals($crit3, $crita[1]); - $this->assertEquals($crit4, $crita[2]); - $this->assertEquals($crit5, $crita[3]); - - $tables = $crit2->getAllTables(); - - $this->assertEquals($crit2->getTable(), $tables[0]); - $this->assertEquals($crit3->getTable(), $tables[1]); - $this->assertEquals($crit4->getTable(), $tables[2]); - $this->assertEquals($crit5->getTable(), $tables[3]); - - // simple confirmations that equality operations work - $this->assertTrue($crit2->hashCode() === $crit2->hashCode()); - } - - /** - * Tests <= and >=. - */ - public function testBetweenCriterion() - { - $cn1 = $this->c->getNewCriterion("INVOICE.COST", 1000, Criteria::GREATER_EQUAL); - $cn2 = $this->c->getNewCriterion("INVOICE.COST", 5000, Criteria::LESS_EQUAL); - $this->c->add($cn1->addAnd($cn2)); - - $expect = "SELECT FROM INVOICE WHERE (INVOICE.COST>=:p1 AND INVOICE.COST<=:p2)"; - $expect_params = array( - array('table' => 'INVOICE', 'column' => 'COST', 'value' => 1000), - array('table' => 'INVOICE', 'column' => 'COST', 'value' => 5000), - ); - - try { - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - } catch (PropelException $e) { - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ".$e->getMessage()); - } - - $this->assertEquals($expect, $result); - $this->assertEquals($expect_params, $params); - } - - /** - * Verify that AND and OR criterion are nested correctly. - */ - public function testPrecedence() - { - $cn1 = $this->c->getNewCriterion("INVOICE.COST", "1000", Criteria::GREATER_EQUAL); - $cn2 = $this->c->getNewCriterion("INVOICE.COST", "2000", Criteria::LESS_EQUAL); - $cn3 = $this->c->getNewCriterion("INVOICE.COST", "8000", Criteria::GREATER_EQUAL); - $cn4 = $this->c->getNewCriterion("INVOICE.COST", "9000", Criteria::LESS_EQUAL); - $this->c->add($cn1->addAnd($cn2)); - $this->c->addOr($cn3->addAnd($cn4)); - - $expect = - "SELECT FROM INVOICE WHERE ((INVOICE.COST>=:p1 AND INVOICE.COST<=:p2) OR (INVOICE.COST>=:p3 AND INVOICE.COST<=:p4))"; - - $expect_params = array( - array('table' => 'INVOICE', 'column' => 'COST', 'value' => '1000'), - array('table' => 'INVOICE', 'column' => 'COST', 'value' => '2000'), - array('table' => 'INVOICE', 'column' => 'COST', 'value' => '8000'), - array('table' => 'INVOICE', 'column' => 'COST', 'value' => '9000'), - ); - - try { - $params=array(); - $result = BasePeer::createSelectSql($this->c, $params); - } catch (PropelException $e) { - $this->fail("PropelException thrown in BasePeer::createSelectSql()"); - } - - $this->assertEquals($expect, $result); - $this->assertEquals($expect_params, $params); - } - - public function testCombineCriterionAndSimple() - { - $this->c->addCond('cond1', "INVOICE.COST", "1000", Criteria::GREATER_EQUAL); - $this->c->addCond('cond2', "INVOICE.COST", "2000", Criteria::LESS_EQUAL); - $this->c->combine(array('cond1', 'cond2'), Criteria::LOGICAL_AND); - - $expect = "SELECT FROM INVOICE WHERE (INVOICE.COST>=:p1 AND INVOICE.COST<=:p2)"; - $expect_params = array( - array('table' => 'INVOICE', 'column' => 'COST', 'value' => '1000'), - array('table' => 'INVOICE', 'column' => 'COST', 'value' => '2000'), - ); - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $this->assertEquals($expect, $result); - $this->assertEquals($expect_params, $params); - } - - public function testCombineCriterionAndLessSimple() - { - $this->c->addCond('cond1', "INVOICE.COST1", "1000", Criteria::GREATER_EQUAL); - $this->c->addCond('cond2', "INVOICE.COST2", "2000", Criteria::LESS_EQUAL); - $this->c->add("INVOICE.COST3", "8000", Criteria::GREATER_EQUAL); - $this->c->combine(array('cond1', 'cond2'), Criteria::LOGICAL_AND); - $this->c->add("INVOICE.COST4", "9000", Criteria::LESS_EQUAL); - - $expect = "SELECT FROM INVOICE WHERE INVOICE.COST3>=:p1 AND (INVOICE.COST1>=:p2 AND INVOICE.COST2<=:p3) AND INVOICE.COST4<=:p4"; - $expect_params = array( - array('table' => 'INVOICE', 'column' => 'COST3', 'value' => '8000'), - array('table' => 'INVOICE', 'column' => 'COST1', 'value' => '1000'), - array('table' => 'INVOICE', 'column' => 'COST2', 'value' => '2000'), - array('table' => 'INVOICE', 'column' => 'COST4', 'value' => '9000'), - ); - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $this->assertEquals($expect, $result); - $this->assertEquals($expect_params, $params); - } - - public function testCombineCriterionAndMultiple() - { - $this->c->addCond('cond1',"INVOICE.COST1", "1000", Criteria::GREATER_EQUAL); - $this->c->addCond('cond2', "INVOICE.COST2", "2000", Criteria::LESS_EQUAL); - $this->c->addCond('cond3', "INVOICE.COST3", "8000", Criteria::GREATER_EQUAL); - $this->c->addCond('cond4', "INVOICE.COST4", "9000", Criteria::LESS_EQUAL); - $this->c->combine(array('cond1', 'cond2', 'cond3', 'cond4'), Criteria::LOGICAL_AND); - - $expect = "SELECT FROM INVOICE WHERE (((INVOICE.COST1>=:p1 AND INVOICE.COST2<=:p2) AND INVOICE.COST3>=:p3) AND INVOICE.COST4<=:p4)"; - $expect_params = array( - array('table' => 'INVOICE', 'column' => 'COST1', 'value' => '1000'), - array('table' => 'INVOICE', 'column' => 'COST2', 'value' => '2000'), - array('table' => 'INVOICE', 'column' => 'COST3', 'value' => '8000'), - array('table' => 'INVOICE', 'column' => 'COST4', 'value' => '9000'), - ); - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $this->assertEquals($expect, $result); - $this->assertEquals($expect_params, $params); - } - - public function testCombineCriterionOrSimple() - { - $this->c->addCond('cond1', "INVOICE.COST", "1000", Criteria::GREATER_EQUAL); - $this->c->addCond('cond2', "INVOICE.COST", "2000", Criteria::LESS_EQUAL); - $this->c->combine(array('cond1', 'cond2'), Criteria::LOGICAL_OR); - - $expect = "SELECT FROM INVOICE WHERE (INVOICE.COST>=:p1 OR INVOICE.COST<=:p2)"; - $expect_params = array( - array('table' => 'INVOICE', 'column' => 'COST', 'value' => '1000'), - array('table' => 'INVOICE', 'column' => 'COST', 'value' => '2000'), - ); - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $this->assertEquals($expect, $result); - $this->assertEquals($expect_params, $params); - } - - public function testCombineCriterionOrLessSimple() - { - $this->c->addCond('cond1', "INVOICE.COST1", "1000", Criteria::GREATER_EQUAL); - $this->c->addCond('cond2', "INVOICE.COST2", "2000", Criteria::LESS_EQUAL); - $this->c->add("INVOICE.COST3", "8000", Criteria::GREATER_EQUAL); - $this->c->combine(array('cond1', 'cond2'), Criteria::LOGICAL_OR); - $this->c->addOr("INVOICE.COST4", "9000", Criteria::LESS_EQUAL); - - $expect = "SELECT FROM INVOICE WHERE INVOICE.COST3>=:p1 AND ((INVOICE.COST1>=:p2 OR INVOICE.COST2<=:p3) OR INVOICE.COST4<=:p4)"; - $expect_params = array( - array('table' => 'INVOICE', 'column' => 'COST3', 'value' => '8000'), - array('table' => 'INVOICE', 'column' => 'COST1', 'value' => '1000'), - array('table' => 'INVOICE', 'column' => 'COST2', 'value' => '2000'), - array('table' => 'INVOICE', 'column' => 'COST4', 'value' => '9000'), - ); - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $this->assertEquals($expect, $result); - $this->assertEquals($expect_params, $params); - } - - public function testCombineCriterionOrMultiple() - { - $this->c->addCond('cond1',"INVOICE.COST1", "1000", Criteria::GREATER_EQUAL); - $this->c->addCond('cond2', "INVOICE.COST2", "2000", Criteria::LESS_EQUAL); - $this->c->addCond('cond3', "INVOICE.COST3", "8000", Criteria::GREATER_EQUAL); - $this->c->addCond('cond4', "INVOICE.COST4", "9000", Criteria::LESS_EQUAL); - $this->c->combine(array('cond1', 'cond2', 'cond3', 'cond4'), Criteria::LOGICAL_OR); - - $expect = "SELECT FROM INVOICE WHERE (((INVOICE.COST1>=:p1 OR INVOICE.COST2<=:p2) OR INVOICE.COST3>=:p3) OR INVOICE.COST4<=:p4)"; - $expect_params = array( - array('table' => 'INVOICE', 'column' => 'COST1', 'value' => '1000'), - array('table' => 'INVOICE', 'column' => 'COST2', 'value' => '2000'), - array('table' => 'INVOICE', 'column' => 'COST3', 'value' => '8000'), - array('table' => 'INVOICE', 'column' => 'COST4', 'value' => '9000'), - ); - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $this->assertEquals($expect, $result); - $this->assertEquals($expect_params, $params); - } - - public function testCombineNamedCriterions() - { - $this->c->addCond('cond1', "INVOICE.COST1", "1000", Criteria::GREATER_EQUAL); - $this->c->addCond('cond2', "INVOICE.COST2", "2000", Criteria::LESS_EQUAL); - $this->c->combine(array('cond1', 'cond2'), Criteria::LOGICAL_AND, 'cond12'); - $this->c->addCond('cond3', "INVOICE.COST3", "8000", Criteria::GREATER_EQUAL); - $this->c->addCond('cond4', "INVOICE.COST4", "9000", Criteria::LESS_EQUAL); - $this->c->combine(array('cond3', 'cond4'), Criteria::LOGICAL_AND, 'cond34'); - $this->c->combine(array('cond12', 'cond34'), Criteria::LOGICAL_OR); - - $expect = "SELECT FROM INVOICE WHERE ((INVOICE.COST1>=:p1 AND INVOICE.COST2<=:p2) OR (INVOICE.COST3>=:p3 AND INVOICE.COST4<=:p4))"; - $expect_params = array( - array('table' => 'INVOICE', 'column' => 'COST1', 'value' => '1000'), - array('table' => 'INVOICE', 'column' => 'COST2', 'value' => '2000'), - array('table' => 'INVOICE', 'column' => 'COST3', 'value' => '8000'), - array('table' => 'INVOICE', 'column' => 'COST4', 'value' => '9000'), - ); - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $this->assertEquals($expect, $result); - $this->assertEquals($expect_params, $params); - } - - public function testCombineDirtyOperators() - { - $this->c->addCond('cond1', "INVOICE.COST1", "1000", Criteria::GREATER_EQUAL); - $this->c->addCond('cond2', "INVOICE.COST2", "2000", Criteria::LESS_EQUAL); - $this->c->combine(array('cond1', 'cond2'), 'AnD', 'cond12'); - $this->c->addCond('cond3', "INVOICE.COST3", "8000", Criteria::GREATER_EQUAL); - $this->c->addCond('cond4', "INVOICE.COST4", "9000", Criteria::LESS_EQUAL); - $this->c->combine(array('cond3', 'cond4'), 'aNd', 'cond34'); - $this->c->combine(array('cond12', 'cond34'), 'oR'); - - $expect = "SELECT FROM INVOICE WHERE ((INVOICE.COST1>=:p1 AND INVOICE.COST2<=:p2) OR (INVOICE.COST3>=:p3 AND INVOICE.COST4<=:p4))"; - $expect_params = array( - array('table' => 'INVOICE', 'column' => 'COST1', 'value' => '1000'), - array('table' => 'INVOICE', 'column' => 'COST2', 'value' => '2000'), - array('table' => 'INVOICE', 'column' => 'COST3', 'value' => '8000'), - array('table' => 'INVOICE', 'column' => 'COST4', 'value' => '9000'), - ); - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $this->assertEquals($expect, $result); - $this->assertEquals($expect_params, $params); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaFluidConditionTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaFluidConditionTest.php deleted file mode 100644 index a2f0d2bbca..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaFluidConditionTest.php +++ /dev/null @@ -1,181 +0,0 @@ - - _if(true)-> - test()-> - _endif(); - $this->assertTrue($f->getTest(), '_if() executes the next method if the test is true'); - $f = new TestableCriteria(); - $f-> - _if(false)-> - foo()-> - _endif(); - $this->assertFalse($f->getTest(), '_if() does not check the existence of the next method if the test is false'); - $f = new TestableCriteria(); - $f-> - _if(true)-> - dummy()-> - test()-> - _endif(); - $this->assertTrue($f->getTest(), '_if() executes the next methods until _endif() if the test is true'); - $f = new TestableCriteria(); - $f-> - _if(false)-> - dummy()-> - test()-> - _endif(); - $this->assertFalse($f->getTest(), '_if() does not execute the next methods until _endif() if the test is false'); - } - - /** - * @expectedException PropelException - */ - public function testNestedIf() - { - $f = new TestableCriteria(); - $f-> - _if(false)-> - _if(true)-> - test()-> - _endif(); - } - - public function testElseIf() - { - $f = new TestableCriteria(); - $f-> - _if(true)-> - _elseif(true)-> - test()-> - _endif(); - $this->assertFalse($f->getTest(), '_elseif() does not execute the next method if the main test is true'); - $f = new TestableCriteria(); - $f-> - _if(true)-> - _elseif(false)-> - test()-> - _endif(); - $this->assertFalse($f->getTest(), '_elseif() does not execute the next method if the main test is true'); - $f = new TestableCriteria(); - $f-> - _if(false)-> - _elseif(true)-> - test()-> - _endif(); - $this->assertTrue($f->getTest(), '_elseif() executes the next method if the main test is false and the elseif test is true'); - $f = new TestableCriteria(); - $f-> - _if(false)-> - _elseif(false)-> - test()-> - _endif(); - $this->assertFalse($f->getTest(), '_elseif() does not execute the next method if the main test is false and the elseif test is false'); - } - - public function testElse() - { - $f = new TestableCriteria(); - $f-> - _if(true)-> - _else()-> - test()-> - _endif(); - $this->assertFalse($f->getTest(), '_else() does not execute the next method if the main test is true'); - $f = new TestableCriteria(); - $f-> - _if(false)-> - _else()-> - test()-> - _endif(); - $this->assertTrue($f->getTest(), '_else() executes the next method if the main test is false'); - $f = new TestableCriteria(); - $f-> - _if(false)-> - _elseif(true)-> - _else()-> - test()-> - _endif(); - $this->assertFalse($f->getTest(), '_else() does not execute the next method if the previous test is true'); - $f-> - _if(false)-> - _elseif(false)-> - _else()-> - test()-> - _endif(); - $this->assertTrue($f->getTest(), '_else() executes the next method if all the previous tests are false'); - } - - public function testEndif() - { - $f = new TestableCriteria(); - $res = $f-> - _if(true)-> - test()-> - _endif(); - $this->assertEquals($res, $f, '_endif() returns the main object if the test is true'); - $f = new TestableCriteria(); - $res = $f-> - _if(false)-> - test()-> - _endif(); - $this->assertEquals($res, $f, '_endif() returns the main object if the test is false'); - $f = new TestableCriteria(); - $f-> - _if(true)-> - _endif()-> - test(); - $this->assertTrue($f->getTest(), '_endif() stops the condition check'); - $f = new TestableCriteria(); - $f-> - _if(false)-> - _endif()-> - test(); - $this->assertTrue($f->getTest(), '_endif() stops the condition check'); - } -} - -class TestableCriteria extends Criteria -{ - protected $test = false; - - public function test() - { - $this->test = true; - - return $this; - } - - public function dummy() - { - return $this; - } - - public function getTest() - { - return $this->test; - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaMergeTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaMergeTest.php deleted file mode 100644 index e28d8a30bf..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaMergeTest.php +++ /dev/null @@ -1,399 +0,0 @@ -Christopher Elkins - * @author Sam Joseph - * @version $Id: CriteriaTest.php 1347 2009-12-03 21:06:36Z francois $ - * @package runtime.query - */ -class CriteriaMergeTest extends BaseTestCase -{ - - protected function assertCriteriaTranslation($criteria, $expectedSql, $message = '') - { - $params = array(); - $result = BasePeer::createSelectSql($criteria, $params); - $this->assertEquals($expectedSql, $result, $message); - } - - public function testMergeWithLimit() - { - $c1 = new Criteria(); - $c1->setLimit(123); - $c2 = new Criteria(); - $c1->mergeWith($c2); - $this->assertEquals(123, $c1->getLimit(), 'mergeWith() does not remove an existing limit'); - $c1 = new Criteria(); - $c2 = new Criteria(); - $c2->setLimit(123); - $c1->mergeWith($c2); - $this->assertEquals(123, $c1->getLimit(), 'mergeWith() merges the limit'); - $c1 = new Criteria(); - $c1->setLimit(456); - $c2 = new Criteria(); - $c2->setLimit(123); - $c1->mergeWith($c2); - $this->assertEquals(456, $c1->getLimit(), 'mergeWith() does not merge the limit in case of conflict'); - } - - public function testMergeWithOffset() - { - $c1 = new Criteria(); - $c1->setOffset(123); - $c2 = new Criteria(); - $c1->mergeWith($c2); - $this->assertEquals(123, $c1->getOffset(), 'mergeWith() does not remove an existing offset'); - $c1 = new Criteria(); - $c2 = new Criteria(); - $c2->setOffset(123); - $c1->mergeWith($c2); - $this->assertEquals(123, $c1->getOffset(), 'mergeWith() merges the offset'); - $c1 = new Criteria(); - $c1->setOffset(456); - $c2 = new Criteria(); - $c2->setOffset(123); - $c1->mergeWith($c2); - $this->assertEquals(456, $c1->getOffset(), 'mergeWith() does not merge the offset in case of conflict'); - } - - public function testMergeWithSelectModifiers() - { - $c1 = new Criteria(); - $c1->setDistinct(); - $c2 = new Criteria(); - $c1->mergeWith($c2); - $this->assertEquals(array(Criteria::DISTINCT), $c1->getSelectModifiers(), 'mergeWith() does not remove an existing select modifier'); - $c1 = new Criteria(); - $c2 = new Criteria(); - $c2->setDistinct(); - $c1->mergeWith($c2); - $this->assertEquals(array(Criteria::DISTINCT), $c1->getSelectModifiers(), 'mergeWith() merges the select modifiers'); - $c1 = new Criteria(); - $c1->setDistinct(); - $c2 = new Criteria(); - $c2->setDistinct(); - $c1->mergeWith($c2); - $this->assertEquals(array(Criteria::DISTINCT), $c1->getSelectModifiers(), 'mergeWith() does not duplicate select modifiers'); - $c1 = new Criteria(); - $c1->setAll(); - $c2 = new Criteria(); - $c2->setDistinct(); - $c1->mergeWith($c2); - $this->assertEquals(array(Criteria::ALL), $c1->getSelectModifiers(), 'mergeWith() does not merge the select modifiers in case of conflict'); - } - - public function testMergeWithSelectColumns() - { - $c1 = new Criteria(); - $c1->addSelectColumn(BookPeer::TITLE); - $c1->addSelectColumn(BookPeer::ID); - $c2 = new Criteria(); - $c1->mergeWith($c2); - $this->assertEquals(array(BookPeer::TITLE, BookPeer::ID), $c1->getSelectColumns(), 'mergeWith() does not remove an existing select columns'); - $c1 = new Criteria(); - $c2 = new Criteria(); - $c2->addSelectColumn(BookPeer::TITLE); - $c2->addSelectColumn(BookPeer::ID); - $c1->mergeWith($c2); - $this->assertEquals(array(BookPeer::TITLE, BookPeer::ID), $c1->getSelectColumns(), 'mergeWith() merges the select columns to an empty select'); - $c1 = new Criteria(); - $c1->addSelectColumn(BookPeer::TITLE); - $c2 = new Criteria(); - $c2->addSelectColumn(BookPeer::ID); - $c1->mergeWith($c2); - $this->assertEquals(array(BookPeer::TITLE, BookPeer::ID), $c1->getSelectColumns(), 'mergeWith() merges the select columns after the existing select columns'); - $c1 = new Criteria(); - $c1->addSelectColumn(BookPeer::TITLE); - $c2 = new Criteria(); - $c2->addSelectColumn(BookPeer::TITLE); - $c1->mergeWith($c2); - $this->assertEquals(array(BookPeer::TITLE, BookPeer::TITLE), $c1->getSelectColumns(), 'mergeWith() merges the select columns to an existing select, even if duplicated'); - } - - public function testMergeWithAsColumns() - { - $c1 = new Criteria(); - $c1->addAsColumn('foo', BookPeer::TITLE); - $c1->addAsColumn('bar', BookPeer::ID); - $c2 = new Criteria(); - $c1->mergeWith($c2); - $this->assertEquals(array('foo' => BookPeer::TITLE, 'bar' => BookPeer::ID), $c1->getAsColumns(), 'mergeWith() does not remove an existing as columns'); - $c1 = new Criteria(); - $c2 = new Criteria(); - $c2->addAsColumn('foo', BookPeer::TITLE); - $c2->addAsColumn('bar', BookPeer::ID); - $c1->mergeWith($c2); - $this->assertEquals(array('foo' => BookPeer::TITLE, 'bar' => BookPeer::ID), $c1->getAsColumns(), 'mergeWith() merges the select columns to an empty as'); - $c1 = new Criteria(); - $c1->addAsColumn('foo', BookPeer::TITLE); - $c2 = new Criteria(); - $c2->addAsColumn('bar', BookPeer::ID); - $c1->mergeWith($c2); - $this->assertEquals(array('foo' => BookPeer::TITLE, 'bar' => BookPeer::ID), $c1->getAsColumns(), 'mergeWith() merges the select columns after the existing as columns'); - } - - /** - * @expectedException PropelException - */ - public function testMergeWithAsColumnsThrowsException() - { - $c1 = new Criteria(); - $c1->addAsColumn('foo', BookPeer::TITLE); - $c2 = new Criteria(); - $c2->addAsColumn('foo', BookPeer::ID); - $c1->mergeWith($c2); - } - - public function testMergeWithOrderByColumns() - { - $c1 = new Criteria(); - $c1->addAscendingOrderByColumn(BookPeer::TITLE); - $c1->addAscendingOrderByColumn(BookPeer::ID); - $c2 = new Criteria(); - $c1->mergeWith($c2); - $this->assertEquals(array(BookPeer::TITLE . ' ASC', BookPeer::ID . ' ASC'), $c1->getOrderByColumns(), 'mergeWith() does not remove an existing orderby columns'); - $c1 = new Criteria(); - $c2 = new Criteria(); - $c2->addAscendingOrderByColumn(BookPeer::TITLE); - $c2->addAscendingOrderByColumn(BookPeer::ID); - $c1->mergeWith($c2); - $this->assertEquals(array(BookPeer::TITLE . ' ASC', BookPeer::ID . ' ASC'), $c1->getOrderByColumns(), 'mergeWith() merges the select columns to an empty order by'); - $c1 = new Criteria(); - $c1->addAscendingOrderByColumn(BookPeer::TITLE); - $c2 = new Criteria(); - $c2->addAscendingOrderByColumn(BookPeer::ID); - $c1->mergeWith($c2); - $this->assertEquals(array(BookPeer::TITLE . ' ASC', BookPeer::ID . ' ASC'), $c1->getOrderByColumns(), 'mergeWith() merges the select columns after the existing orderby columns'); - $c1 = new Criteria(); - $c1->addAscendingOrderByColumn(BookPeer::TITLE); - $c2 = new Criteria(); - $c2->addAscendingOrderByColumn(BookPeer::TITLE); - $c1->mergeWith($c2); - $this->assertEquals(array(BookPeer::TITLE . ' ASC'), $c1->getOrderByColumns(), 'mergeWith() does not merge duplicated orderby columns'); - $c1 = new Criteria(); - $c1->addAscendingOrderByColumn(BookPeer::TITLE); - $c2 = new Criteria(); - $c2->addDescendingOrderByColumn(BookPeer::TITLE); - $c1->mergeWith($c2); - $this->assertEquals(array(BookPeer::TITLE . ' ASC', BookPeer::TITLE . ' DESC'), $c1->getOrderByColumns(), 'mergeWith() merges duplicated orderby columns with inverse direction'); - } - - public function testMergeWithGroupByColumns() - { - $c1 = new Criteria(); - $c1->addGroupByColumn(BookPeer::TITLE); - $c1->addGroupByColumn(BookPeer::ID); - $c2 = new Criteria(); - $c1->mergeWith($c2); - $this->assertEquals(array(BookPeer::TITLE, BookPeer::ID), $c1->getGroupByColumns(), 'mergeWith() does not remove an existing groupby columns'); - $c1 = new Criteria(); - $c2 = new Criteria(); - $c2->addGroupByColumn(BookPeer::TITLE); - $c2->addGroupByColumn(BookPeer::ID); - $c1->mergeWith($c2); - $this->assertEquals(array(BookPeer::TITLE, BookPeer::ID), $c1->getGroupByColumns(), 'mergeWith() merges the select columns to an empty groupby'); - $c1 = new Criteria(); - $c1->addGroupByColumn(BookPeer::TITLE); - $c2 = new Criteria(); - $c2->addGroupByColumn(BookPeer::ID); - $c1->mergeWith($c2); - $this->assertEquals(array(BookPeer::TITLE, BookPeer::ID), $c1->getGroupByColumns(), 'mergeWith() merges the select columns after the existing groupby columns'); - $c1 = new Criteria(); - $c1->addGroupByColumn(BookPeer::TITLE); - $c2 = new Criteria(); - $c2->addGroupByColumn(BookPeer::TITLE); - $c1->mergeWith($c2); - $this->assertEquals(array(BookPeer::TITLE), $c1->getGroupByColumns(), 'mergeWith() does not merge duplicated groupby columns'); - } - - public function testMergeWithWhereConditions() - { - $c1 = new Criteria(); - $c1->add(BookPeer::TITLE, 'foo'); - $c2 = new Criteria(); - $c1->mergeWith($c2); - $sql = 'SELECT FROM `book` WHERE book.TITLE=:p1'; - $this->assertCriteriaTranslation($c1, $sql, 'mergeWith() does not remove an existing where condition'); - $c1 = new Criteria(); - $c2 = new Criteria(); - $c2->add(BookPeer::TITLE, 'foo'); - $c1->mergeWith($c2); - $sql = 'SELECT FROM `book` WHERE book.TITLE=:p1'; - $this->assertCriteriaTranslation($c1, $sql, 'mergeWith() merges where condition to an empty condition'); - $c1 = new Criteria(); - $c1->add(BookPeer::ID, 123); - $c2 = new Criteria(); - $c2->add(BookPeer::TITLE, 'foo'); - $c1->mergeWith($c2); - $sql = 'SELECT FROM `book` WHERE book.ID=:p1 AND book.TITLE=:p2'; - $this->assertCriteriaTranslation($c1, $sql, 'mergeWith() merges where condition to existing conditions'); - $c1 = new Criteria(); - $c1->add(BookPeer::TITLE, 'foo'); - $c2 = new Criteria(); - $c2->add(BookPeer::TITLE, 'bar'); - $c1->mergeWith($c2); - $sql = 'SELECT FROM `book` WHERE (book.TITLE=:p1 AND book.TITLE=:p2)'; - $this->assertCriteriaTranslation($c1, $sql, 'mergeWith() merges where condition to existing conditions on the same column'); - $c1 = new Criteria(); - $c1->add(BookPeer::TITLE, 'foo'); - $c1->addJoin(BookPeer::AUTHOR_ID, AuthorPeer::ID, Criteria::LEFT_JOIN); - $c2 = new Criteria(); - $c2->add(AuthorPeer::FIRST_NAME, 'bar'); - $c1->mergeWith($c2); - $sql = 'SELECT FROM `book` LEFT JOIN author ON (book.AUTHOR_ID=author.ID) WHERE book.TITLE=:p1 AND author.FIRST_NAME=:p2'; - $this->assertCriteriaTranslation($c1, $sql, 'mergeWith() merges where condition to existing conditions on the different tables'); - } - - public function testMergeOrWithWhereConditions() - { - $c1 = new Criteria(); - $c1->add(BookPeer::TITLE, 'foo'); - $c2 = new Criteria(); - $c1->mergeWith($c2, Criteria::LOGICAL_OR); - $sql = 'SELECT FROM `book` WHERE book.TITLE=:p1'; - $this->assertCriteriaTranslation($c1, $sql, 'mergeWith() does not remove an existing where condition'); - $c1 = new Criteria(); - $c2 = new Criteria(); - $c2->add(BookPeer::TITLE, 'foo'); - $c1->mergeWith($c2, Criteria::LOGICAL_OR); - $sql = 'SELECT FROM `book` WHERE book.TITLE=:p1'; - $this->assertCriteriaTranslation($c1, $sql, 'mergeWith() merges where condition to an empty condition'); - $c1 = new Criteria(); - $c1->add(BookPeer::ID, 123); - $c2 = new Criteria(); - $c2->add(BookPeer::TITLE, 'foo'); - $c1->mergeWith($c2, Criteria::LOGICAL_OR); - $sql = 'SELECT FROM `book` WHERE (book.ID=:p1 OR book.TITLE=:p2)'; - $this->assertCriteriaTranslation($c1, $sql, 'mergeWith() merges where condition to existing conditions'); - $c1 = new Criteria(); - $c1->add(BookPeer::TITLE, 'foo'); - $c2 = new Criteria(); - $c2->add(BookPeer::TITLE, 'bar'); - $c1->mergeWith($c2, Criteria::LOGICAL_OR); - $sql = 'SELECT FROM `book` WHERE (book.TITLE=:p1 OR book.TITLE=:p2)'; - $this->assertCriteriaTranslation($c1, $sql, 'mergeWith() merges where condition to existing conditions on the same column'); - $c1 = new Criteria(); - $c1->add(BookPeer::TITLE, 'foo'); - $c1->addJoin(BookPeer::AUTHOR_ID, AuthorPeer::ID, Criteria::LEFT_JOIN); - $c2 = new Criteria(); - $c2->add(AuthorPeer::FIRST_NAME, 'bar'); - $c1->mergeWith($c2, Criteria::LOGICAL_OR); - $sql = 'SELECT FROM `book` LEFT JOIN author ON (book.AUTHOR_ID=author.ID) WHERE (book.TITLE=:p1 OR author.FIRST_NAME=:p2)'; - $this->assertCriteriaTranslation($c1, $sql, 'mergeWith() merges where condition to existing conditions on the different tables'); - } - - public function testMergeWithHavingConditions() - { - $c1 = new Criteria(); - $cton = $c1->getNewCriterion(BookPeer::TITLE, 'foo', Criteria::EQUAL); - $c1->addHaving($cton); - $c2 = new Criteria(); - $c1->mergeWith($c2); - $sql = 'SELECT FROM HAVING book.TITLE=:p1'; - $this->assertCriteriaTranslation($c1, $sql, 'mergeWith() does not remove an existing having condition'); - $c1 = new Criteria(); - $c2 = new Criteria(); - $cton = $c2->getNewCriterion(BookPeer::TITLE, 'foo', Criteria::EQUAL); - $c2->addHaving($cton); - $c1->mergeWith($c2); - $sql = 'SELECT FROM HAVING book.TITLE=:p1'; - $this->assertCriteriaTranslation($c1, $sql, 'mergeWith() merges having condition to an empty having'); - $c1 = new Criteria(); - $cton = $c1->getNewCriterion(BookPeer::TITLE, 'foo', Criteria::EQUAL); - $c1->addHaving($cton); - $c2 = new Criteria(); - $cton = $c2->getNewCriterion(BookPeer::TITLE, 'bar', Criteria::EQUAL); - $c2->addHaving($cton); - $c1->mergeWith($c2); - $sql = 'SELECT FROM HAVING (book.TITLE=:p1 AND book.TITLE=:p2)'; - $this->assertCriteriaTranslation($c1, $sql, 'mergeWith() combines having with AND'); - } - - public function testMergeWithAliases() - { - $c1 = new Criteria(); - $c1->addAlias('b', BookPeer::TABLE_NAME); - $c2 = new Criteria(); - $c1->mergeWith($c2); - $this->assertEquals(array('b' => BookPeer::TABLE_NAME), $c1->getAliases(), 'mergeWith() does not remove an existing alias'); - $c1 = new Criteria(); - $c2 = new Criteria(); - $c2->addAlias('a', AuthorPeer::TABLE_NAME); - $c1->mergeWith($c2); - $this->assertEquals(array('a' => AuthorPeer::TABLE_NAME), $c1->getAliases(), 'mergeWith() merge aliases to an empty alias'); - $c1 = new Criteria(); - $c1->addAlias('b', BookPeer::TABLE_NAME); - $c2 = new Criteria(); - $c2->addAlias('a', AuthorPeer::TABLE_NAME); - $c1->mergeWith($c2); - $this->assertEquals(array('b' => BookPeer::TABLE_NAME, 'a' => AuthorPeer::TABLE_NAME), $c1->getAliases(), 'mergeWith() merge aliases to an existing alias'); - } - - /** - * @expectedException PropelException - */ - public function testMergeWithAliasesThrowsException() - { - $c1 = new Criteria(); - $c1->addAlias('b', BookPeer::TABLE_NAME); - $c2 = new Criteria(); - $c2->addAlias('b', AuthorPeer::TABLE_NAME); - $c1->mergeWith($c2); - } - - public function testMergeWithJoins() - { - $c1 = new Criteria(); - $c1->addJoin(BookPeer::AUTHOR_ID, AuthorPeer::ID, Criteria::LEFT_JOIN); - $c2 = new Criteria(); - $c1->mergeWith($c2); - $joins = $c1->getJoins(); - $this->assertEquals(1, count($joins), 'mergeWith() does not remove an existing join'); - $this->assertEquals('LEFT JOIN : book.AUTHOR_ID=author.ID(ignoreCase not considered)', $joins[0]->toString(), 'mergeWith() does not remove an existing join'); - $c1 = new Criteria(); - $c2 = new Criteria(); - $c2->addJoin(BookPeer::AUTHOR_ID, AuthorPeer::ID, Criteria::LEFT_JOIN); - $c1->mergeWith($c2); - $joins = $c1->getJoins(); - $this->assertEquals(1, count($joins), 'mergeWith() merge joins to an empty join'); - $this->assertEquals('LEFT JOIN : book.AUTHOR_ID=author.ID(ignoreCase not considered)', $joins[0]->toString(), 'mergeWith() merge joins to an empty join'); - $c1 = new Criteria(); - $c1->addJoin(BookPeer::AUTHOR_ID, AuthorPeer::ID, Criteria::LEFT_JOIN); - $c2 = new Criteria(); - $c2->addJoin(BookPeer::PUBLISHER_ID, PublisherPeer::ID, Criteria::INNER_JOIN); - $c1->mergeWith($c2); - $joins = $c1->getJoins(); - $this->assertEquals(2, count($joins), 'mergeWith() merge joins to an existing join'); - $this->assertEquals('LEFT JOIN : book.AUTHOR_ID=author.ID(ignoreCase not considered)', $joins[0]->toString(), 'mergeWith() merge joins to an empty join'); - $this->assertEquals('INNER JOIN : book.PUBLISHER_ID=publisher.ID(ignoreCase not considered)', $joins[1]->toString(), 'mergeWith() merge joins to an empty join'); - } - - public function testMergeWithFurtherModified() - { - $c1 = new Criteria(); - $c2 = new Criteria(); - $c2->setLimit(123); - $c1->mergeWith($c2); - $this->assertEquals(123, $c1->getLimit(), 'mergeWith() makes the merge'); - $c2->setLimit(456); - $this->assertEquals(123, $c1->getLimit(), 'further modifying a merged criteria does not affect the merger'); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaTest.php deleted file mode 100644 index c05b9b0e8b..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/query/CriteriaTest.php +++ /dev/null @@ -1,974 +0,0 @@ -Christopher Elkins - * @author Sam Joseph - * @version $Id: CriteriaTest.php 1773 2010-05-25 10:25:06Z francois $ - * @package runtime.query - */ -class CriteriaTest extends BaseTestCase -{ - - /** - * The criteria to use in the test. - * @var Criteria - */ - private $c; - - /** - * DB adapter saved for later. - * - * @var DBAdapter - */ - private $savedAdapter; - - protected function setUp() - { - parent::setUp(); - $this->c = new Criteria(); - $this->savedAdapter = Propel::getDB(null); - Propel::setDB(null, new DBSQLite()); - } - - protected function tearDown() - { - Propel::setDB(null, $this->savedAdapter); - parent::tearDown(); - } - - /** - * Test basic adding of strings. - */ - public function testAddString() - { - $table = "myTable"; - $column = "myColumn"; - $value = "myValue"; - - // Add the string - $this->c->add($table . '.' . $column, $value); - - // Verify that the key exists - $this->assertTrue($this->c->containsKey($table . '.' . $column)); - - // Verify that what we get out is what we put in - $this->assertTrue($this->c->getValue($table . '.' . $column) === $value); - } - - public function testAddAndSameColumns() - { - $table1 = "myTable1"; - $column1 = "myColumn1"; - $value1 = "myValue1"; - $key1 = "$table1.$column1"; - - $table2 = "myTable1"; - $column2 = "myColumn1"; - $value2 = "myValue2"; - $key2 = "$table2.$column2"; - - $this->c->add($key1, $value1, Criteria::EQUAL); - $this->c->addAnd($key2, $value2, Criteria::EQUAL); - - $expect = "SELECT FROM myTable1 WHERE (myTable1.myColumn1=:p1 AND myTable1.myColumn1=:p2)"; - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $expect_params = array( - array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'), - array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue2'), - ); - - $this->assertEquals($expect, $result, 'addAnd() called on an existing column creates a combined criterion'); - $this->assertEquals($expect_params, $params, 'addAnd() called on an existing column creates a combined criterion'); - } - - public function testAddAndSameColumnsPropel14Compatibility() - { - $table1 = "myTable1"; - $column1 = "myColumn1"; - $value1 = "myValue1"; - $key1 = "$table1.$column1"; - - $table2 = "myTable1"; - $column2 = "myColumn1"; - $value2 = "myValue2"; - $key2 = "$table2.$column2"; - - $table3 = "myTable3"; - $column3 = "myColumn3"; - $value3 = "myValue3"; - $key3 = "$table3.$column3"; - - $this->c->add($key1, $value1, Criteria::EQUAL); - $this->c->add($key3, $value3, Criteria::EQUAL); - $this->c->addAnd($key2, $value2, Criteria::EQUAL); - - $expect = "SELECT FROM myTable1, myTable3 WHERE (myTable1.myColumn1=:p1 AND myTable1.myColumn1=:p2) AND myTable3.myColumn3=:p3"; - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $expect_params = array( - array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'), - array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue2'), - array('table' => 'myTable3', 'column' => 'myColumn3', 'value' => 'myValue3'), - ); - - $this->assertEquals($expect, $result, 'addAnd() called on an existing column creates a combined criterion'); - $this->assertEquals($expect_params, $params, 'addAnd() called on an existing column creates a combined criterion'); - } - - public function testAddAndDistinctColumns() - { - $table1 = "myTable1"; - $column1 = "myColumn1"; - $value1 = "myValue1"; - $key1 = "$table1.$column1"; - - $table2 = "myTable2"; - $column2 = "myColumn2"; - $value2 = "myValue2"; - $key2 = "$table2.$column2"; - - $this->c->add($key1, $value1, Criteria::EQUAL); - $this->c->addAnd($key2, $value2, Criteria::EQUAL); - - $expect = "SELECT FROM myTable1, myTable2 WHERE myTable1.myColumn1=:p1 AND myTable2.myColumn2=:p2"; - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $expect_params = array( - array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'), - array('table' => 'myTable2', 'column' => 'myColumn2', 'value' => 'myValue2'), - ); - - $this->assertEquals($expect, $result, 'addAnd() called on a distinct column adds a criterion to the criteria'); - $this->assertEquals($expect_params, $params, 'addAnd() called on a distinct column adds a criterion to the criteria'); - } - - public function testAddOrSameColumns() - { - $table1 = "myTable1"; - $column1 = "myColumn1"; - $value1 = "myValue1"; - $key1 = "$table1.$column1"; - - $table2 = "myTable1"; - $column2 = "myColumn1"; - $value2 = "myValue2"; - $key2 = "$table2.$column2"; - - $this->c->add($key1, $value1, Criteria::EQUAL); - $this->c->addOr($key2, $value2, Criteria::EQUAL); - - $expect = "SELECT FROM myTable1 WHERE (myTable1.myColumn1=:p1 OR myTable1.myColumn1=:p2)"; - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $expect_params = array( - array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'), - array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue2'), - ); - - $this->assertEquals($expect, $result, 'addOr() called on an existing column creates a combined criterion'); - $this->assertEquals($expect_params, $params, 'addOr() called on an existing column creates a combined criterion'); - } - - public function testAddAndOrColumnsPropel14Compatibility() - { - $table1 = "myTable1"; - $column1 = "myColumn1"; - $value1 = "myValue1"; - $key1 = "$table1.$column1"; - - $table2 = "myTable1"; - $column2 = "myColumn1"; - $value2 = "myValue2"; - $key2 = "$table2.$column2"; - - $table3 = "myTable3"; - $column3 = "myColumn3"; - $value3 = "myValue3"; - $key3 = "$table3.$column3"; - - $this->c->add($key1, $value1, Criteria::EQUAL); - $this->c->add($key3, $value3, Criteria::EQUAL); - $this->c->addOr($key2, $value2, Criteria::EQUAL); - - $expect = "SELECT FROM myTable1, myTable3 WHERE (myTable1.myColumn1=:p1 OR myTable1.myColumn1=:p2) AND myTable3.myColumn3=:p3"; - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $expect_params = array( - array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'), - array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue2'), - array('table' => 'myTable3', 'column' => 'myColumn3', 'value' => 'myValue3'), - ); - - $this->assertEquals($expect, $result, 'addOr() called on an existing column creates a combined criterion'); - $this->assertEquals($expect_params, $params, 'addOr() called on an existing column creates a combined criterion'); - } - - public function testAddOrDistinctColumns() - { - $table1 = "myTable1"; - $column1 = "myColumn1"; - $value1 = "myValue1"; - $key1 = "$table1.$column1"; - - $table2 = "myTable2"; - $column2 = "myColumn2"; - $value2 = "myValue2"; - $key2 = "$table2.$column2"; - - $this->c->add($key1, $value1, Criteria::EQUAL); - $this->c->addOr($key2, $value2, Criteria::EQUAL); - - $expect = "SELECT FROM myTable1, myTable2 WHERE (myTable1.myColumn1=:p1 OR myTable2.myColumn2=:p2)"; - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $expect_params = array( - array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'), - array('table' => 'myTable2', 'column' => 'myColumn2', 'value' => 'myValue2'), - ); - - $this->assertEquals($expect, $result, 'addOr() called on a distinct column adds a criterion to the latest criterion'); - $this->assertEquals($expect_params, $params, 'addOr() called on a distinct column adds a criterion to the latest criterion'); - } - - public function testAddOrEmptyCriteria() - { - $table1 = "myTable1"; - $column1 = "myColumn1"; - $value1 = "myValue1"; - $key1 = "$table1.$column1"; - - $this->c->addOr($key1, $value1, Criteria::EQUAL); - - $expect = "SELECT FROM myTable1 WHERE myTable1.myColumn1=:p1"; - - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - - $expect_params = array( - array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'), - ); - - $this->assertEquals($expect, $result, 'addOr() called on an empty Criteria adds a criterion to the criteria'); - $this->assertEquals($expect_params, $params, 'addOr() called on an empty Criteria adds a criterion to the criteria'); - } - - /** - * Test Criterion.setIgnoreCase(). - * As the output is db specific the test just prints the result to - * System.out - */ - public function testCriterionIgnoreCase() - { - $originalDB = Propel::getDB(); - $adapters = array(new DBMySQL(), new DBPostgres()); - $expectedIgnore = array("UPPER(TABLE.COLUMN) LIKE UPPER(:p1)", "TABLE.COLUMN ILIKE :p1"); - - $i =0; - foreach ($adapters as $adapter) { - - Propel::setDB(null, $adapter); - $myCriteria = new Criteria(); - - $myCriterion = $myCriteria->getNewCriterion( - "TABLE.COLUMN", "FoObAr", Criteria::LIKE); - $sb = ""; - $params=array(); - $myCriterion->appendPsTo($sb, $params); - $expected = "TABLE.COLUMN LIKE :p1"; - - $this->assertEquals($expected, $sb); - - $ignoreCriterion = $myCriterion->setIgnoreCase(true); - - $sb = ""; - $params=array(); - $ignoreCriterion->appendPsTo($sb, $params); - // $expected = "UPPER(TABLE.COLUMN) LIKE UPPER(?)"; - $this->assertEquals($expectedIgnore[$i], $sb); - $i++; - } - Propel::setDB(null, $originalDB); - } - - public function testOrderByIgnoreCase() - { - $originalDB = Propel::getDB(); - Propel::setDB(null, new DBMySQL()); - - $criteria = new Criteria(); - $criteria->setIgnoreCase(true); - $criteria->addAscendingOrderByColumn(BookPeer::TITLE); - BookPeer::addSelectColumns($criteria); - $params=array(); - $sql = BasePeer::createSelectSql($criteria, $params); - $expectedSQL = 'SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID, UPPER(book.TITLE) FROM `book` ORDER BY UPPER(book.TITLE) ASC'; - $this->assertEquals($expectedSQL, $sql); - - Propel::setDB(null, $originalDB); - } - - /** - * Test that true is evaluated correctly. - */ - public function testBoolean() - { - $this->c = new Criteria(); - $this->c->add("TABLE.COLUMN", true); - - $expect = "SELECT FROM TABLE WHERE TABLE.COLUMN=:p1"; - $expect_params = array( array('table' => 'TABLE', 'column' => 'COLUMN', 'value' => true), - ); - try { - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - } catch (PropelException $e) { - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - - $this->assertEquals($expect, $result, "Boolean test failed."); - $this->assertEquals($expect_params, $params); - - } - - public function testCurrentDate() - { - $this->c = new Criteria(); - $this->c->add("TABLE.TIME_COLUMN", Criteria::CURRENT_TIME); - $this->c->add("TABLE.DATE_COLUMN", Criteria::CURRENT_DATE); - - $expect = "SELECT FROM TABLE WHERE TABLE.TIME_COLUMN=CURRENT_TIME AND TABLE.DATE_COLUMN=CURRENT_DATE"; - - $result = null; - try { - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - } catch (PropelException $e) { - print $e->getTraceAsString(); - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - - $this->assertEquals($expect, $result, "Current date test failed!"); - - } - - public function testCountAster() - { - $this->c = new Criteria(); - $this->c->addSelectColumn("COUNT(*)"); - $this->c->add("TABLE.TIME_COLUMN", Criteria::CURRENT_TIME); - $this->c->add("TABLE.DATE_COLUMN", Criteria::CURRENT_DATE); - - $expect = "SELECT COUNT(*) FROM TABLE WHERE TABLE.TIME_COLUMN=CURRENT_TIME AND TABLE.DATE_COLUMN=CURRENT_DATE"; - - $result = null; - try { - $params = array(); - $result = BasePeer::createSelectSql($this->c, $params); - } catch (PropelException $e) { - print $e->getTraceAsString(); - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - - $this->assertEquals($expect, $result); - - } - - public function testIn() - { - $c = new Criteria(); - $c->addSelectColumn("*"); - $c->add("TABLE.SOME_COLUMN", array(), Criteria::IN); - $c->add("TABLE.OTHER_COLUMN", array(1, 2, 3), Criteria::IN); - - $expect = "SELECT * FROM TABLE WHERE 1<>1 AND TABLE.OTHER_COLUMN IN (:p1,:p2,:p3)"; - try { - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - } catch (PropelException $e) { - print $e->getTraceAsString(); - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - $this->assertEquals($expect, $result); - } - - public function testInEmptyAfterFull() - { - $c = new Criteria(); - $c->addSelectColumn("*"); - $c->add("TABLE.OTHER_COLUMN", array(1, 2, 3), Criteria::IN); - $c->add("TABLE.SOME_COLUMN", array(), Criteria::IN); - - $expect = "SELECT * FROM TABLE WHERE TABLE.OTHER_COLUMN IN (:p1,:p2,:p3) AND 1<>1"; - try { - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - } catch (PropelException $e) { - print $e->getTraceAsString(); - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - $this->assertEquals($expect, $result); - } - - public function testInNested() - { - // now do a nested logic test, just for sanity (not that this should be any surprise) - - $c = new Criteria(); - $c->addSelectColumn("*"); - $myCriterion = $c->getNewCriterion("TABLE.COLUMN", array(), Criteria::IN); - $myCriterion->addOr($c->getNewCriterion("TABLE.COLUMN2", array(1,2), Criteria::IN)); - $c->add($myCriterion); - - $expect = "SELECT * FROM TABLE WHERE (1<>1 OR TABLE.COLUMN2 IN (:p1,:p2))"; - try { - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - } catch (PropelException $e) { - print $e->getTraceAsString(); - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - $this->assertEquals($expect, $result); - - } - - public function testJoinObject () - { - $j = new Join('TABLE_A.COL_1', 'TABLE_B.COL_2'); - $this->assertEquals(null, $j->getJoinType()); - $this->assertEquals('TABLE_A.COL_1', $j->getLeftColumn()); - $this->assertEquals('TABLE_A', $j->getLeftTableName()); - $this->assertEquals('COL_1', $j->getLeftColumnName()); - $this->assertEquals('TABLE_B.COL_2', $j->getRightColumn()); - $this->assertEquals('TABLE_B', $j->getRightTableName()); - $this->assertEquals('COL_2', $j->getRightColumnName()); - - $j = new Join('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::LEFT_JOIN); - $this->assertEquals('LEFT JOIN', $j->getJoinType()); - $this->assertEquals('TABLE_A.COL_1', $j->getLeftColumn()); - $this->assertEquals('TABLE_B.COL_1', $j->getRightColumn()); - - $j = new Join('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::RIGHT_JOIN); - $this->assertEquals('RIGHT JOIN', $j->getJoinType()); - $this->assertEquals('TABLE_A.COL_1', $j->getLeftColumn()); - $this->assertEquals('TABLE_B.COL_1', $j->getRightColumn()); - - $j = new Join('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::INNER_JOIN); - $this->assertEquals('INNER JOIN', $j->getJoinType()); - $this->assertEquals('TABLE_A.COL_1', $j->getLeftColumn()); - $this->assertEquals('TABLE_B.COL_1', $j->getRightColumn()); - - $j = new Join(array('TABLE_A.COL_1', 'TABLE_A.COL_2'), array('TABLE_B.COL_1', 'TABLE_B.COL_2'), Criteria::INNER_JOIN); - $this->assertEquals('TABLE_A.COL_1', $j->getLeftColumn(0)); - $this->assertEquals('TABLE_A.COL_2', $j->getLeftColumn(1)); - $this->assertEquals('TABLE_B.COL_1', $j->getRightColumn(0)); - $this->assertEquals('TABLE_B.COL_2', $j->getRightColumn(1)); - } - - public function testAddStraightJoin () - { - $c = new Criteria(); - $c->addSelectColumn("*"); - $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_1'); // straight join - - $expect = "SELECT * FROM TABLE_A, TABLE_B WHERE TABLE_A.COL_1=TABLE_B.COL_1"; - try { - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - } catch (PropelException $e) { - print $e->getTraceAsString(); - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - $this->assertEquals($expect, $result); - } - - public function testAddSeveralJoins () - { - $c = new Criteria(); - $c->addSelectColumn("*"); - $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_1'); - $c->addJoin('TABLE_B.COL_X', 'TABLE_D.COL_X'); - - $expect = 'SELECT * FROM TABLE_A, TABLE_B, TABLE_D ' - .'WHERE TABLE_A.COL_1=TABLE_B.COL_1 AND TABLE_B.COL_X=TABLE_D.COL_X'; - try { - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - } catch (PropelException $e) { - print $e->getTraceAsString(); - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - $this->assertEquals($expect, $result); - } - - public function testAddLeftJoin () - { - $c = new Criteria(); - $c->addSelectColumn("TABLE_A.*"); - $c->addSelectColumn("TABLE_B.*"); - $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_2', Criteria::LEFT_JOIN); - - $expect = "SELECT TABLE_A.*, TABLE_B.* FROM TABLE_A LEFT JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_2)"; - try { - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - } catch (PropelException $e) { - print $e->getTraceAsString(); - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - $this->assertEquals($expect, $result); - } - - public function testAddSeveralLeftJoins () - { - // Fails.. Suspect answer in the chunk starting at BasePeer:605 - $c = new Criteria(); - $c->addSelectColumn('*'); - $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::LEFT_JOIN); - $c->addJoin('TABLE_A.COL_2', 'TABLE_C.COL_2', Criteria::LEFT_JOIN); - - $expect = 'SELECT * FROM TABLE_A ' - .'LEFT JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_1) ' - .'LEFT JOIN TABLE_C ON (TABLE_A.COL_2=TABLE_C.COL_2)'; - try { - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - } catch (PropelException $e) { - print $e->getTraceAsString(); - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - $this->assertEquals($expect, $result); - } - - public function testAddRightJoin () - { - $c = new Criteria(); - $c->addSelectColumn("*"); - $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_2', Criteria::RIGHT_JOIN); - - $expect = "SELECT * FROM TABLE_A RIGHT JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_2)"; - try { - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - } catch (PropelException $e) { - print $e->getTraceAsString(); - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - $this->assertEquals($expect, $result); - } - - public function testAddSeveralRightJoins () - { - // Fails.. Suspect answer in the chunk starting at BasePeer:605 - $c = new Criteria(); - $c->addSelectColumn('*'); - $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::RIGHT_JOIN); - $c->addJoin('TABLE_A.COL_2', 'TABLE_C.COL_2', Criteria::RIGHT_JOIN); - - $expect = 'SELECT * FROM TABLE_A ' - .'RIGHT JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_1) ' - .'RIGHT JOIN TABLE_C ON (TABLE_A.COL_2=TABLE_C.COL_2)'; - try { - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - } catch (PropelException $e) { - print $e->getTraceAsString(); - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - $this->assertEquals($expect, $result); - } - - public function testAddInnerJoin () - { - $c = new Criteria(); - $c->addSelectColumn("*"); - $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::INNER_JOIN); - - $expect = "SELECT * FROM TABLE_A INNER JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_1)"; - try { - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - } catch (PropelException $e) { - print $e->getTraceAsString(); - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - $this->assertEquals($expect, $result); - } - - public function testAddSeveralInnerJoin () - { - $c = new Criteria(); - $c->addSelectColumn("*"); - $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::INNER_JOIN); - $c->addJoin('TABLE_B.COL_1', 'TABLE_C.COL_1', Criteria::INNER_JOIN); - - $expect = 'SELECT * FROM TABLE_A ' - .'INNER JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_1) ' - .'INNER JOIN TABLE_C ON (TABLE_B.COL_1=TABLE_C.COL_1)'; - try { - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - } catch (PropelException $e) { - print $e->getTraceAsString(); - $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage()); - } - $this->assertEquals($expect, $result); - } - - /** - * @link http://propel.phpdb.org/trac/ticket/451 - */ - public function testSeveralMixedJoinOrders() - { - $c = new Criteria(); - $c->clearSelectColumns()-> - addJoin("TABLE_A.FOO_ID", "TABLE_B.ID", Criteria::LEFT_JOIN)-> - addJoin("TABLE_A.BAR_ID", "TABLE_C.ID")-> - addSelectColumn("TABLE_A.ID"); - - # These are no longer different, see http://propel.phpdb.org/trac/ticket/283#comment:8 - #$db = Propel::getDB(); - # - #if ($db instanceof DBMySQL) { - # $expect = 'SELECT TABLE_A.ID FROM (TABLE_A CROSS JOIN TABLE_C)' - # .' LEFT JOIN TABLE_B ON (TABLE_A.FOO_ID=TABLE_B.ID) WHERE TABLE_A.BAR_ID=TABLE_C.ID'; - #} else { - $expect = 'SELECT TABLE_A.ID FROM TABLE_A CROSS JOIN TABLE_C' - .' LEFT JOIN TABLE_B ON (TABLE_A.FOO_ID=TABLE_B.ID) WHERE TABLE_A.BAR_ID=TABLE_C.ID'; - #} - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - $this->assertEquals($expect, $result); - } - - /** - * @link http://propel.phpdb.org/trac/ticket/606 - */ - public function testAddJoinArray() - { - $c = new Criteria(); - $c->clearSelectColumns()-> - addJoin(array('TABLE_A.FOO_ID'), array('TABLE_B.ID'), Criteria::LEFT_JOIN)-> - addSelectColumn("TABLE_A.ID"); - - $expect = 'SELECT TABLE_A.ID FROM TABLE_A' - .' LEFT JOIN TABLE_B ON (TABLE_A.FOO_ID=TABLE_B.ID)'; - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - $this->assertEquals($expect, $result); - } - - /** - * @link http://propel.phpdb.org/trac/ticket/606 - */ - public function testAddJoinArrayMultiple() - { - $c = new Criteria(); - $c->clearSelectColumns()-> - addJoin( - array('TABLE_A.FOO_ID', 'TABLE_A.BAR'), - array('TABLE_B.ID', 'TABLE_B.BAZ'), - Criteria::LEFT_JOIN)-> - addSelectColumn("TABLE_A.ID"); - - $expect = 'SELECT TABLE_A.ID FROM TABLE_A' - .' LEFT JOIN TABLE_B ON (TABLE_A.FOO_ID=TABLE_B.ID AND TABLE_A.BAR=TABLE_B.BAZ)'; - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - $this->assertEquals($expect, $result); - } - - /** - * Test the Criteria::addJoinMultiple() method with an implicit join - * - * @link http://propel.phpdb.org/trac/ticket/606 - */ - public function testAddJoinMultiple() - { - $c = new Criteria(); - $c-> - clearSelectColumns()-> - addMultipleJoin(array( - array('TABLE_A.FOO_ID', 'TABLE_B.ID'), - array('TABLE_A.BAR', 'TABLE_B.BAZ')))-> - addSelectColumn("TABLE_A.ID"); - - $expect = 'SELECT TABLE_A.ID FROM TABLE_A, TABLE_B ' - . 'WHERE TABLE_A.FOO_ID=TABLE_B.ID AND TABLE_A.BAR=TABLE_B.BAZ'; - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - $this->assertEquals($expect, $result); - } - - /** - * Test the Criteria::addJoinMultiple() method with a value as second argument - * - * @link http://propel.phpdb.org/trac/ticket/606 - */ - public function testAddJoinMultipleValue() - { - $c = new Criteria(); - $c-> - clearSelectColumns()-> - addMultipleJoin(array( - array('TABLE_A.FOO_ID', 'TABLE_B.ID'), - array('TABLE_A.BAR', 3)))-> - addSelectColumn("TABLE_A.ID"); - - $expect = 'SELECT TABLE_A.ID FROM TABLE_A, TABLE_B ' - . 'WHERE TABLE_A.FOO_ID=TABLE_B.ID AND TABLE_A.BAR=3'; - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - $this->assertEquals($expect, $result); - } - - /** - * Test the Criteria::addJoinMultiple() method with a joinType - * - * @link http://propel.phpdb.org/trac/ticket/606 - */ - public function testAddJoinMultipleWithJoinType() - { - $c = new Criteria(); - $c-> - clearSelectColumns()-> - addMultipleJoin(array( - array('TABLE_A.FOO_ID', 'TABLE_B.ID'), - array('TABLE_A.BAR', 'TABLE_B.BAZ')), - Criteria::LEFT_JOIN)-> - addSelectColumn("TABLE_A.ID"); - - $expect = 'SELECT TABLE_A.ID FROM TABLE_A ' - . 'LEFT JOIN TABLE_B ON (TABLE_A.FOO_ID=TABLE_B.ID AND TABLE_A.BAR=TABLE_B.BAZ)'; - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - $this->assertEquals($expect, $result); - } - - /** - * Test the Criteria::addJoinMultiple() method with operator - * - * @link http://propel.phpdb.org/trac/ticket/606 - */ - public function testAddJoinMultipleWithOperator() - { - $c = new Criteria(); - $c-> - clearSelectColumns()-> - addMultipleJoin(array( - array('TABLE_A.FOO_ID', 'TABLE_B.ID', Criteria::GREATER_EQUAL), - array('TABLE_A.BAR', 'TABLE_B.BAZ', Criteria::LESS_THAN)))-> - addSelectColumn("TABLE_A.ID"); - - $expect = 'SELECT TABLE_A.ID FROM TABLE_A, TABLE_B ' - . 'WHERE TABLE_A.FOO_ID>=TABLE_B.ID AND TABLE_A.BARassertEquals($expect, $result); - } - - /** - * Test the Criteria::addJoinMultiple() method with join type and operator - * - * @link http://propel.phpdb.org/trac/ticket/606 - */ - public function testAddJoinMultipleWithJoinTypeAndOperator() - { - $c = new Criteria(); - $c-> - clearSelectColumns()-> - addMultipleJoin(array( - array('TABLE_A.FOO_ID', 'TABLE_B.ID', Criteria::GREATER_EQUAL), - array('TABLE_A.BAR', 'TABLE_B.BAZ', Criteria::LESS_THAN)), - Criteria::LEFT_JOIN)-> - addSelectColumn("TABLE_A.ID"); - - $expect = 'SELECT TABLE_A.ID FROM TABLE_A ' - . 'LEFT JOIN TABLE_B ON (TABLE_A.FOO_ID>=TABLE_B.ID AND TABLE_A.BARassertEquals($expect, $result); - } - - /** - * Test the Criteria::CUSTOM behavior. - */ - public function testCustomOperator() - { - $c = new Criteria(); - $c->addSelectColumn('A.COL'); - $c->add('A.COL', 'date_part(\'YYYY\', A.COL) = \'2007\'', Criteria::CUSTOM); - - $expected = "SELECT A.COL FROM A WHERE date_part('YYYY', A.COL) = '2007'"; - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - $this->assertEquals($expected, $result); - } - - /** - * Tests adding duplicate joins. - * @link http://propel.phpdb.org/trac/ticket/613 - */ - public function testAddJoin_Duplicate() - { - $c = new Criteria(); - - $c->addJoin("tbl.COL1", "tbl.COL2", Criteria::LEFT_JOIN); - $c->addJoin("tbl.COL1", "tbl.COL2", Criteria::LEFT_JOIN); - $this->assertEquals(1, count($c->getJoins()), "Expected not to have duplciate LJOIN added."); - - $c->addJoin("tbl.COL1", "tbl.COL2", Criteria::RIGHT_JOIN); - $c->addJoin("tbl.COL1", "tbl.COL2", Criteria::RIGHT_JOIN); - $this->assertEquals(2, count($c->getJoins()), "Expected 1 new right join to be added."); - - $c->addJoin("tbl.COL1", "tbl.COL2"); - $c->addJoin("tbl.COL1", "tbl.COL2"); - $this->assertEquals(3, count($c->getJoins()), "Expected 1 new implicit join to be added."); - - $c->addJoin("tbl.COL3", "tbl.COL4"); - $this->assertEquals(4, count($c->getJoins()), "Expected new col join to be added."); - - } - - /** - * @link http://propel.phpdb.org/trac/ticket/634 - */ - public function testHasSelectClause() - { - $c = new Criteria(); - $c->addSelectColumn("foo"); - - $this->assertTrue($c->hasSelectClause()); - - $c = new Criteria(); - $c->addAsColumn("foo", "bar"); - - $this->assertTrue($c->hasSelectClause()); - } - - /** - * Tests including aliases in criterion objects. - * @link http://propel.phpdb.org/trac/ticket/636 - */ - public function testAliasInCriterion() - { - $c = new Criteria(); - $c->addAsColumn("column_alias", "tbl.COL1"); - $crit = $c->getNewCriterion("column_alias", "FOO"); - $this->assertNull($crit->getTable()); - $this->assertEquals("column_alias", $crit->getColumn()); - $c->addHaving($crit); // produces invalid SQL referring to '.olumn_alias' - } - - /** - * Test whether GROUP BY is being respected in equals() check. - * @link http://propel.phpdb.org/trac/ticket/674 - */ - public function testEqualsGroupBy() - { - $c1 = new Criteria(); - $c1->addGroupByColumn('GBY1'); - - $c2 = new Criteria(); - $c2->addGroupByColumn('GBY2'); - - $this->assertFalse($c2->equals($c1), "Expected Criteria NOT to be the same with different GROUP BY columns"); - - $c3 = new Criteria(); - $c3->addGroupByColumn('GBY1'); - $c4 = new Criteria(); - $c4->addGroupByColumn('GBY1'); - $this->assertTrue($c4->equals($c3), "Expected Criteria objects to match."); - } - - /** - * Test whether calling setDistinct twice puts in two distinct keywords or not. - * @link http://propel.phpdb.org/trac/ticket/716 - */ - public function testDoubleSelectModifiers() - { - $c = new Criteria(); - $c->setDistinct(); - $this->assertEquals(array(Criteria::DISTINCT), $c->getSelectModifiers(), 'Initial setDistinct works'); - $c->setDistinct(); - $this->assertEquals(array(Criteria::DISTINCT), $c->getSelectModifiers(), 'Calling setDistinct again leaves a single distinct'); - $c->setAll(); - $this->assertEquals(array(Criteria::ALL), $c->getSelectModifiers(), 'All keyword is swaps distinct out'); - $c->setAll(); - $this->assertEquals(array(Criteria::ALL), $c->getSelectModifiers(), 'Calling setAll leaves a single all'); - $c->setDistinct(); - $this->assertEquals(array(Criteria::DISTINCT), $c->getSelectModifiers(), 'All back to distinct works'); - - $c2 = new Criteria(); - $c2->setAll(); - $this->assertEquals(array(Criteria::ALL), $c2->getSelectModifiers(), 'Initial setAll works'); - } - - public function testAddSelectModifier() - { - $c = new Criteria(); - $c->setDistinct(); - $c->addSelectModifier('SQL_CALC_FOUND_ROWS'); - $this->assertEquals(array(Criteria::DISTINCT, 'SQL_CALC_FOUND_ROWS'), $c->getSelectModifiers(), 'addSelectModifier() adds a select modifier to the Criteria'); - $c->addSelectModifier('SQL_CALC_FOUND_ROWS'); - $this->assertEquals(array(Criteria::DISTINCT, 'SQL_CALC_FOUND_ROWS'), $c->getSelectModifiers(), 'addSelectModifier() adds a select modifier only once'); - $params = array(); - $result = BasePeer::createSelectSql($c, $params); - $this->assertEquals('SELECT DISTINCT SQL_CALC_FOUND_ROWS FROM ', $result, 'addSelectModifier() adds a modifier to the final query'); - } - - public function testClone() - { - $c1 = new Criteria(); - $c1->add('tbl.COL1', 'foo', Criteria::EQUAL); - $c2 = clone $c1; - $c2->addAnd('tbl.COL1', 'bar', Criteria::EQUAL); - $nbCrit = 0; - foreach ($c1->keys() as $key) { - foreach ($c1->getCriterion($key)->getAttachedCriterion() as $criterion) { - $nbCrit++; - } - } - $this->assertEquals(1, $nbCrit, 'cloning a Criteria clones its Criterions'); - } - - public function testComment() - { - $c = new Criteria(); - $this->assertNull($c->getComment(), 'Comment is null by default'); - $c2 = $c->setComment('foo'); - $this->assertEquals('foo', $c->getComment(), 'Comment is set by setComment()'); - $this->assertEquals($c, $c2, 'setComment() returns the current Criteria'); - $c->setComment(); - $this->assertNull($c->getComment(), 'Comment is reset by setComment(null)'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/query/JoinTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/query/JoinTest.php deleted file mode 100644 index c3a3245523..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/query/JoinTest.php +++ /dev/null @@ -1,135 +0,0 @@ -savedAdapter = Propel::getDB(null); - Propel::setDB(null, new DBSQLite()); - } - - protected function tearDown() - { - Propel::setDB(null, $this->savedAdapter); - parent::tearDown(); - } - - public function testEmptyConditions() - { - $j = new Join(); - $this->assertEquals(array(), $j->getConditions()); - } - - public function testAddCondition() - { - $j = new Join(); - $j->addCondition('foo', 'bar'); - $this->assertEquals('=', $j->getOperator()); - $this->assertEquals('foo', $j->getLeftColumn()); - $this->assertEquals('bar', $j->getRightColumn()); - } - - public function testGetConditions() - { - $j = new Join(); - $j->addCondition('foo', 'bar'); - $expect = array(array('left' => 'foo', 'operator' => '=', 'right' => 'bar')); - $this->assertEquals($expect, $j->getConditions()); - } - - public function testAddConditionWithOperator() - { - $j = new Join(); - $j->addCondition('foo', 'bar', '>='); - $expect = array(array('left' => 'foo', 'operator' => '>=', 'right' => 'bar')); - $this->assertEquals($expect, $j->getConditions()); - } - - public function testAddConditions() - { - $j = new Join(); - $j->addCondition('foo', 'bar'); - $j->addCondition('baz', 'bal'); - $expect = array( - array('left' => 'foo', 'operator' => '=', 'right' => 'bar'), - array('left' => 'baz', 'operator' => '=', 'right' => 'bal') - ); - $this->assertEquals(array('=', '='), $j->getOperators()); - $this->assertEquals(array('foo', 'baz'), $j->getLeftColumns()); - $this->assertEquals(array('bar', 'bal'), $j->getRightColumns()); - $this->assertEquals($expect, $j->getConditions()); - } - - public function testEmptyJoinType() - { - $j = new Join(); - $this->assertNull($j->getJoinType()); - } - - public function testSetJoinType() - { - $j = new Join(); - $j->setJoinType('foo'); - $this->assertEquals('foo', $j->getJoinType()); - } - - public function testSimpleConstructor() - { - $j = new Join('foo', 'bar', 'LEFT JOIN'); - $expect = array(array('left' => 'foo', 'operator' => '=', 'right' => 'bar')); - $this->assertEquals($expect, $j->getConditions()); - $this->assertEquals('LEFT JOIN', $j->getJoinType()); - } - - public function testCompositeeConstructor() - { - $j = new Join(array('foo1', 'foo2'), array('bar1', 'bar2'), 'LEFT JOIN'); - $expect = array( - array('left' => 'foo1', 'operator' => '=', 'right' => 'bar1'), - array('left' => 'foo2', 'operator' => '=', 'right' => 'bar2') - ); - $this->assertEquals($expect, $j->getConditions()); - $this->assertEquals('LEFT JOIN', $j->getJoinType()); - } - - public function testCountConditions() - { - $j = new Join(); - $this->assertEquals(0, $j->countConditions()); - $j->addCondition('foo', 'bar'); - $this->assertEquals(1, $j->countConditions()); - $j->addCondition('foo1', 'bar1'); - $this->assertEquals(2, $j->countConditions()); - - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/query/ModelCriteriaHooksTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/query/ModelCriteriaHooksTest.php deleted file mode 100644 index 8c1107a874..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/query/ModelCriteriaHooksTest.php +++ /dev/null @@ -1,196 +0,0 @@ -find(); - $this->assertEquals(1, count($books), 'preSelect() can modify the Criteria before find() fires the query'); - - $c = new ModelCriteriaWithPreSelectHook('bookstore', 'Book'); - $nbBooks = $c->count(); - $this->assertEquals(1, $nbBooks, 'preSelect() can modify the Criteria before count() fires the query'); - } - - public function testPreDelete() - { - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->find(); - $count = count($books); - $book = $books->shift(); - - $c = new ModelCriteriaWithPreDeleteHook('bookstore', 'Book', 'b'); - $c->where('b.Id = ?', $book->getId()); - $nbBooks = $c->delete(); - $this->assertEquals(12, $nbBooks, 'preDelete() can change the return value of delete()'); - - $c = new ModelCriteria('bookstore', 'Book'); - $nbBooks = $c->count(); - $this->assertEquals($count, $nbBooks, 'preDelete() can bypass the row deletion'); - - $c = new ModelCriteriaWithPreDeleteHook('bookstore', 'Book'); - $nbBooks = $c->deleteAll(); - $this->assertEquals(12, $nbBooks, 'preDelete() can change the return value of deleteAll()'); - - $c = new ModelCriteria('bookstore', 'Book'); - $nbBooks = $c->count(); - $this->assertEquals($count, $nbBooks, 'preDelete() can bypass the row deletion'); - } - - public function testPostDelete() - { - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->find(); - $count = count($books); - $book = $books->shift(); - - $this->con->lastAffectedRows = 0; - - $c = new ModelCriteriaWithPostDeleteHook('bookstore', 'Book', 'b'); - $c->where('b.Id = ?', $book->getId()); - $nbBooks = $c->delete($this->con); - $this->assertEquals(1, $this->con->lastAffectedRows, 'postDelete() is called after delete()'); - - $this->con->lastAffectedRows = 0; - - $c = new ModelCriteriaWithPostDeleteHook('bookstore', 'Book'); - $nbBooks = $c->deleteAll($this->con); - $this->assertEquals(3, $this->con->lastAffectedRows, 'postDelete() is called after deleteAll()'); - } - - public function testPreAndPostDelete() - { - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->find(); - $count = count($books); - $book = $books->shift(); - - $this->con->lastAffectedRows = 0; - - $c = new ModelCriteriaWithPreAndPostDeleteHook('bookstore', 'Book', 'b'); - $c->where('b.Id = ?', $book->getId()); - $nbBooks = $c->delete($this->con); - $this->assertEquals(12, $this->con->lastAffectedRows, 'postDelete() is called after delete() even if preDelete() returns not null'); - - $this->con->lastAffectedRows = 0; - - $c = new ModelCriteriaWithPreAndPostDeleteHook('bookstore', 'Book'); - $nbBooks = $c->deleteAll($this->con); - $this->assertEquals(12, $this->con->lastAffectedRows, 'postDelete() is called after deleteAll() even if preDelete() returns not null'); - } - - public function testPreUpdate() - { - $c = new ModelCriteriaWithPreUpdateHook('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'Don Juan'); - $nbBooks = $c->update(array('Title' => 'foo')); - - $c = new ModelCriteriaWithPreUpdateHook('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'foo'); - $book = $c->findOne(); - - $this->assertEquals('1234', $book->getISBN(), 'preUpdate() can modify the values'); - } - - public function testPostUpdate() - { - $this->con->lastAffectedRows = 0; - - $c = new ModelCriteriaWithPostUpdateHook('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'Don Juan'); - $nbBooks = $c->update(array('Title' => 'foo'), $this->con); - $this->assertEquals(1, $this->con->lastAffectedRows, 'postUpdate() is called after update()'); - } - - public function testPreAndPostUpdate() - { - $this->con->lastAffectedRows = 0; - - $c = new ModelCriteriaWithPreAndPostUpdateHook('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'Don Juan'); - $nbBooks = $c->update(array('Title' => 'foo'), $this->con); - $this->assertEquals(52, $this->con->lastAffectedRows, 'postUpdate() is called after update() even if preUpdate() returns not null'); - } -} - -class ModelCriteriaWithPreSelectHook extends ModelCriteria -{ - public function preSelect(PropelPDO $con) - { - $this->where($this->getModelAliasOrName() . '.Title = ?', 'Don Juan'); - } -} - -class ModelCriteriaWithPreDeleteHook extends ModelCriteria -{ - public function preDelete(PropelPDO $con) - { - return 12; - } -} - -class ModelCriteriaWithPostDeleteHook extends ModelCriteria -{ - public function postDelete($affectedRows, PropelPDO $con) - { - $con->lastAffectedRows = $affectedRows; - } -} - -class ModelCriteriaWithPreAndPostDeleteHook extends ModelCriteriaWithPostDeleteHook -{ - public function preDelete(PropelPDO $con) - { - return 12; - } -} - -class ModelCriteriaWithPreUpdateHook extends ModelCriteria -{ - public function preUpdate(&$values, PropelPDO $con, $forceIndividualSaves = false) - { - $values['ISBN'] = '1234'; - } -} - -class ModelCriteriaWithPostUpdateHook extends ModelCriteria -{ - public function postUpdate($affectedRows, PropelPDO $con) - { - $con->lastAffectedRows = $affectedRows; - } -} - -class ModelCriteriaWithPreAndPostUpdateHook extends ModelCriteriaWithPostUpdateHook -{ - public function preUpdate(&$values, PropelPDO $con, $forceIndividualSaves = false) - { - return 52; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/query/ModelCriteriaTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/query/ModelCriteriaTest.php deleted file mode 100644 index fdd8efb69f..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/query/ModelCriteriaTest.php +++ /dev/null @@ -1,2068 +0,0 @@ -assertEquals($expectedSql, $result, $message); - $this->assertEquals($expectedParams, $params, $message); - } - - public function testGetModelName() - { - $c = new ModelCriteria('bookstore', 'Book'); - $this->assertEquals('Book', $c->getModelName(), 'getModelName() returns the name of the class associated to the model class'); - } - - public function testGetModelPeerName() - { - $c = new ModelCriteria('bookstore', 'Book'); - $this->assertEquals('BookPeer', $c->getModelPeerName(), 'getModelPeerName() returns the name of the Peer class associated to the model class'); - } - - public function testFormatter() - { - $c = new ModelCriteria('bookstore', 'Book'); - $this->assertTrue($c->getFormatter() instanceof PropelFormatter, 'getFormatter() returns a PropelFormatter instance'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->setFormatter(ModelCriteria::FORMAT_STATEMENT); - $this->assertTrue($c->getFormatter() instanceof PropelStatementFormatter, 'setFormatter() accepts the name of a PropelFormatter class'); - - try { - $c->setFormatter('Book'); - $this->fail('setFormatter() throws an exception when passed the name of a class not extending PropelFormatter'); - } catch(PropelException $e) { - $this->assertTrue(true, 'setFormatter() throws an exception when passed the name of a class not extending PropelFormatter'); - } - $c = new ModelCriteria('bookstore', 'Book'); - $formatter = new PropelStatementFormatter(); - $c->setFormatter($formatter); - $this->assertTrue($c->getFormatter() instanceof PropelStatementFormatter, 'setFormatter() accepts a PropelFormatter instance'); - - try { - $formatter = new Book(); - $c->setFormatter($formatter); - $this->fail('setFormatter() throws an exception when passed an object not extending PropelFormatter'); - } catch(PropelException $e) { - $this->assertTrue(true, 'setFormatter() throws an exception when passedan object not extending PropelFormatter'); - } - - } - - public static function conditionsForTestReplaceNames() - { - return array( - array('Book.Title = ?', 'Title', 'book.TITLE = ?'), // basic case - array('Book.Title=?', 'Title', 'book.TITLE=?'), // without spaces - array('Book.Id<= ?', 'Id', 'book.ID<= ?'), // with non-equal comparator - array('Book.AuthorId LIKE ?', 'AuthorId', 'book.AUTHOR_ID LIKE ?'), // with SQL keyword separator - array('(Book.AuthorId) LIKE ?', 'AuthorId', '(book.AUTHOR_ID) LIKE ?'), // with parenthesis - array('(Book.Id*1.5)=1', 'Id', '(book.ID*1.5)=1'), // ignore numbers - array('1=1', null, '1=1'), // with no name - array('', null, '') // with empty string - ); - } - - /** - * @dataProvider conditionsForTestReplaceNames - */ - public function testReplaceNames($origClause, $columnPhpName = false, $modifiedClause) - { - $c = new TestableModelCriteria('bookstore', 'Book'); - $c->replaceNames($origClause); - $columns = $c->replacedColumns; - if ($columnPhpName) { - $this->assertEquals(array(BookPeer::getTableMap()->getColumnByPhpName($columnPhpName)), $columns); - } - $this->assertEquals($modifiedClause, $origClause); - } - - public static function conditionsForTestReplaceMultipleNames() - { - return array( - array('(Book.Id+Book.Id)=1', array('Id', 'Id'), '(book.ID+book.ID)=1'), // match multiple names - array('CONCAT(Book.Title,"Book.Id")= ?', array('Title', 'Id'), 'CONCAT(book.TITLE,"Book.Id")= ?'), // ignore names in strings - array('CONCAT(Book.Title," Book.Id ")= ?', array('Title', 'Id'), 'CONCAT(book.TITLE," Book.Id ")= ?'), // ignore names in strings - array('MATCH (Book.Title,Book.ISBN) AGAINST (?)', array('Title', 'ISBN'), 'MATCH (book.TITLE,book.ISBN) AGAINST (?)'), - ); - } - - /** - * @dataProvider conditionsForTestReplaceMultipleNames - */ - public function testReplaceMultipleNames($origClause, $expectedColumns, $modifiedClause) - { - $c = new TestableModelCriteria('bookstore', 'Book'); - $c->replaceNames($origClause); - $foundColumns = $c->replacedColumns; - foreach ($foundColumns as $column) { - $expectedColumn = BookPeer::getTableMap()->getColumnByPhpName(array_shift($expectedColumns)); - $this->assertEquals($expectedColumn, $column); - } - $this->assertEquals($modifiedClause, $origClause); - } - - public function testTableAlias() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->setModelAlias('b'); - $c->where('b.Title = ?', 'foo'); - - $sql = "SELECT FROM `book` WHERE book.TITLE = :p1"; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'setModelAlias() allows the definition of the alias after constrution'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'foo'); - - $sql = "SELECT FROM `book` WHERE book.TITLE = :p1"; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'A ModelCriteria accepts a model name with an alias'); - } - - public function testTrueTableAlias() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->setModelAlias('b', true); - $c->where('b.Title = ?', 'foo'); - $c->join('b.Author a'); - $c->where('a.FirstName = ?', 'john'); - - - $sql = "SELECT FROM `book` `b` INNER JOIN author a ON (b.AUTHOR_ID=a.ID) WHERE b.TITLE = :p1 AND a.FIRST_NAME = :p2"; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - array('table' => 'author', 'column' => 'FIRST_NAME', 'value' => 'john'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'setModelAlias() allows the definition of a true SQL alias after constrution'); - } - - public function testCondition() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->condition('cond1', 'Book.Title <> ?', 'foo'); - $c->condition('cond2', 'Book.Title like ?', '%bar%'); - $c->combine(array('cond1', 'cond2'), 'or'); - - $sql = "SELECT FROM `book` WHERE (book.TITLE <> :p1 OR book.TITLE like :p2)"; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - array('table' => 'book', 'column' => 'TITLE', 'value' => '%bar%'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'condition() can store condition for later combination'); - } - - public static function conditionsForTestWhere() - { - return array( - array('Book.Title = ?', 'foo', 'book.TITLE = :p1', array(array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'))), - array('Book.AuthorId = ?', 12, 'book.AUTHOR_ID = :p1', array(array('table' => 'book', 'column' => 'AUTHOR_ID', 'value' => 12))), - array('Book.AuthorId IS NULL', null, 'book.AUTHOR_ID IS NULL', array()), - array('Book.Id BETWEEN ? AND ?', array(3, 4), 'book.ID BETWEEN :p1 AND :p2', array(array('table' => 'book', 'column' => 'ID', 'value' => 3), array('table' => 'book', 'column' => 'ID', 'value' => 4))), - array('Book.Id betWEen ? and ?', array(3, 4), 'book.ID betWEen :p1 and :p2', array(array('table' => 'book', 'column' => 'ID', 'value' => 3), array('table' => 'book', 'column' => 'ID', 'value' => 4))), - array('Book.Id IN ?', array(1, 2, 3), 'book.ID IN (:p1,:p2,:p3)', array(array('table' => 'book', 'column' => 'ID', 'value' => 1), array('table' => 'book', 'column' => 'ID', 'value' => 2), array('table' => 'book', 'column' => 'ID', 'value' => 3))), - array('Book.Id in ?', array(1, 2, 3), 'book.ID in (:p1,:p2,:p3)', array(array('table' => 'book', 'column' => 'ID', 'value' => 1), array('table' => 'book', 'column' => 'ID', 'value' => 2), array('table' => 'book', 'column' => 'ID', 'value' => 3))), - array('Book.Id IN ?', array(), '1<>1', array()), - array('Book.Id not in ?', array(), '1=1', array()), - array('UPPER(Book.Title) = ?', 'foo', 'UPPER(book.TITLE) = :p1', array(array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'))), - array('MATCH (Book.Title,Book.ISBN) AGAINST (?)', 'foo', 'MATCH (book.TITLE,book.ISBN) AGAINST (:p1)', array(array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'))), - ); - } - - /** - * @dataProvider conditionsForTestWhere - */ - public function testWhere($clause, $value, $sql, $params) - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->where($clause, $value); - $sql = 'SELECT FROM `book` WHERE ' . $sql; - $this->assertCriteriaTranslation($c, $sql, $params, 'where() accepts a string clause'); - } - - public function testWhereTwiceSameColumn() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->where('Book.Id IN ?', array(1, 2, 3)); - $c->where('Book.Id <> ?', 5); - $params = array( - array('table' => 'book', 'column' => 'ID', 'value' => '1'), - array('table' => 'book', 'column' => 'ID', 'value' => '2'), - array('table' => 'book', 'column' => 'ID', 'value' => '3'), - array('table' => 'book', 'column' => 'ID', 'value' => '5'), - ); - $sql = 'SELECT FROM `book` WHERE (book.ID IN (:p1,:p2,:p3) AND book.ID <> :p4)'; - $this->assertCriteriaTranslation($c, $sql, $params, 'where() adds clauses on the same column correctly'); - } - - public function testWhereConditions() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->condition('cond1', 'Book.Title <> ?', 'foo'); - $c->condition('cond2', 'Book.Title like ?', '%bar%'); - $c->where(array('cond1', 'cond2')); - - $sql = "SELECT FROM `book` WHERE (book.TITLE <> :p1 AND book.TITLE like :p2)"; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - array('table' => 'book', 'column' => 'TITLE', 'value' => '%bar%'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'where() accepts an array of named conditions'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->condition('cond1', 'Book.Title <> ?', 'foo'); - $c->condition('cond2', 'Book.Title like ?', '%bar%'); - $c->where(array('cond1', 'cond2'), Criteria::LOGICAL_OR); - - $sql = "SELECT FROM `book` WHERE (book.TITLE <> :p1 OR book.TITLE like :p2)"; - $this->assertCriteriaTranslation($c, $sql, $params, 'where() accepts an array of named conditions with operator'); - } - - public function testWhereNoReplacement() - { - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'foo'); - $c->where('1=1'); - - $sql = "SELECT FROM `book` WHERE book.TITLE = :p1 AND 1=1"; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'where() results in a Criteria::CUSTOM if no column name is matched'); - - $c = new ModelCriteria('bookstore', 'Book'); - try { - $c->where('b.Title = ?', 'foo'); - $this->fail('where() throws an exception when it finds a ? but cannot determine a column'); - } catch (PropelException $e) { - $this->assertTrue(true, 'where() throws an exception when it finds a ? but cannot determine a column'); - } - } - - public function testWhereFunction() - { - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('UPPER(b.Title) = ?', 'foo'); - - $sql = "SELECT FROM `book` WHERE UPPER(book.TITLE) = :p1"; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'where() accepts a complex calculation'); - } - - public function testOrWhere() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->where('Book.Title <> ?', 'foo'); - $c->orWhere('Book.Title like ?', '%bar%'); - - $sql = "SELECT FROM `book` WHERE (book.TITLE <> :p1 OR book.TITLE like :p2)"; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - array('table' => 'book', 'column' => 'TITLE', 'value' => '%bar%'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'orWhere() combines the clause with the previous one using OR'); - } - - public function testOrWhereConditions() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->where('Book.Id = ?', 12); - $c->condition('cond1', 'Book.Title <> ?', 'foo'); - $c->condition('cond2', 'Book.Title like ?', '%bar%'); - $c->orWhere(array('cond1', 'cond2')); - - $sql = "SELECT FROM `book` WHERE (book.ID = :p1 OR (book.TITLE <> :p2 AND book.TITLE like :p3))"; - $params = array( - array('table' => 'book', 'column' => 'ID', 'value' => 12), - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - array('table' => 'book', 'column' => 'TITLE', 'value' => '%bar%'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'orWhere() accepts an array of named conditions'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->where('Book.Id = ?', 12); - $c->condition('cond1', 'Book.Title <> ?', 'foo'); - $c->condition('cond2', 'Book.Title like ?', '%bar%'); - $c->orWhere(array('cond1', 'cond2'), Criteria::LOGICAL_OR); - - $sql = "SELECT FROM `book` WHERE (book.ID = :p1 OR (book.TITLE <> :p2 OR book.TITLE like :p3))"; - $this->assertCriteriaTranslation($c, $sql, $params, 'orWhere() accepts an array of named conditions with operator'); - } - - public function testMixedCriteria() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->where('Book.Title = ?', 'foo'); - $c->add(BookPeer::ID, array(1, 2), Criteria::IN); - - $sql = 'SELECT FROM `book` WHERE book.TITLE = :p1 AND book.ID IN (:p2,:p3)'; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - array('table' => 'book', 'column' => 'ID', 'value' => 1), - array('table' => 'book', 'column' => 'ID', 'value' => 2) - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'ModelCriteria accepts Criteria operators'); - } - - public function testFilterBy() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->filterBy('Title', 'foo'); - - $sql = 'SELECT FROM `book` WHERE book.TITLE=:p1'; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'filterBy() accepts a simple column name'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->filterBy('Title', 'foo', Criteria::NOT_EQUAL); - - $sql = 'SELECT FROM `book` WHERE book.TITLE<>:p1'; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'filterBy() accepts a sicustom comparator'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->filterBy('Title', 'foo'); - - $sql = 'SELECT FROM `book` WHERE book.TITLE=:p1'; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'filterBy() accepts a simple column name, even if initialized with an alias'); - } - - public function testHaving() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->having('Book.Title <> ?', 'foo'); - - $sql = "SELECT FROM HAVING book.TITLE <> :p1"; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'having() accepts a string clause'); - } - - public function testHavingConditions() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->condition('cond1', 'Book.Title <> ?', 'foo'); - $c->condition('cond2', 'Book.Title like ?', '%bar%'); - $c->having(array('cond1', 'cond2')); - - $sql = "SELECT FROM HAVING (book.TITLE <> :p1 AND book.TITLE like :p2)"; - $params = array( - array('table' => 'book', 'column' => 'TITLE', 'value' => 'foo'), - array('table' => 'book', 'column' => 'TITLE', 'value' => '%bar%'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'having() accepts an array of named conditions'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->condition('cond1', 'Book.Title <> ?', 'foo'); - $c->condition('cond2', 'Book.Title like ?', '%bar%'); - $c->having(array('cond1', 'cond2'), Criteria::LOGICAL_OR); - - $sql = "SELECT FROM HAVING (book.TITLE <> :p1 OR book.TITLE like :p2)"; - $this->assertCriteriaTranslation($c, $sql, $params, 'having() accepts an array of named conditions with an operator'); - } - - public function testOrderBy() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->orderBy('Book.Title'); - - $sql = 'SELECT FROM ORDER BY book.TITLE ASC'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'orderBy() accepts a column name and adds an ORDER BY clause'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->orderBy('Book.Title', 'desc'); - - $sql = 'SELECT FROM ORDER BY book.TITLE DESC'; - $this->assertCriteriaTranslation($c, $sql, $params, 'orderBy() accepts an order parameter'); - - $c = new ModelCriteria('bookstore', 'Book'); - try { - $c->orderBy('Book.Foo'); - $this->fail('orderBy() throws an exception when called with an unkown column name'); - } catch (PropelException $e) { - $this->assertTrue(true, 'orderBy() throws an exception when called with an unkown column name'); - } - $c = new ModelCriteria('bookstore', 'Book'); - try { - $c->orderBy('Book.Title', 'foo'); - $this->fail('orderBy() throws an exception when called with an unkown order'); - } catch (PropelException $e) { - $this->assertTrue(true, 'orderBy() throws an exception when called with an unkown order'); - } - } - - public function testOrderBySimpleColumn() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->orderBy('Title'); - - $sql = 'SELECT FROM ORDER BY book.TITLE ASC'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'orderBy() accepts a simple column name and adds an ORDER BY clause'); - } - - public function testOrderByAlias() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->addAsColumn('t', BookPeer::TITLE); - $c->orderBy('t'); - - $sql = 'SELECT book.TITLE AS t FROM ORDER BY t ASC'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'orderBy() accepts a column alias and adds an ORDER BY clause'); - } - - public function testGroupBy() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->groupBy('Book.AuthorId'); - - $sql = 'SELECT FROM GROUP BY book.AUTHOR_ID'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'groupBy() accepts a column name and adds a GROUP BY clause'); - - $c = new ModelCriteria('bookstore', 'Book'); - try { - $c->groupBy('Book.Foo'); - $this->fail('groupBy() throws an exception when called with an unkown column name'); - } catch (PropelException $e) { - $this->assertTrue(true, 'groupBy() throws an exception when called with an unkown column name'); - } - } - - public function testGroupBySimpleColumn() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->groupBy('AuthorId'); - - $sql = 'SELECT FROM GROUP BY book.AUTHOR_ID'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'groupBy() accepts a simple column name and adds a GROUP BY clause'); - } - - public function testGroupByAlias() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->addAsColumn('t', BookPeer::TITLE); - $c->groupBy('t'); - - $sql = 'SELECT book.TITLE AS t FROM GROUP BY t'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'groupBy() accepts a column alias and adds a GROUP BY clause'); - } - - public function testDistinct() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->distinct(); - $sql = 'SELECT DISTINCT FROM '; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'distinct() adds a DISTINCT clause'); - } - - public function testLimit() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->limit(10); - $sql = 'SELECT FROM LIMIT 10'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'limit() adds a LIMIT clause'); - } - - public function testOffset() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->limit(50); - $c->offset(10); - $sql = 'SELECT FROM LIMIT 10, 50'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'offset() adds an OFFSET clause'); - } - - public function testJoin() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->join('Book.Author'); - $sql = 'SELECT FROM `book` INNER JOIN author ON (book.AUTHOR_ID=author.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() uses a relation to guess the columns'); - - $c = new ModelCriteria('bookstore', 'Book'); - try { - $c->join('Book.Foo'); - $this->fail('join() throws an exception when called with a non-existing relation'); - } catch (PropelException $e) { - $this->assertTrue(true, 'join() throws an exception when called with a non-existing relation'); - } - - $c = new ModelCriteria('bookstore', 'Book'); - $c->join('Book.Author'); - $c->where('Author.FirstName = ?', 'Leo'); - $sql = 'SELECT FROM INNER JOIN author ON (book.AUTHOR_ID=author.ID) WHERE author.FIRST_NAME = :p1'; - $params = array( - array('table' => 'author', 'column' => 'FIRST_NAME', 'value' => 'Leo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() uses a relation to guess the columns'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->join('Author'); - $c->where('Author.FirstName = ?', 'Leo'); - $sql = 'SELECT FROM INNER JOIN author ON (book.AUTHOR_ID=author.ID) WHERE author.FIRST_NAME = :p1'; - $params = array( - array('table' => 'author', 'column' => 'FIRST_NAME', 'value' => 'Leo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() uses the current model name when given a simple relation name'); - } - - public function testJoinQuery() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - BookstoreDataPopulator::depopulate($con); - BookstoreDataPopulator::populate($con); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->join('Book.Author'); - $c->where('Author.FirstName = ?', 'Neal'); - $books = BookPeer::doSelect($c); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` INNER JOIN author ON (book.AUTHOR_ID=author.ID) WHERE author.FIRST_NAME = 'Neal'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'join() issues a real JOIN query'); - $this->assertEquals(1, count($books), 'join() issues a real JOIN query'); - } - - public function testJoinRelationName() - { - $c = new ModelCriteria('bookstore', 'BookstoreEmployee'); - $c->join('BookstoreEmployee.Supervisor'); - $sql = 'SELECT FROM INNER JOIN bookstore_employee ON (bookstore_employee.SUPERVISOR_ID=bookstore_employee.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() uses relation names as defined in schema.xml'); - } - - public function testJoinComposite() - { - $c = new ModelCriteria('bookstore', 'ReaderFavorite'); - $c->join('ReaderFavorite.BookOpinion'); - $sql = 'SELECT FROM `reader_favorite` INNER JOIN book_opinion ON (reader_favorite.BOOK_ID=book_opinion.BOOK_ID AND reader_favorite.READER_ID=book_opinion.READER_ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() knows how to create a JOIN clause for relationships with composite fkeys'); - } - - public function testJoinType() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->join('Book.Author'); - $sql = 'SELECT FROM `book` INNER JOIN author ON (book.AUTHOR_ID=author.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() adds an INNER JOIN by default'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->join('Book.Author', Criteria::INNER_JOIN); - $sql = 'SELECT FROM `book` INNER JOIN author ON (book.AUTHOR_ID=author.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() adds an INNER JOIN by default'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->join('Book.Author', Criteria::LEFT_JOIN); - $sql = 'SELECT FROM `book` LEFT JOIN author ON (book.AUTHOR_ID=author.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() can add a LEFT JOIN'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->join('Book.Author', Criteria::RIGHT_JOIN); - $sql = 'SELECT FROM `book` RIGHT JOIN author ON (book.AUTHOR_ID=author.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() can add a RIGHT JOIN'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->join('Book.Author', 'incorrect join'); - $sql = 'SELECT FROM `book` incorrect join author ON (book.AUTHOR_ID=author.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() accepts any join string'); - } - - public function testJoinDirection() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->join('Book.Author'); - $sql = 'SELECT FROM `book` INNER JOIN author ON (book.AUTHOR_ID=author.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() adds a JOIN clause correctly for many to one relationship'); - - $c = new ModelCriteria('bookstore', 'Author'); - $c->join('Author.Book'); - $sql = 'SELECT FROM `author` INNER JOIN book ON (author.ID=book.AUTHOR_ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() adds a JOIN clause correctly for one to many relationship'); - - $c = new ModelCriteria('bookstore', 'BookstoreEmployee'); - $c->join('BookstoreEmployee.BookstoreEmployeeAccount'); - $sql = 'SELECT FROM `bookstore_employee` INNER JOIN bookstore_employee_account ON (bookstore_employee.ID=bookstore_employee_account.EMPLOYEE_ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() adds a JOIN clause correctly for one to one relationship'); - - $c = new ModelCriteria('bookstore', 'BookstoreEmployeeAccount'); - $c->join('BookstoreEmployeeAccount.BookstoreEmployee'); - $sql = 'SELECT FROM `bookstore_employee_account` INNER JOIN bookstore_employee ON (bookstore_employee_account.EMPLOYEE_ID=bookstore_employee.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() adds a JOIN clause correctly for one to one relationship'); - } - - public function testJoinSeveral() - { - $c = new ModelCriteria('bookstore', 'Author'); - $c->join('Author.Book'); - $c->join('Book.Publisher'); - $c->where('Publisher.Name = ?', 'foo'); - $sql = 'SELECT FROM INNER JOIN book ON (author.ID=book.AUTHOR_ID) INNER JOIN publisher ON (book.PUBLISHER_ID=publisher.ID) WHERE publisher.NAME = :p1'; - $params = array( - array('table' => 'publisher', 'column' => 'NAME', 'value' => 'foo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() can guess relationships from related tables'); - } - - public function testJoinAlias() - { - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->join('b.Author'); - $sql = 'SELECT FROM `book` INNER JOIN author ON (book.AUTHOR_ID=author.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() supports relation on main alias'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->join('Author'); - $sql = 'SELECT FROM `book` INNER JOIN author ON (book.AUTHOR_ID=author.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() can use a simple relation name when the model has an alias'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->join('Book.Author a'); - $sql = 'SELECT FROM `book` INNER JOIN author a ON (book.AUTHOR_ID=a.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() supports relation alias'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->join('b.Author a'); - $sql = 'SELECT FROM `book` INNER JOIN author a ON (book.AUTHOR_ID=a.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() supports relation alias on main alias'); - - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->join('b.Author a'); - $c->where('a.FirstName = ?', 'Leo'); - $sql = 'SELECT FROM INNER JOIN author a ON (book.AUTHOR_ID=a.ID) WHERE a.FIRST_NAME = :p1'; - $params = array( - array('table' => 'author', 'column' => 'FIRST_NAME', 'value' => 'Leo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() allows the use of relation alias in where()'); - - $c = new ModelCriteria('bookstore', 'Author', 'a'); - $c->join('a.Book b'); - $c->join('b.Publisher p'); - $c->where('p.Name = ?', 'foo'); - $sql = 'SELECT FROM INNER JOIN book b ON (author.ID=b.AUTHOR_ID) INNER JOIN publisher p ON (b.PUBLISHER_ID=p.ID) WHERE p.NAME = :p1'; - $params = array( - array('table' => 'publisher', 'column' => 'NAME', 'value' => 'foo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() allows the use of relation alias in further join()'); - } - - public function testJoinTrueTableAlias() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->setModelAlias('b', true); - $c->join('b.Author'); - $sql = 'SELECT FROM `book` `b` INNER JOIN author ON (b.AUTHOR_ID=author.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() supports relation on true table alias'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->setModelAlias('b', true); - $c->join('Author'); - $sql = 'SELECT FROM `book` `b` INNER JOIN author ON (b.AUTHOR_ID=author.ID)'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() supports relation without alias name on true table alias'); - } - - public function testJoinOnSameTable() - { - $c = new ModelCriteria('bookstore', 'BookstoreEmployee', 'be'); - $c->join('be.Supervisor sup'); - $c->join('sup.Subordinate sub'); - $c->where('sub.Name = ?', 'Foo'); - $sql = 'SELECT FROM INNER JOIN bookstore_employee sup ON (bookstore_employee.SUPERVISOR_ID=sup.ID) INNER JOIN bookstore_employee sub ON (sup.ID=sub.SUPERVISOR_ID) WHERE sub.NAME = :p1'; - $params = array( - array('table' => 'bookstore_employee', 'column' => 'NAME', 'value' => 'Foo'), - ); - $this->assertCriteriaTranslation($c, $sql, $params, 'join() allows two joins on the same table thanks to aliases'); - } - - public function testJoinAliasQuery() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->join('b.Author a'); - $c->where('a.FirstName = ?', 'Leo'); - $books = BookPeer::doSelect($c, $con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` INNER JOIN author a ON (book.AUTHOR_ID=a.ID) WHERE a.FIRST_NAME = 'Leo'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'join() allows the use of relation alias in where()'); - - $c = new ModelCriteria('bookstore', 'BookstoreEmployee', 'be'); - $c->join('be.Supervisor sup'); - $c->join('sup.Subordinate sub'); - $c->where('sub.Name = ?', 'Foo'); - $employees = BookstoreEmployeePeer::doSelect($c, $con); - $expectedSQL = "SELECT bookstore_employee.ID, bookstore_employee.CLASS_KEY, bookstore_employee.NAME, bookstore_employee.JOB_TITLE, bookstore_employee.SUPERVISOR_ID FROM `bookstore_employee` INNER JOIN bookstore_employee sup ON (bookstore_employee.SUPERVISOR_ID=sup.ID) INNER JOIN bookstore_employee sub ON (sup.ID=sub.SUPERVISOR_ID) WHERE sub.NAME = 'Foo'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'join() allows the use of relation alias in further joins()'); - } - - public function testGetJoin() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->join('Book.Author'); - - $joins = $c->getJoins(); - $this->assertEquals($joins['Author'], $c->getJoin('Author'), "getJoin() returns a specific Join from the ModelCriteria"); - } - - public function testWith() - { - $c = new TestableModelCriteria('bookstore', 'Book'); - $c->join('Book.Author'); - $c->with('Author'); - $withs = $c->getWith(); - $this->assertTrue(array_key_exists('Author', $withs), 'with() adds an entry to the internal list of Withs'); - $this->assertTrue($withs['Author'] instanceof ModelJoin, 'with() references the ModelJoin object'); - } - - /** - * @expectedException PropelException - */ - public function testWithThrowsExceptionWhenJoinLacks() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->with('Author'); - } - - public function testWithAlias() - { - $c = new TestableModelCriteria('bookstore', 'Book'); - $c->join('Book.Author a'); - $c->with('a'); - $withs = $c->getWith(); - $this->assertTrue(array_key_exists('a', $withs), 'with() uses the alias for the index of the internal list of Withs'); - } - - /** - * @expectedException PropelException - */ - public function testWithThrowsExceptionWhenNotUsingAlias() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->join('Book.Author a'); - $c->with('Author'); - } - - public function testWithAddsSelectColumns() - { - $c = new TestableModelCriteria('bookstore', 'Book'); - BookPeer::addSelectColumns($c); - $c->join('Book.Author'); - $c->with('Author'); - $expectedColumns = array( - BookPeer::ID, - BookPeer::TITLE, - BookPeer::ISBN, - BookPeer::PRICE, - BookPeer::PUBLISHER_ID, - BookPeer::AUTHOR_ID, - AuthorPeer::ID, - AuthorPeer::FIRST_NAME, - AuthorPeer::LAST_NAME, - AuthorPeer::EMAIL, - AuthorPeer::AGE - ); - $this->assertEquals($expectedColumns, $c->getSelectColumns(), 'with() adds the columns of the related table'); - } - - public function testWithAliasAddsSelectColumns() - { - $c = new TestableModelCriteria('bookstore', 'Book'); - BookPeer::addSelectColumns($c); - $c->join('Book.Author a'); - $c->with('a'); - $expectedColumns = array( - BookPeer::ID, - BookPeer::TITLE, - BookPeer::ISBN, - BookPeer::PRICE, - BookPeer::PUBLISHER_ID, - BookPeer::AUTHOR_ID, - 'a.ID', - 'a.FIRST_NAME', - 'a.LAST_NAME', - 'a.EMAIL', - 'a.AGE' - ); - $this->assertEquals($expectedColumns, $c->getSelectColumns(), 'with() adds the columns of the related table'); - } - - public function testWithAddsSelectColumnsOfMainTable() - { - $c = new TestableModelCriteria('bookstore', 'Book'); - $c->join('Book.Author'); - $c->with('Author'); - $expectedColumns = array( - BookPeer::ID, - BookPeer::TITLE, - BookPeer::ISBN, - BookPeer::PRICE, - BookPeer::PUBLISHER_ID, - BookPeer::AUTHOR_ID, - AuthorPeer::ID, - AuthorPeer::FIRST_NAME, - AuthorPeer::LAST_NAME, - AuthorPeer::EMAIL, - AuthorPeer::AGE - ); - $this->assertEquals($expectedColumns, $c->getSelectColumns(), 'with() adds the columns of the main table if required'); - } - - public function testWithAliasAddsSelectColumnsOfMainTable() - { - $c = new TestableModelCriteria('bookstore', 'Book'); - $c->setModelAlias('b', true); - $c->join('b.Author a'); - $c->with('a'); - $expectedColumns = array( - 'b.ID', - 'b.TITLE', - 'b.ISBN', - 'b.PRICE', - 'b.PUBLISHER_ID', - 'b.AUTHOR_ID', - 'a.ID', - 'a.FIRST_NAME', - 'a.LAST_NAME', - 'a.EMAIL', - 'a.AGE' - ); - $this->assertEquals($expectedColumns, $c->getSelectColumns(), 'with() adds the columns of the main table with an alias if required'); - } - - public function testWithOneToManyAddsSelectColumns() - { - $c = new TestableModelCriteria('bookstore', 'Author'); - AuthorPeer::addSelectColumns($c); - $c->leftJoin('Author.Book'); - $c->with('Book'); - $expectedColumns = array( - AuthorPeer::ID, - AuthorPeer::FIRST_NAME, - AuthorPeer::LAST_NAME, - AuthorPeer::EMAIL, - AuthorPeer::AGE, - BookPeer::ID, - BookPeer::TITLE, - BookPeer::ISBN, - BookPeer::PRICE, - BookPeer::PUBLISHER_ID, - BookPeer::AUTHOR_ID, - ); - $this->assertEquals($expectedColumns, $c->getSelectColumns(), 'with() adds the columns of the related table even in a one-to-many relationship'); - } - - public function testJoinWith() - { - $c = new TestableModelCriteria('bookstore', 'Book'); - $c->joinWith('Book.Author'); - $expectedColumns = array( - BookPeer::ID, - BookPeer::TITLE, - BookPeer::ISBN, - BookPeer::PRICE, - BookPeer::PUBLISHER_ID, - BookPeer::AUTHOR_ID, - AuthorPeer::ID, - AuthorPeer::FIRST_NAME, - AuthorPeer::LAST_NAME, - AuthorPeer::EMAIL, - AuthorPeer::AGE - ); - $this->assertEquals($expectedColumns, $c->getSelectColumns(), 'joinWith() adds the join'); - $joins = $c->getJoins(); - $join = $joins['Author']; - $this->assertEquals(Criteria::INNER_JOIN, $join->getJoinType(), 'joinWith() adds an INNER JOIN by default'); - } - - public function testJoinWithType() - { - $c = new TestableModelCriteria('bookstore', 'Book'); - $c->joinWith('Book.Author', Criteria::LEFT_JOIN); - $joins = $c->getJoins(); - $join = $joins['Author']; - $this->assertEquals(Criteria::LEFT_JOIN, $join->getJoinType(), 'joinWith() accepts a join type as second parameter'); - } - - public function testJoinWithAlias() - { - $c = new TestableModelCriteria('bookstore', 'Book'); - $c->joinWith('Book.Author a'); - $expectedColumns = array( - BookPeer::ID, - BookPeer::TITLE, - BookPeer::ISBN, - BookPeer::PRICE, - BookPeer::PUBLISHER_ID, - BookPeer::AUTHOR_ID, - 'a.ID', - 'a.FIRST_NAME', - 'a.LAST_NAME', - 'a.EMAIL', - 'a.AGE' - ); - $this->assertEquals($expectedColumns, $c->getSelectColumns(), 'joinWith() adds the join with the alias'); - } - - public function testJoinWithSeveral() - { - $c = new TestableModelCriteria('bookstore', 'Review'); - $c->joinWith('Review.Book'); - $c->joinWith('Book.Author'); - $c->joinWith('Book.Publisher'); - $expectedColumns = array( - ReviewPeer::ID, - ReviewPeer::REVIEWED_BY, - ReviewPeer::REVIEW_DATE, - ReviewPeer::RECOMMENDED, - ReviewPeer::STATUS, - ReviewPeer::BOOK_ID, - BookPeer::ID, - BookPeer::TITLE, - BookPeer::ISBN, - BookPeer::PRICE, - BookPeer::PUBLISHER_ID, - BookPeer::AUTHOR_ID, - AuthorPeer::ID, - AuthorPeer::FIRST_NAME, - AuthorPeer::LAST_NAME, - AuthorPeer::EMAIL, - AuthorPeer::AGE, - PublisherPeer::ID, - PublisherPeer::NAME - ); - $this->assertEquals($expectedColumns, $c->getSelectColumns(), 'joinWith() adds the with'); - $joins = $c->getJoins(); - $expectedJoinKeys = array('Book', 'Author', 'Publisher'); - $this->assertEquals($expectedJoinKeys, array_keys($joins), 'joinWith() adds the join'); - } - - public function testJoinWithTwice() - { - $c = new TestableModelCriteria('bookstore', 'Book'); - $c->join('Book.Review'); - $c->joinWith('Book.Author'); - $c->joinWith('Book.Review'); - $expectedColumns = array( - BookPeer::ID, - BookPeer::TITLE, - BookPeer::ISBN, - BookPeer::PRICE, - BookPeer::PUBLISHER_ID, - BookPeer::AUTHOR_ID, - AuthorPeer::ID, - AuthorPeer::FIRST_NAME, - AuthorPeer::LAST_NAME, - AuthorPeer::EMAIL, - AuthorPeer::AGE, - ReviewPeer::ID, - ReviewPeer::REVIEWED_BY, - ReviewPeer::REVIEW_DATE, - ReviewPeer::RECOMMENDED, - ReviewPeer::STATUS, - ReviewPeer::BOOK_ID, - ); - $this->assertEquals($expectedColumns, $c->getSelectColumns(), 'joinWith() adds the with'); - $joins = $c->getJoins(); - $expectedJoinKeys = array('Review', 'Author'); - $this->assertEquals($expectedJoinKeys, array_keys($joins), 'joinWith() adds the join'); - } - - public static function conditionsForTestWithColumn() - { - return array( - array('Book.Title', 'BookTitle', 'book.TITLE AS BookTitle'), - array('Book.Title', null, 'book.TITLE AS BookTitle'), - array('UPPER(Book.Title)', null, 'UPPER(book.TITLE) AS UPPERBookTitle'), - array('CONCAT(Book.Title, Book.ISBN)', 'foo', 'CONCAT(book.TITLE, book.ISBN) AS foo'), - ); - } - - /** - * @dataProvider conditionsForTestWithColumn - */ - public function testWithColumn($clause, $alias, $selectTranslation) - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->withColumn($clause, $alias); - $sql = 'SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID, ' . $selectTranslation . ' FROM `book`'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'withColumn() adds a calculated column to the select clause'); - } - - public function testWithColumnAndSelectColumns() - { - $c = new ModelCriteria('bookstore', 'Book'); - $c->withColumn('UPPER(Book.Title)', 'foo'); - $sql = 'SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID, UPPER(book.TITLE) AS foo FROM `book`'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'withColumn() adds the object columns if the criteria has no select columns'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->addSelectColumn('book.ID'); - $c->withColumn('UPPER(Book.Title)', 'foo'); - $sql = 'SELECT book.ID, UPPER(book.TITLE) AS foo FROM `book`'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'withColumn() does not add the object columns if the criteria already has select columns'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->addSelectColumn('book.ID'); - $c->withColumn('UPPER(Book.Title)', 'foo'); - $c->addSelectColumn('book.TITLE'); - $sql = 'SELECT book.ID, book.TITLE, UPPER(book.TITLE) AS foo FROM `book`'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'withColumn() does adds as column after the select columns even though the withColumn() method was called first'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->addSelectColumn('book.ID'); - $c->withColumn('UPPER(Book.Title)', 'foo'); - $c->withColumn('UPPER(Book.ISBN)', 'isbn'); - $sql = 'SELECT book.ID, UPPER(book.TITLE) AS foo, UPPER(book.ISBN) AS isbn FROM `book`'; - $params = array(); - $this->assertCriteriaTranslation($c, $sql, $params, 'withColumn() called repeatedly adds several as colums'); - } - - public function testKeepQuery() - { - $c = BookQuery::create(); - $this->assertFalse($c->isKeepQuery(), 'keepQuery is disabled by default'); - $c->keepQuery(); - $this->assertTrue($c->isKeepQuery(), 'keepQuery() enables the keepQuery property'); - $c->keepQuery(false); - $this->assertFalse($c->isKeepQuery(), 'keepQuery(false) disables the keepQuery property'); - } - - public function testKeepQueryFind() - { - $c = BookQuery::create(); - $c->filterByTitle('foo'); - $c->find(); - $expected = array('book.ID', 'book.TITLE', 'book.ISBN', 'book.PRICE', 'book.PUBLISHER_ID', 'book.AUTHOR_ID'); - $this->assertEquals($expected, $c->getSelectColumns(), 'find() modifies the query by default'); - - $c = BookQuery::create(); - $c->filterByTitle('foo'); - $c->keepQuery(); - $c->find(); - $this->assertEquals(array(), $c->getSelectColumns(), 'keepQuery() forces find() to use a clone and keep the original query unmodified'); - } - - public function testKeepQueryFindOne() - { - $c = BookQuery::create(); - $c->filterByTitle('foo'); - $c->findOne(); - $this->assertEquals(1, $c->getLimit(), 'findOne() modifies the query by default'); - - $c = BookQuery::create(); - $c->filterByTitle('foo'); - $c->keepQuery(); - $c->findOne(); - $this->assertEquals(0, $c->getLimit(), 'keepQuery() forces findOne() to use a clone and keep the original query unmodified'); - } - - public function testKeepQueryFindPk() - { - $c = BookQuery::create(); - $c->findPk(1); - $expected = array('book.ID', 'book.TITLE', 'book.ISBN', 'book.PRICE', 'book.PUBLISHER_ID', 'book.AUTHOR_ID'); - $this->assertEquals($expected, $c->getSelectColumns(), 'findPk() modifies the query by default'); - - $c = BookQuery::create(); - $c->keepQuery(); - $c->findPk(1); - $this->assertEquals(array(), $c->getSelectColumns(), 'keepQuery() forces findPk() to use a clone and keep the original query unmodified'); - } - - public function testKeepQueryCount() - { - $c = BookQuery::create(); - $c->orderByTitle(); - $c->count(); - $this->assertEquals(array(), $c->getOrderByColumns(), 'count() modifies the query by default'); - - $c = BookQuery::create(); - $c->orderByTitle(); - $c->keepQuery(); - $c->count(); - $this->assertEquals(array('book.TITLE ASC'), $c->getOrderByColumns(), 'keepQuery() forces count() to use a clone and keep the original query unmodified'); - } - - public function testFind() - { - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'foo'); - $books = $c->find(); - $this->assertTrue($books instanceof PropelCollection, 'find() returns a collection by default'); - $this->assertEquals(0, count($books), 'find() returns an empty array when the query returns no result'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->join('b.Author a'); - $c->where('a.FirstName = ?', 'Neal'); - $books = $c->find(); - $this->assertTrue($books instanceof PropelCollection, 'find() returns a collection by default'); - $this->assertEquals(1, count($books), 'find() returns as many rows as the results in the query'); - $book = $books->shift(); - $this->assertTrue($book instanceof Book, 'find() returns an array of Model objects by default'); - $this->assertEquals('Quicksilver', $book->getTitle(), 'find() returns the model objects matching the query'); - } - - public function testFindAddsSelectColumns() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->find($con); - $sql = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book`"; - $this->assertEquals($sql, $con->getLastExecutedQuery(), 'find() adds the select columns of the current model'); - } - - public function testFindTrueAliasAddsSelectColumns() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c = new ModelCriteria('bookstore', 'Book'); - $c->setModelAlias('b', true); - $books = $c->find($con); - $sql = "SELECT b.ID, b.TITLE, b.ISBN, b.PRICE, b.PUBLISHER_ID, b.AUTHOR_ID FROM `book` `b`"; - $this->assertEquals($sql, $con->getLastExecutedQuery(), 'find() uses the true model alias if available'); - } - - public function testFindOne() - { - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'foo'); - $book = $c->findOne(); - $this->assertNull($book, 'findOne() returns null when the query returns no result'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->orderBy('b.Title'); - $book = $c->findOne(); - $this->assertTrue($book instanceof Book, 'findOne() returns a Model object by default'); - $this->assertEquals('Don Juan', $book->getTitle(), 'find() returns the model objects matching the query'); - } - - public function testFindOneOrCreateNotExists() - { - BookQuery::create()->deleteAll(); - $book = BookQuery::create('b') - ->where('b.Title = ?', 'foo') - ->filterByPrice(125) - ->findOneOrCreate(); - $this->assertTrue($book instanceof Book, 'findOneOrCreate() returns an instance of the model when the request has no result'); - $this->assertTrue($book->isNew(), 'findOneOrCreate() returns a new instance of the model when the request has no result'); - $this->assertEquals('foo', $book->getTitle(), 'findOneOrCreate() returns a populated objects based on the conditions'); - $this->assertEquals(125, $book->getPrice(), 'findOneOrCreate() returns a populated objects based on the conditions'); - } - - public function testFindOneOrCreateNotExistsFormatter() - { - BookQuery::create()->deleteAll(); - $book = BookQuery::create('b') - ->where('b.Title = ?', 'foo') - ->filterByPrice(125) - ->setFormatter(ModelCriteria::FORMAT_ARRAY) - ->findOneOrCreate(); - $this->assertTrue(is_array($book), 'findOneOrCreate() uses the query formatter even when the request has no result'); - $this->assertEquals('foo', $book['Title'], 'findOneOrCreate() returns a populated array based on the conditions'); - $this->assertEquals(125, $book['Price'], 'findOneOrCreate() returns a populated array based on the conditions'); - } - - public function testFindOneOrCreateExists() - { - BookQuery::create()->deleteAll(); - $book = new Book(); - $book->setTitle('foo'); - $book->setPrice(125); - $book->save(); - $book = BookQuery::create('b') - ->where('b.Title = ?', 'foo') - ->filterByPrice(125) - ->findOneOrCreate(); - $this->assertTrue($book instanceof Book, 'findOneOrCreate() returns an instance of the model when the request has one result'); - $this->assertFalse($book->isNew(), 'findOneOrCreate() returns an existing instance of the model when the request has one result'); - $this->assertEquals('foo', $book->getTitle(), 'findOneOrCreate() returns a populated objects based on the conditions'); - $this->assertEquals(125, $book->getPrice(), 'findOneOrCreate() returns a populated objects based on the conditions'); - } - - public function testFindPkSimpleKey() - { - BookstoreDataPopulator::depopulate(); - - $c = new ModelCriteria('bookstore', 'Book'); - $book = $c->findPk(765432); - $this->assertNull($book, 'findPk() returns null when the primary key is not found'); - - BookstoreDataPopulator::populate(); - - // retrieve the test data - $c = new ModelCriteria('bookstore', 'Book'); - $testBook = $c->findOne(); - - $c = new ModelCriteria('bookstore', 'Book'); - $book = $c->findPk($testBook->getId()); - $this->assertEquals($testBook, $book, 'findPk() returns a model object corresponding to the pk'); - } - - public function testFindPksSimpleKey() - { - BookstoreDataPopulator::depopulate(); - - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->findPks(array(765432, 434535)); - $this->assertEquals($books instanceof PropelCollection, 'findPks() returns a PropelCollection'); - $this->assertEquals(0, count($books), 'findPks() returns an empty collection when the primary keys are not found'); - - BookstoreDataPopulator::populate(); - - // retrieve the test data - $c = new ModelCriteria('bookstore', 'Book'); - $testBooks = $c->find(); - $testBook1 = $testBooks->pop(); - $testBook2 = $testBooks->pop(); - - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->findPks(array($testBook1->getId(), $testBook2->getId())); - $this->assertEquals(array($testBook2, $testBook1), $books->getData(), 'findPks() returns an array of model objects corresponding to the pks'); - } - - public function testFindPkCompositeKey() - { - BookstoreDataPopulator::depopulate(); - - $c = new ModelCriteria('bookstore', 'BookListRel'); - $bookListRel = $c->findPk(array(1, 2)); - $this->assertNull($bookListRel, 'findPk() returns null when the composite primary key is not found'); - - Propel::enableInstancePooling(); - BookstoreDataPopulator::populate(); - - // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->find(); - foreach ($books as $book) { - $book->save(); - } - - // retrieve the test data - $c = new ModelCriteria('bookstore', 'BookListRel'); - $bookListRelTest = $c->findOne(); - $pk = $bookListRelTest->getPrimaryKey(); - - $c = new ModelCriteria('bookstore', 'BookListRel'); - $bookListRel = $c->findPk($pk); - $this->assertEquals($bookListRelTest, $bookListRel, 'findPk() can find objects with composite primary keys'); - } - - /** - * @expectedException PropelException - */ - public function testFindPksCompositeKey() - { - $c = new ModelCriteria('bookstore', 'BookListRel'); - $bookListRel = $c->findPks(array(array(1, 2))); - - } - - public function testFindBy() - { - try { - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->findBy('Foo', 'Bar'); - $this->fail('findBy() throws an exception when called on an unknown column name'); - } catch (PropelException $e) { - $this->assertTrue(true, 'findBy() throws an exception when called on an unknown column name'); - } - - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->findBy('Title', 'Don Juan', $con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.TITLE='Don Juan'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'findBy() adds simple column conditions'); - $this->assertTrue($books instanceof PropelCollection, 'findBy() issues a find()'); - $this->assertEquals(1, count($books), 'findBy() adds simple column conditions'); - $book = $books->shift(); - $this->assertTrue($book instanceof Book, 'findBy() returns an array of Model objects by default'); - $this->assertEquals('Don Juan', $book->getTitle(), 'findBy() returns the model objects matching the query'); - } - - public function testFindByArray() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->findByArray(array('Title' => 'Don Juan', 'ISBN' => 12345), $con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.TITLE='Don Juan' AND book.ISBN=12345"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'findByArray() adds multiple column conditions'); - } - - public function testFindOneBy() - { - try { - $c = new ModelCriteria('bookstore', 'Book'); - $book = $c->findOneBy('Foo', 'Bar'); - $this->fail('findOneBy() throws an exception when called on an unknown column name'); - } catch (PropelException $e) { - $this->assertTrue(true, 'findOneBy() throws an exception when called on an unknown column name'); - } - - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c = new ModelCriteria('bookstore', 'Book'); - $book = $c->findOneBy('Title', 'Don Juan', $con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.TITLE='Don Juan' LIMIT 1"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'findOneBy() adds simple column conditions'); - $this->assertTrue($book instanceof Book, 'findOneBy() returns a Model object by default'); - $this->assertEquals('Don Juan', $book->getTitle(), 'findOneBy() returns the model object matching the query'); - } - - public function testFindOneByArray() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c = new ModelCriteria('bookstore', 'Book'); - $book = $c->findOneByArray(array('Title' => 'Don Juan', 'ISBN' => 12345), $con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.TITLE='Don Juan' AND book.ISBN=12345 LIMIT 1"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'findOneBy() adds multiple column conditions'); - } - - public function testCount() - { - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'foo'); - $nbBooks = $c->count(); - $this->assertTrue(is_int($nbBooks), 'count() returns an integer'); - $this->assertEquals(0, $nbBooks, 'count() returns 0 when the query returns no result'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->join('b.Author a'); - $c->where('a.FirstName = ?', 'Neal'); - $nbBooks = $c->count(); - $this->assertTrue(is_int($nbBooks), 'count() returns an integer'); - $this->assertEquals(1, $nbBooks, 'count() returns the number of results in the query'); - } - - public function testPaginate() - { - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->join('b.Author a'); - $c->where('a.FirstName = ?', 'Neal'); - $books = $c->paginate(1, 5); - $this->assertTrue($books instanceof PropelModelPager, 'paginate() returns a PropelModelPager'); - $this->assertEquals(1, count($books), 'paginate() returns a countable pager with the correct count'); - foreach ($books as $book) { - $this->assertEquals('Neal', $book->getAuthor()->getFirstName(), 'paginate() returns an iterable pager'); - } - } - - public function testDelete() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - $c = new ModelCriteria('bookstore', 'Book'); - try { - $nbBooks = $c->delete(); - $this->fail('delete() throws an exception when called on an empty Criteria'); - } catch (PropelException $e) { - $this->assertTrue(true, 'delete() throws an exception when called on an empty Criteria'); - } - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'foo'); - $nbBooks = $c->delete(); - $this->assertTrue(is_int($nbBooks), 'delete() returns an integer'); - $this->assertEquals(0, $nbBooks, 'delete() returns 0 when the query deleted no rows'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'Don Juan'); - $nbBooks = $c->delete(); - $this->assertTrue(is_int($nbBooks), 'delete() returns an integer'); - $this->assertEquals(1, $nbBooks, 'delete() returns the number of the deleted rows'); - - $c = new ModelCriteria('bookstore', 'Book'); - $nbBooks = $c->count(); - $this->assertEquals(3, $nbBooks, 'delete() deletes rows in the database'); - } - - public function testDeleteUsingTableAlias() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->setModelAlias('b', false); - $c->where('b.Title = ?', 'foo'); - $c->delete(); - $expectedSQL = "DELETE FROM `book` WHERE book.TITLE = 'foo'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'delete() also works on tables with table alias'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->setModelAlias('b', true); - $c->where('b.Title = ?', 'foo'); - $c->delete(); - $expectedSQL = "DELETE b FROM `book` AS b WHERE b.TITLE = 'foo'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'delete() also works on tables with true table alias'); - } - - public function testDeleteAll() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - $c = new ModelCriteria('bookstore', 'Book'); - $nbBooks = $c->deleteAll(); - $this->assertTrue(is_int($nbBooks), 'deleteAll() returns an integer'); - $this->assertEquals(4, $nbBooks, 'deleteAll() returns the number of deleted rows'); - - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'Don Juan'); - $nbBooks = $c->deleteAll(); - $this->assertEquals(4, $nbBooks, 'deleteAll() ignores conditions on the criteria'); - } - - public function testUpdate() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - BookstoreDataPopulator::depopulate($con); - BookstoreDataPopulator::populate($con); - - $count = $con->getQueryCount(); - $c = new ModelCriteria('bookstore', 'Book'); - $nbBooks = $c->update(array('Title' => 'foo'), $con); - $this->assertEquals(4, $nbBooks, 'update() returns the number of updated rows'); - $this->assertEquals($count + 1, $con->getQueryCount(), 'update() updates all the objects in one query by default'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'foo'); - $nbBooks = $c->count(); - $this->assertEquals(4, $nbBooks, 'update() updates all records by default'); - - BookstoreDataPopulator::depopulate($con); - BookstoreDataPopulator::populate($con); - - $count = $con->getQueryCount(); - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'Don Juan'); - $nbBooks = $c->update(array('ISBN' => '3456'), $con); - $this->assertEquals(1, $nbBooks, 'update() updates only the records matching the criteria'); - $this->assertEquals($count + 1, $con->getQueryCount(), 'update() updates all the objects in one query by default'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'Don Juan'); - $book = $c->findOne(); - $this->assertEquals('3456', $book->getISBN(), 'update() updates only the records matching the criteria'); - } - - public function testUpdateUsingTableAlias() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->setModelAlias('b', false); - $c->where('b.Title = ?', 'foo'); - $c->update(array('Title' => 'foo2'), $con); - $expectedSQL = "UPDATE `book` SET `TITLE`='foo2' WHERE book.TITLE = 'foo'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'update() also works on tables with table alias'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->setModelAlias('b', true); - $c->where('b.Title = ?', 'foo'); - $c->update(array('Title' => 'foo2'), $con); - $expectedSQL = "UPDATE `book` `b` SET `TITLE`='foo2' WHERE b.TITLE = 'foo'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'update() also works on tables with true table alias'); - } - - public function testUpdateOneByOne() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - BookstoreDataPopulator::depopulate($con); - BookstoreDataPopulator::populate($con); - - // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->find(); - foreach ($books as $book) { - $book->save(); - } - - $count = $con->getQueryCount(); - $c = new ModelCriteria('bookstore', 'Book'); - $nbBooks = $c->update(array('Title' => 'foo'), $con, true); - $this->assertEquals(4, $nbBooks, 'update() returns the number of updated rows'); - $this->assertEquals($count + 1 + 4, $con->getQueryCount(), 'update() updates the objects one by one when called with true as last parameter'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'foo'); - $nbBooks = $c->count(); - $this->assertEquals(4, $nbBooks, 'update() updates all records by default'); - - BookstoreDataPopulator::depopulate($con); - BookstoreDataPopulator::populate($con); - - // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->find(); - foreach ($books as $book) { - $book->save(); - } - - $count = $con->getQueryCount(); - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'Don Juan'); - $nbBooks = $c->update(array('ISBN' => '3456'), $con, true); - $this->assertEquals(1, $nbBooks, 'update() updates only the records matching the criteria'); - $this->assertEquals($count + 1 + 1, $con->getQueryCount(), 'update() updates the objects one by one when called with true as last parameter'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->where('b.Title = ?', 'Don Juan'); - $book = $c->findOne(); - $this->assertEquals('3456', $book->getISBN(), 'update() updates only the records matching the criteria'); - } - - public static function conditionsForTestGetRelationName() - { - return array( - array('Author', 'Author'), - array('Book.Author', 'Author'), - array('Author.Book', 'Book'), - array('Book.Author a', 'a'), - ); - } - - /** - * @dataProvider conditionsForTestGetRelationName - */ - public function testGetRelationName($relation, $relationName) - { - $this->assertEquals($relationName, ModelCriteria::getrelationName($relation)); - } - - public function testMagicJoin() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->leftJoin('b.Author a'); - $c->where('a.FirstName = ?', 'Leo'); - $books = $c->findOne($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` LEFT JOIN author a ON (book.AUTHOR_ID=a.ID) WHERE a.FIRST_NAME = 'Leo' LIMIT 1"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'leftJoin($x) is turned into join($x, Criteria::LEFT_JOIN)'); - - $books = BookQuery::create() - ->leftJoinAuthor('a') - ->where('a.FirstName = ?', 'Leo') - ->findOne($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` LEFT JOIN author a ON (book.AUTHOR_ID=a.ID) WHERE a.FIRST_NAME = 'Leo' LIMIT 1"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'leftJoinX() is turned into join($x, Criteria::LEFT_JOIN)'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->innerJoin('b.Author a'); - $c->where('a.FirstName = ?', 'Leo'); - $books = $c->findOne($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` INNER JOIN author a ON (book.AUTHOR_ID=a.ID) WHERE a.FIRST_NAME = 'Leo' LIMIT 1"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'innerJoin($x) is turned into join($x, Criteria::INNER_JOIN)'); - - $books = BookQuery::create() - ->innerJoinAuthor('a') - ->where('a.FirstName = ?', 'Leo') - ->findOne($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` INNER JOIN author a ON (book.AUTHOR_ID=a.ID) WHERE a.FIRST_NAME = 'Leo' LIMIT 1"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'innerJoinX() is turned into join($x, Criteria::INNER_JOIN)'); - - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->rightJoin('b.Author a'); - $c->where('a.FirstName = ?', 'Leo'); - $books = $c->findOne($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` RIGHT JOIN author a ON (book.AUTHOR_ID=a.ID) WHERE a.FIRST_NAME = 'Leo' LIMIT 1"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'rightJoin($x) is turned into join($x, Criteria::RIGHT_JOIN)'); - - $books = BookQuery::create() - ->rightJoinAuthor('a') - ->where('a.FirstName = ?', 'Leo') - ->findOne($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` RIGHT JOIN author a ON (book.AUTHOR_ID=a.ID) WHERE a.FIRST_NAME = 'Leo' LIMIT 1"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'rightJoinX() is turned into join($x, Criteria::RIGHT_JOIN)'); - - $books = BookQuery::create() - ->leftJoinAuthor() - ->where('Author.FirstName = ?', 'Leo') - ->findOne($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` LEFT JOIN author ON (book.AUTHOR_ID=author.ID) WHERE author.FIRST_NAME = 'Leo' LIMIT 1"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'leftJoinX() is turned into join($x, Criteria::LEFT_JOIN)'); - } - - public function testMagicJoinWith() - { - $c = new TestableModelCriteria('bookstore', 'Book'); - $c->leftJoinWith('Book.Author a'); - $expectedColumns = array( - BookPeer::ID, - BookPeer::TITLE, - BookPeer::ISBN, - BookPeer::PRICE, - BookPeer::PUBLISHER_ID, - BookPeer::AUTHOR_ID, - 'a.ID', - 'a.FIRST_NAME', - 'a.LAST_NAME', - 'a.EMAIL', - 'a.AGE' - ); - $this->assertEquals($expectedColumns, $c->getSelectColumns(), 'leftJoinWith() adds the join with the alias'); - $joins = $c->getJoins(); - $join = $joins['a']; - $this->assertEquals(Criteria::LEFT_JOIN, $join->getJoinType(), 'leftJoinWith() adds a LEFT JOIN'); - } - - public function testMagicJoinWithRelation() - { - $c = new TestableModelCriteria('bookstore', 'Book'); - $c->joinWithAuthor(); - $expectedColumns = array( - BookPeer::ID, - BookPeer::TITLE, - BookPeer::ISBN, - BookPeer::PRICE, - BookPeer::PUBLISHER_ID, - BookPeer::AUTHOR_ID, - AuthorPeer::ID, - AuthorPeer::FIRST_NAME, - AuthorPeer::LAST_NAME, - AuthorPeer::EMAIL, - AuthorPeer::AGE - ); - $this->assertEquals($expectedColumns, $c->getSelectColumns(), 'joinWithXXX() adds the join with the XXX relation'); - $joins = $c->getJoins(); - $join = $joins['Author']; - $this->assertEquals(Criteria::INNER_JOIN, $join->getJoinType(), 'joinWithXXX() adds an INNER JOIN'); - } - - public function testMagicJoinWithTypeAndRelation() - { - $c = new TestableModelCriteria('bookstore', 'Book'); - $c->leftJoinWithAuthor(); - $expectedColumns = array( - BookPeer::ID, - BookPeer::TITLE, - BookPeer::ISBN, - BookPeer::PRICE, - BookPeer::PUBLISHER_ID, - BookPeer::AUTHOR_ID, - AuthorPeer::ID, - AuthorPeer::FIRST_NAME, - AuthorPeer::LAST_NAME, - AuthorPeer::EMAIL, - AuthorPeer::AGE - ); - $this->assertEquals($expectedColumns, $c->getSelectColumns(), 'leftJoinWithXXX() adds the join with the XXX relation'); - $joins = $c->getJoins(); - $join = $joins['Author']; - $this->assertEquals(Criteria::LEFT_JOIN, $join->getJoinType(), 'leftJoinWithXXX() adds an INNER JOIN'); - } - - public function testMagicFind() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->findByTitle('Don Juan'); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.TITLE='Don Juan'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'findByXXX($value) is turned into findBy(XXX, $value)'); - - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->findByTitleAndISBN('Don Juan', 1234); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.TITLE='Don Juan' AND book.ISBN=1234"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'findByXXXAndYYY($value) is turned into findBy(array(XXX,YYY), $value)'); - - $c = new ModelCriteria('bookstore', 'Book'); - $book = $c->findOneByTitle('Don Juan'); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.TITLE='Don Juan' LIMIT 1"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'findOneByXXX($value) is turned into findOneBy(XXX, $value)'); - - $c = new ModelCriteria('bookstore', 'Book'); - $book = $c->findOneByTitleAndISBN('Don Juan', 1234); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.TITLE='Don Juan' AND book.ISBN=1234 LIMIT 1"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'findOneByXXX($value) is turned into findOneBy(XXX, $value)'); - } - - public function testMagicFilterBy() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->filterByTitle('Don Juan')->find($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.TITLE='Don Juan'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'filterByXXX($value) is turned into filterBy(XXX, $value)'); - } - - public function testMagicOrderBy() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->orderByTitle()->find($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` ORDER BY book.TITLE ASC"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'orderByXXX() is turned into orderBy(XXX)'); - - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->orderByTitle(Criteria::DESC)->find($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` ORDER BY book.TITLE DESC"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'orderByXXX($direction) is turned into orderBy(XXX, $direction)'); - } - - public function testMagicGroupBy() - { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - - $c = new ModelCriteria('bookstore', 'Book'); - $books = $c->groupByTitle()->find($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` GROUP BY book.TITLE"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'groupByXXX() is turned into groupBy(XXX)'); - } - - public function testUseQuery() - { - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->thisIsMe = true; - $c->where('b.Title = ?', 'foo'); - $c->setOffset(10); - $c->leftJoin('b.Author'); - - $c2 = $c->useQuery('Author'); - $this->assertTrue($c2 instanceof AuthorQuery, 'useQuery() returns a secondary Criteria'); - $this->assertEquals($c, $c2->getPrimaryCriteria(), 'useQuery() sets the primary Criteria os the secondary Criteria'); - $c2->where('Author.FirstName = ?', 'john'); - $c2->limit(5); - - $c = $c2->endUse(); - $this->assertTrue($c->thisIsMe, 'endUse() returns the Primary Criteria'); - $this->assertEquals('Book', $c->getModelName(), 'endUse() returns the Primary Criteria'); - - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c->find($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` LEFT JOIN author ON (book.AUTHOR_ID=author.ID) WHERE book.TITLE = 'foo' AND author.FIRST_NAME = 'john' LIMIT 10, 5"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'useQuery() and endUse() allow to merge a secondary criteria'); - } - - public function testUseQueryAlias() - { - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->thisIsMe = true; - $c->where('b.Title = ?', 'foo'); - $c->setOffset(10); - $c->leftJoin('b.Author a'); - - $c2 = $c->useQuery('a'); - $this->assertTrue($c2 instanceof AuthorQuery, 'useQuery() returns a secondary Criteria'); - $this->assertEquals($c, $c2->getPrimaryCriteria(), 'useQuery() sets the primary Criteria os the secondary Criteria'); - $this->assertEquals(array('a' => 'author'), $c2->getAliases(), 'useQuery() sets the secondary Criteria alias correctly'); - $c2->where('a.FirstName = ?', 'john'); - $c2->limit(5); - - $c = $c2->endUse(); - $this->assertTrue($c->thisIsMe, 'endUse() returns the Primary Criteria'); - $this->assertEquals('Book', $c->getModelName(), 'endUse() returns the Primary Criteria'); - - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c->find($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` LEFT JOIN author a ON (book.AUTHOR_ID=a.ID) WHERE book.TITLE = 'foo' AND a.FIRST_NAME = 'john' LIMIT 10, 5"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'useQuery() and endUse() allow to merge a secondary criteria'); - } - - public function testUseQueryCustomClass() - { - $c = new ModelCriteria('bookstore', 'Book', 'b'); - $c->thisIsMe = true; - $c->where('b.Title = ?', 'foo'); - $c->setLimit(10); - $c->leftJoin('b.Author a'); - - $c2 = $c->useQuery('a', 'ModelCriteriaForUseQuery'); - $this->assertTrue($c2 instanceof ModelCriteriaForUseQuery, 'useQuery() returns a secondary Criteria with the custom class'); - $c2->withNoName(); - $c = $c2->endUse(); - - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c->find($con); - $expectedSQL = "SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` LEFT JOIN author a ON (book.AUTHOR_ID=a.ID) WHERE book.TITLE = 'foo' AND a.FIRST_NAME IS NOT NULL AND a.LAST_NAME IS NOT NULL LIMIT 10"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'useQuery() and endUse() allow to merge a custom secondary criteria'); - } - - public function testUseQueryJoinWithFind() - { - $c = new ModelCriteria('bookstore', 'Review'); - $c->joinWith('Book'); - - $c2 = $c->useQuery('Book'); - - $joins = $c->getJoins(); - $this->assertEquals($c->getPreviousJoin(), null, 'The default value for previousJoin remains null'); - $this->assertEquals($c2->getPreviousJoin(), $joins['Book'], 'useQuery() sets the previousJoin'); - - // join Book with Author, which is possible since previousJoin is set, which makes resolving of relations possible during hydration - $c2->joinWith('Author'); - - $c = $c2->endUse(); - - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c->find($con); - $expectedSQL = "SELECT review.ID, review.REVIEWED_BY, review.REVIEW_DATE, review.RECOMMENDED, review.STATUS, review.BOOK_ID, book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID, author.ID, author.FIRST_NAME, author.LAST_NAME, author.EMAIL, author.AGE FROM `review` INNER JOIN book ON (review.BOOK_ID=book.ID) INNER JOIN author ON (book.AUTHOR_ID=author.ID)"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'useQuery() and joinWith() can be used together and form a correct query'); - } - - public function testUseQueryCustomRelationPhpName() - { - $c = new ModelCriteria('bookstore', 'BookstoreContest'); - $c->leftJoin('BookstoreContest.Work'); - $c2 = $c->useQuery('Work'); - $this->assertTrue($c2 instanceof BookQuery, 'useQuery() returns a secondary Criteria'); - $this->assertEquals($c, $c2->getPrimaryCriteria(), 'useQuery() sets the primary Criteria os the secondary Criteria'); - //$this->assertEquals(array('a' => 'author'), $c2->getAliases(), 'useQuery() sets the secondary Criteria alias correctly'); - $c2->where('Work.Title = ?', 'War And Peace'); - - $c = $c2->endUse(); - $this->assertEquals('BookstoreContest', $c->getModelName(), 'endUse() returns the Primary Criteria'); - - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c->find($con); - $expectedSQL = "SELECT bookstore_contest.BOOKSTORE_ID, bookstore_contest.CONTEST_ID, bookstore_contest.PRIZE_BOOK_ID FROM `bookstore_contest` LEFT JOIN book ON (bookstore_contest.PRIZE_BOOK_ID=book.ID) WHERE book.TITLE = 'War And Peace'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'useQuery() and endUse() allow to merge a secondary criteria'); - } - - public function testUseQueryCustomRelationPhpNameAndAlias() - { - $c = new ModelCriteria('bookstore', 'BookstoreContest'); - $c->leftJoin('BookstoreContest.Work w'); - $c2 = $c->useQuery('w'); - $this->assertTrue($c2 instanceof BookQuery, 'useQuery() returns a secondary Criteria'); - $this->assertEquals($c, $c2->getPrimaryCriteria(), 'useQuery() sets the primary Criteria os the secondary Criteria'); - //$this->assertEquals(array('a' => 'author'), $c2->getAliases(), 'useQuery() sets the secondary Criteria alias correctly'); - $c2->where('w.Title = ?', 'War And Peace'); - - $c = $c2->endUse(); - $this->assertEquals('BookstoreContest', $c->getModelName(), 'endUse() returns the Primary Criteria'); - - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - $c->find($con); - $expectedSQL = "SELECT bookstore_contest.BOOKSTORE_ID, bookstore_contest.CONTEST_ID, bookstore_contest.PRIZE_BOOK_ID FROM `bookstore_contest` LEFT JOIN book w ON (bookstore_contest.PRIZE_BOOK_ID=w.ID) WHERE w.TITLE = 'War And Peace'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'useQuery() and endUse() allow to merge a secondary criteria'); - } - - public function testMergeWithJoins() - { - $c1 = new ModelCriteria('bookstore', 'Book', 'b'); - $c1->leftJoin('b.Author a'); - $c2 = new ModelCriteria('bookstore', 'Author'); - $c1->mergeWith($c2); - $joins = $c1->getJoins(); - $this->assertEquals(1, count($joins), 'mergeWith() does not remove an existing join'); - $this->assertEquals('LEFT JOIN : book.AUTHOR_ID=a.ID(ignoreCase not considered)', $joins['a']->toString(), 'mergeWith() does not remove an existing join'); - $c1 = new ModelCriteria('bookstore', 'Book', 'b'); - $c2 = new ModelCriteria('bookstore', 'Book', 'b'); - $c2->leftJoin('b.Author a'); - $c1->mergeWith($c2); - $joins = $c1->getJoins(); - $this->assertEquals(1, count($joins), 'mergeWith() merge joins to an empty join'); - $this->assertEquals('LEFT JOIN : book.AUTHOR_ID=a.ID(ignoreCase not considered)', $joins['a']->toString(), 'mergeWith() merge joins to an empty join'); - - $c1 = new ModelCriteria('bookstore', 'Book', 'b'); - $c1->leftJoin('b.Author a'); - $c2 = new ModelCriteria('bookstore', 'Book', 'b'); - $c2->innerJoin('b.Publisher p'); - $c1->mergeWith($c2); - $joins = $c1->getJoins(); - $this->assertEquals(2, count($joins), 'mergeWith() merge joins to an existing join'); - $this->assertEquals('LEFT JOIN : book.AUTHOR_ID=a.ID(ignoreCase not considered)', $joins['a']->toString(), 'mergeWith() merge joins to an empty join'); - $this->assertEquals('INNER JOIN : book.PUBLISHER_ID=p.ID(ignoreCase not considered)', $joins['p']->toString(), 'mergeWith() merge joins to an empty join'); - } - - public function testMergeWithWiths() - { - $c1 = new ModelCriteria('bookstore', 'Book', 'b'); - $c1->leftJoinWith('b.Author a'); - $c2 = new ModelCriteria('bookstore', 'Author'); - $c1->mergeWith($c2); - $with = $c1->getWith(); - $this->assertEquals(1, count($with), 'mergeWith() does not remove an existing join'); - $this->assertEquals('LEFT JOIN : book.AUTHOR_ID=a.ID(ignoreCase not considered) tableMap: AuthorTableMap relationMap: Author previousJoin: null relationAlias: a', $with['a']->__toString(), 'mergeWith() does not remove an existing join'); - - $c1 = new ModelCriteria('bookstore', 'Book', 'b'); - $c2 = new ModelCriteria('bookstore', 'Book', 'b'); - $c2->leftJoinWith('b.Author a'); - $c1->mergeWith($c2); - $with = $c1->getWith(); - $this->assertEquals(1, count($with), 'mergeWith() merge joins to an empty join'); - $this->assertEquals('LEFT JOIN : book.AUTHOR_ID=a.ID(ignoreCase not considered) tableMap: AuthorTableMap relationMap: Author previousJoin: null relationAlias: a', $with['a']->__toString(), 'mergeWith() merge joins to an empty join'); - - $c1 = new ModelCriteria('bookstore', 'Book', 'b'); - $c1->leftJoinWith('b.Author a'); - $c2 = new ModelCriteria('bookstore', 'Book', 'b'); - $c2->innerJoinWith('b.Publisher p'); - $c1->mergeWith($c2); - $with = $c1->getWith(); - $this->assertEquals(2, count($with), 'mergeWith() merge joins to an existing join'); - $this->assertEquals('LEFT JOIN : book.AUTHOR_ID=a.ID(ignoreCase not considered) tableMap: AuthorTableMap relationMap: Author previousJoin: null relationAlias: a', $with['a']->__toString(), 'mergeWith() merge joins to an empty join'); - $this->assertEquals('INNER JOIN : book.PUBLISHER_ID=p.ID(ignoreCase not considered) tableMap: PublisherTableMap relationMap: Publisher previousJoin: null relationAlias: p', $with['p']->__toString(), 'mergeWith() merge joins to an empty join'); - - } - - public function testGetAliasedColName() - { - $c = new ModelCriteria('bookstore', 'Book'); - $this->assertEquals(BookPeer::TITLE, $c->getAliasedColName(BookPeer::TITLE), 'getAliasedColName() returns the input when the table has no alias'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->setModelAlias('foo'); - $this->assertEquals(BookPeer::TITLE, $c->getAliasedColName(BookPeer::TITLE), 'getAliasedColName() returns the input when the table has a query alias'); - - $c = new ModelCriteria('bookstore', 'Book'); - $c->setModelAlias('foo', true); - $this->assertEquals('foo.TITLE', $c->getAliasedColName(BookPeer::TITLE), 'getAliasedColName() returns the column name with table alias when the table has a true alias'); - } - - public function testAddUsingAliasNoAlias() - { - $c1 = new ModelCriteria('bookstore', 'Book'); - $c1->addUsingAlias(BookPeer::TITLE, 'foo'); - $c2 = new ModelCriteria('bookstore', 'Book'); - $c2->add(BookPeer::TITLE, 'foo'); - $this->assertEquals($c2, $c1, 'addUsingalias() translates to add() when the table has no alias'); - } - - public function testAddUsingAliasQueryAlias() - { - $c1 = new ModelCriteria('bookstore', 'Book', 'b'); - $c1->addUsingAlias(BookPeer::TITLE, 'foo'); - $c2 = new ModelCriteria('bookstore', 'Book', 'b'); - $c2->add(BookPeer::TITLE, 'foo'); - $this->assertEquals($c2, $c1, 'addUsingalias() translates the colname using the table alias before calling add() when the table has a true alias'); - } - - public function testAddUsingAliasTrueAlias() - { - $c1 = new ModelCriteria('bookstore', 'Book'); - $c1->setModelAlias('b', true); - $c1->addUsingAlias(BookPeer::TITLE, 'foo'); - $c2 = new ModelCriteria('bookstore', 'Book'); - $c2->setModelAlias('b', true); - $c2->add('b.TITLE', 'foo'); - $this->assertEquals($c2, $c1, 'addUsingalias() translates to add() when the table has a true alias'); - } - - public function testAddUsingAliasTwice() - { - $c1 = new ModelCriteria('bookstore', 'Book'); - $c1->addUsingAlias(BookPeer::TITLE, 'foo'); - $c1->addUsingAlias(BookPeer::TITLE, 'bar'); - $c2 = new ModelCriteria('bookstore', 'Book'); - $c2->add(BookPeer::TITLE, 'foo'); - $c2->addAnd(BookPeer::TITLE, 'bar'); - $this->assertEquals($c2, $c1, 'addUsingalias() translates to addAnd() when the table already has a condition on the column'); - } - - public function testAddUsingAliasTrueAliasTwice() - { - $c1 = new ModelCriteria('bookstore', 'Book'); - $c1->setModelAlias('b', true); - $c1->addUsingAlias(BookPeer::TITLE, 'foo'); - $c1->addUsingAlias(BookPeer::TITLE, 'bar'); - $c2 = new ModelCriteria('bookstore', 'Book'); - $c2->setModelAlias('b', true); - $c2->add('b.TITLE', 'foo'); - $c2->addAnd('b.TITLE', 'bar'); - $this->assertEquals($c2, $c1, 'addUsingalias() translates to addAnd() when the table already has a condition on the column'); - } - - public function testClone() - { - $bookQuery1 = BookQuery::create() - ->filterByPrice(1); - $bookQuery2 = clone $bookQuery1; - $bookQuery2 - ->filterByPrice(2); - $params = array(); - $sql = BasePeer::createSelectSql($bookQuery1, $params); - $this->assertEquals('SELECT FROM `book` WHERE book.PRICE=:p1', $sql, 'conditions applied on a cloned query don\'t get applied on the original query'); - } -} - -class TestableModelCriteria extends ModelCriteria -{ - public $joins = array(); - - public function replaceNames(&$clause) - { - return parent::replaceNames($clause); - } - -} - -class ModelCriteriaForUseQuery extends ModelCriteria -{ - public function __construct($dbName = 'bookstore', $modelName = 'Author', $modelAlias = null) - { - parent::__construct($dbName, $modelName, $modelAlias); - } - - public function withNoName() - { - return $this - ->filterBy('FirstName', null, Criteria::ISNOTNULL) - ->where($this->getModelAliasOrName() . '.LastName IS NOT NULL'); - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/query/ModelJoinTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/query/ModelJoinTest.php deleted file mode 100644 index afc89ff6d8..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/query/ModelJoinTest.php +++ /dev/null @@ -1,85 +0,0 @@ -assertNull($join->getTableMap(), 'getTableMap() returns null as long as no table map is set'); - - $tmap = new TableMap(); - $tmap->foo = 'bar'; - - $join->setTableMap($tmap); - $this->assertEquals($tmap, $join->getTableMap(), 'getTableMap() returns the TableMap previously set by setTableMap()'); - } - - public function testSetRelationMap() - { - $join = new ModelJoin(); - $this->assertNull($join->getRelationMap(), 'getRelationMap() returns null as long as no relation map is set'); - $bookTable = BookPeer::getTableMap(); - $relationMap = $bookTable->getRelation('Author'); - $join->setRelationMap($relationMap); - $this->assertEquals($relationMap, $join->getRelationMap(), 'getRelationMap() returns the RelationMap previously set by setRelationMap()'); - } - - public function testSetRelationMapDefinesJoinColumns() - { - $bookTable = BookPeer::getTableMap(); - $join = new ModelJoin(); - $join->setTableMap($bookTable); - $join->setRelationMap($bookTable->getRelation('Author')); - $this->assertEquals(array(BookPeer::AUTHOR_ID), $join->getLeftColumns(), 'setRelationMap() automatically sets the left columns'); - $this->assertEquals(array(AuthorPeer::ID), $join->getRightColumns(), 'setRelationMap() automatically sets the right columns'); - } - - public function testSetRelationMapLeftAlias() - { - $bookTable = BookPeer::getTableMap(); - $join = new ModelJoin(); - $join->setTableMap($bookTable); - $join->setRelationMap($bookTable->getRelation('Author'), 'b'); - $this->assertEquals(array('b.AUTHOR_ID'), $join->getLeftColumns(), 'setRelationMap() automatically sets the left columns using the left table alias'); - $this->assertEquals(array(AuthorPeer::ID), $join->getRightColumns(), 'setRelationMap() automatically sets the right columns'); - } - - public function testSetRelationMapRightAlias() - { - $bookTable = BookPeer::getTableMap(); - $join = new ModelJoin(); - $join->setTableMap($bookTable); - $join->setRelationMap($bookTable->getRelation('Author'), null, 'a'); - $this->assertEquals(array(BookPeer::AUTHOR_ID), $join->getLeftColumns(), 'setRelationMap() automatically sets the left columns'); - $this->assertEquals(array('a.ID'), $join->getRightColumns(), 'setRelationMap() automatically sets the right columns using the right table alias'); - } - - public function testSetRelationMapComposite() - { - $table = ReaderFavoritePeer::getTableMap(); - $join = new ModelJoin(); - $join->setTableMap($table); - $join->setRelationMap($table->getRelation('BookOpinion')); - $this->assertEquals(array(ReaderFavoritePeer::BOOK_ID, ReaderFavoritePeer::READER_ID), $join->getLeftColumns(), 'setRelationMap() automatically sets the left columns for composite relationships'); - $this->assertEquals(array(BookOpinionPeer::BOOK_ID, BookOpinionPeer::READER_ID), $join->getRightColumns(), 'setRelationMap() automatically sets the right columns for composite relationships'); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/query/ModelWithTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/query/ModelWithTest.php deleted file mode 100644 index ffe5e8fe67..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/query/ModelWithTest.php +++ /dev/null @@ -1,183 +0,0 @@ -joinAuthor(); - $joins = $q->getJoins(); - $join = $joins['Author']; - $with = new ModelWith($join); - $this->assertEquals($with->getModelName(), 'Author', 'A ModelWith computes the model name from the join'); - $this->assertEquals($with->getModelPeerName(), 'AuthorPeer', 'A ModelWith computes the model peer name from the join'); - } - - public function testModelNameOneToMany() - { - $q = AuthorQuery::create() - ->joinBook(); - $joins = $q->getJoins(); - $join = $joins['Book']; - $with = new ModelWith($join); - $this->assertEquals($with->getModelName(), 'Book', 'A ModelWith computes the model peer name from the join'); - $this->assertEquals($with->getModelPeerName(), 'BookPeer', 'A ModelWith computes the model peer name from the join'); - } - - public function testModelNameAlias() - { - $q = BookQuery::create() - ->joinAuthor('a'); - $joins = $q->getJoins(); - $join = $joins['a']; - $with = new ModelWith($join); - $this->assertEquals($with->getModelName(), 'Author', 'A ModelWith computes the model peer name from the join'); - $this->assertEquals($with->getModelPeerName(), 'AuthorPeer', 'A ModelWith computes the model peer name from the join'); - } - - public function testRelationManyToOne() - { - $q = BookQuery::create() - ->joinAuthor(); - $joins = $q->getJoins(); - $join = $joins['Author']; - $with = new ModelWith($join); - $this->assertEquals($with->getRelationMethod(), 'setAuthor', 'A ModelWith computes the relation method from the join'); - $this->assertEquals($with->getRelationName(), 'Author', 'A ModelWith computes the relation name from the join'); - $this->assertFalse($with->isAdd(), 'A ModelWith computes the relation cardinality from the join'); - } - - public function testRelationOneToMany() - { - $q = AuthorQuery::create() - ->joinBook(); - $joins = $q->getJoins(); - $join = $joins['Book']; - $with = new ModelWith($join); - $this->assertEquals($with->getRelationMethod(), 'addBook', 'A ModelWith computes the relation method from the join'); - $this->assertEquals($with->getRelationName(), 'Books', 'A ModelWith computes the relation name from the join'); - $this->assertTrue($with->isAdd(), 'A ModelWith computes the relation cardinality from the join'); - } - - public function testRelationOneToOne() - { - $q = BookstoreEmployeeQuery::create() - ->joinBookstoreEmployeeAccount(); - $joins = $q->getJoins(); - $join = $joins['BookstoreEmployeeAccount']; - $with = new ModelWith($join); - $this->assertEquals($with->getRelationMethod(), 'setBookstoreEmployeeAccount', 'A ModelWith computes the relation method from the join'); - $this->assertEquals($with->getRelationName(), 'BookstoreEmployeeAccount', 'A ModelWith computes the relation name from the join'); - $this->assertFalse($with->isAdd(), 'A ModelWith computes the relation cardinality from the join'); - } - - public function testIsPrimary() - { - $q = AuthorQuery::create() - ->joinBook(); - $joins = $q->getJoins(); - $join = $joins['Book']; - $with = new ModelWith($join); - $this->assertTrue($with->isPrimary(), 'A ModelWith initialized from a primary join is primary'); - - $q = BookQuery::create() - ->joinAuthor() - ->joinReview(); - $joins = $q->getJoins(); - $join = $joins['Review']; - $with = new ModelWith($join); - $this->assertTrue($with->isPrimary(), 'A ModelWith initialized from a primary join is primary'); - - $q = AuthorQuery::create() - ->join('Author.Book') - ->join('Book.Publisher'); - $joins = $q->getJoins(); - $join = $joins['Publisher']; - $with = new ModelWith($join); - $this->assertFalse($with->isPrimary(), 'A ModelWith initialized from a non-primary join is not primary'); - } - - public function testGetRelatedClass() - { - $q = AuthorQuery::create() - ->joinBook(); - $joins = $q->getJoins(); - $join = $joins['Book']; - $with = new ModelWith($join); - $this->assertNull($with->getRelatedClass(), 'A ModelWith initialized from a primary join has a null related class'); - - $q = AuthorQuery::create('a') - ->joinBook(); - $joins = $q->getJoins(); - $join = $joins['Book']; - $with = new ModelWith($join); - $this->assertNull($with->getRelatedClass(), 'A ModelWith initialized from a primary join with alias has a null related class'); - - $q = AuthorQuery::create() - ->joinBook('b'); - $joins = $q->getJoins(); - $join = $joins['b']; - $with = new ModelWith($join); - $this->assertNull($with->getRelatedClass(), 'A ModelWith initialized from a primary join with alias has a null related class'); - - $q = AuthorQuery::create() - ->join('Author.Book') - ->join('Book.Publisher'); - $joins = $q->getJoins(); - $join = $joins['Publisher']; - $with = new ModelWith($join); - $this->assertEquals($with->getRelatedClass(), 'Book', 'A ModelWith uses the previous join relation name as related class'); - - $q = ReviewQuery::create() - ->join('Review.Book') - ->join('Book.Author') - ->join('Book.Publisher'); - $joins = $q->getJoins(); - $join = $joins['Publisher']; - $with = new ModelWith($join); - $this->assertEquals($with->getRelatedClass(), 'Book', 'A ModelWith uses the previous join relation name as related class'); - - $q = ReviewQuery::create() - ->join('Review.Book') - ->join('Book.BookOpinion') - ->join('BookOpinion.BookReader'); - $joins = $q->getJoins(); - $join = $joins['BookOpinion']; - $with = new ModelWith($join); - $this->assertEquals($with->getRelatedClass(), 'Book', 'A ModelWith uses the previous join relation name as related class'); - $join = $joins['BookReader']; - $with = new ModelWith($join); - $this->assertEquals($with->getRelatedClass(), 'BookOpinion', 'A ModelWith uses the previous join relation name as related class'); - - $q = BookReaderQuery::create() - ->join('BookReader.BookOpinion') - ->join('BookOpinion.Book') - ->join('Book.Author'); - $joins = $q->getJoins(); - $join = $joins['Book']; - $with = new ModelWith($join); - $this->assertEquals($with->getRelatedClass(), 'BookOpinion', 'A ModelWith uses the previous join relation name as related class'); - $join = $joins['Author']; - $with = new ModelWith($join); - $this->assertEquals($with->getRelatedClass(), 'Book', 'A ModelWith uses the previous join relation name as related class'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/query/PropelQueryTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/query/PropelQueryTest.php deleted file mode 100644 index 5ef619da19..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/query/PropelQueryTest.php +++ /dev/null @@ -1,63 +0,0 @@ -assertEquals($expected, $q, 'from() returns a Model query instance based on the model name'); - - $q = PropelQuery::from('Book b'); - $expected = new BookQuery(); - $expected->setModelAlias('b'); - $this->assertEquals($expected, $q, 'from() sets the model alias if found after the blank'); - - $q = PropelQuery::from('myBook'); - $expected = new myBookQuery(); - $this->assertEquals($expected, $q, 'from() can find custom query classes'); - - try { - $q = PropelQuery::from('Foo'); - $this->fail('PropelQuery::from() throws an exception when called on a non-existing query class'); - } catch (PropelException $e) { - $this->assertTrue(true, 'PropelQuery::from() throws an exception when called on a non-existing query class'); - } - } - - public function testQuery() - { - BookstoreDataPopulator::depopulate(); - BookstoreDataPopulator::populate(); - - $book = PropelQuery::from('Book b') - ->where('b.Title like ?', 'Don%') - ->orderBy('b.ISBN', 'desc') - ->findOne(); - $this->assertTrue($book instanceof Book); - $this->assertEquals('Don Juan', $book->getTitle()); - - } -} - -class myBookQuery extends BookQuery -{ -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/util/BasePeerExceptionsTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/util/BasePeerExceptionsTest.php deleted file mode 100644 index e3d56f2a6d..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/util/BasePeerExceptionsTest.php +++ /dev/null @@ -1,94 +0,0 @@ -add(BookPeer::ID, 12, ' BAD SQL'); - BookPeer::addSelectColumns($c); - BasePeer::doSelect($c); - } catch (PropelException $e) { - $this->assertContains('[SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.ID BAD SQL:p1]', $e->getMessage(), 'SQL query is written in the exception message'); - } - } - - public function testDoCount() - { - try { - $c = new Criteria(); - $c->add(BookPeer::ID, 12, ' BAD SQL'); - BookPeer::addSelectColumns($c); - BasePeer::doCount($c); - } catch (PropelException $e) { - $this->assertContains('[SELECT COUNT(*) FROM `book` WHERE book.ID BAD SQL:p1]', $e->getMessage(), 'SQL query is written in the exception message'); - } - } - - public function testDoDelete() - { - try { - $c = new Criteria(); - $c->setPrimaryTableName(BookPeer::TABLE_NAME); - $c->add(BookPeer::ID, 12, ' BAD SQL'); - BasePeer::doDelete($c, Propel::getConnection()); - } catch (PropelException $e) { - $this->assertContains('[DELETE FROM `book` WHERE book.ID BAD SQL:p1]', $e->getMessage(), 'SQL query is written in the exception message'); - } - } - - public function testDoDeleteAll() - { - try { - BasePeer::doDeleteAll('BAD TABLE', Propel::getConnection()); - } catch (PropelException $e) { - $this->assertContains('[DELETE FROM `BAD` `TABLE`]', $e->getMessage(), 'SQL query is written in the exception message'); - } - } - - public function testDoUpdate() - { - try { - $c1 = new Criteria(); - $c1->setPrimaryTableName(BookPeer::TABLE_NAME); - $c1->add(BookPeer::ID, 12, ' BAD SQL'); - $c2 = new Criteria(); - $c2->add(BookPeer::TITLE, 'Foo'); - BasePeer::doUpdate($c1, $c2, Propel::getConnection()); - } catch (PropelException $e) { - $this->assertContains('[UPDATE `book` SET `TITLE`=:p1 WHERE book.ID BAD SQL:p2]', $e->getMessage(), 'SQL query is written in the exception message'); - } - } - - public function testDoInsert() - { - try { - $c = new Criteria(); - $c->setPrimaryTableName(BookPeer::TABLE_NAME); - $c->add(BookPeer::AUTHOR_ID, 'lkhlkhj'); - BasePeer::doInsert($c, Propel::getConnection()); - } catch (PropelException $e) { - $this->assertContains('[INSERT INTO `book` (`AUTHOR_ID`) VALUES (:p1)]', $e->getMessage(), 'SQL query is written in the exception message'); - } - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/util/BasePeerTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/util/BasePeerTest.php deleted file mode 100644 index cb8772ee56..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/util/BasePeerTest.php +++ /dev/null @@ -1,413 +0,0 @@ - - * @package runtime.util - */ -class BasePeerTest extends BookstoreTestBase -{ - - /** - * @link http://propel.phpdb.org/trac/ticket/425 - */ - public function testMultipleFunctionInCriteria() - { - $db = Propel::getDB(BookPeer::DATABASE_NAME); - try { - $c = new Criteria(); - $c->setDistinct(); - if ($db instanceof DBPostgres) { - $c->addSelectColumn("substring(".BookPeer::TITLE." from position('Potter' in ".BookPeer::TITLE.")) AS col"); - } else { - $this->markTestSkipped(); - } - $stmt = BookPeer::doSelectStmt( $c ); - } catch (PropelException $x) { - $this->fail("Paring of nested functions failed: " . $x->getMessage()); - } - } - - public function testNeedsSelectAliases() - { - $c = new Criteria(); - $this->assertFalse(BasePeer::needsSelectAliases($c), 'Empty Criterias dont need aliases'); - - $c = new Criteria(); - $c->addSelectColumn(BookPeer::ID); - $c->addSelectColumn(BookPeer::TITLE); - $this->assertFalse(BasePeer::needsSelectAliases($c), 'Criterias with distinct column names dont need aliases'); - - $c = new Criteria(); - BookPeer::addSelectColumns($c); - $this->assertFalse(BasePeer::needsSelectAliases($c), 'Criterias with only the columns of a model dont need aliases'); - - $c = new Criteria(); - $c->addSelectColumn(BookPeer::ID); - $c->addSelectColumn(AuthorPeer::ID); - $this->assertTrue(BasePeer::needsSelectAliases($c), 'Criterias with common column names do need aliases'); - } - - public function testTurnSelectColumnsToAliases() - { - $c1 = new Criteria(); - $c1->addSelectColumn(BookPeer::ID); - BasePeer::turnSelectColumnsToAliases($c1); - - $c2 = new Criteria(); - $c2->addAsColumn('book_ID', BookPeer::ID); - $this->assertTrue($c1->equals($c2)); - } - - public function testTurnSelectColumnsToAliasesPreservesAliases() - { - $c1 = new Criteria(); - $c1->addSelectColumn(BookPeer::ID); - $c1->addAsColumn('foo', BookPeer::TITLE); - BasePeer::turnSelectColumnsToAliases($c1); - - $c2 = new Criteria(); - $c2->addAsColumn('book_ID', BookPeer::ID); - $c2->addAsColumn('foo', BookPeer::TITLE); - $this->assertTrue($c1->equals($c2)); - } - - public function testTurnSelectColumnsToAliasesExisting() - { - $c1 = new Criteria(); - $c1->addSelectColumn(BookPeer::ID); - $c1->addAsColumn('book_ID', BookPeer::ID); - BasePeer::turnSelectColumnsToAliases($c1); - - $c2 = new Criteria(); - $c2->addAsColumn('book_ID_1', BookPeer::ID); - $c2->addAsColumn('book_ID', BookPeer::ID); - $this->assertTrue($c1->equals($c2)); - } - - public function testTurnSelectColumnsToAliasesDuplicate() - { - $c1 = new Criteria(); - $c1->addSelectColumn(BookPeer::ID); - $c1->addSelectColumn(BookPeer::ID); - BasePeer::turnSelectColumnsToAliases($c1); - - $c2 = new Criteria(); - $c2->addAsColumn('book_ID', BookPeer::ID); - $c2->addAsColumn('book_ID_1', BookPeer::ID); - $this->assertTrue($c1->equals($c2)); - } - - public function testDoCountDuplicateColumnName() - { - $con = Propel::getConnection(); - $c = new Criteria(); - $c->addSelectColumn(BookPeer::ID); - $c->addJoin(BookPeer::AUTHOR_ID, AuthorPeer::ID); - $c->addSelectColumn(AuthorPeer::ID); - $c->setLimit(3); - try { - $count = BasePeer::doCount($c, $con); - } catch (Exception $e) { - $this->fail('doCount() cannot deal with a criteria selecting duplicate column names '); - } - } - - public function testCreateSelectSqlPart() - { - $c = new Criteria(); - $c->addSelectColumn(BookPeer::ID); - $c->addAsColumn('book_ID', BookPeer::ID); - $fromClause = array(); - $selectSql = BasePeer::createSelectSqlPart($c, $fromClause); - $this->assertEquals('SELECT book.ID, book.ID AS book_ID', $selectSql, 'createSelectSqlPart() returns a SQL SELECT clause with both select and as columns'); - $this->assertEquals(array('book'), $fromClause, 'createSelectSqlPart() adds the tables from the select columns to the from clause'); - } - - public function testCreateSelectSqlPartSelectModifier() - { - $c = new Criteria(); - $c->addSelectColumn(BookPeer::ID); - $c->addAsColumn('book_ID', BookPeer::ID); - $c->setDistinct(); - $fromClause = array(); - $selectSql = BasePeer::createSelectSqlPart($c, $fromClause); - $this->assertEquals('SELECT DISTINCT book.ID, book.ID AS book_ID', $selectSql, 'createSelectSqlPart() includes the select modifiers in the SELECT clause'); - $this->assertEquals(array('book'), $fromClause, 'createSelectSqlPart() adds the tables from the select columns to the from clause'); - } - - public function testCreateSelectSqlPartAliasAll() - { - $c = new Criteria(); - $c->addSelectColumn(BookPeer::ID); - $c->addAsColumn('book_ID', BookPeer::ID); - $fromClause = array(); - $selectSql = BasePeer::createSelectSqlPart($c, $fromClause, true); - $this->assertEquals('SELECT book.ID AS book_ID_1, book.ID AS book_ID', $selectSql, 'createSelectSqlPart() aliases all columns if passed true as last parameter'); - $this->assertEquals(array(), $fromClause, 'createSelectSqlPart() does not add the tables from an all-aliased list of select columns'); - } - - public function testBigIntIgnoreCaseOrderBy() - { - BookstorePeer::doDeleteAll(); - - // Some sample data - $b = new Bookstore(); - $b->setStoreName("SortTest1")->setPopulationServed(2000)->save(); - - $b = new Bookstore(); - $b->setStoreName("SortTest2")->setPopulationServed(201)->save(); - - $b = new Bookstore(); - $b->setStoreName("SortTest3")->setPopulationServed(302)->save(); - - $b = new Bookstore(); - $b->setStoreName("SortTest4")->setPopulationServed(10000000)->save(); - - $c = new Criteria(); - $c->setIgnoreCase(true); - $c->add(BookstorePeer::STORE_NAME, 'SortTest%', Criteria::LIKE); - $c->addAscendingOrderByColumn(BookstorePeer::POPULATION_SERVED); - - $rows = BookstorePeer::doSelect($c); - $this->assertEquals('SortTest2', $rows[0]->getStoreName()); - $this->assertEquals('SortTest3', $rows[1]->getStoreName()); - $this->assertEquals('SortTest1', $rows[2]->getStoreName()); - $this->assertEquals('SortTest4', $rows[3]->getStoreName()); - } - - /** - * - */ - public function testMixedJoinOrder() - { - $this->markTestSkipped('Famous cross join problem, to be solved one day'); - $c = new Criteria(BookPeer::DATABASE_NAME); - $c->addSelectColumn(BookPeer::ID); - $c->addSelectColumn(BookPeer::TITLE); - - $c->addJoin(BookPeer::PUBLISHER_ID, PublisherPeer::ID, Criteria::LEFT_JOIN); - $c->addJoin(BookPeer::AUTHOR_ID, AuthorPeer::ID); - - $params = array(); - $sql = BasePeer::createSelectSql($c, $params); - - $expectedSql = "SELECT book.ID, book.TITLE FROM book LEFT JOIN publisher ON (book.PUBLISHER_ID=publisher.ID), author WHERE book.AUTHOR_ID=author.ID"; - $this->assertEquals($expectedSql, $sql); - } - - public function testMssqlApplyLimitNoOffset() - { - $db = Propel::getDB(BookPeer::DATABASE_NAME); - if(! ($db instanceof DBMSSQL)) - { - $this->markTestSkipped(); - } - - $c = new Criteria(BookPeer::DATABASE_NAME); - $c->addSelectColumn(BookPeer::ID); - $c->addSelectColumn(BookPeer::TITLE); - $c->addSelectColumn(PublisherPeer::NAME); - $c->addAsColumn('PublisherName','(SELECT MAX(publisher.NAME) FROM publisher WHERE publisher.ID = book.PUBLISHER_ID)'); - - $c->addJoin(BookPeer::PUBLISHER_ID, PublisherPeer::ID, Criteria::LEFT_JOIN); - - $c->setOffset(0); - $c->setLimit(20); - - $params = array(); - $sql = BasePeer::createSelectSql($c, $params); - - $expectedSql = "SELECT TOP 20 book.ID, book.TITLE, publisher.NAME, (SELECT MAX(publisher.NAME) FROM publisher WHERE publisher.ID = book.PUBLISHER_ID) AS PublisherName FROM book LEFT JOIN publisher ON (book.PUBLISHER_ID=publisher.ID)"; - $this->assertEquals($expectedSql, $sql); - } - - public function testMssqlApplyLimitWithOffset() - { - $db = Propel::getDB(BookPeer::DATABASE_NAME); - if(! ($db instanceof DBMSSQL)) - { - $this->markTestSkipped(); - } - - $c = new Criteria(BookPeer::DATABASE_NAME); - $c->addSelectColumn(BookPeer::ID); - $c->addSelectColumn(BookPeer::TITLE); - $c->addSelectColumn(PublisherPeer::NAME); - $c->addAsColumn('PublisherName','(SELECT MAX(publisher.NAME) FROM publisher WHERE publisher.ID = book.PUBLISHER_ID)'); - $c->addJoin(BookPeer::PUBLISHER_ID, PublisherPeer::ID, Criteria::LEFT_JOIN); - $c->setOffset(20); - $c->setLimit(20); - - $params = array(); - - $expectedSql = "SELECT [book.ID], [book.TITLE], [publisher.NAME], [PublisherName] FROM (SELECT ROW_NUMBER() OVER(ORDER BY book.ID) AS RowNumber, book.ID AS [book.ID], book.TITLE AS [book.TITLE], publisher.NAME AS [publisher.NAME], (SELECT MAX(publisher.NAME) FROM publisher WHERE publisher.ID = book.PUBLISHER_ID) AS [PublisherName] FROM book LEFT JOIN publisher ON (book.PUBLISHER_ID=publisher.ID)) AS derivedb WHERE RowNumber BETWEEN 21 AND 40"; - $sql = BasePeer::createSelectSql($c, $params); - $this->assertEquals($expectedSql, $sql); - } - - public function testMssqlApplyLimitWithOffsetOrderByAggregate() - { - $db = Propel::getDB(BookPeer::DATABASE_NAME); - if(! ($db instanceof DBMSSQL)) - { - $this->markTestSkipped(); - } - - $c = new Criteria(BookPeer::DATABASE_NAME); - $c->addSelectColumn(BookPeer::ID); - $c->addSelectColumn(BookPeer::TITLE); - $c->addSelectColumn(PublisherPeer::NAME); - $c->addAsColumn('PublisherName','(SELECT MAX(publisher.NAME) FROM publisher WHERE publisher.ID = book.PUBLISHER_ID)'); - $c->addJoin(BookPeer::PUBLISHER_ID, PublisherPeer::ID, Criteria::LEFT_JOIN); - $c->addDescendingOrderByColumn('PublisherName'); - $c->setOffset(20); - $c->setLimit(20); - - $params = array(); - - $expectedSql = "SELECT [book.ID], [book.TITLE], [publisher.NAME], [PublisherName] FROM (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT MAX(publisher.NAME) FROM publisher WHERE publisher.ID = book.PUBLISHER_ID) DESC) AS RowNumber, book.ID AS [book.ID], book.TITLE AS [book.TITLE], publisher.NAME AS [publisher.NAME], (SELECT MAX(publisher.NAME) FROM publisher WHERE publisher.ID = book.PUBLISHER_ID) AS [PublisherName] FROM book LEFT JOIN publisher ON (book.PUBLISHER_ID=publisher.ID)) AS derivedb WHERE RowNumber BETWEEN 21 AND 40"; - $sql = BasePeer::createSelectSql($c, $params); - $this->assertEquals($expectedSql, $sql); - } - - public function testMssqlApplyLimitWithOffsetMultipleOrderBy() - { - $db = Propel::getDB(BookPeer::DATABASE_NAME); - if(! ($db instanceof DBMSSQL)) - { - $this->markTestSkipped(); - } - - $c = new Criteria(BookPeer::DATABASE_NAME); - $c->addSelectColumn(BookPeer::ID); - $c->addSelectColumn(BookPeer::TITLE); - $c->addSelectColumn(PublisherPeer::NAME); - $c->addAsColumn('PublisherName','(SELECT MAX(publisher.NAME) FROM publisher WHERE publisher.ID = book.PUBLISHER_ID)'); - $c->addJoin(BookPeer::PUBLISHER_ID, PublisherPeer::ID, Criteria::LEFT_JOIN); - $c->addDescendingOrderByColumn('PublisherName'); - $c->addAscendingOrderByColumn(BookPeer::TITLE); - $c->setOffset(20); - $c->setLimit(20); - - $params = array(); - - $expectedSql = "SELECT [book.ID], [book.TITLE], [publisher.NAME], [PublisherName] FROM (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT MAX(publisher.NAME) FROM publisher WHERE publisher.ID = book.PUBLISHER_ID) DESC, book.TITLE ASC) AS RowNumber, book.ID AS [book.ID], book.TITLE AS [book.TITLE], publisher.NAME AS [publisher.NAME], (SELECT MAX(publisher.NAME) FROM publisher WHERE publisher.ID = book.PUBLISHER_ID) AS [PublisherName] FROM book LEFT JOIN publisher ON (book.PUBLISHER_ID=publisher.ID)) AS derivedb WHERE RowNumber BETWEEN 21 AND 40"; - $sql = BasePeer::createSelectSql($c, $params); - $this->assertEquals($expectedSql, $sql); - } - - /** - * @expectedException PropelException - */ - public function testDoDeleteNoCondition() - { - $con = Propel::getConnection(); - $c = new Criteria(BookPeer::DATABASE_NAME); - BasePeer::doDelete($c, $con); - } - - public function testDoDeleteSimpleCondition() - { - $con = Propel::getConnection(); - $c = new Criteria(BookPeer::DATABASE_NAME); - $c->add(BookPeer::TITLE, 'War And Peace'); - BasePeer::doDelete($c, $con); - $expectedSQL = "DELETE FROM `book` WHERE book.TITLE='War And Peace'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'doDelete() translates a contition into a WHERE'); - } - - public function testDoDeleteSeveralConditions() - { - $con = Propel::getConnection(); - $c = new Criteria(BookPeer::DATABASE_NAME); - $c->add(BookPeer::TITLE, 'War And Peace'); - $c->add(BookPeer::ID, 12); - BasePeer::doDelete($c, $con); - $expectedSQL = "DELETE FROM `book` WHERE book.TITLE='War And Peace' AND book.ID=12"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'doDelete() combines conditions in WHERE whith an AND'); - } - - public function testDoDeleteTableAlias() - { - $con = Propel::getConnection(); - $c = new Criteria(BookPeer::DATABASE_NAME); - $c->addAlias('b', BookPeer::TABLE_NAME); - $c->add('b.TITLE', 'War And Peace'); - BasePeer::doDelete($c, $con); - $expectedSQL = "DELETE b FROM `book` AS b WHERE b.TITLE='War And Peace'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'doDelete() accepts a Criteria with a table alias'); - } - - /** - * Not documented anywhere, and probably wrong - * @see http://www.propelorm.org/ticket/952 - */ - public function testDoDeleteSeveralTables() - { - $con = Propel::getConnection(); - $count = $con->getQueryCount(); - $c = new Criteria(BookPeer::DATABASE_NAME); - $c->add(BookPeer::TITLE, 'War And Peace'); - $c->add(AuthorPeer::FIRST_NAME, 'Leo'); - BasePeer::doDelete($c, $con); - $expectedSQL = "DELETE FROM `author` WHERE author.FIRST_NAME='Leo'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'doDelete() issues two DELETE queries when passed conditions on two tables'); - $this->assertEquals($count + 2, $con->getQueryCount(), 'doDelete() issues two DELETE queries when passed conditions on two tables'); - - $c = new Criteria(BookPeer::DATABASE_NAME); - $c->add(AuthorPeer::FIRST_NAME, 'Leo'); - $c->add(BookPeer::TITLE, 'War And Peace'); - BasePeer::doDelete($c, $con); - $expectedSQL = "DELETE FROM `book` WHERE book.TITLE='War And Peace'"; - $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'doDelete() issues two DELETE queries when passed conditions on two tables'); - $this->assertEquals($count + 4, $con->getQueryCount(), 'doDelete() issues two DELETE queries when passed conditions on two tables'); - } - - public function testCommentDoSelect() - { - $c = new Criteria(); - $c->setComment('Foo'); - $c->addSelectColumn(BookPeer::ID); - $expected = 'SELECT /* Foo */ book.ID FROM `book`'; - $params = array(); - $this->assertEquals($expected, BasePeer::createSelectSQL($c, $params), 'Criteria::setComment() adds a comment to select queries'); - } - - public function testCommentDoUpdate() - { - $c1 = new Criteria(); - $c1->setPrimaryTableName(BookPeer::TABLE_NAME); - $c1->setComment('Foo'); - $c2 = new Criteria(); - $c2->add(BookPeer::TITLE, 'Updated Title'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - BasePeer::doUpdate($c1, $c2, $con); - $expected = 'UPDATE /* Foo */ `book` SET `TITLE`=\'Updated Title\''; - $this->assertEquals($expected, $con->getLastExecutedQuery(), 'Criteria::setComment() adds a comment to update queries'); - } - - public function testCommentDoDelete() - { - $c = new Criteria(); - $c->setComment('Foo'); - $c->add(BookPeer::TITLE, 'War And Peace'); - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - BasePeer::doDelete($c, $con); - $expected = 'DELETE /* Foo */ FROM `book` WHERE book.TITLE=\'War And Peace\''; - $this->assertEquals($expected, $con->getLastExecutedQuery(), 'Criteria::setComment() adds a comment to delete queries'); - } - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/util/PropelConfigurationTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/util/PropelConfigurationTest.php deleted file mode 100644 index d653f33184..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/util/PropelConfigurationTest.php +++ /dev/null @@ -1,69 +0,0 @@ - array('fooo' => 'bar', 'fi' => array('fooooo' => 'bara')), 'baz' => 'bar2'); - - public function testConstruct() - { - $conf = new PropelConfiguration($this->testArray); - $this->assertEquals($this->testArray, $conf->getParameters(), 'constructor sets values from an associative array'); - } - - public function testGetParameters() - { - $conf = new PropelConfiguration($this->testArray); - $expected = array('foo.fooo' => 'bar', 'foo.fi.fooooo' => 'bara', 'baz' => 'bar2'); - $this->assertEquals($expected, $conf->getParameters(PropelConfiguration::TYPE_ARRAY_FLAT), 'getParameters can return a flat array'); - } - - public function testGetParameter() - { - $conf = new PropelConfiguration($this->testArray); - $this->assertEquals('bar', $conf->getParameter('foo.fooo'), 'getParameter accepts a flat key'); - $this->assertEquals('bara', $conf->getParameter('foo.fi.fooooo'), 'getParameter accepts a flat key'); - $this->assertEquals('bar2', $conf->getParameter('baz'), 'getParameter accepts a flat key'); - } - - public function testGetParameterDefault() - { - $conf = new PropelConfiguration($this->testArray); - $this->assertEquals('bar', $conf->getParameter('foo.fooo'), 'getParameter accepts a flat key'); - $this->assertEquals('', $conf->getParameter('foo.fooo2'), 'getParameter returns null for nonexistent keys'); - $this->assertEquals('babar', $conf->getParameter('foo.fooo3', 'babar'), 'getParameter accepts a default value'); - } - - public function testSetParameter() - { - $conf = new PropelConfiguration(array()); - $conf->setParameter('foo.fooo', 'bar'); - $conf->setParameter('foo.fi.fooooo', 'bara'); - $conf->setParameter('baz', 'bar2'); - $this->assertEquals($this->testArray, $conf->getParameters(), 'setParameter accepts a flat array'); - } - - public function testArrayAccess() - { - $conf = new PropelConfiguration($this->testArray); - $expected = array('fooo' => 'bar', 'fi' => array('fooooo' => 'bara')); - $this->assertEquals($expected, $conf['foo'], 'PropelConfiguration implements ArrayAccess for OffsetGet'); - $this->assertEquals('bar', $conf['foo']['fooo'], 'Array access allows deep access'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/util/PropelDateTimeTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/util/PropelDateTimeTest.php deleted file mode 100644 index af490e0e46..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/util/PropelDateTimeTest.php +++ /dev/null @@ -1,139 +0,0 @@ -assertEquals($dt1->format('Y-m-d H:i:s'), $dt1->format('Y-m-d H:i:s'), sprintf($msg, "Dates w/ no timezone resolution were not the same.")); - $this->assertEquals($dt1->getTimeZone()->getName(), $dt2->getTimeZone()->getName(), sprintf($msg, "timezones were not the same.")); - - - // We do this last, because a PHP bug will make this true while the dates - // may not truly be equal. - // See: http://bugs.php.net/bug.php?id=40743 - $this->assertTrue($dt1 == $dt2, sprintf($msg, "dates did not pass equality check (==).")); - } - - /** - * Assert that two dates are equal. - */ - protected function assertDatesEqual(DateTime $dt1, DateTime $dt2, $msg = "Expected DateTime1 == DateTime2: %s") - { - if ($dt1 != $dt2) { - if ($dt1->getTimeZone()->getName() != $dt2->getTimeZone()->getName()) { - $this->fail(sprintf($msg, "Timezones were not the same.")); - } else { - $this->fail(sprintf($msg, "Timezones were the same, but date values were different.")); - } - } - } - - /** - * Assert that two dates are not equal. - */ - protected function assertDatesNotEqual(DateTime $dt1, DateTime $dt2, $msg = "Expected DateTime1 != DateTime2: %s") - { - $this->assertTrue($dt1 != $dt2, $msg); - } - - /** - * Ensure that our constructor matches DateTime constructor signature. - */ - public function testConstruct() - { - - // Because of a PHP bug () - // we cannot use a timestamp format that includes a timezone. It gets weird. :) - $now = date('Y-m-d H:i:s'); - - $dt = new DateTime($now); - $pdt = new PropelDateTime($now); - $this->assertDatesEqual($dt, $pdt, "Expected DateTime == PropelDateTime: %s"); - - $dt = new DateTime($now, new DateTimeZone('UTC')); - $pdt = new PropelDateTime($now, new DateTimeZone('America/New_York')); - $this->assertDatesNotEqual($dt, $pdt, "Expected DateTime != PropelDateTime: %s"); - - } - - /** - * Tests the ability to serialize() a PropelDateTime object. - */ - public function testSerialize_NoTZ() - { - $now = date('Y-m-d H:i:s'); - $dt = new DateTime($now); - $pdt = new PropelDateTime($now); - - $this->assertDatesIdentical($dt, $pdt); - - // We expect these to be the same -- there's no time zone info - $ser = serialize($pdt); - unset($pdt); - - $pdt = unserialize($ser); - $this->assertDatesIdentical($dt, $pdt); - } - - /** - * Tests the ability to serialize() a PropelDateTime object. - */ - public function testSerialize_SameTZ() - { - $now = date('Y-m-d H:i:s'); - $dt = new DateTime($now, new DateTimeZone('America/New_York')); - $pdt = new PropelDateTime($now, new DateTimeZone('America/New_York')); - - $this->assertDatesIdentical($dt, $pdt); - - // We expect these to be the same -- there's no time zone info - $ser = serialize($pdt); - unset($pdt); - - $pdt = unserialize($ser); - $this->assertDatesIdentical($dt, $pdt); - } - - /** - * Tests the ability to serialize() a PropelDateTime object. - */ - public function testSerialize_DiffTZ() - { - $now = date('Y-m-d H:i:s'); - $dt = new DateTime($now, new DateTimeZone('UTC')); - $pdt = new PropelDateTime($now, new DateTimeZone('America/New_York')); - - $this->assertDatesNotEqual($dt, $pdt); - - // We expect these to be the same -- there's no time zone info - $ser = serialize($pdt); - unset($pdt); - - $pdt = unserialize($ser); - $this->assertDatesNotEqual($dt, $pdt); - } - - -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/util/PropelModelPagerTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/util/PropelModelPagerTest.php deleted file mode 100644 index b622663df2..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/util/PropelModelPagerTest.php +++ /dev/null @@ -1,149 +0,0 @@ -deleteAll($con); - $books = new PropelObjectCollection(); - $books->setModel('Book'); - for ($i=0; $i < $nb; $i++) { - $b = new Book(); - $b->setTitle('Book' . $i); - $books[]= $b; - } - $books->save($con); - } - - protected function getPager($maxPerPage, $page = 1) - { - $pager = new PropelModelPager(BookQuery::create(), $maxPerPage); - $pager->setPage($page); - $pager->init(); - return $pager; - } - - public function testHaveToPaginate() - { - BookQuery::create()->deleteAll(); - $this->assertEquals(false, $this->getPager(0)->haveToPaginate(), 'haveToPaginate() returns false when there is no result'); - $this->createBooks(5); - $this->assertEquals(false, $this->getPager(0)->haveToPaginate(), 'haveToPaginate() returns false when the maxPerPage is null'); - $this->assertEquals(true, $this->getPager(2)->haveToPaginate(), 'haveToPaginate() returns true when the maxPerPage is less than the number of results'); - $this->assertEquals(false, $this->getPager(6)->haveToPaginate(), 'haveToPaginate() returns false when the maxPerPage is greater than the number of results'); - $this->assertEquals(false, $this->getPager(5)->haveToPaginate(), 'haveToPaginate() returns false when the maxPerPage is equal to the number of results'); - } - - public function testGetNbResults() - { - BookQuery::create()->deleteAll(); - $pager = $this->getPager(4, 1); - $this->assertEquals(0, $pager->getNbResults(), 'getNbResults() returns 0 when there are no results'); - $this->createBooks(5); - $pager = $this->getPager(4, 1); - $this->assertEquals(5, $pager->getNbResults(), 'getNbResults() returns the total number of results'); - $pager = $this->getPager(2, 1); - $this->assertEquals(5, $pager->getNbResults(), 'getNbResults() returns the total number of results'); - $pager = $this->getPager(2, 2); - $this->assertEquals(5, $pager->getNbResults(), 'getNbResults() returns the total number of results'); - $pager = $this->getPager(7, 6); - $this->assertEquals(5, $pager->getNbResults(), 'getNbResults() returns the total number of results'); - $pager = $this->getPager(0, 0); - $this->assertEquals(5, $pager->getNbResults(), 'getNbResults() returns the total number of results'); - } - - public function testGetResults() - { - $this->createBooks(5); - $pager = $this->getPager(4, 1); - $this->assertTrue($pager->getResults() instanceof PropelObjectCollection, 'getResults() returns a PropelObjectCollection'); - $this->assertEquals(4, count($pager->getResults()), 'getResults() returns at most $maxPerPage results'); - $pager = $this->getPager(4, 2); - $this->assertEquals(1, count($pager->getResults()), 'getResults() returns the remaining results when in the last page'); - $pager = $this->getPager(4, 3); - $this->assertEquals(1, count($pager->getResults()), 'getResults() returns the results of the last page when called on nonexistent pages'); - } - - public function testGetIterator() - { - $this->createBooks(5); - - $pager = $this->getPager(4, 1); - $i = 0; - foreach ($pager as $book) { - $this->assertEquals('Book' . $i, $book->getTitle(), 'getIterator() returns an iterator'); - $i++; - } - $this->assertEquals(4, $i, 'getIterator() uses the results collection'); - } - - public function testIterateTwice() - { - $this->createBooks(5); - $pager = $this->getPager(4, 1); - - $i = 0; - foreach ($pager as $book) { - $this->assertEquals('Book' . $i, $book->getTitle(), 'getIterator() returns an iterator'); - $i++; - } - $this->assertEquals(4, $i, 'getIterator() uses the results collection'); - - $i = 0; - foreach ($pager as $book) { - $this->assertEquals('Book' . $i, $book->getTitle()); - $i++; - } - $this->assertEquals(4, $i, 'getIterator() can be called several times'); - } - - public function testSetPage() - { - $this->createBooks(5); - $pager = $this->getPager(2, 2); - $i = 2; - foreach ($pager as $book) { - $this->assertEquals('Book' . $i, $book->getTitle(), 'setPage() sets the list to start on a given page'); - $i++; - } - $this->assertEquals(4, $i, 'setPage() doesn\'t change the page count'); - } - - public function testIsFirstPage() - { - $this->createBooks(5); - $pager = $this->getPager(4, 1); - $this->assertTrue($pager->isFirstPage(), 'isFirstPage() returns true on the first page'); - $pager = $this->getPager(4, 2); - $this->assertFalse($pager->isFirstPage(), 'isFirstPage() returns false when not on the first page'); - } - - public function testIsLastPage() - { - $this->createBooks(5); - $pager = $this->getPager(4, 1); - $this->assertFalse($pager->isLastPage(), 'isLastPage() returns false when not on the last page'); - $pager = $this->getPager(4, 2); - $this->assertTrue($pager->isLastPage(), 'isLastPage() returns true on the last page'); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/util/PropelPagerTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/util/PropelPagerTest.php deleted file mode 100644 index 473f56c09c..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/util/PropelPagerTest.php +++ /dev/null @@ -1,162 +0,0 @@ - - * @version $Id: PropelPagerTest.php - * @package runtime.util - */ -class PropelPagerTest extends BookstoreEmptyTestBase -{ - private $authorId; - private $books; - - protected function setUp() - { - parent::setUp(); - BookstoreDataPopulator::populate(); - - $cr = new Criteria(); - $cr->add(AuthorPeer::LAST_NAME, "Rowling"); - $cr->add(AuthorPeer::FIRST_NAME, "J.K."); - $rowling = AuthorPeer::doSelectOne($cr); - $this->authorId = $rowling->getId(); - - $book = new Book(); - $book->setTitle("Harry Potter and the Philosopher's Stone"); - $book->setISBN("1234"); - $book->setAuthor($rowling); - $book->save(); - $this->books[] = $book->getId(); - - $book = new Book(); - $book->setTitle("Harry Potter and the Chamber of Secrets"); - $book->setISBN("1234"); - $book->setAuthor($rowling); - $book->save(); - $this->books[] = $book->getId(); - - $book = new Book(); - $book->setTitle("Harry Potter and the Prisoner of Azkaban"); - $book->setISBN("1234"); - $book->setAuthor($rowling); - $book->save(); - $this->books[] = $book->getId(); - - $book = new Book(); - $book->setTitle("Harry Potter and the Goblet of Fire"); - $book->setISBN("1234"); - $book->setAuthor($rowling); - $book->save(); - $this->books[] = $book->getId(); - - $book = new Book(); - $book->setTitle("Harry Potter and the Half-Blood Prince"); - $book->setISBN("1234"); - $book->setAuthor($rowling); - $book->save(); - $this->books[] = $book->getId(); - - $book = new Book(); - $book->setTitle("Harry Potter and the Deathly Hallows"); - $book->setISBN("1234"); - $book->setAuthor($rowling); - $book->save(); - $this->books[] = $book->getId(); - } - - protected function tearDown() - { - parent::tearDown(); - $cr = new Criteria(); - $cr->add(BookPeer::ID, $this->books, Criteria::IN); - BookPeer::doDelete($cr); - } - - public function testCountNoPageNoLimit() - { - $cr = new Criteria(); - $cr->add(BookPeer::AUTHOR_ID, $this->authorId); - $pager = new PropelPager($cr, "BookPeer", "doSelect"); - $this->assertEquals(7, count($pager)); - } - - public function testCountFirstPageWithLimits() - { - $cr = new Criteria(); - $cr->add(BookPeer::AUTHOR_ID, $this->authorId); - $pager = new PropelPager($cr, "BookPeer", "doSelect", 1, 5); - $this->assertEquals(5, count($pager)); - } - - public function testCountLastPageWithLimits() - { - $cr = new Criteria(); - $cr->add(BookPeer::AUTHOR_ID, $this->authorId); - $pager = new PropelPager($cr, "BookPeer", "doSelect", 2, 5); - $this->assertEquals(2, count($pager)); - } - - public function testIterateAll() - { - $cr = new Criteria(); - $cr->add(BookPeer::AUTHOR_ID, $this->authorId); - $pager = new PropelPager($cr, "BookPeer", "doSelect"); - $i = 0; - foreach ($pager as $key => $book) { - $i++; - } - $this->assertEquals(7, $i); - } - - public function testIterateWithLimits() - { - $cr = new Criteria(); - $cr->add(BookPeer::AUTHOR_ID, $this->authorId); - $pager = new PropelPager($cr, "BookPeer", "doSelect", 2, 5); - $i = 0; - foreach ($pager as $key => $book) { - $i++; - } - $this->assertEquals(2, $i); - } - - public function testIterateCheckSecond() - { - $cr = new Criteria(); - $cr->add(BookPeer::AUTHOR_ID, $this->authorId); - $cr->addAscendingOrderByColumn(BookPeer::TITLE); - $pager = new PropelPager($cr, "BookPeer", "doSelect"); - $books = array(); - foreach($pager as $book) { - $books[] = $book; - } - $this->assertEquals("Harry Potter and the Goblet of Fire", $books[2]->getTitle()); - } - - public function testIterateTwice() - { - $cr = new Criteria(); - $cr->add(BookPeer::AUTHOR_ID, $this->authorId); - $cr->addAscendingOrderByColumn(BookPeer::TITLE); - $pager = new PropelPager($cr, "BookPeer", "doSelect"); - $i = 0; - foreach($pager as $book) { - $i++; - } - foreach($pager as $book) { - $i++; - } - $this->assertEquals(14, $i); - } -} diff --git a/airtime_mvc/library/propel/test/testsuite/runtime/validator/ValidatorTest.php b/airtime_mvc/library/propel/test/testsuite/runtime/validator/ValidatorTest.php deleted file mode 100644 index 323c58629a..0000000000 --- a/airtime_mvc/library/propel/test/testsuite/runtime/validator/ValidatorTest.php +++ /dev/null @@ -1,228 +0,0 @@ - - * @package runtime.validator - */ -class ValidatorTest extends BookstoreEmptyTestBase -{ - - protected function setUp() - { - parent::setUp(); - BookstoreDataPopulator::populate(); - require_once 'tools/helpers/bookstore/validator/ISBNValidator.php'; - } - - /** - * Test minLength validator. - * This also tests the ${value} substitution. - */ - public function testDoValidate_MinLength() - { - $book = new Book(); - $book->setTitle("12345"); // min length is 10 - - $res = $book->validate(); - $this->assertFalse($res, "Expected validation to fail."); - - $failures = $book->getValidationFailures(); - $this->assertSingleValidation($failures, "Book title must be more than 10 characters long."); - } - - /** - * Test unique validator. - */ - public function testDoValidate_Unique() - { - $book = new Book(); - $book->setTitle("Don Juan"); - - $ret = $book->validate(); - $failures = $book->getValidationFailures(); - $this->assertSingleValidation($failures, "Book title already in database."); - } - - /** - * Test recursive validaton. - */ - public function testDoValidate_Complex() - { - $book = new Book(); - $book->setTitle("12345"); // min length is 10 - - $author = new Author(); - $author->setFirstName("Hans"); // last name required, valid email format, age > 0 - - $review = new Review(); - $review->setReviewDate("08/09/2001"); // reviewed_by column required, invalid status (new, reviewed, archived) - - $book->setAuthor($author); - $book->addReview($review); - - $res = $book->validate(); - - $this->assertFalse($res, "Expected validation to fail."); - - $failures = $book->getValidationFailures(); - - /* Make sure 3 validation messages were returned; NOT 6, because the others were NULL */ - $this->assertEquals(3, count($failures), ""); - - /* Make sure correct columns failed */ - $expectedCols = array( - AuthorPeer::LAST_NAME, - BookPeer::TITLE, - ReviewPeer::REVIEWED_BY - ); - $returnedCols = array_keys($failures); - - /* implode for readability */ - $this->assertEquals(implode(',', $expectedCols), implode(',', $returnedCols)); - } - - /** - * Test recursive validaton with specified columns. - */ - public function testDoValidate_ComplexSpecifiedCols() - { - $book = new Book(); - $book->setTitle("12345"); // min length is 10 - - $author = new Author(); - $author->setFirstName("Hans"); // last name required, valid email format, age > 0 - - $review = new Review(); - $review->setReviewDate("08/09/2001"); // reviewed_by column required, invalid status (new, reviewed, archived) - - $book->setAuthor($author); - $book->addReview($review); - - $cols = array(AuthorPeer::LAST_NAME, ReviewPeer::REVIEWED_BY); - - $res = $book->validate($cols); - - $this->assertFalse($res, "Expected validation to fail."); - - $failures = $book->getValidationFailures(); - - /* Make sure 3 validation messages were returned; NOT 6, because the others were NULL */ - $this->assertEquals(2, count($failures), ""); - - /* Make sure correct columns failed */ - $expectedCols = array( - AuthorPeer::LAST_NAME, - ReviewPeer::REVIEWED_BY - ); - - $returnedCols = array_keys($failures); - - /* implode for readability */ - $this->assertEquals(implode(',', $expectedCols), implode(',', $returnedCols)); - } - - /** - * Test the fact that validators should not complain NULL values for non-required columns. - */ - public function testDoValidate_Nulls() - { - $author = new Author(); - $author->setFirstName("Malcolm"); // last name required, valid email format, age > 0 - $author->setLastName("X"); - - $author->setEmail(null); // just to be explicit, of course these are the defaults anyway - $author->setAge(null); - - $res = $author->validate(); - - - $this->assertTrue($res, "Expected validation to pass with NULL columns"); - - $author->setEmail('malcolm@'); // fail - $res = $author->validate(); - - $this->assertFalse($res, "Expected validation to fail."); - - $failures = $author->getValidationFailures(); - $this->assertEquals(1, count($failures), "Expected 1 column to fail validation."); - $this->assertEquals(array(AuthorPeer::EMAIL), array_keys($failures), "Expected EMAIL to fail validation."); - - } - - public function testDoValidate_BasicValidatorObj() - { - $author = new Author(); - $author->setFirstName("Malcolm"); // last name required, valid email format, age > 0 - $author->setLastName("X"); - $author->setEmail('malcolm@'); // fail - - $res = $author->validate(); - - $this->assertFalse($res, "Expected validation to fail."); - - $failures = $author->getValidationFailures(); - - $this->assertEquals(1, count($failures), "Expected 1 column to fail validation."); - $this->assertEquals(array(AuthorPeer::EMAIL), array_keys($failures), "Expected EMAIL to fail validation."); - - $validator = $failures[AuthorPeer::EMAIL]->getValidator(); - $this->assertTrue($validator instanceof MatchValidator, "Expected validator that failed to be MatchValidator"); - - } - - public function testDoValidate_CustomValidator() - { - $book = new Book(); - $book->setTitle("testDoValidate_CustomValidator"); // (valid) - $book->setISBN("Foo.Bar.Baz"); // (invalid) - - $res = $book->validate(); - - $this->assertFalse($res, "Expected validation to fail."); - - $failures = $book->getValidationFailures(); - - $this->assertEquals(1, count($failures), "Expected 1 column to fail validation."); - $this->assertEquals(array(BookPeer::ISBN), array_keys($failures), "Expected EMAIL to fail validation."); - - $validator = $failures[BookPeer::ISBN]->getValidator(); - $this->assertType('ISBNValidator', $validator, "Expected validator that failed to be ISBNValidator"); - } - - protected function assertSingleValidation($ret, $expectedMsg) - { - /* Make sure validation failed */ - $this->assertTrue($ret !== true, "Expected validation to fail !"); - - /* Make sure 1 validation message was returned */ - $count = count($ret); - $this->assertTrue($count === 1, "Expected that exactly one validation failed ($count) !"); - - /* Make sure expected validation message was returned */ - $el = array_shift($ret); - $this->assertEquals($el->getMessage(), $expectedMsg, "Got unexpected validation failed message: " . $el->getMessage()); - } - -} diff --git a/airtime_mvc/library/propel/test/tools/helpers/BaseTestCase.php b/airtime_mvc/library/propel/test/tools/helpers/BaseTestCase.php deleted file mode 100644 index f3827c24b7..0000000000 --- a/airtime_mvc/library/propel/test/tools/helpers/BaseTestCase.php +++ /dev/null @@ -1,30 +0,0 @@ - (Propel) - * @author Daniel Rall (Torque) - * @author Christopher Elkins (Torque) - * @version $Revision: 1773 $ - */ -abstract class BaseTestCase extends PHPUnit_Framework_TestCase { - - /** - * Conditional compilation flag. - */ - const DEBUG = false; - -} diff --git a/airtime_mvc/library/propel/test/tools/helpers/bookstore/BookstoreDataPopulator.php b/airtime_mvc/library/propel/test/tools/helpers/bookstore/BookstoreDataPopulator.php deleted file mode 100644 index 5dc3902be7..0000000000 --- a/airtime_mvc/library/propel/test/tools/helpers/bookstore/BookstoreDataPopulator.php +++ /dev/null @@ -1,247 +0,0 @@ - - */ -class BookstoreDataPopulator -{ - - public static function populate($con = null) - { - if($con === null) { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - } - $con->beginTransaction(); - - // Add publisher records - // --------------------- - - $scholastic = new Publisher(); - $scholastic->setName("Scholastic"); - // do not save, will do later to test cascade - - $morrow = new Publisher(); - $morrow->setName("William Morrow"); - $morrow->save($con); - $morrow_id = $morrow->getId(); - - $penguin = new Publisher(); - $penguin->setName("Penguin"); - $penguin->save(); - $penguin_id = $penguin->getId(); - - $vintage = new Publisher(); - $vintage->setName("Vintage"); - $vintage->save($con); - $vintage_id = $vintage->getId(); - - $rowling = new Author(); - $rowling->setFirstName("J.K."); - $rowling->setLastName("Rowling"); - // no save() - - $stephenson = new Author(); - $stephenson->setFirstName("Neal"); - $stephenson->setLastName("Stephenson"); - $stephenson->save($con); - $stephenson_id = $stephenson->getId(); - - $byron = new Author(); - $byron->setFirstName("George"); - $byron->setLastName("Byron"); - $byron->save($con); - $byron_id = $byron->getId(); - - $grass = new Author(); - $grass->setFirstName("Gunter"); - $grass->setLastName("Grass"); - $grass->save($con); - $grass_id = $grass->getId(); - - $phoenix = new Book(); - $phoenix->setTitle("Harry Potter and the Order of the Phoenix"); - $phoenix->setISBN("043935806X"); - $phoenix->setAuthor($rowling); - $phoenix->setPublisher($scholastic); - $phoenix->setPrice(10.99); - $phoenix->save($con); - $phoenix_id = $phoenix->getId(); - - $qs = new Book(); - $qs->setISBN("0380977427"); - $qs->setTitle("Quicksilver"); - $qs->setPrice(11.99); - $qs->setAuthor($stephenson); - $qs->setPublisher($morrow); - $qs->save($con); - $qs_id = $qs->getId(); - - $dj = new Book(); - $dj->setISBN("0140422161"); - $dj->setTitle("Don Juan"); - $dj->setPrice(12.99); - $dj->setAuthor($byron); - $dj->setPublisher($penguin); - $dj->save($con); - $dj_id = $dj->getId(); - - $td = new Book(); - $td->setISBN("067972575X"); - $td->setTitle("The Tin Drum"); - $td->setPrice(13.99); - $td->setAuthor($grass); - $td->setPublisher($vintage); - $td->save($con); - $td_id = $td->getId(); - - $r1 = new Review(); - $r1->setBook($phoenix); - $r1->setReviewedBy("Washington Post"); - $r1->setRecommended(true); - $r1->setReviewDate(time()); - $r1->save($con); - $r1_id = $r1->getId(); - - $r2 = new Review(); - $r2->setBook($phoenix); - $r2->setReviewedBy("New York Times"); - $r2->setRecommended(false); - $r2->setReviewDate(time()); - $r2->save($con); - $r2_id = $r2->getId(); - - $blob_path = _LOB_SAMPLE_FILE_PATH . '/tin_drum.gif'; - $clob_path = _LOB_SAMPLE_FILE_PATH . '/tin_drum.txt'; - - $m1 = new Media(); - $m1->setBook($td); - $m1->setCoverImage(file_get_contents($blob_path)); - // CLOB is broken in PDO OCI, see http://pecl.php.net/bugs/bug.php?id=7943 - if (get_class(Propel::getDB()) != "DBOracle") { - $m1->setExcerpt(file_get_contents($clob_path)); - } - $m1->save($con); - - // Add book list records - // --------------------- - // (this is for many-to-many tests) - - $blc1 = new BookClubList(); - $blc1->setGroupLeader("Crazyleggs"); - $blc1->setTheme("Happiness"); - - $brel1 = new BookListRel(); - $brel1->setBook($phoenix); - - $brel2 = new BookListRel(); - $brel2->setBook($dj); - - $blc1->addBookListRel($brel1); - $blc1->addBookListRel($brel2); - - $blc1->save(); - - $bemp1 = new BookstoreEmployee(); - $bemp1->setName("John"); - $bemp1->setJobTitle("Manager"); - - $bemp2 = new BookstoreEmployee(); - $bemp2->setName("Pieter"); - $bemp2->setJobTitle("Clerk"); - $bemp2->setSupervisor($bemp1); - $bemp2->save($con); - - $role = new AcctAccessRole(); - $role->setName("Admin"); - - $bempacct = new BookstoreEmployeeAccount(); - $bempacct->setBookstoreEmployee($bemp1); - $bempacct->setAcctAccessRole($role); - $bempacct->setLogin("john"); - $bempacct->setPassword("johnp4ss"); - $bempacct->save($con); - - // Add bookstores - - $store = new Bookstore(); - $store->setStoreName("Amazon"); - $store->setPopulationServed(5000000000); // world population - $store->setTotalBooks(300); - $store->save($con); - - $store = new Bookstore(); - $store->setStoreName("Local Store"); - $store->setPopulationServed(20); - $store->setTotalBooks(500000); - $store->save($con); - - $con->commit(); - } - - public static function populateOpinionFavorite($con = null) - { - if($con === null) { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - } - $con->beginTransaction(); - - $book1 = BookPeer::doSelectOne(new Criteria(), $con); - $reader1 = new BookReader(); - $reader1->save($con); - - $bo = new BookOpinion(); - $bo->setBook($book1); - $bo->setBookReader($reader1); - $bo->save($con); - - $rf = new ReaderFavorite(); - $rf->setBookOpinion($bo); - $rf->save($con); - - $con->commit(); - } - - public static function depopulate($con = null) - { - if($con === null) { - $con = Propel::getConnection(BookPeer::DATABASE_NAME); - } - $con->beginTransaction(); - AuthorPeer::doDeleteAll($con); - BookstorePeer::doDeleteAll($con); - BookstoreContestPeer::doDeleteAll($con); - BookstoreContestEntryPeer::doDeleteAll($con); - BookstoreEmployeePeer::doDeleteAll($con); - BookstoreEmployeeAccountPeer::doDeleteAll($con); - BookstoreSalePeer::doDeleteAll($con); - BookClubListPeer::doDeleteAll($con); - BookOpinionPeer::doDeleteAll($con); - BookReaderPeer::doDeleteAll($con); - BookListRelPeer::doDeleteAll($con); - BookPeer::doDeleteAll($con); - ContestPeer::doDeleteAll($con); - CustomerPeer::doDeleteAll($con); - MediaPeer::doDeleteAll($con); - PublisherPeer::doDeleteAll($con); - ReaderFavoritePeer::doDeleteAll($con); - ReviewPeer::doDeleteAll($con); - $con->commit(); - } - -} diff --git a/airtime_mvc/library/propel/test/tools/helpers/bookstore/BookstoreEmptyTestBase.php b/airtime_mvc/library/propel/test/tools/helpers/bookstore/BookstoreEmptyTestBase.php deleted file mode 100644 index 08efab6a89..0000000000 --- a/airtime_mvc/library/propel/test/tools/helpers/bookstore/BookstoreEmptyTestBase.php +++ /dev/null @@ -1,38 +0,0 @@ - -con); - } - - /** - * This is run after each unit test. It empties the database. - */ - protected function tearDown() - { - BookstoreDataPopulator::depopulate($this->con); - parent::tearDown(); - } - -} diff --git a/airtime_mvc/library/propel/test/tools/helpers/bookstore/BookstoreTestBase.php b/airtime_mvc/library/propel/test/tools/helpers/bookstore/BookstoreTestBase.php deleted file mode 100644 index 4ea139e6d5..0000000000 --- a/airtime_mvc/library/propel/test/tools/helpers/bookstore/BookstoreTestBase.php +++ /dev/null @@ -1,47 +0,0 @@ -con = Propel::getConnection(BookPeer::DATABASE_NAME); - $this->con->beginTransaction(); - } - - /** - * This is run after each unit test. It empties the database. - */ - protected function tearDown() - { - parent::tearDown(); - // Only commit if the transaction hasn't failed. - // This is because tearDown() is also executed on a failed tests, - // and we don't want to call PropelPDO::commit() in that case - // since it will trigger an exception on its own - // ('Cannot commit because a nested transaction was rolled back') - if ($this->con->isCommitable()) { - $this->con->commit(); - } - } -} diff --git a/airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/BookstoreNestedSetTestBase.php b/airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/BookstoreNestedSetTestBase.php deleted file mode 100644 index 222c0eb500..0000000000 --- a/airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/BookstoreNestedSetTestBase.php +++ /dev/null @@ -1,146 +0,0 @@ -getTitle()] = array($node->getLeftValue(), $node->getRightValue(), $node->getLevel()); - } - return $tree; - } - - /** - * Tree used for tests - * t1 - * | \ - * t2 t3 - * | \ - * t4 t5 - * | \ - * t6 t7 - */ - protected function initTree() - { - Table9Peer::doDeleteAll(); - $ret = array(); - // shuffling the results so the db order is not the natural one - $fixtures = array( - 't2' => array(2, 3, 1), - 't5' => array(7, 12, 2), - 't4' => array(5, 6, 2), - 't7' => array(10, 11, 3), - 't1' => array(1, 14, 0), - 't6' => array(8, 9, 3), - 't3' => array(4, 13, 1), - ); - /* in correct order, this is: - 't1' => array(1, 14, 0), - 't2' => array(2, 3, 1), - 't3' => array(4, 13, 1), - 't4' => array(5, 6, 2), - 't5' => array(7, 12, 2), - 't6' => array(8, 9, 3), - 't7' => array(10, 11, 3), - */ - foreach ($fixtures as $key => $data) { - $t = new PublicTable9(); - $t->setTitle($key); - $t->setLeftValue($data[0]); - $t->setRightValue($data[1]); - $t->setLevel($data[2]); - $t->save(); - $ret[$key]= $t; - } - // reordering the results in the fixtures - ksort($ret); - return array_values($ret); - } - - protected function dumpTree() - { - $c = new Criteria(); - $c->addAscendingOrderBycolumn(Table9Peer::TITLE); - return $this->dumpNodes(Table9Peer::doSelect($c)); - } - - /** - * Tree used for tests - * Scope 1 - * t1 - * | \ - * t2 t3 - * | \ - * t4 t5 - * | \ - * t6 t7 - * Scope 2 - * t8 - * | \ - * t9 t10 - */ - protected function initTreeWithScope() - { - Table10Peer::doDeleteAll(); - $ret = array(); - $fixtures = array( - 't1' => array(1, 14, 0, 1), - 't2' => array(2, 3, 1, 1), - 't3' => array(4, 13, 1, 1), - 't4' => array(5, 6, 2, 1), - 't5' => array(7, 12, 2, 1), - 't6' => array(8, 9, 3, 1), - 't7' => array(10, 11, 3, 1), - 't8' => array(1, 6, 0, 2), - 't9' => array(2, 3, 1, 2), - 't10' => array(4, 5, 1, 2), - ); - foreach ($fixtures as $key => $data) { - $t = new PublicTable10(); - $t->setTitle($key); - $t->setLeftValue($data[0]); - $t->setRightValue($data[1]); - $t->setLevel($data[2]); - $t->setScopeValue($data[3]); - $t->save(); - $ret []= $t; - } - return $ret; - } - - protected function dumpTreeWithScope($scope) - { - $c = new Criteria(); - $c->add(Table10Peer::SCOPE_COL, $scope); - $c->addAscendingOrderBycolumn(Table10Peer::TITLE); - return $this->dumpNodes(Table10Peer::doSelect($c)); - } -} - -// we need this class to test protected methods -class PublicTable9 extends Table9 -{ - public $hasParentNode = null; - public $parentNode = null; - public $hasPrevSibling = null; - public $prevSibling = null; - public $hasNextSibling = null; - public $nextSibling = null; -} - -class PublicTable10 extends Table10 -{ - public $hasParentNode = null; - public $parentNode = null; -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/BookstoreSortableTestBase.php b/airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/BookstoreSortableTestBase.php deleted file mode 100644 index 2af39debe1..0000000000 --- a/airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/BookstoreSortableTestBase.php +++ /dev/null @@ -1,104 +0,0 @@ -setRank(1); - $t1->setTitle('row1'); - $t1->save(); - $t2 = new Table11(); - $t2->setRank(4); - $t2->setTitle('row4'); - $t2->save(); - $t3 = new Table11(); - $t3->setRank(2); - $t3->setTitle('row2'); - $t3->save(); - $t4 = new Table11(); - $t4->setRank(3); - $t4->setTitle('row3'); - $t4->save(); - } - - protected function populateTable12() - { - /* List used for tests - scope=1 scope=2 - row1 row5 - row2 row6 - row3 - row4 - */ - Table12Peer::doDeleteAll(); - $t1 = new Table12(); - $t1->setRank(1); - $t1->setScopeValue(1); - $t1->setTitle('row1'); - $t1->save(); - $t2 = new Table12(); - $t2->setRank(4); - $t2->setScopeValue(1); - $t2->setTitle('row4'); - $t2->save(); - $t3 = new Table12(); - $t3->setRank(2); - $t3->setScopeValue(1); - $t3->setTitle('row2'); - $t3->save(); - $t4 = new Table12(); - $t4->setRank(1); - $t4->setScopeValue(2); - $t4->setTitle('row5'); - $t4->save(); - $t5 = new Table12(); - $t5->setRank(3); - $t5->setScopeValue(1); - $t5->setTitle('row3'); - $t5->save(); - $t6 = new Table12(); - $t6->setRank(2); - $t6->setScopeValue(2); - $t6->setTitle('row6'); - $t6->save(); - } - - protected function getFixturesArray() - { - $c = new Criteria(); - $c->addAscendingOrderByColumn(Table11Peer::RANK_COL); - $ts = Table11Peer::doSelect($c); - $ret = array(); - foreach ($ts as $t) { - $ret[$t->getRank()] = $t->getTitle(); - } - return $ret; - } - - protected function getFixturesArrayWithScope($scope = null) - { - $c = new Criteria(); - if ($scope !== null) { - $c->add(Table12Peer::SCOPE_COL, $scope); - } - $c->addAscendingOrderByColumn(Table12Peer::RANK_COL); - $ts = Table12Peer::doSelect($c); - $ret = array(); - foreach ($ts as $t) { - $ret[$t->getRank()] = $t->getTitle(); - } - return $ret; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/DonothingBehavior.php b/airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/DonothingBehavior.php deleted file mode 100644 index 2b6f2fb973..0000000000 --- a/airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/DonothingBehavior.php +++ /dev/null @@ -1,13 +0,0 @@ -setFirstName('PreInsertedFirstname'); - return true; - } - - public function postInsert(PropelPDO $con = null) - { - parent::postInsert($con); - $this->setLastName('PostInsertedLastName'); - } - - public function preUpdate(PropelPDO $con = null) - { - parent::preUpdate($con); - $this->setFirstName('PreUpdatedFirstname'); - return true; - } - - public function postUpdate(PropelPDO $con = null) - { - parent::postUpdate($con); - $this->setLastName('PostUpdatedLastName'); - } - - public function preSave(PropelPDO $con = null) - { - parent::preSave($con); - $this->setEmail("pre@save.com"); - return true; - } - - public function postSave(PropelPDO $con = null) - { - parent::postSave($con); - $this->setAge(115); - } - - public function preDelete(PropelPDO $con = null) - { - parent::preDelete($con); - $this->setFirstName("Pre-Deleted"); - return true; - } - - public function postDelete(PropelPDO $con = null) - { - parent::postDelete($con); - $this->setLastName("Post-Deleted"); - } -} - -class TestAuthorDeleteFalse extends TestAuthor -{ - public function preDelete(PropelPDO $con = null) - { - parent::preDelete($con); - $this->setFirstName("Pre-Deleted"); - return false; - } -} -class TestAuthorSaveFalse extends TestAuthor -{ - public function preSave(PropelPDO $con = null) - { - parent::preSave($con); - $this->setEmail("pre@save.com"); - return false; - } - -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/Testallhooksbehavior.php b/airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/Testallhooksbehavior.php deleted file mode 100644 index 4a44c23238..0000000000 --- a/airtime_mvc/library/propel/test/tools/helpers/bookstore/behavior/Testallhooksbehavior.php +++ /dev/null @@ -1,183 +0,0 @@ -tableModifier)) - { - $this->tableModifier = new TestAllHooksTableModifier($this); - } - return $this->tableModifier; - } - - public function getObjectBuilderModifier() - { - if (is_null($this->objectBuilderModifier)) - { - $this->objectBuilderModifier = new TestAllHooksObjectBuilderModifier($this); - } - return $this->objectBuilderModifier; - } - - public function getPeerBuilderModifier() - { - if (is_null($this->peerBuilderModifier)) - { - $this->peerBuilderModifier = new TestAllHooksPeerBuilderModifier($this); - } - return $this->peerBuilderModifier; - } - - public function getQueryBuilderModifier() - { - if (is_null($this->queryBuilderModifier)) - { - $this->queryBuilderModifier = new TestAllHooksQueryBuilderModifier($this); - } - return $this->queryBuilderModifier; - } -} - -class TestAllHooksTableModifier -{ - protected $behavior, $table; - - public function __construct($behavior) - { - $this->behavior = $behavior; - $this->table = $behavior->getTable(); - } - - public function modifyTable() - { - $this->table->addColumn(array( - 'name' => 'test', - 'type' => 'TIMESTAMP' - )); - } -} - -class TestAllHooksObjectBuilderModifier -{ - public function objectAttributes($builder) - { - return 'public $customAttribute = 1;'; - } - - public function preSave($builder) - { - return '$this->preSave = 1;$this->preSaveIsAfterSave = isset($affectedRows);$this->preSaveBuilder="' . get_class($builder) . '";'; - } - - public function postSave($builder) - { - return '$this->postSave = 1;$this->postSaveIsAfterSave = isset($affectedRows);$this->postSaveBuilder="' . get_class($builder) . '";'; - } - - public function preInsert($builder) - { - return '$this->preInsert = 1;$this->preInsertIsAfterSave = isset($affectedRows);$this->preInsertBuilder="' . get_class($builder) . '";'; - } - - public function postInsert($builder) - { - return '$this->postInsert = 1;$this->postInsertIsAfterSave = isset($affectedRows);$this->postInsertBuilder="' . get_class($builder) . '";'; - } - - public function preUpdate($builder) - { - return '$this->preUpdate = 1;$this->preUpdateIsAfterSave = isset($affectedRows);$this->preUpdateBuilder="' . get_class($builder) . '";'; - } - - public function postUpdate($builder) - { - return '$this->postUpdate = 1;$this->postUpdateIsAfterSave = isset($affectedRows);$this->postUpdateBuilder="' . get_class($builder) . '";'; - } - - public function preDelete($builder) - { - return '$this->preDelete = 1;$this->preDeleteIsBeforeDelete = isset(Table3Peer::$instances[$this->id]);$this->preDeleteBuilder="' . get_class($builder) . '";'; - } - - public function postDelete($builder) - { - return '$this->postDelete = 1;$this->postDeleteIsBeforeDelete = isset(Table3Peer::$instances[$this->id]);$this->postDeleteBuilder="' . get_class($builder) . '";'; - } - - public function objectMethods($builder) - { - return 'public function hello() { return "' . get_class($builder) .'"; }'; - } - - public function objectCall($builder) - { - return 'if ($name == "foo") return "bar";'; - } - - public function objectFilter(&$string, $builder) - { - $string .= 'class testObjectFilter { const FOO = "' . get_class($builder) . '"; }'; - } -} - -class TestAllHooksPeerBuilderModifier -{ - public function staticAttributes($builder) - { - return 'public static $customStaticAttribute = 1;public static $staticAttributeBuilder = "' . get_class($builder) . '";'; - } - - public function staticMethods($builder) - { - return 'public static function hello() { return "' . get_class($builder) . '"; }'; - } - - public function preSelect($builder) - { - return '$con->preSelect = "' . get_class($builder) . '";'; - } - - public function peerFilter(&$string, $builder) - { - $string .= 'class testPeerFilter { const FOO = "' . get_class($builder) . '"; }'; - } -} - -class TestAllHooksQueryBuilderModifier -{ - public function preSelectQuery($builder) - { - return '// foo'; - } - - public function preDeleteQuery($builder) - { - return '// foo'; - } - - public function postDeleteQuery($builder) - { - return '// foo'; - } - - public function preUpdateQuery($builder) - { - return '// foo'; - } - - public function postUpdateQuery($builder) - { - return '// foo'; - } -} \ No newline at end of file diff --git a/airtime_mvc/library/propel/test/tools/helpers/bookstore/validator/ISBNValidator.php b/airtime_mvc/library/propel/test/tools/helpers/bookstore/validator/ISBNValidator.php deleted file mode 100644 index 690c81a408..0000000000 --- a/airtime_mvc/library/propel/test/tools/helpers/bookstore/validator/ISBNValidator.php +++ /dev/null @@ -1,29 +0,0 @@ - - * @version $Revision: 1612 $ - * @package propel.validator - */ -class ISBNValidator implements BasicValidator -{ - const NOT_ISBN_REGEXP = '/[^0-9A-Z]/'; - - /** - * Whether the passed string matches regular expression. - */ - public function isValid (ValidatorMap $map, $str) - { - return !(preg_match(self::NOT_ISBN_REGEXP, $str)); - } -} diff --git a/airtime_mvc/library/propel/test/tools/helpers/cms/CmsDataPopulator.php b/airtime_mvc/library/propel/test/tools/helpers/cms/CmsDataPopulator.php deleted file mode 100644 index 2a05f3ff3b..0000000000 --- a/airtime_mvc/library/propel/test/tools/helpers/cms/CmsDataPopulator.php +++ /dev/null @@ -1,143 +0,0 @@ - - */ -class CmsDataPopulator { - - public static function populate($con = null) - { - if($con === null) - { - $con = Propel::getConnection(PagePeer::DATABASE_NAME); - } - $con->beginTransaction(); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 1,194,'home')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 2,5,'school')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 6,43,'education')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 44,45,'simulator')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 46,47,'ac')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 3,4,'history')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 7,14,'master-mariner')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 8,9,'education')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 48,85,'courses')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 98,101,'contact')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 10,11,'entrance')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 104,191,'intra')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 102,103,'services')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 12,13,'competency')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 15,22,'watchkeeping-officer')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 16,17,'education')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 18,19,'entrance')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 20,21,'competency')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 31,38,'watchkeeping-engineer')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 32,33,'education')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 34,35,'entrance')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 36,37,'competency')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 39,40,'practice')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 86,97,'news')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 95,96,'2007-02')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 99,100,'personnel')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 87,88,'2007-06')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 49,50,'nautical')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 51,52,'radiotechnical')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 53,54,'resourcemgmt')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 57,58,'safety')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 59,60,'firstaid')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 61,62,'sar')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 67,84,'upcoming')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 65,66,'languages')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 55,56,'cargomgmt')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 119,120,'timetable')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 63,64,'boaters')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 105,118,'bulletinboard')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 106,107,'sdf')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 41,42,'fristaende')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 23,30,'ingenj')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 24,25,'utbildn')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 26,27,'ansokn')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 93,94,'utexaminerade')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 89,92,'Massan')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 192,193,'lankar')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 68,69,'FRB')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 70,71,'pelastautumis')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 72,73,'CCM')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 74,75,'sjukvard')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 121,188,'Veckoscheman')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 134,135,'VS3VSVsjukv')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 122,123,'sjoarb')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 130,131,'fysik1')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 140,141,'kemi')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 76,77,'inr')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 78,79,'forare')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 144,145,'AlexandraYH2')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 132,133,'AlexandraVS2')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 80,81,'Maskin')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 126,127,'forstahjalp')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 136,137,'Juridik')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 142,143,'mate')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 82,83,'basic')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 124,125,'mask')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 108,109,'magnus')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 138,139,'sjosakerhet')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 28,29,'pate')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 148,149,'eng')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 146,147,'forstahjalpYH1')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 110,111,'kortoverlevnadskurs')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 158,159,'kortoverlevnadskurs')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 128,129,'metall')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 152,153,'fysik')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 156,157,'fardplan')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 154,155,'astro')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 90,91,'utstallare')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 150,151,'eng')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 160,161,'ent')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 162,163,'juridik')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 168,169,'svenska')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 164,165,'matemat')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 166,167,'operativa')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 170,171,'plan')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 172,173,'src')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 112,113,'sjukv')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 174,175,'matemati')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 176,177,'fysiikka')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 114,115,'hantv')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 116,117,'CCM')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 178,179,'haveri')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 180,181,'FRB')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 182,183,'kemia')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 184,185,'vaktrutiner')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 189,190,'laroplan')"); - $con->exec("INSERT INTO Page (ScopeId, LeftChild, RightChild, Title) VALUES (1, 186,187,'SSOkurs')"); - - $con->exec("INSERT INTO Category (LeftChild, RightChild, Title) VALUES (1, 8, 'Cat_1')"); - $con->exec("INSERT INTO Category (LeftChild, RightChild, Title) VALUES (2, 7, 'Cat_1_1')"); - $con->exec("INSERT INTO Category (LeftChild, RightChild, Title) VALUES (3, 6, 'Cat_1_1_1')"); - $con->exec("INSERT INTO Category (LeftChild, RightChild, Title) VALUES (4, 5, 'Cat_1_1_1_1')"); - - $con->commit(); - } - - public static function depopulate($con = null) - { - if($con === null) - { - $con = Propel::getConnection(PagePeer::DATABASE_NAME); - } - $con->beginTransaction(); - $con->exec("DELETE FROM Page"); - $con->exec("DELETE FROM Category"); - - $con->commit(); - } -} diff --git a/airtime_mvc/library/propel/test/tools/helpers/cms/CmsTestBase.php b/airtime_mvc/library/propel/test/tools/helpers/cms/CmsTestBase.php deleted file mode 100644 index 0d9c73791a..0000000000 --- a/airtime_mvc/library/propel/test/tools/helpers/cms/CmsTestBase.php +++ /dev/null @@ -1,45 +0,0 @@ -con = Propel::getConnection(PagePeer::DATABASE_NAME); - $this->con->beginTransaction(); - CmsDataPopulator::depopulate($this->con); - CmsDataPopulator::populate($this->con); - } - - /** - * This is run after each unit test. It empties the database. - */ - protected function tearDown() - { - CmsDataPopulator::depopulate($this->con); - $this->con->commit(); - parent::tearDown(); - } - -} diff --git a/airtime_mvc/library/propel/test/tools/phing/DefineTask.php b/airtime_mvc/library/propel/test/tools/phing/DefineTask.php deleted file mode 100644 index ef6f208be5..0000000000 --- a/airtime_mvc/library/propel/test/tools/phing/DefineTask.php +++ /dev/null @@ -1,58 +0,0 @@ -name = $v; - } - - /** - * Sets the value for the constant. - * @param string $v - */ - public function setValue($v) { - $this->value = $v; - } - - public function main() { - if (!isset($this->name) || !isset($this->value)) { - throw new BuildException("Both name and value params are required.", $this->getLocation()); - } - $const = strtoupper($this->name); - if (defined($const)) { - $this->log("The constant $const has already been defined!", Project::MSG_ERR); - } else { - define($const, $this->value); - $this->log("Defined $const with value " . var_export($this->value, true), Project::MSG_INFO); - } - } -} diff --git a/airtime_mvc/library/propel/test/tree-test.php b/airtime_mvc/library/propel/test/tree-test.php deleted file mode 100644 index c807f32e9c..0000000000 --- a/airtime_mvc/library/propel/test/tree-test.php +++ /dev/null @@ -1,426 +0,0 @@ -"; - -error_reporting(E_ALL); - -$conf_path = realpath(dirname(__FILE__) . '/fixtures/treetest/build/conf/treetest-conf.php'); -if (!file_exists($conf_path)) { - echo "Make sure that you specify properties in conf/treetest.properties and " - ."build propel before running this script."; - exit; -} - -// Add PHP_CLASSPATH, if set -if (getenv("PHP_CLASSPATH")) { - set_include_path(getenv("PHP_CLASSPATH") . PATH_SEPARATOR . get_include_path()); -} - - // Add build/classes/ and classes/ to path -set_include_path( - realpath(dirname(__FILE__) . '/fixtures/treetest/build/classes') . PATH_SEPARATOR . - dirname(__FILE__) . '/../runtime/classes' . PATH_SEPARATOR . - get_include_path() -); - - -// Require classes. -require_once 'propel/Propel.php'; -require_once 'treetest/TestNodePeer.php'; - -function dumpTree($node, $querydb = false, $con = null) -{ - $opts = array('querydb' => $querydb, - 'con' => $con); - - $node->setIteratorOptions('pre', $opts); - - $indent = 0; - $lastLevel = $node->getNodeLevel(); - - foreach ($node as $n) - { - $nodeLevel = $n->getNodeLevel(); - $indent += $nodeLevel - $lastLevel; - echo str_repeat(' ', $indent); - echo $n->getNodePath() . " -> " . $n->getLabel(); - echo "\n"; - $lastLevel = $nodeLevel; - } -} - -try { - // Initialize Propel - Propel::init($conf_path); -} catch (Exception $e) { - die("Error initializing propel: ". $e->__toString()); -} - -try { - - $nodeKeySep = TestNodePeer::NPATH_SEP; - - echo "\nCreating initial tree:\n"; - echo "-------------------------------------\n"; - - $a = new Test(); - $a->setLabel("a"); - $a = TestNodePeer::createNewRootNode($a); - echo "Created 'a' as new root\n"; - - $b = new TestNode(); - $b->setLabel('b'); - $a->addChildNode($b); - echo "Added 'b' as first child of 'a'\n"; - - $c = new TestNode(); - $c->setLabel('c'); - $a->addChildNode($c); - echo "Added 'c' as second child of 'a'\n"; - - $f = new TestNode(); - $f->setLabel('f'); - $b->addChildNode($f); - echo "Added 'f' as first child of 'b'\n"; - - $d = new TestNode(); - $d->setLabel('d'); - $b->addChildNode($d, $f); - echo "Added 'd' as first child of 'b' before 'f' (insert before first child test - f is now second child)\n"; - - $e = new TestNode(); - $e->setLabel('e'); - $b->addChildNode($e, $f); - echo "Added 'e' as second child of 'b' before 'f' (insert before last child test - f is now third child)\n"; - - $g = new TestNode(); - $g->setLabel('g'); - $c->addChildNode($g); - echo "Added 'g' as first child of 'c'\n"; - - $h = new TestNode(); - $h->setLabel('h'); - $c->addChildNode($h); - echo "Added 'h' as second child of 'c'\n"; - - $i = new TestNode(); - $i->setLabel('i'); - $d->addChildNode($i); - echo "Added 'i' as first child of 'd'\n"; - - $j = new TestNode(); - $j->setLabel('j'); - $f->addChildNode($j); - echo "Added 'j' as first child of 'f'\n"; - - $k = new TestNode(); - $k->setLabel('k'); - $j->addChildNode($k); - echo "Added 'k' as first child of 'j'\n"; - - $l = new TestNode(); - $l->setLabel('l'); - $j->addChildNode($l); - echo "Added 'l' as second child of 'j'\n"; - - dumpTree($a); - - - echo "\n\nDeleting 'd' node sub-tree:\n"; - echo "-------------------------------------\n"; - - $d->delete(); - - dumpTree($a); - - - echo "\n\nMove node tests:\n"; - echo "-------------------------------------\n"; - - echo "Move 'j' sub-tree to 'b' before 'e' (move tree/insert before first child test):\n"; - $b->addChildNode($j, $e); - dumpTree($a); - - echo "\nMove 'j' sub-tree to 'c' (move tree after last child test):\n"; - $c->addChildNode($j); - dumpTree($a); - - echo "\nMove 'j' sub-tree to 'g' (move tree to first child test):\n"; - $g->addChildNode($j); - dumpTree($a); - - - echo "\n\nCreating new (in-memory) sub-tree:\n"; - echo "-------------------------------------\n"; - - $m = new TestNode(); - $m->setLabel('m'); - echo "Created 'm' as root of new sub-tree\n"; - - $n = new TestNode(); - $n->setLabel('n'); - $m->addChildNode($n); - echo "Added 'n' as first child of 'm'\n"; - - $o = new TestNode(); - $o->setLabel('o'); - $m->addChildNode($o); - echo "Added 'o' as second child of 'm'\n"; - - $r = new TestNode(); - $r->setLabel('r'); - $n->addChildNode($r); - echo "Added 'r' as first child of 'n'\n"; - - $p = new TestNode(); - $p->setLabel('p'); - $n->addChildNode($p, $r); - echo "Added 'p' as first child of 'n' before 'r' (insert before first child test - r is now second child)\n"; - - $q = new TestNode(); - $q->setLabel('q'); - $n->addChildNode($q, $r); - echo "Added 'q' as second child of 'n' before 'r' (insert before last child test - r is now third child)\n"; - - $s = new TestNode(); - $s->setLabel('s'); - $o->addChildNode($s); - echo "Added 's' as first child of 'o'\n"; - - $t = new TestNode(); - $t->setLabel('t'); - $o->addChildNode($t); - echo "Added 't' as second child of 'o'\n"; - - $u = new TestNode(); - $u->setLabel('u'); - $p->addChildNode($u); - echo "Added 'u' as first child of 'p'\n"; - - $v = new TestNode(); - $v->setLabel('v'); - $r->addChildNode($v); - echo "Added 'v' as first child of 'r'\n"; - - $w = new TestNode(); - $w->setLabel('w'); - $v->addChildNode($w); - echo "Added 'w' as first child of 'v'\n"; - - $x = new TestNode(); - $x->setLabel('x'); - $v->addChildNode($x); - echo "Added 'x' as second child of 'v'\n"; - - dumpTree($m); - - - echo "\n\nDeleting in-memory 'p' node sub-tree:\n"; - echo "-------------------------------------\n"; - - $p->delete(); - - dumpTree($m); - - - echo "\n\nMove in-memory node tests:\n"; - echo "-------------------------------------\n"; - - echo "Move 'v' sub-tree to 'n' before 'q' (move tree/insert before first child test):\n"; - $n->addChildNode($v, $q); - dumpTree($m); - - echo "\nMove 'v' sub-tree to 'o' (move tree after last child test):\n"; - $o->addChildNode($v); - dumpTree($m); - - echo "\nMove 'v' sub-tree to 's' (move tree to first child test):\n"; - $s->addChildNode($v); - dumpTree($m); - - - echo "\n\nAdd in-memory 'm' sub-tree to 'a':\n"; - echo "-------------------------------------\n"; - - $a->addChildNode($m); - - dumpTree($a); - - - echo "\n\nInsert new root node 'z' and retrieve descendants on demand (via querydb param in iterator):\n"; - echo "-------------------------------------\n"; - $z = new Test(); - $z->setLabel("z"); - $z = TestNodePeer::insertNewRootNode($z); - - dumpTree($z, true); - -} catch (Exception $e) { - die("Error creating initial tree: " . $e->__toString()); -} - -try { - - echo "\n\nTest retrieveRootNode() (without descendants)\n"; - echo "-------------------------------------\n"; - $root = TestNodePeer::retrieveRootNode(false); - dumpTree($root); - - - echo "\n\nTest retrieveRootNode() (with descendants)\n"; - echo "-------------------------------------\n"; - $root = TestNodePeer::retrieveRootNode(true); - dumpTree($root); - - $m_addr = array(1,1,3); - - echo "\n\nTest retrieveNodeByNP() for 'm' (without descendants)\n"; - echo "-------------------------------------\n"; - $node = TestNodePeer::retrieveNodeByNP(implode($nodeKeySep, $m_addr), false, false); - dumpTree($node); - - - echo "\n\nTest retrieveNodeByNP() for 'm' (with descendants)\n"; - echo "-------------------------------------\n"; - $node = TestNodePeer::retrieveNodeByNP(implode($nodeKeySep, $m_addr), false, true); - dumpTree($node); - - - echo "\n\nTest getAncestors() for 'x' in one query:\n"; - echo "-------------------------------------\n"; - - $criteria = new Criteria(); - $criteria->add(TestPeer::LABEL, 'x', Criteria::EQUAL); - - $nodes = TestNodePeer::retrieveNodes($criteria, true, false); - $ancestors = $nodes[0]->getAncestors(false); - - foreach ($ancestors as $ancestor) - echo $ancestor->getNodePath() . " -> " . $ancestor->getLabel() . "\n"; - - - echo "\n\nTest retrieveNodeByNP() for 'o' (with ancestors and descendants in one query):\n"; - echo "-------------------------------------\n"; - - $o_addr = array(1,1,3,2); - - $node = TestNodePeer::retrieveNodeByNP(implode($nodeKeySep, $o_addr), true, true); - - echo "ancestors:\n"; - foreach ($node->getAncestors(false) as $ancestor) - echo $ancestor->getNodePath() . " -> " . $ancestor->getLabel() . "\n"; - - echo "\ndescendants:\n"; - dumpTree($node); - - - echo "\n\nTest retrieveNodes() between 'b' and 'g' (without descendants)\n"; - echo "-------------------------------------\n"; - - $criteria = new Criteria(); - $criteria->add(TestPeer::LABEL, 'b', Criteria::GREATER_EQUAL); - $criteria->addAnd(TestPeer::LABEL, 'g', Criteria::LESS_EQUAL); - $criteria->addAscendingOrderByColumn(TestPeer::LABEL); - - $nodes = TestNodePeer::retrieveNodes($criteria, false, false); - - foreach ($nodes as $node) - echo $node->getNodePath() . " -> " . $node->getLabel() . "\n"; - - - echo "\n\nTest retrieveNodes() between 'b' and 'g' (with descendants)\n"; - echo "-------------------------------------\n"; - - $criteria = new Criteria(); - $criteria->add(TestPeer::LABEL, 'b', Criteria::GREATER_EQUAL); - $criteria->addAnd(TestPeer::LABEL, 'g', Criteria::LESS_EQUAL); - $criteria->addAscendingOrderByColumn(TestPeer::LABEL); - - $nodes = TestNodePeer::retrieveNodes($criteria, false, true); - - foreach ($nodes as $node) - { - dumpTree($node); - echo "\n"; - } - - -} catch (Exception $e) { - die("Error retrieving nodes: " . $e->__toString()); -} - -try { - - echo "\nCreating new tree:\n"; - echo "-------------------------------------\n"; - - $a = new Test(); - $a->setLabel("a"); - $a = TestNodePeer::createNewRootNode($a); - echo "Created 'a' as new root\n"; - - echo "\nAdding 10 child nodes:\n"; - echo "-------------------------------------\n"; - - $b = new TestNode(); - $b->setLabel('b'); - $a->addChildNode($b); - - $c = new TestNode(); - $c->setLabel('c'); - $a->addChildNode($c); - - $d = new TestNode(); - $d->setLabel('d'); - $a->addChildNode($d); - - $e = new TestNode(); - $e->setLabel('e'); - $a->addChildNode($e); - - $f = new TestNode(); - $f->setLabel('f'); - $a->addChildNode($f); - - $g = new TestNode(); - $g->setLabel('g'); - $a->addChildNode($g); - - $h = new TestNode(); - $h->setLabel('h'); - $a->addChildNode($h); - - $i = new TestNode(); - $i->setLabel('i'); - $a->addChildNode($i); - - $j = new TestNode(); - $j->setLabel('j'); - $a->addChildNode($j); - - $k = new TestNode(); - $k->setLabel('k'); - $a->addChildNode($k); - - echo "\ndescendants:\n"; - dumpTree($a); - - echo "\nRetrieving last node:\n"; - echo "-------------------------------------\n"; - - $last = $a->getLastChildNode(true); - echo "Last child node is '" . $last->getLabel() . "' (" . $last->getNodePath() . ")\n"; - -} catch (Exception $e) { - die("Error creating tree with > 10 nodes: " . $e->__toString()); -} - -if (!isset($argc)) echo ""; From 7490c81a8f70ab5752330c87215d6a5afaeda78f Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 23 Jul 2014 15:56:23 -0400 Subject: [PATCH 185/310] CC-5895: Upgrade Propel to 1.7 Moved composer.json to top level of repo so propel will get installed there Updated install scripts to reflect this change --- .gitignore | 4 ++++ airtime_mvc/application/Bootstrap.php | 2 +- airtime_mvc/library/propel/composer.json => composer.json | 0 install_minimal/include/airtime-db-install.php | 2 +- install_minimal/include/airtime-install.php | 2 +- install_minimal/include/airtime-installed-check.php | 2 +- 6 files changed, 8 insertions(+), 4 deletions(-) rename airtime_mvc/library/propel/composer.json => composer.json (100%) diff --git a/.gitignore b/.gitignore index bc3c72ed97..16b0335f9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ .* *.pyc +vendor/* +composer.phar +composer.lock + diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index 7f333960aa..e5bc04dce0 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -3,7 +3,7 @@ $CC_CONFIG = Config::getConfig(); require_once __DIR__."/configs/ACL.php"; -require_once 'propel/vendor/propel/propel1/runtime/lib/Propel.php'; +require_once 'vendor/propel/propel1/runtime/lib/Propel.php'; Propel::init(__DIR__."/configs/airtime-conf-production.php"); diff --git a/airtime_mvc/library/propel/composer.json b/composer.json similarity index 100% rename from airtime_mvc/library/propel/composer.json rename to composer.json diff --git a/install_minimal/include/airtime-db-install.php b/install_minimal/include/airtime-db-install.php index 084aad9a6d..ae49fec40c 100644 --- a/install_minimal/include/airtime-db-install.php +++ b/install_minimal/include/airtime-db-install.php @@ -16,7 +16,7 @@ set_include_path(AirtimeInstall::GetAirtimeSrcDir().'/application/models' . PATH_SEPARATOR . get_include_path()); $CC_CONFIG = Config::getConfig(); -require_once 'propel/vendor/propel/propel1/runtime/lib/Propel.php'; +require_once 'vendor/propel/propel1/runtime/lib/Propel.php'; Propel::init(AirtimeInstall::GetAirtimeSrcDir()."/application/configs/airtime-conf-production.php"); //use this class to set new values in the cache as well. diff --git a/install_minimal/include/airtime-install.php b/install_minimal/include/airtime-install.php index f231968b62..db01fdcf97 100644 --- a/install_minimal/include/airtime-install.php +++ b/install_minimal/include/airtime-install.php @@ -23,7 +23,7 @@ //reinstall, Will ask if we should rewrite config files. require_once(AirtimeInstall::GetAirtimeSrcDir().'/application/configs/conf.php'); $CC_CONFIG = Config::getConfig(); - require_once 'propel/vendor/propel/propel1/runtime/lib/Propel.php'; + require_once 'vendor/propel/propel1/runtime/lib/Propel.php'; Propel::init(AirtimeInstall::GetAirtimeSrcDir()."/application/configs/airtime-conf-production.php"); $version = AirtimeInstall::GetVersionInstalled(); $newInstall = is_null($version); diff --git a/install_minimal/include/airtime-installed-check.php b/install_minimal/include/airtime-installed-check.php index 5609675edc..40d3959faa 100644 --- a/install_minimal/include/airtime-installed-check.php +++ b/install_minimal/include/airtime-installed-check.php @@ -22,7 +22,7 @@ require_once(AirtimeInstall::GetAirtimeSrcDir()."/application/configs/db-conf.php"); $CC_CONFIG = Config::getConfig(); -require_once('propel/vendor/propel/propel1/runtime/lib/Propel.php'); +require_once('vendor/propel/propel1/runtime/lib/Propel.php'); Propel::init(AirtimeInstall::GetAirtimeSrcDir()."/application/configs/airtime-conf-production.php"); $version = AirtimeInstall::GetVersionInstalled(); From b38f3d7e03221b75d8ce30de5d0e2e92c0218bc5 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 23 Jul 2014 16:13:55 -0400 Subject: [PATCH 186/310] CC-5895: Upgrade Propel to 1.7 Add vendor directory to include path --- airtime_mvc/application/Bootstrap.php | 2 +- airtime_mvc/public/index.php | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index e5bc04dce0..10a7e5f15a 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -3,7 +3,7 @@ $CC_CONFIG = Config::getConfig(); require_once __DIR__."/configs/ACL.php"; -require_once 'vendor/propel/propel1/runtime/lib/Propel.php'; +require_once 'propel/propel1/runtime/lib/Propel.php'; Propel::init(__DIR__."/configs/airtime-conf-production.php"); diff --git a/airtime_mvc/public/index.php b/airtime_mvc/public/index.php index 5c4dcdae87..19ede1db18 100644 --- a/airtime_mvc/public/index.php +++ b/airtime_mvc/public/index.php @@ -25,6 +25,9 @@ function exception_error_handler($errno, $errstr, $errfile, $errline) defined('VERBOSE_STACK_TRACE') || define('VERBOSE_STACK_TRACE', (getenv('VERBOSE_STACK_TRACE') ? getenv('VERBOSE_STACK_TRACE') : true)); +//Vendors +set_include_path(realpath(dirname(__FILE__) . '/../../vendor')); + // Ensure library/ is on include_path set_include_path(implode(PATH_SEPARATOR, array( get_include_path(), From f1ea100411982c405fc7792aacc7f4f73cca81aa Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 24 Jul 2014 16:56:15 -0400 Subject: [PATCH 187/310] CC-5896: Store cloud files in separate table, inherited from cc_files --- .../application/controllers/ApiController.php | 35 ++------- airtime_mvc/application/models/StoredFile.php | 77 +++++++------------ .../application/models/airtime/CcFiles.php | 30 ++++++++ .../application/models/airtime/CloudFile.php | 35 +++++++++ .../models/airtime/om/BaseCloudFile.php | 22 +++--- .../models/airtime/om/BaseCloudFilePeer.php | 12 +-- .../models/airtime/om/BaseCloudFileQuery.php | 34 ++++---- .../rest/controllers/MediaController.php | 44 +++++++---- airtime_mvc/build/schema.xml | 2 +- dev_tools/propel_regenerate.sh | 2 +- .../cloud_storage_uploader.py | 2 +- 11 files changed, 165 insertions(+), 130 deletions(-) diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index 47573065d1..3f0806285d 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -81,34 +81,10 @@ public function getMediaAction() $media = Application_Model_StoredFile::RecallById($fileId); if ($media != null) { - - if ($media->isInCloud()) { - if ("true" == $this->_getParam('download')) { - header('Content-type:'.$media->getPropelOrm()->getDbMime()); - header('Content-Disposition: attachment; filename="'.$media->getResourceId().'"'); - header('Content-length:'.$media->getFileSize()); - echo $media->getCloudUrl(); - exit; - } else { - $this->_redirect($media->getCloudUrl()); - } - } - - $filepath = $media->getFilePath(); // Make sure we don't have some wrong result beecause of caching clearstatcache(); - if (is_file($filepath)) { - $full_path = $media->getPropelOrm()->getDbFilepath(); - - $file_base_name = strrchr($full_path, '/'); - /* If $full_path does not contain a '/', strrchr will return false, - * in which case we can use $full_path as the base name. - */ - if (!$file_base_name) { - $file_base_name = $full_path; - } else { - $file_base_name = substr($file_base_name, 1); - } + if ($media->getPropelOrm()->isValidFile()) { + $filename = $media->getPropelOrm()->getFilename(); //Download user left clicks a track and selects Download. if ("true" == $this->_getParam('download')) { @@ -116,14 +92,13 @@ public function getMediaAction() //We just want the basename which is the file name with the path //information stripped away. We are using Content-Disposition to specify //to the browser what name the file should be saved as. - header('Content-Disposition: attachment; filename="'.$file_base_name.'"'); + header('Content-Disposition: attachment; filename="'.$filename.'"'); } else { //user clicks play button for track and downloads it. - header('Content-Disposition: inline; filename="'.$file_base_name.'"'); + header('Content-Disposition: inline; filename="'.$filename.'"'); } - $this->smartReadFile($filepath, $media->getPropelOrm()->getDbMime()); - exit; + $this->_redirect($media->getFilePath()); } else { header ("HTTP/1.1 404 Not Found"); } diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 199ec6787b..85a9ef22f8 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -97,7 +97,7 @@ public function setLastPlayedTime($p_now) } public static function createWithFile($f, $con) { - $storedFile = new Application_Model_StoredFile($f, $con); + $storedFile = new Application_Model_StoredFile($f, $con); return $storedFile; } @@ -384,19 +384,16 @@ public function delete() $file_id = $this->_file->getDbId(); Logging::info("User ".$user->getLogin()." is deleting file: ".$this->_file->getDbTrackTitle()." - file id: ".$file_id); - $isInCloud = $this->isInCloud(); - - if (file_exists($filepath) && !$isInCloud) { + $music_dir = Application_Model_MusicDir::getDirByPK($this->_file->getDbDirectory()); + if (!is_null($music_dir) && $music_dir->getType() == "stor" && file_exists($filepath)) { try { + $this->doFileDeletionCleanup($this->getFileSize()); unlink($filepath); } catch (Exception $e) { Logging::error($e->getMessage()); return; } - - $this->doFileDeletionCleanup($this->getFileSize()); - - } elseif ($isInCloud) { + } /*elseif ($isInCloud) { //Dispatch a message to airtime_analyzer through RabbitMQ, //notifying it that we need to delete a file from the cloud $CC_CONFIG = Config::getConfig(); @@ -408,7 +405,7 @@ public function delete() Application_Model_RabbitMq::SendDeleteMessageToAnalyzer( $callbackUrl, $this->_file->getDbResourceId(), $apiKey, 'delete'); - } + }*/ } /* @@ -416,6 +413,9 @@ public function delete() */ public function doFileDeletionCleanup($filesize) { + if ($filesize <= 0) { + throw new Exception ("Could not delete file with ".$filesize." filesize"); + } //Update the user's disk usage Application_Model_Preference::updateDiskUsage(-1 * $filesize); @@ -432,7 +432,7 @@ public function doFileDeletionCleanup($filesize) * deleted from the library. It re-calculates the length of * all blocks and playlists that contained the deleted file. */ - public static function updateBlockAndPlaylistLength($fileId) + private static function updateBlockAndPlaylistLength($fileId) { $plRows = CcPlaylistcontentsQuery::create()->filterByDbFileId($fileId)->find(); foreach ($plRows as $row) { @@ -511,7 +511,7 @@ public function getFileExtension() } /** - * Get real filename of raw media data + * Get the absolute filepath * * @return string */ @@ -519,20 +519,7 @@ public function getFilePath() { assert($this->_file); - if ($this->isInCloud()) { - return $this->getCloudUrl(); - } else { - - $music_dir = Application_Model_MusicDir::getDirByPK($this-> - _file->getDbDirectory()); - if (!$music_dir) { - throw new Exception("Invalid music_dir for file in database."); - } - $directory = $music_dir->getDirectory(); - $filepath = $this->_file->getDbFilepath(); - - return Application_Common_OsPath::join($directory, $filepath); - } + return $this->_file->getAbsoluteFilePath(); } /** @@ -585,21 +572,6 @@ public function getRelativeFileUrl($baseUrl) return $baseUrl."api/get-media/file/".$this->getId().".".$this->getFileExtension(); } - public function isInCloud() - { - $location = CcMusicDirsQuery::create()->findPk($this->_file->getDbDirectory()); - if ($location->getType() == "cloud") { - return true; - } - return false; - } - - public function getCloudUrl() - { - $CC_CONFIG = Config::getConfig(); - return $CC_CONFIG["cloud_storage"]["host"]."/".$CC_CONFIG["cloud_storage"]["bucket"]."/" . urlencode($this->getResourceId()); - } - public function getResourceId() { return $this->_file->getDbResourceId(); @@ -607,12 +579,7 @@ public function getResourceId() public function getFileSize() { - if ($this->isInCloud()) { - //TODO: error checking - 403 forbidden> - return strlen(file_get_contents($this->getCloudUrl())); - } else { - return filesize($this->getFilePath()); - } + return $this->_file->getFileSize(); } public static function Insert($md, $con) @@ -653,8 +620,19 @@ public static function RecallById($p_id=null, $con=null) { } if (isset($p_id)) { - $f = CcFilesQuery::create()->findPK(intval($p_id), $con); - return is_null($f) ? null : self::createWithFile($f, $con); + $storedFile = CcFilesQuery::create()->findPK(intval($p_id), $con); + if (is_null($storedFile)) { + throw new Exception("Could not recall file with id: ".$p_id); + } + //Attempt to get the cloud file object and return it. If no cloud + //file object is found then we are dealing with a regular stored + //object so return that + $cloudFile = $storedFile->getCloudFiles()->getFirst(); + if (is_null($cloudFile)) { + return self::createWithFile($storedFile, $con); + } else { + return self::createWithFile($cloudFile, $con); + } } else { throw new Exception("No arguments passed to RecallById"); } @@ -662,8 +640,7 @@ public static function RecallById($p_id=null, $con=null) { public function getName() { - $info = pathinfo($this->getFilePath()); - return $info['filename']; + return $this->_file->getFilename(); } /** diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index 93ef491a8e..24c3e35536 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -70,4 +70,34 @@ public static function sanitizeResponse($file) return $response; } + + public function getFileSize() + { + return filesize($this->getAbsoluteFilePath()); + } + + public function getFilename() + { + $info = pathinfo($this->getAbsoluteFilePath()); + return $info['filename']; + } + + public function getAbsoluteFilePath() + { + $music_dir = Application_Model_MusicDir::getDirByPK($this-> + _file->getDbDirectory()); + if (!$music_dir) { + throw new Exception("Invalid music_dir for file in database."); + } + $directory = $music_dir->getDirectory(); + $filepath = $this->_file->getDbFilepath(); + + return Application_Common_OsPath::join($directory, $filepath); + } + + public function isValidFile() + { + return is_file($this->getAbsoluteFilePath()); + } + } // CcFiles diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index 7c5cfc456a..bf6330d112 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -15,4 +15,39 @@ */ class CloudFile extends BaseCloudFile { + public function getAbsoluteFilePath() + { + $CC_CONFIG = Config::getConfig(); + return $CC_CONFIG["cloud_storage"]["host"]."/".$CC_CONFIG["cloud_storage"]["bucket"]."/" . urlencode($this->getResourceId()); + } + + public function getFileSize() + { + return strlen(file_get_contents($this->getAbsoluteFilePath())); + } + + public function getFilename() + { + return $this->getResourceId(); + } + + public function isValidFile() + { + $ch = curl_init(); + curl_setopt_array($ch, array( + CURLOPT_URL => $this->getAbsoluteFilePath(), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_VERBOSE => false + )); + curl_exec($ch); + $http_status = curl_getinfo($ch); + + if ($http_status["http_code"] === 200) + { + return true; + } else { + return false; + } + } } diff --git a/airtime_mvc/application/models/airtime/om/BaseCloudFile.php b/airtime_mvc/application/models/airtime/om/BaseCloudFile.php index 59e5b871d0..f9b2e07275 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCloudFile.php +++ b/airtime_mvc/application/models/airtime/om/BaseCloudFile.php @@ -77,7 +77,7 @@ abstract class BaseCloudFile extends BaseObject implements Persistent * * @return int */ - public function getId() + public function getDbId() { return $this->id; @@ -111,7 +111,7 @@ public function getCcFileId() * @param int $v new value * @return CloudFile The current object (for fluent API support) */ - public function setId($v) + public function setDbId($v) { if ($v !== null && is_numeric($v)) { $v = (int) $v; @@ -124,7 +124,7 @@ public function setId($v) return $this; - } // setId() + } // setDbId() /** * Set the value of [resource_id] column. @@ -623,7 +623,7 @@ public function getByPosition($pos) { switch ($pos) { case 0: - return $this->getId(); + return $this->getDbId(); break; case 1: return $this->getResourceId(); @@ -660,7 +660,7 @@ public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColum $alreadyDumpedObjects['CloudFile'][$this->getPrimaryKey()] = true; $keys = CloudFilePeer::getFieldNames($keyType); $result = array( - $keys[0] => $this->getId(), + $keys[0] => $this->getDbId(), $keys[1] => $this->getResourceId(), $keys[2] => $this->getCcFileId(), ); @@ -708,7 +708,7 @@ public function setByPosition($pos, $value) { switch ($pos) { case 0: - $this->setId($value); + $this->setDbId($value); break; case 1: $this->setResourceId($value); @@ -740,7 +740,7 @@ public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) { $keys = CloudFilePeer::getFieldNames($keyType); - if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); if (array_key_exists($keys[1], $arr)) $this->setResourceId($arr[$keys[1]]); if (array_key_exists($keys[2], $arr)) $this->setCcFileId($arr[$keys[2]]); } @@ -783,7 +783,7 @@ public function buildPkeyCriteria() */ public function getPrimaryKey() { - return $this->getId(); + return $this->getDbId(); } /** @@ -794,7 +794,7 @@ public function getPrimaryKey() */ public function setPrimaryKey($key) { - $this->setId($key); + $this->setDbId($key); } /** @@ -804,7 +804,7 @@ public function setPrimaryKey($key) public function isPrimaryKeyNull() { - return null === $this->getId(); + return null === $this->getDbId(); } /** @@ -836,7 +836,7 @@ public function copyInto($copyObj, $deepCopy = false, $makeNew = true) if ($makeNew) { $copyObj->setNew(true); - $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + $copyObj->setDbId(NULL); // this is a auto-increment column, so set to default value } } diff --git a/airtime_mvc/application/models/airtime/om/BaseCloudFilePeer.php b/airtime_mvc/application/models/airtime/om/BaseCloudFilePeer.php index 464a6bd7e9..93a0f4d7bb 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCloudFilePeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCloudFilePeer.php @@ -60,8 +60,8 @@ abstract class BaseCloudFilePeer * e.g. CloudFilePeer::$fieldNames[CloudFilePeer::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('Id', 'ResourceId', 'CcFileId', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('id', 'resourceId', 'ccFileId', ), + BasePeer::TYPE_PHPNAME => array ('DbId', 'ResourceId', 'CcFileId', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'resourceId', 'ccFileId', ), BasePeer::TYPE_COLNAME => array (CloudFilePeer::ID, CloudFilePeer::RESOURCE_ID, CloudFilePeer::CC_FILE_ID, ), BasePeer::TYPE_RAW_COLNAME => array ('ID', 'RESOURCE_ID', 'CC_FILE_ID', ), BasePeer::TYPE_FIELDNAME => array ('id', 'resource_id', 'cc_file_id', ), @@ -75,8 +75,8 @@ abstract class BaseCloudFilePeer * e.g. CloudFilePeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('Id' => 0, 'ResourceId' => 1, 'CcFileId' => 2, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('id' => 0, 'resourceId' => 1, 'ccFileId' => 2, ), + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'ResourceId' => 1, 'CcFileId' => 2, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'resourceId' => 1, 'ccFileId' => 2, ), BasePeer::TYPE_COLNAME => array (CloudFilePeer::ID => 0, CloudFilePeer::RESOURCE_ID => 1, CloudFilePeer::CC_FILE_ID => 2, ), BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'RESOURCE_ID' => 1, 'CC_FILE_ID' => 2, ), BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'resource_id' => 1, 'cc_file_id' => 2, ), @@ -287,7 +287,7 @@ public static function addInstanceToPool($obj, $key = null) { if (Propel::isInstancePoolingEnabled()) { if ($key === null) { - $key = (string) $obj->getId(); + $key = (string) $obj->getDbId(); } // if key === null CloudFilePeer::$instances[$key] = $obj; } @@ -310,7 +310,7 @@ public static function removeInstanceFromPool($value) { if (Propel::isInstancePoolingEnabled() && $value !== null) { if (is_object($value) && $value instanceof CloudFile) { - $key = (string) $value->getId(); + $key = (string) $value->getDbId(); } elseif (is_scalar($value)) { // assume we've been passed a primary key $key = (string) $value; diff --git a/airtime_mvc/application/models/airtime/om/BaseCloudFileQuery.php b/airtime_mvc/application/models/airtime/om/BaseCloudFileQuery.php index ca320f13ff..d09041387b 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCloudFileQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCloudFileQuery.php @@ -6,11 +6,11 @@ * * * - * @method CloudFileQuery orderById($order = Criteria::ASC) Order by the id column + * @method CloudFileQuery orderByDbId($order = Criteria::ASC) Order by the id column * @method CloudFileQuery orderByResourceId($order = Criteria::ASC) Order by the resource_id column * @method CloudFileQuery orderByCcFileId($order = Criteria::ASC) Order by the cc_file_id column * - * @method CloudFileQuery groupById() Group by the id column + * @method CloudFileQuery groupByDbId() Group by the id column * @method CloudFileQuery groupByResourceId() Group by the resource_id column * @method CloudFileQuery groupByCcFileId() Group by the cc_file_id column * @@ -28,7 +28,7 @@ * @method CloudFile findOneByResourceId(string $resource_id) Return the first CloudFile filtered by the resource_id column * @method CloudFile findOneByCcFileId(int $cc_file_id) Return the first CloudFile filtered by the cc_file_id column * - * @method array findById(int $id) Return CloudFile objects filtered by the id column + * @method array findByDbId(int $id) Return CloudFile objects filtered by the id column * @method array findByResourceId(string $resource_id) Return CloudFile objects filtered by the resource_id column * @method array findByCcFileId(int $cc_file_id) Return CloudFile objects filtered by the cc_file_id column * @@ -121,7 +121,7 @@ public function findPk($key, $con = null) * @return CloudFile A model object, or null if the key is not found * @throws PropelException */ - public function findOneById($key, $con = null) + public function findOneByDbId($key, $con = null) { return $this->findPk($key, $con); } @@ -232,13 +232,13 @@ public function filterByPrimaryKeys($keys) * * Example usage: * - * $query->filterById(1234); // WHERE id = 1234 - * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) - * $query->filterById(array('min' => 12)); // WHERE id >= 12 - * $query->filterById(array('max' => 12)); // WHERE id <= 12 + * $query->filterByDbId(1234); // WHERE id = 1234 + * $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterByDbId(array('min' => 12)); // WHERE id >= 12 + * $query->filterByDbId(array('max' => 12)); // WHERE id <= 12 * * - * @param mixed $id The value to use as filter. + * @param mixed $dbId The value to use as filter. * Use scalar values for equality. * Use array values for in_array() equivalent. * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. @@ -246,16 +246,16 @@ public function filterByPrimaryKeys($keys) * * @return CloudFileQuery The current query, for fluid interface */ - public function filterById($id = null, $comparison = null) + public function filterByDbId($dbId = null, $comparison = null) { - if (is_array($id)) { + if (is_array($dbId)) { $useMinMax = false; - if (isset($id['min'])) { - $this->addUsingAlias(CloudFilePeer::ID, $id['min'], Criteria::GREATER_EQUAL); + if (isset($dbId['min'])) { + $this->addUsingAlias(CloudFilePeer::ID, $dbId['min'], Criteria::GREATER_EQUAL); $useMinMax = true; } - if (isset($id['max'])) { - $this->addUsingAlias(CloudFilePeer::ID, $id['max'], Criteria::LESS_EQUAL); + if (isset($dbId['max'])) { + $this->addUsingAlias(CloudFilePeer::ID, $dbId['max'], Criteria::LESS_EQUAL); $useMinMax = true; } if ($useMinMax) { @@ -266,7 +266,7 @@ public function filterById($id = null, $comparison = null) } } - return $this->addUsingAlias(CloudFilePeer::ID, $id, $comparison); + return $this->addUsingAlias(CloudFilePeer::ID, $dbId, $comparison); } /** @@ -428,7 +428,7 @@ public function useCcFilesQuery($relationAlias = null, $joinType = Criteria::LEF public function prune($cloudFile = null) { if ($cloudFile) { - $this->addUsingAlias(CloudFilePeer::ID, $cloudFile->getId(), Criteria::NOT_EQUAL); + $this->addUsingAlias(CloudFilePeer::ID, $cloudFile->getDbId(), Criteria::NOT_EQUAL); } return $this; diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index de88a12505..6cb72062ac 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -217,12 +217,6 @@ public function putAction() $requestData = json_decode($this->getRequest()->getRawBody(), true); $whiteList = $this->removeBlacklistedFieldsFromRequestData($requestData); $whiteList = $this->stripTimeStampFromYearTag($whiteList); - - if ($requestData["import_status"] == 2) { - $file->setDbImportStatus(2)->save(); - $this->importFailedResponse(); - return; - } if (!$this->validateRequestData($file, $whiteList)) { $file->save(); @@ -230,16 +224,40 @@ public function putAction() } else if ($file) { $file->fromArray($whiteList, BasePeer::TYPE_FIELDNAME); - if (isset($requestData["s3_object_name"])) { - $cloud_cc_music_dir = CcMusicDirsQuery::create() - ->filterByType("cloud") - ->findOne(); - $file->setDbDirectory($cloud_cc_music_dir->getId()); - $file->setDbResourceId($requestData["s3_object_name"]); + //file is stored in the cloud + if (isset($requestData["resource_id"])) { + $fileSizeBytes = $requestData["filesize"]; + $cloudFile = new CloudFile(); + $cloudFile->setResourceId($requestData["resource_id"]); + $cloudFile->setCcFiles($file); + $cloudFile->save(); - Application_Model_Preference::updateDiskUsage($requestData["filesize"]); + //file is stored locally + } else if (isset($requestData["full_path"])) { + $fileSizeBytes = filesize($requestData["full_path"]); + if ($fileSizeBytes === false) + { + $file->setDbImportStatus(2)->save(); + $this->fileNotFoundResponse(); + return; + } + + $fullPath = $requestData["full_path"]; + $storDir = Application_Model_MusicDir::getStorDir()->getDirectory(); + $pos = strpos($fullPath, $storDir); + + if ($pos !== FALSE) + { + assert($pos == 0); //Path must start with the stor directory path + + $filePathRelativeToStor = substr($fullPath, strlen($storDir)); + $file->setDbFilepath($filePathRelativeToStor); + $file->setDbDirectory(1); //1 corresponds to the default stor/imported directory. + } } + Application_Model_Preference::updateDiskUsage($fileSizeBytes); + $now = new DateTime("now", new DateTimeZone("UTC")); $file->setDbMtime($now); $file->save(); diff --git a/airtime_mvc/build/schema.xml b/airtime_mvc/build/schema.xml index 4b2c29d548..eb5b0ac14d 100644 --- a/airtime_mvc/build/schema.xml +++ b/airtime_mvc/build/schema.xml @@ -100,7 +100,7 @@ - + diff --git a/dev_tools/propel_regenerate.sh b/dev_tools/propel_regenerate.sh index e13ae4cbb9..1ecb7b53e5 100755 --- a/dev_tools/propel_regenerate.sh +++ b/dev_tools/propel_regenerate.sh @@ -8,4 +8,4 @@ cd $SCRIPTPATH/../airtime_mvc/ path=`pwd` cd build sed -i s#"project\.home =.*$"#"project.home = $path"#g build.properties -../library/propel/vendor/propel/propel1/generator/bin/propel-gen +../../vendor/propel/propel1/generator/bin/propel-gen diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index 667725c32f..70a3528524 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -41,7 +41,7 @@ def upload_obj(self, audio_file_path, metadata): except OSError: logging.info("Could not remove %s from organize directory" % audio_file_path) - metadata["s3_object_name"] = object_name + metadata["resource_id"] = object_name return metadata def delete_obj(self, obj_name): From ecb072b84cccde687adedd2cf68dc9f188f2b1cd Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 28 Jul 2014 15:17:46 -0400 Subject: [PATCH 188/310] CC-5896: Store cloud files in separate table, inherited from cc_files Fixed broken metadata display on Library page Fixed broken download/preview option from Library page --- .../application/controllers/ApiController.php | 26 ++++++++++++------- .../controllers/LibraryController.php | 2 +- .../rest/controllers/MediaController.php | 3 +++ .../cloud_storage_uploader.py | 3 +++ 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index 3f0806285d..13f7f97466 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -83,8 +83,10 @@ public function getMediaAction() if ($media != null) { // Make sure we don't have some wrong result beecause of caching clearstatcache(); + if ($media->getPropelOrm()->isValidFile()) { - $filename = $media->getPropelOrm()->getFilename(); + //$filename = $media->getPropelOrm()->getFilename(); + $filename = $media->getPropelOrm()->getDbFilepath(); //Download user left clicks a track and selects Download. if ("true" == $this->_getParam('download')) { @@ -94,11 +96,13 @@ public function getMediaAction() //to the browser what name the file should be saved as. header('Content-Disposition: attachment; filename="'.$filename.'"'); } else { - //user clicks play button for track and downloads it. + //user clicks play button for track preview header('Content-Disposition: inline; filename="'.$filename.'"'); + $this->_redirect($media->getFilePath()); } - $this->_redirect($media->getFilePath()); + $this->smartReadFile($media); + exit; } else { header ("HTTP/1.1 404 Not Found"); } @@ -119,12 +123,13 @@ public function getMediaAction() * @link https://groups.google.com/d/msg/jplayer/nSM2UmnSKKA/Hu76jDZS4xcJ * @link http://php.net/manual/en/function.readfile.php#86244 */ - public function smartReadFile($location, $mimeType = 'audio/mp3') + public function smartReadFile($media) { - $size= filesize($location); - $time= date('r', filemtime($location)); + $filepath = $media->getFilePath(); + $size= $media->getFileSize(); + $mimeType = $media->getPropelOrm()->getDbMime(); - $fm = @fopen($location, 'rb'); + $fm = @fopen($filepath, 'rb'); if (!$fm) { header ("HTTP/1.1 505 Internal server error"); @@ -157,19 +162,22 @@ public function smartReadFile($location, $mimeType = 'audio/mp3') header("Content-Range: bytes $begin-$end/$size"); } header("Content-Transfer-Encoding: binary"); - header("Last-Modified: $time"); //We can have multiple levels of output buffering. Need to //keep looping until all have been disabled!!! //http://www.php.net/manual/en/function.ob-end-flush.php while (@ob_end_flush()); - $cur = $begin; + /*$cur = $begin; fseek($fm, $begin, 0); while (!feof($fm) && $cur <= $end && (connection_status() == 0)) { echo fread($fm, min(1024 * 16, ($end - $cur) + 1)); $cur += 1024 * 16; + }*/ + + while(!feof($fm)) { + echo fread($fm, 1024 * 8); } } diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index 41ab24eaa8..bcb44e04da 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -481,7 +481,7 @@ public function getFileMetadataAction() $md = $file->getMetadata(); foreach ($md as $key => $value) { - if ($key == 'MDATA_KEY_DIRECTORY') { + if ($key == 'MDATA_KEY_DIRECTORY' && !is_null($value)) { $musicDir = Application_Model_MusicDir::getDirByPK($value); $md['MDATA_KEY_FILEPATH'] = Application_Common_OsPath::join($musicDir->getDirectory(), $md['MDATA_KEY_FILEPATH']); } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 6cb72062ac..7c57b58d7d 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -226,6 +226,9 @@ public function putAction() //file is stored in the cloud if (isset($requestData["resource_id"])) { + //store the original filename + $file->setDbFilepath($requestData["filename"]); + $fileSizeBytes = $requestData["filesize"]; $cloudFile = new CloudFile(); $cloudFile->setResourceId($requestData["resource_id"]); diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index 70a3528524..3113d2937b 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -41,6 +41,9 @@ def upload_obj(self, audio_file_path, metadata): except OSError: logging.info("Could not remove %s from organize directory" % audio_file_path) + '''pass original filename to Airtime so we can store it in the db''' + metadata["filename"] = file_base_name + metadata["resource_id"] = object_name return metadata From f6aa2e5a3b8ab324aec42fa857a6fca48ad6f677 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 28 Jul 2014 16:02:06 -0400 Subject: [PATCH 189/310] CC-5896: Store cloud files in separate table, inherited from cc_files For cloud files, return the original filename when downloading a file instead of the cloud object name --- airtime_mvc/application/models/airtime/CcFiles.php | 3 +-- airtime_mvc/application/models/airtime/CloudFile.php | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index 24c3e35536..f9456f2620 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -84,8 +84,7 @@ public function getFilename() public function getAbsoluteFilePath() { - $music_dir = Application_Model_MusicDir::getDirByPK($this-> - _file->getDbDirectory()); + $music_dir = Application_Model_MusicDir::getDirByPK($this->getDbDirectory()); if (!$music_dir) { throw new Exception("Invalid music_dir for file in database."); } diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index bf6330d112..c1780d11c4 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -28,7 +28,7 @@ public function getFileSize() public function getFilename() { - return $this->getResourceId(); + return $this->getDbFilepath(); } public function isValidFile() From 6fa7ddba9a55f7b074a6a526fe0460a6c5331079 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 28 Jul 2014 16:03:57 -0400 Subject: [PATCH 190/310] CC-5896: Store cloud files in separate table, inherited from cc_files Added delete on cascade for cloud files --- .../application/models/airtime/map/CcFilesTableMap.php | 2 +- .../application/models/airtime/map/CloudFileTableMap.php | 4 ++-- airtime_mvc/application/models/airtime/om/BaseCcFiles.php | 7 +++---- .../application/models/airtime/om/BaseCcFilesPeer.php | 3 +++ airtime_mvc/build/schema.xml | 2 +- airtime_mvc/build/sql/schema.sql | 3 ++- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php index 86a8ff2abf..fa50a21ef7 100644 --- a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php @@ -120,7 +120,7 @@ public function buildRelations() $this->addRelation('FkOwner', 'CcSubjs', RelationMap::MANY_TO_ONE, array('owner_id' => 'id', ), null, null); $this->addRelation('CcSubjsRelatedByDbEditedby', 'CcSubjs', RelationMap::MANY_TO_ONE, array('editedby' => 'id', ), null, null); $this->addRelation('CcMusicDirs', 'CcMusicDirs', RelationMap::MANY_TO_ONE, array('directory' => 'id', ), null, null); - $this->addRelation('CloudFile', 'CloudFile', RelationMap::ONE_TO_MANY, array('id' => 'cc_file_id', ), null, null, 'CloudFiles'); + $this->addRelation('CloudFile', 'CloudFile', RelationMap::ONE_TO_MANY, array('id' => 'cc_file_id', ), 'CASCADE', null, 'CloudFiles'); $this->addRelation('CcShowInstances', 'CcShowInstances', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcShowInstancess'); $this->addRelation('CcPlaylistcontents', 'CcPlaylistcontents', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcPlaylistcontentss'); $this->addRelation('CcBlockcontents', 'CcBlockcontents', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcBlockcontentss'); diff --git a/airtime_mvc/application/models/airtime/map/CloudFileTableMap.php b/airtime_mvc/application/models/airtime/map/CloudFileTableMap.php index 0c25ddfb32..898fc0b793 100644 --- a/airtime_mvc/application/models/airtime/map/CloudFileTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CloudFileTableMap.php @@ -39,7 +39,7 @@ public function initialize() $this->setUseIdGenerator(true); $this->setPrimaryKeyMethodInfo('cloud_file_id_seq'); // columns - $this->addPrimaryKey('id', 'Id', 'INTEGER', true, null, null); + $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); $this->addColumn('resource_id', 'ResourceId', 'LONGVARCHAR', true, null, null); $this->addForeignKey('cc_file_id', 'CcFileId', 'INTEGER', 'cc_files', 'id', false, null, null); // validators @@ -50,7 +50,7 @@ public function initialize() */ public function buildRelations() { - $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('cc_file_id' => 'id', ), null, null); + $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('cc_file_id' => 'id', ), 'CASCADE', null); } // buildRelations() /** diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php index 591bfa07e0..e10a0946f9 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php @@ -3405,10 +3405,9 @@ protected function doSave(PropelPDO $con) if ($this->cloudFilesScheduledForDeletion !== null) { if (!$this->cloudFilesScheduledForDeletion->isEmpty()) { - foreach ($this->cloudFilesScheduledForDeletion as $cloudFile) { - // need to save related object because we set the relation to null - $cloudFile->save($con); - } + CloudFileQuery::create() + ->filterByPrimaryKeys($this->cloudFilesScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); $this->cloudFilesScheduledForDeletion = null; } } diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php index 5466f9541a..c27d654c66 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php @@ -700,6 +700,9 @@ public static function clearInstancePool($and_clear_all_references = false) */ public static function clearRelatedInstancePool() { + // Invalidate objects in CloudFilePeer instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CloudFilePeer::clearInstancePool(); // Invalidate objects in CcShowInstancesPeer instance pool, // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. CcShowInstancesPeer::clearInstancePool(); diff --git a/airtime_mvc/build/schema.xml b/airtime_mvc/build/schema.xml index eb5b0ac14d..8ba1c24d94 100644 --- a/airtime_mvc/build/schema.xml +++ b/airtime_mvc/build/schema.xml @@ -103,7 +103,7 @@ - + diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index 6925c928a9..3c34da9100 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -694,7 +694,8 @@ ALTER TABLE "cc_files" ADD CONSTRAINT "cc_music_dirs_folder_fkey" ALTER TABLE "cloud_file" ADD CONSTRAINT "cloud_file_FK_1" FOREIGN KEY ("cc_file_id") - REFERENCES "cc_files" ("id"); + REFERENCES "cc_files" ("id") + ON DELETE CASCADE; ALTER TABLE "cc_perms" ADD CONSTRAINT "cc_perms_subj_fkey" FOREIGN KEY ("subj") From b7d1852fc04ceff8fd7f442001338d7eeff0a620 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 28 Jul 2014 16:11:05 -0400 Subject: [PATCH 191/310] CC-5896: Store cloud files in separate table, inherited from cc_files --- airtime_mvc/application/controllers/ApiController.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index 13f7f97466..4bb4e86412 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -85,8 +85,7 @@ public function getMediaAction() clearstatcache(); if ($media->getPropelOrm()->isValidFile()) { - //$filename = $media->getPropelOrm()->getFilename(); - $filename = $media->getPropelOrm()->getDbFilepath(); + $filename = $media->getPropelOrm()->getFilename(); //Download user left clicks a track and selects Download. if ("true" == $this->_getParam('download')) { From 8c2754972eff244e7ce02eecc396261cdc4077b4 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 29 Jul 2014 15:07:51 -0400 Subject: [PATCH 192/310] CC-5896: Store cloud files in separate table, inherited from cc_files Refactored storedfile->delete() Added a deletePhysicalFile function to CcFile and CloudFile Cleaned up schedule events that get passed to Pypo --- airtime_mvc/application/models/Schedule.php | 17 +++--- airtime_mvc/application/models/StoredFile.php | 54 +++++++------------ .../application/models/airtime/CcFiles.php | 5 ++ .../application/models/airtime/CloudFile.php | 17 ++++++ python_apps/pypo/pypofile.py | 14 +---- 5 files changed, 53 insertions(+), 54 deletions(-) diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index e941f98bc6..802125b5f0 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -724,7 +724,7 @@ private static function createInputHarborKickTimes(&$data, $range_start, $range_ } } - private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $filesize, $object_name, $isInCloud) + private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $filesize, $object_name=null) { $start = self::AirtimeTimeToPypoTime($item["start"]); $end = self::AirtimeTimeToPypoTime($item["end"]); @@ -759,10 +759,11 @@ private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, 'show_name' => $item["show_name"], 'replay_gain' => $replay_gain, 'independent_event' => $independent_event, - 'filesize' => $filesize, - 'object_name' => $object_name, - 'is_in_cloud' => $isInCloud + 'filesize' => $filesize ); + if (!is_null($object_name)) { + $schedule_item["object_name"] = $object_name; + } if ($schedule_item['cue_in'] > $schedule_item['cue_out']) { $schedule_item['cue_in'] = $schedule_item['cue_out']; @@ -895,10 +896,12 @@ private static function createScheduledEvents(&$data, $range_start, $range_end) $media_id = $item['file_id']; $storedFile = Application_Model_StoredFile::RecallById($media_id); $uri = $storedFile->getFilePath(); - $object_name = $storedFile->getResourceId(); + $object_name = null; + if ($storedFile->getPropelOrm() instanceof CloudFile) { + $object_name = $storedFile->getResourceId(); + } $filesize = $storedFile->getFileSize(); - $isInCloud = $storedFile->isInCloud(); - self::createFileScheduleEvent($data, $item, $media_id, $uri, $filesize, $object_name, $isInCloud); + self::createFileScheduleEvent($data, $item, $media_id, $uri, $filesize, $object_name); } elseif (!is_null($item['stream_id'])) { //row is type "webstream" diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 85a9ef22f8..3d31976217 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -387,44 +387,24 @@ public function delete() $music_dir = Application_Model_MusicDir::getDirByPK($this->_file->getDbDirectory()); if (!is_null($music_dir) && $music_dir->getType() == "stor" && file_exists($filepath)) { try { - $this->doFileDeletionCleanup($this->getFileSize()); - unlink($filepath); + $filesize = $this->getFileSize(); + + //Update the user's disk usage + Application_Model_Preference::updateDiskUsage(-1 * $filesize); + + //Explicitly update any playlist's and block's length that contain + //the file getting deleted + self::updateBlockAndPlaylistLength($this->_file->getDbId()); + + $this->_file->deletePhysicalFile(); + + //delete the file record from cc_files (and cloud_file, if applicable) + $this->_file->delete(); } catch (Exception $e) { Logging::error($e->getMessage()); return; } - } /*elseif ($isInCloud) { - //Dispatch a message to airtime_analyzer through RabbitMQ, - //notifying it that we need to delete a file from the cloud - $CC_CONFIG = Config::getConfig(); - $apiKey = $CC_CONFIG["apiKey"][0]; - - //If the file was successfully deleted from the cloud the analyzer - //will make a request to the Media API to do the deletion cleanup. - $callbackUrl = 'http://'.$_SERVER['HTTP_HOST'].'/rest/media/'.$file_id.'/delete-success'; - - Application_Model_RabbitMq::SendDeleteMessageToAnalyzer( - $callbackUrl, $this->_file->getDbResourceId(), $apiKey, 'delete'); - }*/ - } - - /* - * This function handles all the actions required when a file is deleted - */ - public function doFileDeletionCleanup($filesize) - { - if ($filesize <= 0) { - throw new Exception ("Could not delete file with ".$filesize." filesize"); } - //Update the user's disk usage - Application_Model_Preference::updateDiskUsage(-1 * $filesize); - - //Explicitly update any playlist's and block's length that contains - //the file getting deleted - self::updateBlockAndPlaylistLength($this->_file->getDbId()); - - //delete the file record from cc_files - $this->_file->delete(); } /* @@ -574,12 +554,16 @@ public function getRelativeFileUrl($baseUrl) public function getResourceId() { - return $this->_file->getDbResourceId(); + return $this->_file->getResourceId(); } public function getFileSize() { - return $this->_file->getFileSize(); + $filesize = $this->_file->getFileSize(); + if ($filesize <= 0) { + throw new Exception ("Could not determine filesize for file id: ".$this->_file->getDbId().". Filesize: ".$filesize); + } + return $filesize; } public static function Insert($md, $con) diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index f9456f2620..ea761f473a 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -99,4 +99,9 @@ public function isValidFile() return is_file($this->getAbsoluteFilePath()); } + public function deletePhysicalFile() + { + unlink($this->getAbsoluteFilePath()); + } + } // CcFiles diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index c1780d11c4..253b374d0d 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -50,4 +50,21 @@ public function isValidFile() return false; } } + + public function deletePhysicalFile() + { + //TODO: execute a python script that deletes the file from the cloud + + //Dispatch a message to airtime_analyzer through RabbitMQ, + //notifying it that we need to delete a file from the cloud + /*$CC_CONFIG = Config::getConfig(); + $apiKey = $CC_CONFIG["apiKey"][0]; + + //If the file was successfully deleted from the cloud the analyzer + //will make a request to the Media API to do the deletion cleanup. + $callbackUrl = 'http://'.$_SERVER['HTTP_HOST'].'/rest/media/'.$file_id.'/delete-success'; + + Application_Model_RabbitMq::SendDeleteMessageToAnalyzer( + $callbackUrl, $this->_file->getDbResourceId(), $apiKey, 'delete');*/ + } } diff --git a/python_apps/pypo/pypofile.py b/python_apps/pypo/pypofile.py index 4292adf62b..d6863883ce 100644 --- a/python_apps/pypo/pypofile.py +++ b/python_apps/pypo/pypofile.py @@ -37,21 +37,11 @@ def copy_file(self, media_item): """ src = media_item['uri'] dst = media_item['dst'] - is_in_cloud = media_item['is_in_cloud'] - - try: - if is_in_cloud: - src_size = media_item['filesize'] - else: - src_size = os.path.getsize(src) - except Exception, e: - self.logger.error("Could not get size of source file: %s", src) - return + src_size = media_item['filesize'] dst_exists = True try: dst_size = os.path.getsize(dst) - self.logger.debug(dst_size) except Exception, e: dst_exists = False @@ -73,7 +63,7 @@ def copy_file(self, media_item): """ copy will overwrite dst if it already exists """ - if is_in_cloud: + if 'object_name' in media_item: csd = CloudStorageDownloader() csd.download_obj(dst, media_item['object_name']) else: From dd37ffbdd7e9554c6c16d496bfee68252184f47d Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 31 Jul 2014 23:11:49 -0400 Subject: [PATCH 193/310] CC-5888: Handle file deletion if the file is stored in the cloud Execute a python script that deletes a file from the cloud --- .../controllers/LibraryController.php | 4 +- airtime_mvc/application/models/StoredFile.php | 44 +++++++++---------- .../application/models/airtime/CcFiles.php | 7 ++- .../application/models/airtime/CloudFile.php | 33 +++++++++----- .../rest/controllers/MediaController.php | 2 +- .../cloud_storage_uploader.py | 11 +++-- python_apps/pypo/cloud_storage_deleter.py | 24 ++++++++++ 7 files changed, 81 insertions(+), 44 deletions(-) create mode 100755 python_apps/pypo/cloud_storage_deleter.py diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index bcb44e04da..96cbf6e89c 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -351,7 +351,6 @@ public function deleteAction() foreach ($files as $id) { $file = Application_Model_StoredFile::RecallById($id); - if (isset($file)) { try { $res = $file->delete(); @@ -359,8 +358,9 @@ public function deleteAction() $message = $noPermissionMsg; } catch (Exception $e) { //could throw a scheduled in future exception. - $message = _("Could not delete some scheduled files."); + $message = _("Could not delete file(s)."); Logging::debug($e->getMessage()); + Logging::info($e->getMessage()); } } } diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 3d31976217..74bb51d2d8 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -384,27 +384,26 @@ public function delete() $file_id = $this->_file->getDbId(); Logging::info("User ".$user->getLogin()." is deleting file: ".$this->_file->getDbTrackTitle()." - file id: ".$file_id); - $music_dir = Application_Model_MusicDir::getDirByPK($this->_file->getDbDirectory()); - if (!is_null($music_dir) && $music_dir->getType() == "stor" && file_exists($filepath)) { - try { - $filesize = $this->getFileSize(); - - //Update the user's disk usage - Application_Model_Preference::updateDiskUsage(-1 * $filesize); - - //Explicitly update any playlist's and block's length that contain - //the file getting deleted - self::updateBlockAndPlaylistLength($this->_file->getDbId()); - - $this->_file->deletePhysicalFile(); - - //delete the file record from cc_files (and cloud_file, if applicable) - $this->_file->delete(); - } catch (Exception $e) { - Logging::error($e->getMessage()); - return; - } - } + //try { + //Delete the physical file from either the local stor directory + //or from the cloud + $this->_file->deletePhysicalFile(); + + $filesize = $this->getFileSize(); + + //Update the user's disk usage + Application_Model_Preference::updateDiskUsage(-1 * $filesize); + + //Explicitly update any playlist's and block's length that contain + //the file getting deleted + self::updateBlockAndPlaylistLength($this->_file->getDbId()); + + //delete the file record from cc_files (and cloud_file, if applicable) + $this->_file->delete(); + //} catch (Exception $e) { + //Logging::error($e->getMessage()); + //return; + //} } /* @@ -611,7 +610,8 @@ public static function RecallById($p_id=null, $con=null) { //Attempt to get the cloud file object and return it. If no cloud //file object is found then we are dealing with a regular stored //object so return that - $cloudFile = $storedFile->getCloudFiles()->getFirst(); + $cloudFile = CloudFileQuery::create()->findOneByCcFileId($p_id); + if (is_null($cloudFile)) { return self::createWithFile($storedFile, $con); } else { diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index ea761f473a..2790de7074 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -101,7 +101,12 @@ public function isValidFile() public function deletePhysicalFile() { - unlink($this->getAbsoluteFilePath()); + $filepath = $this->getAbsoluteFilePath(); + if (file_exists($filepath)) { + unlink($filepath); + } else { + throw new Exception("Could not locate file ".$filepath); + } } } // CcFiles diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index 253b374d0d..eab64c1ce0 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -53,18 +53,27 @@ public function isValidFile() public function deletePhysicalFile() { - //TODO: execute a python script that deletes the file from the cloud - - //Dispatch a message to airtime_analyzer through RabbitMQ, - //notifying it that we need to delete a file from the cloud - /*$CC_CONFIG = Config::getConfig(); - $apiKey = $CC_CONFIG["apiKey"][0]; - - //If the file was successfully deleted from the cloud the analyzer - //will make a request to the Media API to do the deletion cleanup. - $callbackUrl = 'http://'.$_SERVER['HTTP_HOST'].'/rest/media/'.$file_id.'/delete-success'; + $CC_CONFIG = Config::getConfig(); + //$pathToScript = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."cloud_storage_deleter.py" : "/home/denise/airtime/cloud_storage_deleter.py"; - Application_Model_RabbitMq::SendDeleteMessageToAnalyzer( - $callbackUrl, $this->_file->getDbResourceId(), $apiKey, 'delete');*/ + $provider = escapeshellarg($CC_CONFIG["cloud_storage"]["provider"]); + $bucket = escapeshellarg($CC_CONFIG["cloud_storage"]["bucket"]); + $apiKey = escapeshellarg($CC_CONFIG["cloud_storage"]["api_key"]); + $apiSecret = escapeshellarg($CC_CONFIG["cloud_storage"]["api_key_secret"]); + $objName = $this->getResourceId(); + //we will pass the cloud storage bucket and api key info to the script + //instead of the script reading from a config file beacuse on saas we + //might store this info in the apache vhost + $command = '/usr/lib/airtime/pypo/bin/cloud_storage_deleter.py "' + .$provider.'" "' + .$bucket.'" "' + .$apiKey.'" "' + .$apiSecret.'" "' + .$this->getResourceId().'" 2>&1; echo $?'; + $output = shell_exec($command); + if ($output != "0") { + Logging::info($output); + throw new Exception("Could not delete file from cloud storage"); + } } } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 7c57b58d7d..0408ff04e9 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -288,7 +288,7 @@ public function deleteAction() $file = CcFilesQuery::create()->findPk($id); if ($file) { $con = Propel::getConnection(); - $storedFile = new Application_Model_StoredFile($file, $con); + $storedFile = Application_Model_StoredFile::RecallById($id, $con); $storedFile->delete(); //TODO: This checks your session permissions... Make it work without a session? $this->getResponse() diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index 3113d2937b..d6b8bd9b6b 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -16,8 +16,9 @@ def upload_obj(self, audio_file_path, metadata): file_base_name = os.path.basename(audio_file_path) file_name, extension = os.path.splitext(file_base_name) object_name = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension) - - driver = self.get_cloud_driver() + + cls = get_driver(getattr(Provider, self._provider)) + driver = cls(self._api_key, self._api_key_secret) try: container = driver.get_container(self._bucket) @@ -48,7 +49,8 @@ def upload_obj(self, audio_file_path, metadata): return metadata def delete_obj(self, obj_name): - driver = self.get_cloud_driver() + cls = get_driver(getattr(Provider, self._provider)) + driver = cls(self._api_key, self._api_key_secret) try: cloud_obj = driver.get_object(container_name=self._bucket, @@ -59,6 +61,3 @@ def delete_obj(self, obj_name): except ObjectDoesNotExistError: raise Exception("Could not find object on %s" % self._provider) - def get_cloud_driver(self): - cls = get_driver(getattr(Provider, self._provider)) - return cls(self._api_key, self._api_key_secret) diff --git a/python_apps/pypo/cloud_storage_deleter.py b/python_apps/pypo/cloud_storage_deleter.py new file mode 100755 index 0000000000..6b6aef8181 --- /dev/null +++ b/python_apps/pypo/cloud_storage_deleter.py @@ -0,0 +1,24 @@ +#!/usr/bin/python + +import sys + +from libcloud.storage.providers import get_driver +from libcloud.storage.types import Provider, ContainerDoesNotExistError, ObjectDoesNotExistError + +provider = str(sys.argv[0]) +bucket = str(sys.argv[1]) +api_key = str(sys.argv[2]) +api_key_secret = str(sys.argv[3]) +obj_name = str(sys.argv[4]) + +cls = get_driver(getattr(Provider, provider)) +driver = cls(api_key, api_key_secret) + +try: + cloud_obj = driver.get_object(container_name=bucket, + object_name=obj_name) + filesize = getattr(cloud_obj, 'size') + driver.delete_object(obj=cloud_obj) +except ObjectDoesNotExistError: + raise Exception("Could not find object on %s" % provider) + From 02ea553f43234ba6ecadec2028d00b7b6c88363a Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 31 Jul 2014 23:21:39 -0400 Subject: [PATCH 194/310] Removed media api delete-success callback because it's no longer in use --- .../rest/controllers/MediaController.php | 25 ------------------- 1 file changed, 25 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 0408ff04e9..ca334f7bf0 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -298,31 +298,6 @@ public function deleteAction() } } - public function deleteSuccessAction() - { - if (!$this->verifyAuth(true, true)) - { - return; - } - - $id = $this->getId(); - if (!$id) { - return; - } - - $requestData = json_decode($this->getRequest()->getRawBody(), true); - - if ($requestData["import_status"] == 1) { - $con = Propel::getConnection(); - $storedFile = new Application_Model_StoredFile(CcFilesQuery::create()->findPk($id), $con); - - $storedFile->doFileDeletionCleanup($requestData["filesize"]); - - //refresh library table to remove the deleted file from it - //$this->view->headScript()->appendScript("oTable.fnStandingRedraw();"); - } - } - private function getId() { if (!$id = $this->_getParam('id', false)) { From aa8a26271cf7eef11c2884f73e097c525d75bfc1 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 1 Aug 2014 11:51:20 -0400 Subject: [PATCH 195/310] Fix zend routing on Trusty (weird error due to REST module) --- airtime_mvc/application/configs/application.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/configs/application.ini b/airtime_mvc/application/configs/application.ini index a9302c71df..8c54af91e4 100644 --- a/airtime_mvc/application/configs/application.ini +++ b/airtime_mvc/application/configs/application.ini @@ -6,11 +6,11 @@ bootstrap.class = "Bootstrap" appnamespace = "Application" resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.params.displayExceptions = 0 -resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" +;resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" resources.frontController.plugins.putHandler = "Zend_Controller_Plugin_PutHandler" ;load everything in the modules directory including models -resources.modules[] = "" resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" +resources.modules[] = "" resources.view[] = ; These are no longer needed. They are specified in /etc/airtime/airtime.conf: ;resources.db.adapter = "Pdo_Pgsql" From 6545828dc7b4cdb40d4c82559a66df0fc94400a8 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 11 Aug 2014 12:25:30 -0400 Subject: [PATCH 196/310] Removed exiting pypo if error occurs during cloud storage downloads --- python_apps/pypo/cloud_storage_downloader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/pypo/cloud_storage_downloader.py b/python_apps/pypo/cloud_storage_downloader.py index 2ae6931a9d..09182cac64 100644 --- a/python_apps/pypo/cloud_storage_downloader.py +++ b/python_apps/pypo/cloud_storage_downloader.py @@ -26,7 +26,7 @@ def download_obj(self, dst, obj_name): object_name=obj_name) except ObjectDoesNotExistError: logging.info("Could not find object: %s" % obj_name) - exit(-1) + logging.info('Downloading: %s to %s' % (cloud_obj.name, dst)) cloud_obj.download(destination_path=dst) From 35c450be3f4ad86f0506b7325dcbb611491f39c7 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 12 Aug 2014 11:33:10 -0400 Subject: [PATCH 197/310] Audio preview fix --- airtime_mvc/application/models/StoredFile.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 74bb51d2d8..eef7ab850c 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -597,16 +597,18 @@ public static function Insert($md, $con) /* TODO: Callers of this function should use a Propel transaction. Start * by creating $con outside the function with beingTransaction() */ public static function RecallById($p_id=null, $con=null) { + $p_id = intval($p_id); //TODO if (is_null($con)) { $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME); } if (isset($p_id)) { - $storedFile = CcFilesQuery::create()->findPK(intval($p_id), $con); + $storedFile = CcFilesQuery::create()->findPK($p_id, $con); if (is_null($storedFile)) { throw new Exception("Could not recall file with id: ".$p_id); } + //Attempt to get the cloud file object and return it. If no cloud //file object is found then we are dealing with a regular stored //object so return that From 46228341b23410589c16afe7c7f95ee160b747e3 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 12 Aug 2014 11:39:29 -0400 Subject: [PATCH 198/310] Audio preview fix --- airtime_mvc/application/models/StoredFile.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index eef7ab850c..b4f6bffa6b 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -597,13 +597,14 @@ public static function Insert($md, $con) /* TODO: Callers of this function should use a Propel transaction. Start * by creating $con outside the function with beingTransaction() */ public static function RecallById($p_id=null, $con=null) { - $p_id = intval($p_id); //TODO if (is_null($con)) { $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME); } if (isset($p_id)) { + $p_id = intval($p_id); + $storedFile = CcFilesQuery::create()->findPK($p_id, $con); if (is_null($storedFile)) { throw new Exception("Could not recall file with id: ".$p_id); From 879e776c8d72fb7093c59d6c04f323b71d0ff93d Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 12 Aug 2014 12:32:49 -0400 Subject: [PATCH 199/310] CC-5888: Handle file deletion if the file is stored in the cloud --- airtime_mvc/application/models/StoredFile.php | 4 +- .../application/models/airtime/CcFiles.php | 8 ++++ .../application/models/airtime/CloudFile.php | 42 +++++++++++++------ python_apps/pypo/cloud_storage_deleter.py | 18 ++++---- 4 files changed, 49 insertions(+), 23 deletions(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index b4f6bffa6b..a45e63e994 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -387,10 +387,8 @@ public function delete() //try { //Delete the physical file from either the local stor directory //or from the cloud - $this->_file->deletePhysicalFile(); + $filesize = $this->_file->deletePhysicalFile(); - $filesize = $this->getFileSize(); - //Update the user's disk usage Application_Model_Preference::updateDiskUsage(-1 * $filesize); diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index 2790de7074..e1d770bad9 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -99,6 +99,12 @@ public function isValidFile() return is_file($this->getAbsoluteFilePath()); } + /** + * + * Deletes the file from the stor directory + * + * Returns the filesize of the deleted file + */ public function deletePhysicalFile() { $filepath = $this->getAbsoluteFilePath(); @@ -107,6 +113,8 @@ public function deletePhysicalFile() } else { throw new Exception("Could not locate file ".$filepath); } + + return $this->getFileSize(); } } // CcFiles diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index eab64c1ce0..d64d8f6e0c 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -51,6 +51,13 @@ public function isValidFile() } } + /** + * + * Deletes the file from cloud storage by executing a python script + * that uses Apache Libcloud to connect with the cloud storage service + * + * If the file was successfully deleted the filesize of that file is returned + */ public function deletePhysicalFile() { $CC_CONFIG = Config::getConfig(); @@ -60,20 +67,29 @@ public function deletePhysicalFile() $bucket = escapeshellarg($CC_CONFIG["cloud_storage"]["bucket"]); $apiKey = escapeshellarg($CC_CONFIG["cloud_storage"]["api_key"]); $apiSecret = escapeshellarg($CC_CONFIG["cloud_storage"]["api_key_secret"]); - $objName = $this->getResourceId(); - //we will pass the cloud storage bucket and api key info to the script - //instead of the script reading from a config file beacuse on saas we - //might store this info in the apache vhost - $command = '/usr/lib/airtime/pypo/bin/cloud_storage_deleter.py "' - .$provider.'" "' - .$bucket.'" "' - .$apiKey.'" "' - .$apiSecret.'" "' - .$this->getResourceId().'" 2>&1; echo $?'; + $objName = escapeshellarg($this->getResourceId()); + + $command = "/usr/lib/airtime/pypo/bin/cloud_storage_deleter.py $provider $bucket $apiKey $apiSecret $objName 2>&1 echo $?"; + $output = shell_exec($command); - if ($output != "0") { - Logging::info($output); - throw new Exception("Could not delete file from cloud storage"); + if ($output != "") { + if (stripos($output, 'filesize') === false) { + Logging::info($output); + throw new Exception("Could not delete file from cloud storage"); + } } + + $outputArr = json_decode($output, true); + return $outputArr["filesize"]; + } + + /** + * + * Deletes the cloud_file's 'parent' object before itself + */ + public function delete(PropelPDO $con = NULL) + { + CcFilesQuery::create()->findPk($this->getCcFileId())->delete(); + parent::delete(); } } diff --git a/python_apps/pypo/cloud_storage_deleter.py b/python_apps/pypo/cloud_storage_deleter.py index 6b6aef8181..93bccd76ff 100755 --- a/python_apps/pypo/cloud_storage_deleter.py +++ b/python_apps/pypo/cloud_storage_deleter.py @@ -1,15 +1,16 @@ #!/usr/bin/python import sys +import simplejson from libcloud.storage.providers import get_driver -from libcloud.storage.types import Provider, ContainerDoesNotExistError, ObjectDoesNotExistError +from libcloud.storage.types import Provider, ObjectDoesNotExistError -provider = str(sys.argv[0]) -bucket = str(sys.argv[1]) -api_key = str(sys.argv[2]) -api_key_secret = str(sys.argv[3]) -obj_name = str(sys.argv[4]) +provider = str(sys.argv[1]) +bucket = str(sys.argv[2]) +api_key = str(sys.argv[3]) +api_key_secret = str(sys.argv[4]) +obj_name = str(sys.argv[5]) cls = get_driver(getattr(Provider, provider)) driver = cls(api_key, api_key_secret) @@ -19,6 +20,9 @@ object_name=obj_name) filesize = getattr(cloud_obj, 'size') driver.delete_object(obj=cloud_obj) + + data = simplejson.dumps({"filesize": filesize}) + print data except ObjectDoesNotExistError: - raise Exception("Could not find object on %s" % provider) + raise Exception("Could not find object on %s in bucket: %s and object: %s" % (provider, bucket, obj_name)) From ca62086e16c910dffcd9137c8a3c8deadfd99156 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 12 Aug 2014 12:59:50 -0400 Subject: [PATCH 200/310] Removed cloud file deletion from Airtime Analyzer. Deletion is done from PHP now. --- airtime_mvc/application/models/RabbitMq.php | 18 ++------------- .../rest/controllers/MediaController.php | 4 ++-- .../cloud_storage_uploader.py | 13 ----------- .../airtime_analyzer/message_listener.py | 23 +++++-------------- 4 files changed, 10 insertions(+), 48 deletions(-) diff --git a/airtime_mvc/application/models/RabbitMq.php b/airtime_mvc/application/models/RabbitMq.php index f810554608..15ad912e07 100644 --- a/airtime_mvc/application/models/RabbitMq.php +++ b/airtime_mvc/application/models/RabbitMq.php @@ -79,12 +79,11 @@ public static function SendMessageToShowRecorder($event_type) self::sendMessage($exchange, 'direct', true, $data); } - public static function SendUploadMessageToAnalyzer($tmpFilePath, $importedStorageDirectory, $originalFilename, - $callbackUrl, $apiKey, $messageType) + public static function SendMessageToAnalyzer($tmpFilePath, $importedStorageDirectory, $originalFilename, + $callbackUrl, $apiKey) { $exchange = 'airtime-uploads'; - $data['message_type'] = $messageType; $data['tmp_file_path'] = $tmpFilePath; $data['import_directory'] = $importedStorageDirectory; $data['original_filename'] = $originalFilename; @@ -94,17 +93,4 @@ public static function SendUploadMessageToAnalyzer($tmpFilePath, $importedStorag $jsonData = json_encode($data); self::sendMessage($exchange, 'topic', false, $jsonData, 'airtime-uploads'); } - - public static function SendDeleteMessageToAnalyzer($callbackUrl, $objectName, $apiKey, $messageType) - { - $exchange = 'airtime-uploads'; - - $data['message_type'] = $messageType; - $data['api_key'] = $apiKey; - $data['object_name'] = $objectName; - $data['callback_url'] = $callbackUrl; - - $jsonData = json_encode($data); - self::sendMessage($exchange, 'topic', false, $jsonData, 'airtime-uploads'); - } } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index ca334f7bf0..37a7ae6fff 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -463,9 +463,9 @@ private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) //Dispatch a message to airtime_analyzer through RabbitMQ, //notifying it that there's a new upload to process! - Application_Model_RabbitMq::SendUploadMessageToAnalyzer($newTempFilePath, + Application_Model_RabbitMq::SendMessageToAnalyzer($newTempFilePath, $importedStorageDirectory, basename($originalFilename), - $callbackUrl, $apiKey, 'upload'); + $callbackUrl, $apiKey); } private function getOwnerId() diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index d6b8bd9b6b..d331b116af 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -48,16 +48,3 @@ def upload_obj(self, audio_file_path, metadata): metadata["resource_id"] = object_name return metadata - def delete_obj(self, obj_name): - cls = get_driver(getattr(Provider, self._provider)) - driver = cls(self._api_key, self._api_key_secret) - - try: - cloud_obj = driver.get_object(container_name=self._bucket, - object_name=obj_name) - filesize = getattr(cloud_obj, 'size') - driver.delete_object(obj=cloud_obj) - return filesize - except ObjectDoesNotExistError: - raise Exception("Could not find object on %s" % self._provider) - diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index cc633cca54..83fd322599 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -152,7 +152,6 @@ def msg_received_callback(self, channel, method_frame, header_frame, body): original_filename = "" callback_url = "" api_key = "" - message_type = "" ''' Spin up a worker process. We use the multiprocessing module and multiprocessing.Queue to pass objects between the processes so that if the analyzer process crashes, it does not @@ -163,24 +162,14 @@ def msg_received_callback(self, channel, method_frame, header_frame, body): try: msg_dict = json.loads(body) api_key = msg_dict["api_key"] - message_type = msg_dict["message_type"] callback_url = msg_dict["callback_url"] - if message_type == "upload": - audio_file_path = msg_dict["tmp_file_path"] - import_directory = msg_dict["import_directory"] - original_filename = msg_dict["original_filename"] - - audio_metadata = self.spawn_analyzer_process(audio_file_path, import_directory, original_filename) - StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) - elif message_type == "delete": - object_name = msg_dict["object_name"] - csu = CloudStorageUploader(self._provider, self._bucket, self._api_key, self._api_key_secret) - filesize = csu.delete_obj(object_name) - return_data = dict() - return_data["filesize"] = filesize - return_data["import_status"] = 1 - StatusReporter.report_success_to_callback_url(callback_url, api_key, return_data) + audio_file_path = msg_dict["tmp_file_path"] + import_directory = msg_dict["import_directory"] + original_filename = msg_dict["original_filename"] + + audio_metadata = self.spawn_analyzer_process(audio_file_path, import_directory, original_filename) + StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) except KeyError as e: # A field in msg_dict that we needed was missing (eg. audio_file_path) From 0ccc7e7dc9df3e46ac34f7f0b69e1f5a571cefeb Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 28 Aug 2014 16:52:47 -0400 Subject: [PATCH 201/310] SAAS-470: Zend Rest module doesn't work on Ubuntu 14.04 The Bootstrap.php in the modules directory didn't like short php tags. --- airtime_mvc/application/configs/application.ini | 2 +- airtime_mvc/application/modules/rest/Bootstrap.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/configs/application.ini b/airtime_mvc/application/configs/application.ini index 8c54af91e4..79f4f9c789 100644 --- a/airtime_mvc/application/configs/application.ini +++ b/airtime_mvc/application/configs/application.ini @@ -6,7 +6,7 @@ bootstrap.class = "Bootstrap" appnamespace = "Application" resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.params.displayExceptions = 0 -;resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" +resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" resources.frontController.plugins.putHandler = "Zend_Controller_Plugin_PutHandler" ;load everything in the modules directory including models resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" diff --git a/airtime_mvc/application/modules/rest/Bootstrap.php b/airtime_mvc/application/modules/rest/Bootstrap.php index 31691ca96d..999798ee54 100644 --- a/airtime_mvc/application/modules/rest/Bootstrap.php +++ b/airtime_mvc/application/modules/rest/Bootstrap.php @@ -1,4 +1,4 @@ - Date: Fri, 10 Oct 2014 11:28:44 -0400 Subject: [PATCH 202/310] Reworked upstart config for airtime_analyzer --- .../install/upstart/airtime_analyzer.conf | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf b/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf index 696c8b9a92..eeeb45797d 100644 --- a/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf +++ b/python_apps/airtime_analyzer/install/upstart/airtime_analyzer.conf @@ -9,14 +9,16 @@ respawn setuid www-data setgid www-data -expect fork +#expect fork env LANG='en_US.UTF-8' env LC_ALL='en_US.UTF-8' -script - airtime_analyzer -end script +#script +# airtime_analyzer +#end script + +exec airtime_analyzer From a10e2873686b8b4d91d0b8426979aa4a68c8d9fc Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 14 Oct 2014 16:54:58 -0400 Subject: [PATCH 203/310] Fixed a fresh install bug that wasn't using composer installs. Fixed a cloud file download bug where it was downloading the wrong track. Working on amazon s3 signed urls for private objects. Added cloud storage configuration to install script. --- .../controllers/AudiopreviewController.php | 1 + .../controllers/LibraryController.php | 7 ++- .../application/models/airtime/CloudFile.php | 44 +++++++++++++++++-- .../rest/controllers/MediaController.php | 1 + airtime_mvc/build/airtime.conf | 7 +++ install_minimal/include/airtime-install.php | 2 +- python_apps/pypo/cloud_storage_downloader.py | 5 ++- 7 files changed, 58 insertions(+), 9 deletions(-) diff --git a/airtime_mvc/application/controllers/AudiopreviewController.php b/airtime_mvc/application/controllers/AudiopreviewController.php index e90c34a399..7f7b7b68dc 100644 --- a/airtime_mvc/application/controllers/AudiopreviewController.php +++ b/airtime_mvc/application/controllers/AudiopreviewController.php @@ -48,6 +48,7 @@ public function audioPreviewAction() if ($type == "audioclip") { $media = Application_Model_StoredFile::RecallById($audioFileID); $uri = $baseUrl."api/get-media/file/".$audioFileID; + //$uri = $media->getPropelOrm()->downloadFile(); $mime = $media->getPropelOrm()->getDbMime(); } elseif ($type == "stream") { $webstream = CcWebstreamQuery::create()->findPk($audioFileID); diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index 96cbf6e89c..ba836cb82e 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -191,7 +191,6 @@ public function contextMenuAction() $obj_sess = new Zend_Session_Namespace(UI_PLAYLISTCONTROLLER_OBJ_SESSNAME); if ($type === "audioclip") { - $file = Application_Model_StoredFile::RecallById($id); $menu["play"]["mime"] = $file->getPropelOrm()->getDbMime(); @@ -216,7 +215,11 @@ public function contextMenuAction() $menu["edit"] = array("name"=> _("Edit Metadata"), "icon" => "edit", "url" => $baseUrl."library/edit-file-md/id/{$id}"); } - $url = $file->getRelativeFileUrl($baseUrl).'/download/true'; + // It's important that we always return the parent id (cc_files id) + // and not the cloud_file id (if applicable) for track download. + // Our application logic (StoredFile.php) will determine if the track + // is a cloud_file and handle it appropriately. + $url = $baseUrl."api/get-media/file/".$id.".".$file->getFileExtension().'/download/true'; $menu["download"] = array("name" => _("Download"), "icon" => "download", "url" => $url); } elseif ($type === "playlist" || $type === "block") { if ($type === 'playlist') { diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index d64d8f6e0c..ab7dfadaa4 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -1,6 +1,6 @@ getResourceId()); + return $this->get_s3_signed_url( + $CC_CONFIG['cloud_storage']['api_key'], + $CC_CONFIG['cloud_storage']['api_key_secret'], + $CC_CONFIG['cloud_storage']['bucket']); + } + + private function get_s3_signed_url($s3_key, $s3_key_secret, $bucket) + { + //should be longer than track length + $expires = 120; + $resource = $this->getResourceId(); + + $expires = time()+$expires; + $string_to_sign = "GET\n\n\n{$expires}\n/{$bucket}/{$resource}"; + $signature = base64_encode((hash_hmac("sha1", utf8_encode($string_to_sign), $s3_key_secret, TRUE))); + + $authentication_params = "AWSAccessKeyId={$s3_key}&Expires={$expires}&Signature={$signature}"; + + $s3 = new Zend_Service_Amazon_S3($s3_key, $s3_key_secret); + $endpoint = $s3->getEndpoint(); + $scheme = $endpoint->getScheme(); + $host = $endpoint->getHost(); + + $url = "{$scheme}://{$host}/{$bucket}/".urlencode($resource)."?{$authentication_params}"; + Logging::info($url); + return $url; } public function getFileSize() @@ -61,8 +86,7 @@ public function isValidFile() public function deletePhysicalFile() { $CC_CONFIG = Config::getConfig(); - //$pathToScript = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."cloud_storage_deleter.py" : "/home/denise/airtime/cloud_storage_deleter.py"; - + $provider = escapeshellarg($CC_CONFIG["cloud_storage"]["provider"]); $bucket = escapeshellarg($CC_CONFIG["cloud_storage"]["bucket"]); $apiKey = escapeshellarg($CC_CONFIG["cloud_storage"]["api_key"]); @@ -92,4 +116,16 @@ public function delete(PropelPDO $con = NULL) CcFilesQuery::create()->findPk($this->getCcFileId())->delete(); parent::delete(); } + + public function downloadFile() + { + $CC_CONFIG = Config::getConfig(); + + $s3 = new Zend_Service_Amazon_S3($CC_CONFIG['cloud_storage']['api_key'], $CC_CONFIG['cloud_storage']['api_key_secret']); + //$fileObj = $s3->getObject($CC_CONFIG['cloud_storage']['bucket']."/".$this->getResourceId()); + + $response_stream = $s3->getObjectStream($CC_CONFIG['cloud_storage']['bucket']."/".$this->getResourceId()); + copy($response_stream->getStreamName(), "/tmp/".$this->getResourceId()); + Logging::info($response_stream); + } } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 37a7ae6fff..15c8cb451e 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -236,6 +236,7 @@ public function putAction() $cloudFile->save(); //file is stored locally + //we should get rid of this since we're removing local file storage } else if (isset($requestData["full_path"])) { $fileSizeBytes = filesize($requestData["full_path"]); if ($fileSizeBytes === false) diff --git a/airtime_mvc/build/airtime.conf b/airtime_mvc/build/airtime.conf index 7495bd9f3a..517a811221 100644 --- a/airtime_mvc/build/airtime.conf +++ b/airtime_mvc/build/airtime.conf @@ -30,3 +30,10 @@ monit_password = airtime [soundcloud] connection_retries = 3 time_between_retries = 60 + +[cloud_storage] +provider = +endpoint = +bucket = +api_key = +api_key_secret = \ No newline at end of file diff --git a/install_minimal/include/airtime-install.php b/install_minimal/include/airtime-install.php index db01fdcf97..481983a0f3 100644 --- a/install_minimal/include/airtime-install.php +++ b/install_minimal/include/airtime-install.php @@ -59,7 +59,7 @@ if (!$iniExists){ require_once(AirtimeInstall::GetAirtimeSrcDir().'/application/configs/conf.php'); $CC_CONFIG = Config::getConfig(); - require_once 'propel/runtime/lib/Propel.php'; + require_once 'vendor/propel/propel1/runtime/lib/Propel.php'; Propel::init(AirtimeInstall::GetAirtimeSrcDir()."/application/configs/airtime-conf-production.php"); } diff --git a/python_apps/pypo/cloud_storage_downloader.py b/python_apps/pypo/cloud_storage_downloader.py index 09182cac64..01a9a1ee71 100644 --- a/python_apps/pypo/cloud_storage_downloader.py +++ b/python_apps/pypo/cloud_storage_downloader.py @@ -1,6 +1,7 @@ import os import logging import ConfigParser +import sys from libcloud.storage.types import Provider, ObjectDoesNotExistError from libcloud.storage.providers import get_driver @@ -37,9 +38,9 @@ def read_config_file(self, config_path): config.readfp(open(config_path)) except IOError as e: print "Failed to open config file at " + config_path + ": " + e.strerror - exit(-1) + sys.exit() except Exception: print e.strerror - exit(-1) + sys.exit() return config From 544d20ebc2ed7ad051f87fb352caa7b84fee9b72 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 17 Oct 2014 17:16:53 -0400 Subject: [PATCH 204/310] Replaced spaces with dashes in resource_id generation Fixed track preview and download signed urls Removed cloud_storage_deleter.py file Changed cloud_storage settings in airtime.conf --- .../controllers/AudiopreviewController.php | 1 - airtime_mvc/application/models/StoredFile.php | 4 +- .../application/models/airtime/CloudFile.php | 65 ++++++++----------- .../rest/controllers/MediaController.php | 6 ++ airtime_mvc/build/airtime.conf | 8 +-- .../cloud_storage_uploader.py | 10 ++- python_apps/pypo/cloud_storage_deleter.py | 28 -------- 7 files changed, 47 insertions(+), 75 deletions(-) delete mode 100755 python_apps/pypo/cloud_storage_deleter.py diff --git a/airtime_mvc/application/controllers/AudiopreviewController.php b/airtime_mvc/application/controllers/AudiopreviewController.php index 7f7b7b68dc..e90c34a399 100644 --- a/airtime_mvc/application/controllers/AudiopreviewController.php +++ b/airtime_mvc/application/controllers/AudiopreviewController.php @@ -48,7 +48,6 @@ public function audioPreviewAction() if ($type == "audioclip") { $media = Application_Model_StoredFile::RecallById($audioFileID); $uri = $baseUrl."api/get-media/file/".$audioFileID; - //$uri = $media->getPropelOrm()->downloadFile(); $mime = $media->getPropelOrm()->getDbMime(); } elseif ($type == "stream") { $webstream = CcWebstreamQuery::create()->findPk($audioFileID); diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index a45e63e994..c3b72b3a25 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -368,8 +368,6 @@ public function existsOnDisk() */ public function delete() { - $filepath = $this->getFilePath(); - // Check if the file is scheduled to be played in the future if (Application_Model_Schedule::IsFileScheduledInTheFuture($this->getId())) { throw new DeleteScheduledFileException(); @@ -387,6 +385,8 @@ public function delete() //try { //Delete the physical file from either the local stor directory //or from the cloud + // TODO: don't have deletePhysicalFile return the filesize. + // Instead, fetch that value before deleting the file. $filesize = $this->_file->deletePhysicalFile(); //Update the user's disk usage diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index ab7dfadaa4..b815d4ed37 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -28,21 +28,22 @@ private function get_s3_signed_url($s3_key, $s3_key_secret, $bucket) { //should be longer than track length $expires = 120; - $resource = $this->getResourceId(); + $resource_id = $this->getResourceId(); $expires = time()+$expires; - $string_to_sign = "GET\n\n\n{$expires}\n/{$bucket}/{$resource}"; - $signature = base64_encode((hash_hmac("sha1", utf8_encode($string_to_sign), $s3_key_secret, TRUE))); + $string_to_sign = utf8_encode("GET\n\n\n$expires\n/$bucket/$resource_id"); + // We need to urlencode the entire signature in case the hashed signature + // has spaces. (NOTE: utf8_encode() does not work here because it turns + // spaces into non-breaking spaces) + $signature = urlencode(base64_encode((hash_hmac("sha1", $string_to_sign, $s3_key_secret, true)))); - $authentication_params = "AWSAccessKeyId={$s3_key}&Expires={$expires}&Signature={$signature}"; + $authentication_params = "AWSAccessKeyId=$s3_key&Expires=$expires&Signature=$signature"; $s3 = new Zend_Service_Amazon_S3($s3_key, $s3_key_secret); $endpoint = $s3->getEndpoint(); $scheme = $endpoint->getScheme(); $host = $endpoint->getHost(); - - $url = "{$scheme}://{$host}/{$bucket}/".urlencode($resource)."?{$authentication_params}"; - Logging::info($url); + $url = "$scheme://$host/$bucket/".utf8_encode($resource_id)."?$authentication_params"; return $url; } @@ -78,33 +79,35 @@ public function isValidFile() /** * - * Deletes the file from cloud storage by executing a python script - * that uses Apache Libcloud to connect with the cloud storage service + * Deletes the file from Amazon S3 * * If the file was successfully deleted the filesize of that file is returned */ public function deletePhysicalFile() { $CC_CONFIG = Config::getConfig(); - - $provider = escapeshellarg($CC_CONFIG["cloud_storage"]["provider"]); - $bucket = escapeshellarg($CC_CONFIG["cloud_storage"]["bucket"]); - $apiKey = escapeshellarg($CC_CONFIG["cloud_storage"]["api_key"]); - $apiSecret = escapeshellarg($CC_CONFIG["cloud_storage"]["api_key_secret"]); - $objName = escapeshellarg($this->getResourceId()); - $command = "/usr/lib/airtime/pypo/bin/cloud_storage_deleter.py $provider $bucket $apiKey $apiSecret $objName 2>&1 echo $?"; + $s3 = new Zend_Service_Amazon_S3( + $CC_CONFIG['cloud_storage']['api_key'], + $CC_CONFIG['cloud_storage']['api_key_secret']); + + $bucket = $CC_CONFIG['cloud_storage']['bucket']; + $resource_id = $this->getResourceId(); + $amz_resource = utf8_encode("$bucket/$resource_id"); - $output = shell_exec($command); - if ($output != "") { - if (stripos($output, 'filesize') === false) { - Logging::info($output); - throw new Exception("Could not delete file from cloud storage"); - } + if ($s3->isObjectAvailable($amz_resource)) { + $obj_info = $s3->getInfo($amz_resource); + $filesize = $obj_info["size"]; + + // removeObject() returns true even if the object was not deleted (bug?) + // so that is not a good way to do error handling. isObjectAvailable() + // does however return the correct value; We have to assume that if the + // object is available the removeObject() function will work. + $s3->removeObject($amz_resource); + return $filesize; + } else { + throw new Exception("ERROR: Could not locate object on Amazon S3"); } - - $outputArr = json_decode($output, true); - return $outputArr["filesize"]; } /** @@ -116,16 +119,4 @@ public function delete(PropelPDO $con = NULL) CcFilesQuery::create()->findPk($this->getCcFileId())->delete(); parent::delete(); } - - public function downloadFile() - { - $CC_CONFIG = Config::getConfig(); - - $s3 = new Zend_Service_Amazon_S3($CC_CONFIG['cloud_storage']['api_key'], $CC_CONFIG['cloud_storage']['api_key_secret']); - //$fileObj = $s3->getObject($CC_CONFIG['cloud_storage']['bucket']."/".$this->getResourceId()); - - $response_stream = $s3->getObjectStream($CC_CONFIG['cloud_storage']['bucket']."/".$this->getResourceId()); - copy($response_stream->getStreamName(), "/tmp/".$this->getResourceId()); - Logging::info($response_stream); - } } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 15c8cb451e..4962e40567 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -230,6 +230,12 @@ public function putAction() $file->setDbFilepath($requestData["filename"]); $fileSizeBytes = $requestData["filesize"]; + if ($fileSizeBytes === false) + { + $file->setDbImportStatus(2)->save(); + $this->fileNotFoundResponse(); + return; + } $cloudFile = new CloudFile(); $cloudFile->setResourceId($requestData["resource_id"]); $cloudFile->setCcFiles($file); diff --git a/airtime_mvc/build/airtime.conf b/airtime_mvc/build/airtime.conf index 517a811221..5ba766ad3f 100644 --- a/airtime_mvc/build/airtime.conf +++ b/airtime_mvc/build/airtime.conf @@ -31,9 +31,7 @@ monit_password = airtime connection_retries = 3 time_between_retries = 60 -[cloud_storage] -provider = -endpoint = +[amazon] bucket = -api_key = -api_key_secret = \ No newline at end of file +access_key = +secret_key = \ No newline at end of file diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index d331b116af..49c5085270 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -15,6 +15,13 @@ def __init__(self, provider, bucket, api_key, api_key_secret): def upload_obj(self, audio_file_path, metadata): file_base_name = os.path.basename(audio_file_path) file_name, extension = os.path.splitext(file_base_name) + + ''' + With Amazon S3 you cannot create a signed url if there are spaces + in the object name. URL encoding the object name doesn't solve the + problem. As a solution we will replace spaces with dashes. + ''' + file_name = file_name.replace(" ", "-") object_name = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension) cls = get_driver(getattr(Provider, self._provider)) @@ -25,8 +32,7 @@ def upload_obj(self, audio_file_path, metadata): except ContainerDoesNotExistError: container = driver.create_container(self._bucket) - extra = {'meta_data': {'filename': file_base_name}, - 'acl': 'public-read-write'} + extra = {'meta_data': {'filename': file_base_name}} obj = driver.upload_object(file_path=audio_file_path, container=container, diff --git a/python_apps/pypo/cloud_storage_deleter.py b/python_apps/pypo/cloud_storage_deleter.py deleted file mode 100755 index 93bccd76ff..0000000000 --- a/python_apps/pypo/cloud_storage_deleter.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/python - -import sys -import simplejson - -from libcloud.storage.providers import get_driver -from libcloud.storage.types import Provider, ObjectDoesNotExistError - -provider = str(sys.argv[1]) -bucket = str(sys.argv[2]) -api_key = str(sys.argv[3]) -api_key_secret = str(sys.argv[4]) -obj_name = str(sys.argv[5]) - -cls = get_driver(getattr(Provider, provider)) -driver = cls(api_key, api_key_secret) - -try: - cloud_obj = driver.get_object(container_name=bucket, - object_name=obj_name) - filesize = getattr(cloud_obj, 'size') - driver.delete_object(obj=cloud_obj) - - data = simplejson.dumps({"filesize": filesize}) - print data -except ObjectDoesNotExistError: - raise Exception("Could not find object on %s in bucket: %s and object: %s" % (provider, bucket, obj_name)) - From 28be5c6bd3e33aa007a2fbfc8f53ef6bc875e98f Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 21 Oct 2014 15:34:10 -0400 Subject: [PATCH 205/310] CC-5929: Certain long filenames can result in the extension getting cut off --- .../airtime_analyzer/filemover_analyzer.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py index de296e092f..79c2881243 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/filemover_analyzer.py @@ -42,14 +42,16 @@ def move(audio_file_path, import_directory, original_filename, metadata): # TODO: Also, handle the case where the move fails and write some code # to possibly move the file to problem_files. - max_dir_len = 32 - max_file_len = 32 + max_dir_len = 48 + max_file_len = 48 final_file_path = import_directory + orig_file_basename, orig_file_extension = os.path.splitext(original_filename) if metadata.has_key("artist_name"): final_file_path += "/" + metadata["artist_name"][0:max_dir_len] # truncating with array slicing if metadata.has_key("album_title"): - final_file_path += "/" + metadata["album_title"][0:max_dir_len] - final_file_path += "/" + original_filename[0:max_file_len] + final_file_path += "/" + metadata["album_title"][0:max_dir_len] + # Note that orig_file_extension includes the "." already + final_file_path += "/" + orig_file_basename[0:max_file_len] + orig_file_extension #Ensure any redundant slashes are stripped final_file_path = os.path.normpath(final_file_path) From f775bedb491f5d7d6fd53234294799775b03c6a8 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 21 Oct 2014 16:05:50 -0400 Subject: [PATCH 206/310] Stopped returning filesize in delete functions. Created an Amazon S3 wrapper class around Zend_Service_Amazon_S3 to add more functionality. --- airtime_mvc/application/amazon/Amazon_S3.php | 71 +++++++++++++++++++ airtime_mvc/application/models/StoredFile.php | 35 ++++----- .../application/models/airtime/CcFiles.php | 4 -- .../application/models/airtime/CloudFile.php | 58 +++++++-------- airtime_mvc/build/airtime.conf | 7 +- airtime_mvc/public/index.php | 3 + 6 files changed, 122 insertions(+), 56 deletions(-) create mode 100644 airtime_mvc/application/amazon/Amazon_S3.php diff --git a/airtime_mvc/application/amazon/Amazon_S3.php b/airtime_mvc/application/amazon/Amazon_S3.php new file mode 100644 index 0000000000..dcf7011cab --- /dev/null +++ b/airtime_mvc/application/amazon/Amazon_S3.php @@ -0,0 +1,71 @@ +setBucket($CC_CONFIG['cloud_storage']['bucket']); + $this->setAccessKey($CC_CONFIG['cloud_storage']['api_key']); + $this->setSecretKey($CC_CONFIG['cloud_storage']['api_key_secret']); + $this->setZendServiceAmazonS3(); + } + + public function getZendServiceAmazonS3() + { + return $this->zendServiceAmazonS3; + } + + private function setZendServiceAmazonS3() + { + $this->zendServiceAmazonS3 = new Zend_Service_Amazon_S3( + $this->getAccessKey(), + $this->getSecretKey()); + } + + public function getBucket() + { + return $this->bucket; + } + + private function setBucket($bucket) + { + $this->bucket = $bucket; + } + + public function getAccessKey() + { + return $this->accessKey; + } + + private function setAccessKey($accessKey) + { + $this->accessKey = $accessKey; + } + + public function getSecretKey() + { + return $this->secretKey; + } + + private function setSecretKey($secretKey) + { + $this->secretKey = $secretKey; + } +} \ No newline at end of file diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index c3b72b3a25..3bf35899ad 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -382,26 +382,21 @@ public function delete() $file_id = $this->_file->getDbId(); Logging::info("User ".$user->getLogin()." is deleting file: ".$this->_file->getDbTrackTitle()." - file id: ".$file_id); - //try { - //Delete the physical file from either the local stor directory - //or from the cloud - // TODO: don't have deletePhysicalFile return the filesize. - // Instead, fetch that value before deleting the file. - $filesize = $this->_file->deletePhysicalFile(); - - //Update the user's disk usage - Application_Model_Preference::updateDiskUsage(-1 * $filesize); - - //Explicitly update any playlist's and block's length that contain - //the file getting deleted - self::updateBlockAndPlaylistLength($this->_file->getDbId()); - - //delete the file record from cc_files (and cloud_file, if applicable) - $this->_file->delete(); - //} catch (Exception $e) { - //Logging::error($e->getMessage()); - //return; - //} + $filesize = $this->_file->getFileSize(); + + //Delete the physical file from either the local stor directory + //or from the cloud + $this->_file->deletePhysicalFile(); + + //Update the user's disk usage + Application_Model_Preference::updateDiskUsage(-1 * $filesize); + + //Explicitly update any playlist's and block's length that contain + //the file getting deleted + self::updateBlockAndPlaylistLength($this->_file->getDbId()); + + //delete the file record from cc_files (and cloud_file, if applicable) + $this->_file->delete(); } /* diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index e1d770bad9..9d40aef665 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -102,8 +102,6 @@ public function isValidFile() /** * * Deletes the file from the stor directory - * - * Returns the filesize of the deleted file */ public function deletePhysicalFile() { @@ -113,8 +111,6 @@ public function deletePhysicalFile() } else { throw new Exception("Could not locate file ".$filepath); } - - return $this->getFileSize(); } } // CcFiles diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index b815d4ed37..414933e11a 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -1,6 +1,6 @@ get_s3_signed_url( - $CC_CONFIG['cloud_storage']['api_key'], - $CC_CONFIG['cloud_storage']['api_key_secret'], - $CC_CONFIG['cloud_storage']['bucket']); + return $this->get_s3_signed_url(); } - private function get_s3_signed_url($s3_key, $s3_key_secret, $bucket) + private function get_s3_signed_url() { //should be longer than track length $expires = 120; $resource_id = $this->getResourceId(); + $amazon_s3 = new Amazon_S3(); + $s3_bucket = $amazon_s3->getBucket(); + $s3_secret_key = $amazon_s3->getSecretKey(); + $s3_access_key = $amazon_s3->getAccessKey(); + $zend_s3 = $amazon_s3->getZendServiceAmazonS3(); + $expires = time()+$expires; - $string_to_sign = utf8_encode("GET\n\n\n$expires\n/$bucket/$resource_id"); + $string_to_sign = utf8_encode("GET\n\n\n$expires\n/$s3_bucket/$resource_id"); // We need to urlencode the entire signature in case the hashed signature // has spaces. (NOTE: utf8_encode() does not work here because it turns // spaces into non-breaking spaces) - $signature = urlencode(base64_encode((hash_hmac("sha1", $string_to_sign, $s3_key_secret, true)))); + $signature = urlencode(base64_encode((hash_hmac("sha1", $string_to_sign, $s3_secret_key, true)))); - $authentication_params = "AWSAccessKeyId=$s3_key&Expires=$expires&Signature=$signature"; + $authentication_params = "AWSAccessKeyId=$s3_access_key&Expires=$expires&Signature=$signature"; - $s3 = new Zend_Service_Amazon_S3($s3_key, $s3_key_secret); - $endpoint = $s3->getEndpoint(); + $endpoint = $zend_s3->getEndpoint(); $scheme = $endpoint->getScheme(); $host = $endpoint->getHost(); - $url = "$scheme://$host/$bucket/".utf8_encode($resource_id)."?$authentication_params"; + $url = "$scheme://$host/$s3_bucket/".utf8_encode($resource_id)."?$authentication_params"; return $url; } public function getFileSize() { - return strlen(file_get_contents($this->getAbsoluteFilePath())); + $amazon_s3 = new Amazon_S3(); + + $zend_s3 = $amazon_s3->getZendServiceAmazonS3(); + $bucket = $amazon_s3->getBucket(); + $resource_id = $this->getResourceId(); + + $amz_resource = utf8_encode("$bucket/$resource_id"); + $amz_resource_info = $zend_s3->getInfo($amz_resource); + return $amz_resource_info["size"]; } public function getFilename() @@ -80,31 +90,21 @@ public function isValidFile() /** * * Deletes the file from Amazon S3 - * - * If the file was successfully deleted the filesize of that file is returned */ public function deletePhysicalFile() { - $CC_CONFIG = Config::getConfig(); - - $s3 = new Zend_Service_Amazon_S3( - $CC_CONFIG['cloud_storage']['api_key'], - $CC_CONFIG['cloud_storage']['api_key_secret']); - - $bucket = $CC_CONFIG['cloud_storage']['bucket']; + $amazon_s3 = new Amazon_S3(); + $zend_s3 = $amazon_s3->getZendServiceAmazonS3(); + $bucket = $amazon_s3->getBucket(); $resource_id = $this->getResourceId(); $amz_resource = utf8_encode("$bucket/$resource_id"); - if ($s3->isObjectAvailable($amz_resource)) { - $obj_info = $s3->getInfo($amz_resource); - $filesize = $obj_info["size"]; - + if ($zend_s3->isObjectAvailable($amz_resource)) { // removeObject() returns true even if the object was not deleted (bug?) // so that is not a good way to do error handling. isObjectAvailable() // does however return the correct value; We have to assume that if the // object is available the removeObject() function will work. - $s3->removeObject($amz_resource); - return $filesize; + $zend_s3->removeObject($amz_resource); } else { throw new Exception("ERROR: Could not locate object on Amazon S3"); } diff --git a/airtime_mvc/build/airtime.conf b/airtime_mvc/build/airtime.conf index 5ba766ad3f..10963f5520 100644 --- a/airtime_mvc/build/airtime.conf +++ b/airtime_mvc/build/airtime.conf @@ -31,7 +31,8 @@ monit_password = airtime connection_retries = 3 time_between_retries = 60 -[amazon] +[cloud_storage] +provider = S3 bucket = -access_key = -secret_key = \ No newline at end of file +api_key = +api_key_secret = \ No newline at end of file diff --git a/airtime_mvc/public/index.php b/airtime_mvc/public/index.php index 4340a30757..a20586e828 100644 --- a/airtime_mvc/public/index.php +++ b/airtime_mvc/public/index.php @@ -57,6 +57,9 @@ function exception_error_handler($errno, $errstr, $errfile, $errline) set_include_path('/usr/share/php/libzend-framework-php' . PATH_SEPARATOR . get_include_path()); } +//amazon directory +set_include_path(APPLICATION_PATH . '/amazon' . PATH_SEPARATOR . get_include_path()); + /** Zend_Application */ require_once 'Zend/Application.php'; $application = new Zend_Application( From 82f251f061ed27c99a7b88dddf9c7fd46c63592c Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 21 Oct 2014 19:23:48 -0400 Subject: [PATCH 207/310] Fix invalid python in StatusReporter --- .../airtime_analyzer/airtime_analyzer/status_reporter.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index 7dcfa5d443..ade3c5bdb9 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -134,11 +134,11 @@ def is_web_server_broken(url): test_req = requests.get(url) test_req.raise_for_status() except Exception as e: - return true + return True else: # The request worked fine, so the web server and Airtime are still up. - return false - return false + return False + return False def alert_hung_request(): From 54523e264cb194937c71fa4d1121f7f7ed4dd8cc Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 22 Oct 2014 11:38:22 -0400 Subject: [PATCH 208/310] Fix rare exception during shutdown in airtime_analyzer --- .../airtime_analyzer/message_listener.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 97613e81fc..9b890321c7 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -120,8 +120,13 @@ def wait_for_messages(self): def disconnect_from_messaging_server(self): '''Stop consuming RabbitMQ messages and disconnect''' - self._channel.stop_consuming() - self._connection.close() + # If you try to close a connection that's already closed, you're going to have a bad time. + # We're breaking EAFP because this can be called multiple times depending on exception + # handling flow here. + if not self._channel.is_closed and not self._channel.is_closing: + self._channel.stop_consuming() + if not self._connection.is_closed and not self._connection.is_closing: + self._connection.close() def graceful_shutdown(self, signum, frame): '''Disconnect and break out of the message listening loop''' From 53dc92b2041b1287735b3b41da250e84348eaf12 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 22 Oct 2014 11:39:22 -0400 Subject: [PATCH 209/310] StatusReporter exception handler to prevent thread from dying under any circumstances --- .../airtime_analyzer/status_reporter.py | 67 +++++++++++-------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index ade3c5bdb9..ebf9a12d55 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -38,9 +38,9 @@ def process_http_requests(ipc_queue, http_retry_queue_path): # retried later: retry_queue = collections.deque() shutdown = False - - # Unpickle retry_queue from disk so that we won't have lost any uploads - # if airtime_analyzer is shut down while the web server is down or unreachable, + + # Unpickle retry_queue from disk so that we won't have lost any uploads + # if airtime_analyzer is shut down while the web server is down or unreachable, # and there were failed HTTP requests pending, waiting to be retried. try: with open(http_retry_queue_path, 'rb') as pickle_file: @@ -57,33 +57,42 @@ def process_http_requests(ipc_queue, http_retry_queue_path): logging.error("Failed to unpickle %s. Continuing..." % http_retry_queue_path) pass - - while not shutdown: + while True: try: - request = ipc_queue.get(block=True, timeout=5) - if isinstance(request, str) and request == "shutdown": # Bit of a cheat - shutdown = True - break - if not isinstance(request, PicklableHttpRequest): - raise TypeError("request must be a PicklableHttpRequest. Was of type " + type(request).__name__) - except Queue.Empty: - request = None - - # If there's no new HTTP request we need to execute, let's check our "retry - # queue" and see if there's any failed HTTP requests we can retry: - if request: - send_http_request(request, retry_queue) - else: - # Using a for loop instead of while so we only iterate over all the requests once! - for i in range(len(retry_queue)): - request = retry_queue.popleft() - send_http_request(request, retry_queue) - - logging.info("Shutting down status_reporter") - # Pickle retry_queue to disk so that we don't lose uploads if we're shut down while - # while the web server is down or unreachable. - with open(http_retry_queue_path, 'wb') as pickle_file: - pickle.dump(retry_queue, pickle_file) + while not shutdown: + try: + request = ipc_queue.get(block=True, timeout=5) + if isinstance(request, str) and request == "shutdown": # Bit of a cheat + shutdown = True + break + if not isinstance(request, PicklableHttpRequest): + raise TypeError("request must be a PicklableHttpRequest. Was of type " + type(request).__name__) + except Queue.Empty: + request = None + + # If there's no new HTTP request we need to execute, let's check our "retry + # queue" and see if there's any failed HTTP requests we can retry: + if request: + send_http_request(request, retry_queue) + else: + # Using a for loop instead of while so we only iterate over all the requests once! + for i in range(len(retry_queue)): + request = retry_queue.popleft() + send_http_request(request, retry_queue) + + logging.info("Shutting down status_reporter") + # Pickle retry_queue to disk so that we don't lose uploads if we're shut down while + # while the web server is down or unreachable. + with open(http_retry_queue_path, 'wb') as pickle_file: + pickle.dump(retry_queue, pickle_file) + except Exception as e: # Terrible top-level exception handler to prevent the thread from dying, just in case. + if shutdown: + return + logging.exception("Unhandled exception in StatusReporter") + logging.exception(e) + logging.info("Restarting StatusReporter thread") + time.sleep(2) # Throttle it + def send_http_request(picklable_request, retry_queue): if not isinstance(picklable_request, PicklableHttpRequest): From 9726fb80d2dc833c0154618210275b965290034e Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 22 Oct 2014 14:17:44 -0400 Subject: [PATCH 210/310] Removed amazon s3 signature from pypo cache file name. Stopped pyppo from downloading amazon s3 files if it already exists in the pypo cache dir. --- airtime_mvc/application/models/Schedule.php | 6 ++- airtime_mvc/application/models/StoredFile.php | 2 +- .../application/models/airtime/CcFiles.php | 5 +++ .../application/models/airtime/CloudFile.php | 45 ++++++++++++------- python_apps/pypo/cloud_storage_downloader.py | 7 ++- 5 files changed, 44 insertions(+), 21 deletions(-) diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index 606acae001..d156dd5f6a 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -895,9 +895,11 @@ private static function createScheduledEvents(&$data, $range_start, $range_end) //row is from "file" $media_id = $item['file_id']; $storedFile = Application_Model_StoredFile::RecallById($media_id); - $uri = $storedFile->getFilePath(); + $file = $storedFile->getPropelOrm(); + $uri = $file->getAbsoluteFilePath(); + $object_name = null; - if ($storedFile->getPropelOrm() instanceof CloudFile) { + if ($file instanceof CloudFile) { $object_name = $storedFile->getResourceId(); } $filesize = $storedFile->getFileSize(); diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 3bf35899ad..f035e616db 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -491,7 +491,7 @@ public function getFilePath() { assert($this->_file); - return $this->_file->getAbsoluteFilePath(); + return $this->_file->getURLForTrackPreviewOrDownload(); } /** diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index 9d40aef665..8bc02a25f8 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -82,6 +82,11 @@ public function getFilename() return $info['filename']; } + public function getURLForTrackPreviewOrDownload() + { + return $this->getAbsoluteFilePath(); + } + public function getAbsoluteFilePath() { $music_dir = Application_Model_MusicDir::getDirByPK($this->getDbDirectory()); diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index 414933e11a..cba99055db 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -16,37 +16,50 @@ class CloudFile extends BaseCloudFile { + public function getURLForTrackPreviewOrDownload() + { + return $this->getAbsoluteFilePath()."?".$this->getAuthenticationParams(); + } + + /** + * + * Enter description here ... + */ public function getAbsoluteFilePath() { - return $this->get_s3_signed_url(); + $amazon_s3 = new Amazon_S3(); + $zend_s3 = $amazon_s3->getZendServiceAmazonS3(); + $resource_id = $this->getResourceId(); + $endpoint = $zend_s3->getEndpoint(); + $scheme = $endpoint->getScheme(); + $host = $endpoint->getHost(); + $s3_bucket = $amazon_s3->getBucket(); + return "$scheme://$host/$s3_bucket/".utf8_encode($resource_id); } - private function get_s3_signed_url() + /** + * + * Returns a string of authentication paramaters to append to the cloud + * object's URL. We need this for track preview and download because the + * objects are privately stored on Amazon S3. + */ + public function getAuthenticationParams() { - //should be longer than track length - $expires = 120; + $expires = time()+120; $resource_id = $this->getResourceId(); - + $amazon_s3 = new Amazon_S3(); $s3_bucket = $amazon_s3->getBucket(); $s3_secret_key = $amazon_s3->getSecretKey(); $s3_access_key = $amazon_s3->getAccessKey(); - $zend_s3 = $amazon_s3->getZendServiceAmazonS3(); - - $expires = time()+$expires; + $string_to_sign = utf8_encode("GET\n\n\n$expires\n/$s3_bucket/$resource_id"); // We need to urlencode the entire signature in case the hashed signature // has spaces. (NOTE: utf8_encode() does not work here because it turns // spaces into non-breaking spaces) $signature = urlencode(base64_encode((hash_hmac("sha1", $string_to_sign, $s3_secret_key, true)))); - $authentication_params = "AWSAccessKeyId=$s3_access_key&Expires=$expires&Signature=$signature"; - - $endpoint = $zend_s3->getEndpoint(); - $scheme = $endpoint->getScheme(); - $host = $endpoint->getHost(); - $url = "$scheme://$host/$s3_bucket/".utf8_encode($resource_id)."?$authentication_params"; - return $url; + return "AWSAccessKeyId=$s3_access_key&Expires=$expires&Signature=$signature"; } public function getFileSize() @@ -71,7 +84,7 @@ public function isValidFile() { $ch = curl_init(); curl_setopt_array($ch, array( - CURLOPT_URL => $this->getAbsoluteFilePath(), + CURLOPT_URL => $this->getURLForTrackPreviewOrDownload(), CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_VERBOSE => false diff --git a/python_apps/pypo/cloud_storage_downloader.py b/python_apps/pypo/cloud_storage_downloader.py index 01a9a1ee71..6304c7fbb8 100644 --- a/python_apps/pypo/cloud_storage_downloader.py +++ b/python_apps/pypo/cloud_storage_downloader.py @@ -28,8 +28,11 @@ def download_obj(self, dst, obj_name): except ObjectDoesNotExistError: logging.info("Could not find object: %s" % obj_name) - logging.info('Downloading: %s to %s' % (cloud_obj.name, dst)) - cloud_obj.download(destination_path=dst) + if os.path.isfile(dst) == False: + logging.info('Downloading: %s to %s' % (cloud_obj.name, dst)) + cloud_obj.download(destination_path=dst) + else: + logging.info("Skipping download because %s already exists" % dst) def read_config_file(self, config_path): """Parse the application's config file located at config_path.""" From 7edd993fa3d0c7707e835c8b522ee64a93c41a93 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 24 Oct 2014 15:50:52 -0400 Subject: [PATCH 211/310] Reverted pypo's copy file method to how it was without cloud files and instead directly call the cloud file's downloader method. --- airtime_mvc/application/models/Schedule.php | 8 +++---- python_apps/pypo/cloud_storage_downloader.py | 11 ++++++++-- python_apps/pypo/pypofile.py | 23 ++++++++++++++------ 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index d156dd5f6a..8225783575 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -724,7 +724,7 @@ private static function createInputHarborKickTimes(&$data, $range_start, $range_ } } - private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $filesize, $object_name=null) + private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $object_name=null) { $start = self::AirtimeTimeToPypoTime($item["start"]); $end = self::AirtimeTimeToPypoTime($item["end"]); @@ -758,8 +758,7 @@ private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, 'end' => $end, 'show_name' => $item["show_name"], 'replay_gain' => $replay_gain, - 'independent_event' => $independent_event, - 'filesize' => $filesize + 'independent_event' => $independent_event ); if (!is_null($object_name)) { $schedule_item["object_name"] = $object_name; @@ -902,8 +901,7 @@ private static function createScheduledEvents(&$data, $range_start, $range_end) if ($file instanceof CloudFile) { $object_name = $storedFile->getResourceId(); } - $filesize = $storedFile->getFileSize(); - self::createFileScheduleEvent($data, $item, $media_id, $uri, $filesize, $object_name); + self::createFileScheduleEvent($data, $item, $media_id, $uri, $object_name); } elseif (!is_null($item['stream_id'])) { //row is type "webstream" diff --git a/python_apps/pypo/cloud_storage_downloader.py b/python_apps/pypo/cloud_storage_downloader.py index 6304c7fbb8..d75ad66d76 100644 --- a/python_apps/pypo/cloud_storage_downloader.py +++ b/python_apps/pypo/cloud_storage_downloader.py @@ -2,6 +2,7 @@ import logging import ConfigParser import sys +import hashlib from libcloud.storage.types import Provider, ObjectDoesNotExistError from libcloud.storage.providers import get_driver @@ -26,9 +27,15 @@ def download_obj(self, dst, obj_name): cloud_obj = driver.get_object(container_name=self._bucket, object_name=obj_name) except ObjectDoesNotExistError: - logging.info("Could not find object: %s" % obj_name) + logging.info("%s does not exist on Amazon S3" % obj_name) - if os.path.isfile(dst) == False: + dst_exists = False + if (os.path.isfile(dst)): + dst_hash = hashlib.md5(open(dst).read()).hexdigest() + if dst_hash == cloud_obj.hash: + dst_exists = True + + if dst_exists == False: logging.info('Downloading: %s to %s' % (cloud_obj.name, dst)) cloud_obj.download(destination_path=dst) else: diff --git a/python_apps/pypo/pypofile.py b/python_apps/pypo/pypofile.py index d6863883ce..d0667a58ff 100644 --- a/python_apps/pypo/pypofile.py +++ b/python_apps/pypo/pypofile.py @@ -37,8 +37,13 @@ def copy_file(self, media_item): """ src = media_item['uri'] dst = media_item['dst'] - src_size = media_item['filesize'] + try: + src_size = os.path.getsize(src) + except Exception, e: + self.logger.error("Could not get size of source file: %s", src) + return + dst_exists = True try: dst_size = os.path.getsize(dst) @@ -63,11 +68,7 @@ def copy_file(self, media_item): """ copy will overwrite dst if it already exists """ - if 'object_name' in media_item: - csd = CloudStorageDownloader() - csd.download_obj(dst, media_item['object_name']) - else: - shutil.copy(src, dst) + shutil.copy(src, dst) #make file world readable os.chmod(dst, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) @@ -132,7 +133,15 @@ def main(self): media_item = self.get_highest_priority_media_item(self.media) if media_item is not None: - self.copy_file(media_item) + """ + If an object_name exists the file is stored on Amazon S3 + """ + if 'object_name' in media_item: + csd = CloudStorageDownloader() + csd.download_obj(media_item['dst'], media_item['object_name']) + media_item['file_ready'] = True + else: + self.copy_file(media_item) except Exception, e: import traceback top = traceback.format_exc() From 7018f45c0a787ce66686745b24a08e250f97174b Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 27 Oct 2014 12:39:02 -0400 Subject: [PATCH 212/310] Check filesize is greater than zero before deleteing a file from library --- airtime_mvc/application/models/StoredFile.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index f035e616db..425a474733 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -383,6 +383,9 @@ public function delete() Logging::info("User ".$user->getLogin()." is deleting file: ".$this->_file->getDbTrackTitle()." - file id: ".$file_id); $filesize = $this->_file->getFileSize(); + if ($filesize <= 0) { + throw new Exception("Cannot delete file with filesize ".$filesize); + } //Delete the physical file from either the local stor directory //or from the cloud From 978fc43a82c8cb6ecd9ad8e0da8aad8704a90963 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 29 Oct 2014 10:47:32 -0400 Subject: [PATCH 213/310] Started commenting CloudStorageUploader class --- .../cloud_storage_uploader.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index 49c5085270..84dbdc054f 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -6,6 +6,15 @@ from libcloud.storage.types import Provider, ContainerDoesNotExistError, ObjectDoesNotExistError class CloudStorageUploader: + """ A class that uses Apache Libcloud's Storage API to upload objects into + various cloud storage backends. + + Attributes: + _provider: Storage backend. For exmaple, Amazon S3, Google Storage. + _bucket: Name of container on provider where files will get uploaded into. + _api_key: Access key to objects on the provider's storage backend. + _api_key_secret: Secret access key to objects on the provider's storage backend. +""" def __init__(self, provider, bucket, api_key, api_key_secret): self._provider = provider self._bucket = bucket @@ -13,6 +22,16 @@ def __init__(self, provider, bucket, api_key, api_key_secret): self._api_key_secret = api_key_secret def upload_obj(self, audio_file_path, metadata): + '''Uploads a file into a provider's cloud object storage. + + Generates a unique object name + + Keyword arguments: + audio_file_path: Path on disk to the audio file that is about to be + uploaded to cloud object storage. + metadata: ID3 tags and other metadata extracted from the audio file. + ''' + file_base_name = os.path.basename(audio_file_path) file_name, extension = os.path.splitext(file_base_name) From 01ad2ab832c175f78106276b74c250e14e69e563 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 29 Oct 2014 17:42:42 -0400 Subject: [PATCH 214/310] Commented cloud storage classes --- .../cloud_storage_uploader.py | 43 ++++++++++++------- python_apps/pypo/cloud_storage_downloader.py | 32 +++++++++++++- 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index 84dbdc054f..f4c03de48f 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -7,14 +7,20 @@ class CloudStorageUploader: """ A class that uses Apache Libcloud's Storage API to upload objects into - various cloud storage backends. + a cloud storage backend. For this implementation all files will be uploaded + into a bucket on Amazon S3. + + It is important to note that every file, coming from different Airtime Pro + stations, will get uploaded into the same bucket on the same Amazon S3 + account. Attributes: _provider: Storage backend. For exmaple, Amazon S3, Google Storage. _bucket: Name of container on provider where files will get uploaded into. _api_key: Access key to objects on the provider's storage backend. _api_key_secret: Secret access key to objects on the provider's storage backend. -""" + """ + def __init__(self, provider, bucket, api_key, api_key_secret): self._provider = provider self._bucket = bucket @@ -22,29 +28,36 @@ def __init__(self, provider, bucket, api_key, api_key_secret): self._api_key_secret = api_key_secret def upload_obj(self, audio_file_path, metadata): - '''Uploads a file into a provider's cloud object storage. + """Uploads a file into Amazon S3 object storage. - Generates a unique object name + Before a file is uploaded onto Amazon S3 we generate a unique object + name consisting of the filename and a unqiue string using the uuid4 + module. Keyword arguments: audio_file_path: Path on disk to the audio file that is about to be - uploaded to cloud object storage. + uploaded to Amazon S3 object storage. metadata: ID3 tags and other metadata extracted from the audio file. - ''' + + Returns: + The metadata dictionary it received with three new keys: + filesize: The file's filesize in bytes. + filename: The file's filename. + resource_id: The unique object name used to identify the objects + on Amazon S3 + """ file_base_name = os.path.basename(audio_file_path) file_name, extension = os.path.splitext(file_base_name) - ''' - With Amazon S3 you cannot create a signed url if there are spaces - in the object name. URL encoding the object name doesn't solve the - problem. As a solution we will replace spaces with dashes. - ''' + # With Amazon S3 you cannot create a signed url if there are spaces + # in the object name. URL encoding the object name doesn't solve the + # problem. As a solution we will replace spaces with dashes. file_name = file_name.replace(" ", "-") object_name = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension) - cls = get_driver(getattr(Provider, self._provider)) - driver = cls(self._api_key, self._api_key_secret) + provider_driver_class = get_driver(getattr(Provider, self._provider)) + driver = provider_driver_class(self._api_key, self._api_key_secret) try: container = driver.get_container(self._bucket) @@ -61,13 +74,13 @@ def upload_obj(self, audio_file_path, metadata): metadata["filesize"] = os.path.getsize(audio_file_path) - '''remove file from organize directory''' + # Remove file from organize directory try: os.remove(audio_file_path) except OSError: logging.info("Could not remove %s from organize directory" % audio_file_path) - '''pass original filename to Airtime so we can store it in the db''' + # Pass original filename to Airtime so we can store it in the db metadata["filename"] = file_base_name metadata["resource_id"] = object_name diff --git a/python_apps/pypo/cloud_storage_downloader.py b/python_apps/pypo/cloud_storage_downloader.py index d75ad66d76..0a129f1d02 100644 --- a/python_apps/pypo/cloud_storage_downloader.py +++ b/python_apps/pypo/cloud_storage_downloader.py @@ -10,6 +10,19 @@ CONFIG_PATH = '/etc/airtime/airtime.conf' class CloudStorageDownloader: + """ A class that uses Apache Libcloud's Storage API to download objects from + a cloud storage backend. For this implementation all files are stored on + Amazon S3 and will be downloaded from there. + + This class is used with Airtime's playout engine service, PYPO. + + Attributes: + _provider: Storage backend. For exmaple, Amazon S3, Google Storage. + _bucket: Name of container on provider where files will get uploaded into. + _api_key: Access key to objects on the provider's storage backend. + _api_key_secret: Secret access key to objects on the provider's storage backend. + """ + def __init__(self): config = self.read_config_file(CONFIG_PATH) @@ -20,8 +33,18 @@ def __init__(self): self._api_key_secret = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key_secret') def download_obj(self, dst, obj_name): - cls = get_driver(getattr(Provider, self._provider)) - driver = cls(self._api_key, self._api_key_secret) + """Downloads a file from Amazon S3 object storage to disk. + + Downloads an object to PYPO's temporary cache directory on disk. + If the file already exists in the cache directory the object + downloading is skipped. + + Keyword arguments: + dst: PYPO's temporary cache directory on disk. + obj_name: Name of the object to download to disk + """ + provider_driver_class = get_driver(getattr(Provider, self._provider)) + driver = provider_driver_class(self._api_key, self._api_key_secret) try: cloud_obj = driver.get_object(container_name=self._bucket, @@ -29,6 +52,11 @@ def download_obj(self, dst, obj_name): except ObjectDoesNotExistError: logging.info("%s does not exist on Amazon S3" % obj_name) + # If we detect the file path already exists in PYPO's cache directory + # we need to verify the contents of that file is the same (in case there + # was file corruption in a previous download for example) as the + # object's contents by comparing the hash. If the hash values are not + # equal we need to download the object to disk again. dst_exists = False if (os.path.isfile(dst)): dst_hash = hashlib.md5(open(dst).read()).hexdigest() From fd39db2e241a903b9557c979b37c5c7fd54036b1 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 29 Oct 2014 17:55:42 -0400 Subject: [PATCH 215/310] Merge pull request #75 - Saas relder csrf delete file --- .../rest/controllers/MediaController.php | 25 ++++++++++++++++--- .../public/js/airtime/library/plupload.js | 2 +- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index f03b3b7b25..dbbc346ba0 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -300,12 +300,18 @@ private function getId() } return $id; } - + private function verifyAuth($checkApiKey, $checkSession) { - //Session takes precedence over API key for now: - if ($checkSession && $this->verifySession()) - { + // Session takes precedence over API key for now: + if ($checkSession && $this->verifySession()) { + // CSRF token validation only applies to session based authorization. + if(!$this->verifyCSRFToken($this->_getParam('csrf_token'))){ + $resp = $this->getResponse(); + $resp->setHttpResponseCode(401); + $resp->appendBody("ERROR: Token Missmatch."); + return false; + } return true; } @@ -321,6 +327,17 @@ private function verifyAuth($checkApiKey, $checkSession) return false; } + private function verifyCSRFToken($token){ + $current_namespace = new Zend_Session_Namespace('csrf_namespace'); + $observed_csrf_token = $token; + $expected_csrf_token = $current_namespace->authtoken; + + if($observed_csrf_token == $expected_csrf_token){ + return true; + }else{ + return false; + } + } private function verifyAPIKey() { diff --git a/airtime_mvc/public/js/airtime/library/plupload.js b/airtime_mvc/public/js/airtime/library/plupload.js index a361fe4421..f96ee31576 100644 --- a/airtime_mvc/public/js/airtime/library/plupload.js +++ b/airtime_mvc/public/js/airtime/library/plupload.js @@ -89,7 +89,7 @@ $(document).ready(function() { $.ajax({ type: 'DELETE', - url: '/rest/media/' + file.id, + url: 'rest/media/' + file.id + "?csrf_token=" + $("#csrf").attr('value'), success: function(resp) { self.recentUploadsTable.fnDraw(); }, From e23649173d2a54143f63f7addcc4c7879cb5bd94 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 30 Oct 2014 12:12:47 -0400 Subject: [PATCH 216/310] Added comments to CcFiles and CloudFile classes. --- .../application/models/airtime/CcFiles.php | 14 +++++++++++++- .../application/models/airtime/CloudFile.php | 19 ++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index 8bc02a25f8..956e8181e5 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -71,6 +71,9 @@ public static function sanitizeResponse($file) return $response; } + /** + * Returns the file size in bytes. + */ public function getFileSize() { return filesize($this->getAbsoluteFilePath()); @@ -82,11 +85,17 @@ public function getFilename() return $info['filename']; } + /** + * Returns the file's absolute file path stored on disk. + */ public function getURLForTrackPreviewOrDownload() { return $this->getAbsoluteFilePath(); } + /** + * Returns the file's absolute file path stored on disk. + */ public function getAbsoluteFilePath() { $music_dir = Application_Model_MusicDir::getDirByPK($this->getDbDirectory()); @@ -99,6 +108,9 @@ public function getAbsoluteFilePath() return Application_Common_OsPath::join($directory, $filepath); } + /** + * Checks if the file is a regular file that can be previewed and downloaded. + */ public function isValidFile() { return is_file($this->getAbsoluteFilePath()); @@ -106,7 +118,7 @@ public function isValidFile() /** * - * Deletes the file from the stor directory + * Deletes the file from the stor directory on disk. */ public function deletePhysicalFile() { diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index cba99055db..a316604032 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -5,7 +5,9 @@ /** * Skeleton subclass for representing a row from the 'cloud_file' table. * - * + * Each cloud_file has a corresponding cc_file referenced as a foreign key. + * The file's metadata is stored in the cc_file table. This, cloud_file, + * table represents files that are stored on Amazon S3. * * You should add additional methods to this class to meet the * application requirements. This class will only be generated as @@ -16,6 +18,11 @@ class CloudFile extends BaseCloudFile { + /** + * Returns a signed URL to the file's object on Amazon S3. Since we are + * requesting the file's object via this URL, it needs to be signed because + * all objects stored on Amazon S3 are private. + */ public function getURLForTrackPreviewOrDownload() { return $this->getAbsoluteFilePath()."?".$this->getAuthenticationParams(); @@ -23,7 +30,7 @@ public function getURLForTrackPreviewOrDownload() /** * - * Enter description here ... + * Returns a url to the file's object on Amazon S3. */ public function getAbsoluteFilePath() { @@ -62,6 +69,9 @@ public function getAuthenticationParams() return "AWSAccessKeyId=$s3_access_key&Expires=$expires&Signature=$signature"; } + /** + * Returns the file size in bytes. + */ public function getFileSize() { $amazon_s3 = new Amazon_S3(); @@ -80,6 +90,9 @@ public function getFilename() return $this->getDbFilepath(); } + /** + * Checks if the file is a regular file that can be previewed and downloaded. + */ public function isValidFile() { $ch = curl_init(); @@ -125,7 +138,7 @@ public function deletePhysicalFile() /** * - * Deletes the cloud_file's 'parent' object before itself + * Deletes the cc_file and cloud_file entries from the database. */ public function delete(PropelPDO $con = NULL) { From 5f98151009d0667f6d31506d4e079eb5c31756b8 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 3 Nov 2014 12:57:41 -0500 Subject: [PATCH 217/310] Removed unused route from rest Media Controller --- airtime_mvc/application/modules/rest/Bootstrap.php | 13 ------------- .../modules/rest/controllers/MediaController.php | 3 --- 2 files changed, 16 deletions(-) diff --git a/airtime_mvc/application/modules/rest/Bootstrap.php b/airtime_mvc/application/modules/rest/Bootstrap.php index f04c61ef3f..999798ee54 100644 --- a/airtime_mvc/application/modules/rest/Bootstrap.php +++ b/airtime_mvc/application/modules/rest/Bootstrap.php @@ -33,18 +33,5 @@ protected function _initRouter() ) ); $router->addRoute('clear', $clearLibraryRoute); - - $deleteSuccessRoute = new Zend_Controller_Router_Route( - 'rest/media/:id/delete-success', - array( - 'controller' => 'media', - 'action' => 'delete-success', - 'module' => 'rest' - ), - array( - 'id' => '\d+' - ) - ); - $router->addRoute('delete-success', $deleteSuccessRoute); } } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 10ff5723ac..5cfb682c36 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -21,9 +21,6 @@ class Rest_MediaController extends Zend_Rest_Controller public function init() { $this->view->layout()->disableLayout(); - - $ajaxContext = $this->_helper->getHelper('AjaxContext'); - $ajaxContext->addActionContext('delete-success', 'json'); } public function indexAction() From 27b8f0ac1328e77f8840e3814096d95b8bb59d05 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 3 Nov 2014 13:15:04 -0500 Subject: [PATCH 218/310] Removed delete-success view script because action no longer exists. --- .../modules/rest/views/scripts/media/delete-success.phtml | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 airtime_mvc/application/modules/rest/views/scripts/media/delete-success.phtml diff --git a/airtime_mvc/application/modules/rest/views/scripts/media/delete-success.phtml b/airtime_mvc/application/modules/rest/views/scripts/media/delete-success.phtml deleted file mode 100644 index e69de29bb2..0000000000 From e24b4f43fdb70e1a6abf6b0ce10d96fb4d5114f1 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 5 Nov 2014 16:24:03 -0500 Subject: [PATCH 219/310] Made AirtimeAnalyzerServer.read_config_file static so CloudStorageUploader can use it. Reverted MessageListener.msg_received_callback and MessageListener.spawn_analyzer_process back to static methods. Moved cloud storage settings out of MessageListener and into CloudStorageUploader --- airtime_mvc/application/configs/conf.php | 7 ++++-- airtime_mvc/build/airtime.conf | 8 +------ .../airtime_analyzer/airtime_analyzer.py | 5 +++-- .../airtime_analyzer/analyzer_pipeline.py | 5 ++--- .../cloud_storage_uploader.py | 18 ++++++++++----- .../airtime_analyzer/message_listener.py | 22 ++++++------------- 6 files changed, 30 insertions(+), 35 deletions(-) diff --git a/airtime_mvc/application/configs/conf.php b/airtime_mvc/application/configs/conf.php index 26a35b404e..30918e4deb 100644 --- a/airtime_mvc/application/configs/conf.php +++ b/airtime_mvc/application/configs/conf.php @@ -25,13 +25,16 @@ public static function loadConfig() { $filename = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf"; } + // Parse separate conf file for Amazon S3 values + $amazonFilename = "/etc/airtime-saas/amazon.conf"; + $amazonValues = parse_ini_file($amazonFilename, true); + $CC_CONFIG['cloud_storage'] = $amazonValues['cloud_storage']; + $values = parse_ini_file($filename, true); // Name of the web server user $CC_CONFIG['webServerUser'] = $values['general']['web_server_user']; $CC_CONFIG['rabbitmq'] = $values['rabbitmq']; - - $CC_CONFIG['cloud_storage'] = $values['cloud_storage']; $CC_CONFIG['baseDir'] = $values['general']['base_dir']; $CC_CONFIG['baseUrl'] = $values['general']['base_url']; diff --git a/airtime_mvc/build/airtime.conf b/airtime_mvc/build/airtime.conf index 10963f5520..60633ed2b1 100644 --- a/airtime_mvc/build/airtime.conf +++ b/airtime_mvc/build/airtime.conf @@ -29,10 +29,4 @@ monit_password = airtime [soundcloud] connection_retries = 3 -time_between_retries = 60 - -[cloud_storage] -provider = S3 -bucket = -api_key = -api_key_secret = \ No newline at end of file +time_between_retries = 60 \ No newline at end of file diff --git a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py index 567c31c987..dae2719604 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py @@ -32,7 +32,7 @@ def __init__(self, config_path, http_retry_queue_path, debug=False): self.setup_logging(debug) # Read our config file - config = self.read_config_file(config_path) + config = AirtimeAnalyzerServer.read_config_file(config_path) # Start up the StatusReporter process StatusReporter.start_thread(http_retry_queue_path) @@ -73,7 +73,8 @@ def setup_logging(self, debug): rootLogger.addHandler(consoleHandler) - def read_config_file(self, config_path): + @staticmethod + def read_config_file(config_path): """Parse the application's config file located at config_path.""" config = ConfigParser.SafeConfigParser() try: diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 0202c26879..f17b1711d7 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -18,8 +18,7 @@ class AnalyzerPipeline: """ @staticmethod - def run_analysis(queue, audio_file_path, import_directory, original_filename, - cloud_provider, cloud_bucket, cloud_api_key, cloud_api_key_secret): + def run_analysis(queue, audio_file_path, import_directory, original_filename): """Analyze and import an audio file, and put all extracted metadata into queue. Keyword arguments: @@ -54,7 +53,7 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename, metadata = dict() metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) #metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) - csu = CloudStorageUploader(cloud_provider, cloud_bucket, cloud_api_key, cloud_api_key_secret) + csu = CloudStorageUploader() metadata = csu.upload_obj(audio_file_path, metadata) metadata["import_status"] = 0 # imported diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index f4c03de48f..b52ac0113a 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -1,10 +1,13 @@ import os import logging import uuid - +import airtime_analyzer as aa from libcloud.storage.providers import get_driver from libcloud.storage.types import Provider, ContainerDoesNotExistError, ObjectDoesNotExistError + +CONFIG_PATH = '/etc/airtime-saas/amazon.conf' + class CloudStorageUploader: """ A class that uses Apache Libcloud's Storage API to upload objects into a cloud storage backend. For this implementation all files will be uploaded @@ -21,11 +24,14 @@ class CloudStorageUploader: _api_key_secret: Secret access key to objects on the provider's storage backend. """ - def __init__(self, provider, bucket, api_key, api_key_secret): - self._provider = provider - self._bucket = bucket - self._api_key = api_key - self._api_key_secret = api_key_secret + def __init__(self): + config = aa.AirtimeAnalyzerServer.read_config_file(CONFIG_PATH) + + CLOUD_STORAGE_CONFIG_SECTION = "cloud_storage" + self._provider = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'provider') + self._bucket = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'bucket') + self._api_key = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key') + self._api_key_secret = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key_secret') def upload_obj(self, audio_file_path, metadata): """Uploads a file into Amazon S3 object storage. diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 71211192a1..acf21f471d 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -74,13 +74,6 @@ def __init__(self, config): self._password = config.get(RMQ_CONFIG_SECTION, 'password') self._vhost = config.get(RMQ_CONFIG_SECTION, 'vhost') - # Read the S3 API setting from the config file - CLOUD_STORAGE_CONFIG_SECTION = "cloud_storage" - self._provider = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'provider') - self._bucket = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'bucket') - self._api_key = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key') - self._api_key_secret = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key_secret') - # Set up a signal handler so we can shutdown gracefully # For some reason, this signal handler must be set up here. I'd rather # put it in AirtimeAnalyzerServer, but it doesn't work there (something to do @@ -119,7 +112,7 @@ def connect_to_messaging_server(self): self._channel.queue_bind(exchange=EXCHANGE, queue=QUEUE, routing_key=ROUTING_KEY) logging.info(" Listening for messages...") - self._channel.basic_consume(self.msg_received_callback, + self._channel.basic_consume(MessageListener.msg_received_callback, queue=QUEUE, no_ack=False) def wait_for_messages(self): @@ -141,8 +134,8 @@ def graceful_shutdown(self, signum, frame): self._shutdown = True self.disconnect_from_messaging_server() - #@staticmethod - def msg_received_callback(self, channel, method_frame, header_frame, body): + @staticmethod + def msg_received_callback(channel, method_frame, header_frame, body): ''' A callback method that runs when a RabbitMQ message is received. Here we parse the message, spin up an analyzer process, and report the @@ -173,7 +166,7 @@ def msg_received_callback(self, channel, method_frame, header_frame, body): import_directory = msg_dict["import_directory"] original_filename = msg_dict["original_filename"] - audio_metadata = self.spawn_analyzer_process(audio_file_path, import_directory, original_filename) + audio_metadata = MessageListener.spawn_analyzer_process(audio_file_path, import_directory, original_filename) StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) except KeyError as e: @@ -211,13 +204,12 @@ def msg_received_callback(self, channel, method_frame, header_frame, body): # If we don't ack, then RabbitMQ will redeliver the message in the future. channel.basic_ack(delivery_tag=method_frame.delivery_tag) - #@staticmethod - def spawn_analyzer_process(self, audio_file_path, import_directory, original_filename): + @staticmethod + def spawn_analyzer_process(audio_file_path, import_directory, original_filename): ''' Spawn a child process to analyze and import a new audio file. ''' q = multiprocessing.Queue() p = multiprocessing.Process(target=AnalyzerPipeline.run_analysis, - args=(q, audio_file_path, import_directory, original_filename, - self._provider, self._bucket, self._api_key, self._api_key_secret)) + args=(q, audio_file_path, import_directory, original_filename)) p.start() p.join() if p.exitcode == 0: From 1dc72d5ebec05a341775d0242aa71983e54745ad Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 7 Nov 2014 11:51:11 -0500 Subject: [PATCH 220/310] Changed Amazon S3 download URL format so it works with S3_EU_WEST region. Updated amazon config file path in the downloader class --- airtime_mvc/application/models/airtime/CloudFile.php | 2 +- python_apps/pypo/cloud_storage_downloader.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index a316604032..a30eedc6c6 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -41,7 +41,7 @@ public function getAbsoluteFilePath() $scheme = $endpoint->getScheme(); $host = $endpoint->getHost(); $s3_bucket = $amazon_s3->getBucket(); - return "$scheme://$host/$s3_bucket/".utf8_encode($resource_id); + return "$scheme://$s3_bucket.$host/".utf8_encode($resource_id); } /** diff --git a/python_apps/pypo/cloud_storage_downloader.py b/python_apps/pypo/cloud_storage_downloader.py index 0a129f1d02..4565985e94 100644 --- a/python_apps/pypo/cloud_storage_downloader.py +++ b/python_apps/pypo/cloud_storage_downloader.py @@ -7,7 +7,7 @@ from libcloud.storage.types import Provider, ObjectDoesNotExistError from libcloud.storage.providers import get_driver -CONFIG_PATH = '/etc/airtime/airtime.conf' +CONFIG_PATH = '/etc/airtime-saas/amazon.conf' class CloudStorageDownloader: """ A class that uses Apache Libcloud's Storage API to download objects from From ecc0225ff518457b5ec5ffd287f67f2b09c91b1d Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 7 Nov 2014 12:49:10 -0500 Subject: [PATCH 221/310] Added apache-libcloud dependency to airtime_analyzer --- python_apps/airtime_analyzer/setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index c47b051678..7b27df24f5 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -29,6 +29,7 @@ 'mock', 'python-daemon', 'requests', + 'apache-libcloud', ], zip_safe=False, data_files=data_files) From fa88e72d82c90ac6f15bc5b12a13ac470b4fc465 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 7 Nov 2014 13:02:09 -0500 Subject: [PATCH 222/310] Removed composer.lock from gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 16b0335f9f..dee211dc2e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,4 @@ *.pyc vendor/* composer.phar -composer.lock From c63627267c9100b7b133510958dd1ef67f9ed9d0 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 7 Nov 2014 13:06:18 -0500 Subject: [PATCH 223/310] composer.lock --- composer.lock | 369 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 369 insertions(+) create mode 100644 composer.lock diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000000..7e6984eb5d --- /dev/null +++ b/composer.lock @@ -0,0 +1,369 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "5776cc789514d71faac7021474c96d58", + "packages": [ + { + "name": "aws/aws-sdk-php", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "c540fa2c66daf91383a2cd7fc044765f2da2aa52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c540fa2c66daf91383a2cd7fc044765f2da2aa52", + "reference": "c540fa2c66daf91383a2cd7fc044765f2da2aa52", + "shasum": "" + }, + "require": { + "guzzle/guzzle": ">=3.7,<4", + "php": ">=5.3.3" + }, + "require-dev": { + "doctrine/cache": "~1.0", + "ext-openssl": "*", + "monolog/monolog": "1.4.*", + "phpunit/phpunit": "4.*", + "symfony/yaml": "2.*" + }, + "suggest": { + "doctrine/cache": "Adds support for caching of credentials and responses", + "ext-apc": "Allows service description opcode caching, request and response caching, and credentials caching", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "monolog/monolog": "Adds support for logging HTTP requests and responses", + "symfony/yaml": "Eases the ability to write manifests for creating jobs in AWS Import/Export" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7.x-dev" + } + }, + "autoload": { + "psr-0": { + "Aws": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "cloud", + "dynamodb", + "ec2", + "glacier", + "s3", + "sdk" + ], + "time": "2014-10-08 19:18:30" + }, + { + "name": "guzzle/guzzle", + "version": "v3.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle3.git", + "reference": "54991459675c1a2924122afbb0e5609ade581155" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/54991459675c1a2924122afbb0e5609ade581155", + "reference": "54991459675c1a2924122afbb0e5609ade581155", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": ">=5.3.3", + "symfony/event-dispatcher": "~2.1" + }, + "replace": { + "guzzle/batch": "self.version", + "guzzle/cache": "self.version", + "guzzle/common": "self.version", + "guzzle/http": "self.version", + "guzzle/inflection": "self.version", + "guzzle/iterator": "self.version", + "guzzle/log": "self.version", + "guzzle/parser": "self.version", + "guzzle/plugin": "self.version", + "guzzle/plugin-async": "self.version", + "guzzle/plugin-backoff": "self.version", + "guzzle/plugin-cache": "self.version", + "guzzle/plugin-cookie": "self.version", + "guzzle/plugin-curlauth": "self.version", + "guzzle/plugin-error-response": "self.version", + "guzzle/plugin-history": "self.version", + "guzzle/plugin-log": "self.version", + "guzzle/plugin-md5": "self.version", + "guzzle/plugin-mock": "self.version", + "guzzle/plugin-oauth": "self.version", + "guzzle/service": "self.version", + "guzzle/stream": "self.version" + }, + "require-dev": { + "doctrine/cache": "~1.3", + "monolog/monolog": "~1.0", + "phpunit/phpunit": "3.7.*", + "psr/log": "~1.0", + "symfony/class-loader": "~2.1", + "zendframework/zend-cache": "2.*,<2.3", + "zendframework/zend-log": "2.*,<2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.9-dev" + } + }, + "autoload": { + "psr-0": { + "Guzzle": "src/", + "Guzzle\\Tests": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Guzzle Community", + "homepage": "https://github.com/guzzle/guzzle/contributors" + } + ], + "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2014-08-11 04:32:36" + }, + { + "name": "phing/phing", + "version": "2.8.2", + "source": { + "type": "git", + "url": "https://github.com/phingofficial/phing.git", + "reference": "345e8716122cf6c6b59c4894701d8b736f27fca9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phingofficial/phing/zipball/345e8716122cf6c6b59c4894701d8b736f27fca9", + "reference": "345e8716122cf6c6b59c4894701d8b736f27fca9", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "phpdocumentor/phpdocumentor": "2.x", + "phpunit/phpunit": ">=3.7" + }, + "suggest": { + "pdepend/pdepend": "PHP version of JDepend", + "pear/archive_tar": "Tar file management class", + "pear/versioncontrol_git": "A library that provides OO interface to handle Git repository", + "pear/versioncontrol_svn": "A simple OO-style interface for Subversion, the free/open-source version control system", + "phpdocumentor/phpdocumentor": "Documentation Generator for PHP", + "phploc/phploc": "A tool for quickly measuring the size of a PHP project", + "phpmd/phpmd": "PHP version of PMD tool", + "phpunit/php-code-coverage": "Library that provides collection, processing, and rendering functionality for PHP code coverage information", + "phpunit/phpunit": "The PHP Unit Testing Framework", + "sebastian/phpcpd": "Copy/Paste Detector (CPD) for PHP code", + "tedivm/jshrink": "Javascript Minifier built in PHP" + }, + "bin": [ + "bin/phing" + ], + "type": "library", + "autoload": { + "classmap": [ + "classes/phing/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "classes" + ], + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Michiel Rook", + "email": "mrook@php.net", + "role": "Lead" + }, + { + "name": "Phing Community", + "homepage": "http://www.phing.info/trac/wiki/Development/Contributors" + } + ], + "description": "PHing Is Not GNU make; it's a PHP project build system or build tool based on Apache Ant.", + "homepage": "http://www.phing.info/", + "keywords": [ + "build", + "phing", + "task", + "tool" + ], + "time": "2014-07-18 10:23:54" + }, + { + "name": "propel/propel1", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/propelorm/Propel.git", + "reference": "09058f1443bc287e550b9342a4379aac2e0a0b8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/propelorm/Propel/zipball/09058f1443bc287e550b9342a4379aac2e0a0b8f", + "reference": "09058f1443bc287e550b9342a4379aac2e0a0b8f", + "shasum": "" + }, + "require": { + "phing/phing": "~2.4", + "php": ">=5.2.4" + }, + "require-dev": { + "pear-pear.php.net/pear_packagefilemanager2": "@stable" + }, + "bin": [ + "generator/bin/propel-gen", + "generator/bin/propel-gen.bat" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7-dev" + } + }, + "autoload": { + "classmap": [ + "runtime/lib", + "generator/lib" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "runtime/lib", + "generator/lib" + ], + "license": [ + "MIT" + ], + "authors": [ + { + "name": "William Durand", + "email": "william.durand1@gmail.com", + "homepage": "http://www.willdurand.fr" + } + ], + "description": "Propel is an open-source Object-Relational Mapping (ORM) for PHP5.", + "homepage": "http://www.propelorm.org/", + "keywords": [ + "Active Record", + "database", + "mapping", + "orm", + "persistence" + ], + "time": "2013-10-21 12:52:56" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.5.5", + "target-dir": "Symfony/Component/EventDispatcher", + "source": { + "type": "git", + "url": "https://github.com/symfony/EventDispatcher.git", + "reference": "f6281337bf5f985f585d1db6a83adb05ce531f46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/f6281337bf5f985f585d1db6a83adb05ce531f46", + "reference": "f6281337bf5f985f585d1db6a83adb05ce531f46", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.0", + "symfony/dependency-injection": "~2.0,<2.6.0", + "symfony/stopwatch": "~2.2" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "http://symfony.com", + "time": "2014-09-28 15:56:11" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "aws/aws-sdk-php": 20 + }, + "prefer-stable": false, + "platform": [], + "platform-dev": [] +} From 63b357f0ee0ce43b65b4e518825f81062cf10610 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 11 Nov 2014 11:18:55 -0500 Subject: [PATCH 224/310] Updated requirements for airtime_analyzer to make python-requests support SNI properly --- python_apps/airtime_analyzer/setup.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index c47b051678..3694e6fe54 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -29,6 +29,10 @@ 'mock', 'python-daemon', 'requests', + # These next 3 are required for requests to support SSL with SNI. This is extremely important. Learned this the hard way... + 'ndg-httpsclient', + 'pyasn1', + 'pyopenssl' ], zip_safe=False, data_files=data_files) From eb0f12c7096e67dfd850de28affb026821645760 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 10 Nov 2014 12:25:40 -0500 Subject: [PATCH 225/310] Change back rabbitmq config file param name --- python_apps/airtime_analyzer/bin/airtime_analyzer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/bin/airtime_analyzer b/python_apps/airtime_analyzer/bin/airtime_analyzer index ff17fc2f25..92e3879654 100755 --- a/python_apps/airtime_analyzer/bin/airtime_analyzer +++ b/python_apps/airtime_analyzer/bin/airtime_analyzer @@ -17,7 +17,7 @@ def run(): parser = argparse.ArgumentParser() parser.add_argument("-d", "--daemon", help="run as a daemon", action="store_true") parser.add_argument("--debug", help="log full debugging output", action="store_true") - parser.add_argument("--config-file", help="specify a configuration file with RabbitMQ settings (default is %s)" % DEFAULT_CONFIG_PATH) + parser.add_argument("--rmq-config-file", help="specify a configuration file with RabbitMQ settings (default is %s)" % DEFAULT_CONFIG_PATH) parser.add_argument("--http-retry-queue-file", help="specify where incompleted HTTP requests will be serialized (default is %s)" % DEFAULT_HTTP_RETRY_PATH) args = parser.parse_args() From 49f3881da064277baf50d6c2384b640c6f2da573 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 10 Nov 2014 12:35:41 -0500 Subject: [PATCH 226/310] rmq_config_path fix --- python_apps/airtime_analyzer/bin/airtime_analyzer | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python_apps/airtime_analyzer/bin/airtime_analyzer b/python_apps/airtime_analyzer/bin/airtime_analyzer index 92e3879654..35debbd412 100755 --- a/python_apps/airtime_analyzer/bin/airtime_analyzer +++ b/python_apps/airtime_analyzer/bin/airtime_analyzer @@ -26,8 +26,8 @@ def run(): #Default config file path config_path = DEFAULT_CONFIG_PATH http_retry_queue_path = DEFAULT_HTTP_RETRY_PATH - if args.config_file: - config_path = args.config_file + if args.rmq_config_file: + config_path = args.rmq_config_file if args.http_retry_queue_file: http_retry_queue_path = args.http_retry_queue_file From b304e2fa34cb008032020298c10465ca282ed5b9 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 10 Nov 2014 12:53:07 -0500 Subject: [PATCH 227/310] Bug fix --- airtime_mvc/application/models/airtime/CcFiles.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index 956e8181e5..01eed8d558 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -103,7 +103,7 @@ public function getAbsoluteFilePath() throw new Exception("Invalid music_dir for file in database."); } $directory = $music_dir->getDirectory(); - $filepath = $this->_file->getDbFilepath(); + $filepath = $this->getDbFilepath(); return Application_Common_OsPath::join($directory, $filepath); } From dbc55632e18630e7cec91c5185f8bb82191fc7cb Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 11 Nov 2014 13:58:55 -0500 Subject: [PATCH 228/310] Changed print statements so they go to the pypo log --- python_apps/pypo/cloud_storage_downloader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python_apps/pypo/cloud_storage_downloader.py b/python_apps/pypo/cloud_storage_downloader.py index 4565985e94..f5768df297 100644 --- a/python_apps/pypo/cloud_storage_downloader.py +++ b/python_apps/pypo/cloud_storage_downloader.py @@ -75,10 +75,10 @@ def read_config_file(self, config_path): try: config.readfp(open(config_path)) except IOError as e: - print "Failed to open config file at " + config_path + ": " + e.strerror + logging.debug("Failed to open config file at %s: %s" % (config_path, e.strerror)) sys.exit() except Exception: - print e.strerror + logging.debug(e.strerror) sys.exit() return config From 5cf5ff4fa10d2a939aaaf99ff1b77e48489bf206 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 11 Nov 2014 16:29:54 -0500 Subject: [PATCH 229/310] code cleanup --- airtime_mvc/application/amazon/Amazon_S3.php | 19 ++++++++++--------- airtime_mvc/application/configs/conf.php | 2 +- .../controllers/LibraryController.php | 3 +-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/airtime_mvc/application/amazon/Amazon_S3.php b/airtime_mvc/application/amazon/Amazon_S3.php index dcf7011cab..ea8a3e055a 100644 --- a/airtime_mvc/application/amazon/Amazon_S3.php +++ b/airtime_mvc/application/amazon/Amazon_S3.php @@ -18,25 +18,26 @@ class Amazon_S3 private $zendServiceAmazonS3; function Amazon_S3() + { + $this->initZendServiceAmazonS3(); + } + + private function initZendServiceAmazonS3() { $CC_CONFIG = Config::getConfig(); $this->setBucket($CC_CONFIG['cloud_storage']['bucket']); $this->setAccessKey($CC_CONFIG['cloud_storage']['api_key']); $this->setSecretKey($CC_CONFIG['cloud_storage']['api_key_secret']); - $this->setZendServiceAmazonS3(); + + $this->zendServiceAmazonS3 = new Zend_Service_Amazon_S3( + $this->getAccessKey(), + $this->getSecretKey()); } public function getZendServiceAmazonS3() { - return $this->zendServiceAmazonS3; - } - - private function setZendServiceAmazonS3() - { - $this->zendServiceAmazonS3 = new Zend_Service_Amazon_S3( - $this->getAccessKey(), - $this->getSecretKey()); + return $this->zendServiceAmazonS3; } public function getBucket() diff --git a/airtime_mvc/application/configs/conf.php b/airtime_mvc/application/configs/conf.php index 30918e4deb..fd66453dd6 100644 --- a/airtime_mvc/application/configs/conf.php +++ b/airtime_mvc/application/configs/conf.php @@ -26,7 +26,7 @@ public static function loadConfig() { } // Parse separate conf file for Amazon S3 values - $amazonFilename = "/etc/airtime-saas/amazon.conf"; + $amazonFilename = isset($_SERVER['AMAZONS3_CONF']) ? $_SERVER['AMAZONS3_CONF'] : "/etc/airtime-saas/amazon.conf"; $amazonValues = parse_ini_file($amazonFilename, true); $CC_CONFIG['cloud_storage'] = $amazonValues['cloud_storage']; diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index ba836cb82e..48e0e026f5 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -362,8 +362,7 @@ public function deleteAction() } catch (Exception $e) { //could throw a scheduled in future exception. $message = _("Could not delete file(s)."); - Logging::debug($e->getMessage()); - Logging::info($e->getMessage()); + Logging::info($message.": ".$e->getMessage()); } } } From b324031ee683005be0307e3b323c4709ce3a01eb Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 11 Nov 2014 18:41:09 -0500 Subject: [PATCH 230/310] Disable those new requirements because pip requires gcc to install them --- python_apps/airtime_analyzer/setup.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index 3694e6fe54..0816f8d146 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -29,10 +29,11 @@ 'mock', 'python-daemon', 'requests', - # These next 3 are required for requests to support SSL with SNI. This is extremely important. Learned this the hard way... - 'ndg-httpsclient', - 'pyasn1', - 'pyopenssl' + # These next 3 are required for requests to support SSL with SNI. Learned this the hard way... + # What sucks is that GCC is required to pip install these. + #'ndg-httpsclient', + #'pyasn1', + #'pyopenssl' ], zip_safe=False, data_files=data_files) From c132cac43d6daea5cd9a56c58f6f320bffb05213 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 12 Nov 2014 14:42:34 -0500 Subject: [PATCH 231/310] Code cleanup --- .../application/controllers/ApiController.php | 14 +++-------- airtime_mvc/application/models/Schedule.php | 25 +++++++++++++------ .../application/models/airtime/CcFiles.php | 12 ++++++++- .../application/models/airtime/CloudFile.php | 2 +- python_apps/pypo/pypofile.py | 4 +-- 5 files changed, 35 insertions(+), 22 deletions(-) diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index 9f228bd974..9ea2d34fd4 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -85,7 +85,7 @@ public function getMediaAction() // Make sure we don't have some wrong result beecause of caching clearstatcache(); - if ($media->getPropelOrm()->isValidFile()) { + if ($media->getPropelOrm()->isValidPhysicalFile()) { $filename = $media->getPropelOrm()->getFilename(); //Download user left clicks a track and selects Download. @@ -168,15 +168,9 @@ public function smartReadFile($media) //http://www.php.net/manual/en/function.ob-end-flush.php while (@ob_end_flush()); - /*$cur = $begin; - fseek($fm, $begin, 0); - - while (!feof($fm) && $cur <= $end && (connection_status() == 0)) { - echo fread($fm, min(1024 * 16, ($end - $cur) + 1)); - $cur += 1024 * 16; - }*/ - - while(!feof($fm)) { + // NOTE: We can't use fseek here because it does not work with streams + // (a.k.a. Files stored on Amazon S3) + while(!feof($fm) && (connection_status() == 0)) { echo fread($fm, 1024 * 8); } } diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index 4a1bcb8b03..2483a8b54f 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -761,7 +761,19 @@ private static function createInputHarborKickTimes(&$data, $range_start, $range_ } } - private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $object_name=null) + /** + * + * Appends schedule "events" to an array of schedule events that gets + * sent to PYPO. Each schedule event contains information PYPO and + * Liquidsoap need for playout. + * + * @param Array $data array to be filled with schedule info - $item(s) + * @param Array $item schedule info about one track + * @param Integer $media_id scheduled item's cc_files id + * @param String $uri path to the scheduled item's physical location + * @param String $amazonS3ResourceId scheduled item's Amazon S3 resource id, if applicable + */ + private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $amazonS3ResourceId) { $start = self::AirtimeTimeToPypoTime($item["start"]); $end = self::AirtimeTimeToPypoTime($item["end"]); @@ -797,8 +809,8 @@ private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, 'replay_gain' => $replay_gain, 'independent_event' => $independent_event ); - if (!is_null($object_name)) { - $schedule_item["object_name"] = $object_name; + if (!is_null($amazonS3ResourceId)) { + $schedule_item["amazonS3_resource_id"] = $amazonS3ResourceId; } if ($schedule_item['cue_in'] > $schedule_item['cue_out']) { @@ -934,11 +946,8 @@ private static function createScheduledEvents(&$data, $range_start, $range_end) $file = $storedFile->getPropelOrm(); $uri = $file->getAbsoluteFilePath(); - $object_name = null; - if ($file instanceof CloudFile) { - $object_name = $storedFile->getResourceId(); - } - self::createFileScheduleEvent($data, $item, $media_id, $uri, $object_name); + $amazonS3ResourceId = $file->getResourceId(); + self::createFileScheduleEvent($data, $item, $media_id, $uri, $amazonS3ResourceId); } elseif (!is_null($item['stream_id'])) { //row is type "webstream" diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index 01eed8d558..b13eb05cec 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -111,7 +111,7 @@ public function getAbsoluteFilePath() /** * Checks if the file is a regular file that can be previewed and downloaded. */ - public function isValidFile() + public function isValidPhysicalFile() { return is_file($this->getAbsoluteFilePath()); } @@ -130,4 +130,14 @@ public function deletePhysicalFile() } } + /** + * + * This function refers to the file's Amazon S3 resource id. + * Returns null because cc_files are stored on local disk. + */ + public function getResourceId() + { + return null; + } + } // CcFiles diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index a30eedc6c6..c1d5b3b7a0 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -93,7 +93,7 @@ public function getFilename() /** * Checks if the file is a regular file that can be previewed and downloaded. */ - public function isValidFile() + public function isValidPhysicalFile() { $ch = curl_init(); curl_setopt_array($ch, array( diff --git a/python_apps/pypo/pypofile.py b/python_apps/pypo/pypofile.py index d0667a58ff..2c14bbbf5f 100644 --- a/python_apps/pypo/pypofile.py +++ b/python_apps/pypo/pypofile.py @@ -136,9 +136,9 @@ def main(self): """ If an object_name exists the file is stored on Amazon S3 """ - if 'object_name' in media_item: + if 'amazonS3_resource_id' in media_item: csd = CloudStorageDownloader() - csd.download_obj(media_item['dst'], media_item['object_name']) + csd.download_obj(media_item['dst'], media_item['amazonS3_resource_id']) media_item['file_ready'] = True else: self.copy_file(media_item) From 95517cac874aa807c836fa7aa53a3776a9b95ed5 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 12 Nov 2014 14:45:50 -0500 Subject: [PATCH 232/310] Fix exception thrown when the analyzer doesn't return filesize with the metadata --- .../application/modules/rest/controllers/MediaController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index dbbc346ba0..87af946bb1 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -226,7 +226,7 @@ public function putAction() //as a foreign key to cc_music_dirs. if (isset($requestData["full_path"])) { $fileSizeBytes = filesize($requestData["full_path"]); - if ($fileSizeBytes === false) + if (!isset($fileSizeBytes) || $fileSizeBytes === false) { $file->setDbImportStatus(2)->save(); $this->fileNotFoundResponse(); From 8eaeaf71f9ae9cb4240f8e15df1627e72a89d574 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 12 Nov 2014 17:01:59 -0500 Subject: [PATCH 233/310] airtime_analyzer status_reporter shutdown fix --- .../airtime_analyzer/airtime_analyzer/status_reporter.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index ebf9a12d55..63ddc704ae 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -85,6 +85,7 @@ def process_http_requests(ipc_queue, http_retry_queue_path): # while the web server is down or unreachable. with open(http_retry_queue_path, 'wb') as pickle_file: pickle.dump(retry_queue, pickle_file) + return except Exception as e: # Terrible top-level exception handler to prevent the thread from dying, just in case. if shutdown: return @@ -98,13 +99,13 @@ def send_http_request(picklable_request, retry_queue): if not isinstance(picklable_request, PicklableHttpRequest): raise TypeError("picklable_request must be a PicklableHttpRequest. Was of type " + type(picklable_request).__name__) try: - t = threading.Timer(60, alert_hung_request) + #t = threading.Timer(60, alert_hung_request) t.start() bare_request = picklable_request.create_request() s = requests.Session() prepared_request = s.prepare_request(bare_request) - r = s.send(prepared_request, timeout=StatusReporter._HTTP_REQUEST_TIMEOUT) - t.cancel() # Watchdog no longer needed. + #r = s.send(prepared_request, timeout=StatusReporter._HTTP_REQUEST_TIMEOUT) + #t.cancel() # Watchdog no longer needed. r.raise_for_status() # Raise an exception if there was an http error code returned logging.info("HTTP request sent successfully.") except requests.exceptions.HTTPError as e: From 71f2cc11d2f282fde7ad81de804868a373f30ae5 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 12 Nov 2014 17:04:21 -0500 Subject: [PATCH 234/310] Fix for incorrect watchdog disabling --- .../airtime_analyzer/airtime_analyzer/status_reporter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py index 63ddc704ae..b86fa3e15a 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/status_reporter.py @@ -100,11 +100,11 @@ def send_http_request(picklable_request, retry_queue): raise TypeError("picklable_request must be a PicklableHttpRequest. Was of type " + type(picklable_request).__name__) try: #t = threading.Timer(60, alert_hung_request) - t.start() + #t.start() bare_request = picklable_request.create_request() s = requests.Session() prepared_request = s.prepare_request(bare_request) - #r = s.send(prepared_request, timeout=StatusReporter._HTTP_REQUEST_TIMEOUT) + r = s.send(prepared_request, timeout=StatusReporter._HTTP_REQUEST_TIMEOUT) #t.cancel() # Watchdog no longer needed. r.raise_for_status() # Raise an exception if there was an http error code returned logging.info("HTTP request sent successfully.") From 2827db8ba3c6153d7453aff20745ba76aa06e9a2 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 13 Nov 2014 09:05:02 -0500 Subject: [PATCH 235/310] Fix bad merge --- .../rest/controllers/MediaController.php | 26 +------------------ 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 5cfb682c36..ef28f207c4 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -227,7 +227,7 @@ public function putAction() $file->setDbFilepath($requestData["filename"]); $fileSizeBytes = $requestData["filesize"]; - if ($fileSizeBytes === false) + if (!isset($fileSizeBytes) || $fileSizeBytes === false) { $file->setDbImportStatus(2)->save(); $this->fileNotFoundResponse(); @@ -237,30 +237,6 @@ public function putAction() $cloudFile->setResourceId($requestData["resource_id"]); $cloudFile->setCcFiles($file); $cloudFile->save(); - - //file is stored locally - //we should get rid of this since we're removing local file storage - } else if (isset($requestData["full_path"])) { - $fileSizeBytes = filesize($requestData["full_path"]); - if ($fileSizeBytes === false) - { - $file->setDbImportStatus(2)->save(); - $this->fileNotFoundResponse(); - return; - } - - $fullPath = $requestData["full_path"]; - $storDir = Application_Model_MusicDir::getStorDir()->getDirectory(); - $pos = strpos($fullPath, $storDir); - - if ($pos !== FALSE) - { - assert($pos == 0); //Path must start with the stor directory path - - $filePathRelativeToStor = substr($fullPath, strlen($storDir)); - $file->setDbFilepath($filePathRelativeToStor); - $file->setDbDirectory(1); //1 corresponds to the default stor/imported directory. - } } Application_Model_Preference::updateDiskUsage($fileSizeBytes); From 7d86ea3115f19b0c638b98f163289a65d0029c6e Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 13 Nov 2014 09:41:46 -0500 Subject: [PATCH 236/310] Better error handling on media PUT request --- .../rest/controllers/MediaController.php | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index ef28f207c4..5b69db60ac 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -218,26 +218,23 @@ public function putAction() if (!$this->validateRequestData($file, $whiteList)) { $file->save(); return; - } else if ($file) { + } else if ($file && isset($requestData["resource_id"])) { $file->fromArray($whiteList, BasePeer::TYPE_FIELDNAME); - //file is stored in the cloud - if (isset($requestData["resource_id"])) { - //store the original filename - $file->setDbFilepath($requestData["filename"]); - - $fileSizeBytes = $requestData["filesize"]; - if (!isset($fileSizeBytes) || $fileSizeBytes === false) - { - $file->setDbImportStatus(2)->save(); - $this->fileNotFoundResponse(); - return; - } - $cloudFile = new CloudFile(); - $cloudFile->setResourceId($requestData["resource_id"]); - $cloudFile->setCcFiles($file); - $cloudFile->save(); + //store the original filename + $file->setDbFilepath($requestData["filename"]); + + $fileSizeBytes = $requestData["filesize"]; + if (!isset($fileSizeBytes) || $fileSizeBytes === false) + { + $file->setDbImportStatus(2)->save(); + $this->fileNotFoundResponse(); + return; } + $cloudFile = new CloudFile(); + $cloudFile->setResourceId($requestData["resource_id"]); + $cloudFile->setCcFiles($file); + $cloudFile->save(); Application_Model_Preference::updateDiskUsage($fileSizeBytes); From 32bdbe1ad69777dbc65b948b5be75cc4b9bb5383 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 14 Nov 2014 11:12:10 -0500 Subject: [PATCH 237/310] Improved some comments --- .../airtime_analyzer/airtime_analyzer/analyzer_pipeline.py | 2 +- .../airtime_analyzer/airtime_analyzer/message_listener.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 39c558bacc..e36c03688c 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -52,7 +52,7 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): metadata = dict() metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) - metadata["import_status"] = 0 # imported + metadata["import_status"] = 0 # Successfully imported # Note that the queue we're putting the results into is our interprocess communication # back to the main process. diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 9b890321c7..495682d7bd 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -26,7 +26,7 @@ Airtime's music library directory. Lastly, the extracted metadata is reported back to the Airtime web application. - There's a couple of Very Important technical details and contraints that you + There's a couple of Very Important technical details and constraints that you need to know if you're going to work on this code: 1) airtime_analyzer is designed so it doesn't have to run on the same From 3c73abc786f1a3fc7678b09e5dae852bcaa3cadf Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 18 Nov 2014 10:32:03 -0500 Subject: [PATCH 238/310] SAAS-491: Edit meta data not working Fixed: Propel 1.7 does not cast string types to integers --- airtime_mvc/application/models/StoredFile.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 60e5bd6fe5..eb28ff6500 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -210,6 +210,13 @@ public function setDbColMetadata($p_md=null) if ($dbColumn == "track_title" && (is_null($mdValue) || $mdValue == "")) { continue; } + + // Bpm gets POSTed as a string type. With Propel 1.6 this value + // was casted to an integer type before saving it to the db. But + // Propel 1.7 does not do this + if ($dbColumn == "bpm") { + $mdValue = (int) $mdValue; + } # TODO : refactor string evals if (isset($this->_dbMD[$dbColumn])) { $propelColumn = $this->_dbMD[$dbColumn]; From e7e1926896ab102086085ee7cb19067ba08b2cb4 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 18 Nov 2014 17:11:09 -0500 Subject: [PATCH 239/310] CC-5950: Fix for issue where clear button in Recent Uploads didn't work sometimes --- airtime_mvc/application/models/StoredFile.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 0e588bbe9b..8c5910182b 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -355,7 +355,13 @@ public function existsOnDisk() { $exists = false; try { - $exists = file_exists($this->getFilePath()); + //Explicitly check filepath because if it's blank, getFilePath() can + //still return a directory that exists. + if (!$this->_file->getDbFilepath()) { + $exists = false; + } else { + $exists = file_exists($this->getFilePath()); + } } catch (Exception $e) { return false; } From 6460854fdad351a91fe054a321caa7ab54b3a040 Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Mon, 10 Nov 2014 16:07:23 -0500 Subject: [PATCH 240/310] Fixed 'clear' button not working when files failed to import --- .../modules/rest/controllers/MediaController.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 87af946bb1..243eeeb50d 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -1,8 +1,13 @@ findPk($id); + // Since we check for this value when deleting files, set it first + $file->setDbDirectory(self::MUSIC_DIRS_STOR_PK); $requestData = json_decode($this->getRequest()->getRawBody(), true); $whiteList = $this->removeBlacklistedFieldsFromRequestData($requestData); @@ -228,7 +235,7 @@ public function putAction() $fileSizeBytes = filesize($requestData["full_path"]); if (!isset($fileSizeBytes) || $fileSizeBytes === false) { - $file->setDbImportStatus(2)->save(); + $file->setDbImportStatus(self::IMPORT_STATUS_FAILED)->save(); $this->fileNotFoundResponse(); return; } @@ -244,7 +251,6 @@ public function putAction() $filePathRelativeToStor = substr($fullPath, strlen($storDir)); $file->setDbFilepath($filePathRelativeToStor); - $file->setDbDirectory(1); //1 corresponds to the default stor/imported directory. } } @@ -259,7 +265,7 @@ public function putAction() ->setHttpResponseCode(200) ->appendBody(json_encode(CcFiles::sanitizeResponse($file))); } else { - $file->setDbImportStatus(2)->save(); + $file->setDbImportStatus(self::IMPORT_STATUS_FAILED)->save(); $this->fileNotFoundResponse(); } } @@ -270,6 +276,7 @@ public function deleteAction() { return; } + $id = $this->getId(); if (!$id) { From 11a31375df4ccf0313e1f07ca8287b1424840770 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 18 Nov 2014 17:41:44 -0500 Subject: [PATCH 241/310] Slightly more robust fix for the last issue --- airtime_mvc/application/models/StoredFile.php | 17 ++++++++--------- .../rest/controllers/MediaController.php | 3 +-- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 8c5910182b..ab5ada6977 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -355,13 +355,8 @@ public function existsOnDisk() { $exists = false; try { - //Explicitly check filepath because if it's blank, getFilePath() can - //still return a directory that exists. - if (!$this->_file->getDbFilepath()) { - $exists = false; - } else { - $exists = file_exists($this->getFilePath()); - } + $filePath = $this->getFilePath(); + $exists = (file_exists($this->getFilePath()) && !is_dir($filePath)); } catch (Exception $e) { return false; } @@ -504,11 +499,15 @@ public function getFilePath() $music_dir = Application_Model_MusicDir::getDirByPK($this-> _file->getDbDirectory()); if (!$music_dir) { - throw new Exception("Invalid music_dir for file in database."); + throw new Exception(_("Invalid music_dir for file in database.")); } + $directory = $music_dir->getDirectory(); $filepath = $this->_file->getDbFilepath(); - + if (!$filepath) { + throw new Exception(sprintf(_("Blank file path for file %s (id: %s) in database."), $this->_file->getDbTrackTitle(), $this->getId())); + } + return Application_Common_OsPath::join($directory, $filepath); } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 243eeeb50d..7cc5f370ad 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -276,8 +276,7 @@ public function deleteAction() { return; } - - + $id = $this->getId(); if (!$id) { return; From dd3b54f8ed002e72726f95ac48e284b578fa104b Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 18 Nov 2014 18:15:45 -0500 Subject: [PATCH 242/310] Actually delete files from the database via the media REST API --- airtime_mvc/application/models/StoredFile.php | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index ab5ada6977..e4ad0cfdd8 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -370,9 +370,7 @@ public function existsOnDisk() * */ public function delete() - { - $filepath = $this->getFilePath(); - + { // Check if the file is scheduled to be played in the future if (Application_Model_Schedule::IsFileScheduledInTheFuture($this->getId())) { throw new DeleteScheduledFileException(); @@ -390,17 +388,21 @@ public function delete() $type = $music_dir->getType(); - if (file_exists($filepath) && $type == "stor") { - try { + Logging::info($_SERVER["HTTP_HOST"].": User ".$user->getLogin()." is deleting file: ".$this->_file->getDbTrackTitle()." - file id: ".$this->_file->getDbId()); + + try { + if ($this->existsOnDisk() && $type == "stor") { + $filepath = $this->getFilePath(); //Update the user's disk usage Application_Model_Preference::updateDiskUsage(-1 * abs(filesize($filepath))); - unlink($filepath); - } catch (Exception $e) { - Logging::error($e->getMessage()); - return; } + } catch (Exception $e) { + Logging::warning($e->getMessage()); + //If the file didn't exist on disk, that's fine, we still want to + //remove it from the database, so we continue here. } +<<<<<<< Updated upstream Logging::info("User ".$user->getLogin()." is deleting file: ".$this->_file->getDbTrackTitle()." - file id: ".$this->_file->getDbId()); // set hidden flag to true @@ -408,6 +410,9 @@ public function delete() $this->_file->setDbFileExists(false); $this->_file->save(); +======= + +>>>>>>> Stashed changes // need to explicitly update any playlist's and block's length // that contains the file getting deleted $fileId = $this->_file->getDbId(); @@ -424,6 +429,9 @@ public function delete() $bl->setDbLength($bl->computeDbLength(Propel::getConnection(CcBlockPeer::DATABASE_NAME))); $bl->save(); } + + //We actually do want to delete the file from the database here + $this->_file->delete(); } /** From c829b6bf95fec2e5d31c201bad8a9142e7aeb344 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 18 Nov 2014 18:17:19 -0500 Subject: [PATCH 243/310] Fix bad merge --- airtime_mvc/application/models/StoredFile.php | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index e4ad0cfdd8..8144f9a270 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -387,7 +387,6 @@ public function delete() assert($music_dir); $type = $music_dir->getType(); - Logging::info($_SERVER["HTTP_HOST"].": User ".$user->getLogin()." is deleting file: ".$this->_file->getDbTrackTitle()." - file id: ".$this->_file->getDbId()); try { @@ -402,17 +401,7 @@ public function delete() //If the file didn't exist on disk, that's fine, we still want to //remove it from the database, so we continue here. } -<<<<<<< Updated upstream - Logging::info("User ".$user->getLogin()." is deleting file: ".$this->_file->getDbTrackTitle()." - file id: ".$this->_file->getDbId()); - // set hidden flag to true - //$this->_file->setDbHidden(true); - $this->_file->setDbFileExists(false); - $this->_file->save(); - -======= - ->>>>>>> Stashed changes // need to explicitly update any playlist's and block's length // that contains the file getting deleted $fileId = $this->_file->getDbId(); From 8ffd70781ba07e30b19f95575f7d08c2cedcd8c6 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 20 Nov 2014 16:46:21 -0500 Subject: [PATCH 244/310] Remove clearAction from the media REST API for security --- .../application/modules/rest/controllers/MediaController.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 7cc5f370ad..8d8672a9f6 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -78,6 +78,8 @@ public function downloadAction() } } +/* This action is extremely dangerous and a horrible idea without CSRF protection. + public function clearAction() { if (!$this->verifyAuth(true, true)) @@ -113,6 +115,7 @@ public function clearAction() ->setHttpResponseCode(200) ->appendBody("Library has been cleared"); } +*/ public function getAction() { From 7db571d10366ad77f037845892873fe45cfd7897 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 20 Nov 2014 16:47:02 -0500 Subject: [PATCH 245/310] Remove clearAction from the media REST API for security --- .../rest/controllers/MediaController.php | 39 ------------------- 1 file changed, 39 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 8d8672a9f6..232ac3529f 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -77,45 +77,6 @@ public function downloadAction() $this->fileNotFoundResponse(); } } - -/* This action is extremely dangerous and a horrible idea without CSRF protection. - - public function clearAction() - { - if (!$this->verifyAuth(true, true)) - { - return; - } - - //set file_exists flag to false for every file - $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME); - $selectCriteria = new Criteria(); - $selectCriteria->add(CcFilesPeer::FILE_EXISTS, true); - $updateCriteria = new Criteria(); - $updateCriteria->add(CcFilesPeer::FILE_EXISTS, false); - BasePeer::doUpdate($selectCriteria, $updateCriteria, $con); - - //delete all files and directories under .../imported - $path = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/imported/*" : "/srv/airtime/stor/imported/*"; - exec("rm -rf $path"); - - //update disk_usage value in cc_pref - $musicDir = CcMusicDirsQuery::create() - ->filterByType('stor') - ->filterByExists(true) - ->findOne(); - $storPath = $musicDir->getDirectory(); - - $freeSpace = disk_free_space($storPath); - $totalSpace = disk_total_space($storPath); - - Application_Model_Preference::setDiskUsage($totalSpace - $freeSpace); - - $this->getResponse() - ->setHttpResponseCode(200) - ->appendBody("Library has been cleared"); - } -*/ public function getAction() { From 8e8fe2d288feea38c97d52f13021fce2d8cce7b0 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 20 Nov 2014 17:11:23 -0500 Subject: [PATCH 246/310] SAAS-489: Cannot preview tracks stored on disk --- airtime_mvc/application/controllers/ApiController.php | 1 - 1 file changed, 1 deletion(-) diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index 9ea2d34fd4..671a456d68 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -98,7 +98,6 @@ public function getMediaAction() } else { //user clicks play button for track preview header('Content-Disposition: inline; filename="'.$filename.'"'); - $this->_redirect($media->getFilePath()); } $this->smartReadFile($media); From 8fbe7dd6499e146616673d30256595705f26f602 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 26 Nov 2014 17:50:59 -0500 Subject: [PATCH 247/310] Report an error and die if amazon.conf is missing --- airtime_mvc/application/configs/conf.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/configs/conf.php b/airtime_mvc/application/configs/conf.php index fd66453dd6..38492c11e6 100644 --- a/airtime_mvc/application/configs/conf.php +++ b/airtime_mvc/application/configs/conf.php @@ -27,7 +27,13 @@ public static function loadConfig() { // Parse separate conf file for Amazon S3 values $amazonFilename = isset($_SERVER['AMAZONS3_CONF']) ? $_SERVER['AMAZONS3_CONF'] : "/etc/airtime-saas/amazon.conf"; - $amazonValues = parse_ini_file($amazonFilename, true); + try { + $amazonValues = parse_ini_file($amazonFilename, true); + } catch (ErrorException $e) { + //This file gets loaded before the Zend bootstrap even runs so our exception handlers aren't installed yet. + //Just die with an error here then instead or handling the error any other way. + die("Error: Invalid or missing $amazonFilename."); + } $CC_CONFIG['cloud_storage'] = $amazonValues['cloud_storage']; $values = parse_ini_file($filename, true); From 670a63df87ddd616b405a22093b98c33e87cc7af Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 26 Nov 2014 18:04:46 -0500 Subject: [PATCH 248/310] Error handling for if propel isn't found / composer wasn't run --- airtime_mvc/application/Bootstrap.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index 9bc36a49f9..2867613954 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -3,7 +3,10 @@ $CC_CONFIG = Config::getConfig(); require_once __DIR__."/configs/ACL.php"; -require_once 'propel/propel1/runtime/lib/Propel.php'; +if (!@include_once('propel/propel1/runtime/lib/Propel.php')) +{ + die('Error: Propel not found. Did you install Airtime\'s third-party dependencies with composer? (Check the README.)'); +} Propel::init(__DIR__."/configs/airtime-conf-production.php"); From e59cd11370e94b34ad2566b13488783a99fcd231 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 27 Nov 2014 13:48:34 -0500 Subject: [PATCH 249/310] Close the session when a track is previewed or downloaded. Close the file pointer when we are down with it. --- airtime_mvc/application/controllers/ApiController.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index e6a3e982e1..f8887d355f 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -78,6 +78,10 @@ public function versionAction() */ public function getMediaAction() { + // Close the session so other HTTP requests can be completed while + // tracks are read for previewing or downloading. + session_write_close(); + $fileId = $this->_getParam("file"); $media = Application_Model_StoredFile::RecallById($fileId); @@ -168,10 +172,11 @@ public function smartReadFile($media) while (@ob_end_flush()); // NOTE: We can't use fseek here because it does not work with streams - // (a.k.a. Files stored on Amazon S3) + // (a.k.a. Files stored in the cloud) while(!feof($fm) && (connection_status() == 0)) { echo fread($fm, 1024 * 8); } + fclose($fm); } //Used by the SaaS monitoring From 6cb993cc8007c6b37ff539db7e0675bd8793694a Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 27 Nov 2014 15:44:53 -0500 Subject: [PATCH 250/310] SAAS-504: Store provider in db --- .../models/airtime/map/CloudFileTableMap.php | 1 + .../models/airtime/om/BaseCloudFile.php | 74 ++++++++++++++++--- .../models/airtime/om/BaseCloudFilePeer.php | 33 +++++---- .../models/airtime/om/BaseCloudFileQuery.php | 35 ++++++++- .../rest/controllers/MediaController.php | 3 +- airtime_mvc/build/schema.xml | 1 + airtime_mvc/build/sql/schema.sql | 4 +- 7 files changed, 123 insertions(+), 28 deletions(-) diff --git a/airtime_mvc/application/models/airtime/map/CloudFileTableMap.php b/airtime_mvc/application/models/airtime/map/CloudFileTableMap.php index 898fc0b793..5f9702bf2a 100644 --- a/airtime_mvc/application/models/airtime/map/CloudFileTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CloudFileTableMap.php @@ -40,6 +40,7 @@ public function initialize() $this->setPrimaryKeyMethodInfo('cloud_file_id_seq'); // columns $this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null); + $this->addColumn('storage_backend', 'StorageBackend', 'VARCHAR', true, 512, null); $this->addColumn('resource_id', 'ResourceId', 'LONGVARCHAR', true, null, null); $this->addForeignKey('cc_file_id', 'CcFileId', 'INTEGER', 'cc_files', 'id', false, null, null); // validators diff --git a/airtime_mvc/application/models/airtime/om/BaseCloudFile.php b/airtime_mvc/application/models/airtime/om/BaseCloudFile.php index f9b2e07275..988fadeb92 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCloudFile.php +++ b/airtime_mvc/application/models/airtime/om/BaseCloudFile.php @@ -35,6 +35,12 @@ abstract class BaseCloudFile extends BaseObject implements Persistent */ protected $id; + /** + * The value for the storage_backend field. + * @var string + */ + protected $storage_backend; + /** * The value for the resource_id field. * @var string @@ -83,6 +89,17 @@ public function getDbId() return $this->id; } + /** + * Get the [storage_backend] column value. + * + * @return string + */ + public function getStorageBackend() + { + + return $this->storage_backend; + } + /** * Get the [resource_id] column value. * @@ -126,6 +143,27 @@ public function setDbId($v) return $this; } // setDbId() + /** + * Set the value of [storage_backend] column. + * + * @param string $v new value + * @return CloudFile The current object (for fluent API support) + */ + public function setStorageBackend($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->storage_backend !== $v) { + $this->storage_backend = $v; + $this->modifiedColumns[] = CloudFilePeer::STORAGE_BACKEND; + } + + + return $this; + } // setStorageBackend() + /** * Set the value of [resource_id] column. * @@ -205,8 +243,9 @@ public function hydrate($row, $startcol = 0, $rehydrate = false) try { $this->id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null; - $this->resource_id = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; - $this->cc_file_id = ($row[$startcol + 2] !== null) ? (int) $row[$startcol + 2] : null; + $this->storage_backend = ($row[$startcol + 1] !== null) ? (string) $row[$startcol + 1] : null; + $this->resource_id = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null; + $this->cc_file_id = ($row[$startcol + 3] !== null) ? (int) $row[$startcol + 3] : null; $this->resetModified(); $this->setNew(false); @@ -216,7 +255,7 @@ public function hydrate($row, $startcol = 0, $rehydrate = false) } $this->postHydrate($row, $startcol, $rehydrate); - return $startcol + 3; // 3 = CloudFilePeer::NUM_HYDRATE_COLUMNS. + return $startcol + 4; // 4 = CloudFilePeer::NUM_HYDRATE_COLUMNS. } catch (Exception $e) { throw new PropelException("Error populating CloudFile object", $e); @@ -457,6 +496,9 @@ protected function doInsert(PropelPDO $con) if ($this->isColumnModified(CloudFilePeer::ID)) { $modifiedColumns[':p' . $index++] = '"id"'; } + if ($this->isColumnModified(CloudFilePeer::STORAGE_BACKEND)) { + $modifiedColumns[':p' . $index++] = '"storage_backend"'; + } if ($this->isColumnModified(CloudFilePeer::RESOURCE_ID)) { $modifiedColumns[':p' . $index++] = '"resource_id"'; } @@ -477,6 +519,9 @@ protected function doInsert(PropelPDO $con) case '"id"': $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); break; + case '"storage_backend"': + $stmt->bindValue($identifier, $this->storage_backend, PDO::PARAM_STR); + break; case '"resource_id"': $stmt->bindValue($identifier, $this->resource_id, PDO::PARAM_STR); break; @@ -626,9 +671,12 @@ public function getByPosition($pos) return $this->getDbId(); break; case 1: - return $this->getResourceId(); + return $this->getStorageBackend(); break; case 2: + return $this->getResourceId(); + break; + case 3: return $this->getCcFileId(); break; default: @@ -661,8 +709,9 @@ public function toArray($keyType = BasePeer::TYPE_PHPNAME, $includeLazyLoadColum $keys = CloudFilePeer::getFieldNames($keyType); $result = array( $keys[0] => $this->getDbId(), - $keys[1] => $this->getResourceId(), - $keys[2] => $this->getCcFileId(), + $keys[1] => $this->getStorageBackend(), + $keys[2] => $this->getResourceId(), + $keys[3] => $this->getCcFileId(), ); $virtualColumns = $this->virtualColumns; foreach ($virtualColumns as $key => $virtualColumn) { @@ -711,9 +760,12 @@ public function setByPosition($pos, $value) $this->setDbId($value); break; case 1: - $this->setResourceId($value); + $this->setStorageBackend($value); break; case 2: + $this->setResourceId($value); + break; + case 3: $this->setCcFileId($value); break; } // switch() @@ -741,8 +793,9 @@ public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) $keys = CloudFilePeer::getFieldNames($keyType); if (array_key_exists($keys[0], $arr)) $this->setDbId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setResourceId($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setCcFileId($arr[$keys[2]]); + if (array_key_exists($keys[1], $arr)) $this->setStorageBackend($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setResourceId($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setCcFileId($arr[$keys[3]]); } /** @@ -755,6 +808,7 @@ public function buildCriteria() $criteria = new Criteria(CloudFilePeer::DATABASE_NAME); if ($this->isColumnModified(CloudFilePeer::ID)) $criteria->add(CloudFilePeer::ID, $this->id); + if ($this->isColumnModified(CloudFilePeer::STORAGE_BACKEND)) $criteria->add(CloudFilePeer::STORAGE_BACKEND, $this->storage_backend); if ($this->isColumnModified(CloudFilePeer::RESOURCE_ID)) $criteria->add(CloudFilePeer::RESOURCE_ID, $this->resource_id); if ($this->isColumnModified(CloudFilePeer::CC_FILE_ID)) $criteria->add(CloudFilePeer::CC_FILE_ID, $this->cc_file_id); @@ -820,6 +874,7 @@ public function isPrimaryKeyNull() */ public function copyInto($copyObj, $deepCopy = false, $makeNew = true) { + $copyObj->setStorageBackend($this->getStorageBackend()); $copyObj->setResourceId($this->getResourceId()); $copyObj->setCcFileId($this->getCcFileId()); @@ -938,6 +993,7 @@ public function getCcFiles(PropelPDO $con = null, $doQuery = true) public function clear() { $this->id = null; + $this->storage_backend = null; $this->resource_id = null; $this->cc_file_id = null; $this->alreadyInSave = false; diff --git a/airtime_mvc/application/models/airtime/om/BaseCloudFilePeer.php b/airtime_mvc/application/models/airtime/om/BaseCloudFilePeer.php index 93a0f4d7bb..4a1b641c15 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCloudFilePeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCloudFilePeer.php @@ -24,17 +24,20 @@ abstract class BaseCloudFilePeer const TM_CLASS = 'CloudFileTableMap'; /** The total number of columns. */ - const NUM_COLUMNS = 3; + const NUM_COLUMNS = 4; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ - const NUM_HYDRATE_COLUMNS = 3; + const NUM_HYDRATE_COLUMNS = 4; /** the column name for the id field */ const ID = 'cloud_file.id'; + /** the column name for the storage_backend field */ + const STORAGE_BACKEND = 'cloud_file.storage_backend'; + /** the column name for the resource_id field */ const RESOURCE_ID = 'cloud_file.resource_id'; @@ -60,12 +63,12 @@ abstract class BaseCloudFilePeer * e.g. CloudFilePeer::$fieldNames[CloudFilePeer::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'ResourceId', 'CcFileId', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'resourceId', 'ccFileId', ), - BasePeer::TYPE_COLNAME => array (CloudFilePeer::ID, CloudFilePeer::RESOURCE_ID, CloudFilePeer::CC_FILE_ID, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'RESOURCE_ID', 'CC_FILE_ID', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'resource_id', 'cc_file_id', ), - BasePeer::TYPE_NUM => array (0, 1, 2, ) + BasePeer::TYPE_PHPNAME => array ('DbId', 'StorageBackend', 'ResourceId', 'CcFileId', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'storageBackend', 'resourceId', 'ccFileId', ), + BasePeer::TYPE_COLNAME => array (CloudFilePeer::ID, CloudFilePeer::STORAGE_BACKEND, CloudFilePeer::RESOURCE_ID, CloudFilePeer::CC_FILE_ID, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'STORAGE_BACKEND', 'RESOURCE_ID', 'CC_FILE_ID', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'storage_backend', 'resource_id', 'cc_file_id', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) ); /** @@ -75,12 +78,12 @@ abstract class BaseCloudFilePeer * e.g. CloudFilePeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'ResourceId' => 1, 'CcFileId' => 2, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'resourceId' => 1, 'ccFileId' => 2, ), - BasePeer::TYPE_COLNAME => array (CloudFilePeer::ID => 0, CloudFilePeer::RESOURCE_ID => 1, CloudFilePeer::CC_FILE_ID => 2, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'RESOURCE_ID' => 1, 'CC_FILE_ID' => 2, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'resource_id' => 1, 'cc_file_id' => 2, ), - BasePeer::TYPE_NUM => array (0, 1, 2, ) + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'StorageBackend' => 1, 'ResourceId' => 2, 'CcFileId' => 3, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'storageBackend' => 1, 'resourceId' => 2, 'ccFileId' => 3, ), + BasePeer::TYPE_COLNAME => array (CloudFilePeer::ID => 0, CloudFilePeer::STORAGE_BACKEND => 1, CloudFilePeer::RESOURCE_ID => 2, CloudFilePeer::CC_FILE_ID => 3, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'STORAGE_BACKEND' => 1, 'RESOURCE_ID' => 2, 'CC_FILE_ID' => 3, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'storage_backend' => 1, 'resource_id' => 2, 'cc_file_id' => 3, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, ) ); /** @@ -155,10 +158,12 @@ public static function addSelectColumns(Criteria $criteria, $alias = null) { if (null === $alias) { $criteria->addSelectColumn(CloudFilePeer::ID); + $criteria->addSelectColumn(CloudFilePeer::STORAGE_BACKEND); $criteria->addSelectColumn(CloudFilePeer::RESOURCE_ID); $criteria->addSelectColumn(CloudFilePeer::CC_FILE_ID); } else { $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.storage_backend'); $criteria->addSelectColumn($alias . '.resource_id'); $criteria->addSelectColumn($alias . '.cc_file_id'); } diff --git a/airtime_mvc/application/models/airtime/om/BaseCloudFileQuery.php b/airtime_mvc/application/models/airtime/om/BaseCloudFileQuery.php index d09041387b..e57ff2797d 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCloudFileQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCloudFileQuery.php @@ -7,10 +7,12 @@ * * * @method CloudFileQuery orderByDbId($order = Criteria::ASC) Order by the id column + * @method CloudFileQuery orderByStorageBackend($order = Criteria::ASC) Order by the storage_backend column * @method CloudFileQuery orderByResourceId($order = Criteria::ASC) Order by the resource_id column * @method CloudFileQuery orderByCcFileId($order = Criteria::ASC) Order by the cc_file_id column * * @method CloudFileQuery groupByDbId() Group by the id column + * @method CloudFileQuery groupByStorageBackend() Group by the storage_backend column * @method CloudFileQuery groupByResourceId() Group by the resource_id column * @method CloudFileQuery groupByCcFileId() Group by the cc_file_id column * @@ -25,10 +27,12 @@ * @method CloudFile findOne(PropelPDO $con = null) Return the first CloudFile matching the query * @method CloudFile findOneOrCreate(PropelPDO $con = null) Return the first CloudFile matching the query, or a new CloudFile object populated from the query conditions when no match is found * + * @method CloudFile findOneByStorageBackend(string $storage_backend) Return the first CloudFile filtered by the storage_backend column * @method CloudFile findOneByResourceId(string $resource_id) Return the first CloudFile filtered by the resource_id column * @method CloudFile findOneByCcFileId(int $cc_file_id) Return the first CloudFile filtered by the cc_file_id column * * @method array findByDbId(int $id) Return CloudFile objects filtered by the id column + * @method array findByStorageBackend(string $storage_backend) Return CloudFile objects filtered by the storage_backend column * @method array findByResourceId(string $resource_id) Return CloudFile objects filtered by the resource_id column * @method array findByCcFileId(int $cc_file_id) Return CloudFile objects filtered by the cc_file_id column * @@ -138,7 +142,7 @@ public function findOneByDbId($key, $con = null) */ protected function findPkSimple($key, $con) { - $sql = 'SELECT "id", "resource_id", "cc_file_id" FROM "cloud_file" WHERE "id" = :p0'; + $sql = 'SELECT "id", "storage_backend", "resource_id", "cc_file_id" FROM "cloud_file" WHERE "id" = :p0'; try { $stmt = $con->prepare($sql); $stmt->bindValue(':p0', $key, PDO::PARAM_INT); @@ -269,6 +273,35 @@ public function filterByDbId($dbId = null, $comparison = null) return $this->addUsingAlias(CloudFilePeer::ID, $dbId, $comparison); } + /** + * Filter the query on the storage_backend column + * + * Example usage: + * + * $query->filterByStorageBackend('fooValue'); // WHERE storage_backend = 'fooValue' + * $query->filterByStorageBackend('%fooValue%'); // WHERE storage_backend LIKE '%fooValue%' + * + * + * @param string $storageBackend The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return CloudFileQuery The current query, for fluid interface + */ + public function filterByStorageBackend($storageBackend = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($storageBackend)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $storageBackend)) { + $storageBackend = str_replace('*', '%', $storageBackend); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CloudFilePeer::STORAGE_BACKEND, $storageBackend, $comparison); + } + /** * Filter the query on the resource_id column * diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 43550cdde0..6563e857a6 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -180,7 +180,7 @@ public function putAction() $file = CcFilesQuery::create()->findPk($id); // Since we check for this value when deleting files, set it first - $file->setDbDirectory(self::MUSIC_DIRS_STOR_PK); + //$file->setDbDirectory(self::MUSIC_DIRS_STOR_PK); $requestData = json_decode($this->getRequest()->getRawBody(), true); $whiteList = $this->removeBlacklistedFieldsFromRequestData($requestData); @@ -203,6 +203,7 @@ public function putAction() return; } $cloudFile = new CloudFile(); + $cloudFile->setStorageBackend($requestData["storage_backend"]); $cloudFile->setResourceId($requestData["resource_id"]); $cloudFile->setCcFiles($file); $cloudFile->save(); diff --git a/airtime_mvc/build/schema.xml b/airtime_mvc/build/schema.xml index ff76e268e9..d8cabfeb1d 100644 --- a/airtime_mvc/build/schema.xml +++ b/airtime_mvc/build/schema.xml @@ -101,6 +101,7 @@
+ diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index 3c34da9100..1efbc0768c 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -110,6 +110,7 @@ DROP TABLE IF EXISTS "cloud_file" CASCADE; CREATE TABLE "cloud_file" ( "id" serial NOT NULL, + "storage_backend" VARCHAR(512) NOT NULL, "resource_id" TEXT NOT NULL, "cc_file_id" INTEGER, PRIMARY KEY ("id") @@ -603,8 +604,6 @@ CREATE TABLE "cc_listener_count" PRIMARY KEY ("id") ); ------------------------------------------------------------------------ --- cc_locale ----------------------------------------------------------------------- DROP TABLE IF EXISTS "cc_locale" CASCADE; @@ -617,7 +616,6 @@ CREATE TABLE "cc_locale" PRIMARY KEY ("id") ); ------------------------------------------------------------------------ -- cc_playout_history ----------------------------------------------------------------------- From 8601452c7158b8b1bb8869e4aa627e213c7164ac Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 27 Nov 2014 15:46:39 -0500 Subject: [PATCH 251/310] Merge conflict --- airtime_mvc/application/configs/conf.php | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/airtime_mvc/application/configs/conf.php b/airtime_mvc/application/configs/conf.php index 38492c11e6..00eaecdbe2 100644 --- a/airtime_mvc/application/configs/conf.php +++ b/airtime_mvc/application/configs/conf.php @@ -25,16 +25,11 @@ public static function loadConfig() { $filename = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf"; } - // Parse separate conf file for Amazon S3 values - $amazonFilename = isset($_SERVER['AMAZONS3_CONF']) ? $_SERVER['AMAZONS3_CONF'] : "/etc/airtime-saas/amazon.conf"; - try { - $amazonValues = parse_ini_file($amazonFilename, true); - } catch (ErrorException $e) { - //This file gets loaded before the Zend bootstrap even runs so our exception handlers aren't installed yet. - //Just die with an error here then instead or handling the error any other way. - die("Error: Invalid or missing $amazonFilename."); - } - $CC_CONFIG['cloud_storage'] = $amazonValues['cloud_storage']; + // Parse separate conf file for cloud storage values + $cloudStorageConfig = isset($_SERVER['CLOUD_STORAGE_CONF']) ? $_SERVER['CLOUD_STORAGE_CONF'] : "/etc/airtime-saas/cloud_storage.conf"; + $cloudStorageValues = parse_ini_file($cloudStorageConfig, true); + $currentStorageBackend = $cloudStorageValues['current_backend']['storage_backend']; + $CC_CONFIG['storage_backend'] = $cloudStorageValues[$currentStorageBackend]; $values = parse_ini_file($filename, true); From 92feacd46f9599f8699a879278a4a03458df27de Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 27 Nov 2014 15:50:40 -0500 Subject: [PATCH 252/310] SAAS-501: Re-jig cloud_storage.conf --- airtime_mvc/application/amazon/Amazon_S3.php | 6 +++--- .../airtime_analyzer/cloud_storage_uploader.py | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/airtime_mvc/application/amazon/Amazon_S3.php b/airtime_mvc/application/amazon/Amazon_S3.php index ea8a3e055a..ce1615b1ee 100644 --- a/airtime_mvc/application/amazon/Amazon_S3.php +++ b/airtime_mvc/application/amazon/Amazon_S3.php @@ -26,9 +26,9 @@ private function initZendServiceAmazonS3() { $CC_CONFIG = Config::getConfig(); - $this->setBucket($CC_CONFIG['cloud_storage']['bucket']); - $this->setAccessKey($CC_CONFIG['cloud_storage']['api_key']); - $this->setSecretKey($CC_CONFIG['cloud_storage']['api_key_secret']); + $this->setBucket($CC_CONFIG['storage_backend']['bucket']); + $this->setAccessKey($CC_CONFIG['storage_backend']['api_key']); + $this->setSecretKey($CC_CONFIG['storage_backend']['api_key_secret']); $this->zendServiceAmazonS3 = new Zend_Service_Amazon_S3( $this->getAccessKey(), diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index b52ac0113a..6ecb2a06d3 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -6,7 +6,7 @@ from libcloud.storage.types import Provider, ContainerDoesNotExistError, ObjectDoesNotExistError -CONFIG_PATH = '/etc/airtime-saas/amazon.conf' +CONFIG_PATH = '/etc/airtime-saas/cloud_storage.conf' class CloudStorageUploader: """ A class that uses Apache Libcloud's Storage API to upload objects into @@ -27,7 +27,8 @@ class CloudStorageUploader: def __init__(self): config = aa.AirtimeAnalyzerServer.read_config_file(CONFIG_PATH) - CLOUD_STORAGE_CONFIG_SECTION = "cloud_storage" + CLOUD_STORAGE_CONFIG_SECTION = config.get("current_backend", "storage_backend") + self._storage_backend = CLOUD_STORAGE_CONFIG_SECTION self._provider = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'provider') self._bucket = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'bucket') self._api_key = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key') @@ -90,5 +91,6 @@ def upload_obj(self, audio_file_path, metadata): metadata["filename"] = file_base_name metadata["resource_id"] = object_name + metadata["storage_backend"] = self._storage_backend return metadata From 432245b18eb4d14b990b346dda19e5959dcb820d Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 27 Nov 2014 16:54:22 -0500 Subject: [PATCH 253/310] SAAS-502: Analyzer -> Set the station id and domain in the cloud object's metadata Set the domain name in the cloud object's metadata --- airtime_mvc/application/models/RabbitMq.php | 5 +++++ .../airtime_analyzer/airtime_analyzer/analyzer_pipeline.py | 4 +++- .../airtime_analyzer/cloud_storage_uploader.py | 3 ++- .../airtime_analyzer/airtime_analyzer/message_listener.py | 7 ++++--- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/airtime_mvc/application/models/RabbitMq.php b/airtime_mvc/application/models/RabbitMq.php index 15ad912e07..a9f6998413 100644 --- a/airtime_mvc/application/models/RabbitMq.php +++ b/airtime_mvc/application/models/RabbitMq.php @@ -89,6 +89,11 @@ public static function SendMessageToAnalyzer($tmpFilePath, $importedStorageDirec $data['original_filename'] = $originalFilename; $data['callback_url'] = $callbackUrl; $data['api_key'] = $apiKey; + // Pass station name to the analyzer so we can set it with the file's metadata + // before uploading it to the cloud. This isn't a requirement for cloud storage, + // but put there as a safeguard, since all Airtime Pro stations will share the + // same bucket. + $data['station_domain'] = $stationDomain = Application_Model_Preference::GetStationName(); $jsonData = json_encode($data); self::sendMessage($exchange, 'topic', false, $jsonData, 'airtime-uploads'); diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index f17b1711d7..39ab704008 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -18,7 +18,7 @@ class AnalyzerPipeline: """ @staticmethod - def run_analysis(queue, audio_file_path, import_directory, original_filename): + def run_analysis(queue, audio_file_path, import_directory, original_filename, station_domain): """Analyze and import an audio file, and put all extracted metadata into queue. Keyword arguments: @@ -31,6 +31,7 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): preserve. The file at audio_file_path typically has a temporary randomly generated name, which is why we want to know what the original name was. + station_domain: The Airtime Pro account's domain name. i.e. bananas """ # It is super critical to initialize a separate log file here so that we # don't inherit logging/locks from the parent process. Supposedly @@ -52,6 +53,7 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): # First, we extract the ID3 tags and other metadata: metadata = dict() metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) + metadata["station_domain"] = station_domain #metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) csu = CloudStorageUploader() metadata = csu.upload_obj(audio_file_path, metadata) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index 6ecb2a06d3..d060f3bcca 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -71,7 +71,8 @@ def upload_obj(self, audio_file_path, metadata): except ContainerDoesNotExistError: container = driver.create_container(self._bucket) - extra = {'meta_data': {'filename': file_base_name}} + extra = {'meta_data': {'filename': file_base_name, + 'station_domain': metadata["station_domain"]}} obj = driver.upload_object(file_path=audio_file_path, container=container, diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index f106258e1c..b61c2133e3 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -161,12 +161,13 @@ def msg_received_callback(channel, method_frame, header_frame, body): msg_dict = json.loads(body) api_key = msg_dict["api_key"] callback_url = msg_dict["callback_url"] + station_domain = msg_dict["station_domain"] audio_file_path = msg_dict["tmp_file_path"] import_directory = msg_dict["import_directory"] original_filename = msg_dict["original_filename"] - audio_metadata = MessageListener.spawn_analyzer_process(audio_file_path, import_directory, original_filename) + audio_metadata = MessageListener.spawn_analyzer_process(audio_file_path, import_directory, original_filename, station_domain) StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) except KeyError as e: @@ -205,11 +206,11 @@ def msg_received_callback(channel, method_frame, header_frame, body): channel.basic_ack(delivery_tag=method_frame.delivery_tag) @staticmethod - def spawn_analyzer_process(audio_file_path, import_directory, original_filename): + def spawn_analyzer_process(audio_file_path, import_directory, original_filename, station_domain): ''' Spawn a child process to analyze and import a new audio file. ''' q = multiprocessing.Queue() p = multiprocessing.Process(target=AnalyzerPipeline.run_analysis, - args=(q, audio_file_path, import_directory, original_filename)) + args=(q, audio_file_path, import_directory, original_filename, station_domain)) p.start() p.join() if p.exitcode == 0: From 7c0a25be7f7f26c6d16324ea4d5d26f15846ee6b Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 1 Dec 2014 21:05:46 -0500 Subject: [PATCH 254/310] SAAS-505: Extract Amazon_S3 class and have it inherit from a general 'cloud backend' class --- airtime_mvc/application/amazon/Amazon_S3.php | 72 ----------------- .../application/cloud_storage/Amazon_S3.php | 74 ++++++++++++++++++ .../cloud_storage/ProxyStorageBackend.php | 44 +++++++++++ .../cloud_storage/StorageBackend.php | 55 +++++++++++++ airtime_mvc/application/configs/conf.php | 1 + .../application/models/airtime/CloudFile.php | 77 +++++-------------- airtime_mvc/public/index.php | 4 +- 7 files changed, 194 insertions(+), 133 deletions(-) delete mode 100644 airtime_mvc/application/amazon/Amazon_S3.php create mode 100644 airtime_mvc/application/cloud_storage/Amazon_S3.php create mode 100644 airtime_mvc/application/cloud_storage/ProxyStorageBackend.php create mode 100644 airtime_mvc/application/cloud_storage/StorageBackend.php diff --git a/airtime_mvc/application/amazon/Amazon_S3.php b/airtime_mvc/application/amazon/Amazon_S3.php deleted file mode 100644 index ce1615b1ee..0000000000 --- a/airtime_mvc/application/amazon/Amazon_S3.php +++ /dev/null @@ -1,72 +0,0 @@ -initZendServiceAmazonS3(); - } - - private function initZendServiceAmazonS3() - { - $CC_CONFIG = Config::getConfig(); - - $this->setBucket($CC_CONFIG['storage_backend']['bucket']); - $this->setAccessKey($CC_CONFIG['storage_backend']['api_key']); - $this->setSecretKey($CC_CONFIG['storage_backend']['api_key_secret']); - - $this->zendServiceAmazonS3 = new Zend_Service_Amazon_S3( - $this->getAccessKey(), - $this->getSecretKey()); - } - - public function getZendServiceAmazonS3() - { - return $this->zendServiceAmazonS3; - } - - public function getBucket() - { - return $this->bucket; - } - - private function setBucket($bucket) - { - $this->bucket = $bucket; - } - - public function getAccessKey() - { - return $this->accessKey; - } - - private function setAccessKey($accessKey) - { - $this->accessKey = $accessKey; - } - - public function getSecretKey() - { - return $this->secretKey; - } - - private function setSecretKey($secretKey) - { - $this->secretKey = $secretKey; - } -} \ No newline at end of file diff --git a/airtime_mvc/application/cloud_storage/Amazon_S3.php b/airtime_mvc/application/cloud_storage/Amazon_S3.php new file mode 100644 index 0000000000..b9e4050321 --- /dev/null +++ b/airtime_mvc/application/cloud_storage/Amazon_S3.php @@ -0,0 +1,74 @@ +setBucket($CC_CONFIG['storage_backend']['bucket']); + $this->setAccessKey($CC_CONFIG['storage_backend']['api_key']); + $this->setSecretKey($CC_CONFIG['storage_backend']['api_key_secret']); + + $this->zendServiceAmazonS3 = new Zend_Service_Amazon_S3( + $this->getAccessKey(), + $this->getSecretKey()); + } + + public function getAbsoluteFilePath($resourceId) + { + $endpoint = $this->zendServiceAmazonS3->getEndpoint(); + $scheme = $endpoint->getScheme(); + $host = $endpoint->getHost(); + $bucket = $this->getBucket(); + return "$scheme://$bucket.$host/".utf8_encode($resourceId); + } + + public function getSignedURL($resourceId) + { + //URL will be active for 30 minutes + $expires = time()+1800; + + $bucket = $this->getBucket(); + $secretKey = $this->getSecretKey(); + $accessKey = $this->getAccessKey(); + + $string_to_sign = utf8_encode("GET\n\n\n$expires\n/$bucket/$resourceId"); + // We need to urlencode the entire signature in case the hashed signature + // has spaces. (NOTE: utf8_encode() does not work here because it turns + // spaces into non-breaking spaces) + $signature = urlencode(base64_encode((hash_hmac("sha1", $string_to_sign, $secretKey, true)))); + + $resourceURL = $this->getAbsoluteFilePath($resourceId); + return $resourceURL."?AWSAccessKeyId=$accessKey&Expires=$expires&Signature=$signature"; + } + + public function getFileSize($resourceId) + { + $bucket = $this->getBucket(); + + $amz_resource = utf8_encode("$bucket/$resourceId"); + $amz_resource_info = $this->zendServiceAmazonS3->getInfo($amz_resource); + return $amz_resource_info["size"]; + } + + public function deletePhysicalFile($resourceId) + { + $bucket = $this->getBucket(); + $amz_resource = utf8_encode("$bucket/$resourceId"); + + if ($this->zendServiceAmazonS3->isObjectAvailable($amz_resource)) { + // removeObject() returns true even if the object was not deleted (bug?) + // so that is not a good way to do error handling. isObjectAvailable() + // does however return the correct value; We have to assume that if the + // object is available the removeObject() function will work. + $this->zendServiceAmazonS3->removeObject($amz_resource); + } else { + throw new Exception("ERROR: Could not locate object on Amazon S3"); + } + } +} diff --git a/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php b/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php new file mode 100644 index 0000000000..db475c04ac --- /dev/null +++ b/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php @@ -0,0 +1,44 @@ +storageBackend = new $storageBackend(); + } + + public function getAbsoluteFilePath($resourceId) + { + return $this->storageBackend->getAbsoluteFilePath($resourceId); + } + + public function getSignedURL($resourceId) + { + return $this->storageBackend->getSignedURL($resourceId); + } + + public function getFileSize($resourceId) + { + return $this->storageBackend->getFileSize($resourceId); + } + + public function deletePhysicalFile($resourceId) + { + $this->storageBackend->deletePhysicalFile($resourceId); + } + +} diff --git a/airtime_mvc/application/cloud_storage/StorageBackend.php b/airtime_mvc/application/cloud_storage/StorageBackend.php new file mode 100644 index 0000000000..84a9a8d72e --- /dev/null +++ b/airtime_mvc/application/cloud_storage/StorageBackend.php @@ -0,0 +1,55 @@ +bucket; + } + + protected function setBucket($bucket) + { + $this->bucket = $bucket; + } + + protected function getAccessKey() + { + return $this->accessKey; + } + + protected function setAccessKey($accessKey) + { + $this->accessKey = $accessKey; + } + + protected function getSecretKey() + { + return $this->secretKey; + } + + protected function setSecretKey($secretKey) + { + $this->secretKey = $secretKey; + } +} diff --git a/airtime_mvc/application/configs/conf.php b/airtime_mvc/application/configs/conf.php index 00eaecdbe2..fda19171ae 100644 --- a/airtime_mvc/application/configs/conf.php +++ b/airtime_mvc/application/configs/conf.php @@ -29,6 +29,7 @@ public static function loadConfig() { $cloudStorageConfig = isset($_SERVER['CLOUD_STORAGE_CONF']) ? $_SERVER['CLOUD_STORAGE_CONF'] : "/etc/airtime-saas/cloud_storage.conf"; $cloudStorageValues = parse_ini_file($cloudStorageConfig, true); $currentStorageBackend = $cloudStorageValues['current_backend']['storage_backend']; + $CC_CONFIG['current_backend'] = $cloudStorageValues['current_backend']['storage_backend']; $CC_CONFIG['storage_backend'] = $cloudStorageValues[$currentStorageBackend]; $values = parse_ini_file($filename, true); diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index c1d5b3b7a0..099f7c4fa3 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -1,13 +1,13 @@ getAbsoluteFilePath()."?".$this->getAuthenticationParams(); + if ($this->proxyStorageBackend == null) { + $this->proxyStorageBackend = new ProxyStorageBackend($this->getStorageBackend()); + } + return $this->proxyStorageBackend->getSignedURL($this->getResourceId()); } /** @@ -34,39 +38,10 @@ public function getURLForTrackPreviewOrDownload() */ public function getAbsoluteFilePath() { - $amazon_s3 = new Amazon_S3(); - $zend_s3 = $amazon_s3->getZendServiceAmazonS3(); - $resource_id = $this->getResourceId(); - $endpoint = $zend_s3->getEndpoint(); - $scheme = $endpoint->getScheme(); - $host = $endpoint->getHost(); - $s3_bucket = $amazon_s3->getBucket(); - return "$scheme://$s3_bucket.$host/".utf8_encode($resource_id); - } - - /** - * - * Returns a string of authentication paramaters to append to the cloud - * object's URL. We need this for track preview and download because the - * objects are privately stored on Amazon S3. - */ - public function getAuthenticationParams() - { - $expires = time()+120; - $resource_id = $this->getResourceId(); - - $amazon_s3 = new Amazon_S3(); - $s3_bucket = $amazon_s3->getBucket(); - $s3_secret_key = $amazon_s3->getSecretKey(); - $s3_access_key = $amazon_s3->getAccessKey(); - - $string_to_sign = utf8_encode("GET\n\n\n$expires\n/$s3_bucket/$resource_id"); - // We need to urlencode the entire signature in case the hashed signature - // has spaces. (NOTE: utf8_encode() does not work here because it turns - // spaces into non-breaking spaces) - $signature = urlencode(base64_encode((hash_hmac("sha1", $string_to_sign, $s3_secret_key, true)))); - - return "AWSAccessKeyId=$s3_access_key&Expires=$expires&Signature=$signature"; + if ($this->proxyStorageBackend == null) { + $this->proxyStorageBackend = new ProxyStorageBackend($this->getStorageBackend()); + } + return $this->proxyStorageBackend->getAbsoluteFilePath($this->getResourceId()); } /** @@ -74,15 +49,10 @@ public function getAuthenticationParams() */ public function getFileSize() { - $amazon_s3 = new Amazon_S3(); - - $zend_s3 = $amazon_s3->getZendServiceAmazonS3(); - $bucket = $amazon_s3->getBucket(); - $resource_id = $this->getResourceId(); - - $amz_resource = utf8_encode("$bucket/$resource_id"); - $amz_resource_info = $zend_s3->getInfo($amz_resource); - return $amz_resource_info["size"]; + if ($this->proxyStorageBackend == null) { + $this->proxyStorageBackend = new ProxyStorageBackend($this->getStorageBackend()); + } + return $this->proxyStorageBackend->getFileSize($this->getResourceId()); } public function getFilename() @@ -119,21 +89,10 @@ public function isValidPhysicalFile() */ public function deletePhysicalFile() { - $amazon_s3 = new Amazon_S3(); - $zend_s3 = $amazon_s3->getZendServiceAmazonS3(); - $bucket = $amazon_s3->getBucket(); - $resource_id = $this->getResourceId(); - $amz_resource = utf8_encode("$bucket/$resource_id"); - - if ($zend_s3->isObjectAvailable($amz_resource)) { - // removeObject() returns true even if the object was not deleted (bug?) - // so that is not a good way to do error handling. isObjectAvailable() - // does however return the correct value; We have to assume that if the - // object is available the removeObject() function will work. - $zend_s3->removeObject($amz_resource); - } else { - throw new Exception("ERROR: Could not locate object on Amazon S3"); + if ($this->proxyStorageBackend == null) { + $this->proxyStorageBackend = new ProxyStorageBackend($this->getStorageBackend()); } + $this->proxyStorageBackend->deletePhysicalFile($this->getResourceId()); } /** diff --git a/airtime_mvc/public/index.php b/airtime_mvc/public/index.php index a20586e828..fd1335ee39 100644 --- a/airtime_mvc/public/index.php +++ b/airtime_mvc/public/index.php @@ -57,8 +57,8 @@ function exception_error_handler($errno, $errstr, $errfile, $errline) set_include_path('/usr/share/php/libzend-framework-php' . PATH_SEPARATOR . get_include_path()); } -//amazon directory -set_include_path(APPLICATION_PATH . '/amazon' . PATH_SEPARATOR . get_include_path()); +//cloud storage directory +set_include_path(APPLICATION_PATH . '/cloud_storage' . PATH_SEPARATOR . get_include_path()); /** Zend_Application */ require_once 'Zend/Application.php'; From bf91677f91db54bc1d8c974b3b52c9ff0fe4a1c9 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 2 Dec 2014 09:06:28 -0500 Subject: [PATCH 255/310] SAAS-505: Extract Amazon_S3 class and have it inherit from a general 'cloud backend' class Fixed reading credentials in from cloud_storage.conf --- airtime_mvc/application/cloud_storage/Amazon_S3.php | 10 ++++------ .../application/cloud_storage/ProxyStorageBackend.php | 4 +++- airtime_mvc/application/configs/conf.php | 8 +++++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/airtime_mvc/application/cloud_storage/Amazon_S3.php b/airtime_mvc/application/cloud_storage/Amazon_S3.php index b9e4050321..8a7c3b3875 100644 --- a/airtime_mvc/application/cloud_storage/Amazon_S3.php +++ b/airtime_mvc/application/cloud_storage/Amazon_S3.php @@ -6,13 +6,11 @@ class Amazon_S3 extends StorageBackend { private $zendServiceAmazonS3; - public function Amazon_S3() + public function Amazon_S3($securityCredentials) { - $CC_CONFIG = Config::getConfig(); - - $this->setBucket($CC_CONFIG['storage_backend']['bucket']); - $this->setAccessKey($CC_CONFIG['storage_backend']['api_key']); - $this->setSecretKey($CC_CONFIG['storage_backend']['api_key_secret']); + $this->setBucket($securityCredentials['bucket']); + $this->setAccessKey($securityCredentials['api_key']); + $this->setSecretKey($securityCredentials['api_key_secret']); $this->zendServiceAmazonS3 = new Zend_Service_Amazon_S3( $this->getAccessKey(), diff --git a/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php b/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php index db475c04ac..78aeb1b355 100644 --- a/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php +++ b/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php @@ -18,7 +18,9 @@ class ProxyStorageBackend extends StorageBackend */ public function ProxyStorageBackend($storageBackend) { - $this->storageBackend = new $storageBackend(); + $CC_CONFIG = Config::getConfig(); + + $this->storageBackend = new $storageBackend($CC_CONFIG[$storageBackend]); } public function getAbsoluteFilePath($resourceId) diff --git a/airtime_mvc/application/configs/conf.php b/airtime_mvc/application/configs/conf.php index fda19171ae..932834fe30 100644 --- a/airtime_mvc/application/configs/conf.php +++ b/airtime_mvc/application/configs/conf.php @@ -28,9 +28,11 @@ public static function loadConfig() { // Parse separate conf file for cloud storage values $cloudStorageConfig = isset($_SERVER['CLOUD_STORAGE_CONF']) ? $_SERVER['CLOUD_STORAGE_CONF'] : "/etc/airtime-saas/cloud_storage.conf"; $cloudStorageValues = parse_ini_file($cloudStorageConfig, true); - $currentStorageBackend = $cloudStorageValues['current_backend']['storage_backend']; - $CC_CONFIG['current_backend'] = $cloudStorageValues['current_backend']['storage_backend']; - $CC_CONFIG['storage_backend'] = $cloudStorageValues[$currentStorageBackend]; + + $supportedStorageBackends = array('amazon_S3'); + foreach ($supportedStorageBackends as $backend) { + $CC_CONFIG[$backend] = $cloudStorageValues[$backend]; + } $values = parse_ini_file($filename, true); From e1f1807f5a1eb5fea65be6738613a9ed85ca3b6a Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 2 Dec 2014 18:46:17 -0500 Subject: [PATCH 256/310] SAAS-503: PYPO -> Use the REST API to download files Removed Amazon S3 specific code --- airtime_mvc/application/models/Schedule.php | 16 +++---- .../application/models/airtime/CloudFile.php | 2 +- python_apps/pypo/pypofile.py | 45 ++++++++++++++----- 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index 2483a8b54f..3394649060 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -771,9 +771,8 @@ private static function createInputHarborKickTimes(&$data, $range_start, $range_ * @param Array $item schedule info about one track * @param Integer $media_id scheduled item's cc_files id * @param String $uri path to the scheduled item's physical location - * @param String $amazonS3ResourceId scheduled item's Amazon S3 resource id, if applicable */ - private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $amazonS3ResourceId) + private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $downloadURL, $filesize) { $start = self::AirtimeTimeToPypoTime($item["start"]); $end = self::AirtimeTimeToPypoTime($item["end"]); @@ -807,11 +806,10 @@ private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, 'end' => $end, 'show_name' => $item["show_name"], 'replay_gain' => $replay_gain, - 'independent_event' => $independent_event + 'independent_event' => $independent_event, + 'download_url' => $downloadURL, + 'filesize' => $filesize, ); - if (!is_null($amazonS3ResourceId)) { - $schedule_item["amazonS3_resource_id"] = $amazonS3ResourceId; - } if ($schedule_item['cue_in'] > $schedule_item['cue_out']) { $schedule_item['cue_in'] = $schedule_item['cue_out']; @@ -945,9 +943,11 @@ private static function createScheduledEvents(&$data, $range_start, $range_end) $storedFile = Application_Model_StoredFile::RecallById($media_id); $file = $storedFile->getPropelOrm(); $uri = $file->getAbsoluteFilePath(); + // TODO: fix this URL + $downloadURL = "http://localhost/rest/media/$media_id/download"; + $filesize = $file->getFileSize(); - $amazonS3ResourceId = $file->getResourceId(); - self::createFileScheduleEvent($data, $item, $media_id, $uri, $amazonS3ResourceId); + self::createFileScheduleEvent($data, $item, $media_id, $uri, $downloadURL, $filesize); } elseif (!is_null($item['stream_id'])) { //row is type "webstream" diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index 099f7c4fa3..cd2d22657d 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -85,7 +85,7 @@ public function isValidPhysicalFile() /** * - * Deletes the file from Amazon S3 + * Deletes the file from cloud storage */ public function deletePhysicalFile() { diff --git a/python_apps/pypo/pypofile.py b/python_apps/pypo/pypofile.py index 2c14bbbf5f..c6caca3425 100644 --- a/python_apps/pypo/pypofile.py +++ b/python_apps/pypo/pypofile.py @@ -9,10 +9,14 @@ import os import sys import stat - +import urllib2 +import base64 +import ConfigParser from std_err_override import LogWriter +CONFIG_PATH = '/etc/airtime/airtime.conf' + # configure logging logging.config.fileConfig("logging.cfg") logger = logging.getLogger() @@ -38,11 +42,14 @@ def copy_file(self, media_item): src = media_item['uri'] dst = media_item['dst'] + """ try: src_size = os.path.getsize(src) except Exception, e: self.logger.error("Could not get size of source file: %s", src) return + """ + src_size = media_item['filesize'] dst_exists = True try: @@ -68,7 +75,18 @@ def copy_file(self, media_item): """ copy will overwrite dst if it already exists """ - shutil.copy(src, dst) + #shutil.copy(src, dst) + config = self.read_config_file(CONFIG_PATH) + CONFIG_SECTION = "general" + username = config.get(CONFIG_SECTION, 'api_key') + url = media_item['download_url'] + + """ + Make HTTP request here + """ + + with open(dst, "wb") as code: + code.write(file.read()) #make file world readable os.chmod(dst, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) @@ -108,6 +126,19 @@ def get_highest_priority_media_item(self, schedule): return media_item + def read_config_file(self, config_path): + """Parse the application's config file located at config_path.""" + config = ConfigParser.SafeConfigParser() + try: + config.readfp(open(config_path)) + except IOError as e: + logging.debug("Failed to open config file at %s: %s" % (config_path, e.strerror)) + sys.exit() + except Exception: + logging.debug(e.strerror) + sys.exit() + + return config def main(self): while True: @@ -133,15 +164,7 @@ def main(self): media_item = self.get_highest_priority_media_item(self.media) if media_item is not None: - """ - If an object_name exists the file is stored on Amazon S3 - """ - if 'amazonS3_resource_id' in media_item: - csd = CloudStorageDownloader() - csd.download_obj(media_item['dst'], media_item['amazonS3_resource_id']) - media_item['file_ready'] = True - else: - self.copy_file(media_item) + self.copy_file(media_item) except Exception, e: import traceback top = traceback.format_exc() From 16dc28642085db46a0d725247817b28b600b41da Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 3 Dec 2014 13:22:52 -0500 Subject: [PATCH 257/310] SAAS-503: PYPO -> Use the REST API to download files --- airtime_mvc/application/models/Schedule.php | 8 +++-- .../rest/controllers/MediaController.php | 4 +-- python_apps/pypo/pypofile.py | 30 ++++++++----------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index 3394649060..269b70bc7a 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -771,6 +771,9 @@ private static function createInputHarborKickTimes(&$data, $range_start, $range_ * @param Array $item schedule info about one track * @param Integer $media_id scheduled item's cc_files id * @param String $uri path to the scheduled item's physical location + * @param String $downloadURL URL PYPO makes to the REST API to download the file for playout + * @param Integer $filsize The file's file size in bytes + * */ private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $downloadURL, $filesize) { @@ -943,8 +946,9 @@ private static function createScheduledEvents(&$data, $range_start, $range_end) $storedFile = Application_Model_StoredFile::RecallById($media_id); $file = $storedFile->getPropelOrm(); $uri = $file->getAbsoluteFilePath(); - // TODO: fix this URL - $downloadURL = "http://localhost/rest/media/$media_id/download"; + + $baseUrl = Application_Common_OsPath::getBaseDir(); + $downloadURL = "http://".$_SERVER['HTTP_HOST'].$baseUrl."rest/media/$media_id/download"; $filesize = $file->getFileSize(); self::createFileScheduleEvent($data, $item, $media_id, $uri, $downloadURL, $filesize); diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 6563e857a6..8064c7f081 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -70,9 +70,10 @@ public function downloadAction() $storedFile = new Application_Model_StoredFile($file, $con); $baseUrl = Application_Common_OsPath::getBaseDir(); + $CC_CONFIG = Config::getConfig(); $this->getResponse() ->setHttpResponseCode(200) - ->appendBody($this->_redirect($storedFile->getRelativeFileUrl($baseUrl).'/download/true')); + ->appendBody($this->_redirect($storedFile->getRelativeFileUrl($baseUrl).'/download/true/api_key/'.$CC_CONFIG["apiKey"][0])); } else { $this->fileNotFoundResponse(); } @@ -307,7 +308,6 @@ private function verifyAPIKey() $authHeader = $this->getRequest()->getHeader("Authorization"); $encodedRequestApiKey = substr($authHeader, strlen("Basic ")); $encodedStoredApiKey = base64_encode($CC_CONFIG["apiKey"][0] . ":"); - if ($encodedRequestApiKey === $encodedStoredApiKey) { return true; diff --git a/python_apps/pypo/pypofile.py b/python_apps/pypo/pypofile.py index c6caca3425..998c7bd263 100644 --- a/python_apps/pypo/pypofile.py +++ b/python_apps/pypo/pypofile.py @@ -2,15 +2,13 @@ from threading import Thread from Queue import Empty -from cloud_storage_downloader import CloudStorageDownloader import logging import shutil import os import sys import stat -import urllib2 -import base64 +import requests import ConfigParser from std_err_override import LogWriter @@ -41,14 +39,7 @@ def copy_file(self, media_item): """ src = media_item['uri'] dst = media_item['dst'] - - """ - try: - src_size = os.path.getsize(src) - except Exception, e: - self.logger.error("Could not get size of source file: %s", src) - return - """ + src_size = media_item['filesize'] dst_exists = True @@ -81,12 +72,17 @@ def copy_file(self, media_item): username = config.get(CONFIG_SECTION, 'api_key') url = media_item['download_url'] - """ - Make HTTP request here - """ - - with open(dst, "wb") as code: - code.write(file.read()) + with open(dst, "wb") as handle: + response = requests.get(url, auth=requests.auth.HTTPBasicAuth(username, ''), stream=True) + + if not response.ok: + raise Exception("%s - Error occurred downloading file" % response.status_code) + + for chunk in response.iter_content(1024): + if not chunk: + break + + handle.write(chunk) #make file world readable os.chmod(dst, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) From 53624d8d28a7f233659cc7e5a2e8e69f9838ad2a Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 3 Dec 2014 14:41:16 -0500 Subject: [PATCH 258/310] SAAS-503: PYPO -> Use the REST API to download filesSAAS-503 Added python library - requests - to pybundle --- .../airtime_virtual_env.pybundle | Bin 3540495 -> 4155802 bytes python_apps/python-virtualenv/requirements | 1 + 2 files changed, 1 insertion(+) diff --git a/python_apps/python-virtualenv/airtime_virtual_env.pybundle b/python_apps/python-virtualenv/airtime_virtual_env.pybundle index 201cecc3bff5390eead1f112f1eeca63e333cce3..1f872012307a28eabba0e2b93530ea4b61f9b9f3 100644 GIT binary patch delta 800152 zcmZVm2UJtf^FEG~goK1%q$9n9^o~>kr5EWSh!g>lA{~T)G!ak~;UZ0XuL?wzDhSfM z^sXRXL}`Nl12?bV=l?!m&rzQeiD*4dIlji(1zh(!o$Nu;vsw^ z)Sr{`;-CMYR1KkdZgA;8O#2*71>$+Eyqx9&KkwwDIM>Bi#)F>!gZ)DVEFn=e{paJ-9!^wc&Y67tELYDLd1{woY z%8)ckEie}RQy*+ZmSM9O;O$5JBLs+=iQqCI>bhnO0TGM32OLB%v_6wwpd=fM08lh- zp#TFBx=m0}r2=!Z& zPeV8@z8-!Ynb~LuPR24BjB7~NOd=)eImeu6bMGH)9>^epwx(g;T}y5xp1@M*S)T=M_dz3Gx{1Ow6=8 zWC&-V@&<$+3T6q3HiQ>Qd=DW6&a@!7EWyeYL7V#8kUxYV)H8*6!7qYoEXZSb6M=^Z zVaCJb2HM;pY?wVOh$GI7-`fW=Kk=UFNx^x~oy7QzX0)$z_5SZ>H z$Wt7NRVqY|0Hl8P8e)uV<6Z$o5DCVQtrDUEmfx#{4B+f3yn!_02+ryucX3kZ_Yeg1 zA{!IEd(Vno0|IΠm?v3j0Fr$OII#ip`w%5CB9IAefwBP{0eI#> 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%0D~ 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

g=z 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

3fHj^uyg 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

o%oRRrwiccG@Xxuc0r60`Ha>)9~ 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
eCYntpXFQ^@$;1&Ww55k`r6?38kj9v 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≫W1Y@CSZ~nb6mTrJq;Os63=a28%Fg#I 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�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
8>`e{)R)ovjxyL zPQ$H=G+Gh#PO9})eSu9c1c*;9)D5xeA|sIU#eVQ3F}9`1CYb>~IGnfu#ki25WHu2J z_p1S(KHUS`R+te;8;oBh{bCq%Q9X6pw(MTTjpSHDZ0lPa3Qe%W=1`9X2&0vFnaI0lYppIc{fRaMH+)M zl!RXX6}GE8L?2Cl*R7$thTzdLGIc?~CtA@yBT0wBq`jm8sLQ9-l0XYk58A_h`h{ zIfm=_kIS*4n|T~QoyXvJ_=$Uqn6~GcI6KUAD}fI9DpCH?yC!mwyOhZ00$Lj1_P}kq zTvBxD;Xuwpy?-=dYB)a92wkLG6|bWtJ(}G{cD!0|VDu5oNdgxx&$uzWmTQ{nKu!2p zVE>^yBV@`41S1%+$EWZDB*)2XRCp!Niz`IaELAym__?Bzc@vY1T}|j= z2jB$JV=&t0Zn@?%GO#mmTzm94uho2UL)xnBA1u^v#K{!^X`6mg-dX*fqRJ{J4~4#@M@xkpFl+ix}S6@O0E$?1xAF6XAK`_ukm9b5}YlJ`!8?eg({zmQ4j7 z?LXExFeV^DKniEfxJg5Fi-pye^h|K>R8q7!E|#L{miN!LtxB5Bq?-ZCFT~4IxPjG) z!qFtxXxWuVJla8@pm5cZ{R!3iLS1T7N8=m034B&-gF#p4JUH^Ka@RA+qb(-cN-B^% z4%{)+k?YB2WVV@GMlyMr99NKzr0PwiYG2b^(HZ6+0ngQ@Xo;woG*8Pu5vvO-ym8;V z+jgf^TPnR$zNL+fh(KLf1S8&7kpR+sJLl0w$bTmtXRGw2Rw2@V-KURoA*eOeTiVS0 z96(_CFs>Vm?z8%Rx45a;bMOM!Y0;I8i3)IDEaeuj;*wgAl&oRiq8`D>hr+rULWTB+ z1845G79d_b?}nBOMH{S!l*yhK7DwA(C2&(3M@LlD5vj>Z0-LYUZkh>E165x{Ajp^t$Q;c+=Kzc5)1>CLJJQY)Q1 z>IIL2@_o_3UP~q$*IkNyYrM^1bluQIejsHsJ$nSIJz&miv_+*xpO5W6xq{)EJH*mY zO+M$CKG>p9+1NN=0Dmoa{|fAK+)cs%u6LEhibj#72k*DGmy|uiVDAiSWG}9Qf9)m$ zd^^|&!H>466H(smeZ!n1OXte=zdLM_l1#` zB|)=_Gy79!nu82g8}i*Q05S!`ZPEB0crZ*lOXqG{-+UfPH^Pie^#;=YgjR{-*@P54 zypl`t8G#ichT6MZe!{YF?|ww#$F&D8;H+G6i`lcddR`q7ak-t7G*ux_f7ot}GdF98 z@0i|eS|JQ&tOYJCMW2#&`0R)1>kp1F^P)fmJ~rDjaCna4=*nMNtW@$PUk+w&TE{1l zw1d0v7k(K|%hP@0A4{_Re7J4=VX2P`z{T^leaJL)v~aztG~w-0K>#c zB*iZJwbw_6-4ySah%pT7z6_`Hh$-mX~WduJG-{zS)*G zh|Uk>{-xekfX!_}c9ket4X`k5*(6kbAWup{0`f?9xdnwuSC4vxFcBSw|O zB>eOTqQCHuGm!nEZ5Zd*#A6AICjg9RBYp@ggyO-jFZlV^ud(eIY=s2`T-u0vqb=w)ws~7wmdFH_F1^@ahl8vOa;@k}#;cX`hY;G%ZeR!R zV3zdD-)PZ$jSm^G^Q6di`}YK-Yrv&+DOhtqqku462tob3tDe}4&8-JpfY%+!8z*I* zgF8OCe`u9Pdz~QZX-12w}v5o%IY=t+x@^Ioqesp=@P->?m?ATF|J}anTz+ z2*%`GHlz9+!dxMDTrkgbW9j`MsRcaVA43$;TPaxW(Iq{*4H#%xzpD+yQ_+?KKb@6f zQp|t)&fn-mesB#QNn`-vQkJauS18c zs(!SpnlG^S1sX#H@bV8;!DWKRps4pr*$1HP;7qu? z1B^N38@84^b_+>2{gwwcb%UXVVgH|H(_4XOxxT_Q31-#)mtsLOsu2vT2)?ASvSK$EZwwBcbrcsCI6NrFWUjUb64 z0JJNP`3HUAuzn=&#HEF^a|D7GgU!eG_ph`xuvubJ49%g=&?;*{H3xbekKYa|yXhybJX!rNM_F)LfFu{(t29I99CzqW zgVqDr`ZjZq)voj_x5^|;&hwCT_DICEUa}7gFxa8E2t&8jY?OnqWNpqSLMtMZZIw*u z;i{{HM>~4;433-zA^7+`rtnzb5@``UsIz>KUe~LP*$};5rSyI_O|teS@|{1gfEU|4 zNxJZOJ9S)vr?Ph>r_e~q5OXgRGwv1n}Eokd>DI76&RdQl5?yTb4Q&uDt%K29o)hh3wO zzw0d$dSWEzX@4>F5$nzOCDcMRaQ#D9U36-UFY`P(I<6$b z@mPM%?m8lUUvzs%&tDf*>zQ#saZ?I5Ztdt0MVq3T#CidZnhn+xcii*&J^-%#Bj%$o zf0_wIeUq{cD^2fdS?u!j-(EQ2M4Z^fXfHh8s-&46O&7!SRYd(w6+@AtX=CmR7&q0x zscCtO?ua4-$!5I1SGeftr)Iw7Ej`P9=Xb=xv?ps88*$q$a3^N$nL68c4;Z%6JR9oQS>Lq9G{MG3g_vr9Xe1PbBz$^Q?G1?*K6| zdz%q1m8*B8X`t#SADQ%GQPNNjS{!73p-I6?f#FQyk8lrgPsx8hiUX-ZB(b3^0MCjyw^PwCC56q8 zfDNTw3EY^GNJy0V)(M90@fAzBJyR*}Y?!PiQeUo8c6VcrYrh+W<)lXS4tR$%3>5_U5;h(=mi3K9(e1J&dw~rTJ7s2!6dNV{Cr1j5|G} zg*QE1Rk+p+c~?yUelOQ*R>5p?65oHo3$b{m{rtmpS!Wac{^Qz)ZSQ!A1ZWQJ@?ro*XgPJ#s#R|*6c%YG$?qK~ z14r=;x^&I}&>Ly0)0{A4;+NMe@=EQ09IK8yV-qY~B^Ia#4QyHOjCxH!vM;9n7HE5+ ze;St0XqkjaoN#H-N0hh<53fE1{(|!NU#b@tyf7Qs>52fB2*R)@Q-{etH=TPEXIgc? zGdf;1lV3-WD$$|D0$FPIoA_w7jh>L{qo;p&fp@aAKiK4;nD#gPHYW-%yc zZ@tGOCop~b4ur2WG-Crg?qDEVv0FIf_doi+2@88|c)qL7PPUl3ylsBppRl(ujq8#i z{>1hO;K9ClKRr8M_`KR<)YU4ZPkRzscRa7M3`uM|I64DQ)k@Q=78ao0l)+-mRLI%U z=pHex@N9&s@#wAS_vP<)uk?xbKr(1D7p!4AHnSxYD^3S%rMKqxz3ava3vWdFyHT!w z&@mamcf()<6M)9h9;W(K#HZ+)1yN#g$#?-EM3dx2PvcCM3=J#<9beGTDSh}=ja{~S zZNoEDY7;107|wWQfjn9li=6q)9=jHn6@`591LtDf2>QX`sq(N06HpFUi%exOcqP;fA`nduOHlQF1*1 zg7x%wL}k|{d-q!Z>{XvWZIJr27V<(+Z&ph!r8B$O$5+8=FC&c<+rDGi?ls-HUI^8( ztZ7H{G4X!(SF2q|@jC26TinkhKNvLnpsR$~)u)ZBvB;pcq?_@9L{*~SDcPu; zG{=C34{;e=zP<6#Pfh2eB11?EG(<<>!obL+@#Seac>l<+9b1Qyn=ROx`=@O{ijVo2 zdKy1gaBP@}MvCuN4T#GV4YU6y1k}bZksKA~LZg zZCUUg{-$2qx&H{mknRh{2vqTka_d2CRJyaB`6@Fhmp$Z*zB>Bwp9+5u0x)R`<0gJ#?ePMC*+aX#IrX!D^h%lQ zhZgWSD^JdY_BdEKq?sqBV*BzdsJ13TVqd7F zLt1t+#Pfa^BHhL~wiEcuNja6For^;M+&5bqcsUcUqE~*a$(0s+^mTZe7O6veDif%KluIf4n9UM0Y%8V0 z12|Q}07>EP>Qv*`0Ky_yRQ66Fm#}fNSuM*K#Hcaz%kGIzXJza3MZHY_BxLAq`;(lg zqd|{{FqgP0XxL30O?1`oD+L=E`z@?YuqV%3no-yR0GqcwcLMGmRrT6ptc7xg+N#@P08yc(o zHVVpR<9_8>7J#6*U>wQTMFxgnv0`MErq5|Ed~-miXNq4UWnHSvzPno4@)M6_SzJR>iV~j%WCqrkH064rroQ-7O6336q%=NT*gG@$8~bwZKoXH|{}-D}%o^*oZVu0K_t$|PPH zCrLm-LYX64Bt2-leePdRj1u@b=6SWKclJ7T*A@QQ(0uCE{^|Z zNJlYD01azFA-k9#nR}vtp(Xcn8#W8r?cNj87R!9DfOh5h^jvj6zfP+QNzdcsD;6pY zfnmIC?`w751GUu3ZV!VT!O2k&NOZP+LrnPuGRp$AU7o+=m_j<1CPeVa>>akc`JrGm z!ji>WG#+cB1a7PeO6QpSgDZT@49l0@APKN2p7NT#lrC$+ufnmvjikMyPRb z{m~>SHGw|#b=kAX%=k#E97xsD;t|toX+@N%a5c&?;~&q3t(xSz&Li1}+SGzxNRE3B z!V+sgRHGx#c0agWlVlS)L>sH@8G}9ADqpa#Dn;+LVY4M+6#vtETa%7|c9hm4FCgm~ z5M9k4L(V(%z9V_~HJ*MufC#+}&Equ*Gd^{DT7XZ40Ws|}-I%IXK6&nmy>tKhg5|hs zN#OTl`Z!1npz@lEZlg7sQGSEFdQ9p2FW}!EG zR#yb&172XE2=D|0Vu9a`)7X7Ccc7gG0NTn6TtKHtLS0Qzgbt&tb=64Rh^J27dA&K71}M~TqYxbQ{@s9R?o0iU zl>E=VnvQ63wgrnytP6|e3qj$G7{~&P3;atEyjR1mMoitNSJD01cbaDufU={_@@tZd z=3u>T-iVx^0E3^J9kFd8E!nUO`xH~YBhWU(k&r&v3Qb!K+I>kV2jK%29OQR}5}wn3 z?Z)kMk?u8`E?%DZ=cnpF=2S$==w`MeeUw>YTLEx^7FFgZ zQZkPdWa}ov-k;HP>p@1J0D7sHhpR+rbGyy8ZqNIp1_Zw=Ke8dLwn=PxtNpe(B}-mH z&&j@z;#+BVx9BIoX{RAVoA|o=B>mYOUc+60WW3+tw`yQf)yAU+e*vuZm0uU$gRfIsgUZziR@^r@2V> zVpW{*D*Ha<3JdZg9MkiKVWAQJMqcnK`91qqUQaM|S!l1Bk1&n=rmp;DcSE!ep(T<* z1Tzvn9kk1$H_$?m@R9YeYLFhdVz2m>5UI89IVJ2v4au|T`{G854e57phM;+9p*cD7 zyXJQMFV5aFsB*VU_r~4bt#OCOwQ+ZM_r@C6V2w1;xVyW%L*wr5(73z9%YUAkGv_%U zPMvvcRd(_rwUfJc)}3G0Ub!xQ_%}3GWSGrh;6PTI`wt=c@%6a}DzZ)=T&g)u(nHan zrD;$d&qB@l{b%bd<+B`&#}ugIH@&5X;n2WfSk8Q2SOu0LzsL|?5+YwA*s0V#yU*5} zU|6QUqcBE(r93L@Ti-FhSxi08T#3oKzla}ZGHi0HepjQOi|_^kDE$1>mKm`tg5kTn z0Lz4x6d#@nLmyOFR1!U2*n~G*< zO3WrJJx-j%*k_x`YwT^1Av8X=_ygk^ey=Ek^7Gas(~u$hPqEgn=_IEi^z5=x9g7L- zQ%^^8MdSkBQ`0F_UxXQU!e1PymgK)80LQ;D?lI@|U!pQYnOX0&&zqU~yYioF`rr87 zx{ISDComk1A)H9pGg(0pL~j0vjo_h+8cA_Tvw)1KR*ojmDqy(TEaO!y*Go=CU|(mb zI3E}DEBU_Ikas>T{8tQ0lC5`iYr(zi?KAWdfyK|)cf9ugP{l(qUtYoHWL|GMY|z9Y zI%UKzOi|GgBBEzpPyQG`xp$lDC`6!}Fc9XZjF3Ez79uG8bS`8gM9}*)P|$}*t}UG_ z^=sIvVs%sKVdSR*HLM|ty>bf5nk=oMU!v3z77Zph2H3CoXTM8H+(4J>b@X+*B<#3s zU$jPrKPOU_d|^MS{7=X?(nV9^9v#uH; z*Dn8P!~LT@L6h>2_QZpPAoC#R;7>6S~B zc#UB{Y{`_;U?wPOYr}qh&m~JM9-;)R)tcZ|_}3`OHH8Q{rhyrfwJf7tDGhV5-UwM% zaIVsQ1cG7>Aq(b2$=Rocrtzr_4QM}dfDocyN5>2Fn(Q00Sd$ePgiy2{QNXycjLerb%`gnfk>52-zy$)$ z(@aP9T_A&FaL88+bELQZq`Hmex`G*tV$P|v*Ofz4))aCeN!^90(MGMZXVlBtkS(BQ z3NKu-3@Rti_w3s-9KGv+rz>cexLJ;HRKXyvkY1|vQG!e?AP9^!+AxpCLLA;;jWpCx zqo!N27+wdGB8=Mi*t3~ctF^M~G&MJSyGb$mA{IGI6p z5`{ksP-zwb{4GZ_ba@9;He&IH)6`Mw9HL{*vz0tngugHB4t7XKBDM-e_|y5KIkkTo z2QEy5ia8o99C0-cQL@TG61aNfBWeVaO2xw2&}P6lSkS8|;1^7f3yoqqp~9fl(KCmTg<(hn zZ35t;wh+sy9R~ygWOs?WP8`;*V_^5=U_D!I4u2bQ=O75oa;Ak?7E7c;iR8GmZxL({ z@MG*rz4QN77*3xEsGyV;&tb&Ng&Q@}(f*?Dzj?S?WM)Eu#LLjyc?Gdvbj4C$>dCwo z%Hrk-cy-s;VC-zavIK^N4^l;bI6P4+!<8oZjx3L5`KMiMzb{%q@T61Pnb0nAd6SCc zbvIv-mo88Js!;WmHmMmFjC(||r3!-SB9?UjeBzm@XRuMsPDy{kYKW>8wG}?A-OtP| zm68c?UeSrj=qbv1yH7hH$Cqt5sa9?HV~x@XT$Mv+B?uIRVf+No=v^m7v>!R-#9lsI zC!~h%_(D*SA)!UcX%n$+2_awW4Gt((31*o%z{DDrD2P8v0>q~V0cNepH`vc$o3fho%1p4L_KQpMf?@t34{rSd=qF-3YUk-~zDt6ih2Rz~m#FL&XSW^E^M=vs zhRhDT&4$P<-fMq-k@$cdl5dq8wyj<+xcrnIF$C-4kK6bgbyAgurLooYt50q~hE&$G z-83e)76H8N8u4>qw>oXpA*s(*BW*<7X1A?kVAFD zto5X*U+>!J7Nz@o@~6T|1Wz^EEIOGU&NmOh@j%L@*2D-G7F7=vo`?lN{(U~;4lBrV z{+y2{k^YB1WdG@aQJwlo9z)R3Dc z9XRs^-bh48ZXv-VzI9&u)W1GI)(4&6;&y&Yqn|rJc}sMXvu7wns*rag zmca98*JGelQtm@A%@}w#U-kt3UV5Lwg_mR(YF-1@-U;Vp5P8L%oQb@5i-l+bVOcB7_M%L}_Q}MEV=$Jm#>Vtv)4W^jw&lzRe*M1#lhNT4s?o zXy3z&j0;qh{9V&EcH*|Aww;iFhEtX3ftVBjq*NxO(5)KkOx|=9^R2%r9KIa+k`aJ5 zu1i5YEfa4AdLkC`tUHIu@l^VoWEw!grZN-wHN3Jtrf4e}PS2c^g~G%T!krZ<)-jnB z5jZSNkU*lkK((i;cItyZ4Y^+rFn>BNB$zAbjvOH%YGqI2-4TiH6(hgi9xP^uk`6=R1rbf$Cgl@L3H&^hts2b<3R zVm4=8X;{!$vg~m7it{YsLJR2lyJFxoheY?v^zSnphvV1y4p0z~4=@lA_WucK85mgE zSveaRd~%jahO(Uf>^Br26Ha+46-%!zWuzFCSmbCDE(akPrIDJDOGn_a|3?SD!;X9J zd8>84Y61+^JENPSc?L$<7rOD;^Ry~XlR?1;uP#bXVz}?}efO#3{HBWC++T#mieYYG z4p1fgA18j}SVLdT{)T|(!xtbHU;u8U!m>Ii9ZD+bF!)@HFmt)>i|!zq4fSTheA;rSQ_XNU;|bGGt0Qp?GmIG zbX2(}W#^VZk-8#rk+`ud<*GHIMFS_Z9OU)K!LwoN=c08qGGn5Cn}16(>y^7A{-mx- z(oZGN-b7X--d9p^UbFXh<(0a{CDp{2rk*YZttCynPO5Y|n}Zvmb*gg}D^6aYgD^fQ zTft-gP{k(lE|#nF?9FlY<*d+6vVO&CvJ9M3yX+fgf)S%thTNXYG`jFL=XgE?^;Eu) ziRM@y%3FgGs$Kn1xYoN?o6;3U6TL(H)gq%$A|m#vVpGO@CpnQ658*6$D>k8GmS_E> zYoau7*I=~SsvsqBL)OQjw>0#4-uMIzM>DJ38L5&ZXS0~Go|vIMl48vGH|aP6YGm_&WDo8MWQDTF$#6i@ItLs_+MElVuI zYHEN@3OrM!>tj8y$pbM+VM|SjyPcLhqviT3>ZU%$_wE(;X6uuZI9;WS(WFVg=42wJ za*P7fMWvD7XXx0_6k*dFBQ9r=XU%0FD5R+{FM<2Yw&mrAsohg?oNV^53x|2Wnt6X$ z;8r1$q(@~Z;@@%m>`GYJ_k`p2gj>P+A}#@P=c{SWIgP?-Gj!nwMiQ#(`|osa*O$Jn z`7FH51zro^bIkRt62_GH61i;#$qCMc$7~HU@Sw<+V_*;ww;s+n&}7m>+On2-L=RQw zc-LJ;Ph)H5Pz5d}INfqC;qvj74}rrG|ejVw<82CVy8({~Z3^JJV$PdZ z=AKH6D}_K_p2ClNQZM<)q{lFYFW;?;pifgGvX_=;)~WKDfj3RIxgrOLF~V0t&?2PDQjKt4{_q5HJHueOlg8)E6XXWq zv-x|17zV3s`inbOqfr-+>kptntRH}@KeZ`40=H}Sl@zS^1^f4;D`c4AcKk$4r%%VO z|ItKj=4A5UDW|Syf6RsAbD$A1haGK+<=HUvnMv6g+CU=;N>1x>rTP##dbORgM57hc z%ZXb$6HJg@8WpR66Q9%m7hT;sK?gy1f)-|?JLpPIzn81}4+M*9>_~Xc?kj3%5OegdU=7v%cM$%UvAyjwQ57;}>*qSIXQ z2J;Z>k&F?Bfo-I!+hesq{$HvJkl-x#z zq#ZGD)Dv5yI$(KFvVNfcrem-7clRJ+ju*`;^@1NdTHAOFmX3q0Ot*8?nOK4< z$sUe~%qmUM9K?d`2n;RFfm0|_5AZ1jb%>dM^CxP0 z2e5js^~-#L6ZE|CnAB_EKue4-R4FwW=-VaV5tY@Vp&a`SMinq@xB-wwZM<3XX}7N& zhUER^z2w7@KbQ*CvhT#XGZ^UL9@F2iE8%ni;p-DNrZdkND(E9s8i~oPtz1@e-66SbO1XrY8EkT} zcU;tOKQQ_yKjJFE^8FybjxG*~i7!QbP{xPPxE*S8nm==8Y}@3~^TUp!KOn+sM$XbD z!;Ta$HbwZ&keq>+6}+t2<7_8!cGArCUEpm`j*{_W>eV5A0=kuDqNi8F*Z@_q5 zUgiOJX@bFD`{Wr*GztxJz}F}%f+$tXn%<8s%veqcFCwLD8%)O8b7whD%2m0wFYN3H z;l5I{HlEg!4bQi)KG^@B4x63MzTWuz8fb8}?hkF%Q8N`2jD6P^)k}FywSd#Kx`-PR zDhFsl1A-^gm&vW{4Vc>f;k}Ya4=fh(BS~xceUzA&SQ@37mnp#|;R>jpfhd!mGQa%P zXCszC+fW6Y*sto_Om`-3Xxugqk1S;gcR^ClcTt_zKTc6+6Q1USyM}o8 zgYsEvc`M%@9!;1lDNwgz8}-IX4Cr^KPZO?F+d)`Gjl>{DR(zx)Cs*hH)W2+et^Doe zqqo8`;|?`{bb5h|8hE?FQT=kZy>6vu%U#hiA_`FJckyrLQ{AKYAJR#U&iRVC+CJ;* z2-d<~7phr}W{}d78yu(VMnv&aodl$wmt0NYABB^@`>qs|N;CR*jj`&vj2qjqzp0lo z2E+BP`$q9{DN2_*T@ko_0MSYwHZ_Cmz8=u)+FPAX(x=33QzcPbejZsqxUF>K`2u(^ z1o8p453BZc^V{2$ND?|!%t_@4w3|49)4QNIIRtiGEvefny-m^nE+{r850k%^6wg_#r6 ze--eItt{C8dpi4vAh=LEUNjJn!@-+Zn!~|X5j~?ZdD$0g5r@TN;)FiSchq8d2Ydf{lS;{8C%YeITXfYaVRRo=gnbqohr^i;U&GCujGg7>-l#!#bLu}BVfKj; z1HdOoBuV@SN63Mv@Vnh`l8Kg73tE!SFN~xLpwZs`MP$(K`udzttWMKX^QW<=VT3jA zYXTr{{=1Fa{iRW3E)B1$^rx|q z@ObVrwH63p0_1;Sgvi*LemY)=FmSCx%Epl`*z6@i??}AiYkY!|qcFYox)N5SaOk4& zs3_Rlg4~Udu^ubTd5Vjx*RUmKC8bPk>2^sZ_zfm!5{GVunf-T}_+5{m?z4cFZ(3C% z#w5{^SGw8N_b2xdU9L!-+lwLc6Mpe(^5RHj9IdY#5hy-$gkSvwf%g=VxrtP%R7eq>~Tz38rkKD>GaF+C2LC0Usg^OvuUlU zK0$&}^B<64snKu(xm4b=apkI?Z&D~6*}VN%`LmD$I>6+SWP{hsAkY_4b${9hcw zy=9{1?^zyEIx}s~+Tfnx6kTk zRH)#Wv*z0gU`EwMYKO=6-9tP@sW}O{02nhGTb35>V&$|CCQ~j^R%TT?r z$KytMn=oKe7JzWBhUQkIVn2o^iO&7vr>U5ruRwQkPOr(%QQINa1ibOzd{Kp!Y|(** zjk4Hi_t;G-E4v~7Yyi%Kjg)xnAtzF_=L60@#IU`qtTpO2zsgnUN-<#E$xV!96iUtR4d>ES223+9ooY-x?a7aE028;U%;ggDP!p;0W>zZ}zw0XJJG zmJ^>zc<>_qEbc`&i*`4!xBG=&6#0*DQHm-Z9p@Yw^Jfx{({^!q9-vmyy#}#vZ?w;~ zsT`7^kgKsa{81NL|MQuWKLMy4ol;q;lqpm0B)cqPX%94>k9EyHds)VC+GOdBybZ-f zi#A7zmOYEtEf*_(flkUFp ztO>uvmD&A444zrFy)zlH=Q8+alFq$1GU$oyx5L%9un;%C43Dczf#lHwboEu=2tben zJwCpYwRTLq*SjN}hUE2|q71U7Pn5{ioqMw!GYzhDk0;(Nvk{3}GTtcdknD5E7?3l9 zw6G|miIC<0c$p!d)`t$DEoyK#uIDz9Rg(u}GSzu2BBIUHX!Atyntf}MHPsL%nljBS?}=mwQe`~slUrZTE0XTf|+bt zv%P4T=wrn$7qPFR*pq%ikVfvgXXXjI28oBQ2$((pik<#Bre%>NysGqqEud_~9LKJ1 z5G%}{r{8bbevKr;uc6T2cC@6rPC8oy7M%QXUwIqc4;dA|DL%El5bt!;bIT+rr-7z$8D<=*nEfZ@}7jVU`~;0 z);Nzlfk$5PXXrsRB6{8T%%p}qhNUNRwyK-V2!p!H<@c>G$CcGgOH_H?2>_?!N|~WkM|1x!oEaHm36r} z1@^l?s81wIJ(AD1@3ugnS^H$SwV#!@t%FBP4zyt&^kklMAW;7V4E$L(FKUe+`uu~o z6*M@??Ex)6+%@$@s}x0|oBC+^yHy_<1l)v}=+mwhBTRdDzQ)$JRdED;jZU>z31TI2 zNXGWYE-?;(g8htW|0P*kGk8YJQ!K)-^Rk7rr3Fa-W^)OXrIV**!|c&6YOrQizw<;9 zv-b4IiG{gR8dgx-Xa{Gj@~ibG$#m=SomZU1Nat!A0?#gs^M%AzfRPQ`Q3LUF1u6ou zc<+m25d?E0>#FgJtX@tJv>HmRIg&i{EZ%;? zgVTBf=}-Gd4MqH~=b~`q_d`#u+3{MWOXh(XAErYD0itEm2{=dzNGED7%|28jRY@v| zy)T16jAC-sDYaP1kUqx7u<-W&C{rT#pGgP(sqnoue2_SLledJEpR5)((c?z8JdU0N zM;`c&Jd?P6xUb$&j!=^+eJOkvXcpJHKbzqu)k4cIbrYItC)L8ru5}}u@h0a(%dT`Y znmq^9E}OL3Sn(ZQpeLC=D0Kpx#WR{v7q?mfO2W^3OOLyAt-V{)iA;7?@wN^QLnsZ4PQ2Vk8RG! zrqx1(=MZdl3bV=TQq;21oZ}tf%SscRsHjcJO4aT_iBflZTKth!+A_+qIaLjC|CN|k zc#_#@+>fj^pIh`!6>M`{`?(Tfo*y!u2|J(kE-K3}RTOZS_!5>e;O6%DDFJ-Hxv7&0 z)4TNc1}&*=!y-lDMZu_NwEe+*sItm#viSS2dJwZGsv%v;k_GRmo`u2K@X`7>_Sv)a zSJ`#<2Z@|1{7rnbUQ6VKj?G6P$Fu7R`R;w>Bm3cEX=cM7ZD%OL(*^Ko&{(TP+G`x#~ zy+6O2Ykf6{G33y8^)(mydh^g{BVErRWn)>zy7&C?+w_uWer-1)uI!B0-C(ZWz2;;! z&|EnZ z!>Ov&YMvPt9}?kA?INU|#HcbL#Ul*iR{vd4X*GlE;ix*XqZ2=*;gp&oqT$pORW}PL zC^s@#?JWAe@F$&M1IZw+S5)|StVoA<0MUS&LoCt$qI)^f22#`Q<4|VG6;wA~U6DTMJc0J0Y4ki#O33j<~)2Ffg2;zHLM*Rx=@ArsTweHEr z&ni9V=Y8UTR3I|3w{rrVjqIGA{^^NO?XlZoM(Mc0{NiXuF#=Xb35hoJKBIDSe-1UCumj^A@sk z-CCu_ELE!|Mw=Qh<(CvsYO3HT(!nzrEc2Yk>wF?z>5|h?Bv61hWp^?bZFxjt`0zS1 za=IL=71#9*(R*Yg!FUqp6Vw=FwhN|_WZF0zwfvIz2Z(kH%(h!{)z+DP87aPRtt?VE z+&Qzi77A4@LidZgCy^CU!)r?5@-|lK5>nyfo>k})GH)idy@$bksyAV$$~4sckl+kL z;`b1_S+S3_15lnC2k7EqU-o@A#B<`lMXL@cU^XHhS2BF%uDiEC^p9)5k(D?N-hjILGt57G(r zt=)@^I9iemvJ0DlKa0PU*7W%n6P`*0L9M^Hd_H6Wfm%n>k5huD8zFr*Yz8)hNCMrVQkxF%mi^8S?E=L}IDQ31`R?fqaKC0K_{Fra3i^M*(6@Ip z5(uykuj@;pn9zR`-845$p(BTee0UzUy6}G>6L;h-;)yT_ zNLj@HON$Wjzm*s)j9I_3u>P0HcZOaR;b2VR#bg!rH_dLSl^94 z*`^5XoKRwoG2{p6>7`jWRSh(DTqUXL!a zd^&yZPvaB>KaOY5c0bLV{~9y_ANw7|YXVE1@8`ZRJD;tt$oBf}8v-8QE?xZX>+hG3 zS;$oeUBv+K@fKxIq~GcO@L1pB{pRqozkXl4akG7P5GCMsb9tU4@U;5UwbAAKy8UkD z_3G;NfSjpy@$ve;zM913+x*c*^m6&QZ~Jz06f#Klp@h8A>Fup82s{DKA3N)BWoKzw z-aEisDYgRNNl4alS*KUi+fJN;-C65|XP=<=OUSB3m4W@F$HnT|)7$Dx(dUu0zdrrF z8gDBKvG*;vdfz!?`Y7?OwFTU-ZZB4okgGnfZ!h2O%PPbl?YthEeV%69E{HbUvjB$q zlMwq%eZIH8QlA%R0O;!QdA(oXv^MNo_Vs*q^m^JEzjyvP-ahm6X6S1>>rd0@^7SsA z1U?>*w^y?sr=#rk=bdrx+Fpt-Hs9NWyFOl{RxKXvZSq$yE;iQ$=f8KpUZpJ}GoAEi z@wc}FH}}3?SFSJqSsicZ7j$>LP}lP>{@=U2$_Lw8yOz(1fn%4>m#PN^`x7dikLtHq z+lwssrg{C3oqpZ{gSIDd;#V`o=b|&0vw_*ktk+9o#-2@!XKOF_U6Zb|hN`YPaGP9! zu5P8XWz*N&>*Fk{>f#voZsTk-)8~!J;PvX{EN}9o{%uuaG7GqUS_GcuI-1m5^()?V z6g(f_Ls)wN4W04hqy98E!TIhJP~h?QiRwc+>+x{cB8&g!Ss~)xZL;(Ib+)Q=#rL8A z<}B}QG%6E#JB<_cy`R208x<7zxDKxpcyn0oZ0-8+2-6w^>W4lo!n!IXd_Oelo{rzw z!$TJB7w0}yS6>>T9-rs$*TcIu7CE}w0qXD-{dge!^>X%Ok*L$x`v&_!hxq9w;N9Ho z(benb@%-~$$yt$Qd96)gdEIkl^WmW~;(af~O{dXwHk|Y0y|r+mvZdmn3JFP+npb; z!fsrX`s?UCzK!O5d)zYZZ*>NX;_uJcXMo1V$Mfj(k!GN~{)ArdTNSal%7xKk*M=|4 z?=d*)yDEd{=ETA4f-K+S=ttzPyM9hC;mHqwwTc@4P8tQD7bM{MeK2X$c2iCFYjAuX z|Hs+Qs_j{KR@eJ%(xkxCVV&T|{j!FEAaH+0+~s@Ue*pNtE4@uJb-lk2LedMBqu z8L&F1d1LHw;IU}E-iSA$SN3pO zj(4K3V5_zJEAHY{X)=pFS-Y3T#=OGZHIseScLL9R0lju$UZU!WYgIoAz-6#zpq#X~ zScv}pyu)H+Y_U*=aHD>rHj4IU%HqjyRE0{Ex8PBQ{E*7Ul+IqM-Qvg+rsT9DK5liY z;q%=hO5Dd{Jcq-~X8B@;@1*R<9DbD2*U|DW+hM9^y%jE3qv?!;iR(w0RN^9q}@ zX?<{cj*iY7^|*0Q6Ml9c04k_ov?Gj#yp8XI%>CVRtSzzhYlm&w9p2qys(hEVLtsBY zTN>W|;VbIh_Q1ourFEEB*ywtuHJomYsNmWnc zG-qdK56eAzT6dq0E_(+(Fa2OKRXuAv%PeNMU-e7_?D)7%L$Fp9uneW6w_PZpL2Lz0 zSG@>f-DTrR_)<~T8onaQk?d1uMvZ>x?OH9lr`~X%JU(o~w(jY?YGV;VI)5*VP}P}Y zdv-xsx3R|7{@bXItwH*3`MHqwbR~WT($#)$k#oUDpMJm}daI%?(M7a;b7T=1N#M--b;YprZ_q75uOn;77D(Ox5BWy7-O z?|WU(iFN7K+eYBX#a9Zs7)+<$NLi*O+O|%Y6gO+_rpA#P9zf);!Ln)js$zu@Hio}Z>(J&I@5#59KsDL+4P_Lh znxWe=UC`o`w zY{bNE0duhup^ZMu>dgW8K@!R&c*KC`seRAAOgOPfHKtWqfi?@APHWmqM${6kbq$|4 z@!wSsr|uxr!Szn_5{0vCj2(m@WI#fsyppBhO6RZ_N%*Xk!zK2Z^(wohTi3!~E z+6sTxw$hG6mWIhMZUk7(!GA>rqVU8a8cq%|0(<>`eaO)0bbb5dmu1(wgz;j6T-N=0 zu(y6Xs40OPK)HVJ8$6?)v^p0ADUFjCA0(B3NUL6XM0>6JTGTuujlW!w0#>MUzK@(v zj)QH~0LInw@}uK8a-tl)Mk*kIA~sne=!=uC*^=B8cti;*O&@J9rmF|94Rwq-si4Tr`?Ct}TH*6%iqp9GcG^g`aBGDI=G|)n5v=fAmJ) z*w+W0*Wg`fh_o^$!am^{0rsz9`yE-8Tn8SyAmT5o!_c37q}F>d?m=U$D&9~K%&>iT z#}#BOTHqoFd-CZ>hAKU5W7lLSsH7uS)n zr2!?VDhwxjul~ytvrNPl#wv>QN%-ndGZ$s0eoF5YLy7$I2Se?3cQut3*)H~IaRj;| z^c7=$@zDK5(3g?FBYjIvcptVVjflu)$z;kbF{nd0a&5XIr+v-ld~5yoek_7m;y|R7 zaXEA%?pYtDE3PgF3@vnuTWmFNj2Zr;>0ql?LJ9a5GRWYxe_qi*s1Y`;=`L+2G^IYx zxModU|8N9EvHoPKpLCGq=9P)1Wu5;`x({(7oq!Z^eV2Uh-o0t}|ucI_h4X)hPGzcz~IF~3>J0*#cR%#Je^ zQpH&hpn~2|zug3{q95psEk0RG1SOYTKM{6e%eHO&`9($YJdU{s`_= znUMolsnBQo8_@x%&Ch=oiYULFA9I;Y6ODoTjhpC;{S&rR98^VK^MkGU5c5w2Auk^i z@!29f9C2cX!)6H>5AiZm&iQX{a0v~b9%(llXZ2<@&^vU>9_A*RWS|@sO0qIn9C}bO zix9#Ats}YY9nO4NhycOPtql4IWr~C`(^&BO2j_`id<7af-jy(HGcHR@HW^oNysTMS zhR%(%HHz{Q2{ERz*#W3bpcozU00gWWi(IvF;6UpySp*T)3PN-#H+{CA=eTFa1u$og ztLR@|(JcdTUQ$K@Z$M^pq9ORAz!kfqCp2?Xiiln{?UKA&7UAxe|6Jm#m_u?ylNt7$ zn5srKIJ**k3W`s3j=xCc-H~c^WKgQNqXo3huSmI)2Hb&ZBN}+&6Rr!WQxI$oj=o~| zPOj_jP=yUXBr;ymi@)QbAEAEtNpF06wsOn9A zB7!wP2aV*#7jhzD9ucIUhq8Z55iN9{jNv-ZSoe5Yu&_sSli_P!jZX1q#1Xao8{Ff; z4CpOmM5I@RlA(v7r&I<)sa$o1TmwD5l{XYGG#vbdNbcu@uZa>V7*bE1z}c3WujG#R z%6lMNicy8qrhu>2IB=6c1h216f!em{Ifr2EYZdSv@TUPg9@2Fv3h(id87t@t*<;5w zmg@7kOLqL_ zOCA}Z4oyEpiF6W_)H}2{qI3ePuuC3q0L~elXgp18fZ~0NupJmiB+BftJ1utJc8=U4 z#YLn|{seq6a|qS2ZAzsSftJlRvh0btj&CNPs28|2VqTSEL>n@Q*5l>yK`FB6KVr>> zoeI`S`5{Y!F04&Xvt`{{L;`~xy+pR+T$ZZ#AcAC1z|M&?bmCKzkuVWf9q+z@4qts_7{lvg=tD20TCex7EW#!A_9?Hn2<3> zv3)H3Dpu4`iG9vU{%4beHj4H8NV||nsLl5!AA>%E(@kG#@fI*>p>R__jlbPZ$?XG6 z5StJoNKzd!f&-+%@ugtKD0HQ_NQT+CA&|IOAnHVUok)h96>}utqx>+r9b7_-5cP8f zB*p<>*Z^w(-fIFbDtIheXGfa_PjHcLeUZhy+`+^Ev^Eug+v+RC;#Hb%Cuew@WWBe0 zG?er{kxtkZa5lleZ8SooNw5oY)B)=k5GS*sD&rI_hklxrQjqB`;DQ?Nf?>R@8s?Ta zAU*yTE_$fPZT_1p#*?DGiiMZDkc{*yPX~ZB)E25DlBp=Sz{aL1(hn4sbo&DNl%Oi9 z24#7*2I@>&5s=#Y&hDSx;jf5dts|@88{&oKLK`@|f6KRZM)#3)e<@N}$-1}aZ>i)) zkcZnV4bBVy$}Kb(*{66fbb%`zz0tweb1vb`l=d@Ifl{n!#FOC&W(msEmjks33ETu= zCG%Wh(UyONue* zas3~`E$2lA@(WSL5n1s-y}!gj1bdemk}nMog)TWwi<6jt3C{q#kI}O;{eyGPDGK6f zYf`YHnJzAND&L2HxpK$wjX59#Yn(e;mTyMN7)Qs;IH#iy)ysJU#E7ezCyl*QAN*isnOjuCX|=mW0ox@^Y2%W zFNG^c-{7*Bje9T0rivnGEmj6uG{w3oDG1VIzPX@HjT5WfoH0AU zF7gB+rDN~+Myt?5KFQc|Biwd^-^nxO9bp`3-xbyHUyb%abw@~KYgp^q$l!6EZEAT` z0+NAP62@ef&?Q9rw&k!b3$+aZ?S@H-(JEeD4wCn4G&#t2O!kYwIf67UH_4AlJ0YmT z-W)6HM5a~zf^3$wj9>yV4E*_`V59QrOi}|~9=4@@u+f=%nk9&ATr$lTHSy4t#@X9Z zO{Uiua(QUO2vP2CXHY|;O9GM06_!(_ya{uMY`inmP)3@stz7BdVFy$IG9QUN_5NU` z!pJw={qOTr^1Yxus5=WRnMkx&7zPQ8mWi@b*5=_f6l>h`E@CprTqNWT*8Ln(Xdq|R zQHLJ&mh}(P~sVY5}HW0Ep%+=muO6>p&of`x!hoR2P*C)7U|iq9s$TTmWSk` zY4VeXt1!R(cH#PhWOLj+X+e{0}Wjd4XkqH5EKUK{nsqSP%^ zFCUqn1ez@u*UjozIU5WfooQE{uL!+XhnZ_f3qqK%r}Em$Eu%^Ud-xef0H}pZqg%h# zYv3HG5P@8LwNCVMRKjH7FclN>)i$ltQz#n|giSwp@};Ns7QEV}l90Zu00P8gZN77o zWBo%OQ?Fn2kSDg$h^h1H))L!no&a4MR2~@MI6VS4guO+k@#Sy*Y!A2_f;xgXgEUM! z6S7&&47acY=4mPA2sM&0Jqdi)d1&wWZvwa8$F`V1lLn8LvEkkxXHc&nOB7x)b>BcioowmDAK2PzX0b@b6rLICh9sXI|nqVMKjO zsJV04uQB{v|sM4n){iD<=a6f;aoOa6YCfLGdtAIC|4-{bPeT3FFDA zNz2i+m&|kkQOAKXp12(~@X5E+-L}#)d-{%qYWxJ^^jomxIM@i{P@lLmfC zlWIb#wJ{7q1Y<>DsrM{Vaa{qK60b}@CTK=k7C%{rW!2gryGIXAW8ilbGhikr3Yai4 zsji?A00OvS^<3{%PXFvq(FP#3(4<%EFc@;E4==6P$lSY`!IBe4zbFqd*WJXI=DHT_ z_n@Z*L5^uA@D_^X3Nlpd?Zk2ncjn4bTYTfq_7&Qfj`6p33)Q48L2RrS(RHhyH5Zb4 zsX69?(@S%vy1Mjht#w&}`L$YtIs9vjMvn!u93V=@IO~Qon`Oc!Kq=_W_lBF9We7%G zj`X&Jfz0DDBb&kyy8FG%*=CL+rxz{bg4rDchR!P%k6ScK40c=WSQO8PFVRRJTC@YI z4sFup;s55Uha77^WV;$IggR6B$UINGH8nT7m*OqYvx|XHE#X?8I#6sJ*cwl}yJf*# z1z;-93;1uL8A4;)^B&1pM+MvXt{cL4rP*sn_b0dHs z21j!%VabES;BH43_6vSyL{)X^cHBI(NQr0sX=3%L%<$7*gHf)ntX`61B`t567P6t> zC+usef2?%%R#+Wfo&N^D>C2yx)S+5!4q%pC>}QCJo1b?c=IZxHR01BlDa#C(!#>dq ztoy1XL)F;UKB8jw?k}uo2aJOX4$;Pqun|VZ7uiHO{~u-N*d121M(fzN)!4Sx*lKLs z-mz`lW@Fp7Z8k}RCcQoPj{D(!JmdWdYwR`VUURbAkXz@#jm&nTuMNftwU6)n1{D80tz1|Mw~mZ-DnVIrrv`c0ly?SaQIl*J>$%)dzYD`AMV8JnbUoj5P(p3@SC zhl0D5T;91Fs3@x0E?;YlZGbf4HFAWBRBd?;$GhWe>7ims%l`BCN6}fOh0LeW5*mT z;Xl&rnt}q`;jwbvk?0o}#A)LA?Pl~=H!>&!lsuHHJT}02AOu>3ELqrTS3$($<_V_N z(#eQZTVC3(rBU@6)nm1>PoYxq;c0s#S(FZM1E zPWIzmMh<1FI*-kd=3<}%9mPorW8MzF+9M;N|6T<*>PA(WG$zZGMEj>Xo?XBitLs+l zzvHAKKQyZJ+C0&$k7O*_C3vA&`HPpIz|F21N)W^k^;8rvt7{#loXo}{$%uoxg?ZQSi9)kY;&$*!+KE42oalRtfLt@$Cn4- zF>+DBvsd_flItSDVX}n>%j5?K+-327EfYEh%_#uDf}&%j#3(o&DJ)8hhhfpa6nE8iMTto0>yDDbl);;^aBXL(L--j&WJ`>RNFip%jw z)d`7a`GT;bQS}W2u3ZQ&rzHq1;bRRV{2!X1nVc))g&?#tE;6yS%=8`8j<#^^tR-T4 zMj`ZA@~1}Dn?ZLaz=CXb5+N1RiKv}12Od*611-g^@CC>Jh|l`HAR8ZRJ*3AD+dk zqh;c`!Z>lRXP5MI$OzL6eCU8eO!lZI9hmUpM&vH{F#j2Et~rVpebzHbON3ltkRe>Vo}~; z)`|^po=CPTC=+feixuMowFEY%od6!3f>ik=Tmn(rF}abA7L@KGvr4rk@)jSItxf<` zY`z(Z7$mXcopZzVy+=pWe6);9nnH@`!6;doFe;FT1q|5|(88m3$@{$k_O$y>MfdTTJ7kk&O>`;r@|Kg3RMmF*C^8pn2I{NZZHf*O z{(}|-p+W10rY(4iQ^&E`}5h{3JYa#HBrnDsZ)U? zU7K1WM<~NQv7Y{@L_@0MM*ou)zA7eGP|jj%v$7~5@*f_4eKWQ5MxBuT zf|_v53977HiBU|k^R_|Xo$)RMz--kZyAbeCfq+P2xN*e^XUSrAGP~#M@P&CTn@DKf zG4y8G%-EJT7_UtR0<~XN*s3p7xG;!8yXL&)VR0djIyac+V;g1O1%#JRe?m<`Eq$JM zDW+|y+KKhf;rE$WGf^JUwaTw-l$u{tKf_5zcq8IEJ^aUZZw7vL|Jty z0J#K>>X&IxEZ5a_@+?K7BM5T-V&DxdgCfn&HNW^#hSQ9!bD3A%Bf6wf$eZn>t&Ogk zG3u6BwJNj|hknupx^VG=C-R#XkKE__U9{DpPsHsnQ@)Fqv{cGRLK16<#kZgwGAFv% zh2e63?`8f=lZNi=vunH&@TwGgS87vW4U8Ob&C^+4?+b{T{bYwBzAYGBPo45P7Zm^< z;b2rdxlzIM6oeHwiB8%#91u6DQW10P9>b7y)*vrKTmL0WdZc*uh(e#J53+)P6Q5W8 z_4_>3nK~(Z|8CyG6=o&jCpqk&KZ!&S))?`Prr%h3lR$hgcuC1X5?_;Np;NS|=YcY) zV%JWj(C?0LzM8(=!_vZsh&Zi!kJCd#PDz4M3Ia2O=>%vK5U8m{Vt%Q^@eQe->)5?b zkHbltzcNT0!>spFCT$&8cY=eh1yt{wvWP(BB&KBnYUUuECYtz6PVvsrXxK-h3KcAy zT5*qXIlh!*`deWbxsTu?0u^im5WoSCQcLvTfxC_|BJ-1DG_a##L#%||Iv+6~udgIb ztW@EYo2@XaXFV#3%Pfj(UK}0p39h9Uu;tdu`iz?}(a=?4C}HTb@oFK+i0sgks&(lc zC#XhX%KSN>L8!Q`1G>VnAkQ;YbmdZ&&6~4Y92-Jl-`j%;HaZ_Jm#-lKphS5@PUer4 zJc{iM7*wuZd9{;`{0B#~YMgD9`T(EdNt{v_-Oj(&0Rt7V)p@XsrbL-+BW#VLA9&H# z0gPAnQ4G4#?9|SE;_MfvUe<=%SD+U+#>$T9shpN$SxsbQWIr+R+}n+2XI8h9+D#(rOfQOV^eR{dwppUmJa+|4hn+899CG>M`@MHFo};{ zk%tNz&E%$3pL2uz$c=boU7qNmFLaF*c=!%)>uVX-{1S0`H@_#B04!v|GY83z?Q%ZJ!jF{I?A_?7QBiKTh>n>?H zPw%RjU3PXaNw07;N%Nr<3QJbI6s`T@Wi_%NE;;z9-avK zX2feI&XXyX;)ZeI5=aaaFL@zG{V%E|x5z&(ZZo}b?FWB)iqw9RzU-%5keVh2yl`ik z@|;J9ZFeN30$CKHB;hKClg0=yD)Fl|O0d)Jvou+W_+xb{(@UCFhz+`s-z?R6nr5O1 zqB;bQC>+ED!`n9268Yfu7D+!i1@4O&S^1g3;D2sf$y1Y!Nx^V5dOrHJ4#>-+!L0Ly zTezo^+k%KI2??~c33pLJNU7wcZAQTNRMxe+F=QK002LWfN`tDsAuWX;8lJ~M{LsM{{O%e7ghd6LKLL+15k46g;TEV=dG?8-h8uZr)62h)? z6eIBp>}aWq2vYD8Vf*+ok5SQ^>UVy5QRi5qWICciQ1gNGAMfWAl2zk+oNwEek6lu% zgP3eR0mG5>U>a4%1Pd}p{qJQhiRR}GX-}S`)_wS9h38oHCqJME(+9~EB-kSgerDC~IySr# zu@+i5*xkNmP#PWRfhJ8+moBM(&l5eA6~Xp%0)_$_A%&4ztL5sw5@M7*@jw#Y5w1wQ zN%o~C7>3VIrozsrmh^ufmZB~{Eflx0^7HFb-c=~6kw#AyC=jSIN-z$2{g`UdCwY@^ zxw$aeO3OnMB;0-i2_FhsYST#7`38Cb5N0Zrf@F(}CYQ3KRQb$6zRkT5%CqwoH4b~O z0*Y1J%<8;Wmlyjflj$Rx*>3!M&Ks8?5B2`g+(#($Sq#w&L6r0^dnk-E5Io$P z=|{u=ZEZnubgr>%CZjvcr@}o9by0h?o8yqXoDOK0%Ndm?|TDtaiSSCwj zbCsW;Kh>%c?3|OomETr05;t_smnD&Fb%5n2brG#y%Q3D*;m-6MlAUGFglW$HH;Zq&(<+=UbFUH1&9BUJ^QO z${MV?!X+Aq+9Ws|A5Djz?1wPlR+riS?LK=2n5|`DW&>5J^)Me1jFnm{aO8*ZEr1X9 z@IZwhArPfmrz5b*Snts=J{DHWhhxRs9(hr+Md3)xLY)RBcSi?e=gQVUJ@ zrv8?T`Xii`*Y%s6*&!r|4dYUwPNiZ1f`-C!aXV>sh};4)5@6xxPkh=B!5y zht+@#ThGA~4v>lk{5s}^9zzEqC@e;|`qd&9gNbTY-j)o(P$KQ&81xPOPiBQO)pxw0 zeXIs3+{+c7CNM`Br6p5DDpa1#Kl6dXV1`LPlzM@%{Rkv4;ny)1-Lp*KQI62=oa5}lzo_$|L}MuI2$h@9{$`FmL<+5{LAe>FHh*M(2n_pYAg z=oeMz7oN_qSd&fAP@${~Ykm5?%6`>@`4gDn4G;RTV3}$-C~fxP9se47kR}V$EI8?6_HuwoaQU?( zt?RQujbHQh=^v1vzw{lC(+z*@)-(U|sx5^jybM7Jyi&=AV_8hib*~Wcf{ogQL5tx(V<*(S4nmE11$<=(9p%-T^1kUj$C$S@*`{-RZm(kgn6fJkwq8oAcu7C;_LxhjxNvs4XMj{C16IQUN226!|=BjRl1 zV|jwDOA(nYa|RPgwznQsG|S*x+C|HRh-9|soc{4OO-D4H?JKP?hsMbTs+f5dXo&2d zGK4D~nrRqm?me8fbgVwa1a#G`aE20xXkQk<5~r0!_9vm&2npjv&eQ&g?&xmr zxWIAdqE0G7c~uB88Hl4Kyx=F8v5!ZOUh}~LcW#kB;I~YmfME-#k=&CQ7o5gagAcAV z_H2*0&Czv8rp^mS^G3>*b%Z^I`^Gs}v?oZqfL`@e@*Eo>AH-Is9Be{n5E%7G=jLTR z8{a%S7BQh-xR2|<3=DcLPun4< ziql`*g4eEJVkE${Vpp_l06@jgN?B2|@@;m@ZD8d11RCdj74n&1gQulo3d{x52FWv zhvwH9j669A)Q86Y^NZ}C{ZYX;^~`t_l8`iQZ@8M&0rTr0W-eFw7op6lk^W#=SZZ|$ zA=N5nR!bBoIr({#I7v!Qh}3O+CK=DXb%QYMXQrht`oA9fQws43@yUGGQkR{iWbFviiqQ8l%(d+Uw*cM$JBGBCkJU zmX9bfyd|9sDt0kaZt#B0_%y0PIm30pbU}l(s-}`p&Jdh;2cQ!v0#iu+BEHy`tW%i9 zd*w^0(FI9C%A^6Ivhf3FrXTXNLM1)o$IKns=L5Pq08T^?nl(p68>|$9WlIUWY|-D8 z;Ef&*<;L^-uau#4C`pbsBom&@N%Vy{6Vo1G_o==SHZ{- zQUUs``4-TNw1|9*rCubCjhIx-2I1Y(XlY%ITK6{;AcF#7M>jOWFfxQC#PG>v=xLS! zeLOcDxYBn*fHJ>9tyDyIqvH*s$+KRVIBqlQOILU!k*2U!3Yu9eL&q*rkjY%GUNBLJ zr%k4J(dyUILLFI9S!R^gBJjK_0ZV>9wpi+yi=cF-An|Yx-Fb>*_q@_=!~ExIXwnb` z`d%~w$1AtURF`p0@N}w1GD`!A0eJO9MENChkb7j|84a6l;(@r~uTiyUu5v0pisVsN zH}W6!=aq6KGquo=3vvPnJ=AKgmzXA%A26i|Z%bJIGVZu0;`kjBL>J;Cwm9tvErzK|WKS~?KL=T9LTTRnVHpyEv z3JS@s)0oN2LyQ+(XXfP;efboT^F(*M*Wxn}q@?%UKXw3}(80A{b;p%u%GZT0yyHY*b(u(Uea21{4edfKp`^ zK1xc1ualSdyj?PBltxlQ(R%y@!%@{&BFpN*gTC-mxVyRKO0vW_#pO_lZEkHP>q907 zPWgc)XUc_8YbkbJRus&xP^3SP5IB7AiKe_3ts9A=|44s$7t}XD5hx$9Wnv|87c$X$EGa)eQT2T!JJhjsd56R9ZWyv>Y4Ren;IA@T`CAv!R^p0e*GyQFw zA0#lX59A2^X*T#M2akT9U!a)rG#V6)y(I5o(@}A5#G@X;Fz9uw!H^BOz?} zKf(^WFC9i2rQiiyKu~KxD2*+*oj=HR9>rmv>?}jH6vi9bLB}g6qHZCpkmJDv1GGbw z`V)RzR7rpgJGBnVc^U98=%yDT#UIjShyhq?pd!U&$dLwQ5E9;x%fih`5l57vgRVb` zT(IKh>Nhqdik3LY6QyGT(8Pl3;DoeQk>Ld`%E7W~p~I$P5fXR^unFb#r=+x{;5~@` zmh7l7chRfklU%Bw4?~+^V*5j!6(cc^)vCNhn?zwS0#*{Xb7N?q;cxMbf$4%?8jaF9 z@_n!k;!*)fi0}MMbm9s|VP>42zY=n!>c`JF+5OOBAWyBm$?O?{;X)SUAec_0!$rDm zqze|4$rN+a?PO+38)7)Yg=VPK*&L!ey;t;#eZ;jcNT^s2SnvHgu*g$0;Xkf(f1cqe zm&H>0yBItcUH%f`wm>|3*DzWx`NB$(i$ryR$y&LVVI(}8t2o+tZRRy-r=0xs=an;m zWsSk6YAYMabhbVO7%>|wuh!$Gsr(md6f=^fCo;C9QFpeaK4-p(OY#OMFQ?2uF1ZY_ z`sB3M=%q1=EjPYS($N1_BMp?~GDmFu6`5!49LH^ zM!9=vC*^qhFhCPtY=Uq1L4~7hV3JXtTn=@0qBsNn7< zJG4~wdB0u2<=SqP>O!gcqUtHFx;gYQx%?GTD}ZSVVxBvzD^Zg##XU`}$v6=m((hmH zWLzl;j;XscK$BA14~{z)rJ`=BI?;m-$>sP}w<^7)k+a+)X71T1NR8UZ3+y};WwU2L z;Sgy>>~__SoE)CZ*3jC7Jfa2afwoON8fAEOVxtTI?L_wMfBs(LK+hsuA@@WIgP1s`*H~#zKSXj!hv%cykL#$0?Q04D3z% z7CdBN5;!LpXQ%jX?B$hJ-GPZmv_7gGZy&uDr*q!)>4JB_{hV&JivUn3SL8C6$UccG zk#+#`9a51ULn+b^B!LRJ2!e_g#=44+agS`z-ZE#P--cbiy)1dZ0j? z2cXAl*lCSy*P-&|BK;303v;jV{y1&ILfNPwyULPmphKNaSRNv&gWzxb6)-~14_Sxv zLJ$1D)%dsLO zmtgarXzYVqaj6Nx1=+(S&0Ec^Z}cILdTc`kA}MXKSt@&2|KJ~T;G%}bHcA!Z)_12Z z<-sctb3(OVt;cr166<~9pkeHI{~2au+?8AHTHV~g3y77?*!Y8{5!WD(Y=lJ9xnvCJ zc$8F+u=+edTQ?S>%ApJC6((%tjv|S)BJ$J^lT3Q|AYvSq@J8Na38=>SL2%RKv_^3b zIRr{w81vFQcUrXfksyr)ev`%9aoVh5o!6lVZoHA!g`-+evCkRjk(N@E1#eF=vLGPD&d zkn%&T4{bc^>;7G%#;*}BC1$rq>V&^?QpMF{0~;0)NNRpAfR0C%d%Q^xAy0PH5TwK+9MgOtkIO^4jEX?;f60>_n_lRDijjXUhlD>ea zZn6{=#jLbam=g|!u{<8ZsFrqW2s>^i?};yS{_#t@k7}w*oW^0uOd6ha+rm>Zva~5I z_B?FRqV$pdSc!Gh#K_4?Qjv!kP5RCG9lkOrB_b!w)UE;iCuH&V)&=0TP)jB3c}a70 zU=avPYFYlmiFbbDXkaA(^1*&X$@~SASl3r1eQt$pdLb-DF9$tZEXn<>A!$-ABu6%W zGc5s8VP6~GQwB0AX>m!T@MEe}UX+64rZBvl9|1;z+i9+0xrN~14JXQ3hI5)Qq9Qd(I4*UFj+Nt_(Y$K@;ME1)Dzx+jXafW1 zOy(_Sjs1xfut~C8XXTNSuXJ2;mgPX2lWZ9E{gC^TeEgr3+Oapb3Wt}=nf zu^RiTZ=h0FFAiuy5$PiWm3i4XDLWV3UUx{NI1P2YctL`G$rWLqcK0U<8^c&PW$f(4 z$!ap4eQ*%Y?x+)LM@EHMlhhIOHi8!^pYot7HAA)F2QchX+h+r{WFn#Hoo~&ixb#86 zYrNzYIGp4uqXIdtM>H4$ol8w}9(A-_BNe0QHYDmh`N!&QTCj>p&p7M$q{Wl@6tWz( z>c&-$+_P|Wwkz1>HQKVKaXehF=i3+8=d(WA@Ykk}zT?vK(tPV%&2U&21%1OJb;PPh z_!YuhCZJ~t<6115g~EaEr+zq9SrKq)ic<88wVDV^sziA?;lfufcne0=H*(z;j7Dsi zID??P&f>tlYt{eyLMwG-lHSTxp`Z(XSgtoja^#6CFv7Qm{h|B~wop4LV-PR5S6OAB zO>~Etyxv>~rG$n?t`*gfTN#|CKpZpvi0oKu6kzh2wsJJ&0mV1k@_UHeO~a}q?LabU z$JlcJ9sHe+n02e#XzeT!{}00?ZV7z^>TH95Dw$!hNBwlt zv#w2sKCf5|X`%Ph{GAlD{c!m~$(l7sT3uT&m;vxPdGd8s*wq1u7ZLO zBj8@sg04dBM1=~gaOV{GJNFAKXKD*vq=Ahejf;X|2huOXdF(X9PQugH;e=d!_V$Fu zS+ySra;hODc?yk|d*3DrhrllSz>a!f5X(-+i$pt92}KqENKTwu*;KuZvJoS?!?nRb zgF+*4>r*90_|(%wMWr`P0Hx`Hz~7m$_IMW}#RJdmA>NF;&tlKcG(d zZnWXt0eY)*vud;?jcO*7-4%@Uf|k5#ZoD4OpoBb!?|f|7NOeq(o;bE$8tRd*<{BQ` zcuB;Z?aq_-Q*B-ffz4vUH#tY~# zhsiBf4c?~^!Lx)%;Pe<3M4E0P3Ro7%ppFP?&OTi%gL4O?)s-;`%1)`F!VV$xn>b;> zm2#~9+Ydfu-}%*BgwgJR7?NW3mP4!Oq;F2QWASU3)1Wy~jIhN=5OSY2p5kzb89Uk58tl0*OA4EP9oQO?E_ulq zHq+I2aQZBiL$+D7@`;^!diu_d_c8<`@p;E0g)HL<=dzB;j7&{I!cEL7do`{2{sHqR zEm#u+>kX`M=w717Xvx)}&k~f&o$0231N;<57YuKav@lwp^+gSHpzv@*zUj+*N_OnP zG~+{31eX$q$HR&*6^BSf7yx5e0ESY3h&hYi)L`^L{aZD#%ZPs)A)2{|Ti?2kyTYA2OW6<0>34 zc~vl~df04}+RWqUD(x+W^*esgE&iUn?L}7M26w>^JMl{?(&^lsZgX60fvAOiX}~*qn@4nEQL1e8 znIF4C#&`$mh)qoDEcXlq)AbiPx$MD*{=TEGH{O=zBt@pG25{HHZt#1cgukTakSi*N zfJUOx&Z^%WIwql>dx?h%ztbeHtZj%EjAt>FA_!()_JZu@?%+E*(?~4aJ?DQZ$iqwg zs#c`v9uJ{w%Bm|9GU-UcaXX3h^_-AlAYlC4f4}S(NLLY2rYU78BjUo;LyJ^Lu~N{> zg^G1+-AdO zg+!y(&WdIi{=?r)Lr7Kn?P-RxdlHf9b(BnT1M3@n9!0}5;DVB~U< zd-HGNr(zz^?LYV@EMf5h>?eBMkyPPG6jZB>v{q(l<=e>a zw(0c@)6!?@aQdMqHBEI*f#+3d=ndj3j=C&{PWx5-T7_WiwYF#ECy*PF+kj3Jkv8o( z)BRU9%{&s^#n^YT_uk;M2~#YoH5QrVD_K+=XA#xO+Mk@@R^;yb5e|czs)f>s6Q=hN zfS+u}yjvOBs74jZaB&{39dUogZA#p#9s|KQemr{mu@>s@Z1oplMWbPl&tU2biUz?F zlwOfly^3~ah?NYYg?+G0ywZA*l2Zc+W7FZGY&9r5-0$!^(m=^c2ofwF9&6MsmU&Ik z$(s?a0a8mbwry)6R*)zMy9@P87?!mpP=}s?m51={g*k+j>OL-I^egi5*l|F%xqrw> z%jVk?x$ee&)k?7qs;FuwTHrkQ%#Q88EOvH%DP53K0{UXg+Tg>eN_vfyMJ0?LZA06t zpP1;Oz|m7u;2%E7+W6#FTKuUhZy`C`$O zzel7-Ze;wB)X(;WNkfN}^&aG21dxl1_l9~%F`fkQ`1T;Sui;?D6N6DQ8DAa?>w^*n zn10$KyoVhpfSER#w z22Veak#FcHh&L5er&IVS;-SWv=*D0dG&%HTCgRfa$$jO!RR0La=~INPH6)j32&jgK9V z8_Bbsn`g*e)ly&Iq^qaR*e}20;4|loCw6c9oy{?43XdgQ4hL_piy0=Dj+`q#(n*Y2 z*TzYQh@Z4oTVyE*nF29XVas>27`gsJ#BhKXx6Z$xp~*}I3gc~V0DKSXQ3|IH+rWa% zF_CUv%2e@8bn=mh7`0M5W+9b%wdhUMsAqCf=5r!#rqD+g(m1Lv9Qx6FXue^E9c4(R5Ftp zgW9!7R#j&J25=ygaN=Y-ZC_V3({Z}`D~wr0{&5v{3HiRy6rke@8iD3YF%}*i3VO?h z7GQIm(T(GorjTwFl&>9DEI8>M7d*16> zv?^>s1USMrszl3;n)vHyN3Mye1wbv8+l}+)niVm-TxZSTywIB^OLf1fLfIHNRgR!S zhH*AiE~15JB##75DD}p(!-gQ`dH8S1{2sQ!S!^JTx({NzPpvG7re;cU(q)Oti=A61 zE~pVii|I*i56kdPk)Fkm;8K&*GMYE>r+5Y^P~i&BUR)Ikn${3v3k&d2B3I!s{C3v#12 z>3jRM*cxP>?TY<-iG*z5zIy&tqRfr505Wy+dskGMk$;{bc-V-)3AVIAzMDn+ov04< zR@=jQbt;ZS{0e_@fpW2C-vd1zp6?~jAkIAmK&FW|g`iJG-T=($*2kp*UAn(!hH4n9P|E|)}>$ozNR*qi9{sD0&N-pKra5gi#BLj@yljPc@~+Rv6enbw{70OB*7 zJvF*eKQYqTBj})j`sX}57}ISYK`aoRwnU$PVC?faZ~v@oDSzr@mMC^&f>psEQ_c6K zv4Ie7rB-khDX+4?(=nmC`<>$(a~0J_VBpB#Zn*}T@8igpK3o$ zMAEzC_r9GH^%d>09S_bmX5Rnn-@bijwO0t|j2R}{S*8SwZaFQ_ToRXnAT(rEl8!jCsTxj7gZ2fVZuU#b3E zdP%9k#vs6hfZYFUoE7|Eq?fIcy@j!xt%Z@Zm65%jgQ=PAf5exzj_Q^amj7D)dDikO zxjJ02{l+L|7jj4-LMsF{K*Et)&S1n<5S756loPVC`L}m3ar<(q69;{LGkt)|&+*i}>N|e(0f+n@5nFzlR^=PH`6Liw4Tnz^i_EB^S%W%NM^~nGC5Z6w8TJ z&>R?*MmzZU{G^RNQ_egw&Ku@s7$IQg%TpFmIARSut$(jpXeylrB;3DE5@ja{t(dXI zr)6cvHn;Sz`DUK1VB=t&{m`$Ub0JLiCaoi;jn>mtR`{8Q?C7Q$wFd1Fk~34ryg=9c z?Il@UH^G*a(Y5eby|?mr=Y&!-B7=IA)2qW7B8`w&oD+j#ubl1EhaOM5fCdaR%30#c zE_%H&;UCbPc`Pm1DUhXOo9ktn@YZF{pEA!@=D z2Z~e5fbYmHU!lo1)t-TyzM(_~p;dP+!#h}qKVfPJ@rG^^aEKq^j{@72h(D974`*8f zk6NC(!RHu{%p4)yS6DOLid8MTSA#~3MMCE<)cbyOy_C8x^hxi(*Vn!-)bsuasmTz} zBeCz_Roo{I%Lq|4S={0a;)wI=>FIQj&;GJUoKIljNBQ)9OtU;ZJ^k?fTJ$>l*JpI~ zQLrM_2ln9~U}@xSOEnxhF)2lV60jH^G^N#7RNM-CaU~S zAp*x(=#R12|D>E`*1@!EAt7Bv{JRjJnkKl76`=$L$Y*S1efox^2<$jlbUzwu#g6&7 z>6k@k>`8dBe}BMmBdv*2Pa#J(PP_;L!+7Vr41)`stXbZhnjD0|O1R|iTm~V$gh2lE=8P-$NZYCK zq|d<*Bm^b(Dobd}%cy(&TlhK8aB!ks(dspzXhUr%HNBwan_3uPJ~095mrNt;c69>~ zp@ICEaivC4NWa)5&jT;2fSkC$9EM_l#JXRE3;K3AErIk z6JhNYoubtwdsEmVgl)szU{`3SCmu+$9`I%$@+g&dAd_JEt)I~$**t&1B{IF)vj^>0`7j36}(jL&DGl z8T*?f93vdn({iX7?E|*`kWK|kXoth#O0=*}uuhJp7{~vA)bzNT`@g-U21Whfk%8Hq zaEb6CT^6kfRf4xd?2b7nd^~7jMIS&Ahx|9gFpY;laROzk=288iZcGBgX;^|_RchrD z^_4O^DA`byU8B{UY=DrtZ#AfXCafY?%v_|VTKOQ5nR)X)(q`sJY+zMM{fRu=Nh#tP z!hb|nu7#rtAlt=$?Fao3x%5nTE5kB{%7e%ZgiFmWg3rgS93tmNk5a2pXi$h10gWBE zjg=gl4oSNJi^ZfW@Dk?`zbo(;7n!$E5-QtFRBz1|{Km!=_!}7g#i{tSuWZpk^&-4n z#b>f*EV_iH$!IvEQrxZ)UY}ANw{oItwsgDpyNnH7>vu)A)Up+fLv$&XHF+9UbPGI= zyUtpF`tA ztjA>xcA&tVsM?upvwc$agnnJ|qc-2tG+;4<7%(z9TD8QUs0#ED{AlsRrEJSwd~9Gg$!Vi8gx1G9cDZf`^huO1|e|I zqb*ptHWJr+LIgr2wje)v%r`sTq6XRIb?+OFxqhw9Fh)Yvxw?E2G-?IIn)hYDXPrqp zq5m>oAl{*{Aa>w&fm7caTC2x1JJP$$;u5^QgG@eKG2X99fHjDLXaBPv2Z>FRd}^>W z;oVr3-Wu3=-Rwjfbo<)U(+1dJjwz7_iSl(E=j%W}W*=-<;Qb!#^`N0*bzPYJ*ibRx zYlDS(^ZXmoZqk&$TPuawU|19OxQ5-zz68ax+w#l0YjRZBG9g^c&0UVVb7EA(wqfhn zAq8=q-9G&@G@~f#sxFegH#JOHe4K39{_YFn00VY$FIkY@`5Zt3je9-+B(b2g?Wx@8ZN<#aDJZ8hQ_LT@qMk4wv?mf_a(ixg){#C%uHPuQM&6izvJLjjxD(Qgyc5d zu`JfOZp#F7M_adgvSi{fL_!FfZ+kAsGvKEaAh*wd2&BLNg?#67G$R*M$eb5haL}I@ zP7Xw8{63zS{EOCO*tFAzOa~pgk@*Vs`iH*dip288^kmDVoG;X~fXPRYxhqb90k(%LaRxNLqSeb?u%q5v)SHb(;E{^C zP4mz&(YIHlvaQ+EZ0x4VCiMzmS^NDqizL9fj{hn>`2=pmX!P&7cCzIM^F8?KLXyQ9 zTe(*4j%SqDk-V*=qvZCaQW&@o90wKK%EO3eiG#~fQ$faDFMrE->tx9E-~`Od17Q|9 zd!t&O{V&f;&xMyyp~6aVzT}yUv7J&mYrSN|AbX0=!_zye2@F1h46FGy#!1w+dqMzd zvsje_Y)5V!i|j1L92X`7r#^UIWb{(lPPpH%Yt#p&UA*I$VFA+iI~NStUTxotl-)|; z1*FHOQ-u+9;D(46;eDlTn|B^$T!9DKhL@>a*tCvM&GH?QkR%P|=`2j%@~T!Fyt$AD zq1l(-zZGd=o+=U9@sau90ICFJ)mvcY%VCP+5v`nki2sh|N{rK}L(j^3_2{8PeXotL zE44wgzq(i6;;-XPC3rd`m){>9MXXNs-kqt82W~z7v%2%NALptKDKDg!@+Z73?%i#X zSMJ3%R7rNITd5kJ+|1A-d}c{r8|`dPxY(i!q^WNghu+))76E5FwS zsvDrGlZor{J4y({?iNA21=cLYl_Zz;Mb`iVnIn~w&r65PI>Q?W^bX$s#<{{U5z=M0 z(Um*#ac}F{-<8q1Va6i@cYp%Qjc~oWURJ&BmTMW*!JxO+S?#mNGf+qudS?ZZpdwB5 z@0ke1j_q&6pP&#}bvpd^_S?YfPbi(#^|2u=HxfdF8*1W{0!5<_>pus%l`QxCZmY3F zf1z%W%O--l{;uo%TSjC(dpOt-()Nm{9TQ1~)DN`F_mkd{I#g9T&q4Nlb0+OQL2`@a zn*K_&^3CI|4nDx%GwsCR`}H^b_b9*BCV#$Rp8RVY)$p9l*;`%y@8MHmOvP{U$D+wB zy!Y3EiQ4Idhou{_e+BtnJyF^NzszhiSs64H<2j371T`=BZc4I zaTVTmR1$~60^PC1Mch8%h|O2jX=6PZT{H%bC!98o@5=V{o8Ie#-*-x{pEvN$W5rEABiA+qn+wNQOgwbw^A0xP0K$Pjmy4+i!oivPp6RU->K*`HDkHqZu@i6q0*VBYrDCjTu z^{)4C9AEqa_4RF&u8gc|bZ55a<+zz<4D(#{t}#Yyv6rij(Xek(3*16D4J3;4qjmg2-@Yg=+ z{Dyg70$U}`?~nEaDQm?ahBhUgR@)1dZpNmxUAXYi-`b&;C6!R`i*<| zODy8=>+M$QP!v%^NMKGU9kW_OtrJ6!5AGWU&=zV-J(WRR1jYu*NPz!oRsO*hUE~&? zNKB%JMmy-quf^YN)7AIIy$hpMvA{l!{nr~iX+oPu-6O#kD+7FoEfOUShOz7>zgv)- zS$LT8mUeI#=hWZCM!MMPD5!e{(<6Kpn+Ouy?$F7O4E^1k<4EyuI`GLob!e3&5aqsl zOBDp8+i2u!iF2slByGSPk3PYG=q|S~={Cw@2z=H*XBP#t+_opskU!++0_)@te{%mN zf1$#M>Kmw?w9(g18~E40dgot6*U5bK#%Zx0RsMH^`53-6{1}G@yt)gDy(ej6ydC=x zhyAB;FYXyo`7hBwhYhK3{Mu+uTrY9z^qAN6eSNDS3j9mfiG7vFp=j&VS6YGKssAR; z8-R;w9=6#0)qEhh_}20{_PzJ2cT$v0;%OZNd5XRnR$0Oc3B~8SPt#m-ABnvZ%GCW- z`8Fwg$u}++ znEWyl=ExHo|%eY?+<^PZp3!-DHA?$olnI4hdCjB+Vt~=+FLqzDZuhx7rNydl_ zRcE1=V#xFrwj7z+1wB4Da9#MRt2QgQopDBie|Zx7NP^5=RmR_3?pmlqCgKnqd(sk; zX8${YkCx+o*5yl9!jd;r=H|)S*uZPS75!}~j9%_PYG1}2R`d(U@I16$f6?u#iT4?7 zY!57aSChl5vGT*-ELC1ZHM+7Xth89;ZN+uacM{9g*%Sx z+zTv=VL|E6^b`QK?*&$G{|l^$LY!XaV+#C+%H+Zsm`%)b{;Q(nyhE1xUixX0H?fqO zYrwd{%h-frV)cZ+)Wy>bS;xAUTeVl$SQQ6W4Q6CFbq>FYPlFtILFW9uLgM!PDHC=h zvce;4U&O|0IsCGzKjeONztYMhD0H$Hcolmb+Eud}FIf8$tKVIEYruh(Y8f|zu{HlM z)_;HhTd2?8Uf?=-AJ(10WAKWecD;yIU$yR+V@Ev36b&YP#tWpGZF1+A6 zbH_pbeUUO=B&FLHo7?GkL43+^7k-JD9v$5KZ-PMfNw3$1(9zV^??fz>Ju0P?g5=AomKt)8`k^cE{qv;dkWV##lHio3 zb7dYJ8pNilQTGBZV8ZfaL4>K3XLEtG;kUH6lvU29M(3&w6XuuUV@xxkj$g{Cr9bG# zQJqM}vzg6Ka?P$GR^jKbiAN10vI|Oet+dr(_>^;{0VWn&pBTH<3ahv)tDdiW%HF?X zKZ4s-Io{~9>+l-@{s`~@OQ{c;kEXc#D?hOdGcU4tenom$3BF%HVR)tbV}2O#&z0F+ z`2B&(i!8)!oWc384oR$NR8NAHsvv}oNbdi>sWusDwG-)N9g|~784sO@^0PA;f_#{0 zP-6`Ec-c*36|77SEuWa{a_TWk70+5meK-b6Ttpp-gPdJ!sZF2YJ5Gz#pt4`RbK)xz6z69jbWXF z5g2Vo&d!H=MDEU5{TxbL1HH?;T3o=FrWm-y>BO~k>I3y!kji^0OyNc5jaMyu$DQpv zn0hjx1Px9sb*-88Z)$9fug_}7sa&zHnbn^(bEaX#NuIhMiCf>Ax+$^Ol&SjCX8nzDF79#X7-HxcRzpFUF!i$pMb zl{m4Ty^8&t(^b=!B$(&{VD(=rZLQl_bxR!EtEhMD6H06W`$)*CIZsLY32R;mP+Mwdy;DL3RuY`PKAQkicEhtdAd4RUK!PnRc94Nnhun7|Xa$bUa zYVRam=5V2I;r^oy=FefBhUM*DdmKnfcA<0@c!(kRG2g~$FEC}l%x0mjw8^;e&rI`% z##x|f@3WE{4ncS^hoE05wo=|f;B*&~x{T_lmn||16zJUt{DO7E-=}o}Kd2*mkCS;C z!ygisBoORCfx;Icp7YGRY-51-H5H68BJJVA=NBCrxX5L~@vvI_G~t3q?$NsQrv+hE zt+H-=>@25YP^?8%s}4%J0oKLDIM!Sf&9M0U(BO78P@j;)>%M}_*qGHuWw<%C`Pmxk z)fO{kID+$m@TH-WuQRboR;7!2J*(UMmcOcIlOECjqc3a#qTUX^=W?>#PSFAGY_hJZ zwq5+VumM*4{%U-qoO)H9PiCIxB+~s9w*97xZ-z zk`d~mK~f2v2!%HC3V7QLyyv{Dcy%}QIF39wocoVcnaNtXnDYSGhgMgx7Vjt3j+n30 zPU#90d`LBwTB6{b_WyNSXzQ0Dlt{#60ut;h`2XRw0G$7&uKW*S@;`9+{|oIZ*!w?d zSEG1)5}_A$e6AVar6kPXAFj^br3sVqk%KCmfK;aXCa1T@&s)#w$kx*fSCz zNOAs-FShDaQRJ7G*N=oCfs(#UK{fsODAQ95>Yzq85P98~*zmI|B7S3PO8t81f3U81 zSG3>$i*^0qba-BJmj6&)zaZ)G%~|4v^qH8joK&?FBpseHAfLt2dhxb>@~1z5#KX`1 zA3XfCp40!q!xJO%@JKp*R!wP@BKR&@#mWl`2d6KCh2P=5uT8~>!QF^ET_gSv9exo>hv%TocC;genX}yl<3CJ}O0%{- zIS3^IT1>`M^3}CKo+(H^yxfZDNIy0~{`E7L_j>=~!;AgH!!uV@McqVh-4XjmA@T54 zxu*%(70!{*bK}k3RERp_|KZ`&QH}XOCRLS&hb0}D-;nIbu~gi#4qLZtb);aW-6=AYhVTdN#mK>%3;NeH1NIX0`VAn7a_dImnTJtSu z*nj!(I~R37JN*;9_duaPiS7(-#nPDili0FHlvwtNI`p4&D!S>N3%0@dntX2i<)dR} z1nmp4#rMh^k<7o)m?GgEeayY3jR=!7VP`g+V{9Bb`K*|prA2%1*w2f7-7f81-dRYl ztI=e!?akQ!FhF|HE?~bt`-d2g3IXoO<-Eluwb?$zZOAOe!i!IKWuqdIUotPwYfgtv zlhO(UsQ<6nIcI~pJrYn*3Z$N(@cn;?9p^us@;}lMfLx(VZa1j1XiPA^^9OpLM0YlQ ztMi30zaVV2D}So7BxLXvTI<@nDIO9;G90yvJryV6y^4wa0Ydh?EwmocR z#hgn_6V1#2x)2Np_mBHuC>uT8UsQ1VKSmiLPRZl);D-X@2yt3O)cE86j$B;T}Cv6_V+2L*h6A71)F_5k?qHq;3Gcsh!xSZ+L9_ghEY zZMH&bAL34LFP5RSkTdY(`R+}>z&Z$cJlFDh$fLcvNA>fA&il{giHZ3?T!DS4=0C6Y zu0Pyb#f^jEkPD_f_~XS+*4eu6EmUCrSm5ps=0Pjo2Jgm)XNo^Qo;|7~b}w%C=4l_7 zw;LV7@J4(`#KY}iq1^4o#RYsD3B$cDfu5a0&&uv0C$wU1$k$q)#L=z+ZC<{J$2eNV z6e-jzF!p(_e10_Bkte=j)+?=|C{bs$9p#lWcz6! zAK)cI4<$y3$BPPqb?66L#Pu$+E8zTK_$L1PA9%}4#No-j+sWy;dS4;+lPzgaWL{;9^z38S?}%1 z8TjGE(H|N$P7}A@?sa7onK1%>H;5P~LDaN9T)}b&9oKw);gIDsXaz!n^9(8qbU1>& z9u986-~)@t`_bjp(*C10hIRN2VxH0;_P7eZ`?LC2ocS8rMTlEZ=;L-pzmZtmmqnWc zSe|C1&t2S&->ekk#;S_uXdl1bAG-eMgz45m0I{CC2CeODGOSJKS=q?%azu(?wfyM#Q+psHMxA8R5 zJ}B_`@?_1en`TTIXxqKIl}B8AAkH6-J%6<)Jl-1|b%XDk<^f~!>?1(>2ju%2_~^?$ zT#kP_54Z*HmE*+g)zky(TJA1s!M6UTE}nt! zw*KGp@%|nd=lQ~I#DTA`!r2lrgT0E#fCu+ySLu4+9Zj-VEh4B=s$zq{ zeJzGDZ|}}uRQ2iiSMbg)z+u*g{TI8fNg&pRLGoE@~8 z4LZsV^Zs*fcRd0kuY#G2-bPs6lmOln{h(F>%fEsd@Dkpf$^r8>(Rv@*^zR!i_w8Fn zSx{rLOQ#!QsCcEIl=Fo@H#y?kXgdN#^-ERU8%J1~%nT8LsAR{7V{sy7n0Akqrj4Kh zJAa?NMV7PoN?2!)Mh>zNyLdGL&T?I&%^-dqom*A0S1}J=fakV5$U&-rJgunM-`-pg zR?7RT(@>w~j1R+8Tq?O3ySr@q)vLhlxSj*$I25}b-;ceA zN6H)|#QA5*@q`C8>xjbkJ{X>=Eu?3qzJ$f>DJZjFP7rxpDz9;S%hC`=%HbnS?Z+#8 z^x8Z*^|6=#wi6W2KJ@`6D)Y|H8?$fvyo9{d7_)!39>;pa6KLICqh#YS0{ku+(53k9 zG2>JR226Eyb-l6fU6R^c#(di5@1}V6X9`Gl{dKb!nOD6$dWe3X1^HJL!33*vi!P2O z@UXJqx&bXmft4vZ7~AVxP2p^p{nhF+HF*+ z+E>^&Yha>#3SdEau4si9L?jP>hnjI}VKs40c3QgD51$Wu(r|neCu&V*d!FgmbkLZc zb9Fa$HdQdJbTW>=`;+`||J~t}H-|x_dmf_oq8bfc+qexz!-Avn?f!GB)|&SQ7gIx~ z6OQYcB1nQGRW{7fJmi0mb`yk@+P%T6*FW*P3EE zy0mr>oGtiv3$Cm3JZS}nE_Akj!$JZxy||argf83pL-lT^XgfYO#Z5?PHN$5HS5>P- z0>4fWF?Bjn*;inYk;D*vXlvaCK|#@0ReIMbFkEfzHNcT(j4v-TiA8?|H3{T-QQ}9} zqRb~FPD&iZdd}|!^%2v{%dt<(Z6k*9X#e!jr%8=mbj;|9ZWbL1S;8~pvbrztdU{ubr|2I+C?E{)J-ZL2ts zb2}U-;A~10wPd>BQq@B^rnEccYo2R{{|`WS+AlxEX47j8*0i2>=ho}<`Agg@rr^C^N z$}=)#bM>l}9}T`QJ>wj@dh~woX{HsO>k> ze#jO%y}`cQU*`f^6(JVhdHnYQkiGj7ADSgjn8X1?&d@A zGoBBkH%8_^7=hj}VSxTN*JKZFJLz8P#-3SCUgguR3zfoU+CFr%6ClV>Pv?(;E<7&U zg3Y;tBl@f>1QsxwhD7%VV^8~y?QdwE$bOgD@~oZWmQ*~07~}a6oId!p5d)$J4(YK( z%9vp;JcAg$7*tWl&*a2!B&wIojwQ#PXw9lzQF4Dht~$b)(DAGsO?<5tpHV(`T%0n= z%8>4YR)n=N?W-*FB%z5Wxh0R-oDVDRE}Ll^!XS>>=VX<%adx310SEpZ(X!n6O}?NO zBQ%6a4xv#}eyxcf8FI9w0ojl~?0SL=De2jcWvB`aGl254x0R`(a-G0sUVYZ#-R1eU z$8qLz72ZRlKfAty6L;6%Vn{SVe>|) z6d``u6C6Xnuj#3Sp2{=3*7S!@wkX6&`CX}G@vO?*P1c-Fyuu+0fUagbyMCDdn|T?= z&!`R@S=+{+tE7)SY9i8?HtE92?{(VoCmHR|whb2=q=#$nREx0TQAS_6Bp7mo+TW3= zo0iWJhA>UoNyzFf1wk{nbHgACO7#mndkW7+Q>_X(sMwN+x|zD8L@%b4>mFymo_Gjm z3q@ak5zrH9@Rz_M0+hv_&9_})Wth%3VR)Ql47=I5)2Kc77Z2F=gHAM_>~UAIW>*n@ zt=cHN^QAUL#BTKVq8$fHpQG|WVk+P7L`SL?v0QbG@ruPZ!^7;se*XaFjqupF{#nuz)pTxN^WqI;>(#L?#SD6`h22~dQ#TEe ziR`D?c4uz@LlobZh5v8gb5Q38A?=?Eow=osQpH~djJGmw=iWWk?NpvCq{;(xMKKE3RF;8Kh(ZhDeSQio;@Ovy(>%;lgKIR?C;fW;YyGqSgH8QDHM*;+ z&2e5pi!MIfbl#DU-yx-v+}Kh@rNVvT%`|=cUOqh0i*lo88N15Bi;tSEOKSF+ylkxbYm@P5UJz6=&Y$_6?pSMVQ^4wwkk!n1reVoSlY+buT{{EO#RAbGx z+~XC`huWm*r&;%MX$>QHPcyAUbQG#PGnR7#ddJ!weySMajcj9*9=C@}O3&9WqvK~& z=7t=G#BmsJJ=v!UWnG1Mi@qI-{wW z+fRJ+V}CrD%XTOwx+;Y7<#AF)hOHF3<^v|6jtL!z|94^i`2qOhcf%jDcgJ=d_@I)XfXP!2moIOx`K$=0vTv~ zZjZRym}{XP!y#QgXC1Zx8vaXnr|f@LGP`maZS$v@qi|ooPFE2J_oDl=g$-*u(60Qk z*aUvqWQ9)KK)XXBJW;wkc82D*diXmf>1>Nac4)60Zp6lsyk!(PQ8kmU$Bh-{BdCXf z%(zlTJqfN-rq~7o!#P!Mny=!~Cy9P}2fj`C^~6I|Nwfns2Dg%l*NH}ib87XsL%Gh5 z*6!siypD{3wCvE7A5(b0pN09n%$99iexf%~^e3!C$O9bUm(}(}X{n`-3FirZNQ%yg zEq=;1^&7R9WwDGDLXwm$`42=JYoHVoJa|F5@+w!C_zyBsz)K&`yP5EO2JL4cZSu_~ zzv|?s+{tYdn(0t|8E?vz$DB}5M*i_izin`SC zNFGGDdeUF?T;dgG`9<%T>*vwe#Ntn{SzL{epC}>9#gg7Titz0)aWO1dc>FC1cOkg< zoRSlMAVNcL-HwC3$7IDWMRM@h*b?*5OpM*0P#l3t zbzW~+88wjE0G76nET&aPx-vxGr#;fIiy7-WG_H*%tzN^lNbHZgcqJRxY!E--w(Wva z0vfhwwrez*FPB`eUwuDB$-@ap7#ra=o~tio+|06?eKwzzS{i2=ytOaeH>`_DrjW0({tI<`rs64qBD}ejg*vq>O?tYUxeld z7XUef{kdV^kh?UOXb;Wx2mJ}ZzC(*1-##TbWO%_+R*z=#zN7v4cJtP%IF|66+XoR< z3zkQ=8}@!T%D`|9v;-e;{i}L}LVTv4|721J#gxi0+S0d}basQD1$-B);ZHrpp@*N; zL+(mjjgAylFn)N1wnC@gN~c`hh3%8Z`(*+fgy?9_;?cJDc;bArO}sVmFl+E%y86Wn zN@hDGrT9J8uxhPL*V90G{Xza{PuuFCH8fu|JY_B(MXYrQ!{|1h_86*3zxn$le_HD+ z)L?;zi;tFrq)48^;xrq+>r)HSv1J+-f6V6QZNBhU#RxjCVqXXfIeQYIy)-ONfC01& zhnR+_q$|Yy9G?Qk21l1%C9+Unz3Sy!Kuz+bU}?QL9(M2F=jTK`G}joQ$b@c-Y{V!(;;lkO3OHFozFzYVCl&3%dAk4mvft; z{%`D04=ZkT@Un<@2~86xJMioCeKik4_x$^hbuMMp7rk9SME<-rJnng`I1hNt2h?>j z#QkRcjKvp>U83{DbVBjc^~8^lJ4aDdi&`8nQ|iUD@!H-s#}Ff_&Te^lHy`^zWR-dd zN(ciz-;0fIot!Q4+p708ulLszCKs{2$2o79f-g&UL#;TzGPB~z_K>BDBtEYl2!0q` znE=5tUQr0VoDx5Kka=4PVHpRm=Yu|XP^g}m7q|8F-&#>X0*bXUHqdy*pUV(v<~)1* z;l35IxZOUmjbnE}7vd#k2&>1x?=^TDl#6rU`CQyIZNWH@Ylv721>P!l5LN+CB!*38 zNxyXK-1d9Aww8QuYVL$eSR=XR(qTuo{P)$k4`pG7Liq9@gL9&-%8MD`YC*;hU0JUE zdk0CJO>aJ09@Uz9aKyC5D4DQ(jro-q3^^M_a}k@#wvCjwB4x&I(VaN%HeY=9&g_Nq zh3)B+Eyf>#F?P2$G^L!9uHNGm7|g@nQuOlbmJ#@Tinb}KlVdsP7#-?!0mqyk+o|hO z_ld!ddgQMA2fXS1hV1=7R87$U+Q|i-1VwRun2i|QqYd@zx#*>0beZmxw2>0*j_nC7 zX;IRzQ^O`Tkl+eIhA^RKo1FBq%Yex)4GD(gSLy$xnl)0P zsn$RSlt-&l>{DHg(1<~+6Vz_?$i|KBBg1tEMG;x@hx(yUL!m&v0@YnUM+isvF(eL%-|_ zH50tYO|_f!N2Ceq)vi3gvz4R_M|)tD=D*leqCijW;1L1j0@a)OOGL|jsF_USe`XBQ zi5G&8$9OH|S>35Vl1tei$aJ1e%0zX*L6s6nC3a}&Y)3O#p+nuFl%ugdGTqkt)|#Hk z#x}p%(WnJ|iu@QW1n&!3)xUTF<1D{2v?Qmn`yIPT$9v+W{Vw^;Uz{MQ@1bQ9X&0(~ zXkT~&98fco+VKK%nHaU45B>EoJzco$#oZYdJ=wOslF{(Scy_Bndn=Ye)l0XkD?VvE z`j<**Gsor=VInE%+uw=o2_tU?Qph^UiUf&b^8;)4A5(b`4Ot!+I~y3Xr3vyi&85{! z&>OQ?jsnzPev7sU46(LQV{KA88a&T@HFB-63cR(T;{97CttyAP^($njqszxvjSh;I zS2>Nb^8U4x)7BroN8lS$(oFxc&+jWdfJgw{rd^~w~3<v3_>eRJXsHZfA9P-pZb_@)@i!IF}!um_;9*mTtU+#Uz)h-BeTW-!P*`f@jj7N6FO zGLd)4x(~wg&&S{*rpZMFFbYF`rfA8xqfJYAi&0nq{G}ou8uKd^i=?`4RMK~41i~xE z>O|i%-^J$CW^{*tqvF1^`@GnEC0*iH)uYU!>!^m^GGU5}I3{_e*O6lBD>{SH2MDOz zxynfnqmn=BYxXLg6lnc{7zTNt9THpP#!uY&_ z9y zzHZ@nL=(41dsnIGhlaG>D;4r+_9QYiK^C;u{oKjs&Nx^$At4Zr(4zDIR;kXfGM=# zn{~|J^Un*ocE`2S%9-if%yjeR2hPXd97mX^{$)Nl$0)vEV}3HkMCyc?+TkIL4+F21 zii{ZOduS;fOa>T_qO#1vmqb8u2Nr8iY{{Sv!&AF+yYVdS&(TEs0}E7q48KD&6bj&W zSG)woUu6x7ccMQe9)^5s92pUlNlLR&LE~(7F}45wlI0h@P(=s2t_Z?i4eA~0<~e7% zQ6`j@Tp?CUn63Fb%d<|G$|TP`5x*kZy=d^YV~-zrC!l3M=-X|N3@8AQ!uK-^2U^3! zyVQS3(kEIqgr?-Vp9VffU$s5hhk#U|-W1zvir#AF+*9-MBoZM;bHUXG>d zJv|#u{30;70t;-JpT7N+e7Ca0$0h>9b+l6r1BnvWx(Yox4D;K-%{Wf+Bb<&&fO=ji zgxY!E7Wd%>A>MbF>%Ra9>!n!c9H~-KIH;wz1f)N09_?J6`IGx5S~PwfHIFnchlggx z)yb-$(z~$un2F*{4oS8-ZJAWj&o|A-w9MC|rVOhxn7&v05!+9YS}s8dtOaPiz2h4n z?0i@Jq|4aY+ffgJ?3d(_=CC2G&rf}Lf_*ckdq{X2-ho)?wK{>$KyS7;?&vbfLE3I& zjtFGW49W^VEA?DQUp6N&SILo8s9djenfU$gmj;&h=Uckhl9BcxzxmPefmWzk@wefR z+L8XDSoh6&u|}WtE#*OK=igiQK$YioH~q~Mn3ksn|q;djXH0IrO&fVLJP3R?Zhg+#g4IgI$IlH7|HvD^Vm)hILT~XpVq%ImK zMEwVG%XW^*W8i==I2)9zr%rTsfQO-$wbE*SSXy~bBD)hjEWq;p z)Qw>WTkfbXdm^<-g%^}?c}?+@D6)pu((8L^(3ePdT0H<1wqy+RL)tUtE8d|hVc%O~ zNfw_F$vkOl-ecTv68_;$NN$9|?!ge&=(6}*IFawSPmSguhi!rAb{nE^L^`?Z1#;i2 z*|Md!#)|Na>)GxBe@ad-su^e?x7f%!Wrs5Uem-`nJ-15qW+2fl8=Oe@*c{zXX+glj z>-*^qA)wc6>v^7mQKj=OV*TB0b-e;l3LzwmhCeG7)1Wq$Z(;f2_{XVR4Ex+bQ2M5M zB8#%ImbZIaH=V*eg`2|&TrX=Q(Rbd1htZt;=;)1gIsHa*lWZD`rZL5*T<r zN0rY6^4jXpE4fD0rA^0#pS2<6SC3FcslI~7O#u9PFTyjEdd^`M*ZPskEefB9@XWfT z#QA>La?nHdxT>n_8YCTV!~R&5?tLwFN591E`f~0?;#_VnKlb8US%>ZhzSQ*u z4%q1&VmEC{eE-!Z`md#B+L_w*SKhav;|VvYf?tG{>d#mG15^c_(gbqsm3z-c1G_dO zQKwwG%#|-w`b|V%5$1iSh2EtmwaiO%$XVK`ta@gbW5132@R+W}NY585YRwdciB+N( zig#)vIDbWRw$rkSd1(9N#+K-XH6iy~8zdf@naPukw3PT~$mgHh0|5zcm}){nEDd4` z{7=K@6iYw@QYkUVgh~y6iDq8JHfg!ddJA|jttp5H_~^%rBG93Ac-K` zn$eY6RyUm=G|xq)7{95@lLUK0$~`%5nqj@1omM)=n@kX3gEu7JZ{A-|JOV}-y8=vP z4@{@HE9djG>$NuTAvx4+qAIU&UFF?|@jx{4-+|E9&3JW;$Oo$NDNzb$s)SpE@pq*@ zq7i}2_nY)RM6U@@sHx7V%lKK|np-fOUrGM_8}R5y@iuiaeM(~XlpGxFS988FCsq`o z&a(N=Cfrs~6vvvwWm#?Os)lz42LMD;u4{!DG+K9}(?9cem3=$#dX588ol~JO^ii9Y zb~?VC3CN~VG5InCbhPT_;T{^oJ`vjSuXf*Gs9*G3E#bS?+Yin?;q|$t&*miVc)l>_ zDSCF%rGVk8ta8{KO{i~gi&M%%G5r1gYMBw5CKU}XD`(;HwV1Ksb_ zRli0O_n_VW6C%Rn_;r^`=_Y4xa1+H}t~|28saN&$qb*v7`#m6B){BMDVwXe~y67le zC=mvKlYRUXT)rH*Cj@xz=0N_tn!bpFM@N^QU7x210mz})y;2JBt%zqAu ziN;#RH0@Bp{zOWy9vL^#Xbb?^Vf5aZt{}p2dZD8G;}h(+_M3@eIGEUTkl4kuG(L+X zqzzTJIpseNB}?1HyyYZSPc$)B4LjNF*}`c>e0HBZ7ZbTENm%W|nFj>mKU( zYOlmI*>A&W`YO&x`RKRy?B#p%kQXWeHCHvrCZcvURAT-HDHB+c_yMP1MiuR(&o4GK zSvdMMNSp@n#&x^7=U46)kWGyED#F(Ojt^IvG%zmVQbuUU^jXQfp7$O}OKC1zIifLF z*C`7XZsVML&fjT+-u!we%CJl5|1kz9{O$oYoZtC}GJhA!8mDEj6cK|FCehN-$SShv zh-6sF=1=6}`~lxmFVI+vqJ~j@!dxaGtv#|jUC#TKad3lX*JvF*j3$tkEMq31jrX=tmGuf`VR|2xnxx#gd#p^VMJG+@6a8Sf9NW}|GMOTKQuY_@x zS?=lzU)gI7bF1o}=1B#=T~=|!yT}eE3p>o3THnO|n2dp6)%LnfO=ol0?b+=|C`cP> zJ86-DC8G$5R7MaZ&;5A%8x;O+yrkHa_VpxNEgB$PO|FYR!T zmHX$ZZPYD1u@pbOV~1psGrjndq_=zAA-H1v%7rzBVnq^vQpg?5_R=U84r z?E#oE>YZt4pO%$wW>7}Db*oPek$ldTrA=nlc6LZ--GmfVDCK3_m?PR?MSswsht3BS zM2_Ct_L=m|pry|Yo?TRQS!DZ|pSy3nOifl~WI}_>;dt|-ogIyN?&gXi0^i(_ANDw) zP5btwDsXsEhScB*cG6I{L*QIUL6Bbn0id;yIbBnJ#gUNB9;26`Dh}xQg(Mfw2htUJ zm0vDdUy!|a1aeyD-+ij{VcX`)*h)}bu}V5fgTCI_*Qt3YdK;r76{kJ3gZp{7)Uv-n zncAJ|Xi~}@|C{L#ky&rrqcS!85RH7@nWOhoQGZ1wsB<-&I=fH(yI~4~c{ds@TmVnA zDnX*}J)6>L{;O27d0g4k`Cw2{S&lZ!V;&4Rnk@zuA?wzzuHT2@N+V zQu$OEtPJUDnUBX*DJR2XV@W8p{D`;#v|YD89c_(r_9% ztCSwjRo{5EWMlJ2A=KvgtHBCU8jaUJig~3Ebgk78^PYeHW}0UaKor5)_o+a! z?#=3S14^BA9;8RmU3jG=Ko@MZ0WE^Dkb8)Q0Pl4eo`LZoxSs7xu@w zq?vY(;lP@NFqS+F%&-&!&3v5sp#50$zkHuI>rH5mv&o)!2gi_J&HW1(s27>aUsN+$ z&JP7nuSUtqgvRMV^jK2^h9<_&#nV<;v^VZl0xSz|Rk;Wm7l$onUqvdXVlif={pqMa z9Lq2-Uptei{^}J8InNv4)0UBc$}wMe?VT*2XO|NG+2oQ2`kz1np0e*^8tb(OHfZ(h zv%M2~O?v_NM8nUEOO6|6eh}>lWfxQcv#pTD9I5>U{F?K1e9 zdfk*D7r`aI04z2Y`S(BgPp`RXXhuOe$qRH+7P%zO<-pH`3LKYAvE0BfVIFoD{(U(Y6)GNhxy)zZ_g zO(VL;MBF^bYdT?*GQEYC380 z2L-F%27tOI9O}Ywl!DJ7o~9L$jf0&RVF6;hX$*WG1+J7WLb?MN`Qy_`o9Zv#7v(9{ zMm}e>qE0dvmCskc7NA0Vq5;~lR+F+PPvy&O-%`?0i9UE9fv zn&qQbxOx%)`_1h{bi%s%-p`#*ofJ~x$z|e{D*}!%+KUvG4`I#KNKrBB3PSHs!#`?c z57dUG^2Hiw`CdM!NLMcF-9THZtrsK}0ZqSeo@qNeFLtX^zFLrNCBmDDN7p^)*)^%& z0Y39n`7z203wb~Yrk`}rPdW1`+_mkcfyOR-1dfvf|0MnBpx+WU$W^BvtADCo)wwe% z(*IY5K6qz@u<_WB`=`(6Zg0CJIZcX@*DaS~HFmV9=ikb1aED76z3Zg^4UG60qkbaj!kY`uG$Zez#!ZpA}GIbrZfP(2|T zjSt@tPmbDI{9I=_JO5Snccx1B)#*Jq`&*{Q2VLmL_X1&7HFfPJCDR|y%=X${Lx}2w z$}5FjcSk~}Rnsq}ww_G$3W#SRWk1=aswgmbhy*r`c_XXkjyrNG2r+x8PAt1L0Y0}k z^n)H7$dOa{-W{xAAF+XAcI;Bc_uD&)gKfQ7QrOgYW{7R6&7c?C#NoSRSxRR<2D$Qu z5`o{%PtE!celNYfV#o`_q`xk^1MkR0d1@$>d>d<=)P_Fj8f~dk6h3p0gN_ya8LxXJ z7mw`9l$YJfh7~YV(fg{|nf%=S4yasai-?cMq*GgY$#)zqv<0L_AMKpikcXXxb%iw~ z8X2s0d^tN^2TgL6kd z_UFIzlg&IA9L=+6<_ZjTEp4ON1On*Tx%z|q*t^Cp2Fc~0APsQO68msgrA-YRm1bO$)Npc4Kmg?tPK zo#D>>lRo(n~2_HWV>5eznF>bH(2A@|0Bb$kd*_ zUzGip0U>MLnBwlWNWIkU0`9U1G*mwL$$l(&*)NL!*BRuo@pB`r0O$_T7%$c)z&@u~ zwk~D+ge#<>9OZMB(yy$Z({}RAt%_yw$mYf4f{XHmm(H>EZZA`J5p(#I9|WbXXJLW? zlo@}2zwCgtS3e|@v2)PU_iU)XgalV%?x~X*qwUZNMN$Wc4tj9>pjbCh3=l0$ZJle397AZvWt-m-2gKPn%q5(7taIl06D#%f4QQLR7Zw zgJesxMcMa43K?Zzlik=2+5S6YNqyh{J?DAeIo|W$_q_W#bLQTwwzHu${oc5GntkoF z)XK=YIKUWFzWC$xa27qx_OrwE*i??qx!Vc##mr=yF>Y*f+CSN}Xn%RD+#Fv$iQ#jv zJ^8CEz_~l>bs_ChoD~8yf-TwB=9_+a_L=d_EV>wiPXEx6jh-FNQhFZc(lCC7XTcz|5O|p9 zdcO9Yu#mW?e4jwk<7CE`4*Di7o5J-+QPIO6#o`sdho=m|I-K3i%F{nXCpBNDO+KYJ za?^YcY~`?2%)Dx`pK=7xYHKJi7R=b-;X#ea7vXm=~_eCVrDTXIGzh}yPYx{Lf_1j0TZ zJs*6li>2NR9`#LEv^VB0dWpKh=Rcz%hNyl{uB{>G+!$cr1K zBANhq|Ic3);466Lg9oyx(^o`IBfT`LCb-AVxnt@|ZnqP;@|C|AvN)O$gZ@yd)Helf zWUplxM8-UR^66_{qW2HO*atUz<9xqxt;M=nIz4;8c!T}-DQxXkP6pdD=u(k*5Uild5i>U0t|MVZ^(n2J}tM38hHJ=ar}9d^Nv59cZ_8u@k1i zEdJuS&v@OvWBt922tD*sY4csM#@K$S@4Z>OFxYO0O~0*R%VrQHim^f=Ir?#zyRdvp{t60 zp~V$!-x$5PlrycS_>w+^DHPWDbECkz_svEA8p`rui^DLO(&98}Qx0F%nMHTGhOYIQ zb1xO!oUi+wo{z!F&TUGyi)M8urcd5CYzDl?LwJ_K_EnI^scop-2|8c(F`q$0R|l%~O@S1- zhP&BC%cPDuz9Usbl5{#85^~y?tiyCnqF>~b{HT$EUpKmOGgBD)N;DrcD4K|KDZZ(p znW$jwdb)4I^W?gWz1HH8yvZA?sL<;`HGihXOi=FU_gk;LbbgeNM$QBo9wRbUk%CE< z8(I%6(44yxFo%e|SsU?zL-9g+T9-F}xK$Q^IjZi^C8xDh7rd_5|3b^=+YNl8BKJF4OIrM(aRGd2 ziaAPBwD;$usFaR1Loe@{NgqdCo?vMW!(}q zb6PNAyU?$}gnE+Y`T9vz`?k(?CLK(_XuG2M;f|tu@V6;O`D{5G?<;gd{-*;*N;`jO zxsZk7To@SL?3&sSnMk_14|fi{spc;N;D?+Bhn5|VOz8?6}UDBK{CY#Oyds$6@>43~>V4oo{6B z`nogStGu%A)|tD@2B%vr-HZY@;wBY|UaU8@xGc>fxi$uxatvV&^Vm?&=eTZMIZ&cn zsC2~Kn>ljhu=k+r(}iRKRenpNrM$MTo52!RTm_w8%r}25yBtPldbGK(eA}8ZamNxZ zn}ke1{nh^)J73onwb&jq7N~)KknmZJsd3s7W4%vwlF{+gYM{;WBzXKUhA7ZMIN|CFjMtdyo|c!m10?fF}S8+aDa zBG}BEtNVJgkQNe`OLs@9CJ*SbWO&$s8&_1=zr zUzQOunNYgrLplY2w?WfS)b6a^e`Yfb@|^i<=^45{h&!J zy?$0*c1y|CojR|m2?v z0^8qmcz=I`Z*6|{uk_l$^f+&?tk%Za3~WDwk9xL9Hp=%`tgnvN#%*yJTC9JKdu~&) z;(oDmeW=!Xwi2j~8iF*RERhj1E1X(m9%)CM@DcrG zgq7Iv#`uzUop<;0+|!3opT%l@H;c)YW|P^rQkd(5lYPA8 z@cac>alr2**dN*^Wt8YQ4UvY8K5~Y7DTPJ6mUi7<-$l;8QY>2kn5A{II7|N;5E%E4 zk0&?yNfE8B-P5nh!zOmVUBi}fAHPyJP2JYI{>J*J+Whoz%G5%?2<@#?vwZWyv}OfC z(mfYkf97jNqM|P-mr?6pxAKaj7sF-tM7vsKJzC<5>>x>II3o1`k#|JhIB$&Qa8^@J z)*yZRFh$Lk zGbQHl!cN~%KeA=kE?a5in#ilmL?p1pJ&t9-dF7lD(E9h%?{=E!MmA^o<~ZQCB*?1`vM?RJ`^B1 z_Y7q#lW??#c&cS#(ZW7m0!7dJ#95OKX zE+J*+fW;6c*LhCJ&R@d?WqDhZqS)xGi3Z5pPgOl2K1-E*t16vjgHd@35yA~wL$tC> zrUqL(J*;v*+!KkUD@|4Uuutvszxf=tg1Uu4(}@6dOMj?<`#hb-mq_$ zjaDyP{3gvaQ^-dH#1p9oKM2A+gn~NkJ0jFdE0aAUlN@pa3%~M-8y{7dRZtEPMH#6CwK)|3cy)4Bg-&`@#%LUwIXK4CD!xXPcTohdh#b-fiT-=t=1gRq@Dks(ZX z!rHf_D@oDn_u)jBEX1g6gE@IuytfK@w18AIN1gt=6*D@#O~RDH|HX5KHU1M7@+Vn( z52_YkeJ(PIL*9D{0X3wzgqX{FV~8c6=Fw>ky>qCfU;rk*!)nEw1YxQv6eOnXAw@*Y zkSmt-XtI}zT64@1C&-q6h>gniuc)EQoU~pZxu#3zD2K@B&8UQq-|=SlbvcotNAqM6 z)fSQDa4aL5`ZML7Iyvx$dC0OW0$~tRMrrvOMe-Wvb2NgP?3V&!Q&X#o>Dmv789y8=MMb-rR?zB#jD)-D%7%6qEtd*0X`eq#kUGW%WUZBp0c5ZWA?;EFDhD z@s5QkoKQd#%Ta16&^M4H?oW$w!rR0@^jCwi6w3ZAm~45Znk{coR>!vYq)-txhLQ>?+xTuX`P}%_6wF+-D^6!}lG9#_Wj41`akSihD&;>q(2mteL zKyV!8cnWQB|AH>S^Jd^|F88a~6{+O)T1YuiC zN;)spN=LcmE4`7FEpL>7_~ij;O>woqJ9KyoVdbp#nzKFTWA_%Vyc#Y@9kD|CZ$_A^~i_7OERap2n5OT^{WnwH`dR`k5hY}g ztPoGtfRJozb3p6V5#~o^sYVE5ohpPcZ%&f7fJu*J?~ACUl@l46l%F$D;+aXoCo+;K zPiDYQ5$jTBrl1%zpf1qNL{y4ih*ppkc78ZY>jZNSXG z^w1N^HNNuTL$Zu3L5iJb;S`VR=bMaq+zn0|($W*BT;vhDK(R215Rg^jzm$c)bG5;M z{9IKo^GlC2rto+YZr^Ey7AY@#NK=j$e zabIe)5U*gFK>uTHo4mfJY`z61A*9se0DzE&t6YLKzK2~pGSYzZ&xoD{(Qt*VF&g%U+4Kb}%{8<#@bDYV%TCyqVje*BSP!b>b7MFPbETns@| zJY+;5c^gzAssXTBdcMP`6vdEh6xvY42_6+5Wo*;iIYfz}UqCP-gqH$SP41sUVRG7Q zAciK5gtYh2puEuvaW);ybHwp^RPCovkw&XT#fKW?6tKj6bTC(TkYHBB_6HMGq#R-%O6?-&Ly>6DVY@JqL5Z-A$Cjn4gbUfp}DF_9wqNEVFPfs zyjs7IwqzjD$IkZDr(5svYvi?)uTQr#W1Y`h7s2~D3WEmcC0p-#aK)fh4k=5++K5AG z!DsbSNO?KwCxi~k^-W4BMSeCIl{462%ysZiB^Bm0nh>g-ez>j7O>yLbG+=}wj-%~# zs7fIf;1r$6_zImn1wJKAb(S-C!dn9rdT%_9bO%*m5%`(xLZ+qRXrRrvOJ99kF0syCztoO6@jHxHFb zXQMY#-+mRMd!rxWUE8|JdzF6LTTfHpan8{@htz{}aH=RPI^HY#*~-`|pb4S8&E7E@ zE=Ao3ABHs1>Nr*9lRoAYo%S|9L@i^~NnA_I>Qt4xi>fbNX$-wpazp~^ST4Xq;;6#-F6A%|G55kIW_t`XEQ!Hf4L~G6X%*H0oK&%8+WDwoZ zHe`qss(>j44V!^jjBTc>v2I3zW9Bl59%whR)d}^Usemx{4|&TX{&!etcfxqIpN*i0 z%uo+>0J-W^^MNTFosgo$!fz{+cy{r;An+Ai6f)cec_-u-*7Jzg!cXv7)t?X=YxOtSdNHa(^(T~~j+lTPQ^%U%2K+p>(#-$=RCuz+Tt_FxnPgbdMfuE9%cU%$xuZ9g>*q>kt; zWK+P{iV-JB?7?_afWf5MGy3Ry*Cy}z)uz|R*Efv&Ctj|s3x4KF+hXVR>vRWgYM?oeyS@LG1Z{yv3|CKellZ@&si!V zZRkJF!PhK8HL99{SkvKPelk40(4pq_rgYI5IH3k9mM|T>0AH5&SOOr=I3?i~wfP5s z>d*efd#K&e7;P?uFV|~1RjM%l2Z{68!b~U(PPIhqk-Q3V83VV`kMq|rgc0GZ3Be$v zgo3vhc%sgzVx})>zzC~nhu5eVJ#6jiwHu9plp8`)?8&NEYR;?#+FY4Xbwl=7fW6h> z&kE3Q8204lG*}FG*9XFK0xlWl&>JzH2g@XQdld6$>#zO875>_|@hQ zKgD-UvFN-hhP==|xFX~`GQ&x+P*6vJumqVqk>oRlpuMLdrh+gT;x1@IbEn;r(L7M~ zs!r%9PxP--}G2#6)L zG7}>@WIPy+s~5t@8(|<68Q`Fpg88X1X^Za=DAeg1MNbWmm%(3r;;P`&kp`;UppnR2 z2UO}V&#^7Vfh9p{#bBd0XgD(3VRSSgx(3U_gVGRuAZ?7<6W}a5cft>k!o(?ZoUo)2 zMHesf{!hZ{Z_sB*TL;vu(>Q*i=$a^FokMZR9H12lPDUOiqt8KB3!$x zG{Hjj6MiaqtAG1r^}=(!M`q0wUG{vUBmIv_j|+~7z4V6;f9`h7VJ+o?hw&W|dmvfS z%J~C)4?i#|&u-Ti`C9Y3E9LXH{B*NE{2uV4ps2LZH)wG4g4%UYk_FNoPZAvHr!2?^ z&VS1lpESJaJ%QSwcp8#dOsr^yafqTIz4TBE6uh~>{zpX?`8+1w9|_P?N$WfCl}i zQ;5a2LYHkkxT;BZ?VHrBrWwfZt-a%bROGmWL1_i#_K(d3uZU5KBLpApyM+)uQqtAm z05B+291K2qzQUdXV|ibRs&UA!5&V#auksK1Az=;%6%AGc8SWZJJ9_>h2}XjbmrN9U zs{6FM0x=RtveqxedxKWQkAjAgJA99j2E6EG)%}bC%Bs+q)Mv3kv$W!bt@-FEBF*+qxZDf%mxeh+5 zRKoh2+(qWaE`!MzT5F=HbXUjGg0`Sip7D)yK0(Ck79DSIRBn?aGc~4 zK{UtdCLhtu@IUepgeDM!>Mr@EAK6!c6Yt={gR&E7uUG>^mCS@I@M`+JqTxcVq7^6O;OK!G83qK6|075AfD)h&M91-bLMa2w` zIb^9K;2*CKOm=|3=mbiYrTta2rv=f10D>V*)s>oFB=ngb=vn4i581@2~j&)Qnvk+;uby5 z1)Q9q&SibANt8Bt?32_^mYS_UY#!A>lTo7Z9U#l(YWikn@Du?ayz#m?R==S#(4U(` z-DD{%8T?L`BeH{%OZTnV@V~n*%SH~07~uVbtUx5`|04#kzeU*bkr=SFmJn!dBz-fP zM@nEFWW^#4j>K=N%=HzfNOW0Rfs#+I_|4%i>8~i+VYegugotdahx#E?C_NTD>dYtn zK`bRopMH85L*Par(t5W?eKsUGW#PNR%js7sAH$!fDpt&awQ-}zN7kLWm6=l>Z5 zC-{DxNR`1fA|WbLsr>W@!>3~7UO*^c>fK7d_tgKYqLF?i)CX_((Umu1 z{+DLQV%M1#Nb%k$D1*7BXpQ%9_Ikc$Faj5}LG;JBJFed)RG8Y0DaS?2;A*wKI0OC( zw1csi?Ks5==Iu58q)C$NEcj?8%M{Ua^vV1W)LVTPKj=943&(#Q^~qEteR+aRoyDl+ zM|1eg)lx$UxdM1_gHINKkS!uaj>O;#bLbR*CrT*kf+>Q|E?hJn-@vlGCf4d$Sk!A* zF*Q7pKszOZkWPQt=tMOCo0pY~P#HT+p1S z`^vzE7yf?YgeKkK0Dcp&n>_dw+*KJNtoL_n_LZ@}=m&khi~ZX`OtVG%89X)m-Fy+t zV)t)e>jV1?3ujMJ0hiu+8bGZ2Hy=JCQ@BUsK)I6uH#;fLFh3LDpzwt05E5df#3V85 zVkmevz>JUF!%olCcLSHQ+#=E2Xg_tL1{yDbCzD3gBzIWA#Q8U|MoNJFxSy)w9 zt|F9$-OyQnT~C287zE}!1p^#$Gz@$G8$9a}+z%~$CHaqNi~2ysx$bc!wiLe&*eO^C z3ePS%uvd&e&)j@fTx!S%#h1UmaNF|}SUfKaQiQ5{!fyPopeFy?2kxi-dpO`7-qs&- zbljmYs^TTc(1CHM=I#Z>`Xp1F`*NTsOm=Q^q3sw@W%etZ6k+cSey93d1)08vMV^jS zMa6osa1v6i+Yx4tjrvnmchr}I+5D+JyR~wX@MBK32!+#sYP_c~!Dd*XM19E-ELQ*0 zB@hk#ZPYh}eG+jFRqX9wQ@lv63X;Ybom9Hl6_1-=el3_v0XbpT>Ybx6nR8JR)FmuU z>&@d~c>C?w{Sj&x5XWu1aFo&>d=v(9!TI;=7c+i=u}I(#?0ROe9^lKtUV@}gRY2$q zH?(&$^-rSywKj(n_6<|r^RjM5;4h22TMWWh%fKM}9&~rJ#G${tZNb9H6qhU1$0&Ao z699fYabP{hFR6(OhpHTi)26z|{I$yE4B8oXmQ+HKpxP-MQ5UebXem8D`bWp;?E5DZPu*)T zKeEq*ID;@Pm4YX62ApV_EUAL1oyGe%iMpZp#FQ((NFKy$84^wIkajMS#Z?$#SRVXF zscIT^kVRJ{eCU6PT}Ejb=1x$Z^{h^V0|#jSV567F0xMwOIu?J(w3i#uPf)RX62F2Q zEs+IRczrl^$F*q%E!|mx3`@|Xcn8?-`oBoM01B|%zsaFI5{ORI*FENYL;OE&hGcPe*(tm)5ueG3Gfge(BdNA()ZZDk3`;|D8PdN z=DA$ksMzCni*c!EzgaMG{wgikO#E;+^C`$K{U5Ne5vW`D`TF&>cgW!Fwu3Q1h=vE0 z16SW22n4))UCskG1A+5+Y5$5YLYy6lE<&)?ue+`zgF!Q>&b-t-T3!&0Y#KiR{)8C5 z=Tb?R!}N2Y2>oow8T*m*g*Yw_42Y@t_szyk-3h?^Pabb(H|1!7G5$Y6XiSxxFqF3E zxdToERow9Uxl)$0H-^uRFH9ew4pE>(4tf_PY@T)Za5u=0Ba_`QuPj;}9vd)NI$GDI zlkwb!YO){>Svmm%KxU#K94Rvq@981w5uId+o9=5lf| zaG@?{opS8fP6r6^lq2nj58>^&wMnEWXke3>h_(d*PdG!G^~s)uz02N%$vpK@95F3PgZr^H`6^G{{UJ| z@Zp;ENuVGHxjwlInmcYfKVFYo`EFr|{-40JCeJB+ve_1t6?y6{rcD|Te*4{SS1&9^ z#!VIc4fIMAvch`?iZry3PX9Ah0Q^l_P~7}sLSOJhrQOlwvz-?9=(8RF6(J-MgD#)OG4ZN7Z0U*GC!2R>U59qX^u0eXL zqpogZ#k-brmUNbzaI8Uy{T6oSKcySVwq51g1^nf zu*-npxAfZ_O_}6^TBOYM4yb6Ztvsv$HU}IU!1*``{66}j+VUy-N2i4+`bP&I00j6i zSgW8*S!@B5CR+Cn!O+ef&$bM6`i%-JkW*6y74k#mXZ2@tF|;x>xr-iSSHM-W+bmt* zX$Khl-`sHOwD3po1J0FDN;<^VWlvSFvBXNdxa=d{7BA6GT^9bpAEJMIV>`hmA~TbZ zAprbrnoVT|4alJB1E3ZZ3BRHq9|P-Xpv@Rvi_y<^ye$X@*#lPD7`*LjvsOL1RmP$L z3tu!oz=3}w{GU*CmV0miWuS=W%Kr`o{Ae>yjs|@TOm(ll5d0I2sRuHjPy;F|N=`Qo z6g>r3fxYbie|k(@akFJ5iS8Or|1%Up2|_gPfAx?v5exw>9DDZK%eEx#K`WWrJL_Ca z9JHNLXZsx%ngiZ#C$yCwr?~eXUqr1o0IKx6@!7V#HB(37cgoJrf39wC>1~v4jHu75 zo0X~jG4%ZbIt%k@py(^zx0yQ*-FoTgLpCcP3*A;)(Lq1fHBG>ufFMrz= z=ekXf!(SM4zqwmZG^l>*1v5Sj`ohqzbJUfS{aqA*% z8o>e=nO+5c>%?T6Im3(jrz3t_y=irQbxG_FkPGc=DUFl46D{_I)nAPE4#y`cj&0k% zT1UDLIlT|-3|@wv{cI`z=cpaTT0bhVkm`dS`lD*^sb={}^?L(?ruy}8qb1Whn9F5R z19m0ugE{3caJHX!gX6@kKe@2}G!FI`>s%;8yTFUFwT@k|58!Yymc(Z41=pBaa17qXnjI9U)KZBdGqxV0-;vO7X?diiken8vBk>3^8 zC&xV~3J9vEYb-)5nUze(rpc?RRl$!+aX!bJg6Q{{&C|Z&9XvVHx7OljpPHQy={Y~& zb;v7X&Z{(;v7e{Rex_2Ke#nfjeA-t5M%mIA+|Vtq(DFDxXNp<+{>YUd7e(9~ ziHwQDN(U@!zF=zU!TGG_T3nrOP7i78<&(Kq=1K}vcH-_$vC=2ryDiE^Aco67DZg@E z^GiPOE8bV7o|z39(fYuJvwzx$#e2i1ch@?~sn)%xpP%LnJq)(*k4+Lic~A156u4bp zdP%N>Ka)4p4OcudhFTZ=1k2|In@PoCi=B3gdMRuwO#Af5SZ}b|6AOd^o0y?l5s@zL zh~U_rW=|ZhvEKl&YcEpu<=fAYE8zzk)7i5`n=$oWrkK4p5WXluD)6fRDY7wRx0xRv zGOg!J64-C+Z-1(@$x$QD?6y)SKu#H}0YGto&l($Z4ZxPUlr-?22ySdHMFulPcvHGx7fz%8BOg61`jY)x7 zfe#pl>((nv1y8*Sy&c}8WKCBrH?ks{$F<dg4S(Q#=LJ=htL@CxE0U83jw{#h~)t+xK9MU#wFrl~7bnf+-91#kH8~ zBX*Uwq;^iCvv1O+SY-KDLk7VZW}J3bnH$PVx@?z!UIj%5-NK$oC!gJtcqQ7Ba38q$ zC1#N4lRqoB$rr9?m9-x3(Kd8La)2L>zQ0!1yGf(Gy@)jwvzu)>&2CY?BG1qslw|M)c*jD#$;As&wFY?`KnjFv zu1Il~?aD|X+2tIq)5JI0lPReP3K=kY;abkU77Xn@-|I}Xv)?aR!ymeb_5}4BjI6k= z++z*Ece*d#p}S}RUvMj5cee+5Hq0C(#N4B9bF){p4R4E!=ucU?i!6r<9X+}&Souzl7EunJ)X=g) zxiPiJCG|s=1v0+BcvsmhdA!^?$6ebkylwf#yLa6~59S2&B}2;tr!`D%c-@)0;wbRU z0X*&;_#P3Y4T&35Yn*rgy;+U(-hJoA$ana5rENLm8Rr|o+*#AEo@LyAVX!18sk|(Z ziE|dQwUc%MSvBO}oOn)i3AefWwazX4M_fU^#ro`BlkymyJ+6?Yt!6TjW^%lk*WL@Y z$aAGEd*Qa(0P{rJHn-EIpi%;0yfOpjL#81!MS!G5x$2aL?poRkIvv-qYvhGCI`v8Hdk;V zJ^sD&U$W^!J;%vbMAh@?Ts<46lnfGQ^#(^Dgi+7#z)>(~|TJJkI^LVhc{7GJM3Fj*D`+`yvy|G9QV=Z+Xne-VPB&jVDF}GTwa!{TjWoG z&wG@w`&+`cUr6%mWsO{zN#xcAW78m7GkupTM;J;Iz zzUpP=#&NgZ8Nf*h#=sjrR7abFwww4qU;I=V#ZfUb$L|k6=g~N%Mr-)6C@yZ{KIUgg zeQaCT)#fOzin5VPzj^*(xUmQHj^~8w?7Tssas}T4f2d7`doA0Lnz&)uTA2FE;q7w1 zMKb|U)e$vbLq@g(EoQ*kMv9-h5o`b+G*aiR^Mw9sscG*72YA3&M@zvE54BZgDg=z( zNW6X8dYRb(_rVdG*XxWOa@_8&G$P6`w)wJ99_4n9zxRWR`-zJ51fEyxsInaUb=~}& zLo!!p`kf7L1u3vN)^yI8!tzhc2Fjg2C>UoqmPhq6YO@nstj(6kIYDX* zntz(vrA0#(i|8{-3i!5&pH+|=L4%-qcelZOWun*LC;09xw2S&c`+_r={1s1M#6D>0 z{f0QZyY!)JQCZP+g)(kyu=ZCIKPmVE!1L6i)S~OySBXxuiLBAo_2)ZI--PrMFJv3|&kGHl7i)dDU86upDo4E}+FGjsCoS&{ zh&np|urF$=LJ#+=1m59U>Apzs;~7xHY8)(jk@Z+G!zYS6equHAs>dzQWPDG$;j6pM zFz|D!%(nFnB8R-3eF?B^eY54S_6e5Z{hjE>)!c>B^T^9r-XPxIeSgym>(1Kt#DK=_ z%=q`Do2OF_7qYioYJp?qd!4)E*Vm%u@@9=yPWqjp|Dm8mYWy|iMwVr6W_2d{8+Lr> z_4VbjDaO_=k<7qZyHz5q!FKPfr*Y2CZYEOp zvzlV`Y-D(XeaZu!$2hgyN)kPC)NGvMPqb(h&rp09UYzNJWr%*)qM(CQlV1HwujOY+ zpBdwU8|5d3I8vOz(_G8=a=QePLH?56&$2F_5~*P~ISu5|XCgB0-i)W82A=BJga!!X zDPh-qci8^hY3q;kLRA7L)NQ--?h=?t|1IqNQ{B3vdY%ltPNYa0sWbbX?ihz{6tT*2 z{4@biF@UNaos#ZHOjbFU#f2Tw@B$HJ-0u`D-Xrb(NqI^I;pz4-*zbg^%x-jbZcQbMY+*+ih8BQdVPX`= zc34~u6W{zesO_spBXZ_}b1Ao>V5S`9JmmlL!j1=H`?ex8R;22fqS*B;ZC_WXlH)t- z!aO^Ys#xlD=ifVD)b1hjJq3Kb1@j)+r#j4+5c75*>5A{gr_R?*EKHyZG(=~%Mq9E4 z#uHh6T}ZBwD$~%PQD`UH=?Fx!wnxt(WAbnTkoFd58v|Yit#28KSL9FGB`jP2=`d*# zSrTQ;O9D^cDN4zCokN=vz)yPb?ETS{TzW^T^2F2bjS629_b1)y ze8unLOf>B))-dtRCR)A-8uBx&?Hnk|^E4Y0bC@bk((@omE~W}eDnm0ZF&1~eRQx3v zB&a8{Gz$_9m_a6`bMi?Tj(q4@nobELjJF0UzBA^|a0U>3oP_a4l1kHzOWfmD6{o~^ z{2!n|3XQx8Qy|3qMtn1tNrB6qxs5R0p|gEHfx`ItjdlcS_(XI_>6RRGjQ#s28wz(; z)aRc1u5d?cOVNyTxfA_Vf3&uz5F$E5)UH=qF6sYH5oYO~L7WVX@@DL_V!<5WkYMTZ zLz6qPcUp+#yMC3I^v5WUScIe_63AWI4|GKG1Es!x96ptBxzoZZy-ULbYCxx?HI(j? zNbbeHYBBhyQ;gq+R;Llikw1v-YmXXSmVz91U~jchNGC>DStG)=RF6h;pW1*ubYapX4aWfpU3 z)jJ&#fh+MAwrSNd^AO zs9Gv@QW=!!Ej}#l!*Ae~Dpoy-S9MU`KK!dYw^cq=?Ca+A{T`5IyMz`-LF1~Wbk|Ax zYh@PJs1lpYE3z{JN%R;6by6{!Itg59j+La~BRm=D8JczpT$;b?(kOpCzryUNM-PSp z(2id<&hn)BMBim04vhxCuFg3Rx9M?-z(s6CxJ3*_*nCx)bz=RMO)mQ$r%97&nSN9K z^%l>2i9-HaW>V3wO0qtw#F6AW>_!&egifr#j>+Z4In{7?%~#e)O5!x)XmTTVZwoGQ zN@1E@iK;dtwOSJ%d1kTkwj?!QK!m15qSPdyXh{@u*o-~GLMsgsGs=_k;D^H1b1nVG zqt^l~V4!g1ChP$gPQ(m|32?3XEFpwRQuh`As-(-^_Jkl6S9rv(fYEK!C|>b4uv|W{ z$W3*nIFTk1-Db2S{C`w+7E+k&kpCg7AX&{9FBU;S zf_%LJwi{E4Tw7SMT1G3o(kG?41`5|n>>GKf^YzVazb%piZ{>Y+!z~`|$c|Sct!@NK zOiU0^%1ty`v=(Svnsx()e zZVK}QFb(@RgO_qkOn0($KV892jl(Xl-6~dU57C^j+zJ#+yEh@ryA$CW6eq?djHSuI zoCjG|?Igecc-`sVTKa4F)E{~k;VVhgFW~}U=GH3kY0AEruVBY%h^fW)xsv$&ZaPDY z*vc#-8Q*^yu=bjAh_`sZT^Dn=^kd&W)YyA}o`m%Tcg<4V({B~ux^P^^jD1X5o@D;f zcLlNNk51a%Yj=Rd&I8bd9MIMMJ~@s7YJPx=c5j z0Jvd{-Z}pawqyM%`pG!Bmev0!ceZ;G_M;;_+ug43K5*%lDX+IGQ8n$qXjpHnOIih;D5 z$2nIKRbih7$|nL};x!iY@yYqoO?(!0=kwij- zp*oDYDK%~9*2G&E6|cv*HJY0iRE;=uJE5M4K=m0*QihtQREg?Ry2zg-9?Pu#ATU?A z3{yU0qg~!OE1x)W#G!5aYQ8go>Kz9C;ddH(kMZP7h?vFuCYB&|$Qh_5g=!~-3*6r=nI0`lQm0j>Nm)fA&r0t z!jl9L8mQPh>D?F!oR$4~SaT<=y3tZDjBdUrT>$RrQx3y8NkoOT#I0e(KAt5u!rI zS|;Zras`bwYZAbpvln%?r@+lyuZdPok{=?_>tYT&DW`# z8}1Zj$@QJfzo3S|=JkeY^Z7?RSIiz;-aJW4uQjdO8SYeX$<@L&3eRZX60#smhA2Y= z80q<8z-58AbKyD=emo~5!D{4!vq;qmCcH=^o?oCRHuyjxcV#psp_BR;-t*fNh+x`{ly~(!ai9)U1Z&`R zkX|qL$ZJ)e3;(R?|3PryfJbCOPf#Uvq8%%sly+bba&`ikzSs5fGLsLI1nsaI4_(`r zZ$#Atay=lt`4h_Oc|dm;@%tb~Dh=fx!4hH~&F-s_a++OH{@cJzKjVn1uqUXR0I8=lxTT{QyZQz9Ot|G49RzM5CDt7kB=aCGSC>O>|%K)7h^S&2>Lg-n}t*02T%B zYxsdIz#4x;3alCJ_zx4tI{XJ%g9s_!%HKEOempXc!i@1VUxcbqxRyX(4WWvFnGYN+ z2G~Nayne8%XbHUBEfyMo6^mB>>ru^HXQQIsSbxM(;Ah*b7AAJ#FoB&Fg)n`9Dt$QC z9b7MLc=t$9v5+%?-wBHjNb)9Trw9R{h&ZoEWnn3XJ>g!eoA8A1l%@SbC2Ry1Tle#7 zypiz~MvPS{B$!6$N3?Z{0{G&!Pld0HFV);u-tn1y4BS%!YQ}gHBnf=6U$qI9(VPEp zq!jHK@OXDM`}X&Gva=NA>41w!!sauIykX_sFeCmvbMWs$zG_ueIQUYbkMGJyR{a=M z8N>MaR8>Ga;deTAyvnM=y1SSVJ|0!YFh4%%9tj@dmVoXfkY#BzhNS?P+bm?(%HP)S zEo3_rSI7@e-=BFmz`z6g4OE!#$f>{!YWu65x~lMv-6ak$jT=sew+_WreHrzlE}4Hv zI%xX0_psYHUvE*t`odyId0{@tym6b8;XhNGDvdpdV(AN zAhcIxoItZYdXd;m^g|SiWV|2!k1rI%06a#!VlA9(Z`%KG*d8LqV^NR_=_dq6l1HNj zoXyvTSJmWc%t3qb(OU?9m?fPtsSc#)pP#?C<9>_VPdx=IZK`l}Ho(=;-IzG;9-p&K zEeQArgc-?!bj}3|xmHUnA9_}-_&=0)ANfDZ-a0IgCFvW6V8Pu9F2UX1o!}bW-CYI? z?(QzZ9fG^N1a}Dz0fO5{&e=V?XP@VL-*>P6WA3ZwH&tELJ#|-i^>mxASXu|vCk}Nm zPqcRC({N39L@uMAd*=>B|AGk6K;>6_J~&CwAf8!r<&ubtB_)v*i+g(fF-gbC+4kY` zytVCHTeH_UuV$kh{XdGytX=SQhELMc8?M|)eYjlh4@rO42MCJ)OZIQd>!L=K*3!;j@!(%S ze$OKII{&jQY>elj_DTgMjwzD;R_bp&{z)tlV8M|w#nfWicY?0~DNqlu?ZyZJ?7tULI z{+MP)*7;YvlzYG0%%@{%G5u~c8bFgNJn7%8H!4}&^t_A-`rAGY7#43pJ*F-r-(iq= zjgG$>w~{hdO%6;NG6{~Rxq8;GA?D0Tr6Qsi2V1v^e2u+4N7z-(~)itjdfn`43jVp9jR^+8zfTBY}mi!fq)O z$#{*KKg9e?mA}B}E|*VM=Lp!wME|DfUw8jm=}Q~>$;lfIqXbr&KehM^Q5Q5!7$-;? zAORT*M|@u`i^l(01-#7?ZbK7ei!g;4A^qF!zX+4;K<#E9jjjXon=ME}DdKjeW~SGr zO%yqXX^j42O(My+-^!kWLM-)Y?e{2Z`ADm~0evZF_)pLD4{I(f`EU%kvh%*a1>Xv9 zj=+Q|12FoVLDb?V8YYpJ0^eTfd!9c6x!-T^Ji{N}>Fx6Gru(g4YJ>F4ykgol`CEVb zr)vMG``kp)B2%HCJ7B!7>At~wdcR=<-?#C6yw|(Y{+S698{*9h*doCHQ2f%ydUE5M z!wBvF*CxLOtyi4gx8esI`Tt?fzs&W|I;5gYTXnLwW^`o}q_R>BL`M){^E3GvJq_K( zUXbjF|BC?pK>>V><}7@ukr6o9 ztV|Y0b3lECdFJF*`@a4~=pSZ6jsqnD6N8L^!@_1@ z(lhEBq7h;WkBLCWCSelWwSA7&@G>YLQje`6HWVEQi$KSwW>Pi!lTi0-2n%_o6W()m ztf^4&bp=aLw3X0y;nxX;$!$Qzh9~*Io*OGA0SrY3LL!jw*CxGEzEk{Wm8v2x77~Gk zO~fQ*6gc!gR>RrIXlN)VmWV`HEa>UXlyB?^l|Xy!^m!EGv+q}G8hg48;@x;;!lK; z{7_DeAkn$c`ZGNzVf42cd!ikofiDrT*qBVz5fM<>h;Jv5@(j7fToCREPPm+zJcs@p zg3jpkP&vaJ5Do$xh6&B+2q|^3B2ADyzT(cO|SPG8?O%puaB=!8?QI# zub}eMVBlyVARzBSuAKrzll6b9K7)gR)FXg^u)R?YoXxF_=pBshosAux9RKyhPT$Z{ z-_+QV-q1|n!N}N&-qFI`(ayovz}SJ#&b?68+ICq2>1Cn{ixMEPP(BJ!rO?LRBNdY9 z`G6D{TKW|;w;#V(=R~`{Rc`y`A-w^fqfv5p-N)bE-Q-8=l16q03jqg#PGk`SK75dp z?fdfm75gm&;XPZRke&59M>6sarAsZrqU88q}ikx80G zA(+5teFblnSe5}(Em8$M3jfD3J4%*k6|It5esDPE5{Krh7;HGbM3azfc^QpzYpGl| z$P7VTk8J)|L8QnZbieZ7|Cm?p#bYfMhr5)5RK)663ymF_KBXrGO<}kOVaBgOkKO{4 z4}y#c)UaSvM7u_1Mb@P(QXEzMiX=EX#iL+Q95Vv$MJ@p7cR3?`62a0VzLTZ8j5hA- zoeM)jmgi)%44|6lMyM)kVi1!}?Lmi8RvxF(5M8C%XS`J~1259IH1=@RJDMTiMi1>O zB)yARQxcH#z@;Q%1Mnyz!=pwn5#z*;OOj>x<)jT(l zCik$r^1OKL%>Rqe*%PD*Uoz?gmK^>1HxW5a+M|SaID?i2B;DA%pcXVyzP zsY^cEBIPS>mscBa{jAXe7oyF&l0^k{%|T;sTc+G=4D^T0f#OqRGa=`)@0TP+&L-)Y z`z#AG(!nkWvg+?g$%?->eCEQ*uZ~%nJvrzAST?j)fHNk#uW4NxV3u+vfoZ0ZRp)a} zb@|F%@VSV1_+Hdws%vPc#=}bQ_Y8G@n5Gty({^(f}XI>)XIYm z+_3v>_-x6R?Ll-c>04;yQIUNgHS^5QoM!4$sjb8{E+}699<>Rmtl-OjReH14dkfTMRSsw66*^_uhq) zr-`NYul&zWxl2m{tDSL2=~VPgk09+d+3WQ3*_qxL-&xyj?Oge3m*NUSZlMf;w6Uu8hJ6p9(4uLls^_ft>bQ72LgBM}Gs2C{1+Kz&ej>vp_ zv>XXulgSCX$O+JfwFksMTr2RGZzX(O<5YMD0`ld}zcT$dzSYpy+D_l;&95dZ$=WUp zAhkcL@r1%kAbb&NPq@+hDp`&q(5TQyskyS_p;BjgN+l;#{0b5H%|#tc&T(M8;3$k)~3s4 z{&1f~?TlP7T6lEMl5uH>mBM@V`jxe=5=(b**{QHa``kaSm}xH_aU z)>&AJhBRN&$JQo9BN{C`ZaiHbZsvz6NbfDKXULXAUoecdJdE-)f4mMYf6F3>09B zBO-LS$o-XzF0=Z1=Y? zU>o50BMvCh6))coQ)o~f}6b6DEQV?GAKlmKGmy!2C6#r zjZmUkBmr_^iJvdd5pGGBxKgo;9u}+#fR*N5OrJ2yt3oKufIer&pD*@k^hu$9rQiR) zkAaefue4qH5DcaFbE(W3wG@PylT?t=JQR6r{P}wdf$yVD zUb8TJ5Iu1YjS3=UjV-x(X!UU8)M7qRp%L8_@6g~=CY}rn;gFD@h|srPne_AxL~GtN z=%y#-S`;IS;*YB`$~pZ8Wy@)Z>iC6=5n%JNx?O*Vi{11HqPP}(PzFqoxG=Js^9~A{ zaas+Je^EY!72a@N1hW2Z58lfc{f5A^6KMR_a8cJruNGk~D+r64Zfw+*Q%+%nF)3ty z6gWKSq5#oXeB`xtHzpmvrGwy|J*!Q31}}91%pYt04y(GdEwCw77*|lXn}D7pC2zta zMqTNUEg3?r14T{TH_|}+%)*zz)9+Y>h=j!SXe%d5tEC|C<%am0OM^d$S*OtpMM1QK zVfe=sL05%soou>gIbmuY3X}BYdqW}*cXy`xFQ*1*G zL^2$lJfO5g2Wi7$KP%8o*f*RbwxFn$(a_m#ozWgn!ZU@r6&n0~z`oJqppT2mdL}@h*W{(`( zQ7KLm<^fgmS#h-rwOiuKd~x-;YNPMN^$k504MCK*J?8P?^`=9(ZqQSQ)zbzeX4C6V zYvThPbkhb~KVh_BJHv<9>=eBcgNNavQW7eu4_*Y7v(omN+O9y0jzYhQD8{}GS?~*+ zGWd12LTFCdb$)?d=8MJLhz+_=1TLN*@E_xly|mI)Pe>3DySJeU$A9C6tn{7CZ5aP@ zL5b>smg6!PlFx0`B4=Ank|La>MEWe0o!uzjJ3P2kBc=}nHKJ2}>dF|yc0SKbiB+G$ zvbt;39#5OtDdVIIpE2vXH(I?9oGauu4h34-tKSY}X(7u8-{B1K+nwZb0;>+3^cA>=H)k`d$B9@oZZgy2&eQxftIE>$4`8m8czx4*g!>Sz!qy(OpomJM;PA7w z?padlc=jmbT^MFM#jhAxgZA4+m-*mFfC{s*G>s~Q>c`fwr$GmLXg5E(DxxljVKj}k zbblU20=KW@6Ez%nzL1Pl>{k442GwDUR_Mx8?~Zz^&h7^Fn1WPaL46v;@>PK+yYLou z7`*;>gGqM=*mf)t3X<%~mQHx^tFB`6h$8jNYdWq^0_!Vl_MJN%dWd3E{`!_Iz?o*e zjwN{Suo;IPmkJG?p?Mf(>SJ6+p<56+<~!!l_`W?swBQ%ty~wHVuHfd!k?Jx0UX8tg z@DH`0vsHQp0w=k20(YU?A@~C1zrwUhMzsf=HY;h@$1ODZ*Y%XCZjOkMv3o&RgCq1< z^9j$o5C)bDXo-X=pKFCwe3z}e0fw#SWPC#d;)F4s9$YEt_{e%wBr{mP8(C{eT?9@W zUYkW}d~`~|vCuCK8TIQ46DvVEhIO8-o$ilop}_ZuKXafeu*JIhdUZZ$5n22^%%A<2d!bra_uT=*>s)5eszrTiVZcxSG=-3x&YjOVf0S!0`Hj6G9~}GU z9p)o7Qv|+?pqU(HzoC9C8u}g^xe=_d8rkR>>~32fQc*9Plo*mrZvnL(VPeH>U4? zUrG4(+i|xlL(jSPJTc>TLe7`@a2H5Be&}@MU$BN&X@npy6ieY8ZZez&-PtrgLSQCs z$2TVOo8w)q^?7lAfAqfja@TS4)0pn4I3+rZrDOnkBl&7yIQ&i%*q;o>xM-Nzw?x%_ z^y*-{Xo&Zz@llOh3v;gtnY73Xl(xkY_fj2U9~#5=HS$?U-dJn(3b5us4>_mHL@aQ; zW0SB6JVw$jc1NLWf0O5|*db_g140@;NzV7E-O=5c&33WWXs4j<7bJ&ih$UmjH}KlDY_tN>=%?x{-U^;7%cGZ6D^NIN}7sB7MxFX}fV%Sqle zgju0dhWBbtoocc(R3-A6!Xi)HlXZMoZO#e7VjdQdMq4X6nb#AZT{U2bJ>ieGz<9=! z=Y((H^ZWMkLbbN7rlwCAAG?p2P^K6!I&9XQ)1aFscD4b?)m@t#NjRvWx?m_7kw{OA zfY7?BKXRIOBoQr|Jyp}J@Q1P4d{zHuUOYR;?pFRBgebo{hHqEXmDYMWHpjAL`bpTe zyRkh^ro!kw(0(z6X**3(=cDpU9XyG3#ai&r##04+hT5Z8JL>|(J97rqc%;Xa%SvwN z)J}Q68cq}tCySQzA)Sbv-b0V8ZB_7=xxF?%-@b)J`1BoMlHda+81+Pb0j-t2><>y6 zUKm`hk=5bx?4NVXyK6C|B63B`3Y~7BNC=@sY6Kbc)UD<0D_ zY#qRP`}iPMY44OAc`M?P=9h~mIM`Z{;*`BadMpJX(_k?^cDN(_zH!7tVIBTFZwR&Q zr2^i{S^Nin=4NSwRSX0&cb?|D@crUlBWq!2aSWd?#$e@;$0Iy`XP# z%U!RWpyb$r5{wJ82=NP3UbO24J0#Cd1t~_Z9_cIFeo)RTCZzQ6mt6~O)|&@;w|id% zR@@b!B90pC73}XpHZqa$2V-au5M@RX5U&63@6E>4)WO);(%RO@*y?Rac&ce_yTXC; zQmMtQWFEEgB^m>g>0uj9!3Z*&I|FoS~C>f|@Qf z;A@7?pR@BZuOwmIjEX7N2l;9yKAv=9_NNU5yRPx0_yLgzK|%H*SH#)u&sZH)nlZ{x z2OgRHq!$B#Jo*<`^O#C9%W&oQBXNM}3wZDP6qm*{O$a6W6$AB_pop9x&nv4W<11ro zaCpOsX20V%l8On@hZIVL4Q-zs*w}7G4+?|Wp7i7I+GrCD_rw{Y9H?kU^$Fff0VYQ> zI1Y7;ffFcQm?s@X$OfN}UWjMlc>54jW*P;Zplf{4cV~P=94RTzdJkAdL&Shm6a0F` z9NtVNEX-=eO?*UBYg(w%>uqO-aMVp&quwqA9Q{4q6cRWFZNE0*<&DP zu|%Jw3Vzy$qGh1ANd<7|_S%88@n>c|MPU!xPSQ`<@=G31PT10avb8xlv5*>c^5$vh z<-fPH=P5i!oINf}p9RaqB|-!GeXRmSCKu{#4BZhC7opPcbQagDo z{CQT-ZcwXgqbfY3YJ#bG5Ka*86flb2OGe-=tNh8iX3M8@U^uM)g9S2=V zTbhk&|8O@0OD3<4ycqjDfM7p})qCX@`1sxs?-I+@LFaI;%h8NQFgYWrk}(LO@D9Y< zpYkAGZ&kQ=j?OX&*HUbX;Sz)d7YywzUYMl>*)CYV*O;IjJ2#RMa0z*V?+>2AF(>51 z9|_vp!pfV$ULu7nzbg20`XrH}zz<4r3&y;(8;Q6>zJAusgrhD8L3_xKmFt%+EPonM z2DUgL(ABQdu&4q-ghkUQxy7MU$KTh=HAD@ zGYOKo|7lC;DAXhP8Q|g&*pL^KCHKwXqk1>Nkz)))JQ)I(mAE>l4UqzBucHLgdS28S;qO#&?O(r>|nXDkK>V7us}+6abmmxRe8)Df7j?R3CHf zhwgXhroZTW&<2}{c77}xd36m67Y)|HKm~ztW4Y@vX23+GDeYyuZr=BX;zjlIPMC4n zr=wt*1YAr`aN|Ys>w;f+o0pa+WIfiF5rB~5({;MkjIWi6waf1Gzt#?3uuH58>~SAf z(oAu+AMsc5CIS}q@IHlo?oo|wD|l5?(*u5{JQteLjb*i)5O{X5b?%bTsXaOM+*)0Y8uEFipoO8%>dK(?qFbD5B&f&P_vGR{)N*aLdC}hww1!ON z((qWAzpS`Vg+qAt`iJ?K%sQ(4;-%JnR^R;o%Z%1z%n@+r-Ms!dcXixKjpE8XdS%kE zUD=HCxYH%lSQb;NT4d7yZlSEkhc_OK`^F^eaUQG5LT)L|;pG?kPoM zSQ+gJV-C|euUT!yaE$esaf8OUV*=_rZ6OItv-4rqozHA%k2`NFD|FeP)^aNqBcY+m zM~J~PZW!=$NW!dp(1>)AWwHFEWs|0|{&&bUN+s;Mc#>nO+9^ZpSWRrCFUmvQ!}n{+6Xy<6&Mz#IP{{~&TZL-MY0+NosQyYgdylY%yNl}NVKul%KG)1jK3oHb{V@PRR({7$QpKF0MhFv>j4_u#Wwf!| z*`@_3Og+|oaD~swFhW;{f+EKyhqF|liVfYs9>4^%3jmePJ6}du;8dPO9yHpZQPunk zJzL$y^Sb1zyCPKEjYqqhRd20{OM0Z#;!?o*9pS4&qP0beapRA|QF!Wz@oe=YR81hT zqzb~;Fc>@11_Q63r|LTnb41a3#iNiG?|})>Nrw0>F;vRbk-#D;zGL3soyp4Nwehfg z0<`SFpfVNL# zeC}*5TV{b#FWy}#texB~$lG%S+$L$&<#ZU&Nn3Fz&YwfIf!6ZEQu!u-&TPGE8nOgA zVarXm8qmDEVVW6Hzuui=t%q*nrO`?KJ#Z7S>U^B z=`TdkUXiy+Qc5F8Z*?+C16DL849j%+uaTg|3xN~Chyb!kMKkOgLtsh6cLveOBjo4u zxGXd=;6lZ!z`^M%gA|0MsG~bD*s`C*4J;uSlte!+B@)g3Swwb7Ev%%k7VV?R6cfXz zghdEaCdg=L`2)wyZd7E*l%KB&VNWE7SA;cr>UYXf|;QYzhryhB%E z4pk$%9daMyMZ@tkU(`%pKS^z=2_3r>*%U+Z0!Gdt2r1elpF^bL!Pi?di8Z4Z-<5Rf z5B&JFwyHTuPL?Sku_pheSWCLQLy_Q{gg$#8?=ztQ)vwTj_p0w}1_%+f0tFg>8Z&gZ zYmMb{cLdX~9oBPaZRp0(GRkTm=?3-XTMt2}lq$-k1fo#*Dgeu^WYK5e^*B;CR!(do zuK;_1Eg-#>(n)_Na{{Wpznc5YumM+d`n9$%wt-*`SzXlbhkj5&vAC39(+v1W<-a^F zs*1pc3D{1MOUCgX(mv`ri8ct8B49IK&=z2f4Lt`zfqSD$m1x?LH2^h5`E>V<8!lX@?3u2o2wetZaY|4RJI9!G zv2|hrT*g)5a!w@jOz$uqLd9>F<o3`4%vrR^)I=0)*usQ+t55=XXC|g(6s^yM zVMD@MyRjltnzr7-HtCe6YK(uJMWX|+!#nGc1K!en~%{D;S+^<7Dl=_4>e(Y)11)sW}-G$SuUwJ-WzI z{Vd7$ox_r4)QdFPUsN5TWU5c93!tXj9xom)Yd7>gC?25IQ@hB8#hrO+2}Jr5Z{Y&d zs`gDg-broYpkAxw(65;H7yf$ZqgR&yGW@97@GM<5HG}!IWjs~KWw5e%0PR7??8MM% zR8E`s6=n8}-8X+XjiRQJVWM>L_4@EA5W3ssrTz{@#Sau6SCkP+e3jeI-+_{sPn`9{>R zkd!Z09a#QYiAC!raNuI_2vlj28JU7i#~h9wHcvW`u7B>s_L zy$Qu05(s`vux59<-~%5Oxx!9^2{;qZf1Q!z`!}SmOIph1VZ&7WI7PWi1Xe6*7R?41gr_YFrBNN;V%w4X@PPjj-z~uSV$-HzF`>j$#~d1LcjC?vjc6&GGHG)@Gw1$y%ShV+XGz z?C6a0`~T3Ss=Xn3RvZ`TWNjS+}+PDTY=B;RZ2>fX@TnEs4iC7923;$xTh7LPuptH z)!GBTm=T`1;z&0%0!)QX;6Yh!xfk8G5p+kvEK-%_)xkN62C2iTedmHFSqLWLu~SBz zNp!)%NLhhVuPhk%C85R+?~5{{6y)?ymx|85ZuQ#9dAsOIA(k)YrCrz*8U^llM5uF< zZ<*m***L0};)ck;63?;vPR_McB>fC-&0geEKhSQsZ>ta}2V!fKk@N8M zT(^}olX}}*!4u{ zoYoO6t^6c=zCeVup?2>Dv(*mkwoYrL@#5+>m#@rEzku{;iDqS~a>){W{ZL+$Dh`naD#|lPb(JbA|s^>6$=7kqlIX$aiFuHh?gbCUCFG-JYuFCC~HmX96w4gVY-^JBH9UNl z|LB`*JJGeLw(CLb++lRfYYuZG<^+UnQihlmPiTthT%x0#(5%3Vnh0{fIZamc%p!EM zjJb{31UzD-GFngl+gYU^H4N`e*q>6xnYO}q{l}oq77?4L0U~LRB-Ju!8X=Rw2v&R* zVwDFFJsj!8ir_Hj-u++SB#}qO8I5b=;G;BgN?k0SmaG~<>}T2pPd^e*E?ZoF`*D;y zStrxN#3sd48LO+Z;L{5;?OQ_6f-xPBLhT_QG8GfcvYt{Hp#%#wcN2sctR=U4DFr$B z3z(DQqbuQ#0%t<@a+-8wu*9ztxXnc|{RMZQ4^F%oj6?dbZWX%$vVDV^8tG%VC@*Wx zpt8jEI4|}L#caz0Ay=LsFoV$x(XsEhRxyd9St*JrYb-sQi!bLPxA*;~D!{#@Ud6ZH zJ>FPp`IJu?=Qr@uikFk9l`3*ZR>eh*VXQ6eOY?Eqol( z4@_^C*es1|tWB7JN7AQL(Nm!R3=D=_KFfRM< zweZlqM4a}Z&Us7X>UNd6?YPD9H6fFteR@Jj-v_`+s0zgL3Rt#YaJ-jH@B$ZXR=^DB zW8ZPIxBRFUYMnc_Em}hwV{yjeN=>bLROB)#zKm_BL)dUeap!pMTvz+J ze+Qg`W(5bY{im%rTVLy2)%iJ?v_9gtlY}gv&5e~Fa>!vZRt#faDD`pU_C~vv;PVR3 z<*1uYK|uKVvOo%|T$w2}5%=bEwaiY?X6tU$4o$d?sq#3se#)xvT$^(FKkH>@sLN}m?%%x6c=*~-CfY2l2np!b) zaF`^7p^}GHbcRZ(!;f$eN0rMWM+Ekas35z28zq?XWQrO`TPH5kbaYuYfu%&>f6vXp z88UannP8sPE})vC-ckAIWrL!fi+9E#3N?s7B;!PNh=lhy;pwuYsN|dTx^sLGe{5V1|nH zCY07~H1PM2YxWzLi9vgO;uG)e42rw?xi58Q%}8D6JqBBE%O_c0M<)VnO_$@f#beJ{ z<@VvW8Pqv(>0${3yu3gM7P*^vXajHroqY2D=sfrRS6e3Y@eZwWS>kG$FAw6OUqNT zm4-B$-6-nWN!kkJpz=i)79MeB12zgaV&tb28;U856K1;l8ker1Vle0eJiZR@0z@+`?2`;rGQ&@`ZR8jQX(YL`^Z&Q6Ltq?<9b`=Uh;D2wz>Y*z{Q~cDC<5xCJj!YCj zpa`qwGwJiHV$z_9WkJw$)^OMHYlQYFG4B)7kXYSnJ~j~n9~!jkME2i<7n30E1+^cOEm@_!bR#BKc(Z+@aml%-&d3A23a(wQU*gT3~b{OWGCQdDobe?cwr~x_>YWq*VK4lxhnpKZ z*&>D1Ju9wH+x13DLsp&^2l{CV&|)w6K;-@s@q~s;zf`c?PLlxjLlOil3netj4zJhJ+Qc=F6mEbQg!!-X+6jF^oK_xGS`yXHJ0z9<;UYk zc}C7DE!5oc>WEvZI=iczPWW04XFnRd^GJtj^1f4e+y5c+nR%4)g)N;-?RL&Nd14bm zLwn%fI@jRtWtW6I3|4()eb79kH@&WP)San+Gv5fOSadAUpZ06jx9M0eLg5Kq;YC5n zYZa%BT8?h-v`5Pf%maM~t*=Wsk$l3Hx?*HY(N=V3o77m|lRt*UD#dKLh2OGGHKY}D z>x4HPet;0i1AMhXGGiE zsodhy;PBGn{R^AnzJ0lnOt%w6GyDa*^14aLEXVsT{Gq#syDuzcD9 z4>3TNGP3VfMcCKy(7q2R;>xkraOj^Y|FzV_1M1@2q2rP(y1xK*P`tti3lW(2YZQ-? zWAJCdE=(!n4~?Y96K&N5QjfOqn$IxZy5YXC1AJNerb~z`{P)kX1+{yE7s0c=)5p++ z@qo^T=mMiYZ7^m(K1PXqa&@xbh9_z8!!Lpb zmyG?0ZrP3?99I%n|2gm%C7hDj0XEE{*+g)2BfXIwSp3Mn z*#hC<34{~AlG1U9|EN-pe-#Ik%WU%%t4%m zKO2U0m0L+HyeBCsnFv0}hrI4Zei%$l1HD}YQH8UYT$3jft2QFFLnsqNB2XZhi%8O9 z4pcH!X9~K*+BOV{)*r@Vj?VRgqZl;Qb%-LLLb8b3!uz%*KMIwYhMci2{5fihkPaZE z`&WT9i$Q%W@xM#0B6AQ9v^})FB%^OiA5th$+yo?)zce_a7-y+jv%vl(Gg_ej2nvy{hkHGT7 zA2I-XplqYTxqj+C4Enff_vcrW#{ zri1&BARtZ866HB-Tw6VM)S6|jb@C!1QzjexN2)$sKLdXU4*(kVxDLg>9T-OF^HG#C zh||lJ2PV6TescG+$y)dQ`Ef#%_;tISyBf94Vi#VZ5+;TM9y;bU-gn_eFFGM*aZxcR z@oS+Vr3;0AHlD3ikzBVts&bfUZghSZ_x#d1P@w9rS4)ggg;I?)FSM_pL`UVkuTA-? zuS5B^ud7^N|FTnPj$Z;4+4L5G{9MVKC9HSq4kv~jLh z66IXg%DWmLxTNvwB#3QF4Tgq!Y~+qmo4+bvY9v&Q_H;t<&fGqM~bU%cKOqECskcEbz>fIRJy| z7KDW^KdWyk?9&*s(WMa6>UBjBhyw!pGUIvq`t$x~mGeT|X&QDa`6I1du&WYJl{99% zuF+gDq(6jy6sZ>R!G2ev_p&j{b@>$EG0;zL*Okus=u^6S#U_V?IZ`RBPN)TI6yWnk zVtv9;E#It?tzRM!6|9apfDLjc3<Klv@Ac7Coqnr=Fnd$II4I5Dtf5uCGr@MNSah;pC`WYk1rGZ~j>41v`&597VRvRMWwMUOP zQe=AmOS7DnMX`mLK#h-{h;9`uPGq`J-gs!~jOAR(Mi`VR_oE_ghof;V@>d`)m&wLZ z*LbVdpxUUolw_^nuatLvpntWPD_cFQ4=V3k)v!*r)b)!6iubjXoN@~6GTPB%8JBvA z9vH^K6BX$qYq$6MfB??^b*kxrw)zhj=Ix0X1z2yv2E`i{XBv6sLM~S4@O5l;zr!RT3edKhFRa&f3p@BrvLQ ztNk8!ho4VRCKcR=qXft@&7QWW1RSP$3zm_%K%<*a}Z2ez29M#y9nU2Y*Kd8W6j7*1gm`l{Gl$K(@tHhys4pQr>Nui)-T65 zH+DHwm1VEFH1(E-3!@FC3X}C-7;3+0AwF@IW7%!!;Hu$nFvW!@uKnN}c^7|v!Z(ZG z?!r+^SkBoxPum~>jGH+|QA4q{*JC(I=2LgXB^KJg?JzxS0R>e?tDXhB<#^Ry*V^SA zIws1|{(93aUxOp1^BQWD+3V)wlHc_Kxo%Jka9pYDTIHj}{p>uAXlC4f`)I4)<*90y zUxf?C-K_&$I|kb>P51h7pV?edLsapc3nxW5Tt^1JdPKAXDVn;o9v4B)I@^WxK%4s1 z$~5ysX|KKVk73=IQ=jqNxYqV>x}>vaK1t}%-oge#=d8jhw$Z`APQ#@Rr19u)W-UGT zpFh%#as+n?vd|moVypD+Njl-?zcxLH?ryZbx~~^MH1J(N-+izAwgLLoJ<;`5|byO6KI;qyWD4DYxJQ}wa-i8YwuBxVbg$K%*NIJqgm zTd#qA!j|{tU`&}!MS}>l=chiV#|F$R^yl}Mde${%?!UT)x)Gk$410 zvT|_8gGGE(BCiKF08FH=vt#mX9TY0g;l!yZO_CVY)${R`yl-D8VqUqD4-KB1t^ktdvc{mgi;*cAM|Da_=tdJ zwLFV{fw)s)W=J4os|;hA;InU51*0ixn7AwB0=>3_i4>S)$q}E1t)j(TH4FMtui}BB z+4J%2ITJ_MTbW>hoqeaQHJTsLr)7z3s?L^|s#QtzWhkI>*0Jv5crP<)JF#vsc<1E6 z+59N6sw;E$|1tL6VNEn&xK>bUDhSd+5fmvx2uKqVq)9JI2dPp*=p9x-L8&4Lgx-4< z2qjeMB~+;)^xh#rXdyR#->={2KF|Fpd-lvbXJ*cMcc0nK?3v;|D0HL^K@WaAwvd46 znmFs(3#;`7oN(Jm-q#{P?FDhsH7Z?U!7D7Vdjo9xh8%hK1|@#gQIlqu>8{IO1<4Ze z-F+JNMH|x46KEC5t8Hj&b?=lgvSm)*d_UdTo8H9JRi*~2R$HPUhh;PTJRSUBivV)( z{q<}c<(64|BB@^stLA(z`mp94THn#Hq8uK?A;FOH`0#>SCHYisy6UtoR_~J(~7q*)J8j`7ZHxoq}x-R4%S+wS-_^7tsVVygsufiprON%~Uutlo_qh zz|H@{ijiqU>2$PLp*(vRoTq0&A?FhIIcod^qH=0Qse@$Vjl=vs%3o~)y-RO(%o|vu z9|xL=E@ifKZ6W3&BpQxUyB&a(Sth_vJye4|@Jw2CD1)~|t?(KS`1hDZN+;dp_M0=q z2lKWl%C*hLoW-{hq!@fbC9J%1eft>Hx4kua4Pt4Qv z(+psbVNSUnU&C*=%A4ub&K_q(+`K65dH4zU>K*vn=Ofqg%b+`al=#oyU`^$RQA$7A zM$Bd5Z|@{p33sf%4bl8e$p8KMQdFj(%)N)VTC-lgefmT-aqcOm?M`QiD$_NxE6@4O z?dC5#>IBE-<+Tg=O19e=_{m2HMz`FnG%d^<6t0f+pEHSo**>_;Q5fTCk$=SX-4ARI zj>hK>(@kD7_r#x<_@)eV<{o|*Q`m^>gMru_N=~^$zlM-PXDtl1A|(NI{-})gos+m& z^8E#Q|B9&S=t8+Y`ASw0qe3W?UA;POX2pXHDjaX3*SBtaO~rK;Hn&-0Pt99~ueep? zZA4zl7Yui8eASaoUv*Y%V(YPOy(^$s#0M8AnwH(xUa!pZ@3jJho#59N9#3#{X^mz& z1rOKFadXftW!?(B(;y8%vNMQF@3r`vR?|KSeZI-|xboZ7m#|zZ3e82P8{7^iXVKPd z2ykDj4<@tK=&_-D<16hurF$ISZ&OBl9)R~JK_hiUe78z`P@mR?k}h+mq>AgxJ}s?j zNqJ4wq2~dn3yaQ6f9N7-*|Di9debCzUnGOSc`9jzM_=}EnJUu2B$ zj|SiUWRT^#@L_MTx7OH&i-oq+Xgq{|ChMxIjESxv?u*EZ5X*tMwM$-hA9(EUOP3m61O6G&1X?@*vpzoKFPA>@hqNxZylzQMoj$uO^rw&rJY<=8AZ}d zk5q%!j}M=JneRmSR0Cs#l^$QBwbbq`nWhC8+}4QJ(?WlK=AwT?sRP_hZ_DlY@#^~i zm4i=qACR9r^NrN}^oBC1lUnR9smWdLi?~tngX%Vmmfmz2C$aIk-vWEwStRxWi>@Rv$mj%4MCar=P1f4IQ^ykXDdR$7Q=GLK3q%aN?Sdd}+LZ&K1 znH%Y`Z?y4A?V4~3E88~lRhG|`(3$Ah^>^2c$9GKIJWv)i*=$s{na+EGLDC9Y_TnGX zN!gqKRJ zO2`yt$_uQ5+@ox+d6D$u*W*%o`chBBPT;>EWexmj&}6?Vuxos6D>ysBvFxYZQ@7za zoc^AEj!SPe=>?Q-(qE!33R*ywcV$v0%&8+@Ngmwi;E;P$owC6XkQzD#_6c>4-H>op z{l)1*#nh3jt(KT2(;1eSNe)LolBW%WOuJ>>`p)^=-}%n-!{Et#u^ul!eC?#B6`QCJ z-f_`gd2yGx%8jW>h*5+$WAc!->j_e64XUDZdx{$Ji`-vz@kZCmwM=R7XLZB{-0q4Y*Wu?dA#Ct)yH;p3&BIz&=4NE&G8v(&AK7+F&h{f!b-MnMJDf zez(i|HYe++@x(V})~^MXj4d$N8(+#C0AS?mxRhA_Ch1eQmb)j)Fa?AQpOdv~@b)Jb zEjMS@7g|vGaWw7IUvX3lA@YxJQFh;d-y~StH5zh#`rDt^G z?itjYDXgWvXfFvM6Ei6qwzhe^kgeM9e#MflQsHVm9f_8k^w^p%^zp@IvX8kDvK<|Z zZ=W6On_XtieKgMsC0A63-$TJO*t<=Jv{~()^e*d=1WjEbagWijFFO7KC#T)%?7Z0G zco+1J>h;f^Z@-p+mLVn8nNM>YL@^b2j7h+6ojtnfIv?k*c@f(P>^?mYkU(5_t1=Y`I$!;4L@9PgA}@TM zp>u$@=3=>QEn5UAXXJbR3_16;WL50`UXutY;8m}@??*0~&iYKXY;JYJYt5T(@|e(w z>~U#Nk(yeXn|;&a&}}0XyPfuTmTXfYCFNY(n8y8Eb?x8yC`_y*qK4f{`gx@;zKtl8 zlV1qe_)sj*B&SR#0@aOlDr;J+M#Ql@(~5nrvCfJ6v$KT!vytT@YGWIk?H4^){U^&{ z1!rC#vT7T5)U2KR*K*2ze;bT&%{zOh2!m_AcNGj+3!o);vH5kNuF7A-qw*AF>;ZAC<*55Qj z&y~vG)!e!c@paWj&z5moD zGaNp1EzxDB{CKqDdRTViMqT}H(zKOaFu9^rKa=l{>(4YICgEdE{C#bov0#+%@WeSi zIhDHIguss>CO2jWu=auYG>D<*;MPHKR;%KuKrf#n=XBbXn#6S`Ef2D5I`3 zWl>>DW%p-oxrnmZ=&-dK72oyl-3N+ZWzMrU$&`ZvLa8p%@gHGm={Z=T)x z#3Gw@StS3bwwhJqJ3`7F!a6JZQxk+H5B=1pWIXK-lIG=H_Bl&cd+~6sGYB8^HdF8R zRB-DGKTto?{lV3>bk(AXhswSC_uX_;>SB8P_`BXFVHBgvpy!k7l|htafu=_^;wvZD zhN=<}v-;;xj9$iN$&6z(lgQ&~YwwZ;xRiXAvHQ}Iag?!P;v%3byPD+;7nzre$UY>s zT4p7cy5hR}_(LlZKgo8o+@0<9T=9kY64hoQdq<#*z3%Ck{6}C=4UFSQ4;B0e?FW~H zcb6h-b?F7Zjb{BIHF*6}F|~5wPD%#Vo{f^wLT2?K^tyJ4IZ^&~ZsZPwDH-|AE0%VO zn^$B~Mls60&R1S7V8fKI(Icq%ogvx*(gDcWVj=5hLu-iou6`#B=%A9aW6Px?Oe z%q+hK;=8@W^))MKxRnl!=T+0A8t6hAhh=Xv#C-Wg$+7TJpLLJ<=_)z-ev;LF$nl^i z!emBmlQc>_snzVX44!IMY6&KV|f#85gK%TX$%4v5`UVj1Aj?7-}NcM!^F_lV_< z1>-I$)`8gkS!i?fx@L`CUf4&r$h!_?ExvdRq}_*_6er|OTKH|VFi5Q!J!oNGw_Qs< zqgj8x{@blem^&l+GY{2cp1UOTiik0&;*A2ACq7X(16V(U{5D1r{QP$z%(z|p(MyKh z1sp!%!aGa@0@g+RsEUSw_iP9}o{fUR;pr=b<6EaW2U8BlH3h-xx~X*eGe0wLwN{BI z0djlTy1IbM&(9swiVv?TkCq7m(T@+WEf(LJ=#_dWH(JAw&Ek18 z|9q)Wt1g9TT0nhHZd+5SHe{A=ZQwPBxV>PsbQMTux;Xvv2*rS+!97^pkmsCH8(}f=p*m;IrcFQwzax?sFw?S|vW#ebnk=D>rB$e<%~KiP zt9(koDdcoHl;o0Twf*&?{C6c&IZBZB9}iD#;)^EyvV{lL0=RzO(eZx~$Ew10U+Iwt z<1rC7AuTW&KTs5iaw*j!54_h>+=@U` z9(Yf_H^dh2DZ1Wn$e5n#&;DjnvXj=}OZNhh7kdVzNRX)*2C^QWP)47rPm9ZM6`)s` zjq;-EMF)E-d)*TJpfs~5FD}Dv7FPfjqqGd)ppWmz>K>-Z7fq}Ly=#3a{2=GFod$bi zP*Rm6Y2Lqq;Q*=ZO?XYxxM!@Z<$j^SrVJF1ZBnF9l+?T~IINFucw=)Wvi}k9V}s_j zcf7sWL$aA;<+dp?D$V?I=0rqHhPFZ8I_x9zo+xZyJsce7ipM!$9xpJbMzf|_7r^1REr2`8Bk+yNZfi{ z@XCA%Rpr`B7s`FpeD}3{fxIv9G=6i7e%^ipQexqWtKZ|F5*nVEn557eW;my)6n%*k zueG~zVW5d4qiQT((j#xEn}s!fOv^hBo=x^_H%QvY)gEH#~fLN`1uPi>zb_s+mKA3wM$G0D< zS#zvs*>S!n=Ex0)&>|vLMz2UsxYiTW__&^&k>CHWDWB=8{0y|Sw~QRvsAqgezLPH8 zn=b!6Lh61$brf`08QQ{<&dYjVv zU{^qL`9wlRpIeJ=$8n}x#yl0ivZz_o=pzkzeD&Q$>6vcNs^8FnC496*lF>T#P5RT@ zp}$?^W;}ZQSL8vnKhwB>`vL8oU%nBEJFv1yJ|giqOYZPmsk@(=Rt) zED5Wrd{&ALk})7Abe&AW?A ziE4Ytq9bEY4PJFCl)+Fq(4#LL9`)W(G&FCk+yRD2VN7KqImN{$?Os0}VF`kKQjHI^my;YRIo!r}(<4K@D>SVLV$pcu8DD+N+Uo%Tt8O&e9f^0pAR z!$xt{TM_>_&-^s@?5DC~LcMcRVE$h7j(%#gE-mHCgx<)blcW5309xA%NmxUy*coL= zo*l$Iw6LT^NpnUw!wUyvbd&kAO8frjT`uP$Ph^S4rAzVUmk7Hl{eO}CZ;lhbWwCLz zAS4SUkUSa@R(;gKcu#| z=$GB{SikREfAR0=A=2-|F3J|I)1oGAC`yNY-yJXf9-axnWZ?HtRG1_#&VwXQyZV8H z;{;~>K@fgxukm;jJMFWx7c$cToF5Da0jImjSR)DF&!3A#fiqNL$s_ab43$q1cta)FTGz?~;h%=lDmTx^{IzWBqAnMVA<@o_?j z8(uOQy8`TAAfSz>``8`4(S+~uF|rC9k>ZQr8$P$UJU^c3P$`)K4%cw8Gxhkxg?B(A z10I(}=n-4V41TZSH?+~~yp00C?;xJC(l;-0evD<7I6mFzpm}k&wGe`xX}}-!?*KT@ z@65jE%Lo-_-@~9YKKwkY@qA``MvMu-FXiC(jwgaj@N2_CGvXKP4l{FZ5j!tl_#Soa z_@3=0NQmPNG>w4cksMwLoLU}kdH4()0R<#3mJvV=bhCsRI6n^RcxU8`IX<`;Be=yJ zplNlB;B7oP1Wu3Fl<|m&#*5tqiPI70hLc0w^X*dvHpLgamD01@c)l1L!Q6;HY8dVy zI1zcKf*n5Jq-Z=nZF%Q5&kP)|9_fe6>?u%7M{#wdeUdZh?Z}H6(Mx#b)2!#pXgIa1nw(9X7g{ z-wQ}NZ&_%>&xY^Fi8OTi+=M$0ept~#TfquGHGe&#q{eFU;{hjb27I9#UE_q?ceQIVHtgK z8y(Qb^A)VyYvAyrg;67dcSmObOyUBc-&P{wi&4QexqSzo4mSFFA0rnMB4&J!j$>7r zw^wTxc4kI)l6o3Pb}ik;fkRwBlLwmlbUy*VcW6K?(HMnC2hB|B;L&5u627OKdqT{O zIG|4!e?javS><8?1zfhOHujE}`gdl|OD?d-gDMwCc+;x=dN;Rr3A{Q4t#X*4!VF-K z_upAN*5h!Db9fA*W9QQlTBNZ)V6mVCZ;!ogG}G^fy$n>pIk97LyL_>Y1#a6B7{6XM z<9&X*Kww_>m`Fs25pD#3;eO^T0qmr_8%+Uxi_cc-MjJ1@75uC20T*o;T2`c9B5*c> z5r&*#j2iL#dsP6rA@>5w_0!}2l0-*|i{S;{;>Ocq3IgF8u-MqmhH5C*w+To&N;s3+ zUQw=gZNQD-W&q)nBHxRe!}C3?8}IQU;5^rXaFaM)qQIkQ@W&wla6GXhao!w(--Alv zPk0-S&!N62A^pH<6mULIjKw2B1v`znjTJ)JB`yXDcNYwPK^D8SL&CFk*fQgLBL92p z4hFy-3_J51U94|lBl?+2G^g=x9e@{BLV`dwputP57&n0fpx7SIv(3r=)6F|8r<>~= z9*t9tUYmf+3$NcOOnFCb%#1;b_-WBje?5Aqc*Wb!=g2+rViTPtb*57cbqHE1?l0b` z1*)duLh~0TwUlG>co)kgXb1gTR-GbI2QsnCo@aKc0eQC6aDET_rY4fROK+NX`#Z7$ zYPKKYWQo&`GC>TP-A<|Z5?g49_G$$B&OiDLUwT~(XYV_MI)qOHUGD8-V z0HEGiC?!g&J8jCPW}|jE`OImD$;+`%ABx0+iD;w}P>2vBd{U<_VbuBVn`Yxp5^n&_ds#5v;w zO7aI2J@G3qUghPS?$~PLamHAmq#P=4VC-RO$-6+ewe2xpDK_^-(JwosDLi+rFD{&w z({4siI^H|lQ1UCNYnYz$R0+g}iG7}}S+>jcYB;H&;6(l=okSlvd6@cYQmZ^kwwrsh zkwa>#JMQ!X^ZNk4;#*r%Q*$;vX5fVdo(K?}$5AuA{k=9EUiag-M?$P9`OerDAkh+n z@~+n~oa|B4Q^6lbABs&I2n;$2GuLDX-M*p1z4YN=rM7$!C8ocm>~^mF!K2;kl?KaR zHhco*&oF5MxzQRd+$*z-dynFyN=_8Ydm!x4k%(t!&;sUrk|Pq%8M%u4*ANLeSaKP};3l30ET55JWCs7QU>Qqm2=! z8T=}S1*}qk0=(a&m!_^ zZ9;3@x>KV}n_QE4zS11dbf&8TV_JH=XC;-s`nVy8y7Z7wBt;fzt7F}b*3Vjg+}E~@ z3+$WQ8+cT=AAhG${6?zzC$9!2=o)!W#6i12T9Hv4lOEooU&PFPY{%e82w<>}d#~HkfQlppz6Aesvv?xYDM^fT?h;SQjD!x!8-a72jMvlM0 z%SC<6$kgYhjhY=mw_&+kW#shtmFdtP&^c?FrE*dAgE{lX-*vvPZ$sKKtyI6=scL>D<1dwCk(%hw9?lh^qqLOpV8CmbGLH%A(CI_5S=;g&V<3AtL`)F)I$}JMghcN3`A!GnGIxq=Jv3b_!xRQFzC5J2aIotv`^SHK(wx9`QnTI&U!Uy zipjYD_N1+wN96ISd38jYq}Y%0 z{5`|?!s5}PU^&elPo!q^Gf#2LO40h`1HmX|9hEet!;XUsjM4On`u4jv7^l43x&6t? zhhcCd=;;*3$WxPd%trj#b$%;LHMK*bi zaLS6O*$8{Ha+}rG+K|XU8+eE@JI&VV=V3MZW@|Ku`Tcel6egVHh zRz1#IZhAXUZ)s#*?Zyi+$8hy}1)uhiuQ^?_;85l7bIcD13ave--;Nhu%Vt`!BTZgb z?#Z{+S>qy!H1FDdUZNn(FLqZYAh}^-WXauhDkIx6dTy%I>@g8f$TBcC4$n4yLc4Bk zNlQt2?KEmFy<}`(gG0jM#h&N}EW<9vZf=b_S;K;T@V(;KvlnCF4Ri6mtVQQXv5`1m zsmNuqT#VKUxp<|)!k^`ITj=0r|4GRae{57` z!*;FSd~G(j4IMV5jwgjMJuG%XCOYhoX@vzB!cwg~4;C9bxdPemXA!pDAey0F?<&-Y z8R;?|sI*ivQG}K8WJ@G|KG2u$g>iBPtkhsA~w^L7B-&2sX<(+oFP7@;&t z(`1nS6dOWXc^=efhvfjmwhE ze9e3sE0a-auq0q@!8gH;>c@-Cc>mu%1{n7e`sA4|RlGBDq~~)^PYv^4-@vzw5WRLk z7bU1EonFa|M|(|Hj8sor4(UoG)zJM3(kcrhEH7Etb}2`U#eRO8GSpbDx)>I@bD}nC znb_l_Xa@7&`ica(9mf}SZ-lDTnlz0n5*=xN6i)KR@Br^>=wc(0J_*ThDV)VSx?GGv z)ISUdg3m4n?{5lLj>;;U_faYGW?kEkRE-r35!gsgKKVksk^DJg?!t~peu@B)Q40T3&cw;$HvMrvCf&rKGg* zj#FD5Wp2zo7$lH^i@zhw0dTPQdHF_b%dHN@_`bJ_dXs?wP2KI^{BX)6ghvBr;$Y(%cqQ!&&9sWHFBh@=o- zM{S_*E50;)_IODP+yg4_ocq(t@~}_o;&d!)7r#?X<+6G-i0^2mqznkf3clsaSuHQ_S>}FVsERQHyt{FwO zHVN!c?7_D8%Q#w2Dt^M=i?9O`>HZwa3e2TOs9BLZ=SNXH-1A}Ew@qJw+{6Gft%y%o zvm>Kg!J;`{z6>S|$atiboCzEkXIC5QiRE2kq6)n5d1b#bfSsB%%Vn;7^z%dakQFz? z7b(yLFUX*LURcYB`ngK-QldV;L!)mZpcl`Vvm_vJ5*EUurAbs z*UQ2blp@Hp^MoE#Iss0AJqBP6Ej{$$p3b!&*%S%F!OEH3-bZ2zN}y!;v)g9R;`Dz^ zg+_W=n3Y#B_$BiAeeEceZ0|DqVe&G5n0T+Y&aF7I^~Aw&sz5x^y$?X{kG>}55Ii4E z{;}L^99Bg!?m?WxF$~(aN@jnKu(Su=gW3C%J55)8iY>0PimL6H*aN1^Yf`fc-@Sni zY2GitdU31S>b9k${Ts>^r;YAiVZvfKN6+sd2+YeCH2J_Mk(6FY>bg|WCJj8M!rz7$Kw72WeZnNr9+C|-WPF?9xEbl4}v)iLrG%$Rv*ZW z&DJqlO^`P@CY#yGFCoJVzOIQMbmE0AU$;|Owu#HWU#>9%ZNONx-E{7(Jf)}cT^cbA zkDar+zOU;PZ;E=X4<{b$5wQg1dX=yrrhSl8fM8AgyEi#@!+_PqCEXZ<9_ltzg7;+F ze#(|voYQyt-SO#81>s@6Ry|m{L=e(+I_j;eMw2xK*)#jsfAc#6c~+U6TN7YTql@YyY^SI=1Q-*HMuk{0`vB(Atjc`;RjcPex?aF?cT}T$1F_2M)6TB^;@_yhaTpv_b z_S|4JCZhR^#FlaI&tLqu*~Z{^%o6;fNk_(K3w-6bZ3=BZ^qZOLOzI0S>0>gU?1d&= z<>C9v@c|vwT$BCQ%i04zzf`$05Ql)_9ZOf~_EQYpfvXEYoJMU;di5uMdm|G?3|Bln z`86eKQ(>rH?=<%8LoTBE4kr`O`4LS>;9?wYQ{kH&A|qy3i!N4}ISXQ75j<}$pjQ$v zG`=`BM1@owa4yiugc7FISmWUKW7;SQy5@BiqVkHG$Q4Kkt z@c?o_Y?(^EKO5*nl7ELuEg$G>yo{GrHi@)l#m0qcJ-cvkcxKW~NI3n&*h47j$OxF^*;)E5#_YBLeKpg(dmqw)PM7_mU!Ywn-jt|&i4Bc z*_MgO9UZTU`h-e2_u-H7MzKY{B=mv$u%s0LP!PAq1Uhj<9)fx8q_NLCzm*%Vca40u z^mtk^+S;nQ9R0=1ef+(y@EUuIe0sspma6^AbnJ64fAoq4Zxdg>*A?quC-I}*o+^4# zVJ!4b(tpdvRok*&%-9Gj z6^?_}9|o2X&+DZdxJtUab(I$H9u!HXWvIb;~F$jy5o+}6HmOkXLQMP=}8@7p{mFYPjc<_FrQ%?{yDouD* zCUv_6Hu@Y}$MCr(p=jl;8hc64=u}dgGKpNVFwy1KQGt4iB#K1P8-HsCy~GbZHsSNj zwqtGQs|rrt2aw_%3a2`ckpozHsz=|qwSeGtVYh1bcJ{XO=Qi)%GW7vQ=lUI061ZuN zwVfH#vGsR;b|hl%NyWsyI3`s3Y%lC4#D<(W8YwRtjoq{%UwgsP;(@xldSv~wqg1sV zbuuYJpA_|+!=^t|qi_uP+O&fse0Q^f#`+Tet&za(A!bfZ{f+AJrwfh8Qc)2X&*t~$ z5_YBmPyCh}hJ&ur7r>*>N|tZncJRAvSms6_Kq5!Ewbx#_q|~}wD`@fkm}-5}g_g!m zPl2GM*r*Q$+0PCYPv^3r)u6;@gRH{f8itp;;a7NGA*_RCsure>@;z+D!{>F#DT?Fc zpLshiib{!pU6|+@>{{aLjyD*OgnA|RoH`1NG+6AcZ@pqBV2MjXqUUQ5FOP*x+b#Eb%}noO}2jZ1C}_ zu8kmL=jp2!py!(l?QG1$beq2Ik~_*Fi&;*3$~;`6?L7*v$U+NMv%u)&*7WAGZ{}lW zu+JqrH~PAcm+X%nk6eWXDo*cZeP67T<6sXR>fx&aBala*Mr|({SAZ#rTlSOEgbyp$ zg*RWwa&x7ODt=&?Ghp|!nap$A>Pc>;(*%nZ4cezy0?RCC>v^ET_tTY$cXi@ybUb;9 zktMX_jJ!sDN5#VOFZ5!=H+d`tVl!lWKDt^yR!;n75Z+x3qt=)+2P_<#mNK!9B3{Do zbrz<>?8}a)Uc#Goa&wOQM`*|2_QDYry&fflmpZCrO{aSDHkR0y;tf%EQkF`a9c{gY zg{m2FfL`B3kuYWX<}EJD<)z0Pj*cIYWt8;3HlI91Jd-vZNuk0Om5KQ}PRA|Vv;2T= zU+gsPEz%DEm<1u5Bbq!+JYTo`!jjmYBe~7Q6QiS4>Uo1WV`1{@`}6UQK=uBi=(I1yLC=~lWiXs3@}SlhRsxd(L{GeC(wgGX3{m-6Gy2N;`eW5iVpX>t zLLtK6N~@3KukTh^6Ys}7G~4JsZ;?kYWo|oWx(Yw4No3M@GVD}*FD!syh&Sl#;ps4s z4M^xYsWV@zx5$2BiH&_&(&IM*UU4M)l%!?Qm(OFV6ZbxXUGKgnus*}3fMQ>U+R^rSM)q-MDSWp#F*Nm_~2XT6RzvFqW3D26vkaofhrs< zj6$fvy-Mi=e8B|eP_|V%XwF^6XfdJeYKv$_`A+#Jc&PR5aG6w{^U`wB&Sq{+jk#{y zh#plko=t}PKsXxUltw7pEJ&;;>I4mqLdKZ9Da#sHpJH{etbQ~>*tnWiUheKc4m@|& zKT!!orV&qIlpLu2wQj=xYX@r{$zzs_yQfJE>f}rDj~r?&YAoc{)TbOAET2E@V$1W0 zEY7l7)2)s9bFfGQomBNynr(H6zS<^@aF(srIaKmt_!`mL0byDTC!FW>h(GdDIEtQs za=m1RJk(b23^jTPZ>)xJ+j+e~ZTe(%Dy0hAPQDdHDVQ1orp3a{k)b5E8>w4$$mFOG z)PeL)5KB8aNXY9Ve^(_%)R2vuLwUqD$QmvMMx}*|N;%AT_PUx`pxh?Hdu?Sc;76~ZS003o*)mf1#NHL?}Y1BY|Yxq zGH;W%eHvy)iG1i^ix7|CV7JwUo{gX`=HZe*yRh(z8ER{kh^Ny}aa34>{T2;E-OOKv$&B0CS=vVCG%eb51EtK>hZ9A?U0f{l=F{voYugJH8Z%{`KRhZi-k1r5m z1mqARYJ$=UBGVFbn-R>dLauDZwIrpfZu3?eEb)eefoq`(xf*s{wN(RIu|hSC=enBKl0^zOO=z3zJppED zZxM&gK!mHwE_+R;3|~U=w7~n}TNlvdhAl0-ghSN!tf3Pqy_skxDb2ogu3@VZirPd8 zp1~s;AZbwF3dnaTYJpzZ7NO<^|K+rQmkj=EhxBs*WEXPP+bInq>xsHFbKq#|59#ni z?M=JZ38_sVRaTL$Lu@=t));I787QJ3wT*$7*KKh@MSD>2Hn?9MgdR%Yjtbm^Z^5@} z?Yy8Urr+7n9e7bZB*PpfG2yBNM}LJx8DHH(<_ZDRO&;aTNNFMI@nd_+awXGk((8U6 z8-l}=*_2*HDONm`XjkPb@nMLKGir0{$OVqGZ%u)uvi3)LG&C^k#!(Vytg$b9|Aaljy7D3z`R3WFYA3Gc!zx))jkX7 ztA^aPqxW+Q^lzH(hv)s=I)r%nponJL#R)&~qAJJ+MAQ=%J`K-stM7hA+G{ZlhgErC z;Q*{^YXNfRj(RZ-kN6|**KbWj5N@b#H2Wed1`Ri_f=tw-IxSFnD0f>_FbX~|czOD$ z9bR7sfo{etl$}&UoFQKND5kMwpZAq6mX8@e4*IG&D-Fj;8;?&+3RVg_Ou;?iMTL;3 zHmKG~OpxHP@|GEzHkcf7X-wK5z!gFyY&xdGZkIiBnd^cWSuYF_eo(QKM_Gb0s4ts+ zs)^%KlY;5+tsKai70Pp(t9GSrD;~=~iDEskp9lW3xd-5j2R*#Fm0g8Iy1s9duhND

zDC!Q1y)`+BTOFvgv?QT{dfi4bwZe(Zwj^y)6mEew(=poKtjAhtr!Y!A7>%%GO%4ucG{2^b+mf3_-HWE$LpAZ^4@5%j`g- zqEcl7!yPbp+0c7*eaV3!Kkg~`eH5iBr6#2)CBSOEOmK1Ctq$!|R0iE!q>PpmKE{ zyB4WCf+P*gb{}_%e$n56lGgFfj_pbj&D-rYZh^1ag zJ8Og=utfw<7_obcP}|Dl5-dU29mQYCTZ7!#$}Xd?v)iq0-XJPTsIjZ49bA_wNcd{U zUJF~bNKg2>9iMlD3a#oaHAwba=x@QGJXjbL=sbTV)b3er^D0pWedwRL3V&_aDtksk zsNH`Fe@g$rfYoAH@NcSis^+NxdzSx!{cVH*v&nv7<{UMsBqKzN7CVUVdir;ZXiOH1 z?)Cd!yMXp?p@m@&3{151S+!1EwC(r&Ucz7R}&d`nSq5T&b<@Y0@PTOs5kF6L`ra z&n@u5jcmKP+V|^$dGr}}p`J=rNOhq%==+2!N~%JV=xZ)1YIi=>-dRuPRf*eXB0y^S z){}SS<5)jt0e1eiH`m#76H*C6f9{P}=o>B%|E`9~x(51UOlTDg>rTkO{o1nIMZt;b z71Rm&&1rc*%H4uf(A47EulzBt>jUfHjmr(SD&(Jucj zn4!P9NR5*H1!@-P25O&d`1YkVd}z*f$rugO6|zSE5y*5(be5tow>1*v)Ytsm(aU?8%1dHN? zn(dXsSdR@YjclSPe^h~gK)}DGKSFY&e=?Zfy&gm*x#$u#rerAOf&L!>d!9GNh1=c8 zE^!O&KhY5>3osJ$MIVEAZDz-sO8ktjHWK-gozwkM42-$`<9wfP5!`9>ZH%SlvOz!< z5tIzG-BiRkLvHE-(Dfen*&_jks!Y8h?lrixUM)A;HET;jFPM;}@Xt*0qt!cPeULM& zfgH^cVX?xW!)NC;g(t5SBGoggE>a(;+N6%YEb`MeZHUjw{-{vm==TW2H)BJU&Rd?`H}zT!oAm;!48ivXc)T;khX5ukB!mB-E=|*6lt{8+mkqAg z5;>Et(hY!9ZR(J(lfM&YleLMMhW{#fIrg#mvVrNq53cKfuw39cn`dKge=PrHDHr_D zPF<~RKgTf~lT6W7gO~fyR(hnb{M$Ui3P3PJ$PNS!GIzXq!{7YM@M;~=AOCYWc~&h? zUnlveFaOKAWBRSXICgFHHMkyqect@vPX8CshhXKwpD_G!yQE=29gzpwzvCeJkA?s$ zN^0!;ZaUBTxF)ZAh`8CJe+{AO`J zdS_w=i&#qDDUH6m@=rRfZX~6}{ZB^R7i2}%o2;zO) zXXD1De6p3+>r&4D3G*U6o4vFpXn=p$WD)#J^AAPXiRnj{|5qWQoxjndQV(zbY4zWA zOXANzU-Ki~rSayyuRojl@}*m#$(7%q4wbZdK7I9xiwU~v6jvAcL_5ysv+%q76F|#1 z2GFb$MMaKNoM&rUnI#*{l8RDJ@S82mM4SXV*Tdbx&+KX!(RVU7dby)M)#uM9jDP-H z^B3;re<%nLw%PI2GD*{bcA_vcI(h-Y54HpUr8qK}9dG(40QgVD)z z_P*5Qe}?rpp-O1|{&r@wv1!9zE_+e+{l8uOAJ_d~{5p(p^h$*H{uP5T!lqB9&Ho*a zrjjw~tAAHD@y%%gnu^>4(+QW2by(bLTo4W8A7cG|JqJ_}S&?1|P4R2U8I+nr^D2mkKXyUo9mvCTpVm2p+dq9ZAiX)C$Na z(jvOU8X)>{Us<>XV#1%# zUNV*0)D45i}21n53Ei4T>uvCKLnG;6LRB%X8NW-O8sEuClt& z(ctvInoQJ7nt1>AUZ1M7YC&9i7r2c>T2*l%{3V0mqbvN^bZ?m4PGsTgH*F{m)%nw( zp83)NvZtuhpJXAwN~=k1s!PX%VRQY9UhI<~;pDaAy!X9UlX3E`y*DhVgsKh91hV^6 zE?jGYku}ZihjFd~?;k3gbXx|eStvTB>~%{z8;>;QOKSdK!@8O)gZvbgOZ1;Z8w^FJVm@pGAmgl84RA~Us3rhN{62J!m3{u_`SVa zB!i?8X}qOme2EZOH4GUqMm0U)XS+A=JorZro~1}q_YXnBPOg^!iw}Roe#z$2=%28g zHk>+HRDJ*tSf`G>EFf^~uecY|5!xg)`7dGs|L)hnFrG@|y(yNX8wOw7ZW{efGV9%u zI9_{dQ^NDr^}h**IqU@`Wd4JRVZvWTG;R&iWrA63UJ@qVcccgel_9K#vub|zhpNV5 zCmZ!&o&J#d4`5X%=l_uQ7Eo1mQU5R{A=2FlNC-%mbhng%pwbP}(lR1a(jncQA|V)r zbT>$Yba!6j^1l}_pXd4B_g&wDweFd{e`nY1v**m2x%d3YVxXCRjq_(_zbu5+f-glh zf~NgJcdrPC;>{0;7HEUSR~HnR!alXiS%e})ZM1S?Gp=q0$q|e9Lxhi$eA_j=i<&)d z?36$L3K0WBT3L+V ztP&)TdC;thCpfzWl9J~;@83wgJl>Nm88EFMh%E-(lcyq65e3j(h_^Yvn?pOXO^*`q zb1s|P4t&q9Q}m8Tq(_q?4&vN4``-68LsZ&31d%LwX@r107?jK{=)&5sm${Q@2!9hH z3IbFnPURFaf7uU{RVO>gr-r2r=}2e}#nj1ohc^?h+`_w(lzJ@*faD>L3q-iU5;t8* zEM$ zEUb?*1Aq!c#Q9C%7WNxjTt)hLWzICS?n))1G>01AM%E-3&K0`ZQVD`x!==+?c!`k&4K?Ty%ui*TJ>P2z|L22x%b+GOuD>k^Af#@#zU< zbuJ2*SyH~w!H-#1zCWUzX1i(;GU1QjlyN@W{MaA9F5^VQ9})M4hDeb;-iWi!ETWGl zLslv>i1vz5XZETOAp=DU2MDT>|Aj!2bO@PBsJ%m^xYo~EC(9bI#|cGNz0+jw0pytO zZ$m=Rm=Pd-Ek}WKN!Ni@R^bx2{KC)OlObuD5~2s^R|whrjM4+dar|h}6-nJpkK;4s z68Bt$Vma2Lh6OezT7fk*zD!aCBr?VO(6}upr7eGjD8LD&CGWCqH+aXX6^Jen4-Gyv zqO#JFAyY)%i<@f$kdpR$NH0S#74Of91&J!;wyX|%G9u;6+7emz^IfHG!^z=9EqVmT zXu0+GXJ*OD<3vw=nAjr<16EW%n%fV|XY)-DNIu6-Ui5&6nU;MOkHCdufjvl*yM>)b zE2!uazs)&gUO(_U2So`dnU+VMk}iLL;VxAZ;*|GGu6T(YyD@k zKV`Qd=CmnBCeZS9ff5$uI|2!>?1GwqMOUE)~u3sN0{L zY!z_SJjvk~XJgy2iJ#&uGk=2PPz;BS^GCQL)}O;bc68Q;!S4ZOUr4Fuw^O#bC2L>2Ats=7e!=G$RE^5HtF9JuHc zoS!Ze=SSq@C$2LBng)wu=FL$J0=tk!jZ{dsMMl#yD{9A=bN^qtF9PXRzWodDDgh%SO&%=4K$4%9UQszdl~dIG zRX;)&$`3*ia5-QkG9ee%m(c1Zbvf3qMtQOM>#N!(kr^O^6Fx=s2H{_Z+%E{nQeeM{ z4x-%kScEbbCt|u`A!GSxRqR|LZT-C%0qkyy(%zTjUGYb`Df|obTYZwk2{P%*|FHDb zS>{(U`=h!+g{8X71{f;pM91k?P zHV&1x%^{3?jyJ9G|aTiQ*BaxKM0h>sKn-vWAytekAwse2YL>!E*Dot z4(N)PHB)?Z>Jv^&r6>_ExP~hgFDO5nT-hP-&Zm=^(Da5bf-%)(9(~i>l}s_xW5w4Biy_Pkmb%2^5HkWZFTQ8Vwf=Q!TtMICJ zT-TdlMPN_C#(@^81YQYR{C@iItLj0V>e=W14)N??EdJp_*X_T(Nwy0GIJV^IBz{!P zJ?I2!@ofC*z!|jMC$dzhOuhV3{C?Dv$W+LQM1LK>$6}+XY2Vx_Q6Cqm@UEC=u^zit z=gFg3y}?9)hmr5H>a|^$nd>U^t1!kpv~%)Vbk_p>Tx28)im~xbTw2$a^Jle%Duk{u zD&zcqQMj&DS0!*MMI~M^4_fyA4fE?t!Y{7-wP3F%dn*~ZVXp8pmsVLZHC}|v%L0HK zLdfUSE#j#bR9DP*GtE`2%MVb;DWKI*ER27|m1m(kl$kH99+^)IVaGq@TACh{EsU2q zD79__^>=H1c|T-S0P?72tBri*FR)~{xF~_F+{I@cFToXHfjvZ%&o@b+!knrt^5LZg z>=0c3jfa6*_)^S4+79jIycTwYvp}w-a$qXHDDx|Agb&CTSc6o*5g;p5vg{Z5hHd(? zJgSFLM)FllwKP-MHUX6wHs+Nb&)N?Xy)1biN5Bkk7mF!S33V%a_lmf${7 zhu~QVYwPj}C-tP-XNDTkceT$sjDmMuKliJ>$-#y5f_Ae$d3P!2hZt+^iEA;&7CKUC z>^Je)i*663XGzKjM&mOxYipO6o0<3ZUlZty0MOEMXW^S@d?v`CMJO+S7w06fBpo0L z#}2V*&u4?y@Y+78;EyYiXK>#k20~=fGb?Lryfw~#lv*xg?$r;Mbwds{3ZIVo0rXP& z8wHB{3j$q}CM7gy>o>@30%X?W4+<@ATy_5eeySE0g8GfCiGAfYJonvm{Y$6}YA8NA zvw*fs`ByWxK7;foiD^7sW^!$Ta%Ho$Ua>SEF;t&#Ypi*ev%U3cKH{i;_~=DkN$?n# z5ErwZ-r2M!@jyR(3}#Yo-f~;B87K^Z;2^ipa8NN<7^oP06lQGgv$929J9a-7WNplH zO31`e1}61}2U!$KitRC*fl*d7!kDh_f}<@urVRDS1C7yQ9bd`n2xpfTFwMDwfCq-_pyFB zUjj3-+AWy_|0J%5R)>jADP z-#q4Q`g+n+B!vU7oP{c=`wI?v_k=R_KOs4Cq;G_TcK7G`?8 zM=aS#0M!+L_YVTFb?XM~4@_TodXoAcoeVko@34HVg5(@b^zYXJmgEm~!rx#T(<(1B zGllkm5~iH#kwr|sy5j-As+=eZI4D1;Y}-V?QS7xO9O?w#y8;kmzvbdH!gtHsJ4NY_ znu2Zy;Lg+M11fsyu@XCeVz7|x<+@?Ni0;!+*laS%#<3G;(^KxYn8Xp201E#k+Vxtm zd3a?mXFOTQsb;ArJ6u7u+dHC*D&Ynfss;WaQ?8aknTyFxXMLOx2de3}voE$y9D%0z zJ%u}+L=!G1JDusVl5D63_>D~dT9{>&CZe6MVz=&j1G5L8Sp*Tr=ro?3fonL~S97>dsW(BEj`meHH2bi&0pu>|S@8cHarA;~#OU+_r<3s7Hb z!IZ(6z(SZeSOcHpe`a#j`da$Z7`6j0`UaC_h{s_k>3d`Sj{0aHX4J>{6-*XdgQdB~ zDjn(3lFWhH_#YqyQxo)&(%(Q(+7-w$TV}bm*Ep>s-iDIdNo&1y#JB|LFowX}vB@7RUGjk)#h)#!q8{Qh#WJ5(+_UM`BUX{+F76Dfx}i zCETgw2+@AKEj?V4I#3E92xcPI;w&{Y>T87yzd;o!j_+5v)LA29Oe} zywWshskzZWYj(IIb%GRkuodwrXQ{ps(9r69MOd$FTZ@>#{4lD7$&1XX5@_dmOSMtAsWLvH+S1@3K0nHhRh?^eWcG%6AaZhtGxQOZ(Lh{m4; z^ik4MzWF45In{{k`OwwJJyq3mTmZU?q#Db|`7a$YM{ku98Bw=Ng#}ZRh)xj+-Eo!M zjhbg@Q;W!kfX&Uq>D6xkJ|wX=`Bh7 zZ^+@9xWmuBzmU+rR*TodnuDEvf&641ZX2tqk*X3`!@cIk;9wFG9&T%^iII;buv!Tf z6`++hHn2>~x z+rX-E#J>b<4sw~&3+f_FVBI^X!o>Y(9i&O`Ub{LyzDmKutz%U+a(dwFn4fZw8wzzSSuq%Bf*Mmb;!?6>FxS)^ z7)+4xJM&7;p@+U%WRve3G(3{K+-g?YBMK#P1{_T$Z@O?37%mBbLdg=UIE4GqDtAQr zZ|*NRrw(=Y~dk@mzYgqLA zi$MOLJm3fV@c7?4{voLaBY~Kk%gSP8@O_@XT0^$4BHAAWUtdAs@zj4XuhE?AAmYZ~ zdIJ9fPtzA~aQ;j7Z(X20#2b>mBmS=t_y$B@v|A*E+^kl5BVXUE=x5YR0Y1*Y`N??P zj8+;Wh3~cW%j!*hx^5<15ppjv$;ES43L~-a+4K$Tn_mZ`kl=9BUK8N!5nrPrlVBct zkeTAt)4oK`W`=it|LCnGO z)Y~GDzaAEnm}YTD*2ckNUW)xGWmNCz);{DtOudFWUvD%d5_E1-E8Y>?_W^o1b+oS( z5fYHOvDTBlk`cMltcXV_-;3%wd|iCm1)BiRjbw#BLi(N$LXdhn$A9+A)s z;tMYDU-aLALL9wwwaow;nD~tA*m8ULdvTqvcP-*i0sx`(+}fWnZu^7$8!jHiwYSCr zFSu{HINVtrr^``m;@NcurT#%U=@h{@{|EIC0>l>azdHkeiG$eE``=0~ZJDWQei3|1 ze8jbBIWhdP*iJXHhW3TxN&G(7ie>+BX0fcUuxTpYpOpWE0Kan#o zyvEl94Me=lHE-EE99B#OHOB83#iJOcvsb<7-gOke#WihN0}Q(q@96aCT2s_G_fCnr zBW;kC|D#dr+&XpJ-EV!8NGIaSv@3owf+0PpuIKms1rhhFkl7t7Q4kxl?Iw ze>c3`kXFfZol~d0+?;(O@1y@*k^!JgGoNK3?-E7f-jS5mPZfT+rCcq3fIh_kcVm!W zc}t`k{s4XO3x_}iscZ<1bOd!<_`Hlg4POK)fvemOCP<@Oc}VSlHt6BO-{xL905$ho+U6~F!GCxKTsnH?)+G*7?v?%r zoA!zoN&h{}X}`jZv|7zCvISEOzmMK~*=X2B@8D=Uf3e)%`O%cV ztKR}y^zRK(SHD@ZH_r4^X)c!y$aR`+s?G&zjx5NT^{Vk3mwpO>;wFjm-F~vK8h=WG zii2Dy$bXXpgOqDJ{R{4`o5WO!*1>-6r7Qj7oDcg;drZ^k#m-Exju59}V#x z^d^4XE#<1~M(4C7#b0Ja{QSc`h$OJ+`cDZz8$U$>*R94|`+w-VME<4=s`NqU|H7#M zqafhF-JAd4nAH8hFzNqG5bz_S5B~p3`XQ+M%o6AKbo=*w$|G97%uC>pl=_(>SB)f4 zeecgx_Oo$)#(t*3;QuC0UH=g$;P-_3-$?2{dpijoPv^p9<0U8!A}|PbX9bw__RBKf zpH=ke@Ub_AOO7Hf_4U6ux)=zsB@-$I(KScT%I;*ks0uJ7<0`!|or-Px$pV^j<^q24 z=$ayDM@^Oue{_U08-H|!GG%wHIQFll;>?{dfd~zsPA%=Yj>fEk$>)&%{5{?RMA~Kr zco>*N$X@O||Nc{@SNl)d>Kj_>n;JX(+~?NNmXDL~=dM$4AC6m(^J2a@(!8}wfMh%P z@e8UI@xG|W`k=o}m=&%oyP3HWPL_;!CU&lFt#mYt`7F$1Az24L0S6P_jl%`;^STBz zxj7ZiSX%hiP}4r@7ntMLAIwXP!dy9Knm zdzu(KS+&j2v*=NJwohdlw6Nky<{96u;vAb9-VB<&fQemf<~|%O-A?TLJVsqpD>p)H zsX3Ehl=Hw*vU+?RfVE>2NL6Ndv-U`ujlZHNk?XC5lsn^a7Ei_8yPA42POL*Zpet+a zkybC4R~ns-nGUF^&+p`RaD*kJm3l$cV-tJYBNj?0>9-6Fc=1f8{ao9a^^v`!riS6V zu?mao&+b0=wYT_|{A?zKSV$p;(*!Ad|7$#Req4;@9W|OzzFgt+ zBCmZBx80v_`QJG^nC!74W7@y7Oa|ESQ#!RhT1D2~ljd=LK8q)#nc0ix-g)buob5YK z>b#@(kIh0cVA6XDg0PC>4w|$5?DAQhDax1N+%n9l zL=F3EZu`v*MogryMwrsm;aG>#bA7XUCc>o5+1@m1GfdfGi~3cBk{x!010F;`k7*kv zrCe+%_OO8tHi*U!y|rGXEvP!IohwT?tr{IcUFz{pr~zmOVsr`{*Y!@Oo)ge7ft}d)&3m%|H)QOS95GbvOblc6m#YqopVNM|K|_+ z3e#}}m)_u@mJy)B|J2FIj1werN7--UW-L)V^SPv80%WZ#mN7f^FB}`8+oME&h#Kyn#}d zqHLv8V&M;9_@CnxfH`pVmZV5`znP2z1H;V(1H=FC1NCyBxPOdO=zi2!Tg3g?je1D? zvC^Czw&zhXJ((jXr7Q2I6E?O~0bYX_QTYU}NQSF+Tqdk#P?8~kgOTRxG;qYo|De+5 zQ}~NV+GOLCL+ZLuzXVrR4xdS<^wd0gGO*CJGI}sc^rEJU?;Pnv@1~Z!<3;*1?P1D! zFX}QUG2<@I=QrR5Brj=T`7W6Yv%Cil38-g}aNdrh&U#Ht3 zKX7}>m`MwUee1BsWyw=qqnDhk5v7u|2X*)PSQcCq1XARVA{mSnmMNthJfXPu)(Yh5M(pFQexkTS zrY8mg+{<*kDfB_A2~!3XCEm*KTnV0(1J8_lmwU6{!Gsflk-xv0aulE@s@GEbR=6ttB<5t30kp8=zc;B+kDgWC#kr*~~~FG)KL8LbCCguwr;Eso9qc0;`iEvk+2wnMRnXFqnH}HGY}sWliikex9$p zkKiARk+S2H?ZfRWk3_r*Ze&dpL$c>DMBIG34@-EnxvkNP*#v+yfzw1Wd7mwLF9AJ* zMj=3UW*Y%thP;Ie6O~eY-Y|$CVP8ws#NOyJ9P161ZhTS85Xk`9;X1Le&p+)65Pq>@ z=>5oQM367ai}}8WaQVH1E4IWvnvY?xn-EOqUoqT2NX36G6XOHNwam1#OSO-VBg%e@ zzD}XO2)hRBCBqB_(6;wJbbXs6_G=P$njTh(ZXFCJN(H3>QV9(&o(65Mbfe76muL?J zLQLV92P^y=@O`Ns#gB-*iW9vNqDdHzoRs0i%Pkqr_39bdvT>gtnXT66S-6L|B&2WB zaZe@F!SVUFnGuGpww^7=krWv^PClGVi02I56M{*9iNn*)mv50^;q zpHnBJ4{=!BJuJt*kxkZjK6#Q)Zg}7n5FeMZFuOEjEgl)10pcx}mi9<(0Ke;E+C>Ui z+~cAP*TUJOCD1e#YKhV)%N$bdPPnre#%XHW*9e!(r|LOI?DbgcyUAD_aw9Qv;s)lt z)xwka>W?&|3m*fOqGSOh&4{J*u*3Uex3xw(IH&4S?ROXnYPB;9$3#X-B~8e>zS*UE z3y6Owgnt&{L>^#;+9ILnCQ7Wj8cshf*{gxE%cp-lM`qVc9AJ-zTYoP|x6F$OWn(nA z@7>A`tpKT~-(k;_3p4qX3U)Jt{?@El?FLuxs!XjP$Raz6VWsE>EMqD#ZiF&_6KW;uh~cZdNTWADdgW z)CCO+p)vMa(V41=i@qyjp~&}&c1!7) zr3}_NJxhcxygcQOPG1u&64$f){%_9e(VgG^ROHj06e~Ji)oFOHY~oweE5uV!=4r8 z@sb>x=m&KE=4#m|M-tW}SvJos^Ym)0hK|0v+3BwMob=-%uYT#l=U02`_S`f-`;%v> zqmM4#DbM@5F`W@lHA_)tG={Rm0hD}838W9jS}bCZO_jJPm4HohkS0FeO#JIoiHj2HLQj@f6X@%#K# zRt$?US_aSX2mpj#{rZ%hU{Hb|BTMkPZt6Rat+4RwsUBKzE2?!y;}Xjq-!n8~v!n*m z6yf?-e@}WYKGYP@c&Gf^?7N6{p9pB$?=Hhx7`EAhCW^_AYHsSyacgvUn? zB2AEWwxD9B?GrgjkYrcS85Bcq+3pDjMNgX)+-Vw+cJn6)bouO2C3&x~nE@bnk%%zP zqIr3{CuzBazVnLHfG&)s! z6lmVgb}ypCG!#`N8c}0$-RI%EKCnL`KkGxjjYgb|J|g)}T$D2!^>d}C52b7{Ua9QP zE;F~iD&KkPR)Ia>4RRmSO|1ePKL(ccq~ALq7LVwi#&Zix_n=1=!FbD7A^&2|Lnf&) zw;I&DHu>a8XlmbIgMrFMkTZ7be1X`!Qrm~?j^qOEILg|H<~OTU3bb3beMZGq>%+-7 ziP`H*egoNvr;@8hdxRCLM*Ml8htZ@D`fb_yk`v`%9LTF!hZO7d-ZD`Do1T3BC1DnR z#*W!bPe6~I?#Jor=4mjh)qgTvmnn9L3*uY`y%TYsqo^Yf+R^8lgTMVdYj3r!*i0;zDTkSxLLk_q%puh zVO#CtGJJyabIe`cf06jix60$dz(mQzz_9;c?!PQ-4XqtrARD?2J%Mb@%^LyPnATMn72yl;%7JUvd z(1P0;gY2RZOgm%RlYJ2o(^9O|(=@u$w*xvTadCCB+t=KYm^3Xjoi)j7lvJCFQ7^%l zJ`f8i#j{zvU>;r*1E#H<)cIIGf5zH-o|pfi^LdgtQGBw7vF2)Y@u2C4ca`~A2da)Z zFIG>M@-3H|G)k;HK3g0Nn*fh_&Iu+@c*cFQ$>;#y?xRj1qgo}NX1;ot>4*1>eE9|M7`B|;;@mgDp`RuED<$`2pG2>n zW>5GpiS@k4dCGi`;*0vzPY0GNMIB$V&B%iXqk~n`i()3dlSh5uTelBD{C3&ef@(Y3>iK;IpC%@YIzCx@ zXmqO&-Bl?!uxua0lU;38m>*M=NF4lps`FVGMSXS6WW6Wf{CR*3I*pWrpp@8}Tk&$| z*$3{*?3tS6{ftMJ&p6Fo0agY$?G>>o_2~_{4jrJEY}H4|>`?&!9j7Ag&2QnGqQiK# ziBnadT%4)Vd!_?*(Tm@q_t;EbWUg7rt`%ql6*=~0LzqvHtMjvSKT8YRP1cRi6=d*y zZkp*BC>uyPGC8En;aO@K9-f__l_P!A(NK^ukl}3Vr#ZVjIkeDp0PJ{S4$Fx)O2w*) z9a8D6-sAZYJumiL@{{#O|Fq>nh1;t&pGSBpZ#DLwyd_pi@1-q$aYjq_Zf&(jx7b&2#=F>^k6`uao6bcEdn9r&zFSIT3o~$j>EvP!bD1Em^i_NlD z!J$4)zFJ{NWqkG|y95`Qo&0dmbv1=o2sn6~xogG!nEODAv~#WNTkea2@osT7E1NYF zwuGcwcXxL?dv`|{hqIH})oPd9VE4n-*|WvN;w6IGWt*Ob_2aYI$u*uz%@)&29-DU| z#nVp`tNS&LNPDKp!95Q@)!4duo@h9quWm20evI#W`S2W2=WcodsNhk#3hCknn+;7n z=f_*F;5%EQc~Z|F-x-^0>1o=Ut&PF6AJV^(kZB?eW&Qpass>;EPFtZg7QS zh-0X){9thsxwB0Lf%M{AiJjW{JAmPrl|y^s_>DU%*~0NDgBRT=F`pt1r&Z5KJxgl` z!10d5#!*Kp+mT0tK-LTMejwu9eRbMcH=-n>6Q!fPl!c#hoSg&boZ0@k$o_0h(}2!m zG5HI{myoKM+_#ET^0#(h4N~$Cc2qNMGdt88vj7D-BW)v9<2sQwLb8L0u}8ucgH`SU z;96ib0GoS<&smj3KEx>glV&$f62I2Gpr?bc*h)z(C}JWQ2$Pchs{SLW~wRJh>60L88)SjV^*0Q&hmRK5ZOs>kG7>i)YPD{7Wy>@$SfIn^c z@Z`B}ZXKS%kEl9OP$4 z?`%-fh~d-qRN(s5WK@VA-;s?Pl+C}Bm4p5`uYur6p5p<|Ft8|JlX;SuH-+O_PiwB3 z#EVGHm_@NNEUWq;BkHMq64uvl@lV-UE6fLmEuJ)+ajHBigTAixuhRMQ5UMb`T+&ie-Mp1|rs9C1ga7K=45^A(+ zQL8pe`kV)o%@3Z5U|0zSt7@*iY#94*IEIIS{>%bJYsR?Ymh@>N`BK+NScFL~s^)nG!?DYozpcXvEXq zB-+nNfDWakD&MRMf2w0vzar-S@4GiPULKlD*JZ#oW-vIXO$^gbxq*5`@O-*tUl$>s zcazo^>3om$_swi^UXG)86D!9&?T>ne9iO`o?+_}^6ecxq)B29X&+g4m+q0KBSuM3$ zFPOM9=~hIkpH|nHv}SN>-E6Oy71g3NOm_+7lL79cX5Ps1Yow6Ib&F){^9}c#fF}HC<#W}Iey?E7>9G36FJdiS^5kCqB?-UPfH zvNcTPO^h^6?|Ql_oKwSnq!3Vf5-ZOc6zt#r$yL^-_K|!2!+>M@phs!2H8b+BdJ-#g z>1MG27#1|O`-##HJsFKTD06Tw46{hbOrMkaZBkC0nSA_F@E>SPzPY7A9U$%J#o^Cm z7a0lWX|G3#BcDfKX)Gp9D}Rnc#DU`G zvvc@>lIBd{O|^l`Lkj->P-<23(A@g3ajL$6Yn0^cY1Vo==QyeI=^$!*y116&xjtJ5 z9;dYZNLB`M{1IB5gC%P(*+z$Bqx%x4%YjO`V~zb}s8~{<2dq`qk^^$Ft64E*nJsKL z+r@-l){|ligl_jy3q@LPCkHQ^lNyVo2oy?YQb@Ndd)3c;VWl)+7z^~O;Dy2T@?D_; zR`oFj`=lPZ87cF6ZHK_|+9wh{Mpuf)!R8PqePz@}`!d+IHN&i@zE1hzQ)ShJJK8vM z-ykb9Iw#iHvXI)Us7M+L#-0&pQwCpw7b^?JF1-pu3!NkvsrPp+a+bRAeku@E>sz^6 zrgC%?3U^&XHFmsEIa6W*qBga8$7yN>fY|<_Jx+Qx4v=#uhaH4lcE`cM(0Q{SjZnam zot^~owFr~e-RamfhaQ+row8e5thA*9VJ)ovu!?61s^Z{EIuH`6A_V1c1 zZkWW{8s6m5Y>>FOLq6rI4Y}$e+)P%S(dY)&B|e2lS{aqP51*=45;Cxp#bDG90IZw= zIpVV{c>*TbRJ7_^}&KiD4MtCp5oSYsKjkpB!a;e1Qh&a2kfl0 z?F*5kG`9#dP3q}N6=u-LJ>juwWdW~rqi4MH-`9!=B)-MVJ}iBsk;knXk=(a!E4oNB zP;}!>V|YHLZi+;tBKL?r;ov{w7Qzqv_LCpnQ)ARBy@SOJaA+agOtbVL?-rJxy zg#OIfH@E@*{)NMcG;EA_+?P-#9{TXR8TA^yG2(+aq$)H}kFuqt$r61QWylW5cpGAI zHkDM(EToDToAuB_{@WSg!YHVmt#ZU8d`YDNYd1aX>tW(03~Qr~iqZ)A+0 zZl1xw-F_;3v|=aGOt83J64|ohXhlp{>MEh+KiP1aEHIe*G}K6*$U40(T;_088>Ye+ zA-Az|UcS>8=MLnFkxW7mjTj(?FSD48vKzL}k!Vi%ChSQYlc;*yy{ZDTX@gsSgud=k zT)|2CY5;S9+2aW5sFY;6;JK2{onQqy$6j>C1*MhO?zH4qVLdZSf@Au*iOCCfb0i

|NWhjUQ+<$0V@#-|I_6vEEGd$9TyRHmJT++omVK#1Vf=kDS;fZogE%&EBFw(xhS;=Ve*nm+PtotsDskB} zL^g(f?$Tl)KV5PMCK6tKnGdbZ!RqO1R#{);tEX$6p$l~ZBPYs=B8@~ZNp8227za6| z3{&eWIqw@*l7i=N>JgYEI*>=bc8=w!)lU9GNj(=pF?NjQ^LVa}$`b(|OlBuA*^5$5 z)l*CR;9YGCJiNyjrZ_+@%OPY&aDJjF2@bcWi8eB0kdKt%ner^MlBk#y^4JD))XT7o zHi68g7l0glCi-FG8{(d}nsr0ej-hvKSMOBtid%ke@62=aiNh(t9J?`-j{c6XU z04{*(-4JNCZqHEu^1j{C$iaEHv!Wro!t_S8yhHqZE>phKJ)eg~I`MPq1?dcnZm+P` zHbevD@_hLAL3#NUjdB-OoeWO~-f=Z;B)=Iq7hEoJpwL z^s_hwNgP1wY<^)~JMtVgd=pQP?zn}FOTDUhuIY!~V;ihV>RE?~-QN=Q~ za6aaO#l=S!0PDwhQGB36Jms$8FW~i^d^0UwXE}8@A5^ZyX~uzlA6|xUMN|_^2mNj% z66r3VIJQjl0RznbF};nvi8ITGm6rKLBol?-R%B7ZI%~2$qZYYrIa5PatEN3sSxYDM z+Rsp>kj{6$TW8fS*Bz&y2#v$rCSCJQ z(LaFv9zJWXW$4pWqOz$@ZMU;!(6W}6Leawv^w-Cd2SCfWrGn4ar{XQv<<{z_`Cg0U zouCn&`+@``k`alkQ{8R>{ZySLTNRv|H)~|3bA{=x*NxRYR1L}oxU1-cje>@x7E|3V zL%f9#3r3=c1lO|s=2ICp$4Sj~hmRJjQi|_cuJ*`Tsh1U!Ft>fWPYGk*DQGNJ)8CLk zIHCMT_z2iWRr&TV} z$quT)?KzcF`at9$qO4{?%oKl!01|5N81~t{+dnQ z#%12)eM&3J7CPU|CUGUUAmQ=YRYQK0oxY;`tw1BKr#Wl9% zd%qvlxD_4tDDP)Q_LqrK_A<#UA}lI7QzEcufO8yjE!8KT8Fk&YxQmi%bjZO{uNRtQ zOVVfJtB;4bvX1vqr=);D;C#lY_9ElXPBGB3Gk6f0aSnTg$v`LWIXTC{UQ~O5<0j1K zk$yz?(IvMkql2P<{tHWLc=jDv$Js_JIQ5RoW;DmMVl7)fbJ(NZ@!@ZG8o-Y?+6tP= z%NKf)f+fNm1Lj<)?aN%IQr@ZT++s!z>hF zb-vX}_J9gJf6NF|^zHMSN)Me9mjY1vbx^fkfW7EzbE`rvd7R%aV>qaD-9spE3mBw4 zac4Uf{<(yAxomz%DFb&}1O|rJ|NpitGr)4WZhpNj^V=kw;yX>@i__CeDiI&FA6v|| z3#$_u7faU@_N0DbgDVU_3Lg5}RGz(JV$CD9o-=)Xp6*uF?~?gchx8=b;VvU12m5RQ zU2^AMWXjpxMa8toaSz3ds&jA#hS1q@8Aj#w890>UtY@S4cvFeov-AZR=$boh$sqt< z?5u)1HoS**1+7`8tN@quTHPuSkiZ4_aC}R*`gj*KKCCnz!=fut%;P7N^V?)@CqxNEFZk$I~=wfr{!s4)LP19z#Cud7X7$nVI z^?BcyQPjYE$cazUm1k&5vQJad89hQ)e6=49v|PE*=cq06=TVxy9+u!O?h3kM1+2 zP~B=5wXP+Rs>$TqlU0J^l-&~>UEpALjly;9R8x0hu6M06RB5`#mB;tuY$v5+TDYby z+4|z_cy)&%WifKA)&(@%QFVO8Qsd!quxRHFHaQJBn)28?3O^wu1Fdhi9)1}ft;#qp z*w~Tu?5@5z1djJTP@Igk;#X=}>;^BTVCv0(UjfkqI12Ucv@# zwg4B!d>){aA>9{KRr6c$Cj}c#!{Y_RHYv}91*&DnW!FxX$`XpsUU;Tt^#P!%vJEp( z)>1Ke!}vj+sVitp$0JGcVsl|_SgEICy2^7ex)?ljUgfk^v>|L`XfuA8)3cj&v0A&) z5DJ`LEI;(z4MPKtb1;N1G&LG)fs5l+po6nx36koCZ=(@kyLz1OpNww=5&(h~6gtA^ zB+=V*hoC(INNycW55O)^xq_o6FKB8H;!QgkYk`A>z!*@|#ZK3F<@EV3o$%RqgL|m% zi;Jmo3QwX9g6Ty(rP^b<%}F<_@g4xIG!C9xKeqyD2zNW%kTIf9-PZ<=z5($E8sn!` z({C&r=j&fIpMU!hLipfZT31kL+Viw~aAhJV=;CnA`Punw&c@P_Fi>&+xi&}bgws7X z^em;={VjosjpxpQ;pWB?s5s@^4Jh7_E_zQ6q(P!n7TOE^*rq}O#x2&Y{2^kUe>A7%9@TaAi9=`lZYI5Sqc9!`{sS36ujxD}D$nSr9R0OYob9w^OaoW`S^1!<6 z#(5H`m^!)36GZ9J4jA@t#`B?rhCIIPMGyp6B!4Kg>uX0^5gdOuT3Mxk=)8C|7L>%& zV>;J5L&Bf5`GTEL^Mm^a#wc2{>z>`-;}ZMKB?H!zgP_Mt-b=~{y!Qp$84VX=92Pk2 zK{{(rEg@tTB&VRT(30eX^H$%GBv5NdCC8b@)O))H$)m@I^gzl~xCyb}`Lmu~*p-2} zl;j|^jYIHzmu;cq^>1(Y!dU{5dR%J=haiuv=D#O>X&~%Wso`lh$lXOR6Y8~YCpTym zN4Ej@N!!i^lsqMrbn-H_J{^i%T5pkauyEL{;xQLUF?pcf!PoQYOYC%fC9nO|SbOCW zWv*azX7=vNmU|6%ZHAYdvn9%9Bzfy)O zEu^b7-9QQXXldNN?U20tE${*7XJ9_|sDyA&-mqglC}aKhtVe5_@zeQ7hi`)`!>LP? z;u#Lz`zp`dzoARrr@KdI$eLDIM{WAPsQLI%>gdac&L^OLymhp_uARkfoTIoiydszs zYn_ga0L^^T)$bVscYUvcDIY@k(fvKIP@VH?ZGlWQbYJ{pRswlXJ7*1X!{(J1*)J=m z{RDbZ=d-?}Qe#Ai{^u3eTNY%x)JxC!N)DI5zJJu2Wc`dUxF}11q0g}j&wh!QOo#JEny-cGIL*bdnbH32 zJ@h(W7r>I-qY~}^QT9*am3F}vC>+~1I_%g^I<}p3l8$YA#kOtRwr$(aiaY3}`(NMQ zXa5)H?%co6M7=d?j+#}oN&q3zW}Zc?U<}JMtF>y^tL(=$lh)d~F-$Y!yYTz@WblTm zye*|ea@v6HDTD*P9VPO@xpP;i*7YiIleFn)787D1701)NvoWL(j~7~*{60PdUeEg+ zi~Yyst>K9_5q{7kibZSpw?F*8gyAfXki3GJKNZf|FZ<>JQesvCUN(PQiFkA7UGFfCV0yU?l-3c?A{<(eKwo^}#6-dXVAU*?(g+mR;Z;f0^~ar=VKp)WH;K zu=FjPg+>qAf#bAKS0d|+DUw{&=0Z)$?CcFwe-&tSN6KaNau9#QH>ZlF#g8>zF%;f{ z5xE`#UU^xZ5>5xbf4)E0qT^&f!4MEW8H^L_B`pduhL}OSN{0||SP z61It#&r{u0yrkLCt~XYbJMD9nDFxy7`7e9{L^>`H_Q8>Cho*h%Q|sM&uqwb$P}Ip6`DiisWhPe#5F+m1$710E8qy{>1m+54$qBAkS4=7?durR z%kTV=h*=LNeZ4ii3lhL&)KugWxgowNtQc5#e!VdA=awYy+QhQE+qk1_?`w$t(ci%p{21 zEHscxVH?6a85aIiuN`jn0$jUv56CCvC4$u8%6iUG!wOKXI63skgd^Ms`oq^}1I?Nb zjoNx=3a1{!LF#u6tOhZx$CwTCVZ;?!V=$Coz(O$y{4X=wcT3 zlxN}+fgc~eW8}3Dvo_vsxnm@Jh`+4l6^6gzt6QcVcmP+dnppk|2SYsB?iGK8}2yo|(8i zR9DiwBrh74IHu8(W(MqhDd;Upcdnxu-fs?-DL(a2oZ%m@md^Zv* zQx1T7?b=oVS%oQGD0-sZ`Xp5J8zmsN9@Q8Qq#%x1ME$QU?A1qPvj&Kv{0if zO-P8N5Pfnw#4?JtWKTiM*v(;vfm)_kx9;OsnOsS2V?MP zCn|cBJ=~puyve|eiql01^QFAf_0l)fOtk@FxFLB|7#-S%?0tsuz!h`edz37C0u~RP zzk-KyieHmpfN)UgI1Ad;bE9YCvJm;k_cHF1Y>XXFqZ4e#4!@M}HTM962(X1vvNG~R zk1YSNKSOz@j{QEJR*ol&`HRgI<@RjI^<|k8<&q|YI{;HB`*X@n045m-D~G529fIhQ zbBt(ac&BZG3nS}z!~@qM1qH+l(t4ZeWRw&;s;;O2hvxcRlPm@W+R42i$)3Kfvbf9A z7#@56G)AUJla(e=kE}Pa_~2YgnXN`MpIFXft^(pdLPVK4`|QgB4}8UA+{LG2uVd^| z^uGw0-APd(R~qd6S@7t}W=i13(%=v%0)DjWFMM`8N$WKs3Bb=ax5`Zq&~U9m*ThYx zjU2iIBGr_9%MlBo0_9tNfzR%H$?+A=>^u6IDk%J>==d{N5%l9{@-#1UZ3ZB8EjkPi zqQl_GiSI|k2)_?#L@=hy9Op?)d|a*$b8v&D)8x_ke7)J870*)0)O#`pWBd^LH^yxR z`HVMQScnh%1lFI)W8|Jm@`_$cWq$m#r0=o-SBG1(GM5oVndIU#MvQdVjZJ$nl*Z$M z0TGgbPdm+t8wO%abCEz5Pu$eRgmW`Utlbi1OKv9_c9Z_7L~1c8vxcpwOD7eEC5m*L za6E&6Jecv!;4CF+@tc6yPt2~%xF>L?&56+T#g_&WGF}>w>FGG;sZf3+KklA)$p{BP zLHi817y3G?@lY%cd+{{SuM0v~KBz%ztT#7?Op&>AaI-~9tlI>Bs@P1^hj%@5C|v)p z8*+?v`Q(>rDx-){6a!^X`3DR&Vc2sv@TYUt>w!g12_=PX!VZ(i_9MWu+bt@`94?E@ z7|D{cD6A=x2%cou_WU_Ud#(A@~ILtSwg6n)5&1pjU43Z)Yq-Jts*mBQYHCmg(-_wMDkx&9FnE{~XDRQPv$H0DE3 z{UtDY@P(Lrvu@azfS|l2Zh8FQE=@(K85(f$M6k2K5{JLhjRN=_yzoOwoUs)EZ(;AI z_XT)&FMfQ3S$OtVm?42*)2qU4+od9rGyIzvEcsa8D9zo}jKBWA%IYQA1^mhC)8vAL z#C1qW3O%hw&W95vlbcZFS#k%Ua|GZm6!dIAJXTI7DSPFd&-?J9_3^I|im?AbQOo2s-0VSC%wl`S~#V7}i z47dDd@Mjwqu514;6uhJVq2bwSw%8z3F5`<_SZC3ZQ&`goRk8iJ zai91+kp-s1G5v?oa9*=m2hrQ-WY}R^wTM4qvzAECzlZOF zMIy#24PDeX^aI?xk85?jtZ3gqJ-Sz%x=I=DcS_n8-N|vUF;9e`)firom_9cf+5M2@ ze;{M0j9Tcm=W;s1ALb9Ogdq>DF7njO71r|gc_Pq}GJL4W;i<*|;PwK)M_bLL>*B`p zp(xkwBk|2GeePe0dI;a9F~Qn9y-6z{lvspDf`hoi1bel<)8zLbRw|b#p{-PU!Ih>v zY_t#@I`rV&$g0`J<_q5zk9<5!r#mv|07Sd%^~nv!Iq^lrre5qpmcd(}`sd2zLX?`> z$lclm*_GOoQb9YOzl@a0pJ!io@_g+5rEPWxfqgSZ81;C7c0sbUM-*N*3Fet;PO7r- zfqPPi{br^Yd%N9PyjeeSAC!+nK%9(|>8x%RkC9w}dLvUhJjGIE8m@mlygr(S0vFl< zheIz+%=2&w6feUM(jX0XSstA$o@V^SC^93WF7A?$mB{+Q%}_JHe*#q?y8e}t?owol z{I=IHMkEJd$nQ#~x&(6|hOthTUfafAd(baCYHr&9l!{}vY=eR#uW@3zw@}V2sV21P zHu_6wb!v_tT4WS#WnEHoTk%l!K)m8~La<__cj6wf>d*Iciw@WksR6d07FVxK97sBN z4RHc{8tA_J*ET>dVt-Ra12%+}Y+v<~F<1Syh0nWSS5V2NIb{WK+-+s;4LopCD+gJ5%j zrF0AYH_5X-eZym+i6(hJyoMg z_aXc%Fv``(?P*j3&#tAGtkQ7;mR?1sq95 z{s+z5F=Gfio+gJ(Ov_p4)J)i;sf%+;ss-Q@DvW$E!;EMd1B-RT&CcuKkd^d4b&LU& z>)Emd9j+GO_0g%!sZs?KITCPC_>fH&%XNrAcs8LxT;zt&6EdrGzPQwiVQ=>KZl=s1 z61VK{>6lzP=k+R#r5!Xl>WLk_DEf=8% zxkoFQ&gqS#`7ojb@>i&U(WCGnZio+CPG_@z8aJZbUX4wmV^;PK?F%^;lm@^+K3fou zytE>s;21EFKS^(USBs1@6Opa)q(R?FL${4yM#QPdgGLb|Egs?X=rQazRx?p?5r%1;fLhrZ8^9&^x}`BLYA>&q;@7P$ z^+qh2x-~4!&q7OcQo$BGHNJa5np+z-KnPCX*$m0e>kws}iwr+YdkIyY?t; z866Rj*}OZ)e&)T3Cj8@T+)n`%+fsWLT7&IOWhsYQTg)`_CKI41#@80TX0j z6$2V}0CR0$l9^awAS+=^M=eijWai(TyPp(X>xtbqgc-Oz0r#O6m!AJ_AS%o31KfH} zuH0kBEt~YVg^PCOVV%x$Eed_?@ZN|(-$MwM5M5eT|q_STM@Mzm=p(k;G!;n5M)@ zw;^NygDsf#>}L{>?t7}*G=k4e4enG~4wUN!TCr1hfC;Usfa3(QtYeBY5suLXzf$v8 z6T54DvaxJ2-1>kYIYLDHpcKo(14_AkY9?(x6q3s9%I7un-1)GeI#A6 z5Rt@Ncn=BZt>kTWAQzEpCy4K7xH9q9(S=8M`L%*p7_;(waIhxtpnVjT+Qb$KT1W85 z&tzk@6Pmhmp1lCwW4f=8KwxX3FhTl8knAFrqL~Q9k1zVrNCdhCNN6ewP>y?7r&w<|M7z9aiEr z6+Q&GpdWtKJ?och?7X#WKoyg7fsb7Tz(kjOUr-3iM%qSAhz_ghTo`3Mz~jYkHX zPCxK!F_b~X@V6#oHs-844d9<(i|IE zV;FfO7ts9Cy0Hk*?_SNwv%`&t(`pJT@3~98Nd$5d`Wn_@GZYkt+FVs3VnDDfuN>9n zHNX{*NFmE461=%z{;NiuJ?@89HU3Y`KYhyyM6ApiC>quZLbG7UZCI@#Y zGp2j+*GjaIH<#l(JcKtu&0N3@qje7?9gK1Fj6Jiaivy|;DVxJK(&=XNyn#mpA|kZl zUTOshd82#UuaiKaTLOJ;^GNTJ8AIKqo^WQgoZ)Ba-fYt_3;Pi9Pj`24JWQY)Nb?7+ zPD{|R4v*y&VAwVIrLbtV%0yDwuuX`Wk-?%VzAI_KOuZ6>c-aGeYuQ_!tI}72mENRayYd%&)_w^| zBDjnG;VW*4mjVK|wA=ue;0jXd?#;gw9N(-vZb7mp1m+mRr2q{JX+QC~HBeSW|#02FJp$e8L~Wk5ag=FIPBkc}FBD03(F_MIWvxCb82!Xl*lg8wZ@B zSd`R$;tK=V&pTDh)8DOK7)nU-?T5~~?aKs&DtMm_itL@yDy8<-X=ha*3m{Q?!Dpgklknoz~$biFw4zw%?5|lUx|k_z0zKYcL9co*dGs}eWf3BqM9S`{DH0M+Y!tQhKj2gZ=5e48sCXU7BizE=@hVrVpsDc9Oy^aoA zx7GX$y-X5c=}%=x-P?ZK(5~{A-^YlA1~E4ql$&}E}If=1XcT#>PAH61k)=GUXfa28M=yqA3Zu-r$>HC#v8KinX zDCFW1Gdya@SbzIr75GVfzSzqJNN}MUB&05>X+PZ?DBV{%bzmKj3dUM^giO+DKQr!c z{oZuN1KYLE%lL^esi;9U)4|E)tf@w{%TW2g7QIeZu7>CSomHyKg~y8!_EnWqF|Pf@dr_qDMWqTRo7J?}fim9i>-g zLaE5DxglV9-8EZ~jgNc9X4frnoH}?xLH~B7%08B13o$T3Tmn&f-rk!}e9L%17mp_x1klV!W zZbNGvh;$)v=T_`~FKfxV$(?ZWME?yoE&X7zrg!x1y?OO7>USl~5V!X3iG4+eUj@*u zeTaN5f@+&CW#gFJ9~syB=>w;#K__ys^@7aAf2YW-G{N7Dm%@zOx;+B_pr*7k zu0&L~*MB8|RH0BdR(fkyGn5yBqT>3q``u>C^I&L_$@Hi{;){MU#hX zny&T10;C|oAOtTrqP<4+kh1gumvoEO8NMhF8Zk!Cn4?2ffRpso+C%<@!FkJy@x9(R z{@Zn1T-(w9lfgreEDe)(LJXHNU?MpkMef4m^|?K<)T^j<%!rf9KkNImUT29`#G2^S zKo(BCn9`r_Cw(<44E;_2U4RhNwx1v=$$jI|8-xc4%mf)}mn;m|);$u4@gb9z*I*^C zEWrOd1t_`IQD-q`=|s!_v6_oLd|OOg}P|{Qr$LZ z+-RZ+GRmAol0ly`duH^sD60C{pw1qA{JBNq66a{R_BRc4*G39zK`>Hsk-*5cU``*- z1y>djF&MW?KCWYaj!vPu$?3z!mls^v2b-<+_1?+)-6QCmXl=2{ze3S@T60bY@3g6^(Ah!>`l5}hOt=TX|{FQsZ~kOApG zqBHeYV^>t(Ud3Ox7)`P&3{NSrxG;cB+=5;^p-H!8yu89(b14cRrhm)2=|~=KjxZWB z_^VTRiBi#N>5btFaRjahh@DH+G9lwKMKraCt1ji@RlP?*(q=}YXTc)0K|M38i>}-r zLT(U*-QH$8%(9A1LUdQKC10f@iy2_T#_5%|4ZRuG9jyJCs~r?(=D)4G9qC&TYuuQY3_hw6~sY^*UkWCDrod*#6uCT z6&3cA4e7kzg6qF73gQA;eLd;hrK`*;< z03k2Z7gSToKJ(H012F1b4+$g$w^pN&AUwglZ%HnGt%n zH3UUdc@n%eEy`=-s?sglGTpZh1vjbXcX0P^^h;TKny)ED-B!6UdYvkud?q|Z1*zm6mj=<_Mr@`52)r^HvXe^2y%I6Q;*URF#S^u)qZzYF9eD(bJ@Q_vG`aiO0-7P)ChLl zU-@zO<^3}LdsoK0srT1*6*cJ>I>MpO`hkISz-Smkul^Kt3@%W*#)V(ewH|V+N3N>t ziG*xvckx%$x18#x4jpDm<>P=yKkLL3=R@#7LJOIp3={jF>=5d6Y}L6X7mnn%6TvxSej7 z=9Rj4CrBiczBYO9)Z5zQ`FeXIAq7sxsOd}U`I#m1QO2E-kul=y{lJG8J;0KE;2a5e?*KH7S>Y?t*QI+9|a(|f+MahHB!e7d4l|KXZ2H_fg) zUgWaDT?ISMfvab3++NS7&)_btWAbij?xi>*?C6|2=3DS>HTPq1?2ZY$)N#tH$sh#> z9QM%h){xy^B_Sq3R%_hz-J6#f^H#9-1BoE5o6+ z!I(CuA|U}gQgMR8#gSU^k_V|e_L6mZk`_CJq39;$pVC}fmTbbzMSDBA+OdUgHwP0y z*>KB_r~WQ|L29njOr1EJ%iSeo3Hr2M!_{Co17|_opBW}20Z^`|r_LsR*SbbBn;@*1 zVBlVgpg{>wlKwO#I!dY7hHD2Rv9Dyv0}LHTqMd+^QP z?leNr2cnm}CHE$-UC5P2{E-nzO#rbyrQ|4A;oXh{(9=Z>rfSIrtT%k>j?23iXKUX` zq5crddhMLo=3E$b-$T|Jt)7u})sGNy-XW}3^U+IVMql2TlTco&*-GrD)xv~~KB9s? z{5ikEBS9Q=CK63{!$*fqwogpgUh2v5&7g+Qu3H$~os{IyF4G4FVl`GTAppF#bDETF z*Jz91bX~peU=ulfj09(Qvr5$4lnCnEtJm=_*ZS-riBlZadVA&o2D>7)7Uk%!OM$9$ z9?DTI4NHhp4>JuU-CP>?BA;FDEW{|lpb+zX95|=z)81Al1)p1Ui0ltMuXewrz1Kqj zbM;&0-)L)2U`)HmydHzCKmY_f1WCbnP6P*JSZ-gQFROc`8UrdI9XC(_2gEk_+-ldu!txzO|E4FA6c(w5^qQ^WnV5oR31<<1B-or)0PiVPC zOZIy`f#k=#oHgG8*R1$q;il5hC+Xz{J~`8bq6JHx>;lAkY;!{6whDz*s+p%k@CA)AtvFJTG*ec@NsI- z2^!1zJDuStLup4A>a6(L1C5TnP3V&c| z$2EmlVUFX<_dk@o;FF1 z?%L(N-^#ak+K8BE&+#`D%LqDG8GcSKWB zUh#Xs;OH`bmkkYe>&3*ZpB<>kj_+27upo}Q6=uf!IoHzEN*82&Rh6Pqpg6BTLL1xL z(3}znZ&Bl0S0P|i=yPjdgT&qcanMJ*H~iS0ALbYQ2SdE$K?z4A8uizGKQ?!Imlpn> z*tpUW+!??i!KK;#*#-=XA}Z&G;Y_KYLC(Y~BJu}Oy~?e39RYbW$JR@WMyWvg3iqyg|xyWvb&Sy$JPPJa(UUXuPp+mioAj|8ymGfxcz+# zy}y@_&1UM9`+RaDLh8$9444iN8|iMa$PAn&#w*y1uuY1Kw^lW=>kKXo(pz=g`NJCn z9Yl)f`IL+2V1*|%r9N3Lp;@)bfjea>n%hdz?Z2)J#Kb8C#iQn89H!z+NCM=dT~Nyi z%PRmluBlR*L_EWuo!go`n63S0g+BWBXYFv~Om$&`@=8ay5VQITlst)vgGt|;ipGen zy_txKVLWd=x(_f$c^#X?)&f^NJ0H5N?S>!B$VH>o{@RyY#SAX%Ul=8K&4RQ5{*`ZS zUQOpSC_Ds{+lD};`Ie-U~F-|1Gruo zd>9wt*}VsZ+_JdD%DnC#LyeGwVi@+s6QZwtg2V0N(`t68&2Ct6JTyVv&@))1@r>R`0y+|+j$IaJvgan7PC*8(EM+k>8&tH>N4#)@Q>7;UQNB@E~W1QI@5>NZ2i_oON) zqu)A#USl~`l-+|7;Daxs;AJrx1IS2;6VQ)A=@qT$szgxb=IzH#>wFS zZlCTqq@_P+is~?9N-jmY%^OEE5CTLASfo`D~;y3(B8sc#9cAOafV9_4SoPyR=m|-U0>DwsJOiEw96s zQs8Rwh#)TXm}?=0E>JQk5s+!msJ^W<#~S}gQAc1NBHb?V%hf|mbn~tuuJ~r*scgbt zS|V%wBDqLu-fcs0Pxu>T&CvtdGzBMWeC5)HjHAsD6pP~1E;0sBAh?y17C$`=(tPVd zXBRfv{T-zT>7hzjDhS_xz3N_Oaen8MNz!yiS^ZX^;k#1|Ky< zF`CRB3fZPr18BNBvWG)M>Dq2@NkArEJte(W>+w=ZU-R$EOkt+zD;mV`!WGdVCg~Bl zUS_r;`HdvAALk!A5?$~>xj&1YgzgWmV`70VKkN@x;@q^dOSVq^UC~o3S{_AD9#O$7 z@$WOiad~N`A;PlVnMl4A z-jc-sz#&Us$y%lDn!1*w2yA8q*qL@pYO6&Gi^jHG`PEb5Zn@6nNflh40nqshUZ@26 zlu{JIq^J}bf^T9k6<}eQ+<5?CpQugXxdA~N0thfc-xBea#3K(ElWY4RE+#h-$Yj`k zkY%R$sGjZD`R0I~zGMxrX{`$HwOzK|(E2^FdSb3hmk4`Iw%mIQF z!OE-xC`)7E%rWm)LbG-PbL!5}{p`84Ms2WxK3NO74n;n>S2Kc|qZsrI%CB(X+yLqP zvDx6krw|NZn$XUT-A3xw@?_`YlUo{)cdx|VtA`P|DvcagCZ^L+_e>Ks<54=5Yb6k+ zOP)*=d0B<3;$TRW;lu78UnOp(C0`i#aAL501DUO<$mCLI@xq}H9L*WT7mk^f`BCPh zzVgx~G5DnEh_Os<=GR*tKaB+Q8^H60(57x-*17v&@4@Dv)-9fx(@5#we#&``wBVh@ zdI)Q;p2A^7@UNBXNR5H|fy*WYU2qXuWytJdc zLg3^B@`GX(k3Cu$$M-SjqrI)i=wm5IBkJ^|c@j)&UJuW@wb93p34TtPfb(6Z^D2>R z=t+l++psd5Bx`MFhUthx$mcGN?@76>IA^HwZzg=FAP07?4nugszcVw^%At!WKLuT2 z_h#a;`_qUECV2PF-sx4(YgFs*6XYaNhpU|5@Z(V=NsG9eKm3l54>k zVz+w6Zvo_|k~+3zD(xEqgBPYdighhNqm?4bO(mZyaJg?YW!Nm`TyP}zZ-eBZqLb{Y zo7GBFMm^?V+`Ktz_|g&99XEN{D{!y>I%9HllX@0!uE{qXWIFSierf0N~Mk3^!q^vNbP z{HE!JSjh9WX>1t?5B1wiS_+MMg$Zo%99T#c3(Nhn5$5eU6`sCaVYKc|5p=>A#uKuQ zs4gU82u9ZzQjR$dC3LEq%kU1Ea?5k%S zTrbGh<~o%7hU326D@O3|&0`oAje3#SW7}IO{-Jz-g$N{|zvXD~%WN*+_pN=roOIv+ z>1g#=J2T0zzQ2K_*M770)Aq~;y?(ylzE5lUonKcEx5w#!M=m_}fB3zA%$k^2T^%rB zhJ5`#SI@x$d_`=#34%e&`pcgB05K$Zruo*gOa1flBhFrVP~prVZbz3l@WiD}#2c2ix*3M`vK8bPPPhr(yjF^>{llRw5G^D)^ye00BBd z2<8pz-x982t&alABQ*InAV(RP-%;$Vc_U%9f-K1jf)KQnN2AVoh<2_|5Ja5>A+@`$ z7&YGEu$p`BQM9a+ctrfz>zMCRMU+t@76W=vUH=6FJed=Ep$r8o3M8vBU;i7hXE=2* zm5J9EcJx(Pj3^=?Sb&W-Q36?jJ{65nA=@~$eT$rw*4*nbw+DktbD$PFt58@UbAbn3 z7IlQ|uxThK7>*!hs6dx6rM5_`1pa@gHddPe4~p_rc1E2#2)sjxsugkLq(y_#`Kb)p zg|mhNH^S*v1pfE!3I7HHk;*_Pl&SOpJX8X`u!IN$ys^x|8zc(<0U#KQS@?3%=3KHM z<22Nx1LJ4lKctM=fKjB5=>R*Vjp2Yh#EX^y8AQ*mpl3l>8!1*rqHZdjPZ&Fz|2j2AS&rHzs;qkT@g{9@!uoQ=kXLGe$u=m^M_# zH(_LOun7O%CwEqdji|q{(7y`m5h+yzWhrRsVX3CU$Y8a(!K%SK(UcKHbO}qeS?RA8VY3yLTvS3!NyTyo-F* zBr?cTK?QT-H*gk~iQY(VXc~l!Yvk_sPgL{&c2$UiyHW{(ZAa#X45nBBfwW=^&Wn4I z0RiY#9Z-d(YQigx0Il~wH8G}FPYbG&7?^=IbsTtsp)?w}g)aFy&;%W#Ixq}%BNx+g zervqffc^NvqC~@ws%Fr%L}r7iMuU+}MggaSE+P<<4K*bkf!~~B6ZqdUb$Xzf^&(>v zkYTQl4gZJ>&%;{GK#dPTA>uvCWya|A0y$3mIB$}^8c{CbhK86*iC zAtgv?)BzCWog#aLB@9N7U<-%=%4DL^$C5Gs1C+t(lhcFK6SD`59!DxJh+#BQYw-F4 z6hq9T^kM+svoPy4;+-Q^o2UdoEg!7LaeyTf2q3W>72z<@Lj_QHSf3D0KWLjrosKd7 z?+>y31=qoEI0etdbuOda$iH+cAX5cUR|J3t8^8g(zJWRMU5;O&>KmjGpr<@GU7G3Zc z=RQK@iuA?{L6RNeX00#5^`hCgY97L7>D{%1j z_}(u##>~F?=k*-*-~X#Wjhr9=pnr-028Iagd%^qvrS9r~eJ@-sjjaB!>&2+9okOuS z#^1Sm+S`kk$Pw?$vBu*Vpcr-bjAS}D6-n(GMdLO+0ffN-`?26Ipuaq@teRCZXT}QP zfClqXdR19oRUM6VxA*d|7`2>qzW(Cq^W^yom?EU7m;V{v7UOr`TYOnubS>Z?u}oW- zY+FambiwwAUNH%7UP-B%BTvFCZJ8lbLw5NfW#IYS;VH6xx+&zDFhb?}mBl~THJPVVYIlzB#v5&~*gg|u{*mD^EL(<_-U z&g)=>%}7V|?)%A6i}h{*4X;3)BuJwcP7J@G`qv`W<8bbD?;|1M`tO0<&g?D=a)GU` zicY$beo(I+fx>tn$VQ;#J@S-9Tgks;+LF}56~RFynP<|&4~a!{XF^pYZvo#!eaLsBQ7`rJ1^LLnd}w%BrN1yb z4p5fokD$f#sdUo*Jd@MQ3O+yLxj=pwzmJB46nVZxVch<^c)9ApPo3&P0yP~RTnx&m zg`XuU7RVy^jN(Jn9Ho;5ByrBNYgj_c_(|8+B6w%Bj-HBd;A!ZM^%>Y?^vY@(d(8^uelHcm}R zEheXu3?cthpf&4C#{75#Z=i5guKfcC{YZH+uVaVQQiW!WuO#Lapc;K3i>`zn5~caOmORgOc^lCkhFQ7t-AH|E)czdah>hT};2 z;~U-~(J|6}&2|_M>OF&R)`ibA>D6Dc986ND7&Ud{us|A=Mc;@snFGu^jzM+sMu;M6 z2pS;Ghkpn5tVnDaKvFD!41*>N(GT@jG;OH>3W;MYLpc9_NL*>ykt}J@-F{3MlAr2kq-ZqqkR{Bp0*Ve^93z5KS-NnWMblc* zk(t#%c0U>8ky1Xx5^2G&BA->oxM)PY64t~Rj*6T*R2jn=Au1`lptwLCegG~?wJ=pESx}55zNq}GPy@3>g;+S?ETlzJPl{(;x4^xQq!`*7 zMKTLXA*Br&Q|cpX(uBDB17Q%(4xWkfEeVZ5q)bO}uTPOby`mZ;*;@J0l&URF^s7_# zQXX51h4l?~3)d-b#hZ-sE_-5-R)A>Jf8-$n84pzyz)Es$Z#tIrrv9ab1R)*)R9uB@ zVs`%_^bHSc7;UIrx)fLCLz!YV67}#Rd=~wnqW*U}smQkZpPqu-Dv8zkCM)b&{V&RF z_6o@hp&BruQz|GU_EsF~YJO(R@-@5|O_jsMR7sUq*ja}GNyOLz(LI3@myE=u7cZk? zR!hQIz;4kZNn2O@w*;g>$AylrcMUF&yj;pH@}h4t93@e|4P2jL(}EZ7z9kCsnVA$> zj%q?sF4OAH@jeAz-jI;2pX=ha0b4#ge_12tL1VYk#=P2vIPX&1>tfdQ*;C3&)>)2B zNcLDg#k@2nZoPC`mfMpIfx5*GjC4CPptws605Z=%9bSTB87O#7`?2JhEg2vyr_Bvv_SmM5`%gUwc%Xq?$ zmm}TsJ@1^B5MBgU4m*+@^3?ovR(r>E6tGEH>hNlAljc;jjpK|N;*iX{pPJw78w@$! zL$%CC+?Jx7HG7yj=ziT6eP;HB9NDybp$P-rvlK91b?Y(2m03sR9}S!p4^zerrdHX&#Z#YVD{7@y**4Nn zO`)0J1!`A!RPbX$v|PW#0kU)At7at+e;vyF|MiS)s^E)5wShGD3s0k_OpS*0EYBBW09X8iYhC znV~WwBS{fOz0W!K-tVtl|Ig=r-~0L8Uq8=2&w0*so^$TG_Zw;Q?!v&?Ek6fn?ns`c zarwp1`@hsqe_Zp_CpqzJXX0xsyDRyDz9E+mHOz0%EEs}z4GlS-^sMZt>ZdkM!&P%6 zk0qTqmRXaucuHoZ^rc&QJ4T%kfBWmoG1YfPi!VeSy7w(M=;n}`wR>7SE^S}+)=lhz zvvt9x*fS$He;O5?WTx%T|cNjHjoqnBS;w8Q6$ z*vE4xlZL2d{%kn4__AH*6N}5c9vUB6eEiXFzezuri%J^#h&Q<{ayKeahp!weG2+OzD@(6MF5K~H z`K3LJx_2*1|FNuS+~}!q`&IC&wr$Q<&%d2>DSq*#mf6KM%MZ!UY?h3Qc-J~^VO-H; zJr%!as*zox{p_FJ*r;msE;S|h=vLHxr&0gL+?>xgFYOlQ7CRrAR zeRuvjz5lX|X$1n7XXPfd7M7A3juh|L?ZHS>*r+#G+=x2natzSU!CX72J46+t3H zqh8cDJa2m*KjCd%fy(vVbuVW`=tf-{ss3rpu#oPE1&U{PEWU5{uv@HHQ#gNBtc6{d zuh{j@HSS~NlZwB+&XoH)&nM?v%|E30v%ieb+X6N=v;fO+fn}WiVX5Rbhqy3%&xStgBzDz_qmfZ;M%?IGoy4v zqcRIUZ33e&FP%ja{o+$Lvopv#B?CmT1s)iZeZT%p~qtO7urnUdO%8 z_^#jc6PQc;oqjyt9H^@8{vRspDE?1AhKDU2%Kyd3bg!2| z@9g9vpUsf6vs(4#)G8HkqazCiUS3cPUIM@QGLdD^Wws>o;947s!N3%6$-+&Z)^Ahu}G zf*-+Ach6)jvt2#@qJYBZttTlD8XodFzdn@IEN0#QKPgyFoYlGtO)vK@Udu#A2&hlgZtg|Ar zgU<|cDRb+XqIUbhwZt=NM|=kgT5o%7_CVct;DO@731ft!#@}4O^y!po|Mm_(YBBx9 z<)`V>^kWa4UTfmtet!S3l0;sdcy+)!>ZXIyp1KnT8~Q6A2wFZsRs7QY>6+6H)vo7%uTt7DpPg?w;S{V>-`?WgLyY|+-ZAt`@^REwe}yqdMF zJb%HD+PC|rEZlR{rP68Vmy17DHO}>qv5yIF+dSxln)-4jr!XhGmnnz!(Y)zxllN^* zYcHB2_b9i1u1$@0O+n75DF<$?_s(s*@G{m)TX5Xl{ncXYkIBw*KD}j*^OM-*$9Kk< z%zb+~czDvU@Q*9=gwB5-_@hc_Xzq=eTxorDA|5hBxit+ZA?U1%k3+^{TtBsJr?t`aP z+t8d(dM8|4ZeAPmrC2EUwbkx-CH9Z5^A4nInv7|*OwEiINg1O?UH80sJ}vR&^jD)y z*0d`{T@rmUWXJ>47m8;#)H=SKxO~^?#>>>Mj2zXeA{$P<7yFU8GqSd(eMxfpqe%}x z`IDEzLL$r^A=mz{js@~ob}vC*=~c_OOsJU zolHMJ67CAPId8B=XzQj4TRv>+2$|`iD(XBbeD=pvEpsnK8Qz?BSUmX+YCHMqr_uJm zTf!%dcmKZVv&zYJ3%a5LwhvtCb7*Mz9yhQg;4u9_$e4-nt}{9>VY;=hlFRNGV?)$AjL)~S!~QjPkO z=dC)&yKCdYn$I6&b7q)FW$(|+vlVrl+aa`J^!`A1ft-`kK~2hbHCd8pKdfEddH6}Z zZ~gn-BZ_Ad884H++UDk9Spr#~b*!~s$7~G8T@vrVt0zW&6OwHQ$<&Zw|Qk|Usv#WbnLj2 zz>|@gm&fSa+^&(Ea5-o0x2BxBq52LAWAmDlo;dqG{A=HA`{BJ)VQO{WS6Tnc=3krl z>V%05dF}g#*EFf2U&ds?AxB3&s+3N>zdlNETG8OnB#{`&EBgP&UoBD${Z8r)MO$mszwzee{WaUU_k&2Sb zr8f1KZakW|KI?2={ibL?$v>O+M8yu?QM__&eaT6K8@d+8#nS&$)F*T)w|<(Jb@^@O zgvkA~_k7=9x^w-o{5S#mQxbFbB!uK|P25K9ZE-(}u zD)mOOHA-+y%beF)ui{5k4r=;(S$dv!xbUt0&Kts3pHN#mpiM(CO!eVV*DUc>hdUf@ z^;@;AqF7dJ>-JIpzl)DLn3o#JeBK(J``tTgUHHloalgJx{(Y(w|MJ!+r;9?wzk+ zIz~txf7#Nw@R4oRwM`59d);}gzIN$b;W622vlaH1q{mF0-W~f*d4OO2tw;aHSC;D( zpZ!sMTWs6Y(eH0X$Hi|eD7|RgXp$-^cIfOa#gl3y)RK*x4azDC!yiaIJR5b(%1+_h zn`gYa){d*TSjyFitGx?vwANSt6t1~8D`UC0bY8#<-WA1H!*WxH8FqS_iq_sc z(`2SDY4E>1Iqcx6Wp*X&Iz5f|n%GIH`3=f7toX1vOS)JO3hRiFSTBjlUq%|MTG5Bi z%LliY7%mFk_c8xlmtKzk%A=l571-5arRdO@*gwF?@z&jFtr&xw z_cyj}dN%H+c;bkCUGFoha*vb`m-}?+kZWb;{x4nUqaq_l9`V@~u{ZNbvGCE20d`pu z>bH;P#!Wa~b6RdwdBF?i6>$w#iJ!C%?{~f}IY)ohlP-8a@S*9`ze%XK4}{Gbf?hMS4%dOy!Ug4t7!TeBz`8r;gBfjw>iih!Mp*T_bH1LpSf!ZB%gcPw$+F`jf48`PYW$XU4^5?L4WW?p^*O_2k~_(4tQ< z0jCR{9;-afigw->p0H`uZO@N`r(8L_v9?e@Y=T*ssbyKy&=F}L+ghTQE3Ec0Y{}oA ze(_{k!@t${r*u!xI;1$u)^@eYuIk|xTP|!3UE%jUz{qWA;B2RR#fy__%4=3i?5lWE zw&Z8`=Fd)-f4*rOYk2KqT6Eo$pGU{tm^{tO+9@#lv6`Fv(yhC`>^T+jRL-?C_h*XQ z7=iB2&5Kp$|DIW99J(~BbdPkc-1VqmTXbD6?@8?#^m4Mb@qqr%U!Jhv=eK3VlI({I zrHyaA3tC;gab09g;)qvy4FaPw?R=}l%3RMqoO}F0M&aU`-y3vCoBfh(Iv*hMc17?K zrP%?F-G5IdxJCsm(zs(g=Co?^xm`aV*`rBbT4TG=<)296h;+7b%D3{tlcemv=4?@Y z9yR2a*`d|vUhAf8{k5P{>ey|I;~DMq*B)~gNhz^gV!7OBZ2w6dZw~ex;<2Z_>Z}`&Mf6 z>bu%X(8@1X$v5EPD3M?Ag9q;u7c8nikSGZz?I6hzIpA%u#!ikbXSs*WL>E zcK=JOT=wnxaV|)7!W{2#<+VRwd`l|39N#7w+Vn z^}JDIKcV!o(%!mp-j!EY9~FFDrO@i)q5E*f^34;DY`9Re`tSD5Van&eSH(ZSZ!GzD z%AG>J@y%yNSN=>XSvo7GT`>Qj7`)j!Z%z05#38kh^<@@J%JTXH+woCC{ghy?79$@~ zuGkqrVix@N;5nGZ|G$2QdilKhD;KQ@4iDikAofr953ZRg_pjod+BPevV_KD&kA1>) zcS`O%5FMa7uIke!75F6$bDyPAtCLFGzcgpX$O-NLW^hkv zT)wDljr^`9gM2$iH>y5gmFe2DyL!rwtkOe9zUfCdrHTHGPuNpss%kYybHN_%>doHH z*BZ7>Kdj&ok)?RcT-A&BYky(LX^HGf0SkgXgbM4Q8l9~dYibX$R9F~SChZfR78UkS zaGu1zQ6-AyhZ+VhKXbUHV?c)X49_>GlG1laO}Mooinsm9cb&CUrZk@4JSOPshBu%5 z6?_}KcDQc)GyKChS*NW!2RCFmlxC?!bT~9t?wPJMZPm#i8uCr1e{D|B@wrj%Z8l9v zFl(CEfW()UHIv-VI4&A!clcA;q~s+P_f9=1h?;ja;>@&3;`b-DPCGbuYQjT>`_*;( z#{ct4H^`iG>cP~l^$Rb}X)d4i=hM7#D}$_cUDs9&UMEquOG$kDM}s%l-jqlwTP|F+ zDAFW5vGKW>t5V}q_ix)I-@kqlWFnX59~?5gsq}dq@3H^WpYhrQ=Dg89oIUa8*vK>a z7R75H?Q`;}j`~)w)+L}X5_#M0(dMa3)_9d!szs;Yo%MJ5we9!3?W>NfZmu=ha9vcT zOHcBdtjj##i30On(q{#k4U&o7651FwHg3q_@>gzlFKD%MQCHx% zIHj{U{nU3wgdA<%TjKV>+n{jL(U=wIQjH3<`kxrKv#Vc(w8p-uflbdPx0H+DJ$XRk zR*lk=?jIg!)_XtPu_q_B-H0kv_WCwm@~h0MUuAR8AN@D->q0b2nm6xH&L&~`G7|%# zpH8Ofd4s0h8Q!>YOHEgZbz_v;`meHEz2prF*DcQf-Ju(NVpZn;CF>{Mco&!RED?kxl5{!ySru&AKBh zdCP~~ir?t3I9U7IbK_?@1#dg#?HnexG_+f(8j6SwcF?@=?{Udaxoh?h3VgIxM(a3c zc^Mokem&~P@zpiq*$pM-Tf8MDk5sL*2#LymrhO}5)y}++*H1m$RG|ObJNU+Ew`i$< zlcH{=%IDZ#k(%<{ee!eUgw)pLDkid*!FVR!_L(!SM1VN z+tF6|U+FCpzH!`hTbKIb0z6(9N)n~iqwWQ5w3fTkX*Ry>(xqslxe4pPh_)q6c7MVX z(c0OxW{Fcl!ThcJW)?iie^Oh#WST&u!O(`(Ng34&>(Uz}OXLl6pE^zJU$k>!jNjg1 zd*@a%yJVL*wId(VlS|W@(?l5H+lI z&pwnh$mX%R`!oYF&lW=~wLQ-U_+AQ}y?m;PQ}KO6EA@`zG}$Rz_sm$EY_)shTJtrx z3y_tv*7!#q%cg%HdA!+Pbm_(0$#?EmxR%YlU3buX-vwvSpOeRr77w>8F}L_FdM(em zcI)hY4JFzBsn`G2Y}(VfW!>QCAIwW)3ajV2CDsN#ooD=I+0wZW-V6D6drTG(R1%^y zB6ckLDMs1#Bmd_wL1~~#;*?I0f5!3u=_v`=VsT23#wKCnZgEPR{->SOu%@f4`flHSDL;f2r;1A$= z;Y*e+uv!ri8cu#Pwol_iL6%^G;9keuO2}S{lA<-}3XPht<|mt zYs-XCWsI<2s*oolG4S{pv%kB%HZd9)4*ih)$ElU^A0)6 zP=m z4(e>8Nj!v%77#&;gs|bOvQOTBOM-3lSA!;LKG-d+Sp_T&{TYq*jAxH zY0=Pc7^-@SKy?%;C8GXDd9v*>*aKCQ=JCJ^{*@b}f1OY+RHRgC{uo8z?<&C1z1;=k z=(-}?Ib|3#?KWUE4k)oeIVAu(mk}WjN|Z8D*J0yewF}fehAmgFx;52=a+?yRN+_*d zwtgND^;H7YSKO95JSUWoK_+cj6V_Dt5``*I%1B3<5%Aik;C?5JjGg3DS7^q(@NOv1l)xv;wvXv!1r z-Gw`mjS6K+l#~qJbLl4ZoGmn)+a75NB(F*-AsGn)adcFL_1{?)P$i~B<6fyS4h;F` zZE{?S$NMsX$J6K7Dz1)6t%x#5k%c!$fkm^yB8U|Jl^gTL7*lDWb*gNW65yYL0Rw38 zvH=1zoD_qH$FC)2Qd=c?yc3|%kS_~+^3*_@?c6{CNmN^4OXrM~)5_N^q3cS)^IZB+ z;8i+mL#crbby4qEp=+>u?{!sj^;@Y|(dCQfW)+GZ#ovN7Q*d z1CDvY$WfiLA(FJx;=2xjq$@zE$06!OiRz5oD*SCjYXo>a3vin;hv?x%z{YT9X<~^yVhK zp3w!ZmjOaE4pGEBTK1NC|06nFV=2H%UIt*nd?5JTViEL|8U9ZloVaW)CM>i~H3Mq1K#9ZHQv*D52G z_i5mR>vFxL>p3dcVWP{u_)Xm=AhLvclshc0?4{*d=~46L+PFJi) ze!7%Bos3d-!ItYOH1A7YCZku!td9N)gX%kE2(EJ!GH6muJxC_KgR*C&MGK6{#-y4k z-iVS%@p`NuQ}jUNP6h`7E`#3dQR=ic0{VdSxk&R7+<1LTg~s_|oX(XVxMwxCiZm`C z}Nf^=%bakA+nzARZ3X~?AcD7S^LF95wdbh0&v{v^6!NR1|;d3S4T-6{}x z(4Ky#$kOG;WW1n-f=g8pZa$%(JW)?j55jm3^cb-4uiTiB4}5w$sW&98t(JiJ$xz_& zhVuz=8vfkKCsjeR#%$Y7jiK!>O?;d@a$PPci6V_z&+ftmX@r2}9|=@$%vK9c829cw zW@c~}{h`(-QpVjx9#vboH)Cw^egelTYshZMeOOEhd4$PS|;13_`51`U2PkR3tI z7`#W91}Et<-AF>H)?e*FoeGb)b|%z?9O)iLjC4~rhPkvE4CdM#iY}N^ z6p=U7E^u-Ngz#kZ-t(!(I3kal>NypjI`y7puDSW-YXIK`NG06F!<$0eAvr}*0!5gy z;kUyK+T`Oy<8GU=O|8S=_lsz7^CH2%1xbZ;rS3_X?G5MgcvhSi4_{8Rk-+0eJ84#{ zY5LS|2%UCV$#9u0xA2*m#YKxbn6PdaA1sD;?Gltm4i;>*dRPEKOFSm9Mn}2e(Fqvb zAEhP;3M0Q{_|I=3AU2%6H>AD}Lf8cQz>;J5uK$=M`h?m{lU*~m!pw{y`#`7guiTic zdud%6mXs15xCNGA+4lVyY>c`s*<7Gu1>oF+w80ClC{3E$(;AjF87S3?nn(}BuRtfz zjR7Y72FUbXD`GxDucN&inq7MF#QQ`3{0vJSiepoF z8dgYnRY-ayy7r1Zqrl-jXa>)OL;ocm(=#jnBNUW`I4vIeEdLww0S^XxucTv}(S!aw z#SV38TX14bPh5nM9kbZ-$2j$~d_HDnSAfAw{sT*(c3VdM(Hk0%yT3`W+8bl4G1LW)=N<%35h9D}wEvSf6ZU{FM!?Q75r-Ffh!1QGPAv-yF6-a&< zbgZ?JkOUergdOc<-{cpATkcAUaRvloCu@GIhcvs@Lzvo1`RoL@h{3t42#X?_p{!`4 zHif}i+X_qc6^(bX1Zx-)*{PH;I>KkidkO+_NNyOcALS|q`&Rxvw`RC2K^M$rK|959 z7^v_OLop+u@gd*=63~%8Nphp1LqC&WohO;$#CYF$)hrxzO&q_$bYQ@U1-XSP= z)ITf%1g-{w+_Z2@AIXn`OgM1_rA{IZUiwX538ZpB$}J7jQ1l44G{_qPT4x*nrxo?H zXNRr6J>aa3Xq=xtvoOz33wp2uGE)|$0PgDPB}4iJf~rqa^2m6xBnr$K0_F^YzwDJ8 zbHJpB_VXq}eG}T=i4S&e1BSW4%bn2{4WM~f4-onv$vbf*G+^XFnxt|hrB8ah<%G(E z6(Feu=18tIOH=H_k%X#gXaD0qpz}N2+!?INj27r%BqV~+D2gfXvqyn4WKQFnMll6i z$O)aRCqRTQcnlxCW3SwpaY%nOHI5Fdz|q)HOPUw=J<1u)Rte=8CuhaSDI#45wy>~r z09+@73mGq@fTA7Pyl@obcs4YjoQ;qik{ZMEbz)o|gCqK!9GN|$^zu@LAh2>Ec*vHu z7XIeO?5Aj1q}`d6P~S>%?U_M>mw|ROG?p70(`@PJ>^FuTM_OaRgsFpii1Z)BHaP<0 zWCrt_EP)0L7Lx4~QbUbOy7E9B-d*9EDs9K-l|j~HnLSbk?Lf^HKtBeW#$AG_58=~G zpj~6x-O}u_U`GRkYZ}XJTPPg-*AWI{v_K5El~KcSD~(XXa3OKz;lz5|&k4lXkLc0V zbbyd3dzP!S5X*7~S)<@Dd*#NoF!ZE%z$7sgJq|LW`Z#tw%W51*Ew<+xPN2Vq>m*dEMLV}<&zuHrAO9u)|t$oA>JVNNu!{3JFI%_f1!uMGIFlaO?u z7>rGAd|CyP20%9Cj&Hy5v@{r&%IM`J*0W!*$he6;tW23GB!=vrSppYlAow+j&#Zuw z07CmG594y3>9O?JnOWbDJwJI@EVRf0>=?>-G9I#vU>}X0PSD)RY+_$G8N`fs!8jx2 z;R3;0>cJH5MS{6`OF_mZxValLEv~dI1sB%gmM$RXq#G?J$c3E>cVlp>2Tgt6Lr50A za$y_y72~`-F-{x#d4gt3R~9$Q6>tNmVw@s^;)B_4*^a@B7%(X~iU30UqZZ@#z@`Ug zVR0}>++cM}sukT#SZt41Mvm^3J_>XLRRo-R7TORk5JwOLPyt4e1%HJb2)xhGOS)4k zWGcNWRVv*jvVfylg0+Cxq`l3`1 zX7ey){=?Wx$i$*h)o^uL+tTue+X_n~9Zy!5r6=ebZ%5-i?1bfz^l&CDwj5Y0{Rk9p zh9w1eVWw!0(mcR!9eZIpPDw}n`38%$8bgcJn8K70xBfl4)BvqN2-a~I932elvMEfl zA2%&J_#C)CT%q?Kv5^z*Rj3B1!hS~n6nMx=G}cc6jhd7BIOf5Z%~Sx-b;DpqV zrZe$4cdYqJ{3tgA)(G6**oFkWs1dZe4qhN(kl%kcDWEtnw%Sa_$Px1x{EM}3=8U^GqgHk4I6CAXlnq1tm(6ykas^l4zDq-jzdVlODAlHSE=a#G<0X-SI zKtqoeiorr8KNn)&V!v(H{CS-3?c_>2Pzk zk6nw!XroAPW{1N?_4K_GAd3fMxoM<g=ds6iN9n>% z(B#A5X0H7u$bSwTc_1S#c@D@)*g(rk*&r<5N6ywN8HeLwl>}JD?S+jQxAmUbt5-*zhij6#0d9Ya_$)4ns*pjG{6Qf+c+fW z!(@EPjEXyuG)gAExb5}6nM?S1qKV$G~2CVPPPQN340c^L47BXs+ zaNh!X?!$e@7lGc8KDzT6HtZ8BWUXb`nm$X-`uPDl%Ykt%-1=~{7gQB-w9eo-;s3Eg zKvwaJo00!~N(}}2K^*=!6HnTV(iXr>{NLdbI0U01xOFq~TnLY}fAgukS3w5K+boRI z7J`(K{vbsNpS*GP2lx+w*KZb9=L7{tf0B$`5&)es4gw7JiTPJ<%w3f2PZ{fBBJ
Cy$1iWru<^j-cf=T0|`--x)2^(Vk#}W-){CY@MN>k zQ;x%8$YBu_$`*B$G$BnroDh9ag2!tDQc%vna${6gF{yQ*XO8eVgnvZ~=oz4dMX(i2 z#swY#0@Kl>MeKPST(SymMShDR@Ew9EDU_FKD?!uZp(St^ql{^Q6##_(8Hk{m0iwz% zZ!tUAuuvfzLlLBJD58Y^V)$>^S42`vK)?cIvVh1)E!6}6QW5cPHY(u?wbI2Pe%X;{Nso> zw6FwP$er&l_oOHL;h3HtFSAzmkc9_LKZ27E0;{tA!!f50<<hFlZ;Y=VO>UW`55=^5Fckk zgEd0{{P7eYEQw}^z)?2B5{YqFvwPt3L!hL^xYw_Xg7CJ{lYYJD^C_q$gzYEmP!M3y z(nCOSC=|>@cs#~gxA(wRgtE4N!MMuK9yrq#FpcsjCLwhZQ9Oq9ID7tBtas;%U#B4} z-hfpdce8LN!-6VTuqJ$80WsnxLqr*)9~!KB_mu!&t;oO=S5k`lShmQp^kp^BW)m2F z+~*1TsDoH?=TR)6!O|2 zegeW%-F;LQMvWy_Jl(nAxdl{Xk}%(Ji4q48frC+kE^ENLa8M*?!x)es&h*}Z{KoEB zsBjFRg5sX-t3fT{lqFFV`Q}#jK4|VxNSy{8YYvSQr88C1I8j+n@RA>nOhMPzP$oo9z4kcxf){L=!Ez-@HaQcTmq9CqVEx~@tG0ak~jZlz+m>gOg3A-g&XhUg0njQ!&f{x=3?0rhKk)@GP+><8NM}qC0 zDl}Mk0~9tGeC+fW5i`&@0;F({z}O(q4b&u>H+ci_=Bm@YuQ$N{H0Jd(aZkYE8w)qr zS|NBo#aJt2xpHyOhfA2zdAn&{8Yq>4W^&EGKo||tfhgAO>?lxuNSjvO6a_UTmY|3Z z)MD;UBE7Sv4m{Yxy<@E>CevrYDQ_u!GyxQcKx;>GI$cC72x=PBa%5v* zFA1w$aeqv{6!1V&>9zT}44w_)aD%WlrzPx;0SOiVffW&+cZrz2J)VJ&=9u7Y$`_-E z$XtxoBHvh$b*3k7$9C2^MSv4Hh+f80L&;E)DVH>^g!H%xN?oWK`4^l37$k=LSHsfB zb&!}iXY#>HOyWESzJThb8&WeI6XaiTve$v(+qaS3>Le?vd2XmB4#d@LXNNYyEJKD1eat@|K`I{hJ__~WB zcXu%r)C@=HX?Qol1y;bX>q6y*38RizUTcGXy$>P5t=yg?pE#%iG11yT3m>nAj#q+V zs?TpCP6FL1EsnCLMdQt3fh*{H96ZS-Ht25#z)uWNL4Rh5$#Zr}FvW@2TjdfV4s9%Z z%Y8hTcGB~?VlwE{78tacJ}X?jcq$k>7;Mqw*l}V3?LE`2P>pwQhE)KjcTL;?5t(-O##B6B)9nJ^<0`R#_Cod2SmoH$6xM5*yG z(Din(L2tbS0<<(!3>9aJnfBOifGAQEjuwzVD~9x)#C7}D2KbnPkUOA(Q3?5ZiHjrY zoglRX4|(mKfZV|%-FCtTCx$mRHP4WQZpwoZ&Mg;aWHEvc@1&FnZO_sGdxO1lV~$*8 zXy5IGeNdwBFV-iT!@w=(g{v>>GNFa&x-2G&Okc5vC+-5D8eF5D zmr@`mjLLUG=}44(#<+9&J#csPVOVG$gklC0G+4)W!U!UpY}{#H3tiYvX(6iuF=h)D zlecV&Z0`c&QlX;chRIG$&b-`&`vIQ6R2I`6XAln$HAy#Pgitgbw@rzMe%8AwCepW$ z$O72~Q&`eXsDjQH*nt6BDEX$CIERHaQa=G2Ik1}6HlkWg5d|i&&RK_Xd5>w_`2-?ld(B1l>H^KWva1XZPz#hPVZ0UjTZV}^dhGH_82|)`KVO*BN&0S=AqL4kX zsY;xXg@v6JM4@|NT!Z2AsACT$Pvd0w0`83{jhnm|)(@EFsAAVNcLg5r_k!MY>t__R zmzqHHKES;3nlvwIpyEE*{UJIn_W@4DkdKo^YxhCE#W=s&dowqKr*^>2eJ*geKc?3} zh5INYLi+coZV~hY*+bt)|H_StFsJ3~oQ1)WbATPu4-SCt zFpC~I2PbieA_RLX#5jEf1m)H}2<9TFtuXF@&E>aap)>G&!!4GN+Vr5$MXVF5u&e=2 zJ#e6m9@(@qvx7izWI_*uMF-(=6)_|R<34!MIFbkddWcJ-Qb-HL8gtva6_PMMWMQ0h z_un^9>A`e#inttSX2!zxJG)lm-B;{luG?Nt@4>t55Yuw4Lo3^xf%XZw*@Ew6JhrBK z@#!@?;!QzzI=+29c_L(PU}47|9)h_XUMv;`4jC!{Iqh4PLMS=k9MEMN^Kz{u(Ai5l2Ai zDId`3Bd&_h9RXViyb$05k5COrqX7a(0Wb(@9fb`xLg5Gip}WE2s3=%mg;Q2zwAivC zWm{n1;x!B}2ps;E8*>_^fDB?{(V$-eU%;{W6*R7ieyHv!6mnS7#GuNL6trUlRN35> zXcRI`g0hfU;|g27LLV~z^S7ZshWkJDY5oSv@!Fr8ora(Mj~32L<1?W|5Z*Hu3OUsi zX`c+6Uzr5{F2SPX!4^r8M|XDjX&w;MW*DtA++ErNQ(_z@}*cHieZb zHgROVxCC07#@Z5raT7k!xY-{7m(RyNz_{{{G_L-mxD=8-#`5VN16<{28s~Kkp1WgJ z!4s_hNkWGiLj`Tj@labcO?nzgNpSqUXMS#;IMDPdw8x^$Ug zuE*bX(()!Bhs`8RdU4_6<8MIqWpE$2^i4<6$KfqQOf-9u>!J)GGK2iXElX|*B7qDz zknr_5>@r}|0t2OhPFM(Uf+>Ru}ou< z8H}d1*}bh>H<~7`Il*?`Vus;k}3CObgoDQ^FOdGT$14a#L zX-ozfv~LA!!Opmv0Tn+6=f?{i&A$eF=Qn##I2Gu72E2q$cr8!DaICg~H$jr5VBS6n zdz*wgMJ_(gNPu_6T%gzdaLtF%!t{QU(j~Mn%;s6*y_e~58*ofLu~7=k)j;Z};P?TS zYg}}DB>Y+cPewto*Ib~!iJ=9#;%LPwC_#vUyH0_DuM-JU6Wu<=CeyDNekzH;2XdC) zm@WRa(7wZvA@Bg^&TkgK89ffar4-T5)9g4pdK%=(cQHt#E-7Wy2uNb}%fO75=0K1Z z*?Tl843ef>Xmti^K4S3XGa$$*g}_Zv{25A?$Y@oa&x->Q(QtET&BK+1Rug4cN=u{R zXBnl&H?qfGfN|L<*W0ZNsu-p9S(J!%@S;UMcY?4D+L!A_55r188F%zgfBB!iqA2*K zv@qJ9$-3ZhCd5&dAd)`|ar9nLMybz~)OLB{NW7o5qE90pBe}D1(1v)x`7FqpI*gVh zdkIc@EE^^xjuN0{Gy$C7(h!t@)0S8fG(s4?I?IgqQ?7g5hC%Y324j@Fo$bNUn`OcN zD%NvW@_mFHQcx{kT&^OZp>wdbXzt%$!BLnW23xj2@Tnl9+B|s z+u{Z#7amX8z4w|rE)kPzp+ku>vdH5c>odP|Ag2B`jZ3&ECyG+eG1H;4X;I7Uevn8Z zJp1!)!PDW~w>{`vS$cV^`iC71al^dh?P!=UN$!Mdd3ruMvlvNx)9NIn}@;SHdKakBu_`n8H8h8J1D(T`EVnAiq>jwvRE9{ePytghU(yZ;f!*IqUBczW(UQJvr_(JEAi*2V|!|W@Mkr zftL~qybQwwo)WkwTKiN^1*zpiS&orPf2x8{K(wxbl+S%!r3_g&7e-6STNyEAEh*1^ z*$ngESetm;g&8^A;UHp&d2NY??g#Hbxq?F%!)?Sm7XCu%1Sc4=1{knR>NULteQyMZ z7cqEJ9ejRNj^ zO(b^(mR+QKEUrNJoOny%8tBSf1vRw(3LEh|0V#MN-i5ph9;sDSltK^rxH^o32LuF1 zvYyseSf3N2Hdg`Xt&DL7DEKP8J&nN)1H$aWzd)8>L>QY)FUwzL7fiJ=3k+ zM+q|1QOi|$AC71kc?~o;&!Dx>ouMd(*7L{dPK@(fN#mBRROFsC!t9$BM>>w`;PEcn z3G}igld$O{-RsOe7P@oU=3$UL2EolWdSDPV9?$mnK}y`saI7M2M|@fZgtm@v@1%1q zjNyZsUj!9iXG(>c1J!&_!N{(JI+8nuU*5?u$mTI6h@z=SVn1-wPPp~JqwED=en(#c+5cL`qo#br-U}l`R6Cv>c5aTf{8y8r^qJl7iq}(WkD8>`#;KDq>bq39&z> zB)}v+2i~UPZuj0Zr%7M4QUe0+JvWC?SOJNZOS*S0O=?oi+B~ut?D}(n28R~InNIBH zw-3KpzW^7HhAEl*Kq5OAld9t$5$#iwNnSYPR|a0SfW2gW)>ZH~H|7>c@IL89ii z7Con%b?&*c2>N@I?Fy+|(BxHg>81Qu8u3?rW#Eb6T^ z>8o2z5B*r|zW$&rGzxarxYkzuqDjq5n00Bcw4;n6RF#cWd)s^h`Ik^;bRJD8f%p|r zS3v@LD(dJ?37f%RVmMEaz%~062|>ebpPzxeF;Td;edY3hu&&SO^B_q4>!vlBhX} zZ4r4ACF6puOR3TNSYpnkL(}l#P^^}lh5TGdyZh6}4T(R0 zd+cF7vf;NLh2EnK$r+dRMsn0@Fu4Y94Y=7WH|D&X3cBE?qKPW+L9K?5|7>1pzujd9 zkN4th@8>wa?pUz~QYoWk$w8j>t&3WAfZf^<9^4Zp?~zj(>~&#zD5MO$k%4xUQT++m z$&^uF9f4~laH+DEz~9^$_{0nl(OezCB{(??Rh7ZvHH-V~={|@103MM|8?x#?B}3Zh z@LExtt4B*H(^Hi~9uL`8`C(k4FO7Tc z3kSqf__%Wz*BVIUK0bt}4OsJmN(hJHNVAf%r3X2A8ES12dh-N&I=&jV!{aO2;erEM z=xUKFa;#HT?y(<^H@pSE5*{^97j}Y%)CmPGcoW|qZf;l_AcralOH728Re|X3#j0pm zF`SQ0tpb$7J>lBiE1mQ}!hCc#n-|nfRmV036 zvPZ16^#B)CDn|z&!3GbZECh%^D5`k`2fs0(=Ob`4ez@V`@a=IApEy)gYGRmv(v0Ty z^eN}zsHz(3?zvA?rP0F$@L&|9%Z@L2dj`Y|hMZ!`5w{zY52KAB$DgC0_K;6@vWbDg zkHO@}J#l9rL&Ra6h1=g>d%zc>Fp+X=*LkS!F&u{^0(72$FGkgoPBZ7sDHvTV*V4HL z#%cg8JoPvRD!gI(+4PO7RG(h`Q|xfV9`bGylu-H{zEV{G1P)}742eH+BQO?OJ%!Jl z;p5*2cgr4W1Z~T~Vl@ueW)%Gt4yTbb;+ao@>jb*`V+FAqsAOPA>W(@$gpgT1%9TPw^0EDETsv)_jYTTzp7_FU|uvY*=%>jlT zY=rTz+?Wf<^(AGXi-~%kTY#|OU-;{oyI;c7E=;r}>DxS2kn{~wCHGO%1XTGF_FFK~ z0AJOjD@bxhww*vDH)~9v$ zI*}qd0y(~=xZfBhy+R%oI*m|A0z*9jjM_S#KxeJ zy?Fz3(Cj+A-%$@op@@WLkRbH-E@`n2atnhlBwn*=AgyS517pZ~E1Yv)^M->;LIhR# z2A-1<23)5Jyv9%_Es?_^I>_NI91bBA3T6WS)5ohG|J%}EUz#Nj(I4i$YsF%#ebp&)EY=)%LSWC3;V`I|n z!$|HuW%XaP1Zx<25Use+4zmY0at0TL0sFDnzqSIo)(WWo_;=uK$cnW~3}` z=;>C$S_WLHtOFmKYoH`)+sJp%bSr4Z*57m`k=zH?apcRd^BLTX58!Ol-GLv#)|3hq z`WbwE>;tT$F?f^PzXoBLJm0{r*TbRkLD(m>^yUxDdp;vK7+os?61*1SMzbE${|IA1 z5ac0`kDx~9InBG}Bdokg&Nzy}GB0Rw^+!rc9D}c0wN5ucp^Y2 zrng{kp3qyvE&EMJM$A9=_Ho_YX-1ZEB2cX%J>AQpb5BA6JBZ$Ctxk~{S!R+ zz|H^o^m>I8Ou*@|mghd^eAG${9{m~i4Y33#<88utwp|4`ch;SXLO#Q+ON>hW4B9h) z)4UIVtBa!A&(P7tgl`yk^e>Go`U`p3;tSwNH;nuOxPkiU%{LhHVP9Z(7K1-|*~fi{ z@v{)78LrMl1~h5W7x+#GCKZ3N)b=Q}WNDv8ZHX~zQMT1WQePpoh%();pzMe#vJnSx zk*S6-n)8)4WEsYFSrO@K)2EH?*}1rdcD8eBCXjxE7qF_nGB1M3p1*OS9E>c7r;J=f zYX;GVj%b1oBHG=XK*QS+v{74{C>ip4+--pfXB6_4QW5+*n&zl%qGUvx@ zk3mZcp(Tc#;MGO--{2#7xDBpltNNb=XGegux$*=(X?d>AFkmsM+P!Bx@P~&ULpO3q z;fLuo>EUL!Ur3Ci88kR=hK4w5YG#9ngmoK(8}uCl1ouY6<~8rIm8;?AN_U+}i;4cu z_+UuNga>$Mz!jz`?t1JDLt6G71`Fw;SKq;l?|kVlQfh%MGy*nl0dU{~TJY`#U|(Ph zY;46*uL__EF0{ZTfQ<}*txpSRJ_3*Fb6ncCgeL87f$@kt>hPt-WkEnv z4R_D^0^T!SMw7bzfHUlv^vJk%(<&h<>|p3}n=Z4QCQbgqI`+a3FkCH^2HS^faAzFS zHi1?k31>)#wz64xG6p}O!Io~bdyWQd#EjVyRimM4;m|ZaPScL8qO}#S(hybd&Gvb@ zrZkgB)z;E<>TRq_^EOZ!MuRQKjpL+O?9QKsvo0=!hI>M1avQFT65H6?rU*;99Zd^w zZ-YsSG*jj$fZbwH%r97*x%`A4!eE0S7hO9rKMC&soMx2Kq?%*kXTrmm^lS&_GYOP< z3@;sq*g_JIrDX=kYDgaV#by(^U!bmtLAm{c{Epe`21=-UfEwJ(u7P3c*+v`lZNN+0y<3PF8yEjY!7F>WdEb_>kt`e6S5jMP?diYS0h9L|6mMq0e}2Q{ zN^F(+1K^!IX=;~0u&au}yO(~qoCkJ1f_osxp4q!-(u_Z_OF<+QVhKXKX|UyP4N=ZR zLQE2KYwH|be%*qbYi2gXHl>47AY)hMe)(tkbk08L#Ub&GrViHK1s$O24g>z%0o%G* zdg-(J!U-VxW*_OW{nrT(fQglXolt1LzyKq3x)b)9F;ql)QE)qiuKO=bw>)1A20VkC z>mTuCT7pM6Q}p~hDz+C7zk0a2wqIdLGrIZ8@X&Edp(S*7Gp6mAhhnOYhVFN_rE94i zBjefsyJ;wu@b6Ezr6-d8dB858Mhmr1)8JO>#Ov|`Kyv69P2w)VsMrzezs(D*egikx zd&0F8Dc28_!`me!lbY zrE}BjlrgtLK|n(vUB#Hvj&ZX%*tz-|E%CItEuCQ%CP|MO1AGa6cn4mmNd+Zr>FV^F zfzn`CAiE7W*T?4>(pT5P$9@v5!$KrL zHUsbsSL4)tT544O|EkYICBaKt=#3AWN}F3vSCuE1Hi6mITZaspEhqKli$+yB9X zN?tPD+-+gk0$StR0uAmb?{Ieb=sA1TSYW|kG=iJGa$_FSY?ib9Lwcu%Px;4Vb71RO z+pu@PPeb)mY`1AhgA-kspT~8W_aj<@kc=%; z7HG+Ugo)MYjTCrkjtrAEA4PtC7zYyYE4y4TbyO1x*5j81_L-@Awx64xZa${u8cez$2xch`}>MkHdo$O zndI4?%MY%vSD{3CTc#qYz`W*lG_SM*Gh%t-@uefdgkx}XdApH=0?Qkz0KA*(Y2Neo z8X}yv0rrDgj#$_jRP+m0QbKQNI;%I3iq#ZtrAR#Qbxj=r`@p=*aB~OS4u*b_BJ0x) zirCb*$Wa+wP@rhbYyebYu=+b%x||XdX@yghP4HHGN*}@b4C#C&R`5C{kTC2$mSBwX zlvu$P7~Dm`hDchOag9m#-S7jjLW+guGPkl_j2x70htgXo>y?3b+-JP#)JMUeHMkF1 z@XBZIWA%h#aF{?6#v|9oj_A8G>tYKPkaJT8h3eQEprtCTX&W%uOqK@ctJpG2-3koe z!+@n!S!!KX0CzCpxqNU42G5hDg=DL;LW(dL4ki+nU3{>d8i1|jF<2K(R%2&DvdrH> zzy>HujTLeZQ#TT@9{Qrj4BnpGPWsR>?3EicNrC9Iu( zNTW4u>AjtKrFIHu4p~ZxujFCx|y1;Gn|{SWA-yTj8C(p9E}xmTR)^ zjKbhK%5*Dk@TrOOZ!=&SEtXnO3#biLXlfrmI0S>YG2m=IxCn!r8E_XLET;|NX{xjk zH*Hq79|q?!;AB4dJb(q@h@1|T9^bUt)(GeTbQ^~1A$uJrFZB!pu9rSzN-NTrC+`1P z{=YkDoH{Yd(#*DZsD!As3F4lLf}0yEnGBCbAD)E<9)xEj@Nj!qL4)YAvasnBlglS4 zjl#zDRkV&~vb5kFGsT(k@jK0v|J%5FmS=G92F;Gk+V#JkFach+gp6QmHncZSwabQQ z|65NM!((C7n@7T>fxGJNsLK_BKWoYl^K*d50f z_uN9`s}6c&07>k!KASqq^dXcM=psjb2oDhh7OY_a;PbF0YyhdV#z2$%T!YN6p_rt< zG0o|2tjYaxB}}s7j-x{nG${<`P;PcjMfC=3cGWfnIj2l$IkOD;wF?GM8Gx#6!Gdf< zW=64hO|ab#;>HN|o~nKfr6qJ3+NzLEh|NFW$4o*Y6l_A=9F81Ef|%(>Y$37K2&B8g zV?*5RlSXXWk&nS+?P>6DKDCT7fd7u9!Oq645I+n~9!0w}*_f#>YV1ZtdO@rIPitQR z7uE7TE{Fx9_$(v@6ioW=MG*t+K*cVQE=dVn7eq`jk*f$|CnzdDF|a!kJ5aG(vD@F7 znR}MKyYSxg`~UCfvmb^tXU;iuYU0kF&4#bkn=isXG|}f<3$Zu5WFPi4gx(C&RGo?h zIWuO?O(1I%n~pht&XQc>P#;D;>6GiV3+vqCCMehDCLosvT+B*3_oNAqu)hd6vMU3( zX)3PUnxy~C`38g!gGQxnw%JTEv{GJ2u3)D1luOBo0-DVuy=pR`Q@AH>}hRB7gQkj7PIhOYksN!`j)SVMFW*CxNwHZ;xqb zKLPtKVc_H?hSDeRG-XiHOVSuhZ%)h&tHuvZ&WFyD_xh!oX=6G=UCxQQA?#Q}>U}_~ z0Rl>$bfZwfaU4yd7d2+tb_aS#;44Ksm&xdLl8L(*vm=J&T?e!aKvRl3WCcTwTVYsP zSSG`e+AM=kj$TRYzol-kG9&x1BI+@ z4E&hKB=U=Z$8A^etmUXWrx0k$A8?Shoa-PajHPMCTl1iIszdC&9>rf2t2s`hY-;M@*knjjVE*Bvkugs7&b)$8|}Ai3?(bf?<^$JOvV(!_LUAAsA|Y>#eh z(jMwUACfvV!M#1l9-v)V<8IO%EU_HKkfz^Pj~SWV_Tp5o-Trh}a%WX0pi1pA_!+ZD z+%q`cq}>5IzMKsl&%Gd1dqV+^H&qdacEDY?(H)>J@U2qa)()a`?0cHGTpMiOxw5L} zQ-tCUn2HUZfxv@LL`EZ_K*LB|@NmZHh$MBP-xPK5T+>-h45KE86%_;VY#5WIN$JB6 zCH!hGnA=TVfR>Slu(BiU26?&QX8mLW-YkOiUBt-Fz3(LBKt0>Qpwg4SJlrr%DAewV z8nEmL6t=-#90Yu)nvwLj9b);l>m!Da1zAHtR%xE-DXi$oiI0455js_B5IRi+<4)rC zk;jRF180K*C&7^nX+LuWw@x^bP3i<~X*&dLpR|i49n@ z#+{+_#NShNo4+J4!IBIpjhG-fY2FchAhI)Oz(Qj#lr-;)U^uG=j%sF9NiszwBsb3( zea{8RCBawP3lB3!lALoB%({S5X~?zd0(2iK*XcDflKy@W!LxKJINBL#&V#QsQ%!56 zM0abWGGsDp{$&LR?MOGJGU>qEtE8J$CX22pQ~RzUQ=)QRPGh6WYR50Xen`986=;$Z z%1z*lpWOHgf<`w;+yz}>UPYvD`EFWV*;BCD1d~k#{vPN0-4|%Qfv;3dO?XdM6tkLO zL-Z%_1|duJH?JGWnpKKWQz9mLG_<4B(=p`a#=vT-4$(EWJNP7heB{&}$Y`__G`hn| ze0+Dv(iA+GfP338@Y(J#Paxn&^|k7RSAr`j;Ux{J-Y8U+@5s+dlMA!R z`vCaKjlbl?P=7fYNpI*Q9F&_$pJu>{m&$mh2W+%c8B2PAjHb>EY||4)0|Jg}F=etD zgrNf*1d>uX*p;Ea=xS75a^R9uTiFw+wd})C?)HQXN5COPJ%4Y7fO=)7YMT#2tzHnE zv~BNR(Du1EGgb{BBkBD{1f}t<6~6_bGeV8d@d!n;n!@v5Fj1oI#yS>V72|Nmq%4MyKF`Z+d{geTI}O_2W(pl-hRbgR+k319UIJ z&vh#Lm=1N+ic4Mlj(q?=lL0Pdg}wuSbL01>GW>g~Mzw{XeIOjD{JMRC)-yqgR-e8w z8j`wJI$`HpfLt>`E~!VDEmgwryA*O;R$nBzj}Tm(p@i_WFRTR!!4sORKhy%j9>7;R zc1(gF;#72IfEy||#0_X&%~Yz(azkStB6YpiusSei9YMDr%0P|sbc0g6k^Rspqlv+W zW-HZg?}z+Ole%-;l)#)(GO<52*4e}AZ1)(| zR!c1XY`XY=24n1p{!2%i^+HL1%q*4zfX>4MN<6{_h}M0**6NuJScLrIhg5+*k1F9G z9e^FO_5oUlPm(%A;jN=_72(xMBk7L% z?k4m_1M>DD+$Fk6kb|EqA?puT5E@Jfy;iCVhdTN+Z{(NNLH%L8kASoy?QBzF-JxHs4m49uh#Vr$AQvPw^Ua0SJqI$Wl=#<*!ph+=RvaE8&ZOSN zt-aA0jM*BDDOFra6^2@GDC(@`P~bSEIs*p}#mTUofS#nW375v7Wp&D2i zYYRrhF%B(<1DReeSly`MTzzVQb}Lgm^?{C0hK@@|!xUk~aGd?#ByF2IkhYD51|v{l zs}TS`>&Qrkj1U*%_CbDo4}oO2zzL-(^g=s^dT@j|J+A*aB&!6tw}ehe)qbrL+!_bW z^xc6OO^%lCz)YuyD8IXSkfMAWZ|%cS54(#t?s0uZGxF}4AGm{5uJ!Qq)sHTiiZV69_Li`ao9X2hE7z18I?3DLWGr`ijX61^(L~m`d;Yd)?NT!Kbe3V3t?U& zN#)buQj*rf3NMbQ3(F(V+F0%b$(_|ChhGMw>d#0pF5{_)oj0%?13$1sEEM4_dQQc4 zGxNxc<>o-mToPA2jPV53E6G?(IPDFlpxNvuA!9a=)#>{vIz*Ckl|>93>LXI$ls0lo zf6$R!Eh;o&boNmwi8NliOr+_npy>3E_USvyyXbvm+#Njr-b7?Ph89ebF>C?G?SR)^>Kz;F97qIbpTL! zdWwNV17Js#c&oB#QiG0zAF~lRC+@te(yj+_i7?+bt-P)V1?$k}FJD{k$KRwSKf4td7#502tYsL8`(ThDR@)Wh(V+M+&81H_(b+r;{)pA-JI@8KedE^Ej@ z77}M!FSdjZY765+xEl1iW8%9OZ{Uuz8}@ZICJP#&kdaS?h|f~CH)|995lHM*o5fXp z%Y<;7%2gMdhobwo4Fz4bFQIjdZQ%v5Nugrb-z}dt+!08n!&mCUv)(aMwp#$d5b^hZ z_-#d=%`^bk(%F60_Y9w!qG=eXPkZrVeUlGa`WPEcjh_0=^v~=EC+r^s{V%f(1~Js@bq2L$!~@Q)_)9 zfkJ8}!AuT5GB;A(;7fJ+l6?#)ked#qF)%?m7>QGyZ=@|;wMe<=RBxz$7TG*0DhnM% z+V?8Dtl7fRn0_~n25K`z@UzjJKAmhW_X;v1(bWW8M!IBZB$!5VZCE&ujDohsH5ti_ zC~=IvbyYWoJi8&kCn0suEcm4!+?~^jhPGSlv9>*#96^q_ED*Jga;g>k0LK3hYSYiqF09$MvEnd2_Im46!@(Nc;4Agm)E)%YLeL(E zbMS`afHB{bQScZiimtrLCCw!}MbsVRaISlnPzZ5j6m-UmBS*f$^KE5&`;h(&)ptC4 z`^51;;hG5EGhUpU&+mVT&jZ(5r51P1hcF7YCx~fcjF!>baL~Xe zn?dT1L@*)WL^P}+JXh3xBXyOdS)Jo#jGVrc0lZBF&z&qzwi@-C*ZcP7L({_Nqw}8H-!@RCsltB(-&GIQI`<5v{MmvGl5tY>m zhWD;i2O8m4A_Vbl!BnnDWpZd%K@c=1fzM{jMfcv-qm^C{kbe(+rK#+LKsZj z-8i6-u!IRk^NL#>r$-0WC(Z3=ZWc6>VHe0JlOfE_guyB+4yE2l8V_2<>b}Q`oj={U zN8@hL`Oz?jN%L3H28KEy9-oJX#RG+~EC$Ys7o#ijLG8o=WJH6+Anic)Eeut2s)%}| zZT$I`V5i{_2+~kqyPcs9or=~Dp9;+C<}z^hRPm_5c+2BA$#IOnU@NJ(kwWoQ)U-(g zv>maJw6zet61ZA)z`2@`ye$^A{0P2MI~&7KgmF&HX)lnrxAPg_8q=`vbZdIjeg+Pl zhCwxD8ekh8W1J2Em~yhxTe8msRPq)E1*uBb2_@5Tc(Mcs(d==Skqk-1j>i+QMF9)A zLy0H=aVO1Lmsv0wP8ZFm{Jc)ur{7l?;g(mycc)B8FPJ+W$PBo_>f|>Xsy}s7-msS% zsqh99>i3O?m4xOq#F^TzD(#$WLuVb;I$Ls!u`#|4KUyaTe5T=fGeCr%_gLNe8Q5<+ z(fV3U!lQ}MWG2RJo0)(;=^?`&uK*_#aIa?!e0HXoI_q{kc5oNSLS8DDDqin3Lp7Tv z`rVn(7!6ux*%0W#LUSlKV~SCN*Mp?dOV~pfhFa zyw+fxI5p!KHWsPRMe}Z+3l!4Kg_2CJg>7U+Xt3Hlw8}5pOHFMln9W1|c+3Mjb!`~= z^m(Er5iLgCaRu)>3}0!=aG1J81j||i3h1C!Toxa!-fSY z=Ai|^cpC$!E)>)29P1Y^kAok)h14vKy*YyILQHxg3!$knh*8|MP+YmLxjnh5Cs^w= zSWC*>W-vn?F&I{5H5Z}LO%?%}t8g-t_>ku!F&kD%aq>z8`Qb`>6*B3=7@1vw%Cb-a zp%6TrforCSvuq#VXs5C#dLe>y3fHn2u!a_oj$iOnF_=*&if$314Y2 zO!j1`8$BTyj22@@EEj_qmR^EO3UnlNu}Efx!5QsnAn^pgQlByKCuGcpBa5*kw+V%- z{)~cAs+brIXFqs<1+@9FlBz161T#URQ;|YaDp1f0V_=9b=`(xMDI8qFb)w6G6{r z|0<3|pQX@ushH2Vj5<}x4pc@Ck=P<0{LPI&3%`XE`?{ib{AMXTh z$*4~bDBveIzSqpswt`-oXddOQ04cA#vrF-9d&Z869j`h{C~pFgQ*ZdmjSmo3rg2@F z&R(Q}&R)zbB__z0VLI)#4CkOzHm#I{@C9@1)bRTfRymOhVuD(jC?d=Rv z)ywASkM0QgeZe#&wDFT0zjBQde!J!9Z6lzh*#;hbW^yfUdWA=fQ#HWC+EW&#fG-!r zXel*bTll3Rt^?ZyZo(A=08%y}!TtY=Pi}m}97N8&c=Fyn~_c z&E(iU2DTrk9hw5D8`W5U72alwtV>2-SVvfsI~Jv^kL_jjCagf#O4EOGeh5GC<5mY4 z>ed4$(ihuEL_R3a4L$=pjfL=&F8}HZwN`TNs0OZf|5=k9ZF5o!JM9XE_Fa=t%S3c(7-$!iq6D++vVq3&u-axGT_tzh^a1d*1u5Vl&Rm3{R6(et1i zUC_QX(^Yt)z}FFMpO{n?&aKACDIx?LJXavVuUM_Yr+PwMRg$_^z*jo?sQy|Bf8rWk zCeB|2v}P#R6|NDL_FJyGV?DSANyE~CMHAj?5IbYcGKkAsAoK2>0<0}0tQGrcvS(yl zA`*G?Qc7m&dxl@ImJ`X85Hj`PaE(G$+&Ty~`W&Gjlr*;RQjM~m(u*V5#qt$-1tv|-g?fCA}P<_8cUE43tsCvdx~`1PiOF8aOa9T zs_)gT6}ABqm8|}VInT&++YVe>Dp}i_f;Z`e*#@x_%1aUHlt#M_Lyg{mYFGdz&1wx8 z*tUVGj@khY2baFKn|0IqnXr75}Vu(6Q82^^Qg&k^_rD+)If&RdznG!1?| znmwo?7xigAhAXRb$hlVq*m)0tExHKXvN?TW#b(ZeVbhD{Vi2t5P+4*&@iW|ZYT;>m z=mc2M3*rkxRq=tFm&In?vS43`pq@+^w6GeWbpx9kD-eli{N0r?PR)Y85mX^N3*`CM zoq_M4hU-=cc=h{{ExJL={_r)CP?#!sXLAh%t8B=kp8!+mDPPflB%Jr_rJ*8LF8}pmt1eC(VJ8?5_0-Bf&1hXRq>aB?gCa7QNrsAEv{fI_(3A_yQM{>l4mYU?@4TY zojLfB?GQthHNCenPy{96bNgra1~z)qkhY3kf0;&0voLzC5AdtK@< znGVb1G{J{I!Yo&sN8$v#9q^VTb(ruSpv2R~Ob#HxobAHwtDTHtSw6IZ>d5g;DBc0f zR@&A$7ut?|&DtitHmxB9<%+@{tMtnx5QYk$x~jrje`5Gx73p$;^sy+ko++84!EYj~ z92LFuQ_-xl;Fbp+HQ5OVB&j3V?u1M-x`LSypV-KhnLD$lSruWzPA~w)m`yMSR#nD0 zw-Xl0wDLKr+@_;kY4tZ(&x}-#pCuo+9Qt7cYhh{B1=Lh-0Q{;-u2?3GE!sr1C%=Gs zw6^M+u5bO)#to_wT#cb;zGw&Fi1)kzsr0{yRCZoOsTvj{m05*|SE48lyM$B@T!LDf`bhp1 zTrR^%hW`#`rCXQLW66mRVc-?mai=JYu5kUCQ$M=`{iQ+Tb`@lyr5#r>4C-71OH4fH}`ovs6UT3U4-ds*cMhMM0E@FrS&{053)aT9sWyb1lFwXbi2u4rlaEtKWZ zE#&*s27W%K-EFQ1Lz#V>3udLyw-I?{5f{q3b-suTVI`AVG6P}A9nOvY+eaJzJ$8p1 z$o{oG!y5>#?sDDPzil<4HsdbWi&1`gmz%~)G55I1tn~377spEDi?Q^x7;C58=i*sy z#RpspD=m9~R2o0zCNS8_hg>2nwRnVhhaYiM7_9SSZX7Eee9X;ZrM^$NxvW(Dgqy)i zp-;J)tn}q6@}2yQ6BtbYIhJ-j=cY24;|p#gE9Jf5Cb3fMm&h&mB^S$JRWh07bP-TMZ$(cvxD?tRNev9@+4+*nr1DghXEy+-fQ1rpzZqf^7beFyGC zOM~8{%jdu6!Whi@13E~WqEz`K;)Q<%JepAMDq!6{A?59glJRHsoY|kDE#>y^GXxzi zjrf9LfA|YJX0xxzH{~n(+V`)R$b!FN+rn>1ug!PlyY@T6bbnwe_6O1{{(=4N`V)gG z=O@DI{z4uJzfk74zYuTuZ%j)^e~T>^H4k&(V?Ls6N4&DLni9BP(v1=aCm=K zqJeQhQzixmjRd=jvR?I(UJ9JcvJ`Vs-q65d|Yi`2Hn}Wu@DH$)Z@Pe{ER|E1j+_i)5wtbz~8&w5^UToRu2a z#af}RYyyMTttXqvN-6bZ<5)?rzHAaJ&99HOHT7lV87xU3YpXXvDzh6POxpnQW*8v7 ziiWbtYDD_y+kZCJ7Va6#>Iw@CWy2Z0H-^}wAS2mW276$H^n8u6Z?_bs0S&PqClndlwQA2A@WzmeXk(q34RU%74xB8QWVsjb%9+8<$oD1qULL$=}A=_Vy(wN4` z_IYC@>}8JKEiy;g01H&hMGILfV;j;0g?ijXHkrW!nx}*A(*^ZX&;@NYpes_j)D@$=OE+wLxEt!lxjVYmp6=KW`yR-5T@RG6QBTB6?}_=N zW-r+^)?c9)N)H*rK(KX{iHn0&S44q?VIZ{b4TBiXRvEofKI1-E%IJesjQS!hy)P0l zcazO$ZS&j^uT?+vuw(sXDXi9`KkDj!e_0xX#SM@pvr?^rXt$(+vKb6ke-H-Gx7QcG1y=3 zvSqBa%^f9h_CRizJWyu8k(exgjg;k!^gL0%a4&58(@U1lYBRiLt68bD4{GwLk8C-E z1^A+T_kCpt8El=OY$+>s@<$&!?k`)*U=abb4Xk7sh_%ZD(GO|`VRD=ugp!&EE36fa ze20%h%iJA>mYE!ap7=ck@iIbXd5qhzFxeVb(g?@Ctqe!MZxn&t_C=tcheV=19z|k{ z#L?KdMp3erjNXYTZ0jA3p7S*tvrj?{_SYs>mcv>+h?Q+*rTJs9MYFMJ!4qR;b6M@M zacGaH<1oXG9xvO&YHcQ<{8L(+Q}dh-or$LVjA$)4chpjmQOPnXe1bUuG;sP1at7evq*U zW$B-S^ggCwi-g74qGl@gXlp9s^%t2X+!BQKT#7w9y%aU+k%nVlaT)fkN@R-Rx*T(o5ceu=*RZ z#fFWj18x)I{k;jb%WpnxP{U>547TefTo^OpzNXw}hM&^NwqLA>~_Xsusc z(eLNxUasX=wA4G4ud=O_rJr1E|&K^RT%VCV3;=?#q9&$vsm`U~a2*&jE zqgXOJhEaCl82XjVan#zGMIc{gL=V#8Kt_GaNaq#R}#OroxLN4R%=D}t3oZu@c!GkMUJK`$Z z?Z#EC9dHflUA=}q?{^(3pTCY)aJzwcmu?`vUN_NmPT#~9-EN`uXKo>0r`yOa|2E>a zDMHKaEy5NZ?jYXoJE(h?yVzp?UDR%?d)Q*{J%q`M(d#xAqokJiQGzx1k#fTasPVK1 zh-dr|wYK^p_NdV#gl%|)S=8z=(p&o&t!nWEwYEZ0GJJ|{S3bpBqh}a{tDj-p#?KLN z<8#zTix(*Anir`1CNHsX%U`A11Gna^`E9oW{q1>le??6*5a8KH9#) zMemX~*blw8$YY_RRHp=`N-IG>)q966X1+svRCul;_>U;5 z&L^ao@Cp0&jE zSmPK7aX(-ShAvxP|3LELKhXtV{lru?{TC*(CciQ1AN(z{T-=#wGrGlRcyXQYs=yOytqJ4Rg?^? z@Zx6BqAI*NO=?~hdF-vqi%TTeYP`5Gx>gOTxNGy`{=y4wlqE)o7Z(|Z)lvHG)sb>{ zU0z%)73uQgE`@Iml>T82UR>yh*F?U*Yl;dIrt4vg>a}=r>X}mub!GDxFD||c|Ki2% z2d~<^I1PSTn-_=7@pVuyKkJ}g;_9LV8ud_rv+D6XnC_kHW8Y5I#}=;oytwSVr;kzv zG(gJF8z3ywfERaB-oXoCj9#)KYEs__`<7{h8n-h>9qcvc|7I;>8=@?hCJ1|M!ix*W zR8wADhIKUKcd{1W&5-ZpM*JoQYuT6=7q2%JrCH|Kb8QQ>+cpbcTpk2B;l;fogQlqQ z{Y`ms!4uL9`POgFi~CXQo1+d|w%`-!#+mIpK0$EP=j#b)Tkzs$Ro9kim_kKqq$Mij zktG@{$_nv*S)r>XTVt((4YpWmgLqc9SlVrirgX7GYTko?6~Xl?h_Na{^%UfhV%!1(+MT0-x=}Nb;h=~UC=!FU9i@*EB5k!SELu&4I@aaJHi%r#~88dfj!FW zfq1Sxk?-}MC`+vYV1V(xcyY)2MKA2kR97Ub*Bc3}>5YEi&dTA! z%3f}W_sR`f#`MGB{?-qLq+(?DM={`EG4EsyKr2`cMA+_uC`PYADDM41Xqi!iF>+rH z=EV*6pdq}t{r*@{@*9eo@4-;4^&W<>d&78f``u$W!fp@e#cg``5g7GFBM@)6J5sss zj(9^oFbs-3kc#_A%z<}D^5Q1>U{A!m<%u#6@j|?tUdU~PH&VXkjV-)<5buEx^6>HH z#fKKRd=WO>57mCp52<+hW9gnhnkO&-HTfn0dBg-_?e{=l+*C;q;&-#C9Tto&ii0uB zC62;U^AOCb_d|HxI1J^*O|wQ}h<7}UU&ZK!hV$a`v1$Y_Zso0yK)ha&Naa~1wwN~> zb*~$R@@m*;k3*Q= zc$6=9JX(vNfFtU4MQP$h9Et2F@mrWI4=3^B*38n$*pK>CcyXI(<`lGot{nT3Do3g6 z#i3Qx<8W}O7tf22qGrXTWok{uAYMBaJ;FQzeRpL7wl$oF<4@)^MKmU2FH;gRoXw`A zRO_ZA59=A2ukvT0?j2?#<(!!)z2hwG<*r$n^;~9S%Gfs>qr1->l%;SE+Gto3aw|^4 zUJgt~sfv@aZ(eh;_R?IGbm%;6dv6{lo{;&N=DyBHkC?asrK+?LWf2x45A#Ks@b)Z1 zyv`{&+q#m1`O1GWws^M~@g}7rp00q|Y^i{jv08$7yOto8ZcDND)>4p^o)MtWTocmx zp6ucL#WX&Im7JIH;@Oi;%fNl;qkF@2UVP|1GaZIm3j30dcs?0eI-3Etlsr5D4Pqtw zEcNhmUVNfmKNECHQRoxdHJQBlT%7(}Zw35I$%n514bhU;N`5ITty~Efq_AeIz^b&A zwF#ufnx4pWGQG%!2?sawb%hlGV@>Plz{pLBY|nwL zMoUAtp(M|?LC&MF8QUSx&{E4C$n4|}#2c0iK1^$Gb>b z4TP9{NK_Q%TRylxEluAKQ)XJSI)JWlR8bmn5S3nX5b>5ALh{WIqiDwtL)cI%eUG3U z-8q7e;(HVa)VoJ{@jzkEW4!nvE$0~cKV5Pf6^bBY&FOfEYGp8wRM(=rXGitt~^y@viB*hE+ zz>9~BuP93GKElXKYd3ww%u@Fg!lr)W-C6DZPbf?0&j?%dnIFt*e|_eMveNJ`{4iG9 z^#vu>|BAISU$OS$SFE-FhP89Q@k3bKXWx)VkMH~l2HWr*+gAF4B_BoUzz^_Asx^8H zw$)GGi8UMZlOM!N7k7JzreIfth1* zBo+!CL}PFo4ql9ypyA-jO5ZfFc7&#bm~)S6I*5}S>xvHI3B}Zk4&pSYik5?D(oii2 zQP!hc4x;?Vl^psp%2Aa7MmwuF!QQ}ddKLQ$KC!`}el}75qhtM}W142g> zpKWh2^hEinHp=f~euT+^UhLmL2g4gDe(*Jrym|6ljf${hn!Uc9v~ryAYzBFq&IZ2H z*L#wymMLa%lz*6icucf)%(xg;5x(Ed?DHJncxVAH8Pu1E@Lru*w2(5?zBUy?`5hyD zNxQ$Qs|gY99}^pC?HdrN%6(>yw|$-A&9+lsstTB=PNjQ~0R#K?A7(9&idO4JhJCZU z#qi#G+&NX9RIybPCk71YiH5X}l)R@*6#S*)NGadkGFgg0o$z?*&WA`E`q z;Z?9SUo{&2ySQ}j-Nm{L<+LBurQZQ~1!rBds*RThtCA7SZrj&&BwAQh`I^-$Z|q1i$OFCWHnTzh2D+;6 zuGlXwpZn;F4rW?Jc;U=h2;0g_%15=EYTtqix;{tSlDrB`Uauiv{N%>F|3mXvoY+rg z<&vnxPj38`e`p>*+rD9Gev#igQm&vjk>0)`-huwnYT0AV)V+r0W)&)Y>Z$rpq0!Ou z$;HM5hem_b`zm>xyaLggsoRc4TkBkv%DvL>p=5BEr(F%x0f@4YF0qjs& zLR6WiV0PEO0nJ+nJzCbTRvlzARDIbmPp91GHr}x@K`J_nOgrcySKY%2ATLy8T4r(M76utetBV+udR1Hgo?DTT)(;Ub|@{ORf zMiM*t^)8>JZ$wz6cT8EmF1)eiWe;!^S$9=O8QA|H=*c4@LW2Fv6fyr<-V+ZP%O-}Y zy7HaS@+pQz`1w;`R&~6U*~Z01khd%#e?fqVpK#)N6OziO=j$H@gQPSxs0NMSx1A6H zw3=xv(<9_k=ax%O$f<2#kNTW#*eQ)+@YZB47zd;ScISoVHn;JP3@%HSg>yXzHGzP# zc2PCv%_Zu@VL}o#rrR4) z$GGG+e2VLM%?gFNS}K7Vbg6tfe7%XIT1WbasmfxXGY$u(qhsWy zGguoO5>(06AM*!8N3#i$iGn8s?pUxx_qLFM5HF9H($8{ zxnJ%Q2-!?oh4T3GOUox19pfDn8|~=}39ih9lx=4-HvlZ-5Bii^ruVAysbYR3c9z$v zSO?^(O7mNbv{QE;LDa^?*(&^#A|3cQ&Ggz>=YhTxe(3;o$`6F^qPJ8&mVny-EjqknXUquuy z?uR$VX|KpN;_}n~-Xz)v6+=Q?(ltVd@COH?ALZ+I;xzQP{;N2RONlGYpzH!vP_i>B zANB9VN@@89s|_4*Yj6rPEpcPP+)IT!9J-W=v@t2)Xhb6=8rwU9493-9jRpr0)5SB+kh!e*@ zaps;6nVwAt^|zMLyIcFe)3brGBs7#Mr!4RHl=;6~2NK^N3Kx7J7czN+`?QSyfQ_07 z)Qla_^i#DQ-3k>3z{E=$XA_)N7%9(D)QnKdsVt}U&|jYLwnl{tyP;1~t;zeSa4Fx? zft(F-q%gSYJkUR?EH-+zTUk597}pS-CjKe_S8JpMBqP8e+=ZtWe2E-^X)v1SWm zOO-Rk`@hpuky<$`6OUT?yw}HfV1acooRta<#?Flo3H<{uN=ZYN#bA%I)fYjE+XC6T zlm+3ibwW8DuqcazA}&UsU7Ln21b|e7OHt|eV#hieX(CX;_&PFY^7N_+;_Xu?42t8_xxs&SX!9_JTrQ2s^>d5Aw z2ZRRP&iD5rCgRjGQlsl?tQ6a7%ADkMg+V9M;J#&Ot@qw<_uE2GILJuS*~Q>{|BXc{ zhv?`~PZbt4c{HsbcJ)99KHBxqtsNnxPQeEacQAuUt|4W-1Ij24Lh;3(%46FP+x^ zeS)WCWHlavzl&w$7dIUsNhxUul=Hn#*(~H_<44((O3nNaLulSMFN6J%UfaVkA?4#+ zuWUZ$v5^yv(WjQ+QEL6k-qbk%1oWjj@R81x#u@w>A7wVm8AYzT*6gAb>Tw#2jsJj+ zLX9Lq!n|XAgFJ&GqGQ6n!~E5jjPp}A=Ju}*dyoaNV3exx+yBNhcwAW;Tv6+6(>>57 zE$|Amvd2$u{AxSWHJdV@8>@Q+_N{b4yfn1oHg}lChQdruYMb5m|C7>a2b66?=7U4h z+b6$*oI=Kwjwn3K_8~6+3!4boNQv_I^Yjb$Epv&~_0YP&w=m0n0*TTE8N%P(_`JTz zuQc12nT%-&p~7rb7^-&gz-3+24nV&reA`L*RT+W&6kNoDK^Y+{@}nCu0Yr0IX73sp zfz{u@7q(m#AGo2pT*BqkjkZyDYU&G=mtIcLqaxsN7I?WSI1!~;dX(3RKjfuYhGbt( zH`Icy)x+R>LnOS$j{N__%f>S}EHacHOYkNOcEwmHgkR$-_b1BDOUd>21Lo7^Vz{cBAwdr^r;h&hP@Cx(s4U&6D!GV^@s0bgrDWIBdgso{c z_78?F|2&n|SG;!mA8;BK9323;sEn@2$8R4pjNJ8q5~e!h`bG4I2JioXgQ!2)6e@#> z(j9ArsJ6U{pkGWVtGH7|o^RLtgt0^N`Yc8_8{vKh$~Yt1WB9 zo|F!pm3AC|*Z?L^b0CRHXPa@q)CrbH&&EI2HzcZDsn=N*I*tYvMT1L~N=;{*uQeS1 zeYT1I>mTh~E{|Vv4YUlQBPq}ksj0VDE}MmPwuwA^f&=+-nS5#RG+_iV35WHObe?3U zT{aWRR1rVxgP2&(8r#$ zvo9yWzsx^ep$5dZwz+B!=HRzY%X@Gp&Q9t@+aMGAHyECH2K&Sc-q$#Ga<6;;YDv{$ znfew?AdT#0zW++SlsL({KCz+yoOMec1*W+|cuaStPi+(<7nr1C#2+w&v>RQf%}sXR z`eXpEy8z-tIz!H!s7_yT8bUF1L{%|+lp7(V(+}8w9V*il1e&#tCiolUvlTm_usfsCU6WPI6RO%?)MM#_6-USC(jAx zs`H+226gi$fQfehrRoc#Tm1nu@C7=Kls}B5FW=?+QwQwdu8Zp2yL0gXr{cdz<&mYMUmo>p9q|XFAJj&rx zTX|DS^t;jrNi7~)FW5SuLWQ&)szYI0uW|^ML61#<%1Kz8D>pgr3eNQjY_9CW@Lafk z?jP{*jdYYbma7?)RTH(BlXz-|!f+8>JeB7JcQb>)dq)Z=I=X z`McNufB__yn6c$pzE?ZB$0Jy{>3~h7^Tk>QP8H<;GC?UFtB6fvg1m#vvxw(+(~yQR zy0`-`>5$ml!l~RLvGiO3X5-kHfY#+YSa!NYn;|gq%`;FbV(|LQVNKqbPUoUAt8qrl#p(QMjAmvNr_*4ocnd+oi?p0m!LlQHoJk`OxsA=TG{;Zxz^;UVz~g1@RH zl3v08_cyr;LX)UZ^&h59L|+2&0#;r|bAc24crX3}uDVDXK!yWFLJq_G-*o?IlI0*c z9wP|YAo(eT|37BF|7Zn3KnmpnNiRphX_EDzOrSUiDg=TtsN{bVCLq2IibxiO5rYzW zm>>w8VWR&5CSczij!GW*&t?X84L{>w|0wW3U4YsH{2vGq?GnMIKy-4$2m&HqRTnsj zIyDDKFHmyaZ68pCx+4z*k*39aoRYz53ltGN4kHIqLSPBVmMo7x2Ln?G7XJ^h1G!od zMDojEuor;a2t5rzcnqNd1hgQ;Aj5WWATx-Za_*r(G+K0v1Vmi*2waT9&9nHRjJV?# zg7jZU@0KtGyv4`ElOa!j8cbIk);or?FdO8?>p~YknKmws4WF&-~f{Yj%D##y@5<^Q5Spa*1IpczOK`H(PC3=SX^cOql z+@W}Q+(2F^gc=~1h9EGRS0J>Ii?B}|28pAH@bL0418zi6I#9j93&|z|ouRKm9)V$D zzDYs!a8OAOB87v23XmvpTrsGdkTG10pVcAs(2L9ia$1lp!2NLuA(-cXlm4IVI>;ZS z1^Gn?!ax&<8~h?{BLN;OLj)ckgasEi8;12R|&xkAX-S!_eXz-B94eL7~+ZRTS_QI zm*^r*UYs;*dDziyCI^=NAuK?!x-341G67PFf1%dvTwV;rs)eZjWsx4pHGvRf4wE4% zIL??fhztSfY2YQq2-gv|LWlqoOp<;D>#I5WEilC_Fp_J0NldVaLS(fm}vi zjBe!E5S}wO)n=ssr`aL`8ivc$Ln5dzZb;WIL0{t%{fq%hfgAo@R%kQM){+y-ObbSZ zmW3AJmedth=n5`7q_?1VaL~yT8Up$cp6g{M#m+7pay&dfFl-ikC^wE?{V{Z(9^{mZ zgsS8GN5w%saI4{O0#p;s7#4{GqtBsmAR!0)>)CTC&R6DhC=V{_eaX-f++7xx>qP}Y=Xa%;Ne{bJ6M?qy@{I}X9Z9dkX5M=+mj2{ghFTv z*nfbh45|&Pz008YLG^qYG?^TX$-NCK0jkT|pmU%)rXA`B<_SRdLZ?9CaxZiP*YTl# zC=V{XC-0$Gap4P$K+`WclgFS;z!)2h?El>pXJAYK+bEPCv{MMa_zw>3`^ypl(OpQ~ zZuU>^N)0ClvPZEaaIq)X52$2^)nBLqdk)w*h^}+OiohmYoG=V-YUK04 zhC#LGmH!O2cwxJsp&TEq1;_o1A69q~7*mgO+5_zNK@0(wxZt$FTPIn1U{L_(da)8+ z^I016v07H_T$BJh*xWE7#EglkN7;}>)#0W{j%yAitlld=vO<7nq$o*Fq_WlAD zjmp6w7m>c6qVM*_vIt`%z34bDQo`%7B(PELb=YSRJyn3^gNRoVHUy#{im+u6eO7|a zfT&3s)^I_-CaIwij3t--k6Z|-xB+_sTB)hPDlZV`rwYs!>>kGXChRh}ba%pT%d%nH z-NY{6ixdiBM$}>dEg5`GSTo7L1zXq{|Jo7jf)dbIfn5PU`(Ur+e>7oFE|fQ_wBkar zN=3kp19lat(t@Rf9(A-~6}W`{)q&N3!g^iUcbu?7|39Iv0c;c}WG%yfV%0H(af0Ta zhA^H-7cern9frwm$FDL0uM9@ia9PrSix2A>@81yN;Q?qv7%i|AAWI5#QNzJ44Va~d z2VD>pnbW{=Tk1V#_;Z4bmbt}DTcVc08sC-J}8K?^9NWf?FD67YDO;9dK~h6z+qA4tL;uxJwIQ0WZQymG8r0AOtk5;UQqq zqtqX%$&aMOwVHCG^k&8!^uhXq*nhSLGhAHWen zjsqOr*@1NjxChwkt|MFk+)aU45BM}FeDDO$iJP$Tp70{v{E+sB0~g8P+LFnX!j75^ zKH&NU&JB=9%MxISeBjDBLjzxU&czUG(-yz$!3L3VF~rzFH~a5lWv`>#Zkg37wIh5jCyt43eog`+Gt3UpX-cAdP*7PmYg|pP=uZUitH~^=uvZ>$6nz z!v$)&7zun5p<9jJ?QH4vi8({ehYCA10M>HdVV$HCv3eqpe1*GPdHZT(^=kMcT_*Oe z&{wa+Sf%@p_C<$&Fa^99YsX`K7JKh$LTRjU_1A@-Uik5;z&tE)Xoslkeo{2mr7GK0 z=8zNWzRGIht4=OIn+~?comZsL;eimshji!{DQjs1V&@F9n$`Bh||UuA*_cv*7rgEn1jw^a@3%FV4*7Tlmi2QQ+aYSDRP_C?!uZ-{Qm)!EwDBT{!x z{m$PKk!pV`o7h&h5e1M{}KsBbCWyF+26C z2}zo+bN^=iI(IxSVr&&VwY^@mUB_5Z?q1NdE&JW%wZY@5x%C)xYU7WImG{|5AEKR? z2F)4Ul$shXs0ax1UmHJ?@_blSC+Njj;NCJ-Vj4E%>~hVk!Ev4%^WB$7)j45?q#%s6}; z0=^aej%6;NK1nrqY^mS9*KKQtIYGGGu0N}UxkQ|N?d)L z?k*J9V;tkW;$){BU+*>wPm9*vm@J_#`t-)AQ}~61cFF$F)S-DU%v{Bh$&H|2l+1UT zBwuGcmLKe(4i0s@1z!w>0D~lvrdk1y{EOg0<+7j3KWYiTj&t&WB${yt1qLV2q4&KA zJ9}mfQdP?-&b>&yQmy+OVzL>Kagn@UBQv)%vI`9uHts5Dt`fg^5J{g3kqE9{pKN1Y zev5wyeQNs*!W|Mr0FV9sD+LaRtZHspX|u z4zUh-4c!0n`OiW|q&c6h!E%bpBpRP9K2Bj$yfDpYP=0`2m1yv((G>w|T7&#CvX$Z@ z!gLjgPcc27`}pfb?yT2SRL>ceEB|Yn}1hG=JjhBOtO;1)*;*>C_$(%Vx4sC-FpMcfBaYbmAQmjyG5w& z?k^^{`43hS6@tsTxr>jZk(*rL=EjA!t_&h>K{jM7sxPyMpNgnX| za4vs@BRQ1(_p(~oa%kdN6=HvXKu##&q2f@lfVQKN6PLpy)KxAoq+2Z`;;!Q&=YwOW zC9NlXKKRc_^&qdI{qdrwGR4nMSrH*=hNh6a^Ke~~z~kkD7kGE*CrYAT7)()y2byWv z8wS6F3D7nxYvyX{tka=n`cKtQc`e!dL&ujP`5l`JzA@*7$4Yn!{B#pc-|DIwJBMwM zD-XmwXzPJ~-d3YeNgW|B3Zd4oSD6fNQ#ROc5?$f9tje_IuR2WtWXTW$=x?%zWFq@+ z57!Q9(~NyivyGc1h;unz-`o<<+iWV>{}j=8F70u)4Ywj5e5MS?VN9Irdz|{8)*uE^yQs9-ymSU7WuH zB^(=<>6qI2abr-)U(`w|nEIDr7vH@bf^WW9XWvmd+gmDY60aI!648Z9i9 zKP+Yv8NTIs9UhyUBOc|buO*R}(Sm4sE7r|`N2ff|+~;W+!~mr(jCpxsTC9RCB_#CPZNIB_XYh5&Yh+(-29eXOy5@V@`1OP%#GNq zYrJN@N!fb#ni;l1@t#LJ0t744)*?Dj4$62b`$FI}Sp}^3|B8nu!%B6FW|!rrh3zeK zis9k}eulptY7CQ^g=!|`(8U4x4WT}^^io@dy07el#~Vmem`LR#Ok3MZ4^CL9uB4(# zNZSHYE(S5O9G~ick4?eJE>j_ILKL4mOI9Jz(CebNR7vc*Z0@PqNJW%hAGKn*bE;N% z4E>6_w#;cC)wo;IzM3FGvHAmEX4!5=U#WQ|!jx;eYf>eS&p<)$Ir>>}!A76tX_0?F z9f!@8M1XmgZqB#?_ML_C&cQk?L*1`%&q^8`~zO zmD)^SWnlc|uP2|Jj(yu+qan zQD%?yWDD%Hs`<-#n3C&K!KzHB>%hzEP$QB_XWtR;vZyIh-sDK#|J-(Gmec0GQk#<0 zUFxsj_}sUWwNy`%JWoCi8Dz$N^ADrsO37?`P)5i7JPoybi-DoAEOB`Ci`-E6ue*Nl z(rk!|1%40Kz(entd!VzX&!Jx=(pYU8sGg{zBPs@R5$i59xjkftGc$dQ6O(89hC|Uu zBk2&8A7?z9@rKqyo6nA^zceL6ui^{$SWMb#Kh5{%vuf11U!WmyH+W_wT8fPLYdQ=0 ztZkK@%#`4V)g{jpy0l}FgyXQl1qFKjcIVD5uMa(}`~%fYO`XcxZW$4|w2X?v z2o9n;W0dSQgz0Rpi9De*>F0xXiWV3?%_YdrSf7q*cbpi<0!$+HZS)#(ntnKn+^D1D zJ?u^-g}_SSzQs(RMUIU(df@0sL?By4>Zi9qzm-;uM+xjnxsz)-SRb&G?E}+JL`w^5$)k zd0Yrd)cH-yZSs}rzV7O{);wX=mmQJ<71SacZxrhe8149=3hbN(mkR<;qgL6t;t_QC z)c)|7i;Yz;UNL&LEMZm}&38WckX+9tmKOP1qK;&I=xi>XWMJ z&gZ9|aEY1e5%J}TMNP#Uv|XQB-eMjvFF8Zm-^K`={~XU>e1#um<J~S)%#hN2 z)K^;EJ9(Gy6kEa(ub( z+pZouL?rLgayMH0ZYb1@O~^i9-RfOzxQKDj7plF;G(n$`=bJ98p$>d(FI(TSFpvGn zi-utovimcsRR96=bAjHR--si`IAYK|>+O~!mylEB*316me(jgNw`j@n9Ot*MSS8)w zNV^@aqwkjRK3E`Zj`r!Jh_(CSOv&2_z7}OkNuNhzkz7LP>7nin#(YwMJnsGgbn5pn@&Z< z(~=%hzYLz;qTOzvvZuA&E_`Ly6(Eun7P?3(DNO0S0cy9zLcNCe z7Loy?`grxJe)DcV{!4mppMhW3>s~dQC0B4|>I^q^MSmJGGu2*4(Kt5e5jVDlqf|%7 zvhrU)Klz;ZWh{T$nCE+G@(8AFwMx62=nc3F8OAn5+&#CqG=ir1e;hUzLdGlPVi zDF5&e((opG^vSKQv)5Hr($^MCK0Wx7>tKNh8Wk0*N4_VEeaZLssFmUu^eN*LGBWK~ zqY@H|m6mxTFK6bR4#(muDc&S>1b!jdlmETHy20bULvR}8caPRi%!Vv?{ezl%QQPw+ zU_ODo14*L;P?Fc4?(YUcA1>McY9n$zxpuwtb8C6RnT2?~<4b`hQyOx9lJeg_6vP4r zugPbMxx;-PuT2-ati^`7UHh)^KaWNK-6dkUXc2HC@D^H#9RWVA1RtaNvLkRe(>w?Q z7T_%!K>#dyAPAFx;i|x3$#h;mm0uI~=ZSdbFZp1KX6T^d0hk$VU3S#jx2%9t!VMHKQGC|mY2EZFrgy)42xNL?v z1=UQq5g8;PY<_?+hk=mZ5g~vNLJemG2Pg$x-4Obu|6=sEKg=}8-naL_03{Xzs{iRN zP^v{kggJLZ*x_8pPh;Z_@<2#~WGxucL=F&y2vB~6C;LaM zo}J478(VA7LE-@)DiD`|zqztBn5IhvBsi);S^{QVQnwih)NxRfg&+rKFw0KRg$wcJ z6#{=G=z&F)pbrN(r3qSaV_Bq1fPEr*@k~J>muK!^#iCK&o35^lf`g=__blOaSF zfECm@LOi`bY*~#H0#q|2c>pS6Zkd(Y!76k~F$P!~jNRZdT zy1eB&)0_adNBYNbbf83DgI*LM*9YwK*szV? z;saFz*rK)T8(Adq&kJUP3V9XR5=D!|RnsvFbVxMlc5-r{41tZV6#K*fe?|AU4EuE9 z4?U6`S5l;4M3#VE?qEdXo~2@nn2}F$mqTN zwU4?;Y5c5zj;QpI#uo_lSPw}C1BJo2kk+7Z;}((w3PKWNWE}{Bi&Fo*DUuV^z|4^I zaEgC)`Jbc66S0MHQ6W6M%K*6kE;&a>{(z%_!o<2<{aiS?2VZ&Jks&2b%a8Pcu;h*(z7z+_BfqX0 z{p(lVW7*Snn_{$moafcM_X-uKtCbGV(YsktZhvW@Vuh)4_QQIO=acZw>UoJObl1*Z zBiZn7ye*qq-kwq#xs|)-aalmnGl#IEKML0uIq#0|ZM2mEf1&@gOa2?6RiikDyEJ%s zeNx!kK6d?Cdpck*GOjLw`2!>ano-SbuaiJkKP*>I^N!1Ho4%L<0XVv+-s^VFip9`K z3FX99b#sZwC?;#fn*Lk7EEaX^)UrEjC2`ohrpsTL+&}3U3rTOJ`d660V_h2LdZD?V zrn#`!_6*_=>;!Ox709l1!(00iOsFz zs{F1RLVmuo64#sIJVsKb4G*UxicW+}s|vfMr}&FW7`$%DzrJnfDeP-#{3^yzs%Tt( z-8YBc*qG5+*5>A8@+x03j)O_sjc!!ETNmjo;|Gsh3MCvH>S85z0u2B7^>z*=g=XmDRWy+z3$~Me)=K_TE#Ba{CzX-?2)9Tv{=6Jy>xJ)Nrgm-bi8U&m;L&#I(wh1%<8{m z6WUgFZhfJVk0Q*UWEm+rMvF5%N{9lTvW__vmOPAD65EEUSN3nYWlcw;=82e zWzx({@+bpJST!{z^Vm3RL7Qdkl}k>GwVmG)LgRT5z!^L_8TbqL^URthlgIEVA*C;^&xH# zsl@K$3}~*~}|GCwc}kJ{idC zKe5FcCRCNizwU%`^;b#Hc!=wEl_b{(Y;@`-H7P%|sGm;FZLK#AkD;TKe$Cl!Kwk8? zTSQ4mtxiipHacX_di;lxoexVQ*X}b8d4P<&7_?ZIvWcEWnVn) zZQi;>mS{Xe5DBY^ddGI;9im2Y|FNoeaBgy3NKU5S@0Pt&1oOnTXp07g02bLfdwc3* zf>6%amzvvkVMX7jgVBs!_;^R%Zx|JogU79DEqi-~r1Z6_vG0$p;4_F+ zt=ex|O-8r4ahi=;HqI(lAb&RDS<;Fy|x&a zYDb+D^1C7B0d!Q6o{H9LKng!(q%<5>mB8{NVbwC>az5nv#u6G$O3qryyOTA&X7zmH znlHm@+LveRYn^ve#g_@+B#I!lXjYhrH`bpTMcw$?uYu3X2d6(-wz2yd{J`qNqZ;2r zfu`_mah3<6My^pU(~`0Ne&Lr@KHRVws&-WgB~;^R7LAh$O<`6)_P*($>9m%NcvkH( zWT|Lk(rFS?g$Wr!->Ajwo{wo*<+NIU4>;c88k?p3iGSVAFX8i8zpUHCehTPkHf7Bm zb!~A`QpUg{nB}-ZCBHqRN_1VQz@}jL2?N*nPbOu=WsMcNdf&9U36z~cWyBT5vIDgva4p;SNEhm0zl709}OcGvdy7MFXYj7ZN(kipmwA(Br z)fs0nfN?(H=UYkXS2`! z4DJ=(d&$`r$a;=fU7>O-A0E4N7FYw(XEiCYG22P|v&kBQ7DT+Z9B|*WoyEvlZBYh9 z)K2@~cOla3_)fVHELGW;a}&W*Ym&F*^>+2XLf5zc_)rH|VJ1knh;W!E;AfwZ_=aqii>TIx`{Lr|G|B1m4L3{#{e;X(8^?T}r-4nKALDr~_ zkbZXTCn`7U1oUF>YKF|!&E>%Qc{j?3yArKIf4F6T(+;>~oNj2vjdPtSFj~GgI@)yE zvLg$$+l%oY;rB1v8lwOCxijM7dom&s-MurW{*zc4f#Sz-`u4!TAuK?FHzvcTn%crF99+iG~3-~DM}_oDNaZ-L_N zRv%&CS-ZJ--BdfdRjq6SIv`{fr|XYyL{R?_{h(bmrg7PAMC(g&z=hssxrH>SVm-xz*$ z+k#u-YG_FVCMGv!Zme*#7%9BT>fbw%`N|qC2eJN>GZMVg{ABW7nU1Y6kuy6Z_ZOn) zv%<~QeG4(e%%|FfIf&Z_Pn}6aor*N%`eRCvw!W0=-_T+4u&w^U^TN#ewf$|0xz*?G zet*t6t3=U^kDg!?@RA4i9F~{vw6Ip z@Pf6FEW&_&mNB(2XJhMqO4&==gig1#r?soCQf$-x19>_#|QE8Qf)0*VPGoz4uRodTzFswF@cvD#^Zx zbqW4}ekwuN^ok`lC5TY|#<-)R5fNLk@zjqiTUi9t8;zG9w3d-RoH0nV`@C;XSM!;{ zkBxxZ^K3s%^M}|qVyEzT1Z4rD9*A$K^uV%Wz6ZA@C(*@*N6QNkasH^%7MtZ950 zjvd?pe$5~4Mlj-+JjHXi9yq-6lrDBSW5C*Zn(cY%PFl74E7){!jbFcXV+7ujf~hn%gj<;B|dsO9s0-*iFJso!WY}cUv0#MbMK`(fw1A zR>Y}wU#UmUg9xUC2=AxnapSlB%&!cm2>E`|R3N{Nt|(Dv*!fsO&cjrrV(4!*ABx9X zRjux#_=;GnM49b+KnC5z92G{WiE4Lj_S4A$vn}$M zemmiu(pBHJ)N#=;A(D6*ib zFC7oF(CtXVjI6$0vw5FmiH3@TfZ~zsI}SesBkmma zm^{?O=xZWV(oE!Qh>9kK^Cq%A){9 zD*F^ibU`WS_v%*%J3`a%i`l|U|Mt}uS+8Z+&PP&nO!r;=#y~q8Tdb^78zWlh!s@>5 zk-A%=iMCeuTZ(^{t~d zM3~1ai0t81a);?`t0sC^WA6TGiUF(Q>yl&H9Q4eSTqVANyo2ewVR8m zbfG<3j%_y4DfEr#pK&AUr1xyR6H^6ZCf<1rg!qKYJq}0_5ndb8p4;jw{6U4WQ{RYx z-hh5=j$9BfbHA&nW*`(+KKg>B)6s^q&$)75_7_Q($)$m$s8vgrZpUic%`(AC-)yP( z&-#zTnK7?xCrl}Qg?ijc2U8#}!9nOK~#M86RKwx0A@Q2(!k--zKaf%-4nF5!1b zBz|2Taj<>3sqp@qdvx#bg1dj&6HTw)`kNxy;ag5u>^~UasY?0kS>f-goXIM6n*M03 z+~`|jS~=Gdd-OHZeJk%BzF`ldOQff3M{k$d#F7*_71`@tH$1SU5Mar>-hm$|$M`LU zF{|=6+Cs)|w&rt0lMCi-XZ~^1fnsIS3nW3dm$|F*NYQs87D*A>{<+JRA2^@OhE~DH zF(%Ap9)UtVt3#s9f1%n+D1ld^-W!9&y69>N!%T-Pht@m4lpY72XK0Z&UV2E8G)YFF z(vnkp-(6?Fl1Oc{suAtRzPTDA>=O>1U9CYDy9Pd^0oOqaH z8@v%58tyG6*}U)EH29%=wuzyYnOPy$)*=+^`?Gg`_Fqd+yLGz574AszDV!CM>L?-X z6r|)}!bEVpSO}3P)<(Td?OV@PbG+2@M73?JpkFAZI7%b(uF@gpGtWy@tB;jdI&{Vy zdTh~VhDb+Rx3dt3@1p@BJ$B-39U)?Zp{vJA)$b)5imihRG9Q-h+M0TBN(A3}eyCFx z?xcfXTwOrBseTVJ5PONM`E^b?w?SEi|8*(+OwyVHK#9SnUn8$sIwD<%L#K0RRhAXK zx!NMu8vgaePoF6xAH_Y_h3sv=H#<)Zk~Y%O-1d26$?Zui-QLkzs-M^0tVT}Cj!NQp zU1UG|d}6DCSIF?X`dzt?2bVDmBo`ivXVVF)7<7hrrKJ&`uACa@9(Hg zra&Efba!#v>A>O|z7K>Vuw?9V)V}4NsB!bVpOk%Lwxrz1%cn)d5RtzkzI^L_D=E8f zankr4xcB)InKW}teLu#|#AvzUy;zgTYWlB&4L|K(%Y@>U2SjR4FG92rDZ2OMpO5nb zXz#IoZIk+8whve4Wt^`GZ)WH*$w;H|q9)o9dH0h0bzG5ZGy8QL~_V*^UM#Qz#Y5nvi<*y4LlC{mS zpHqcA8xl;Pc*`Tc8_ z+oQ3gB#Q9nGZWtI*X=h)>MF=%j_vJ>(T^E&{0@^Yf8YI8RGz-(l!ZCH;puXVtcvPr zVa_>JvhSp?Q#ASX4T<$aJW-v`r6PF^53hq66N#v~ZVt~!yq@CUqyA2|&`7D?sY3Osi;g%SZ7=UD5kI7zEu-h` zUBuFdN!e&FOP;Y0F?Zd?B!{`7*HV&0CQUFo9EU$XU$4~;`YtTsJY{LZ| z$=$WO4NxxTJK8xMc7z9Cf)uso7&fHMlKThCW1E~EOjBFJl6A!wE2sSMLg*#P`RoBtDB7AkUt-7&wCBeI`sWD*j zo|iu4fm`)EI8Uwexxu%W&C&Orh8xW{KPA7G;=I3lXS=EX@98}Kc}E^vASGyou5J51 z)45)Cr%oHKRUKdbgOfokW}<3R^J%%?+FA0f-UA8LKiOu}eH!}eIDt8Rm(=Jhp6CXz z6paDQe7@k^?sS=Ij7OgLPyM4?V*UQ5-^NtcyS=R%!$wfYZ&-WU3ZJJ{a?<#%{~b}M z4zA=rG``xvTeDchf!f1-eFI_Gw~SvkboFsHJZ!@>`kl%I5KYSQa`H~pT2>_Q8CSOJ zw$J%iTFTrj8J=<^`fDbubdT0itp3tm6Xu-ge;2GVa{)+JLhw1mp9thO83=b$kx?*` ze-&-`yIgW*Vm!QB;AsX@2>sceNsanjy2Y+0|GQfP^VLL`7?N}AZ7SEp)|A)Ne$UJx z*o$tKq#%%4r4(yk1OdUA>2N=a_+As!Xn)Ton0()9(w5=G-uhItG@@KN?R z`rV4Plq_~*sR9kX)2*Y4z!C3}biqIV%_pPiz=lthC->6N7xFuH3OUd!Y(0GP%oL66 z?mZ>R2^Q5~H&&C(1P>bVGn{XirG{ThQ5C_Sf<%_Qx?yOeY#he^%I%;XjvzEmZt>pJrdwM9>X>2~JHVH+p#|&$H;2wDx z6V8k5>k=1!Pet@FqP}qr{oHjZAR>K~Cck!!L@vjMWt5ueA^ceG+3A!t#ruOLCSB{M zAQpnt(j@XB8RHj{J;P=iE~{CZd90Nw~yz`=7o< zxZl{eq^i*Jd+|s7)iVFp+lxkm+3y4{-?{fux%?J7TWXC+P$6|&^8_tMJs|QRVq2q1 zIJv=q!+1XM#a1kp4_)#P?TJ)vyYU3}^d8P2jx9CLPm2b(c&@73A}i{eXTJ59_tqPE zcE$EcB-1C;pZj!Pfrn|ku#;)ss?)jpg1-5I>hP;!~oD~;;w8zN$-Eh95z-HJbfeL|hx~bfW+b}0QycK>a=2Fx4-cdB~E6x_` z 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

@O~16iB$+=*5i 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�UoVUPz4* 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 Date: Mon, 8 Dec 2014 13:21:24 -0500 Subject: [PATCH 259/310] SAAS-510: PYPO -> Files are downloaded even if they already exist in tmp cache dir --- airtime_mvc/application/cloud_storage/Amazon_S3.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/cloud_storage/Amazon_S3.php b/airtime_mvc/application/cloud_storage/Amazon_S3.php index 8a7c3b3875..527440c0af 100644 --- a/airtime_mvc/application/cloud_storage/Amazon_S3.php +++ b/airtime_mvc/application/cloud_storage/Amazon_S3.php @@ -51,7 +51,7 @@ public function getFileSize($resourceId) $amz_resource = utf8_encode("$bucket/$resourceId"); $amz_resource_info = $this->zendServiceAmazonS3->getInfo($amz_resource); - return $amz_resource_info["size"]; + return (int)$amz_resource_info["size"]; } public function deletePhysicalFile($resourceId) From ec189fc27acf46b0825b0f1633520f32e145483b Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 8 Dec 2014 15:33:02 -0500 Subject: [PATCH 260/310] SAAS-509: PYPO can't download files via the REST API --- airtime_mvc/application/models/Schedule.php | 7 ++----- python_apps/pypo/pypofile.py | 9 +++------ 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index 269b70bc7a..53f156b244 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -771,11 +771,10 @@ private static function createInputHarborKickTimes(&$data, $range_start, $range_ * @param Array $item schedule info about one track * @param Integer $media_id scheduled item's cc_files id * @param String $uri path to the scheduled item's physical location - * @param String $downloadURL URL PYPO makes to the REST API to download the file for playout * @param Integer $filsize The file's file size in bytes * */ - private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $downloadURL, $filesize) + private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $filesize) { $start = self::AirtimeTimeToPypoTime($item["start"]); $end = self::AirtimeTimeToPypoTime($item["end"]); @@ -810,7 +809,6 @@ private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, 'show_name' => $item["show_name"], 'replay_gain' => $replay_gain, 'independent_event' => $independent_event, - 'download_url' => $downloadURL, 'filesize' => $filesize, ); @@ -948,10 +946,9 @@ private static function createScheduledEvents(&$data, $range_start, $range_end) $uri = $file->getAbsoluteFilePath(); $baseUrl = Application_Common_OsPath::getBaseDir(); - $downloadURL = "http://".$_SERVER['HTTP_HOST'].$baseUrl."rest/media/$media_id/download"; $filesize = $file->getFileSize(); - self::createFileScheduleEvent($data, $item, $media_id, $uri, $downloadURL, $filesize); + self::createFileScheduleEvent($data, $item, $media_id, $uri, $filesize); } elseif (!is_null($item['stream_id'])) { //row is type "webstream" diff --git a/python_apps/pypo/pypofile.py b/python_apps/pypo/pypofile.py index 998c7bd263..ff0b40414f 100644 --- a/python_apps/pypo/pypofile.py +++ b/python_apps/pypo/pypofile.py @@ -62,15 +62,12 @@ def copy_file(self, media_item): if do_copy: self.logger.debug("copying from %s to local cache %s" % (src, dst)) try: - - """ - copy will overwrite dst if it already exists - """ - #shutil.copy(src, dst) config = self.read_config_file(CONFIG_PATH) CONFIG_SECTION = "general" username = config.get(CONFIG_SECTION, 'api_key') - url = media_item['download_url'] + + host = config.get(CONFIG_SECTION, 'base_url') + url = "http://%s/rest/media/%s/download" % (host, media_item["id"]) with open(dst, "wb") as handle: response = requests.get(url, auth=requests.auth.HTTPBasicAuth(username, ''), stream=True) From 644e6b00d80012113a8b8e95d0321a1b082803d8 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 9 Dec 2014 17:58:36 -0500 Subject: [PATCH 261/310] SAAS-516: Replace Zend_Service_Amazon_S3 with AWS SDK for PHP --- airtime_mvc/application/Bootstrap.php | 3 + .../application/cloud_storage/Amazon_S3.php | 71 +++++++--------- composer.json | 3 +- composer.lock | 81 +++++++++++-------- 4 files changed, 84 insertions(+), 74 deletions(-) diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index 2867613954..09aacb0521 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -10,6 +10,9 @@ Propel::init(__DIR__."/configs/airtime-conf-production.php"); +//Composer's autoloader +require_once 'autoload.php'; + require_once __DIR__."/configs/constants.php"; require_once 'Preference.php'; require_once 'Locale.php'; diff --git a/airtime_mvc/application/cloud_storage/Amazon_S3.php b/airtime_mvc/application/cloud_storage/Amazon_S3.php index 527440c0af..f9de30d493 100644 --- a/airtime_mvc/application/cloud_storage/Amazon_S3.php +++ b/airtime_mvc/application/cloud_storage/Amazon_S3.php @@ -2,71 +2,60 @@ require_once 'StorageBackend.php'; +use Aws\S3\S3Client; + class Amazon_S3 extends StorageBackend { - private $zendServiceAmazonS3; + + private $s3Client; public function Amazon_S3($securityCredentials) { $this->setBucket($securityCredentials['bucket']); $this->setAccessKey($securityCredentials['api_key']); $this->setSecretKey($securityCredentials['api_key_secret']); - - $this->zendServiceAmazonS3 = new Zend_Service_Amazon_S3( - $this->getAccessKey(), - $this->getSecretKey()); + + $this->s3Client = S3Client::factory(array( + 'key' => $securityCredentials['api_key'], + 'secret' => $securityCredentials['api_key_secret'], + )); } public function getAbsoluteFilePath($resourceId) { - $endpoint = $this->zendServiceAmazonS3->getEndpoint(); - $scheme = $endpoint->getScheme(); - $host = $endpoint->getHost(); - $bucket = $this->getBucket(); - return "$scheme://$bucket.$host/".utf8_encode($resourceId); + return $this->s3Client->getObjectUrl($this->getBucket(), $resourceId); } public function getSignedURL($resourceId) { - //URL will be active for 30 minutes - $expires = time()+1800; - - $bucket = $this->getBucket(); - $secretKey = $this->getSecretKey(); - $accessKey = $this->getAccessKey(); - - $string_to_sign = utf8_encode("GET\n\n\n$expires\n/$bucket/$resourceId"); - // We need to urlencode the entire signature in case the hashed signature - // has spaces. (NOTE: utf8_encode() does not work here because it turns - // spaces into non-breaking spaces) - $signature = urlencode(base64_encode((hash_hmac("sha1", $string_to_sign, $secretKey, true)))); - - $resourceURL = $this->getAbsoluteFilePath($resourceId); - return $resourceURL."?AWSAccessKeyId=$accessKey&Expires=$expires&Signature=$signature"; + return $this->s3Client->getObjectUrl($this->getBucket(), $resourceId, '+60 minutes'); } public function getFileSize($resourceId) { - $bucket = $this->getBucket(); - - $amz_resource = utf8_encode("$bucket/$resourceId"); - $amz_resource_info = $this->zendServiceAmazonS3->getInfo($amz_resource); - return (int)$amz_resource_info["size"]; + $obj = $this->s3Client->getObject(array( + 'Bucket' => $this->getBucket(), + 'Key' => $resourceId, + )); + if (isset($obj["ContentLength"])) { + return (int)$obj["ContentLength"]; + } else { + return 0; + } } public function deletePhysicalFile($resourceId) { $bucket = $this->getBucket(); - $amz_resource = utf8_encode("$bucket/$resourceId"); - - if ($this->zendServiceAmazonS3->isObjectAvailable($amz_resource)) { - // removeObject() returns true even if the object was not deleted (bug?) - // so that is not a good way to do error handling. isObjectAvailable() - // does however return the correct value; We have to assume that if the - // object is available the removeObject() function will work. - $this->zendServiceAmazonS3->removeObject($amz_resource); - } else { - throw new Exception("ERROR: Could not locate object on Amazon S3"); - } + + if ($this->s3Client->doesObjectExist($bucket, $resourceId)) { + + $result = $this->s3Client->deleteObject(array( + 'Bucket' => $bucket, + 'Key' => $resourceId, + )); + } else { + throw new Exception("ERROR: Could not locate file to delete."); + } } } diff --git a/composer.json b/composer.json index 7a2989d961..f389308e4a 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,6 @@ { "require": { - "propel/propel1": "1.7.0-stable" + "propel/propel1": "1.7.0-stable", + "aws/aws-sdk-php": "2.7.9" } } diff --git a/composer.lock b/composer.lock index 7e6984eb5d..17879613ad 100644 --- a/composer.lock +++ b/composer.lock @@ -4,32 +4,32 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "5776cc789514d71faac7021474c96d58", + "hash": "311983cf9bb84cfacbfcc6c5dfc9e841", "packages": [ { "name": "aws/aws-sdk-php", - "version": "dev-master", + "version": "2.7.9", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "c540fa2c66daf91383a2cd7fc044765f2da2aa52" + "reference": "f39354df58eec97f0ef22ccf3caf753607a47dca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c540fa2c66daf91383a2cd7fc044765f2da2aa52", - "reference": "c540fa2c66daf91383a2cd7fc044765f2da2aa52", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/f39354df58eec97f0ef22ccf3caf753607a47dca", + "reference": "f39354df58eec97f0ef22ccf3caf753607a47dca", "shasum": "" }, "require": { - "guzzle/guzzle": ">=3.7,<4", + "guzzle/guzzle": "~3.7", "php": ">=5.3.3" }, "require-dev": { "doctrine/cache": "~1.0", "ext-openssl": "*", - "monolog/monolog": "1.4.*", - "phpunit/phpunit": "4.*", - "symfony/yaml": "2.*" + "monolog/monolog": "~1.4", + "phpunit/phpunit": "~4.0", + "symfony/yaml": "~2.1" }, "suggest": { "doctrine/cache": "Adds support for caching of credentials and responses", @@ -41,7 +41,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7.x-dev" + "dev-master": "2.7-dev" } }, "autoload": { @@ -71,7 +71,7 @@ "s3", "sdk" ], - "time": "2014-10-08 19:18:30" + "time": "2014-12-08 21:56:46" }, { "name": "guzzle/guzzle", @@ -167,24 +167,38 @@ }, { "name": "phing/phing", - "version": "2.8.2", + "version": "2.9.1", "source": { "type": "git", "url": "https://github.com/phingofficial/phing.git", - "reference": "345e8716122cf6c6b59c4894701d8b736f27fca9" + "reference": "393edeffa8a85d43636ce0c9b4deb1ff9ac60a5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phingofficial/phing/zipball/345e8716122cf6c6b59c4894701d8b736f27fca9", - "reference": "345e8716122cf6c6b59c4894701d8b736f27fca9", + "url": "https://api.github.com/repos/phingofficial/phing/zipball/393edeffa8a85d43636ce0c9b4deb1ff9ac60a5c", + "reference": "393edeffa8a85d43636ce0c9b4deb1ff9ac60a5c", "shasum": "" }, "require": { "php": ">=5.2.0" }, "require-dev": { + "ext-pdo_sqlite": "*", + "lastcraft/simpletest": "@dev", + "pdepend/pdepend": "1.x", + "pear-pear.php.net/http_request2": "2.2.x", + "pear-pear.php.net/net_growl": "2.7.x", + "pear-pear.php.net/pear_packagefilemanager": "1.7.x", + "pear-pear.php.net/pear_packagefilemanager2": "1.0.x", + "pear-pear.php.net/xml_serializer": "0.20.x", + "pear/pear_exception": "@dev", + "pear/versioncontrol_git": "@dev", + "pear/versioncontrol_svn": "@dev", "phpdocumentor/phpdocumentor": "2.x", - "phpunit/phpunit": ">=3.7" + "phploc/phploc": "2.x", + "phpunit/phpunit": ">=3.7", + "sebastian/phpcpd": "2.x", + "squizlabs/php_codesniffer": "1.5.x" }, "suggest": { "pdepend/pdepend": "PHP version of JDepend", @@ -203,6 +217,11 @@ "bin/phing" ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.9.x-dev" + } + }, "autoload": { "classmap": [ "classes/phing/" @@ -216,14 +235,13 @@ "LGPL-3.0" ], "authors": [ - { - "name": "Michiel Rook", - "email": "mrook@php.net", - "role": "Lead" - }, { "name": "Phing Community", "homepage": "http://www.phing.info/trac/wiki/Development/Contributors" + }, + { + "name": "Michiel Rook", + "email": "mrook@php.net" } ], "description": "PHing Is Not GNU make; it's a PHP project build system or build tool based on Apache Ant.", @@ -234,7 +252,7 @@ "task", "tool" ], - "time": "2014-07-18 10:23:54" + "time": "2014-12-03 09:18:46" }, { "name": "propel/propel1", @@ -301,17 +319,17 @@ }, { "name": "symfony/event-dispatcher", - "version": "v2.5.5", + "version": "v2.6.1", "target-dir": "Symfony/Component/EventDispatcher", "source": { "type": "git", "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "f6281337bf5f985f585d1db6a83adb05ce531f46" + "reference": "720fe9bca893df7ad1b4546649473b5afddf0216" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/f6281337bf5f985f585d1db6a83adb05ce531f46", - "reference": "f6281337bf5f985f585d1db6a83adb05ce531f46", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/720fe9bca893df7ad1b4546649473b5afddf0216", + "reference": "720fe9bca893df7ad1b4546649473b5afddf0216", "shasum": "" }, "require": { @@ -320,7 +338,8 @@ "require-dev": { "psr/log": "~1.0", "symfony/config": "~2.0", - "symfony/dependency-injection": "~2.0,<2.6.0", + "symfony/dependency-injection": "~2.6", + "symfony/expression-language": "~2.6", "symfony/stopwatch": "~2.2" }, "suggest": { @@ -330,7 +349,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.5-dev" + "dev-master": "2.6-dev" } }, "autoload": { @@ -354,15 +373,13 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "http://symfony.com", - "time": "2014-09-28 15:56:11" + "time": "2014-12-02 20:19:20" } ], "packages-dev": [], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "aws/aws-sdk-php": 20 - }, + "stability-flags": [], "prefer-stable": false, "platform": [], "platform-dev": [] From d73b331376cde2b0db75a2c9c9ea8ce6c837b88b Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 10 Dec 2014 12:40:08 -0500 Subject: [PATCH 262/310] SAAS-515: Prefix object names with station name --- airtime_mvc/application/models/RabbitMq.php | 6 +++--- .../airtime_analyzer/cloud_storage_uploader.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/models/RabbitMq.php b/airtime_mvc/application/models/RabbitMq.php index a9f6998413..b20beca2e7 100644 --- a/airtime_mvc/application/models/RabbitMq.php +++ b/airtime_mvc/application/models/RabbitMq.php @@ -90,9 +90,9 @@ public static function SendMessageToAnalyzer($tmpFilePath, $importedStorageDirec $data['callback_url'] = $callbackUrl; $data['api_key'] = $apiKey; // Pass station name to the analyzer so we can set it with the file's metadata - // before uploading it to the cloud. This isn't a requirement for cloud storage, - // but put there as a safeguard, since all Airtime Pro stations will share the - // same bucket. + // and prefix the object name with it before uploading it to the cloud. This + // isn't a requirement for cloud storage, but put there as a safeguard, since + // all Airtime Pro stations will share the same bucket. $data['station_domain'] = $stationDomain = Application_Model_Preference::GetStationName(); $jsonData = json_encode($data); diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index d060f3bcca..b9178709c3 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -61,7 +61,7 @@ def upload_obj(self, audio_file_path, metadata): # in the object name. URL encoding the object name doesn't solve the # problem. As a solution we will replace spaces with dashes. file_name = file_name.replace(" ", "-") - object_name = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension) + object_name = "%s/%s_%s%s" % (metadata["station_domain"], file_name, str(uuid.uuid4()), extension) provider_driver_class = get_driver(getattr(Provider, self._provider)) driver = provider_driver_class(self._api_key, self._api_key_secret) From 38bd45b8dc3d44aff27a6d5198c22528cd40f57c Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 10 Dec 2014 18:44:35 -0500 Subject: [PATCH 263/310] Silan cue-in/out analysis now moved to airtime_analyzer * Added a new CuePointAnalyzer using silan (will remove silan stuff from pypo later) * Makes silan analysis slightly more reliable for certain short files. * Fixes CC-5961: Audio duration cutoff for WAVE files * Added unit tests for the new analyzer and improved code coverage slightly * Added unit tests for WAVE metadata extraction and an invalid WMA file --- .../airtime_analyzer/analyzer_pipeline.py | 2 + .../airtime_analyzer/cuepoint_analyzer.py | 48 +++++++++++ .../airtime_analyzer/metadata_analyzer.py | 2 +- .../airtime_analyzer/replaygain_analyzer.py | 43 ++++++++-- .../tests/cuepoint_analyzer_tests.py | 76 ++++++++++++++++++ .../tests/metadata_analyzer_tests.py | 14 +++- .../44100Hz-16bit-stereo-invalid.wma | Bin 0 -> 84173 bytes .../tests/test_data/44100Hz-16bit-stereo.wav | Bin 0 -> 677316 bytes 8 files changed, 174 insertions(+), 11 deletions(-) create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py create mode 100644 python_apps/airtime_analyzer/tests/cuepoint_analyzer_tests.py create mode 100644 python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-stereo-invalid.wma create mode 100644 python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-stereo.wav diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index e36c03688c..00421ffeac 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -5,6 +5,7 @@ import multiprocessing from metadata_analyzer import MetadataAnalyzer from filemover_analyzer import FileMoverAnalyzer +from cuepoint_analyzer import CuePointAnalyzer class AnalyzerPipeline: """ Analyzes and imports an audio file into the Airtime library. @@ -51,6 +52,7 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): # First, we extract the ID3 tags and other metadata: metadata = dict() metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) + metadata = CuePointAnalyzer.analyze(audio_file_path, metadata) metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) metadata["import_status"] = 0 # Successfully imported diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py new file mode 100644 index 0000000000..70e26cda42 --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py @@ -0,0 +1,48 @@ +import subprocess +import logging +import traceback +import json +import datetime +from analyzer import Analyzer + + +class CuePointAnalyzer(Analyzer): + ''' This class extracts the cue-in time, cue-out time, and length of a track using silan. ''' + + SILAN_EXECUTABLE = 'silan' + + def __init__(self): + pass + + @staticmethod + def analyze(filename, metadata): + ''' Extracts the cue-in and cue-out times along and sets the file duration based on that. + The cue points are there to skip the silence at the start and end of a track, and are determined + using "silan", which analyzes the loudness in a track. + :param filename: The full path to the file to analyzer + :param metadata: A metadata dictionary where the results will be put + :return: The metadata dictionary + ''' + ''' The silan -F 0.99 parameter tweaks the highpass filter. The default is 0.98, but at that setting, + the unit test on the short m4a file fails. With the new setting, it gets the correct cue-in time and + all the unit tests pass. + ''' + command = [CuePointAnalyzer.SILAN_EXECUTABLE, '-b', '-F', '0.99', '-f', 'JSON', filename] + try: + results_json = subprocess.check_output(command) + silan_results = json.loads(results_json) + metadata['length_seconds'] = float(silan_results['file duration']) + # Conver the length into a formatted time string + track_length = datetime.timedelta(seconds=metadata['length_seconds']) + metadata["length"] = str(track_length) + metadata['cuein'] = silan_results['sound'][0][0] + metadata['cueout'] = silan_results['sound'][0][1] + + except OSError as e: # silan was not found + logging.warn("Failed to run: %s - %s. %s" % (command[0], e.strerror, "Do you have silan installed?")) + except subprocess.CalledProcessError as e: # silan returned an error code + logging.warn("%s %s %s", e.cmd, e.message, e.returncode) + except Exception as e: + logging.warn(e) + + return metadata \ No newline at end of file diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index a7bd0a3045..45645bd32a 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -149,7 +149,7 @@ def _analyze_wave(filename, metadata): metadata["mime"] = magic.from_file(filename, mime=True) metadata["channels"] = reader.getnchannels() metadata["sample_rate"] = reader.getframerate() - length_seconds = float(reader.getnframes()) / float(metadata["channels"] * metadata["sample_rate"]) + length_seconds = float(reader.getnframes()) / float(metadata["sample_rate"]) #Converting the length in seconds (float) to a formatted time string track_length = datetime.timedelta(seconds=length_seconds) metadata["length"] = str(track_length) #time.strftime("%H:%M:%S.%f", track_length) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py index 2d02518f29..d7254e530f 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py @@ -1,14 +1,41 @@ +import subprocess from analyzer import Analyzer -''' TODO: ReplayGain is currently calculated by pypo but it should - be done here in the analyzer. -''' + class ReplayGainAnalyzer(Analyzer): - + ''' This class extracts the cue-in time, cue-out time, and length of a track using silan. ''' + + BG1770GAIN_EXECUTABLE = 'bg1770gain' + def __init__(self): pass - + @staticmethod - def analyze(filename): - pass - + def analyze(filename, metadata): + ''' Extracts the Replaygain loudness normalization factor of a track. + :param filename: The full path to the file to analyzer + :param metadata: A metadata dictionary where the results will be put + :return: The metadata dictionary + ''' + ''' The -d 00:01:00 flag means it will let the decoding run for a maximum of 1 minute. This is a safeguard + in case the libavcodec decoder gets stuck in an infinite loop. + ''' + command = [ReplayGainAnalyzer.BG1770GAIN_EXECUTABLE, '--replaygain', '-d', '00:01:00', '-f', 'JSON', filename] + try: + results_json = subprocess.check_output(command) + silan_results = json.loads(results_json) + metadata['length_seconds'] = float(silan_results['file duration']) + # Conver the length into a formatted time string + track_length = datetime.timedelta(seconds=metadata['length_seconds']) + metadata["length"] = str(track_length) + metadata['cuein'] = silan_results['sound'][0][0] + metadata['cueout'] = silan_results['sound'][0][1] + + except OSError as e: # silan was not found + logging.warn("Failed to run: %s - %s. %s" % (command[0], e.strerror, "Do you have silan installed?")) + except subprocess.CalledProcessError as e: # silan returned an error code + logging.warn("%s %s %s", e.cmd, e.message, e.returncode) + except Exception as e: + logging.warn(e) + + return metadata \ No newline at end of file diff --git a/python_apps/airtime_analyzer/tests/cuepoint_analyzer_tests.py b/python_apps/airtime_analyzer/tests/cuepoint_analyzer_tests.py new file mode 100644 index 0000000000..676525d7bc --- /dev/null +++ b/python_apps/airtime_analyzer/tests/cuepoint_analyzer_tests.py @@ -0,0 +1,76 @@ +from nose.tools import * +from airtime_analyzer.cuepoint_analyzer import CuePointAnalyzer + +def test_constructor(): + cpa = CuePointAnalyzer() + + +def check_default_metadata(metadata): + ''' Check that the values extract by Silan/CuePointAnalyzer on our test audio files match what we expect. + :param metadata: a metadata dictionary + :return: Nothing + ''' + # We give silan some leeway here by specifying a tolerance + tolerance_seconds = 0.1 + length_seconds = 3.9 + assert abs(metadata['length_seconds'] - length_seconds) < tolerance_seconds + assert abs(metadata['cuein']) < tolerance_seconds + assert abs(metadata['cueout'] - length_seconds) < tolerance_seconds + +def test_missing_silan(): + old_silan = CuePointAnalyzer.SILAN_EXECUTABLE + CuePointAnalyzer.SILAN_EXECUTABLE = 'foosdaf' + metadata = CuePointAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo-utf8.mp3', dict()) + CuePointAnalyzer.SILAN_EXECUTABLE = old_silan # Need to put this back + +def test_invalid_filepath(): + metadata = CuePointAnalyzer.analyze(u'non-existent-file', dict()) + + +def test_mp3_utf8(): + metadata = CuePointAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo-utf8.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_dualmono(): + metadata = CuePointAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-dualmono.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_jointstereo(): + metadata = CuePointAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-jointstereo.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_simplestereo(): + metadata = CuePointAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-simplestereo.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_stereo(): + metadata = CuePointAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_mono(): + metadata = CuePointAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-mono.mp3', dict()) + check_default_metadata(metadata) + +def test_ogg_stereo(): + metadata = CuePointAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.ogg', dict()) + check_default_metadata(metadata) + +def test_invalid_wma(): + metadata = CuePointAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo-invalid.wma', dict()) + +def test_m4a_stereo(): + metadata = CuePointAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.m4a', dict()) + check_default_metadata(metadata) + +def test_wav_stereo(): + metadata = CuePointAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.wav', dict()) + check_default_metadata(metadata) + + # FFMPEG / libav detect the AAC file as slightly shorter... +''' + tolerance_seconds = 0.2 + length_seconds = 3.8 + assert abs(metadata['length_seconds'] - length_seconds) < tolerance_seconds + assert abs(metadata['cuein']) < tolerance_seconds + assert abs(metadata['cueout'] - length_seconds) < tolerance_seconds +''' \ No newline at end of file diff --git a/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py b/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py index 9215c493af..ee108b3623 100644 --- a/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py +++ b/python_apps/airtime_analyzer/tests/metadata_analyzer_tests.py @@ -114,6 +114,18 @@ def test_mp3_utf8(): assert metadata['mime'] == 'audio/mp3' assert metadata['track_total'] == u'10' # MP3s can have a track_total +def test_invalid_wma(): + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo-invalid.wma', dict()) + assert metadata['mime'] == 'audio/x-ms-wma' + +def test_wav_stereo(): + metadata = MetadataAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.wav', dict()) + assert metadata['mime'] == 'audio/x-wav' + assert abs(metadata['length_seconds'] - 3.9) < 0.1 + assert metadata['channels'] == 2 + assert metadata['sample_rate'] == 44100 + + # Make sure the parameter checking works @raises(TypeError) def test_move_wrong_string_param1(): @@ -132,7 +144,6 @@ def test_mp3_bad_channels(): It'd be a pain in the ass to construct a real MP3 with an invalid number of channels by hand because that value is stored in every MP3 frame in the file ''' - print "testing bad channels..." audio_file = mutagen.File(filename, easy=True) audio_file.info.mode = 1777 with mock.patch('airtime_analyzer.metadata_analyzer.mutagen') as mock_mutagen: @@ -143,7 +154,6 @@ def test_mp3_bad_channels(): check_default_metadata(metadata) assert metadata['channels'] == 1 assert metadata['bit_rate'] == 64000 - print metadata['length_seconds'] assert abs(metadata['length_seconds'] - 3.9) < 0.1 assert metadata['mime'] == 'audio/mp3' # Not unicode because MIMEs aren't. assert metadata['track_total'] == u'10' # MP3s can have a track_total diff --git a/python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-stereo-invalid.wma b/python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-stereo-invalid.wma new file mode 100644 index 0000000000000000000000000000000000000000..f0bf3f19c0e4bc389a7ab4071225a83986752371 GIT binary patch literal 84173 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

vCt6T5MNDCO%Hc; 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⋙>-MF)&IMqYF+!o&! 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

WligEB7nlTofZ&4|P68 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⪚%!$m2@IG=scpuZ&EVw;C5MJN(6cF=qWVuj3 zqf{wXb&-|zRQnWees{G#uo`&+^dsp2N}5ZWds};3OWR7@#sHrGJy=YFqyiN|Yiouj z!}6o`N9#4P2BcZiEUQhc;aWJrL@nL{u+O~Dyvex9xYw{3fAVTd$_(_Z;j_oCx9hoE zxCQW9TV-4Yw>G13n_-(_qH&^;+D6VVlZ;8m-k_VQo9QW70B;k{Jm-Qmz`1BmKk6>WJz=XNrkN7|0w6NKJ z*r?yA=l*jYZ5^#yZB|#*R1_XI)VuQD(^%D5?BFd_FI103Hd#%5O?^lg()|RTD0|3! z9g5Et7 z6voaf%4m5{Sx=!+XD_J(U_XwtwCqqe94zKyiXIM0VM%1hRS#DW&w)2P?~QMQZ-S6W z!#S!~;En%{zm>0*FCQrFEiIk_+@kt>*E}6P;gMN z4suqg-Bm`F!k3HvZ|V)`!}{+e2vn*qh-D_V>{5 zA@=LGN45*UsUG1TY!PBBA}hQAI~CjmsU@o=n*z8qz}L1JG6*?qX3zW_^5u&nGjuDc zqOYQV06*qfutC2;&)w6Bx{12_`ucjS(Q0IFJ#&NTOG_WucE}hUkG)W%&Zy&TZXI+I z>#=9hNYO~aJ(63ptj*AGSB%sZU-$>Mr)%DfIM%6RlM(;*1-xK4?$w;>&~xi&`OhMAy9)9!I1gz8{pcmYnb$Dv_k8kw68d)D zpH-kH;JoFA`-Ypj>fGZy?L6(A=bGp00FHvC(o*R=_jhjgwtGrFrM+N+XM(3CV3yoA z_}2VSGA;Hho}y}>x-gRc6z)MCfv?A`z^uT0KR~YA_n@@DG~Zg``F;gj|NJ0? zIp@s4%zy&>O{~pXH?yJ816}}mfO7`!WxPPnbpmqQ=syz=*jHoS!=5MmumiALa$9~| zo~%k%olu-mcw`=tEiw$d<8uLb>$rp0MA<~io&){0o`Uh{1hQuQCj5=aKH$uf&%he+ z)+ppJE z1Y-g9#?!%a)pFHX?7y=o&lzr-K26^e(4(r2v5k@5=KSLQ^sM=;`Hba^h0lsqPzn5G z`^mQ4y4?EO{Mx+AvdZ#<^#|)vP#MGl4d?aQU5^_YJ2dtykZH@b%_cFkV}7vxU~7i#+=`}(rm!JwXnVQ|7dkPUuI`Yq{l;^o9~@#Erm$L)^$+xEBZyyd*`xSML8D)jun zAPc*cw$%UMBb|gD8EOfq!MkM%w3J4LQIRT7m9L1dz=l5shj zkS`=Ol7l^iIb!ngo)`5*J!7S@k{QtRvOeGrP%){P#6iPuX}44olyaAHpF}=KJum`P z0>d1`953uI?CdpN0cp-O=Xv*e_hZ*%aXzl#s^BUOs8@+|#kmS2@8x&L?~V|X?)V;a9&>hdb#&#I@=I;pZSV;jB{bH!BqZu3 z(3bFQb8i#7z%8YgP>sHlYJ(~8qABYI{<8jR*tz--aQ4o6YbJIk9|3BE4tWmY1V6w- zZ=*GUyU5)E_2*xM3DN{~)pklOmeIO$a>tr_+gHw4&MvMluB+~=P~BH???tZWT4;+d z1OAMc!9VtY?6dP`=TTeu-2L1=68R=Q0DWbSc#n8l3(}*8?{ybo3>t$+0!ISW z#sqbAm|r|Y%tE$U$56)*>$lGS&i+`BKb_1M`o_C#hG4F+60|9@}De08Noo>E1 z+)3xPHw}Bqr=`(=+$6_e}$iejbv~L9&F>`8PD%;JIKUrk9sm{ zf;dxV{YkwEpkn`?pq3Y2HJrkfI6vVU?E@)LXFmW zFaY4ADSGyEkb8C#`~;o?J|pU2Z-~!*o{3ViugH7QWH1oEM3o51&HihPRD=CL15P2NcO%u^@9UJ9R&+K4tXJUl%7 z7(RlmeW__X0e%M?k-?JX%MyAJzQ2$`1lcFK?z`^W2GHv88T7FMe%;Rg^q=6P{iA(X-mW~vhvs|)x4zu^@;Li(cKNLGSrF1`OD`r*9dX@buyJ}X|tisuavlH?X^6uI1+2=auI)=jA z7m^$ILEk|iYvI1gxV;v<7CeGo3u=wHU{w=2H#y22p=WKTZl+F!N6bC_J>hS`o}Nmt z5`H;L;2WPGoYtP!n&9Kj{+6VYRMge2LAAm@*JH(F1yAFHpdtE}q}CIf16%NxoYis*{yMrucj?COi~JShUN za>z5)PK^^uErm5GU691qLRktv3RsC&4@MToRM}MFfwmf14%D^rGjvmaQ@#?}cC6jF zyuy#2FbqSX)|JTJnQ2F=NC`qC;GVIOc#jW1X=#;%>w_!O8fO@nylG z*h8^36!e8|lHY70{f(^6#kUDRC^I=~;1E#Fz&SzAI?LN!D&L{S^?tiiK+ zb!dq4hx3PdM*Y8gF8|4$$1;FtyThOj{K)?W>_Zm;#RA2|P9FWs{sV8J9pRaF1Q-_@ zhg8{lp{9|hk#h2K@`d0u@_d>A?rxS+lu{f}9#H-TPi)qEy`cZ*oRs~sB*dtTX$I=#*2%pM^6)jqF~!l+-qLQ1<+9f==)pq;9Su^pMoFjKZEG)@{T4L09;Va$dg}8C0AJ^V!8- z(Jz5tkifPy&>1_~8<3xM%zw;Z37m$9TMthU(ckB1I^B`(VBhf@=^N>+>#W$fQMeSY zA%N$a#_)yd2L^x^_7-+qt}QnsCnM+0mp5OA=M2yJDetGe(e}~yMDRZEeclKA2Rmyi z*eiOPVfUElss!v7#3P@DdX?hHDW*To9_1b-J+c;p?dX>#XcL4V&S%YMq^JL^X$G2L zxAhi?hj;%<)k;-6?98JakW+iXd+Pw?V=V&xg8hOSz6>9IGD=7#BtD0aI*vNl+Sl64 zBR6jq;92ZN-iy2qAUiiZw*+8_I5p4p9rYcZKnggXcRa6#y@oy2nd)o=k^%c_^+9X+ zOb(TXO1s><+=aY_ytn+f{5JS;ri4;N9@zx!G+Dxy@D=3K`~~>F3sIzZ*dG}JP66tX z-iF_Xb3?hImBE!FkCFP>p@2PFYSs<`?)p8!?)4^+2&f}vHY~3N?q>6!2FW0_YTRw3 zCn3+)z2TX12~a!!8~6t#BM*_iqngNq<9&eoo1d{uzD&7Hc~x;$!E2QBzd7nTYVQ6n z2P*-6#+XNPOLt3`s!xSW)c5*qUAB&%-|ON3cL}~UJjc|89}V@EKOuvgdWPo6P~fbE z_cd4nhRQ(S-rC>Ve*?MbYy4~c^MDe&eRq)sw;DOwlaM9SIougfz0C0O;PD{)&aI)z zCtXBFmRrv6I-VVUMSis*{S^CC>J}@RD|@9IA=hiJ})s9VT~0=#P8} z)G*XATr*xXUNl`4xnB!R3ov=kG?m4^)JOeCeOpso(|f~v1NWx7YP)LrIUS`Ph191_ zVlF)fUe~kav*cwIWrR-&pH;IXvm@mIdlT>ASK1w3P*OlbDpL{B&prnah|0*CW3kc& zaA&GGd=-Ww$6}mkoTnt_*}M;P)_Oc}JkTGRw}k=gI7p&GB|tO4d*Ptypy(giw_O0n zBDZlq_!CgG#XXXhVarn2^2QGL#RL2}>2Vh@39oYqcIsbCL za=mh~?pfkm;wlBYAglL2cmz0GUjpBsQ~pza_GWl?D;F&%a$sM=2e%P2L!%JXaxS+D zP$zv-eo`)j0ZLy*Uj_Gucpl;I$SFWACwpJinXQzql;sEW0sG@4kUc<86VBhLIVc9Y zVK-np$U)B2&A`n7HR9RP?C2Ok-JD%vSBz7SQ&X?_e?HRVl+QuVcgiArf-_@Y zx4V$Z(+qH5h$6dKeXPEVp$n8;pA9>VJB-)O*Ui%{(=BXn#)B{BFXlfie^{!Rs+bBH z3mLzLPupViVskA^E#c#R$9%_J&Qi`Y8*uit%(~3FBxXrWuh?F(mKaOS6RdxpAmmL=CsHq`zQ9F*m_{QZM$v1b-(qY<)NhwU_rhauy@ng*jQw?F(a=x zbox~R`xphZ1>m^(wYVm!iER$rAYV2a@JvbHg6+!fLetj~{@VS(3*_HilwTD6uzT>9 z$9P_T3fgyS2iL+krXY5Od9L4tT?{_YY613{Ps8i$O7IHac|))x@=?q9%J>?18h9?a zF1T3R^0{IKyX?E{D?n|qHFs<7gPNH^}p1I;$+B|C3#Eo?m6x` zGT|RV4aW!H2i(mve7t|Mubl^|y=Hx)jcTL3-<}0_WE=hkPawX(ob_{Oh4&olp*LdB z<2vZ6?1|K`$4bs$Rw4U`+Di7**pn=e+{kgrfR1=0sPJ}q7XzMs(5{z`xsSOytE5jc zq8z14?n*)f%wEM-=T;|s8hma-KI`DGWv!Cw&UByhobpWaPx3DaE(n$jmBUGWU5L8~ z9{_!LxMRS5OYT*@0rcGG%)Ef9fa#gxnW3_=vT-|L4M9%8BX~A4_K)7}eP|@s+zS@q{E02=4A)q)@DAad$0FaV^kd#VH=FNYUah z#frN-5#sB<`^`Mxo8KSx60-L`a?YHYUkqFITlI@{if6{%@UDIFFS29*I zE=AViQ{z+Pal>&uIn@k5gO$*Q^)&P}4A2eGK}w-7uPv{gteUKPi%i8*x>CA!$em~n zW`U~!(tZuk+J6DQKkbpVI2ce*^;-Q}oWU!?V}pH?0bnb9UfTfb*w%uYfHMf+kbB9y zL_V}Ur$eVjt|YF+A|rGI{Gnzb2XPCu%`K7b#aj0%__Q|*HVck|=hR(z{Bf@TRq$1i z_ka!HI`ZB*)A15{H(NnX%w^-_3k(hp7V9wA;-P_|m?BCFv<|iovNoTJ*$kd7`+!Ht z=Xr&^s+Inge#lKl--a4iu06$q#e!o(V?tb)C{WO2c#iuc@9^b85W@H)(h+n=c1yp4 zzL*B$j1bS;b&$_ATsvHAhrjA%z}cd|Re!74SGokx+!>gkSqWGRWM6hS^snrXaIk{s z+0mZS9v$X>*lhpa@x9}j{h7#6r;qlx{BPoX$M=Ra;e5Xe=M>JV574g5-<7v3Z%59K zoUeIb^H^&x4yb9_0sZ8YvdXD}AcA0jW=9}l6hXISpVtQbH zU`|Gs6#IhIR?RcbGwlr98FnN5M)D|%Tbr3O2n3k#n?*h z@8gce9*d=!N@7f6 zOxLKcQM})lizpY77nTN2KNpQOu}<-f|ke2iQwz-|+`94X}?+ucV5~ippu2kL`(UGyd$`Ak&q8JzoG` zFS~7by4WwZ1btm9w3(2td6z1j5YR_sz>X4d^wz;ag;@uvITn)6OL=TvE3$9t3 zfF{7RS#e)+UtRd>aV~GXXT0Zu^MUgXxD9T=7ld_jWg{T_gCd{wXp><#S=aj)hq8qZPGgRc&)4mC&i z0>4L%q>;WVzY0A+>pa_}ZPHEUP0<%i!>rLgc-FF4))yIhEdXnPvBB8j6#o=4Tk#3A zBJ);GB~xmhbtb|<@AK=VJt zH^aw!4bP;%Ay3K;xL2Ftli3LK7~B`=$;6-K9@!olt^>+c%rkJtuAHKr@M+_Ed=yz$ zWrAgboMB^qk-CY!$a$;csN!hnYWM%X1E}jV|9!H3vb`nXy}qcmsMUag#uwHX*7uh8 z7TB3tIRumhO4~}?o`R1ICXJjAcs&bJcSX)JJcGi#iuCgb}x)3$to8iyrm;2?s zJ1-9`4{+X+b*;U~U}y^u(H+n?u{5|O3^$s)w`SN_0 z8RfjgP{;QSuz#@Fx7c?Q8GG!T{e^y8aaVCyB#e|^ZfCDx5uomU z0&)eNxYuRF2b8r8_8cZ7&zu^&fHxp~K{gRx)7e%#Z^OOFt(a%*Hd|5toj7HrJ0S@I1nH7D$Gd=Mumg6K4xpC|(4AMD~In zW5&3>x4oC2!)0U#^?~2w0p9^1d&=uD_j_G&T~S6^M$DYef&U5X(d#wqk*t}ixuCnC z!x2p1)7aB!G#kx1U`51=i0`Anr`2k7)!3@BHjo#W7gsu=bi$bUG4Z1cj4IGBppmfSYFNLZu6_;9ViHLgJgaH*q@)>@1KHn-beFrlII5kB%H2nPyHi zZwKR$jegQ_(y&6mLO)kKS9pWOW2Wph^mN4KK;kq0*rXn3Gb-74rAUN3IH3H(}4I4LAx68iVGR`j(m+qUOlx zOVOlg&?Z!WMs@)8HLMLWd+nv+C2q?p!V8|wLuREhx34R_@FT!Iuv)cRRRDehe*muc z)N1SotlwUTmki(kUtGVqesKKY(101pOMGs7Zo3J-!n^62<(cJ@^^$d_eWtyQqmAPw zpay3;yt-4|DQx|@lRe2E){59O;oaf`yd+#CZhp)CE%#>D&8)EO zupGGlr~L@VwZ`)XDT;*nc7y@m=`4@P8uyiGby` z$VumU^(0{bqc7-Z?q{aY;J>DSO>@Bk!vVv4&3nyCX{B^hby76~@VwR+wVL*rHDvE@ z6*B5`eYw70UB9~GoN>;Mpt`HNi@jRvbB6)e6Dj83;o2eeXx#rfQ_h;^*}z%RyK0L( zim&po@}kHAs}CSaSFsm#9Zc3v7Wos4^^5g00A4dABL9qh@90m$LGKIt3;H-?oN*$2 zfAuWoEG1{qI2-d4KDXZmz7zWvYeuZU^#ZqE+QMzYSop@NtfU~e@;%8)o8QVn_LW%XtC`waUGbB%M2t3gL|M|1y({tgwvE-iR8F z*PsSqCJlQk1+4|GKZ0C)E>6+A?OVZX*1PL*xSX^1qoGmJ!5=h zeDB}^NL?e(UQfUs=%)ICC&&!%29kgTrU$17`5qtiAN0=v?R@QgXS`>G|8qG{IS)oh z+!jy-IYBHSlteaF6s8)fTj9GzO#;t_B?0H6cz)-)eHgHgz8HE&*4S?%c@ox5!o{zg zvYhfY_(l3fV!eX<`bYEuf7bl0d7yrPl$n2^3azM~rJAMUA?0sCP4_|dL3KlILnP|V z&^FXH)bZ@k=dTYkKQ^m2qw5}{;+d1{rxtufE-5jBMSyD;`xfVs8BU!QJqBunAEh6q zE$S_5e!da<2z^UHt!hnkO>I2JKCYHm~#a7DTznddhnW=2d} zbXxSc*l)4x3#>2jIQDVuE>d7ufx6&e?7`Ukphtlo*dcZn*cY=eW=+(ZsCytGG9hw! z_;8V{JkC7Md;xhEeGPpLX~C#>MQCy z4v+l$-um7Ro(-NDXAInBN;W8fhD8 z<1}%aO32=(c6|Y~;nYR3KTf>^_w|xsV`yV&GJL(+Z}I#5z6H<_@|;H9z(V9#v46B0 zXrasd74V+;6pVy#BJ1bVFps|)tikL!=cA}|U=Mw#VyA+AAI`^o1ZT8ov^Z|)_-xGr z%%;V%rP-+3s5+!Mq&coWuFk`3A_tJt;N6gc+?ZmjVyYGJg?J3ulTgdlvbCYLqBg%2 z`CE5@>R$?AR{o#Lv(Q^4H+`M=4jz*`uGQny2C#SzTLQ%h{eC$PS?w>uU3A z;akO;Nh{D7Y>n6&aRyuhGoxlkO^==)T_LhUXGxbGx9{Mi)S;T{WpfdbpT_A|M6+hEE+B;f$W3dLX zO1nxti)}EkM8DpphNXrrfHl|Mm?gcdzN?l4dTt$49#c+GOi*lvB=Vc>h&_cG4tu@3eMY{%T{pMdwSjqs_a zC(&EgTcjgpsZgTV^w9Ru(o5kT@?A~>_GWHsZ)!W~I_a*W=G;`*RA&eDo}k8~BK(Kg zw;KvrM@^Mdh0pjhmo3to5_U#Qqm&`ey^yHR@x=J_4S6Jj=ZXnaF0?>)9*% zSpRzd^(X<)k3S+sG9Fp-)EaR}WSgWC4Y&K?sJ418b&fU&U?PUZ4?$nTe)i>D9Zzenv5&rb2d_@E7XoC3iDK`Xcp_nF$r*W3@5fha|kVwZduT>mG_ zyC}LS&Vgj~p*`>i`3!C=Z^PvzT6s)yOwkAPGkg|{!=I9Omf6y5kzqy8t`D*gvO3B- zO4gPmkTZ8Dcqh0MG!8Ttb?qU6A)+UK1zs=gp{+y)!|&iH%vG)OuY&W-4*v~!ZM6iq zUAJBAv-gKyl)aG=$he`VVl*=7S=V9jmfoq;?bGe^ZS#dM3TG%Qa~>6N_CFKZe>cD> z>nZCw%Q?$T>r87CM-xXHsO_xnq-LI4)-wQGue%3)4|sSz4et5x`5i$=kiDFB%5}lP1Fx))c+$o|{M4PBKQ9Yu2M4yg59XmH}Zrq6iCkot5yqWk6uuhr> zCV&P78x(w#^d_kxxKrp(p>H6wU}nLHLJ@_E0-8*H0gVebE?7UYeqxRI8u6?Jn-WY3 ztqZg+P%5@mY)o8C9Dkk1QIDfIOO|EIGCemuH*o$c8h+&L$?b(7{7l761<$&z6|EJl z&nyis4OIn2kW0Y#n7tvMOP3>yk9$-HBd_I(tQerRZ24;Hck$D5W)xFjA(f84tL98*>c-VZ{JTGis*lUm-y6O++|l3BuQseUR08xt=iSu{fih=V6O0MQ z@rLn+U*Juc3fPZ21n5!9-^)j^5b&!g7=ip9wMwnxOF9bJ6?O&texs4oelmDcWU&`P z{w2?|4ix!A+c2*%4zRw`+uz&&#QVfs4^Vf&vjFP@tUvLc zp|)x~a@ptsQW&}szsj#_ge*Mv%o-yPdbD}8nX`mtBFjWZL`6hRjh-4UDrYD*M*F zi?TMsvlKm@_R99k8liT_Ga>yVo`HMdZ|QF-P8Fv*t~{=+FV&Yy0cvN*sK%%cBgf6J z@Cz;0d*yrOE@Xhv7p%9ex9qz7x_mJF7doI8N&ld=uC*>|%dddlw%s<)q7KU+mftJ4 zm*}yz&uX7lIiqq$=k(6$gVP45b^F@w>p_qX>V2vAW&Y>+pL5BV+%NfG^S_2bp|nD2 z?K9eE%m%f=wQtwHrDUdL_5!uCYGvKazL(uHw`K0#yt{erEbT0Zt%t26Z6j^#k%6_^ zxf-9~B{8Ejz%{_dI}}=k?xmiko(1p-=UPndSuApoJ#LTCD02_`3s&4Idi5J8X9tzc^1EZU{G|B9o4XL*_HI*S6PkroR)Yfh>F8 zm+J=W3SY-~f4sknw~CkNgCl?%b*}R!umk=oeL-7r%6ZB;37m1CaX-UcIP2m&z%u}e zu^&J7pqR75y^Z>sN1zgPZ52QQ7>K!Y)~H(o_RZLfVIP;?4AeOuhp#;IO$X!+$iwv^ z=PM|YT_XEz=Gn|?S<|wbfY+I?#h>?t$3zX#4Fmu+oK?YZfPVGNpQa}04xsPN1!T2R z3&Oi$G&~`G#Ox#2Ox6z%sSl~ofeyM3x*eGDDQ_%q%s1y_CmCmkb(wiq*sQQi;1h@l zj}SB2m%}fIKLM{nYrs8=_vRU4Gs3RuujqO1V=oT2Xlj%mq;IlsvYY;!{>gxPxbe>M zc&f@d584mfC*@Dd@0!~c$zKa|bzpzi{wzMI<1)r&{Pyj)Z;@G%Sp%{MWT$7PXXRw( zWRA@qo6USMHh*Djlb37Fwel>y0keNI(1%00++EXGQ+Oh832X`2g0`SFWDP}O{*!a3 z?4fm6cUN;>vb?UmZoYoL&|P4B$J7))Ndtf@%!Mi4-eH4HgH4cUg?$8DOJfvcOE^Ok<2G#P|*UpCm!2whrF z_@6e0S8gR=C0`486iou&@Y%W-UOz|D?Wvm7NJQMs&m%uOLDd0Ri?;SjEuL11oP}A7o z+h2G@6!#SOtZ=VzUxhy?d)oUkbFdaXb3KD2%3U$*>$CgpHyk${+?(hP%Fl(`kVT$F z9`+|!_*eLkgEzr9L278m!Mm@Q)JvlF0wYDbp~j)c_2%`WZ^7D8>*&_e?PA--BCayN zOQ9}>Am1#qFnM8e4)_CfDcYsz@)FBS%qlsnWX0kYdDSTH1&zVTHK@PN72kpISM#8uMN|N^)~f3y*0cw{H_06zfHSM z%X%E^Bh>l7N1gzFydqnTI={o99JIl|Aaj6=1@Fc)lrx}Yj}v)C-QbI~_kWaEmRH_@ zXI}$#1Go+Bz^8UkeG{-Q6RVBY9@HH~s_8u)&%(UVzt+6gJOJ$Lv;MzHxk=ej(NIBe zxHMlHDoK7(2mS$?+ehw4?z_&r&TzoI&!M)V;y%OLgUl+kQg?jM!4{(||ksmQQ5 zx{dB!coDbowSengs;@|}h`8(VIZcJPbpcfY)pPZ8b&@Vg%!%~T_R&&9JKHcDt}x3m zS-;Y-UcX+Ssm;_T>y!1rf!dnd8g2r7Hn+lyZo6W;$b4e|Ymsk}uQ2kT4`F_6KYUoX zJGMIpA$y&=H1;PdA;-E?Zl~PAIfHW^fS*9CtX5g>Z|-mOeBwETJ&8Xu{>W&a)jX?Q zPPv>-@W8&5cPa0h<(g%oW1(Z1YnbpQx#GFvDFcsQ-pOWT=4S_{KzPm?uO6=+pdFy? z38-27&iI{ixM8^Ak@1nSN?4V!NOPpQD(D&BGhED)nk$=Ygw+V6)+gPRZi3~I`MvSI zF&Z>8H8XVpL0x;vngwv+Y<*s0s8qrPQ>W`kxX7z2)iA>feekgBLuRAQZX7-mGNS6&6*XlfOx zf#N;1BVaA%SM=nm(S_3oQZKJL((UQ?L|dW_(E`?~wyCxnV3&25b*5#eWh|Irn_!y; zy1~pTXD!C?d_MJE?v4@uojU?M0$jTvfwItvc13ncSw~q1do!$Q@~oTb z%5>3V3Nm&~E$(+IoC+uVY%g6eT{Qr82h>jWhgV-iPeTvSgS^K~_fGfHBj5!%1N45q zpSACkfEvi{q3xlM@Y3XdQCU`5b_V^>pH6RZxvlk5Mysc|Wq_ z`>Fb=)~nZxTnc(cQL|dcT*jPcOf$X)7@0z~plvw4M{ukNV~;`>DT~aC%8FVTxiAva ziSS|(#Uh%AHxEA&b|kEPc=_U6Zu}>f~6H zJ*GOQdVoxE*3WqNXew(e8;H5QvB;z3TFd!Y_PP_0A2b1)4Ehsxa(5DUhb(87^Bs8a zc<&eo&N$CFZ@6x_cz>3AT34Y?0Q-CvcAv!KJysp`mO7?vgu{hEoqjts_9kJ{|3#!HUHKLSkf)& zNf}8Q>%cnzyU)x?*^{yxg1DTxocp==bGPJe$$JQD=GV+GYb|U20rTCz+kO{w!tL$t z?VN2&09L0})K(|DCc5Z-7IYT1yf6yBk2=8Rp(OZRD3E!cU$V9?1%QwV7#9tIn51Ww>6Nx!t{%jTj zYQyQtLS37|Yw%WZS8zL=4(CPJMHhP=?2UhPeRLVYL)$~!3cz(}ly#If$&zFlnLjfB zXztP6DuDTIyoWu>e3D5`Jk6l9aSWZ!51ZpbPjyzEBB8355y1M!n$+aTlbk)75=- zeRWk0RSn!{3z`awER`Pcnd3hF-u&L2XUa1vj0$5r_|6@G4;*Vf)bZ{F?9D}>M>kD7 zP5YbloAg%xR-OphhYR9s0lHh9(Q|kl9?rS2{@u&j%gOn{XW$rs)W^p4It84xp0xHr zt~B*|Rh?Cx)H$|-m*_NPDMz>?+{eAgy=y_h9dPf2M?LjAmwcCm{%|xhQELZk2VR9< zp;|RR^k4A5AUz*A&u}AnBS;N6&swlL2m#(dWo!k^BG{BZ~*4-wjwL%u>Y{1zh^eZ`pNpqZYXakudA-B z=tWvfS4-Dd+gCdT@cbq>$PF!wEsUc~qf9-FJ&d&swG15qy_PKCK9~>ufOoYSx*57e zb)xVc+M(Hj>6D!!Z{Zkb#4D&PsAF(Iarpoi**YW}~tmL63fRkPp!9pD9&^}=d^ zy@k!7u2ff20qRJ0D0V15B1?&PN&NN{-Q?Ybm;43zv(AK1E1#o}fsX+bylpbP8D7@n zHiI(AjT;1x!ryf?pvIB<&#qvNca3)w@+(-gXpIa8&L;BCs)JUSGl`So1AYpO1l^%! zJgGaWqi%|4>nvTCu8gsak@c&1bG&&Cs1RNu{7S@?h?Y?;qavdtqYp(L5+17Yk@1m@ z!3r=mVkjKrq9fjhzYXW!de(T>cm=Q?)6dY)KNR#;4twop_dq5YR7oA%jTOAZ?Qb!q$OxdBxnrHnr$&uucgEq)SSr29*Tb{MT zeB|V?A4eZ7dQ?!uQxve?csp=AP*zqJ$yXa?%|p#Y$+BeGH^nyv=T8%@H1w|*{6iWTDAyT4^7~6z;y$oU!iOMYkr>9_}MoLH4B~dpYzv- zCpR?_AK)*a>`(Ud%yka%9(mh;+s}FB>X--bfUMZ+$j}=kA0+1*#qX(9sFcVV=Q{ll zayzJVr~ofLo@eNzxJFtdWy`bW{2t$f^U$2^0_+De(}ib+G-R-_2Fv<4`^c}5)5$X& zeFW+uljTq4pUQv~kf@cJ26Es{pA6WOJ%Hr9LdZ0kCYvT(8C;1JjBmkrvUegYvY5P> z{4w%0V%4$g6e&f5y{L+36`uX5*U;&8`ci;>*@<8R;QSF;1Bw}oVJfbIk@x*&#$`s% z8^LP8P{~xulxfT~E&=nvQ{7WBr&L&1SVyl({uAp*dXzGx8lg7mfvw1v#6#58l2N{1yD%Sf+ZWde}>)Hi75M5%5uYiOjisu6wTX-tyij z(67^@XQOAMhc$hkEwaHv@D-lp&wS62&eQ;^s&>ARH{^A>UG6WS1mKJsa}=+@6OR4- zfzE->#mJyzuYha)62OeiF}5+b%^>IuI@h_@xthSgth}qd>tFEM`Pn%Im|P|o_dM!* z76Z;$u&+QpMGPoLUl+`QhXZ_(vmVub)uA>U<0}>@7MKN1^lbF%`(w`N2I!#d zpxh1r!-?R5^Z+WaH_{})bG1!l)A-eXv9|A0?NYsvULb|JgT%8nYj%avuNy6m7CG2l zuM&|9QXGB_to0n19~ZTy3(5=FJ*q3uh0cXKBj=?%wAcJBdc)sr8L~;J31_d0?*_Gb z{A}qv@I|Q5zR1|i;*5nHQ15XH-X<0O75!7e0N()7OTxG4r&k(|WWM+A_wF3{rrTjG zk_?^mGVe048Bo)g=hKjDp+B$@c-Vdq|DoAK?V~f)GR6f;B=_V3nc1ryFi2x-7=_|Mm3Ifiz zb5<`09^2IOYyvv46p1oFUi}&KXwYBj*9;p z&tJTMQ2)f4$CrS2C$7B|2~UpUzTv*N@a~{~ zjCm1}@O#9uBuIT^0-)E*pO`((ljVu53_gpTQ=mSD^B3$(&ID@kJE(`e?T*OittGD| zzkzwxsbIQ%x;%?>&B338thZDFFF^|6y0Hg&HPl#fjhGEy!GDlev`gQtOu;n zuFxI>WA$Uj{5kIhhm41euq)E@-oQHqXL)&NU}nWF!z}~-SZ!LHIKQ!;`8{%I@51|> z&s%pzci}t2GdX(|Z4_;U?z$ZOp+2F`_W*e@!{x(;cb+fk3wDF9w}-5Um}$D`zv%BB z>@9rbEpm(eAK5=5i>tBJSgNR~sNf97G~`fGORoW3BVNc~AXRUa{9nbtib!Ro(0+YY zd{uOXcU3Cj-0&-4ftIc@W(?_5$lAvq%uObM!I&l9huqrfn2YQTsMRf~E~qXf6_Ti_ zbgG@|E9htN7tBMB&JMu)Eq${1{~D$l23Nl=qPEZaF#BC&Kq)W*(ChRws0F{%t{_Gi zqkEuzpe>ASh_kx0;v7>GUVxdpOda)q@y2-J+y6xOM5i{W4ej;q;qKcI>W9914%qe9 z_SVA60%?JjknB=f%s}5!-BG;k2-zH-=^dffK zX7Iu4t?8|)qphPYhpghC^*;+eKWkPI&O@anv}aoTa(;+o=`e?WW8 zl+RSoR1Q=OL}zWb!Yy~pCx<47`Xj$*9x`n=Ag_;p8Y4hG^eQ=*)gP2`mT^YeqwLq= zDpV10W~onpA5@lV=KH}daME&8=w_*_7~&Y>nC+a6s?ER7_oxki26d3_!I=g2)5n39 zp_ZYZ=;`yGmI0c{o5_Vf7Uh2HplfV{)GJG~=OF%1~w~d4HfDokGM2b%c73ZjLyg^EqgxYbEqq z?1dH77t{wpvLV?(PtH~78{g91LR!&v-E#eMJnilE^iHNv26a#2V2W-EKE3%m_Tu{i z=IGu;zpV-AuIjF$-vsX+Uy(JLE~Sf_0PEf}z&zzVB|lFdm}*P4F=aJJ8X+4Y+k&}S zl|rSUreq1|hRjU%5-wn#c$_p&;(r$hP55naL484O(O5LI;T1~FQ3-7cEr0G)Ksil0 z4cD1E@P;0y9j3j8ycqVTSd(3@TCPe4JR4CzMISBpXv+r52G+u#;koy@*XeP3xUaD1 zMV~_Y?x$K(Elu*9*P!q~~$e*CQv%9mGtCx%Spw{3#)JZ&tZFX;VFZ3+* zJoY_?n_Un5>M}8d!`jtl&t=cg@Xcram35N^zzAQ2Yrbp3ZeAM#EUy@}rG?&=-kNh zCnvo}DGGgzj0E1X_JdN+QqBgB1`f_Fv$pDWdYv5r^#XXs+?*kw0L~&yg?EW6@Vs9R zTDn_`4B1JpNv>(`X>Qh2M2<1eipL$tMZKLhn8MD&|F6wL9x>-CIM>w%Ui_SkeTPg# z*t}sHe4ei;Jb5q{AL#xvz}pbP0jUy%F7J9Hm!A8}5*yn$QwgD`3g_o zdCd6L20KBUKpP}B_QuNk787LO1Dm58*vbogCzpA#c!&l(5B^gqkk2 ziz%`c8S^JuUx@=w2+5y?o`v||ux~UBe$!=@Wrg<<%KmTwo+jr#^rGUTqJ+GJ{DI9i}Xd}-f00`=O<$3 zjoQm$@KQUA`M~)g2l^OlCz3%XF#F6t_IM7!Gm+~D?;;HV*P`)`@o=mv?O^XVQQu_Yr0ecn=Q3F_sEDrXx=|{zT8a1Vn$a5{G zET&u`tw1I4v$PwYeNO@J#{-lDl-Y`GxMi+T@Mm!Zum;aPmo@mqfU|u3J@TB*I^!+b zE!o@9TXZR2h4Mgoc(T5PM@PPB}A^(TxNa`Bq>F0@j7HYy^BVqc6e4yX;zl;1G&KlN*Hx%d6m@i8WOn20k zZ>w*sS8G>mSL#;k!U4~L&2-IlA3#%WQ!V?NeZX7wTQ$$MeZV`=pW1Bw4L#?2>8}}P z2ossLS9Mo)B@HDFJlk#7Z5DGiYxQgO*~V;RCqpL#eL$(F@&B2Ut5}uWm13jqD%) zKSD2=>QD7g$E@=-c-ZniW^I=H0qZ;T5vq?II?h%8+jw>l36$T82Tu3?-#+Zl)A_U z;3xR!b^`RVqShh}eo+1V{rr94L4=WN-y?Y9uL7(Qrn%BwPe2`H4weU8!-jyeuClJ1 z&YR9RjyJ-)zoxq;ZkCxMJ7}b9q$>;bboX?#_s?4RXaGqQQj6BXjj){fV-)6=UW1Cr z5B(3^1vO_2z!@`{vridJyX~?5T|cZ^3Qw9e4mbggS)U2igm7xkL<4%)tC- zM{h?Y1{CxD==;&f`TjG|9S8w1g4x0u;3G8l`;iYqzvN*c zGn5&Mk;RB!fFzS-XE9H926dHq~aBi<5k z83HzdN47`8N1ZdxyMPw(pR>M&w!QGwNpYk&s1uKNM8o~Pg`*#!X89&EG1y`?zrW;<=W=l=Immt^$kAV&hql|DT@$y=v%Jd(M8&&NDW(x>o=Psgj&Y zPWHxXz!QmU1J8Sq`njnwt>>=iW^Mjg@HZ#{I1@r|BGw73fEi!`@+^7gzXVS({>+a! zk2pE&Ho-N)H5snm2RsKnT(kaxkIzNW6YL4@334vr6rk@ye_4O1v%d-NPwugsnv+ZPi0SKHR0{X z_bCBBJBhMH8Q&H5X>`Z{c?CU7Q^0531a5n8dq2Z(lzLmPMXWbclgqX50jL(N7UW($ zE;uguFG!W8;=5WY>XpZ2$MDv*ldXd{$iMJ2<$gQ}sqVdyKiXE+R>gkt0%?Kt1M=!x zN-d>LfCXLd-|XFWQgu@8Rqj<@g-1;nWf$cI`2{(DKdhavK*k*R8^T&X*OE4%4k+y{ zEqp@RE2b9sKj=+Z58yqK&*WBQ)KmiBoZm1Nvf7#D$P%9U68iY8UzWg(CjFbahL(n3 z6#Mz~Tfq@k==5Dam#<%-U*I*K6L7HiL@Jiq0dBBSM=t!ZiYE3N2iloSU3e>{INC zfF3q|kgdqx9Nz)fV;X@rpr*B^(Azh1HgZ04JQBLBG07DX2%u=7Q%_(l+dcygvyQg%@)BH!FQo|p$VAR=AEglqN{>^@Gw=F zs<*ngdZKEgDiJyxY6^LGVSS}E>Z0`hxvjdb+6kzEcnqk;iJl^ zuCA`GZlP%*bQ6=+lSLiupmb3B2;T_y*kY71ln5#ZsRpUuAxC~D=0b;KuDb%@@3WSo z7F@TELsfBCc(ggu!{hufe@?9X990|@-d%H*bCpX~ONC$8ZS?Hov~gP2k$;6AkQ%Kv zfEsDe<{#D^)^Mh>o35LVeTB`)spomWin@yWKj}ZI1Q>uUq@|dpI|sT0>JbXUYo;$4 zh*`-F(E0Mb_yMr@1?hwL3i#mpAfA^w?m2Ef;8}p@%~sH!u|Iv#dC<86E_SRDZ39W( zByU+?S>Ny8-@SS8`I-$aG0*qZCjN}PibiuO`_iFeBT^80dX9KHv8pkvsF-ey%< zRTu5x?G)`4uW(91%${-{F;khT z{1yI)E#xiayeoJhAb1JiT=t+whDM6~2L2v9hB}6NK$n#R-!jf?wTACMzn7KB(i-3$ z;N_YFt4S|=!>mR3viA~Rhghy07;&+^fLAx`Gkw8a`&@flTU%QUJUV6ptIcYwiL6kb z`&(c-(C9IG{sEg^n_c_d``j-*FFp4#*BZhlhM(V8&E8kj$S_A&v%0&z9PQg z;RpAJ_YW_7;wO-eauRSI`4IXLsw}T8r_Q9aytACoI)Ccn4P@&kZY%R4G8DM;mP zS*PACZH6P+D4c}WQ2HaWUqao|C*>z4djUNG*D?A|u|{+iyimRn*&oz>M0Uar%=%PQR#T3}{2J>q+mzds9l>+-uKk&v9hZ3<8tkW5|1*%i|KBMbv=%f!?q8?+ok=qy|%iJX5GZMOj4| zd)#|MdqRx>brE+#4S5YzaxRO^ILzHt?0b|9mJISe z843?c>PH}VMT)?$fvWzh{;`1X<6%%2bET|jj0uei@obt8-)m~`SU0Mrs->b@czYT1(AuD^n}eYE0B{p1h^0rK!5Hy2yX~FZ{podSUg#l1<5`=9qb) zZ@C2g0OiFn&Yk=R>YIVFzA;`GuhVPwPytU9Gb9h;^UgK=JLH`H37Q}~&j@0rSfRZ+ zE*+QHFYJ!YdM5-(?77ql)d_8qZ4&1)YV%m{S^y7&EuauG2To{CXhL8CfSg&^0~%#& z+*x0$W2^&5gIHrVupJ)R=k@2&Eg!4Dsk^Bg1RiQ1YPV{(YN(avxq|gpYT$+;xuz?; zrw7Xi%X#K!-{WEMVX$PVWQc3xR^S3VJv%)-Uk~;S_H1x(aC4^Wo8z0KxwE;b-?N`_ z)PB@Xk=+8z0!u4fD;xDp^w#1zwm(>CTWF&<&j_#q*)w=QihZRPjY8d&qJd8xUnxv<>Ldku;L>OWYReV_k6 zzlgPn(BW^jZMBs{mdIV(U0Z!eeaCC~ilL>BO6zn-QD;$+(f-K!$jKVjPwt=GpV2?1 zevS8*>&QuJ2T#XO!B4@^F(=}e z{7}K0B(5pHAhU|+3jR@zI?)wCUF8?$7o{Gs*Y=C*7u7}32>vx!0JWhB@cv!`qA=@A zt>z$jAlHMw^1kdo#{e-+@te4(hGZcbpC_(6Y3SiK0lcFg2c_UI6%L-jpF)yL@`;#l z;(>|!n7=}Q3B5`ac@z0j_#UwS7%Phv?|2vZc3tpa@K^R#7M?ZK)lz50a}@P9tRp7} zlSOtHbuO>*Z*gwFK5|N`BPXt0uv~B?e1Ta5WB-DCE^GK{NEW3={uMN%XXR(*lR}e1 z=Vj+{J9#9253i6p!}E+0#&r?02pPTCS!0?FeI7k#xvsKi-U)C$e26TuXux{u2YArX z$L4_IfZ`~;S2w6O2z^E&RUy?oP)buuqX4@Q3jaV_{Qa(@x_~;}3=(3|I!?nq5WDS~%CI^@jC^K7eyeR}5F6wwP-etRJlJ zsOzXphbbg8?_20w=s##bXsKPy2PkuD4r&i--@2HA;(env{Q0v$HxL85XuAkaM_2f6vUdLj^UqJW`%kLdjvgxkAFSjCcrZv=WSSfUIQM% zE1!GgSNB&qF7HLkWRCb}Yca3f5&l!uC`w*Q=+d~3HS{$Uc{VfQt?0uSbw%~z!&DyB z0i6N+KZ}Bk(D~aXbe4V$XNa>rW~#5qugF=O=!?24J-z4|%^C&u_XR=)LJKjk#yaY6 z@RQC%eg*HSb3=2*y@7jgQ+VxUAhWI!GD5Gw%OV$q$-=NIU6xs(Yl5Ym;wZHD&t=bL zJUeax>;K2k$P~#0d~f-#uLf$lS{{cSJ#|1G*aKKc+Jk%&?k6bi1ynI!@Dhxg>v%wPe5+txMQ=iwIr%VA)%Y8f{t;Ni1k|s$* zUj`3`rr1+j4<9nFn|%RwJ2ycQsfhFlTKHXn+AiLo2gnAHp{eMa9gz;hbEz9NgbGB^gW zZr1!Z0_p?u1Ni|ycW-=W03`**bHM%KK63wN!tafBt_;9mucy>g+)ef?_A72+-iYfc{fKy$ zUZ-BCzNNjTT?UGSKlFd-j{$1nF6u7oXrziOJXX)2wA2VL118W<-A_G`z{kEdpf;7- z9L`j+hVliz%@e^u%vG|t!RMYevwPqSJR?}=jfbyUGP)QWk%`Wl?=tA7sg>g1%6)*p z2kzVaz44Bgr^pjNd`qDv<6VI7;J>neIo2mTft;XLfLRl)!`1@q(hO0Ou8`o8!L5 zzqdxcMr~Kxm5GW(v8R4PM*Li?VXQgw%)vTTXKG?`2d0Mv9uwtx`FX59N9Ai3Yeg-O zS^|FmWdOAln?R{xsbCf8e|y8PitEnb;HdAY4<$&?FWz6E1}^WVcT7WXL+_8CA3YP@ z6R~33+|-iQMFzoX&uI_)R@|H+1s7g13y}R<9kVICf7}3CnN~JWK2J`aHtS>^R2@_* zwMxx%IQz#*vr$qCpOPDE~z6|-2|ks0$Ceh}=R^L^sl-U^v_v4PmYS^ru8KF|Uh zUuu@v%ccHgC^B6t0M;_7;o{GQ^WFUHsU_gKnc5AWhhh<)(Gniw{A(^&tRJBTqZlb4 zDc19U;rV+I8PfHTpE))#HgE?}lQjp~h~3dQ=GwtK;O4;QKu>>9@%`{#cpdPMytDn} z|H=On{%xz^m;4(3N!!6Az|Wui2=^B|7zb~Tj)42jTfnuTIP_j~WOLBvZj6;_x-3ba zB!7y22j8V`;1Dv+8-UuFd;H%2y{OyVM}Eyy-hce!^t9C=QA>-y^Yio>vj zyc`QR|iqZ{T{4dJfLiv_vlACCqcIu&=Pca=dadM~)gx_Lq29 z>48~TdPyz^Bitj9i2JALExGZ<`*egq!avwISY#Y*g61k6B!f+!O`e|t|Cj`3xo5e1 zdwP2~U&z|jpWr-LihP8H;HLMcw;ys22VzEdLU00-d$1JJ$p`sH`8dH&k3! zT&zFTx$unpALc=MR%k14D<2I#ID1CR0oN@)>(uP9Z$u3<&jDQDI5*C-1n=ss=~V+qeWm~2CEX?69eCd*f$h5Ox-Q5Od1ZKI z7+@SAd@<-Fztp_cTqLXrt@*=dhR+O#lp@SxvWQ$9`o3Gkt>Mihn@7?IiTCgZ5e*{d zM$V0#7%?&82e1t!0s6$T)`SvQM7Qv6;q;4NAGSWs4LZV~x*DK4{(N|TH#9UfJcjOg z7T~#fGBSy{2Rv3i7QV;qu~Cau8k+nc0zU-4^L^+0$@7!Qo#1m*1_S_mfsI^^T=ksw z#Ox67ft>GQ&+w@GsPH9gg={~b4expGc}{=}@T7`|F2~?A__!W%#`Z1f>Fw#I_r+%5 z27I?aA!}rcZ;CG#9@t)d-SgcOe_jT&m0yut{R;^9gnJgd7rV=V>F|Fa4}J!mcVZ8e z{u-IiOs5@ev~RS-uF3Y%{!z>n4zdrjmqHf#SNm7{XxC`rZ{)*lGGETS$dg=%yl3{Y z=p$7XnI^1nQ%`ovamqojF6tS-fS%BqopYRX)Ns}i9;y}L%QG6@nEdtWo7ong``rL* z;K`VwO%0_Yt#6R<*5LEZvoH60?sr^wbxNIb4SGZS0PFHSz)j4)wv)G$&x3a}>qh<1 zySoC9LTd18!jGysV2xlp^)4U*eh0mLy?pxv`;jR58B@VK0<4>!3ZBA>^g37wnl$!B z_Gdg~LiaF~9p1Uh|)jCq_S3`XP@3yw|J( z$>5~sq^1S@fCqvr$T{MDg}sLZ(g9K1TL!=EGVm(pd9x@;0F~j(%RBESz%_piYFk^7 zUme63&--0MT|(yq=K@#Z?N$M^k-Q)9-o6O*4D}4Lr~C%6$H%pjYcn-K2ZINLTqFMS z|K;a@e;j=CfAg~k8jkQL&a3k7!E<6MK)=V6U^@66(8HIS2c=)>Uk|^{#;B9WgH6Fr zLH4`Tkp05_hU+lv&;0dRbAAzc5%BmtBJVR3-m~#1#zDA!qDi{@f1b>iPfVFh?Gq}&30w+;dAK@S2 zXHT1Z5Vabke51s_+Z3MmCy`%5%?h81X1->=AH6?%+3Q1F)6M>50`eP|fj*#&r;M1B zV(p7_gMT51xIXgn_}^30^A@zktRuC!Io=#GGsRjJX9X2t9-zLI=a03R+h2lwnx}yJ zN!Bk)c}scQBP)>eRYL)F?=7IOeGF<~MvMNG2VDnUZ859GcWV=7d=lZ=eF>UR_F>CI z1I2#oZRBEdZ(~nMhn_#56W&K|1#Sf#AxDV4Gp_s87IeToU^F~)c_%yrc;0FcSpTSj zi~~N4T+3OnWYP1J?2~LMd|KICpzenIMm@mifPK-T@Prrx&vc$0XM*a0UJvv~;{Ip^ zbHF;sI>$WwJo_8l8(RYM?U%uWa|$wX{?7k9pEIafuC1T*Kj+g|lJf~K@?PX6Ta)3~ z^pkZwSPnR^pttI+*X-Bq{g6j|%W}(d*ml@Pz2gtAA84QLT8lgPG|Vp1n}EHT>(1-W zuYl|G0c5&SAHWMU?@Bx$P6s?M-u2%Vvx*I&{pk&TGdEz)Tv7kZb5*`KU+9~gp*PI? z|25AwOkY*>%<|5HOMHDVKkusWF6Vri17ANme-d6QvmLV?SM68rMFI7=%$<7U^)R4IxS#Vcf?R70rZdgy-WuJ5Vu z8GziV6(9w^kYV01sMITar~0Of%%1as^O#z$Cp6Axm=<*dtp5y=4G~^I)b~~aoJ(XK zly$Y<@Fc&FoKW6*5uwSsBm}}sB1=*OW@$g(0QK)N zt{4}!>Rh|l0M0Nhhrcp=l>MQ7=zy8-34j_K{=Jr%%f1U9`XBno`NlED%XbaA&0I%Y zz`u?6EuKHw1FZ(e2gXAoIwP>(zu#XvP&)7wdFf@qzrKIP9?#F4&(mMNzkIov&E%Pe zUp$wy4?7Zm8t(zuFaC3W{?y6DV7{6fvh()yb{tJzT%SujOFOF|&+H6X3t*Y#;4Hu! zc&LuTjLJywNUsGM4m=0cKn61F#niXZpY<=rU&0@Fuwt-cv}&|!8?xS5&$tGRl2K&D zS5Q7`HBCTpLlpQty$w~YnTU7B5@4|-g6T*dzFNx+(zN~uy# zlqO>0C|&gE4?#&(4~UwbeIw!pu@9}mqad-@#%9RoMei)8O2UGaZ3oq4>?_4>Zo zJg>C}LM0?ohEk?NA&EkfsUoE$5`{yCQphX`2^lgEkrbIrk%S^jO6GakP&RvmLX|r|+h7brE`r@6k-_%zP1aS5BIeCh5|oYga)^dK=X( z<%9SFv%vR)dfL)#NH?Qeoz7Fz-N}3VJ!UmkC!Ph;6sbn6T4;0Tgqxw4Qr%D5of*)R z{LkK?9$HmUE$?^oIW>p#X6j8&;V+~bkSAe=iiwH|ov|*&FR+@gim!>TiDJtekq7Eu z!M}pnORwW9+rv03`GfwT{A4$mY%W;#l_)@`31)A48TynT%Iy?^TirW=+BUJ(LEzQjl9nK9t zaC>Nb$QSm7e}dMb)*;Q~w+Xhv#qhMD`>h$Q89Z8gv~*=~W$<+9bcnWjcs98c+T)Kz zk3^q>;j!T;bce;PAWgkyTt5$e&UfA(3PTl;t_X|6P`ET)x{qvzTj0Lp`-;aFjV+=S zR5-6-UV$=NHbZ%sczxpa{V@0D+?%F(g}pt7;Ihqs4S{F@q`8dd-3Cj5x6=w|2x`HB35 z&a0})s+N>YC)27i{|2g^tL`pcv3lT!J`kNIDZaK_eIZ6xor|UkQ& zn68-g`7JONm?~N-;`;lcWwd#;#>>oum{)z){;YkoZL_U2S-9gswe@z6c62K1J5*!; z0&+pR9qn18U@RPkG`s|>;Wg)LPPfbL%GfjZ+Z?xP1l@5bGpt{ObT7T}6Ov9w&-ts& zZ0DeD9AX<{tASQh&!V)l3o;8b(xGHPb#&DXGzXkcgG$SMCC%B(X^p}D!k^V6**eld4bQ6${h2{n4 z=_NMmh|=MI0qWl}O>hiz2Q`5)HBx7~ z;TY50xQE`6xg)bGy(;}8^9owm-hj>cyDb7~W%iJL_#l~o(wV&g>Sxr3AgI?l49??8 z(bC+~JUBbp$dXDRG*-R!Ez?^ji_K!Z51I%26K}J(!45%3(4j-`7{?gLFXYtx1nRk{ z2BKN|H=S=fO`tQ&4p{G8@9g33;SS@)a*zEUWBu1TV32i?b%t$*?QOivqp^JHF-?>T)hL@Z(o96 z$obVw+X?##V^7oPr@&d@+-Kis=xuafQ6IVk9=eO%i`;Lx-f(^H{MGo^d0nipN5A}ai*cQwY8y{J!C#)mZn0wDeb@7d-j_5n(JEYTJ?Nvux~K@ zADZGpyaDw4O4D|$?N;OWx6wDR0v@PI)^j7g`Q!~JuQ@G_HJvq$K2A?OnDu*Zh5uat z8T0PjoZC2Y&UMP0;05Ok&PwP5--WuMp6gub!@T6@)SyzJeO^APU)jF0>1Y0l9D*ij zM)e$Omh!myxKTfrMo-UsV@qR;Ho5_p0hTTJU1{BjTjSPe@DDiVJm%Cnwj4N$89=e>$88}dfuw@vd&^J@`|5_ zw;XRd^m$&vTtr=aUBkb0INBMlbv>zs+E7{`pl)X|1SH zZ8=cWQPZK<}@6dB^pR zi;^xAslVc0aN5BmYt(Y2$?9b3WNBq;Wm5fmF1{Zv;SW5wbe7fcq>NAP13uV=FXKdJ zMawgnaLjzn@ch)8f1FwJHl{YFhL(nwQrJiDT>F2-95LpR4w7rR$h64FEL&t*WZ6po ziE2mVnN9y2jY$=zfuv1Vomct-9s1Qz)}4MpYJf4%s5+5q7^?aHPBx;N(k0C=zUN&`{b)0%{hJ&7;-|&gNk8HFf_+6gHck__*kn=2>xr@$= z&O%2atHJY*d}qGlQ?tss%GuV{)}`L=CHyk<+~4ZF)tG(Iexf_s57gxKENSmh-Bjm| z!|)#S3$1LeY~Apc(0@ux{0=;iU&l_e6dIcwn@^Lka}ocKpfzZ{h{xDT_!R%efFs}- z>Ky890_&g^909Gz(v{xu-0+O|j`tD);5pzuVECi1@~rZ#B`dPGr?+RdcePg@gC|`l zjd_?R-X`80PmV`M7$+Sk9nwwdj;q&8``$eCsJ%gbjfK{QR08W+`-1MoUoivpI{DI% zGfy%Vv_9X>T*O7kMTdNY5|D9bobpvx9Uus*b$sRj%KuW%OF0*z1AL$ReJ(QT{GE9_ z^RTVW>zUs(U-_N`U}*l({B~rMZ7RE|?C3J1%e;~QM!s^xByM{o|B?JMfigTjt^jf* zBVR_Ih|<`~JAasan0v2duj8EkoUyjvZ@b_2fc*ixG++8mOob+nCXUwj*6ai=?Rx)o zcil|x`G3~`P~B~`>iI6~EX&Te%lU=l3&W@8Z`a>A9vw!B_J3M5Y1lMJauehQN(+ia zucmJ4-Pd~8;)q`Aec$sw)t%&K7rHc#6@(wZ9*-M{hYe5O0V%N+>H;M_I=HG48=pOBXh0#yy-mlBaA}Nt#ifq z*6*$R$;mB3HzM7kw3cZ&NhZ-z=!t*C_Uv|}pQ}Apz2N2Os_tffwll(s4hy4qm84QaS29)(I-GY)W<`|L(067 z9_euCaOkecU6G2him@4>{-^q(WAR7f_!d2ZCrVRt6E!*Zov3B?dPsMsFP+L>?*nKQ^*hOpXqPR)!$Dx(KvjG{GdLY?jF*P z{gnPGtv*dP(EnbBSsndeI-kD{Tk%<)kC*fk@!6U!mH^#1JcFU^3?KNb6s;O59A@=LpnP6 z=6UAn@g;?ziATQ7sykkBU2$y!tyTKW{>+){DbOZ2np`x^D%FQ0_<6L#V-|ZOBWqr> zQyb(H$yeo6<&^qwnt2}#BVi4m1r~e)^*ZV^kOxoVFL}Uxz&sEve95CncaNiJVeTe_ zHsA~x_lbV^Bs}PN&~X7D4V_V1z&2*@&XWzPeM|4TX6QaZL!#P^?yo+R4_ByWCiTPm zTl!n-<1wN=^$Yx8RlgZx8e(|c{(!gQPs~l~J$Mx?Af2Vo8mcFL2RGpk%N>>{(OWD- z<7VTKc!Mxj-8)n-OV|>)Ixe(Hr>i~ve)s+EZ(ZNI9&tW`;%p=8*8iM2jvU8G`$+qb zpqZQ7L1&xC@Y&VA-2<9}^e=1hP#p#3LH9ge463K9rv|168g+Lq(CR}Thj+-lx-EWN z{BR7ShokDJJOdH*QB_h^QtDk!OHE6?%iQoc>2K0ncbcHzKEb4h?n?(?0rR|1+McvM zV}Hi3-@yse%&Lcd3|^*gtTkvge2EYCU0^j?jeP8P>3PVvWmRUCk%KCaud<-^rvQVf z<;msA%lJ98jFfpax{$_D>!I{by1(j~ei*(teQ%t5bgt}d>uh_${(}8+dSx7EIL&`$ zUus)Qy7^VZi*kx}idA>UkDvyciJs9p~z7ZKGOE|Yon9jLyi zzP|pP?l#i3b%jQ@MmE(dx;VQy<&!tnIo0_C=#DHOzR6Gpq4tdz!$qb72*42U4 zf$}-!bNEc2}#?>w{-K&w3c`_MY~f_SEs#A&qOI7kg9ho1Qm4x4Uo0o%@EnqOYP)vp0Xa z|8gs%^fV0c4KVa?_3%Jm=v!#q2|o6G?Ah$y?A_+x#-F_1Ee|~9=JfXW_SYpFC*TYC z7J)qe)Kos>KjW9!ZajW~Z{)s_D_uIHe(bil`cU8bTI96Ixe~Y%nChSEU*lWjE9Wie z)!!i>|8GFLJDp+V9jO_!^LQY(@VD@5=&XakgK<9p*!Qtdd%fm_i0=q&1nH6Ldh2>u z0wq?za!t1SxB4geCipISE_rTxZ+g!|7k3x;9MJmtFWH}(3G3nQ;jQGWxd@G#5=D_V5zF)N`btYjW#A3n&^E8l=#mR^?Xp!>gS8#AmktoNGlHLn8w z`v+|YZR@P-tS^&Epmjj^MAad-Kv!xoy6;v%BUj5-%cgbgIXvy9op};YKtppw^ZU$q zs1AA#ZEkz|xKq&YF2wKfap()u@+LvOmBE}$KLgc~RzMi;g3WmNR3{76?QlEF*~{5g z2OHrU;riS8H}0K3I+weayQD#T()Fb4F6JAtm~rj!?C{(T%HlZ#@)VM1(39>b-325E z=sc?VMAaaA;K88pGar8`?IEg}Ey1UJ7xRMKZQE@PLFaw#Q>q(lws{XTH4f0MxU@jJ z!$~_XU4!-x_2H#Wc_;Bsq5}+%50CEz^;zFazLmTR^8A*^aI;LajPy56=%4$TkC7I! z9ka62pf|WPZcbBQW;F931nCan!&l%hG98bT+5HRbhJm0yUYBH-pm(JWmC;@H1{?to{E4TPdWS#ZFEQOb-MkiE_(eDg>T{kTpFwN7UL&0y z()P6dS;w=E_vp>(4lu|w$fLXXDBmbwc{u4k>D3*51#E$}fwh4FIRlJ)PB1sfQ+6a* z>yOshDtT4%wB{-c_@w_NPwpE3yuiFbe>jBqsLoc>`>N(~n5;G3_uQabXe(w{N7_c( zT7u4L`nj(_5wjaVnSL_O%g)Q{JW`!Gs&1KX8EJm&;nQ(9NdNH}$P=P7e$KCe{|}Y;dSBmApex*um>*TxiSep0_C$bh4W}~G#977 zQQe}tMG~m+V->v!w-w%2_%<9WK2+QXKbkv>?kxJK@S{S;3W}9!{Uy8?d@uOF(Eo6| zcqgp{Gu($y6%y%;^dY);d=1@TUvi(3 z2P2J=e(z6{pC(TyP8&X{-SCavjAzIn@Cmc_55QlrJhdFhus*2=(9<`7f0>tSl4_Fr z5Iy{A{MhPd>t=Ok)9d#UvkZF1HAm7G{!aXD)-8)Ep8KSxgO(B#nMYl+tqd1Ra$>k6~>P2mrawn%5Z%OH*QipYw{ zWAVr0hrt%J8NM%Xp`oq>FEd}WG`=*hn$lW4^16Z64BfMwFbAhEtw*bvE!3U)Z@9_4 z^a|$1yE9|-BMiVFe>}OE6PdfzY|ABRh`*@n)=!w8F#Ph~!OvYilY27vWL`?Yl-52s z7Qd;t$k+Nf{c-v%zE;2E;dKb4QM?;k;H|zZy35Fm|2Oh4$)Nu;G+)Xsn-iK7+8f*( z{37&4=v$B$w zPyU+QnQ(0$YaW{tor0Ufg6NglmDo4X0d_)Hkkj@XXa+wr&KbrN+Fi{p#q zE6FmJrmaP!1*woDBD-Nc@-PaHm4^1|MB+r^Z2W9|d}6%upK4G{ z1L?%R4t*U81w+9);W~!blYBkrmCP%7viQkjX$GqWs~LH`14;&zbb`gDi%TOVk&<_c z-zgpmn~F9SHNn5UT(DelH2hQgkCDA}hlxa4>W*q&zEmx&8tA`zL^O z+_}kI<2li1Hk-&M-lhI2J?NP9m~?I?H}hZWzm(ql75KdAo;H~oIMtwUN#A1VSGuFu zrOagtXTlljThuSrISoMwWMo_^rTqEm;77&Z}D$MzZGdOQy%CKH-ES}@Y=v@SbbmJeSP=! zNjE0l`25=Eigmr#^J>qlm7&Y^F4sSVTcK4!tAdV&9SfCLKB#C=(aWVTmkui#R&ogX zh5Cj5iTo2;j*o3I89f&w7a~{USK>37hta-0IyD-V(kxEHH*i3ikUEbym+s{{lO<9K z!*}(s%wHMRlU^Y|_aXCKsaPte?6c z3|;}P1=2=JbNM|PCX-WP+rfwAo%{|Tp@G(Ow-#PS@5dD*qrG8nW^Tqw zkzDIs5#BZKv^)I-bZ7oYpP3`*26f)QhCXBuUc}OV_roJt2W0i7|49Flt_Kfg9?Aq5 zhH8N3_zUKorodwRVk)(pHI8MMFSqLSJsdq8noACW?%(=%E`WMW>VZiU)Ecj$_Z;sz zhC7ElUw6IkQg)W^sbxK7J>TFn�g8Pw$`Jh%17EYL{!OXR1g357K$b@3S*Vx4)X6 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

pyCL+CcX+ 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

dW!v>?8R(Hz(J4PptK?^*rgD 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

hp?I%k@Q}g&8!5?^`w(t7Fwon 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 Date: Thu, 11 Dec 2014 14:12:41 -0500 Subject: [PATCH 264/310] ReplayGain analysis in airtime_analyzer using python-rgain * Implemented Replaygain analysis for Ogg Vorbis, MP3, MP4, and FLAC using python-rgain * Added unit tests for ReplayGainAnalyzer * Squashed stderr output in ReplayGainAnalyzer and CuePointAnalyzer * Clean up --- .../airtime_analyzer/analyzer_pipeline.py | 2 + .../airtime_analyzer/cuepoint_analyzer.py | 5 +- .../airtime_analyzer/replaygain_analyzer.py | 33 ++++---- python_apps/airtime_analyzer/setup.py | 1 + .../tests/cuepoint_analyzer_tests.py | 13 ---- .../tests/replaygain_analyzer_tests.py | 71 ++++++++++++++++++ .../44100Hz-16bit-mp3-missingid3header.mp3 | Bin 0 -> 87286 bytes 7 files changed, 89 insertions(+), 36 deletions(-) create mode 100644 python_apps/airtime_analyzer/tests/replaygain_analyzer_tests.py create mode 100644 python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-mp3-missingid3header.mp3 diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 00421ffeac..e1393defb5 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -6,6 +6,7 @@ from metadata_analyzer import MetadataAnalyzer from filemover_analyzer import FileMoverAnalyzer from cuepoint_analyzer import CuePointAnalyzer +from replaygain_analyzer import ReplayGainAnalyzer class AnalyzerPipeline: """ Analyzes and imports an audio file into the Airtime library. @@ -53,6 +54,7 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): metadata = dict() metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) metadata = CuePointAnalyzer.analyze(audio_file_path, metadata) + metadata = ReplayGainAnalyzer.analyze(audio_file_path, metadata) metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) metadata["import_status"] = 0 # Successfully imported diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py index 70e26cda42..b5492ebe9f 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py @@ -11,9 +11,6 @@ class CuePointAnalyzer(Analyzer): SILAN_EXECUTABLE = 'silan' - def __init__(self): - pass - @staticmethod def analyze(filename, metadata): ''' Extracts the cue-in and cue-out times along and sets the file duration based on that. @@ -29,7 +26,7 @@ def analyze(filename, metadata): ''' command = [CuePointAnalyzer.SILAN_EXECUTABLE, '-b', '-F', '0.99', '-f', 'JSON', filename] try: - results_json = subprocess.check_output(command) + results_json = subprocess.check_output(command, stderr=subprocess.STDOUT) silan_results = json.loads(results_json) metadata['length_seconds'] = float(silan_results['file duration']) # Conver the length into a formatted time string diff --git a/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py index d7254e530f..2e832bb921 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py @@ -1,14 +1,12 @@ import subprocess +import logging from analyzer import Analyzer class ReplayGainAnalyzer(Analyzer): - ''' This class extracts the cue-in time, cue-out time, and length of a track using silan. ''' + ''' This class extracts the ReplayGain using a tool from the python-rgain package. ''' - BG1770GAIN_EXECUTABLE = 'bg1770gain' - - def __init__(self): - pass + REPLAYGAIN_EXECUTABLE = 'replaygain' # From the python-rgain package @staticmethod def analyze(filename, metadata): @@ -17,23 +15,20 @@ def analyze(filename, metadata): :param metadata: A metadata dictionary where the results will be put :return: The metadata dictionary ''' - ''' The -d 00:01:00 flag means it will let the decoding run for a maximum of 1 minute. This is a safeguard - in case the libavcodec decoder gets stuck in an infinite loop. + ''' The -d flag means do a dry-run, ie. don't modify the file directly. ''' - command = [ReplayGainAnalyzer.BG1770GAIN_EXECUTABLE, '--replaygain', '-d', '00:01:00', '-f', 'JSON', filename] + command = [ReplayGainAnalyzer.REPLAYGAIN_EXECUTABLE, '-d', filename] try: - results_json = subprocess.check_output(command) - silan_results = json.loads(results_json) - metadata['length_seconds'] = float(silan_results['file duration']) - # Conver the length into a formatted time string - track_length = datetime.timedelta(seconds=metadata['length_seconds']) - metadata["length"] = str(track_length) - metadata['cuein'] = silan_results['sound'][0][0] - metadata['cueout'] = silan_results['sound'][0][1] + results = subprocess.check_output(command, stderr=subprocess.STDOUT) + filename_token = "%s: " % filename + rg_pos = results.find(filename_token, results.find("Calculating Replay Gain information")) + len(filename_token) + db_pos = results.find(" dB", rg_pos) + replaygain = results[rg_pos:db_pos] + metadata['replaygain'] = float(replaygain) - except OSError as e: # silan was not found - logging.warn("Failed to run: %s - %s. %s" % (command[0], e.strerror, "Do you have silan installed?")) - except subprocess.CalledProcessError as e: # silan returned an error code + except OSError as e: # replaygain was not found + logging.warn("Failed to run: %s - %s. %s" % (command[0], e.strerror, "Do you have python-rgain installed?")) + except subprocess.CalledProcessError as e: # replaygain returned an error code logging.warn("%s %s %s", e.cmd, e.message, e.returncode) except Exception as e: logging.warn(e) diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index 0816f8d146..21bb8b95ee 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -29,6 +29,7 @@ 'mock', 'python-daemon', 'requests', + 'rgain', # These next 3 are required for requests to support SSL with SNI. Learned this the hard way... # What sucks is that GCC is required to pip install these. #'ndg-httpsclient', diff --git a/python_apps/airtime_analyzer/tests/cuepoint_analyzer_tests.py b/python_apps/airtime_analyzer/tests/cuepoint_analyzer_tests.py index 676525d7bc..a55b6ee983 100644 --- a/python_apps/airtime_analyzer/tests/cuepoint_analyzer_tests.py +++ b/python_apps/airtime_analyzer/tests/cuepoint_analyzer_tests.py @@ -1,10 +1,6 @@ from nose.tools import * from airtime_analyzer.cuepoint_analyzer import CuePointAnalyzer -def test_constructor(): - cpa = CuePointAnalyzer() - - def check_default_metadata(metadata): ''' Check that the values extract by Silan/CuePointAnalyzer on our test audio files match what we expect. :param metadata: a metadata dictionary @@ -65,12 +61,3 @@ def test_m4a_stereo(): def test_wav_stereo(): metadata = CuePointAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.wav', dict()) check_default_metadata(metadata) - - # FFMPEG / libav detect the AAC file as slightly shorter... -''' - tolerance_seconds = 0.2 - length_seconds = 3.8 - assert abs(metadata['length_seconds'] - length_seconds) < tolerance_seconds - assert abs(metadata['cuein']) < tolerance_seconds - assert abs(metadata['cueout'] - length_seconds) < tolerance_seconds -''' \ No newline at end of file diff --git a/python_apps/airtime_analyzer/tests/replaygain_analyzer_tests.py b/python_apps/airtime_analyzer/tests/replaygain_analyzer_tests.py new file mode 100644 index 0000000000..c058e84ad0 --- /dev/null +++ b/python_apps/airtime_analyzer/tests/replaygain_analyzer_tests.py @@ -0,0 +1,71 @@ +from nose.tools import * +from airtime_analyzer.replaygain_analyzer import ReplayGainAnalyzer + +def check_default_metadata(metadata): + ''' Check that the values extract by Silan/CuePointAnalyzer on our test audio files match what we expect. + :param metadata: a metadata dictionary + :return: Nothing + ''' + ''' + # We give python-rgain some leeway here by specifying a tolerance. It's not perfectly consistent across codecs... + assert abs(metadata['cuein']) < tolerance_seconds + assert abs(metadata['cueout'] - length_seconds) < tolerance_seconds + ''' + tolerance = 0.30 + expected_replaygain = 5.0 + print metadata['replaygain'] + assert abs(metadata['replaygain'] - expected_replaygain) < tolerance + +def test_missing_replaygain(): + old_rg = ReplayGainAnalyzer.REPLAYGAIN_EXECUTABLE + ReplayGainAnalyzer.REPLAYGAIN_EXECUTABLE = 'foosdaf' + metadata = ReplayGainAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo-utf8.mp3', dict()) + ReplayGainAnalyzer.REPLAYGAIN_EXECUTABLE = old_rg # Need to put this back + +def test_invalid_filepath(): + metadata = ReplayGainAnalyzer.analyze(u'non-existent-file', dict()) + + +def test_mp3_utf8(): + metadata = ReplayGainAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo-utf8.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_dualmono(): + metadata = ReplayGainAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-dualmono.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_jointstereo(): + metadata = ReplayGainAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-jointstereo.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_simplestereo(): + metadata = ReplayGainAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-simplestereo.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_stereo(): + metadata = ReplayGainAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_mono(): + metadata = ReplayGainAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-mono.mp3', dict()) + check_default_metadata(metadata) + +def test_ogg_stereo(): + metadata = ReplayGainAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.ogg', dict()) + check_default_metadata(metadata) + +def test_invalid_wma(): + metadata = ReplayGainAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo-invalid.wma', dict()) + +def test_mp3_missing_id3_header(): + metadata = ReplayGainAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-mp3-missingid3header.mp3', dict()) + +def test_m4a_stereo(): + metadata = ReplayGainAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.m4a', dict()) + check_default_metadata(metadata) + +''' WAVE is not supported by python-rgain yet +def test_wav_stereo(): + metadata = ReplayGainAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.wav', dict()) + check_default_metadata(metadata) +''' \ No newline at end of file diff --git a/python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-mp3-missingid3header.mp3 b/python_apps/airtime_analyzer/tests/test_data/44100Hz-16bit-mp3-missingid3header.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0e7181f64cf55eabf612e97be33359faf7c55857 GIT binary patch literal 87286 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

<&sG|%vQxt^L!j!`sai5d?O&Z;QgT!Qis(^ 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 z�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 literal 0 HcmV?d00001 From 3b1c776879ca6bd693a8bc2580462a33e9448bcf Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 11 Dec 2014 14:26:05 -0500 Subject: [PATCH 265/310] Removed all ReplayGain and Silan stuff from pypo, plus a bugfix * Ripped out all the ReplayGain and Silan analysis from pypo, since it's now implemented in airtime_analyzer. This fixes a bunch of race conditions. * Also renamed the replaygain field to replay_gain in airtime_analyzer to match Airtime. --- .../airtime_analyzer/replaygain_analyzer.py | 2 +- .../tests/replaygain_analyzer_tests.py | 4 +- python_apps/pypo/media/__init__.py | 0 python_apps/pypo/media/update/__init__.py | 0 python_apps/pypo/media/update/replaygain.py | 161 ------------------ .../pypo/media/update/replaygainupdater.py | 86 ---------- .../pypo/media/update/silananalyzer.py | 94 ---------- python_apps/pypo/pypocli.py | 7 - 8 files changed, 3 insertions(+), 351 deletions(-) delete mode 100644 python_apps/pypo/media/__init__.py delete mode 100644 python_apps/pypo/media/update/__init__.py delete mode 100644 python_apps/pypo/media/update/replaygain.py delete mode 100644 python_apps/pypo/media/update/replaygainupdater.py delete mode 100644 python_apps/pypo/media/update/silananalyzer.py diff --git a/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py index 2e832bb921..396d0d5ade 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py @@ -24,7 +24,7 @@ def analyze(filename, metadata): rg_pos = results.find(filename_token, results.find("Calculating Replay Gain information")) + len(filename_token) db_pos = results.find(" dB", rg_pos) replaygain = results[rg_pos:db_pos] - metadata['replaygain'] = float(replaygain) + metadata['replay_gain'] = float(replaygain) except OSError as e: # replaygain was not found logging.warn("Failed to run: %s - %s. %s" % (command[0], e.strerror, "Do you have python-rgain installed?")) diff --git a/python_apps/airtime_analyzer/tests/replaygain_analyzer_tests.py b/python_apps/airtime_analyzer/tests/replaygain_analyzer_tests.py index c058e84ad0..c9e98bfb33 100644 --- a/python_apps/airtime_analyzer/tests/replaygain_analyzer_tests.py +++ b/python_apps/airtime_analyzer/tests/replaygain_analyzer_tests.py @@ -13,8 +13,8 @@ def check_default_metadata(metadata): ''' tolerance = 0.30 expected_replaygain = 5.0 - print metadata['replaygain'] - assert abs(metadata['replaygain'] - expected_replaygain) < tolerance + print metadata['replay_gain'] + assert abs(metadata['replay_gain'] - expected_replaygain) < tolerance def test_missing_replaygain(): old_rg = ReplayGainAnalyzer.REPLAYGAIN_EXECUTABLE diff --git a/python_apps/pypo/media/__init__.py b/python_apps/pypo/media/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/python_apps/pypo/media/update/__init__.py b/python_apps/pypo/media/update/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/python_apps/pypo/media/update/replaygain.py b/python_apps/pypo/media/update/replaygain.py deleted file mode 100644 index 431933bda5..0000000000 --- a/python_apps/pypo/media/update/replaygain.py +++ /dev/null @@ -1,161 +0,0 @@ -from subprocess import Popen, PIPE -import re -import os -import sys -import shutil -import tempfile -import logging - - -logger = logging.getLogger() - -def get_process_output(command): - """ - Run subprocess and return stdout - """ - logger.debug(command) - p = Popen(command, stdout=PIPE, stderr=PIPE) - return p.communicate()[0].strip() - -def run_process(command): - """ - Run subprocess and return "return code" - """ - p = Popen(command, stdout=PIPE, stderr=PIPE) - return os.waitpid(p.pid, 0)[1] - -def get_mime_type(file_path): - """ - Attempts to get the mime type but will return prematurely if the process - takes longer than 5 seconds. Note that this function should only be called - for files which do not have a mp3/ogg/flac extension. - """ - - command = ['timeout', '5', 'file', '-b', '--mime-type', file_path] - return get_process_output(command) - -def duplicate_file(file_path): - """ - Makes a duplicate of the file and returns the path of this duplicate file. - """ - fsrc = open(file_path, 'r') - fdst = tempfile.NamedTemporaryFile(delete=False) - - logger.info("Copying %s to %s" % (file_path, fdst.name)) - - shutil.copyfileobj(fsrc, fdst) - - fsrc.close() - fdst.close() - - return fdst.name - -def get_file_type(file_path): - file_type = None - if re.search(r'mp3$', file_path, re.IGNORECASE): - file_type = 'mp3' - elif re.search(r'og(g|a)$', file_path, re.IGNORECASE): - file_type = 'vorbis' - elif re.search(r'm4a$', file_path, re.IGNORECASE): - file_type = 'mp4' - elif re.search(r'flac$', file_path, re.IGNORECASE): - file_type = 'flac' - else: - mime_type = get_mime_type(file_path) - if 'mpeg' in mime_type: - file_type = 'mp3' - elif 'ogg' in mime_type: - file_type = 'vorbis' - elif 'mp4' in mime_type: - file_type = 'mp4' - elif 'flac' in mime_type: - file_type = 'flac' - - return file_type - - -def calculate_replay_gain(file_path): - """ - This function accepts files of type mp3/ogg/flac and returns a calculated - ReplayGain value in dB. - If the value cannot be calculated for some reason, then we default to 0 - (Unity Gain). - - http://wiki.hydrogenaudio.org/index.php?title=ReplayGain_1.0_specification - """ - - try: - """ - Making a duplicate is required because the ReplayGain extraction utilities we use - make unwanted modifications to the file. - """ - - search = None - temp_file_path = duplicate_file(file_path) - - file_type = get_file_type(file_path) - nice_level = '19' - - if file_type: - if file_type == 'mp3': - if run_process(['which', 'mp3gain']) == 0: - command = ['nice', '-n', nice_level, 'mp3gain', '-q', temp_file_path] - out = get_process_output(command) - search = re.search(r'Recommended "Track" dB change: (.*)', \ - out) - else: - logger.warn("mp3gain not found") - elif file_type == 'vorbis': - if run_process(['which', 'ogginfo']) == 0 and \ - run_process(['which', 'vorbisgain']) == 0: - command = ['nice', '-n', nice_level, 'vorbisgain', '-q', '-f', temp_file_path] - run_process(command) - - out = get_process_output(['ogginfo', temp_file_path]) - search = re.search(r'REPLAYGAIN_TRACK_GAIN=(.*) dB', out) - else: - logger.warn("vorbisgain/ogginfo not found") - elif file_type == 'mp4': - if run_process(['which', 'aacgain']) == 0: - command = ['nice', '-n', nice_level, 'aacgain', '-q', temp_file_path] - out = get_process_output(command) - search = re.search(r'Recommended "Track" dB change: (.*)', \ - out) - else: - logger.warn("aacgain not found") - elif file_type == 'flac': - if run_process(['which', 'metaflac']) == 0: - - command = ['nice', '-n', nice_level, 'metaflac', \ - '--add-replay-gain', temp_file_path] - run_process(command) - - command = ['nice', '-n', nice_level, 'metaflac', \ - '--show-tag=REPLAYGAIN_TRACK_GAIN', \ - temp_file_path] - out = get_process_output(command) - search = re.search(r'REPLAYGAIN_TRACK_GAIN=(.*) dB', out) - else: logger.warn("metaflac not found") - - except Exception, e: - logger.error(str(e)) - finally: - #no longer need the temp, file simply remove it. - try: os.remove(temp_file_path) - except: pass - - replay_gain = 0 - if search: - matches = search.groups() - if len(matches) == 1: - replay_gain = matches[0] - else: - logger.warn("Received more than 1 match in: '%s'" % str(matches)) - - return replay_gain - - -# Example of running from command line: -# python replay_gain.py /path/to/filename.mp3 -if __name__ == "__main__": - print calculate_replay_gain(sys.argv[1]) diff --git a/python_apps/pypo/media/update/replaygainupdater.py b/python_apps/pypo/media/update/replaygainupdater.py deleted file mode 100644 index c1123f4a8c..0000000000 --- a/python_apps/pypo/media/update/replaygainupdater.py +++ /dev/null @@ -1,86 +0,0 @@ -from threading import Thread - -import traceback -import os -import time -import logging - -from media.update import replaygain - -class ReplayGainUpdater(Thread): - """ - The purpose of the class is to query the server for a list of files which - do not have a ReplayGain value calculated. This class will iterate over the - list, calculate the values, update the server and repeat the process until - the server reports there are no files left. - - This class will see heavy activity right after a 2.1->2.2 upgrade since 2.2 - introduces ReplayGain normalization. A fresh install of Airtime 2.2 will - see this class not used at all since a file imported in 2.2 will - automatically have its ReplayGain value calculated. - """ - - @staticmethod - def start_reply_gain(apc): - me = ReplayGainUpdater(apc) - me.daemon = True - me.start() - - def __init__(self,apc): - Thread.__init__(self) - self.api_client = apc - self.logger = logging.getLogger() - - def main(self): - raw_response = self.api_client.list_all_watched_dirs() - if 'dirs' not in raw_response: - self.logger.error("Could not get a list of watched directories \ - with a dirs attribute. Printing full request:") - self.logger.error( raw_response ) - return - - directories = raw_response['dirs'] - - for dir_id, dir_path in directories.iteritems(): - try: - # keep getting few rows at a time for current music_dir (stor - # or watched folder). - total = 0 - while True: - # return a list of pairs where the first value is the - # file's database row id and the second value is the - # filepath - files = self.api_client.get_files_without_replay_gain_value(dir_id) - processed_data = [] - for f in files: - full_path = os.path.join(dir_path, f['fp']) - processed_data.append((f['id'], replaygain.calculate_replay_gain(full_path))) - total += 1 - - try: - if len(processed_data): - self.api_client.update_replay_gain_values(processed_data) - except Exception as e: - self.logger.error(e) - self.logger.debug(traceback.format_exc()) - - if len(files) == 0: break - self.logger.info("Processed: %d songs" % total) - - except Exception, e: - self.logger.error(e) - self.logger.debug(traceback.format_exc()) - def run(self): - while True: - try: - self.logger.info("Running replaygain updater") - self.main() - # Sleep for 5 minutes in case new files have been added - except Exception, e: - self.logger.error('ReplayGainUpdater Exception: %s', traceback.format_exc()) - self.logger.error(e) - time.sleep(60 * 5) - -if __name__ == "__main__": - rgu = ReplayGainUpdater() - rgu.main() diff --git a/python_apps/pypo/media/update/silananalyzer.py b/python_apps/pypo/media/update/silananalyzer.py deleted file mode 100644 index e0b98a5b05..0000000000 --- a/python_apps/pypo/media/update/silananalyzer.py +++ /dev/null @@ -1,94 +0,0 @@ -from threading import Thread - -import traceback -import time -import subprocess -import json - - -class SilanAnalyzer(Thread): - """ - The purpose of the class is to query the server for a list of files which - do not have a Silan value calculated. This class will iterate over the - list calculate the values, update the server and repeat the process until - the server reports there are no files left. - """ - - @staticmethod - def start_silan(apc, logger): - me = SilanAnalyzer(apc, logger) - me.start() - - def __init__(self, apc, logger): - Thread.__init__(self) - self.api_client = apc - self.logger = logger - - def main(self): - while True: - # keep getting few rows at a time for current music_dir (stor - # or watched folder). - total = 0 - - # return a list of pairs where the first value is the - # file's database row id and the second value is the - # filepath - files = self.api_client.get_files_without_silan_value() - total_files = len(files) - if total_files == 0: return - processed_data = [] - for f in files: - full_path = f['fp'] - # silence detect(set default queue in and out) - try: - data = {} - command = ['nice', '-n', '19', 'silan', '-b', '-f', 'JSON', full_path] - try: - proc = subprocess.Popen(command, stdout=subprocess.PIPE) - comm = proc.communicate() - if len(comm): - out = comm[0].strip('\r\n') - info = json.loads(out) - try: data['length'] = str('{0:f}'.format(info['file duration'])) - except: pass - try: data['cuein'] = str('{0:f}'.format(info['sound'][0][0])) - except: pass - try: data['cueout'] = str('{0:f}'.format(info['sound'][-1][1])) - except: pass - except Exception, e: - self.logger.warn(str(command)) - self.logger.warn(e) - processed_data.append((f['id'], data)) - total += 1 - if total % 5 == 0: - self.logger.info("Total %s / %s files has been processed.." % (total, total_files)) - except Exception, e: - self.logger.error(e) - self.logger.error(traceback.format_exc()) - - try: - self.api_client.update_cue_values_by_silan(processed_data) - except Exception ,e: - self.logger.error(e) - self.logger.error(traceback.format_exc()) - - self.logger.info("Processed: %d songs" % total) - - def run(self): - while True: - try: - self.logger.info("Running Silan analyzer") - self.main() - except Exception, e: - self.logger.error('Silan Analyzer Exception: %s', traceback.format_exc()) - self.logger.error(e) - self.logger.info("Sleeping for 5...") - time.sleep(60 * 5) - -if __name__ == "__main__": - from api_clients import api_client - import logging - logging.basicConfig(level=logging.DEBUG) - api_client = api_client.AirtimeApiClient() - SilanAnalyzer.start_silan(api_client, logging) - diff --git a/python_apps/pypo/pypocli.py b/python_apps/pypo/pypocli.py index e0208e83a2..62d95ad6c5 100644 --- a/python_apps/pypo/pypocli.py +++ b/python_apps/pypo/pypocli.py @@ -27,9 +27,6 @@ from pypoliquidsoap import PypoLiquidsoap from timeout import ls_timeout -from media.update.replaygainupdater import ReplayGainUpdater -from media.update.silananalyzer import SilanAnalyzer - from configobj import ConfigObj # custom imports @@ -250,10 +247,6 @@ def liquidsoap_startup_test(): g.test_api() sys.exit(0) - - ReplayGainUpdater.start_reply_gain(api_client) - SilanAnalyzer.start_silan(api_client, logger) - pypoFetch_q = Queue() recorder_q = Queue() pypoPush_q = Queue() From dbfb2fc69bbb06419ec198fedb85c192ff6cff75 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 11 Dec 2014 15:45:45 -0500 Subject: [PATCH 266/310] CC-5739: Added Liquidsoap playability test to airtime_analyzer --- .../airtime_analyzer/analyzer_pipeline.py | 7 +++ .../airtime_analyzer/playability_analyzer.py | 32 ++++++++++ .../tests/playability_analyzer_tests.py | 61 +++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/playability_analyzer.py create mode 100644 python_apps/airtime_analyzer/tests/playability_analyzer_tests.py diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index e1393defb5..bf467c1902 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -7,6 +7,7 @@ from filemover_analyzer import FileMoverAnalyzer from cuepoint_analyzer import CuePointAnalyzer from replaygain_analyzer import ReplayGainAnalyzer +from playability_analyzer import * class AnalyzerPipeline: """ Analyzes and imports an audio file into the Airtime library. @@ -55,6 +56,7 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) metadata = CuePointAnalyzer.analyze(audio_file_path, metadata) metadata = ReplayGainAnalyzer.analyze(audio_file_path, metadata) + metadata = PlayabilityAnalyzer.analyze(audio_file_path, metadata) metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) metadata["import_status"] = 0 # Successfully imported @@ -64,6 +66,11 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): # Pass all the file metadata back to the main analyzer process, which then passes # it back to the Airtime web application. queue.put(metadata) + except UnplayableFileError as e: + logging.exception(e) + metadata["import_status"] = 2 + metadata["reason"] = "The file could not be played." + raise e except Exception as e: # Ensures the traceback for this child process gets written to our log files: logging.exception(e) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/playability_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/playability_analyzer.py new file mode 100644 index 0000000000..0a36562964 --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/playability_analyzer.py @@ -0,0 +1,32 @@ +__author__ = 'asantoni' + +import subprocess +import logging +from analyzer import Analyzer + +class UnplayableFileError(Exception): + pass + +class PlayabilityAnalyzer(Analyzer): + ''' This class checks if a file can actually be played with Liquidsoap. ''' + + LIQUIDSOAP_EXECUTABLE = 'liquidsoap' + + @staticmethod + def analyze(filename, metadata): + ''' Checks if a file can be played by Liquidsoap. + :param filename: The full path to the file to analyzer + :param metadata: A metadata dictionary where the results will be put + :return: The metadata dictionary + ''' + command = [PlayabilityAnalyzer.LIQUIDSOAP_EXECUTABLE, '-v', '-c', "output.dummy(audio_to_stereo(single('%s')))" % filename] + try: + subprocess.check_output(command, stderr=subprocess.STDOUT) + + except OSError as e: # liquidsoap was not found + logging.warn("Failed to run: %s - %s. %s" % (command[0], e.strerror, "Do you have liquidsoap installed?")) + except (subprocess.CalledProcessError, Exception) as e: # liquidsoap returned an error code + logging.warn(e) + raise UnplayableFileError + + return metadata diff --git a/python_apps/airtime_analyzer/tests/playability_analyzer_tests.py b/python_apps/airtime_analyzer/tests/playability_analyzer_tests.py new file mode 100644 index 0000000000..3864d6b406 --- /dev/null +++ b/python_apps/airtime_analyzer/tests/playability_analyzer_tests.py @@ -0,0 +1,61 @@ +from nose.tools import * +from airtime_analyzer.playability_analyzer import * + +def check_default_metadata(metadata): + ''' Stub function for now in case we need it later.''' + pass + +def test_missing_liquidsoap(): + old_ls = PlayabilityAnalyzer.LIQUIDSOAP_EXECUTABLE + PlayabilityAnalyzer.LIQUIDSOAP_EXECUTABLE = 'foosdaf' + metadata = PlayabilityAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo-utf8.mp3', dict()) + PlayabilityAnalyzer.LIQUIDSOAP_EXECUTABLE = old_ls # Need to put this back + +@raises(UnplayableFileError) +def test_invalid_filepath(): + metadata = PlayabilityAnalyzer.analyze(u'non-existent-file', dict()) + +def test_mp3_utf8(): + metadata = PlayabilityAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo-utf8.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_dualmono(): + metadata = PlayabilityAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-dualmono.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_jointstereo(): + metadata = PlayabilityAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-jointstereo.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_simplestereo(): + metadata = PlayabilityAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-simplestereo.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_stereo(): + metadata = PlayabilityAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.mp3', dict()) + check_default_metadata(metadata) + +def test_mp3_mono(): + metadata = PlayabilityAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-mono.mp3', dict()) + check_default_metadata(metadata) + +def test_ogg_stereo(): + metadata = PlayabilityAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.ogg', dict()) + check_default_metadata(metadata) + +@raises(UnplayableFileError) +def test_invalid_wma(): + metadata = PlayabilityAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo-invalid.wma', dict()) + +def test_m4a_stereo(): + metadata = PlayabilityAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.m4a', dict()) + check_default_metadata(metadata) + +def test_wav_stereo(): + metadata = PlayabilityAnalyzer.analyze(u'tests/test_data/44100Hz-16bit-stereo.wav', dict()) + check_default_metadata(metadata) + +@raises(UnplayableFileError) +def test_unknown(): + metadata = PlayabilityAnalyzer.analyze(u'http://www.google.com', dict()) + check_default_metadata(metadata) \ No newline at end of file From e7a742dbf4f932d2925515e3edac2e3441296b35 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 12 Dec 2014 09:38:24 -0500 Subject: [PATCH 267/310] Fixed merge error --- python_apps/airtime_analyzer/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index f576d0409f..f9f47a31e0 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -28,7 +28,7 @@ 'coverage', 'mock', 'python-daemon', - 'requests' + 'requests', 'apache-libcloud', 'rgain', # These next 3 are required for requests to support SSL with SNI. Learned this the hard way... From 6de8bbe9679749cbe68894e699775cd5a38587b5 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 15 Dec 2014 12:27:51 -0500 Subject: [PATCH 268/310] SAAS-514: PYPO -> Tracks may not become ready in time for playout --- python_apps/pypo/pypoliquidsoap.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python_apps/pypo/pypoliquidsoap.py b/python_apps/pypo/pypoliquidsoap.py index 74211fddd1..62779200f9 100644 --- a/python_apps/pypo/pypoliquidsoap.py +++ b/python_apps/pypo/pypoliquidsoap.py @@ -48,11 +48,11 @@ def play(self, media_item): def handle_file_type(self, media_item): """ - Wait maximum 5 seconds (50 iterations) for file to become ready, + Wait 200 seconds (2000 iterations) for file to become ready, otherwise give up on it. """ iter_num = 0 - while not media_item['file_ready'] and iter_num < 50: + while not media_item['file_ready'] and iter_num < 2000: time.sleep(0.1) iter_num += 1 From 2af14e099b592a6959e9eae8619be649deb646c4 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 15 Dec 2014 12:49:13 -0500 Subject: [PATCH 269/310] SAAS-519: webstreams not being deleted --- airtime_mvc/application/controllers/WebstreamController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/controllers/WebstreamController.php b/airtime_mvc/application/controllers/WebstreamController.php index 8eb9a2ac5b..1d94923c31 100644 --- a/airtime_mvc/application/controllers/WebstreamController.php +++ b/airtime_mvc/application/controllers/WebstreamController.php @@ -88,7 +88,7 @@ public function deleteAction() public function isAuthorized($webstream_id) { $user = Application_Model_User::getCurrentUser(); - if ($user->isUserType(array(UTYPE_ADMIN, UTYPE_PROGRAM_MANAGER))) { + if ($user->isUserType(array(UTYPE_SUPERADMIN, UTYPE_ADMIN, UTYPE_PROGRAM_MANAGER))) { return true; } From 70a2190494cb58fb5fa9ffba4f40dde6a4b64c77 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 15 Dec 2014 17:18:02 -0500 Subject: [PATCH 270/310] Close file descriptors in airtime_analyzer before forking subprocesses --- .../airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py | 4 ++-- .../airtime_analyzer/airtime_analyzer/playability_analyzer.py | 2 +- .../airtime_analyzer/airtime_analyzer/replaygain_analyzer.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py index b5492ebe9f..6b461f050d 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py @@ -26,7 +26,7 @@ def analyze(filename, metadata): ''' command = [CuePointAnalyzer.SILAN_EXECUTABLE, '-b', '-F', '0.99', '-f', 'JSON', filename] try: - results_json = subprocess.check_output(command, stderr=subprocess.STDOUT) + results_json = subprocess.check_output(command, stderr=subprocess.STDOUT, close_fds=True) silan_results = json.loads(results_json) metadata['length_seconds'] = float(silan_results['file duration']) # Conver the length into a formatted time string @@ -42,4 +42,4 @@ def analyze(filename, metadata): except Exception as e: logging.warn(e) - return metadata \ No newline at end of file + return metadata diff --git a/python_apps/airtime_analyzer/airtime_analyzer/playability_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/playability_analyzer.py index 0a36562964..ec102eeb21 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/playability_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/playability_analyzer.py @@ -21,7 +21,7 @@ def analyze(filename, metadata): ''' command = [PlayabilityAnalyzer.LIQUIDSOAP_EXECUTABLE, '-v', '-c', "output.dummy(audio_to_stereo(single('%s')))" % filename] try: - subprocess.check_output(command, stderr=subprocess.STDOUT) + subprocess.check_output(command, stderr=subprocess.STDOUT, close_fds=True) except OSError as e: # liquidsoap was not found logging.warn("Failed to run: %s - %s. %s" % (command[0], e.strerror, "Do you have liquidsoap installed?")) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py index 396d0d5ade..39ea2e4397 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/replaygain_analyzer.py @@ -19,7 +19,7 @@ def analyze(filename, metadata): ''' command = [ReplayGainAnalyzer.REPLAYGAIN_EXECUTABLE, '-d', filename] try: - results = subprocess.check_output(command, stderr=subprocess.STDOUT) + results = subprocess.check_output(command, stderr=subprocess.STDOUT, close_fds=True) filename_token = "%s: " % filename rg_pos = results.find(filename_token, results.find("Calculating Replay Gain information")) + len(filename_token) db_pos = results.find(" dB", rg_pos) @@ -33,4 +33,4 @@ def analyze(filename, metadata): except Exception as e: logging.warn(e) - return metadata \ No newline at end of file + return metadata From ff0a685243e684460200a518c36b3fd2eb26ca46 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 16 Dec 2014 14:20:28 -0500 Subject: [PATCH 271/310] Updated propel models --- .../application/configs/classmap-airtime-conf.php | 7 ------- airtime_mvc/build/sql/schema.sql | 11 ----------- 2 files changed, 18 deletions(-) diff --git a/airtime_mvc/application/configs/classmap-airtime-conf.php b/airtime_mvc/application/configs/classmap-airtime-conf.php index 0c279aad1a..814429f76d 100644 --- a/airtime_mvc/application/configs/classmap-airtime-conf.php +++ b/airtime_mvc/application/configs/classmap-airtime-conf.php @@ -22,9 +22,6 @@ 'BaseCcLiveLog' => 'airtime/om/BaseCcLiveLog.php', 'BaseCcLiveLogPeer' => 'airtime/om/BaseCcLiveLogPeer.php', 'BaseCcLiveLogQuery' => 'airtime/om/BaseCcLiveLogQuery.php', - 'BaseCcLocale' => 'airtime/om/BaseCcLocale.php', - 'BaseCcLocalePeer' => 'airtime/om/BaseCcLocalePeer.php', - 'BaseCcLocaleQuery' => 'airtime/om/BaseCcLocaleQuery.php', 'BaseCcLoginAttempts' => 'airtime/om/BaseCcLoginAttempts.php', 'BaseCcLoginAttemptsPeer' => 'airtime/om/BaseCcLoginAttemptsPeer.php', 'BaseCcLoginAttemptsQuery' => 'airtime/om/BaseCcLoginAttemptsQuery.php', @@ -134,10 +131,6 @@ 'CcLiveLogPeer' => 'airtime/CcLiveLogPeer.php', 'CcLiveLogQuery' => 'airtime/CcLiveLogQuery.php', 'CcLiveLogTableMap' => 'airtime/map/CcLiveLogTableMap.php', - 'CcLocale' => 'airtime/CcLocale.php', - 'CcLocalePeer' => 'airtime/CcLocalePeer.php', - 'CcLocaleQuery' => 'airtime/CcLocaleQuery.php', - 'CcLocaleTableMap' => 'airtime/map/CcLocaleTableMap.php', 'CcLoginAttempts' => 'airtime/CcLoginAttempts.php', 'CcLoginAttemptsPeer' => 'airtime/CcLoginAttemptsPeer.php', 'CcLoginAttemptsQuery' => 'airtime/CcLoginAttemptsQuery.php', diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index 1efbc0768c..b5be331479 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -605,17 +605,6 @@ CREATE TABLE "cc_listener_count" ); ----------------------------------------------------------------------- - -DROP TABLE IF EXISTS "cc_locale" CASCADE; - -CREATE TABLE "cc_locale" -( - "id" serial NOT NULL, - "locale_code" VARCHAR(16) NOT NULL, - "locale_lang" VARCHAR(128) NOT NULL, - PRIMARY KEY ("id") -); - -- cc_playout_history ----------------------------------------------------------------------- From 7059820ca01df839b4c23a02d76709edb7f4ab92 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 16 Dec 2014 14:54:53 -0500 Subject: [PATCH 272/310] Add a comment about the proxy pattern --- .../application/cloud_storage/ProxyStorageBackend.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php b/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php index 78aeb1b355..651063367e 100644 --- a/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php +++ b/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php @@ -19,7 +19,10 @@ class ProxyStorageBackend extends StorageBackend public function ProxyStorageBackend($storageBackend) { $CC_CONFIG = Config::getConfig(); - + + //The storage backend in the airtime.conf directly corresponds to + //the name of the class that implements it (eg. Amazon_S3), so we + //can easily create the right backend object dynamically: $this->storageBackend = new $storageBackend($CC_CONFIG[$storageBackend]); } From 1de326283ea5229a994b2b5a29cc2589b5a3ed2e Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 16 Dec 2014 18:47:42 -0500 Subject: [PATCH 273/310] SAAS-527: Allow files to be uploaded to either the cloud or on local file storage Not quite done. --- airtime_mvc/application/configs/conf.php | 4 ++++ airtime_mvc/application/models/RabbitMq.php | 3 ++- .../modules/rest/controllers/MediaController.php | 13 +++++++++---- .../airtime_analyzer/analyzer_pipeline.py | 12 ++++++++---- .../airtime_analyzer/message_listener.py | 9 ++++++--- 5 files changed, 29 insertions(+), 12 deletions(-) diff --git a/airtime_mvc/application/configs/conf.php b/airtime_mvc/application/configs/conf.php index 932834fe30..6b6273a228 100644 --- a/airtime_mvc/application/configs/conf.php +++ b/airtime_mvc/application/configs/conf.php @@ -34,6 +34,10 @@ public static function loadConfig() { $CC_CONFIG[$backend] = $cloudStorageValues[$backend]; } + // Tells us where file uploads will be uploaded to. + // It will either be set to a cloud storage backend or local file storage. + $CC_CONFIG["current_backend"] = $cloudStorageValues["current_backend"]["storage_backend"]; + $values = parse_ini_file($filename, true); // Name of the web server user diff --git a/airtime_mvc/application/models/RabbitMq.php b/airtime_mvc/application/models/RabbitMq.php index b20beca2e7..6918abc06e 100644 --- a/airtime_mvc/application/models/RabbitMq.php +++ b/airtime_mvc/application/models/RabbitMq.php @@ -80,11 +80,12 @@ public static function SendMessageToShowRecorder($event_type) } public static function SendMessageToAnalyzer($tmpFilePath, $importedStorageDirectory, $originalFilename, - $callbackUrl, $apiKey) + $callbackUrl, $apiKey, $currentStorageBackend) { $exchange = 'airtime-uploads'; $data['tmp_file_path'] = $tmpFilePath; + $data['current_storage_backend'] = $currentStorageBackend; $data['import_directory'] = $importedStorageDirectory; $data['original_filename'] = $originalFilename; $data['callback_url'] = $callbackUrl; diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 8064c7f081..f19700ff12 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -413,9 +413,12 @@ private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) } //TODO: Remove uploadFileAction from ApiController.php **IMPORTANT** - It's used by the recorder daemon... - - $storDir = Application_Model_MusicDir::getStorDir(); - $importedStorageDirectory = $storDir->getDirectory() . "/imported/" . $ownerId; + + $importedStorageDirectory = ""; + if ($CC_CONFIG["current_backend"] == "file") { + $storDir = Application_Model_MusicDir::getStorDir(); + $importedStorageDirectory = $storDir->getDirectory() . "/imported/" . $ownerId; + } try { //Copy the temporary file over to the "organize" folder so that it's off our webserver @@ -426,12 +429,14 @@ private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) Logging::error($e->getMessage()); return; } + + Logging::info($importedStorageDirectory); //Dispatch a message to airtime_analyzer through RabbitMQ, //notifying it that there's a new upload to process! Application_Model_RabbitMq::SendMessageToAnalyzer($newTempFilePath, $importedStorageDirectory, basename($originalFilename), - $callbackUrl, $apiKey); + $callbackUrl, $apiKey, $CC_CONFIG["current_backend"]); } private function getOwnerId() diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 2dd81c6772..a112480667 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -21,7 +21,7 @@ class AnalyzerPipeline: """ @staticmethod - def run_analysis(queue, audio_file_path, import_directory, original_filename, station_domain): + def run_analysis(queue, audio_file_path, import_directory, original_filename, station_domain, current_storage_backend): """Analyze and import an audio file, and put all extracted metadata into queue. Keyword arguments: @@ -55,15 +55,19 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename, st # Analyze the audio file we were told to analyze: # First, we extract the ID3 tags and other metadata: metadata = dict() - metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) metadata["station_domain"] = station_domain + metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) metadata = CuePointAnalyzer.analyze(audio_file_path, metadata) metadata = ReplayGainAnalyzer.analyze(audio_file_path, metadata) metadata = PlayabilityAnalyzer.analyze(audio_file_path, metadata) - csu = CloudStorageUploader() - metadata = csu.upload_obj(audio_file_path, metadata) + if current_storage_backend == "file": + metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) + else: + csu = CloudStorageUploader() + metadata = csu.upload_obj(audio_file_path, metadata) + metadata["import_status"] = 0 # Successfully imported # Note that the queue we're putting the results into is our interprocess communication diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index b61c2133e3..245a74118a 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -150,6 +150,8 @@ def msg_received_callback(channel, method_frame, header_frame, body): original_filename = "" callback_url = "" api_key = "" + station_domain = "" + current_storage_backend = "" ''' Spin up a worker process. We use the multiprocessing module and multiprocessing.Queue to pass objects between the processes so that if the analyzer process crashes, it does not @@ -166,8 +168,9 @@ def msg_received_callback(channel, method_frame, header_frame, body): audio_file_path = msg_dict["tmp_file_path"] import_directory = msg_dict["import_directory"] original_filename = msg_dict["original_filename"] + current_storage_backend = msg_dict["current_storage_backend"] - audio_metadata = MessageListener.spawn_analyzer_process(audio_file_path, import_directory, original_filename, station_domain) + audio_metadata = MessageListener.spawn_analyzer_process(audio_file_path, import_directory, original_filename, station_domain, current_storage_backend) StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) except KeyError as e: @@ -206,11 +209,11 @@ def msg_received_callback(channel, method_frame, header_frame, body): channel.basic_ack(delivery_tag=method_frame.delivery_tag) @staticmethod - def spawn_analyzer_process(audio_file_path, import_directory, original_filename, station_domain): + def spawn_analyzer_process(audio_file_path, import_directory, original_filename, station_domain, current_storage_backend): ''' Spawn a child process to analyze and import a new audio file. ''' q = multiprocessing.Queue() p = multiprocessing.Process(target=AnalyzerPipeline.run_analysis, - args=(q, audio_file_path, import_directory, original_filename, station_domain)) + args=(q, audio_file_path, import_directory, original_filename, station_domain, current_storage_backend)) p.start() p.join() if p.exitcode == 0: From cdabbc6648c505fa649bc6b88e2ec63176196790 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 17 Dec 2014 13:11:11 -0500 Subject: [PATCH 274/310] SAAS-527: Allow files to be uploaded to either the cloud or on local file storage Done. --- .../rest/controllers/MediaController.php | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index f19700ff12..492d7140a7 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -215,6 +215,42 @@ public function putAction() $file->setDbMtime($now); $file->save(); + $this->getResponse() + ->setHttpResponseCode(200) + ->appendBody(json_encode(CcFiles::sanitizeResponse($file))); + } else if ($file) { + //local file storage + $file->setDbDirectory(self::MUSIC_DIRS_STOR_PK); + $file->fromArray($whiteList, BasePeer::TYPE_FIELDNAME); + //Our RESTful API takes "full_path" as a field, which we then split and translate to match + //our internal schema. Internally, file path is stored relative to a directory, with the directory + //as a foreign key to cc_music_dirs. + if (isset($requestData["full_path"])) { + $fileSizeBytes = filesize($requestData["full_path"]); + if (!isset($fileSizeBytes) || $fileSizeBytes === false) + { + $file->setDbImportStatus(self::IMPORT_STATUS_FAILED)->save(); + $this->fileNotFoundResponse(); + return; + } + Application_Model_Preference::updateDiskUsage($fileSizeBytes); + $fullPath = $requestData["full_path"]; + $storDir = Application_Model_MusicDir::getStorDir()->getDirectory(); + $pos = strpos($fullPath, $storDir); + + if ($pos !== FALSE) + { + assert($pos == 0); //Path must start with the stor directory path + + $filePathRelativeToStor = substr($fullPath, strlen($storDir)); + $file->setDbFilepath($filePathRelativeToStor); + } + } + + $now = new DateTime("now", new DateTimeZone("UTC")); + $file->setDbMtime($now); + $file->save(); + $this->getResponse() ->setHttpResponseCode(200) ->appendBody(json_encode(CcFiles::sanitizeResponse($file))); @@ -430,8 +466,6 @@ private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) return; } - - Logging::info($importedStorageDirectory); //Dispatch a message to airtime_analyzer through RabbitMQ, //notifying it that there's a new upload to process! Application_Model_RabbitMq::SendMessageToAnalyzer($newTempFilePath, From 3f5b4faf1c593ba41ca6d938c14419371e1a0c60 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 19 Dec 2014 12:58:55 -0500 Subject: [PATCH 275/310] Cloud storage cleanup and fixed the unit tests --- .../airtime_analyzer/airtime_analyzer.py | 20 ++--------- .../airtime_analyzer/analyzer_pipeline.py | 13 ++++--- .../cloud_storage_uploader.py | 36 +++++++++++++------ .../airtime_analyzer/message_listener.py | 16 ++++----- 4 files changed, 39 insertions(+), 46 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py index dae2719604..c643f21c97 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py @@ -1,11 +1,11 @@ """Contains the main application class for airtime_analyzer. """ -import ConfigParser import logging import logging.handlers import sys import signal import traceback +import config_file from functools import partial from metadata_analyzer import MetadataAnalyzer from replaygain_analyzer import ReplayGainAnalyzer @@ -32,7 +32,7 @@ def __init__(self, config_path, http_retry_queue_path, debug=False): self.setup_logging(debug) # Read our config file - config = AirtimeAnalyzerServer.read_config_file(config_path) + config = config_file.read_config_file(config_path) # Start up the StatusReporter process StatusReporter.start_thread(http_retry_queue_path) @@ -71,22 +71,6 @@ def setup_logging(self, debug): consoleHandler = logging.StreamHandler() consoleHandler.setFormatter(logFormatter) rootLogger.addHandler(consoleHandler) - - - @staticmethod - def read_config_file(config_path): - """Parse the application's config file located at config_path.""" - config = ConfigParser.SafeConfigParser() - try: - config.readfp(open(config_path)) - except IOError as e: - print "Failed to open config file at " + config_path + ": " + e.strerror - exit(-1) - except Exception: - print e.strerror - exit(-1) - - return config @classmethod def dump_stacktrace(stack): diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index a112480667..514c1db38e 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -21,7 +21,7 @@ class AnalyzerPipeline: """ @staticmethod - def run_analysis(queue, audio_file_path, import_directory, original_filename, station_domain, current_storage_backend): + def run_analysis(queue, audio_file_path, import_directory, original_filename): """Analyze and import an audio file, and put all extracted metadata into queue. Keyword arguments: @@ -55,18 +55,17 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename, st # Analyze the audio file we were told to analyze: # First, we extract the ID3 tags and other metadata: metadata = dict() - metadata["station_domain"] = station_domain - metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) metadata = CuePointAnalyzer.analyze(audio_file_path, metadata) metadata = ReplayGainAnalyzer.analyze(audio_file_path, metadata) metadata = PlayabilityAnalyzer.analyze(audio_file_path, metadata) - if current_storage_backend == "file": - metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) - else: - csu = CloudStorageUploader() + + csu = CloudStorageUploader() + if csu.enabled(): metadata = csu.upload_obj(audio_file_path, metadata) + else: + metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) metadata["import_status"] = 0 # Successfully imported diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index b9178709c3..045c719f10 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -1,12 +1,13 @@ import os import logging import uuid -import airtime_analyzer as aa +import config_file from libcloud.storage.providers import get_driver from libcloud.storage.types import Provider, ContainerDoesNotExistError, ObjectDoesNotExistError -CONFIG_PATH = '/etc/airtime-saas/cloud_storage.conf' +CLOUD_CONFIG_PATH = '/etc/airtime-saas/cloud_storage.conf' +STORAGE_BACKEND_FILE = "file" class CloudStorageUploader: """ A class that uses Apache Libcloud's Storage API to upload objects into @@ -25,14 +26,28 @@ class CloudStorageUploader: """ def __init__(self): - config = aa.AirtimeAnalyzerServer.read_config_file(CONFIG_PATH) - + + config = config_file.read_config_file(CLOUD_CONFIG_PATH) + CLOUD_STORAGE_CONFIG_SECTION = config.get("current_backend", "storage_backend") self._storage_backend = CLOUD_STORAGE_CONFIG_SECTION - self._provider = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'provider') - self._bucket = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'bucket') - self._api_key = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key') - self._api_key_secret = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key_secret') + if self._storage_backend == STORAGE_BACKEND_FILE: + self._provider = "" + self._bucket = "" + self._api_key = "" + self._api_key_secret = "" + else: + self._provider = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'provider') + self._bucket = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'bucket') + self._api_key = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key') + self._api_key_secret = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key_secret') + + def enabled(self): + if self._storage_backend == "file": + return False + else: + return True + def upload_obj(self, audio_file_path, metadata): """Uploads a file into Amazon S3 object storage. @@ -61,7 +76,7 @@ def upload_obj(self, audio_file_path, metadata): # in the object name. URL encoding the object name doesn't solve the # problem. As a solution we will replace spaces with dashes. file_name = file_name.replace(" ", "-") - object_name = "%s/%s_%s%s" % (metadata["station_domain"], file_name, str(uuid.uuid4()), extension) + object_name = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension) provider_driver_class = get_driver(getattr(Provider, self._provider)) driver = provider_driver_class(self._api_key, self._api_key_secret) @@ -71,8 +86,7 @@ def upload_obj(self, audio_file_path, metadata): except ContainerDoesNotExistError: container = driver.create_container(self._bucket) - extra = {'meta_data': {'filename': file_base_name, - 'station_domain': metadata["station_domain"]}} + extra = {'meta_data': {'filename': file_base_name}} obj = driver.upload_object(file_path=audio_file_path, container=container, diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index 245a74118a..eb59092477 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -112,7 +112,7 @@ def connect_to_messaging_server(self): self._channel.queue_bind(exchange=EXCHANGE, queue=QUEUE, routing_key=ROUTING_KEY) logging.info(" Listening for messages...") - self._channel.basic_consume(MessageListener.msg_received_callback, + self._channel.basic_consume(self.msg_received_callback, queue=QUEUE, no_ack=False) def wait_for_messages(self): @@ -134,7 +134,6 @@ def graceful_shutdown(self, signum, frame): self._shutdown = True self.disconnect_from_messaging_server() - @staticmethod def msg_received_callback(channel, method_frame, header_frame, body): ''' A callback method that runs when a RabbitMQ message is received. @@ -151,7 +150,6 @@ def msg_received_callback(channel, method_frame, header_frame, body): callback_url = "" api_key = "" station_domain = "" - current_storage_backend = "" ''' Spin up a worker process. We use the multiprocessing module and multiprocessing.Queue to pass objects between the processes so that if the analyzer process crashes, it does not @@ -163,14 +161,12 @@ def msg_received_callback(channel, method_frame, header_frame, body): msg_dict = json.loads(body) api_key = msg_dict["api_key"] callback_url = msg_dict["callback_url"] - station_domain = msg_dict["station_domain"] - + audio_file_path = msg_dict["tmp_file_path"] import_directory = msg_dict["import_directory"] original_filename = msg_dict["original_filename"] - current_storage_backend = msg_dict["current_storage_backend"] - - audio_metadata = MessageListener.spawn_analyzer_process(audio_file_path, import_directory, original_filename, station_domain, current_storage_backend) + + audio_metadata = MessageListener.spawn_analyzer_process(audio_file_path, import_directory, original_filename) StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata) except KeyError as e: @@ -209,11 +205,11 @@ def msg_received_callback(channel, method_frame, header_frame, body): channel.basic_ack(delivery_tag=method_frame.delivery_tag) @staticmethod - def spawn_analyzer_process(audio_file_path, import_directory, original_filename, station_domain, current_storage_backend): + def spawn_analyzer_process(audio_file_path, import_directory, original_filename): ''' Spawn a child process to analyze and import a new audio file. ''' q = multiprocessing.Queue() p = multiprocessing.Process(target=AnalyzerPipeline.run_analysis, - args=(q, audio_file_path, import_directory, original_filename, station_domain, current_storage_backend)) + args=(q, audio_file_path, import_directory, original_filename)) p.start() p.join() if p.exitcode == 0: From 1718868835cf5c21bcd33bf8be3c04216c93a5dc Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 19 Dec 2014 12:59:20 -0500 Subject: [PATCH 276/310] Stub CloudStorageAnalyzer tests --- .../tests/cloud_storage_uploader_tests.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 python_apps/airtime_analyzer/tests/cloud_storage_uploader_tests.py diff --git a/python_apps/airtime_analyzer/tests/cloud_storage_uploader_tests.py b/python_apps/airtime_analyzer/tests/cloud_storage_uploader_tests.py new file mode 100644 index 0000000000..cd5b29f8d2 --- /dev/null +++ b/python_apps/airtime_analyzer/tests/cloud_storage_uploader_tests.py @@ -0,0 +1,12 @@ +from nose.tools import * +from airtime_analyzer.cloud_storage_uploader import CloudStorageUploader +from airtime_analyzer.airtime_analyzer import AirtimeAnalyzerServer + +def setup(): + pass + +def teardown(): + pass + +def test_analyze(): + cl = CloudStorageUploader() From 9a8b34feae76b7a02916d80da565dea69c288cb8 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 19 Dec 2014 14:03:28 -0500 Subject: [PATCH 277/310] Unit test tweak for CloudStorage --- .../airtime_analyzer/tests/cloud_storage_uploader_tests.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python_apps/airtime_analyzer/tests/cloud_storage_uploader_tests.py b/python_apps/airtime_analyzer/tests/cloud_storage_uploader_tests.py index cd5b29f8d2..d54e4573a5 100644 --- a/python_apps/airtime_analyzer/tests/cloud_storage_uploader_tests.py +++ b/python_apps/airtime_analyzer/tests/cloud_storage_uploader_tests.py @@ -10,3 +10,4 @@ def teardown(): def test_analyze(): cl = CloudStorageUploader() + cl._storage_backend = "file" \ No newline at end of file From 13827d96c9e5812f50647e76ac498b9745bc729c Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 19 Dec 2014 16:20:20 -0500 Subject: [PATCH 278/310] Added missing config_File.py --- .../airtime_analyzer/config_file.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/config_file.py diff --git a/python_apps/airtime_analyzer/airtime_analyzer/config_file.py b/python_apps/airtime_analyzer/airtime_analyzer/config_file.py new file mode 100644 index 0000000000..7bd5a0b594 --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/config_file.py @@ -0,0 +1,15 @@ +import ConfigParser + +def read_config_file(config_path): + """Parse the application's config file located at config_path.""" + config = ConfigParser.SafeConfigParser() + try: + config.readfp(open(config_path)) + except IOError as e: + print "Failed to open config file at " + config_path + ": " + e.strerror + exit(-1) + except Exception as e: + print e.strerror + exit(-1) + + return config \ No newline at end of file From cf57af0c4bd7239f1a2a2693b23a5ae11e9302b5 Mon Sep 17 00:00:00 2001 From: drigato Date: Mon, 5 Jan 2015 12:20:13 -0500 Subject: [PATCH 279/310] Small analyzer fix --- .../airtime_analyzer/airtime_analyzer/message_listener.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index eb59092477..f88fa6bc7f 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -134,7 +134,7 @@ def graceful_shutdown(self, signum, frame): self._shutdown = True self.disconnect_from_messaging_server() - def msg_received_callback(channel, method_frame, header_frame, body): + def msg_received_callback(self, channel, method_frame, header_frame, body): ''' A callback method that runs when a RabbitMQ message is received. Here we parse the message, spin up an analyzer process, and report the From 8d914bcd1314afd2d97bba2ea819325eabb6ed6c Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 6 Jan 2015 15:44:34 -0500 Subject: [PATCH 280/310] SAAS-529: Replace Apache Libcloud with Python-Boto SDK --- .../application/cloud_storage/Amazon_S3.php | 1 + .../cloud_storage_uploader.py | 44 +++---- .../cloud_storage_uploader_libcloud.py | 111 ++++++++++++++++++ python_apps/airtime_analyzer/setup.py | 1 + 4 files changed, 130 insertions(+), 27 deletions(-) create mode 100644 python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader_libcloud.py diff --git a/airtime_mvc/application/cloud_storage/Amazon_S3.php b/airtime_mvc/application/cloud_storage/Amazon_S3.php index f9de30d493..978e1ba073 100644 --- a/airtime_mvc/application/cloud_storage/Amazon_S3.php +++ b/airtime_mvc/application/cloud_storage/Amazon_S3.php @@ -18,6 +18,7 @@ public function Amazon_S3($securityCredentials) $this->s3Client = S3Client::factory(array( 'key' => $securityCredentials['api_key'], 'secret' => $securityCredentials['api_key_secret'], + 'region' => $securityCredentials['region'] )); } diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index 045c719f10..bea905b71c 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -2,27 +2,25 @@ import logging import uuid import config_file -from libcloud.storage.providers import get_driver -from libcloud.storage.types import Provider, ContainerDoesNotExistError, ObjectDoesNotExistError +from boto.s3.connection import S3Connection +from boto.s3.key import Key CLOUD_CONFIG_PATH = '/etc/airtime-saas/cloud_storage.conf' STORAGE_BACKEND_FILE = "file" class CloudStorageUploader: - """ A class that uses Apache Libcloud's Storage API to upload objects into - a cloud storage backend. For this implementation all files will be uploaded - into a bucket on Amazon S3. + """ A class that uses Python-Boto SDK to upload objects into Amazon S3. It is important to note that every file, coming from different Airtime Pro stations, will get uploaded into the same bucket on the same Amazon S3 account. Attributes: - _provider: Storage backend. For exmaple, Amazon S3, Google Storage. - _bucket: Name of container on provider where files will get uploaded into. - _api_key: Access key to objects on the provider's storage backend. - _api_key_secret: Secret access key to objects on the provider's storage backend. + _host: Host name for the specific region assigned to the bucket. + _bucket: Name of container on Amazon S3 where files will get uploaded into. + _api_key: Access key to objects on Amazon S3. + _api_key_secret: Secret access key to objects on Amazon S3. """ def __init__(self): @@ -32,12 +30,12 @@ def __init__(self): CLOUD_STORAGE_CONFIG_SECTION = config.get("current_backend", "storage_backend") self._storage_backend = CLOUD_STORAGE_CONFIG_SECTION if self._storage_backend == STORAGE_BACKEND_FILE: - self._provider = "" + self._host = "" self._bucket = "" self._api_key = "" self._api_key_secret = "" else: - self._provider = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'provider') + self._host = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'host') self._bucket = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'bucket') self._api_key = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key') self._api_key_secret = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key_secret') @@ -76,23 +74,15 @@ def upload_obj(self, audio_file_path, metadata): # in the object name. URL encoding the object name doesn't solve the # problem. As a solution we will replace spaces with dashes. file_name = file_name.replace(" ", "-") - object_name = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension) + resource_id = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension) - provider_driver_class = get_driver(getattr(Provider, self._provider)) - driver = provider_driver_class(self._api_key, self._api_key_secret) + conn = S3Connection(self._api_key, self._api_key_secret, host=self._host) + bucket = conn.get_bucket(self._bucket) - try: - container = driver.get_container(self._bucket) - except ContainerDoesNotExistError: - container = driver.create_container(self._bucket) - - extra = {'meta_data': {'filename': file_base_name}} - - obj = driver.upload_object(file_path=audio_file_path, - container=container, - object_name=object_name, - verify_hash=False, - extra=extra) + key = Key(bucket) + key.key = resource_id + key.set_metadata('filename', file_base_name) + key.set_contents_from_filename(audio_file_path) metadata["filesize"] = os.path.getsize(audio_file_path) @@ -105,7 +95,7 @@ def upload_obj(self, audio_file_path, metadata): # Pass original filename to Airtime so we can store it in the db metadata["filename"] = file_base_name - metadata["resource_id"] = object_name + metadata["resource_id"] = resource_id metadata["storage_backend"] = self._storage_backend return metadata diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader_libcloud.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader_libcloud.py new file mode 100644 index 0000000000..045c719f10 --- /dev/null +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader_libcloud.py @@ -0,0 +1,111 @@ +import os +import logging +import uuid +import config_file +from libcloud.storage.providers import get_driver +from libcloud.storage.types import Provider, ContainerDoesNotExistError, ObjectDoesNotExistError + + +CLOUD_CONFIG_PATH = '/etc/airtime-saas/cloud_storage.conf' +STORAGE_BACKEND_FILE = "file" + +class CloudStorageUploader: + """ A class that uses Apache Libcloud's Storage API to upload objects into + a cloud storage backend. For this implementation all files will be uploaded + into a bucket on Amazon S3. + + It is important to note that every file, coming from different Airtime Pro + stations, will get uploaded into the same bucket on the same Amazon S3 + account. + + Attributes: + _provider: Storage backend. For exmaple, Amazon S3, Google Storage. + _bucket: Name of container on provider where files will get uploaded into. + _api_key: Access key to objects on the provider's storage backend. + _api_key_secret: Secret access key to objects on the provider's storage backend. + """ + + def __init__(self): + + config = config_file.read_config_file(CLOUD_CONFIG_PATH) + + CLOUD_STORAGE_CONFIG_SECTION = config.get("current_backend", "storage_backend") + self._storage_backend = CLOUD_STORAGE_CONFIG_SECTION + if self._storage_backend == STORAGE_BACKEND_FILE: + self._provider = "" + self._bucket = "" + self._api_key = "" + self._api_key_secret = "" + else: + self._provider = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'provider') + self._bucket = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'bucket') + self._api_key = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key') + self._api_key_secret = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key_secret') + + def enabled(self): + if self._storage_backend == "file": + return False + else: + return True + + + def upload_obj(self, audio_file_path, metadata): + """Uploads a file into Amazon S3 object storage. + + Before a file is uploaded onto Amazon S3 we generate a unique object + name consisting of the filename and a unqiue string using the uuid4 + module. + + Keyword arguments: + audio_file_path: Path on disk to the audio file that is about to be + uploaded to Amazon S3 object storage. + metadata: ID3 tags and other metadata extracted from the audio file. + + Returns: + The metadata dictionary it received with three new keys: + filesize: The file's filesize in bytes. + filename: The file's filename. + resource_id: The unique object name used to identify the objects + on Amazon S3 + """ + + file_base_name = os.path.basename(audio_file_path) + file_name, extension = os.path.splitext(file_base_name) + + # With Amazon S3 you cannot create a signed url if there are spaces + # in the object name. URL encoding the object name doesn't solve the + # problem. As a solution we will replace spaces with dashes. + file_name = file_name.replace(" ", "-") + object_name = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension) + + provider_driver_class = get_driver(getattr(Provider, self._provider)) + driver = provider_driver_class(self._api_key, self._api_key_secret) + + try: + container = driver.get_container(self._bucket) + except ContainerDoesNotExistError: + container = driver.create_container(self._bucket) + + extra = {'meta_data': {'filename': file_base_name}} + + obj = driver.upload_object(file_path=audio_file_path, + container=container, + object_name=object_name, + verify_hash=False, + extra=extra) + + metadata["filesize"] = os.path.getsize(audio_file_path) + + # Remove file from organize directory + try: + os.remove(audio_file_path) + except OSError: + logging.info("Could not remove %s from organize directory" % audio_file_path) + + # Pass original filename to Airtime so we can store it in the db + metadata["filename"] = file_base_name + + metadata["resource_id"] = object_name + metadata["storage_backend"] = self._storage_backend + return metadata + diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index f9f47a31e0..5a37aed138 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -31,6 +31,7 @@ 'requests', 'apache-libcloud', 'rgain', + 'boto', # These next 3 are required for requests to support SSL with SNI. Learned this the hard way... # What sucks is that GCC is required to pip install these. #'ndg-httpsclient', From 2185fc9ca46fabd42a9a8f8a6b51693d359f2e12 Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 13 Jan 2015 15:49:57 -0500 Subject: [PATCH 281/310] SAAS-536: Check for future scheduled files uses cloud_file id instead of cc_files id --- airtime_mvc/application/models/StoredFile.php | 2 +- airtime_mvc/application/models/airtime/CcFiles.php | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 328863f716..8a9cee9a0c 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -377,7 +377,7 @@ public function existsOnDisk() public function delete() { // Check if the file is scheduled to be played in the future - if (Application_Model_Schedule::IsFileScheduledInTheFuture($this->getId())) { + if (Application_Model_Schedule::IsFileScheduledInTheFuture($this->_file->getCcFileId())) { throw new DeleteScheduledFileException(); } diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index b13eb05cec..3bd62a7a5c 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -140,4 +140,9 @@ public function getResourceId() return null; } + public function getCcFileId() + { + return $this->id; + } + } // CcFiles From 7d0f1655d2df08a6948caff7b3cbc69bcf4aaee7 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 15 Jan 2015 13:44:48 -0500 Subject: [PATCH 282/310] SAAS-539: Analyzer can return values in scientific notation which are not compatible with Airtime --- .../airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py index 6b461f050d..1e1dee6bdf 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py @@ -32,8 +32,8 @@ def analyze(filename, metadata): # Conver the length into a formatted time string track_length = datetime.timedelta(seconds=metadata['length_seconds']) metadata["length"] = str(track_length) - metadata['cuein'] = silan_results['sound'][0][0] - metadata['cueout'] = silan_results['sound'][0][1] + metadata['cuein'] = format(silan_results['sound'][0][0], 'f') + metadata['cueout'] = format(silan_results['sound'][0][1], 'f') except OSError as e: # silan was not found logging.warn("Failed to run: %s - %s. %s" % (command[0], e.strerror, "Do you have silan installed?")) From 52a66632c6e2bfcb5894b62425418f31cf7ed4f1 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 15 Jan 2015 17:17:29 -0500 Subject: [PATCH 283/310] SAAS-539: Analyzer can return values in scientific notation which are not compatible with Airtime Fix unit tests --- python_apps/airtime_analyzer/tests/cuepoint_analyzer_tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python_apps/airtime_analyzer/tests/cuepoint_analyzer_tests.py b/python_apps/airtime_analyzer/tests/cuepoint_analyzer_tests.py index a55b6ee983..f084a404bd 100644 --- a/python_apps/airtime_analyzer/tests/cuepoint_analyzer_tests.py +++ b/python_apps/airtime_analyzer/tests/cuepoint_analyzer_tests.py @@ -10,8 +10,8 @@ def check_default_metadata(metadata): tolerance_seconds = 0.1 length_seconds = 3.9 assert abs(metadata['length_seconds'] - length_seconds) < tolerance_seconds - assert abs(metadata['cuein']) < tolerance_seconds - assert abs(metadata['cueout'] - length_seconds) < tolerance_seconds + assert abs(float(metadata['cuein'])) < tolerance_seconds + assert abs(float(metadata['cueout']) - length_seconds) < tolerance_seconds def test_missing_silan(): old_silan = CuePointAnalyzer.SILAN_EXECUTABLE From 527d2851af2a1c921b63d55f5cd1e61ddbe63055 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 16 Jan 2015 12:13:04 -0500 Subject: [PATCH 284/310] SAAS-542: ryerson.airtime.pro file doesn't play, preview, or download --- airtime_mvc/application/models/airtime/CloudFile.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index cd2d22657d..bdab1d6b43 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -65,16 +65,21 @@ public function getFilename() */ public function isValidPhysicalFile() { - $ch = curl_init(); + $ch = curl_init($this->getURLForTrackPreviewOrDownload()); + + // There is not enough memory to download large files so instead + // write the file contents to /dev/null + $fp = fopen('/dev/null', 'w+'); + curl_setopt_array($ch, array( - CURLOPT_URL => $this->getURLForTrackPreviewOrDownload(), + CURLOPT_FILE, $fp, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_VERBOSE => false )); curl_exec($ch); $http_status = curl_getinfo($ch); - + if ($http_status["http_code"] === 200) { return true; From 38882abd1a5651811e15f070679be311061f3bc8 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 16 Jan 2015 13:26:55 -0500 Subject: [PATCH 285/310] SAAS-542: ryerson.airtime.pro file doesn't play, preview, or download --- .../application/models/airtime/CloudFile.php | 26 ++++--------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index bdab1d6b43..c6fe79a912 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -65,27 +65,11 @@ public function getFilename() */ public function isValidPhysicalFile() { - $ch = curl_init($this->getURLForTrackPreviewOrDownload()); - - // There is not enough memory to download large files so instead - // write the file contents to /dev/null - $fp = fopen('/dev/null', 'w+'); - - curl_setopt_array($ch, array( - CURLOPT_FILE, $fp, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_VERBOSE => false - )); - curl_exec($ch); - $http_status = curl_getinfo($ch); - - if ($http_status["http_code"] === 200) - { - return true; - } else { - return false; - } + // We don't need to check if the cloud file is a valid file because + // before it is imported the Analyzer runs it through Liquidsoap + // to check its playability. If Liquidsoap can't play the file it + // does not get imported into the Airtime library. + return true; } /** From 2c2f7ebc5f2faab4e303f698fffe17440a6db765 Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Wed, 21 Jan 2015 15:34:15 -0500 Subject: [PATCH 286/310] Initial commit for update to ACL for REST module; NEEDS TESTING --- airtime_mvc/application/configs/ACL.php | 7 ++++++- airtime_mvc/application/controllers/plugins/Acl_plugin.php | 5 ----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/airtime_mvc/application/configs/ACL.php b/airtime_mvc/application/configs/ACL.php index 8427780654..2dbb6f5cda 100644 --- a/airtime_mvc/application/configs/ACL.php +++ b/airtime_mvc/application/configs/ACL.php @@ -29,7 +29,10 @@ ->add(new Zend_Acl_Resource('audiopreview')) ->add(new Zend_Acl_Resource('webstream')) ->add(new Zend_Acl_Resource('locale')) - ->add(new Zend_Acl_Resource('upgrade')); + ->add(new Zend_Acl_Resource('upgrade')) + ->add(new Zend_Acl_Resource('downgrade')) + ->add(new Zend_Acl_Resource('rest:media')) + ->add(new Zend_Acl_Resource('billing')); /** Creating permissions */ $ccAcl->allow('G', 'index') @@ -44,6 +47,8 @@ ->allow('G', 'webstream') ->allow('G', 'locale') ->allow('G', 'upgrade') + ->allow('G', 'downgrade') + ->allow('G', 'rest:media') ->allow('H', 'preference', 'is-import-in-progress') ->allow('H', 'usersettings') ->allow('H', 'plupload') diff --git a/airtime_mvc/application/controllers/plugins/Acl_plugin.php b/airtime_mvc/application/controllers/plugins/Acl_plugin.php index 9d0f9cdb34..32ddb157d2 100644 --- a/airtime_mvc/application/controllers/plugins/Acl_plugin.php +++ b/airtime_mvc/application/controllers/plugins/Acl_plugin.php @@ -113,11 +113,6 @@ public function preDispatch(Zend_Controller_Request_Abstract $request) //Ignore authentication for all access to the rest API. We do auth via API keys for this //and/or by OAuth. - if (strtolower($request->getModuleName()) == "rest") - { - return; - } - if (in_array($controller, array("api", "auth", "locale", "upgrade"))) { $this->setRoleName("G"); } elseif (!Zend_Auth::getInstance()->hasIdentity()) { From a40067ca554d6c7ee9454ca0b30868e6d59e8488 Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Wed, 21 Jan 2015 17:20:04 -0500 Subject: [PATCH 287/310] Moved REST authorization boilerplate to Zend Acl_plugin --- .../controllers/plugins/Acl_plugin.php | 54 ++++++++- .../rest/controllers/MediaController.php | 105 ------------------ 2 files changed, 50 insertions(+), 109 deletions(-) diff --git a/airtime_mvc/application/controllers/plugins/Acl_plugin.php b/airtime_mvc/application/controllers/plugins/Acl_plugin.php index 32ddb157d2..1918430ea3 100644 --- a/airtime_mvc/application/controllers/plugins/Acl_plugin.php +++ b/airtime_mvc/application/controllers/plugins/Acl_plugin.php @@ -110,12 +110,17 @@ public function preDispatch(Zend_Controller_Request_Abstract $request) { $controller = strtolower($request->getControllerName()); Application_Model_Auth::pinSessionToClient(Zend_Auth::getInstance()); - - //Ignore authentication for all access to the rest API. We do auth via API keys for this - //and/or by OAuth. + if (in_array($controller, array("api", "auth", "locale", "upgrade"))) { $this->setRoleName("G"); } elseif (!Zend_Auth::getInstance()->hasIdentity()) { + + // If we don't have an identity and we're making a RESTful request, + // we need to do API key verification + if ($request->getModuleName() == "rest") { + $this->verifyAuth(); + return; + } if ($controller !== 'login') { @@ -138,7 +143,12 @@ public function preDispatch(Zend_Controller_Request_Abstract $request) } } } else { - + // If we have an identity and we're making a RESTful request, + // we need to check the CSRF token + if ($request->_action != "get" && $request->getModuleName() == "rest") { + $this->verifyCSRFToken($request->getParam("csrf_token")); + } + $userInfo = Zend_Auth::getInstance()->getStorage()->read(); $this->setRoleName($userInfo->type); @@ -164,6 +174,42 @@ public function preDispatch(Zend_Controller_Request_Abstract $request) } } + private function verifyAuth() { + if ($this->verifyAPIKey()) { + return true; + } + + $this->getResponse() + ->setHttpResponseCode(401) + ->appendBody("ERROR: Incorrect API key."); + return false; + } + + private function verifyCSRFToken($token) { + $current_namespace = new Zend_Session_Namespace('csrf_namespace'); + $observed_csrf_token = $token; + $expected_csrf_token = $current_namespace->authtoken; + + $this->getResponse() + ->setHttpResponseCode(401) + ->appendBody("ERROR: CSRF token mismatch."); + + return ($observed_csrf_token == $expected_csrf_token); + } + + private function verifyAPIKey() { + // The API key is passed in via HTTP "basic authentication": + // http://en.wikipedia.org/wiki/Basic_access_authentication + $CC_CONFIG = Config::getConfig(); + + // Decode the API key that was passed to us in the HTTP request. + $authHeader = $this->getRequest()->getHeader("Authorization"); + $encodedRequestApiKey = substr($authHeader, strlen("Basic ")); + $encodedStoredApiKey = base64_encode($CC_CONFIG["apiKey"][0] . ":"); + + return ($encodedRequestApiKey === $encodedStoredApiKey); + } + /** * Deny Access Function * Redirects to errorPage, this can be called from an action using the action helper diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 232ac3529f..a5ee08fd97 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -30,11 +30,6 @@ public function init() public function indexAction() { - if (!$this->verifyAuth(true, true)) - { - return; - } - $files_array = array(); foreach (CcFilesQuery::create()->find() as $file) { @@ -54,11 +49,6 @@ public function indexAction() public function downloadAction() { - if (!$this->verifyAuth(true, true)) - { - return; - } - $id = $this->getId(); if (!$id) { return; @@ -80,11 +70,6 @@ public function downloadAction() public function getAction() { - if (!$this->verifyAuth(true, true)) - { - return; - } - $id = $this->getId(); if (!$id) { return; @@ -103,11 +88,6 @@ public function getAction() public function postAction() { - if (!$this->verifyAuth(true, true)) - { - return; - } - //If we do get an ID on a POST, then that doesn't make any sense //since POST is only for creating. if ($id = $this->_getParam('id', false)) { @@ -168,11 +148,6 @@ public function postAction() public function putAction() { - if (!$this->verifyAuth(true, true)) - { - return; - } - $id = $this->getId(); if (!$id) { return; @@ -236,11 +211,6 @@ public function putAction() public function deleteAction() { - if (!$this->verifyAuth(true, true)) - { - return; - } - $id = $this->getId(); if (!$id) { return; @@ -271,81 +241,6 @@ private function getId() return $id; } - private function verifyAuth($checkApiKey, $checkSession) - { - // Session takes precedence over API key for now: - if ($checkSession && $this->verifySession()) { - // CSRF token validation only applies to session based authorization. - if(!$this->verifyCSRFToken($this->_getParam('csrf_token'))){ - $resp = $this->getResponse(); - $resp->setHttpResponseCode(401); - $resp->appendBody("ERROR: Token Missmatch."); - return false; - } - return true; - } - - if ($checkApiKey && $this->verifyAPIKey()) - { - return true; - } - - $resp = $this->getResponse(); - $resp->setHttpResponseCode(401); - $resp->appendBody("ERROR: Incorrect API key."); - - return false; - } - - private function verifyCSRFToken($token){ - $current_namespace = new Zend_Session_Namespace('csrf_namespace'); - $observed_csrf_token = $token; - $expected_csrf_token = $current_namespace->authtoken; - - if($observed_csrf_token == $expected_csrf_token){ - return true; - }else{ - return false; - } - } - - private function verifyAPIKey() - { - //The API key is passed in via HTTP "basic authentication": - // http://en.wikipedia.org/wiki/Basic_access_authentication - - $CC_CONFIG = Config::getConfig(); - - //Decode the API key that was passed to us in the HTTP request. - $authHeader = $this->getRequest()->getHeader("Authorization"); - $encodedRequestApiKey = substr($authHeader, strlen("Basic ")); - $encodedStoredApiKey = base64_encode($CC_CONFIG["apiKey"][0] . ":"); - - if ($encodedRequestApiKey === $encodedStoredApiKey) - { - return true; - } else { - return false; - } - - return false; - } - - private function verifySession() - { - $auth = Zend_Auth::getInstance(); - if ($auth->hasIdentity()) - { - return true; - } - return false; - - //Token checking stub code. We'd need to change LoginController.php to generate a token too, but - //but luckily all the token code already exists and works. - //$auth = new Application_Model_Auth(); - //$auth->checkToken(Application_Model_Preference::getUserId(), $token); - } - private function fileNotFoundResponse() { $resp = $this->getResponse(); From 38a2924849ff41d317afda173bce6ecfb2acdbe6 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 22 Jan 2015 11:08:34 -0500 Subject: [PATCH 288/310] SAAS-555: Analyzer calculates wrong cue out --- .../airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py index 1e1dee6bdf..8a99626c68 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cuepoint_analyzer.py @@ -24,7 +24,7 @@ def analyze(filename, metadata): the unit test on the short m4a file fails. With the new setting, it gets the correct cue-in time and all the unit tests pass. ''' - command = [CuePointAnalyzer.SILAN_EXECUTABLE, '-b', '-F', '0.99', '-f', 'JSON', filename] + command = [CuePointAnalyzer.SILAN_EXECUTABLE, '-b', '-F', '0.99', '-f', 'JSON', '-t', '1.0', filename] try: results_json = subprocess.check_output(command, stderr=subprocess.STDOUT, close_fds=True) silan_results = json.loads(results_json) From d5ee710f89d3378ced237ecedde107e8720c1dc5 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 22 Jan 2015 12:20:13 -0500 Subject: [PATCH 289/310] Fixed CSRF token checking in MediaController (broken by last 2 commits) * Also fixed getOwnerId(), no longer calls a non-existent function --- .../controllers/plugins/Acl_plugin.php | 15 ++++++++++----- .../modules/rest/controllers/MediaController.php | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/airtime_mvc/application/controllers/plugins/Acl_plugin.php b/airtime_mvc/application/controllers/plugins/Acl_plugin.php index 1918430ea3..4fa993e294 100644 --- a/airtime_mvc/application/controllers/plugins/Acl_plugin.php +++ b/airtime_mvc/application/controllers/plugins/Acl_plugin.php @@ -146,7 +146,14 @@ public function preDispatch(Zend_Controller_Request_Abstract $request) // If we have an identity and we're making a RESTful request, // we need to check the CSRF token if ($request->_action != "get" && $request->getModuleName() == "rest") { - $this->verifyCSRFToken($request->getParam("csrf_token")); + $tokenValid = $this->verifyCSRFToken($request->getParam("csrf_token")); + + if (!$tokenValid) { + $this->getResponse() + ->setHttpResponseCode(401) + ->appendBody("ERROR: CSRF token mismatch."); + return; + } } $userInfo = Zend_Auth::getInstance()->getStorage()->read(); @@ -189,10 +196,8 @@ private function verifyCSRFToken($token) { $current_namespace = new Zend_Session_Namespace('csrf_namespace'); $observed_csrf_token = $token; $expected_csrf_token = $current_namespace->authtoken; - - $this->getResponse() - ->setHttpResponseCode(401) - ->appendBody("ERROR: CSRF token mismatch."); + Logging::error("Observed: " . $observed_csrf_token); + Logging::error("Expected: " . $expected_csrf_token); return ($observed_csrf_token == $expected_csrf_token); } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index a5ee08fd97..7a78107112 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -338,7 +338,7 @@ private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) private function getOwnerId() { try { - if ($this->verifySession()) { + if (Zend_Auth::getInstance()->hasIdentity()) { $service_user = new Application_Service_UserService(); return $service_user->getCurrentUser()->getDbId(); } else { From 6ebe8ec6c81e71029736eb23df76c8eaf0be56f8 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 22 Jan 2015 12:42:05 -0500 Subject: [PATCH 290/310] Pin python-daemon to 1.6 because 2.0.3 breaks setuptools --- python_apps/airtime_analyzer/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index 21bb8b95ee..edf97ebe36 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -27,7 +27,7 @@ 'nose', 'coverage', 'mock', - 'python-daemon', + 'python-daemon==1.6', 'requests', 'rgain', # These next 3 are required for requests to support SSL with SNI. Learned this the hard way... From 6adaf7a91aa4f242e1c8695b5b5f142e01874479 Mon Sep 17 00:00:00 2001 From: drigato Date: Fri, 23 Jan 2015 17:33:57 -0500 Subject: [PATCH 291/310] Disabling cue point analyzer --- .../airtime_analyzer/airtime_analyzer/analyzer_pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index bf467c1902..8f1abc4994 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -54,7 +54,7 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): # First, we extract the ID3 tags and other metadata: metadata = dict() metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) - metadata = CuePointAnalyzer.analyze(audio_file_path, metadata) + #metadata = CuePointAnalyzer.analyze(audio_file_path, metadata) metadata = ReplayGainAnalyzer.analyze(audio_file_path, metadata) metadata = PlayabilityAnalyzer.analyze(audio_file_path, metadata) metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) From ea868607b4e4997a3fdf3d1fe88c8eee87909dfa Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 27 Jan 2015 13:21:44 -0500 Subject: [PATCH 292/310] Enabling cuepoint analyzer because the silan bug has been fixed --- .../airtime_analyzer/airtime_analyzer/analyzer_pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 8f1abc4994..bf467c1902 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -54,7 +54,7 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): # First, we extract the ID3 tags and other metadata: metadata = dict() metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) - #metadata = CuePointAnalyzer.analyze(audio_file_path, metadata) + metadata = CuePointAnalyzer.analyze(audio_file_path, metadata) metadata = ReplayGainAnalyzer.analyze(audio_file_path, metadata) metadata = PlayabilityAnalyzer.analyze(audio_file_path, metadata) metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) From 3f6983aa3e6808c4feb6219e869d250c5061cc9b Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 2 Feb 2015 12:18:33 -0500 Subject: [PATCH 293/310] Renabling CuePointAnalyzer --- .../airtime_analyzer/airtime_analyzer/analyzer_pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 8f1abc4994..bf467c1902 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -54,7 +54,7 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): # First, we extract the ID3 tags and other metadata: metadata = dict() metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) - #metadata = CuePointAnalyzer.analyze(audio_file_path, metadata) + metadata = CuePointAnalyzer.analyze(audio_file_path, metadata) metadata = ReplayGainAnalyzer.analyze(audio_file_path, metadata) metadata = PlayabilityAnalyzer.analyze(audio_file_path, metadata) metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) From ee6862e7311acb7d91335499385f1e5913486787 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 2 Feb 2015 12:26:22 -0500 Subject: [PATCH 294/310] Fixed quotation issue with playability analyzer --- .../airtime_analyzer/airtime_analyzer/playability_analyzer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/playability_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/playability_analyzer.py index ec102eeb21..0ca8a84c19 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/playability_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/playability_analyzer.py @@ -19,7 +19,7 @@ def analyze(filename, metadata): :param metadata: A metadata dictionary where the results will be put :return: The metadata dictionary ''' - command = [PlayabilityAnalyzer.LIQUIDSOAP_EXECUTABLE, '-v', '-c', "output.dummy(audio_to_stereo(single('%s')))" % filename] + command = [PlayabilityAnalyzer.LIQUIDSOAP_EXECUTABLE, '-v', '-c', "output.dummy(audio_to_stereo(single(argv(1))))", '--', filename] try: subprocess.check_output(command, stderr=subprocess.STDOUT, close_fds=True) From 9baed1b3288a0466616c699c3534c76d01581ca0 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 2 Feb 2015 13:14:14 -0500 Subject: [PATCH 295/310] Make the unit tests pass again --- .../airtime_analyzer/analyzer_pipeline.py | 11 ++++++----- .../airtime_analyzer/message_listener.py | 6 +++++- .../airtime_analyzer/tests/analyzer_pipeline_tests.py | 3 ++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py index 514c1db38e..f3cf041805 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer_pipeline.py @@ -21,7 +21,7 @@ class AnalyzerPipeline: """ @staticmethod - def run_analysis(queue, audio_file_path, import_directory, original_filename): + def run_analysis(queue, audio_file_path, import_directory, original_filename, cloud_storage_enabled): """Analyze and import an audio file, and put all extracted metadata into queue. Keyword arguments: @@ -34,7 +34,7 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): preserve. The file at audio_file_path typically has a temporary randomly generated name, which is why we want to know what the original name was. - station_domain: The Airtime Pro account's domain name. i.e. bananas + cloud_storage_enabled: Whether to store the file in the cloud or on the local disk. """ # It is super critical to initialize a separate log file here so that we # don't inherit logging/locks from the parent process. Supposedly @@ -50,6 +50,8 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): raise TypeError("import_directory must be unicode. Was of type " + type(import_directory).__name__ + " instead.") if not isinstance(original_filename, unicode): raise TypeError("original_filename must be unicode. Was of type " + type(original_filename).__name__ + " instead.") + if not isinstance(cloud_storage_enabled, bool): + raise TypeError("cloud_storage_enabled must be a boolean. Was of type " + type(cloud_storage_enabled).__name__ + " instead.") # Analyze the audio file we were told to analyze: @@ -60,9 +62,8 @@ def run_analysis(queue, audio_file_path, import_directory, original_filename): metadata = ReplayGainAnalyzer.analyze(audio_file_path, metadata) metadata = PlayabilityAnalyzer.analyze(audio_file_path, metadata) - - csu = CloudStorageUploader() - if csu.enabled(): + if cloud_storage_enabled: + csu = CloudStorageUploader() metadata = csu.upload_obj(audio_file_path, metadata) else: metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py index f88fa6bc7f..8ed5fa7821 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/message_listener.py @@ -207,9 +207,13 @@ def msg_received_callback(self, channel, method_frame, header_frame, body): @staticmethod def spawn_analyzer_process(audio_file_path, import_directory, original_filename): ''' Spawn a child process to analyze and import a new audio file. ''' + + csu = CloudStorageUploader() + cloud_storage_enabled = csu.enabled() + q = multiprocessing.Queue() p = multiprocessing.Process(target=AnalyzerPipeline.run_analysis, - args=(q, audio_file_path, import_directory, original_filename)) + args=(q, audio_file_path, import_directory, original_filename, cloud_storage_enabled)) p.start() p.join() if p.exitcode == 0: diff --git a/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py b/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py index 54458e33f6..23d7d046b3 100644 --- a/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py +++ b/python_apps/airtime_analyzer/tests/analyzer_pipeline_tests.py @@ -20,8 +20,9 @@ def teardown(): def test_basic(): filename = os.path.basename(DEFAULT_AUDIO_FILE) q = multiprocessing.Queue() + cloud_storage_enabled = False #This actually imports the file into the "./Test Artist" directory. - AnalyzerPipeline.run_analysis(q, DEFAULT_AUDIO_FILE, u'.', filename) + AnalyzerPipeline.run_analysis(q, DEFAULT_AUDIO_FILE, u'.', filename, cloud_storage_enabled) metadata = q.get() assert metadata['track_title'] == u'Test Title' assert metadata['artist_name'] == u'Test Artist' From e32a26956b4f0797d7144f97d05a796c547f13e5 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 2 Feb 2015 13:31:52 -0500 Subject: [PATCH 296/310] Fixed the unit tests again --- .../cloud_storage_uploader.py | 27 +++++++++++++------ .../cloud_storage_uploader_libcloud.py | 26 ++++++++++++------ 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index bea905b71c..b8fc2261f0 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -1,7 +1,7 @@ import os import logging import uuid -import config_file +import ConfigParser from boto.s3.connection import S3Connection from boto.s3.key import Key @@ -25,20 +25,31 @@ class CloudStorageUploader: def __init__(self): - config = config_file.read_config_file(CLOUD_CONFIG_PATH) + try: + config = ConfigParser.SafeConfigParser() + config.readfp(open(CLOUD_CONFIG_PATH)) + cloud_storage_config_section = config.get("current_backend", "storage_backend") + self._storage_backend = cloud_storage_config_section + except IOError as e: + print "Failed to open config file at " + CLOUD_CONFIG_PATH + ": " + e.strerror + print "Defaulting to file storage" + self._storage_backend = STORAGE_BACKEND_FILE + except Exception as e: + print e + print "Defaulting to file storage" + self._storage_backend = STORAGE_BACKEND_FILE - CLOUD_STORAGE_CONFIG_SECTION = config.get("current_backend", "storage_backend") - self._storage_backend = CLOUD_STORAGE_CONFIG_SECTION if self._storage_backend == STORAGE_BACKEND_FILE: self._host = "" self._bucket = "" self._api_key = "" self._api_key_secret = "" else: - self._host = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'host') - self._bucket = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'bucket') - self._api_key = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key') - self._api_key_secret = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key_secret') + self._host = config.get(cloud_storage_config_section, 'host') + self._bucket = config.get(cloud_storage_config_section, 'bucket') + self._api_key = config.get(cloud_storage_config_section, 'api_key') + self._api_key_secret = config.get(cloud_storage_config_section, 'api_key_secret') + def enabled(self): if self._storage_backend == "file": diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader_libcloud.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader_libcloud.py index 045c719f10..c0950dc15f 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader_libcloud.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader_libcloud.py @@ -1,7 +1,7 @@ import os import logging import uuid -import config_file +import ConfigParser from libcloud.storage.providers import get_driver from libcloud.storage.types import Provider, ContainerDoesNotExistError, ObjectDoesNotExistError @@ -27,20 +27,30 @@ class CloudStorageUploader: def __init__(self): - config = config_file.read_config_file(CLOUD_CONFIG_PATH) + config = ConfigParser.SafeConfigParser() + try: + config.readfp(open(CLOUD_CONFIG_PATH)) + cloud_storage_config_section = config.get("current_backend", "storage_backend") + self._storage_backend = cloud_storage_config_section + except IOError as e: + print "Failed to open config file at " + CLOUD_CONFIG_PATH + ": " + e.strerror + print "Defaulting to file storage" + self._storage_backend = STORAGE_BACKEND_FILE + except Exception as e: + print e + print "Defaulting to file storage" + self._storage_backend = STORAGE_BACKEND_FILE - CLOUD_STORAGE_CONFIG_SECTION = config.get("current_backend", "storage_backend") - self._storage_backend = CLOUD_STORAGE_CONFIG_SECTION if self._storage_backend == STORAGE_BACKEND_FILE: self._provider = "" self._bucket = "" self._api_key = "" self._api_key_secret = "" else: - self._provider = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'provider') - self._bucket = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'bucket') - self._api_key = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key') - self._api_key_secret = config.get(CLOUD_STORAGE_CONFIG_SECTION, 'api_key_secret') + self._provider = config.get(cloud_storage_config_section, 'provider') + self._bucket = config.get(cloud_storage_config_section, 'bucket') + self._api_key = config.get(cloud_storage_config_section, 'api_key') + self._api_key_secret = config.get(cloud_storage_config_section, 'api_key_secret') def enabled(self): if self._storage_backend == "file": From 4b6e5671c336e17792fcc7fb0f8f202c389419d3 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 6 Feb 2015 14:33:02 -0500 Subject: [PATCH 297/310] REST permission fix --- .../application/controllers/plugins/Acl_plugin.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/controllers/plugins/Acl_plugin.php b/airtime_mvc/application/controllers/plugins/Acl_plugin.php index 4fa993e294..2696fd27d6 100644 --- a/airtime_mvc/application/controllers/plugins/Acl_plugin.php +++ b/airtime_mvc/application/controllers/plugins/Acl_plugin.php @@ -114,15 +114,17 @@ public function preDispatch(Zend_Controller_Request_Abstract $request) if (in_array($controller, array("api", "auth", "locale", "upgrade"))) { $this->setRoleName("G"); } elseif (!Zend_Auth::getInstance()->hasIdentity()) { - + // If we don't have an identity and we're making a RESTful request, // we need to do API key verification if ($request->getModuleName() == "rest") { - $this->verifyAuth(); - return; + if (!$this->verifyAuth()) { + $this->getResponse()->sendResponse(); + die(); + } } - if ($controller !== 'login') { + if ($controller !== 'login') { if ($request->isXmlHttpRequest()) { From 2a9790adf3dc58f022bfad3cbaa8d9e7163653ca Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 6 Feb 2015 16:05:51 -0500 Subject: [PATCH 298/310] Backport ACL REST permission fix --- airtime_mvc/application/configs/ACL.php | 3 +- .../controllers/plugins/Acl_plugin.php | 46 ++++++++++--------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/airtime_mvc/application/configs/ACL.php b/airtime_mvc/application/configs/ACL.php index 2dbb6f5cda..f1ae5a21c0 100644 --- a/airtime_mvc/application/configs/ACL.php +++ b/airtime_mvc/application/configs/ACL.php @@ -48,7 +48,8 @@ ->allow('G', 'locale') ->allow('G', 'upgrade') ->allow('G', 'downgrade') - ->allow('G', 'rest:media') + ->allow('G', 'rest:media', 'get') + ->allow('H', 'rest:media') ->allow('H', 'preference', 'is-import-in-progress') ->allow('H', 'usersettings') ->allow('H', 'plupload') diff --git a/airtime_mvc/application/controllers/plugins/Acl_plugin.php b/airtime_mvc/application/controllers/plugins/Acl_plugin.php index 2696fd27d6..bd803ec890 100644 --- a/airtime_mvc/application/controllers/plugins/Acl_plugin.php +++ b/airtime_mvc/application/controllers/plugins/Acl_plugin.php @@ -123,28 +123,32 @@ public function preDispatch(Zend_Controller_Request_Abstract $request) die(); } } - - if ($controller !== 'login') { - - if ($request->isXmlHttpRequest()) { - - $url = 'http://'.$request->getHttpHost().'/login'; - $json = Zend_Json::encode(array('auth' => false, 'url' => $url)); - - // Prepare response - $this->getResponse() - ->setHttpResponseCode(401) - ->setBody($json) - ->sendResponse(); - - //redirectAndExit() cleans up, sends the headers and stops the script - Zend_Controller_Action_HelperBroker::getStaticHelper('redirector')->redirectAndExit(); - } else { - $r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); - $r->gotoSimpleAndExit('index', 'login', $request->getModuleName()); - } + else //Non-REST, regular Airtime web app requests + { + //Redirect you to the login screen since you have no session. + if ($controller !== 'login') { + + if ($request->isXmlHttpRequest()) { + + $url = 'http://'.$request->getHttpHost().'/login'; + $json = Zend_Json::encode(array('auth' => false, 'url' => $url)); + + // Prepare response + $this->getResponse() + ->setHttpResponseCode(401) + ->setBody($json) + ->sendResponse(); + + //redirectAndExit() cleans up, sends the headers and stops the script + Zend_Controller_Action_HelperBroker::getStaticHelper('redirector')->redirectAndExit(); + } else { + $r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); + $r->gotoSimpleAndExit('index', 'login', $request->getModuleName()); + } + } } - } else { + } else { //We have a session/identity. + // If we have an identity and we're making a RESTful request, // we need to check the CSRF token if ($request->_action != "get" && $request->getModuleName() == "rest") { From eb403791528d026f6aca0097d337ec1e628eb237 Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Tue, 17 Feb 2015 11:44:31 -0500 Subject: [PATCH 299/310] SAAS-595 - Changed Zend validation and added sanitization in file import process to throw out bad track number metadata --- airtime_mvc/application/forms/EditAudioMD.php | 2 +- .../rest/controllers/MediaController.php | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/forms/EditAudioMD.php b/airtime_mvc/application/forms/EditAudioMD.php index 69ddbccde4..9fc41e3149 100644 --- a/airtime_mvc/application/forms/EditAudioMD.php +++ b/airtime_mvc/application/forms/EditAudioMD.php @@ -59,7 +59,7 @@ public function startForm($p_id) $track_number->class = 'input_text'; $track_number->setLabel('Track Number:') ->setFilters(array('StringTrim')) - ->setValidators(array(new Zend_Validate_Digits())); + ->setValidators(array(new Zend_Validate_Int())); $this->addElement($track_number); // Add genre field diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 7a78107112..1b9712bd28 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -113,6 +113,8 @@ public function postAction() $file->save(); return; } else { + // Sanitize any incorrect metadata that slipped past validation + $this->sanitizeData($file, $whiteList); /* If full_path is set, the post request came from ftp. * Users are allowed to upload folders via ftp. If this is the case * we need to include the folder name with the file name, otherwise @@ -165,6 +167,9 @@ public function putAction() $file->save(); return; } else if ($file) { + // Sanitize any incorrect metadata that slipped past validation + $this->sanitizeData($file, $whiteList); + $file->fromArray($whiteList, BasePeer::TYPE_FIELDNAME); //Our RESTful API takes "full_path" as a field, which we then split and translate to match @@ -297,6 +302,18 @@ private function validateRequestData($file, &$whiteList) return true; } + /** + * We want to throw out invalid data and process the upload successfully + * at all costs, so check the whitelisted data and sanitize it if necessary + * @param CcFiles $file CcFiles object being uploaded + * @param array $whitelist array of whitelisted (modifiable) file fields + */ + private function sanitizeData($file, &$whitelist) { + if (!ctype_digit(strval($whitelist["track_number"]))) { + $file->setDbTrackNumber(null); + } + } + private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) { $CC_CONFIG = Config::getConfig(); From a07a1edcc0f52d1509e446c30ffa8ad36b288add Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Tue, 17 Feb 2015 12:17:49 -0500 Subject: [PATCH 300/310] SAAS-595 - Updated validation and sanitization --- airtime_mvc/application/Bootstrap.php | 1 + .../application/common/FileDataHelper.php | 20 ++++++++ .../controllers/LibraryController.php | 4 +- .../rest/controllers/MediaController.php | 48 +++++++++++++------ 4 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 airtime_mvc/application/common/FileDataHelper.php diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index 2ebbac4ce7..b4a4fb43af 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -11,6 +11,7 @@ require_once 'Preference.php'; require_once 'Locale.php'; require_once "DateHelper.php"; +require_once "FileDataHelper.php"; require_once "HTTPHelper.php"; require_once "OsPath.php"; require_once "Database.php"; diff --git a/airtime_mvc/application/common/FileDataHelper.php b/airtime_mvc/application/common/FileDataHelper.php new file mode 100644 index 0000000000..4f8738b052 --- /dev/null +++ b/airtime_mvc/application/common/FileDataHelper.php @@ -0,0 +1,20 @@ +id)) { - $objInfo = Application_Model_Library::getObjInfo($obj_sess->type); - $objInfo = Application_Model_Library::getObjInfo($obj_sess->type); $obj = new $objInfo['className']($obj_sess->id); $userInfo = Zend_Auth::getInstance()->getStorage()->read(); @@ -446,6 +444,8 @@ public function editFileMdAction() } if ($form->isValid($serialized)) { + // Sanitize any incorrect metadata that slipped past validation + FileDataHelper::sanitizeData($serialized["track_number"]); $formValues = $this->_getParam('data', null); $formdata = array(); diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 1b9712bd28..74fc4c346a 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -114,7 +114,8 @@ public function postAction() return; } else { // Sanitize any incorrect metadata that slipped past validation - $this->sanitizeData($file, $whiteList); + FileDataHelper::sanitizeData($whiteList["track_number"]); + /* If full_path is set, the post request came from ftp. * Users are allowed to upload folders via ftp. If this is the case * we need to include the folder name with the file name, otherwise @@ -166,6 +167,37 @@ public function putAction() if (!$this->validateRequestData($file, $whiteList)) { $file->save(); return; + } else if ($file && isset($requestData["resource_id"])) { + // Sanitize any incorrect metadata that slipped past validation + FileDataHelper::sanitizeData($whiteList["track_number"]); + + $file->fromArray($whiteList, BasePeer::TYPE_FIELDNAME); + + //store the original filename + $file->setDbFilepath($requestData["filename"]); + + $fileSizeBytes = $requestData["filesize"]; + if (!isset($fileSizeBytes) || $fileSizeBytes === false) + { + $file->setDbImportStatus(2)->save(); + $this->fileNotFoundResponse(); + return; + } + $cloudFile = new CloudFile(); + $cloudFile->setStorageBackend($requestData["storage_backend"]); + $cloudFile->setResourceId($requestData["resource_id"]); + $cloudFile->setCcFiles($file); + $cloudFile->save(); + + Application_Model_Preference::updateDiskUsage($fileSizeBytes); + + $now = new DateTime("now", new DateTimeZone("UTC")); + $file->setDbMtime($now); + $file->save(); + + $this->getResponse() + ->setHttpResponseCode(200) + ->appendBody(json_encode(CcFiles::sanitizeResponse($file))); } else if ($file) { // Sanitize any incorrect metadata that slipped past validation $this->sanitizeData($file, $whiteList); @@ -267,7 +299,7 @@ private function validateRequestData($file, &$whiteList) $fileForm = new Application_Form_EditAudioMD(); $fileForm->startForm($file->getDbId()); $fileForm->populate($whiteList); - + /* * Here we are truncating metadata of any characters greater than the * max string length set in the database. In the rare case a track's @@ -302,18 +334,6 @@ private function validateRequestData($file, &$whiteList) return true; } - /** - * We want to throw out invalid data and process the upload successfully - * at all costs, so check the whitelisted data and sanitize it if necessary - * @param CcFiles $file CcFiles object being uploaded - * @param array $whitelist array of whitelisted (modifiable) file fields - */ - private function sanitizeData($file, &$whitelist) { - if (!ctype_digit(strval($whitelist["track_number"]))) { - $file->setDbTrackNumber(null); - } - } - private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) { $CC_CONFIG = Config::getConfig(); From 66a6a8f9859f8d4d0aa4e70222d92feb243e607b Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 17 Feb 2015 16:02:49 -0500 Subject: [PATCH 301/310] SAAS-596: Store file size and hash in database Added file size and hash to the metadata dict in the analyzer --- .../airtime_analyzer/metadata_analyzer.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index 45645bd32a..a127c3197a 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -4,6 +4,8 @@ import magic import wave import logging +import os +import hashlib from analyzer import Analyzer class MetadataAnalyzer(Analyzer): @@ -96,6 +98,23 @@ def analyze(filename, metadata): #If we couldn't figure out the track_number or track_total, just ignore it... pass + # Get file size and md5 hash of the file + try: + metadata["filesize"] = os.path.getsize(filename) + + with open(filename, 'rb') as fh: + m = hashlib.md5() + while True: + data = fh.read(8192) + if not data: + break + m.update(data) + metadata["md5_hash"] = m.hexdigest() + except (OSError, IOError) as e: + raise e + + + #We normalize the mutagen tags slightly here, so in case mutagen changes, #we find the mutagen_to_airtime_mapping = { From 17f1d0e96deadc1e417bfd5e81e0102136ff8097 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Wed, 18 Feb 2015 16:29:08 -0500 Subject: [PATCH 302/310] Simplify the metadata sanitization and bugfix it * SAAS-376 and CC-5868 --- .../application/common/FileDataHelper.php | 18 +++++++++------- .../controllers/LibraryController.php | 21 ++++--------------- .../rest/controllers/MediaController.php | 10 +++------ 3 files changed, 17 insertions(+), 32 deletions(-) diff --git a/airtime_mvc/application/common/FileDataHelper.php b/airtime_mvc/application/common/FileDataHelper.php index 4f8738b052..fc93c64fef 100644 --- a/airtime_mvc/application/common/FileDataHelper.php +++ b/airtime_mvc/application/common/FileDataHelper.php @@ -1,9 +1,4 @@ isValid($serialized)) { - // Sanitize any incorrect metadata that slipped past validation - FileDataHelper::sanitizeData($serialized["track_number"]); - - $formValues = $this->_getParam('data', null); - $formdata = array(); - foreach ($formValues as $val) { - $formdata[$val["name"]] = $val["value"]; - } - $file->setDbColMetadata($formdata); - - $data = $file->getMetadata(); - - // set MDATA_KEY_FILEPATH - $data['MDATA_KEY_FILEPATH'] = $file->getFilePath(); - Logging::info($data['MDATA_KEY_FILEPATH']); - Application_Model_RabbitMq::SendMessageToMediaMonitor("md_update", $data); + // Sanitize any wildly incorrect metadata before it goes to be validated. + FileDataHelper::sanitizeData($serialized); + if ($form->isValid($serialized)) { + $file->setDbColMetadata($serialized); $this->_redirect('Library'); } } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 74fc4c346a..90587d4803 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -113,9 +113,6 @@ public function postAction() $file->save(); return; } else { - // Sanitize any incorrect metadata that slipped past validation - FileDataHelper::sanitizeData($whiteList["track_number"]); - /* If full_path is set, the post request came from ftp. * Users are allowed to upload folders via ftp. If this is the case * we need to include the folder name with the file name, otherwise @@ -168,8 +165,6 @@ public function putAction() $file->save(); return; } else if ($file && isset($requestData["resource_id"])) { - // Sanitize any incorrect metadata that slipped past validation - FileDataHelper::sanitizeData($whiteList["track_number"]); $file->fromArray($whiteList, BasePeer::TYPE_FIELDNAME); @@ -199,8 +194,6 @@ public function putAction() ->setHttpResponseCode(200) ->appendBody(json_encode(CcFiles::sanitizeResponse($file))); } else if ($file) { - // Sanitize any incorrect metadata that slipped past validation - $this->sanitizeData($file, $whiteList); $file->fromArray($whiteList, BasePeer::TYPE_FIELDNAME); @@ -294,6 +287,9 @@ private function invalidDataResponse() private function validateRequestData($file, &$whiteList) { + // Sanitize any wildly incorrect metadata before it goes to be validated + FileDataHelper::sanitizeData($whiteList); + try { // EditAudioMD form is used here for validation $fileForm = new Application_Form_EditAudioMD(); From 487ab9bd9997467bf4eefba8faba849e7b43e7b2 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 19 Feb 2015 09:31:23 -0500 Subject: [PATCH 303/310] CC-5868: Make the BPM field less strict --- airtime_mvc/application/common/FileDataHelper.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/airtime_mvc/application/common/FileDataHelper.php b/airtime_mvc/application/common/FileDataHelper.php index fc93c64fef..7048d65030 100644 --- a/airtime_mvc/application/common/FileDataHelper.php +++ b/airtime_mvc/application/common/FileDataHelper.php @@ -17,6 +17,12 @@ public static function sanitizeData(&$data) // If the track number isn't numeric, this will return 0 $data["year"] = intval($data["year"]); } + if (array_key_exists("bpm", $data)) { + //Some BPM tags are silly and include the word "BPM". Let's strip that... + $data["year"] = str_ireplace("BPM", "", $data["year"]); + // This will convert floats to ints too. + $data["year"] = intval($data["year"]); + } } } \ No newline at end of file From cc9e6efbca482445f2a2540211798873fb63de0d Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 19 Feb 2015 10:38:30 -0500 Subject: [PATCH 304/310] SAAS-596: Store file size and hash in database Removed try/except while getting file size and hash --- .../airtime_analyzer/metadata_analyzer.py | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index a127c3197a..d273112dfe 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -99,19 +99,16 @@ def analyze(filename, metadata): pass # Get file size and md5 hash of the file - try: - metadata["filesize"] = os.path.getsize(filename) - - with open(filename, 'rb') as fh: - m = hashlib.md5() - while True: - data = fh.read(8192) - if not data: - break - m.update(data) - metadata["md5_hash"] = m.hexdigest() - except (OSError, IOError) as e: - raise e + metadata["filesize"] = os.path.getsize(filename) + + with open(filename, 'rb') as fh: + m = hashlib.md5() + while True: + data = fh.read(8192) + if not data: + break + m.update(data) + metadata["md5_hash"] = m.hexdigest() From 0177e400836a235e6ce525a99efe56b8e9fc70fd Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 19 Feb 2015 15:10:01 -0500 Subject: [PATCH 305/310] Pull the logic for Media REST API out of the controller --- airtime_mvc/application/common/HTTPHelper.php | 18 + .../application/models/airtime/CcFiles.php | 366 +++++++++++++++- .../rest/controllers/MediaController.php | 389 +++--------------- .../application/services/MediaService.php | 41 ++ airtime_mvc/public/index.php | 3 + 5 files changed, 482 insertions(+), 335 deletions(-) create mode 100644 airtime_mvc/application/services/MediaService.php diff --git a/airtime_mvc/application/common/HTTPHelper.php b/airtime_mvc/application/common/HTTPHelper.php index db314bb0b2..505befd7ef 100644 --- a/airtime_mvc/application/common/HTTPHelper.php +++ b/airtime_mvc/application/common/HTTPHelper.php @@ -17,4 +17,22 @@ public static function getStartEndFromRequest($request) $request->getParam("timezone", null) ); } + + public static function getStationUrl() + { + $scheme = "http"; + if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') { + $scheme = "https"; + } + $CC_CONFIG = Config::getConfig(); + $baseUrl = $CC_CONFIG['baseUrl']; + $baseDir = $CC_CONFIG['baseDir']; + $basePort = $CC_CONFIG['basePort']; + if (empty($baseDir)) { + $baseDir = "/"; + } + $stationUrl = "$scheme://${baseUrl}:${basePort}${baseDir}"; + + return $stationUrl; + } } diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index 93ef491a8e..554139e40a 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -11,17 +11,288 @@ * * @package propel.generator.campcaster */ + +class InvalidMetadataException extends Exception +{ +} + +class FileNotFoundException extends Exception +{ +} + +class OverDiskQuotaException extends Exception +{ + +} + class CcFiles extends BaseCcFiles { - + + const MUSIC_DIRS_STOR_PK = 1; + + + //fields that are not modifiable via our RESTful API + private static $blackList = array( + 'id', + 'directory', + 'filepath', + 'file_exists', + 'mtime', + 'utime', + 'lptime', + 'silan_check', + 'soundcloud_id', + 'is_scheduled', + 'is_playlist' + ); + //fields we should never expose through our RESTful API private static $privateFields = array( - 'file_exists', - 'silan_check', - 'is_scheduled', - 'is_playlist' + 'file_exists', + 'silan_check', + 'is_scheduled', + 'is_playlist' ); - - public function getCueLength() + + /** + * Retrieve a sanitized version of the file metadata, suitable for public access. + * @param $fileId + */ + public static function getSantiziedFileById($fileId) + { + $file = CcFilesQuery::create()->findPk($fileId); + if ($file) { + return CcFiles::sanitizeResponse($file); + } else { + throw new FileNotFoundException(); + } + } + + /** Used to create a CcFiles object from an array containing metadata and a file uploaded by POST. + * This is used by our Media REST API! + * @param $fileArray An array containing metadata for a CcFiles object. + * @throws Exception + */ + public static function createFromUpload($fileArray) + { + if (Application_Model_Systemstatus::isDiskOverQuota()) { + throw new OverDiskQuotaException(); + } + + $file = new CcFiles(); + + try{ + $fileArray = self::removeBlacklistedFields($fileArray); + + /*if (!self::validateFileArray($fileArray)) + { + $file->setDbTrackTitle($_FILES["file"]["name"]); + $file->setDbUtime(new DateTime("now", new DateTimeZone("UTC"))); + $file->save(); + return CcFiles::sanitizeResponse($file);*/ + self::validateFileArray($fileArray); + + /* If full_path is set, the post request came from ftp. + * Users are allowed to upload folders via ftp. If this is the case + * we need to include the folder name with the file name, otherwise + * files won't get removed from the organize folder. + */ + if (isset($fileArray["full_path"])) { + $fullPath = $fileArray["full_path"]; + $basePath = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/organize/" : "/srv/airtime/stor/organize/"; + //$relativePath is the folder name(if one) + track name, that was uploaded via ftp + $relativePath = substr($fullPath, strlen($basePath)-1); + } else { + $relativePath = $_FILES["file"]["name"]; + } + + + $file->fromArray($fileArray); + $file->setDbOwnerId(self::getOwnerId()); + $now = new DateTime("now", new DateTimeZone("UTC")); + $file->setDbTrackTitle($_FILES["file"]["name"]); + $file->setDbUtime($now); + $file->setDbHidden(true); + $file->save(); + + $callbackUrl = Application_Common_HTTPHelper::getStationUrl() . "/rest/media/" . $file->getPrimaryKey(); + + Application_Service_MediaService::processUploadedFile($callbackUrl, $relativePath, self::getOwnerId()); + return CcFiles::sanitizeResponse($file); + + } catch (Exception $e) { + $file->setDbImportStatus(2); + $file->setDbHidden(true); + throw $e; + } + } + + /** Update a file with metadata specified in an array. + * @param $fileId The ID of the file to update in the DB. + * @param $fileArray An associative array containing metadata. Replaces those fields if they exist. + * @return array A sanitized version of the file metadata array. + * @throws Exception + * @throws FileNotFoundException + * @throws PropelException + */ + public static function updateFromArray($fileId, $fileArray) + { + $file = CcFilesQuery::create()->findPk($fileId); + + // Since we check for this value when deleting files, set it first + $file->setDbDirectory(self::MUSIC_DIRS_STOR_PK); + + $fileArray = self::removeBlacklistedFields($fileArray); + $fileArray = self::stripTimeStampFromYearTag($fileArray); + + self::validateFileArray($fileArray); + if ($file && isset($requestData["resource_id"])) { + + $file->fromArray($fileArray, BasePeer::TYPE_FIELDNAME); + + //store the original filename + $file->setDbFilepath($fileArray["filename"]); + + $fileSizeBytes = $fileArray["filesize"]; + if (!isset($fileSizeBytes) || $fileSizeBytes === false) + { + $file->setDbImportStatus(2)->save(); + throw new FileNotFoundException(); + } + $cloudFile = new CloudFile(); + $cloudFile->setStorageBackend($fileArray["storage_backend"]); + $cloudFile->setResourceId($fileArray["resource_id"]); + $cloudFile->setCcFiles($file); + $cloudFile->save(); + + Application_Model_Preference::updateDiskUsage($fileSizeBytes); + + $now = new DateTime("now", new DateTimeZone("UTC")); + $file->setDbMtime($now); + $file->save(); + + } else if ($file) { + + $file->fromArray($fileArray, BasePeer::TYPE_FIELDNAME); + + //Our RESTful API takes "full_path" as a field, which we then split and translate to match + //our internal schema. Internally, file path is stored relative to a directory, with the directory + //as a foreign key to cc_music_dirs. + if (isset($fileArray["full_path"])) { + $fileSizeBytes = filesize($fileArray["full_path"]); + if (!isset($fileSizeBytes) || $fileSizeBytes === false) + { + $file->setDbImportStatus(self::IMPORT_STATUS_FAILED)->save(); + throw new FileNotFoundException(); + } + Application_Model_Preference::updateDiskUsage($fileSizeBytes); + + $fullPath = $fileArray["full_path"]; + $storDir = Application_Model_MusicDir::getStorDir()->getDirectory(); + $pos = strpos($fullPath, $storDir); + + if ($pos !== FALSE) + { + assert($pos == 0); //Path must start with the stor directory path + + $filePathRelativeToStor = substr($fullPath, strlen($storDir)); + $file->setDbFilepath($filePathRelativeToStor); + } + } + + $now = new DateTime("now", new DateTimeZone("UTC")); + $file->setDbMtime($now); + $file->save(); + + /* $this->removeEmptySubFolders( + isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/organize/" : "/srv/airtime/stor/organize/"); */ + } else { + $file->setDbImportStatus(self::IMPORT_STATUS_FAILED)->save(); + throw new FileNotFoundException(); + } + + return CcFiles::sanitizeResponse($file); + } + + /** Delete a file from the database and disk (or cloud). + * @param $id The file ID + * @throws DeleteScheduledFileException + * @throws Exception + * @throws FileNoPermissionException + * @throws FileNotFoundException + * @throws PropelException + */ + public static function deleteById($id) + { + $file = CcFilesQuery::create()->findPk($id); + if ($file) { + $con = Propel::getConnection(); + $storedFile = new Application_Model_StoredFile($file, $con); + if ($storedFile->existsOnDisk()) { + $storedFile->delete(); //TODO: This checks your session permissions... Make it work without a session? + } + $file->delete(); + } else { + throw new FileNotFoundException(); + } + + } + + public static function getDownloadUrl($id) + { + $file = CcFilesQuery::create()->findPk($id); + if ($file) { + $con = Propel::getConnection(); + $storedFile = new Application_Model_StoredFile($file, $con); + $baseDir = Application_Common_OsPath::getBaseDir(); + + return $storedFile->getRelativeFileUrl($baseDir) . '/download/true'; + } + else { + throw new FileNotFoundException(); + } + } + + private static function validateFileArray(&$fileArray) + { + // Sanitize any wildly incorrect metadata before it goes to be validated + FileDataHelper::sanitizeData($fileArray); + + // EditAudioMD form is used here for validation + $fileForm = new Application_Form_EditAudioMD(); + $fileForm->startForm(0); //The file ID doesn't matter here + $fileForm->populate($fileArray); + + /* + * Here we are truncating metadata of any characters greater than the + * max string length set in the database. In the rare case a track's + * genre is more than 64 chars, for example, we don't want to reject + * tracks for that reason + */ + foreach($fileArray as $tag => &$value) { + if ($fileForm->getElement($tag)) { + $stringLengthValidator = $fileForm->getElement($tag)->getValidator('StringLength'); + //$stringLengthValidator will be false if the StringLength validator doesn't exist on the current element + //in which case we don't have to truncate the extra characters + if ($stringLengthValidator) { + $value = substr($value, 0, $stringLengthValidator->getMax()); + } + + $value = self::stripInvalidUtf8Characters($value); + } + } + + if (!$fileForm->isValidPartial($fileArray)) { + $errors = $fileForm->getErrors(); + $messages = $fileForm->getMessages(); + Logging::error($messages); + throw new Exception("Data validation failed: $errors - $messages"); + } + + return true; + } + + + public function getCueLength() { $cuein = $this->getDbCuein(); $cueout = $this->getDbCueout(); @@ -70,4 +341,83 @@ public static function sanitizeResponse($file) return $response; } -} // CcFiles + + /** + * + * Strips out fields from incoming request data that should never be modified + * from outside of Airtime + * @param array $data + */ + private static function removeBlacklistedFields($data) + { + foreach (self::$blackList as $key) { + unset($data[$key]); + } + + return $data; + } + + + private static function getOwnerId() + { + try { + if (Zend_Auth::getInstance()->hasIdentity()) { + $service_user = new Application_Service_UserService(); + return $service_user->getCurrentUser()->getDbId(); + } else { + $defaultOwner = CcSubjsQuery::create() + ->filterByDbType('A') + ->orderByDbId() + ->findOne(); + if (!$defaultOwner) { + // what to do if there is no admin user? + // should we handle this case? + return null; + } + return $defaultOwner->getDbId(); + } + } catch(Exception $e) { + Logging::info($e->getMessage()); + } + } + /* + * It's possible that the year tag will be a timestamp but Airtime doesn't support this. + * The year field in cc_files can only be 16 chars max. + * + * This functions strips the year field of it's timestamp, if one, and leaves just the year + */ + private static function stripTimeStampFromYearTag($metadata) + { + if (isset($metadata["year"])) { + if (preg_match("/^(\d{4})-(\d{2})-(\d{2})(?:\s+(\d{2}):(\d{2}):(\d{2}))?$/", $metadata["year"])) { + $metadata["year"] = substr($metadata["year"], 0, 4); + } + } + return $metadata; + } + + private static function stripInvalidUtf8Characters($string) + { + //Remove invalid UTF-8 characters + //reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ? + $string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'. + '|[\x00-\x7F][\x80-\xBF]+'. + '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'. + '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'. + '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S', + '?', $string ); + + //reject overly long 3 byte sequences and UTF-16 surrogates and replace with ? + $string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'. + '|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $string ); + + //Do a final encoding conversion to + $string = mb_convert_encoding($string, 'UTF-8', 'UTF-8'); + return $string; + } + + private function removeEmptySubFolders($path) + { + exec("find $path -empty -type d -delete"); + } +} diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 90587d4803..08240dc801 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -2,26 +2,10 @@ class Rest_MediaController extends Zend_Rest_Controller { - const MUSIC_DIRS_STOR_PK = 1; - const IMPORT_STATUS_SUCCESS = 0; const IMPORT_STATUS_PENDING = 1; const IMPORT_STATUS_FAILED = 2; - //fields that are not modifiable via our RESTful API - private static $blackList = array( - 'id', - 'directory', - 'filepath', - 'file_exists', - 'mtime', - 'utime', - 'lptime', - 'silan_check', - 'soundcloud_id', - 'is_scheduled', - 'is_playlist' - ); public function init() { @@ -54,17 +38,19 @@ public function downloadAction() return; } - $file = CcFilesQuery::create()->findPk($id); - if ($file) { - $con = Propel::getConnection(); - $storedFile = new Application_Model_StoredFile($file, $con); - $baseUrl = Application_Common_OsPath::getBaseDir(); - + try + { $this->getResponse() ->setHttpResponseCode(200) - ->appendBody($this->_redirect($storedFile->getRelativeFileUrl($baseUrl).'/download/true')); - } else { + ->appendBody($this->_redirect(CcFiles::getDownloadUrl($id))); + } + catch (FileNotFoundException $e) { $this->fileNotFoundResponse(); + Logging::error($e->getMessage()); + } + catch (Exception $e) { + $this->unknownErrorResponse(); + Logging::error($e->getMessage()); } } @@ -75,14 +61,18 @@ public function getAction() return; } - $file = CcFilesQuery::create()->findPk($id); - if ($file) { - + try { $this->getResponse() ->setHttpResponseCode(200) - ->appendBody(json_encode(CcFiles::sanitizeResponse($file))); - } else { + ->appendBody(json_encode(CcFiles::getSantiziedFileById($id))); + } + catch (FileNotFoundException $e) { $this->fileNotFoundResponse(); + Logging::error($e->getMessage()); + } + catch (Exception $e) { + $this->unknownErrorResponse(); + Logging::error($e->getMessage()); } } @@ -97,52 +87,24 @@ public function postAction() return; } - if (Application_Model_Systemstatus::isDiskOverQuota()) { + try { + $sanitizedFile = CcFiles::createFromUpload($this->getRequest()->getPost()); + $this->getResponse() + ->setHttpResponseCode(201) + ->appendBody(json_encode($sanitizedFile)); + } + catch (InvalidMetadataException $e) { + $this->invalidDataResponse(); + Logging::error($e->getMessage()); + } + catch (OverDiskQuotaException $e) { $this->getResponse() ->setHttpResponseCode(400) ->appendBody("ERROR: Disk Quota reached."); - return; } - - $file = new CcFiles(); - $whiteList = $this->removeBlacklistedFieldsFromRequestData($this->getRequest()->getPost()); - - if (!$this->validateRequestData($file, $whiteList)) { - $file->setDbTrackTitle($_FILES["file"]["name"]); - $file->setDbUtime(new DateTime("now", new DateTimeZone("UTC"))); - $file->save(); - return; - } else { - /* If full_path is set, the post request came from ftp. - * Users are allowed to upload folders via ftp. If this is the case - * we need to include the folder name with the file name, otherwise - * files won't get removed from the organize folder. - */ - if (isset($whiteList["full_path"])) { - $fullPath = $whiteList["full_path"]; - $basePath = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/organize/" : "/srv/airtime/stor/organize/"; - //$relativePath is the folder name(if one) + track name, that was uploaded via ftp - $relativePath = substr($fullPath, strlen($basePath)-1); - } else { - $relativePath = $_FILES["file"]["name"]; - } - - - $file->fromArray($whiteList); - $file->setDbOwnerId($this->getOwnerId()); - $now = new DateTime("now", new DateTimeZone("UTC")); - $file->setDbTrackTitle($_FILES["file"]["name"]); - $file->setDbUtime($now); - $file->setDbHidden(true); - $file->save(); - - $callbackUrl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getRequestUri() . "/" . $file->getPrimaryKey(); - - $this->processUploadedFile($callbackUrl, $relativePath, $this->getOwnerId()); - - $this->getResponse() - ->setHttpResponseCode(201) - ->appendBody(json_encode(CcFiles::sanitizeResponse($file))); + catch (Exception $e) { + $this->unknownErrorResponse(); + Logging::error($e->getMessage()); } } @@ -152,90 +114,25 @@ public function putAction() if (!$id) { return; } - - $file = CcFilesQuery::create()->findPk($id); - // Since we check for this value when deleting files, set it first - $file->setDbDirectory(self::MUSIC_DIRS_STOR_PK); - - $requestData = json_decode($this->getRequest()->getRawBody(), true); - $whiteList = $this->removeBlacklistedFieldsFromRequestData($requestData); - $whiteList = $this->stripTimeStampFromYearTag($whiteList); - - if (!$this->validateRequestData($file, $whiteList)) { - $file->save(); - return; - } else if ($file && isset($requestData["resource_id"])) { - - $file->fromArray($whiteList, BasePeer::TYPE_FIELDNAME); - - //store the original filename - $file->setDbFilepath($requestData["filename"]); - - $fileSizeBytes = $requestData["filesize"]; - if (!isset($fileSizeBytes) || $fileSizeBytes === false) - { - $file->setDbImportStatus(2)->save(); - $this->fileNotFoundResponse(); - return; - } - $cloudFile = new CloudFile(); - $cloudFile->setStorageBackend($requestData["storage_backend"]); - $cloudFile->setResourceId($requestData["resource_id"]); - $cloudFile->setCcFiles($file); - $cloudFile->save(); - - Application_Model_Preference::updateDiskUsage($fileSizeBytes); - - $now = new DateTime("now", new DateTimeZone("UTC")); - $file->setDbMtime($now); - $file->save(); - - $this->getResponse() - ->setHttpResponseCode(200) - ->appendBody(json_encode(CcFiles::sanitizeResponse($file))); - } else if ($file) { - $file->fromArray($whiteList, BasePeer::TYPE_FIELDNAME); - - //Our RESTful API takes "full_path" as a field, which we then split and translate to match - //our internal schema. Internally, file path is stored relative to a directory, with the directory - //as a foreign key to cc_music_dirs. - if (isset($requestData["full_path"])) { - $fileSizeBytes = filesize($requestData["full_path"]); - if (!isset($fileSizeBytes) || $fileSizeBytes === false) - { - $file->setDbImportStatus(self::IMPORT_STATUS_FAILED)->save(); - $this->fileNotFoundResponse(); - return; - } - Application_Model_Preference::updateDiskUsage($fileSizeBytes); - - $fullPath = $requestData["full_path"]; - $storDir = Application_Model_MusicDir::getStorDir()->getDirectory(); - $pos = strpos($fullPath, $storDir); - - if ($pos !== FALSE) - { - assert($pos == 0); //Path must start with the stor directory path - - $filePathRelativeToStor = substr($fullPath, strlen($storDir)); - $file->setDbFilepath($filePathRelativeToStor); - } - } - - $now = new DateTime("now", new DateTimeZone("UTC")); - $file->setDbMtime($now); - $file->save(); - - /* $this->removeEmptySubFolders( - isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."/srv/airtime/stor/organize/" : "/srv/airtime/stor/organize/"); */ - + try { + $requestData = json_decode($this->getRequest()->getRawBody(), true); + $sanitizedFile = CcFiles::updateFromArray($id, $requestData); $this->getResponse() - ->setHttpResponseCode(200) - ->appendBody(json_encode(CcFiles::sanitizeResponse($file))); - } else { - $file->setDbImportStatus(self::IMPORT_STATUS_FAILED)->save(); + ->setHttpResponseCode(201) + ->appendBody(json_encode($sanitizedFile)); + } + catch (InvalidMetadataException $e) { + $this->invalidDataResponse(); + Logging::error($e->getMessage()); + } + catch (FileNotFoundException $e) { $this->fileNotFoundResponse(); + Logging::error($e->getMessage()); + } + catch (Exception $e) { + $this->unknownErrorResponse(); + Logging::error($e->getMessage()); } } @@ -245,18 +142,19 @@ public function deleteAction() if (!$id) { return; } - $file = CcFilesQuery::create()->findPk($id); - if ($file) { - $con = Propel::getConnection(); - $storedFile = new Application_Model_StoredFile($file, $con); - if ($storedFile->existsOnDisk()) { - $storedFile->delete(); //TODO: This checks your session permissions... Make it work without a session? - } - $file->delete(); + + try { + CcFiles::deleteById($id); $this->getResponse() ->setHttpResponseCode(204); - } else { + } + catch (FileNotFoundException $e) { $this->fileNotFoundResponse(); + Logging::error($e->getMessage()); + } + catch (Exception $e) { + $this->unknownErrorResponse(); + Logging::error($e->getMessage()); } } @@ -278,174 +176,11 @@ private function fileNotFoundResponse() $resp->appendBody("ERROR: Media not found."); } - private function invalidDataResponse() + private function unknownErrorResponse() { $resp = $this->getResponse(); - $resp->setHttpResponseCode(422); - $resp->appendBody("ERROR: Invalid data"); - } - - private function validateRequestData($file, &$whiteList) - { - // Sanitize any wildly incorrect metadata before it goes to be validated - FileDataHelper::sanitizeData($whiteList); - - try { - // EditAudioMD form is used here for validation - $fileForm = new Application_Form_EditAudioMD(); - $fileForm->startForm($file->getDbId()); - $fileForm->populate($whiteList); - - /* - * Here we are truncating metadata of any characters greater than the - * max string length set in the database. In the rare case a track's - * genre is more than 64 chars, for example, we don't want to reject - * tracks for that reason - */ - foreach($whiteList as $tag => &$value) { - if ($fileForm->getElement($tag)) { - $stringLengthValidator = $fileForm->getElement($tag)->getValidator('StringLength'); - //$stringLengthValidator will be false if the StringLength validator doesn't exist on the current element - //in which case we don't have to truncate the extra characters - if ($stringLengthValidator) { - $value = substr($value, 0, $stringLengthValidator->getMax()); - } - - $value = $this->stripInvalidUtf8Characters($value); - } - } - - if (!$fileForm->isValidPartial($whiteList)) { - throw new Exception("Data validation failed"); - } - } catch (Exception $e) { - $errors = $fileForm->getErrors(); - $messages = $fileForm->getMessages(); - Logging::error($messages); - $file->setDbImportStatus(2); - $file->setDbHidden(true); - $this->invalidDataResponse(); - return false; - } - return true; - } - - private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) - { - $CC_CONFIG = Config::getConfig(); - $apiKey = $CC_CONFIG["apiKey"][0]; - - $tempFilePath = $_FILES['file']['tmp_name']; - $tempFileName = basename($tempFilePath); - - //Only accept files with a file extension that we support. - $fileExtension = pathinfo($originalFilename, PATHINFO_EXTENSION); - if (!in_array(strtolower($fileExtension), explode(",", "ogg,mp3,oga,flac,wav,m4a,mp4,opus"))) - { - @unlink($tempFilePath); - throw new Exception("Bad file extension."); - } - - //TODO: Remove uploadFileAction from ApiController.php **IMPORTANT** - It's used by the recorder daemon... - - $storDir = Application_Model_MusicDir::getStorDir(); - $importedStorageDirectory = $storDir->getDirectory() . "/imported/" . $ownerId; - - try { - //Copy the temporary file over to the "organize" folder so that it's off our webserver - //and accessible by airtime_analyzer which could be running on a different machine. - $newTempFilePath = Application_Model_StoredFile::copyFileToStor($tempFilePath, $originalFilename); - } catch (Exception $e) { - @unlink($tempFilePath); - Logging::error($e->getMessage()); - return; - } - - //Dispatch a message to airtime_analyzer through RabbitMQ, - //notifying it that there's a new upload to process! - Application_Model_RabbitMq::SendMessageToAnalyzer($newTempFilePath, - $importedStorageDirectory, basename($originalFilename), - $callbackUrl, $apiKey); - } - - private function getOwnerId() - { - try { - if (Zend_Auth::getInstance()->hasIdentity()) { - $service_user = new Application_Service_UserService(); - return $service_user->getCurrentUser()->getDbId(); - } else { - $defaultOwner = CcSubjsQuery::create() - ->filterByDbType('A') - ->orderByDbId() - ->findOne(); - if (!$defaultOwner) { - // what to do if there is no admin user? - // should we handle this case? - return null; - } - return $defaultOwner->getDbId(); - } - } catch(Exception $e) { - Logging::info($e->getMessage()); - } - } - - /** - * - * Strips out fields from incoming request data that should never be modified - * from outside of Airtime - * @param array $data - */ - private static function removeBlacklistedFieldsFromRequestData($data) - { - foreach (self::$blackList as $key) { - unset($data[$key]); - } - - return $data; - } - - - private function removeEmptySubFolders($path) - { - exec("find $path -empty -type d -delete"); - } - - /* - * It's possible that the year tag will be a timestamp but Airtime doesn't support this. - * The year field in cc_files can only be 16 chars max. - * - * This functions strips the year field of it's timestamp, if one, and leaves just the year - */ - private function stripTimeStampFromYearTag($metadata) - { - if (isset($metadata["year"])) { - if (preg_match("/^(\d{4})-(\d{2})-(\d{2})(?:\s+(\d{2}):(\d{2}):(\d{2}))?$/", $metadata["year"])) { - $metadata["year"] = substr($metadata["year"], 0, 4); - } - } - return $metadata; - } - - private function stripInvalidUtf8Characters($string) - { - //Remove invalid UTF-8 characters - //reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ? - $string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'. - '|[\x00-\x7F][\x80-\xBF]+'. - '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'. - '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'. - '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S', - '?', $string ); - - //reject overly long 3 byte sequences and UTF-16 surrogates and replace with ? - $string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'. - '|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $string ); - - //Do a final encoding conversion to - $string = mb_convert_encoding($string, 'UTF-8', 'UTF-8'); - return $string; + $resp->setHttpResponseCode(400); + $resp->appendBody("An unknown error occurred."); } } diff --git a/airtime_mvc/application/services/MediaService.php b/airtime_mvc/application/services/MediaService.php new file mode 100644 index 0000000000..74b2609d03 --- /dev/null +++ b/airtime_mvc/application/services/MediaService.php @@ -0,0 +1,41 @@ +getDirectory() . "/imported/" . $ownerId; + + try { + //Copy the temporary file over to the "organize" folder so that it's off our webserver + //and accessible by airtime_analyzer which could be running on a different machine. + $newTempFilePath = Application_Model_StoredFile::copyFileToStor($tempFilePath, $originalFilename); + } catch (Exception $e) { + @unlink($tempFilePath); + Logging::error($e->getMessage()); + return; + } + + //Dispatch a message to airtime_analyzer through RabbitMQ, + //notifying it that there's a new upload to process! + Application_Model_RabbitMq::SendMessageToAnalyzer($newTempFilePath, + $importedStorageDirectory, basename($originalFilename), + $callbackUrl, $apiKey); + } +} \ No newline at end of file diff --git a/airtime_mvc/public/index.php b/airtime_mvc/public/index.php index f9c691f51a..c45ac3b1d0 100644 --- a/airtime_mvc/public/index.php +++ b/airtime_mvc/public/index.php @@ -49,6 +49,9 @@ function exception_error_handler($errno, $errstr, $errfile, $errline) //Controller plugins. set_include_path(APPLICATION_PATH . '/controllers/plugins' . PATH_SEPARATOR . get_include_path()); +//Services. +set_include_path(APPLICATION_PATH . '/services/' . PATH_SEPARATOR . get_include_path()); + //Zend framework if (file_exists('/usr/share/php/libzend-framework-php')) { set_include_path('/usr/share/php/libzend-framework-php' . PATH_SEPARATOR . get_include_path()); From b6acfb2dcedf8775706156997d5b3816c07578d0 Mon Sep 17 00:00:00 2001 From: drigato Date: Thu, 19 Feb 2015 15:39:55 -0500 Subject: [PATCH 306/310] SAAS-596: Store file size and hash in database Renamed metadata md5 value to match cc_files column --- .../airtime_analyzer/airtime_analyzer/metadata_analyzer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py index d273112dfe..57d2785483 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/metadata_analyzer.py @@ -108,7 +108,7 @@ def analyze(filename, metadata): if not data: break m.update(data) - metadata["md5_hash"] = m.hexdigest() + metadata["md5"] = m.hexdigest() From be7cae44087188edb3c9b77dfb2a1d8f7dbe8ed2 Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Fri, 20 Feb 2015 13:12:49 -0500 Subject: [PATCH 307/310] Fixed CSRF prevention checks for REST calls, moved CSRF initialization to Bootstrap --- airtime_mvc/application/Bootstrap.php | 17 ++++++++++++++++- .../controllers/LoginController.php | 3 +++ .../controllers/PluploadController.php | 5 +++-- .../controllers/plugins/Acl_plugin.php | 19 +++++++++++-------- 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index b4a4fb43af..787bc5d03b 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -65,13 +65,28 @@ protected function _initGlobals() } $view->headScript()->appendScript("var userType = '$userType';"); } + + /** + * Create a global namespace to hold a session token for CSRF prevention + */ + protected function _initCsrfNamespace() { + $csrf_namespace = new Zend_Session_Namespace('csrf_namespace'); + // Check if the token exists + if (!$csrf_namespace->authtoken) { + // If we don't have a token, regenerate it and set a 2 hour timeout + // Should we log the user out here if the token is expired? + $csrf_namespace->authtoken = sha1(uniqid(rand(),1)); + $csrf_namespace->setExpirationSeconds(2*60*60); + } + } /** * Ideally, globals should be written to a single js file once * from a php init function. This will save us from having to * reinitialize them every request */ - private function _initTranslationGlobals($view) { + protected function _initTranslationGlobals() { + $view = $this->getResource('view'); $view->headScript()->appendScript("var PRODUCT_NAME = '" . PRODUCT_NAME . "';"); $view->headScript()->appendScript("var USER_MANUAL_URL = '" . USER_MANUAL_URL . "';"); $view->headScript()->appendScript("var COMPANY_NAME = '" . COMPANY_NAME . "';"); diff --git a/airtime_mvc/application/controllers/LoginController.php b/airtime_mvc/application/controllers/LoginController.php index c808c2aee0..7566adb6fd 100644 --- a/airtime_mvc/application/controllers/LoginController.php +++ b/airtime_mvc/application/controllers/LoginController.php @@ -98,6 +98,9 @@ public function logoutAction() { $auth = Zend_Auth::getInstance(); $auth->clearIdentity(); + // Unset all session variables relating to CSRF prevention on logout + $csrf_namespace = new Zend_Session_Namespace('csrf_namespace'); + $csrf_namespace->unsetAll(); $this->_redirect('showbuilder/index'); } diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index f1197ec2be..6aae736ae2 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -32,8 +32,9 @@ public function indexAction() } $csrf_namespace = new Zend_Session_Namespace('csrf_namespace'); - $csrf_namespace->setExpirationSeconds(5*60*60); - $csrf_namespace->authtoken = sha1(uniqid(rand(),1)); + /* Moved to be globally set in Bootstrap */ + // $csrf_namespace->setExpirationSeconds(5*60*60); + // $csrf_namespace->authtoken = sha1(uniqid(rand(),1)); $csrf_element = new Zend_Form_Element_Hidden('csrf'); $csrf_element->setValue($csrf_namespace->authtoken)->setRequired('true')->removeDecorator('HtmlTag')->removeDecorator('Label'); diff --git a/airtime_mvc/application/controllers/plugins/Acl_plugin.php b/airtime_mvc/application/controllers/plugins/Acl_plugin.php index bd803ec890..fbf7831313 100644 --- a/airtime_mvc/application/controllers/plugins/Acl_plugin.php +++ b/airtime_mvc/application/controllers/plugins/Acl_plugin.php @@ -148,17 +148,22 @@ public function preDispatch(Zend_Controller_Request_Abstract $request) } } } else { //We have a session/identity. - // If we have an identity and we're making a RESTful request, // we need to check the CSRF token - if ($request->_action != "get" && $request->getModuleName() == "rest") { - $tokenValid = $this->verifyCSRFToken($request->getParam("csrf_token")); + if ($_SERVER['REQUEST_METHOD'] != "GET" && $request->getModuleName() == "rest") { + $token = $request->getParam("csrf_token"); + $tokenValid = $this->verifyCSRFToken($token); if (!$tokenValid) { + $csrf_namespace = new Zend_Session_Namespace('csrf_namespace'); + $csrf_namespace->authtoken = sha1(uniqid(rand(),1)); + + Logging::warn("Invalid CSRF token: $token"); $this->getResponse() ->setHttpResponseCode(401) - ->appendBody("ERROR: CSRF token mismatch."); - return; + ->appendBody("ERROR: CSRF token mismatch.") + ->sendResponse(); + die(); } } @@ -202,9 +207,7 @@ private function verifyCSRFToken($token) { $current_namespace = new Zend_Session_Namespace('csrf_namespace'); $observed_csrf_token = $token; $expected_csrf_token = $current_namespace->authtoken; - Logging::error("Observed: " . $observed_csrf_token); - Logging::error("Expected: " . $expected_csrf_token); - + return ($observed_csrf_token == $expected_csrf_token); } From 61a47aeb27a209d1041f4d3d2a6829530e3747ed Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Fri, 20 Feb 2015 14:01:29 -0500 Subject: [PATCH 308/310] Small fix to BPM sanitization --- airtime_mvc/application/common/FileDataHelper.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/common/FileDataHelper.php b/airtime_mvc/application/common/FileDataHelper.php index 7048d65030..6ebe610e80 100644 --- a/airtime_mvc/application/common/FileDataHelper.php +++ b/airtime_mvc/application/common/FileDataHelper.php @@ -19,9 +19,9 @@ public static function sanitizeData(&$data) } if (array_key_exists("bpm", $data)) { //Some BPM tags are silly and include the word "BPM". Let's strip that... - $data["year"] = str_ireplace("BPM", "", $data["year"]); + $data["bpm"] = str_ireplace("BPM", "", $data["bpm"]); // This will convert floats to ints too. - $data["year"] = intval($data["year"]); + $data["bpm"] = intval($data["bpm"]); } } From 73e5fb938f7a5afa74eabe57072d1d5c5765e32f Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 24 Feb 2015 11:13:39 -0500 Subject: [PATCH 309/310] Use more secure random number generation for CSRF auth tokens * Also cleaned up pull request --- airtime_mvc/application/controllers/PluploadController.php | 6 +++--- airtime_mvc/application/controllers/plugins/Acl_plugin.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/controllers/PluploadController.php b/airtime_mvc/application/controllers/PluploadController.php index 6aae736ae2..7c808140c7 100644 --- a/airtime_mvc/application/controllers/PluploadController.php +++ b/airtime_mvc/application/controllers/PluploadController.php @@ -31,10 +31,10 @@ public function indexAction() $this->view->quotaLimitReached = true; } + //Because uploads are done via AJAX (and we're not using Zend form for those), we manually add the CSRF + //token in here. $csrf_namespace = new Zend_Session_Namespace('csrf_namespace'); - /* Moved to be globally set in Bootstrap */ - // $csrf_namespace->setExpirationSeconds(5*60*60); - // $csrf_namespace->authtoken = sha1(uniqid(rand(),1)); + //The CSRF token is generated in Bootstrap.php $csrf_element = new Zend_Form_Element_Hidden('csrf'); $csrf_element->setValue($csrf_namespace->authtoken)->setRequired('true')->removeDecorator('HtmlTag')->removeDecorator('Label'); diff --git a/airtime_mvc/application/controllers/plugins/Acl_plugin.php b/airtime_mvc/application/controllers/plugins/Acl_plugin.php index fbf7831313..d4577e4711 100644 --- a/airtime_mvc/application/controllers/plugins/Acl_plugin.php +++ b/airtime_mvc/application/controllers/plugins/Acl_plugin.php @@ -156,7 +156,7 @@ public function preDispatch(Zend_Controller_Request_Abstract $request) if (!$tokenValid) { $csrf_namespace = new Zend_Session_Namespace('csrf_namespace'); - $csrf_namespace->authtoken = sha1(uniqid(rand(),1)); + $csrf_namespace->authtoken = sha1(openssl_random_pseudo_bytes(128)); Logging::warn("Invalid CSRF token: $token"); $this->getResponse() From a52e2faeb94254cdddd57b58cb6b7e8f04f43be9 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Tue, 24 Feb 2015 13:10:20 -0500 Subject: [PATCH 310/310] SAAS-602: Fix getaddrinfo deadlock (again) --- .../airtime_analyzer/cloud_storage_uploader.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py index b8fc2261f0..11eb68b191 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/cloud_storage_uploader.py @@ -5,6 +5,10 @@ from boto.s3.connection import S3Connection from boto.s3.key import Key +# Fix for getaddrinfo deadlock. See these issues for details: +# https://github.com/gevent/gevent/issues/349 +# https://github.com/docker/docker-registry/issues/400 +u'fix getaddrinfo deadlock'.encode('idna') CLOUD_CONFIG_PATH = '/etc/airtime-saas/cloud_storage.conf' STORAGE_BACKEND_FILE = "file"